Greasy Fork

Greasy Fork is available in English.

小说下载器

一个可扩展的通用型小说下载器。

当前为 2021-04-26 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        小说下载器
// @version     3.4.6.1619463436597
// @author      bgme
// @description 一个可扩展的通用型小说下载器。
// @supportURL  https://github.com/yingziwu/novel-downloader
// @match       *://www.ciweimao.com/chapter-list/*
// @match       *://book.sfacg.com/Novel/*/MainIndex/
// @match       *://book.qidian.com/info/*
// @match       *://www.uukanshu.com/b/*/
// @match       *://www.yruan.com/article/*.html
// @match       *://www.biquwoo.com/bqw*/
// @match       *://www.shuquge.com/txt/*/index.html
// @match       *://www.dingdiann.net/ddk*/
// @match       *://www.xkzw.org/xkzw*/
// @match       *://www.266ks.com/*/
// @match       *://www.266ks.com/*/index*.html
// @match       *://www.hetushu.com/book/*/index.html
// @match       *://www.shouda8.com/*/
// @match       *://www.shouda88.com/*/
// @match       *://www.gebiqu.com/biquge_*/
// @match       *://www.meegoq.com/book*.html
// @match       *://www.viviyzw.com/book*.html
// @match       *://www.xiaoshuodaquan.com/*/
// @namespace   https://blog.bgme.me
// @icon        data:image/png;base64,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
// @license     AGPL-3.0
// @run-at      document-end
// @noframes    true
// @exclude     *://www.jjwxc.net/onebook.php?novelid=*&chapterid=*
// @exclude     *://www.meegoq.com/book/*.html
// @exclude     *://www.viviyzw.com/book/*.html
// @exclude     *://www.yruan.com/article/*/*.html
// @grant       unsafeWindow
// @grant       GM_info
// @grant       GM_xmlhttpRequest
// @grant       GM_getTab
// @grant       GM_saveTab
// @grant       GM_getTabs
// @grant       GM.info
// @grant       GM.xmlHttpRequest
// @connect     img.shouda8.com
// @connect     qidian.com
// @connect     yuewen.com
// @connect     kuangxiangit.com
// @connect     sinaimg.cn
// @connect     jjwxc.net
// @connect     image.gebiqu.com
// @connect     qidian.qpic.cn
// @connect     static.zongheng.com
// @connect     book.zongheng.com
// @connect     cdn.static.17k.com
// @connect     www.shuhai.com
// @connect     img.uukanshu.com
// @connect     oss-accelerate.aliyuncs.com
// @connect     cdn.bcebos.com
// @connect     rs.sfacg.com
// @require     https://cdn.jsdelivr.net/npm/[email protected]/dist/FileSaver.min.js#sha512-Qlv6VSKh1gDKGoJbnyA5RMXYcvnpIqhO++MhIM2fStMcGT9i2T//tSwYFlcyoRRDcDZ+TYHpH8azBBCyhpSeqw==
// @require     https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js#sha512-uVSVjE7zYsGz4ag0HEzfugJ78oHCI1KhdkivjQro8ABL/PRiEO4ROwvrolYAcZnky0Fl/baWKYilQfWvESliRA==
// @require     https://cdn.jsdelivr.net/npm/[email protected]/crypto-js.min.js#sha512-s+p/j7+gSFJa1SUEwmPBAlitcUccgbaTTM3yRSmDHUp0UCcRdBMgI2toIT97ZKGKItfV3N66PEZbHcT/iS5thg==
// ==/UserScript==

/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

/***/ 607:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
const rules_1 = __webpack_require__(489);
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
function printEnvironments() {
    let _GM_info;
    try {
        _GM_info = GM_info;
    }
    catch (error) {
        try {
            _GM_info = GM.info;
        }
        catch (error) {
            console.error("未发现 _GM_info API");
        }
    }
    if (_GM_info) {
        console.log(`开始载入小说下载器……
当前浏览器UA:${navigator.userAgent}
当前脚本管理器:${_GM_info.scriptHandler}
当前脚本管理器版本:${_GM_info.version}
当前脚本名称:${_GM_info.script.name}
当前脚本版本:${_GM_info.script.version}
当前脚本最后更新时间:${_GM_info.script.lastModified}
是否处于隐私模式:${_GM_info.isIncognito}
是否启用调试:${enaleDebug}`);
    }
}
function initBook(rule) {
    return __awaiter(this, void 0, void 0, function* () {
        const bookParse = rule.bookParse;
        const chapterParse = rule.chapterParse;
        return bookParse(chapterParse).then((obj) => {
            const { bookUrl, bookname, author, introduction, additionalMetadate, chapters, } = obj;
            const book = new main_1.Book(bookUrl, bookname, author, introduction, additionalMetadate, chapters);
            return book;
        });
    });
}
function initChapters(rule, book) {
    return __awaiter(this, void 0, void 0, function* () {
        let concurrencyLimit = 10;
        if (rule.concurrencyLimit !== undefined) {
            concurrencyLimit = rule.concurrencyLimit;
        }
        const chapters = book.chapters.filter((chapter) => chapter.status === main_1.Status.pending);
        if (concurrencyLimit === 1) {
            for (let chapter of chapters) {
                const obj = yield chapter.init();
                if (obj.contentHTML !== undefined) {
                    finishedChapterNumber++;
                    updateProgress(finishedChapterNumber, totalChapterNumber, null);
                }
            }
        }
        else {
            yield lib_1.concurrencyRun(chapters, concurrencyLimit, (curChapter) => {
                return curChapter.init().then((obj) => {
                    if (obj.contentHTML !== undefined) {
                        finishedChapterNumber++;
                        updateProgress(finishedChapterNumber, totalChapterNumber, null);
                    }
                    return obj;
                });
            });
        }
        return chapters;
    });
}
function save(book) {
    function chapterSort(a, b) {
        if (a.chapterNumber > b.chapterNumber) {
            return 1;
        }
        if ((a.chapterNumber = b.chapterNumber)) {
            return 0;
        }
        if (a.chapterNumber < b.chapterNumber) {
            return -1;
        }
        return 0;
    }
    function addImageToZip(image, zip) {
        if (image.status === main_1.Status.finished && image.imageBlob) {
            zip.file(image.name, image.imageBlob);
        }
        else {
            console.error("[save]图片下载失败!");
            console.error(image);
        }
    }
    function genSectionText(sectionName) {
        return `${"=".repeat(20)}\n\n\n\n# ${sectionName}\n\n\n\n${"=".repeat(20)}`;
    }
    function genChapterText(chapterName, contentText) {
        return `## ${chapterName}\n\n${contentText}\n\n`;
    }
    function genSectionHtmlFile(sectionName) {
        let htmlFile = new DOMParser().parseFromString(`<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="https://github.com/yingziwu/novel-downloader"><link href="style.css" type="text/css" rel="stylesheet"/><title>${sectionName}</title></head><body><div class="main"><h1>${sectionName}</h1></div></body></html>`, "text/html");
        return new Blob([htmlFile.documentElement.outerHTML], {
            type: "text/html; charset=UTF-8",
        });
    }
    function genHtmlFile(chapterName, DOM) {
        var _a;
        let htmlFile = new DOMParser().parseFromString(`<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="https://github.com/yingziwu/novel-downloader"><link href="style.css" type="text/css" rel="stylesheet"/><title>${chapterName}</title></head><body><div class="main"><h2>${chapterName}</h2></div></body></html>`, "text/html");
        (_a = htmlFile.querySelector(".main")) === null || _a === void 0 ? void 0 : _a.appendChild(DOM);
        return new Blob([htmlFile.documentElement.outerHTML], {
            type: "text/html; charset=UTF-8",
        });
    }
    const chapters = book.chapters;
    chapters.sort(chapterSort);
    let savedTextArray = [];
    let savedZip = new JSZip();
    let infoText = `题名:${book.bookname}\n作者:${book.author}\n简介:${book.introduction}\n来源:${book.bookUrl}\n下载时间:${new Date().toISOString()}\n本文件由小说下载器生成,软件地址:https://github.com/yingziwu/novel-downloader\n\n`;
    savedTextArray.push(infoText);
    if (book.additionalMetadate.cover) {
        const cover = book.additionalMetadate.cover;
        if (cover.imageBlob) {
            savedZip.file(`cover.${cover.imageBlob.type.split("/").slice(-1)[0]}`, cover.imageBlob);
        }
        else {
            console.error("[save]图片下载失败!");
            console.error(cover);
        }
    }
    savedZip.file("info.txt", new Blob([infoText], { type: "text/plain;charset=utf-8" }));
    const styleCSS = `body {
  background-color: #f0f0f2;
  margin: 0;
  padding: 0;
  font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI",
    "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
div.main {
  width: 900px;
  margin: 5em auto;
  padding: 2em;
  background-color: #fdfdff;
  border-radius: 0.5em;
  box-shadow: 2px 3px 7px 2px rgba(0, 0, 0, 0.02);
}
@media (max-width: 700px) {
  div.main {
    margin: 0 auto;
    width: auto;
  }
}
h1 {
  line-height: 130%;
  text-align: center;
  font-weight: bold;
  font-size: xxx-large;
  margin-top: 3.2em;
  margin-bottom: 3.3em;
}
h2 {
  line-height: 130%;
  text-align: center;
  font-weight: bold;
  font-size: x-large;
  margin-top: 1.2em;
  margin-bottom: 2.3em;
}
div {
  margin: 0px;
  padding: 0px;
  text-align: justify;
}
p {
  text-indent: 2em;
  display: block;
  line-height: 1.3em;
  margin-top: 0.4em;
  margin-bottom: 0.4em;
}`;
    savedZip.file("style.css", new Blob([styleCSS], { type: "text/css;charset=utf-8" }));
    let preSectionName = "";
    for (const c of chapters) {
        if (c.status === main_1.Status.finished) {
            const sectionName = c.sectionName;
            const chapterName = c.chapterName
                ? c.chapterName
                : c.chapterNumber.toString();
            const contentText = c.contentText;
            const contentHTML = c.contentHTML;
            const contentImages = c.contentImages;
            const fileNameBase = `${"0".repeat(chapters.length.toString().length - c.chapterNumber.toString().length)}${c.chapterNumber.toString()}.html`;
            if (sectionName && contentText && sectionName !== preSectionName) {
                savedTextArray.push(genSectionText(sectionName));
                savedZip.file(`Section${fileNameBase}`, genSectionHtmlFile(sectionName));
            }
            preSectionName = sectionName;
            if (contentText) {
                savedTextArray.push(genChapterText(chapterName, contentText));
            }
            if (contentHTML) {
                savedZip.file(`Chapter${fileNameBase}`, genHtmlFile(chapterName, contentHTML));
            }
            if (contentImages !== null) {
                for (const image of contentImages) {
                    addImageToZip(image, savedZip);
                }
            }
        }
    }
    console.debug("[save]开始保存");
    const saveFileNameBase = `[${book.author}]${book.bookname}`;
    const savedText = savedTextArray.join("\n");
    saveAs(new Blob([savedText], { type: "text/plain;charset=utf-8" }), `${saveFileNameBase}.txt`);
    savedZip
        .generateAsync({
        type: "blob",
        compression: "DEFLATE",
        compressionOptions: {
            level: 6,
        },
    }, (metadata) => updateProgress(finishedChapterNumber, totalChapterNumber, metadata.percent))
        .then((blob) => {
        saveAs(blob, `${saveFileNameBase}.zip`);
    })
        .then(() => {
        var _a;
        (_a = document.querySelector("#nd-progress")) === null || _a === void 0 ? void 0 : _a.remove();
    })
        .catch((err) => console.error("saveZip: " + err));
}
function setTabMark() {
    return new Promise((resolve, reject) => {
        GM_getTab((curTabObject) => {
            curTabObject.novel_downloader =
                document.location.href;
            GM_saveTab(curTabObject);
            resolve(curTabObject);
        });
    });
}
function getNowRunNumber() {
    return new Promise((resolve, reject) => {
        GM_getTabs((curTabObjects) => {
            let nowRunNumber = 0;
            for (let i in curTabObjects) {
                const novel_downloader_url = curTabObjects[i]
                    .novel_downloader;
                if (novel_downloader_url !== undefined &&
                    new URL(novel_downloader_url).hostname === document.location.hostname) {
                    nowRunNumber++;
                }
            }
            resolve(nowRunNumber);
        });
    });
}
function removeTabMark() {
    return new Promise((resolve, reject) => {
        GM_getTab((curTabObject) => {
            if (curTabObject.novel_downloader) {
                delete curTabObject.novel_downloader;
            }
            GM_saveTab(curTabObject);
            resolve(curTabObject);
        });
    });
}
let totalChapterNumber;
let finishedChapterNumber = 0;
function updateProgress(finishedChapterNumber, totalChapterNumber, zipPercent) {
    if (!document.querySelector("#nd-progress")) {
        console.debug("[progress]初始化进度条");
        let progress = document.createElement("div");
        progress.id = "nd-progress";
        progress.innerHTML = `
        <div id='chapter-progress' title="章节"></div>
        <div id='zip-progress' title="ZIP"></div>
        `;
        let progressStyle = document.createElement("style");
        progressStyle.innerHTML = `#nd-progress {
    position: fixed;
    bottom: 8%;
    right: 3%;
    z-index: 99;
    border-style: none;
    text-align: center;
    vertical-align: baseline;
    background-color: rgba(210, 210, 210, 0.2);
    padding: 6px;
    border-radius: 12px;
}
#chapter-progress{
    --color:green;
    --position:0%;
    width:200px;
    height:10px;
    border-radius:30px;
    background-color:#ccc;
    background-image:radial-gradient(closest-side circle at var(--position),var(--color),var(--color) 100%,transparent),linear-gradient(var(--color),var(--color));
    background-image:-webkit-radial-gradient(var(--position),circle closest-side,var(--color),var(--color) 100%,transparent),-webkit-linear-gradient(var(--color),var(--color));
    background-size:100% ,var(--position);
    background-repeat: no-repeat;
}
#zip-progress{
    --color:yellow;
    --position:0%;
    width:200px;
    height:10px;
    border-radius:30px;
    background-color:#ccc;
    background-image:radial-gradient(closest-side circle at var(--position),var(--color),var(--color) 100%,transparent),linear-gradient(var(--color),var(--color));
    background-image:-webkit-radial-gradient(var(--position),circle closest-side,var(--color),var(--color) 100%,transparent),-webkit-linear-gradient(var(--color),var(--color));
    background-size:100% ,var(--position);
    background-repeat: no-repeat;
    margin-top: 5px;
}`;
        document.head.appendChild(progressStyle);
        document.body.appendChild(progress);
    }
    let pagePercent = `${(finishedChapterNumber / totalChapterNumber) * 100}%`;
    document.querySelector("#chapter-progress").style.cssText = `--position:${pagePercent};`;
    if (zipPercent) {
        document.querySelector("#zip-progress").style.cssText = `--position:${zipPercent}%;`;
    }
    else {
        document.querySelector("#zip-progress").style.cssText =
            "display:none;";
    }
}
function run() {
    return __awaiter(this, void 0, void 0, function* () {
        console.log(`[run]下载开始`);
        const rule = rules_1.getRule();
        let maxRunLimit = null;
        let nowRunNumber;
        try {
            yield setTabMark();
            nowRunNumber = yield getNowRunNumber();
        }
        catch (error) { }
        if (rule.maxRunLimit !== undefined && nowRunNumber !== undefined) {
            maxRunLimit = rule.maxRunLimit;
            if (nowRunNumber > maxRunLimit) {
                const alertText = `当前网站目前已有${nowRunNumber - 1}个下载任务正在运行,当前站点最多允许${maxRunLimit}下载任务同时进行。\n请待其它下载任务完成后,再行尝试。`;
                alert(alertText);
                console.log(`[run]${alertText}`);
                return;
            }
        }
        const book = yield initBook(rule);
        totalChapterNumber = book.chapters.filter((chapter) => chapter.status === main_1.Status.pending).length;
        yield initChapters(rule, book);
        save(book);
        try {
            yield removeTabMark();
        }
        catch (error) { }
        console.log(`[run]下载完毕`);
        return book;
    });
}
function catchError(error) {
    var _a, _b;
    downloading = false;
    removeTabMark();
    (_a = document.querySelector("#nd-progress")) === null || _a === void 0 ? void 0 : _a.remove();
    (_b = document.getElementById("novel-downloader")) === null || _b === void 0 ? void 0 : _b.remove();
    console.error("运行过程出错,请附上相关日志至支持地址进行反馈。\n支持地址:https://github.com/yingziwu/novel-downloader");
    console.error(error);
}
function addButton() {
    let button = document.createElement("button");
    button.id = "novel-downloader";
    button.style.cssText = `position: fixed; top: 15%; right: 5%; z-index: 99; border-style: none; text-align:center; vertical-align:baseline; background-color: rgba(128, 128, 128, 0.2); padding: 5px; border-radius: 12px;`;
    let img = document.createElement("img");
    img.src = rules_1.icon0;
    img.style.cssText = "height: 2em;";
    button.onclick = function () {
        if (downloading) {
            alert("正在下载中,请耐心等待……");
        }
        else {
            downloading = true;
            img.src = rules_1.icon1;
            try {
                run()
                    .then((book) => {
                    downloading = false;
                    img.src = rules_1.icon0;
                })
                    .catch(catchError);
            }
            catch (error) {
                catchError(error);
            }
        }
    };
    button.appendChild(img);
    document.body.appendChild(button);
}
function debug() {
    return __awaiter(this, void 0, void 0, function* () {
        const rule = rules_1.getRule();
        const book = yield initBook(rule);
        unsafeWindow.rule = rule;
        unsafeWindow.book = book;
        unsafeWindow.save = save;
        unsafeWindow.saveAs = saveAs;
        return;
    });
}
let downloading = false;
const enaleDebug = false;
window.addEventListener("DOMContentLoaded", () => {
    printEnvironments();
    addButton();
    if (enaleDebug) {
        debug();
    }
});


