wp-epub-gen 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,79 @@
1
+ /**
2
+ * types.d.ts
3
+ * @author: oldj
4
+ * @homepage: https://oldj.net
5
+ */
6
+
7
+ export interface IEpubImage {
8
+ id: string
9
+ url: string
10
+ dir: string
11
+ mediaType: string
12
+ extension: string
13
+ }
14
+
15
+ export interface IEpubGenOptions {
16
+ title: string
17
+ author?: string | string[]
18
+ publisher?: string
19
+ cover: string
20
+ output: string
21
+ version?: 2 | 3
22
+ css?: string
23
+ fonts?: string[]
24
+ lang?: 'en'
25
+ tocTitle?: string
26
+ appendChapterTitles?: boolean // For advanced customizations: absolute path to an OPF template.
27
+ customOpfTemplatePath?: string // For advanced customizations: absolute path to a NCX toc template.
28
+ customHtmlTocTemplatePath?: string // For advanced customizations: absolute path to a HTML toc template.
29
+ customNcxTocTemplatePath?: string
30
+ content: IChapter[] // Book Chapters content. It's should be an array of objects. eg. [{title: "Chapter 1",data: "<div>..."}, {data: ""},...]
31
+ verbose?: boolean // specify whether or not to console.log progress messages, default: false
32
+ description?: string
33
+ date?: string
34
+ tmpDir?: string
35
+ timeoutSeconds?: number
36
+ tocAutoNumber?: boolean
37
+ }
38
+
39
+ export interface IEpubData extends IEpubGenOptions {
40
+ id: string
41
+ docHeader: string
42
+ dir: string
43
+ images: IEpubImage[]
44
+ tmpDir: string
45
+ baseDir: string
46
+ _coverMediaType?: string
47
+ _coverExtension?: string
48
+ log: (msg: any) => void
49
+ content: IChapterData[]
50
+ timeoutSeconds: number
51
+ }
52
+
53
+ export interface IChapter {
54
+ id?: string
55
+ title?: string
56
+ author?: string | string[]
57
+ data: string // HTML String of the chapter content. image paths should be absolute path (should start with "http" or "https"), so that they could be downloaded. With the upgrade is possible to use local images (for this the path must start with file: //)
58
+ excludeFromToc?: boolean // default: false
59
+ beforeToc?: boolean // if is shown before Table of content, such like copyright pages. default: false
60
+ filename?: string // specify filename for each chapter
61
+ url?: string
62
+ children?: IChapter[]
63
+ appendChapterTitle?: boolean
64
+ }
65
+
66
+ export interface IChapterData extends IChapter {
67
+ id: string
68
+ href?: string
69
+ dir?: string
70
+ children: IChapterData[]
71
+ filePath: string
72
+ author: string[]
73
+ }
74
+
75
+ export interface IOut {
76
+ success?: boolean
77
+ message?: string
78
+ options?: IEpubGenOptions
79
+ }
package/cpi.epub CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wp-epub-gen",
3
- "version": "0.1.4",
3
+ "version": "0.2.0",
4
4
  "description": "Epub generator.",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -8,7 +8,8 @@
8
8
  "tsc": "tsc",
9
9
  "test": "mocha -r espower-typescript/guess -r tsconfig-paths/register test/*.test.js",
10
10
  "tt": "npm run build && node ./test/tt.js",
11
- "build": "rm -rf ./build && tsc",
11
+ "build": "cross-env NODE_ENV=production vite build --config vite.config.ts",
12
+ "build:0": "rm -rf ./build && tsc",
12
13
  "bt": "npm run build && npm run test",
13
14
  "w": "tsc -w",
14
15
  "p": "npm run build && npm run test && npm publish --access public"
@@ -24,9 +25,6 @@
24
25
  },
25
26
  "homepage": "https://github.com/oldj/wp-epub-gen#readme",
