tempmail-sdk 1.1.8 → 1.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.
- package/README.md +15 -3
- package/dist/config.d.ts +6 -0
- package/dist/config.js +13 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +41 -18
- package/dist/providers/tempmail-cn.d.ts +3 -0
- package/dist/providers/tempmail-cn.js +341 -0
- package/dist/retry.d.ts +13 -0
- package/dist/retry.js +14 -12
- package/dist/telemetry.d.ts +1 -0
- package/dist/telemetry.js +110 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/version.d.ts +1 -0
- package/dist/version.js +22 -0
- package/package.json +2 -2
- package/src/config.ts +15 -0
- package/src/index.ts +40 -16
- package/src/providers/tempmail-cn.ts +376 -0
- package/src/retry.ts +21 -4
- package/src/telemetry.ts +138 -0
- package/src/types.ts +2 -2
- package/src/version.ts +19 -0
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/tempmail-sdk)
|
|
4
4
|
[](https://www.gnu.org/licenses/gpl-3.0)
|
|
5
5
|
|
|
6
|
-
临时邮箱 SDK(TypeScript/Node.js),支持 **
|
|
6
|
+
临时邮箱 SDK(TypeScript/Node.js),支持 **21** 个邮箱服务提供商,所有渠道返回**统一标准化格式**。
|
|
7
7
|
|
|
8
8
|
## 安装
|
|
9
9
|
|
|
@@ -17,11 +17,12 @@ npm install @XxxXTeam/tempmail-sdk --registry=https://npm.pkg.github.com
|
|
|
17
17
|
|
|
18
18
|
## 支持的渠道
|
|
19
19
|
|
|
20
|
-
共 **
|
|
20
|
+
共 **21** 个,顺序与 `listChannels()` / 随机尝试顺序一致(与 `src/index.ts` 中 `allChannels` 相同)。
|
|
21
21
|
|
|
22
22
|
| 渠道 | 服务商 | 需要 Token | 说明 |
|
|
23
23
|
|------|--------|:----------:|------|
|
|
24
24
|
| `tempmail` | tempmail.ing | - | 支持自定义有效期 |
|
|
25
|
+
| `tempmail-cn` | tempmail.cn | - | Socket.IO:`request shortid` / `set shortid` / `mail`;`domain` 可指定 `tempmail.cn` 或自定义接入域名 |
|
|
25
26
|
| `linshi-email` | linshi-email.com | - | |
|
|
26
27
|
| `linshiyou` | linshiyou.com | ✅ | `NEXUS_TOKEN` + `tmail-emails` 等 Cookie;HTML 分段解析 |
|
|
27
28
|
| `mffac` | mffac.com | ✅ | `POST /api/mailboxes`;token 为 mailbox `id`;24h |
|
|
@@ -106,6 +107,9 @@ const emailInfo3 = await generateEmail({ channel: 'tempmail', duration: 60 });
|
|
|
106
107
|
// tempmail-lol 渠道支持指定域名
|
|
107
108
|
const emailInfo4 = await generateEmail({ channel: 'tempmail-lol', domain: 'example.com' });
|
|
108
109
|
|
|
110
|
+
// tempmail-cn 渠道支持指定 tempmail.cn 自定义接入域名
|
|
111
|
+
const emailInfo5 = await generateEmail({ channel: 'tempmail-cn', domain: 'mail.example.com' });
|
|
112
|
+
|
|
109
113
|
// 只尝试指定渠道(探测可用性、写自动化时用)
|
|
110
114
|
const probe = await generateEmail({ channel: 'smail-pw', channelFallback: false });
|
|
111
115
|
```
|
|
@@ -162,7 +166,7 @@ if (mailTm) {
|
|
|
162
166
|
| `channel` | `Channel` | 指定渠道(可选,不指定则随机) |
|
|
163
167
|
| `channelFallback` | `boolean` | 默认 `true`:指定渠道失败会继续尝试其他渠道;设为 `false` 时仅尝试 `channel` |
|
|
164
168
|
| `duration` | `number` | 有效期分钟数(仅 `tempmail` 渠道) |
|
|
165
|
-
| `domain` | `string` | 指定域名(`tempmail-lol`、`maildrop`、`fake-legal`) |
|
|
169
|
+
| `domain` | `string` | 指定域名(`tempmail-cn`、`tempmail-lol`、`maildrop`、`fake-legal`) |
|
|
166
170
|
| `retry` | `RetryConfig` | 创建邮箱时的重试(超时、5xx、网络错误等) |
|
|
167
171
|
|
|
168
172
|
**返回值:** `EmailInfo`
|
|
@@ -260,6 +264,8 @@ setConfig({
|
|
|
260
264
|
| `timeout` | `number?` | 全局超时毫秒数,默认 15000 |
|
|
261
265
|
| `insecure` | `boolean?` | 跳过 SSL 验证(调试用) |
|
|
262
266
|
| `customFetch` | `typeof fetch?` | 自定义 fetch 函数,用于代理等高级场景 |
|
|
267
|
+
| `telemetryEnabled` | `boolean?` | 未设则默认开启匿名遥测;`false` 关闭 |
|
|
268
|
+
| `telemetryUrl` | `string?` | 覆盖默认上报 URL |
|
|
263
269
|
|
|
264
270
|
**环境变量(无需修改代码):**
|
|
265
271
|
|
|
@@ -267,12 +273,18 @@ setConfig({
|
|
|
267
273
|
export TEMPMAIL_PROXY="http://127.0.0.1:7890"
|
|
268
274
|
export TEMPMAIL_INSECURE=1
|
|
269
275
|
export TEMPMAIL_TIMEOUT=30000
|
|
276
|
+
export TEMPMAIL_TELEMETRY_ENABLED=false
|
|
277
|
+
export TEMPMAIL_TELEMETRY_URL="https://example.com/v1/event"
|
|
270
278
|
```
|
|
271
279
|
|
|
272
280
|
> **提示:** Node.js 原生 fetch 不支持代理,推荐通过 `customFetch` + `undici` 的 `ProxyAgent` 实现代理支持。
|
|
273
281
|
|
|
274
282
|
DropMail 自动令牌等更多配置见源码 `src/config.ts` 注释(`DROPMAIL_*` 环境变量)。
|
|
275
283
|
|
|
284
|
+
## 匿名遥测
|
|
285
|
+
|
|
286
|
+
默认 **开启**:在进程内排队,定时或满批向默认端点 `POST` 匿名事件(`schema_version: 2`,含 SDK 语言/版本、OS、操作类型、渠道、成败与重试次数等;错误串脱敏)。关闭:`TEMPMAIL_TELEMETRY_ENABLED=false`(或 `0` / `no`)或 `setConfig({ telemetryEnabled: false })`;改 URL:`TEMPMAIL_TELEMETRY_URL` 或 `telemetryUrl`(内置默认见 `src/telemetry.ts`)。
|
|
287
|
+
|
|
276
288
|
## 示例脚本(本仓库)
|
|
277
289
|
|
|
278
290
|
在 `sdk/npm` 目录执行:
|
package/dist/config.d.ts
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* DROPMAIL_AUTH_TOKEN / DROPMAIL_API_TOKEN - DropMail GraphQL 的 af_ 令牌(可选;未设置时 SDK 会 /api/token/generate 获取并在将过期时用 /api/token/renew 续期)
|
|
10
10
|
* DROPMAIL_NO_AUTO_TOKEN - 设为 "1" 或 "true" 则禁止自动拉取/续期令牌
|
|
11
11
|
* DROPMAIL_RENEW_LIFETIME - 自动续期请求的 lifetime,默认 1d(与官网 renew 接口一致)
|
|
12
|
+
* TEMPMAIL_TELEMETRY_ENABLED - true/false,默认 true;false/0/no 关闭匿名用量上报
|
|
13
|
+
* TEMPMAIL_TELEMETRY_URL - 自定义上报端点 URL
|
|
12
14
|
*
|
|
13
15
|
* Node.js 环境下设置 insecure 会自动设置 NODE_TLS_REJECT_UNAUTHORIZED=0
|
|
14
16
|
*/
|
|
@@ -40,6 +42,10 @@ export interface SDKConfig {
|
|
|
40
42
|
* 当设置了 proxy 但环境不支持 undici 时,可通过此选项传入支持代理的 fetch 实现
|
|
41
43
|
*/
|
|
42
44
|
customFetch?: typeof fetch;
|
|
45
|
+
/** 为 false 时关闭匿名用量上报;未设置时默认开启 */
|
|
46
|
+
telemetryEnabled?: boolean;
|
|
47
|
+
/** 非空时覆盖默认上报 URL */
|
|
48
|
+
telemetryUrl?: string;
|
|
43
49
|
}
|
|
44
50
|
/**
|
|
45
51
|
* 设置 SDK 全局配置
|
package/dist/config.js
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* DROPMAIL_AUTH_TOKEN / DROPMAIL_API_TOKEN - DropMail GraphQL 的 af_ 令牌(可选;未设置时 SDK 会 /api/token/generate 获取并在将过期时用 /api/token/renew 续期)
|
|
11
11
|
* DROPMAIL_NO_AUTO_TOKEN - 设为 "1" 或 "true" 则禁止自动拉取/续期令牌
|
|
12
12
|
* DROPMAIL_RENEW_LIFETIME - 自动续期请求的 lifetime,默认 1d(与官网 renew 接口一致)
|
|
13
|
+
* TEMPMAIL_TELEMETRY_ENABLED - true/false,默认 true;false/0/no 关闭匿名用量上报
|
|
14
|
+
* TEMPMAIL_TELEMETRY_URL - 自定义上报端点 URL
|
|
13
15
|
*
|
|
14
16
|
* Node.js 环境下设置 insecure 会自动设置 NODE_TLS_REJECT_UNAUTHORIZED=0
|
|
15
17
|
*/
|
|
@@ -31,6 +33,16 @@ function loadEnvConfig() {
|
|
|
31
33
|
if (process.env.TEMPMAIL_INSECURE === '1' || process.env.TEMPMAIL_INSECURE?.toLowerCase() === 'true') {
|
|
32
34
|
config.insecure = true;
|
|
33
35
|
}
|
|
36
|
+
const te = process.env.TEMPMAIL_TELEMETRY_ENABLED?.trim().toLowerCase();
|
|
37
|
+
if (te === 'false' || te === '0' || te === 'no') {
|
|
38
|
+
config.telemetryEnabled = false;
|
|
39
|
+
}
|
|
40
|
+
else if (te === 'true' || te === '1' || te === 'yes') {
|
|
41
|
+
config.telemetryEnabled = true;
|
|
42
|
+
}
|
|
43
|
+
if (process.env.TEMPMAIL_TELEMETRY_URL?.trim()) {
|
|
44
|
+
config.telemetryUrl = process.env.TEMPMAIL_TELEMETRY_URL.trim();
|
|
45
|
+
}
|
|
34
46
|
}
|
|
35
47
|
return config;
|
|
36
48
|
}
|
|
@@ -68,4 +80,4 @@ function setConfig(config) {
|
|
|
68
80
|
function getConfig() {
|
|
69
81
|
return globalConfig;
|
|
70
82
|
}
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOztBQWtGSCw4QkFVQztBQUdELDhCQUVDO0FBN0RELGtCQUFrQjtBQUNsQixTQUFTLGFBQWE7SUFDcEIsTUFBTSxNQUFNLEdBQWMsRUFBRSxDQUFDO0lBQzdCLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3JHLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hFLElBQUksRUFBRSxLQUFLLE9BQU8sSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoRCxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLENBQUM7YUFBTSxJQUFJLEVBQUUsS0FBSyxNQUFNLElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDdkQsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDL0MsTUFBTSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELElBQUksWUFBWSxHQUFjLGFBQWEsRUFBRSxDQUFDO0FBRTlDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLE1BQWlCO0lBQ3pDLFlBQVksR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDN0IsbUNBQW1DO0lBQ25DLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixHQUFHLEdBQUcsQ0FBQztRQUNqRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxvQkFBb0I7QUFDcEIsU0FBZ0IsU0FBUztJQUN2QixPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTREsg5YWo5bGA6YWN572uXG4gKiDljIXlkKvku6PnkIbjgIHotoXml7bjgIFTU0wg562J6K6+572u77yM5L2c55So5LqO5omA5pyJIEhUVFAg6K+35rGCXG4gKlxuICog5pSv5oyB546v5aKD5Y+Y6YeP6Ieq5Yqo6K+75Y+W77yI5LyY5YWI57qn5L2O5LqO5Luj56CB6K6+572u77yJ77yaXG4gKiAgIFRFTVBNQUlMX1BST1hZICAgIC0g5Luj55CGIFVSTFxuICogICBURU1QTUFJTF9USU1FT1VUICAtIOi2heaXtuavq+enkuaVsFxuICogICBURU1QTUFJTF9JTlNFQ1VSRSAtIOiuvuS4uiBcIjFcIiDmiJYgXCJ0cnVlXCIg6Lez6L+HIFNTTCDpqozor4FcbiAqICAgRFJPUE1BSUxfQVVUSF9UT0tFTiAvIERST1BNQUlMX0FQSV9UT0tFTiAtIERyb3BNYWlsIEdyYXBoUUwg55qEIGFmXyDku6TniYzvvIjlj6/pgInvvJvmnKrorr7nva7ml7YgU0RLIOS8miAvYXBpL3Rva2VuL2dlbmVyYXRlIOiOt+WPluW5tuWcqOWwhui/h+acn+aXtueUqCAvYXBpL3Rva2VuL3JlbmV3IOe7reacn++8iVxuICogICBEUk9QTUFJTF9OT19BVVRPX1RPS0VOIC0g6K6+5Li6IFwiMVwiIOaIliBcInRydWVcIiDliJnnpoHmraLoh6rliqjmi4nlj5Yv57ut5pyf5Luk54mMXG4gKiAgIERST1BNQUlMX1JFTkVXX0xJRkVUSU1FIC0g6Ieq5Yqo57ut5pyf6K+35rGC55qEIGxpZmV0aW1l77yM6buY6K6kIDFk77yI5LiO5a6Y572RIHJlbmV3IOaOpeWPo+S4gOiHtO+8iVxuICogICBURU1QTUFJTF9URUxFTUVUUllfRU5BQkxFRCAtIHRydWUvZmFsc2XvvIzpu5jorqQgdHJ1Ze+8m2ZhbHNlLzAvbm8g5YWz6Zet5Yy/5ZCN55So6YeP5LiK5oqlXG4gKiAgIFRFTVBNQUlMX1RFTEVNRVRSWV9VUkwgLSDoh6rlrprkuYnkuIrmiqXnq6/ngrkgVVJMXG4gKlxuICogTm9kZS5qcyDnjq/looPkuIvorr7nva4gaW5zZWN1cmUg5Lya6Ieq5Yqo6K6+572uIE5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ9MFxuICovXG5cbi8qKlxuICogU0RLIOWFqOWxgOmFjee9ruaOpeWPo1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNES0NvbmZpZyB7XG4gIC8qKiDku6PnkIYgVVJM77yM5pSv5oyBIGh0dHAvaHR0cHMvc29ja3M177yM5aaCIFwiaHR0cDovLzEyNy4wLjAuMTo3ODkwXCIgKi9cbiAgcHJveHk/OiBzdHJpbmc7XG4gIC8qKiDlhajlsYDpu5jorqTotoXml7bvvIjmr6vnp5LvvInvvIzpu5jorqQgMTUwMDAgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIOi3s+i/hyBTU0wg6K+B5Lmm6aqM6K+B77yI6LCD6K+V55So77yJICovXG4gIGluc2VjdXJlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERyb3BNYWlsIOa4oOmBk+S4k+eUqO+8mkdyYXBoUUwg56uv54K5IGBodHRwczovL2Ryb3BtYWlsLm1lL2FwaS9ncmFwaHFsLyR7dG9rZW59YCDkuK3nmoQgdG9rZW7vvIjpobvkuLrlrpjnvZHnlJ/miJDnmoQgYGFmX2Ag5YmN57yA5Luk54mM77yJ44CCXG4gICAqIOS5n+WPr+mAmui/h+eOr+Wig+WPmOmHjyBEUk9QTUFJTF9BVVRIX1RPS0VOIOaIliBEUk9QTUFJTF9BUElfVE9LRU4g5o+Q5L6b44CCXG4gICAqIOacqumFjee9ruS4lOacquiuvue9riBEUk9QTUFJTF9OT19BVVRPX1RPS0VOIOaXtu+8jOS8muWQkSBodHRwczovL2Ryb3BtYWlsLm1lL2FwaS90b2tlbi9nZW5lcmF0ZSDnlLPor7cgMWgg5Luk54mM5bm25YaF5a2Y57yT5a2Y44CCXG4gICAqL1xuICBkcm9wbWFpbEF1dGhUb2tlbj86IHN0cmluZztcbiAgLyoqIOS4uiB0cnVlIOaXtuS4jeiHquWKqOivt+axgiB0b2tlbu+8iOmhu+mFjee9riBkcm9wbWFpbEF1dGhUb2tlbiDmiJbnjq/looPlj5jph4/vvIkgKi9cbiAgZHJvcG1haWxEaXNhYmxlQXV0b1Rva2VuPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOiHquWKqOeuoeeQhuS7pOeJjOWNs+Wwhui/h+acn+aXtu+8jOiwg+eUqCAvYXBpL3Rva2VuL3JlbmV3IOS9v+eUqOeahCBsaWZldGltZe+8iOWmgiAxaOOAgTFk77yJ44CCXG4gICAqIOS5n+WPr+mAmui/h+eOr+Wig+WPmOmHjyBEUk9QTUFJTF9SRU5FV19MSUZFVElNRSDorr7nva7jgIJcbiAgICovXG4gIGRyb3BtYWlsUmVuZXdMaWZldGltZT86IHN0cmluZztcbiAgLyoqXG4gICAqIOiHquWumuS5iSBmZXRjaCDlh73mlbDvvIznlKjkuo7lrozlhajmjqfliLYgSFRUUCDor7fmsYLooYzkuLpcbiAgICog5b2T6K6+572u5LqGIHByb3h5IOS9hueOr+Wig+S4jeaUr+aMgSB1bmRpY2kg5pe277yM5Y+v6YCa6L+H5q2k6YCJ6aG55Lyg5YWl5pSv5oyB5Luj55CG55qEIGZldGNoIOWunueOsFxuICAgKi9cbiAgY3VzdG9tRmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG4gIC8qKiDkuLogZmFsc2Ug5pe25YWz6Zet5Yy/5ZCN55So6YeP5LiK5oql77yb5pyq6K6+572u5pe26buY6K6k5byA5ZCvICovXG4gIHRlbGVtZXRyeUVuYWJsZWQ/OiBib29sZWFuO1xuICAvKiog6Z2e56m65pe26KaG55uW6buY6K6k5LiK5oqlIFVSTCAqL1xuICB0ZWxlbWV0cnlVcmw/OiBzdHJpbmc7XG59XG5cbi8qKiDku47njq/looPlj5jph4/or7vlj5bpu5jorqTphY3nva4gKi9cbmZ1bmN0aW9uIGxvYWRFbnZDb25maWcoKTogU0RLQ29uZmlnIHtcbiAgY29uc3QgY29uZmlnOiBTREtDb25maWcgPSB7fTtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudikge1xuICAgIGlmIChwcm9jZXNzLmVudi5URU1QTUFJTF9QUk9YWSkge1xuICAgICAgY29uZmlnLnByb3h5ID0gcHJvY2Vzcy5lbnYuVEVNUE1BSUxfUFJPWFk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5URU1QTUFJTF9USU1FT1VUKSB7XG4gICAgICBjb25zdCB0ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVEVNUE1BSUxfVElNRU9VVCwgMTApO1xuICAgICAgaWYgKCFpc05hTih0KSAmJiB0ID4gMCkgY29uZmlnLnRpbWVvdXQgPSB0O1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVNUE1BSUxfSU5TRUNVUkUgPT09ICcxJyB8fCBwcm9jZXNzLmVudi5URU1QTUFJTF9JTlNFQ1VSRT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnKSB7XG4gICAgICBjb25maWcuaW5zZWN1cmUgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB0ZSA9IHByb2Nlc3MuZW52LlRFTVBNQUlMX1RFTEVNRVRSWV9FTkFCTEVEPy50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodGUgPT09ICdmYWxzZScgfHwgdGUgPT09ICcwJyB8fCB0ZSA9PT0gJ25vJykge1xuICAgICAgY29uZmlnLnRlbGVtZXRyeUVuYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHRlID09PSAndHJ1ZScgfHwgdGUgPT09ICcxJyB8fCB0ZSA9PT0gJ3llcycpIHtcbiAgICAgIGNvbmZpZy50ZWxlbWV0cnlFbmFibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LlRFTVBNQUlMX1RFTEVNRVRSWV9VUkw/LnRyaW0oKSkge1xuICAgICAgY29uZmlnLnRlbGVtZXRyeVVybCA9IHByb2Nlc3MuZW52LlRFTVBNQUlMX1RFTEVNRVRSWV9VUkwudHJpbSgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnO1xufVxuXG5sZXQgZ2xvYmFsQ29uZmlnOiBTREtDb25maWcgPSBsb2FkRW52Q29uZmlnKCk7XG5cbi8qKlxuICog6K6+572uIFNESyDlhajlsYDphY3nva5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIOS4gOihjOi3s+i/hyBTU0wg6aqM6K+BXG4gKiBzZXRDb25maWcoeyBpbnNlY3VyZTogdHJ1ZSB9KTtcbiAqXG4gKiAvLyDorr7nva7ku6PnkIblkozotoXml7ZcbiAqIHNldENvbmZpZyh7IHByb3h5OiAnaHR0cDovLzEyNy4wLjAuMTo3ODkwJywgdGltZW91dDogMzAwMDAgfSk7XG4gKlxuICogLy8g5L2/55So6Ieq5a6a5LmJIGZldGNo77yI5aaC5pSv5oyB5Luj55CG55qEIHVuZGljae+8iVxuICogaW1wb3J0IHsgUHJveHlBZ2VudCwgZmV0Y2ggYXMgdW5kaWNpRmV0Y2ggfSBmcm9tICd1bmRpY2knO1xuICogY29uc3QgYWdlbnQgPSBuZXcgUHJveHlBZ2VudCgnaHR0cDovLzEyNy4wLjAuMTo3ODkwJyk7XG4gKiBzZXRDb25maWcoeyBjdXN0b21GZXRjaDogKHVybCwgaW5pdCkgPT4gdW5kaWNpRmV0Y2godXJsLCB7IC4uLmluaXQsIGRpc3BhdGNoZXI6IGFnZW50IH0pIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb25maWcoY29uZmlnOiBTREtDb25maWcpOiB2b2lkIHtcbiAgZ2xvYmFsQ29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgLyogTm9kZS5qcyDnjq/looPkuIsgaW5zZWN1cmUg6Ieq5Yqo6K6+572u546v5aKD5Y+Y6YePICovXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYpIHtcbiAgICBpZiAoY29uZmlnLmluc2VjdXJlKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEID0gJzAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRDtcbiAgICB9XG4gIH1cbn1cblxuLyoqIOiOt+WPluW9k+WJjSBTREsg5YWo5bGA6YWN572uICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IFNES0NvbmZpZyB7XG4gIHJldHVybiBnbG9iYWxDb25maWc7XG59XG4iXX0=
|
package/dist/index.d.ts
CHANGED
|
@@ -2,9 +2,11 @@ import { Channel, EmailInfo, GetEmailsResult, GenerateEmailOptions, GetEmailsOpt
|
|
|
2
2
|
import { setConfig, getConfig } from './config';
|
|
3
3
|
export { Channel, EmailInfo, Email, EmailAttachment, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
|
|
4
4
|
export { normalizeEmail } from './normalize';
|
|
5
|
-
export { withRetry, fetchWithTimeout, RetryOptions } from './retry';
|
|
5
|
+
export { withRetry, withRetryWithAttempts, fetchWithTimeout, RetryOptions } from './retry';
|
|
6
|
+
export type { RetryWithAttemptsResult } from './retry';
|
|
6
7
|
export { LogLevel, LogHandler, setLogLevel, getLogLevel, setLogger, logger } from './logger';
|
|
7
8
|
export { SDKConfig, setConfig, getConfig } from './config';
|
|
9
|
+
export { getSdkVersion } from './version';
|
|
8
10
|
export type { SyntheticBrowserProfile } from './providers/linshi-token';
|
|
9
11
|
export { deriveLinshiApiPathKey, randomSyntheticLinshiKey, randomBrowserLikeProfile, syntheticVisitorIdFromProfile, } from './providers/linshi-token';
|
|
10
12
|
/**
|
package/dist/index.js
CHANGED
|
@@ -33,12 +33,13 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.TempEmailClient = exports.syntheticVisitorIdFromProfile = exports.randomBrowserLikeProfile = exports.randomSyntheticLinshiKey = exports.deriveLinshiApiPathKey = exports.getConfig = exports.setConfig = exports.logger = exports.setLogger = exports.getLogLevel = exports.setLogLevel = exports.LogLevel = exports.fetchWithTimeout = exports.withRetry = exports.normalizeEmail = void 0;
|
|
36
|
+
exports.TempEmailClient = exports.syntheticVisitorIdFromProfile = exports.randomBrowserLikeProfile = exports.randomSyntheticLinshiKey = exports.deriveLinshiApiPathKey = exports.getSdkVersion = exports.getConfig = exports.setConfig = exports.logger = exports.setLogger = exports.getLogLevel = exports.setLogLevel = exports.LogLevel = exports.fetchWithTimeout = exports.withRetryWithAttempts = exports.withRetry = exports.normalizeEmail = void 0;
|
|
37
37
|
exports.listChannels = listChannels;
|
|
38
38
|
exports.getChannelInfo = getChannelInfo;
|
|
39
39
|
exports.generateEmail = generateEmail;
|
|
40
40
|
exports.getEmails = getEmails;
|
|
41
41
|
const tempmail = __importStar(require("./providers/tempmail"));
|
|
42
|
+
const tempmailCn = __importStar(require("./providers/tempmail-cn"));
|
|
42
43
|
const linshiEmail = __importStar(require("./providers/linshi-email"));
|
|
43
44
|
const linshiyou = __importStar(require("./providers/linshiyou"));
|
|
44
45
|
const mffac = __importStar(require("./providers/mffac"));
|
|
@@ -59,6 +60,7 @@ const vip215 = __importStar(require("./providers/vip-215"));
|
|
|
59
60
|
const anonbox = __importStar(require("./providers/anonbox"));
|
|
60
61
|
const fakeLegal = __importStar(require("./providers/fake-legal"));
|
|
61
62
|
const retry_1 = require("./retry");
|
|
63
|
+
const telemetry_1 = require("./telemetry");
|
|
62
64
|
const logger_1 = require("./logger");
|
|
63
65
|
const config_1 = require("./config");
|
|
64
66
|
/**
|
|
@@ -72,6 +74,7 @@ var normalize_1 = require("./normalize");
|
|
|
72
74
|
Object.defineProperty(exports, "normalizeEmail", { enumerable: true, get: function () { return normalize_1.normalizeEmail; } });
|
|
73
75
|
var retry_2 = require("./retry");
|
|
74
76
|
Object.defineProperty(exports, "withRetry", { enumerable: true, get: function () { return retry_2.withRetry; } });
|
|
77
|
+
Object.defineProperty(exports, "withRetryWithAttempts", { enumerable: true, get: function () { return retry_2.withRetryWithAttempts; } });
|
|
75
78
|
Object.defineProperty(exports, "fetchWithTimeout", { enumerable: true, get: function () { return retry_2.fetchWithTimeout; } });
|
|
76
79
|
var logger_2 = require("./logger");
|
|
77
80
|
Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return logger_2.LogLevel; } });
|
|
@@ -82,16 +85,19 @@ Object.defineProperty(exports, "logger", { enumerable: true, get: function () {
|
|
|
82
85
|
var config_2 = require("./config");
|
|
83
86
|
Object.defineProperty(exports, "setConfig", { enumerable: true, get: function () { return config_2.setConfig; } });
|
|
84
87
|
Object.defineProperty(exports, "getConfig", { enumerable: true, get: function () { return config_2.getConfig; } });
|
|
88
|
+
var version_1 = require("./version");
|
|
89
|
+
Object.defineProperty(exports, "getSdkVersion", { enumerable: true, get: function () { return version_1.getSdkVersion; } });
|
|
85
90
|
var linshi_token_1 = require("./providers/linshi-token");
|
|
86
91
|
Object.defineProperty(exports, "deriveLinshiApiPathKey", { enumerable: true, get: function () { return linshi_token_1.deriveLinshiApiPathKey; } });
|
|
87
92
|
Object.defineProperty(exports, "randomSyntheticLinshiKey", { enumerable: true, get: function () { return linshi_token_1.randomSyntheticLinshiKey; } });
|
|
88
93
|
Object.defineProperty(exports, "randomBrowserLikeProfile", { enumerable: true, get: function () { return linshi_token_1.randomBrowserLikeProfile; } });
|
|
89
94
|
Object.defineProperty(exports, "syntheticVisitorIdFromProfile", { enumerable: true, get: function () { return linshi_token_1.syntheticVisitorIdFromProfile; } });
|
|
90
95
|
/** 所有支持的渠道列表,用于随机选择和遍历 */
|
|
91
|
-
const allChannels = ['tempmail', 'linshi-email', 'linshiyou', 'mffac', 'tempmail-lol', 'chatgpt-org-uk', 'temp-mail-io', 'awamail', 'temporary-email-org', 'mail-tm', 'mail-cx', 'dropmail', 'guerrillamail', 'maildrop', 'smail-pw', 'boomlify', 'minmail', 'vip-215', 'anonbox', 'fake-legal'];
|
|
96
|
+
const allChannels = ['tempmail', 'tempmail-cn', 'linshi-email', 'linshiyou', 'mffac', 'tempmail-lol', 'chatgpt-org-uk', 'temp-mail-io', 'awamail', 'temporary-email-org', 'mail-tm', 'mail-cx', 'dropmail', 'guerrillamail', 'maildrop', 'smail-pw', 'boomlify', 'minmail', 'vip-215', 'anonbox', 'fake-legal'];
|
|
92
97
|
/** 渠道信息映射表 */
|
|
93
98
|
const channelInfoMap = {
|
|
94
99
|
'tempmail': { channel: 'tempmail', name: 'TempMail', website: 'tempmail.ing' },
|
|
100
|
+
'tempmail-cn': { channel: 'tempmail-cn', name: 'TempMail CN', website: 'tempmail.cn' },
|
|
95
101
|
'linshi-email': { channel: 'linshi-email', name: '临时邮箱', website: 'linshi-email.com' },
|
|
96
102
|
'linshiyou': { channel: 'linshiyou', name: '临时邮', website: 'linshiyou.com' },
|
|
97
103
|
'tempmail-lol': { channel: 'tempmail-lol', name: 'TempMail LOL', website: 'tempmail.lol' },
|
|
@@ -161,11 +167,16 @@ async function generateEmail(options = {}) {
|
|
|
161
167
|
*/
|
|
162
168
|
const allowFallback = options.channelFallback !== false;
|
|
163
169
|
const tryOrder = buildChannelOrder(options.channel, allowFallback);
|
|
170
|
+
let channelsTried = 0;
|
|
171
|
+
let lastErr = '';
|
|
164
172
|
for (const ch of tryOrder) {
|
|
173
|
+
channelsTried += 1;
|
|
165
174
|
logger_1.logger.info(`创建临时邮箱, 渠道: ${ch}`);
|
|
166
|
-
|
|
167
|
-
|
|
175
|
+
const r = await (0, retry_1.withRetryWithAttempts)(() => generateEmailOnce(ch, options), options.retry);
|
|
176
|
+
if (r.ok) {
|
|
177
|
+
const internal = r.value;
|
|
168
178
|
logger_1.logger.info(`邮箱创建成功: ${internal.email} (渠道: ${ch})`);
|
|
179
|
+
(0, telemetry_1.reportTelemetry)('generate_email', ch, true, r.attempts, channelsTried, '');
|
|
169
180
|
/* 将 token 存入内部存储,不暴露给用户 */
|
|
170
181
|
const publicInfo = {
|
|
171
182
|
channel: internal.channel,
|
|
@@ -178,11 +189,12 @@ async function generateEmail(options = {}) {
|
|
|
178
189
|
}
|
|
179
190
|
return publicInfo;
|
|
180
191
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}
|
|
192
|
+
const msg = r.error?.message || String(r.error);
|
|
193
|
+
lastErr = msg;
|
|
194
|
+
logger_1.logger.warn(`渠道 ${ch} 不可用: ${msg},尝试下一个渠道`);
|
|
184
195
|
}
|
|
185
196
|
logger_1.logger.error('所有渠道均不可用,创建邮箱失败');
|
|
197
|
+
(0, telemetry_1.reportTelemetry)('generate_email', '', false, 0, channelsTried, lastErr);
|
|
186
198
|
return null;
|
|
187
199
|
}
|
|
188
200
|
/**
|
|
@@ -209,6 +221,8 @@ async function generateEmailOnce(channel, options) {
|
|
|
209
221
|
switch (channel) {
|
|
210
222
|
case 'tempmail':
|
|
211
223
|
return tempmail.generateEmail(options.duration || 30);
|
|
224
|
+
case 'tempmail-cn':
|
|
225
|
+
return tempmailCn.generateEmail(options.domain ?? null);
|
|
212
226
|
case 'linshi-email':
|
|
213
227
|
return linshiEmail.generateEmail();
|
|
214
228
|
case 'linshiyou':
|
|
@@ -273,35 +287,41 @@ async function generateEmailOnce(channel, options) {
|
|
|
273
287
|
*/
|
|
274
288
|
async function getEmails(info, options) {
|
|
275
289
|
if (!info) {
|
|
290
|
+
(0, telemetry_1.reportTelemetry)('get_emails', '', false, 0, 0, 'EmailInfo is required, call generateEmail() first');
|
|
276
291
|
throw new Error('EmailInfo is required, call generateEmail() first');
|
|
277
292
|
}
|
|
278
293
|
const { channel, email } = info;
|
|
279
294
|
const token = tokenStore.get(info);
|
|
280
295
|
if (!channel) {
|
|
296
|
+
(0, telemetry_1.reportTelemetry)('get_emails', '', false, 0, 0, 'Channel is required');
|
|
281
297
|
throw new Error('Channel is required');
|
|
282
298
|
}
|
|
283
299
|
if (!email && channel !== 'tempmail-lol') {
|
|
300
|
+
(0, telemetry_1.reportTelemetry)('get_emails', channel, false, 0, 0, 'Email is required');
|
|
284
301
|
throw new Error('Email is required');
|
|
285
302
|
}
|
|
286
303
|
logger_1.logger.debug(`获取邮件, 渠道: ${channel}, 邮箱: ${email}`);
|
|
287
|
-
|
|
288
|
-
|
|
304
|
+
const gr = await (0, retry_1.withRetryWithAttempts)(() => getEmailsOnce(channel, email, token), options?.retry);
|
|
305
|
+
if (gr.ok) {
|
|
306
|
+
const emails = gr.value;
|
|
289
307
|
if (emails.length > 0) {
|
|
290
308
|
logger_1.logger.info(`获取到 ${emails.length} 封邮件, 渠道: ${channel}`);
|
|
291
309
|
}
|
|
292
310
|
else {
|
|
293
311
|
logger_1.logger.debug(`暂无邮件, 渠道: ${channel}`);
|
|
294
312
|
}
|
|
313
|
+
(0, telemetry_1.reportTelemetry)('get_emails', channel, true, gr.attempts, 0, '');
|
|
295
314
|
return { channel, email, emails, success: true };
|
|
296
315
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
316
|
+
const err = gr.error;
|
|
317
|
+
const errMsg = err?.message || String(err);
|
|
318
|
+
/*
|
|
319
|
+
* 重试耗尽后仍然失败 → 返回空结果而非抛异常
|
|
320
|
+
* 这样调用方在轮询场景下不会因为一次网络波动而中断整个流程
|
|
321
|
+
*/
|
|
322
|
+
logger_1.logger.error(`获取邮件失败, 渠道: ${channel}, 错误: ${errMsg}`);
|
|
323
|
+
(0, telemetry_1.reportTelemetry)('get_emails', channel, false, gr.attempts, 0, errMsg);
|
|
324
|
+
return { channel, email, emails: [], success: false };
|
|
305
325
|
}
|
|
306
326
|
/**
|
|
307
327
|
* 单次获取邮件(不含重试逻辑)
|
|
@@ -311,6 +331,8 @@ async function getEmailsOnce(channel, email, token) {
|
|
|
311
331
|
switch (channel) {
|
|
312
332
|
case 'tempmail':
|
|
313
333
|
return tempmail.getEmails(email);
|
|
334
|
+
case 'tempmail-cn':
|
|
335
|
+
return tempmailCn.getEmails(email);
|
|
314
336
|
case 'linshi-email':
|
|
315
337
|
if (!token)
|
|
316
338
|
throw new Error('internal error: token missing for linshi-email');
|
|
@@ -421,6 +443,7 @@ class TempEmailClient {
|
|
|
421
443
|
*/
|
|
422
444
|
async getEmails(options) {
|
|
423
445
|
if (!this.emailInfo) {
|
|
446
|
+
(0, telemetry_1.reportTelemetry)('get_emails', '', false, 0, 0, 'No email generated. Call generate() first.');
|
|
424
447
|
throw new Error('No email generated. Call generate() first.');
|
|
425
448
|
}
|
|
426
449
|
return getEmails(this.emailInfo, options);
|
|
@@ -443,4 +466,4 @@ exports.default = {
|
|
|
443
466
|
setConfig: config_1.setConfig,
|
|
444
467
|
getConfig: config_1.getConfig,
|
|
445
468
|
};
|
|
446
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0dBLG9DQUVDO0FBUUQsd0NBRUM7QUFvQkQsc0NBaUNDO0FBMEZELDhCQWdDQztBQTNSRCwrREFBaUQ7QUFDakQsc0VBQXdEO0FBQ3hELGlFQUFtRDtBQUNuRCx5REFBMkM7QUFDM0Msc0VBQXdEO0FBQ3hELHlFQUEyRDtBQUMzRCxxRUFBdUQ7QUFDdkQsNkRBQStDO0FBQy9DLG1GQUFxRTtBQUNyRSw0REFBOEM7QUFDOUMsNERBQThDO0FBQzlDLCtEQUFpRDtBQUNqRCx5RUFBMkQ7QUFDM0QsdUVBQXlEO0FBQ3pELDhEQUFnRDtBQUNoRCwrREFBaUQ7QUFDakQsNkRBQStDO0FBQy9DLDREQUE4QztBQUM5Qyw2REFBK0M7QUFDL0Msa0VBQW9EO0FBRXBELG1DQUFvQztBQUNwQyxxQ0FBa0M7QUFDbEMscUNBQWdEO0FBSWhEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7QUFDcEQseUNBQTZDO0FBQXBDLDJHQUFBLGNBQWMsT0FBQTtBQUN2QixpQ0FBb0U7QUFBM0Qsa0dBQUEsU0FBUyxPQUFBO0FBQUUseUdBQUEsZ0JBQWdCLE9BQUE7QUFDcEMsbUNBQTZGO0FBQXBGLGtHQUFBLFFBQVEsT0FBQTtBQUFjLHFHQUFBLFdBQVcsT0FBQTtBQUFFLHFHQUFBLFdBQVcsT0FBQTtBQUFFLG1HQUFBLFNBQVMsT0FBQTtBQUFFLGdHQUFBLE1BQU0sT0FBQTtBQUMxRSxtQ0FBMkQ7QUFBdkMsbUdBQUEsU0FBUyxPQUFBO0FBQUUsbUdBQUEsU0FBUyxPQUFBO0FBRXhDLHlEQUtrQztBQUpoQyxzSEFBQSxzQkFBc0IsT0FBQTtBQUN0Qix3SEFBQSx3QkFBd0IsT0FBQTtBQUN4Qix3SEFBQSx3QkFBd0IsT0FBQTtBQUN4Qiw2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T0FHRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBbENELDBDQWtDQztBQUVELGtCQUFlO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULGVBQWU7SUFDZixTQUFTLEVBQVQsa0JBQVM7SUFDVCxTQUFTLEVBQVQsa0JBQVM7Q0FDVixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdGVtcG1haWwgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwnO1xuaW1wb3J0ICogYXMgbGluc2hpRW1haWwgZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLWVtYWlsJztcbmltcG9ydCAqIGFzIGxpbnNoaXlvdSBmcm9tICcuL3Byb3ZpZGVycy9saW5zaGl5b3UnO1xuaW1wb3J0ICogYXMgbWZmYWMgZnJvbSAnLi9wcm92aWRlcnMvbWZmYWMnO1xuaW1wb3J0ICogYXMgdGVtcG1haWxMb2wgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwtbG9sJztcbmltcG9ydCAqIGFzIGNoYXRncHRPcmdVayBmcm9tICcuL3Byb3ZpZGVycy9jaGF0Z3B0LW9yZy11ayc7XG5pbXBvcnQgKiBhcyB0ZW1wTWFpbElPIGZyb20gJy4vcHJvdmlkZXJzL3RlbXAtbWFpbC1pbyc7XG5pbXBvcnQgKiBhcyBhd2FtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2F3YW1haWwnO1xuaW1wb3J0ICogYXMgdGVtcG9yYXJ5RW1haWxPcmcgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG9yYXJ5LWVtYWlsLW9yZyc7XG5pbXBvcnQgKiBhcyBtYWlsVG0gZnJvbSAnLi9wcm92aWRlcnMvbWFpbC10bSc7XG5pbXBvcnQgKiBhcyBtYWlsQ3ggZnJvbSAnLi9wcm92aWRlcnMvbWFpbC1jeCc7XG5pbXBvcnQgKiBhcyBkcm9wbWFpbCBmcm9tICcuL3Byb3ZpZGVycy9kcm9wbWFpbCc7XG5pbXBvcnQgKiBhcyBndWVycmlsbGFtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2d1ZXJyaWxsYW1haWwnO1xuaW1wb3J0ICogYXMgbWFpbGRyb3BQcm92aWRlciBmcm9tICcuL3Byb3ZpZGVycy9tYWlsZHJvcCc7XG5pbXBvcnQgKiBhcyBzbWFpbFB3IGZyb20gJy4vcHJvdmlkZXJzL3NtYWlsLXB3JztcbmltcG9ydCAqIGFzIGJvb21saWZ5IGZyb20gJy4vcHJvdmlkZXJzL2Jvb21saWZ5JztcbmltcG9ydCAqIGFzIG1pbm1haWwgZnJvbSAnLi9wcm92aWRlcnMvbWlubWFpbCc7XG5pbXBvcnQgKiBhcyB2aXAyMTUgZnJvbSAnLi9wcm92aWRlcnMvdmlwLTIxNSc7XG5pbXBvcnQgKiBhcyBhbm9uYm94IGZyb20gJy4vcHJvdmlkZXJzL2Fub25ib3gnO1xuaW1wb3J0ICogYXMgZmFrZUxlZ2FsIGZyb20gJy4vcHJvdmlkZXJzL2Zha2UtbGVnYWwnO1xuaW1wb3J0IHsgQ2hhbm5lbCwgRW1haWxJbmZvLCBJbnRlcm5hbEVtYWlsSW5mbywgRW1haWwsIEdldEVtYWlsc1Jlc3VsdCwgR2VuZXJhdGVFbWFpbE9wdGlvbnMsIEdldEVtYWlsc09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJy4vcmV0cnknO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc2V0Q29uZmlnLCBnZXRDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmV4cG9ydCB7IENoYW5uZWwsIEVtYWlsSW5mbywgRW1haWwsIEVtYWlsQXR0YWNobWVudCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNESyDlhoXpg6ggdG9rZW4g5a2Y5YKoXG4gKiDkvb/nlKggV2Vha01hcCDlsIYgRW1haWxJbmZvIOWvueixoeaYoOWwhOWIsOWvueW6lOeahCB0b2tlblxuICog55So5oi35peg5rOV55u05o6l6K6/6ZeuIHRva2Vu77yM55SxIFNESyDoh6rliqjnrqHnkIZcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCB0b2tlblN0b3JlID0gbmV3IFdlYWtNYXA8RW1haWxJbmZvLCBzdHJpbmc+KCk7XG5leHBvcnQgeyBub3JtYWxpemVFbWFpbCB9IGZyb20gJy4vbm9ybWFsaXplJztcbmV4cG9ydCB7IHdpdGhSZXRyeSwgZmV0Y2hXaXRoVGltZW91dCwgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi9yZXRyeSc7XG5leHBvcnQgeyBMb2dMZXZlbCwgTG9nSGFuZGxlciwgc2V0TG9nTGV2ZWwsIGdldExvZ0xldmVsLCBzZXRMb2dnZXIsIGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCB7IFNES0NvbmZpZywgc2V0Q29uZmlnLCBnZXRDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5leHBvcnQgdHlwZSB7IFN5bnRoZXRpY0Jyb3dzZXJQcm9maWxlIH0gZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLXRva2VuJztcbmV4cG9ydCB7XG4gIGRlcml2ZUxpbnNoaUFwaVBhdGhLZXksXG4gIHJhbmRvbVN5bnRoZXRpY0xpbnNoaUtleSxcbiAgcmFuZG9tQnJvd3Nlckxpa2VQcm9maWxlLFxuICBzeW50aGV0aWNWaXNpdG9ySWRGcm9tUHJvZmlsZSxcbn0gZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLXRva2VuJztcblxuLyoqIOaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqO+8jOeUqOS6jumaj+acuumAieaLqeWSjOmBjeWOhiAqL1xuY29uc3QgYWxsQ2hhbm5lbHM6IENoYW5uZWxbXSA9IFsndGVtcG1haWwnLCAnbGluc2hpLWVtYWlsJywgJ2xpbnNoaXlvdScsICdtZmZhYycsICd0ZW1wbWFpbC1sb2wnLCAnY2hhdGdwdC1vcmctdWsnLCAndGVtcC1tYWlsLWlvJywgJ2F3YW1haWwnLCAndGVtcG9yYXJ5LWVtYWlsLW9yZycsICdtYWlsLXRtJywgJ21haWwtY3gnLCAnZHJvcG1haWwnLCAnZ3VlcnJpbGxhbWFpbCcsICdtYWlsZHJvcCcsICdzbWFpbC1wdycsICdib29tbGlmeScsICdtaW5tYWlsJywgJ3ZpcC0yMTUnLCAnYW5vbmJveCcsICdmYWtlLWxlZ2FsJ107XG5cbi8qKlxuICog5rig6YGT5L+h5oGv77yM5YyF5ZCr5rig6YGT5qCH6K+G44CB5pi+56S65ZCN56ew5ZKM5a+55bqU572R56uZXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbm5lbEluZm8ge1xuICAvKiog5rig6YGT5qCH6K+GICovXG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIC8qKiDmuKDpgZPmmL7npLrlkI3np7AgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiog5a+55bqU55qE5Li05pe26YKu566x5pyN5Yqh572R56uZICovXG4gIHdlYnNpdGU6IHN0cmluZztcbn1cblxuLyoqIOa4oOmBk+S/oeaBr+aYoOWwhOihqCAqL1xuY29uc3QgY2hhbm5lbEluZm9NYXA6IFJlY29yZDxDaGFubmVsLCBDaGFubmVsSW5mbz4gPSB7XG4gICd0ZW1wbWFpbCc6IHsgY2hhbm5lbDogJ3RlbXBtYWlsJywgbmFtZTogJ1RlbXBNYWlsJywgd2Vic2l0ZTogJ3RlbXBtYWlsLmluZycgfSxcbiAgJ2xpbnNoaS1lbWFpbCc6IHsgY2hhbm5lbDogJ2xpbnNoaS1lbWFpbCcsIG5hbWU6ICfkuLTml7bpgq7nrrEnLCB3ZWJzaXRlOiAnbGluc2hpLWVtYWlsLmNvbScgfSxcbiAgJ2xpbnNoaXlvdSc6IHsgY2hhbm5lbDogJ2xpbnNoaXlvdScsIG5hbWU6ICfkuLTml7bpgq4nLCB3ZWJzaXRlOiAnbGluc2hpeW91LmNvbScgfSxcbiAgJ3RlbXBtYWlsLWxvbCc6IHsgY2hhbm5lbDogJ3RlbXBtYWlsLWxvbCcsIG5hbWU6ICdUZW1wTWFpbCBMT0wnLCB3ZWJzaXRlOiAndGVtcG1haWwubG9sJyB9LFxuICAnY2hhdGdwdC1vcmctdWsnOiB7IGNoYW5uZWw6ICdjaGF0Z3B0LW9yZy11aycsIG5hbWU6ICdDaGF0R1BUIE1haWwnLCB3ZWJzaXRlOiAnbWFpbC5jaGF0Z3B0Lm9yZy51aycgfSxcbiAgJ3RlbXAtbWFpbC1pbyc6IHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycsIG5hbWU6ICdUZW1wIE1haWwgSU8nLCB3ZWJzaXRlOiAndGVtcC1tYWlsLmlvJyB9LFxuICAnYXdhbWFpbCc6IHsgY2hhbm5lbDogJ2F3YW1haWwnLCBuYW1lOiAnQXdhTWFpbCcsIHdlYnNpdGU6ICdhd2FtYWlsLmNvbScgfSxcbiAgJ3RlbXBvcmFyeS1lbWFpbC1vcmcnOiB7IGNoYW5uZWw6ICd0ZW1wb3JhcnktZW1haWwtb3JnJywgbmFtZTogJ1RlbXBvcmFyeSBFbWFpbCcsIHdlYnNpdGU6ICd0ZW1wb3JhcnktZW1haWwub3JnJyB9LFxuICAnbWFpbC10bSc6IHsgY2hhbm5lbDogJ21haWwtdG0nLCBuYW1lOiAnTWFpbC50bScsIHdlYnNpdGU6ICdtYWlsLnRtJyB9LFxuICAnbWFpbC1jeCc6IHsgY2hhbm5lbDogJ21haWwtY3gnLCBuYW1lOiAnTWFpbC5jeCcsIHdlYnNpdGU6ICdtYWlsLmN4JyB9LFxuICAnZHJvcG1haWwnOiB7IGNoYW5uZWw6ICdkcm9wbWFpbCcsIG5hbWU6ICdEcm9wTWFpbCcsIHdlYnNpdGU6ICdkcm9wbWFpbC5tZScgfSxcbiAgJ2d1ZXJyaWxsYW1haWwnOiB7IGNoYW5uZWw6ICdndWVycmlsbGFtYWlsJywgbmFtZTogJ0d1ZXJyaWxsYSBNYWlsJywgd2Vic2l0ZTogJ2d1ZXJyaWxsYW1haWwuY29tJyB9LFxuICAnbWFpbGRyb3AnOiB7IGNoYW5uZWw6ICdtYWlsZHJvcCcsIG5hbWU6ICdNYWlsZHJvcCcsIHdlYnNpdGU6ICdtYWlsZHJvcC5jeCcgfSxcbiAgJ3NtYWlsLXB3JzogeyBjaGFubmVsOiAnc21haWwtcHcnLCBuYW1lOiAnU21haWwucHcnLCB3ZWJzaXRlOiAnc21haWwucHcnIH0sXG4gICdib29tbGlmeSc6IHsgY2hhbm5lbDogJ2Jvb21saWZ5JywgbmFtZTogJ0Jvb21saWZ5Jywgd2Vic2l0ZTogJ2Jvb21saWZ5LmNvbScgfSxcbiAgJ21pbm1haWwnOiB7IGNoYW5uZWw6ICdtaW5tYWlsJywgbmFtZTogJ01pbk1haWwnLCB3ZWJzaXRlOiAnbWlubWFpbC5hcHAnIH0sXG4gICdtZmZhYyc6IHsgY2hhbm5lbDogJ21mZmFjJywgbmFtZTogJ01GRkFDJywgd2Vic2l0ZTogJ21mZmFjLmNvbScgfSxcbiAgJ3ZpcC0yMTUnOiB7IGNoYW5uZWw6ICd2aXAtMjE1JywgbmFtZTogJ1ZJUCAyMTUnLCB3ZWJzaXRlOiAndmlwLjIxNS5pbScgfSxcbiAgJ2Fub25ib3gnOiB7IGNoYW5uZWw6ICdhbm9uYm94JywgbmFtZTogJ0Fub25ib3gnLCB3ZWJzaXRlOiAnYW5vbmJveC5uZXQnIH0sXG4gICdmYWtlLWxlZ2FsJzogeyBjaGFubmVsOiAnZmFrZS1sZWdhbCcsIG5hbWU6ICdGYWtlIExlZ2FsJywgd2Vic2l0ZTogJ2Zha2UubGVnYWwnIH0sXG59O1xuXG4vKipcbiAqIOiOt+WPluaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqFxuICpcbiAqIEByZXR1cm5zIOaJgOaciea4oOmBk+eahOS/oeaBr+aVsOe7hFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgY2hhbm5lbHMgPSBsaXN0Q2hhbm5lbHMoKTtcbiAqIGNoYW5uZWxzLmZvckVhY2goY2ggPT4gY29uc29sZS5sb2coYCR7Y2gubmFtZX0gKCR7Y2gud2Vic2l0ZX0pYCkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0Q2hhbm5lbHMoKTogQ2hhbm5lbEluZm9bXSB7XG4gIHJldHVybiBhbGxDaGFubmVscy5tYXAoY2ggPT4gY2hhbm5lbEluZm9NYXBbY2hdKTtcbn1cblxuLyoqXG4gKiDojrflj5bmjIflrprmuKDpgZPnmoTor6bnu4bkv6Hmga9cbiAqXG4gKiBAcGFyYW0gY2hhbm5lbCAtIOa4oOmBk+agh+ivhlxuICogQHJldHVybnMg5rig6YGT5L+h5oGv77yM5LiN5a2Y5Zyo5pe26L+U5ZueIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hhbm5lbEluZm8oY2hhbm5lbDogQ2hhbm5lbCk6IENoYW5uZWxJbmZvIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNoYW5uZWxJbmZvTWFwW2NoYW5uZWxdO1xufVxuXG4vKipcbiAqIOWIm+W7uuS4tOaXtumCrueusVxuICpcbiAqIOmUmeivr+WkhOeQhuetlueVpe+8mlxuICogLSDmjIflrprmuKDpgZPlpLHotKXml7bvvIzpu5jorqToh6rliqjlsJ3or5Xlhbbku5blj6/nlKjmuKDpgZPvvIjmiZPkubHpobrluo/pgJDkuKrlsJ3or5XvvIlcbiAqIC0gYGNoYW5uZWxGYWxsYmFjazogZmFsc2VgIOS4lOaMh+WumuS6hiBgY2hhbm5lbGAg5pe277yM5LuF5bCd6K+V6K+l5rig6YGT77yM5aSx6LSl5Y2z6L+U5ZueIG51bGxcbiAqIC0g5pyq5oyH5a6a5rig6YGT5pe277yM5omT5Lmx5YWo6YOo5rig6YGT6YCQ5Liq5bCd6K+V77yM55u05Yiw5oiQ5YqfXG4gKiAtIOaJgOaciea4oOmBk+Wdh+S4jeWPr+eUqOaXtui/lOWbniBudWxs77yI5LiN5oqb5Ye65byC5bi477yJXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSDliJvlu7rpgInpobnvvIzlj6/mjIflrprmuKDpgZPjgIHmnInmlYjml7bplb/jgIHln5/lkI3nrYlcbiAqIEByZXR1cm5zIOmCrueuseS/oeaBr++8jOaJgOaciea4oOmBk+Wdh+S4jeWPr+eUqOaXtui/lOWbniBudWxsXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBlbWFpbEluZm8gPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycgfSk7XG4gKiBpZiAoZW1haWxJbmZvKSBjb25zb2xlLmxvZyhlbWFpbEluZm8uZW1haWwpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbyB8IG51bGw+IHtcbiAgLypcbiAgICog5p6E5bu65bCd6K+V6aG65bqP77yaXG4gICAqIC0g5oyH5a6a5rig6YGTIOKGkiDkvJjlhYjlsJ3or5Xor6XmuKDpgZPvvIzlpLHotKXlkI7pmo/mnLrlsJ3or5Xlhbbku5bmuKDpgZNcbiAgICogLSDmnKrmjIflrpog4oaSIOaJk+S5seWFqOmDqOa4oOmBk+mAkOS4quWwneivlVxuICAgKi9cbiAgY29uc3QgYWxsb3dGYWxsYmFjayA9IG9wdGlvbnMuY2hhbm5lbEZhbGxiYWNrICE9PSBmYWxzZTtcbiAgY29uc3QgdHJ5T3JkZXIgPSBidWlsZENoYW5uZWxPcmRlcihvcHRpb25zLmNoYW5uZWwsIGFsbG93RmFsbGJhY2spO1xuXG4gIGZvciAoY29uc3QgY2ggb2YgdHJ5T3JkZXIpIHtcbiAgICBsb2dnZXIuaW5mbyhg5Yib5bu65Li05pe26YKu566xLCDmuKDpgZM6ICR7Y2h9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGludGVybmFsOiBJbnRlcm5hbEVtYWlsSW5mbyA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnZW5lcmF0ZUVtYWlsT25jZShjaCwgb3B0aW9ucyksIG9wdGlvbnMucmV0cnkpO1xuICAgICAgbG9nZ2VyLmluZm8oYOmCrueuseWIm+W7uuaIkOWKnzogJHtpbnRlcm5hbC5lbWFpbH0gKOa4oOmBkzogJHtjaH0pYCk7XG5cbiAgICAgIC8qIOWwhiB0b2tlbiDlrZjlhaXlhoXpg6jlrZjlgqjvvIzkuI3mmrTpnLLnu5nnlKjmiLcgKi9cbiAgICAgIGNvbnN0IHB1YmxpY0luZm86IEVtYWlsSW5mbyA9IHtcbiAgICAgICAgY2hhbm5lbDogaW50ZXJuYWwuY2hhbm5lbCxcbiAgICAgICAgZW1haWw6IGludGVybmFsLmVtYWlsLFxuICAgICAgICBleHBpcmVzQXQ6IGludGVybmFsLmV4cGlyZXNBdCxcbiAgICAgICAgY3JlYXRlZEF0OiBpbnRlcm5hbC5jcmVhdGVkQXQsXG4gICAgICB9O1xuICAgICAgaWYgKGludGVybmFsLnRva2VuKSB7XG4gICAgICAgIHRva2VuU3RvcmUuc2V0KHB1YmxpY0luZm8sIGludGVybmFsLnRva2VuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwdWJsaWNJbmZvO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBsb2dnZXIud2Fybihg5rig6YGTICR7Y2h9IOS4jeWPr+eUqDogJHtlcnIubWVzc2FnZSB8fCBlcnJ977yM5bCd6K+V5LiL5LiA5Liq5rig6YGTYCk7XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmVycm9yKCfmiYDmnInmuKDpgZPlnYfkuI3lj6/nlKjvvIzliJvlu7rpgq7nrrHlpLHotKUnKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICog5p6E5bu65rig6YGT5bCd6K+V6aG65bqPXG4gKiDmjIflrprmuKDpgZPml7bkvJjlhYjlsJ3or5Xor6XmuKDpgZPvvIzlhbbkvZnmuKDpgZPmiZPkubHov73liqBcbiAqIOacquaMh+WumuaXtuaJk+S5seWFqOmDqOa4oOmBk1xuICovXG5mdW5jdGlvbiBidWlsZENoYW5uZWxPcmRlcihwcmVmZXJyZWQ/OiBDaGFubmVsLCBhbGxvd0ZhbGxiYWNrID0gdHJ1ZSk6IENoYW5uZWxbXSB7XG4gIGNvbnN0IHNodWZmbGVkID0gWy4uLmFsbENoYW5uZWxzXS5zb3J0KCgpID0+IE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICBpZiAoIXByZWZlcnJlZCkge1xuICAgIHJldHVybiBzaHVmZmxlZDtcbiAgfVxuICBpZiAoIWFsbG93RmFsbGJhY2spIHtcbiAgICByZXR1cm4gW3ByZWZlcnJlZF07XG4gIH1cbiAgY29uc3QgcmVzdCA9IHNodWZmbGVkLmZpbHRlcihjaCA9PiBjaCAhPT0gcHJlZmVycmVkKTtcbiAgcmV0dXJuIFtwcmVmZXJyZWQsIC4uLnJlc3RdO1xufVxuXG4vKipcbiAqIOWNleasoeWIm+W7uumCrueuse+8iOS4jeWQq+mHjeivlemAu+i+ke+8iVxuICog5qC55o2u5rig6YGT57G75Z6L5YiG5Y+R5Yiw5a+55bqU55qEIHByb3ZpZGVyIOWunueOsFxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsT25jZShjaGFubmVsOiBDaGFubmVsLCBvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyk6IFByb21pc2U8SW50ZXJuYWxFbWFpbEluZm8+IHtcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kdXJhdGlvbiB8fCAzMCk7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIHJldHVybiBsaW5zaGlFbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnbGluc2hpeW91JzpcbiAgICAgIHJldHVybiBsaW5zaGl5b3UuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBtYWlsLWxvbCc6XG4gICAgICByZXR1cm4gdGVtcG1haWxMb2wuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiB8fCBudWxsKTtcbiAgICBjYXNlICdjaGF0Z3B0LW9yZy11ayc6XG4gICAgICByZXR1cm4gY2hhdGdwdE9yZ1VrLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2F3YW1haWwnOlxuICAgICAgcmV0dXJuIGF3YW1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBvcmFyeS1lbWFpbC1vcmcnOlxuICAgICAgcmV0dXJuIHRlbXBvcmFyeUVtYWlsT3JnLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdtYWlsLXRtJzpcbiAgICAgIHJldHVybiBtYWlsVG0uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2Ryb3BtYWlsJzpcbiAgICAgIHJldHVybiBkcm9wbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZ3VlcnJpbGxhbWFpbCc6XG4gICAgICByZXR1cm4gZ3VlcnJpbGxhbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnbWFpbGRyb3AnOlxuICAgICAgcmV0dXJuIG1haWxkcm9wUHJvdmlkZXIuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiA/PyBudWxsKTtcbiAgICBjYXNlICdzbWFpbC1wdyc6XG4gICAgICByZXR1cm4gc21haWxQdy5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnYm9vbWxpZnknOlxuICAgICAgcmV0dXJuIGJvb21saWZ5LmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdtZmZhYyc6XG4gICAgICByZXR1cm4gbWZmYWMuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ21pbm1haWwnOlxuICAgICAgcmV0dXJuIG1pbm1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3ZpcC0yMTUnOlxuICAgICAgcmV0dXJuIHZpcDIxNS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnYW5vbmJveCc6XG4gICAgICByZXR1cm4gYW5vbmJveC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZmFrZS1sZWdhbCc6XG4gICAgICByZXR1cm4gZmFrZUxlZ2FsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kb21haW4gPz8gbnVsbCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaGFubmVsOiAke2NoYW5uZWx9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooahcbiAqIENoYW5uZWwvRW1haWwvVG9rZW4g562J55SxIFNESyDku44gRW1haWxJbmZvIOS4reiHquWKqOiOt+WPlu+8jOeUqOaIt+aXoOmcgOaJi+WKqOS8oOmAklxuICpcbiAqIOmUmeivr+WkhOeQhuetlueVpe+8mlxuICogLSDnvZHnu5zplJnor6/jgIHotoXml7bjgIE0MjnjgIHmnI3liqHnq68gNXh4IOmUmeivryDihpIg6Ieq5Yqo6YeN6K+V77yI6buY6K6kIDIg5qyh77yJXG4gKiAtIOmHjeivleiAl+WwveWQjui/lOWbniB7IHN1Y2Nlc3M6IGZhbHNlLCBlbWFpbHM6IFtdIH3vvIzkuI3mipvlvILluLhcbiAqIC0g5Y+C5pWw5qCh6aqM6ZSZ6K+v77yI57y65bCRIEVtYWlsSW5mb++8ieebtOaOpeaKm+WHulxuICpcbiAqIEBwYXJhbSBpbmZvIC0gR2VuZXJhdGVFbWFpbCgpIOi/lOWbnueahOmCrueuseS/oeaBr1xuICogQHBhcmFtIG9wdGlvbnMgLSDlj6/pgInphY3nva7vvIjph43or5XnrYnvvIlcbiAqIEByZXR1cm5zIOmCruS7tue7k+aenO+8jOWMheWQqyBzdWNjZXNzIOagh+iusOWSjOmCruS7tuWIl+ihqFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgaW5mbyA9IGF3YWl0IGdlbmVyYXRlRW1haWwoeyBjaGFubmVsOiAnbWFpbC10bScgfSk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRFbWFpbHMoaW5mbyk7XG4gKiBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmVtYWlscy5sZW5ndGggPiAwKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfmlLbliLDpgq7ku7Y6JywgcmVzdWx0LmVtYWlsc1swXS5zdWJqZWN0KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKGluZm86IEVtYWlsSW5mbywgb3B0aW9ucz86IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICBpZiAoIWluZm8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtYWlsSW5mbyBpcyByZXF1aXJlZCwgY2FsbCBnZW5lcmF0ZUVtYWlsKCkgZmlyc3QnKTtcbiAgfVxuXG4gIGNvbnN0IHsgY2hhbm5lbCwgZW1haWwgfSA9IGluZm87XG4gIGNvbnN0IHRva2VuID0gdG9rZW5TdG9yZS5nZXQoaW5mbyk7XG5cbiAgaWYgKCFjaGFubmVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDaGFubmVsIGlzIHJlcXVpcmVkJyk7XG4gIH1cbiAgaWYgKCFlbWFpbCAmJiBjaGFubmVsICE9PSAndGVtcG1haWwtbG9sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRW1haWwgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1Zyhg6I635Y+W6YKu5Lu2LCDmuKDpgZM6ICR7Y2hhbm5lbH0sIOmCrueusTogJHtlbWFpbH1gKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbWFpbHMgPSBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gZ2V0RW1haWxzT25jZShjaGFubmVsLCBlbWFpbCwgdG9rZW4pLCBvcHRpb25zPy5yZXRyeSk7XG4gICAgaWYgKGVtYWlscy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhg6I635Y+W5YiwICR7ZW1haWxzLmxlbmd0aH0g5bCB6YKu5Lu2LCDmuKDpgZM6ICR7Y2hhbm5lbH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKGDmmoLml6Dpgq7ku7YsIOa4oOmBkzogJHtjaGFubmVsfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBjaGFubmVsLCBlbWFpbCwgZW1haWxzLCBzdWNjZXNzOiB0cnVlIH07XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgLypcbiAgICAgKiDph43or5XogJflsL3lkI7ku43nhLblpLHotKUg4oaSIOi/lOWbnuepuue7k+aenOiAjOmdnuaKm+W8guW4uFxuICAgICAqIOi/meagt+iwg+eUqOaWueWcqOi9ruivouWcuuaZr+S4i+S4jeS8muWboOS4uuS4gOasoee9kee7nOazouWKqOiAjOS4reaWreaVtOS4qua1geeoi1xuICAgICAqL1xuICAgIGxvZ2dlci5lcnJvcihg6I635Y+W6YKu5Lu25aSx6LSlLCDmuKDpgZM6ICR7Y2hhbm5lbH0sIOmUmeivrzogJHtlcnIubWVzc2FnZSB8fCBlcnJ9YCk7XG4gICAgcmV0dXJuIHsgY2hhbm5lbCwgZW1haWwsIGVtYWlsczogW10sIHN1Y2Nlc3M6IGZhbHNlIH07XG4gIH1cbn1cblxuLyoqXG4gKiDljZXmrKHojrflj5bpgq7ku7bvvIjkuI3lkKvph43or5XpgLvovpHvvIlcbiAqIOagueaNrua4oOmBk+exu+Wei+WIhuWPkeWIsOWvueW6lOeahCBwcm92aWRlciDlrp7njrDvvIzlubbmoKHpqozlv4XpnIDnmoQgdG9rZW4g5Y+C5pWwXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEVtYWlsc09uY2UoY2hhbm5lbDogQ2hhbm5lbCwgZW1haWw6IHN0cmluZywgdG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPEVtYWlsW10+IHtcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdldEVtYWlscyhlbWFpbCk7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIGxpbnNoaS1lbWFpbCcpO1xuICAgICAgcmV0dXJuIGxpbnNoaUVtYWlsLmdldEVtYWlscyhlbWFpbCwgdG9rZW4pO1xuICAgIGNhc2UgJ2xpbnNoaXlvdSc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBsaW5zaGl5b3UnKTtcbiAgICAgIHJldHVybiBsaW5zaGl5b3UuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIHRlbXBtYWlsLWxvbCcpO1xuICAgICAgcmV0dXJuIHRlbXBtYWlsTG9sLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ2NoYXRncHQtb3JnLXVrJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIGNoYXRncHQtb3JnLXVrJyk7XG4gICAgICByZXR1cm4gY2hhdGdwdE9yZ1VrLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ3RlbXAtbWFpbC1pbyc6XG4gICAgICByZXR1cm4gdGVtcE1haWxJTy5nZXRFbWFpbHMoZW1haWwpO1xuICAgIGNhc2UgJ2F3YW1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgYXdhbWFpbCcpO1xuICAgICAgcmV0dXJuIGF3YW1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAndGVtcG9yYXJ5LWVtYWlsLW9yZyc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciB0ZW1wb3JhcnktZW1haWwtb3JnJyk7XG4gICAgICByZXR1cm4gdGVtcG9yYXJ5RW1haWxPcmcuZ2V0RW1haWxzKGVtYWlsLCB0b2tlbik7XG4gICAgY2FzZSAnbWFpbC10bSc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBtYWlsLXRtJyk7XG4gICAgICByZXR1cm4gbWFpbFRtLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ21haWwtY3gnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgbWFpbC1jeCcpO1xuICAgICAgcmV0dXJuIG1haWxDeC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdkcm9wbWFpbCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBkcm9wbWFpbCcpO1xuICAgICAgcmV0dXJuIGRyb3BtYWlsLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ2d1ZXJyaWxsYW1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgZ3VlcnJpbGxhbWFpbCcpO1xuICAgICAgcmV0dXJuIGd1ZXJyaWxsYW1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnbWFpbGRyb3AnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgbWFpbGRyb3AnKTtcbiAgICAgIHJldHVybiBtYWlsZHJvcFByb3ZpZGVyLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ3NtYWlsLXB3JzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIHNtYWlsLXB3Jyk7XG4gICAgICByZXR1cm4gc21haWxQdy5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdib29tbGlmeSc6XG4gICAgICByZXR1cm4gYm9vbWxpZnkuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICdtZmZhYyc6XG4gICAgICByZXR1cm4gbWZmYWMuZ2V0RW1haWxzKGVtYWlsLCB0b2tlbik7XG4gICAgY2FzZSAnbWlubWFpbCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBtaW5tYWlsJyk7XG4gICAgICByZXR1cm4gbWlubWFpbC5nZXRFbWFpbHMoZW1haWwsIHRva2VuKTtcbiAgICBjYXNlICd2aXAtMjE1JzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIHZpcC0yMTUnKTtcbiAgICAgIHJldHVybiB2aXAyMTUuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnYW5vbmJveCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBhbm9uYm94Jyk7XG4gICAgICByZXR1cm4gYW5vbmJveC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdmYWtlLWxlZ2FsJzpcbiAgICAgIHJldHVybiBmYWtlTGVnYWwuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNoYW5uZWw6ICR7Y2hhbm5lbH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIOS4tOaXtumCrueuseWuouaIt+err1xuICog5bCB6KOF5LqG6YKu566x5Yib5bu65ZKM6YKu5Lu26I635Y+W55qE5a6M5pW05rWB56iL77yM6Ieq5Yqo566h55CG6YKu566x5L+h5oGv5ZKM6K6k6K+B5Luk54mMXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBjbGllbnQgPSBuZXcgVGVtcEVtYWlsQ2xpZW50KCk7XG4gKiBjb25zdCBlbWFpbEluZm8gPSBhd2FpdCBjbGllbnQuZ2VuZXJhdGUoeyBjaGFubmVsOiAnbWFpbC10bScgfSk7XG4gKiBjb25zb2xlLmxvZygn6YKu566xOicsIGVtYWlsSW5mby5lbWFpbCk7XG4gKlxuICogLy8g6L2u6K+i6I635Y+W6YKu5Lu2XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuZ2V0RW1haWxzKCk7XG4gKiBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAqICAgY29uc29sZS5sb2coJ+mCruS7tuaVsDonLCByZXN1bHQuZW1haWxzLmxlbmd0aCk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBFbWFpbENsaWVudCB7XG4gIHByaXZhdGUgZW1haWxJbmZvOiBFbWFpbEluZm8gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICog5Yib5bu65Li05pe26YKu566x5bm257yT5a2Y6YKu566x5L+h5oGvXG4gICAqIOWQjue7reiwg+eUqCBnZXRFbWFpbHMoKSDml7boh6rliqjkvb/nlKjmraTpgq7nrrHnmoTmuKDpgZPjgIHlnLDlnYDlkozku6TniYxcbiAgICog5omA5pyJ5rig6YGT5Z2H5LiN5Y+v55So5pe26L+U5ZueIG51bGxcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbyB8IG51bGw+IHtcbiAgICB0aGlzLmVtYWlsSW5mbyA9IGF3YWl0IGdlbmVyYXRlRW1haWwob3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuZW1haWxJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjemCrueuseeahOmCruS7tuWIl+ihqFxuICAgKiDlv4XpobvlhYjosIPnlKggZ2VuZXJhdGUoKSDliJvlu7rpgq7nrrFcbiAgICpcbiAgICogQHRocm93cyDmnKrosIPnlKggZ2VuZXJhdGUoKSDml7bmipvlh7rlvILluLhcbiAgICovXG4gIGFzeW5jIGdldEVtYWlscyhvcHRpb25zPzogR2V0RW1haWxzT3B0aW9ucyk6IFByb21pc2U8R2V0RW1haWxzUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmVtYWlsSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbWFpbCBnZW5lcmF0ZWQuIENhbGwgZ2VuZXJhdGUoKSBmaXJzdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0RW1haWxzKHRoaXMuZW1haWxJbmZvLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3nvJPlrZjnmoTpgq7nrrHkv6Hmga9cbiAgICog5pyq6LCD55SoIGdlbmVyYXRlKCkg5pe26L+U5ZueIG51bGxcbiAgICovXG4gIGdldEVtYWlsSW5mbygpOiBFbWFpbEluZm8gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lbWFpbEluZm87XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBsaXN0Q2hhbm5lbHMsXG4gIGdldENoYW5uZWxJbmZvLFxuICBnZW5lcmF0ZUVtYWlsLFxuICBnZXRFbWFpbHMsXG4gIFRlbXBFbWFpbENsaWVudCxcbiAgc2V0Q29uZmlnLFxuICBnZXRDb25maWcsXG59O1xuIl19
|
|
469
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUdBLG9DQUVDO0FBUUQsd0NBRUM7QUFvQkQsc0NBd0NDO0FBNEZELDhCQXVDQztBQWhURCwrREFBaUQ7QUFDakQsb0VBQXNEO0FBQ3RELHNFQUF3RDtBQUN4RCxpRUFBbUQ7QUFDbkQseURBQTJDO0FBQzNDLHNFQUF3RDtBQUN4RCx5RUFBMkQ7QUFDM0QscUVBQXVEO0FBQ3ZELDZEQUErQztBQUMvQyxtRkFBcUU7QUFDckUsNERBQThDO0FBQzlDLDREQUE4QztBQUM5QywrREFBaUQ7QUFDakQseUVBQTJEO0FBQzNELHVFQUF5RDtBQUN6RCw4REFBZ0Q7QUFDaEQsK0RBQWlEO0FBQ2pELDZEQUErQztBQUMvQyw0REFBOEM7QUFDOUMsNkRBQStDO0FBQy9DLGtFQUFvRDtBQUVwRCxtQ0FBMkQ7QUFDM0QsMkNBQThDO0FBQzlDLHFDQUFrQztBQUNsQyxxQ0FBZ0Q7QUFJaEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUNwRCx5Q0FBNkM7QUFBcEMsMkdBQUEsY0FBYyxPQUFBO0FBQ3ZCLGlDQUEyRjtBQUFsRixrR0FBQSxTQUFTLE9BQUE7QUFBRSw4R0FBQSxxQkFBcUIsT0FBQTtBQUFFLHlHQUFBLGdCQUFnQixPQUFBO0FBRTNELG1DQUE2RjtBQUFwRixrR0FBQSxRQUFRLE9BQUE7QUFBYyxxR0FBQSxXQUFXLE9BQUE7QUFBRSxxR0FBQSxXQUFXLE9BQUE7QUFBRSxtR0FBQSxTQUFTLE9BQUE7QUFBRSxnR0FBQSxNQUFNLE9BQUE7QUFDMUUsbUNBQTJEO0FBQXZDLG1HQUFBLFNBQVMsT0FBQTtBQUFFLG1HQUFBLFNBQVMsT0FBQTtBQUN4QyxxQ0FBMEM7QUFBakMsd0dBQUEsYUFBYSxPQUFBO0FBRXRCLHlE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QixJQUFJLENBQUM7SUFrQzdDLENBQUM7SUFoQ0M7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBZ0MsRUFBRTtRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQTBCO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBQSwyQkFBZSxFQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsNENBQTRDLENBQUMsQ0FBQztZQUM3RixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBbkNELDBDQW1DQztBQUVELGtCQUFlO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULGVBQWU7SUFDZixTQUFTLEVBQVQsa0JBQVM7SUFDVCxTQUFTLEVBQVQsa0JBQVM7Q0FDVixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdGVtcG1haWwgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwnO1xuaW1wb3J0ICogYXMgdGVtcG1haWxDbiBmcm9tICcuL3Byb3ZpZGVycy90ZW1wbWFpbC1jbic7XG5pbXBvcnQgKiBhcyBsaW5zaGlFbWFpbCBmcm9tICcuL3Byb3ZpZGVycy9saW5zaGktZW1haWwnO1xuaW1wb3J0ICogYXMgbGluc2hpeW91IGZyb20gJy4vcHJvdmlkZXJzL2xpbnNoaXlvdSc7XG5pbXBvcnQgKiBhcyBtZmZhYyBmcm9tICcuL3Byb3ZpZGVycy9tZmZhYyc7XG5pbXBvcnQgKiBhcyB0ZW1wbWFpbExvbCBmcm9tICcuL3Byb3ZpZGVycy90ZW1wbWFpbC1sb2wnO1xuaW1wb3J0ICogYXMgY2hhdGdwdE9yZ1VrIGZyb20gJy4vcHJvdmlkZXJzL2NoYXRncHQtb3JnLXVrJztcbmltcG9ydCAqIGFzIHRlbXBNYWlsSU8gZnJvbSAnLi9wcm92aWRlcnMvdGVtcC1tYWlsLWlvJztcbmltcG9ydCAqIGFzIGF3YW1haWwgZnJvbSAnLi9wcm92aWRlcnMvYXdhbWFpbCc7XG5pbXBvcnQgKiBhcyB0ZW1wb3JhcnlFbWFpbE9yZyBmcm9tICcuL3Byb3ZpZGVycy90ZW1wb3JhcnktZW1haWwtb3JnJztcbmltcG9ydCAqIGFzIG1haWxUbSBmcm9tICcuL3Byb3ZpZGVycy9tYWlsLXRtJztcbmltcG9ydCAqIGFzIG1haWxDeCBmcm9tICcuL3Byb3ZpZGVycy9tYWlsLWN4JztcbmltcG9ydCAqIGFzIGRyb3BtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2Ryb3BtYWlsJztcbmltcG9ydCAqIGFzIGd1ZXJyaWxsYW1haWwgZnJvbSAnLi9wcm92aWRlcnMvZ3VlcnJpbGxhbWFpbCc7XG5pbXBvcnQgKiBhcyBtYWlsZHJvcFByb3ZpZGVyIGZyb20gJy4vcHJvdmlkZXJzL21haWxkcm9wJztcbmltcG9ydCAqIGFzIHNtYWlsUHcgZnJvbSAnLi9wcm92aWRlcnMvc21haWwtcHcnO1xuaW1wb3J0ICogYXMgYm9vbWxpZnkgZnJvbSAnLi9wcm92aWRlcnMvYm9vbWxpZnknO1xuaW1wb3J0ICogYXMgbWlubWFpbCBmcm9tICcuL3Byb3ZpZGVycy9taW5tYWlsJztcbmltcG9ydCAqIGFzIHZpcDIxNSBmcm9tICcuL3Byb3ZpZGVycy92aXAtMjE1JztcbmltcG9ydCAqIGFzIGFub25ib3ggZnJvbSAnLi9wcm92aWRlcnMvYW5vbmJveCc7XG5pbXBvcnQgKiBhcyBmYWtlTGVnYWwgZnJvbSAnLi9wcm92aWRlcnMvZmFrZS1sZWdhbCc7XG5pbXBvcnQgeyBDaGFubmVsLCBFbWFpbEluZm8sIEludGVybmFsRW1haWxJbmZvLCBFbWFpbCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgd2l0aFJldHJ5LCB3aXRoUmV0cnlXaXRoQXR0ZW1wdHMgfSBmcm9tICcuL3JldHJ5JztcbmltcG9ydCB7IHJlcG9ydFRlbGVtZXRyeSB9IGZyb20gJy4vdGVsZW1ldHJ5JztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHNldENvbmZpZywgZ2V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuXG5leHBvcnQgeyBDaGFubmVsLCBFbWFpbEluZm8sIEVtYWlsLCBFbWFpbEF0dGFjaG1lbnQsIEdldEVtYWlsc1Jlc3VsdCwgR2VuZXJhdGVFbWFpbE9wdGlvbnMsIEdldEVtYWlsc09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBTREsg5YaF6YOoIHRva2VuIOWtmOWCqFxuICog5L2/55SoIFdlYWtNYXAg5bCGIEVtYWlsSW5mbyDlr7nosaHmmKDlsITliLDlr7nlupTnmoQgdG9rZW5cbiAqIOeUqOaIt+aXoOazleebtOaOpeiuv+mXriB0b2tlbu+8jOeUsSBTREsg6Ieq5Yqo566h55CGXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgdG9rZW5TdG9yZSA9IG5ldyBXZWFrTWFwPEVtYWlsSW5mbywgc3RyaW5nPigpO1xuZXhwb3J0IHsgbm9ybWFsaXplRW1haWwgfSBmcm9tICcuL25vcm1hbGl6ZSc7XG5leHBvcnQgeyB3aXRoUmV0cnksIHdpdGhSZXRyeVdpdGhBdHRlbXB0cywgZmV0Y2hXaXRoVGltZW91dCwgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi9yZXRyeSc7XG5leHBvcnQgdHlwZSB7IFJldHJ5V2l0aEF0dGVtcHRzUmVzdWx0IH0gZnJvbSAnLi9yZXRyeSc7XG5leHBvcnQgeyBMb2dMZXZlbCwgTG9nSGFuZGxlciwgc2V0TG9nTGV2ZWwsIGdldExvZ0xldmVsLCBzZXRMb2dnZXIsIGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCB7IFNES0NvbmZpZywgc2V0Q29uZmlnLCBnZXRDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5leHBvcnQgeyBnZXRTZGtWZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcbmV4cG9ydCB0eXBlIHsgU3ludGhldGljQnJvd3NlclByb2ZpbGUgfSBmcm9tICcuL3Byb3ZpZGVycy9saW5zaGktdG9rZW4nO1xuZXhwb3J0IHtcbiAgZGVyaXZlTGluc2hpQXBpUGF0aEtleSxcbiAgcmFuZG9tU3ludGhldGljTGluc2hpS2V5LFxuICByYW5kb21Ccm93c2VyTGlrZVByb2ZpbGUsXG4gIHN5bnRoZXRpY1Zpc2l0b3JJZEZyb21Qcm9maWxlLFxufSBmcm9tICcuL3Byb3ZpZGVycy9saW5zaGktdG9rZW4nO1xuXG4vKiog5omA5pyJ5pSv5oyB55qE5rig6YGT5YiX6KGo77yM55So5LqO6ZqP5py66YCJ5oup5ZKM6YGN5Y6GICovXG5jb25zdCBhbGxDaGFubmVsczogQ2hhbm5lbFtdID0gWyd0ZW1wbWFpbCcsICd0ZW1wbWFpbC1jbicsICdsaW5zaGktZW1haWwnLCAnbGluc2hpeW91JywgJ21mZmFjJywgJ3RlbXBtYWlsLWxvbCcsICdjaGF0Z3B0LW9yZy11aycsICd0ZW1wLW1haWwtaW8nLCAnYXdhbWFpbCcsICd0ZW1wb3JhcnktZW1haWwtb3JnJywgJ21haWwtdG0nLCAnbWFpbC1jeCcsICdkcm9wbWFpbCcsICdndWVycmlsbGFtYWlsJywgJ21haWxkcm9wJywgJ3NtYWlsLXB3JywgJ2Jvb21saWZ5JywgJ21pbm1haWwnLCAndmlwLTIxNScsICdhbm9uYm94JywgJ2Zha2UtbGVnYWwnXTtcblxuLyoqXG4gKiDmuKDpgZPkv6Hmga/vvIzljIXlkKvmuKDpgZPmoIfor4bjgIHmmL7npLrlkI3np7Dlkozlr7nlupTnvZHnq5lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsSW5mbyB7XG4gIC8qKiDmuKDpgZPmoIfor4YgKi9cbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAgLyoqIOa4oOmBk+aYvuekuuWQjeensCAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiDlr7nlupTnmoTkuLTml7bpgq7nrrHmnI3liqHnvZHnq5kgKi9cbiAgd2Vic2l0ZTogc3RyaW5nO1xufVxuXG4vKiog5rig6YGT5L+h5oGv5pig5bCE6KGoICovXG5jb25zdCBjaGFubmVsSW5mb01hcDogUmVjb3JkPENoYW5uZWwsIENoYW5uZWxJbmZvPiA9IHtcbiAgJ3RlbXBtYWlsJzogeyBjaGFubmVsOiAndGVtcG1haWwnLCBuYW1lOiAnVGVtcE1haWwnLCB3ZWJzaXRlOiAndGVtcG1haWwuaW5nJyB9LFxuICAndGVtcG1haWwtY24nOiB7IGNoYW5uZWw6ICd0ZW1wbWFpbC1jbicsIG5hbWU6ICdUZW1wTWFpbCBDTicsIHdlYnNpdGU6ICd0ZW1wbWFpbC5jbicgfSxcbiAgJ2xpbnNoaS1lbWFpbCc6IHsgY2hhbm5lbDogJ2xpbnNoaS1lbWFpbCcsIG5hbWU6ICfkuLTml7bpgq7nrrEnLCB3ZWJzaXRlOiAnbGluc2hpLWVtYWlsLmNvbScgfSxcbiAgJ2xpbnNoaXlvdSc6IHsgY2hhbm5lbDogJ2xpbnNoaXlvdScsIG5hbWU6ICfkuLTml7bpgq4nLCB3ZWJzaXRlOiAnbGluc2hpeW91LmNvbScgfSxcbiAgJ3RlbXBtYWlsLWxvbCc6IHsgY2hhbm5lbDogJ3RlbXBtYWlsLWxvbCcsIG5hbWU6ICdUZW1wTWFpbCBMT0wnLCB3ZWJzaXRlOiAndGVtcG1haWwubG9sJyB9LFxuICAnY2hhdGdwdC1vcmctdWsnOiB7IGNoYW5uZWw6ICdjaGF0Z3B0LW9yZy11aycsIG5hbWU6ICdDaGF0R1BUIE1haWwnLCB3ZWJzaXRlOiAnbWFpbC5jaGF0Z3B0Lm9yZy51aycgfSxcbiAgJ3RlbXAtbWFpbC1pbyc6IHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycsIG5hbWU6ICdUZW1wIE1haWwgSU8nLCB3ZWJzaXRlOiAndGVtcC1tYWlsLmlvJyB9LFxuICAnYXdhbWFpbCc6IHsgY2hhbm5lbDogJ2F3YW1haWwnLCBuYW1lOiAnQXdhTWFpbCcsIHdlYnNpdGU6ICdhd2FtYWlsLmNvbScgfSxcbiAgJ3RlbXBvcmFyeS1lbWFpbC1vcmcnOiB7IGNoYW5uZWw6ICd0ZW1wb3JhcnktZW1haWwtb3JnJywgbmFtZTogJ1RlbXBvcmFyeSBFbWFpbCcsIHdlYnNpdGU6ICd0ZW1wb3JhcnktZW1haWwub3JnJyB9LFxuICAnbWFpbC10bSc6IHsgY2hhbm5lbDogJ21haWwtdG0nLCBuYW1lOiAnTWFpbC50bScsIHdlYnNpdGU6ICdtYWlsLnRtJyB9LFxuICAnbWFpbC1jeCc6IHsgY2hhbm5lbDogJ21haWwtY3gnLCBuYW1lOiAnTWFpbC5jeCcsIHdlYnNpdGU6ICdtYWlsLmN4JyB9LFxuICAnZHJvcG1haWwnOiB7IGNoYW5uZWw6ICdkcm9wbWFpbCcsIG5hbWU6ICdEcm9wTWFpbCcsIHdlYnNpdGU6ICdkcm9wbWFpbC5tZScgfSxcbiAgJ2d1ZXJyaWxsYW1haWwnOiB7IGNoYW5uZWw6ICdndWVycmlsbGFtYWlsJywgbmFtZTogJ0d1ZXJyaWxsYSBNYWlsJywgd2Vic2l0ZTogJ2d1ZXJyaWxsYW1haWwuY29tJyB9LFxuICAnbWFpbGRyb3AnOiB7IGNoYW5uZWw6ICdtYWlsZHJvcCcsIG5hbWU6ICdNYWlsZHJvcCcsIHdlYnNpdGU6ICdtYWlsZHJvcC5jeCcgfSxcbiAgJ3NtYWlsLXB3JzogeyBjaGFubmVsOiAnc21haWwtcHcnLCBuYW1lOiAnU21haWwucHcnLCB3ZWJzaXRlOiAnc21haWwucHcnIH0sXG4gICdib29tbGlmeSc6IHsgY2hhbm5lbDogJ2Jvb21saWZ5JywgbmFtZTogJ0Jvb21saWZ5Jywgd2Vic2l0ZTogJ2Jvb21saWZ5LmNvbScgfSxcbiAgJ21pbm1haWwnOiB7IGNoYW5uZWw6ICdtaW5tYWlsJywgbmFtZTogJ01pbk1haWwnLCB3ZWJzaXRlOiAnbWlubWFpbC5hcHAnIH0sXG4gICdtZmZhYyc6IHsgY2hhbm5lbDogJ21mZmFjJywgbmFtZTogJ01GRkFDJywgd2Vic2l0ZTogJ21mZmFjLmNvbScgfSxcbiAgJ3ZpcC0yMTUnOiB7IGNoYW5uZWw6ICd2aXAtMjE1JywgbmFtZTogJ1ZJUCAyMTUnLCB3ZWJzaXRlOiAndmlwLjIxNS5pbScgfSxcbiAgJ2Fub25ib3gnOiB7IGNoYW5uZWw6ICdhbm9uYm94JywgbmFtZTogJ0Fub25ib3gnLCB3ZWJzaXRlOiAnYW5vbmJveC5uZXQnIH0sXG4gICdmYWtlLWxlZ2FsJzogeyBjaGFubmVsOiAnZmFrZS1sZWdhbCcsIG5hbWU6ICdGYWtlIExlZ2FsJywgd2Vic2l0ZTogJ2Zha2UubGVnYWwnIH0sXG59O1xuXG4vKipcbiAqIOiOt+WPluaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqFxuICpcbiAqIEByZXR1cm5zIOaJgOaciea4oOmBk+eahOS/oeaBr+aVsOe7hFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgY2hhbm5lbHMgPSBsaXN0Q2hhbm5lbHMoKTtcbiAqIGNoYW5uZWxzLmZvckVhY2goY2ggPT4gY29uc29sZS5sb2coYCR7Y2gubmFtZX0gKCR7Y2gud2Vic2l0ZX0pYCkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0Q2hhbm5lbHMoKTogQ2hhbm5lbEluZm9bXSB7XG4gIHJldHVybiBhbGxDaGFubmVscy5tYXAoY2ggPT4gY2hhbm5lbEluZm9NYXBbY2hdKTtcbn1cblxuLyoqXG4gKiDojrflj5bmjIflrprmuKDpgZPnmoTor6bnu4bkv6Hmga9cbiAqXG4gKiBAcGFyYW0gY2hhbm5lbCAtIOa4oOmBk+agh+ivhlxuICogQHJldHVybnMg5rig6YGT5L+h5oGv77yM5LiN5a2Y5Zyo5pe26L+U5ZueIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hhbm5lbEluZm8oY2hhbm5lbDogQ2hhbm5lbCk6IENoYW5uZWxJbmZvIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNoYW5uZWxJbmZvTWFwW2NoYW5uZWxdO1xufVxuXG4vKipcbiAqIOWIm+W7uuS4tOaXtumCrueusVxuICpcbiAqIOmUmeivr+WkhOeQhuetlueVpe+8mlxuICogLSDmjIflrprmuKDpgZPlpLHotKXml7bvvIzpu5jorqToh6rliqjlsJ3or5Xlhbbku5blj6/nlKjmuKDpgZPvvIjmiZPkubHpobrluo/pgJDkuKrlsJ3or5XvvIlcbiAqIC0gYGNoYW5uZWxGYWxsYmFjazogZmFsc2VgIOS4lOaMh+WumuS6hiBgY2hhbm5lbGAg5pe277yM5LuF5bCd6K+V6K+l5rig6YGT77yM5aSx6LSl5Y2z6L+U5ZueIG51bGxcbiAqIC0g5pyq5oyH5a6a5rig6YGT5pe277yM5omT5Lmx5YWo6YOo5rig6YGT6YCQ5Liq5bCd6K+V77yM55u05Yiw5oiQ5YqfXG4gKiAtIOaJgOaciea4oOmBk+Wdh+S4jeWPr+eUqOaXtui/lOWbniBudWxs77yI5LiN5oqb5Ye65byC5bi477yJXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSDliJvlu7rpgInpobnvvIzlj6/mjIflrprmuKDpgZPjgIHmnInmlYjml7bplb/jgIHln5/lkI3nrYlcbiAqIEByZXR1cm5zIOmCrueuseS/oeaBr++8jOaJgOaciea4oOmBk+Wdh+S4jeWPr+eUqOaXtui/lOWbniBudWxsXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBlbWFpbEluZm8gPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycgfSk7XG4gKiBpZiAoZW1haWxJbmZvKSBjb25zb2xlLmxvZyhlbWFpbEluZm8uZW1haWwpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbyB8IG51bGw+IHtcbiAgLypcbiAgICog5p6E5bu65bCd6K+V6aG65bqP77yaXG4gICAqIC0g5oyH5a6a5rig6YGTIOKGkiDkvJjlhYjlsJ3or5Xor6XmuKDpgZPvvIzlpLHotKXlkI7pmo/mnLrlsJ3or5Xlhbbku5bmuKDpgZNcbiAgICogLSDmnKrmjIflrpog4oaSIOaJk+S5seWFqOmDqOa4oOmBk+mAkOS4quWwneivlVxuICAgKi9cbiAgY29uc3QgYWxsb3dGYWxsYmFjayA9IG9wdGlvbnMuY2hhbm5lbEZhbGxiYWNrICE9PSBmYWxzZTtcbiAgY29uc3QgdHJ5T3JkZXIgPSBidWlsZENoYW5uZWxPcmRlcihvcHRpb25zLmNoYW5uZWwsIGFsbG93RmFsbGJhY2spO1xuXG4gIGxldCBjaGFubmVsc1RyaWVkID0gMDtcbiAgbGV0IGxhc3RFcnIgPSAnJztcbiAgZm9yIChjb25zdCBjaCBvZiB0cnlPcmRlcikge1xuICAgIGNoYW5uZWxzVHJpZWQgKz0gMTtcbiAgICBsb2dnZXIuaW5mbyhg5Yib5bu65Li05pe26YKu566xLCDmuKDpgZM6ICR7Y2h9YCk7XG4gICAgY29uc3QgciA9IGF3YWl0IHdpdGhSZXRyeVdpdGhBdHRlbXB0cygoKSA9PiBnZW5lcmF0ZUVtYWlsT25jZShjaCwgb3B0aW9ucyksIG9wdGlvbnMucmV0cnkpO1xuICAgIGlmIChyLm9rKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbCA9IHIudmFsdWU7XG4gICAgICBsb2dnZXIuaW5mbyhg6YKu566x5Yib5bu65oiQ5YqfOiAke2ludGVybmFsLmVtYWlsfSAo5rig6YGTOiAke2NofSlgKTtcbiAgICAgIHJlcG9ydFRlbGVtZXRyeSgnZ2VuZXJhdGVfZW1haWwnLCBjaCwgdHJ1ZSwgci5hdHRlbXB0cywgY2hhbm5lbHNUcmllZCwgJycpO1xuXG4gICAgICAvKiDlsIYgdG9rZW4g5a2Y5YWl5YaF6YOo5a2Y5YKo77yM5LiN5pq06Zyy57uZ55So5oi3ICovXG4gICAgICBjb25zdCBwdWJsaWNJbmZvOiBFbWFpbEluZm8gPSB7XG4gICAgICAgIGNoYW5uZWw6IGludGVybmFsLmNoYW5uZWwsXG4gICAgICAgIGVtYWlsOiBpbnRlcm5hbC5lbWFpbCxcbiAgICAgICAgZXhwaXJlc0F0OiBpbnRlcm5hbC5leHBpcmVzQXQsXG4gICAgICAgIGNyZWF0ZWRBdDogaW50ZXJuYWwuY3JlYXRlZEF0LFxuICAgICAgfTtcbiAgICAgIGlmIChpbnRlcm5hbC50b2tlbikge1xuICAgICAgICB0b2tlblN0b3JlLnNldChwdWJsaWNJbmZvLCBpbnRlcm5hbC50b2tlbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHVibGljSW5mbztcbiAgICB9XG4gICAgY29uc3QgbXNnID0gKHIuZXJyb3IgYXMgYW55KT8ubWVzc2FnZSB8fCBTdHJpbmcoci5lcnJvcik7XG4gICAgbGFzdEVyciA9IG1zZztcbiAgICBsb2dnZXIud2Fybihg5rig6YGTICR7Y2h9IOS4jeWPr+eUqDogJHttc2d977yM5bCd6K+V5LiL5LiA5Liq5rig6YGTYCk7XG4gIH1cblxuICBsb2dnZXIuZXJyb3IoJ+aJgOaciea4oOmBk+Wdh+S4jeWPr+eUqO+8jOWIm+W7uumCrueuseWksei0pScpO1xuICByZXBvcnRUZWxlbWV0cnkoJ2dlbmVyYXRlX2VtYWlsJywgJycsIGZhbHNlLCAwLCBjaGFubmVsc1RyaWVkLCBsYXN0RXJyKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICog5p6E5bu65rig6YGT5bCd6K+V6aG65bqPXG4gKiDmjIflrprmuKDpgZPml7bkvJjlhYjlsJ3or5Xor6XmuKDpgZPvvIzlhbbkvZnmuKDpgZPmiZPkubHov73liqBcbiAqIOacquaMh+WumuaXtuaJk+S5seWFqOmDqOa4oOmBk1xuICovXG5mdW5jdGlvbiBidWlsZENoYW5uZWxPcmRlcihwcmVmZXJyZWQ/OiBDaGFubmVsLCBhbGxvd0ZhbGxiYWNrID0gdHJ1ZSk6IENoYW5uZWxbXSB7XG4gIGNvbnN0IHNodWZmbGVkID0gWy4uLmFsbENoYW5uZWxzXS5zb3J0KCgpID0+IE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICBpZiAoIXByZWZlcnJlZCkge1xuICAgIHJldHVybiBzaHVmZmxlZDtcbiAgfVxuICBpZiAoIWFsbG93RmFsbGJhY2spIHtcbiAgICByZXR1cm4gW3ByZWZlcnJlZF07XG4gIH1cbiAgY29uc3QgcmVzdCA9IHNodWZmbGVkLmZpbHRlcihjaCA9PiBjaCAhPT0gcHJlZmVycmVkKTtcbiAgcmV0dXJuIFtwcmVmZXJyZWQsIC4uLnJlc3RdO1xufVxuXG4vKipcbiAqIOWNleasoeWIm+W7uumCrueuse+8iOS4jeWQq+mHjeivlemAu+i+ke+8iVxuICog5qC55o2u5rig6YGT57G75Z6L5YiG5Y+R5Yiw5a+55bqU55qEIHByb3ZpZGVyIOWunueOsFxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsT25jZShjaGFubmVsOiBDaGFubmVsLCBvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyk6IFByb21pc2U8SW50ZXJuYWxFbWFpbEluZm8+IHtcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kdXJhdGlvbiB8fCAzMCk7XG4gICAgY2FzZSAndGVtcG1haWwtY24nOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsQ24uZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiA/PyBudWxsKTtcbiAgICBjYXNlICdsaW5zaGktZW1haWwnOlxuICAgICAgcmV0dXJuIGxpbnNoaUVtYWlsLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdsaW5zaGl5b3UnOlxuICAgICAgcmV0dXJuIGxpbnNoaXlvdS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbExvbC5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZG9tYWluIHx8IG51bGwpO1xuICAgIGNhc2UgJ2NoYXRncHQtb3JnLXVrJzpcbiAgICAgIHJldHVybiBjaGF0Z3B0T3JnVWsuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXAtbWFpbC1pbyc6XG4gICAgICByZXR1cm4gdGVtcE1haWxJTy5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnYXdhbWFpbCc6XG4gICAgICByZXR1cm4gYXdhbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAndGVtcG9yYXJ5LWVtYWlsLW9yZyc6XG4gICAgICByZXR1cm4gdGVtcG9yYXJ5RW1haWxPcmcuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ21haWwtdG0nOlxuICAgICAgcmV0dXJuIG1haWxUbS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZHJvcG1haWwnOlxuICAgICAgcmV0dXJuIGRyb3BtYWlsLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdndWVycmlsbGFtYWlsJzpcbiAgICAgIHJldHVybiBndWVycmlsbGFtYWlsLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdtYWlsZHJvcCc6XG4gICAgICByZXR1cm4gbWFpbGRyb3BQcm92aWRlci5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZG9tYWluID8/IG51bGwpO1xuICAgIGNhc2UgJ3NtYWlsLXB3JzpcbiAgICAgIHJldHVybiBzbWFpbFB3LmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdib29tbGlmeSc6XG4gICAgICByZXR1cm4gYm9vbWxpZnkuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ21mZmFjJzpcbiAgICAgIHJldHVybiBtZmZhYy5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnbWlubWFpbCc6XG4gICAgICByZXR1cm4gbWlubWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAndmlwLTIxNSc6XG4gICAgICByZXR1cm4gdmlwMjE1LmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdhbm9uYm94JzpcbiAgICAgIHJldHVybiBhbm9uYm94LmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdmYWtlLWxlZ2FsJzpcbiAgICAgIHJldHVybiBmYWtlTGVnYWwuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiA/PyBudWxsKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNoYW5uZWw6ICR7Y2hhbm5lbH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIOiOt+WPlumCruS7tuWIl+ihqFxuICogQ2hhbm5lbC9FbWFpbC9Ub2tlbiDnrYnnlLEgU0RLIOS7jiBFbWFpbEluZm8g5Lit6Ieq5Yqo6I635Y+W77yM55So5oi35peg6ZyA5omL5Yqo5Lyg6YCSXG4gKlxuICog6ZSZ6K+v5aSE55CG562W55Wl77yaXG4gKiAtIOe9kee7nOmUmeivr+OAgei2heaXtuOAgTQyOeOAgeacjeWKoeerryA1eHgg6ZSZ6K+vIOKGkiDoh6rliqjph43or5XvvIjpu5jorqQgMiDmrKHvvIlcbiAqIC0g6YeN6K+V6ICX5bC95ZCO6L+U5ZueIHsgc3VjY2VzczogZmFsc2UsIGVtYWlsczogW10gfe+8jOS4jeaKm+W8guW4uFxuICogLSDlj4LmlbDmoKHpqozplJnor6/vvIjnvLrlsJEgRW1haWxJbmZv77yJ55u05o6l5oqb5Ye6XG4gKlxuICogQHBhcmFtIGluZm8gLSBHZW5lcmF0ZUVtYWlsKCkg6L+U5Zue55qE6YKu566x5L+h5oGvXG4gKiBAcGFyYW0gb3B0aW9ucyAtIOWPr+mAiemFjee9ru+8iOmHjeivleetie+8iVxuICogQHJldHVybnMg6YKu5Lu257uT5p6c77yM5YyF5ZCrIHN1Y2Nlc3Mg5qCH6K6w5ZKM6YKu5Lu25YiX6KGoXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBpbmZvID0gYXdhaXQgZ2VuZXJhdGVFbWFpbCh7IGNoYW5uZWw6ICdtYWlsLXRtJyB9KTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEVtYWlscyhpbmZvKTtcbiAqIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQuZW1haWxzLmxlbmd0aCA+IDApIHtcbiAqICAgY29uc29sZS5sb2coJ+aUtuWIsOmCruS7tjonLCByZXN1bHQuZW1haWxzWzBdLnN1YmplY3QpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbWFpbHMoaW5mbzogRW1haWxJbmZvLCBvcHRpb25zPzogR2V0RW1haWxzT3B0aW9ucyk6IFByb21pc2U8R2V0RW1haWxzUmVzdWx0PiB7XG4gIGlmICghaW5mbykge1xuICAgIHJlcG9ydFRlbGVtZXRyeSgnZ2V0X2VtYWlscycsICcnLCBmYWxzZSwgMCwgMCwgJ0VtYWlsSW5mbyBpcyByZXF1aXJlZCwgY2FsbCBnZW5lcmF0ZUVtYWlsKCkgZmlyc3QnKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtYWlsSW5mbyBpcyByZXF1aXJlZCwgY2FsbCBnZW5lcmF0ZUVtYWlsKCkgZmlyc3QnKTtcbiAgfVxuXG4gIGNvbnN0IHsgY2hhbm5lbCwgZW1haWwgfSA9IGluZm87XG4gIGNvbnN0IHRva2VuID0gdG9rZW5TdG9yZS5nZXQoaW5mbyk7XG5cbiAgaWYgKCFjaGFubmVsKSB7XG4gICAgcmVwb3J0VGVsZW1ldHJ5KCdnZXRfZW1haWxzJywgJycsIGZhbHNlLCAwLCAwLCAnQ2hhbm5lbCBpcyByZXF1aXJlZCcpO1xuICAgIHRocm93IG5ldyBFcnJvcignQ2hhbm5lbCBpcyByZXF1aXJlZCcpO1xuICB9XG4gIGlmICghZW1haWwgJiYgY2hhbm5lbCAhPT0gJ3RlbXBtYWlsLWxvbCcpIHtcbiAgICByZXBvcnRUZWxlbWV0cnkoJ2dldF9lbWFpbHMnLCBjaGFubmVsLCBmYWxzZSwgMCwgMCwgJ0VtYWlsIGlzIHJlcXVpcmVkJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbWFpbCBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGDojrflj5bpgq7ku7YsIOa4oOmBkzogJHtjaGFubmVsfSwg6YKu566xOiAke2VtYWlsfWApO1xuICBjb25zdCBnciA9IGF3YWl0IHdpdGhSZXRyeVdpdGhBdHRlbXB0cygoKSA9PiBnZXRFbWFpbHNPbmNlKGNoYW5uZWwsIGVtYWlsLCB0b2tlbiksIG9wdGlvbnM/LnJldHJ5KTtcbiAgaWYgKGdyLm9rKSB7XG4gICAgY29uc3QgZW1haWxzID0gZ3IudmFsdWU7XG4gICAgaWYgKGVtYWlscy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhg6I635Y+W5YiwICR7ZW1haWxzLmxlbmd0aH0g5bCB6YKu5Lu2LCDmuKDpgZM6ICR7Y2hhbm5lbH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKGDmmoLml6Dpgq7ku7YsIOa4oOmBkzogJHtjaGFubmVsfWApO1xuICAgIH1cbiAgICByZXBvcnRUZWxlbWV0cnkoJ2dldF9lbWFpbHMnLCBjaGFubmVsLCB0cnVlLCBnci5hdHRlbXB0cywgMCwgJycpO1xuICAgIHJldHVybiB7IGNoYW5uZWwsIGVtYWlsLCBlbWFpbHMsIHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxuICBjb25zdCBlcnIgPSBnci5lcnJvciBhcyBhbnk7XG4gIGNvbnN0IGVyck1zZyA9IGVycj8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyKTtcbiAgLypcbiAgICog6YeN6K+V6ICX5bC95ZCO5LuN54S25aSx6LSlIOKGkiDov5Tlm57nqbrnu5PmnpzogIzpnZ7mipvlvILluLhcbiAgICog6L+Z5qC36LCD55So5pa55Zyo6L2u6K+i5Zy65pmv5LiL5LiN5Lya5Zug5Li65LiA5qyh572R57uc5rOi5Yqo6ICM5Lit5pat5pW05Liq5rWB56iLXG4gICAqL1xuICBsb2dnZXIuZXJyb3IoYOiOt+WPlumCruS7tuWksei0pSwg5rig6YGTOiAke2NoYW5uZWx9LCDplJnor686ICR7ZXJyTXNnfWApO1xuICByZXBvcnRUZWxlbWV0cnkoJ2dldF9lbWFpbHMnLCBjaGFubmVsLCBmYWxzZSwgZ3IuYXR0ZW1wdHMsIDAsIGVyck1zZyk7XG4gIHJldHVybiB7IGNoYW5uZWwsIGVtYWlsLCBlbWFpbHM6IFtdLCBzdWNjZXNzOiBmYWxzZSB9O1xufVxuXG4vKipcbiAqIOWNleasoeiOt+WPlumCruS7tu+8iOS4jeWQq+mHjeivlemAu+i+ke+8iVxuICog5qC55o2u5rig6YGT57G75Z6L5YiG5Y+R5Yiw5a+55bqU55qEIHByb3ZpZGVyIOWunueOsO+8jOW5tuagoemqjOW/hemcgOeahCB0b2tlbiDlj4LmlbBcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzT25jZShjaGFubmVsOiBDaGFubmVsLCBlbWFpbDogc3RyaW5nLCB0b2tlbj86IHN0cmluZyk6IFByb21pc2U8RW1haWxbXT4ge1xuICBzd2l0Y2ggKGNoYW5uZWwpIHtcbiAgICBjYXNlICd0ZW1wbWFpbCc6XG4gICAgICByZXR1cm4gdGVtcG1haWwuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICd0ZW1wbWFpbC1jbic6XG4gICAgICByZXR1cm4gdGVtcG1haWxDbi5nZXRFbWFpbHMoZW1haWwpO1xuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBsaW5zaGktZW1haWwnKTtcbiAgICAgIHJldHVybiBsaW5zaGlFbWFpbC5nZXRFbWFpbHMoZW1haWwsIHRva2VuKTtcbiAgICBjYXNlICdsaW5zaGl5b3UnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgbGluc2hpeW91Jyk7XG4gICAgICByZXR1cm4gbGluc2hpeW91LmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ3RlbXBtYWlsLWxvbCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciB0ZW1wbWFpbC1sb2wnKTtcbiAgICAgIHJldHVybiB0ZW1wbWFpbExvbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdjaGF0Z3B0LW9yZy11ayc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBjaGF0Z3B0LW9yZy11aycpO1xuICAgICAgcmV0dXJuIGNoYXRncHRPcmdVay5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICdhd2FtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIGF3YW1haWwnKTtcbiAgICAgIHJldHVybiBhd2FtYWlsLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ3RlbXBvcmFyeS1lbWFpbC1vcmcnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgdGVtcG9yYXJ5LWVtYWlsLW9yZycpO1xuICAgICAgcmV0dXJuIHRlbXBvcmFyeUVtYWlsT3JnLmdldEVtYWlscyhlbWFpbCwgdG9rZW4pO1xuICAgIGNhc2UgJ21haWwtdG0nOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgbWFpbC10bScpO1xuICAgICAgcmV0dXJuIG1haWxUbS5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdtYWlsLWN4JzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIG1haWwtY3gnKTtcbiAgICAgIHJldHVybiBtYWlsQ3guZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnZHJvcG1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgZHJvcG1haWwnKTtcbiAgICAgIHJldHVybiBkcm9wbWFpbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdndWVycmlsbGFtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIGd1ZXJyaWxsYW1haWwnKTtcbiAgICAgIHJldHVybiBndWVycmlsbGFtYWlsLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ21haWxkcm9wJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIG1haWxkcm9wJyk7XG4gICAgICByZXR1cm4gbWFpbGRyb3BQcm92aWRlci5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdzbWFpbC1wdyc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBzbWFpbC1wdycpO1xuICAgICAgcmV0dXJuIHNtYWlsUHcuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnYm9vbWxpZnknOlxuICAgICAgcmV0dXJuIGJvb21saWZ5LmdldEVtYWlscyhlbWFpbCk7XG4gICAgY2FzZSAnbWZmYWMnOlxuICAgICAgcmV0dXJuIG1mZmFjLmdldEVtYWlscyhlbWFpbCwgdG9rZW4pO1xuICAgIGNhc2UgJ21pbm1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgbWlubWFpbCcpO1xuICAgICAgcmV0dXJuIG1pbm1haWwuZ2V0RW1haWxzKGVtYWlsLCB0b2tlbik7XG4gICAgY2FzZSAndmlwLTIxNSc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciB2aXAtMjE1Jyk7XG4gICAgICByZXR1cm4gdmlwMjE1LmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ2Fub25ib3gnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgYW5vbmJveCcpO1xuICAgICAgcmV0dXJuIGFub25ib3guZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnZmFrZS1sZWdhbCc6XG4gICAgICByZXR1cm4gZmFrZUxlZ2FsLmdldEVtYWlscyhlbWFpbCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaGFubmVsOiAke2NoYW5uZWx9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiDkuLTml7bpgq7nrrHlrqLmiLfnq69cbiAqIOWwgeijheS6humCrueuseWIm+W7uuWSjOmCruS7tuiOt+WPlueahOWujOaVtOa1geeoi++8jOiHquWKqOeuoeeQhumCrueuseS/oeaBr+WSjOiupOivgeS7pOeJjFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgY2xpZW50ID0gbmV3IFRlbXBFbWFpbENsaWVudCgpO1xuICogY29uc3QgZW1haWxJbmZvID0gYXdhaXQgY2xpZW50LmdlbmVyYXRlKHsgY2hhbm5lbDogJ21haWwtdG0nIH0pO1xuICogY29uc29sZS5sb2coJ+mCrueusTonLCBlbWFpbEluZm8uZW1haWwpO1xuICpcbiAqIC8vIOi9ruivouiOt+WPlumCruS7tlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmdldEVtYWlscygpO1xuICogaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfpgq7ku7bmlbA6JywgcmVzdWx0LmVtYWlscy5sZW5ndGgpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wRW1haWxDbGllbnQge1xuICBwcml2YXRlIGVtYWlsSW5mbzogRW1haWxJbmZvIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIOWIm+W7uuS4tOaXtumCrueuseW5tue8k+WtmOmCrueuseS/oeaBr1xuICAgKiDlkI7nu63osIPnlKggZ2V0RW1haWxzKCkg5pe26Ieq5Yqo5L2/55So5q2k6YKu566x55qE5rig6YGT44CB5Zyw5Z2A5ZKM5Luk54mMXG4gICAqIOaJgOaciea4oOmBk+Wdh+S4jeWPr+eUqOaXtui/lOWbniBudWxsXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZShvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFbWFpbEluZm8gfCBudWxsPiB7XG4gICAgdGhpcy5lbWFpbEluZm8gPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmVtYWlsSW5mbztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3pgq7nrrHnmoTpgq7ku7bliJfooahcbiAgICog5b+F6aG75YWI6LCD55SoIGdlbmVyYXRlKCkg5Yib5bu66YKu566xXG4gICAqXG4gICAqIEB0aHJvd3Mg5pyq6LCD55SoIGdlbmVyYXRlKCkg5pe25oqb5Ye65byC5bi4XG4gICAqL1xuICBhc3luYyBnZXRFbWFpbHMob3B0aW9ucz86IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICAgIGlmICghdGhpcy5lbWFpbEluZm8pIHtcbiAgICAgIHJlcG9ydFRlbGVtZXRyeSgnZ2V0X2VtYWlscycsICcnLCBmYWxzZSwgMCwgMCwgJ05vIGVtYWlsIGdlbmVyYXRlZC4gQ2FsbCBnZW5lcmF0ZSgpIGZpcnN0LicpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbWFpbCBnZW5lcmF0ZWQuIENhbGwgZ2VuZXJhdGUoKSBmaXJzdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0RW1haWxzKHRoaXMuZW1haWxJbmZvLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3nvJPlrZjnmoTpgq7nrrHkv6Hmga9cbiAgICog5pyq6LCD55SoIGdlbmVyYXRlKCkg5pe26L+U5ZueIG51bGxcbiAgICovXG4gIGdldEVtYWlsSW5mbygpOiBFbWFpbEluZm8gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lbWFpbEluZm87XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBsaXN0Q2hhbm5lbHMsXG4gIGdldENoYW5uZWxJbmZvLFxuICBnZW5lcmF0ZUVtYWlsLFxuICBnZXRFbWFpbHMsXG4gIFRlbXBFbWFpbENsaWVudCxcbiAgc2V0Q29uZmlnLFxuICBnZXRDb25maWcsXG59O1xuIl19
|