/***/ }),

/***/ 563:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.sleep = exports.concurrencyRun = exports.gfetch = exports.rm = exports.cosCompare = exports.ggetHtmlDOM = exports.ggetHtmlText = exports.getHtmlDOM = exports.getHtmlText = exports.cleanDOM = void 0;
const main_1 = __webpack_require__(519);
class CleanerClass {
    constructor(imgMode) {
        this.imgMode = imgMode;
        this.statusType = {
            init: this.parse_init,
            p: this.parse_p,
            br: this.parse_br,
            hr: this.parse_hr,
        };
        this.typeParagraph = [
            "DIV",
            "P",
            "OL",
            "H1",
            "H1",
            "H2",
            "H3",
            "H4",
            "H5",
            "H6",
        ];
        this.typeInto = ["IMG", "HR", "BR"];
        this.currentHtml = document.createElement("p");
        this.currentText = "";
        this.br_count = 0;
        this.images = [];
        this.doms = [];
        this.texts = [];
        this.status = "init";
    }
    reset_current() {
        this.currentHtml = document.createElement("p");
        this.currentText = "";
    }
    create_pbr() {
        const p = document.createElement("p");
        const br = document.createElement("br");
        p.appendChild(br);
        return p;
    }
    parse_init(element) {
        var _a, _b;
        const nodeName = element.nodeName;
        if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") {
            this.br_count = 0;
            this.status = "p";
            this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim();
        }
        else if (this.typeParagraph.includes(nodeName)) {
            this.meet_p(element, nodeName);
        }
        else if (nodeName === "BR") {
            this.br_count++;
            this.status = "br";
        }
        else if (nodeName === "IMG") {
            this.meet_img(element);
        }
        else if (nodeName === "HR") {
            this.meet_hr();
        }
    }
    parse_p(element) {
        const nodeName = element.nodeName;
        if (nodeName === "BR") {
            this.br_count++;
            this.status = "br";
            this.currentText += "\n";
        }
        else if (this.typeParagraph.includes(nodeName)) {
            this.meet_p(element, nodeName);
        }
        else if (nodeName === "IMG") {
            this.meet_img(element);
        }
        else if (nodeName === "HR") {
            this.meet_hr();
        }
    }
    parse_br(element) {
        var _a, _b;
        const nodeName = element.nodeName;
        if (nodeName === "BR") {
            this.br_count++;
            if (this.br_count <= 4) {
                this.currentText += "\n";
            }
        }
        else if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") {
            this.meet_br_push();
            this.status = "p";
            this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim();
        }
        else if (this.typeParagraph.includes(nodeName)) {
            if (this.br_count > 2) {
                this.doms.push(this.create_pbr());
            }
            this.meet_p(element, nodeName);
        }
        else if (nodeName === "IMG") {
            this.meet_img(element);
        }
        else if (nodeName === "HR") {
            this.meet_hr();
        }
    }
    parse_hr(element) {
        var _a, _b;
        const nodeName = element.nodeName;
        if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") {
            this.br_count = 0;
            this.status = "p";
            this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim();
            this.currentHtml.innerText = this.currentText;
        }
        else if (this.typeParagraph.includes(nodeName)) {
            this.meet_p(element, nodeName);
        }
        else if (nodeName === "IMG") {
            this.meet_img(element);
        }
    }
    meet_p(element, nodeName) {
        var _a;
        this.br_count = 0;
        const childrenNodeNamesSet = new Set(Array.from(element.children).map((ele) => ele.nodeName));
        const typeParagraphSet = new Set(this.typeParagraph);
        const intersectParagraph = Array.from(childrenNodeNamesSet).filter((x) => typeParagraphSet.has(x));
        const typeIntoSet = new Set(this.typeInto);
        const intersectInto = Array.from(childrenNodeNamesSet).filter((x) => typeIntoSet.has(x));
        if (intersectParagraph.length !== 0 || intersectInto.length != 0) {
            this.meet_text_push();
            const subcleaner = new CleanerClass(this.imgMode);
            const subcleanerBound = subcleaner.clean.bind(this);
            subcleanerBound(element);
            this.status = "init";
        }
        else {
            this.status = "p";
            this.currentText += "\n".repeat(2);
            this.currentText += (_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim();
            this.meet_text_push();
        }
    }
    meet_img(element) {
        function genImageName(url) {
            let t = btoa(new URL(url).pathname.split("/").slice(-2).join("/")) +
                `.${url.split(".").slice(-1)[0]}`;
            if (t.length >= 125) {
                t =
                    btoa(new URL(url).pathname.split("/").slice(-1)[0]) +
                        `.${url.split(".").slice(-1)[0]}`;
            }
            return t;
        }
        this.meet_br_push();
        this.br_count = 0;
        const imageUrl = element.src;
        const imageName = genImageName(imageUrl);
        const image = new main_1.ImageClass(imageUrl, imageName, this.imgMode);
        image.init();
        this.images.push(image);
        const pimg = document.createElement("p");
        const img = document.createElement("img");
        img.src = imageName;
        img.alt = imageUrl;
        pimg.appendChild(img);
        this.doms.push(pimg);
        this.texts.push(`\n![${img.alt}](${img.src})\n`);
    }
    meet_hr() {
        this.meet_br_push();
        this.br_count = 0;
        this.status = "hr";
        this.texts.push(`\n${"-".repeat(20)}\n`);
        const hr = document.createElement("hr");
        this.doms.push(hr);
    }
    meet_text_push() {
        this.currentHtml.innerText = this.currentText.trim();
        this.doms.push(this.currentHtml);
        this.texts.push(this.currentText);
        this.reset_current();
    }
    meet_br_push() {
        if (this.br_count === 1) {
            this.br_count = 0;
            this.meet_text_push();
        }
        else if (this.br_count === 2) {
            this.br_count = 0;
            this.meet_text_push();
        }
        else if (this.br_count >= 3) {
            this.br_count = 0;
            this.meet_text_push();
            this.doms.push(this.create_pbr());
        }
    }
    clean(DOM) {
        let i = 0;
        while (i < DOM.childNodes.length) {
            const fn = this.statusType[this.status].bind(this);
            fn(DOM.childNodes[i]);
            i++;
        }
        this.meet_text_push();
        return { doms: this.doms, texts: this.texts, images: this.images };
    }
}
function cleanDOM(DOM, imgMode) {
    const cleaner = new CleanerClass(imgMode);
    const { doms, texts, images } = cleaner.clean(DOM);
    const outputDOM = document.createElement("div");
    for (const dom of doms) {
        outputDOM.appendChild(dom);
    }
    let outputText = "";
    for (const t of texts) {
        outputText += t;
    }
    outputText = outputText.trim();
    return { dom: outputDOM, text: outputText, images: images };
}
exports.cleanDOM = cleanDOM;
function getHtmlText(url, charset) {
    return __awaiter(this, void 0, void 0, function* () {
        if (charset === undefined) {
            return fetch(url).then((response) => {
                if (response.ok) {
                    return response.text();
                }
                else {
                    throw new Error(`Bad response! ${url}`);
                }
            });
        }
        else {
            return fetch(url)
                .then((response) => {
                if (response.ok) {
                    return response.arrayBuffer();
                }
                else {
                    throw new Error(`Bad response! ${url}`);
                }
            })
                .then((buffer) => {
                const decoder = new TextDecoder(charset);
                const text = decoder.decode(buffer);
                return text;
            });
        }
    });
}
exports.getHtmlText = getHtmlText;
function getHtmlDOM(url, charset) {
    return __awaiter(this, void 0, void 0, function* () {
        const htmlText = yield getHtmlText(url, charset);
        return new DOMParser().parseFromString(htmlText, "text/html");
    });
}
exports.getHtmlDOM = getHtmlDOM;
function ggetHtmlText(url, charset) {
    return __awaiter(this, void 0, void 0, function* () {
        if (charset === undefined) {
            return gfetch(url).then((response) => {
                if (response.status >= 200 && response.status <= 299) {
                    return response.responseText;
                }
                else {
                    throw new Error(`Bad response! ${url}`);
                }
            });
        }
        else {
            return gfetch(url, { responseType: "arraybuffer" })
                .then((response) => {
                if (response.status >= 200 && response.status <= 299) {
                    return response.response;
                }
                else {
                    throw new Error(`Bad response! ${url}`);
                }
            })
                .then((buffer) => {
                const decoder = new TextDecoder(charset);
                const text = decoder.decode(buffer);
                return text;
            });
        }
    });
}
exports.ggetHtmlText = ggetHtmlText;
function ggetHtmlDOM(url, charset) {
    return __awaiter(this, void 0, void 0, function* () {
        const htmlText = yield ggetHtmlText(url, charset);
        return new DOMParser().parseFromString(htmlText, "text/html");
    });
}
exports.ggetHtmlDOM = ggetHtmlDOM;
function cosCompare(a, b) {
    if (a.sectionNumber !== null && b.sectionNumber != null) {
        if (a.sectionNumber > b.sectionNumber) {
            return 1;
        }
        if (a.sectionNumber == b.sectionNumber) {
            if (a.sectionChapterNumber !== null && b.sectionChapterNumber !== null) {
                if (a.sectionChapterNumber > b.sectionChapterNumber) {
                    return 1;
                }
                if (a.sectionChapterNumber == b.sectionChapterNumber) {
                    return 0;
                }
                if (a.sectionChapterNumber < b.sectionChapterNumber) {
                    return -1;
                }
            }
        }
        if (a.sectionNumber < b.sectionNumber) {
            return -1;
        }
    }
    return 0;
}
exports.cosCompare = cosCompare;
function rm(selector, all = false, dom) {
    if (all) {
        let rs = dom.querySelectorAll(selector);
        rs.forEach((e) => e.remove());
    }
    else {
        let r = dom.querySelector(selector);
        if (r) {
            r.remove();
        }
    }
}
exports.rm = rm;
function gfetch(url, { method = "GET", headers, data, cookie, binary, nocache, revalidate, timeout, context, responseType, overrideMimeType, anonymous, username, password, } = {}) {
    return new Promise((resolve, reject) => {
        let _GM_xmlhttpRequest;
        try {
            _GM_xmlhttpRequest = GM_xmlhttpRequest;
        }
        catch (error) {
            try {
                _GM_xmlhttpRequest = GM.xmlHttpRequest;
            }
            catch (error) {
                console.error("未发现 _GM_xmlhttpRequest API");
            }
        }
        if (_GM_xmlhttpRequest) {
            _GM_xmlhttpRequest({
                url: url,
                method: method,
                headers: headers,
                data: data,
                cookie: cookie,
                binary: binary,
                nocache: nocache,
                revalidate: revalidate,
                timeout: timeout,
                context: context,
                responseType: responseType,
                overrideMimeType: overrideMimeType,
                anonymous: anonymous,
                username: username,
                password: password,
                onload: (obj) => {
                    resolve(obj);
                },
                onerror: (err) => {
                    reject(err);
                },
            });
        }
        else {
            throw new Error("未发现 _GM_xmlhttpRequest API");
        }
    });
}
exports.gfetch = gfetch;
function concurrencyRun(list, limit, asyncHandle) {
    function recursion(arr) {
        return asyncHandle(arr.shift()).then(() => {
            if (arr.length !== 0) {
                return recursion(arr);
            }
            else {
                return "finish!";
            }
        });
    }
    let listCopy = [...list];
    let asyncList = [];
    while (limit--) {
        asyncList.push(recursion(listCopy));
    }
    return Promise.all(asyncList);
}
exports.concurrencyRun = concurrencyRun;
function sleep(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
}
exports.sleep = sleep;