26
27
  "dependencies": {
27
- "@types/diacritics": "^1.3.1",
28
- "@types/uslug": "^1.0.1",
29
- "@types/uuid": "^9.0.0",
30
28
  "archiver": "^5.3.1",
31
29
  "cheerio": "^0.22.0",
32
30
  "diacritics": "^1.3.0",
@@ -41,10 +39,13 @@
41
39
  "devDependencies": {
42
40
  "@types/archiver": "^5.3.1",
43
41
  "@types/cheerio": "^0.22.31",
42
+ "@types/diacritics": "^1.3.1",
44
43
  "@types/ejs": "^3.1.1",
45
44
  "@types/fs-extra": "^9.0.13",
46
45
  "@types/mime": "^3.0.1",
47
46
  "@types/superagent": "^4.1.16",
47
+ "@types/uslug": "^1.0.1",
48
+ "@types/uuid": "^9.0.0",
48
49
  "@typescript-eslint/eslint-plugin": "^5.47.0",
49
50
  "@typescript-eslint/parser": "^5.47.0",
50
51
  "chai": "^4.3.7",
@@ -57,6 +58,9 @@
57
58
  "prettier": "^2.8.1",
58
59
  "ts-loader": "^9.4.2",
59
60
  "tsconfig-paths": "^4.1.1",
60
- "typescript": "^4.9.4"
61
+ "typescript": "^4.9.4",
62
+ "vite": "^4.0.3",
63
+ "vite-plugin-dts": "^1.7.1",
64
+ "vite-tsconfig-paths": "^4.0.3"
61
65
  }
62
66
  }
package/tsconfig.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "target": "es6",
3
+ "target": "es5",
4
4
  "module": "commonjs",
5
5
  "allowJs": true,
6
6
  "sourceMap": true,
@@ -15,8 +15,16 @@
15
15
  "noImplicitReturns": true,
16
16
  "moduleResolution": "node",
17
17
  "experimentalDecorators": true,
18
+ "esModuleInterop": true,
19
+ "allowSyntheticDefaultImports": true,
18
20
  "plugins": [
19
- ]
21
+ ],
22
+ "baseUrl": "./",
23
+ "paths": {
24
+ "@/*": [
25
+ "src/*"
26
+ ]
27
+ }
20
28
  },
