cdk-preflight 0.0.121 → 0.0.122
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.
|
@@ -25,7 +25,7 @@ cdk-preflight のルール追加パイプライン。AGENTS.md の設計原則
|
|
|
25
25
|
- `walk` ビルトインは無い。`to_number`/`object.get`/`flatten_list`/`resolve` で明示的に書く
|
|
26
26
|
- fail テンプレートはこのルール**だけ**に違反、pass テンプレートは完全クリーン
|
|
27
27
|
- **数値・長さ・個数の制約は境界ちょうどで書く**。fail は「違反する値のうち限界に最も近いもの」、pass は「限界そのもの」— 20 文字下限なら fail=19 文字 / pass=20 文字であって、fail=5 文字 / pass=26 文字ではない。緩いペアはルールの向きしか証明しない(`count(v) < 20` は fail が 5 文字なら定数が `< 10` でも鳴り、pass が 26 文字なら `< 25` でも黙る)ので、定数も比較演算子も固定できないし、実機ゲートの証拠も弱くなる(19 文字が CREATE に失敗して初めて下限 20 が実証される)。ルールが両端を見ているレンジは fail に両端を置く(fail の判定は「自分のルールの診断が 1 件以上」なので、違反リソースを 2 つ並べてよい)。エンジンのスキーマが既に持っている側の端は入れない — ルールもそこは見ていない(原則 1)し、重複ガードが赤くなる。順序の無い制約(プロパティ欠落、enum の値違い、リソース間の不整合)には境界が無いので対象外
|
|
28
|
-
4. **ローカルゲート**: まず `npx ts-node --transpile-only --project test/tsconfig.json scripts/rule-check.ts check <service|rule-id>...` を回す。`rules/` を直接読んで 1 エンジンに全ルールを載せ、fail が自分のルールで鳴るか / pass が全ルール無音か / どちらも組み込みエンジンに止められないかを返す(`bundle-rules` も meta.yaml の evidence も要らないので、実機ゲート前の直しはここで回す。80 本で数秒)。全部 `ok` になってから `npx projen bundle-rules && npx jest test/rules.test.ts
|
|
28
|
+
4. **ローカルゲート**: まず `npx ts-node --transpile-only --project test/tsconfig.json scripts/rule-check.ts check <service|rule-id>...` を回す。`rules/` を直接読んで 1 エンジンに全ルールを載せ、fail が自分のルールで鳴るか / pass が全ルール無音か / どちらも組み込みエンジンに止められないかを返す(`bundle-rules` も meta.yaml の evidence も要らないので、実機ゲート前の直しはここで回す。80 本で数秒)。全部 `ok` になってから `npx projen bundle-rules && npx jest test/rules test/structure.test.ts`(`test/rules` は `rules.test.ts` と、ルール表を回す `rules.shard*.test.ts` の両方に当たる)(`bundle-rules` は `src/rules.generated.ts` / `docs/rules.md` に加えて **README のルール数バッジと対応リソースタイプ一覧も書き換える**。手で直さない。古いままなら `structure.test.ts` が落ちる)。**`rules/<service>/` を新設したときは `npx projen` も回す** — `.github/workflows/monthly-verify.yml` のサービス行列はそこから生成されるので、`bundle-rules` だけでは更新されず PR の self-mutation チェックが赤くなる(2026-09-13、Athena 追加で踏んだ)。`structure.test.ts` は手順 3 の境界値を機械で見る(rego のしきい値ごとに fail へ「限界に最も近い違反値」、pass へ「限界そのもの」が現れるか)。しきい値の検出が意味を持たないルールだけ `rules/_boundary-exceptions.txt` に理由付きで逃がす。**jest は `-t` で対象を絞る**。フルスイートは PR 直前の 1 回だけでよく、実測では 401 回中 73 回がフル実行で合計 5.8 時間を溶かしている。
|
|
29
29
|
5. **実機再現ゲート**: `bash bench/verify-rule.sh <rule-id>`(要 AWS 認証)。観測したエラーメッセージと日付を `meta.yaml#repro.evidence` に記録。
|
|
30
30
|
- **evidence には実際にデプロイした値を書く**(`bench 2026-09-13 us-east-1: 19-char Value -> "...at least 20 characters" (ROLLBACK_COMPLETE); pass 20-char -> CREATE_COMPLETE`)。境界ちょうどのフィクスチャと組で、限界の位置そのものが meta.yaml から読める
|
|
31
31
|
- fail テンプレートがデプロイに**成功**したら、それはドキュメント側の誤り(BROKEN-EXPECTATION)。ルールを削除し、証拠を issue に残して終了する。CloudFront では明文化された制約 9 件中 3 件がこれだった(2026-09-02)
|
|
@@ -112,7 +112,10 @@ B の後は課金物の実在確認も回す(例 `aws athena list-capacity-res
|
|
|
112
112
|
## 関門
|
|
113
113
|
|
|
114
114
|
**自動でやってよい**: issue コメントの投稿(着手・調査結果・API 結果)、実機再現ゲート(無料〜数円のスタックを多数作る)、
|
|
115
|
-
|
|
115
|
+
ブランチへのコミット。**PR がマージされた後の後片付けも全部**(2026-09-14 のユーザー指示「勝手にやっておk 今後も」):
|
|
116
|
+
結果コメントを残して issue を close / #91 のチェックを付けて 1 行サマリを書く / ルールにできなかった分を #91 の「積み残し」に移す。
|
|
117
|
+
#91 の本文を書き換えるときは `gh issue view 91 --json body -q .body` で**その場で取り直して**から編集し、
|
|
118
|
+
`[ -s <file> ]` で非空を確かめてから `gh issue edit`、最後に `grep` で反映を確認する(古い/空の `--body-file` は本文を丸ごと上書きする)。
|
|
116
119
|
|
|
117
120
|
**止まって人間に聞く**:
|
|
118
121
|
|
|
@@ -120,8 +123,7 @@ B の後は課金物の実在確認も回す(例 `aws athena list-capacity-res
|
|
|
120
123
|
- 課金リソースが必要だと判明したとき(作らずに報告して止まる)
|
|
121
124
|
- `.claude/settings*.json` の permission を足したくなったとき(**自分で書き換えない**)
|
|
122
125
|
|
|
123
|
-
**絶対にしない**:
|
|
124
|
-
その先は全部人間の仕事)、既存の無料下敷き(`pfdb` / `pfwg` / `cdkpf-*-probe` ロールやバケット)の削除。
|
|
126
|
+
**絶対にしない**: 課金リソースの作成、既存の無料下敷き(`pfdb` / `pfwg` / `cdkpf-*-probe` ロールやバケット)の削除。
|
|
125
127
|
|
|
126
128
|
## やらないこと
|
|
127
129
|
|
package/.jsii
CHANGED
|
@@ -9482,7 +9482,7 @@
|
|
|
9482
9482
|
},
|
|
9483
9483
|
"locationInModule": {
|
|
9484
9484
|
"filename": "src/index.ts",
|
|
9485
|
-
"line":
|
|
9485
|
+
"line": 93
|
|
9486
9486
|
},
|
|
9487
9487
|
"name": "ruleIds",
|
|
9488
9488
|
"returns": {
|
|
@@ -9600,6 +9600,6 @@
|
|
|
9600
9600
|
"symbolId": "src/index:PreflightOptions"
|
|
9601
9601
|
}
|
|
9602
9602
|
},
|
|
9603
|
-
"version": "0.0.
|
|
9604
|
-
"fingerprint": "
|
|
9603
|
+
"version": "0.0.122",
|
|
9604
|
+
"fingerprint": "CXf4WHV95yWFjsMKp4xBg1usqS8JMPdQz72DaTgvZ2I="
|
|
9605
9605
|
}
|
package/AGENTS.md
CHANGED
|
@@ -14,7 +14,7 @@ Growth is the normal state. The upstream engine ships slowly and carefully by de
|
|
|
14
14
|
|
|
15
15
|
## Design principles (do not violate)
|
|
16
16
|
|
|
17
|
-
1. **No duplication of the engine.** If the bundled engine already reports a constraint as ERROR/FATAL (schema check or built-in rule), we must not re-implement it. `test/rules.test.ts` enforces this mechanically ("does not duplicate a built-in blocker"). If that test fails for a new rule, the rule is unnecessary — delete it and record why in the PR.
|
|
17
|
+
1. **No duplication of the engine.** If the bundled engine already reports a constraint as ERROR/FATAL (schema check or built-in rule), we must not re-implement it. `test/rule-table.ts`, run through the `test/rules.shard*.test.ts` files, enforces this mechanically ("does not duplicate a built-in blocker"). If that test fails for a new rule, the rule is unnecessary — delete it and record why in the PR.
|
|
18
18
|
2. **Every rule ships with proof.** `templates/fail.template.json` must violate exactly this rule; `templates/pass.template.json` must be clean. `meta.yaml#repro` records how the deploy-time failure was verified (`real-deploy` / `research-case` / `doc-only` — the last one requires an explanation in `evidence`).
|
|
19
19
|
|
|
20
20
|
**Both fixtures sit on the boundary.** For an ordered constraint (a number, a length, a count) the fail template carries the *tightest violating* value and the pass template the *exact limit* — a 20-character minimum gets a 19-character fail and a 20-character pass, not 5 and 26. A slack pair proves only the direction of the rule: `count(v) < 20` still fires on a 5-character fail template when the constant is wrong (`< 10`), and a 26-character pass template stays silent even at `< 25`, so neither the constant nor the comparison operator is pinned by the fixtures. It also weakens the real-deploy gate, which is the only thing that establishes where AWS's limit actually is — a 19-character key that fails CREATE proves the documented 20, a 5-character one proves "somewhere above 5". A range the rule checks at both ends gets a resource at each end (the fixture assertion is "at least one diagnostic for this rule", so several violating resources in one fail template are fine, and a branch a single fixture cannot reach gets a targeted case in `test/rules.test.ts`). An end the engine's schema already enforces stays out of the fail template — the rule does not check it (principle 1) and the duplication guard would flag it. Constraints with no ordering — a missing property, a wrong enum member, a cross-resource mismatch — have no boundary to sit on. The evidence line records the values that were actually deployed, so it pins the boundary too: `bench 2026-09-13 us-east-1: 19-char Value -> "API Key value should be at least 20 characters" (ROLLBACK_COMPLETE); pass 20-char -> CREATE_COMPLETE`.
|
|
@@ -68,7 +68,7 @@ The ordering is by **how easily the L2 guard is bypassed in normal use**, not by
|
|
|
68
68
|
|
|
69
69
|
The two failure modes are watched separately: **staleness** (the constraint disappeared at AWS — the fail template now deploys clean) is caught by the monthly real-deploy run and reported as BROKEN; **obsolescence** (the engine caught up — the rule is now a duplicate) is caught by the duplication guard and the redundancy scan and reported as REDUNDANT. Both land in the monthly issue.
|
|
70
70
|
|
|
71
|
-
**Adding.** Two gates, both mechanical, and nothing else can reject a candidate: the duplication guard (`test/rules.test.ts`) and the real-deploy gate (`bench/verify-rule.sh`). The real-deploy gate is the one thing that did *not* get looser with the widened scope, and deliberately so — `enforce` is the default mode, so a false positive is a hard synth failure in someone's CI. The CloudFront survey is the standing evidence: 3 of 9 documented constraints deployed clean (see "A doc sentence is a hypothesis" above). Volume comes from running the bench over more services, never from lowering that bar.
|
|
71
|
+
**Adding.** Two gates, both mechanical, and nothing else can reject a candidate: the duplication guard (`test/rules.shard*.test.ts`) and the real-deploy gate (`bench/verify-rule.sh`). The real-deploy gate is the one thing that did *not* get looser with the widened scope, and deliberately so — `enforce` is the default mode, so a false positive is a hard synth failure in someone's CI. The CloudFront survey is the standing evidence: 3 of 9 documented constraints deployed clean (see "A doc sentence is a hypothesis" above). Volume comes from running the bench over more services, never from lowering that bar.
|
|
72
72
|
|
|
73
73
|
**Retiring.** The trigger is the bundled engine (or CloudFormation's server-side validation) starting to block the constraint — never an L2 construct, never cfn-lint. You do not have to watch for it; two mechanisms report it:
|
|
74
74
|
|
|
@@ -146,10 +146,10 @@ If you are a subagent running one of these phases, do not spawn further agents.
|
|
|
146
146
|
- **Dynamic reference strings are markerized too** (measured 2026-09-03): a literal `{{resolve:ssm:/path}}` property value surfaces as `{"__dynamic": "dynamic reference: {{resolve:ssm:/path}}", "__param_type": "String"}` and `resolve()` is undefined for it. A rule that judges the reference text itself (e.g. the SSM parameter path) must read the raw property with `object.get` and extract the `__dynamic` string. Reference implementation: `pf-ec2-instance-ami-arch`.
|
|
147
147
|
- **Deploy-region rules**: the enforce plugin injects a generated module defining `deploy_region` (and `deploy_account` when the account id is concrete) whenever the app-level region is concrete (`deployEnvironmentModule` in `src/private/enforce.ts`; the test harness injects `us-east-1` for fixtures). Rules must read it as `data.cdk_preflight.deploy_region` — the data reference is undefined when not injected, so the rule skips; a bare `deploy_region` variable would be a compile error. `data.cdk_preflight.deploy_account` works the same way (`pf-kms-key-policy-lockout` treats any account as ours when it is absent, `pf-kms-alias-target` skips its account check). Consequences: region-dependent rules are silent in warn mode (`enforce: false` hands rules to the CDK built-in plugin, which we cannot inject into) and in region-agnostic apps; say so in `meta.yaml#repro.evidence`. Reference implementations: `pf-dynamodb-global-table-replica-region`, `pf-dynamodb-kinesis-stream-region`.
|
|
148
148
|
- Helper rules must use a unique `_pf_<rule>_...` prefix (all rules share one package, and the enforce plugin loads a service's rules as a single module). `bundle-rules` fails the build when two modules define the same top-level name — without the check, the second definition merges into the first as an incremental rule and both rules quietly change meaning. A name two rules genuinely need belongs in `rules/_lib/`.
|
|
149
|
-
- **`meta.resourceTypes` is load-bearing, not documentation.** The enforce plugin compiles only the rules whose declared types appear in the synthesized templates — rule compilation is the dominant fixed cost (~4.6s for the whole pack, ~0.8s for the ~100 rules a typical app keeps), so this is what keeps `cdk synth` usable as the pack grows. A type a rule *reads* but does not *declare* makes the rule silently stop firing on real apps. Declare every type the rule touches, including the counterpart of a cross-resource rule; `test/rules.test.ts` checks every rule survives pruning against its own fail template.
|
|
149
|
+
- **`meta.resourceTypes` is load-bearing, not documentation.** The enforce plugin compiles only the rules whose declared types appear in the synthesized templates — rule compilation is the dominant fixed cost (~4.6s for the whole pack, ~0.8s for the ~100 rules a typical app keeps), so this is what keeps `cdk synth` usable as the pack grows. A type a rule *reads* but does not *declare* makes the rule silently stop firing on real apps. Declare every type the rule touches, including the counterpart of a cross-resource rule; `test/rules.shard*.test.ts` checks every rule survives pruning against its own fail template.
|
|
150
150
|
- A helper several rules of one service need (parsing an opaque DSL, enumerating nested scopes) goes in `rules/_lib/<service>.rego` with a `_pf_<service>lib_` prefix (`rules/_lib/sfn.rego` is the reference: ASL from `DefinitionString` *or* the L1 `Definition` object, nested Parallel/Map scopes to depth 3, effective QueryLanguage). Rules never reference another rule's helpers — `exclude` can unload any rule, a lib is always loaded.
|
|
151
151
|
- **Cheap screen for definition-level constraints**: some services expose their create-time validator as a free API (`aws stepfunctions validate-state-machine-definition --type STANDARD|EXPRESS` is the same validator CreateStateMachine runs). Use it to triage doc hypotheses before spending a CloudFormation deploy on each — 100 Step Functions hypotheses took minutes (2026-09-05). The real-deploy gate stays.
|
|
152
|
-
3. `npx ts-node --transpile-only --project test/tsconfig.json scripts/rule-check.ts check <service|rule-id>` while iterating: it reads `rules/` straight from disk into a single engine (no bundle, no meta validation, no jest) and reports, per rule, whether the fail template fires its own rule, the pass template is silent for every rule, and neither trips a built-in ERROR/FATAL. Then `npx projen bundle-rules` and `npx jest test/rules.test.ts test/
|
|
152
|
+
3. `npx ts-node --transpile-only --project test/tsconfig.json scripts/rule-check.ts check <service|rule-id>` while iterating: it reads `rules/` straight from disk into a single engine (no bundle, no meta validation, no jest) and reports, per rule, whether the fail template fires its own rule, the pass template is silent for every rule, and neither trips a built-in ERROR/FATAL. Then `npx projen bundle-rules` and `npx jest test/rules test/structure.test.ts` (the `test/rules` pattern picks up both `rules.test.ts` and the `rules.shard*.test.ts` files that carry the per-rule table) — the duplication guard and fixture checks run there for real. Prefer `jest -t` while iterating; the full suite is ~11,400 tests / ~2.5 min on 8 cores (measured 2026-09-14), so keep it for the pre-PR run.
|
|
153
153
|
4. **Real-deploy gate**: `bash bench/verify-rule.sh <rule-id>` deploys the fail template (expects CREATE to fail; records the service error message) and, where cheap, the pass template (expects success, then deletes). Paste the observed error into `meta.yaml#repro.evidence` with the date. Only `doc-only` rules may skip this, with justification.
|
|
154
154
|
5. Update nothing else by hand — `docs/rules.md`, `src/rules.generated.ts`, and the parts of `README.md` between the
|
|
155
155
|
`<!-- supported-resources:start -->` markers (plus the rule-count badge) are all written by `npx projen bundle-rules`.
|
package/lib/index.js
CHANGED
|
@@ -17,7 +17,7 @@ const rules_generated_1 = require("./rules.generated");
|
|
|
17
17
|
* Preflight.apply(app);
|
|
18
18
|
*/
|
|
19
19
|
class Preflight {
|
|
20
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "0.0.
|
|
20
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "0.0.122" };
|
|
21
21
|
/**
|
|
22
22
|
* Register the cdk-preflight rules on an App or Stage.
|
|
23
23
|
*/
|
|
@@ -38,12 +38,7 @@ class Preflight {
|
|
|
38
38
|
(0, enforce_1.installEnforceGate)(scope);
|
|
39
39
|
}
|
|
40
40
|
else {
|
|
41
|
-
aws_cdk_lib_1.Validations.of(scope).addPlugins(
|
|
42
|
-
regoRules: [
|
|
43
|
-
...rules_generated_1.BUNDLED_LIBS.map((l) => ({ name: l.name, content: l.rego })),
|
|
44
|
-
...selected.map((r) => ({ name: r.id, content: r.rego })),
|
|
45
|
-
],
|
|
46
|
-
}));
|
|
41
|
+
aws_cdk_lib_1.Validations.of(scope).addPlugins((0, enforce_1.observePluginCached)(selected));
|
|
47
42
|
}
|
|
48
43
|
}
|
|
49
44
|
/**
|
|
@@ -55,4 +50,4 @@ class Preflight {
|
|
|
55
50
|
constructor() { }
|
|
56
51
|
}
|
|
57
52
|
exports.Preflight = Preflight;
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZDQUFpRDtBQUVqRCwrQ0FBb0c7QUFDcEcsdURBQWtEO0FBa0RsRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBYSxTQUFTOztJQUNwQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBaUIsRUFBRSxVQUE0QixFQUFFO1FBQ25FLElBQUksQ0FBQyxtQkFBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0VBQXNFLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQywrQkFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsK0JBQWE7YUFDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDO2FBQzFGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFDLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1Qix5QkFBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxnQ0FBc0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2hHLElBQUEsNEJBQWtCLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQzthQUFNLENBQUM7WUFDTix5QkFBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBQSw2QkFBbUIsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTztRQUNuQixPQUFPLCtCQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELGdCQUF1QixDQUFDOztBQWhDMUIsOEJBaUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhZ2UsIFZhbGlkYXRpb25zIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgaW5zdGFsbEVuZm9yY2VHYXRlLCBvYnNlcnZlUGx1Z2luQ2FjaGVkLCBQcmVmbGlnaHRFbmZvcmNlUGx1Z2luIH0gZnJvbSAnLi9wcml2YXRlL2VuZm9yY2UnO1xuaW1wb3J0IHsgQlVORExFRF9SVUxFUyB9IGZyb20gJy4vcnVsZXMuZ2VuZXJhdGVkJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgUHJlZmxpZ2h0LmFwcGx5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVmbGlnaHRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJ1bGUgaWRzIHRvIGRpc2FibGUgKHNlZSBgUHJlZmxpZ2h0LnJ1bGVJZHMoKWAgb3IgZG9jcy9ydWxlcy5tZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWxsIGJ1bmRsZWQgcnVsZXMgYXJlIGVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGU/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRmFpbCBzeW50aGVzaXMgd2hlbiBhIGJ1bmRsZWQgcnVsZSBpcyB2aW9sYXRlZC5cbiAgICpcbiAgICogSW4gdGhlIGRlZmF1bHQgKGVuZm9yY2UpIG1vZGUsIGNkay1wcmVmbGlnaHQgZXZhbHVhdGVzIGl0cyBydWxlcyB3aXRoIGl0c1xuICAgKiBvd24gdmFsaWRhdGlvbiBwbHVnaW4gYW5kIGEgdmlvbGF0aW9uIG1ha2VzIGBjZGsgc3ludGhgIGZhaWwg4oCUIHRoZSB3aG9sZVxuICAgKiBwb2ludCBvZiBwcmVmbGlnaHQgY2hlY2tzIGlzIHRoYXQgYSB0ZW1wbGF0ZSBrbm93biB0byBmYWlsIGF0IGRlcGxveSB0aW1lXG4gICAqIG5ldmVyIGxlYXZlcyB5b3VyIG1hY2hpbmUuIFNldCBgZW5mb3JjZTogZmFsc2VgIHRvIG9ic2VydmUgZmlyc3Q6IGZpbmRpbmdzXG4gICAqIGFyZSB0aGVuIHJlcG9ydGVkIHRocm91Z2ggdGhlIENESyBidWlsdC1pbiBDbG91ZEZvcm1hdGlvbiB2YWxpZGF0b3IgYW5kXG4gICAqIHN1cmZhY2UgYXMgc3ludGggd2FybmluZ3Mgd2l0aCBjb25zdHJ1Y3QgdHJhY2VzLCB3aGljaCBjYW4gYmUgbXV0ZWQgcGVyXG4gICAqIGZpbmRpbmcgdmlhIGBBY2tub3dsZWRnZSB3aXRoICdDbG91ZEZvcm1hdGlvbi1WYWxpZGF0ZTo6PHJ1bGUtaWQ+J2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuZm9yY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbiBlbmZvcmNlIG1vZGUsIGFkZGl0aW9uYWxseSBmYWlsIHN5bnRoZXNpcyBvbiBlcnJvci1jbGFzcyBmaW5kaW5nc1xuICAgKiAoc2V2ZXJpdHkgRVJST1IvRkFUQUwpIG9mIHRoZSBidWlsdC1pbiB2YWxpZGF0aW9uIGVuZ2luZSBpdHNlbGYsIGUuZy5cbiAgICogc2NoZW1hIHZpb2xhdGlvbnMgbGlrZSBgRjMwMzRgLiBUaGlzIGlzIHRoZSB3b3JrYXJvdW5kIGZvciB0aGUgQ0RLXG4gICAqIGJlaGF2aW9yIHdoZXJlIGFsbCBidWlsdC1pbiBmaW5kaW5ncyBhcmUgZG93bmdyYWRlZCB0byB3YXJuaW5ncy5cbiAgICpcbiAgICogT25seSBlZmZlY3RpdmUgaW4gZW5mb3JjZSBtb2RlICh0aGUgZGVmYXVsdCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzdHJpY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIHJ1bGVzIHRoYXQgYXJlIG1hcmtlZCBgcGVuZGluZy1lbmdpbmVgIChjYW5kaWRhdGVzIHRoYXQgaGF2ZSBiZWVuXG4gICAqIHByb3Bvc2VkIHRvIHRoZSB1cHN0cmVhbSBjbG91ZGZvcm1hdGlvbi12YWxpZGF0ZSBlbmdpbmUgYnV0IGFyZSBub3QgbWVyZ2VkXG4gICAqIHlldCkuIERpc2FibGUgdGhpcyBpZiB5b3UgcnVuIGEgbmV3ZXIgZW5naW5lIHRoYXQgYWxyZWFkeSBjb3ZlcnMgdGhlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZVVwc3RyZWFtUGVuZGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogY2RrLXByZWZsaWdodDogY2F0Y2ggZGVwbG95LXRpbWUgQ2xvdWRGb3JtYXRpb24gZmFpbHVyZXMgYXQgc3ludGggdGltZS5cbiAqXG4gKiBJbmplY3RzIGEgY3VyYXRlZCBSZWdvIHJ1bGUgcGFjayAoY29uc3RyYWludHMgdGhhdCByZXNvdXJjZSBwcm92aWRlciBzY2hlbWFzXG4gKiBkbyBub3QgZXhwcmVzczogZG9jLW9ubHkgdmFsdWUgbGltaXRzLCBjcm9zcy1wcm9wZXJ0eSBhbmQgY3Jvc3MtcmVzb3VyY2VcbiAqIHJ1bGVzKSBpbnRvIHRoZSBBV1MgQ0RLIGJ1aWx0LWluIENsb3VkRm9ybWF0aW9uIHZhbGlkYXRvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogZGVjbGFyZSBjb25zdCBhcHA6IEFwcDtcbiAqIFByZWZsaWdodC5hcHBseShhcHApO1xuICovXG5leHBvcnQgY2xhc3MgUHJlZmxpZ2h0IHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoZSBjZGstcHJlZmxpZ2h0IHJ1bGVzIG9uIGFuIEFwcCBvciBTdGFnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXBwbHkoc2NvcGU6IElDb25zdHJ1Y3QsIG9wdGlvbnM6IFByZWZsaWdodE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIGlmICghU3RhZ2UuaXNTdGFnZShzY29wZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2RrLXByZWZsaWdodDogUHJlZmxpZ2h0LmFwcGx5KCkgbXVzdCBiZSBjYWxsZWQgb24gYW4gQXBwIG9yIGEgU3RhZ2UnKTtcbiAgICB9XG4gICAgY29uc3QgZXhjbHVkZSA9IG9wdGlvbnMuZXhjbHVkZSA/PyBbXTtcbiAgICBjb25zdCB1bmtub3duID0gZXhjbHVkZS5maWx0ZXIoKGlkKSA9PiAhQlVORExFRF9SVUxFUy5zb21lKChyKSA9PiByLmlkID09PSBpZCkpO1xuICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2RrLXByZWZsaWdodDogdW5rbm93biBydWxlIGlkKHMpIGluIGV4Y2x1ZGU6ICR7dW5rbm93bi5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZCA9IEJVTkRMRURfUlVMRVNcbiAgICAgIC5maWx0ZXIoKHIpID0+IChvcHRpb25zLmluY2x1ZGVVcHN0cmVhbVBlbmRpbmcgPz8gdHJ1ZSkgfHwgci51cHN0cmVhbSAhPT0gJ3BlbmRpbmctZW5naW5lJylcbiAgICAgIC5maWx0ZXIoKHIpID0+ICFleGNsdWRlLmluY2x1ZGVzKHIuaWQpKTtcblxuICAgIGlmIChvcHRpb25zLmVuZm9yY2UgPz8gdHJ1ZSkge1xuICAgICAgVmFsaWRhdGlvbnMub2Yoc2NvcGUpLmFkZFBsdWdpbnMobmV3IFByZWZsaWdodEVuZm9yY2VQbHVnaW4oc2VsZWN0ZWQsIG9wdGlvbnMuc3RyaWN0ID8/IGZhbHNlKSk7XG4gICAgICBpbnN0YWxsRW5mb3JjZUdhdGUoc2NvcGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBWYWxpZGF0aW9ucy5vZihzY29wZSkuYWRkUGx1Z2lucyhvYnNlcnZlUGx1Z2luQ2FjaGVkKHNlbGVjdGVkKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZHMgb2YgYWxsIGJ1bmRsZWQgcnVsZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJ1bGVJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBCVU5ETEVEX1JVTEVTLm1hcCgocikgPT4gci5pZCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cbiJdfQ==
|
package/lib/private/enforce.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type IPolicyValidationContext, type IPolicyValidationPlugin, type PolicyValidationPluginReport } from 'aws-cdk-lib';
|
|
1
|
+
import { CloudFormationValidatePlugin, type IPolicyValidationContext, type IPolicyValidationPlugin, type PolicyValidationPluginReport } from 'aws-cdk-lib';
|
|
2
2
|
import type { IConstruct } from 'constructs';
|
|
3
3
|
import { type BundledRuleData } from '../rules.generated';
|
|
4
4
|
/**
|
|
@@ -72,6 +72,7 @@ export declare function installEnforceGate(scope: IConstruct): void;
|
|
|
72
72
|
export declare function fallbackFormat(pluginReports: any[]): string;
|
|
73
73
|
/** (テストからも利用するため export している) */
|
|
74
74
|
export declare function loadFormatter(): any | undefined;
|
|
75
|
+
export declare function observePluginCached(rules: BundledRuleData[]): CloudFormationValidatePlugin;
|
|
75
76
|
/**
|
|
76
77
|
* ルールを service ごとに 1 モジュールへまとめる。
|
|
77
78
|
*
|
package/lib/private/enforce.js
CHANGED
|
@@ -40,6 +40,7 @@ exports.isConcreteRegion = isConcreteRegion;
|
|
|
40
40
|
exports.installEnforceGate = installEnforceGate;
|
|
41
41
|
exports.fallbackFormat = fallbackFormat;
|
|
42
42
|
exports.loadFormatter = loadFormatter;
|
|
43
|
+
exports.observePluginCached = observePluginCached;
|
|
43
44
|
exports.mergeRuleModules = mergeRuleModules;
|
|
44
45
|
exports.templateResourceTypes = templateResourceTypes;
|
|
45
46
|
exports.prune = prune;
|
|
@@ -380,6 +381,31 @@ function regoEngineCached(engineModule, rules, region, account) {
|
|
|
380
381
|
}
|
|
381
382
|
return cachedRegoEngine.engine;
|
|
382
383
|
}
|
|
384
|
+
// 観測モード(enforce: false)は CDK 組み込みの CloudFormationValidatePlugin に相乗りする。
|
|
385
|
+
// あちらはコンストラクタでエンジンを 1 つ作って free() しないので、同じプロセスで App を
|
|
386
|
+
// 作り直すたびにインスタンスが積み上がり、regoEngineCached と同じ超線形の悪化を起こす
|
|
387
|
+
// (実測 2026-09-13: 同じルールセットで 4 回 synth して 36s -> 95s -> 131s -> 178s)。
|
|
388
|
+
// ルールセットが変わらない限りプラグインごと使い回す。
|
|
389
|
+
// ponytail: キーが変わったときに古いエンジンは free() しない(エンジンは CDK 側の
|
|
390
|
+
// private フィールドで、触るには内部実装に手を入れることになる)。設定違いの Stage が
|
|
391
|
+
// N 個あれば N 個積むが、実アプリでは 1〜2 個。積み上がりが問題になるなら、そのときに
|
|
392
|
+
// アップストリームへ free/dispose を入れてもらう。
|
|
393
|
+
let cachedObservePlugin;
|
|
394
|
+
function observePluginCached(rules) {
|
|
395
|
+
const key = rules.map((r) => r.id).join(',');
|
|
396
|
+
if (cachedObservePlugin?.key !== key) {
|
|
397
|
+
cachedObservePlugin = {
|
|
398
|
+
key,
|
|
399
|
+
plugin: new aws_cdk_lib_1.CloudFormationValidatePlugin({
|
|
400
|
+
regoRules: [
|
|
401
|
+
...rules_generated_1.BUNDLED_LIBS.map((l) => ({ name: l.name, content: l.rego })),
|
|
402
|
+
...mergeRuleModules(rules),
|
|
403
|
+
],
|
|
404
|
+
}),
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
return cachedObservePlugin.plugin;
|
|
408
|
+
}
|
|
383
409
|
/** 全ルールに共通の rego ヘッダ。bundle-rules が package 名と import を 1 種類に強制している。 */
|
|
384
410
|
const REGO_HEADER = 'package cdk_preflight\n\nimport rego.v1\n';
|
|
385
411
|
/**
|
|
@@ -477,4 +503,4 @@ function loadEngine() {
|
|
|
477
503
|
return undefined;
|
|
478
504
|
}
|
|
479
505
|
}
|
|
480
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL2VuZm9yY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLDBEQU1DO0FBR0QsOENBRUM7QUFNRCw0Q0FFQztBQTZMRCxnREFpQkM7QUF1REQsd0NBaUJDO0FBYUQsc0NBUUM7QUFnREQsNENBVUM7QUFRRCxzREFtQkM7QUFZRCxzQkFRQztBQU9ELGdDQWVDO0FBN2RELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsNkNBTXFCO0FBRXJCLHdEQUF3RTtBQUV4RSwwREFBMEQ7QUFDMUQ7OERBQzhEO0FBRTlEOzs7R0FHRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsd0JBQXdCLENBQUM7QUFFL0Q7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsTUFBYyxFQUFFLFNBQWtCO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdkcsT0FBTztRQUNMLElBQUksRUFBRSw4QkFBc0I7UUFDNUIsT0FBTyxFQUFFLCtEQUErRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sRUFBRTtLQUM3RyxDQUFDO0FBQ0osQ0FBQztBQUVELHlGQUF5RjtBQUN6RixTQUFnQixpQkFBaUIsQ0FBQyxTQUE2QjtJQUM3RCxPQUFPLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUEwQjtJQUN6RCxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSww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RyxDQUFDO1dBQzdCLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVU7SUFDeEIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsZUFBZTtJQUNqQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsMkNBQTJDLEVBQUU7WUFDMUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5QixDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEFwcCxcbiAgdHlwZSBJUG9saWN5VmFsaWRhdGlvbkNvbnRleHQsXG4gIHR5cGUgSVBvbGljeVZhbGlkYXRpb25QbHVnaW4sXG4gIHR5cGUgUG9saWN5VmFsaWRhdGlvblBsdWdpblJlcG9ydCxcbiAgdHlwZSBQb2xpY3lWaW9sYXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQlVORExFRF9MSUJTLCB0eXBlIEJ1bmRsZWRSdWxlRGF0YSB9IGZyb20gJy4uL3J1bGVzLmdlbmVyYXRlZCc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAtLSBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlIOOBr1xuICAgYXdzLWNkay1saWIg5ZCM5qKx44Kz44OU44O844KS5YuV55qE6Kej5rG644GZ44KL6Kit6KiI77yI5L6d5a2Y44Gr44Gv6LyJ44Gb44Gq44GE77yJ44CCUkVBRE1FL0FHRU5UUy5tZCDlj4LnhacgKi9cblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIFJlZ28gbW9kdWxlIHRoYXQgY2FycmllcyB0aGUgZGVwbG95bWVudFxuICogZW52aXJvbm1lbnQgaW50byBydWxlIGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBERVBMT1lfRU5WX01PRFVMRV9OQU1FID0gJ19wZl9kZXBsb3lfZW52aXJvbm1lbnQnO1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBnZW5lcmF0ZWQgbW9kdWxlIGRlZmluaW5nIGBkZXBsb3lfcmVnaW9uYCBmb3IgdGhlIHJ1bGUgcGFja2FnZS5cbiAqXG4gKiBSdWxlcyBtdXN0IHJlYWQgaXQgYXMgYGRhdGEuY2RrX3ByZWZsaWdodC5kZXBsb3lfcmVnaW9uYCAobmV2ZXIgYXMgYSBiYXJlXG4gKiB2YXJpYWJsZSk6IHRoZSBkYXRhIHJlZmVyZW5jZSBpcyBzaW1wbHkgdW5kZWZpbmVkIHdoZW4gdGhlIG1vZHVsZSBpcyBub3RcbiAqIGluamVjdGVkIOKAlCB0aGUgcnVsZSBib2R5IGZhaWxzIGFuZCB0aGUgcnVsZSBza2lwcyDigJQgd2hpbGUgYSBiYXJlIHZhcmlhYmxlXG4gKiB3b3VsZCBiZSBhIGNvbXBpbGUgZXJyb3IuIEluamVjdGVkIGJ5IHRoZSBlbmZvcmNlIHBsdWdpbiB3aGVuIHRoZSBhcHAtbGV2ZWxcbiAqIHJlZ2lvbiBpcyBjb25jcmV0ZTsgdGhlIHdhcm4gbW9kZSAoQ0RLIGJ1aWx0LWluIHBsdWdpbikgbmV2ZXIgaW5qZWN0cyBpdCxcbiAqIHNvIHJlZ2lvbi1kZXBlbmRlbnQgcnVsZXMgb25seSBmaXJlIGluIGVuZm9yY2UgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcGxveUVudmlyb25tZW50TW9kdWxlKHJlZ2lvbjogc3RyaW5nLCBhY2NvdW50SWQ/OiBzdHJpbmcpOiB7IG5hbWU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0ge1xuICBjb25zdCBhY2NvdW50ID0gaXNDb25jcmV0ZUFjY291bnQoYWNjb3VudElkKSA/IGBkZXBsb3lfYWNjb3VudCA6PSAke0pTT04uc3RyaW5naWZ5KGFjY291bnRJZCl9XFxuYCA6ICcnO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IERFUExPWV9FTlZfTU9EVUxFX05BTUUsXG4gICAgY29udGVudDogYHBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuZGVwbG95X3JlZ2lvbiA6PSAke0pTT04uc3RyaW5naWZ5KHJlZ2lvbil9XFxuJHthY2NvdW50fWAsXG4gIH07XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBhY2NvdW50IGZyb20gdGhlIHZhbGlkYXRpb24gY29udGV4dCBpcyBhIGNvbmNyZXRlIDEyLWRpZ2l0IGFjY291bnQgaWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb25jcmV0ZUFjY291bnQoYWNjb3VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhY2NvdW50SWQgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBhY2NvdW50SWQgPT09ICdzdHJpbmcnICYmIC9eXFxkezEyfSQvLnRlc3QoYWNjb3VudElkKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWdpb24gZnJvbSB0aGUgdmFsaWRhdGlvbiBjb250ZXh0IGlzIGEgY29uY3JldGUgcmVnaW9uIG5hbWVcbiAqIChhcyBvcHBvc2VkIHRvIHVuZGVmaW5lZCwgYW4gdW5yZXNvbHZlZCB0b2tlbiwgb3IgYSBwbGFjZWhvbGRlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbmNyZXRlUmVnaW9uKHJlZ2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogcmVnaW9uIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgcmVnaW9uID09PSAnc3RyaW5nJyAmJiAvXlthLXpdezJ9KC1bYS16XSspKy1cXGQrJC8udGVzdChyZWdpb24pO1xufVxuXG5pbnRlcmZhY2UgRW5naW5lRGlhZ25vc3RpYyB7XG4gIHJlYWRvbmx5IHJ1bGVJZDogc3RyaW5nO1xuICByZWFkb25seSBzZXZlcml0eTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW50aXR5PzogeyByZWFkb25seSBsb2dpY2FsSWQ/OiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgcHJvcGVydHlQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIGVuZm9yY2Ug44Oi44O844OJ55So44Gu5YaF6YOo44OX44Op44Kw44Kk44Oz44CCXG4gKlxuICogQ0RLIOe1hOOBv+i+vOOBv+OBriBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBr+WFqCBmaW5kaW5nIOOCkiB3YXJuaW5nIOOBq+S4uOOCgeOCi+OBn+OCgVxuICog77yIYXdzLWNkay1saWIgMi4yNjcuMCDlrp/muKzjgIHmmIfmoLzjg5Xjg6njgrDjgoLnhKHlirnvvInjgIHlkIzjgZjjgqjjg7Pjgrjjg7PjgpLnm7TmjqXlkbzjgbPjgIFcbiAqIGNkay1wcmVmbGlnaHQg44Gu44Or44O844Or6YGV5Y+N77yI44GK44KI44GzIHN0cmljdCDmmYLjga/jgqjjg7Pjgrjjg7Pjga7jgqjjg6njg7zjgq/jg6njgrnvvInjgpJcbiAqIHBvbGljeSB2YWxpZGF0aW9uIOOBruWkseaVl+OBqOOBl+OBpuWgseWRiuOBl+OBpiBzeW50aCDjgpLmraLjgoHjgovjgIJcbiAqL1xuZXhwb3J0IGNsYXNzIFByZWZsaWdodEVuZm9yY2VQbHVnaW4gaW1wbGVtZW50cyBJUG9saWN5VmFsaWRhdGlvblBsdWdpbiB7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lID0gUExVR0lOX05BTUU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBydWxlczogQnVuZGxlZFJ1bGVEYXRhW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdHJpY3Q6IGJvb2xlYW4sXG4gICkge31cblxuICBwdWJsaWMgdmFsaWRhdGUoY29udGV4dDogSVBvbGljeVZhbGlkYXRpb25Db250ZXh0KTogUG9saWN5VmFsaWRhdGlvblBsdWdpblJlcG9ydCB7XG4gICAgY29uc3QgZW5naW5lID0gbG9hZEVuZ2luZUNhY2hlZCgpO1xuICAgIGlmICghZW5naW5lKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ2Nkay1wcmVmbGlnaHQ6IGNvdWxkIG5vdCByZXNvbHZlIEBhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGU7ICcgK1xuICAgICAgICAnZW5mb3JjZSBtb2RlIGlzIHVuYXZhaWxhYmxlIGFuZCBubyBwcmVmbGlnaHQgY2hlY2tzIHdlcmUgcnVuLiAnICtcbiAgICAgICAgJ0luc3RhbGwgaXQgYXMgYSBkZXZEZXBlbmRlbmN5IG9yIHVzZSB0aGUgZGVmYXVsdCAod2FybikgbW9kZS4nLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHZpb2xhdGlvbnM6IFtdIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaW9uID0gaXNDb25jcmV0ZVJlZ2lvbihjb250ZXh0LnJlZ2lvbikgPyBjb250ZXh0LnJlZ2lvbiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhY2NvdW50ID0gaXNDb25jcmV0ZUFjY291bnQoY29udGV4dC5hY2NvdW50SWQpID8gY29udGV4dC5hY2NvdW50SWQgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3VycyA9IG5ldyBTZXQodGhpcy5ydWxlcy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBjb25zdCB2aW9sYXRpb25zOiBQb2xpY3lWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgLy8g5YWo44OG44Oz44OX44Os44O844OI44Gu5ZKM6ZuG5ZCI44Gn5YiI44KK6L6844KA44CC44OG44Oz44OX44Os44O844OI44GU44Go44Gr5YiI44KL44Go44Ko44Oz44K444Oz44KS5L2V5bqm44KCXG4gICAgLy8g5L2c44KK55u044GZ44GT44Go44Gr44Gq44KK44CB44Gd44Gh44KJ44Gu44Kz44K544OI44Gu5pa544GM6auY44GP44Gk44GP77yIcmVnb0VuZ2luZUNhY2hlZCDjga7jgrPjg6Hjg7Pjg4jlj4LnhafvvInjgIJcbiAgICBjb25zdCBydWxlcyA9IHBydW5lKHRoaXMucnVsZXMsIHRlbXBsYXRlUmVzb3VyY2VUeXBlcyhjb250ZXh0LnN0YWNrVGVtcGxhdGVzLm1hcCgoc3QpID0+IHN0LnRlbXBsYXRlUGF0aCkpKTtcblxuICAgIC8vIDEg5pys44KC5q6L44KJ44Gq44GEID0g44GT44Gu44Ki44OX44Oq44Gu44Oq44K944O844K544Gr6Zai5L+C44GZ44KL44Or44O844Or44GM54Sh44GE44CC44Ko44Oz44K444Oz44KS57WE44KA5b+F6KaB44KC54Sh44GEXG4gICAgLy8g77yIbGlicyDjgaDjgZHjgpLovInjgZvjgZ/jgqjjg7Pjgrjjg7Pjga8gdmlvbGF0aW9uIOODq+ODvOODq+OCkuaMgeOBn+OBmuOAgeipleS+oeaZguOBq+iQveOBoeOCi++8ieOAglxuICAgIC8vIHN0cmljdCDjga7jgajjgY3jga/ntYTjgb/ovrzjgb/jgqjjg7Pjgrjjg7Pjga4gZmluZGluZ3Mg44KS5ou+44GG5LuV5LqL44GM5q6L44KL44Gu44Gn6YCa5bi444Gp44GK44KK6YCy44KA44CCXG4gICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5zdHJpY3QpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHZpb2xhdGlvbnM6IFtdIH07XG4gICAgfVxuXG4gICAgbGV0IGVuZzogYW55O1xuICAgIHRyeSB7XG4gICAgICBlbmcgPSByZWdvRW5naW5lQ2FjaGVkKGVuZ2luZSwgcnVsZXMsIHJlZ2lvbiwgYWNjb3VudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8g44Or44O844Or44OR44OD44Kv44GM44Kz44Oz44OR44Kk44Or44Gn44GN44Gq44GEID0g44Gp44Gu44OG44Oz44OX44Os44O844OI44KC5qSc5p+744Gn44GN44Gq44GE44Gu44Gn44CBXG4gICAgICAvLyDlhajjgrnjgr/jg4Pjgq/jgbbjgpMgdmlvbGF0aW9uIOOCkueri+OBpuOCi++8iDEg5p6a44Ga44Gk44GuIGNhdGNoIOOBq+OBr+WIsOmBlOOBl+OBquOBhO+8ieOAglxuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHZpb2xhdGlvbnM6IGNvbnRleHQuc3RhY2tUZW1wbGF0ZXMubWFwKChzdCkgPT4gZW5naW5lRXJyb3JWaW9sYXRpb24oc3QsIGUpKSB9O1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3Qgb2YgY29udGV4dC5zdGFja1RlbXBsYXRlcykge1xuICAgICAgbGV0IHJlcG9ydDogYW55O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVwb3J0ID0gZW5nLnZhbGlkYXRlRGV0YWlsZWQobmV3IGVuZ2luZS5UZW1wbGF0ZUZpbGUoc3QudGVtcGxhdGVQYXRoKSwge1xuICAgICAgICAgIHBzZXVkb1BhcmFtZXRlck92ZXJyaWRlczoge1xuICAgICAgICAgICAgYWNjb3VudElkOiBjb250ZXh0LmFjY291bnRJZCxcbiAgICAgICAgICAgIHJlZ2lvbjogY29udGV4dC5yZWdpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyDntYTjgb/ovrzjgb/jg6vjg7zjg6vjga8gQ0RLIOe1hOOBv+i+vOOBv+OBriBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBjOWQjOOBmOODhuODs+ODl+ODrOODvOODiOOBq1xuICAgICAgICAgIC8vIOWvvuOBl+OBpuaXouOBq+i1sOOCieOBm+OBpuOBhOOCi+OAgnN0cmljdCDjgafjgarjgZHjgozjgbDntZDmnpzjgoLkvb/jgo/jgZrmjajjgabjgabjgYTjgovjga7jgafjgIHkuLjjgZTjgajliIfjgotcbiAgICAgICAgICAvLyDvvIjlrp/muKwgNzAg44Oq44K944O844K5IDEg5p6a44Gn5Yid5ZueIDMuMjdzIC0+IDAuMjJz77yJ44CCc3RyaWN0IOOBruOBqOOBjeOBoOOBkeW/heimgeOBq+OBquOCi+OAglxuICAgICAgICAgIGRpc2FibGVCdWlsdGluUnVsZXM6ICF0aGlzLnN0cmljdCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHRocm93IOOCkuWkluOBq+WHuuOBmeOBqCBDREsg44Gv44GT44Gu5ZG844Gz5Ye644GX44KSIHBsdWdpbiBmYWlsdXJl77yIdmlvbGF0aW9uIOOCvOODre+8ieOBqOOBl+OBplxuICAgICAgICAvLyDoqJjpjLLjgZnjgovjgaDjgZHjgavjgarjgorjgIHjgZPjgZPjgb7jgafjgavpm4bjgoHjgZ/pgZXlj43jgoLlvozntprjg4bjg7Pjg5fjg6zjg7zjg4jjga7pgZXlj43jgoLkuLjjgZTjgajmtojjgYjjgIFcbiAgICAgICAgLy8g5q6L44KL44Gu44GvIGBmYWlsZWQ6IHVuZGVmaW5lZGAg44Gg44GR44Gr44Gq44KL77yIaXNzdWUgIzE1Me+8ieOAglxuICAgICAgICAvLyBzeW50aCDjgpLmraLjgoHjgovjga7jga8gaW5zdGFsbEVuZm9yY2VHYXRlIOOBruW9ueebruOAguOBk+OBk+OBr+OAjOOBqeOBruOCueOCv+ODg+OCr+OBp+S9leOBjFxuICAgICAgICAvLyDotbfjgY3jgZ/jgYvjgI3jgpLjg6zjg53jg7zjg4jjgavmrovjgZfjgIHku5bjgrnjgr/jg4Pjgq/jga7jg6vjg7zjg6vjgpLotbDjgonjgZvntprjgZHjgovjgZ/jgoHjga7jgoLjga7jgIJcbiAgICAgICAgdmlvbGF0aW9ucy5wdXNoKGVuZ2luZUVycm9yVmlvbGF0aW9uKHN0LCBlKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBkIG9mIChyZXBvcnQuZGlhZ25vc3RpY3MgPz8gW10pIGFzIEVuZ2luZURpYWdub3N0aWNbXSkge1xuICAgICAgICBjb25zdCBpc091cnMgPSBkLnNvdXJjZSA9PT0gJ0NVU1RPTScgJiYgb3Vycy5oYXMoZC5ydWxlSWQpO1xuICAgICAgICBjb25zdCBpc1N0cmljdEhpdCA9IHRoaXMuc3RyaWN0XG4gICAgICAgICAgJiYgZC5zb3VyY2UgIT09ICdDVVNUT00nXG4gICAgICAgICAgJiYgKGQuc2V2ZXJpdHkgPT09ICdFUlJPUicgfHwgZC5zZXZlcml0eSA9PT0gJ0ZBVEFMJyk7XG4gICAgICAgIGlmICghaXNPdXJzICYmICFpc1N0cmljdEhpdCkgY29udGludWU7XG4gICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgcnVsZU5hbWU6IGQucnVsZUlkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkLm1lc3NhZ2UsXG4gICAgICAgICAgc2V2ZXJpdHk6IG1hcFNldmVyaXR5KGQuc2V2ZXJpdHkpLFxuICAgICAgICAgIHZpb2xhdGluZ1Jlc291cmNlczogW3tcbiAgICAgICAgICAgIHJlc291cmNlTG9naWNhbElkOiBkLmVudGl0eT8ubG9naWNhbElkID8/ICcodW5rbm93biknLFxuICAgICAgICAgICAgdGVtcGxhdGVQYXRoOiBzdC50ZW1wbGF0ZVBhdGgsXG4gICAgICAgICAgICBsb2NhdGlvbnM6IFtkLnByb3BlcnR5UGF0aCA/PyAnKHRlbXBsYXRlKSddLFxuICAgICAgICAgIH1dLFxuICAgICAgICAgIC4uLihkLmRvY3VtZW50YXRpb25VcmwgPyB7IHJ1bGVNZXRhZGF0YTogeyBEb2N1bWVudGF0aW9uVXJsOiBkLmRvY3VtZW50YXRpb25VcmwgfSB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDREsg57WE44G/6L6844G/44GuIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44Go5ZCM44GY5Yik5a6a44CCd2FybmluZyDjgaDjgZHjgarjgolcbiAgICAvLyDjg6zjg53jg7zjg4jjgavjga/ovInjgovjgYzlkIjmiJDjga/pgJrjgovvvIhDTEkg5YG044GvIHN1Y2Nlc3MvZmFpbHVyZSDjgavplqLjgo/jgonjgZrlv4XjgZrlh7rlipvjgZnjgovvvInjgIJcbiAgICByZXR1cm4geyBzdWNjZXNzOiB2aW9sYXRpb25zLmV2ZXJ5KCh2KSA9PiAhQkxPQ0tTX1NZTlRILmhhcyhTdHJpbmcodi5zZXZlcml0eSkpKSwgdmlvbGF0aW9ucyB9O1xuICB9XG59XG5cbi8qKiDlkIjmiJDjgpLmraLjgoHjgosgdmlvbGF0aW9uIHNldmVyaXR544CCICovXG5jb25zdCBCTE9DS1NfU1lOVEggPSBuZXcgU2V0KFsnZXJyb3InLCAnZmF0YWwnXSk7XG5cbi8qKlxuICog44Ko44Oz44K444Oz44GuIHNldmVyaXR5IOOCkiBwb2xpY3kgdmFsaWRhdGlvbiDjga4gc2V2ZXJpdHkg44Gr5YaZ44GZ44CC6KGo44GvIGF3cy1jZGstbGliIDIuMjY3LjAg44GuXG4gKiBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBqOWQjOS4gOOAgmByZXByby5tZXRob2Q6IGRvYy1vbmx5YCDjga7jg6vjg7zjg6vjga8gV0FSTiDjgpLlh7rjgZnjga7jgadcbiAqIHdhcm5pbmcg44Gr44Gq44KK44CB5aCx5ZGK44Gv44GV44KM44KL44GMIHN5bnRoIOOBr+atouOCgeOBquOBhO+8iOiovOaLoOOBjOWun+apn+OBruODh+ODl+ODreOCpOWkseaVl+OBp+OBr+OBquOBhOOBn+OCge+8ieOAglxuICovXG5mdW5jdGlvbiBtYXBTZXZlcml0eShzZXZlcml0eTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgIGNhc2UgJ0ZBVEFMJzpcbiAgICBjYXNlICdFUlJPUic6XG4gICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICBjYXNlICdXQVJOJzpcbiAgICAgIHJldHVybiAnd2FybmluZyc7XG4gICAgY2FzZSAnSU5GTyc6XG4gICAgICByZXR1cm4gJ2luZm9ybWF0aW9uYWwnO1xuICAgIGNhc2UgJ0RFQlVHJzpcbiAgICAgIHJldHVybiAnZGVidWcnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ3dhcm5pbmcnO1xuICB9XG59XG5cbi8qKlxuICog44Or44O844Or6KmV5L6h44Gd44Gu44KC44Gu44GM5aSx5pWX44GX44Gf44GT44Go44KS6KGo44GZIHZpb2xhdGlvbiDjga4gcnVsZU5hbWXjgIJcbiAqIOODkOODs+ODieODq+a4iOOBv+ODq+ODvOODq+OBriBpZCDjgafjga/jgarjgYTjga7jgacgYGV4Y2x1ZGVgIOOBp+OBr+a2iOOBm+OBquOBhO+8iOa2iOOBl+OBpuOCiOOBhOeKtuaFi+OBp+OBr+OBquOBhO+8ieOAglxuICovXG5leHBvcnQgY29uc3QgRU5HSU5FX0VSUk9SX1JVTEUgPSAncGYtZW5naW5lLWVycm9yJztcblxuLyoqIOOCqOODs+OCuOODs+OBjOaKleOBkuOBn+WApOOCkuODoeODg+OCu+ODvOOCuOOBq+iQveOBqOOBmeOAguOCqOODs+OCuOODs+OBryBFcnJvciDjgafjga/jgarjgY/ntKDjga7mloflrZfliJfjgpLmipXjgZLjgovjgZPjgajjgYzjgYLjgovjgIIgKi9cbmZ1bmN0aW9uIGVuZ2luZUVycm9yVGV4dChlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IChlIGFzIHsgbWVzc2FnZT86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2U7XG4gIHJldHVybiB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgbWVzc2FnZS5sZW5ndGggPiAwID8gbWVzc2FnZSA6IFN0cmluZyhlKTtcbn1cblxuLyoqIDEg5p6a44Gu44OG44Oz44OX44Os44O844OI44KS5qSc5p+744Gn44GN44Gq44GL44Gj44Gf44GT44Go44KSIHZpb2xhdGlvbiDjgajjgZfjgabloLHlkYrjgZnjgovjgIIgKi9cbmZ1bmN0aW9uIGVuZ2luZUVycm9yVmlvbGF0aW9uKHN0OiB7IHN0YWNrQ29uc3RydWN0UGF0aDogc3RyaW5nOyB0ZW1wbGF0ZVBhdGg6IHN0cmluZyB9LCBlOiB1bmtub3duKTogUG9saWN5VmlvbGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBydWxlTmFtZTogRU5HSU5FX0VSUk9SX1JVTEUsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnY2RrLXByZWZsaWdodCBjb3VsZCBub3QgZXZhbHVhdGUgaXRzIHJ1bGVzIGZvciB0aGlzIHRlbXBsYXRlLCBzbyBubyBwcmVmbGlnaHQgcnVsZSByYW4gZm9yIGl0OiAnXG4gICAgICArIGVuZ2luZUVycm9yVGV4dChlKSxcbiAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICBmaXg6ICdSZXBvcnQgdGhpcyBhdCBodHRwczovL2dpdGh1Yi5jb20vYmFkbWludG9uY3J5ZXIvY2RrLXByZWZsaWdodC9pc3N1ZXM7ICdcbiAgICAgICsgJ3RvIHVuYmxvY2sgdGhlIGJ1aWxkIG1lYW53aGlsZSwgdXNlIFByZWZsaWdodC5hcHBseShhcHAsIHsgZW5mb3JjZTogZmFsc2UgfSkuJyxcbiAgICB2aW9sYXRpbmdSZXNvdXJjZXM6IFt7XG4gICAgICBjb25zdHJ1Y3RQYXRoOiBzdC5zdGFja0NvbnN0cnVjdFBhdGgsXG4gICAgICB0ZW1wbGF0ZVBhdGg6IHN0LnRlbXBsYXRlUGF0aCxcbiAgICAgIGxvY2F0aW9uczogWycodGVtcGxhdGUpJ10sXG4gICAgfV0sXG4gIH07XG59XG5cbi8qKiBUaGUgcGx1Z2luIG5hbWUgcmVjb3JkZWQgaW4gYHZhbGlkYXRpb24tcmVwb3J0Lmpzb25gIGZvciBvdXIgZmluZGluZ3MuICovXG5leHBvcnQgY29uc3QgUExVR0lOX05BTUUgPSAnY2RrLXByZWZsaWdodCc7XG5cbi8qKiBUaGUgY2xvdWQgYXNzZW1ibHkgZmlsZSB0aGUgQ0RLIHdyaXRlcyBpdHMgdmFsaWRhdGlvbiByZXBvcnQgdG8uICovXG5jb25zdCBWQUxJREFUSU9OX1JFUE9SVF9GSUxFID0gJ3ZhbGlkYXRpb24tcmVwb3J0Lmpzb24nO1xuXG5jb25zdCBHQVRFX0lOU1RBTExFRCA9IFN5bWJvbC5mb3IoJ2Nkay1wcmVmbGlnaHQuZW5mb3JjZUdhdGUnKTtcblxuLyoqXG4gKiBlbmZvcmNlIOODouODvOODieOBruWPluOCiuOBk+OBvOOBl+OCkuWhnuOBkOOCsuODvOODiOOCkiBBcHAg44Gr5LuV6L6844KA44CCXG4gKlxuICogQ0RLIENMSSAyLjExMjguMSDku6XpmY3jga8gYXBwIOOBq+OAjOODrOODneODvOODiOOBryBDTEkg44GM5Yem55CG44GZ44KL44CN44Go5Lyd44GI44Gf44GG44GI44GnXG4gKiBgdmFsaWRhdGlvbi1yZXBvcnQuanNvbmAg44KS6Ieq5YiG44Gn6Kqt44KA44GM44CB44Gd44Gu57We44KK6L6844G/77yIdG9vbGtpdC1saWIg44GuXG4gKiBgZmlsdGVyUmVwb3J0c0J5U3RhY2tzYO+8ieOBjCB2aW9sYXRpb24g44GuIGNvbnN0cnVjdFBhdGgg5YWI6aCt44K744Kw44Oh44Oz44OI44KSXG4gKiDpgbjmip7jgrnjgr/jg4Pjgq/jga4gaGllcmFyY2hpY2FsSWQg44Go56qB44GN5ZCI44KP44Gb44KL44Gf44KB44CBYFN0YWdlL1N0YWNrYCDlvaLlvI/jgavjgarjgotcbiAqIFN0YWdlIOWGheOCueOCv+ODg+OCr+OBrumBleWPjeOBjOOBmeOBueOBpuaNqOOBpuOCieOCjOOAgXN5bnRoIOOBjOm7meOBo+OBpuaIkOWKn+OBmeOCi++8iGlzc3VlICMxMTPvvInjgIJcbiAqXG4gKiDjgZ3jgZPjgacgc3ludGgg5a6M5LqG5b6M44Gr44Os44Od44O844OI44KS6Kqt44G/55u044GX44CBY2RrLXByZWZsaWdodCDjga7pgZXlj43jgYzmrovjgaPjgabjgYTjgozjgbBcbiAqIOiHquWIhuOBp+WgseWRiuOBl+OBpiBzeW50aCDjgpLmraLjgoHjgovjgILjg6njgqTjg5bjg6njg6rjgYzoh6rlipvjgafloLHlkYrjgZnjgovntYzot6/vvIjntKDjga4gbm9kZSDlrp/ooYzjgIFcbiAqIGplc3TjgIFDTEkgMi4xMTI4LjEg5pyq5rqA77yJ44Gn44GvIHN5bnRoIOOBjOS+i+WkluOCkuaKleOBkuOCi+OBn+OCgeOBk+OBk+OBq+OBr+WIsOmBlOOBm+OBmuOAgVxuICog5LqM6YeN5aCx5ZGK44Gv6LW344GN44Gq44GE44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsRW5mb3JjZUdhdGUoc2NvcGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgY29uc3Qgcm9vdCA9IHNjb3BlLm5vZGUucm9vdDtcbiAgaWYgKCFBcHAuaXNBcHAocm9vdCkpIHJldHVybjtcbiAgY29uc3QgYXBwID0gcm9vdCBhcyBBcHAgJiB7IFtHQVRFX0lOU1RBTExFRF0/OiBib29sZWFuIH07XG4gIGlmIChhcHBbR0FURV9JTlNUQUxMRURdKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAsIEdBVEVfSU5TVEFMTEVELCB7IHZhbHVlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcblxuICBjb25zdCBzeW50aCA9IGFwcC5zeW50aC5iaW5kKGFwcCk7XG4gIGxldCBjaGVja2VkID0gZmFsc2U7XG4gIGFwcC5zeW50aCA9IChvcHRpb25zPzogUGFyYW1ldGVyczxBcHBbJ3N5bnRoJ10+WzBdKSA9PiB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBzeW50aChvcHRpb25zKTtcbiAgICBpZiAoIWNoZWNrZWQpIHtcbiAgICAgIGNoZWNrZWQgPSB0cnVlO1xuICAgICAgZmFpbElmUmVwb3J0VW5oYW5kbGVkKGFzc2VtYmx5LmRpcmVjdG9yeSk7XG4gICAgfVxuICAgIHJldHVybiBhc3NlbWJseTtcbiAgfTtcbn1cblxuLyoqXG4gKiDjg6zjg53jg7zjg4jjgasgY2RrLXByZWZsaWdodCDjga7lpLHmlZfjgYzmrovjgaPjgabjgYTjgozjgbDjgIFmaW5kaW5ncyDjgpLlh7rlipvjgZfjgaYgc3ludGgg44KS5q2i44KB44KL44CCXG4gKlxuICog5Yik5a6a44GvIGNkay1wcmVmbGlnaHQg44Gu44Os44Od44O844OI44Gg44GR44KS6KaL44KL44CC57WE44G/6L6844G/44Ko44Oz44K444Oz44KEIGNvbnN0cnVjdCBhbm5vdGF0aW9uXG4gKiDjgaDjgZHjgYzlpLHmlZfjgZfjgabjgYTjgovloLTlkIjjga8gQ0xJIOOBjOato+OBl+OBj+aJseOBiOOCi+OBruOBp+OAgeOBk+OBoeOCieOBr+m7meOBo+OBpiBDTEkg44Gr5Lu744Gb44KL44CCXG4gKiDpgIbjgavnmbrngavjgZnjgovjgajjgY3jga/jg6zjg53jg7zjg4jlhajkvZPjgpLlh7rjgZnjgILjgZPjgZPjgacgc3ludGgg44KS5q2i44KB44KL44GoIENMSSDlgbTjga7lh7rlipvjgYxcbiAqIOS4gOWIh+i1sOOCieOBquOBhOOBn+OCgeOAgeWQjOaZguOBq+WHuuOBpuOBhOOBn+OBr+OBmuOBruS7luODl+ODqeOCsOOCpOODs+OBriBmaW5kaW5nIOOBjOa2iOOBiOOBpuOBl+OBvuOBhuOAglxuICovXG5mdW5jdGlvbiBmYWlsSWZSZXBvcnRVbmhhbmRsZWQoZGlyZWN0b3J5OiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IHBsdWdpblJlcG9ydHM6IGFueVtdO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9ydCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkaXJlY3RvcnksIFZBTElEQVRJT05fUkVQT1JUX0ZJTEUpLCAndXRmOCcpKTtcbiAgICBwbHVnaW5SZXBvcnRzID0gcmVwb3J0Py5wbHVnaW5SZXBvcnRzID8/IFtdO1xuICB9IGNhdGNoIHtcbiAgICAvLyDjg6zjg53jg7zjg4jjgYznhKHjgYTvvIjjg5fjg6njgrDjgqTjg7PmnKrlrp/ooYzvvInjgb7jgZ/jga/lo4rjgozjgabjgYTjgovloLTlkIjjga/kvZXjgoLjgZfjgarjgYRcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZmFpbGVkID0gcGx1Z2luUmVwb3J0cy5zb21lKFxuICAgIChyKSA9PiByPy5wbHVnaW5OYW1lID09PSBQTFVHSU5fTkFNRSAmJiByPy5jb25jbHVzaW9uID09PSAnZmFpbHVyZScsXG4gICk7XG4gIGlmICghZmFpbGVkKSByZXR1cm47XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5lcnJvcihmb3JtYXRSZXBvcnRzKHBsdWdpblJlcG9ydHMpKTtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdjZGstcHJlZmxpZ2h0OiB2YWxpZGF0aW9uIGZhaWxlZC4gRml4IHRoZSBmaW5kaW5ncyBhYm92ZSwgJyArXG4gICAgXCJhY2tub3dsZWRnZSB0aGVtIHdpdGggVmFsaWRhdGlvbnMub2Yoc2NvcGUpLmFja25vd2xlZGdlKHsgaWQ6ICdjZGstcHJlZmxpZ2h0Ojo8cnVsZS1pZD4nIH0pLCBcIiArXG4gICAgJ29yIGV4Y2x1ZGUgdGhlIHJ1bGUgdmlhIFByZWZsaWdodC5hcHBseShhcHAsIHsgZXhjbHVkZTogWy4uLl0gfSkuJyxcbiAgKTtcbn1cblxuLyoqXG4gKiBDREsg5pys5L2T44Gu44OV44Kp44O844Oe44OD44K/44Gn5pW05b2i44GX44CBQ0xJIOOBqOWQjOS4gOOBruimi+OBn+ebruOBq+OBmeOCi+OAglxuICog56eB5pyJ44OR44K544Gq44Gu44Gn6Kej5rG644Gn44GN44Gq44GE44GT44Go44GM44GC44KK44CB44Gd44Gu5aC05ZCI44Gv5pyA5bCP6ZmQ44Gu6Ieq5YmN5pW05b2i44Gr6JC944Go44GZXG4gKiDvvIjopovjgZ/nm67jgojjgorjgIzokL3jgajjgZnjgI3jgZPjgajjgpLlhKrlhYjjgZnjgovvvInjgIJcbiAqL1xuZnVuY3Rpb24gZm9ybWF0UmVwb3J0cyhwbHVnaW5SZXBvcnRzOiBhbnlbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGZvcm1hdHRlciA9IGxvYWRGb3JtYXR0ZXJDYWNoZWQoKTtcbiAgaWYgKGZvcm1hdHRlcikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdFZhbGlkYXRpb25SZXBvcnRzKHByb2Nlc3MuY3dkKCksIHBsdWdpblJlcG9ydHMpLmpvaW4oJ1xcblxcbicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZmFsbCB0aHJvdWdoXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxsYmFja0Zvcm1hdChwbHVnaW5SZXBvcnRzKTtcbn1cblxuLyoqXG4gKiBDREsg5pys5L2T44Gu44OV44Kp44O844Oe44OD44K/44KS6Kej5rG644Gn44GN44Gq44GE44Go44GN44Gu5pyA5bCP6ZmQ44Gu5pW05b2i44CCXG4gKiDopovjgZ/nm67jga/liqPjgovjgYzjgIFmaW5kaW5ncyDjgpLlv4XjgZroqq3jgoHjgovlvaLjgaflh7rjgZnjgZ/jgoHjga7mnIDlvozjga7noKbjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWxsYmFja0Zvcm1hdChwbHVnaW5SZXBvcnRzOiBhbnlbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGJsb2Nrczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZXBvcnQgb2YgcGx1Z2luUmVwb3J0cykge1xuICAgIGZvciAoY29uc3QgdmlvbGF0aW9uIG9mIHJlcG9ydD8udmlvbGF0aW9ucyA/PyBbXSkge1xuICAgICAgY29uc3QgYWNrSWQgPSBTdHJpbmcodmlvbGF0aW9uLnJ1bGVOYW1lKS5pbmNsdWRlcygnOjonKVxuICAgICAgICA/IHZpb2xhdGlvbi5ydWxlTmFtZVxuICAgICAgICA6IGAke3JlcG9ydC5wbHVnaW5OYW1lfTo6JHt2aW9sYXRpb24ucnVsZU5hbWV9YDtcbiAgICAgIGZvciAoY29uc3QgYyBvZiB2aW9sYXRpb24udmlvbGF0aW5nQ29uc3RydWN0cyA/PyBbXSkge1xuICAgICAgICBibG9ja3MucHVzaChcbiAgICAgICAgICBgJHtTdHJpbmcodmlvbGF0aW9uLnNldmVyaXR5ID8/ICdFUlJPUicpLnRvVXBwZXJDYXNlKCl9ICR7dmlvbGF0aW9uLmRlc2NyaXB0aW9ufSAoJHtyZXBvcnQucGx1Z2luTmFtZX0pXFxuYCArXG4gICAgICAgICAgYCAgICR7Yy5jb25zdHJ1Y3RQYXRofSAoJHtjLmNsb3VkRm9ybWF0aW9uUmVzb3VyY2U/LmxvZ2ljYWxJZH0pICR7Yy5jb25zdHJ1Y3RGcW59XFxuYCArXG4gICAgICAgICAgYCAgIEFja25vd2xlZGdlIHdpdGggJyR7U3RyaW5nKGFja0lkKS5yZXBsYWNlKC8gL2csICctJyl9J2AsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBibG9ja3Muam9pbignXFxuXFxuJyk7XG59XG5cbi8vIOODleOCqeODvOODnuODg+OCv+OBryBhd3MtY2RrLWxpYiDjga7np4HmnInjg5HjgrnjgavjgYLjgoogYGV4cG9ydHNgIOOBi+OCieimi+OBiOOBquOBhOOBn+OCgeOAgVxuLy8g44Ko44Oz44K444Oz6Kej5rG677yIbG9hZEVuZ2luZe+8ieOBqOWQjOOBmOOBj+ODkeODg+OCseODvOOCuOODq+ODvOODiOOBi+OCieOBrue1tuWvvuODkeOCueOBp+iqreOBv+i+vOOCgOOAglxubGV0IGNhY2hlZEZvcm1hdHRlcjogYW55IHwgZmFsc2UgfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBsb2FkRm9ybWF0dGVyQ2FjaGVkKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjYWNoZWRGb3JtYXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhY2hlZEZvcm1hdHRlciA9IGxvYWRGb3JtYXR0ZXIoKSA/PyBmYWxzZTtcbiAgfVxuICByZXR1cm4gY2FjaGVkRm9ybWF0dGVyID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGNhY2hlZEZvcm1hdHRlcjtcbn1cblxuLyoqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZvcm1hdHRlcigpOiBhbnkgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IGxpYlJvb3QgPSBwYXRoLmRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKCdhd3MtY2RrLWxpYi9wYWNrYWdlLmpzb24nKSk7XG4gICAgY29uc3QgbW9kID0gcmVxdWlyZShwYXRoLmpvaW4obGliUm9vdCwgJ2NvcmUvbGliL3ZhbGlkYXRpb24vcHJpdmF0ZS9tb2Rlcm4tZm9ybWF0dGVyLmpzJykpO1xuICAgIHJldHVybiB0eXBlb2YgbW9kPy5mb3JtYXRWYWxpZGF0aW9uUmVwb3J0cyA9PT0gJ2Z1bmN0aW9uJyA/IG1vZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vLyDjgqjjg7Pjgrjjg7PvvIhXQVNN77yJ44Gu5Yid5pyf5YyW44Gv6YeN44GE44Gf44KB44CB44Oi44K444Ol44O844Or44Os44OZ44Or44Gn44Kt44Oj44OD44K344Ol44GZ44KLXG5sZXQgY2FjaGVkRW5naW5lTW9kdWxlOiBhbnkgfCBmYWxzZSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGxvYWRFbmdpbmVDYWNoZWQoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNhY2hlZEVuZ2luZU1vZHVsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGVkRW5naW5lTW9kdWxlID0gbG9hZEVuZ2luZSgpID8/IGZhbHNlO1xuICB9XG4gIHJldHVybiBjYWNoZWRFbmdpbmVNb2R1bGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogY2FjaGVkRW5naW5lTW9kdWxlO1xufVxuXG4vLyDjgqjjg7Pjgrjjg7PvvIhXQVNN77yJ44GvIDEg44OX44Ot44K744K544GrIDEg44Gk44Gg44GR55Sf44GL44GZ44CC5L2c44KK55u044GZ5YmN44GrIGZyZWUoKSDjgZfjgarjgYTjgajjgqTjg7Pjgrnjgr/jg7PjgrnjgYxcbi8vIOepjeOBv+S4iuOBjOOCiuOAgTIg5YCL55uu5Lul6ZmN44Gu5qeL56+J44GM6LaF57ea5b2i44Gr6YGF44GP44Gq44KL77yI5a6f5risOiBmcmVlIOeEoeOBl+OBpyAzLjhzIC0+IDExLjJzIC0+IDIyLjFz44CBXG4vLyDmp4vnr4nliY3jgasgZnJlZSDjgZnjgovjgaggMy41cyAtPiAwLjRz77yJ44CC44Or44O844Or44K744OD44OI44GM5aSJ44KP44KL77yIU3RhZ2Ug44GU44Go44GrIGV4Y2x1ZGUg44GM6YGV44GG44CBXG4vLyDjg4bjgrnjg4jjgafopIfmlbDjgqLjg5fjg6rjgpLlkIjmiJDjgZnjgovvvInjgZ/jgbPjgavkvZzjgornm7TjgZnjga7jgafjgIHjgq3jg6Pjg4Pjgrfjg6Xjga8gMSDjgrnjg63jg4Pjg4jjgafotrPjgorjgovjgIJcbmxldCBjYWNoZWRSZWdvRW5naW5lOiB7IGtleTogc3RyaW5nOyBlbmdpbmU6IGFueSB9IHwgdW5kZWZpbmVkO1xuZnVuY3Rpb24gcmVnb0VuZ2luZUNhY2hlZChlbmdpbmVNb2R1bGU6IGFueSwgcnVsZXM6IEJ1bmRsZWRSdWxlRGF0YVtdLCByZWdpb24/OiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBrZXkgPSBgJHtyZWdpb24gPz8gJyd9fCR7YWNjb3VudCA/PyAnJ318JHtydWxlcy5tYXAoKHIpID0+IHIuaWQpLmpvaW4oJywnKX1gO1xuICBpZiAoY2FjaGVkUmVnb0VuZ2luZT8ua2V5ICE9PSBrZXkpIHtcbiAgICBjYWNoZWRSZWdvRW5naW5lPy5lbmdpbmU/LmZyZWU/LigpO1xuICAgIGNhY2hlZFJlZ29FbmdpbmUgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3VzdG9tUnVsZXMgPSBbXG4gICAgICAuLi5CVU5ETEVEX0xJQlMubWFwKChsKSA9PiAoeyBuYW1lOiBsLm5hbWUsIGNvbnRlbnQ6IGwucmVnbyB9KSksXG4gICAgICAuLi5tZXJnZVJ1bGVNb2R1bGVzKHJ1bGVzKSxcbiAgICBdO1xuICAgIGlmIChyZWdpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY3VzdG9tUnVsZXMucHVzaChkZXBsb3lFbnZpcm9ubWVudE1vZHVsZShyZWdpb24sIGFjY291bnQpKTtcbiAgICB9XG4gICAgY2FjaGVkUmVnb0VuZ2luZSA9IHsga2V5LCBlbmdpbmU6IG5ldyBlbmdpbmVNb2R1bGUuUmVnb0VuZ2luZSh7IGN1c3RvbVJ1bGVzIH0pIH07XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFJlZ29FbmdpbmUuZW5naW5lO1xufVxuXG4vKiog5YWo44Or44O844Or44Gr5YWx6YCa44GuIHJlZ28g44OY44OD44OA44CCYnVuZGxlLXJ1bGVzIOOBjCBwYWNrYWdlIOWQjeOBqCBpbXBvcnQg44KSIDEg56iu6aGe44Gr5by35Yi244GX44Gm44GE44KL44CCICovXG5jb25zdCBSRUdPX0hFQURFUiA9ICdwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcbic7XG5cbi8qKlxuICog44Or44O844Or44KSIHNlcnZpY2Ug44GU44Go44GrIDEg44Oi44K444Ol44O844Or44G444G+44Go44KB44KL44CCXG4gKlxuICog44Kz44Oz44OR44Kk44Or5pmC6ZaT44Gv44Or44O844Or5pys5L2T44Gu6YeP44KI44KK44Oi44K444Ol44O844Or5pWw44Gn5Yq544GE44Gm44GP44KL77yI5a6f5risIDE4NDQg44Or44O844Or44KSXG4gKiAxIOODq+ODvOODqyAxIOODouOCuOODpeODvOODq+OBp+i8ieOBm+OCi+OBqOe0hCA2LjJz44CBc2VydmljZSDljZjkvY3jga4gMzkg44Oi44K444Ol44O844Or44Gr55Wz44KA44Go57SEIDEuMHPvvInjgIJcbiAqIOODq+ODvOODq+OBr+OCguOBqOOCguOBqOWFqOmDqCBgcGFja2FnZSBjZGtfcHJlZmxpZ2h0YCDjgarjga7jgafjgIFSZWdvIOOBi+OCieimi+OCjOOBsOe1kOWQiOOBl+OBpuOCglxuICog44GX44Gq44GP44Gm44KC5ZCM44GYIDEg44OR44OD44Kx44O844K44oCU4oCU44Oi44K444Ol44O844Or5aKD55WM44Gr5oSP5ZGz6KuW44Gv54Sh44GE44CC44GX44Gf44GM44Gj44Gm55Wz44KB44KL44Gu44Gg44GM44CBXG4gKiDoo4/jgpLov5TjgZvjgbDjgIzliKXjg6vjg7zjg6vjgYzlkIzjgZjlkI3liY3jga7jg5jjg6vjg5Hjg7zjgpLlrprnvqnjgZnjgovjgajpu5njgaPjgaYgMSDjgaTjga7opo/liYfjgavlkIjmtYHjgZnjgovjgI1cbiAqIOOBqOOBhOOBhuWNsemZuuOCgue1kOWQiOWJjeOBi+OCieWtmOWcqOOBmeOCi+OAgmJ1bmRsZS1ydWxlcyDjgYzjg6vjg7zjg6vplpPjga7jg4jjg4Pjg5fjg6zjg5njg6vlkI3ooZ3nqoHjgpJcbiAqIOW8vuOBhOOBpuOBhOOCi+OBruOBr+OBneOBruOBn+OCge+8iOWFseacieOBl+OBn+OBhOWumue+qeOBryBydWxlcy9fbGliLyDjgavnva7jgY/vvInjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJ1bGVNb2R1bGVzKHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSk6IHsgbmFtZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgYnlTZXJ2aWNlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBmb3IgKGNvbnN0IHIgb2YgcnVsZXMpIHtcbiAgICBjb25zdCBib2R5ID0gci5yZWdvLnJlcGxhY2UoL14oPzpwYWNrYWdlfGltcG9ydClcXHMuKlxcbi9nbSwgJycpO1xuICAgIGJ5U2VydmljZS5zZXQoci5zZXJ2aWNlLCBbLi4uYnlTZXJ2aWNlLmdldChyLnNlcnZpY2UpID8/IFtdLCBib2R5XSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5ieVNlcnZpY2VdLm1hcCgoW3NlcnZpY2UsIGJvZGllc10pID0+ICh7XG4gICAgbmFtZTogYF9wZl9zZXJ2aWNlXyR7c2VydmljZX1gLFxuICAgIGNvbnRlbnQ6IFJFR09fSEVBREVSICsgYm9kaWVzLmpvaW4oJ1xcbicpLFxuICB9KSk7XG59XG5cbi8qKlxuICog44OG44Oz44OX44Os44O844OI576k44Gr5Ye644Gm44GP44KL44Oq44K944O844K544K/44Kk44OX44CC5YiI44KK6L6844G/44Gr5L2/44GI44Gq44GE44OG44Oz44OX44Os44O844OI44GMIDEg5p6a44Gn44KC44GC44KM44GwXG4gKiB1bmRlZmluZWQg44KS6L+U44GX44CB5YiI44KK6L6844G/44Gd44Gu44KC44Gu44KS6Kum44KB44KL77yI5L2V44GM6LyJ44Gj44Gm44GE44KL44GL5YiG44GL44KJ44Gq44GE44G+44G+6JC944Go44GZ44Go44CBXG4gKiDjg6vjg7zjg6vjgYzpu5njgaPjgabnmbrngavjgZfjgarjgY/jgarjgosgPSBlbmZvcmNlIOOBq+OBqOOBo+OBpuacgOaCquOBruWjiuOCjOaWueOBq+OBquOCi+OBn+OCge+8ieOAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlUmVzb3VyY2VUeXBlcyh0ZW1wbGF0ZVBhdGhzOiBzdHJpbmdbXSk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB0ZW1wbGF0ZVBhdGggb2YgdGVtcGxhdGVQYXRocykge1xuICAgIGxldCB0ZW1wbGF0ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICB0ZW1wbGF0ZSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBUcmFuc2Zvcm3vvIhTQU0g562J77yJ44Gv44Oe44Kv44Ot5bGV6ZaL44Gn5Yil44Gu44Oq44K944O844K544Gr5YyW44GR44KL44Gu44Gn44CB55Sf44Gu44OG44Oz44OX44Os44O844OI44GL44KJXG4gICAgLy8g6Kqt44KB44KL44Oq44K944O844K544K/44Kk44OX44Gv5b2T44Gm44Gr44Gq44KJ44Gq44GE44CCXG4gICAgaWYgKHRlbXBsYXRlPy5UcmFuc2Zvcm0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIE9iamVjdC52YWx1ZXModGVtcGxhdGU/LlJlc291cmNlcyA/PyB7fSkgYXMgYW55W10pIHtcbiAgICAgIC8vIEZuOjpGb3JFYWNoIOOBquOBqeOBpyBUeXBlIOOBjOmdmeeahOOBq+iqreOCgeOBquOBhOOCqOODs+ODiOODquOBjOOBguOCjOOBsOirpuOCgeOCi+OAglxuICAgICAgaWYgKHR5cGVvZiByZXNvdXJjZT8uVHlwZSAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB0eXBlcy5hZGQocmVzb3VyY2UuVHlwZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0eXBlcztcbn1cblxuLyoqXG4gKiDjg4bjg7Pjg5fjg6zjg7zjg4jjgavlh7rjgabjgY/jgovjg6rjgr3jg7zjgrnjgr/jgqTjg5fjgavplqLkv4LjgZnjgovjg6vjg7zjg6vjgaDjgZHjgpLpgbjjgbbjgIJcbiAqXG4gKiDjgqjjg7Pjgrjjg7Pjga7jgrPjg7Pjg5HjgqTjg6vmmYLplpPjga/jg6vjg7zjg6vmlbDjgafjgbvjgbzmsbrjgb7jgovjga7jgafvvIjlrp/muKwgMTg0NCDjg6vjg7zjg6vjgafntIQgNC42c+OAgVxuICog5YW45Z6L55qE44Gq44Ki44OX44Oq44Gr5q6L44KLIDEwMCDjg6vjg7zjg6vliY3lvozjgarjgokgMC44cyDliY3lvozvvInjgIHjgZPjgozjgYzlm7rlrprosrvjga7kuLvjgarliYrjgorjganjgZPjgo3jgIJcbiAqIOWuieWFqOaAp+OBryBtZXRhLnJlc291cmNlVHlwZXMg44Gu5a6j6KiA44Gr5LmX44Gj44Gm44GE44KLOiDjg6vjg7zjg6vjgYzopovjgovjg6rjgr3jg7zjgrnjgr/jgqTjg5fjgYxcbiAqIOWuo+iogOOBi+OCiea8j+OCjOOBpuOBhOOCi+OBqOWIiOOCieOCjOOBpueZuueBq+OBl+OBquOBj+OBquOCi+OBn+OCgeOAgXRlc3QvcnVsZXMudGVzdC50cyDjgYzlhajjg6vjg7zjg6vjgavjgaTjgYTjgaZcbiAqIOOAjOiHquWIhuOBriBmYWlsIOODhuODs+ODl+ODrOODvOODiOOBp+WIiOOCiuaui+OCi+OBk+OBqOOAjeOCkuaknOafu+OBl+OBpuOBhOOCi+OAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBydW5lKHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSwgdHlwZXM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkKTogQnVuZGxlZFJ1bGVEYXRhW10ge1xuICBpZiAodHlwZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHJ1bGVzO1xuICAvLyDliIjjgovmoLnmi6DjgYznhKHjgYTjg6vjg7zjg6vjga/mrovjgZk6IFwiKlwi77yI5YWo44Oq44K944O844K55Z6L44Gr5Yq544GP44K/44Kw57O744Or44O844Or77yJ44Go44CBXG4gIC8vIHJlc291cmNlVHlwZXMg44GM56m644Gu44KC44Gu77yI44OQ44Oz44OJ44Or5riI44G/44Or44O844Or44Gv6Z2e56m644GM5L+d6Ki844GV44KM44Gm44GE44KL44Gu44Gn44CB6Kmy5b2T44GZ44KL44Gu44GvXG4gIC8vIOaJi+OBp+e1hOOBv+eri+OBpuOBn+ODq+ODvOODqyA9IOODhuOCueODiOOChOWwhuadpeOBruODhuODs+ODl+ODrOODvOODiOWxpOODq+ODvOODq+OBoOOBke+8ieOAglxuICByZXR1cm4gcnVsZXMuZmlsdGVyKChyKSA9PiByLnJlc291cmNlVHlwZXMubGVuZ3RoID09PSAwXG4gICAgfHwgci5yZXNvdXJjZVR5cGVzLmluY2x1ZGVzKCcqJylcbiAgICB8fCByLnJlc291cmNlVHlwZXMuc29tZSgodCkgPT4gdHlwZXMuaGFzKHQpKSk7XG59XG5cbi8qKlxuICogQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZSDjgpLop6PmsbrjgZnjgovjgIJcbiAqIOmAmuW4uOOBryBhd3MtY2RrLWxpYiDjgYwgYnVuZGxlZERlcGVuZGVuY2llcyDjgajjgZfjgablkIzmorHjgZfjgabjgYTjgovjgrPjg5Tjg7zjgavkuZfjgovjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW5naW5lKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJ0Bhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBsaWJQa2cgPSByZXF1aXJlLnJlc29sdmUoJ2F3cy1jZGstbGliL3BhY2thZ2UuanNvbicpO1xuICAgIGNvbnN0IGVuZ1BrZyA9IHJlcXVpcmUucmVzb2x2ZSgnQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZS9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3BhdGguZGlybmFtZShsaWJQa2cpXSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVxdWlyZShwYXRoLmRpcm5hbWUoZW5nUGtnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
506
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL2VuZm9yY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNBLDBEQU1DO0FBR0QsOENBRUM7QUFNRCw0Q0FFQztBQTZMRCxnREFpQkM7QUF1REQsd0NBaUJDO0FBYUQsc0NBUUM7QUEyQ0Qsa0RBY0M7QUFpQkQsNENBVUM7QUFRRCxzREFtQkM7QUFZRCxzQkFRQztBQU9ELGdDQWVDO0FBeGZELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsNkNBT3FCO0FBRXJCLHdEQUF3RTtBQUV4RSwwREFBMEQ7QUFDMUQ7OERBQzhEO0FBRTlEOzs7R0FHRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsd0JBQXdCLENBQUM7QUFFL0Q7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsTUFBYyxFQUFFLFNBQWtCO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdkcsT0FBTztRQUNMLElBQUksRUFBRSw4QkFBc0I7UUFDNUIsT0FBTyxFQUFFLCtEQUErRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sRUFBRTtLQUM3RyxDQUFDO0FBQ0osQ0FBQztBQUVELHlGQUF5RjtBQUN6RixTQUFnQixpQkFBaUIsQ0FBQyxTQUE2QjtJQUM3RCxPQUFPLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUEwQjtJQUN6RCxPQUFPLE9BQU8sTUFBTSxLQUFL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LENBQUM7UUFDUCxlQUFlO0lBQ2pCLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQywyQ0FBMkMsRUFBRTtZQUMxRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlCLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcbiAgQXBwLFxuICBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luLFxuICB0eXBlIElQb2xpY3lWYWxpZGF0aW9uQ29udGV4dCxcbiAgdHlwZSBJUG9saWN5VmFsaWRhdGlvblBsdWdpbixcbiAgdHlwZSBQb2xpY3lWYWxpZGF0aW9uUGx1Z2luUmVwb3J0LFxuICB0eXBlIFBvbGljeVZpb2xhdGlvbixcbn0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCVU5ETEVEX0xJQlMsIHR5cGUgQnVuZGxlZFJ1bGVEYXRhIH0gZnJvbSAnLi4vcnVsZXMuZ2VuZXJhdGVkJztcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzIC0tIEBhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUg44GvXG4gICBhd3MtY2RrLWxpYiDlkIzmorHjgrPjg5Tjg7zjgpLli5XnmoTop6PmsbrjgZnjgovoqK3oqIjvvIjkvp3lrZjjgavjga/ovInjgZvjgarjgYTvvInjgIJSRUFETUUvQUdFTlRTLm1kIOWPgueFpyAqL1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgUmVnbyBtb2R1bGUgdGhhdCBjYXJyaWVzIHRoZSBkZXBsb3ltZW50XG4gKiBlbnZpcm9ubWVudCBpbnRvIHJ1bGUgZXZhbHVhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IERFUExPWV9FTlZfTU9EVUxFX05BTUUgPSAnX3BmX2RlcGxveV9lbnZpcm9ubWVudCc7XG5cbi8qKlxuICogQnVpbGQgdGhlIGdlbmVyYXRlZCBtb2R1bGUgZGVmaW5pbmcgYGRlcGxveV9yZWdpb25gIGZvciB0aGUgcnVsZSBwYWNrYWdlLlxuICpcbiAqIFJ1bGVzIG11c3QgcmVhZCBpdCBhcyBgZGF0YS5jZGtfcHJlZmxpZ2h0LmRlcGxveV9yZWdpb25gIChuZXZlciBhcyBhIGJhcmVcbiAqIHZhcmlhYmxlKTogdGhlIGRhdGEgcmVmZXJlbmNlIGlzIHNpbXBseSB1bmRlZmluZWQgd2hlbiB0aGUgbW9kdWxlIGlzIG5vdFxuICogaW5qZWN0ZWQg4oCUIHRoZSBydWxlIGJvZHkgZmFpbHMgYW5kIHRoZSBydWxlIHNraXBzIOKAlCB3aGlsZSBhIGJhcmUgdmFyaWFibGVcbiAqIHdvdWxkIGJlIGEgY29tcGlsZSBlcnJvci4gSW5qZWN0ZWQgYnkgdGhlIGVuZm9yY2UgcGx1Z2luIHdoZW4gdGhlIGFwcC1sZXZlbFxuICogcmVnaW9uIGlzIGNvbmNyZXRlOyB0aGUgd2FybiBtb2RlIChDREsgYnVpbHQtaW4gcGx1Z2luKSBuZXZlciBpbmplY3RzIGl0LFxuICogc28gcmVnaW9uLWRlcGVuZGVudCBydWxlcyBvbmx5IGZpcmUgaW4gZW5mb3JjZSBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95RW52aXJvbm1lbnRNb2R1bGUocmVnaW9uOiBzdHJpbmcsIGFjY291bnRJZD86IHN0cmluZyk6IHsgbmFtZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGFjY291bnQgPSBpc0NvbmNyZXRlQWNjb3VudChhY2NvdW50SWQpID8gYGRlcGxveV9hY2NvdW50IDo9ICR7SlNPTi5zdHJpbmdpZnkoYWNjb3VudElkKX1cXG5gIDogJyc7XG4gIHJldHVybiB7XG4gICAgbmFtZTogREVQTE9ZX0VOVl9NT0RVTEVfTkFNRSxcbiAgICBjb250ZW50OiBgcGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5kZXBsb3lfcmVnaW9uIDo9ICR7SlNPTi5zdHJpbmdpZnkocmVnaW9uKX1cXG4ke2FjY291bnR9YCxcbiAgfTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGFjY291bnQgZnJvbSB0aGUgdmFsaWRhdGlvbiBjb250ZXh0IGlzIGEgY29uY3JldGUgMTItZGlnaXQgYWNjb3VudCBpZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbmNyZXRlQWNjb3VudChhY2NvdW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGFjY291bnRJZCBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGFjY291bnRJZCA9PT0gJ3N0cmluZycgJiYgL15cXGR7MTJ9JC8udGVzdChhY2NvdW50SWQpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlZ2lvbiBmcm9tIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgaXMgYSBjb25jcmV0ZSByZWdpb24gbmFtZVxuICogKGFzIG9wcG9zZWQgdG8gdW5kZWZpbmVkLCBhbiB1bnJlc29sdmVkIHRva2VuLCBvciBhIHBsYWNlaG9sZGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uY3JldGVSZWdpb24ocmVnaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiByZWdpb24gaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiByZWdpb24gPT09ICdzdHJpbmcnICYmIC9eW2Etel17Mn0oLVthLXpdKykrLVxcZCskLy50ZXN0KHJlZ2lvbik7XG59XG5cbmludGVyZmFjZSBFbmdpbmVEaWFnbm9zdGljIHtcbiAgcmVhZG9ubHkgcnVsZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldmVyaXR5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgcmVhZG9ubHkgc291cmNlPzogc3RyaW5nO1xuICByZWFkb25seSBlbnRpdHk/OiB7IHJlYWRvbmx5IGxvZ2ljYWxJZD86IHN0cmluZyB9O1xuICByZWFkb25seSBwcm9wZXJ0eVBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvY3VtZW50YXRpb25Vcmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogZW5mb3JjZSDjg6Ljg7zjg4nnlKjjga7lhoXpg6jjg5fjg6njgrDjgqTjg7PjgIJcbiAqXG4gKiBDREsg57WE44G/6L6844G/44GuIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44Gv5YWoIGZpbmRpbmcg44KSIHdhcm5pbmcg44Gr5Li444KB44KL44Gf44KBXG4gKiDvvIhhd3MtY2RrLWxpYiAyLjI2Ny4wIOWun+a4rOOAgeaYh+agvOODleODqeOCsOOCgueEoeWKue+8ieOAgeWQjOOBmOOCqOODs+OCuOODs+OCkuebtOaOpeWRvOOBs+OAgVxuICogY2RrLXByZWZsaWdodCDjga7jg6vjg7zjg6vpgZXlj43vvIjjgYrjgojjgbMgc3RyaWN0IOaZguOBr+OCqOODs+OCuOODs+OBruOCqOODqeODvOOCr+ODqeOCue+8ieOCklxuICogcG9saWN5IHZhbGlkYXRpb24g44Gu5aSx5pWX44Go44GX44Gm5aCx5ZGK44GX44GmIHN5bnRoIOOCkuatouOCgeOCi+OAglxuICovXG5leHBvcnQgY2xhc3MgUHJlZmxpZ2h0RW5mb3JjZVBsdWdpbiBpbXBsZW1lbnRzIElQb2xpY3lWYWxpZGF0aW9uUGx1Z2luIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWUgPSBQTFVHSU5fTkFNRTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmljdDogYm9vbGVhbixcbiAgKSB7fVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250ZXh0OiBJUG9saWN5VmFsaWRhdGlvbkNvbnRleHQpOiBQb2xpY3lWYWxpZGF0aW9uUGx1Z2luUmVwb3J0IHtcbiAgICBjb25zdCBlbmdpbmUgPSBsb2FkRW5naW5lQ2FjaGVkKCk7XG4gICAgaWYgKCFlbmdpbmUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnY2RrLXByZWZsaWdodDogY291bGQgbm90IHJlc29sdmUgQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZTsgJyArXG4gICAgICAgICdlbmZvcmNlIG1vZGUgaXMgdW5hdmFpbGFibGUgYW5kIG5vIHByZWZsaWdodCBjaGVja3Mgd2VyZSBydW4uICcgK1xuICAgICAgICAnSW5zdGFsbCBpdCBhcyBhIGRldkRlcGVuZGVuY3kgb3IgdXNlIHRoZSBkZWZhdWx0ICh3YXJuKSBtb2RlLicsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdmlvbGF0aW9uczogW10gfTtcbiAgICB9XG5cbiAgICBjb25zdCByZWdpb24gPSBpc0NvbmNyZXRlUmVnaW9uKGNvbnRleHQucmVnaW9uKSA/IGNvbnRleHQucmVnaW9uIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjY291bnQgPSBpc0NvbmNyZXRlQWNjb3VudChjb250ZXh0LmFjY291bnRJZCkgPyBjb250ZXh0LmFjY291bnRJZCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvdXJzID0gbmV3IFNldCh0aGlzLnJ1bGVzLm1hcCgocikgPT4gci5pZCkpO1xuICAgIGNvbnN0IHZpb2xhdGlvbnM6IFBvbGljeVZpb2xhdGlvbltdID0gW107XG5cbiAgICAvLyDlhajjg4bjg7Pjg5fjg6zjg7zjg4jjga7lkozpm4blkIjjgafliIjjgorovrzjgoDjgILjg4bjg7Pjg5fjg6zjg7zjg4jjgZTjgajjgavliIjjgovjgajjgqjjg7Pjgrjjg7PjgpLkvZXluqbjgoJcbiAgICAvLyDkvZzjgornm7TjgZnjgZPjgajjgavjgarjgorjgIHjgZ3jgaHjgonjga7jgrPjgrnjg4jjga7mlrnjgYzpq5jjgY/jgaTjgY/vvIhyZWdvRW5naW5lQ2FjaGVkIOOBruOCs+ODoeODs+ODiOWPgueFp++8ieOAglxuICAgIGNvbnN0IHJ1bGVzID0gcHJ1bmUodGhpcy5ydWxlcywgdGVtcGxhdGVSZXNvdXJjZVR5cGVzKGNvbnRleHQuc3RhY2tUZW1wbGF0ZXMubWFwKChzdCkgPT4gc3QudGVtcGxhdGVQYXRoKSkpO1xuXG4gICAgLy8gMSDmnKzjgoLmrovjgonjgarjgYQgPSDjgZPjga7jgqLjg5fjg6rjga7jg6rjgr3jg7zjgrnjgavplqLkv4LjgZnjgovjg6vjg7zjg6vjgYznhKHjgYTjgILjgqjjg7Pjgrjjg7PjgpLntYTjgoDlv4XopoHjgoLnhKHjgYRcbiAgICAvLyDvvIhsaWJzIOOBoOOBkeOCkui8ieOBm+OBn+OCqOODs+OCuOODs+OBryB2aW9sYXRpb24g44Or44O844Or44KS5oyB44Gf44Ga44CB6KmV5L6h5pmC44Gr6JC944Gh44KL77yJ44CCXG4gICAgLy8gc3RyaWN0IOOBruOBqOOBjeOBr+e1hOOBv+i+vOOBv+OCqOODs+OCuOODs+OBriBmaW5kaW5ncyDjgpLmi77jgYbku5XkuovjgYzmrovjgovjga7jgafpgJrluLjjganjgYrjgorpgLLjgoDjgIJcbiAgICBpZiAocnVsZXMubGVuZ3RoID09PSAwICYmICF0aGlzLnN0cmljdCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdmlvbGF0aW9uczogW10gfTtcbiAgICB9XG5cbiAgICBsZXQgZW5nOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGVuZyA9IHJlZ29FbmdpbmVDYWNoZWQoZW5naW5lLCBydWxlcywgcmVnaW9uLCBhY2NvdW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyDjg6vjg7zjg6vjg5Hjg4Pjgq/jgYzjgrPjg7Pjg5HjgqTjg6vjgafjgY3jgarjgYQgPSDjganjga7jg4bjg7Pjg5fjg6zjg7zjg4jjgoLmpJzmn7vjgafjgY3jgarjgYTjga7jgafjgIFcbiAgICAgIC8vIOWFqOOCueOCv+ODg+OCr+OBtuOCkyB2aW9sYXRpb24g44KS56uL44Gm44KL77yIMSDmnprjgZrjgaTjga4gY2F0Y2gg44Gr44Gv5Yiw6YGU44GX44Gq44GE77yJ44CCXG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgdmlvbGF0aW9uczogY29udGV4dC5zdGFja1RlbXBsYXRlcy5tYXAoKHN0KSA9PiBlbmdpbmVFcnJvclZpb2xhdGlvbihzdCwgZSkpIH07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdCBvZiBjb250ZXh0LnN0YWNrVGVtcGxhdGVzKSB7XG4gICAgICBsZXQgcmVwb3J0OiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICByZXBvcnQgPSBlbmcudmFsaWRhdGVEZXRhaWxlZChuZXcgZW5naW5lLlRlbXBsYXRlRmlsZShzdC50ZW1wbGF0ZVBhdGgpLCB7XG4gICAgICAgICAgcHNldWRvUGFyYW1ldGVyT3ZlcnJpZGVzOiB7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IGNvbnRleHQuYWNjb3VudElkLFxuICAgICAgICAgICAgcmVnaW9uOiBjb250ZXh0LnJlZ2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIOe1hOOBv+i+vOOBv+ODq+ODvOODq+OBryBDREsg57WE44G/6L6844G/44GuIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44GM5ZCM44GY44OG44Oz44OX44Os44O844OI44GrXG4gICAgICAgICAgLy8g5a++44GX44Gm5pei44Gr6LWw44KJ44Gb44Gm44GE44KL44CCc3RyaWN0IOOBp+OBquOBkeOCjOOBsOe1kOaenOOCguS9v+OCj+OBmuaNqOOBpuOBpuOBhOOCi+OBruOBp+OAgeS4uOOBlOOBqOWIh+OCi1xuICAgICAgICAgIC8vIO+8iOWun+a4rCA3MCDjg6rjgr3jg7zjgrkgMSDmnprjgafliJ3lm54gMy4yN3MgLT4gMC4yMnPvvInjgIJzdHJpY3Qg44Gu44Go44GN44Gg44GR5b+F6KaB44Gr44Gq44KL44CCXG4gICAgICAgICAgZGlzYWJsZUJ1aWx0aW5SdWxlczogIXRoaXMuc3RyaWN0LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gdGhyb3cg44KS5aSW44Gr5Ye644GZ44GoIENESyDjga/jgZPjga7lkbzjgbPlh7rjgZfjgpIgcGx1Z2luIGZhaWx1cmXvvIh2aW9sYXRpb24g44K844Ot77yJ44Go44GX44GmXG4gICAgICAgIC8vIOiomOmMsuOBmeOCi+OBoOOBkeOBq+OBquOCiuOAgeOBk+OBk+OBvuOBp+OBq+mbhuOCgeOBn+mBleWPjeOCguW+jOe2muODhuODs+ODl+ODrOODvOODiOOBrumBleWPjeOCguS4uOOBlOOBqOa2iOOBiOOAgVxuICAgICAgICAvLyDmrovjgovjga7jga8gYGZhaWxlZDogdW5kZWZpbmVkYCDjgaDjgZHjgavjgarjgovvvIhpc3N1ZSAjMTUx77yJ44CCXG4gICAgICAgIC8vIHN5bnRoIOOCkuatouOCgeOCi+OBruOBryBpbnN0YWxsRW5mb3JjZUdhdGUg44Gu5b2555uu44CC44GT44GT44Gv44CM44Gp44Gu44K544K/44OD44Kv44Gn5L2V44GMXG4gICAgICAgIC8vIOi1t+OBjeOBn+OBi+OAjeOCkuODrOODneODvOODiOOBq+aui+OBl+OAgeS7luOCueOCv+ODg+OCr+OBruODq+ODvOODq+OCkui1sOOCieOBm+e2muOBkeOCi+OBn+OCgeOBruOCguOBruOAglxuICAgICAgICB2aW9sYXRpb25zLnB1c2goZW5naW5lRXJyb3JWaW9sYXRpb24oc3QsIGUpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGQgb2YgKHJlcG9ydC5kaWFnbm9zdGljcyA/PyBbXSkgYXMgRW5naW5lRGlhZ25vc3RpY1tdKSB7XG4gICAgICAgIGNvbnN0IGlzT3VycyA9IGQuc291cmNlID09PSAnQ1VTVE9NJyAmJiBvdXJzLmhhcyhkLnJ1bGVJZCk7XG4gICAgICAgIGNvbnN0IGlzU3RyaWN0SGl0ID0gdGhpcy5zdHJpY3RcbiAgICAgICAgICAmJiBkLnNvdXJjZSAhPT0gJ0NVU1RPTSdcbiAgICAgICAgICAmJiAoZC5zZXZlcml0eSA9PT0gJ0VSUk9SJyB8fCBkLnNldmVyaXR5ID09PSAnRkFUQUwnKTtcbiAgICAgICAgaWYgKCFpc091cnMgJiYgIWlzU3RyaWN0SGl0KSBjb250aW51ZTtcbiAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICBydWxlTmFtZTogZC5ydWxlSWQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGQubWVzc2FnZSxcbiAgICAgICAgICBzZXZlcml0eTogbWFwU2V2ZXJpdHkoZC5zZXZlcml0eSksXG4gICAgICAgICAgdmlvbGF0aW5nUmVzb3VyY2VzOiBbe1xuICAgICAgICAgICAgcmVzb3VyY2VMb2dpY2FsSWQ6IGQuZW50aXR5Py5sb2dpY2FsSWQgPz8gJyh1bmtub3duKScsXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhdGg6IHN0LnRlbXBsYXRlUGF0aCxcbiAgICAgICAgICAgIGxvY2F0aW9uczogW2QucHJvcGVydHlQYXRoID8/ICcodGVtcGxhdGUpJ10sXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgLi4uKGQuZG9jdW1lbnRhdGlvblVybCA/IHsgcnVsZU1ldGFkYXRhOiB7IERvY3VtZW50YXRpb25Vcmw6IGQuZG9jdW1lbnRhdGlvblVybCB9IH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENESyDntYTjgb/ovrzjgb/jga4gQ2xvdWRGb3JtYXRpb25WYWxpZGF0ZVBsdWdpbiDjgajlkIzjgZjliKTlrprjgIJ3YXJuaW5nIOOBoOOBkeOBquOCiVxuICAgIC8vIOODrOODneODvOODiOOBq+OBr+i8ieOCi+OBjOWQiOaIkOOBr+mAmuOCi++8iENMSSDlgbTjga8gc3VjY2Vzcy9mYWlsdXJlIOOBq+mWouOCj+OCieOBmuW/heOBmuWHuuWKm+OBmeOCi++8ieOAglxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHZpb2xhdGlvbnMuZXZlcnkoKHYpID0+ICFCTE9DS1NfU1lOVEguaGFzKFN0cmluZyh2LnNldmVyaXR5KSkpLCB2aW9sYXRpb25zIH07XG4gIH1cbn1cblxuLyoqIOWQiOaIkOOCkuatouOCgeOCiyB2aW9sYXRpb24gc2V2ZXJpdHnjgIIgKi9cbmNvbnN0IEJMT0NLU19TWU5USCA9IG5ldyBTZXQoWydlcnJvcicsICdmYXRhbCddKTtcblxuLyoqXG4gKiDjgqjjg7Pjgrjjg7Pjga4gc2V2ZXJpdHkg44KSIHBvbGljeSB2YWxpZGF0aW9uIOOBriBzZXZlcml0eSDjgavlhpnjgZnjgILooajjga8gYXdzLWNkay1saWIgMi4yNjcuMCDjga5cbiAqIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44Go5ZCM5LiA44CCYHJlcHJvLm1ldGhvZDogZG9jLW9ubHlgIOOBruODq+ODvOODq+OBryBXQVJOIOOCkuWHuuOBmeOBruOBp1xuICogd2FybmluZyDjgavjgarjgorjgIHloLHlkYrjga/jgZXjgozjgovjgYwgc3ludGgg44Gv5q2i44KB44Gq44GE77yI6Ki85oug44GM5a6f5qmf44Gu44OH44OX44Ot44Kk5aSx5pWX44Gn44Gv44Gq44GE44Gf44KB77yJ44CCXG4gKi9cbmZ1bmN0aW9uIG1hcFNldmVyaXR5KHNldmVyaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHNldmVyaXR5KSB7XG4gICAgY2FzZSAnRkFUQUwnOlxuICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgIHJldHVybiAnZXJyb3InO1xuICAgIGNhc2UgJ1dBUk4nOlxuICAgICAgcmV0dXJuICd3YXJuaW5nJztcbiAgICBjYXNlICdJTkZPJzpcbiAgICAgIHJldHVybiAnaW5mb3JtYXRpb25hbCc7XG4gICAgY2FzZSAnREVCVUcnOlxuICAgICAgcmV0dXJuICdkZWJ1Zyc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnd2FybmluZyc7XG4gIH1cbn1cblxuLyoqXG4gKiDjg6vjg7zjg6voqZXkvqHjgZ3jga7jgoLjga7jgYzlpLHmlZfjgZfjgZ/jgZPjgajjgpLooajjgZkgdmlvbGF0aW9uIOOBriBydWxlTmFtZeOAglxuICog44OQ44Oz44OJ44Or5riI44G/44Or44O844Or44GuIGlkIOOBp+OBr+OBquOBhOOBruOBpyBgZXhjbHVkZWAg44Gn44Gv5raI44Gb44Gq44GE77yI5raI44GX44Gm44KI44GE54q25oWL44Gn44Gv44Gq44GE77yJ44CCXG4gKi9cbmV4cG9ydCBjb25zdCBFTkdJTkVfRVJST1JfUlVMRSA9ICdwZi1lbmdpbmUtZXJyb3InO1xuXG4vKiog44Ko44Oz44K444Oz44GM5oqV44GS44Gf5YCk44KS44Oh44OD44K744O844K444Gr6JC944Go44GZ44CC44Ko44Oz44K444Oz44GvIEVycm9yIOOBp+OBr+OBquOBj+e0oOOBruaWh+Wtl+WIl+OCkuaKleOBkuOCi+OBk+OBqOOBjOOBguOCi+OAgiAqL1xuZnVuY3Rpb24gZW5naW5lRXJyb3JUZXh0KGU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gKGUgYXMgeyBtZXNzYWdlPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubWVzc2FnZTtcbiAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJiBtZXNzYWdlLmxlbmd0aCA+IDAgPyBtZXNzYWdlIDogU3RyaW5nKGUpO1xufVxuXG4vKiogMSDmnprjga7jg4bjg7Pjg5fjg6zjg7zjg4jjgpLmpJzmn7vjgafjgY3jgarjgYvjgaPjgZ/jgZPjgajjgpIgdmlvbGF0aW9uIOOBqOOBl+OBpuWgseWRiuOBmeOCi+OAgiAqL1xuZnVuY3Rpb24gZW5naW5lRXJyb3JWaW9sYXRpb24oc3Q6IHsgc3RhY2tDb25zdHJ1Y3RQYXRoOiBzdHJpbmc7IHRlbXBsYXRlUGF0aDogc3RyaW5nIH0sIGU6IHVua25vd24pOiBQb2xpY3lWaW9sYXRpb24ge1xuICByZXR1cm4ge1xuICAgIHJ1bGVOYW1lOiBFTkdJTkVfRVJST1JfUlVMRSxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdjZGstcHJlZmxpZ2h0IGNvdWxkIG5vdCBldmFsdWF0ZSBpdHMgcnVsZXMgZm9yIHRoaXMgdGVtcGxhdGUsIHNvIG5vIHByZWZsaWdodCBydWxlIHJhbiBmb3IgaXQ6ICdcbiAgICAgICsgZW5naW5lRXJyb3JUZXh0KGUpLFxuICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgIGZpeDogJ1JlcG9ydCB0aGlzIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9iYWRtaW50b25jcnllci9jZGstcHJlZmxpZ2h0L2lzc3VlczsgJ1xuICAgICAgKyAndG8gdW5ibG9jayB0aGUgYnVpbGQgbWVhbndoaWxlLCB1c2UgUHJlZmxpZ2h0LmFwcGx5KGFwcCwgeyBlbmZvcmNlOiBmYWxzZSB9KS4nLFxuICAgIHZpb2xhdGluZ1Jlc291cmNlczogW3tcbiAgICAgIGNvbnN0cnVjdFBhdGg6IHN0LnN0YWNrQ29uc3RydWN0UGF0aCxcbiAgICAgIHRlbXBsYXRlUGF0aDogc3QudGVtcGxhdGVQYXRoLFxuICAgICAgbG9jYXRpb25zOiBbJyh0ZW1wbGF0ZSknXSxcbiAgICB9XSxcbiAgfTtcbn1cblxuLyoqIFRoZSBwbHVnaW4gbmFtZSByZWNvcmRlZCBpbiBgdmFsaWRhdGlvbi1yZXBvcnQuanNvbmAgZm9yIG91ciBmaW5kaW5ncy4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fTkFNRSA9ICdjZGstcHJlZmxpZ2h0JztcblxuLyoqIFRoZSBjbG91ZCBhc3NlbWJseSBmaWxlIHRoZSBDREsgd3JpdGVzIGl0cyB2YWxpZGF0aW9uIHJlcG9ydCB0by4gKi9cbmNvbnN0IFZBTElEQVRJT05fUkVQT1JUX0ZJTEUgPSAndmFsaWRhdGlvbi1yZXBvcnQuanNvbic7XG5cbmNvbnN0IEdBVEVfSU5TVEFMTEVEID0gU3ltYm9sLmZvcignY2RrLXByZWZsaWdodC5lbmZvcmNlR2F0ZScpO1xuXG4vKipcbiAqIGVuZm9yY2Ug44Oi44O844OJ44Gu5Y+W44KK44GT44G844GX44KS5aGe44GQ44Ky44O844OI44KSIEFwcCDjgavku5XovrzjgoDjgIJcbiAqXG4gKiBDREsgQ0xJIDIuMTEyOC4xIOS7pemZjeOBryBhcHAg44Gr44CM44Os44Od44O844OI44GvIENMSSDjgYzlh6bnkIbjgZnjgovjgI3jgajkvJ3jgYjjgZ/jgYbjgYjjgadcbiAqIGB2YWxpZGF0aW9uLXJlcG9ydC5qc29uYCDjgpLoh6rliIbjgafoqq3jgoDjgYzjgIHjgZ3jga7ntZ7jgorovrzjgb/vvIh0b29sa2l0LWxpYiDjga5cbiAqIGBmaWx0ZXJSZXBvcnRzQnlTdGFja3Ng77yJ44GMIHZpb2xhdGlvbiDjga4gY29uc3RydWN0UGF0aCDlhYjpoK3jgrvjgrDjg6Hjg7Pjg4jjgpJcbiAqIOmBuOaKnuOCueOCv+ODg+OCr+OBriBoaWVyYXJjaGljYWxJZCDjgajnqoHjgY3lkIjjgo/jgZvjgovjgZ/jgoHjgIFgU3RhZ2UvU3RhY2tgIOW9ouW8j+OBq+OBquOCi1xuICogU3RhZ2Ug5YaF44K544K/44OD44Kv44Gu6YGV5Y+N44GM44GZ44G544Gm5o2o44Gm44KJ44KM44CBc3ludGgg44GM6buZ44Gj44Gm5oiQ5Yqf44GZ44KL77yIaXNzdWUgIzExM++8ieOAglxuICpcbiAqIOOBneOBk+OBpyBzeW50aCDlrozkuoblvozjgavjg6zjg53jg7zjg4jjgpLoqq3jgb/nm7TjgZfjgIFjZGstcHJlZmxpZ2h0IOOBrumBleWPjeOBjOaui+OBo+OBpuOBhOOCjOOBsFxuICog6Ieq5YiG44Gn5aCx5ZGK44GX44GmIHN5bnRoIOOCkuatouOCgeOCi+OAguODqeOCpOODluODqeODquOBjOiHquWKm+OBp+WgseWRiuOBmeOCi+e1jOi3r++8iOe0oOOBriBub2RlIOWun+ihjOOAgVxuICogamVzdOOAgUNMSSAyLjExMjguMSDmnKrmuoDvvInjgafjga8gc3ludGgg44GM5L6L5aSW44KS5oqV44GS44KL44Gf44KB44GT44GT44Gr44Gv5Yiw6YGU44Gb44Ga44CBXG4gKiDkuozph43loLHlkYrjga/otbfjgY3jgarjgYTjgIJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxFbmZvcmNlR2F0ZShzY29wZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICBjb25zdCByb290ID0gc2NvcGUubm9kZS5yb290O1xuICBpZiAoIUFwcC5pc0FwcChyb290KSkgcmV0dXJuO1xuICBjb25zdCBhcHAgPSByb290IGFzIEFwcCAmIHsgW0dBVEVfSU5TVEFMTEVEXT86IGJvb2xlYW4gfTtcbiAgaWYgKGFwcFtHQVRFX0lOU1RBTExFRF0pIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcCwgR0FURV9JTlNUQUxMRUQsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuXG4gIGNvbnN0IHN5bnRoID0gYXBwLnN5bnRoLmJpbmQoYXBwKTtcbiAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgYXBwLnN5bnRoID0gKG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFwcFsnc3ludGgnXT5bMF0pID0+IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IHN5bnRoKG9wdGlvbnMpO1xuICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgY2hlY2tlZCA9IHRydWU7XG4gICAgICBmYWlsSWZSZXBvcnRVbmhhbmRsZWQoYXNzZW1ibHkuZGlyZWN0b3J5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFzc2VtYmx5O1xuICB9O1xufVxuXG4vKipcbiAqIOODrOODneODvOODiOOBqyBjZGstcHJlZmxpZ2h0IOOBruWkseaVl+OBjOaui+OBo+OBpuOBhOOCjOOBsOOAgWZpbmRpbmdzIOOCkuWHuuWKm+OBl+OBpiBzeW50aCDjgpLmraLjgoHjgovjgIJcbiAqXG4gKiDliKTlrprjga8gY2RrLXByZWZsaWdodCDjga7jg6zjg53jg7zjg4jjgaDjgZHjgpLopovjgovjgILntYTjgb/ovrzjgb/jgqjjg7Pjgrjjg7PjgoQgY29uc3RydWN0IGFubm90YXRpb25cbiAqIOOBoOOBkeOBjOWkseaVl+OBl+OBpuOBhOOCi+WgtOWQiOOBryBDTEkg44GM5q2j44GX44GP5omx44GI44KL44Gu44Gn44CB44GT44Gh44KJ44Gv6buZ44Gj44GmIENMSSDjgavku7vjgZvjgovjgIJcbiAqIOmAhuOBq+eZuueBq+OBmeOCi+OBqOOBjeOBr+ODrOODneODvOODiOWFqOS9k+OCkuWHuuOBmeOAguOBk+OBk+OBpyBzeW50aCDjgpLmraLjgoHjgovjgaggQ0xJIOWBtOOBruWHuuWKm+OBjFxuICog5LiA5YiH6LWw44KJ44Gq44GE44Gf44KB44CB5ZCM5pmC44Gr5Ye644Gm44GE44Gf44Gv44Ga44Gu5LuW44OX44Op44Kw44Kk44Oz44GuIGZpbmRpbmcg44GM5raI44GI44Gm44GX44G+44GG44CCXG4gKi9cbmZ1bmN0aW9uIGZhaWxJZlJlcG9ydFVuaGFuZGxlZChkaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICBsZXQgcGx1Z2luUmVwb3J0czogYW55W107XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb3J0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpcmVjdG9yeSwgVkFMSURBVElPTl9SRVBPUlRfRklMRSksICd1dGY4JykpO1xuICAgIHBsdWdpblJlcG9ydHMgPSByZXBvcnQ/LnBsdWdpblJlcG9ydHMgPz8gW107XG4gIH0gY2F0Y2gge1xuICAgIC8vIOODrOODneODvOODiOOBjOeEoeOBhO+8iOODl+ODqeOCsOOCpOODs+acquWun+ihjO+8ieOBvuOBn+OBr+WjiuOCjOOBpuOBhOOCi+WgtOWQiOOBr+S9leOCguOBl+OBquOBhFxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBmYWlsZWQgPSBwbHVnaW5SZXBvcnRzLnNvbWUoXG4gICAgKHIpID0+IHI/LnBsdWdpbk5hbWUgPT09IFBMVUdJTl9OQU1FICYmIHI/LmNvbmNsdXNpb24gPT09ICdmYWlsdXJlJyxcbiAgKTtcbiAgaWYgKCFmYWlsZWQpIHJldHVybjtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmVycm9yKGZvcm1hdFJlcG9ydHMocGx1Z2luUmVwb3J0cykpO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ2Nkay1wcmVmbGlnaHQ6IHZhbGlkYXRpb24gZmFpbGVkLiBGaXggdGhlIGZpbmRpbmdzIGFib3ZlLCAnICtcbiAgICBcImFja25vd2xlZGdlIHRoZW0gd2l0aCBWYWxpZGF0aW9ucy5vZihzY29wZSkuYWNrbm93bGVkZ2UoeyBpZDogJ2Nkay1wcmVmbGlnaHQ6OjxydWxlLWlkPicgfSksIFwiICtcbiAgICAnb3IgZXhjbHVkZSB0aGUgcnVsZSB2aWEgUHJlZmxpZ2h0LmFwcGx5KGFwcCwgeyBleGNsdWRlOiBbLi4uXSB9KS4nLFxuICApO1xufVxuXG4vKipcbiAqIENESyDmnKzkvZPjga7jg5Xjgqnjg7zjg57jg4Pjgr/jgafmlbTlvaLjgZfjgIFDTEkg44Go5ZCM5LiA44Gu6KaL44Gf55uu44Gr44GZ44KL44CCXG4gKiDnp4HmnInjg5Hjgrnjgarjga7jgafop6PmsbrjgafjgY3jgarjgYTjgZPjgajjgYzjgYLjgorjgIHjgZ3jga7loLTlkIjjga/mnIDlsI/pmZDjga7oh6rliY3mlbTlvaLjgavokL3jgajjgZlcbiAqIO+8iOimi+OBn+ebruOCiOOCiuOAjOiQveOBqOOBmeOAjeOBk+OBqOOCkuWEquWFiOOBmeOCi++8ieOAglxuICovXG5mdW5jdGlvbiBmb3JtYXRSZXBvcnRzKHBsdWdpblJlcG9ydHM6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybWF0dGVyID0gbG9hZEZvcm1hdHRlckNhY2hlZCgpO1xuICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0VmFsaWRhdGlvblJlcG9ydHMocHJvY2Vzcy5jd2QoKSwgcGx1Z2luUmVwb3J0cykuam9pbignXFxuXFxuJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrRm9ybWF0KHBsdWdpblJlcG9ydHMpO1xufVxuXG4vKipcbiAqIENESyDmnKzkvZPjga7jg5Xjgqnjg7zjg57jg4Pjgr/jgpLop6PmsbrjgafjgY3jgarjgYTjgajjgY3jga7mnIDlsI/pmZDjga7mlbTlvaLjgIJcbiAqIOimi+OBn+ebruOBr+WKo+OCi+OBjOOAgWZpbmRpbmdzIOOCkuW/heOBmuiqreOCgeOCi+W9ouOBp+WHuuOBmeOBn+OCgeOBruacgOW+jOOBruegpuOAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhbGxiYWNrRm9ybWF0KHBsdWdpblJlcG9ydHM6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgYmxvY2tzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlcG9ydCBvZiBwbHVnaW5SZXBvcnRzKSB7XG4gICAgZm9yIChjb25zdCB2aW9sYXRpb24gb2YgcmVwb3J0Py52aW9sYXRpb25zID8/IFtdKSB7XG4gICAgICBjb25zdCBhY2tJZCA9IFN0cmluZyh2aW9sYXRpb24ucnVsZU5hbWUpLmluY2x1ZGVzKCc6OicpXG4gICAgICAgID8gdmlvbGF0aW9uLnJ1bGVOYW1lXG4gICAgICAgIDogYCR7cmVwb3J0LnBsdWdpbk5hbWV9Ojoke3Zpb2xhdGlvbi5ydWxlTmFtZX1gO1xuICAgICAgZm9yIChjb25zdCBjIG9mIHZpb2xhdGlvbi52aW9sYXRpbmdDb25zdHJ1Y3RzID8/IFtdKSB7XG4gICAgICAgIGJsb2Nrcy5wdXNoKFxuICAgICAgICAgIGAke1N0cmluZyh2aW9sYXRpb24uc2V2ZXJpdHkgPz8gJ0VSUk9SJykudG9VcHBlckNhc2UoKX0gJHt2aW9sYXRpb24uZGVzY3JpcHRpb259ICgke3JlcG9ydC5wbHVnaW5OYW1lfSlcXG5gICtcbiAgICAgICAgICBgICAgJHtjLmNvbnN0cnVjdFBhdGh9ICgke2MuY2xvdWRGb3JtYXRpb25SZXNvdXJjZT8ubG9naWNhbElkfSkgJHtjLmNvbnN0cnVjdEZxbn1cXG5gICtcbiAgICAgICAgICBgICAgQWNrbm93bGVkZ2Ugd2l0aCAnJHtTdHJpbmcoYWNrSWQpLnJlcGxhY2UoLyAvZywgJy0nKX0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJsb2Nrcy5qb2luKCdcXG5cXG4nKTtcbn1cblxuLy8g44OV44Kp44O844Oe44OD44K/44GvIGF3cy1jZGstbGliIOOBruengeacieODkeOCueOBq+OBguOCiiBgZXhwb3J0c2Ag44GL44KJ6KaL44GI44Gq44GE44Gf44KB44CBXG4vLyDjgqjjg7Pjgrjjg7Pop6PmsbrvvIhsb2FkRW5naW5l77yJ44Go5ZCM44GY44GP44OR44OD44Kx44O844K444Or44O844OI44GL44KJ44Gu57W25a++44OR44K544Gn6Kqt44G/6L6844KA44CCXG5sZXQgY2FjaGVkRm9ybWF0dGVyOiBhbnkgfCBmYWxzZSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGxvYWRGb3JtYXR0ZXJDYWNoZWQoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNhY2hlZEZvcm1hdHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGVkRm9ybWF0dGVyID0gbG9hZEZvcm1hdHRlcigpID8/IGZhbHNlO1xuICB9XG4gIHJldHVybiBjYWNoZWRGb3JtYXR0ZXIgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogY2FjaGVkRm9ybWF0dGVyO1xufVxuXG4vKiog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIkgKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRm9ybWF0dGVyKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbGliUm9vdCA9IHBhdGguZGlybmFtZShyZXF1aXJlLnJlc29sdmUoJ2F3cy1jZGstbGliL3BhY2thZ2UuanNvbicpKTtcbiAgICBjb25zdCBtb2QgPSByZXF1aXJlKHBhdGguam9pbihsaWJSb290LCAnY29yZS9saWIvdmFsaWRhdGlvbi9wcml2YXRlL21vZGVybi1mb3JtYXR0ZXIuanMnKSk7XG4gICAgcmV0dXJuIHR5cGVvZiBtb2Q/LmZvcm1hdFZhbGlkYXRpb25SZXBvcnRzID09PSAnZnVuY3Rpb24nID8gbW9kIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8vIOOCqOODs+OCuOODs++8iFdBU03vvInjga7liJ3mnJ/ljJbjga/ph43jgYTjgZ/jgoHjgIHjg6Ljgrjjg6Xjg7zjg6vjg6zjg5njg6vjgafjgq3jg6Pjg4Pjgrfjg6XjgZnjgotcbmxldCBjYWNoZWRFbmdpbmVNb2R1bGU6IGFueSB8IGZhbHNlIHwgdW5kZWZpbmVkO1xuZnVuY3Rpb24gbG9hZEVuZ2luZUNhY2hlZCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICBpZiAoY2FjaGVkRW5naW5lTW9kdWxlID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWNoZWRFbmdpbmVNb2R1bGUgPSBsb2FkRW5naW5lKCkgPz8gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZEVuZ2luZU1vZHVsZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBjYWNoZWRFbmdpbmVNb2R1bGU7XG59XG5cbi8vIOOCqOODs+OCuOODs++8iFdBU03vvInjga8gMSDjg5fjg63jgrvjgrnjgasgMSDjgaTjgaDjgZHnlJ/jgYvjgZnjgILkvZzjgornm7TjgZnliY3jgasgZnJlZSgpIOOBl+OBquOBhOOBqOOCpOODs+OCueOCv+ODs+OCueOBjFxuLy8g56mN44G/5LiK44GM44KK44CBMiDlgIvnm67ku6XpmY3jga7mp4vnr4njgYzotoXnt5rlvaLjgavpgYXjgY/jgarjgovvvIjlrp/muKw6IGZyZWUg54Sh44GX44GnIDMuOHMgLT4gMTEuMnMgLT4gMjIuMXPjgIFcbi8vIOani+evieWJjeOBqyBmcmVlIOOBmeOCi+OBqCAzLjVzIC0+IDAuNHPvvInjgILjg6vjg7zjg6vjgrvjg4Pjg4jjgYzlpInjgo/jgovvvIhTdGFnZSDjgZTjgajjgasgZXhjbHVkZSDjgYzpgZXjgYbjgIFcbi8vIOODhuOCueODiOOBp+ikh+aVsOOCouODl+ODquOCkuWQiOaIkOOBmeOCi++8ieOBn+OBs+OBq+S9nOOCiuebtOOBmeOBruOBp+OAgeOCreODo+ODg+OCt+ODpeOBryAxIOOCueODreODg+ODiOOBp+i2s+OCiuOCi+OAglxubGV0IGNhY2hlZFJlZ29FbmdpbmU6IHsga2V5OiBzdHJpbmc7IGVuZ2luZTogYW55IH0gfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiByZWdvRW5naW5lQ2FjaGVkKGVuZ2luZU1vZHVsZTogYW55LCBydWxlczogQnVuZGxlZFJ1bGVEYXRhW10sIHJlZ2lvbj86IHN0cmluZywgYWNjb3VudD86IHN0cmluZyk6IGFueSB7XG4gIGNvbnN0IGtleSA9IGAke3JlZ2lvbiA/PyAnJ318JHthY2NvdW50ID8/ICcnfXwke3J1bGVzLm1hcCgocikgPT4gci5pZCkuam9pbignLCcpfWA7XG4gIGlmIChjYWNoZWRSZWdvRW5naW5lPy5rZXkgIT09IGtleSkge1xuICAgIGNhY2hlZFJlZ29FbmdpbmU/LmVuZ2luZT8uZnJlZT8uKCk7XG4gICAgY2FjaGVkUmVnb0VuZ2luZSA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjdXN0b21SdWxlcyA9IFtcbiAgICAgIC4uLkJVTkRMRURfTElCUy5tYXAoKGwpID0+ICh7IG5hbWU6IGwubmFtZSwgY29udGVudDogbC5yZWdvIH0pKSxcbiAgICAgIC4uLm1lcmdlUnVsZU1vZHVsZXMocnVsZXMpLFxuICAgIF07XG4gICAgaWYgKHJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjdXN0b21SdWxlcy5wdXNoKGRlcGxveUVudmlyb25tZW50TW9kdWxlKHJlZ2lvbiwgYWNjb3VudCkpO1xuICAgIH1cbiAgICBjYWNoZWRSZWdvRW5naW5lID0geyBrZXksIGVuZ2luZTogbmV3IGVuZ2luZU1vZHVsZS5SZWdvRW5naW5lKHsgY3VzdG9tUnVsZXMgfSkgfTtcbiAgfVxuICByZXR1cm4gY2FjaGVkUmVnb0VuZ2luZS5lbmdpbmU7XG59XG5cbi8vIOims+a4rOODouODvOODie+8iGVuZm9yY2U6IGZhbHNl77yJ44GvIENESyDntYTjgb/ovrzjgb/jga4gQ2xvdWRGb3JtYXRpb25WYWxpZGF0ZVBsdWdpbiDjgavnm7jkuZfjgorjgZnjgovjgIJcbi8vIOOBguOBoeOCieOBr+OCs+ODs+OCueODiOODqeOCr+OCv+OBp+OCqOODs+OCuOODs+OCkiAxIOOBpOS9nOOBo+OBpiBmcmVlKCkg44GX44Gq44GE44Gu44Gn44CB5ZCM44GY44OX44Ot44K744K544GnIEFwcCDjgpJcbi8vIOS9nOOCiuebtOOBmeOBn+OBs+OBq+OCpOODs+OCueOCv+ODs+OCueOBjOepjeOBv+S4iuOBjOOCiuOAgXJlZ29FbmdpbmVDYWNoZWQg44Go5ZCM44GY6LaF57ea5b2i44Gu5oKq5YyW44KS6LW344GT44GZXG4vLyDvvIjlrp/muKwgMjAyNi0wOS0xMzog5ZCM44GY44Or44O844Or44K744OD44OI44GnIDQg5ZueIHN5bnRoIOOBl+OBpiAzNnMgLT4gOTVzIC0+IDEzMXMgLT4gMTc4c++8ieOAglxuLy8g44Or44O844Or44K744OD44OI44GM5aSJ44KP44KJ44Gq44GE6ZmQ44KK44OX44Op44Kw44Kk44Oz44GU44Go5L2/44GE5Zue44GZ44CCXG4vLyBwb255dGFpbDog44Kt44O844GM5aSJ44KP44Gj44Gf44Go44GN44Gr5Y+k44GE44Ko44Oz44K444Oz44GvIGZyZWUoKSDjgZfjgarjgYTvvIjjgqjjg7Pjgrjjg7Pjga8gQ0RLIOWBtOOBrlxuLy8gcHJpdmF0ZSDjg5XjgqPjg7zjg6vjg4njgafjgIHop6bjgovjgavjga/lhoXpg6jlrp/oo4XjgavmiYvjgpLlhaXjgozjgovjgZPjgajjgavjgarjgovvvInjgILoqK3lrprpgZXjgYTjga4gU3RhZ2Ug44GMXG4vLyBOIOWAi+OBguOCjOOBsCBOIOWAi+epjeOCgOOBjOOAgeWun+OCouODl+ODquOBp+OBryAx44CcMiDlgIvjgILnqY3jgb/kuIrjgYzjgorjgYzllY/poYzjgavjgarjgovjgarjgonjgIHjgZ3jga7jgajjgY3jgatcbi8vIOOCouODg+ODl+OCueODiOODquODvOODoOOBuCBmcmVlL2Rpc3Bvc2Ug44KS5YWl44KM44Gm44KC44KJ44GG44CCXG5sZXQgY2FjaGVkT2JzZXJ2ZVBsdWdpbjogeyBrZXk6IHN0cmluZzsgcGx1Z2luOiBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIH0gfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZVBsdWdpbkNhY2hlZChydWxlczogQnVuZGxlZFJ1bGVEYXRhW10pOiBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIHtcbiAgY29uc3Qga2V5ID0gcnVsZXMubWFwKChyKSA9PiByLmlkKS5qb2luKCcsJyk7XG4gIGlmIChjYWNoZWRPYnNlcnZlUGx1Z2luPy5rZXkgIT09IGtleSkge1xuICAgIGNhY2hlZE9ic2VydmVQbHVnaW4gPSB7XG4gICAgICBrZXksXG4gICAgICBwbHVnaW46IG5ldyBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luKHtcbiAgICAgICAgcmVnb1J1bGVzOiBbXG4gICAgICAgICAgLi4uQlVORExFRF9MSUJTLm1hcCgobCkgPT4gKHsgbmFtZTogbC5uYW1lLCBjb250ZW50OiBsLnJlZ28gfSkpLFxuICAgICAgICAgIC4uLm1lcmdlUnVsZU1vZHVsZXMocnVsZXMpLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gY2FjaGVkT2JzZXJ2ZVBsdWdpbi5wbHVnaW47XG59XG5cbi8qKiDlhajjg6vjg7zjg6vjgavlhbHpgJrjga4gcmVnbyDjg5jjg4Pjg4DjgIJidW5kbGUtcnVsZXMg44GMIHBhY2thZ2Ug5ZCN44GoIGltcG9ydCDjgpIgMSDnqK7poZ7jgavlvLfliLbjgZfjgabjgYTjgovjgIIgKi9cbmNvbnN0IFJFR09fSEVBREVSID0gJ3BhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuJztcblxuLyoqXG4gKiDjg6vjg7zjg6vjgpIgc2VydmljZSDjgZTjgajjgasgMSDjg6Ljgrjjg6Xjg7zjg6vjgbjjgb7jgajjgoHjgovjgIJcbiAqXG4gKiDjgrPjg7Pjg5HjgqTjg6vmmYLplpPjga/jg6vjg7zjg6vmnKzkvZPjga7ph4/jgojjgorjg6Ljgrjjg6Xjg7zjg6vmlbDjgaflirnjgYTjgabjgY/jgovvvIjlrp/muKwgMTg0NCDjg6vjg7zjg6vjgpJcbiAqIDEg44Or44O844OrIDEg44Oi44K444Ol44O844Or44Gn6LyJ44Gb44KL44Go57SEIDYuMnPjgIFzZXJ2aWNlIOWNmOS9jeOBriAzOSDjg6Ljgrjjg6Xjg7zjg6vjgavnlbPjgoDjgajntIQgMS4wc++8ieOAglxuICog44Or44O844Or44Gv44KC44Go44KC44Go5YWo6YOoIGBwYWNrYWdlIGNka19wcmVmbGlnaHRgIOOBquOBruOBp+OAgVJlZ28g44GL44KJ6KaL44KM44Gw57WQ5ZCI44GX44Gm44KCXG4gKiDjgZfjgarjgY/jgabjgoLlkIzjgZggMSDjg5Hjg4PjgrHjg7zjgrjigJTigJTjg6Ljgrjjg6Xjg7zjg6vlooPnlYzjgavmhI/lkbPoq5bjga/nhKHjgYTjgILjgZfjgZ/jgYzjgaPjgabnlbPjgoHjgovjga7jgaDjgYzjgIFcbiAqIOijj+OCkui/lOOBm+OBsOOAjOWIpeODq+ODvOODq+OBjOWQjOOBmOWQjeWJjeOBruODmOODq+ODkeODvOOCkuWumue+qeOBmeOCi+OBqOm7meOBo+OBpiAxIOOBpOOBruimj+WJh+OBq+WQiOa1geOBmeOCi+OAjVxuICog44Go44GE44GG5Y2x6Zm644KC57WQ5ZCI5YmN44GL44KJ5a2Y5Zyo44GZ44KL44CCYnVuZGxlLXJ1bGVzIOOBjOODq+ODvOODq+mWk+OBruODiOODg+ODl+ODrOODmeODq+WQjeihneeqgeOCklxuICog5by+44GE44Gm44GE44KL44Gu44Gv44Gd44Gu44Gf44KB77yI5YWx5pyJ44GX44Gf44GE5a6a576p44GvIHJ1bGVzL19saWIvIOOBq+e9ruOBj++8ieOAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUnVsZU1vZHVsZXMocnVsZXM6IEJ1bmRsZWRSdWxlRGF0YVtdKTogeyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9W10ge1xuICBjb25zdCBieVNlcnZpY2UgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGZvciAoY29uc3QgciBvZiBydWxlcykge1xuICAgIGNvbnN0IGJvZHkgPSByLnJlZ28ucmVwbGFjZSgvXig/OnBhY2thZ2V8aW1wb3J0KVxccy4qXFxuL2dtLCAnJyk7XG4gICAgYnlTZXJ2aWNlLnNldChyLnNlcnZpY2UsIFsuLi5ieVNlcnZpY2UuZ2V0KHIuc2VydmljZSkgPz8gW10sIGJvZHldKTtcbiAgfVxuICByZXR1cm4gWy4uLmJ5U2VydmljZV0ubWFwKChbc2VydmljZSwgYm9kaWVzXSkgPT4gKHtcbiAgICBuYW1lOiBgX3BmX3NlcnZpY2VfJHtzZXJ2aWNlfWAsXG4gICAgY29udGVudDogUkVHT19IRUFERVIgKyBib2RpZXMuam9pbignXFxuJyksXG4gIH0pKTtcbn1cblxuLyoqXG4gKiDjg4bjg7Pjg5fjg6zjg7zjg4jnvqTjgavlh7rjgabjgY/jgovjg6rjgr3jg7zjgrnjgr/jgqTjg5fjgILliIjjgorovrzjgb/jgavkvb/jgYjjgarjgYTjg4bjg7Pjg5fjg6zjg7zjg4jjgYwgMSDmnprjgafjgoLjgYLjgozjgbBcbiAqIHVuZGVmaW5lZCDjgpLov5TjgZfjgIHliIjjgorovrzjgb/jgZ3jga7jgoLjga7jgpLoq6bjgoHjgovvvIjkvZXjgYzovInjgaPjgabjgYTjgovjgYvliIbjgYvjgonjgarjgYTjgb7jgb7okL3jgajjgZnjgajjgIFcbiAqIOODq+ODvOODq+OBjOm7meOBo+OBpueZuueBq+OBl+OBquOBj+OBquOCiyA9IGVuZm9yY2Ug44Gr44Go44Gj44Gm5pyA5oKq44Gu5aOK44KM5pa544Gr44Gq44KL44Gf44KB77yJ44CCXG4gKiDvvIjjg4bjgrnjg4jjgYvjgonjgoLliKnnlKjjgZnjgovjgZ/jgoEgZXhwb3J0IOOBl+OBpuOBhOOCi++8iVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVSZXNvdXJjZVR5cGVzKHRlbXBsYXRlUGF0aHM6IHN0cmluZ1tdKTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCB0eXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHRlbXBsYXRlUGF0aCBvZiB0ZW1wbGF0ZVBhdGhzKSB7XG4gICAgbGV0IHRlbXBsYXRlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRlbXBsYXRlID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIFRyYW5zZm9ybe+8iFNBTSDnrYnvvInjga/jg57jgq/jg63lsZXplovjgafliKXjga7jg6rjgr3jg7zjgrnjgavljJbjgZHjgovjga7jgafjgIHnlJ/jga7jg4bjg7Pjg5fjg6zjg7zjg4jjgYvjgolcbiAgICAvLyDoqq3jgoHjgovjg6rjgr3jg7zjgrnjgr/jgqTjg5fjga/lvZPjgabjgavjgarjgonjgarjgYTjgIJcbiAgICBpZiAodGVtcGxhdGU/LlRyYW5zZm9ybSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgT2JqZWN0LnZhbHVlcyh0ZW1wbGF0ZT8uUmVzb3VyY2VzID8/IHt9KSBhcyBhbnlbXSkge1xuICAgICAgLy8gRm46OkZvckVhY2gg44Gq44Gp44GnIFR5cGUg44GM6Z2Z55qE44Gr6Kqt44KB44Gq44GE44Ko44Oz44OI44Oq44GM44GC44KM44Gw6Kum44KB44KL44CCXG4gICAgICBpZiAodHlwZW9mIHJlc291cmNlPy5UeXBlICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHR5cGVzLmFkZChyZXNvdXJjZS5UeXBlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHR5cGVzO1xufVxuXG4vKipcbiAqIOODhuODs+ODl+ODrOODvOODiOOBq+WHuuOBpuOBj+OCi+ODquOCveODvOOCueOCv+OCpOODl+OBq+mWouS/guOBmeOCi+ODq+ODvOODq+OBoOOBkeOCkumBuOOBtuOAglxuICpcbiAqIOOCqOODs+OCuOODs+OBruOCs+ODs+ODkeOCpOODq+aZgumWk+OBr+ODq+ODvOODq+aVsOOBp+OBu+OBvOaxuuOBvuOCi+OBruOBp++8iOWun+a4rCAxODQ0IOODq+ODvOODq+OBp+e0hCA0LjZz44CBXG4gKiDlhbjlnovnmoTjgarjgqLjg5fjg6rjgavmrovjgosgMTAwIOODq+ODvOODq+WJjeW+jOOBquOCiSAwLjhzIOWJjeW+jO+8ieOAgeOBk+OCjOOBjOWbuuWumuiyu+OBruS4u+OBquWJiuOCiuOBqeOBk+OCjeOAglxuICog5a6J5YWo5oCn44GvIG1ldGEucmVzb3VyY2VUeXBlcyDjga7lrqPoqIDjgavkuZfjgaPjgabjgYTjgos6IOODq+ODvOODq+OBjOimi+OCi+ODquOCveODvOOCueOCv+OCpOODl+OBjFxuICog5a6j6KiA44GL44KJ5ryP44KM44Gm44GE44KL44Go5YiI44KJ44KM44Gm55m654Gr44GX44Gq44GP44Gq44KL44Gf44KB44CBdGVzdC9ydWxlcy50ZXN0LnRzIOOBjOWFqOODq+ODvOODq+OBq+OBpOOBhOOBplxuICog44CM6Ieq5YiG44GuIGZhaWwg44OG44Oz44OX44Os44O844OI44Gn5YiI44KK5q6L44KL44GT44Go44CN44KS5qSc5p+744GX44Gm44GE44KL44CCXG4gKiDvvIjjg4bjgrnjg4jjgYvjgonjgoLliKnnlKjjgZnjgovjgZ/jgoEgZXhwb3J0IOOBl+OBpuOBhOOCi++8iVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmUocnVsZXM6IEJ1bmRsZWRSdWxlRGF0YVtdLCB0eXBlczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQpOiBCdW5kbGVkUnVsZURhdGFbXSB7XG4gIGlmICh0eXBlcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gcnVsZXM7XG4gIC8vIOWIiOOCi+agueaLoOOBjOeEoeOBhOODq+ODvOODq+OBr+aui+OBmTogXCIqXCLvvIjlhajjg6rjgr3jg7zjgrnlnovjgavlirnjgY/jgr/jgrDns7vjg6vjg7zjg6vvvInjgajjgIFcbiAgLy8gcmVzb3VyY2VUeXBlcyDjgYznqbrjga7jgoLjga7vvIjjg5Djg7Pjg4njg6vmuIjjgb/jg6vjg7zjg6vjga/pnZ7nqbrjgYzkv53oqLzjgZXjgozjgabjgYTjgovjga7jgafjgIHoqbLlvZPjgZnjgovjga7jga9cbiAgLy8g5omL44Gn57WE44G/56uL44Gm44Gf44Or44O844OrID0g44OG44K544OI44KE5bCG5p2l44Gu44OG44Oz44OX44Os44O844OI5bGk44Or44O844Or44Gg44GR77yJ44CCXG4gIHJldHVybiBydWxlcy5maWx0ZXIoKHIpID0+IHIucmVzb3VyY2VUeXBlcy5sZW5ndGggPT09IDBcbiAgICB8fCByLnJlc291cmNlVHlwZXMuaW5jbHVkZXMoJyonKVxuICAgIHx8IHIucmVzb3VyY2VUeXBlcy5zb21lKCh0KSA9PiB0eXBlcy5oYXModCkpKTtcbn1cblxuLyoqXG4gKiBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlIOOCkuino+axuuOBmeOCi+OAglxuICog6YCa5bi444GvIGF3cy1jZGstbGliIOOBjCBidW5kbGVkRGVwZW5kZW5jaWVzIOOBqOOBl+OBpuWQjOaiseOBl+OBpuOBhOOCi+OCs+ODlOODvOOBq+S5l+OCi+OAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbmdpbmUoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZSgnQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZScpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGxpYlBrZyA9IHJlcXVpcmUucmVzb2x2ZSgnYXdzLWNkay1saWIvcGFja2FnZS5qc29uJyk7XG4gICAgY29uc3QgZW5nUGtnID0gcmVxdWlyZS5yZXNvbHZlKCdAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbcGF0aC5kaXJuYW1lKGxpYlBrZyldLFxuICAgIH0pO1xuICAgIHJldHVybiByZXF1aXJlKHBhdGguZGlybmFtZShlbmdQa2cpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -88,9 +88,13 @@
|
|
|
88
88
|
"publishConfig": {
|
|
89
89
|
"access": "public"
|
|
90
90
|
},
|
|
91
|
-
"version": "0.0.
|
|
91
|
+
"version": "0.0.122",
|
|
92
92
|
"jest": {
|
|
93
93
|
"coverageProvider": "v8",
|
|
94
|
+
"coveragePathIgnorePatterns": [
|
|
95
|
+
"/node_modules/",
|
|
96
|
+
"/src/rules.generated.ts"
|
|
97
|
+
],
|
|
94
98
|
"testMatch": [
|
|
95
99
|
"<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
|
|
96
100
|
"<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
|
|
@@ -107,9 +111,6 @@
|
|
|
107
111
|
"text"
|
|
108
112
|
],
|
|
109
113
|
"coverageDirectory": "coverage",
|
|
110
|
-
"coveragePathIgnorePatterns": [
|
|
111
|
-
"/node_modules/"
|
|
112
|
-
],
|
|
113
114
|
"testPathIgnorePatterns": [
|
|
114
115
|
"/node_modules/"
|
|
115
116
|
],
|