/***/ }),

/***/ 519:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.ImageClass = exports.Chapter = exports.Book = exports.Status = void 0;
const rules_1 = __webpack_require__(489);
const lib_1 = __webpack_require__(563);
var Status;
(function (Status) {
    Status[Status["pending"] = 0] = "pending";
    Status[Status["downloading"] = 1] = "downloading";
    Status[Status["failed"] = 2] = "failed";
    Status[Status["finished"] = 3] = "finished";
    Status[Status["aborted"] = 4] = "aborted";
})(Status = exports.Status || (exports.Status = {}));
class Book {
    constructor(bookUrl, bookname, author, introduction, additionalMetadate, chapters) {
        this.bookUrl = bookUrl;
        this.bookname = bookname;
        this.author = author;
        this.introduction = introduction;
        this.additionalMetadate = additionalMetadate;
        this.chapters = chapters;
        console.debug("[Book]初始化完成");
    }
}
exports.Book = Book;
class Chapter {
    constructor(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, charset) {
        this.bookUrl = bookUrl;
        this.bookname = bookname;
        this.chapterUrl = chapterUrl;
        this.chapterNumber = chapterNumber;
        this.chapterName = chapterName;
        this.isVIP = isVIP;
        this.isPaid = isPaid;
        this.sectionName = sectionName;
        this.sectionNumber = sectionNumber;
        this.sectionChapterNumber = sectionChapterNumber;
        this.chapterParse = chapterParse;
        this.charset = charset;
        this.status = Status.pending;
        this.retryTime = 0;
    }
    init() {
        return __awaiter(this, void 0, void 0, function* () {
            const obj = yield this.parse();
            const { chapterName, contentRaw, contentText, contentHTML, contentImages, } = obj;
            this.chapterName = chapterName;
            this.contentRaw = contentRaw;
            this.contentText = contentText;
            this.contentHTML = contentHTML;
            this.contentImages = contentImages;
            console.debug(`[Chapter]${this.chapterName} 解析完成。`);
            return obj;
        });
    }
    parse() {
        return __awaiter(this, void 0, void 0, function* () {
            this.status = Status.downloading;
            return this.chapterParse(this.chapterUrl, this.chapterName, this.isVIP, this.isPaid, this.charset)
                .then((obj) => {
                this.status = Status.finished;
                return obj;
            })
                .catch((err) => __awaiter(this, void 0, void 0, function* () {
                this.retryTime++;
                console.error(`[Chapter]${this.chapterName}解析出错,第${this.retryTime}次重试,章节地址:${this.chapterUrl}`);
                if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) {
                    yield lib_1.sleep(this.retryTime * 1500);
                    return this.parse();
                }
                else {
                    this.status = Status.failed;
                    console.error(err);
                    return {
                        chapterName: this.chapterName,
                        contentRaw: null,
                        contentText: null,
                        contentHTML: null,
                        contentImages: null,
                    };
                }
            }));
        });
    }
}
exports.Chapter = Chapter;
class ImageClass {
    constructor(imageUrl, name, mode) {
        this.imageUrl = imageUrl;
        this.name = name;
        this.mode = mode;
        this.status = Status.pending;
        this.retryTime = 0;
    }
    init() {
        return __awaiter(this, void 0, void 0, function* () {
            if (this.mode === "naive") {
                this.imageBlob = yield this.downloadImage();
            }
            else {
                this.imageBlob = yield this.tmDownloadImage();
            }
            console.debug(`[Image] ${this.imageUrl} 下载完成。`);
            return this.imageBlob;
        });
    }
    downloadImage() {
        this.status = Status.downloading;
        return fetch(this.imageUrl)
            .then((response) => {
            if (response.ok) {
                this.status = Status.finished;
                return response.blob();
            }
            else {
                throw new Error(`Image request response is not ok!\nImage url: ${this.imageUrl} .`);
            }
        })
            .catch((err) => __awaiter(this, void 0, void 0, function* () {
            this.retryTime++;
            console.error(`[Image]下载 ${this.imageUrl} 出错,第${this.retryTime}次重试,下载模式:${this.mode}`);
            if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) {
                yield lib_1.sleep(this.retryTime * 1500);
                return this.downloadImage();
            }
            else {
                this.status = Status.failed;
                console.error(err);
                return null;
            }
        }));
    }
    tmDownloadImage() {
        this.status = Status.downloading;
        return lib_1.gfetch(this.imageUrl, { responseType: "blob" })
            .then((response) => {
            if (response.status >= 200 && response.status <= 299) {
                this.status = Status.finished;
                return response.response;
            }
            else {
                throw new Error(`Bad response!\nRequest url: ${this.imageUrl}`);
            }
        })
            .catch((err) => __awaiter(this, void 0, void 0, function* () {
            this.retryTime++;
            console.error(`[Image]下载 ${this.imageUrl} 出错,第${this.retryTime}次重试,下载模式:${this.mode}`);
            if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) {
                yield lib_1.sleep(this.retryTime * 1500);
                return this.tmDownloadImage();
            }
            else {
                this.status = Status.failed;
                console.error(err);
                return null;
            }
        }));
    }
}
exports.ImageClass = ImageClass;


/***/ }),

