website-scrap-engine 0.7.1 → 0.8.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.
- package/lib/downloader/adjust-concurrency.d.ts +2 -1
- package/lib/downloader/adjust-concurrency.d.ts.map +1 -0
- package/lib/downloader/adjust-concurrency.js +4 -8
- package/lib/downloader/adjust-concurrency.js.map +1 -1
- package/lib/downloader/index.d.ts +9 -8
- package/lib/downloader/index.d.ts.map +1 -0
- package/lib/downloader/index.js +8 -40
- package/lib/downloader/index.js.map +1 -1
- package/lib/downloader/main.d.ts +15 -6
- package/lib/downloader/main.d.ts.map +1 -0
- package/lib/downloader/main.js +49 -32
- package/lib/downloader/main.js.map +1 -1
- package/lib/downloader/multi.d.ts +7 -5
- package/lib/downloader/multi.d.ts.map +1 -0
- package/lib/downloader/multi.js +10 -17
- package/lib/downloader/multi.js.map +1 -1
- package/lib/downloader/pipeline-executor-impl.d.ts +8 -7
- package/lib/downloader/pipeline-executor-impl.d.ts.map +1 -0
- package/lib/downloader/pipeline-executor-impl.js +1 -5
- package/lib/downloader/pipeline-executor-impl.js.map +1 -1
- package/lib/downloader/single.d.ts +4 -3
- package/lib/downloader/single.d.ts.map +1 -0
- package/lib/downloader/single.js +7 -11
- package/lib/downloader/single.js.map +1 -1
- package/lib/downloader/types.d.ts +4 -4
- package/lib/downloader/types.d.ts.map +1 -0
- package/lib/downloader/types.js +2 -5
- package/lib/downloader/types.js.map +1 -1
- package/lib/downloader/worker-pool.d.ts +6 -7
- package/lib/downloader/worker-pool.d.ts.map +1 -0
- package/lib/downloader/worker-pool.js +7 -35
- package/lib/downloader/worker-pool.js.map +1 -1
- package/lib/downloader/worker-type.d.ts +4 -3
- package/lib/downloader/worker-type.d.ts.map +1 -0
- package/lib/downloader/worker-type.js +1 -2
- package/lib/downloader/worker.d.ts +1 -0
- package/lib/downloader/worker.d.ts.map +1 -0
- package/lib/downloader/worker.js +52 -27
- package/lib/downloader/worker.js.map +1 -1
- package/lib/index.d.ts +9 -8
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +7 -33
- package/lib/index.js.map +1 -1
- package/lib/io.d.ts +2 -1
- package/lib/io.d.ts.map +1 -0
- package/lib/io.js +17 -25
- package/lib/io.js.map +1 -1
- package/lib/life-cycle/adapters.d.ts +7 -5
- package/lib/life-cycle/adapters.d.ts.map +1 -0
- package/lib/life-cycle/adapters.js +18 -30
- package/lib/life-cycle/adapters.js.map +1 -1
- package/lib/life-cycle/default-life-cycle.d.ts +2 -1
- package/lib/life-cycle/default-life-cycle.d.ts.map +1 -0
- package/lib/life-cycle/default-life-cycle.js +28 -32
- package/lib/life-cycle/default-life-cycle.js.map +1 -1
- package/lib/life-cycle/detect-resource-type.d.ts +2 -1
- package/lib/life-cycle/detect-resource-type.d.ts.map +1 -0
- package/lib/life-cycle/detect-resource-type.js +12 -17
- package/lib/life-cycle/detect-resource-type.js.map +1 -1
- package/lib/life-cycle/download-resource.d.ts +6 -7
- package/lib/life-cycle/download-resource.d.ts.map +1 -0
- package/lib/life-cycle/download-resource.js +23 -52
- package/lib/life-cycle/download-resource.js.map +1 -1
- package/lib/life-cycle/download-streaming-resource.d.ts +6 -5
- package/lib/life-cycle/download-streaming-resource.d.ts.map +1 -0
- package/lib/life-cycle/download-streaming-resource.js +39 -74
- package/lib/life-cycle/download-streaming-resource.js.map +1 -1
- package/lib/life-cycle/index.d.ts +16 -15
- package/lib/life-cycle/index.d.ts.map +1 -0
- package/lib/life-cycle/index.js +14 -59
- package/lib/life-cycle/index.js.map +1 -1
- package/lib/life-cycle/pipeline-executor.d.ts +7 -6
- package/lib/life-cycle/pipeline-executor.d.ts.map +1 -0
- package/lib/life-cycle/pipeline-executor.js +1 -2
- package/lib/life-cycle/process-css.d.ts +5 -4
- package/lib/life-cycle/process-css.d.ts.map +1 -0
- package/lib/life-cycle/process-css.js +10 -18
- package/lib/life-cycle/process-css.js.map +1 -1
- package/lib/life-cycle/process-html-meta.d.ts +4 -3
- package/lib/life-cycle/process-html-meta.d.ts.map +1 -0
- package/lib/life-cycle/process-html-meta.js +11 -15
- package/lib/life-cycle/process-html-meta.js.map +1 -1
- package/lib/life-cycle/process-html.d.ts +4 -3
- package/lib/life-cycle/process-html.d.ts.map +1 -0
- package/lib/life-cycle/process-html.js +27 -31
- package/lib/life-cycle/process-html.js.map +1 -1
- package/lib/life-cycle/process-site-map.d.ts +4 -3
- package/lib/life-cycle/process-site-map.d.ts.map +1 -0
- package/lib/life-cycle/process-site-map.js +7 -11
- package/lib/life-cycle/process-site-map.js.map +1 -1
- package/lib/life-cycle/process-source-map.d.ts +4 -4
- package/lib/life-cycle/process-source-map.d.ts.map +1 -0
- package/lib/life-cycle/process-source-map.js +16 -21
- package/lib/life-cycle/process-source-map.js.map +1 -1
- package/lib/life-cycle/process-svg.d.ts +4 -3
- package/lib/life-cycle/process-svg.d.ts.map +1 -0
- package/lib/life-cycle/process-svg.js +17 -21
- package/lib/life-cycle/process-svg.js.map +1 -1
- package/lib/life-cycle/read-or-copy-local-resource.d.ts +4 -3
- package/lib/life-cycle/read-or-copy-local-resource.d.ts.map +1 -0
- package/lib/life-cycle/read-or-copy-local-resource.js +15 -42
- package/lib/life-cycle/read-or-copy-local-resource.js.map +1 -1
- package/lib/life-cycle/save-html-to-disk.d.ts +6 -4
- package/lib/life-cycle/save-html-to-disk.d.ts.map +1 -0
- package/lib/life-cycle/save-html-to-disk.js +24 -33
- package/lib/life-cycle/save-html-to-disk.js.map +1 -1
- package/lib/life-cycle/save-resource-to-disk.d.ts +4 -3
- package/lib/life-cycle/save-resource-to-disk.d.ts.map +1 -0
- package/lib/life-cycle/save-resource-to-disk.js +10 -17
- package/lib/life-cycle/save-resource-to-disk.js.map +1 -1
- package/lib/life-cycle/skip-links.d.ts +1 -0
- package/lib/life-cycle/skip-links.d.ts.map +1 -0
- package/lib/life-cycle/skip-links.js +6 -10
- package/lib/life-cycle/skip-links.js.map +1 -1
- package/lib/life-cycle/types.d.ts +8 -7
- package/lib/life-cycle/types.d.ts.map +1 -0
- package/lib/life-cycle/types.js +1 -2
- package/lib/logger/config-logger.d.ts +2 -1
- package/lib/logger/config-logger.d.ts.map +1 -0
- package/lib/logger/config-logger.js +4 -30
- package/lib/logger/config-logger.js.map +1 -1
- package/lib/logger/logger-worker.d.ts +3 -2
- package/lib/logger/logger-worker.d.ts.map +1 -0
- package/lib/logger/logger-worker.js +11 -13
- package/lib/logger/logger-worker.js.map +1 -1
- package/lib/logger/logger.d.ts +2 -1
- package/lib/logger/logger.d.ts.map +1 -0
- package/lib/logger/logger.js +15 -17
- package/lib/logger/logger.js.map +1 -1
- package/lib/options.d.ts +8 -8
- package/lib/options.d.ts.map +1 -0
- package/lib/options.js +22 -32
- package/lib/options.js.map +1 -1
- package/lib/resource.d.ts +3 -4
- package/lib/resource.d.ts.map +1 -0
- package/lib/resource.js +34 -70
- package/lib/resource.js.map +1 -1
- package/lib/sources.d.ts +2 -1
- package/lib/sources.d.ts.map +1 -0
- package/lib/sources.js +9 -12
- package/lib/sources.js.map +1 -1
- package/lib/types.d.ts +1 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +1 -2
- package/lib/util.d.ts +4 -3
- package/lib/util.d.ts.map +1 -0
- package/lib/util.js +17 -34
- package/lib/util.js.map +1 -1
- package/package.json +19 -21
- package/src/downloader/adjust-concurrency.ts +2 -2
- package/src/downloader/index.ts +8 -8
- package/src/downloader/main.ts +50 -28
- package/src/downloader/multi.ts +11 -10
- package/src/downloader/pipeline-executor-impl.ts +7 -7
- package/src/downloader/single.ts +9 -6
- package/src/downloader/types.ts +3 -3
- package/src/downloader/worker-pool.ts +9 -9
- package/src/downloader/worker-type.ts +3 -3
- package/src/downloader/worker.ts +51 -29
- package/src/index.ts +8 -8
- package/src/io.ts +6 -6
- package/src/life-cycle/adapters.ts +7 -6
- package/src/life-cycle/css-url-parser.d.ts +1 -1
- package/src/life-cycle/default-life-cycle.ts +15 -15
- package/src/life-cycle/detect-resource-type.ts +2 -2
- package/src/life-cycle/download-resource.ts +18 -20
- package/src/life-cycle/download-streaming-resource.ts +20 -18
- package/src/life-cycle/index.ts +15 -15
- package/src/life-cycle/pipeline-executor.ts +6 -6
- package/src/life-cycle/process-css.ts +6 -5
- package/src/life-cycle/process-html-meta.ts +7 -6
- package/src/life-cycle/process-html.ts +21 -13
- package/src/life-cycle/process-site-map.ts +7 -6
- package/src/life-cycle/process-source-map.ts +5 -4
- package/src/life-cycle/process-svg.ts +10 -9
- package/src/life-cycle/read-or-copy-local-resource.ts +9 -7
- package/src/life-cycle/save-html-to-disk.ts +9 -13
- package/src/life-cycle/save-resource-to-disk.ts +6 -6
- package/src/life-cycle/types.ts +7 -7
- package/src/logger/config-logger.ts +5 -3
- package/src/logger/logger-worker.ts +8 -4
- package/src/logger/logger.ts +6 -4
- package/src/options.ts +15 -19
- package/src/resource.ts +10 -5
- package/src/sources.ts +1 -1
- package/src/util.ts +6 -10
- package/tsconfig.json +6 -2
|
@@ -1,24 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const util_1 = require("../util");
|
|
7
|
-
const skipProcess = (fn) => (url, element, parent) => fn(url, element, parent) ? undefined : url;
|
|
8
|
-
exports.skipProcess = skipProcess;
|
|
9
|
-
const dropResource = (fn) => res => {
|
|
1
|
+
import { load } from 'cheerio';
|
|
2
|
+
import { ResourceType } from '../resource.js';
|
|
3
|
+
import { toString } from '../util.js';
|
|
4
|
+
export const skipProcess = (fn) => (url, element, parent) => fn(url, element, parent) ? undefined : url;
|
|
5
|
+
export const dropResource = (fn) => res => {
|
|
10
6
|
if (fn(res)) {
|
|
11
7
|
res.shouldBeDiscardedFromDownload = true;
|
|
12
8
|
}
|
|
13
9
|
return res;
|
|
14
10
|
};
|
|
15
|
-
|
|
16
|
-
const preProcess = (fn) => (res, element, parent) => {
|
|
11
|
+
export const preProcess = (fn) => (res, element, parent) => {
|
|
17
12
|
fn(res.url, element, res, parent);
|
|
18
13
|
return res;
|
|
19
14
|
};
|
|
20
|
-
|
|
21
|
-
const requestRedirect = (fn) => res => {
|
|
15
|
+
export const requestRedirect = (fn) => res => {
|
|
22
16
|
if (res.downloadLink) {
|
|
23
17
|
const downloadLink = fn(res.downloadLink, res) || undefined;
|
|
24
18
|
if (!downloadLink) {
|
|
@@ -28,15 +22,13 @@ const requestRedirect = (fn) => res => {
|
|
|
28
22
|
}
|
|
29
23
|
return res;
|
|
30
24
|
};
|
|
31
|
-
|
|
32
|
-
const redirectFilter = (fn) => res => {
|
|
25
|
+
export const redirectFilter = (fn) => res => {
|
|
33
26
|
if (res.redirectedUrl) {
|
|
34
27
|
res.redirectedUrl = fn(res.redirectedUrl, res) || undefined;
|
|
35
28
|
}
|
|
36
29
|
return res;
|
|
37
30
|
};
|
|
38
|
-
|
|
39
|
-
async function processRedirectedUrl(res, submit, options, pipeline) {
|
|
31
|
+
export async function processRedirectedUrl(res, submit, options, pipeline) {
|
|
40
32
|
if (res.redirectedUrl && res.redirectedUrl !== res.url) {
|
|
41
33
|
const redirectedRes = await pipeline.createAndProcessResource(res.redirectedUrl, res.type, res.depth, null, res);
|
|
42
34
|
if (redirectedRes) {
|
|
@@ -50,33 +42,29 @@ async function processRedirectedUrl(res, submit, options, pipeline) {
|
|
|
50
42
|
}
|
|
51
43
|
return res;
|
|
52
44
|
}
|
|
53
|
-
|
|
54
|
-
const parseHtml = (res, options) => {
|
|
45
|
+
export const parseHtml = (res, options) => {
|
|
55
46
|
const encoding = res.encoding || options.encoding[res.type] || 'utf8';
|
|
56
47
|
if (options.cheerioParse) {
|
|
57
|
-
return
|
|
48
|
+
return load(toString(res.body, encoding), options.cheerioParse);
|
|
58
49
|
}
|
|
59
|
-
return
|
|
50
|
+
return load(toString(res.body, encoding));
|
|
60
51
|
};
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (res.type === resource_1.ResourceType.Html) {
|
|
52
|
+
export const processHtml = (fn) => (res, submit, options) => {
|
|
53
|
+
if (res.type === ResourceType.Html) {
|
|
64
54
|
if (!res.meta.doc) {
|
|
65
|
-
res.meta.doc =
|
|
55
|
+
res.meta.doc = parseHtml(res, options);
|
|
66
56
|
}
|
|
67
57
|
res.meta.doc = fn(res.meta.doc, res);
|
|
68
58
|
}
|
|
69
59
|
return res;
|
|
70
60
|
};
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (res.type === resource_1.ResourceType.Html) {
|
|
61
|
+
export const processHtmlAsync = (fn) => async (res, submit, options) => {
|
|
62
|
+
if (res.type === ResourceType.Html) {
|
|
74
63
|
if (!res.meta.doc) {
|
|
75
|
-
res.meta.doc =
|
|
64
|
+
res.meta.doc = parseHtml(res, options);
|
|
76
65
|
}
|
|
77
66
|
res.meta.doc = await fn(res.meta.doc, res);
|
|
78
67
|
}
|
|
79
68
|
return res;
|
|
80
69
|
};
|
|
81
|
-
exports.processHtmlAsync = processHtmlAsync;
|
|
82
70
|
//# sourceMappingURL=adapters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/life-cycle/adapters.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/life-cycle/adapters.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { ProcessingLifeCycle } from './types';
|
|
1
|
+
import type { ProcessingLifeCycle } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Get a copy of default life cycle
|
|
4
4
|
*/
|
|
5
5
|
export declare const defaultLifeCycle: () => ProcessingLifeCycle;
|
|
6
|
+
//# sourceMappingURL=default-life-cycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-life-cycle.d.ts","sourceRoot":"","sources":["../../src/life-cycle/default-life-cycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,YAAY,CAAC;AAgBpD;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAO,mBAqBlC,CAAC"}
|
|
@@ -1,44 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const adapters_1 = require("./adapters");
|
|
16
|
-
const download_streaming_resource_1 = require("./download-streaming-resource");
|
|
17
|
-
const read_or_copy_local_resource_1 = require("./read-or-copy-local-resource");
|
|
1
|
+
import { skipLinks } from './skip-links.js';
|
|
2
|
+
import { detectResourceType } from './detect-resource-type.js';
|
|
3
|
+
import { createResource } from '../resource.js';
|
|
4
|
+
import { downloadResource } from './download-resource.js';
|
|
5
|
+
import { processHtml } from './process-html.js';
|
|
6
|
+
import { processHtmlMetaRefresh } from './process-html-meta.js';
|
|
7
|
+
import { processCss } from './process-css.js';
|
|
8
|
+
import { processSiteMap } from './process-site-map.js';
|
|
9
|
+
import { processSvg } from './process-svg.js';
|
|
10
|
+
import { saveHtmlToDisk } from './save-html-to-disk.js';
|
|
11
|
+
import { saveResourceToDisk } from './save-resource-to-disk.js';
|
|
12
|
+
import { processRedirectedUrl } from './adapters.js';
|
|
13
|
+
import { downloadStreamingResource } from './download-streaming-resource.js';
|
|
14
|
+
import { readOrCopyLocalResource } from './read-or-copy-local-resource.js';
|
|
18
15
|
/**
|
|
19
16
|
* Get a copy of default life cycle
|
|
20
17
|
*/
|
|
21
|
-
const defaultLifeCycle = () => ({
|
|
18
|
+
export const defaultLifeCycle = () => ({
|
|
22
19
|
init: [],
|
|
23
|
-
linkRedirect: [
|
|
24
|
-
detectResourceType: [
|
|
25
|
-
createResource
|
|
20
|
+
linkRedirect: [skipLinks],
|
|
21
|
+
detectResourceType: [detectResourceType],
|
|
22
|
+
createResource,
|
|
26
23
|
processBeforeDownload: [],
|
|
27
24
|
download: [
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
downloadResource,
|
|
26
|
+
downloadStreamingResource,
|
|
27
|
+
readOrCopyLocalResource
|
|
31
28
|
],
|
|
32
29
|
processAfterDownload: [
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
processRedirectedUrl,
|
|
31
|
+
processHtml,
|
|
32
|
+
processHtmlMetaRefresh,
|
|
33
|
+
processSvg,
|
|
34
|
+
processCss,
|
|
35
|
+
processSiteMap
|
|
39
36
|
],
|
|
40
|
-
saveToDisk: [
|
|
37
|
+
saveToDisk: [saveHtmlToDisk, saveResourceToDisk],
|
|
41
38
|
dispose: []
|
|
42
39
|
});
|
|
43
|
-
exports.defaultLifeCycle = defaultLifeCycle;
|
|
44
40
|
//# sourceMappingURL=default-life-cycle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-life-cycle.js","sourceRoot":"","sources":["../../src/life-cycle/default-life-cycle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"default-life-cycle.js","sourceRoot":"","sources":["../../src/life-cycle/default-life-cycle.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAC,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAC,cAAc,EAAC,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAC,sBAAsB,EAAC,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAC,cAAc,EAAC,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAC,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,yBAAyB,EAAC,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAC,uBAAuB,EAAC,MAAM,kCAAkC,CAAC;AAEzE;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAwB,EAAE,CAAC,CAAC;IAC1D,IAAI,EAAE,EAAE;IACR,YAAY,EAAE,CAAC,SAAS,CAAC;IACzB,kBAAkB,EAAE,CAAC,kBAAkB,CAAC;IACxC,cAAc;IACd,qBAAqB,EAAE,EAAE;IACzB,QAAQ,EAAE;QACR,gBAAgB;QAChB,yBAAyB;QACzB,uBAAuB;KACxB;IACD,oBAAoB,EAAE;QACpB,oBAAoB;QACpB,WAAW;QACX,sBAAsB;QACtB,UAAU;QACV,UAAU;QACV,cAAc;KACf;IACD,UAAU,EAAE,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAChD,OAAO,EAAE,EAAE;CACZ,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ResourceType } from '../resource';
|
|
1
|
+
import { ResourceType } from '../resource.js';
|
|
2
2
|
export declare const binaryExtension: Record<string | number, number>;
|
|
3
3
|
/**
|
|
4
4
|
* Return the extension of the path or the url,
|
|
@@ -11,3 +11,4 @@ export declare const binaryExtension: Record<string | number, number>;
|
|
|
11
11
|
*/
|
|
12
12
|
export declare function lowerCaseExtension(url: string): string | void;
|
|
13
13
|
export declare function detectResourceType(url: string, type: ResourceType): ResourceType;
|
|
14
|
+
//# sourceMappingURL=detect-resource-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-resource-type.d.ts","sourceRoot":"","sources":["../../src/life-cycle/detect-resource-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAI5C,eAAO,MAAM,eAAe,iCAepB,CAAC;AAET;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB7D;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,YAAY,GACjB,YAAY,CAiBd"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.detectResourceType = exports.lowerCaseExtension = exports.binaryExtension = void 0;
|
|
4
|
-
const resource_1 = require("../resource");
|
|
5
|
-
const util_1 = require("../util");
|
|
1
|
+
import { ResourceType } from '../resource.js';
|
|
2
|
+
import { arrayToMap, isSiteMap } from '../util.js';
|
|
6
3
|
// immutable
|
|
7
|
-
|
|
4
|
+
export const binaryExtension = arrayToMap([
|
|
8
5
|
'gif', 'jpg', 'jpeg', 'png',
|
|
9
6
|
'js', 'jsm', 'json', 'txt',
|
|
10
7
|
'woff2', 'ttf', 'ttc',
|
|
@@ -29,7 +26,7 @@ exports.binaryExtension = (0, util_1.arrayToMap)([
|
|
|
29
26
|
* @see path.extname
|
|
30
27
|
* @param url the url to evaluate.
|
|
31
28
|
*/
|
|
32
|
-
function lowerCaseExtension(url) {
|
|
29
|
+
export function lowerCaseExtension(url) {
|
|
33
30
|
const hashIndex = url.lastIndexOf('#');
|
|
34
31
|
const searchIndex = hashIndex === -1 ?
|
|
35
32
|
url.lastIndexOf('?') :
|
|
@@ -49,26 +46,24 @@ function lowerCaseExtension(url) {
|
|
|
49
46
|
url.slice(lastIndex + 1, endIndex).toLowerCase();
|
|
50
47
|
}
|
|
51
48
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return resource_1.ResourceType.SiteMap;
|
|
49
|
+
export function detectResourceType(url, type) {
|
|
50
|
+
if (isSiteMap(url)) {
|
|
51
|
+
return ResourceType.SiteMap;
|
|
56
52
|
}
|
|
57
|
-
if (type ===
|
|
53
|
+
if (type === ResourceType.Html) {
|
|
58
54
|
const extension = lowerCaseExtension(url);
|
|
59
55
|
if (extension) {
|
|
60
|
-
if (
|
|
61
|
-
return
|
|
56
|
+
if (binaryExtension[extension]) {
|
|
57
|
+
return ResourceType.Binary;
|
|
62
58
|
}
|
|
63
59
|
else if ('css' === extension) {
|
|
64
|
-
return
|
|
60
|
+
return ResourceType.Css;
|
|
65
61
|
}
|
|
66
62
|
else if ('svg' === extension) {
|
|
67
|
-
return
|
|
63
|
+
return ResourceType.Svg;
|
|
68
64
|
}
|
|
69
65
|
}
|
|
70
66
|
}
|
|
71
67
|
return type;
|
|
72
68
|
}
|
|
73
|
-
exports.detectResourceType = detectResourceType;
|
|
74
69
|
//# sourceMappingURL=detect-resource-type.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-resource-type.js","sourceRoot":"","sources":["../../src/life-cycle/detect-resource-type.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"detect-resource-type.js","sourceRoot":"","sources":["../../src/life-cycle/detect-resource-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,UAAU,EAAE,SAAS,EAAC,MAAM,YAAY,CAAC;AAEjD,YAAY;AACZ,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;IACxC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;IAC3B,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;IAC1B,OAAO,EAAE,KAAK,EAAE,KAAK;IACrB,KAAK;IACL,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IACnD,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IAClC,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,EAAE,IAAI,CAAC,CAAC;AAET;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,SAAS,GAAW,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAW,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAW,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,SAAS,CAAC,CAAC;QACX,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACpE,MAAM,OAAO,GAAW,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC;QACvC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,MAAM,SAAS,GAAW,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,OAAO,EAAE,CAAC;QAC5C,OAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACxC,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,IAAkB;IAElB,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B,CAAC;IACD,IAAI,IAAI,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAkB,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,OAAO,YAAY,CAAC,MAAM,CAAC;YAC7B,CAAC;iBAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,YAAY,CAAC,GAAG,CAAC;YAC1B,CAAC;iBAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,YAAY,CAAC,GAAG,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import { Resource } from '../resource';
|
|
6
|
-
import type { StaticDownloadOptions } from '../options';
|
|
1
|
+
import type { BeforeRetryHook, OptionsInit, Response } from 'got';
|
|
2
|
+
import type { DownloadResource, RequestOptions } from './types.js';
|
|
3
|
+
import type { Resource } from '../resource.js';
|
|
4
|
+
import type { StaticDownloadOptions } from '../options.js';
|
|
7
5
|
/** Take logs before retry */
|
|
8
6
|
export declare const beforeRetryHook: BeforeRetryHook;
|
|
9
7
|
export interface DownloadError extends Partial<Error> {
|
|
@@ -18,8 +16,9 @@ export interface DownloadError extends Partial<Error> {
|
|
|
18
16
|
* @param url
|
|
19
17
|
* @param options
|
|
20
18
|
*/
|
|
21
|
-
export declare function getRetry(url: string, options:
|
|
19
|
+
export declare function getRetry(url: string, options: OptionsInit): Promise<Response<Buffer | string> | void>;
|
|
22
20
|
export declare function requestForResource(res: Resource & {
|
|
23
21
|
downloadStartTimestamp: number;
|
|
24
22
|
}, requestOptions: RequestOptions, options?: StaticDownloadOptions): Promise<DownloadResource | Resource | void>;
|
|
25
23
|
export declare function downloadResource(res: Resource, requestOptions: RequestOptions, options: StaticDownloadOptions): Promise<DownloadResource | Resource | void>;
|
|
24
|
+
//# sourceMappingURL=download-resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-resource.d.ts","sourceRoot":"","sources":["../../src/life-cycle/download-resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,eAAe,EAAE,WAAW,EAAgB,QAAQ,EAAC,MAAM,KAAK,CAAC;AAE9E,OAAO,KAAK,EAAC,gBAAgB,EAAE,cAAc,EAAC,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,eAAe,CAAC;AAKzD,6BAA6B;AAC7B,eAAO,MAAM,eAAe,EAAE,eAqB7B,CAAC;AAEF,MAAM,WAAW,aAAc,SAAQ,OAAO,CAAC,KAAK,CAAC;IACnD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CA4C3C;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,QAAQ,GAAG;IAAE,sBAAsB,EAAE,MAAM,CAAA;CAAE,EAClD,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,gBAAgB,GAAG,QAAQ,GAAG,IAAI,CAAC,CAyC7C;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,QAAQ,EACb,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,gBAAgB,GAAG,QAAQ,GAAG,IAAI,CAAC,CAyC7C"}
|
|
@@ -1,45 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.downloadResource = exports.requestForResource = exports.getRetry = exports.beforeRetryHook = void 0;
|
|
30
|
-
const got_1 = __importStar(require("got"));
|
|
31
|
-
const resource_1 = require("../resource");
|
|
32
|
-
const logger = __importStar(require("../logger/logger"));
|
|
33
|
-
const util_1 = require("../util");
|
|
34
|
-
const urijs_1 = __importDefault(require("urijs"));
|
|
1
|
+
import got, { TimeoutError } from 'got';
|
|
2
|
+
import { generateSavePath, ResourceType } from '../resource.js';
|
|
3
|
+
import * as logger from '../logger/logger.js';
|
|
4
|
+
import { isUrlHttp, sleep } from '../util.js';
|
|
5
|
+
import URI from 'urijs';
|
|
35
6
|
/** Take logs before retry */
|
|
36
|
-
const beforeRetryHook = (
|
|
7
|
+
export const beforeRetryHook = (error, retryCount) => {
|
|
8
|
+
const options = error.options;
|
|
9
|
+
if (!options) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
37
12
|
if (!error) {
|
|
38
13
|
logger.retry.warn(retryCount, String(options.url));
|
|
39
14
|
return;
|
|
40
15
|
}
|
|
41
16
|
const url = String(error.options.url);
|
|
42
|
-
if (error instanceof
|
|
17
|
+
if (error instanceof TimeoutError || error.name === 'TimeoutError') {
|
|
43
18
|
(retryCount && retryCount > 1 ? logger.retry.warn : logger.retry.info)
|
|
44
19
|
.call(logger.retry, retryCount, url, error.name, error.code, error.message, error.event);
|
|
45
20
|
}
|
|
@@ -48,7 +23,6 @@ const beforeRetryHook = (options, error, retryCount) => {
|
|
|
48
23
|
.call(logger.retry, retryCount, url, error.name, error.code, error.message);
|
|
49
24
|
}
|
|
50
25
|
};
|
|
51
|
-
exports.beforeRetryHook = beforeRetryHook;
|
|
52
26
|
/**
|
|
53
27
|
* workaround for retry premature close on node 12
|
|
54
28
|
* retry on empty body
|
|
@@ -56,14 +30,14 @@ exports.beforeRetryHook = beforeRetryHook;
|
|
|
56
30
|
* @param url
|
|
57
31
|
* @param options
|
|
58
32
|
*/
|
|
59
|
-
async function getRetry(url, options) {
|
|
60
|
-
let res;
|
|
61
|
-
let err, optionsClone;
|
|
33
|
+
export async function getRetry(url, options) {
|
|
34
|
+
let res = void 0;
|
|
35
|
+
let err = void 0, optionsClone;
|
|
62
36
|
for (let i = 0; i < 25; i++) {
|
|
63
37
|
err = void 0;
|
|
64
38
|
try {
|
|
65
39
|
optionsClone = Object.assign({}, options);
|
|
66
|
-
res = (await (
|
|
40
|
+
res = (await got(url, optionsClone));
|
|
67
41
|
if (!res || !res.body || !res.body.length) {
|
|
68
42
|
logger.retry.warn(i, url, 'manually retry on empty response or body', res && res.body);
|
|
69
43
|
continue;
|
|
@@ -75,7 +49,7 @@ async function getRetry(url, options) {
|
|
|
75
49
|
err = e;
|
|
76
50
|
if (err && err.message === 'premature close') {
|
|
77
51
|
logger.retry.warn(i, url, 'manually retry on premature close', err.name, err.code, err.event, err.message);
|
|
78
|
-
await
|
|
52
|
+
await sleep(i * 200);
|
|
79
53
|
continue;
|
|
80
54
|
}
|
|
81
55
|
// these events might be accidentally unhandled
|
|
@@ -86,7 +60,7 @@ async function getRetry(url, options) {
|
|
|
86
60
|
// error.code === undefined
|
|
87
61
|
(err.code === 'ETIMEDOUT' || err.code === undefined)) {
|
|
88
62
|
logger.retry.warn(i, url, `manually retry on ${err.event} timeout`, err.name, err.code, err.message);
|
|
89
|
-
await
|
|
63
|
+
await sleep(i * 300);
|
|
90
64
|
continue;
|
|
91
65
|
}
|
|
92
66
|
throw e;
|
|
@@ -98,8 +72,7 @@ async function getRetry(url, options) {
|
|
|
98
72
|
}
|
|
99
73
|
return res;
|
|
100
74
|
}
|
|
101
|
-
|
|
102
|
-
async function requestForResource(res, requestOptions, options) {
|
|
75
|
+
export async function requestForResource(res, requestOptions, options) {
|
|
103
76
|
const downloadLink = encodeURI(decodeURI(res.downloadLink));
|
|
104
77
|
const reqOptions = Object.assign({}, requestOptions);
|
|
105
78
|
reqOptions.responseType = 'buffer';
|
|
@@ -128,20 +101,19 @@ async function requestForResource(res, requestOptions, options) {
|
|
|
128
101
|
// https://github.com/website-local/website-scrap-engine/issues/385
|
|
129
102
|
// 2011/11/15
|
|
130
103
|
if (res.redirectedUrl !== res.url) {
|
|
131
|
-
res.redirectedSavePath =
|
|
104
|
+
res.redirectedSavePath = generateSavePath(URI(res.redirectedUrl), res.type === ResourceType.Html, !(options === null || options === void 0 ? void 0 : options.deduplicateStripSearch), options === null || options === void 0 ? void 0 : options.localSrcRoot);
|
|
132
105
|
}
|
|
133
106
|
res.body = response.body;
|
|
134
107
|
return res;
|
|
135
108
|
}
|
|
136
|
-
|
|
137
|
-
async function downloadResource(res, requestOptions, options) {
|
|
109
|
+
export async function downloadResource(res, requestOptions, options) {
|
|
138
110
|
if (res.body) {
|
|
139
111
|
return res;
|
|
140
112
|
}
|
|
141
|
-
if (res.type ===
|
|
113
|
+
if (res.type === ResourceType.StreamingBinary) {
|
|
142
114
|
return res;
|
|
143
115
|
}
|
|
144
|
-
if (!
|
|
116
|
+
if (!isUrlHttp(res.downloadLink)) {
|
|
145
117
|
return res;
|
|
146
118
|
}
|
|
147
119
|
if (!res.downloadStartTimestamp) {
|
|
@@ -152,7 +124,7 @@ async function downloadResource(res, requestOptions, options) {
|
|
|
152
124
|
if (!downloadedResource || !downloadedResource.body) {
|
|
153
125
|
return downloadedResource;
|
|
154
126
|
}
|
|
155
|
-
if (downloadedResource.type ===
|
|
127
|
+
if (downloadedResource.type === ResourceType.Html) {
|
|
156
128
|
if (options.meta.detectIncompleteHtml &&
|
|
157
129
|
(typeof downloadedResource.body === 'string' ||
|
|
158
130
|
Buffer.isBuffer(downloadedResource.body))) {
|
|
@@ -173,5 +145,4 @@ async function downloadResource(res, requestOptions, options) {
|
|
|
173
145
|
}
|
|
174
146
|
return downloadedResource;
|
|
175
147
|
}
|
|
176
|
-
exports.downloadResource = downloadResource;
|
|
177
148
|
//# sourceMappingURL=download-resource.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download-resource.js","sourceRoot":"","sources":["../../src/life-cycle/download-resource.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"download-resource.js","sourceRoot":"","sources":["../../src/life-cycle/download-resource.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { Response } from 'got
|
|
2
|
-
import { Resource } from '../resource';
|
|
3
|
-
import type { AsyncResult, DownloadResource, DownloadResourceFunc, RequestOptions } from './types';
|
|
4
|
-
import type { StaticDownloadOptions } from '../options';
|
|
5
|
-
import type { PipelineExecutor } from './pipeline-executor';
|
|
1
|
+
import type { Response } from 'got';
|
|
2
|
+
import type { Resource } from '../resource.js';
|
|
3
|
+
import type { AsyncResult, DownloadResource, DownloadResourceFunc, RequestOptions } from './types.js';
|
|
4
|
+
import type { StaticDownloadOptions } from '../options.js';
|
|
5
|
+
import type { PipelineExecutor } from './pipeline-executor.js';
|
|
6
6
|
export declare function isBytesAccepted(acceptRange?: string): boolean;
|
|
7
7
|
export declare function isSameRangeStart(rangeStart: number, contentRange?: string): boolean;
|
|
8
8
|
export declare function streamingDownloadToFile(res: Resource & {
|
|
@@ -49,3 +49,4 @@ export interface StreamingDownloadErrorHook {
|
|
|
49
49
|
(e: Error | unknown, res: Resource, requestOptions: RequestOptions, options: StaticDownloadOptions, pipeline: PipelineExecutor): AsyncResult<void>;
|
|
50
50
|
}
|
|
51
51
|
export declare function downloadStreamingResourceWithHook(beforeDownload?: StreamingBeforeDownloadHook, afterDownload?: StreamingAfterDownloadHook, downloadError?: StreamingDownloadErrorHook): DownloadResourceFunc;
|
|
52
|
+
//# sourceMappingURL=download-streaming-resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-streaming-resource.d.ts","sourceRoot":"","sources":["../../src/life-cycle/download-streaming-resource.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAe,QAAQ,EAAC,MAAM,KAAK,CAAC;AAEhD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAK7D,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAW7D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAWnF;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,QAAQ,GAAG;IAAE,sBAAsB,EAAE,MAAM,CAAA;CAAE,EAClD,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAwK1B;AAED,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,GAC5C,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,QAAQ,EACb,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAAC,CAoB7C;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;;;;;;;OASG;IACH,CAAC,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,qBAAqB,EAC7E,QAAQ,EAAE,gBAAgB,GAAG,WAAW,CAAC,gBAAgB,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;OAQG;IACH,CAAC,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,qBAAqB,EAC7E,QAAQ,EAAE,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;;OASG;IACH,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EACjE,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,wBAAgB,iCAAiC,CAC/C,cAAc,CAAC,EAAE,2BAA2B,EAC5C,aAAa,CAAC,EAAE,0BAA0B,EAC1C,aAAa,CAAC,EAAE,0BAA0B,GACzC,oBAAoB,CAyDtB"}
|