21
29
  "include": [
22
30
  "src"
package/vite.config.ts ADDED
@@ -0,0 +1,40 @@
1
+ import * as path from 'path'
2
+ import { defineConfig } from 'vite'
3
+ import dts from 'vite-plugin-dts'
4
+ import tsconfigPaths from 'vite-tsconfig-paths'
5
+
6
+ // https://vitejs.dev/config/
7
+ export default defineConfig({
8
+ // root: path.join(__dirname, 'src', 'main'),
9
+ base: './',
10
+ build: {
11
+ rollupOptions: {
12
+ input: {
13
+ index: path.join(__dirname, 'src', 'index.ts'),
14
+ },
15
+ },
16
+ lib: {
17
+ entry: path.join(__dirname, 'src', 'index.ts'),
18
+ name: 'index',
19
+ formats: ['cjs'],
20
+ // fileName: (format) => `main.${format}.js`,
21
+ fileName: () => `index.js`,
22
+ },
23
+ outDir: path.join(__dirname, 'build'),
24
+ minify: false,
25
+ ssr: true,
26
+ // emptyOutDir: false,
27
+ },
28
+ resolve: {
29
+ alias: {
30
+ '@': path.resolve(__dirname, 'src'),
31
+ },
32
+ },
33
+ plugins: [
34
+ tsconfigPaths(),
35
+ dts({
36
+ entryRoot: path.join(__dirname, 'src'),
37
+ // outputDir: path.join(__dirname, 'build', 'types'),
38
+ }),
39
+ ],
40
+ })
@@ -1,88 +0,0 @@
1
- "use strict";
2
- /**
3
- * downloadImage
4
- * @author: oldj
5
- * @homepage: https://oldj.net
6
- */
7
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
- return new (P || (P = Promise))(function (resolve, reject) {
10
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
- step((generator = generator.apply(thisArg, _arguments || [])).next());
14
- });
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.downloadAllImages = void 0;
18
- const fs = require("fs-extra");
19
- const path = require("path");
20
- const request = require("superagent");
21
- const utils_1 = require("./utils");
22
- const downloadImage = (epubData, options) => __awaiter(void 0, void 0, void 0, function* () {
23
- let { url } = options;
24
- let { log } = epubData;
25
- let epub_dir = epubData.dir;
26
- if (!url) {
27
- return;
28
- }
29
- let image_dir = path.join(epub_dir, 'OEBPS', 'images');
30
- fs.ensureDirSync(image_dir);
31
- let filename = path.join(image_dir, options.id + '.' + options.extension);
32
- if (url.startsWith('file://') || url.startsWith('/')) {
33
- let auxPath = url.replace(/^file:\/\//i, '');
34
- if (process.platform === 'win32') {
35
- // Windows 下,把 /C:/ 转换成 C:/ 这样的形式
36
- if (auxPath.match(/^\/[a-zA-Z]:/)) {
37
- auxPath = auxPath.replace(/^\//, '');
38
- }
39
- }
40
- log(`[Copy 1] '${auxPath}' to '${filename}'`);
41
- if (fs.existsSync(auxPath)) {
42
- try {
43
- fs.copySync(auxPath, filename);
44
- }
45
- catch (e) {
46
- log('[Copy 1 Error] ' + e.message);
47
- }
48
- }
49
- else {
50
- log(`[Copy 1 Fail] '${url}' not exists!`);
51
- }
52
- return;
53
- }
54
- let requestAction;
55
- if (url.startsWith('http')) {
56
- requestAction = request.get(url).set({ 'User-Agent': utils_1.USER_AGENT });
57
- requestAction.pipe(fs.createWriteStream(filename));
58
- }
59
- else {
60
- log(`[Copy 2] '${url}' to '${filename}'`);
61
- requestAction = fs.createReadStream(path.join(options.dir || '', url));
62
- requestAction.pipe(fs.createWriteStream(filename));
63
- }
64
- return new Promise((resolve, reject) => {
65
- requestAction.on('error', (err) => {
66
- log('[Download Error] Error while downloading: ' + url);
67
- log(err);
68
- fs.unlinkSync(filename);
69
- // reject(err)
70
- resolve();
71
- });
72
- requestAction.on('end', () => {
73
- log('[Download Success] ' + url);
74
- resolve();
75
- });
76
- });
77
- });
78
- const downloadAllImages = (epubData) => __awaiter(void 0, void 0, void 0, function* () {
79
- let { images } = epubData;
80
- if (images.length === 0)
81
- return;
82
- fs.ensureDirSync(path.join(epubData.dir, 'OEBPS', 'images'));
83
- for (let image of images) {
84
- yield downloadImage(epubData, image);
85
- }
86
- });
87
- exports.downloadAllImages = downloadAllImages;
88
- //# sourceMappingURL=downloadImage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"downloadImage.js","sourceRoot":"","sources":["../src/downloadImage.ts"],"names":[],"mappings":"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"}
package/build/errors.js DELETED
@@ -1,14 +0,0 @@
1
- "use strict";
2
- /**
3
- * errors
4
- * @author: oldj
5
- * @homepage: https://oldj.net
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.errors = void 0;
9
- exports.errors = {
10
- no_output_path: 'No output path!',
11
- no_title: 'Title is required.',
12
- no_content: 'Content is required.',
13
- };
14
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEU,QAAA,MAAM,GAAG;IACpB,cAAc,EAAE,iBAAiB;IACjC,QAAQ,EAAE,oBAAoB;IAC9B,UAAU,EAAE,sBAAsB;CACnC,CAAA"}
@@ -1,121 +0,0 @@
1
- "use strict";
2
- /**
3
- * generateTempFile
4
- * @author: oldj
5
- * @homepage: https://oldj.net
6
- */
7
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
- return new (P || (P = Promise))(function (resolve, reject) {
10
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
- step((generator = generator.apply(thisArg, _arguments || [])).next());
14
- });
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.generateTempFile = void 0;
18
- const ejs = require("ejs");
19
- const entities = require("entities");
20
- const fs = require("fs-extra");
21
- const path = require("path");
22
- const utils_1 = require("./utils");
23
- const generateTempFile = (epubData) => __awaiter(void 0, void 0, void 0, function* () {
24
- var _a;
25
- let { log } = epubData;
26
- let oebps_dir = path.join(epubData.dir, 'OEBPS');
27
- yield fs.ensureDir(oebps_dir);
28
- const templates_dir = path.join(epubData.baseDir, 'templates');
29
- epubData.css =
30
- epubData.css ||
31
- (yield (0, utils_1.readFile)(path.join(epubData.baseDir, 'templates', 'template.css'), 'utf-8'));
32
- yield (0, utils_1.writeFile)(path.join(oebps_dir, 'style.css'), epubData.css, 'utf-8');
33
- if ((_a = epubData.fonts) === null || _a === void 0 ? void 0 : _a.length) {
34
- let fonts_dir = path.join(oebps_dir, 'fonts');
35
- yield fs.ensureDir(fonts_dir);
36
- epubData.fonts = epubData.fonts.map((font) => {
37
- let filename = path.basename(font);
38
- if (!fs.existsSync(font)) {
39
- log(`Custom font not found at '${font}'.`);
40
- }
41
- else {
42
- fs.copySync(font, path.join(fonts_dir, filename));
43
- }
44
- return filename;
45
- });
46
- }
47
- const isAppendTitle = (global_append, local_append) => {
48
- if (typeof local_append === 'boolean')
49
- return local_append;
50
- return !!global_append;
51
- };
52
- const saveContentToFile = (content) => {
53
- var _a;
54
- let title = entities.encodeXML(content.title || '');
55
- let html = `${epubData.docHeader}
56
- <head>
57
- <meta charset="UTF-8" />
58
- <title>${title}</title>
59
- <link rel="stylesheet" type="text/css" href="style.css" />
60
- </head>
61
- <body>
62
- `;
63
- if (content.title && isAppendTitle(epubData.appendChapterTitles, content.appendChapterTitle)) {
64
- html += `<h1>${title}</h1>`;
65
- }
66
- html +=
67
- content.title && content.author && ((_a = content.author) === null || _a === void 0 ? void 0 : _a.length)
68
- ? `<p class='epub-author'>${entities.encodeXML(content.author.join(', '))}</p>`
69
- : '';
70
- html +=
71
- content.title && content.url
72
- ? `<p class="epub-link"><a href="${content.url}">${content.url}</a></p>`
73
- : '';
74
- html += `${content.data}`;
75
- html += '\n</body>\n</html>';
76
- fs.ensureDirSync(path.dirname(content.filePath));
77
- fs.writeFileSync(content.filePath, html, 'utf-8');
78
- if (Array.isArray(content.children)) {
79
- content.children.map(saveContentToFile);
80
- }
81
- };
82
- epubData.content.map(saveContentToFile);
83
- // write meta-inf/container.xml
84
- let metainf_dir = path.join(epubData.dir, 'META-INF');
85
- fs.ensureDirSync(metainf_dir);
86
- fs.writeFileSync(path.join(metainf_dir, 'container.xml'), `<?xml version="1.0" encoding="UTF-8" ?>
87
- <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
88
- <rootfiles><rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml"/></rootfiles>
89
- </container>`, 'utf-8');
90
- if (epubData.version === 2) {
91
- let fn = path.join(metainf_dir, 'com.apple.ibooks.display-options.xml');
92
- fs.writeFileSync(fn, `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
93
- <display_options>
94
- <platform name="*">
95
- <option name="specified-fonts">true</option>
96
- </platform>
97
- </display_options>
98
- `, 'utf-8');
99
- }
100
- let opfPath = epubData.customOpfTemplatePath ||
101
- path.join(templates_dir, `epub${epubData.version}`, 'content.opf.ejs');
102
- if (!fs.existsSync(opfPath)) {
103
- throw new Error('Custom file to OPF template not found.');
104
- }
105
- let ncxTocPath = epubData.customNcxTocTemplatePath || path.join(templates_dir, `toc.ncx.ejs`);
106
- if (!fs.existsSync(ncxTocPath)) {
107
- throw new Error('Custom file the NCX toc template not found.');
108
- }
109
- let htmlTocPath = epubData.customHtmlTocTemplatePath ||
110
- path.join(templates_dir, `epub${epubData.version}`, 'toc.xhtml.ejs');
111
- if (!fs.existsSync(htmlTocPath)) {
112
- throw new Error('Custom file to HTML toc template not found.');
113
- }
114
- let toc_depth = 1;
115
- fs.writeFileSync(path.join(oebps_dir, 'content.opf'), yield ejs.renderFile(opfPath, epubData), 'utf-8');
116
- fs.writeFileSync(path.join(oebps_dir, 'toc.ncx'), yield ejs.renderFile(ncxTocPath, Object.assign(Object.assign({}, epubData), { toc_depth })), 'utf-8');
117
- // 说明:toc.xhtml 的内容在 macOS 自带的 Books 会被当作目录显示,如果空格太多,目录显示可能会不正常,因此这儿简单去掉了不必要的空格
118
- fs.writeFileSync(path.join(oebps_dir, 'toc.xhtml'), (0, utils_1.simpleMinifier)(yield ejs.renderFile(htmlTocPath, epubData)), 'utf-8');
119
- });
120
- exports.generateTempFile = generateTempFile;
121
- //# sourceMappingURL=generateTempFile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generateTempFile.js","sourceRoot":"","sources":["../src/generateTempFile.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,63 +0,0 @@
1
- "use strict";
2
- /**
3
- * makeCover
4
- * @author: oldj
5
- * @homepage: https://oldj.net
6
- */
7
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
- return new (P || (P = Promise))(function (resolve, reject) {
10
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
- step((generator = generator.apply(thisArg, _arguments || [])).next());
14
- });
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- const fs = require("fs-extra");
18
- const path = require("path");
19
- const request = require("superagent");
20
- const utils_1 = require("./utils");
21
- function makeCover(data) {
22
- return __awaiter(this, void 0, void 0, function* () {
23
- let { cover, _coverExtension, log } = data;
24
- if (!cover)
25
- return;
26
- let destPath = path.join(data.dir, 'OEBPS', `cover.${_coverExtension}`);
27
- let writeStream = null;
28
- if (cover.startsWith('http')) {
29
- writeStream = request.get(cover).set({ 'User-Agent': utils_1.USER_AGENT });
30
- writeStream.pipe(fs.createWriteStream(destPath));
31
- }
32
- else {
33
- if (!fs.existsSync(cover))
34
- return;
35
- log('local cover image: ' + cover);
36
- writeStream = fs.createReadStream(cover);
37
- writeStream.pipe(fs.createWriteStream(destPath));
38
- }
39
- return new Promise((resolve) => {
40
- writeStream.on('end', () => {
41
- log('[Success] cover image saved.');
42
- resolve();
43
- });
44
- writeStream.on('error', (e) => {
45
- log('[Error] cover image error: ' + e.message);
46
- log('destPath: ' + destPath);
47
- if (fs.existsSync(destPath)) {
48
- try {
49
- fs.unlinkSync(destPath);
50
- log('destPath removed.');
51
- }
52
- catch (e) {
53
- log('[Error] remove cover image error: ' + e.message);
54
- }
55
- }
56
- resolve(e);
57
- // throw new Error('[Fail] cover image save fail!')
58
- });
59
- });
60
- });
61
- }
62
- exports.default = makeCover;
63
- //# sourceMappingURL=makeCover.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"makeCover.js","sourceRoot":"","sources":["../src/makeCover.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;AAEH,+BAA8B;AAC9B,6BAA4B;AAC5B,sCAAqC;AAErC,mCAAoC;AAEpC,SAA8B,SAAS,CAAC,IAAe;;QACrD,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;QAC1C,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC,CAAA;QACvE,IAAI,WAAW,GAAQ,IAAI,CAAA;QAE3B,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YAC5B,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,kBAAU,EAAE,CAAC,CAAA;YAClE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAA;SACjD;aAAM;YACL,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,OAAM;YACjC,GAAG,CAAC,qBAAqB,GAAG,KAAK,CAAC,CAAA;YAElC,WAAW,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;YACxC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAA;SACjD;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACzB,GAAG,CAAC,8BAA8B,CAAC,CAAA;gBACnC,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;YAEF,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAM,EAAE,EAAE;gBACjC,GAAG,CAAC,6BAA6B,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;gBAC9C,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC,CAAA;gBAC5B,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;oBAC3B,IAAI;wBACF,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;wBACvB,GAAG,CAAC,mBAAmB,CAAC,CAAA;qBACzB;oBAAC,OAAO,CAAC,EAAE;wBACV,GAAG,CAAC,oCAAoC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;qBACtD;iBACF;gBACD,OAAO,CAAC,CAAC,CAAC,CAAA;gBACV,mDAAmD;YACrD,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;CAAA;AAvCD,4BAuCC"}