/***/ 489:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getRule = exports.icon1 = exports.icon0 = exports.retryLimit = void 0;
const ciweimao_1 = __webpack_require__(444);
const uukanshu_1 = __webpack_require__(623);
const yruan_1 = __webpack_require__(514);
const biquge_1 = __webpack_require__(931);
const xkzw_1 = __webpack_require__(441);
const sfacg_1 = __webpack_require__(116);
const hetushu_1 = __webpack_require__(161);
const shouda8_1 = __webpack_require__(382);
const meegoq_1 = __webpack_require__(158);
const xiaoshuodaquan_1 = __webpack_require__(678);
const qidian_1 = __webpack_require__(839);
exports.retryLimit = 5;
exports.icon0 = "data:image/png;base64,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";
exports.icon1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAANSAAADUgEQACRKAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAUdQTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiYSOVQAAAGx0Uk5TAAECAwQFCAkKCwwNDhETFRkaHB0fICMkKCwwNTg5PD1AQUZKTk9QV1tcX2BjZGhtb3B2eHl6fX6AgYKHi4+QlJicnaChpamur7C3uru+v8LEyMzP0NXZ3N3f4OTn6uvt7/Hy8/T2+Pn6/P3+VI4wmgAAAyxJREFUeNrtmVdT4zAUhTFs6BB6Cb13WLpooffeQjW9hMT//3mVJbsT4li6ahbD6D4y5p5vzrGuFDkry5QpznLSygAYAANgAAyAATAABsAAGAADYAAMgAEwAD8XADlChTQTIM0eIM0pIM3vAdL8JiLNawFpXo1I8zxAmicS0jwTkeapjDTvC8r0gQQK9UEESvUBBIr1qQTK9SkESvR/wQkQ5V95KhS+Q1AC14N34ZCYenD0LGNjoH7ij2ejQV71QPd2lNQapI8rut0d4LMe0Bz4CHMUSetZCGgPMESRYj1cAGARMIqv1kMlgK8pNQq39TARBB8VhCgyW59S414y6frjxDYeUYTCNnnKHw4WeUxl1/wtGjwk97LToyBan6irmRrPfSHj/K+ZuSJ3TImCav3zaqvlvTN57T9W6+ozJAqa9fH9/gLS3kja/wr69+PUKMhGXUxVie0mVVMXZAUSwONys4ztvHn5kQcgttubJ+tEkde7G2MEiExUyD3VVExE4AAPS40qTlaNSw8QgI+dnlxVx8ncnp0PCsD5WJnaI23Z2Lk3wP1igx83jA2L998V4G8E5WrVy0kRfIeXMLkMm1TIN8GWYXIQTVbKVa+cjLCO4r2+fFnq+X17MZ7N6GmlxRJXt1pWnjh3Q1yX09Vi8tXTl/zb8eeB5GCgkFe9cOAgTutPBcD1stbGEYXVtvYCaA4BwHU9W8smXzt7DesMBMB1NFQMVS8eOgK3hQM4zut6ezZdPbt9/ZWhKQsArpu5OrJ83dwNW0dGAFzHwyVe6iXDx8zt2AEc522jI8etntOx8cbRjAcA1+18/Vf5+vlbvk6cALhORkr/qZeOnHC34QdwnPfNTvzjLtC5+S7QRAQg8eNuYcEW6yAIIF4GQD8A9W5IZX3eFQW6tqI61KNbXf9vy4K/T/2Wd90X+hqFnfHG1K8oUq1nuqpVZD3zjal865nvjBVY74pC/qpg/nYkNQqb6+uZrChYrFcQhcBnOwlR2KIfLoUGlIj1EgaUsPVCUcixnjcKmdZzRCHdeqYo1FgPjUKl9YAolFtPjMIf672i8NP6DFH4br2pH1d/AAm28mJJn9pPAAAAAElFTkSuQmCC";
function getRule() {
    const host = document.location.host;
    let ruleClass;
    switch (host) {
        case "www.ciweimao.com":
            ruleClass = ciweimao_1.ciweimao;
            break;
        case "www.uukanshu.com":
            ruleClass = uukanshu_1.uukanshu;
            break;
        case "www.yruan.com":
            ruleClass = yruan_1.yrun;
            break;
        case "www.biquwoo.com":
            ruleClass = biquge_1.biquwo;
            break;
        case "www.shuquge.com":
            ruleClass = biquge_1.shuquge;
            break;
        case "www.dingdiann.net":
            ruleClass = biquge_1.dingdiann;
            break;
        case "www.xkzw.org":
            ruleClass = xkzw_1.xkzw;
            break;
        case "www.266ks.com":
            ruleClass = biquge_1.c226ks;
            break;
        case "book.sfacg.com":
            ruleClass = sfacg_1.sfacg;
            break;
        case "www.hetushu.com":
            ruleClass = hetushu_1.hetushu;
            break;
        case "www.shouda8.com":
        case "www.shouda88.com":
            ruleClass = shouda8_1.shouda8;
            break;
        case "www.gebiqu.com":
            ruleClass = biquge_1.gebiqu;
            break;
        case "www.meegoq.com":
        case "www.viviyzw.com":
            ruleClass = meegoq_1.meegoq;
            break;
        case "www.xiaoshuodaquan.com":
            ruleClass = xiaoshuodaquan_1.xiaoshuodaquan;
            break;
        case "book.qidian.com":
            ruleClass = qidian_1.qidian;
            break;
        default:
            throw new Error("Not Found Rule!");
    }
    const rule = new ruleClass();
    return rule;
}
exports.getRule = getRule;


/***/ }),

