esa-pcg-cli 0.1.2 → 0.1.4
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/README.md +10 -24
- package/dist/_inline-overrides.js +2 -2
- package/dist/_protocol/types.d.ts +3 -0
- package/dist/_protocol/types.js +1 -1
- package/dist/adapters/wrappers/node-server.js +6 -2
- package/dist/commands/build.js +25 -1
- package/dist/overrides/tagCache/gateway.d.ts +3 -0
- package/dist/overrides/tagCache/gateway.js +31 -1
- package/dist/runtime/cdn-purge.d.ts +53 -0
- package/dist/runtime/cdn-purge.js +259 -0
- package/dist/runtime/edge-context.d.ts +26 -0
- package/dist/runtime/edge-context.js +77 -0
- package/dist/runtime/image-config.d.ts +45 -0
- package/dist/runtime/image-config.js +144 -0
- package/dist/runtime/image-proxy.js +15 -1
- package/package.json +1 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 解析 next.config.images 并校验 /_next/image 的 url 参数。
|
|
3
|
+
*
|
|
4
|
+
* 配置来源:OpenNext build 完成后会把解析后的完整 next.config 写到
|
|
5
|
+
* <server-bundle>/.next/required-server-files.json,images 字段就是 Next 自己
|
|
6
|
+
* 在运行时用的最终形态。直接读这个文件可以避开 next.config 的 TS/ESM/JS 三种
|
|
7
|
+
* 形态解析,也无需在 build 阶段做额外抽取。
|
|
8
|
+
*
|
|
9
|
+
* 匹配算法:复用 Next 自己的 match-remote-pattern 模块——picomatch 的 glob
|
|
10
|
+
* 语义边界(`**` 跨段、`*` 单段、`?`、`{a,b}`)自己重写很容易跟 next dev
|
|
11
|
+
* 行为漂移。Next 必然在 server bundle 的 node_modules 里,运行时 require 即可。
|
|
12
|
+
*
|
|
13
|
+
* 边界行为(已与上层对齐):
|
|
14
|
+
* - 校验失败 → 上层 400(对齐 Next 默认行为)
|
|
15
|
+
* - required-server-files.json 缺失 → warn + 放行(兼容老产物,不阻断部署)
|
|
16
|
+
* - images.unoptimized=true → 跳过校验、照常代发(用户关了 Next 优化但仍走
|
|
17
|
+
* wrapper,白名单职责让位给上游)
|
|
18
|
+
*/
|
|
19
|
+
interface RemotePattern {
|
|
20
|
+
protocol?: 'http' | 'https';
|
|
21
|
+
hostname: string;
|
|
22
|
+
port?: string;
|
|
23
|
+
pathname?: string;
|
|
24
|
+
search?: string;
|
|
25
|
+
}
|
|
26
|
+
declare type MatcherImpl = (domains: string[], remotePatterns: RemotePattern[], url: URL) => boolean;
|
|
27
|
+
export interface ValidateResult {
|
|
28
|
+
ok: boolean;
|
|
29
|
+
reason?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 校验 /_next/image 的 url 是否被允许。语义对齐 Next:
|
|
33
|
+
* - 同源(host header === url 的 host,含端口)始终放行
|
|
34
|
+
* - unoptimized:true 跳过校验
|
|
35
|
+
* - 否则必须命中 domains 或 remotePatterns 之一
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateImageUrl(absoluteUrl: URL, hostHeader: string): ValidateResult;
|
|
38
|
+
/** 测试用:重置缓存。生产代码不调用。 */
|
|
39
|
+
export declare function _resetImageConfigCacheForTests(): void;
|
|
40
|
+
/**
|
|
41
|
+
* 测试用:注入 matcher,绕过对真实 next 模块的 require。
|
|
42
|
+
* 传 null 模拟"matcher 不可用"分支。
|
|
43
|
+
*/
|
|
44
|
+
export declare function _setMatcherForTests(impl: MatcherImpl | null): void;
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 解析 next.config.images 并校验 /_next/image 的 url 参数。
|
|
4
|
+
*
|
|
5
|
+
* 配置来源:OpenNext build 完成后会把解析后的完整 next.config 写到
|
|
6
|
+
* <server-bundle>/.next/required-server-files.json,images 字段就是 Next 自己
|
|
7
|
+
* 在运行时用的最终形态。直接读这个文件可以避开 next.config 的 TS/ESM/JS 三种
|
|
8
|
+
* 形态解析,也无需在 build 阶段做额外抽取。
|
|
9
|
+
*
|
|
10
|
+
* 匹配算法:复用 Next 自己的 match-remote-pattern 模块——picomatch 的 glob
|
|
11
|
+
* 语义边界(`**` 跨段、`*` 单段、`?`、`{a,b}`)自己重写很容易跟 next dev
|
|
12
|
+
* 行为漂移。Next 必然在 server bundle 的 node_modules 里,运行时 require 即可。
|
|
13
|
+
*
|
|
14
|
+
* 边界行为(已与上层对齐):
|
|
15
|
+
* - 校验失败 → 上层 400(对齐 Next 默认行为)
|
|
16
|
+
* - required-server-files.json 缺失 → warn + 放行(兼容老产物,不阻断部署)
|
|
17
|
+
* - images.unoptimized=true → 跳过校验、照常代发(用户关了 Next 优化但仍走
|
|
18
|
+
* wrapper,白名单职责让位给上游)
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports._setMatcherForTests = exports._resetImageConfigCacheForTests = exports.validateImageUrl = void 0;
|
|
22
|
+
const fs = require("fs");
|
|
23
|
+
const path = require("path");
|
|
24
|
+
let cachedConfig;
|
|
25
|
+
let cachedMatcher;
|
|
26
|
+
let warnedMatcherMissing = false;
|
|
27
|
+
/**
|
|
28
|
+
* 路径解析与 node-server.ts 的 assets 解析同源:wrapper 启动时
|
|
29
|
+
* process.cwd() === server-functions/default/,所以 .next 就在 cwd 下。
|
|
30
|
+
*/
|
|
31
|
+
function configFilePath() {
|
|
32
|
+
return path.resolve(process.cwd(), '.next', 'required-server-files.json');
|
|
33
|
+
}
|
|
34
|
+
function loadImageConfig() {
|
|
35
|
+
var _a, _b, _c;
|
|
36
|
+
if (cachedConfig !== undefined)
|
|
37
|
+
return cachedConfig;
|
|
38
|
+
const filePath = configFilePath();
|
|
39
|
+
let raw;
|
|
40
|
+
try {
|
|
41
|
+
raw = fs.readFileSync(filePath, 'utf-8');
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
console.warn(`[image-config] required-server-files.json not found at ${filePath} — allowing all image URLs (${(_a = err.code) !== null && _a !== void 0 ? _a : err.message})`);
|
|
45
|
+
cachedConfig = { mode: 'config-missing' };
|
|
46
|
+
return cachedConfig;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const parsed = JSON.parse(raw);
|
|
50
|
+
const images = (_c = (_b = parsed === null || parsed === void 0 ? void 0 : parsed.config) === null || _b === void 0 ? void 0 : _b.images) !== null && _c !== void 0 ? _c : {};
|
|
51
|
+
cachedConfig = {
|
|
52
|
+
mode: 'loaded',
|
|
53
|
+
images: {
|
|
54
|
+
remotePatterns: Array.isArray(images.remotePatterns)
|
|
55
|
+
? images.remotePatterns
|
|
56
|
+
: [],
|
|
57
|
+
domains: Array.isArray(images.domains) ? images.domains : [],
|
|
58
|
+
unoptimized: images.unoptimized === true,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
return cachedConfig;
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.warn(`[image-config] failed to parse ${filePath}: ${err.message} — allowing all image URLs`);
|
|
65
|
+
cachedConfig = { mode: 'config-missing' };
|
|
66
|
+
return cachedConfig;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 拿 Next 自己的 hasRemoteMatch。失败一次后缓存 null,后续走严格 deny 分支。
|
|
71
|
+
* 用 eval('require') 让 esbuild 不去尝试解析 next 模块——wrapper bundle 由
|
|
72
|
+
* scripts/bundle-overrides.js 用 esbuild 打包,把 next 标了 external 是 belt-
|
|
73
|
+
* and-suspenders;eval 这一层确保即便 external 配错也打不进 bundle。
|
|
74
|
+
*/
|
|
75
|
+
function loadMatcher() {
|
|
76
|
+
if (cachedMatcher !== undefined)
|
|
77
|
+
return cachedMatcher;
|
|
78
|
+
try {
|
|
79
|
+
const dynamicRequire = eval('require');
|
|
80
|
+
const mod = dynamicRequire('next/dist/shared/lib/match-remote-pattern');
|
|
81
|
+
const hasRemoteMatch = mod === null || mod === void 0 ? void 0 : mod.hasRemoteMatch;
|
|
82
|
+
if (typeof hasRemoteMatch !== 'function') {
|
|
83
|
+
throw new Error('hasRemoteMatch not exported');
|
|
84
|
+
}
|
|
85
|
+
cachedMatcher = hasRemoteMatch;
|
|
86
|
+
return cachedMatcher;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (!warnedMatcherMissing) {
|
|
90
|
+
warnedMatcherMissing = true;
|
|
91
|
+
console.warn(`[image-config] cannot load next/dist/shared/lib/match-remote-pattern (${err.message}) — falling back to deny-external-only mode`);
|
|
92
|
+
}
|
|
93
|
+
cachedMatcher = null;
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 校验 /_next/image 的 url 是否被允许。语义对齐 Next:
|
|
99
|
+
* - 同源(host header === url 的 host,含端口)始终放行
|
|
100
|
+
* - unoptimized:true 跳过校验
|
|
101
|
+
* - 否则必须命中 domains 或 remotePatterns 之一
|
|
102
|
+
*/
|
|
103
|
+
function validateImageUrl(absoluteUrl, hostHeader) {
|
|
104
|
+
const cfg = loadImageConfig();
|
|
105
|
+
if (cfg.mode === 'config-missing') {
|
|
106
|
+
return { ok: true, reason: 'config-missing' };
|
|
107
|
+
}
|
|
108
|
+
const { images } = cfg;
|
|
109
|
+
if (images.unoptimized) {
|
|
110
|
+
return { ok: true, reason: 'unoptimized' };
|
|
111
|
+
}
|
|
112
|
+
// host header 通常带端口,absoluteUrl.hostname 不带 —— 用 url.host(含端口)
|
|
113
|
+
// 比较;同时小写化避免大小写差异。
|
|
114
|
+
const reqHost = hostHeader.toLowerCase();
|
|
115
|
+
const urlHost = absoluteUrl.host.toLowerCase();
|
|
116
|
+
if (reqHost && reqHost === urlHost) {
|
|
117
|
+
return { ok: true, reason: 'same-origin' };
|
|
118
|
+
}
|
|
119
|
+
const matcher = loadMatcher();
|
|
120
|
+
if (matcher === null) {
|
|
121
|
+
return { ok: false, reason: 'matcher-unavailable' };
|
|
122
|
+
}
|
|
123
|
+
if (matcher(images.domains, images.remotePatterns, absoluteUrl)) {
|
|
124
|
+
return { ok: true, reason: 'pattern-match' };
|
|
125
|
+
}
|
|
126
|
+
return { ok: false, reason: 'remote-pattern-not-matched' };
|
|
127
|
+
}
|
|
128
|
+
exports.validateImageUrl = validateImageUrl;
|
|
129
|
+
/** 测试用:重置缓存。生产代码不调用。 */
|
|
130
|
+
function _resetImageConfigCacheForTests() {
|
|
131
|
+
cachedConfig = undefined;
|
|
132
|
+
cachedMatcher = undefined;
|
|
133
|
+
warnedMatcherMissing = false;
|
|
134
|
+
}
|
|
135
|
+
exports._resetImageConfigCacheForTests = _resetImageConfigCacheForTests;
|
|
136
|
+
/**
|
|
137
|
+
* 测试用:注入 matcher,绕过对真实 next 模块的 require。
|
|
138
|
+
* 传 null 模拟"matcher 不可用"分支。
|
|
139
|
+
*/
|
|
140
|
+
function _setMatcherForTests(impl) {
|
|
141
|
+
cachedMatcher = impl;
|
|
142
|
+
}
|
|
143
|
+
exports._setMatcherForTests = _setMatcherForTests;
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvaW1hZ2UtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7OztBQUVILHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUEwQjdCLElBQUksWUFBc0MsQ0FBQztBQUMzQyxJQUFJLGFBQTZDLENBQUM7QUFDbEQsSUFBSSxvQkFBb0IsR0FBRyxLQUFLLENBQUM7QUFFakM7OztHQUdHO0FBQ0gsU0FBUyxjQUFjO0lBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLDRCQUE0QixDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELFNBQVMsZUFBZTs7SUFDdEIsSUFBSSxZQUFZLEtBQUssU0FBUztRQUFFLE9BQU8sWUFBWSxDQUFDO0lBRXBELE1BQU0sUUFBUSxHQUFHLGNBQWMsRUFBRSxDQUFDO0lBQ2xDLElBQUksR0FBVyxDQUFDO0lBQ2hCLElBQUk7UUFDRixHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDMUM7SUFBQyxPQUFPLEdBQVEsRUFBRTtRQUNqQixPQUFPLENBQUMsSUFBSSxDQUNWLDBEQUEwRCxRQUFRLCtCQUErQixNQUFBLEdBQUcsQ0FBQyxJQUFJLG1DQUFJLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FDNUgsQ0FBQztRQUNGLFlBQVksR0FBRyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFDLE9BQU8sWUFBWSxDQUFDO0tBQ3JCO0lBRUQsSUFBSTtRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBQSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxN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QUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztLQUNyRDtJQUNELElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsRUFBRTtRQUMvRCxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLENBQUM7S0FDOUM7SUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQztBQUM3RCxDQUFDO0FBOUJELDRDQThCQztBQUVELHdCQUF3QjtBQUN4QixTQUFnQiw4QkFBOEI7SUFDNUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztJQUN6QixhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQzFCLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUMvQixDQUFDO0FBSkQsd0VBSUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxJQUF3QjtJQUMxRCxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCLENBQUM7QUFGRCxrREFFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog6Kej5p6QIG5leHQuY29uZmlnLmltYWdlcyDlubbmoKHpqowgL19uZXh0L2ltYWdlIOeahCB1cmwg5Y+C5pWw44CCXG4gKlxuICog6YWN572u5p2l5rqQOk9wZW5OZXh0IGJ1aWxkIOWujOaIkOWQjuS8muaKiuino+aekOWQjueahOWujOaVtCBuZXh0LmNvbmZpZyDlhpnliLBcbiAqIDxzZXJ2ZXItYnVuZGxlPi8ubmV4dC9yZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbixpbWFnZXMg5a2X5q615bCx5pivIE5leHQg6Ieq5bexXG4gKiDlnKjov5DooYzml7bnlKjnmoTmnIDnu4jlvaLmgIHjgILnm7TmjqXor7vov5nkuKrmlofku7blj6/ku6Xpgb/lvIAgbmV4dC5jb25maWcg55qEIFRTL0VTTS9KUyDkuInnp41cbiAqIOW9ouaAgeino+aekCzkuZ/ml6DpnIDlnKggYnVpbGQg6Zi25q615YGa6aKd5aSW5oq95Y+W44CCXG4gKlxuICog5Yy56YWN566X5rOVOuWkjeeUqCBOZXh0IOiHquW3seeahCBtYXRjaC1yZW1vdGUtcGF0dGVybiDmqKHlnZfigJTigJRwaWNvbWF0Y2gg55qEIGdsb2JcbiAqIOivreS5iei+ueeVjChgKipgIOi3qOauteOAgWAqYCDljZXmrrXjgIFgP2DjgIFge2EsYn1gKeiHquW3semHjeWGmeW+iOWuueaYk+i3nyBuZXh0IGRldlxuICog6KGM5Li65ryC56e744CCTmV4dCDlv4XnhLblnKggc2VydmVyIGJ1bmRsZSDnmoQgbm9kZV9tb2R1bGVzIOmHjCzov5DooYzml7YgcmVxdWlyZSDljbPlj6/jgIJcbiAqXG4gKiDovrnnlYzooYzkuLoo5bey5LiO5LiK5bGC5a+56b2QKTpcbiAqIC0g5qCh6aqM5aSx6LSlIOKGkiDkuIrlsYIgNDAwKOWvuem9kCBOZXh0IOm7mOiupOihjOS4uilcbiAqIC0gcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb24g57y65aSxIOKGkiB3YXJuICsg5pS+6KGMKOWFvOWuueiAgeS6p+eJqSzkuI3pmLvmlq3pg6jnvbIpXG4gKiAtIGltYWdlcy51bm9wdGltaXplZD10cnVlIOKGkiDot7Pov4fmoKHpqozjgIHnhafluLjku6Plj5Eo55So5oi35YWz5LqGIE5leHQg5LyY5YyW5L2G5LuN6LWwXG4gKiAgIHdyYXBwZXIs55m95ZCN5Y2V6IGM6LSj6K6p5L2N57uZ5LiK5ri4KVxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmludGVyZmFjZSBSZW1vdGVQYXR0ZXJuIHtcbiAgcHJvdG9jb2w/OiAnaHR0cCcgfCAnaHR0cHMnO1xuICBob3N0bmFtZTogc3RyaW5nO1xuICBwb3J0Pzogc3RyaW5nO1xuICBwYXRobmFtZT86IHN0cmluZztcbiAgc2VhcmNoPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW1hZ2VzQ29uZmlnIHtcbiAgcmVtb3RlUGF0dGVybnM6IFJlbW90ZVBhdHRlcm5bXTtcbiAgZG9tYWluczogc3RyaW5nW107XG4gIHVub3B0aW1pemVkOiBib29sZWFuO1xufVxuXG50eXBlIExvYWRlZENvbmZpZyA9XG4gIHwgeyBtb2RlOiAnY29uZmlnLW1pc3NpbmcnIH1cbiAgfCB7IG1vZGU6ICdsb2FkZWQnOyBpbWFnZXM6IEltYWdlc0NvbmZpZyB9O1xuXG50eXBlIE1hdGNoZXJJbXBsID0gKFxuICBkb21haW5zOiBzdHJpbmdbXSxcbiAgcmVtb3RlUGF0dGVybnM6IFJlbW90ZVBhdHRlcm5bXSxcbiAgdXJsOiBVUkxcbikgPT4gYm9vbGVhbjtcblxubGV0IGNhY2hlZENvbmZpZzogTG9hZGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xubGV0IGNhY2hlZE1hdGNoZXI6IE1hdGNoZXJJbXBsIHwgbnVsbCB8IHVuZGVmaW5lZDtcbmxldCB3YXJuZWRNYXRjaGVyTWlzc2luZyA9IGZhbHNlO1xuXG4vKipcbiAqIOi3r+W+hOino+aekOS4jiBub2RlLXNlcnZlci50cyDnmoQgYXNzZXRzIOino+aekOWQjOa6kDp3cmFwcGVyIOWQr+WKqOaXtlxuICogcHJvY2Vzcy5jd2QoKSA9PT0gc2VydmVyLWZ1bmN0aW9ucy9kZWZhdWx0LyzmiYDku6UgLm5leHQg5bCx5ZyoIGN3ZCDkuIvjgIJcbiAqL1xuZnVuY3Rpb24gY29uZmlnRmlsZVBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLm5leHQnLCAncmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb24nKTtcbn1cblxuZnVuY3Rpb24gbG9hZEltYWdlQ29uZmlnKCk6IExvYWRlZENvbmZpZyB7XG4gIGlmIChjYWNoZWRDb25maWcgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZENvbmZpZztcblxuICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZ0ZpbGVQYXRoKCk7XG4gIGxldCByYXc6IHN0cmluZztcbiAgdHJ5IHtcbiAgICByYXcgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbaW1hZ2UtY29uZmlnXSByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbiBub3QgZm91bmQgYXQgJHtmaWxlUGF0aH0g4oCUIGFsbG93aW5nIGFsbCBpbWFnZSBVUkxzICgke2Vyci5jb2RlID8/IGVyci5tZXNzYWdlfSlgXG4gICAgKTtcbiAgICBjYWNoZWRDb25maWcgPSB7IG1vZGU6ICdjb25maWctbWlzc2luZycgfTtcbiAgICByZXR1cm4gY2FjaGVkQ29uZmlnO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgY29uc3QgaW1hZ2VzID0gcGFyc2VkPy5jb25maWc/LmltYWdlcyA/PyB7fTtcbiAgICBjYWNoZWRDb25maWcgPSB7XG4gICAgICBtb2RlOiAnbG9hZGVkJyxcbiAgICAgIGltYWdlczoge1xuICAgICAgICByZW1vdGVQYXR0ZXJuczogQXJyYXkuaXNBcnJheShpbWFnZXMucmVtb3RlUGF0dGVybnMpXG4gICAgICAgICAgPyBpbWFnZXMucmVtb3RlUGF0dGVybnNcbiAgICAgICAgICA6IFtdLFxuICAgICAgICBkb21haW5zOiBBcnJheS5pc0FycmF5KGltYWdlcy5kb21haW5zKSA/IGltYWdlcy5kb21haW5zIDogW10sXG4gICAgICAgIHVub3B0aW1pemVkOiBpbWFnZXMudW5vcHRpbWl6ZWQgPT09IHRydWUsXG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIGNhY2hlZENvbmZpZztcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2ltYWdlLWNvbmZpZ10gZmFpbGVkIHRvIHBhcnNlICR7ZmlsZVBhdGh9OiAke2Vyci5tZXNzYWdlfSDigJQgYWxsb3dpbmcgYWxsIGltYWdlIFVSTHNgXG4gICAgKTtcbiAgICBjYWNoZWRDb25maWcgPSB7IG1vZGU6ICdjb25maWctbWlzc2luZycgfTtcbiAgICByZXR1cm4gY2FjaGVkQ29uZmlnO1xuICB9XG59XG5cbi8qKlxuICog5ou/IE5leHQg6Ieq5bex55qEIGhhc1JlbW90ZU1hdGNo44CC5aSx6LSl5LiA5qyh5ZCO57yT5a2YIG51bGws5ZCO57ut6LWw5Lil5qC8IGRlbnkg5YiG5pSv44CCXG4gKiDnlKggZXZhbCgncmVxdWlyZScpIOiuqSBlc2J1aWxkIOS4jeWOu+Wwneivleino+aekCBuZXh0IOaooeWdl+KAlOKAlHdyYXBwZXIgYnVuZGxlIOeUsVxuICogc2NyaXB0cy9idW5kbGUtb3ZlcnJpZGVzLmpzIOeUqCBlc2J1aWxkIOaJk+WMhSzmioogbmV4dCDmoIfkuoYgZXh0ZXJuYWwg5pivIGJlbHQtXG4gKiBhbmQtc3VzcGVuZGVycztldmFsIOi/meS4gOWxguehruS/neWNs+S+vyBleHRlcm5hbCDphY3plJnkuZ/miZPkuI3ov5sgYnVuZGxl44CCXG4gKi9cbmZ1bmN0aW9uIGxvYWRNYXRjaGVyKCk6IE1hdGNoZXJJbXBsIHwgbnVsbCB7XG4gIGlmIChjYWNoZWRNYXRjaGVyICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWRNYXRjaGVyO1xuICB0cnkge1xuICAgIGNvbnN0IGR5bmFtaWNSZXF1aXJlID0gZXZhbCgncmVxdWlyZScpIGFzIE5vZGVSZXF1aXJlO1xuICAgIGNvbnN0IG1vZCA9IGR5bmFtaWNSZXF1aXJlKCduZXh0L2Rpc3Qvc2hhcmVkL2xpYi9tYXRjaC1yZW1vdGUtcGF0dGVybicpO1xuICAgIGNvbnN0IGhhc1JlbW90ZU1hdGNoID0gbW9kPy5oYXNSZW1vdGVNYXRjaDtcbiAgICBpZiAodHlwZW9mIGhhc1JlbW90ZU1hdGNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhc1JlbW90ZU1hdGNoIG5vdCBleHBvcnRlZCcpO1xuICAgIH1cbiAgICBjYWNoZWRNYXRjaGVyID0gaGFzUmVtb3RlTWF0Y2ggYXMgTWF0Y2hlckltcGw7XG4gICAgcmV0dXJuIGNhY2hlZE1hdGNoZXI7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKCF3YXJuZWRNYXRjaGVyTWlzc2luZykge1xuICAgICAgd2FybmVkTWF0Y2hlck1pc3NpbmcgPSB0cnVlO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2ltYWdlLWNvbmZpZ10gY2Fubm90IGxvYWQgbmV4dC9kaXN0L3NoYXJlZC9saWIvbWF0Y2gtcmVtb3RlLXBhdHRlcm4gKCR7ZXJyLm1lc3NhZ2V9KSDigJQgZmFsbGluZyBiYWNrIHRvIGRlbnktZXh0ZXJuYWwtb25seSBtb2RlYFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FjaGVkTWF0Y2hlciA9IG51bGw7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0ZVJlc3VsdCB7XG4gIG9rOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICog5qCh6aqMIC9fbmV4dC9pbWFnZSDnmoQgdXJsIOaYr+WQpuiiq+WFgeiuuOOAguivreS5ieWvuem9kCBOZXh0OlxuICogLSDlkIzmupAoaG9zdCBoZWFkZXIgPT09IHVybCDnmoQgaG9zdCzlkKvnq6/lj6Mp5aeL57uI5pS+6KGMXG4gKiAtIHVub3B0aW1pemVkOnRydWUg6Lez6L+H5qCh6aqMXG4gKiAtIOWQpuWImeW/hemhu+WRveS4rSBkb21haW5zIOaIliByZW1vdGVQYXR0ZXJucyDkuYvkuIBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW1hZ2VVcmwoXG4gIGFic29sdXRlVXJsOiBVUkwsXG4gIGhvc3RIZWFkZXI6IHN0cmluZ1xuKTogVmFsaWRhdGVSZXN1bHQge1xuICBjb25zdCBjZmcgPSBsb2FkSW1hZ2VDb25maWcoKTtcbiAgaWYgKGNmZy5tb2RlID09PSAnY29uZmlnLW1pc3NpbmcnKSB7XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIHJlYXNvbjogJ2NvbmZpZy1taXNzaW5nJyB9O1xuICB9XG5cbiAgY29uc3QgeyBpbWFnZXMgfSA9IGNmZztcbiAgaWYgKGltYWdlcy51bm9wdGltaXplZCkge1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCByZWFzb246ICd1bm9wdGltaXplZCcgfTtcbiAgfVxuXG4gIC8vIGhvc3QgaGVhZGVyIOmAmuW4uOW4puerr+WPoyxhYnNvbHV0ZVVybC5ob3N0bmFtZSDkuI3luKYg4oCU4oCUIOeUqCB1cmwuaG9zdCjlkKvnq6/lj6MpXG4gIC8vIOavlOi+gzvlkIzml7blsI/lhpnljJbpgb/lhY3lpKflsI/lhpnlt67lvILjgIJcbiAgY29uc3QgcmVxSG9zdCA9IGhvc3RIZWFkZXIudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgdXJsSG9zdCA9IGFic29sdXRlVXJsLmhvc3QudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJlcUhvc3QgJiYgcmVxSG9zdCA9PT0gdXJsSG9zdCkge1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCByZWFzb246ICdzYW1lLW9yaWdpbicgfTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXIgPSBsb2FkTWF0Y2hlcigpO1xuICBpZiAobWF0Y2hlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAnbWF0Y2hlci11bmF2YWlsYWJsZScgfTtcbiAgfVxuICBpZiAobWF0Y2hlcihpbWFnZXMuZG9tYWlucywgaW1hZ2VzLnJlbW90ZVBhdHRlcm5zLCBhYnNvbHV0ZVVybCkpIHtcbiAgICByZXR1cm4geyBvazogdHJ1ZSwgcmVhc29uOiAncGF0dGVybi1tYXRjaCcgfTtcbiAgfVxuICByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ3JlbW90ZS1wYXR0ZXJuLW5vdC1tYXRjaGVkJyB9O1xufVxuXG4vKiog5rWL6K+V55SoOumHjee9rue8k+WtmOOAgueUn+S6p+S7o+eggeS4jeiwg+eUqOOAgiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldEltYWdlQ29uZmlnQ2FjaGVGb3JUZXN0cygpOiB2b2lkIHtcbiAgY2FjaGVkQ29uZmlnID0gdW5kZWZpbmVkO1xuICBjYWNoZWRNYXRjaGVyID0gdW5kZWZpbmVkO1xuICB3YXJuZWRNYXRjaGVyTWlzc2luZyA9IGZhbHNlO1xufVxuXG4vKipcbiAqIOa1i+ivleeUqDrms6jlhaUgbWF0Y2hlciznu5Xov4flr7nnnJ/lrp4gbmV4dCDmqKHlnZfnmoQgcmVxdWlyZeOAglxuICog5LygIG51bGwg5qih5oufXCJtYXRjaGVyIOS4jeWPr+eUqFwi5YiG5pSv44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfc2V0TWF0Y2hlckZvclRlc3RzKGltcGw6IE1hdGNoZXJJbXBsIHwgbnVsbCk6IHZvaWQge1xuICBjYWNoZWRNYXRjaGVyID0gaW1wbDtcbn1cbiJdfQ==
|
|
@@ -13,6 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
exports.handleImageProxy = void 0;
|
|
14
14
|
const stream_1 = require("stream");
|
|
15
15
|
const gateway_auth_1 = require("./gateway-auth");
|
|
16
|
+
const image_config_1 = require("./image-config");
|
|
16
17
|
const GATEWAY_TIMEOUT_MS = 10000;
|
|
17
18
|
/** 透传给浏览器的响应头白名单(避免泄露 Gateway 内部 header) */
|
|
18
19
|
const PASSTHROUGH_HEADERS = [
|
|
@@ -75,6 +76,19 @@ async function handleImageProxy(req, res) {
|
|
|
75
76
|
error: 'Cannot resolve absolute URL: missing Host header',
|
|
76
77
|
});
|
|
77
78
|
}
|
|
79
|
+
// 按 next.config.images.{remotePatterns,domains} 校验 —— 与 next dev 行为对齐
|
|
80
|
+
let parsedUrl;
|
|
81
|
+
try {
|
|
82
|
+
parsedUrl = new URL(absoluteUrl);
|
|
83
|
+
}
|
|
84
|
+
catch (_a) {
|
|
85
|
+
return writeJson(res, 400, { error: 'Invalid url parameter' });
|
|
86
|
+
}
|
|
87
|
+
const hostHeader = req.headers['host'] || '';
|
|
88
|
+
const verdict = (0, image_config_1.validateImageUrl)(parsedUrl, hostHeader);
|
|
89
|
+
if (!verdict.ok) {
|
|
90
|
+
return writeJson(res, 400, { error: 'url not allowed' });
|
|
91
|
+
}
|
|
78
92
|
// 加载签名配置
|
|
79
93
|
const cfg = (0, gateway_auth_1.loadGatewayAuthConfig)();
|
|
80
94
|
if (!cfg) {
|
|
@@ -147,4 +161,4 @@ async function handleImageProxy(req, res) {
|
|
|
147
161
|
}
|
|
148
162
|
}
|
|
149
163
|
exports.handleImageProxy = handleImageProxy;
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS1wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7QUFHSCxtQ0FBa0M7QUFDbEMsaURBQXFFO0FBRXJFLE1BQU0sa0JBQWtCLEdBQUcsS0FBTSxDQUFDO0FBRWxDLDRDQUE0QztBQUM1QyxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLE1BQU07SUFDTixNQUFNO0lBQ04sZUFBZTtJQUNmLHlCQUF5QjtDQUMxQixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQ3pCLE1BQWMsRUFDZCxHQUF5QjtJQUV6QixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUNqRSxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBQ0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNyRCxNQUFNLEtBQUssR0FDVCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQzNELENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDM0QsT0FBTyxDQUFDO0lBQ1YsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFD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SUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7UUFDN0MsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1YsT0FBTztLQUNSO0lBRUQsMkJBQTJCO0lBQzNCLElBQUk7UUFDRixNQUFNLFVBQVUsR0FBRyxpQkFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBVyxDQUFDLENBQUM7UUFDMUQsVUFBVSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhO2dCQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDdEI7SUFBQyxPQUFPLEdBQVEsRUFBRTtRQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRTtZQUNwQixTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7U0FDdkQ7YUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRTtZQUM3QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDWDtLQUNGO0FBQ0gsQ0FBQztBQXhHRCw0Q0F3R0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOWbvueJh+S8mOWMluS7o+eQhu+8iEZDIOWGheaJp+ihjO+8iVxuICpcbiAqIOa1j+iniOWZqCBHRVQgL19uZXh0L2ltYWdlP3VybD0uLi4mdz0uLi4mcT0uLi4g4oaSIEVTQSDihpIgRkPvvIjmnKzmqKHlnZfvvIlcbiAqIOKGkiDnlKggZ2F0ZXdheUZldGNoIOazqOWFpeetvuWQjSA0IGhlYWRlciDihpIgR2F0ZXdheSAvaW1hZ2Uvb3B0aW1pemVcbiAqIOKGkiDmtYHlvI8gcGlwZSDlk43lupTlm57mtY/op4jlmajvvIhDYWNoZS1Db250cm9sIC8gRVRhZyAvIFZhcnkg562J5aS06YCP5Lyg77yJXG4gKlxuICogYDxpbWc+YCDmoIfnrb7lj5HkuI3lh7roh6rlrprkuYkgaGVhZGVy77yM55SxIEZDIOWcqOi/memHjOS7o+WPkeetvuWQjeivt+axgiDigJTigJQg6L+Z5piv5pa55qGI5LiJ55qE5qC45b+D44CCXG4gKiDmi6bmiKogTmV4dCDlhoXnva7nmoQgL19uZXh0L2ltYWdlIOi3r+eUsSznlKjmiLcgbmV4dC5jb25maWcg5peg6ZyA6YWNIGN1c3RvbSBsb2FkZXLjgIJcbiAqL1xuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgbG9hZEdhdGV3YXlBdXRoQ29uZmlnLCBnYXRld2F5RmV0Y2ggfSBmcm9tICcuL2dhdGV3YXktYXV0aCc7XG5cbmNvbnN0IEdBVEVXQVlfVElNRU9VVF9NUyA9IDEwXzAwMDtcblxuLyoqIOmAj+S8oOe7mea1j+iniOWZqOeahOWTjeW6lOWktOeZveWQjeWNle+8iOmBv+WFjeazhOmcsiBHYXRld2F5IOWGhemDqCBoZWFkZXLvvIkgKi9cbmNvbnN0IFBBU1NUSFJPVUdIX0hFQURFUlMgPSBbXG4gICdjb250ZW50LXR5cGUnLFxuICAnY29udGVudC1sZW5ndGgnLFxuICAnY2FjaGUtY29udHJvbCcsXG4gICdldGFnJyxcbiAgJ3ZhcnknLFxuICAnbGFzdC1tb2RpZmllZCcsXG4gICdjb250ZW50LXNlY3VyaXR5LXBvbGljeScsXG5dO1xuXG4vKipcbiAqIOaKiuivt+axgiBVUkwg5Lit55qEIGB1cmw9YCDlj4LmlbDmoIflh4bljJbmiJDnu53lr7kgVVJM44CCXG4gKiAtIOW3sue7j+aYryBodHRwKHMpOi8vIOKGkiDljp/moLdcbiAqIC0g5ZCm5YiZ55SoIGAke3Byb3RvfTovLyR7aG9zdH0ke3VybH1gIOaLvOaOpe+8jHByb3RvIOWPliB4LWZvcndhcmRlZC1wcm90b++8jOWQpuWImSBodHRwc1xuICovXG5mdW5jdGlvbiByZXNvbHZlQWJzb2x1dGVVcmwoXG4gIHJhd1VybDogc3RyaW5nLFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHJhd1VybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcmF3VXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICByZXR1cm4gcmF3VXJsO1xuICB9XG4gIGNvbnN0IGhvc3QgPSByZXEuaGVhZGVyc1snaG9zdCddO1xuICBpZiAoIWhvc3QpIHJldHVybiBudWxsO1xuICBjb25zdCBwcm90b0hlYWRlciA9IHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1wcm90byddO1xuICBjb25zdCBwcm90byA9XG4gICAgKEFycmF5LmlzQXJyYXkocHJvdG9IZWFkZXIpID8gcHJvdG9IZWFkZXJbMF0gOiBwcm90b0hlYWRlcikgfHxcbiAgICAoQXJyYXkuaXNBcnJheShwcm90b0hlYWRlcikgPyBwcm90b0hlYWRlclswXSA6IHByb3RvSGVhZGVyKSB8fFxuICAgICdodHRwcyc7XG4gIGNvbnN0IHBhdGggPSByYXdVcmwuc3RhcnRzV2l0aCgnLycpID8gcmF3VXJsIDogYC8ke3Jhd1VybH1gO1xuICByZXR1cm4gYCR7cHJvdG99Oi8vJHtob3N0fSR7cGF0aH1gO1xufVxuXG5mdW5jdGlvbiB3cml0ZUpzb24ocmVzOiBodHRwLlNlcnZlclJlc3BvbnNlLCBzdGF0dXM6IG51bWJlciwgYm9keTogYW55KTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpO1xuICByZXMuZW5kKEpTT04uc3RyaW5naWZ5KGJvZHkpKTtcbn1cblxuLyoqXG4gKiDlpITnkIbkuIDkuKogL19uZXh0L2ltYWdlIOivt+axguOAglxuICog55SxIG5vZGUtc2VydmVyIHdyYXBwZXIg5Zyo6Lev5b6E5Yy56YWN5ZCO6LCD55So44CCXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVJbWFnZVByb3h5KFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyDop6PmnpAgcXVlcnlcbiAgY29uc3QgcmVxVXJsID0gcmVxLnVybCB8fCAnJztcbiAgY29uc3QgcUlkeCA9IHJlcVVybC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxSWR4ID09PSAtMSkge1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA0MDAsIHsgZXJyb3I6ICdNaXNzaW5nIHF1ZXJ5IHBhcmFtZXRlcnMnIH0pO1xuICB9XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocmVxVXJsLnNsaWNlKHFJZHggKyAxKSk7XG4gIGNvbnN0IHJhd1VybCA9IHBhcmFtcy5nZXQoJ3VybCcpO1xuICBjb25zdCB3ID0gcGFyYW1zLmdldCgndycpO1xuICBjb25zdCBxID0gcGFyYW1zLmdldCgncScpO1xuXG4gIGlmICghcmF3VXJsIHx8ICF3KSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDQwMCwge1xuICAgICAgZXJyb3I6ICdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnM6IHVybCwgdycsXG4gICAgfSk7XG4gIH1cblxuICAvLyDmoIflh4bljJYgdXJsIOWPguaVsOS4uue7neWvuSBVUkxcbiAgY29uc3QgYWJzb2x1dGVVcmwgPSByZXNvbHZlQWJzb2x1dGVVcmwocmF3VXJsLCByZXEpO1xuICBpZiAoIWFic29sdXRlVXJsKSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDUwMCwge1xuICAgICAgZXJyb3I6ICdDYW5ub3QgcmVzb2x2ZSBhYnNvbHV0ZSBVUkw6IG1pc3NpbmcgSG9zdCBoZWFkZXInLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g5Yqg6L29562+5ZCN6YWN572uXG4gIGNvbnN0IGNmZyA9IGxvYWRHYXRld2F5QXV0aENvbmZpZygpO1xuICBpZiAoIWNmZykge1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA1MDAsIHtcbiAgICAgIGVycm9yOiAnR2F0ZXdheSBhdXRoIGNvbmZpZyBtaXNzaW5nJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOaehOmAoCBHYXRld2F5IOivt+axgui3r+W+hFxuICBjb25zdCB1cHN0cmVhbVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyB1cmw6IGFic29sdXRlVXJsLCB3IH0pO1xuICBpZiAocSkgdXBzdHJlYW1QYXJhbXMuc2V0KCdxJywgcSk7XG4gIGNvbnN0IHVwc3RyZWFtUGF0aCA9IGAvaW1hZ2Uvb3B0aW1pemU/JHt1cHN0cmVhbVBhcmFtc31gO1xuXG4gIC8vIOmAj+S8oCBJZi1Ob25lLU1hdGNoIOiuqSBHYXRld2F5IOi1sCAzMDRcbiAgY29uc3QgaWZOb25lTWF0Y2ggPSByZXEuaGVhZGVyc1snaWYtbm9uZS1tYXRjaCddO1xuICBjb25zdCB1cHN0cmVhbUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgaWYgKHR5cGVvZiBpZk5vbmVNYXRjaCA9PT0gJ3N0cmluZycpIHtcbiAgICB1cHN0cmVhbUhlYWRlcnNbJ2lmLW5vbmUtbWF0Y2gnXSA9IGlmTm9uZU1hdGNoO1xuICB9XG4gIGNvbnN0IGFjY2VwdCA9IHJlcS5oZWFkZXJzWydhY2NlcHQnXTtcbiAgaWYgKHR5cGVvZiBhY2NlcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgdXBzdHJlYW1IZWFkZXJzWydhY2NlcHQnXSA9IGFjY2VwdDtcbiAgfVxuXG4gIGxldCB1cHN0cmVhbTogUmVzcG9uc2U7XG4gIHRyeSB7XG4gICAgdXBzdHJlYW0gPSBhd2FpdCBnYXRld2F5RmV0Y2goY2ZnLCB1cHN0cmVhbVBhdGgsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB1cHN0cmVhbUhlYWRlcnMsXG4gICAgICB0aW1lb3V0TXM6IEdBVEVXQVlfVElNRU9VVF9NUyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2ltYWdlLXByb3h5XSBHYXRld2F5IHRpbWVvdXQgYWZ0ZXIgJHtHQVRFV0FZX1RJTUVPVVRfTVN9bXM6ICR7YWJzb2x1dGVVcmx9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA1MDQsIHsgZXJyb3I6ICdVcHN0cmVhbSB0aW1lb3V0JyB9KTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFtpbWFnZS1wcm94eV0gR2F0ZXdheSBmZXRjaCBlcnJvcjogJHtlcnIubWVzc2FnZX0gKHVybD0ke2Fic29sdXRlVXJsfSlgXG4gICAgKTtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNTAyLCB7IGVycm9yOiAnQmFkIGdhdGV3YXknIH0pO1xuICB9XG5cbiAgLy8g6YCP5Lyg54q25oCB56CBICsg55m95ZCN5Y2VIGhlYWRlclxuICByZXMuc3RhdHVzQ29kZSA9IHVwc3RyZWFtLnN0YXR1cztcbiAgZm9yIChjb25zdCBuYW1lIG9mIFBBU1NUSFJPVUdIX0hFQURFUlMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHVwc3RyZWFtLmhlYWRlcnMuZ2V0KG5hbWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmVzLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gMzA0IC8g5pegIGJvZHkg55u05o6l57uT5p2fXG4gIGlmICh1cHN0cmVhbS5zdGF0dXMgPT09IDMwNCB8fCAhdXBzdHJlYW0uYm9keSkge1xuICAgIHJlcy5lbmQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDmtYHlvI8gcGlwZe+8iOmBv+WFjeWkp+WbviBidWZmZXIg5Y2g5YaF5a2Y77yJXG4gIHRyeSB7XG4gICAgY29uc3Qgbm9kZVN0cmVhbSA9IFJlYWRhYmxlLmZyb21XZWIodXBzdHJlYW0uYm9keSBhcyBhbnkpO1xuICAgIG5vZGVTdHJlYW0ub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgIGNvbnNvbGUud2FybihgW2ltYWdlLXByb3h5XSBTdHJlYW0gZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkKSByZXMuZW5kKCk7XG4gICAgfSk7XG4gICAgbm9kZVN0cmVhbS5waXBlKHJlcyk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgY29uc29sZS53YXJuKGBbaW1hZ2UtcHJveHldIFBpcGUgc2V0dXAgZmFpbGVkOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICB3cml0ZUpzb24ocmVzLCA1MDIsIHsgZXJyb3I6ICdTdHJlYW0gc2V0dXAgZmFpbGVkJyB9KTtcbiAgICB9IGVsc2UgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS1wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7QUFHSCxtQ0FBa0M7QUFDbEMsaURBQXFFO0FBQ3JFLGlEQUFrRDtBQUVsRCxNQUFNLGtCQUFrQixHQUFHLEtBQU0sQ0FBQztBQUVsQyw0Q0FBNEM7QUFDNUMsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixNQUFNO0lBQ04sTUFBTTtJQUNOLGVBQWU7SUFDZix5QkFBeUI7Q0FDMUIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixNQUFjLEVBQ2QsR0FBeUI7SUFFekIsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDakUsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUNELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDckQsTUFBTSxLQUFLLEdBQ1QsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUMzRCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQzNELE9BQU8sQ0FBQztJQUNWLE1BQU0sSUFBSSxH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LEVBQUU7UUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUU7WUFDcEIsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZEO2FBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUU7WUFDN0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ1g7S0FDRjtBQUNILENBQUM7QUFySEQsNENBcUhDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDlm77niYfkvJjljJbku6PnkIbvvIhGQyDlhoXmiafooYzvvIlcbiAqXG4gKiDmtY/op4jlmaggR0VUIC9fbmV4dC9pbWFnZT91cmw9Li4uJnc9Li4uJnE9Li4uIOKGkiBFU0Eg4oaSIEZD77yI5pys5qih5Z2X77yJXG4gKiDihpIg55SoIGdhdGV3YXlGZXRjaCDms6jlhaXnrb7lkI0gNCBoZWFkZXIg4oaSIEdhdGV3YXkgL2ltYWdlL29wdGltaXplXG4gKiDihpIg5rWB5byPIHBpcGUg5ZON5bqU5Zue5rWP6KeI5Zmo77yIQ2FjaGUtQ29udHJvbCAvIEVUYWcgLyBWYXJ5IOetieWktOmAj+S8oO+8iVxuICpcbiAqIGA8aW1nPmAg5qCH562+5Y+R5LiN5Ye66Ieq5a6a5LmJIGhlYWRlcu+8jOeUsSBGQyDlnKjov5nph4zku6Plj5Hnrb7lkI3or7fmsYIg4oCU4oCUIOi/meaYr+aWueahiOS4ieeahOaguOW/g+OAglxuICog5oum5oiqIE5leHQg5YaF572u55qEIC9fbmV4dC9pbWFnZSDot6/nlLEs55So5oi3IG5leHQuY29uZmlnIOaXoOmcgOmFjSBjdXN0b20gbG9hZGVy44CCXG4gKi9cblxuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IGxvYWRHYXRld2F5QXV0aENvbmZpZywgZ2F0ZXdheUZldGNoIH0gZnJvbSAnLi9nYXRld2F5LWF1dGgnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbWFnZVVybCB9IGZyb20gJy4vaW1hZ2UtY29uZmlnJztcblxuY29uc3QgR0FURVdBWV9USU1FT1VUX01TID0gMTBfMDAwO1xuXG4vKiog6YCP5Lyg57uZ5rWP6KeI5Zmo55qE5ZON5bqU5aS055m95ZCN5Y2V77yI6YG/5YWN5rOE6ZyyIEdhdGV3YXkg5YaF6YOoIGhlYWRlcu+8iSAqL1xuY29uc3QgUEFTU1RIUk9VR0hfSEVBREVSUyA9IFtcbiAgJ2NvbnRlbnQtdHlwZScsXG4gICdjb250ZW50LWxlbmd0aCcsXG4gICdjYWNoZS1jb250cm9sJyxcbiAgJ2V0YWcnLFxuICAndmFyeScsXG4gICdsYXN0LW1vZGlmaWVkJyxcbiAgJ2NvbnRlbnQtc2VjdXJpdHktcG9saWN5Jyxcbl07XG5cbi8qKlxuICog5oqK6K+35rGCIFVSTCDkuK3nmoQgYHVybD1gIOWPguaVsOagh+WHhuWMluaIkOe7neWvuSBVUkzjgIJcbiAqIC0g5bey57uP5pivIGh0dHAocyk6Ly8g4oaSIOWOn+agt1xuICogLSDlkKbliJnnlKggYCR7cHJvdG99Oi8vJHtob3N0fSR7dXJsfWAg5ou85o6l77yMcHJvdG8g5Y+WIHgtZm9yd2FyZGVkLXByb3Rv77yM5ZCm5YiZIGh0dHBzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBYnNvbHV0ZVVybChcbiAgcmF3VXJsOiBzdHJpbmcsXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2Vcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAocmF3VXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCByYXdVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgIHJldHVybiByYXdVcmw7XG4gIH1cbiAgY29uc3QgaG9zdCA9IHJlcS5oZWFkZXJzWydob3N0J107XG4gIGlmICghaG9zdCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByb3RvSGVhZGVyID0gcmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLXByb3RvJ107XG4gIGNvbnN0IHByb3RvID1cbiAgICAoQXJyYXkuaXNBcnJheShwcm90b0hlYWRlcikgPyBwcm90b0hlYWRlclswXSA6IHByb3RvSGVhZGVyKSB8fFxuICAgIChBcnJheS5pc0FycmF5KHByb3RvSGVhZGVyKSA/IHByb3RvSGVhZGVyWzBdIDogcHJvdG9IZWFkZXIpIHx8XG4gICAgJ2h0dHBzJztcbiAgY29uc3QgcGF0aCA9IHJhd1VybC5zdGFydHNXaXRoKCcvJykgPyByYXdVcmwgOiBgLyR7cmF3VXJsfWA7XG4gIHJldHVybiBgJHtwcm90b306Ly8ke2hvc3R9JHtwYXRofWA7XG59XG5cbmZ1bmN0aW9uIHdyaXRlSnNvbihyZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIHN0YXR1czogbnVtYmVyLCBib2R5OiBhbnkpOiB2b2lkIHtcbiAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Jyk7XG4gIHJlcy5lbmQoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xufVxuXG4vKipcbiAqIOWkhOeQhuS4gOS4qiAvX25leHQvaW1hZ2Ug6K+35rGC44CCXG4gKiDnlLEgbm9kZS1zZXJ2ZXIgd3JhcHBlciDlnKjot6/lvoTljLnphY3lkI7osIPnlKjjgIJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUltYWdlUHJveHkoXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIOino+aekCBxdWVyeVxuICBjb25zdCByZXFVcmwgPSByZXEudXJsIHx8ICcnO1xuICBjb25zdCBxSWR4ID0gcmVxVXJsLmluZGV4T2YoJz8nKTtcbiAgaWYgKHFJZHggPT09IC0xKSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDQwMCwgeyBlcnJvcjogJ01pc3NpbmcgcXVlcnkgcGFyYW1ldGVycycgfSk7XG4gIH1cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhyZXFVcmwuc2xpY2UocUlkeCArIDEpKTtcbiAgY29uc3QgcmF3VXJsID0gcGFyYW1zLmdldCgndXJsJyk7XG4gIGNvbnN0IHcgPSBwYXJhbXMuZ2V0KCd3Jyk7XG4gIGNvbnN0IHEgPSBwYXJhbXMuZ2V0KCdxJyk7XG5cbiAgaWYgKCFyYXdVcmwgfHwgIXcpIHtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNDAwLCB7XG4gICAgICBlcnJvcjogJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyczogdXJsLCB3JyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOagh+WHhuWMliB1cmwg5Y+C5pWw5Li657ud5a+5IFVSTFxuICBjb25zdCBhYnNvbHV0ZVVybCA9IHJlc29sdmVBYnNvbHV0ZVVybChyYXdVcmwsIHJlcSk7XG4gIGlmICghYWJzb2x1dGVVcmwpIHtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNTAwLCB7XG4gICAgICBlcnJvcjogJ0Nhbm5vdCByZXNvbHZlIGFic29sdXRlIFVSTDogbWlzc2luZyBIb3N0IGhlYWRlcicsXG4gICAgfSk7XG4gIH1cblxuICAvLyDmjIkgbmV4dC5jb25maWcuaW1hZ2VzLntyZW1vdGVQYXR0ZXJucyxkb21haW5zfSDmoKHpqowg4oCU4oCUIOS4jiBuZXh0IGRldiDooYzkuLrlr7npvZBcbiAgbGV0IHBhcnNlZFVybDogVVJMO1xuICB0cnkge1xuICAgIHBhcnNlZFVybCA9IG5ldyBVUkwoYWJzb2x1dGVVcmwpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNDAwLCB7IGVycm9yOiAnSW52YWxpZCB1cmwgcGFyYW1ldGVyJyB9KTtcbiAgfVxuICBjb25zdCBob3N0SGVhZGVyID0gKHJlcS5oZWFkZXJzWydob3N0J10gYXMgc3RyaW5nKSB8fCAnJztcbiAgY29uc3QgdmVyZGljdCA9IHZhbGlkYXRlSW1hZ2VVcmwocGFyc2VkVXJsLCBob3N0SGVhZGVyKTtcbiAgaWYgKCF2ZXJkaWN0Lm9rKSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDQwMCwgeyBlcnJvcjogJ3VybCBub3QgYWxsb3dlZCcgfSk7XG4gIH1cblxuICAvLyDliqDovb3nrb7lkI3phY3nva5cbiAgY29uc3QgY2ZnID0gbG9hZEdhdGV3YXlBdXRoQ29uZmlnKCk7XG4gIGlmICghY2ZnKSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDUwMCwge1xuICAgICAgZXJyb3I6ICdHYXRld2F5IGF1dGggY29uZmlnIG1pc3NpbmcnLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g5p6E6YCgIEdhdGV3YXkg6K+35rGC6Lev5b6EXG4gIGNvbnN0IHVwc3RyZWFtUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHVybDogYWJzb2x1dGVVcmwsIHcgfSk7XG4gIGlmIChxKSB1cHN0cmVhbVBhcmFtcy5zZXQoJ3EnLCBxKTtcbiAgY29uc3QgdXBzdHJlYW1QYXRoID0gYC9pbWFnZS9vcHRpbWl6ZT8ke3Vwc3RyZWFtUGFyYW1zfWA7XG5cbiAgLy8g6YCP5LygIElmLU5vbmUtTWF0Y2gg6K6pIEdhdGV3YXkg6LWwIDMwNFxuICBjb25zdCBpZk5vbmVNYXRjaCA9IHJlcS5oZWFkZXJzWydpZi1ub25lLW1hdGNoJ107XG4gIGNvbnN0IHVwc3RyZWFtSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBpZiAodHlwZW9mIGlmTm9uZU1hdGNoID09PSAnc3RyaW5nJykge1xuICAgIHVwc3RyZWFtSGVhZGVyc1snaWYtbm9uZS1tYXRjaCddID0gaWZOb25lTWF0Y2g7XG4gIH1cbiAgY29uc3QgYWNjZXB0ID0gcmVxLmhlYWRlcnNbJ2FjY2VwdCddO1xuICBpZiAodHlwZW9mIGFjY2VwdCA9PT0gJ3N0cmluZycpIHtcbiAgICB1cHN0cmVhbUhlYWRlcnNbJ2FjY2VwdCddID0gYWNjZXB0O1xuICB9XG5cbiAgbGV0IHVwc3RyZWFtOiBSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICB1cHN0cmVhbSA9IGF3YWl0IGdhdGV3YXlGZXRjaChjZmcsIHVwc3RyZWFtUGF0aCwge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IHVwc3RyZWFtSGVhZGVycyxcbiAgICAgIHRpbWVvdXRNczogR0FURVdBWV9USU1FT1VUX01TLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbaW1hZ2UtcHJveHldIEdhdGV3YXkgdGltZW91dCBhZnRlciAke0dBVEVXQVlfVElNRU9VVF9NU31tczogJHthYnNvbHV0ZVVybH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDUwNCwgeyBlcnJvcjogJ1Vwc3RyZWFtIHRpbWVvdXQnIH0pO1xuICAgIH1cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2ltYWdlLXByb3h5XSBHYXRld2F5IGZldGNoIGVycm9yOiAke2Vyci5tZXNzYWdlfSAodXJsPSR7YWJzb2x1dGVVcmx9KWBcbiAgICApO1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA1MDIsIHsgZXJyb3I6ICdCYWQgZ2F0ZXdheScgfSk7XG4gIH1cblxuICAvLyDpgI/kvKDnirbmgIHnoIEgKyDnmb3lkI3ljZUgaGVhZGVyXG4gIHJlcy5zdGF0dXNDb2RlID0gdXBzdHJlYW0uc3RhdHVzO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgUEFTU1RIUk9VR0hfSEVBREVSUykge1xuICAgIGNvbnN0IHZhbHVlID0gdXBzdHJlYW0uaGVhZGVycy5nZXQobmFtZSk7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICByZXMuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvLyAzMDQgLyDml6AgYm9keSDnm7TmjqXnu5PmnZ9cbiAgaWYgKHVwc3RyZWFtLnN0YXR1cyA9PT0gMzA0IHx8ICF1cHN0cmVhbS5ib2R5KSB7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOa1geW8jyBwaXBl77yI6YG/5YWN5aSn5Zu+IGJ1ZmZlciDljaDlhoXlrZjvvIlcbiAgdHJ5IHtcbiAgICBjb25zdCBub2RlU3RyZWFtID0gUmVhZGFibGUuZnJvbVdlYih1cHN0cmVhbS5ib2R5IGFzIGFueSk7XG4gICAgbm9kZVN0cmVhbS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgY29uc29sZS53YXJuKGBbaW1hZ2UtcHJveHldIFN0cmVhbSBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHJlcy5lbmQoKTtcbiAgICB9KTtcbiAgICBub2RlU3RyZWFtLnBpcGUocmVzKTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLndhcm4oYFtpbWFnZS1wcm94eV0gUGlwZSBzZXR1cCBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgIHdyaXRlSnNvbihyZXMsIDUwMiwgeyBlcnJvcjogJ1N0cmVhbSBzZXR1cCBmYWlsZWQnIH0pO1xuICAgIH0gZWxzZSBpZiAoIXJlcy53cml0YWJsZUVuZGVkKSB7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|