/***/ 931:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.c226ks = exports.gebiqu = exports.dingdiann = exports.shuquge = exports.biquwo = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class biquwo {
    constructor() {
        this.imageMode = "TM";
    }
    bookParse(chapterParse) {
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href;
            const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
            const author = (document.querySelector("#info > p:nth-child(2)")).innerText
                .replace(/作(\s+)?者[::]/, "")
                .trim();
            let introduction;
            const introDom = document.querySelector("#intro");
            if (introDom === null) {
                introduction = null;
            }
            else {
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = document.querySelector("#fmimg > img")
                .src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            const chapters = [];
            const dl = document.querySelector("#list>dl");
            if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
                const dlc = Array.from(dl.children);
                if (dlc[0].nodeName === "DT" &&
                    dlc[0].innerText.includes("最新章节")) {
                    for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
                        if (i !== 0 && dlc[i].nodeName === "DT") {
                            delete dlc[0];
                            break;
                        }
                        delete dlc[i];
                    }
                }
                const chapterList = dlc.filter((obj) => obj !== undefined);
                let chapterNumber = 0;
                let sectionNumber = 0;
                let sectionName = null;
                let sectionChapterNumber = 0;
                for (let i = 0; i < chapterList.length; i++) {
                    const node = chapterList[i];
                    if (node.nodeName === "DT") {
                        sectionNumber++;
                        sectionChapterNumber = 0;
                        sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
                    }
                    else if (node.nodeName === "DD") {
                        chapterNumber++;
                        sectionChapterNumber++;
                        const a = node.firstElementChild;
                        const chapterName = a.innerText;
                        const chapterUrl = a.href;
                        const isVIP = false;
                        const isPaid = false;
                        const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                        chapters.push(chapter);
                    }
                }
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
            const content = dom.querySelector("#content");
            if (content) {
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.biquwo = biquwo;
class shuquge {
    constructor() {
        this.imageMode = "TM";
    }
    bookParse(chapterParse) {
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href;
            const bookname = (document.querySelector(".info > h2")).innerText.trim();
            const author = (document.querySelector(".small > span:nth-child(1)")).innerText
                .replace(/作(\s+)?者[::]/, "")
                .trim();
            let introduction;
            const introDom = document.querySelector(".intro");
            if (introDom === null) {
                introduction = null;
            }
            else {
                introDom.innerHTML = introDom.innerHTML.replace(/推荐地址:http:\/\/www.shuquge.com\/txt\/\d+\/index\.html/, "");
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = (document.querySelector(".info > .cover > img")).src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            const chapters = [];
            const dl = document.querySelector(".listmain>dl");
            if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
                const dlc = Array.from(dl.children);
                if (dlc[0].nodeName === "DT" &&
                    dlc[0].innerText.includes("最新章节")) {
                    for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
                        if (i !== 0 && dlc[i].nodeName === "DT") {
                            delete dlc[0];
                            break;
                        }
                        delete dlc[i];
                    }
                }
                const chapterList = dlc.filter((obj) => obj !== undefined);
                let chapterNumber = 0;
                let sectionNumber = 0;
                let sectionName = null;
                let sectionChapterNumber = 0;
                for (let i = 0; i < chapterList.length; i++) {
                    const node = chapterList[i];
                    if (node.nodeName === "DT") {
                        sectionNumber++;
                        sectionChapterNumber = 0;
                        sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
                    }
                    else if (node.nodeName === "DD") {
                        chapterNumber++;
                        sectionChapterNumber++;
                        const a = node.firstElementChild;
                        const chapterName = a.innerText;
                        const chapterUrl = a.href;
                        const isVIP = false;
                        const isPaid = false;
                        const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                        chapters.push(chapter);
                    }
                }
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = (dom.querySelector(".content > h1:nth-child(1)")).innerText.trim();
            const content = dom.querySelector("#content");
            if (content) {
                content.innerHTML = content.innerHTML
                    .replace("请记住本书首发域名:www.shuquge.com。书趣阁_笔趣阁手机版阅读网址:m.shuquge.com", "")
                    .replace(/http:\/\/www.shuquge.com\/txt\/\d+\/\d+\.html/, "");
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.shuquge = shuquge;
class dingdiann {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 5;
    }
    bookParse(chapterParse) {
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href;
            const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
            const author = (document.querySelector("#info > p:nth-child(2)")).innerText
                .replace(/作(\s+)?者[::]/, "")
                .trim();
            let introduction;
            const introDom = document.querySelector("#intro");
            if (introDom === null) {
                introduction = null;
            }
            else {
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = document.querySelector("#fmimg > img")
                .src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            const chapters = [];
            const dl = document.querySelector("#list>dl");
            if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
                const dlc = Array.from(dl.children);
                if (dlc[0].nodeName === "DT" &&
                    dlc[0].innerText.includes("最新章节")) {
                    for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
                        if (i !== 0 && dlc[i].nodeName === "DT") {
                            delete dlc[0];
                            break;
                        }
                        delete dlc[i];
                    }
                }
                const chapterList = dlc.filter((obj) => obj !== undefined);
                let chapterNumber = 0;
                let sectionNumber = 0;
                let sectionName = null;
                let sectionChapterNumber = 0;
                for (let i = 0; i < chapterList.length; i++) {
                    const node = chapterList[i];
                    if (node.nodeName === "DT") {
                        sectionNumber++;
                        sectionChapterNumber = 0;
                        sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
                    }
                    else if (node.nodeName === "DD") {
                        chapterNumber++;
                        sectionChapterNumber++;
                        const a = node.firstElementChild;
                        const chapterName = a.innerText;
                        const chapterUrl = a.href;
                        const isVIP = false;
                        const isPaid = false;
                        const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                        chapters.push(chapter);
                    }
                }
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
            const content = dom.querySelector("#content");
            const ad = '<div align="center"><a href="javascript:postError();" style="text-align:center;color:red;">章节错误,点此举报(免注册)</a>,举报后维护人员会在两分钟内校正章节内容,请耐心等待,并刷新页面。</div>';
            content.innerHTML = content.innerHTML
                .replace(ad, "")
                .replace(/http:\/\/www.shuquge.com\/txt\/\d+\/\d+\.html/, "");
            if (content) {
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.dingdiann = dingdiann;
class gebiqu {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 5;
    }
    bookParse(chapterParse) {
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href;
            const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
            const author = (document.querySelector("#info > p:nth-child(2)")).innerText
                .replace(/作(\s+)?者[::]/, "")
                .trim();
            let introduction;
            const introDom = document.querySelector("#intro");
            if (introDom === null) {
                introduction = null;
            }
            else {
                introDom.innerHTML = introDom.innerHTML.replace(/如果您喜欢.+,别忘记分享给朋友/, "");
                lib_1.rm('a[href^="http://down.gebiqu.com"]', false, introDom);
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = document.querySelector("#fmimg > img")
                .src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            const chapters = [];
            const dl = document.querySelector("#list>dl");
            if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
                const dlc = Array.from(dl.children);
                if (dlc[0].nodeName === "DT" &&
                    dlc[0].innerText.includes("最新的八个章节")) {
                    for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
                        if (i !== 0 && dlc[i].nodeName === "DT") {
                            delete dlc[0];
                            break;
                        }
                        delete dlc[i];
                    }
                }
                const chapterList = dlc.filter((obj) => obj !== undefined);
                let chapterNumber = 0;
                let sectionNumber = 0;
                let sectionName = null;
                let sectionChapterNumber = 0;
                for (let i = 0; i < chapterList.length; i++) {
                    const node = chapterList[i];
                    if (node.nodeName === "DT") {
                        sectionNumber++;
                        sectionChapterNumber = 0;
                        sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
                    }
                    else if (node.nodeName === "DD") {
                        chapterNumber++;
                        sectionChapterNumber++;
                        const a = node.firstElementChild;
                        const chapterName = a.innerText;
                        const chapterUrl = a.href;
                        const isVIP = false;
                        const isPaid = false;
                        const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                        chapters.push(chapter);
                    }
                }
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
            const content = dom.querySelector("#content");
            content.innerHTML = content.innerHTML.replace("www.gebiqu.com", "");
            if (content) {
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.gebiqu = gebiqu;
class c226ks {
    constructor() {
        this.imageMode = "TM";
    }
    bookParse(chapterParse) {
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href.replace(/index_\d+\.html/, "index_1.html");
            const bookname = (document.querySelector(".info > .top > h1")).innerText.trim();
            const author = (document.querySelector(".info > .top > .fix > p:nth-child(1)")).innerText
                .replace(/作(\s+)?者[::]/, "")
                .trim();
            let introduction;
            const introDom = document.querySelector(".desc");
            if (introDom === null) {
                introduction = null;
            }
            else {
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = document.querySelector(".imgbox > img")
                .src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            const chapters = [];
            const indexUrls = Array.from(document.querySelectorAll('[name="pageselect"] > option')).map((opt) => document.location.origin + opt.getAttribute("value"));
            let lis = [];
            for (const indexUrl of indexUrls) {
                const dom = yield lib_1.getHtmlDOM(indexUrl, "UTF-8");
                const ul = dom.querySelector("div.row.row-section > div > div:nth-child(4) > ul");
                if (ul === null || ul === void 0 ? void 0 : ul.childElementCount) {
                    lis = lis.concat(Array.from(ul.children));
                }
            }
            const chapterList = lis.filter((obj) => obj !== undefined);
            let chapterNumber = 0;
            for (let i = 0; i < chapterList.length; i++) {
                const node = chapterList[i];
                chapterNumber++;
                const a = node.firstElementChild;
                const chapterName = a.innerText;
                const chapterUrl = a.href;
                const isVIP = false;
                const isPaid = false;
                const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8");
                chapters.push(chapter);
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = dom.querySelector("h1.title").innerText.trim();
            const content = dom.querySelector("#content");
            const ad = '<div class="posterror"><a href="javascript:postError();" class="red">章节错误,点此举报(免注册)</a>,举报后维护人员会在两分钟内校正章节内容,请耐心等待,并刷新页面。</div>';
            content.innerHTML = content.innerHTML.replace(ad, "");
            if (content) {
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.c226ks = c226ks;


/***/ }),

/***/ 444:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.ciweimao = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class ciweimao {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 1;
        this.maxRunLimit = 1;
    }
    bookParse(chapterParse) {
        var _a, _b;
        return __awaiter(this, void 0, void 0, function* () {
            const bookid = unsafeWindow.HB.book.book_id;
            const bookUrl = `https://www.ciweimao.com/book/${bookid}`;
            const bookname = (document.querySelector(".book-catalog .hd h3")).innerText.trim();
            const author = (document.querySelector(".book-catalog .hd > p > a")).innerText.trim();
            let introduction;
            const dom = yield lib_1.getHtmlDOM(bookUrl, undefined);
            const introDom = dom.querySelector(".book-intro-cnt .book-desc");
            if (introDom === null) {
                introduction = null;
            }
            else {
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = dom.querySelector(".cover > img").src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            additionalMetadate.tags = Array.from(dom.querySelectorAll(".label-box > .label")).map((span) => span.innerText.trim());
            const chapters = [];
            const sections = document.querySelectorAll(".book-chapter > .book-chapter-box");
            const cos = [];
            for (let i = 0; i < sections.length; i++) {
                const s = sections[i];
                const sectionNumber = i + 1;
                const sectionName = s.querySelector(".sub-tit").innerText;
                const cs = s.querySelectorAll(".book-chapter-list > li > a");
                for (let j = 0; j < cs.length; j++) {
                    const c = cs[j];
                    const chapterName = c.innerText.trim();
                    const chapterUrl = c.href;
                    let isVIP = false;
                    let isPaid = false;
                    if (c.childElementCount) {
                        isVIP = true;
                        if (((_a = c.firstElementChild) === null || _a === void 0 ? void 0 : _a.className) === "icon-unlock") {
                            isPaid = true;
                        }
                    }
                    const co = {
                        bookUrl: bookUrl,
                        bookname: bookname,
                        chapterUrl: chapterUrl,
                        chapterName: chapterName,
                        isVIP: isVIP,
                        isPaid: isPaid,
                        sectionName: sectionName,
                        sectionNumber: sectionNumber,
                        sectionChapterNumber: j,
                    };
                    cos.push(co);
                }
            }
            cos.sort(lib_1.cosCompare);
            for (let i = 0; i < cos.length; i++) {
                const chapterNumber = i + 1;
                let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
                const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                const isLogin = ((_b = document.querySelector(".login-info.ly-fr")) === null || _b === void 0 ? void 0 : _b.childElementCount) === 1
                    ? true
                    : false;
                if (isVIP && !(isLogin && isPaid)) {
                    chapter.status = main_1.Status.aborted;
                }
                chapters.push(chapter);
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            function decrypt(item) {
                let message = item.content;
                let keys = item.keys;
                let len = item.keys.length;
                let accessKey = item.accessKey;
                let accessKeyList = accessKey.split("");
                let charsNotLatinNum = accessKeyList.length;
                let output = new Array();
                output.push(keys[accessKeyList[charsNotLatinNum - 1].charCodeAt(0) % len]);
                output.push(keys[accessKeyList[0].charCodeAt(0) % len]);
                for (let i = 0; i < output.length; i++) {
                    message = atob(message);
                    let data = output[i];
                    let iv = btoa(message.substr(0, 16));
                    let keys255 = btoa(message.substr(16));
                    let pass = CryptoJS.format.OpenSSL.parse(keys255);
                    message = CryptoJS.AES.decrypt(pass, CryptoJS.enc.Base64.parse(data), {
                        iv: CryptoJS.enc.Base64.parse(iv),
                        format: CryptoJS.format.OpenSSL,
                    });
                    if (i < output.length - 1) {
                        message = message.toString(CryptoJS.enc.Base64);
                        message = atob(message);
                    }
                }
                return message.toString(CryptoJS.enc.Utf8);
            }
            function getChapterAuthorSay() {
                return __awaiter(this, void 0, void 0, function* () {
                    const doc = yield lib_1.getHtmlDOM(chapterUrl, undefined);
                    const _chapter_author_says = doc.querySelectorAll("#J_BookCnt .chapter.author_say");
                    let div_chapter_author_say;
                    if (_chapter_author_says.length !== 0) {
                        let hr = document.createElement("hr");
                        div_chapter_author_say = document.createElement("div");
                        div_chapter_author_say.appendChild(hr);
                        for (let _chapter_author_say of Array.from(_chapter_author_says)) {
                            lib_1.rm("i", true, _chapter_author_say);
                            div_chapter_author_say.appendChild(_chapter_author_say);
                        }
                    }
                    return div_chapter_author_say;
                });
            }
            const chapter_id = chapterUrl.split("/").slice(-1)[0];
            function publicChapter() {
                return __awaiter(this, void 0, void 0, function* () {
                    function chapterDecrypt(chapter_id, refererUrl) {
                        return __awaiter(this, void 0, void 0, function* () {
                            const rootPath = "https://www.ciweimao.com/";
                            const access_key_url = rootPath + "chapter/ajax_get_session_code";
                            const chapter_content_url = rootPath + "chapter/get_book_chapter_detail_info";
                            console.debug(`[Chapter]请求 ${access_key_url} Referer ${refererUrl}`);
                            const access_key_obj = yield lib_1.gfetch(access_key_url, {
                                method: "POST",
                                headers: {
                                    Accept: "application/json, text/javascript, */*; q=0.01",
                                    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
                                    Referer: refererUrl,
                                    Origin: "https://www.ciweimao.com",
                                    "X-Requested-With": "XMLHttpRequest",
                                },
                                data: `chapter_id=${chapter_id}`,
                                responseType: "json",
                            }).then((response) => response.response);
                            const chapter_access_key = access_key_obj
                                .chapter_access_key;
                            console.debug(`[Chapter]请求 ${chapter_content_url} Referer ${refererUrl}`);
                            const chapter_content_obj = yield lib_1.gfetch(chapter_content_url, {
                                method: "POST",
                                headers: {
                                    Accept: "application/json, text/javascript, */*; q=0.01",
                                    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
                                    Referer: refererUrl,
                                    Origin: "https://www.ciweimao.com",
                                    "X-Requested-With": "XMLHttpRequest",
                                },
                                data: `chapter_id=${chapter_id}&chapter_access_key=${chapter_access_key}`,
                                responseType: "json",
                            }).then((response) => response.response);
                            if (chapter_content_obj.code !== 100000) {
                                console.error(chapter_content_obj);
                                throw new Error(`下载 ${refererUrl} 失败`);
                            }
                            return decrypt({
                                content: chapter_content_obj.chapter_content,
                                keys: chapter_content_obj.encryt_keys,
                                accessKey: chapter_access_key,
                            });
                        });
                    }
                    const div_chapter_author_say = yield getChapterAuthorSay();
                    let content = document.createElement("div");
                    let decryptDate = yield chapterDecrypt(chapter_id, chapterUrl);
                    content.innerHTML = decryptDate;
                    lib_1.rm(".chapter span", true, content);
                    if (div_chapter_author_say) {
                        content.appendChild(div_chapter_author_say);
                    }
                    let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                    return {
                        chapterName: chapterName,
                        contentRaw: content,
                        contentText: text,
                        contentHTML: dom,
                        contentImages: images,
                    };
                });
            }
            function vipChapter() {
                var _a;
                return __awaiter(this, void 0, void 0, function* () {
                    const isLogin = ((_a = document.querySelector(".login-info.ly-fr")) === null || _a === void 0 ? void 0 : _a.childElementCount) === 1
                        ? true
                        : false;
                    if (isLogin && isPaid) {
                        function vipChapterDecrypt(chapter_id, refererUrl) {
                            return __awaiter(this, void 0, void 0, function* () {
                                const HB = unsafeWindow.HB;
                                const parentWidth = 871;
                                const setFontSize = "14";
                                const image_session_code_url = HB.config.rootPath + "chapter/ajax_get_image_session_code";
                                console.debug(`[Chapter]请求 ${image_session_code_url} Referer ${refererUrl}`);
                                const image_session_code_object = yield lib_1.gfetch(image_session_code_url, {
                                    method: "POST",
                                    headers: {
                                        Accept: "application/json, text/javascript, */*; q=0.01",
                                        Referer: refererUrl,
                                        Origin: "https://www.ciweimao.com",
                                        "X-Requested-With": "XMLHttpRequest",
                                    },
                                    responseType: "json",
                                }).then((response) => response.response);
                                if (image_session_code_object.code !==
                                    100000) {
                                    console.error(image_session_code_object);
                                    throw new Error(`下载 ${refererUrl} 失败`);
                                }
                                const imageCode = decrypt({
                                    content: image_session_code_object
                                        .image_code,
                                    keys: image_session_code_object
                                        .encryt_keys,
                                    accessKey: image_session_code_object
                                        .access_key,
                                });
                                const vipCHapterImageUrl = HB.config.rootPath +
                                    "chapter/book_chapter_image?chapter_id=" +
                                    chapter_id +
                                    "&area_width=" +
                                    parentWidth +
                                    "&font=undefined" +
                                    "&font_size=" +
                                    setFontSize +
                                    "&image_code=" +
                                    imageCode +
                                    "&bg_color_name=white" +
                                    "&text_color_name=white";
                                return vipCHapterImageUrl;
                            });
                        }
                        const div_chapter_author_say = yield getChapterAuthorSay();
                        const vipCHapterImageUrl = yield vipChapterDecrypt(chapter_id, chapterUrl);
                        console.debug(`[Chapter]请求 ${vipCHapterImageUrl} Referer ${chapterUrl}`);
                        const vipCHapterImageBlob = yield lib_1.gfetch(vipCHapterImageUrl, {
                            method: "GET",
                            headers: {
                                Referer: chapterUrl,
                                Accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
                            },
                            responseType: "blob",
                        }).then((response) => response.response);
                        const vipCHapterName = `vipCHapter${chapter_id}.png`;
                        const vipCHapterImage = new main_1.ImageClass(vipCHapterImageUrl, vipCHapterName, "TM");
                        if (vipCHapterImageBlob) {
                            vipCHapterImage.imageBlob = vipCHapterImageBlob;
                            vipCHapterImage.status = main_1.Status.finished;
                        }
                        const contentImages = [vipCHapterImage];
                        let ddom, dtext, dimages;
                        if (div_chapter_author_say) {
                            let { dom, text, images } = lib_1.cleanDOM(div_chapter_author_say, "TM");
                            [ddom, dtext, dimages] = [dom, text, images];
                        }
                        const img = document.createElement("img");
                        img.src = vipCHapterName;
                        img.alt = vipCHapterImageUrl;
                        const contentHTML = document.createElement("div");
                        contentHTML.appendChild(img);
                        if (ddom) {
                            contentHTML.appendChild(ddom);
                        }
                        let contentText = `VIP章节,请打开HTML文件查看。\n![${vipCHapterImageUrl}](${vipCHapterName})`;
                        if (dtext) {
                            contentText = contentText + "\n\n" + dtext;
                        }
                        return {
                            chapterName: chapterName,
                            contentRaw: contentHTML,
                            contentText: contentText,
                            contentHTML: contentHTML,
                            contentImages: contentImages,
                        };
                    }
                    else {
                        return {
                            chapterName: chapterName,
                            contentRaw: null,
                            contentText: null,
                            contentHTML: null,
                            contentImages: null,
                        };
                    }
                });
            }
            if (isVIP) {
                return vipChapter();
            }
            else {
                return publicChapter();
            }
        });
    }
}
exports.ciweimao = ciweimao;


/***/ }),

/***/ 161:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.hetushu = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class hetushu {
    constructor() {
        this.imageMode = "TM";
    }
    bookParse(chapterParse) {
        var _a;
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href;
            const bookname = (document.querySelector(".book_info > h2")).innerText.trim();
            const author = (document.querySelector(".book_info > div:nth-child(3) > a:nth-child(1)")).innerText.trim();
            let introduction;
            const introDom = document.querySelector(".intro");
            if (introDom === null) {
                introduction = null;
            }
            else {
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = (document.querySelector(".book_info > img")).src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            const chapters = [];
            const chapterList = ((_a = document.querySelector("#dir")) === null || _a === void 0 ? void 0 : _a.childNodes);
            if (chapterList && chapterList.length !== 0) {
                let chapterNumber = 0;
                let sectionNumber = 0;
                let sectionName = null;
                let sectionChapterNumber = 0;
                for (let i = 0; i < chapterList.length; i++) {
                    const node = chapterList[i];
                    if (node.nodeName === "DT") {
                        sectionNumber++;
                        sectionChapterNumber = 0;
                        sectionName = node.innerText.trim();
                    }
                    else if (node.nodeName === "DD") {
                        chapterNumber++;
                        sectionChapterNumber++;
                        const a = node.firstElementChild;
                        const chapterName = a.innerText;
                        const chapterUrl = a.href;
                        const isVIP = false;
                        const isPaid = false;
                        const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                        chapters.push(chapter);
                    }
                }
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = (dom.querySelector("#content .h2")).innerText.trim();
            const content = dom.querySelector("#content");
            if (content) {
                lib_1.rm("h2", true, content);
                lib_1.rm("tt", true, content);
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.hetushu = hetushu;


/***/ }),

/***/ 158:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.meegoq = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class meegoq {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 3;
    }
    bookParse(chapterParse) {
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href.replace("/book", "/info");
            const bookname = (document.querySelector("article.info > header > h1")).innerText.trim();
            const dom = yield lib_1.getHtmlDOM(bookUrl, "GBK");
            const author = (dom.querySelector("article.info > p.detail.pt20 > i:nth-child(1) > a")).innerText.trim();
            let introduction;
            const introDom = dom.querySelector("article.info > p.desc");
            if (introDom === null) {
                introduction = null;
            }
            else {
                lib_1.rm("b", false, introDom);
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = (dom.querySelector("article.info > div.cover > img")).src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            const chapters = [];
            const ul = document.querySelector("ul.mulu");
            if (ul === null || ul === void 0 ? void 0 : ul.childElementCount) {
                const ulc = Array.from(ul.children);
                if (Array.from(ulc[0].classList).includes("volumn") &&
                    ulc[0].innerText.match(/最新.章/)) {
                    for (let i = 0; i < (ul === null || ul === void 0 ? void 0 : ul.childElementCount); i++) {
                        if (i !== 0 &&
                            Array.from(ulc[i].classList).includes("volumn") &&
                            ulc[i].innerText.trim() !== "全部章节") {
                            delete ulc[0];
                            break;
                        }
                        delete ulc[i];
                    }
                }
                const chapterList = ulc.filter((obj) => obj !== undefined);
                let chapterNumber = 0;
                let sectionNumber = 0;
                let sectionName = null;
                let sectionChapterNumber = 0;
                for (let i = 0; i < chapterList.length; i++) {
                    const li = chapterList[i];
                    if (Array.from(li.classList).includes("volumn")) {
                        sectionNumber++;
                        sectionChapterNumber = 0;
                        sectionName = li.innerText.trim();
                    }
                    else {
                        chapterNumber++;
                        sectionChapterNumber++;
                        const a = li.firstElementChild;
                        const chapterName = a.innerText;
                        const chapterUrl = a.href;
                        const isVIP = false;
                        const isPaid = false;
                        const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
                        chapters.push(chapter);
                    }
                }
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = (dom.querySelector("article > header > h1")).innerText.trim();
            const content = dom.querySelector("#content");
            if (content) {
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.meegoq = meegoq;


/***/ }),

/***/ 839:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.qidian = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class qidian {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 5;
    }
    bookParse(chapterParse) {
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href;
            const bookname = (document.querySelector(".book-info > h1 > em")).innerText.trim();
            let introduction;
            const author = (document.querySelector(".book-info .writer")).innerText
                .replace(/作\s+者:/, "")
                .trim();
            const introDom = document.querySelector(".book-info-detail .book-intro");
            if (introDom === null) {
                introduction = null;
            }
            else {
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            let coverUrl = document.querySelector("#bookImg > img")
                .src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            additionalMetadate.tags = Array.from(document.querySelectorAll(".tag-wrap>.tags")).map((a) => a.innerText.trim());
            const chapters = [];
            const liLength = document.querySelectorAll("#j-catalogWrap li").length;
            const getChapterTotalNumber = () => {
                const span = (document.querySelector("#J-catalogCount")).innerText.match(/\d+/);
                if (span) {
                    return Number(span[0]);
                }
            };
            if (!(liLength && getChapterTotalNumber() === liLength)) {
                yield lib_1.sleep(3000);
            }
            const sections = document.querySelectorAll("#j-catalogWrap > .volume-wrap > .volume");
            const cos = [];
            for (let i = 0; i < sections.length; i++) {
                const s = sections[i];
                const sectionNumber = i + 1;
                const sectionName = s.querySelector("h3").innerText
                    .trim()
                    .split("·")[0];
                const cs = s.querySelectorAll("ul.cf > li");
                for (let j = 0; j < cs.length; j++) {
                    const c = cs[j];
                    const a = c.firstElementChild;
                    const chapterName = a.innerText.trim();
                    const chapterUrl = a.href;
                    const isVIP = () => {
                        const host = new URL(chapterUrl).host;
                        if (host === "vipreader.qidian.com") {
                            return true;
                        }
                        return false;
                    };
                    const isPaid = () => {
                        if (isVIP()) {
                            if (c.childElementCount === 2) {
                                return false;
                            }
                            else {
                                return true;
                            }
                        }
                        return false;
                    };
                    const co = {
                        bookUrl: bookUrl,
                        bookname: bookname,
                        chapterUrl: chapterUrl,
                        chapterName: chapterName,
                        isVIP: isVIP(),
                        isPaid: isPaid(),
                        sectionName: sectionName,
                        sectionNumber: sectionNumber,
                        sectionChapterNumber: j,
                    };
                    cos.push(co);
                }
            }
            cos.sort(lib_1.cosCompare);
            for (let i = 0; i < cos.length; i++) {
                const chapterNumber = i + 1;
                let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
                const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                const isLogin = () => {
                    const sign_in_dom = document.querySelector(".sign-in");
                    const sign_out_dom = document.querySelector(".sign-out");
                    if (sign_in_dom && sign_out_dom) {
                        if (Array.from(sign_out_dom.classList).includes("hidden")) {
                            return true;
                        }
                    }
                    return false;
                };
                if (isVIP && !(isLogin() && chapter.isPaid)) {
                    chapter.status = main_1.Status.aborted;
                }
                chapters.push(chapter);
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            function publicChapter() {
                return __awaiter(this, void 0, void 0, function* () {
                    const dom = yield lib_1.ggetHtmlDOM(chapterUrl, charset);
                    const chapterName = (dom.querySelector(".j_chapterName > .content-wrap")).innerText.trim();
                    const content = dom.querySelector(".read-content");
                    const author_say_wrap = (dom.querySelector(".author-say-wrap"));
                    if (content) {
                        if (author_say_wrap) {
                            const author_say = author_say_wrap.querySelector("div.author-say > p:nth-child(3)");
                            const hr = document.createElement("hr");
                            content.appendChild(hr);
                            content.appendChild(author_say);
                        }
                        let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                        return {
                            chapterName: chapterName,
                            contentRaw: content,
                            contentText: text,
                            contentHTML: dom,
                            contentImages: images,
                        };
                    }
                    else {
                        return {
                            chapterName: chapterName,
                            contentRaw: null,
                            contentText: null,
                            contentHTML: null,
                            contentImages: null,
                        };
                    }
                });
            }
            function vipChapter() {
                var _a;
                return __awaiter(this, void 0, void 0, function* () {
                    const _csrfToken = unsafeWindow.jQuery.ajaxSettings.data
                        ._csrfToken;
                    const bookId = document.location.pathname.split("/").slice(-1)[0];
                    const authorId = (_a = document
                        .querySelector("#authorId")) === null || _a === void 0 ? void 0 : _a.getAttribute("data-authorid");
                    const chapterId = chapterUrl.split("/").slice(-1)[0];
                    function getChapterInfo() {
                        return __awaiter(this, void 0, void 0, function* () {
                            const baseUrl = "https://vipreader.qidian.com/ajax/chapter/chapterInfo";
                            const search = new URLSearchParams({
                                _csrfToken: _csrfToken,
                                bookId: bookId,
                                chapterId: chapterId,
                                authorId: authorId,
                            });
                            const url = baseUrl + "?" + search.toString();
                            console.debug(`[Chapter]请求 ${url} Referer ${chapterUrl}`);
                            return lib_1.gfetch(url, {
                                headers: {
                                    accept: "application/json, text/javascript, */*; q=0.01",
                                    "x-requested-with": "XMLHttpRequest",
                                    Referer: chapterUrl,
                                },
                                responseType: "json",
                            }).then((response) => response.response);
                        });
                    }
                    if (isPaid) {
                        const chapterInfo = yield getChapterInfo();
                        if (chapterInfo.code === 0) {
                            const authorSay = chapterInfo.data.chapterInfo.authorSay;
                            const _content = chapterInfo.data.chapterInfo.content;
                            const content = document.createElement("div");
                            content.innerHTML = _content;
                            if (authorSay) {
                                const hr = document.createElement("hr");
                                content.appendChild(hr);
                                const authorSayDom = document.createElement("p");
                                authorSayDom.innerHTML = authorSay;
                                content.appendChild(authorSayDom);
                            }
                            const { dom, text, images } = lib_1.cleanDOM(content, "TM");
                            return {
                                chapterName: chapterName,
                                contentRaw: content,
                                contentText: text,
                                contentHTML: dom,
                                contentImages: images,
                            };
                        }
                    }
                    return {
                        chapterName: chapterName,
                        contentRaw: null,
                        contentText: null,
                        contentHTML: null,
                        contentImages: null,
                    };
                });
            }
            if (isVIP) {
                return vipChapter();
            }
            else {
                return publicChapter();
            }
        });
    }
}
exports.qidian = qidian;


/***/ }),

/***/ 116:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.sfacg = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
const rules_1 = __webpack_require__(489);
class sfacg {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 1;
    }
    bookParse(chapterParse) {
        var _a, _b, _c;
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href.replace("/MainIndex/", "");
            const bookname = (document.querySelector("h1.story-title")).innerText.trim();
            let introduction;
            const dom = yield lib_1.getHtmlDOM(bookUrl, undefined);
            const author = (dom.querySelector(".author-name")).innerText.trim();
            const introDom = dom.querySelector(".introduce");
            if (introDom === null) {
                introduction = null;
            }
            else {
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            let coverUrl = (dom.querySelector("#hasTicket div.pic img")).src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            additionalMetadate.tags = Array.from(dom.querySelectorAll("ul.tag-list > li.tag > a")).map((a) => a.innerText.trim());
            const chapters = [];
            const sections = document.querySelectorAll(".story-catalog");
            const cos = [];
            for (let i = 0; i < sections.length; i++) {
                const s = sections[i];
                const sectionNumber = i + 1;
                const sectionName = (s.querySelector(".catalog-title")).innerText
                    .replace(`【${bookname}】`, "")
                    .trim();
                const cs = s.querySelectorAll(".catalog-list > ul > li > a");
                for (let j = 0; j < cs.length; j++) {
                    const c = cs[j];
                    const _chapterName = (_a = c.getAttribute("title")) === null || _a === void 0 ? void 0 : _a.trim();
                    const chapterName = _chapterName ? _chapterName : "";
                    const chapterUrl = c.href;
                    let isVIP = false;
                    let isPaid = null;
                    if (c.childElementCount &&
                        ((_b = c.firstElementChild) === null || _b === void 0 ? void 0 : _b.getAttribute("class")) === "icn_vip") {
                        isVIP = true;
                    }
                    const co = {
                        bookUrl: bookUrl,
                        bookname: bookname,
                        chapterUrl: chapterUrl,
                        chapterName: chapterName,
                        isVIP: isVIP,
                        isPaid: isPaid,
                        sectionName: sectionName,
                        sectionNumber: sectionNumber,
                        sectionChapterNumber: j,
                    };
                    cos.push(co);
                }
            }
            cos.sort(lib_1.cosCompare);
            for (let i = 0; i < cos.length; i++) {
                const chapterNumber = i + 1;
                let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
                const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                const isLogin = ((_c = document.querySelector(".user-bar > .top-link > .normal-link")) === null || _c === void 0 ? void 0 : _c.childElementCount) === 3
                    ? true
                    : false;
                if (isVIP && !isLogin) {
                    chapter.status = main_1.Status.aborted;
                }
                chapters.push(chapter);
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const chapter_id = chapterUrl.split("/").slice(-2, -1)[0];
            function publicChapter() {
                return __awaiter(this, void 0, void 0, function* () {
                    const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
                    const chapterName = (dom.querySelector("h1.article-title")).innerText.trim();
                    const content = dom.querySelector(".article-content");
                    if (content) {
                        let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                        return {
                            chapterName: chapterName,
                            contentRaw: content,
                            contentText: text,
                            contentHTML: dom,
                            contentImages: images,
                        };
                    }
                    else {
                        return {
                            chapterName: chapterName,
                            contentRaw: null,
                            contentText: null,
                            contentHTML: null,
                            contentImages: null,
                        };
                    }
                });
            }
            function vipChapter() {
                var _a;
                return __awaiter(this, void 0, void 0, function* () {
                    function getvipChapterImage(vipChapterImageUrl, vipChapterName) {
                        return __awaiter(this, void 0, void 0, function* () {
                            let retryTime = 0;
                            function fetchVipChapterImage(vipChapterImageUrl) {
                                console.debug(`[Chapter]请求 ${vipChapterImageUrl} Referer ${chapterUrl} 重试次数 ${retryTime}`);
                                return fetch(vipChapterImageUrl, {
                                    headers: {
                                        accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
                                    },
                                    referrer: chapterUrl,
                                    body: null,
                                    method: "GET",
                                    mode: "cors",
                                    credentials: "include",
                                })
                                    .then((response) => response.blob())
                                    .then((blob) => {
                                    if (blob.size === 53658 || blob.size === 42356) {
                                        console.error(`[Chapter]请求 ${vipChapterImageUrl} 失败 Referer ${chapterUrl}`);
                                        if (retryTime < rules_1.retryLimit) {
                                            retryTime++;
                                            return fetchVipChapterImage(vipChapterImageUrl);
                                        }
                                        else {
                                            return null;
                                        }
                                    }
                                    else {
                                        return blob;
                                    }
                                });
                            }
                            const vipChapterImageBlob = yield fetchVipChapterImage(vipChapterImageUrl);
                            const vipChapterImage = new main_1.ImageClass(vipChapterImageUrl, vipChapterName, "naive");
                            if (vipChapterImageBlob) {
                                vipChapterImage.imageBlob = vipChapterImageBlob;
                                vipChapterImage.status = main_1.Status.finished;
                            }
                            else {
                                vipChapterImage.status = main_1.Status.failed;
                            }
                            return vipChapterImage;
                        });
                    }
                    const isLogin = ((_a = document.querySelector(".user-bar > .top-link > .normal-link")) === null || _a === void 0 ? void 0 : _a.childElementCount) === 3
                        ? true
                        : false;
                    if (isLogin) {
                        const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
                        const chapterName = (dom.querySelector("h1.article-title")).innerText.trim();
                        const isPaid = dom.querySelector(".pay-section") === null;
                        if (isPaid) {
                            const vipChapterDom = (dom.querySelector(".article-content > #vipImage"));
                            if (vipChapterDom) {
                                const vipChapterImageUrl = vipChapterDom.src;
                                const vipChapterName = `vipCHapter${chapter_id}.gif`;
                                const vipChapterImage = yield getvipChapterImage(vipChapterImageUrl, vipChapterName);
                                const contentImages = [vipChapterImage];
                                const img = document.createElement("img");
                                img.src = vipChapterName;
                                img.alt = vipChapterImageUrl;
                                const contentHTML = document.createElement("div");
                                contentHTML.appendChild(img);
                                const contentText = `VIP章节,请打开HTML文件查看。\n![${vipChapterImageUrl}](${vipChapterName})`;
                                return {
                                    chapterName: chapterName,
                                    contentRaw: contentHTML,
                                    contentText: contentText,
                                    contentHTML: contentHTML,
                                    contentImages: contentImages,
                                };
                            }
                            else {
                                return publicChapter();
                            }
                        }
                    }
                    return {
                        chapterName: chapterName,
                        contentRaw: null,
                        contentText: null,
                        contentHTML: null,
                        contentImages: null,
                    };
                });
            }
            if (isVIP) {
                return vipChapter();
            }
            else {
                return publicChapter();
            }
        });
    }
}
exports.sfacg = sfacg;


/***/ }),

/***/ 382:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.shouda8 = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class shouda8 {
    constructor() {
        this.imageMode = "TM";
    }
    bookParse(chapterParse) {
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href;
            const bookname = (document.querySelector(".bread-crumbs > li:nth-child(4)")).innerText.trim();
            const author = (document.querySelector("div.bookname > h1 > em")).innerText
                .replace("作者:", "")
                .trim();
            let introduction;
            const introDom = document.querySelector(".intro");
            if (introDom === null) {
                introduction = null;
            }
            else {
                lib_1.rm(".book_keywords", false, introDom);
                lib_1.rm("script", true, introDom);
                lib_1.rm("#cambrian0", false, introDom);
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = (document.querySelector(".pic > img:nth-child(1)")).src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            const chapters = [];
            const chapterList = document.querySelectorAll(".link_14 > dl dd a");
            for (let i = 0; i < chapterList.length; i++) {
                const a = chapterList[i];
                const chapterName = a.innerText;
                const chapterUrl = a.href;
                const isVIP = false;
                const isPaid = false;
                const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, i + 1, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8");
                chapters.push(chapter);
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = (dom.querySelector(".kfyd > h2:nth-child(1)")).innerText.trim();
            const content = dom.querySelector("#content");
            if (content) {
                lib_1.rm("p:last-child", false, content);
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.shouda8 = shouda8;


/***/ }),

/***/ 623:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.uukanshu = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class uukanshu {
    constructor() {
        this.imageMode = "TM";
        this.charset = "GBK";
    }
    bookParse(chapterParse) {
        var _a;
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href;
            const bookname = (document.querySelector("dd.jieshao_content > h1 > a")).innerText
                .replace("最新章节", "")
                .trim();
            const author = (document.querySelector("dd.jieshao_content > h2 > a")).innerText.trim();
            let introduction;
            const introDom = (document.querySelector("dd.jieshao_content > h3"));
            if (introDom === null) {
                introduction = null;
            }
            else {
                introDom.innerHTML = introDom.innerHTML
                    .replace(/^.+简介:\s+www.uukanshu.com\s+/, "")
                    .replace(/\s+https:\/\/www.uukanshu.com/, "")
                    .replace(/-+/, "");
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = (document.querySelector("a.bookImg > img")).src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            const chapters = [];
            const button = (document.querySelector('span[onclick="javascript:reverse(this);"]'));
            const reverse = unsafeWindow.reverse;
            if (button.innerText === "顺序排列") {
                reverse(button);
            }
            const chapterList = ((_a = document.getElementById("chapterList")) === null || _a === void 0 ? void 0 : _a.childNodes);
            if (chapterList && chapterList.length !== 0) {
                let chapterNumber = 0;
                let sectionNumber = 0;
                let sectionName = null;
                let sectionChapterNumber = 0;
                for (let i = 0; i < chapterList.length; i++) {
                    const li = chapterList[i];
                    if (li.className === "volume") {
                        sectionNumber++;
                        sectionChapterNumber = 0;
                        sectionName = li.innerText;
                    }
                    else {
                        chapterNumber++;
                        sectionChapterNumber++;
                        const a = li.firstElementChild;
                        const chapterName = a.innerText;
                        const chapterUrl = a.href;
                        const isVIP = false;
                        const isPaid = false;
                        const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
                        chapters.push(chapter);
                    }
                }
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = dom.querySelector("#timu").innerText.trim();
            const content = dom.querySelector("#contentbox");
            if (content) {
                lib_1.rm(".ad_content", true, content);
                const contentReplace = [
                    /[UuUu]+看书\s*[ww]+.[UuUu]+[kk][aa][nn][ss][hh][UuUu].[nn][ee][tt]/g,
                    /[UuUu]+看书\s*[ww]+.[UuUu]+[kk][aa][nn][ss][hh][UuUu].[cCc][oOo][mMm]/g,
                    /[UU]*看书[(\\(].*?[)\\)]文字首发。/,
                    "请记住本书首发域名:。",
                    "笔趣阁手机版阅读网址:",
                    "小说网手机版阅读网址:",
                    "https://",
                    "http://",
                ];
                for (let r of contentReplace) {
                    content.innerHTML = content.innerHTML.replace(r, "");
                }
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.uukanshu = uukanshu;


/***/ }),

/***/ 678:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.xiaoshuodaquan = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class xiaoshuodaquan {
    constructor() {
        this.imageMode = "TM";
        this.charset = "GBK";
        this.concurrencyLimit = 5;
    }
    bookParse(chapterParse) {
        var _a, _b;
        return __awaiter(this, void 0, void 0, function* () {
            const ccount = (_a = document.querySelector(".crumbswrap")) === null || _a === void 0 ? void 0 : _a.childElementCount;
            let bookUrl = document.location.href;
            if (ccount) {
                bookUrl = (document.querySelector(`.crumbswrap > a:nth-child(${ccount - 2})`)).href;
            }
            const bookname = (document.querySelector("div.dirwraps > h1")).innerText
                .replace("《", "")
                .replace("》", "")
                .trim();
            const author = (document.querySelector(".smallcons > span:nth-child(1) > a:nth-child(1)")).innerText.trim();
            let introduction;
            const introDom = document.querySelector(".bookintro");
            if (introDom === null) {
                introduction = null;
            }
            else {
                introDom.innerHTML = introDom.innerHTML.replace("内容简介:", "");
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            let coverUrl;
            if (ccount) {
                const dom = yield lib_1.getHtmlDOM(bookUrl, "GBK");
                coverUrl = dom.querySelector(".con_limg > img").src;
            }
            if (coverUrl) {
                additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
                additionalMetadate.cover.init();
            }
            const chapters = [];
            const sectionNames = document.querySelectorAll(".dirwraps > div.dirtitone");
            const sections = document.querySelectorAll(".dirwraps > div.clearfix.dirconone");
            let chapterNumber = 0;
            for (let i = 0; i < sections.length; i++) {
                const sectionNameObj = sectionNames[i];
                const sectionObj = sections[i];
                const sectionNumber = i + 1;
                const sectionName = (_b = (sectionNameObj.firstElementChild)) === null || _b === void 0 ? void 0 : _b.innerText.replace(bookname, "").trim();
                let sectionChapterNumber = 0;
                const cos = sectionObj.querySelectorAll("ul>li>a");
                for (let j = 0; j < cos.length; j++) {
                    chapterNumber++;
                    sectionChapterNumber++;
                    const a = cos[j];
                    const chapterName = a.innerText;
                    const chapterUrl = a.href;
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
                    chapters.push(chapter);
                }
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = (dom.querySelector(".page-body > h1:nth-child(4)")).innerText.trim();
            const _content = dom.querySelector("#content");
            if (_content) {
                lib_1.rm("div", true, _content);
                lib_1.rm("script", true, _content);
                const content = document.createElement("div");
                content.innerHTML = _content.innerHTML.replace(/\n/g, "<br/>");
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.xiaoshuodaquan = xiaoshuodaquan;


/***/ }),

/***/ 441:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.xkzw = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class xkzw {
    constructor() {
        this.imageMode = "TM";
    }
    bookParse(chapterParse) {
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href;
            const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
            const author = (document.querySelector("#info > p:nth-child(2)")).innerText
                .replace(/作(\s+)?者[::]/, "")
                .trim();
            let introduction;
            const introDom = document.querySelector("#intro");
            if (introDom === null) {
                introduction = null;
            }
            else {
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = document.querySelector("#fmimg > img")
                .src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
            const chapters = [];
            const bookid = unsafeWindow.bookId;
            const siteChapterList = yield fetch("http://www.xkzw.org/action.php", {
                headers: {
                    accept: "application/json, text/javascript, */*",
                    "content-type": "application/x-www-form-urlencoded",
                    "x-requested-with": "XMLHttpRequest",
                },
                body: `action=clist&bookid=${bookid}`,
                method: "POST",
                mode: "cors",
                credentials: "include",
            }).then((response) => response.json());
            const dl = document.querySelector("#wrapper > div.box_con:nth-child(7) > div:nth-child(1) > dl:nth-child(1)");
            let tmpColumnName = "";
            let tmpColumnList = [];
            let tmpChapterList = [];
            if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
                const dlc = Array.from(dl.children);
                for (let i = 0; i < dl.childElementCount; i++) {
                    const node = dlc[i];
                    if (i !== 0) {
                        if (node.nodeName === "DD") {
                            const a = node.firstElementChild;
                            const chapterName = a.innerText;
                            const chapterUrl = a.href;
                            const chapterid = chapterUrl
                                .split("/")
                                .slice(-1)[0]
                                .replace(".html", "");
                            tmpChapterList.push({
                                chapterid: Number(chapterid) - bookid * 11,
                                chaptername: chapterName,
                                isempty: 0,
                                originalurl: "",
                                currenturl: "",
                            });
                        }
                        else if (node.nodeName === "DT") {
                            const tmpColumnObj = {
                                columnname: tmpColumnName,
                                columnid: 0,
                                chapterlist: tmpChapterList,
                            };
                            tmpColumnList.push(tmpColumnObj);
                            tmpColumnName = node.innerText
                                .replace(`《${bookname}》`, "")
                                .trim();
                            tmpChapterList = [];
                        }
                    }
                    else {
                        tmpColumnName = node.innerText
                            .replace(`《${bookname}》`, "")
                            .trim();
                    }
                }
            }
            const tcl = tmpChapterList.length;
            for (let i = 0; i < tcl; i++) {
                const tmpChapterObject = tmpChapterList.pop();
                if (tmpChapterObject) {
                    siteChapterList.columnlist[0].chapterlist.unshift(tmpChapterObject);
                }
            }
            if (tmpColumnList.length !== 0) {
                const tmpColumnListLenght = tmpColumnList.length;
                for (let i = 0; i < tmpColumnListLenght; i++) {
                    const tmpColumnObject = tmpColumnList.pop();
                    if (tmpColumnObject) {
                        siteChapterList.columnlist.unshift(tmpColumnObject);
                    }
                }
            }
            let chapterNumber = 0;
            let sectionNumber = 0;
            let sectionName = null;
            let sectionChapterNumber = 0;
            for (const column of siteChapterList.columnlist) {
                sectionNumber++;
                sectionName = column.columnname;
                for (const sitechapter of column.chapterlist) {
                    chapterNumber++;
                    sectionChapterNumber++;
                    const chapterName = sitechapter.chaptername;
                    const chapterUrl = bookUrl + (sitechapter.chapterid + bookid * 11) + ".html";
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                    chapters.push(chapter);
                }
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            function runEval(CryptoJS) {
                function gettt1(str, keyStr, ivStr) {
                    let key = CryptoJS.enc.Utf8.parse(keyStr);
                    let iv = CryptoJS.enc.Utf8.parse(ivStr);
                    let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
                    let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
                    let decrypt = CryptoJS.DES.decrypt(srcs, key, {
                        iv: iv,
                        mode: CryptoJS.mode.CBC,
                        padding: CryptoJS.pad.Pkcs7,
                    });
                    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
                    return decryptedStr.toString();
                }
                function gettt2(str, keyStr, ivStr) {
                    let key = CryptoJS.enc.Utf8.parse(keyStr);
                    let iv = CryptoJS.enc.Utf8.parse(ivStr);
                    let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
                    let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
                    let decrypt = CryptoJS.AES.decrypt(srcs, key, {
                        iv: iv,
                        mode: CryptoJS.mode.CBC,
                        padding: CryptoJS.pad.Pkcs7,
                    });
                    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
                    return decryptedStr.toString();
                }
                function gettt3(str, keyStr, ivStr) {
                    let key = CryptoJS.enc.Utf8.parse(keyStr);
                    let iv = CryptoJS.enc.Utf8.parse(ivStr);
                    let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
                    let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
                    let decrypt = CryptoJS.RC4.decrypt(srcs, key, {
                        iv: iv,
                        mode: CryptoJS.mode.CBC,
                        padding: CryptoJS.pad.Pkcs7,
                    });
                    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
                    return decryptedStr.toString();
                }
                function getttn(str, keyStr, ivStr) {
                    let key = CryptoJS.enc.Utf8.parse(keyStr);
                    let iv = CryptoJS.enc.Utf8.parse(ivStr);
                    let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
                    let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
                    let decrypt = CryptoJS.TripleDES.decrypt(srcs, key, {
                        iv: iv,
                        mode: CryptoJS.mode.CBC,
                        padding: CryptoJS.pad.Pkcs7,
                    });
                    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
                    return decryptedStr.toString();
                }
                function showttt1(dom) {
                    let obj = dom.getElementById("other");
                    let objTips = dom.getElementById("contenttips");
                    if (obj) {
                        let content = obj.innerHTML.trim();
                        let type = parseInt(content.substring(0, 1));
                        let key;
                        let iv;
                        if (type === 1) {
                            key = content.substring(1, 9);
                            iv = content.substring(9, 17);
                            content = content.substring(17);
                            obj.innerHTML = gettt1(content, key, iv);
                            obj.style.display = "block";
                            if (objTips) {
                                objTips.remove();
                            }
                        }
                        else if (type === 2) {
                            key = content.substring(1, 33);
                            iv = content.substring(33, 49);
                            content = content.substring(49);
                            obj.innerHTML = gettt2(content, key, iv);
                            obj.style.display = "block";
                            if (objTips) {
                                objTips.remove();
                            }
                        }
                        else if (type === 3) {
                            key = content.substring(1, 9);
                            iv = content.substring(9, 17);
                            content = content.substring(17);
                            obj.innerHTML = gettt3(content, key, iv);
                            obj.style.display = "block";
                            if (objTips) {
                                objTips.remove();
                            }
                        }
                        else {
                            key = content.substring(1, 25);
                            iv = content.substring(25, 33);
                            content = content.substring(33);
                            obj.innerHTML = getttn(content, key, iv);
                            obj.style.display = "block";
                            if (objTips) {
                                objTips.remove();
                            }
                        }
                    }
                }
                showttt1(dom);
            }
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            runEval(CryptoJS);
            chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
            const content = dom.querySelector("#content");
            if (content) {
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.xkzw = xkzw;


/***/ }),

/***/ 514:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    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) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.yrun = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class yrun {
    constructor() {
        this.imageMode = "naive";
    }
    bookParse(chapterParse) {
        return __awaiter(this, void 0, void 0, function* () {
            const bookUrl = document.location.href;
            const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
            const author = (document.querySelector("#info > p:nth-child(2)")).innerText
                .replace(/作(\s+)?者[::]/, "")
                .trim();
            let introduction;
            const introDom = document.querySelector("#intro > p");
            if (introDom === null) {
                introduction = null;
            }
            else {
                let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "naive");
                introduction = introCleantext;
            }
            const additionalMetadate = {};
            const coverUrl = document.querySelector("#fmimg > img")
                .src;
            additionalMetadate.cover = new main_1.ImageClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "naive");
            additionalMetadate.cover.init();
            const chapters = [];
            const chapterList = document.querySelectorAll("#list>dl>dd>a");
            if (chapterList && chapterList.length !== 0) {
                for (let i = 0; i < chapterList.length; i++) {
                    const a = chapterList[i];
                    const chapterName = a.innerText;
                    const chapterUrl = a.href;
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, i, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8");
                    chapters.push(chapter);
                }
            }
            return {
                bookUrl: bookUrl,
                bookname: bookname,
                author: author,
                introduction: introduction,
                additionalMetadate: additionalMetadate,
                chapters: chapters,
            };
        });
    }
    chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        return __awaiter(this, void 0, void 0, function* () {
            const dom = yield lib_1.getHtmlDOM(chapterUrl, charset);
            chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
            const content = dom.querySelector("#content");
            if (content) {
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.yrun = yrun;


/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module is referenced by other modules so it can't be inlined
/******/ 	var __webpack_exports__ = __webpack_require__(607);
/******/ 	
/******/ })()
;