sonamu 0.7.53 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/config.d.ts +9 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/sonamu.d.ts +21 -1
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +159 -65
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts +10 -0
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/anonymous.js +23 -0
- package/dist/auth/plugins/entity-definitions/api-key.d.ts +9 -0
- package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/api-key.js +199 -0
- package/dist/auth/plugins/entity-definitions/index.d.ts +6 -0
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +20 -2
- package/dist/auth/plugins/entity-definitions/jwt.d.ts +9 -0
- package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/jwt.js +67 -0
- package/dist/auth/plugins/entity-definitions/organization.d.ts +9 -0
- package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/organization.js +424 -0
- package/dist/auth/plugins/entity-definitions/passkey.d.ts +10 -0
- package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/passkey.js +129 -0
- package/dist/auth/plugins/entity-definitions/sso.d.ts +10 -0
- package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -0
- package/dist/auth/plugins/entity-definitions/sso.js +110 -0
- package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.js +2 -4
- package/dist/auth/plugins/wrappers/anonymous.d.ts +18 -0
- package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/anonymous.js +26 -0
- package/dist/auth/plugins/wrappers/api-key.d.ts +18 -0
- package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/api-key.js +38 -0
- package/dist/auth/plugins/wrappers/index.d.ts +6 -0
- package/dist/auth/plugins/wrappers/index.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/index.js +7 -1
- package/dist/auth/plugins/wrappers/jwt.d.ts +18 -0
- package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/jwt.js +30 -0
- package/dist/auth/plugins/wrappers/organization.d.ts +18 -0
- package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/organization.js +67 -0
- package/dist/auth/plugins/wrappers/passkey.d.ts +18 -0
- package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/passkey.js +32 -0
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +2 -4
- package/dist/auth/plugins/wrappers/sso.d.ts +853 -0
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -0
- package/dist/auth/plugins/wrappers/sso.js +36 -0
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +2 -4
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +2 -4
- package/dist/bin/build-config.d.ts +2 -2
- package/dist/bin/build-config.js +6 -7
- package/dist/bin/cli.js +417 -32
- package/dist/bin/fixture.d.ts +27 -0
- package/dist/bin/fixture.d.ts.map +1 -0
- package/dist/bin/fixture.js +245 -0
- package/dist/cache/decorator.d.ts +4 -3
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +5 -4
- package/dist/cone/cone-generator.d.ts +33 -0
- package/dist/cone/cone-generator.d.ts.map +1 -0
- package/dist/cone/cone-generator.js +286 -0
- package/dist/database/_batch_update.d.ts.map +1 -1
- package/dist/database/_batch_update.js +16 -2
- package/dist/database/puri-subset.test-d.js +1 -1
- package/dist/database/puri-subset.types.d.ts +1 -1
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri.d.ts +4 -0
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +20 -2
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +19 -3
- package/dist/dict/en.d.ts +15 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +2 -1
- package/dist/dict/ko.d.ts +15 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +2 -1
- package/dist/dict/rc-keys.d.ts +28 -0
- package/dist/dict/rc-keys.d.ts.map +1 -1
- package/dist/dict/rc-keys.js +31 -1
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +20 -4
- package/dist/entity/entity-manager.d.ts +298 -2
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +4 -1
- package/dist/entity/entity-template-cone.d.ts +14 -0
- package/dist/entity/entity-template-cone.d.ts.map +1 -0
- package/dist/entity/entity-template-cone.js +222 -0
- package/dist/entity/entity.d.ts +47 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +161 -14
- package/dist/ssr/renderer.js +3 -3
- package/dist/syncer/api-parser.js +12 -1
- package/dist/syncer/checksum.d.ts +0 -14
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +1 -23
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +8 -2
- package/dist/syncer/syncer.d.ts +1 -1
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +17 -10
- package/dist/tasks/workflow-manager.d.ts +13 -1
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +18 -1
- package/dist/template/entity-converter.js +4 -4
- package/dist/template/helpers.d.ts +10 -0
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +48 -1
- package/dist/template/implementations/entry-server.template.d.ts +1 -1
- package/dist/template/implementations/entry-server.template.js +7 -2
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +5 -1
- package/dist/template/implementations/generated_http.template.d.ts +1 -0
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +6 -2
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +29 -8
- package/dist/template/implementations/queries.template.d.ts.map +1 -1
- package/dist/template/implementations/queries.template.js +9 -1
- package/dist/template/implementations/sd.template.d.ts +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +28 -4
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +12 -12
- package/dist/template/implementations/view_form.template.d.ts +11 -7
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +97 -87
- package/dist/template/implementations/view_list.template.d.ts +3 -3
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +115 -109
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.js +18 -14
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +95 -7
- package/dist/testing/_relation-graph.js +1 -1
- package/dist/testing/data-explorer.d.ts +61 -0
- package/dist/testing/data-explorer.d.ts.map +1 -0
- package/dist/testing/data-explorer.js +274 -0
- package/dist/testing/faker-mappings.d.ts +20 -0
- package/dist/testing/faker-mappings.d.ts.map +1 -0
- package/dist/testing/faker-mappings.js +421 -0
- package/dist/testing/fixture-generator.d.ts +161 -0
- package/dist/testing/fixture-generator.d.ts.map +1 -0
- package/dist/testing/fixture-generator.js +954 -0
- package/dist/testing/fixture-manager.d.ts +6 -1
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +72 -4
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +4 -1
- package/dist/types/types.d.ts +1520 -26
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +136 -22
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +9 -4
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +303 -24
- package/dist/ui-web/assets/index-CsUr-_pV.js +254 -0
- package/dist/ui-web/assets/index-T42zzs1K.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/fs-utils.d.ts +2 -1
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +14 -3
- package/package.json +19 -11
- package/src/api/config.ts +12 -1
- package/src/api/sonamu.ts +179 -65
- package/src/auth/plugins/entity-definitions/anonymous.ts +17 -0
- package/src/auth/plugins/entity-definitions/api-key.ts +93 -0
- package/src/auth/plugins/entity-definitions/index.ts +18 -0
- package/src/auth/plugins/entity-definitions/jwt.ts +35 -0
- package/src/auth/plugins/entity-definitions/organization.ts +215 -0
- package/src/auth/plugins/entity-definitions/passkey.ts +64 -0
- package/src/auth/plugins/entity-definitions/sso.ts +62 -0
- package/src/auth/plugins/entity-definitions/types.ts +11 -1
- package/src/auth/plugins/wrappers/admin.ts +1 -3
- package/src/auth/plugins/wrappers/anonymous.ts +30 -0
- package/src/auth/plugins/wrappers/api-key.ts +42 -0
- package/src/auth/plugins/wrappers/index.ts +6 -0
- package/src/auth/plugins/wrappers/jwt.ts +34 -0
- package/src/auth/plugins/wrappers/organization.ts +73 -0
- package/src/auth/plugins/wrappers/passkey.ts +36 -0
- package/src/auth/plugins/wrappers/phone-number.ts +1 -3
- package/src/auth/plugins/wrappers/sso.ts +40 -0
- package/src/auth/plugins/wrappers/two-factor.ts +1 -3
- package/src/auth/plugins/wrappers/username.ts +1 -3
- package/src/bin/build-config.ts +6 -6
- package/src/bin/cli.ts +452 -31
- package/src/bin/fixture.ts +302 -0
- package/src/cache/decorator.ts +4 -3
- package/src/cone/cone-generator.ts +363 -0
- package/src/database/_batch_update.ts +11 -0
- package/src/database/puri-subset.test-d.ts +13 -13
- package/src/database/puri-subset.types.ts +1 -1
- package/src/database/puri.ts +43 -1
- package/src/database/upsert-builder.ts +16 -2
- package/src/dict/en.ts +1 -0
- package/src/dict/ko.ts +1 -0
- package/src/dict/rc-keys.ts +32 -0
- package/src/dict/sd.ts +23 -3
- package/src/entity/entity-manager.ts +4 -0
- package/src/entity/entity-template-cone.ts +298 -0
- package/src/entity/entity.ts +189 -13
- package/src/shared/app.shared.ts.txt +5 -0
- package/src/shared/web.shared.ts.txt +9 -5
- package/src/skills/project/README.md +21 -0
- package/src/skills/project/architecture.md +373 -0
- package/src/skills/project/business-logic.md +270 -0
- package/src/skills/project/requirements.md +160 -0
- package/src/skills/sonamu/SKILL.md +168 -3
- package/src/skills/sonamu/api.md +102 -0
- package/src/skills/sonamu/database.md +220 -1
- package/src/skills/sonamu/entity-relations.md +89 -1
- package/src/skills/sonamu/fixture-cli.md +501 -0
- package/src/skills/sonamu/frontend.md +214 -0
- package/src/skills/sonamu/i18n.md +95 -0
- package/src/skills/sonamu/model.md +153 -0
- package/src/skills/sonamu/project-init.md +178 -8
- package/src/skills/sonamu/scaffolding.md +112 -0
- package/src/skills/sonamu/subset.md +9 -3
- package/src/skills/sonamu/testing.md +287 -2
- package/src/skills/sonamu/workflow.md +70 -5
- package/src/ssr/renderer.ts +2 -2
- package/src/syncer/api-parser.ts +12 -0
- package/src/syncer/checksum.ts +0 -38
- package/src/syncer/syncer-actions.ts +7 -1
- package/src/syncer/syncer.ts +16 -5
- package/src/tasks/workflow-manager.ts +29 -8
- package/src/template/entity-converter.ts +3 -3
- package/src/template/helpers.ts +49 -0
- package/src/template/implementations/entry-server.template.ts +1 -1
- package/src/template/implementations/generated.template.ts +4 -0
- package/src/template/implementations/generated_http.template.ts +1 -0
- package/src/template/implementations/generated_sso.template.ts +40 -11
- package/src/template/implementations/queries.template.ts +8 -0
- package/src/template/implementations/sd.template.ts +22 -3
- package/src/template/implementations/services.template.ts +11 -10
- package/src/template/implementations/view_form.template.ts +111 -101
- package/src/template/implementations/view_list.template.ts +120 -119
- package/src/template/implementations/view_search_input.template.ts +17 -13
- package/src/template/zod-converter.ts +103 -6
- package/src/testing/_relation-graph.ts +1 -1
- package/src/testing/data-explorer.ts +427 -0
- package/src/testing/faker-mappings.ts +434 -0
- package/src/testing/fixture-generator.ts +1166 -0
- package/src/testing/fixture-manager.ts +91 -6
- package/src/testing/index.ts +3 -0
- package/src/types/types.ts +222 -26
- package/src/ui/ai-client.ts +9 -1
- package/src/ui/api.ts +429 -23
- package/src/utils/fs-utils.ts +14 -1
- package/dist/template/implementations/view_enums_select.template.d.ts +0 -17
- package/dist/template/implementations/view_enums_select.template.d.ts.map +0 -1
- package/dist/template/implementations/view_enums_select.template.js +0 -62
- package/dist/template/implementations/view_id_async_select.template.d.ts +0 -17
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +0 -1
- package/dist/template/implementations/view_id_async_select.template.js +0 -125
- package/dist/ui-web/assets/index-Bd_2AkLb.css +0 -1
- package/dist/ui-web/assets/index-BpSbhQWo.js +0 -225
- package/src/template/implementations/view_enums_select.template.ts +0 -65
- package/src/template/implementations/view_id_async_select.template.ts +0 -139
|
@@ -2,7 +2,7 @@ import inflection from "inflection";
|
|
|
2
2
|
import { flat } from "radashi";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { EntityManager } from "../../entity/entity-manager.js";
|
|
5
|
-
import { getEnumInfoFromColName, getRelationPropFromColName } from "../helpers.js";
|
|
5
|
+
import { getEnumInfoFromColName, getRelationNameFromColumnName, getRelationPropFromColName } from "../helpers.js";
|
|
6
6
|
import { Template } from "../template.js";
|
|
7
7
|
export class Template__view_list extends Template {
|
|
8
8
|
constructor(){
|
|
@@ -39,8 +39,10 @@ export class Template__view_list extends Template {
|
|
|
39
39
|
case "string-plain":
|
|
40
40
|
case "string-date":
|
|
41
41
|
case "number-id":
|
|
42
|
+
case "string-id":
|
|
42
43
|
return `<>{${colName}}</>`;
|
|
43
44
|
case "number-fk_id":
|
|
45
|
+
case "string-fk_id":
|
|
44
46
|
{
|
|
45
47
|
try {
|
|
46
48
|
const baseName = col.name.includes(".") ? (col.name.split(".").pop() ?? col.name).replace("_id", "") : col.name.replace("_id", "");
|
|
@@ -146,7 +148,7 @@ export class Template__view_list extends Template {
|
|
|
146
148
|
return "";
|
|
147
149
|
}
|
|
148
150
|
}
|
|
149
|
-
} else if (col.renderType === "number-fk_id") {
|
|
151
|
+
} else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
|
|
150
152
|
try {
|
|
151
153
|
const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
|
|
152
154
|
const targetNames = EntityManager.getNamesFromId(relProp.with);
|
|
@@ -177,7 +179,7 @@ export class Template__view_list extends Template {
|
|
|
177
179
|
}
|
|
178
180
|
}
|
|
179
181
|
return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} />`;
|
|
180
|
-
} else if (col.renderType === "number-fk_id") {
|
|
182
|
+
} else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
|
|
181
183
|
try {
|
|
182
184
|
const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
|
|
183
185
|
componentId = `${relProp.with}IdAsyncSelect`;
|
|
@@ -221,68 +223,41 @@ export class Template__view_list extends Template {
|
|
|
221
223
|
const idTsType = pkType === "string" || pkType === "uuid" ? "string" : "number";
|
|
222
224
|
// 실제 리스트 컬럼
|
|
223
225
|
const columns = columnsNode.children.sort((a, b)=>a.name === "id" ? -1 : b.name === "id" ? 1 : 0).map((col)=>{
|
|
224
|
-
const propCandidate = entity.props.find((p)=>p.name === col.name);
|
|
225
226
|
const rendered = this.renderColumn(entityId, col, names);
|
|
227
|
+
// 라벨 생성: common 필드(created_at)는 SD("common.{field}"), entity 필드는 SD("entity.{Entity}.{field}")
|
|
228
|
+
let label;
|
|
229
|
+
if (col.name === "id") {
|
|
230
|
+
label = '"ID"';
|
|
231
|
+
} else if ([
|
|
232
|
+
"created_at"
|
|
233
|
+
].includes(col.name)) {
|
|
234
|
+
// camelCase로 변환 (created_at -> createdAt)
|
|
235
|
+
const camelName = col.name.replace(/_([a-z])/g, (_, char)=>char.toUpperCase());
|
|
236
|
+
label = `SD("common.${camelName}")`;
|
|
237
|
+
} else {
|
|
238
|
+
const labelName = getRelationNameFromColumnName(entityId, col.name);
|
|
239
|
+
label = `SD("entity.${names.capital}.${labelName}")`;
|
|
240
|
+
}
|
|
226
241
|
return {
|
|
227
242
|
name: col.name,
|
|
228
|
-
label
|
|
243
|
+
label,
|
|
229
244
|
tc: `(row) => ${rendered}`,
|
|
230
|
-
fit: col.renderType === "number-id" || col.renderType === "datetime" || col.renderType === "string-datetime",
|
|
231
|
-
align: col.renderType === "number-id" ? "center" : undefined
|
|
245
|
+
fit: col.name === "id" || col.renderType === "number-id" || col.renderType === "datetime" || col.renderType === "string-datetime",
|
|
246
|
+
align: col.name === "id" || col.renderType === "number-id" ? "center" : undefined
|
|
232
247
|
};
|
|
233
248
|
});
|
|
234
249
|
// 필터 컬럼
|
|
235
|
-
const filterColumns = listParamsNode.children.filter((col)=>col.name !== "id" && col.name !== "queryMode" &&
|
|
250
|
+
const filterColumns = listParamsNode.children.filter((col)=>col.name !== "id" && col.name !== "queryMode" && [
|
|
236
251
|
"enums",
|
|
237
|
-
"number-id"
|
|
238
|
-
|
|
252
|
+
"number-id",
|
|
253
|
+
"number-fk_id",
|
|
254
|
+
"string-fk_id"
|
|
255
|
+
].includes(col.renderType))// orderBy가 가장 뒤로 오게 순서 조정
|
|
239
256
|
.sort((a)=>{
|
|
240
257
|
return a.name === "orderBy" ? 1 : -1;
|
|
241
258
|
});
|
|
242
259
|
// 필터 컬럼을 프리 템플릿으로 설정
|
|
243
260
|
const preTemplates = [];
|
|
244
|
-
for (const col of filterColumns){
|
|
245
|
-
let key;
|
|
246
|
-
let targetEntityId = entityId;
|
|
247
|
-
let enumId;
|
|
248
|
-
if (col.renderType === "enums") {
|
|
249
|
-
if (col.name === "search") {
|
|
250
|
-
key = "view_enums_select";
|
|
251
|
-
enumId = `${names.capital}SearchField`;
|
|
252
|
-
targetEntityId = names.capital;
|
|
253
|
-
} else {
|
|
254
|
-
key = "view_enums_select";
|
|
255
|
-
// config.enumId 우선 사용
|
|
256
|
-
if (col.config && "enumId" in col.config) {
|
|
257
|
-
enumId = col.config.enumId;
|
|
258
|
-
targetEntityId = entityId;
|
|
259
|
-
} else {
|
|
260
|
-
try {
|
|
261
|
-
const { targetEntityNames, id } = getEnumInfoFromColName(entityId, col.name);
|
|
262
|
-
targetEntityId = targetEntityNames.capital;
|
|
263
|
-
enumId = id;
|
|
264
|
-
} catch {
|
|
265
|
-
continue;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
} else {
|
|
270
|
-
key = "view_id_async_select";
|
|
271
|
-
try {
|
|
272
|
-
const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
|
|
273
|
-
targetEntityId = relProp.with;
|
|
274
|
-
} catch {
|
|
275
|
-
continue;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
preTemplates.push({
|
|
279
|
-
key,
|
|
280
|
-
options: {
|
|
281
|
-
entityId: targetEntityId,
|
|
282
|
-
enumId
|
|
283
|
-
}
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
261
|
// 컬럼에서 사용하는 enum들 수집
|
|
287
262
|
const columnEnums = [];
|
|
288
263
|
(columnsNode.children ?? []).forEach((col)=>{
|
|
@@ -293,13 +268,6 @@ export class Template__view_list extends Template {
|
|
|
293
268
|
} catch {}
|
|
294
269
|
}
|
|
295
270
|
});
|
|
296
|
-
// SearchInput
|
|
297
|
-
preTemplates?.push({
|
|
298
|
-
key: "view_search_input",
|
|
299
|
-
options: {
|
|
300
|
-
entityId
|
|
301
|
-
}
|
|
302
|
-
});
|
|
303
271
|
// 디폴트 파라미터
|
|
304
272
|
// const def = this.getDefault(filterColumns);
|
|
305
273
|
return {
|
|
@@ -312,13 +280,14 @@ import { Card, CardContent, CardHeader } from "@sonamu-kit/react-components/comp
|
|
|
312
280
|
import { Badge } from "@sonamu-kit/react-components/components";
|
|
313
281
|
import { Button } from "@sonamu-kit/react-components/components";
|
|
314
282
|
import { Pagination, Table, TableBody, TableCell, type TableCol, TableHead, TableHeader, TableRow } from "@sonamu-kit/react-components/components";
|
|
315
|
-
import {
|
|
283
|
+
import { EnumSelect } from "@sonamu-kit/react-components/components";
|
|
316
284
|
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@sonamu-kit/react-components/components";
|
|
317
285
|
import { Input } from "@sonamu-kit/react-components/components";
|
|
318
286
|
import { Checkbox } from "@sonamu-kit/react-components/components";
|
|
287
|
+
import { SonamuFilterModal, SonamuFilterPopover, extractFieldMetaFromSchema, type Rule } from "@sonamu-kit/react-components/components";
|
|
319
288
|
|
|
320
289
|
import { useListParams, numF, dateF, datetimeF } from "@sonamu-kit/react-components/lib";
|
|
321
|
-
import { ${names.capital}SubsetA } from "@/services/sonamu.generated";
|
|
290
|
+
import { ${names.capital}SubsetA, ${names.capital}BaseSchema } from "@/services/sonamu.generated";
|
|
322
291
|
import { ${names.capital}Service } from "@/services/services.generated";
|
|
323
292
|
import { ${names.capital}ListParams } from "@/services/${names.fs}/${names.fs}.types";
|
|
324
293
|
import { ${(()=>{
|
|
@@ -358,26 +327,24 @@ import { ${(()=>{
|
|
|
358
327
|
...enumImports
|
|
359
328
|
].join(", ");
|
|
360
329
|
})()} } from "@/services/sonamu.generated";
|
|
330
|
+
import { IdAsyncSelect } from "@sonamu-kit/react-components/components";
|
|
361
331
|
${(()=>{
|
|
362
|
-
// FK 필드의
|
|
363
|
-
const fkColumns = filterColumns.filter((col)=>col.
|
|
364
|
-
|
|
332
|
+
// FK 필드의 AsyncIdConfig import
|
|
333
|
+
const fkColumns = filterColumns.filter((col)=>col.renderType === "number-fk_id" || col.renderType === "string-fk_id");
|
|
334
|
+
const configNames = fkColumns.map((col)=>{
|
|
365
335
|
try {
|
|
366
336
|
const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
|
|
367
|
-
|
|
368
|
-
return `import { ${relProp.with}IdAsyncSelect } from "@/components/${targetNames.fs}/${relProp.with}IdAsyncSelect";`;
|
|
337
|
+
return `${relProp.with}AsyncIdConfig`;
|
|
369
338
|
} catch {
|
|
370
339
|
return "";
|
|
371
340
|
}
|
|
372
|
-
}).filter(Boolean)
|
|
341
|
+
}).filter(Boolean);
|
|
342
|
+
return configNames.length > 0 ? `import { ${configNames.join(", ")} } from "@/services/services.generated";` : "";
|
|
373
343
|
})()}
|
|
374
|
-
${filterColumns.some((col)=>col.name === "search") ? `
|
|
375
|
-
import { ${names.capital}SearchFieldSelect } from "@/components/${names.fs}/${names.capital}SearchFieldSelect";` : ""}
|
|
376
|
-
${filterColumns.some((col)=>col.name === "orderBy") ? `
|
|
377
|
-
import { ${names.capital}OrderBySelect } from "@/components/${names.fs}/${names.capital}OrderBySelect";` : ""}
|
|
378
344
|
|
|
379
345
|
import EditIcon from "~icons/lucide/square-pen";
|
|
380
346
|
import TrashIcon from "~icons/lucide/trash-2";
|
|
347
|
+
import FilterIcon from "~icons/mdi/filter-variant";
|
|
381
348
|
import ListIcon from "~icons/mdi/format-list-bulleted";
|
|
382
349
|
import SearchIcon from "~icons/mdi/magnify";
|
|
383
350
|
import { SD } from "@/i18n/sd.generated";
|
|
@@ -391,14 +358,17 @@ function ${names.capital}List({}: ${names.capital}ListProps) {
|
|
|
391
358
|
const [selectedItems, setSelectedItems] = useState<Set<${idTsType}>>(new Set());
|
|
392
359
|
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
|
|
393
360
|
const [itemToDelete, setItemToDelete] = useState<{ id: ${idTsType}; name?: string } | null>(null);
|
|
361
|
+
const [filterModalOpen, setFilterModalOpen] = useState(false);
|
|
362
|
+
const [appliedRules, setAppliedRules] = useState<Rule[]>([]);
|
|
394
363
|
|
|
395
364
|
// 리스트 필터
|
|
396
|
-
const { listParams, register } = useListParams(${names.capital}ListParams, {
|
|
365
|
+
const { listParams, register, setListParams } = useListParams(${names.capital}ListParams, {
|
|
397
366
|
num: 10,
|
|
398
367
|
page: 1,
|
|
399
368
|
keyword: "",${filterColumns.some((col)=>col.name === "search") ? `
|
|
400
369
|
search: ${names.capital}SearchField.options[0],` : ""}${filterColumns.some((col)=>col.name === "orderBy") ? `
|
|
401
370
|
orderBy: ${names.capital}OrderBy.options[0],` : ""}
|
|
371
|
+
sonamuFilter: {},
|
|
402
372
|
});
|
|
403
373
|
|
|
404
374
|
// 리스트 쿼리
|
|
@@ -408,20 +378,20 @@ function ${names.capital}List({}: ${names.capital}ListProps) {
|
|
|
408
378
|
// 현재 경로와 타이틀
|
|
409
379
|
const PAGE = {
|
|
410
380
|
route: "/admin/${names.fsPlural}",
|
|
411
|
-
title: "
|
|
381
|
+
title: SD("entity.list")(SD("entity.${names.capital}")),
|
|
412
382
|
};
|
|
413
383
|
|
|
414
384
|
// 컬럼 정의
|
|
415
385
|
type ${names.capital}Row = NonNullable<typeof rows>[number];
|
|
416
386
|
const columns: TableCol<${names.capital}Row>[] = [
|
|
417
387
|
${columns.map((col)=>` {
|
|
418
|
-
label:
|
|
388
|
+
label: ${col.label},
|
|
419
389
|
tc: ${col.tc},${col.fit ? `
|
|
420
390
|
fit: true,` : ""}${col.align ? `
|
|
421
391
|
align: "${col.align}",` : ""}
|
|
422
392
|
}`).join(",\n")},
|
|
423
393
|
{
|
|
424
|
-
label: "
|
|
394
|
+
label: SD("common.manage"),
|
|
425
395
|
fit: true,
|
|
426
396
|
align: "center",
|
|
427
397
|
tc: (row) => (
|
|
@@ -497,16 +467,18 @@ ${columns.map((col)=>` {
|
|
|
497
467
|
{/* Filters */}
|
|
498
468
|
<div className="bg-gray-100 px-6 py-4 space-y-3">
|
|
499
469
|
<div className="flex items-center gap-3 flex-wrap">
|
|
500
|
-
${filterColumns.some((col)=>col.name === "search") ? `
|
|
470
|
+
${filterColumns.some((col)=>col.name === "search") ? ` <EnumSelect
|
|
471
|
+
enum={${names.capital}SearchField}
|
|
472
|
+
labels={${names.capital}SearchFieldLabel}
|
|
501
473
|
{...register("search")}
|
|
502
|
-
placeholder="
|
|
503
|
-
className="w-
|
|
474
|
+
placeholder={SD("common.searchType")}
|
|
475
|
+
className="w-50 h-8 bg-white border-gray-300 text-xs"
|
|
504
476
|
/>` : ""}
|
|
505
477
|
|
|
506
478
|
<div className="relative flex-1 max-w-xs">
|
|
507
479
|
<Input
|
|
508
480
|
{...register("keyword")}
|
|
509
|
-
placeholder="
|
|
481
|
+
placeholder={SD("common.search")}
|
|
510
482
|
className="h-8 pr-8 text-xs bg-white border-gray-300"
|
|
511
483
|
/>
|
|
512
484
|
<Button
|
|
@@ -517,13 +489,35 @@ ${filterColumns.some((col)=>col.name === "search") ? ` <${names
|
|
|
517
489
|
/>
|
|
518
490
|
</div>
|
|
519
491
|
|
|
520
|
-
<div className="ml-auto">
|
|
492
|
+
<div className="ml-auto flex items-center gap-2">
|
|
521
493
|
<Button
|
|
522
494
|
className="h-8 px-4 bg-primary hover:bg-primary/90 text-white"
|
|
523
495
|
onClick={() => navigate({ to: \`\${PAGE.route}/form\` })}
|
|
524
496
|
>
|
|
525
|
-
<span className="text-xs">
|
|
497
|
+
<span className="text-xs">{SD("common.create")}</span>
|
|
526
498
|
</Button>
|
|
499
|
+
<SonamuFilterPopover
|
|
500
|
+
rules={appliedRules}
|
|
501
|
+
fieldMeta={extractFieldMetaFromSchema(
|
|
502
|
+
${names.capital}BaseSchema,
|
|
503
|
+
SD as (key: string) => string,
|
|
504
|
+
)}
|
|
505
|
+
>
|
|
506
|
+
<Button
|
|
507
|
+
variant="outline"
|
|
508
|
+
size="sm"
|
|
509
|
+
icon={<FilterIcon />}
|
|
510
|
+
onClick={() => setFilterModalOpen(true)}
|
|
511
|
+
className="h-8"
|
|
512
|
+
>
|
|
513
|
+
<span className="text-xs">{SD("rc.sonamuFilter.title")}</span>
|
|
514
|
+
{appliedRules.length > 0 && (
|
|
515
|
+
<Badge variant="secondary" className="ml-1">
|
|
516
|
+
{appliedRules.length}
|
|
517
|
+
</Badge>
|
|
518
|
+
)}
|
|
519
|
+
</Button>
|
|
520
|
+
</SonamuFilterPopover>
|
|
527
521
|
</div>
|
|
528
522
|
</div>
|
|
529
523
|
|
|
@@ -533,32 +527,30 @@ ${filterColumns.filter((col)=>col.name !== "search" && col.name !== "orderBy").m
|
|
|
533
527
|
try {
|
|
534
528
|
// config.enumId가 있으면 우선 사용, 없으면 getEnumInfoFromColName 시도
|
|
535
529
|
const enumId = col.config && "enumId" in col.config ? col.config.enumId : getEnumInfoFromColName(entityId, col.name).id;
|
|
536
|
-
return ` <
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
))}
|
|
546
|
-
</SelectContent>
|
|
547
|
-
</Select>`;
|
|
530
|
+
return ` <EnumSelect
|
|
531
|
+
key={\`${col.name}-\${listParams.${col.name}}\`}
|
|
532
|
+
enum={${enumId}}
|
|
533
|
+
labels={${enumId}Label}
|
|
534
|
+
{...register("${col.name}")}
|
|
535
|
+
placeholder="${col.label}"
|
|
536
|
+
clearable
|
|
537
|
+
className="w-50 h-8 bg-white border-gray-300 text-xs"
|
|
538
|
+
/>`;
|
|
548
539
|
} catch {
|
|
549
540
|
return "";
|
|
550
541
|
}
|
|
551
542
|
}
|
|
552
|
-
// FK 필드 (
|
|
553
|
-
if (col.
|
|
543
|
+
// FK 필드 (IdAsyncSelect)
|
|
544
|
+
if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
|
|
554
545
|
try {
|
|
555
546
|
const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
|
|
556
|
-
return `
|
|
547
|
+
return ` <IdAsyncSelect
|
|
548
|
+
config={${relProp.with}AsyncIdConfig}
|
|
557
549
|
subset="A"
|
|
558
550
|
{...register("${col.name}")}
|
|
559
551
|
placeholder="${col.label ?? relProp.with}"
|
|
560
552
|
clearable
|
|
561
|
-
className="w-
|
|
553
|
+
className="w-50 h-8 text-xs"
|
|
562
554
|
/>`;
|
|
563
555
|
} catch {
|
|
564
556
|
return "";
|
|
@@ -566,13 +558,15 @@ ${filterColumns.filter((col)=>col.name !== "search" && col.name !== "orderBy").m
|
|
|
566
558
|
}
|
|
567
559
|
return "";
|
|
568
560
|
}).filter(Boolean).join("\n")}
|
|
569
|
-
${filterColumns.some((col)=>col.name === "orderBy") ? `
|
|
561
|
+
${filterColumns.some((col)=>col.name === "orderBy") ? ` <EnumSelect
|
|
562
|
+
enum={${names.capital}OrderBy}
|
|
563
|
+
labels={${names.capital}OrderByLabel}
|
|
570
564
|
{...register("orderBy")}
|
|
571
|
-
placeholder="
|
|
572
|
-
textPrefix="
|
|
573
|
-
className="w-
|
|
565
|
+
placeholder={SD("common.sort")}
|
|
566
|
+
textPrefix={\`\${SD("common.sort")}: \`}
|
|
567
|
+
className="w-50 h-8 bg-white border-gray-300 text-xs"
|
|
574
568
|
/>` : ""}
|
|
575
|
-
<span className="text-xs text-muted-foreground">{total ?? 0}
|
|
569
|
+
<span className="text-xs text-muted-foreground">{SD("common.results")(total ?? 0)}</span>
|
|
576
570
|
</div>
|
|
577
571
|
</div>
|
|
578
572
|
</CardHeader>
|
|
@@ -631,17 +625,29 @@ ${filterColumns.some((col)=>col.name === "orderBy") ? ` <${name
|
|
|
631
625
|
<AlertDialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>
|
|
632
626
|
<AlertDialogContent>
|
|
633
627
|
<AlertDialogHeader>
|
|
634
|
-
<AlertDialogTitle>
|
|
635
|
-
<AlertDialogDescription>
|
|
636
|
-
This action cannot be undone. This will permanently delete this item.
|
|
637
|
-
</AlertDialogDescription>
|
|
628
|
+
<AlertDialogTitle>{SD("delete.confirm.title")}</AlertDialogTitle>
|
|
629
|
+
<AlertDialogDescription>{SD("delete.confirm.description")}</AlertDialogDescription>
|
|
638
630
|
</AlertDialogHeader>
|
|
639
631
|
<AlertDialogFooter>
|
|
640
|
-
<AlertDialogCancel>
|
|
641
|
-
<AlertDialogAction onClick={handleConfirmDelete}>
|
|
632
|
+
<AlertDialogCancel>{SD("common.cancel")}</AlertDialogCancel>
|
|
633
|
+
<AlertDialogAction onClick={handleConfirmDelete}>
|
|
634
|
+
{SD("common.delete")}
|
|
635
|
+
</AlertDialogAction>
|
|
642
636
|
</AlertDialogFooter>
|
|
643
637
|
</AlertDialogContent>
|
|
644
638
|
</AlertDialog>
|
|
639
|
+
|
|
640
|
+
{/* Sonamu Filter Modal */}
|
|
641
|
+
<SonamuFilterModal
|
|
642
|
+
baseSchema={${names.capital}BaseSchema}
|
|
643
|
+
open={filterModalOpen}
|
|
644
|
+
onOpenChange={setFilterModalOpen}
|
|
645
|
+
initialRules={appliedRules}
|
|
646
|
+
onApply={(filters, rules) => {
|
|
647
|
+
setListParams({ ...listParams, sonamuFilter: filters, page: 1 });
|
|
648
|
+
setAppliedRules(rules);
|
|
649
|
+
}}
|
|
650
|
+
/>
|
|
645
651
|
</div>
|
|
646
652
|
);
|
|
647
653
|
}
|
|
@@ -652,4 +658,4 @@ ${filterColumns.some((col)=>col.name === "orderBy") ? ` <${name
|
|
|
652
658
|
}
|
|
653
659
|
}
|
|
654
660
|
|
|
655
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmbGF0IH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJpbmdOb2RlLCBUZW1wbGF0ZUtleSwgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lLCBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZSB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7IFJlbmRlcmVkVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fdmlld19saXN0IGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcInZpZXdfbGlzdFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgobmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogXCJ3ZWIvc3JjL3JvdXRlcy9hZG1pblwiLFxuICAgICAgcGF0aDogYCR7bmFtZXMuZnNQbHVyYWx9L2luZGV4LnRzeGAsXG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldFJlcXVpcmVkRGljdEtleXMoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICByZXR1cm4gW1wiZW50aXR5Lmxpc3RNYW5hZ2VcIiwgXCJjb21tb24uYWxsXCJdO1xuICB9XG5cbiAgd3JhcFRjKGJvZHk6IHN0cmluZywga2V5OiBzdHJpbmcsIGNvbGxhcHNpbmc6IGJvb2xlYW4gPSB0cnVlLCBjbGFzc05hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICByZXR1cm4gYDxUYWJsZS5DZWxsIGtleT1cIiR7a2V5fVwiJHtjb2xsYXBzaW5nID8gXCIgY29sbGFwc2luZ1wiIDogXCJcIn0ke1xuICAgICAgY2xhc3NOYW1lID8gYCBjbGFzc05hbWU9e1xcYCR7Y2xhc3NOYW1lfVxcYH1gIDogXCJcIlxuICAgIH0+JHtib2R5fTwvVGFibGUuQ2VsbD5gO1xuICB9XG5cbiAgcmVuZGVyQ29sdW1uKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgY29sOiBSZW5kZXJpbmdOb2RlLFxuICAgIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCxcbiAgICBwYXJlbnRPYmo6IHN0cmluZyA9IFwicm93XCIsXG4gICAgd2l0aG91dE5hbWU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nIHtcbiAgICAvLyDspJHssqkg6rK966GcIOyymOumrCAo7JiIOiBcInVzZXIubmFtZVwiIC0+IFwicm93LnVzZXI/Lm5hbWVcIilcbiAgICBsZXQgY29sTmFtZTogc3RyaW5nO1xuICAgIGlmICh3aXRob3V0TmFtZSkge1xuICAgICAgY29sTmFtZSA9IHBhcmVudE9iajtcbiAgICB9IGVsc2UgaWYgKGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgLy8g7KSR7LKpIOqyveuhnOuKlCBvcHRpb25hbCBjaGFpbmluZ+ycvOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gY29sLm5hbWUuc3BsaXQoXCIuXCIpO1xuICAgICAgY29sTmFtZSA9IGAke3BhcmVudE9ian0uJHtwYXJ0cy5qb2luKFwiPy5cIil9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29sTmFtZSA9IGAke3BhcmVudE9ian0uJHtjb2wubmFtZX1gO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29sLnJlbmRlclR5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmctcGxhaW5cIjpcbiAgICAgIGNhc2UgXCJzdHJpbmctZGF0ZVwiOlxuICAgICAgY2FzZSBcIm51bWJlci1pZFwiOlxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sTmFtZX19PC8+YDtcbiAgICAgIGNhc2UgXCJudW1iZXItZmtfaWRcIjoge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJhc2VOYW1lID0gY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpXG4gICAgICAgICAgICA/IChjb2wubmFtZS5zcGxpdChcIi5cIikucG9wKCkgPz8gY29sLm5hbWUpLnJlcGxhY2UoXCJfaWRcIiwgXCJcIilcbiAgICAgICAgICAgIDogY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKTtcbiAgICAgICAgICBjb25zdCByZWxQcm9wRmsgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgYmFzZU5hbWUpO1xuICAgICAgICAgIHJldHVybiBgPD4ke3JlbFByb3BGay53aXRofSN7JHtjb2xOYW1lfX08Lz5gO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gYDw+eyR7Y29sTmFtZX19PC8+YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgIGlmIChjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57JHtjb2xOYW1lfSA/IGRhdGV0aW1lRigke2NvbE5hbWV9KSA6ICctJ308L3NwYW4+YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYDxzcGFuPntkYXRldGltZUYoJHtjb2xOYW1lfSl9PC9zcGFuPmA7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJzdHJpbmctZGF0ZXRpbWVcIjpcbiAgICAgICAgaWYgKGNvbC5udWxsYWJsZSB8fCBjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICByZXR1cm4gYDxzcGFuPnske2NvbE5hbWV9ID8gZGF0ZUYoJHtjb2xOYW1lfSkgOiAnLSd9PC9zcGFuPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57ZGF0ZUYoJHtjb2xOYW1lfSl9PC9zcGFuPmA7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBgPD57JHtjb2xOYW1lfSA/IDxCYWRnZSB2YXJpYW50PVwiZGVmYXVsdFwiPk88L0JhZGdlPiA6IDxCYWRnZSB2YXJpYW50PVwic2Vjb25kYXJ5XCI+WDwvQmFkZ2U+fTwvPmA7XG4gICAgICBjYXNlIFwiZW51bXNcIjoge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIHJldHVybiBgPD57JHtjb2wubnVsbGFibGUgPyBgJHtjb2xOYW1lfSAmJiBgIDogXCJcIn0ke2VudW1JZH1MYWJlbFske2NvbE5hbWV9XX08Lz5gO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gYDw+eyR7Y29sTmFtZX19PC8+YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSBcImFycmF5LWltYWdlc1wiOlxuICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMVwiPnsgJHtjb2xOYW1lfT8ubWFwKChyLCBpKSA9PiAke1xuICAgICAgICAgIGNvbC5udWxsYWJsZSA/IGByICYmIGAgOiBcIlwiXG4gICAgICAgIH08aW1nIGtleT17aX0gc3JjPXtyfSBhbHQ9e1xcYCR7Y29sLmxhYmVsID8/IGNvbC5uYW1lfSBcXCR7aSArIDF9XFxgfSBjbGFzc05hbWU9XCJoLTggdy04IG9iamVjdC1jb3ZlciByb3VuZGVkXCIgLz4pIH08L2Rpdj5gO1xuICAgICAgY2FzZSBcImpzb24tc29uYW11ZmlsZVwiOlxuICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj57JHtjb2xOYW1lfSA/IDxpbWcgc3JjPXske2NvbE5hbWV9LnVybH0gYWx0PXske2NvbE5hbWV9Lm5hbWV9IGNsYXNzTmFtZT1cImgtOCB3LTggb2JqZWN0LWNvdmVyIHJvdW5kZWRcIiAvPiA6ICctJ308L2Rpdj5gO1xuICAgICAgY2FzZSBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiOlxuICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMVwiPnsgJHtjb2xOYW1lfT8ubWFwKChyLCBpKSA9PiAke1xuICAgICAgICAgIGNvbC5udWxsYWJsZSA/IGByICYmIGAgOiBcIlwiXG4gICAgICAgIH08aW1nIGtleT17aX0gc3JjPXtyLnVybH0gYWx0PXtcXGAke2NvbC5sYWJlbCA/PyBjb2wubmFtZX0gXFwke2kgKyAxfVxcYH0gY2xhc3NOYW1lPVwiaC04IHctOCBvYmplY3QtY292ZXIgcm91bmRlZFwiIC8+KSB9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJudW1iZXItcGxhaW5cIjpcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbC5udWxsYWJsZSB8fCBjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikgPyBgJHtjb2xOYW1lfSAmJiBgIDogXCJcIn1udW1GKCR7Y29sTmFtZX0pfTwvPmA7XG4gICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14c1wiPnske2NvbC5udWxsYWJsZSA/IGAke2NvbE5hbWV9ID8gYCA6IFwiXCJ9SlNPTi5zdHJpbmdpZnkoJHtjb2xOYW1lfSkke2NvbC5udWxsYWJsZSA/IGAgOiAnLSdgIDogXCJcIn19PC9zcGFuPmA7XG4gICAgICBjYXNlIFwib2JqZWN0LXBpY2tcIjoge1xuICAgICAgICBjb25zdCBwaWNrZWRDaGlsZCA9IGNvbC5jaGlsZHJlbj8uZmluZCgoY2hpbGQpID0+IGNoaWxkLm5hbWUgPT09IGNvbC5jb25maWc/LnBpY2tlZCk7XG4gICAgICAgIGlmICghcGlja2VkQ2hpbGQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG9iamVjdC1waWNrIOyEoO2DnSDsi6TtjKggKOyYpOu4jOygne2KuDogJHtjb2wubmFtZX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29sdW1uKFxuICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgIHBpY2tlZENoaWxkLFxuICAgICAgICAgIG5hbWVzLFxuICAgICAgICAgIGAke2NvbE5hbWV9JHtjb2wubnVsbGFibGUgPyBcIj9cIiA6IFwiXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICByZXR1cm4gYDw+eyAvKiBhcnJheSAke2NvbE5hbWV9ICovIH08Lz5gO1xuICAgICAgY2FzZSBcInZlY3RvclwiOlxuICAgICAgICAvLyB2ZWN0b3Ig7YOA7J6F7J2AIOywqOybkCDsiJjrp4wg7ZGc7IucICjsi6TsoJwg642w7J207YSw64qUIOuEiOustCDquYApXG4gICAgICAgIHJldHVybiBgPD57JHtjb2wubnVsbGFibGUgPyBgJHtjb2xOYW1lfSA/IGAgOiBcIlwifVtWZWN0b3I6IHske2NvbE5hbWV9JHtjb2wubnVsbGFibGUgPyBcIlwiIDogXCIgPz8gW11cIn0ubGVuZ3RofWRdJHtjb2wubnVsbGFibGUgPyBcIiA6ICctJ1wiIDogXCJcIn19PC8+YDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg66CM642UIOu2iOqwgCDsu6zrn7wgJHtjb2wucmVuZGVyVHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXJDb2x1bW5JbXBvcnQoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBjb2w6IFJlbmRlcmluZ05vZGUsXG4gICAgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkLFxuICApOiAoc3RyaW5nIHwgbnVsbClbXSB7XG4gICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShuYW1lcy5jYXBpdGFsLCBjb2wubmFtZSk7XG4gICAgICByZXR1cm4gW2BpbXBvcnQgeyAke2VudW1JZH1MYWJlbCB9IGZyb20gJ0Avc2VydmljZXMvc29uYW11LmdlbmVyYXRlZCc7YF07XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChjb2wuY2hpbGRyZW4gPz8gW10pLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBlbnRpdHlJZCA9IHJlbFByb3Aud2l0aDtcbiAgICAgICAgICBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQocmVsUHJvcC53aXRoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDb2x1bW5JbXBvcnQoZW50aXR5SWQsIGNoaWxkLCBuYW1lcyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmxhdChyZXN1bHQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbbnVsbF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgICBpZiAoIWNvbC5lbGVtZW50KSByZXR1cm4gW251bGxdO1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29sdW1uSW1wb3J0KGVudGl0eUlkLCBjb2wuZWxlbWVudCwgbmFtZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBbbnVsbF07XG4gIH1cblxuICByZW5kZXJGaWx0ZXJJbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgY29sOiBSZW5kZXJpbmdOb2RlLCBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICBpZiAoY29sLm5hbWUgPT09IFwic2VhcmNoXCIpIHtcbiAgICAgIHJldHVybiBgaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0IH0gZnJvbSBcIkAvY29tcG9uZW50cy8ke25hbWVzLmZzfS8ke25hbWVzLmNhcGl0YWx9U2VhcmNoSW5wdXRcIjtgO1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgaWYgKGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIikge1xuICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGAke25hbWVzLmNhcGl0YWx9JHtpbmZsZWN0aW9uLmNhbWVsaXplKGNvbC5uYW1lKX1TZWxlY3RgO1xuICAgICAgICByZXR1cm4gYGltcG9ydCB7ICR7Y29tcG9uZW50SWR9IH0gZnJvbSBcIkAvY29tcG9uZW50cy8ke25hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQsIHRhcmdldEVudGl0eU5hbWVzOiB0YXJnZXRNRE5hbWVzIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKFxuICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICBjb2wubmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gYCR7aWR9U2VsZWN0YDtcbiAgICAgICAgICByZXR1cm4gYGltcG9ydCB7ICR7Y29tcG9uZW50SWR9IH0gZnJvbSBcIkAvY29tcG9uZW50cy8ke3RhcmdldE1ETmFtZXMuZnN9LyR7Y29tcG9uZW50SWR9XCI7YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1ma19pZFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICBjb25zdCB0YXJnZXROYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQocmVsUHJvcC53aXRoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBgJHtyZWxQcm9wLndpdGh9SWRBc3luY1NlbGVjdGA7XG4gICAgICAgIHJldHVybiBgaW1wb3J0IHsgJHtjb21wb25lbnRJZH0gfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7dGFyZ2V0TmFtZXMuZnN9LyR7Y29tcG9uZW50SWR9XCI7YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDroIzrjZQg67aI6rCA64ql7ZWcIO2VhO2EsCDsnoTtj6ztirggJHtjb2wubmFtZX0gJHtjb2wucmVuZGVyVHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXJGaWx0ZXIoZW50aXR5SWQ6IHN0cmluZywgY29sOiBSZW5kZXJpbmdOb2RlLCBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICBpZiAoY29sLm5hbWUgPT09IFwic2VhcmNoXCIpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQ2xlYXJhYmxlID0gY29sLm9wdGlvbmFsID09PSB0cnVlICYmIGNvbC5uYW1lICE9PSBcIm9yZGVyQnlcIjtcbiAgICBsZXQgY29tcG9uZW50SWQ6IHN0cmluZztcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgaWYgKGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIikge1xuICAgICAgICBjb21wb25lbnRJZCA9IGAke25hbWVzLmNhcGl0YWx9JHtpbmZsZWN0aW9uLmNhbWVsaXplKGNvbC5uYW1lKX1TZWxlY3RgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgY29tcG9uZW50SWQgPSBgJHtpZH1TZWxlY3RgO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGA8JHtjb21wb25lbnRJZH0gey4uLnJlZ2lzdGVyKCcke2NvbC5uYW1lfScpfSAke2lzQ2xlYXJhYmxlID8gXCJjbGVhcmFibGVcIiA6IFwiXCJ9IC8+YDtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1ma19pZFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICBjb21wb25lbnRJZCA9IGAke3JlbFByb3Aud2l0aH1JZEFzeW5jU2VsZWN0YDtcbiAgICAgICAgcmV0dXJuIGA8JHtjb21wb25lbnRJZH0gey4uLnJlZ2lzdGVyKCcke2NvbC5uYW1lfScpfSAke1xuICAgICAgICAgIGlzQ2xlYXJhYmxlID8gXCJjbGVhcmFibGVcIiA6IFwiXCJcbiAgICAgICAgfSBzdWJzZXQ9XCJBXCIgLz5gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOugjOuNlCDrtojqsIDriqXtlZwg7ZWE7YSwIOyehO2PrO2KuCAke2NvbC5uYW1lfSAke2NvbC5yZW5kZXJUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldERlZmF1bHQoY29sdW1uczogUmVuZGVyaW5nTm9kZVtdKToge1xuICAgIG9yZGVyQnk6IHN0cmluZztcbiAgICBzZWFyY2g6IHN0cmluZztcbiAgICBoYXNTZWFyY2g6IGJvb2xlYW47XG4gICAgaGFzT3JkZXJCeTogYm9vbGVhbjtcbiAgfSB7XG4gICAgY29uc3QgZGVmID0ge1xuICAgICAgb3JkZXJCeTogXCJcIixcbiAgICAgIHNlYXJjaDogXCJcIixcbiAgICAgIGhhc1NlYXJjaDogZmFsc2UsXG4gICAgICBoYXNPcmRlckJ5OiBmYWxzZSxcbiAgICB9O1xuICAgIGNvbnN0IG9yZGVyQnlab2RUeXBlID0gY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIik/LnpvZFR5cGU7XG4gICAgaWYgKG9yZGVyQnlab2RUeXBlICYmIG9yZGVyQnlab2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgICBkZWYub3JkZXJCeSA9IE9iamVjdC5rZXlzKG9yZGVyQnlab2RUeXBlLmVudW0pWzBdO1xuICAgICAgZGVmLmhhc09yZGVyQnkgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2hab2RUeXBlID0gY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKT8uem9kVHlwZTtcbiAgICBpZiAoc2VhcmNoWm9kVHlwZSAmJiBzZWFyY2hab2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgICBkZWYuc2VhcmNoID0gT2JqZWN0LmtleXMoc2VhcmNoWm9kVHlwZS5lbnVtKVswXTtcbiAgICAgIGRlZi5oYXNTZWFyY2ggPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZGVmO1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyKHsgZW50aXR5SWQgfTogVGVtcGxhdGVPcHRpb25zW1widmlld19saXN0XCJdKSB7XG4gICAgY29uc3QgeyBnZXRDb2x1bW5zTm9kZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5LWNvbnZlcnRlclwiKTtcbiAgICBjb25zdCB7IGdldFpvZFR5cGVCeUlkLCB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi96b2QtY29udmVydGVyXCIpO1xuXG4gICAgY29uc3QgY29sdW1uc05vZGUgPSBhd2FpdCBnZXRDb2x1bW5zTm9kZShlbnRpdHlJZCwgXCJBXCIpO1xuICAgIGNvbnN0IGxpc3RQYXJhbXNab2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQoYCR7ZW50aXR5SWR9TGlzdFBhcmFtc2ApO1xuICAgIGNvbnN0IGxpc3RQYXJhbXNOb2RlID0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShsaXN0UGFyYW1zWm9kVHlwZSk7XG5cbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgIC8vIFBLIO2DgOyehSDqsJDsp4BcbiAgICBjb25zdCBwa1R5cGUgPSBlbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgY29uc3QgaWRUc1R5cGUgPSBwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIiA/IFwic3RyaW5nXCIgOiBcIm51bWJlclwiO1xuXG4gICAgLy8g7Iuk7KCcIOumrOyKpO2KuCDsu6zrn7xcbiAgICBjb25zdCBjb2x1bW5zID0gKGNvbHVtbnNOb2RlLmNoaWxkcmVuIGFzIFJlbmRlcmluZ05vZGVbXSlcblxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLm5hbWUgPT09IFwiaWRcIiA/IC0xIDogYi5uYW1lID09PSBcImlkXCIgPyAxIDogMCkpXG4gICAgICAubWFwKChjb2wpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcENhbmRpZGF0ZSA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbC5uYW1lKTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSB0aGlzLnJlbmRlckNvbHVtbihlbnRpdHlJZCwgY29sLCBuYW1lcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAgICAgbGFiZWw6IGNvbC5uYW1lID09PSBcImlkXCIgPyBcIklEXCIgOiAocHJvcENhbmRpZGF0ZT8uZGVzYyA/PyBjb2wubGFiZWwpLFxuICAgICAgICAgIHRjOiBgKHJvdykgPT4gJHtyZW5kZXJlZH1gLFxuICAgICAgICAgIGZpdDpcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1pZFwiIHx8XG4gICAgICAgICAgICBjb2wucmVuZGVyVHlwZSA9PT0gXCJkYXRldGltZVwiIHx8XG4gICAgICAgICAgICBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZGF0ZXRpbWVcIixcbiAgICAgICAgICBhbGlnbjogY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWlkXCIgPyBcImNlbnRlclwiIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAvLyDtlYTthLAg7Lus65+8XG4gICAgY29uc3QgZmlsdGVyQ29sdW1ucyA9IChsaXN0UGFyYW1zTm9kZS5jaGlsZHJlbiBhcyBSZW5kZXJpbmdOb2RlW10pXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoY29sKSA9PlxuICAgICAgICAgIGNvbC5uYW1lICE9PSBcImlkXCIgJiZcbiAgICAgICAgICBjb2wubmFtZSAhPT0gXCJxdWVyeU1vZGVcIiAmJlxuICAgICAgICAgIChbXCJlbnVtc1wiLCBcIm51bWJlci1pZFwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSkgfHwgY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRcIikpLFxuICAgICAgKVxuICAgICAgLy8gb3JkZXJCeeqwgCDqsIDsnqUg65Kk66GcIOyYpOqyjCDsiJzshJwg7KGw7KCVXG4gICAgICAuc29ydCgoYSkgPT4ge1xuICAgICAgICByZXR1cm4gYS5uYW1lID09PSBcIm9yZGVyQnlcIiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvOydhCDtlITrpqwg7YWc7ZSM66a/7Jy866GcIOyEpOyglVxuICAgIGNvbnN0IHByZVRlbXBsYXRlczogUmVuZGVyZWRUZW1wbGF0ZVtcInByZVRlbXBsYXRlc1wiXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29sIG9mIGZpbHRlckNvbHVtbnMpIHtcbiAgICAgIGxldCBrZXk6IFRlbXBsYXRlS2V5O1xuICAgICAgbGV0IHRhcmdldEVudGl0eUlkID0gZW50aXR5SWQ7XG4gICAgICBsZXQgZW51bUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikge1xuICAgICAgICAgIGtleSA9IFwidmlld19lbnVtc19zZWxlY3RcIjtcbiAgICAgICAgICBlbnVtSWQgPSBgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkYDtcbiAgICAgICAgICB0YXJnZXRFbnRpdHlJZCA9IG5hbWVzLmNhcGl0YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2V5ID0gXCJ2aWV3X2VudW1zX3NlbGVjdFwiO1xuICAgICAgICAgIC8vIGNvbmZpZy5lbnVtSWQg7Jqw7ISgIOyCrOyaqVxuICAgICAgICAgIGlmIChjb2wuY29uZmlnICYmIFwiZW51bUlkXCIgaW4gY29sLmNvbmZpZykge1xuICAgICAgICAgICAgZW51bUlkID0gKGNvbC5jb25maWcgYXMgeyBlbnVtSWQ6IHN0cmluZyB9KS5lbnVtSWQ7XG4gICAgICAgICAgICB0YXJnZXRFbnRpdHlJZCA9IGVudGl0eUlkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCB7IHRhcmdldEVudGl0eU5hbWVzLCBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICB0YXJnZXRFbnRpdHlJZCA9IHRhcmdldEVudGl0eU5hbWVzLmNhcGl0YWw7XG4gICAgICAgICAgICAgIGVudW1JZCA9IGlkO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5ID0gXCJ2aWV3X2lkX2FzeW5jX3NlbGVjdFwiO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgICAgdGFyZ2V0RW50aXR5SWQgPSByZWxQcm9wLndpdGg7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZVRlbXBsYXRlcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHRhcmdldEVudGl0eUlkLFxuICAgICAgICAgIGVudW1JZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIOy7rOufvOyXkOyEnCDsgqzsmqntlZjripQgZW51beuTpCDsiJjsp5FcbiAgICBjb25zdCBjb2x1bW5FbnVtczogc3RyaW5nW10gPSBbXTtcbiAgICAoY29sdW1uc05vZGUuY2hpbGRyZW4gPz8gW10pLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICBjb2x1bW5FbnVtcy5wdXNoKGVudW1JZCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNlYXJjaElucHV0XG4gICAgcHJlVGVtcGxhdGVzPy5wdXNoKHtcbiAgICAgIGtleTogXCJ2aWV3X3NlYXJjaF9pbnB1dFwiLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBlbnRpdHlJZCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyDrlJTtj7Ttirgg7YyM652866+47YSwXG4gICAgLy8gY29uc3QgZGVmID0gdGhpcy5nZXREZWZhdWx0KGZpbHRlckNvbHVtbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyksXG4gICAgICBib2R5OiBgXG5pbXBvcnQgeyB1c2VTdGF0ZSwgRnJhZ21lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVSb3V0ZSwgdXNlTmF2aWdhdGUgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiO1xuXG5pbXBvcnQgeyBDYXJkLCBDYXJkQ29udGVudCwgQ2FyZEhlYWRlciB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEJhZGdlIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgUGFnaW5hdGlvbiwgVGFibGUsIFRhYmxlQm9keSwgVGFibGVDZWxsLCB0eXBlIFRhYmxlQ29sLCBUYWJsZUhlYWQsIFRhYmxlSGVhZGVyLCBUYWJsZVJvdyB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IFNlbGVjdCwgU2VsZWN0Q29udGVudCwgU2VsZWN0SXRlbSwgU2VsZWN0VHJpZ2dlciwgU2VsZWN0VmFsdWUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBBbGVydERpYWxvZywgQWxlcnREaWFsb2dBY3Rpb24sIEFsZXJ0RGlhbG9nQ2FuY2VsLCBBbGVydERpYWxvZ0NvbnRlbnQsIEFsZXJ0RGlhbG9nRGVzY3JpcHRpb24sIEFsZXJ0RGlhbG9nRm9vdGVyLCBBbGVydERpYWxvZ0hlYWRlciwgQWxlcnREaWFsb2dUaXRsZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IElucHV0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQ2hlY2tib3ggfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5cbmltcG9ydCB7IHVzZUxpc3RQYXJhbXMsIG51bUYsIGRhdGVGLCBkYXRldGltZUYgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9saWJcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRBIH0gZnJvbSBcIkAvc2VydmljZXMvc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zIH0gZnJvbSBcIkAvc2VydmljZXMvJHtuYW1lcy5mc30vJHtuYW1lcy5mc30udHlwZXNcIjtcbmltcG9ydCB7ICR7KCgpID0+IHtcbiAgICAgICAgLy8g6riw67O4IGVudW0g7IiY7KeRIChmaWx0ZXJDb2x1bW5z7JeQIOyeiOuKlCDqsoPrp4wpXG4gICAgICAgIGNvbnN0IGJhc2VFbnVtczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpKSB7XG4gICAgICAgICAgYmFzZUVudW1zLnB1c2goYCR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5YCwgYCR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5TGFiZWxgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSkge1xuICAgICAgICAgIGJhc2VFbnVtcy5wdXNoKGAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRgLCBgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkTGFiZWxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2VhO2EsCBlbnVtIOyImOynkSAoY29uZmlnLmVudW1JZCDsmrDshKAsIOyXhuycvOuptCBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKVxuICAgICAgICBjb25zdCBmaWx0ZXJFbnVtSWRzID0gZmlsdGVyQ29sdW1uc1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiICYmIGNvbC5uYW1lICE9PSBcInNlYXJjaFwiICYmIGNvbC5uYW1lICE9PSBcIm9yZGVyQnlcIixcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLmNvbmZpZyAmJiBcImVudW1JZFwiIGluIGNvbC5jb25maWcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChjb2wuY29uZmlnIGFzIHsgZW51bUlkOiBzdHJpbmcgfSkuZW51bUlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiBlbnVtSWQ7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIC8vIOuqqOuToCBlbnVtIO2Vqey5mOqzoCDspJHrs7Ug7KCc6rGwXG4gICAgICAgIGNvbnN0IGFsbEVudW1zID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckVudW1JZHMsIC4uLmNvbHVtbkVudW1zXSldO1xuICAgICAgICBjb25zdCBlbnVtSW1wb3J0cyA9IGFsbEVudW1zLmZsYXRNYXAoKGVudW1JZCkgPT4gW2Ake2VudW1JZH1gLCBgJHtlbnVtSWR9TGFiZWxgXSk7XG5cbiAgICAgICAgcmV0dXJuIFsuLi5iYXNlRW51bXMsIC4uLmVudW1JbXBvcnRzXS5qb2luKFwiLCBcIik7XG4gICAgICB9KSgpfSB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbiR7KCgpID0+IHtcbiAgLy8gRksg7ZWE65Oc7J2YIEFzeW5jU2VsZWN0IOy7tO2PrOuEjO2KuCBpbXBvcnRcbiAgY29uc3QgZmtDb2x1bW5zID0gZmlsdGVyQ29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRcIikgJiYgY29sLm5hbWUgIT09IFwiaWRcIik7XG4gIHJldHVybiBma0NvbHVtbnNcbiAgICAubWFwKChjb2wpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIGNvbnN0IHRhcmdldE5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChyZWxQcm9wLndpdGgpO1xuICAgICAgICByZXR1cm4gYGltcG9ydCB7ICR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3QgfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7dGFyZ2V0TmFtZXMuZnN9LyR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3RcIjtgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufSkoKX1cbiR7XG4gIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIilcbiAgICA/IGBcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZFNlbGVjdCB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkU2VsZWN0XCI7YFxuICAgIDogXCJcIlxufVxuJHtcbiAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIilcbiAgICA/IGBcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5U2VsZWN0IH0gZnJvbSBcIkAvY29tcG9uZW50cy8ke25hbWVzLmZzfS8ke25hbWVzLmNhcGl0YWx9T3JkZXJCeVNlbGVjdFwiO2BcbiAgICA6IFwiXCJcbn1cblxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCJ+aWNvbnMvbHVjaWRlL3NxdWFyZS1wZW5cIjtcbmltcG9ydCBUcmFzaEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvdHJhc2gtMlwiO1xuaW1wb3J0IExpc3RJY29uIGZyb20gXCJ+aWNvbnMvbWRpL2Zvcm1hdC1saXN0LWJ1bGxldGVkXCI7XG5pbXBvcnQgU2VhcmNoSWNvbiBmcm9tIFwifmljb25zL21kaS9tYWduaWZ5XCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCJAL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5cbmV4cG9ydCBjb25zdCBSb3V0ZSA9IGNyZWF0ZUZpbGVSb3V0ZShcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfS9cIikoe1xcbiAgaGVhZDogKCkgPT4gKHtcXG4gICAgbWV0YTogW1xcbiAgICAgIHsgdGl0bGU6IFwiJHtlbnRpdHkudGl0bGUgPz8gbmFtZXMuY2FwaXRhbH0gTGlzdFwiIH0sXFxuICAgICAgeyBuYW1lOiBcImRlc2NyaXB0aW9uXCIsIGNvbnRlbnQ6IFNEKFwiZW50aXR5Lmxpc3RNYW5hZ2VcIikoXCIke2VudGl0eS50aXRsZSA/PyBuYW1lcy5jYXBpdGFsfVwiKSB9LFxcbiAgICBdLFxcbiAgfSksXFxuICBjb21wb25lbnQ6ICR7bmFtZXMuY2FwaXRhbH1MaXN0LFxcbn0pO1xcblxcbnR5cGUgJHtuYW1lcy5jYXBpdGFsfUxpc3RQcm9wcyA9IHt9O1xuXG5mdW5jdGlvbiAke25hbWVzLmNhcGl0YWx9TGlzdCh7fTogJHtuYW1lcy5jYXBpdGFsfUxpc3RQcm9wcykge1xuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG5cbiAgLy8g7IOB7YOcIOq0gOumrFxuICBjb25zdCBbc2VsZWN0ZWRJdGVtcywgc2V0U2VsZWN0ZWRJdGVtc10gPSB1c2VTdGF0ZTxTZXQ8JHtpZFRzVHlwZX0+PihuZXcgU2V0KCkpO1xuICBjb25zdCBbZGVsZXRlRGlhbG9nT3Blbiwgc2V0RGVsZXRlRGlhbG9nT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpdGVtVG9EZWxldGUsIHNldEl0ZW1Ub0RlbGV0ZV0gPSB1c2VTdGF0ZTx7IGlkOiAke2lkVHNUeXBlfTsgbmFtZT86IHN0cmluZyB9IHwgbnVsbD4obnVsbCk7XG5cbiAgLy8g66as7Iqk7Yq4IO2VhO2EsFxuICBjb25zdCB7IGxpc3RQYXJhbXMsIHJlZ2lzdGVyIH0gPSB1c2VMaXN0UGFyYW1zKCR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zLCB7XG4gICAgbnVtOiAxMCxcbiAgICBwYWdlOiAxLFxuICAgIGtleXdvcmQ6IFwiXCIsJHtcbiAgICAgIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIilcbiAgICAgICAgPyBgXG4gICAgc2VhcmNoOiAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGQub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH0ke1xuICAgICAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIilcbiAgICAgICAgPyBgXG4gICAgb3JkZXJCeTogJHtuYW1lcy5jYXBpdGFsfU9yZGVyQnkub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH1cbiAgfSk7XG5cbiAgLy8g66as7Iqk7Yq4IOy/vOumrFxuICBjb25zdCB7IGRhdGEsIHJlZmV0Y2gsIGlzTG9hZGluZyB9ID0gJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UudXNlJHtuYW1lcy5jYXBpdGFsUGx1cmFsfShcIkFcIiwgbGlzdFBhcmFtcyk7XG4gIGNvbnN0IHsgcm93cywgdG90YWwgfSA9IGRhdGEgPz8ge307XG5cbiAgLy8g7ZiE7J6sIOqyveuhnOyZgCDtg4DsnbTti4BcbiAgY29uc3QgUEFHRSA9IHtcbiAgICByb3V0ZTogXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH1cIixcbiAgICB0aXRsZTogXCIke2VudGl0eS50aXRsZSA/PyBuYW1lcy5jYXBpdGFsfVwiLFxuICB9O1xuXG4gIC8vIOy7rOufvCDsoJXsnZhcbiAgdHlwZSAke25hbWVzLmNhcGl0YWx9Um93ID0gTm9uTnVsbGFibGU8dHlwZW9mIHJvd3M+W251bWJlcl07XG4gIGNvbnN0IGNvbHVtbnM6IFRhYmxlQ29sPCR7bmFtZXMuY2FwaXRhbH1Sb3c+W10gPSBbXG4ke2NvbHVtbnNcbiAgLm1hcChcbiAgICAoY29sKSA9PiBgICAgIHtcbiAgICAgIGxhYmVsOiBcIiR7Y29sLmxhYmVsfVwiLFxuICAgICAgdGM6ICR7Y29sLnRjfSwke1xuICAgICAgICBjb2wuZml0XG4gICAgICAgICAgPyBgXG4gICAgICBmaXQ6IHRydWUsYFxuICAgICAgICAgIDogXCJcIlxuICAgICAgfSR7XG4gICAgICAgIGNvbC5hbGlnblxuICAgICAgICAgID8gYFxuICAgICAgYWxpZ246IFwiJHtjb2wuYWxpZ259XCIsYFxuICAgICAgICAgIDogXCJcIlxuICAgICAgfVxuICAgIH1gLFxuICApXG4gIC5qb2luKFwiLFxcblwiKX0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiTWFuYWdlXCIsXG4gICAgICBmaXQ6IHRydWUsXG4gICAgICBhbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIHRjOiAocm93KSA9PiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwieWVsbG93XCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICBpY29uPXs8RWRpdEljb24gLz59XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCwgc2VhcmNoOiB7IGlkOiByb3cuaWQgfSB9KX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJyZWRcIlxuICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgIGljb249ezxUcmFzaEljb24gLz59XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVEZWxldGVDbGljayhyb3cuaWQpfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSxcbiAgICB9LFxuICBdO1xuXG4gIC8vIOyEoO2DnSDtlbjrk6Trn6xcbiAgY29uc3QgaGFuZGxlVG9nZ2xlSXRlbSA9IChpZDogJHtpZFRzVHlwZX0pID0+IHtcbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgU2V0KHNlbGVjdGVkSXRlbXMpO1xuICAgIGlmIChuZXdTZWxlY3Rpb24uaGFzKGlkKSkge1xuICAgICAgbmV3U2VsZWN0aW9uLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1NlbGVjdGlvbi5hZGQoaWQpO1xuICAgIH1cbiAgICBzZXRTZWxlY3RlZEl0ZW1zKG5ld1NlbGVjdGlvbik7XG4gIH07XG5cbiAgY29uc3QgaXNBbGxTZWxlY3RlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gKHJvd3M/Lmxlbmd0aCA/PyAwKSA+IDAgJiYgcm93cyEuZXZlcnkoKHJvdykgPT4gc2VsZWN0ZWRJdGVtcy5oYXMocm93LmlkKSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0QWxsID0gKGNoZWNrZWQ6IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgc2V0U2VsZWN0ZWRJdGVtcyhuZXcgU2V0KHJvd3M/Lm1hcCgocm93KSA9PiByb3cuaWQpID8/IFtdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbXMobmV3IFNldCgpKTtcbiAgICB9XG4gIH07XG5cbiAgLy8g7IKt7KCcIO2VuOuTpOufrFxuICBjb25zdCBoYW5kbGVEZWxldGVDbGljayA9IChpZDogJHtpZFRzVHlwZX0sIG5hbWU/OiBzdHJpbmcpID0+IHtcbiAgICBzZXRJdGVtVG9EZWxldGUoeyBpZCwgbmFtZSB9KTtcbiAgICBzZXREZWxldGVEaWFsb2dPcGVuKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbmZpcm1EZWxldGUgPSAoKSA9PiB7XG4gICAgaWYgKGl0ZW1Ub0RlbGV0ZSkge1xuICAgICAgJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UuZGVsKFtpdGVtVG9EZWxldGUuaWRdKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVmZXRjaCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHNldERlbGV0ZURpYWxvZ09wZW4oZmFsc2UpO1xuICAgIHNldEl0ZW1Ub0RlbGV0ZShudWxsKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LXctWzE4MDBweF0gbXgtYXV0byBwLThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTYgbWItOFwiPlxuICAgICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPExpc3RJY29uIGNsYXNzTmFtZT1cImgtNSB3LTVcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIGgtNVwiPntQQUdFLnRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cInNoYWRvdy1zbSBib3JkZXItYm9yZGVyLzQwIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgPENhcmRIZWFkZXIgY2xhc3NOYW1lPVwicGItMCBweC0wIHB0LTBcIj5cbiAgICAgICAgICAgICAgey8qIEZpbHRlcnMgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctZ3JheS0xMDAgcHgtNiBweS00IHNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgZmxleC13cmFwXCI+XG4ke1xuICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwic2VhcmNoXCIpXG4gICAgPyBgICAgICAgICAgICAgICAgICAgPCR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCJzZWFyY2hcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LVsyMDBweF0gaC04IGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIC8+YFxuICAgIDogXCJcIlxufVxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGZsZXgtMSBtYXgtdy14c1wiPlxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCJrZXl3b3JkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggcHItOCB0ZXh0LXhzIGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj17PFNlYXJjaEljb24gLz59XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMCBoLTggdy04IGhvdmVyOmJnLXRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCBweC00IGJnLXByaW1hcnkgaG92ZXI6YmctcHJpbWFyeS85MCB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCB9KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj5DcmVhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtmaWx0ZXJDb2x1bW5zXG4gIC5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IFwic2VhcmNoXCIgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiKVxuICAubWFwKChjb2wpID0+IHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uZmlnLmVudW1JZOqwgCDsnojsnLzrqbQg7Jqw7ISgIOyCrOyaqSwg7JeG7Jy866m0IGdldEVudW1JbmZvRnJvbUNvbE5hbWUg7Iuc64+EXG4gICAgICAgIGNvbnN0IGVudW1JZCA9XG4gICAgICAgICAgY29sLmNvbmZpZyAmJiBcImVudW1JZFwiIGluIGNvbC5jb25maWdcbiAgICAgICAgICAgID8gKGNvbC5jb25maWcgYXMgeyBlbnVtSWQ6IHN0cmluZyB9KS5lbnVtSWRcbiAgICAgICAgICAgIDogZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpLmlkO1xuICAgICAgICByZXR1cm4gYCAgICAgICAgICAgICAgICAgIDxTZWxlY3Qga2V5PXtcXGAke2NvbC5uYW1lfS1cXCR7bGlzdFBhcmFtcy4ke2NvbC5uYW1lfX1cXGB9IHsuLi5yZWdpc3RlcihcIiR7Y29sLm5hbWV9XCIpfSBjbGVhcmFibGU+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3RUcmlnZ2VyIGNsYXNzTmFtZT1cInctWzIwMHB4XSBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0VmFsdWUgcGxhY2Vob2xkZXI9XCIke2NvbC5sYWJlbH1cIiBjbGFzc05hbWU9XCJ0cnVuY2F0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0VHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgeyR7ZW51bUlkfS5vcHRpb25zLm1hcCgoa2V5KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0SXRlbSBrZXk9e2tleX0gdmFsdWU9e2tleX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHske2VudW1JZH1MYWJlbFtrZXldfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3RJdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICA8L1NlbGVjdD5gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGSyDtlYTrk5wgKEFzeW5jU2VsZWN0KVxuICAgIGlmIChjb2wubmFtZS5lbmRzV2l0aChcIl9pZFwiKSAmJiBjb2wubmFtZSAhPT0gXCJpZFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICByZXR1cm4gYCAgICAgICAgICAgICAgICAgIDwke3JlbFByb3Aud2l0aH1JZEFzeW5jU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIHN1YnNldD1cIkFcIlxuICAgICAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCIke2NvbC5uYW1lfVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2NvbC5sYWJlbCA/PyByZWxQcm9wLndpdGh9XCJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJhYmxlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctWzIwMHB4XSBoLTggdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9KVxuICAuZmlsdGVyKEJvb2xlYW4pXG4gIC5qb2luKFwiXFxuXCIpfVxuJHtcbiAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIilcbiAgICA/IGAgICAgICAgICAgICAgICAgICA8JHtuYW1lcy5jYXBpdGFsfU9yZGVyQnlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwib3JkZXJCeVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgdGV4dFByZWZpeD1cIlNvcnQ6IFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctWzIwMHB4XSBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt0b3RhbCA/PyAwfSByZXN1bHRzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvQ2FyZEhlYWRlcj5cblxuICAgICAgICAgICAgPENhcmRDb250ZW50IGNsYXNzTmFtZT1cInB4LTYgcGItNiBwdC02IGJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgIHsvKiBUYWJsZSAqL31cbiAgICAgICAgICAgICAgPFRhYmxlPlxuICAgICAgICAgICAgICAgIDxUYWJsZUhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZVJvdyBjbGFzc05hbWU9XCJob3ZlcjpiZy10cmFuc3BhcmVudCBiZy1ncmF5LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICA8VGFibGVIZWFkIGNsYXNzTmFtZT1cImgtOSB0ZXh0LXhzIHctWzQwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0FsbFNlbGVjdGVkKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXtoYW5kbGVTZWxlY3RBbGx9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcCgoY29sLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8VGFibGVIZWFkIGtleT17aWR4fSBmaXQ9e2NvbC5maXR9IGFsaWduPXtjb2wuYWxpZ259PlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlSGVhZD5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxuICAgICAgICAgICAgICAgIDwvVGFibGVIZWFkZXI+XG4gICAgICAgICAgICAgICAgPFRhYmxlQm9keT5cbiAgICAgICAgICAgICAgICAgIHshaXNMb2FkaW5nICYmIHJvd3MgJiYgcm93cy5tYXAoKHJvdykgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8RnJhZ21lbnQga2V5PXtyb3cuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZUNlbGwgY2xhc3NOYW1lPVwicHktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZEl0ZW1zLmhhcyhyb3cuaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eygpID0+IGhhbmRsZVRvZ2dsZUl0ZW0ocm93LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbnMubWFwKChjb2wsIGlkeCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGtleT17aWR4fSBmaXQ9e2NvbC5maXR9IGFsaWduPXtjb2wuYWxpZ259IGNsYXNzTmFtZT1cInB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sLnRjKHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvVGFibGVCb2R5PlxuICAgICAgICAgICAgICA8L1RhYmxlPlxuXG4gICAgICAgICAgICAgIHsvKiBQYWdpbmF0aW9uICovfVxuICAgICAgICAgICAgICA8UGFnaW5hdGlvblxuICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcInBhZ2VcIil9XG4gICAgICAgICAgICAgICAgdG90YWw9e3RvdGFsID8/IDB9XG4gICAgICAgICAgICAgICAgaXRlbXNQZXJQYWdlPXtsaXN0UGFyYW1zLm51bSA/PyAxMH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgICAgICAgPC9DYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRGVsZXRlIERpYWxvZyAqL31cbiAgICAgIDxBbGVydERpYWxvZyBvcGVuPXtkZWxldGVEaWFsb2dPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERlbGV0ZURpYWxvZ09wZW59PlxuICAgICAgICA8QWxlcnREaWFsb2dDb250ZW50PlxuICAgICAgICAgIDxBbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ1RpdGxlPkFyZSB5b3Ugc3VyZT88L0FsZXJ0RGlhbG9nVGl0bGU+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dEZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS4gVGhpcyB3aWxsIHBlcm1hbmVudGx5IGRlbGV0ZSB0aGlzIGl0ZW0uXG4gICAgICAgICAgICA8L0FsZXJ0RGlhbG9nRGVzY3JpcHRpb24+XG4gICAgICAgICAgPC9BbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICA8QWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dDYW5jZWw+Q2FuY2VsPC9BbGVydERpYWxvZ0NhbmNlbD5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ0FjdGlvbiBvbkNsaWNrPXtoYW5kbGVDb25maXJtRGVsZXRlfT5EZWxldGU8L0FsZXJ0RGlhbG9nQWN0aW9uPlxuICAgICAgICAgIDwvQWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgIDwvQWxlcnREaWFsb2dDb250ZW50PlxuICAgICAgPC9BbGVydERpYWxvZz5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiAgICAgIGAudHJpbSgpLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICBwcmVUZW1wbGF0ZXMsXG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImluZmxlY3Rpb24iLCJmbGF0IiwieiIsIkVudGl0eU1hbmFnZXIiLCJnZXRFbnVtSW5mb0Zyb21Db2xOYW1lIiwiZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUiLCJUZW1wbGF0ZSIsIlRlbXBsYXRlX192aWV3X2xpc3QiLCJnZXRUYXJnZXRBbmRQYXRoIiwibmFtZXMiLCJ0YXJnZXQiLCJwYXRoIiwiZnNQbHVyYWwiLCJnZXRSZXF1aXJlZERpY3RLZXlzIiwid3JhcFRjIiwiYm9keSIsImtleSIsImNvbGxhcHNpbmciLCJjbGFzc05hbWUiLCJyZW5kZXJDb2x1bW4iLCJlbnRpdHlJZCIsImNvbCIsInBhcmVudE9iaiIsIndpdGhvdXROYW1lIiwiY29sTmFtZSIsIm5hbWUiLCJpbmNsdWRlcyIsInBhcnRzIiwic3BsaXQiLCJqb2luIiwicmVuZGVyVHlwZSIsImJhc2VOYW1lIiwicG9wIiwicmVwbGFjZSIsInJlbFByb3BGayIsIndpdGgiLCJudWxsYWJsZSIsImlkIiwiZW51bUlkIiwibGFiZWwiLCJwaWNrZWRDaGlsZCIsImNoaWxkcmVuIiwiZmluZCIsImNoaWxkIiwiY29uZmlnIiwicGlja2VkIiwiRXJyb3IiLCJyZW5kZXJDb2x1bW5JbXBvcnQiLCJjYXBpdGFsIiwicmVsUHJvcCIsInJlc3VsdCIsIm1hcCIsImdldE5hbWVzRnJvbUlkIiwiZWxlbWVudCIsInJlbmRlckZpbHRlckltcG9ydCIsImZzIiwiY29tcG9uZW50SWQiLCJjYW1lbGl6ZSIsInRhcmdldEVudGl0eU5hbWVzIiwidGFyZ2V0TUROYW1lcyIsInRhcmdldE5hbWVzIiwicmVuZGVyRmlsdGVyIiwiaXNDbGVhcmFibGUiLCJvcHRpb25hbCIsImdldERlZmF1bHQiLCJjb2x1bW5zIiwiZGVmIiwib3JkZXJCeSIsInNlYXJjaCIsImhhc1NlYXJjaCIsImhhc09yZGVyQnkiLCJvcmRlckJ5Wm9kVHlwZSIsInpvZFR5cGUiLCJab2RFbnVtIiwiT2JqZWN0Iiwia2V5cyIsImVudW0iLCJzZWFyY2hab2RUeXBlIiwicmVuZGVyIiwiZ2V0Q29sdW1uc05vZGUiLCJnZXRab2RUeXBlQnlJZCIsInpvZFR5cGVUb1JlbmRlcmluZ05vZGUiLCJjb2x1bW5zTm9kZSIsImxpc3RQYXJhbXNab2RUeXBlIiwibGlzdFBhcmFtc05vZGUiLCJlbnRpdHkiLCJnZXQiLCJwa1R5cGUiLCJnZXRQa1R5cGUiLCJpZFRzVHlwZSIsInNvcnQiLCJhIiwiYiIsInByb3BDYW5kaWRhdGUiLCJwcm9wcyIsInAiLCJyZW5kZXJlZCIsImRlc2MiLCJ0YyIsImZpdCIsImFsaWduIiwidW5kZWZpbmVkIiwiZmlsdGVyQ29sdW1ucyIsImZpbHRlciIsImVuZHNXaXRoIiwicHJlVGVtcGxhdGVzIiwidGFyZ2V0RW50aXR5SWQiLCJwdXNoIiwib3B0aW9ucyIsImNvbHVtbkVudW1zIiwiZm9yRWFjaCIsImJhc2VFbnVtcyIsInNvbWUiLCJmaWx0ZXJFbnVtSWRzIiwiQm9vbGVhbiIsImFsbEVudW1zIiwiU2V0IiwiZW51bUltcG9ydHMiLCJmbGF0TWFwIiwiZmtDb2x1bW5zIiwidGl0bGUiLCJjYXBpdGFsUGx1cmFsIiwidHJpbSIsImltcG9ydEtleXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLGdCQUFnQixhQUFhO0FBQ3BDLFNBQVNDLElBQUksUUFBUSxVQUFVO0FBQy9CLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBQ3hCLFNBQVNDLGFBQWEsUUFBZ0MsaUNBQThCO0FBRXBGLFNBQVNDLHNCQUFzQixFQUFFQywwQkFBMEIsUUFBUSxnQkFBYTtBQUVoRixTQUFTQyxRQUFRLFFBQVEsaUJBQWM7QUFFdkMsT0FBTyxNQUFNQyw0QkFBNEJEO0lBQ3ZDLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBRSxpQkFBaUJDLEtBQXdCLEVBQUU7UUFDekMsT0FBTztZQUNMQyxRQUFRO1lBQ1JDLE1BQU0sR0FBR0YsTUFBTUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUNyQztJQUNGO0lBRVNDLHNCQUF1QztRQUM5QyxPQUFPO1lBQUM7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
|
|
661
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmbGF0IH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJpbmdOb2RlLCBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEVudW1JbmZvRnJvbUNvbE5hbWUsXG4gIGdldFJlbGF0aW9uTmFtZUZyb21Db2x1bW5OYW1lLFxuICBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZSxcbn0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHsgUmVuZGVyZWRUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX192aWV3X2xpc3QgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwidmlld19saXN0XCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBcIndlYi9zcmMvcm91dGVzL2FkbWluXCIsXG4gICAgICBwYXRoOiBgJHtuYW1lcy5mc1BsdXJhbH0vaW5kZXgudHN4YCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0UmVxdWlyZWREaWN0S2V5cygpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgIHJldHVybiBbXCJlbnRpdHkubGlzdE1hbmFnZVwiLCBcImNvbW1vbi5hbGxcIl07XG4gIH1cblxuICB3cmFwVGMoYm9keTogc3RyaW5nLCBrZXk6IHN0cmluZywgY29sbGFwc2luZzogYm9vbGVhbiA9IHRydWUsIGNsYXNzTmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHJldHVybiBgPFRhYmxlLkNlbGwga2V5PVwiJHtrZXl9XCIke2NvbGxhcHNpbmcgPyBcIiBjb2xsYXBzaW5nXCIgOiBcIlwifSR7XG4gICAgICBjbGFzc05hbWUgPyBgIGNsYXNzTmFtZT17XFxgJHtjbGFzc05hbWV9XFxgfWAgOiBcIlwiXG4gICAgfT4ke2JvZHl9PC9UYWJsZS5DZWxsPmA7XG4gIH1cblxuICByZW5kZXJDb2x1bW4oXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBjb2w6IFJlbmRlcmluZ05vZGUsXG4gICAgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkLFxuICAgIHBhcmVudE9iajogc3RyaW5nID0gXCJyb3dcIixcbiAgICB3aXRob3V0TmFtZTogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmcge1xuICAgIC8vIOykkeyyqSDqsr3roZwg7LKY66asICjsmIg6IFwidXNlci5uYW1lXCIgLT4gXCJyb3cudXNlcj8ubmFtZVwiKVxuICAgIGxldCBjb2xOYW1lOiBzdHJpbmc7XG4gICAgaWYgKHdpdGhvdXROYW1lKSB7XG4gICAgICBjb2xOYW1lID0gcGFyZW50T2JqO1xuICAgIH0gZWxzZSBpZiAoY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAvLyDspJHssqkg6rK966Gc64qUIG9wdGlvbmFsIGNoYWluaW5n7Jy866GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBjb2wubmFtZS5zcGxpdChcIi5cIik7XG4gICAgICBjb2xOYW1lID0gYCR7cGFyZW50T2JqfS4ke3BhcnRzLmpvaW4oXCI/LlwiKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2xOYW1lID0gYCR7cGFyZW50T2JqfS4ke2NvbC5uYW1lfWA7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2wucmVuZGVyVHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZy1wbGFpblwiOlxuICAgICAgY2FzZSBcInN0cmluZy1kYXRlXCI6XG4gICAgICBjYXNlIFwibnVtYmVyLWlkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWlkXCI6XG4gICAgICAgIHJldHVybiBgPD57JHtjb2xOYW1lfX08Lz5gO1xuICAgICAgY2FzZSBcIm51bWJlci1ma19pZFwiOlxuICAgICAgY2FzZSBcInN0cmluZy1ma19pZFwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBjb2wubmFtZS5pbmNsdWRlcyhcIi5cIilcbiAgICAgICAgICAgID8gKGNvbC5uYW1lLnNwbGl0KFwiLlwiKS5wb3AoKSA/PyBjb2wubmFtZSkucmVwbGFjZShcIl9pZFwiLCBcIlwiKVxuICAgICAgICAgICAgOiBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpO1xuICAgICAgICAgIGNvbnN0IHJlbFByb3BGayA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBiYXNlTmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGA8PiR7cmVsUHJvcEZrLndpdGh9I3ske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBgPD57JHtjb2xOYW1lfX08Lz5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgaWYgKGNvbC5udWxsYWJsZSB8fCBjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICByZXR1cm4gYDxzcGFuPnske2NvbE5hbWV9ID8gZGF0ZXRpbWVGKCR7Y29sTmFtZX0pIDogJy0nfTwvc3Bhbj5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+e2RhdGV0aW1lRigke2NvbE5hbWV9KX08L3NwYW4+YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcInN0cmluZy1kYXRldGltZVwiOlxuICAgICAgICBpZiAoY29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+eyR7Y29sTmFtZX0gPyBkYXRlRigke2NvbE5hbWV9KSA6ICctJ308L3NwYW4+YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYDxzcGFuPntkYXRlRigke2NvbE5hbWV9KX08L3NwYW4+YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9ID8gPEJhZGdlIHZhcmlhbnQ9XCJkZWZhdWx0XCI+TzwvQmFkZ2U+IDogPEJhZGdlIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIj5YPC9CYWRnZT59PC8+YDtcbiAgICAgIGNhc2UgXCJlbnVtc1wiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbC5udWxsYWJsZSA/IGAke2NvbE5hbWV9ICYmIGAgOiBcIlwifSR7ZW51bUlkfUxhYmVsWyR7Y29sTmFtZX1dfTwvPmA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBgPD57JHtjb2xOYW1lfX08Lz5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXJyYXktaW1hZ2VzXCI6XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0xXCI+eyAke2NvbE5hbWV9Py5tYXAoKHIsIGkpID0+ICR7XG4gICAgICAgICAgY29sLm51bGxhYmxlID8gYHIgJiYgYCA6IFwiXCJcbiAgICAgICAgfTxpbWcga2V5PXtpfSBzcmM9e3J9IGFsdD17XFxgJHtjb2wubGFiZWwgPz8gY29sLm5hbWV9IFxcJHtpICsgMX1cXGB9IGNsYXNzTmFtZT1cImgtOCB3LTggb2JqZWN0LWNvdmVyIHJvdW5kZWRcIiAvPikgfTwvZGl2PmA7XG4gICAgICBjYXNlIFwianNvbi1zb25hbXVmaWxlXCI6XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPnske2NvbE5hbWV9ID8gPGltZyBzcmM9eyR7Y29sTmFtZX0udXJsfSBhbHQ9eyR7Y29sTmFtZX0ubmFtZX0gY2xhc3NOYW1lPVwiaC04IHctOCBvYmplY3QtY292ZXIgcm91bmRlZFwiIC8+IDogJy0nfTwvZGl2PmA7XG4gICAgICBjYXNlIFwianNvbi1zb25hbXVmaWxlLWFycmF5XCI6XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0xXCI+eyAke2NvbE5hbWV9Py5tYXAoKHIsIGkpID0+ICR7XG4gICAgICAgICAgY29sLm51bGxhYmxlID8gYHIgJiYgYCA6IFwiXCJcbiAgICAgICAgfTxpbWcga2V5PXtpfSBzcmM9e3IudXJsfSBhbHQ9e1xcYCR7Y29sLmxhYmVsID8/IGNvbC5uYW1lfSBcXCR7aSArIDF9XFxgfSBjbGFzc05hbWU9XCJoLTggdy04IG9iamVjdC1jb3ZlciByb3VuZGVkXCIgLz4pIH08L2Rpdj5gO1xuICAgICAgY2FzZSBcIm51bWJlci1wbGFpblwiOlxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSA/IGAke2NvbE5hbWV9ICYmIGAgOiBcIlwifW51bUYoJHtjb2xOYW1lfSl9PC8+YDtcbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gPyBgIDogXCJcIn1KU09OLnN0cmluZ2lmeSgke2NvbE5hbWV9KSR7Y29sLm51bGxhYmxlID8gYCA6ICctJ2AgOiBcIlwifX08L3NwYW4+YDtcbiAgICAgIGNhc2UgXCJvYmplY3QtcGlja1wiOiB7XG4gICAgICAgIGNvbnN0IHBpY2tlZENoaWxkID0gY29sLmNoaWxkcmVuPy5maW5kKChjaGlsZCkgPT4gY2hpbGQubmFtZSA9PT0gY29sLmNvbmZpZz8ucGlja2VkKTtcbiAgICAgICAgaWYgKCFwaWNrZWRDaGlsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgb2JqZWN0LXBpY2sg7ISg7YOdIOyLpO2MqCAo7Jik67iM7KCd7Yq4OiAke2NvbC5uYW1lfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDb2x1bW4oXG4gICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgcGlja2VkQ2hpbGQsXG4gICAgICAgICAgbmFtZXMsXG4gICAgICAgICAgYCR7Y29sTmFtZX0ke2NvbC5udWxsYWJsZSA/IFwiP1wiIDogXCJcIn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgIHJldHVybiBgPD57IC8qIGFycmF5ICR7Y29sTmFtZX0gKi8gfTwvPmA7XG4gICAgICBjYXNlIFwidmVjdG9yXCI6XG4gICAgICAgIC8vIHZlY3RvciDtg4DsnoXsnYAg7LCo7JuQIOyImOunjCDtkZzsi5wgKOyLpOygnCDrjbDsnbTthLDripQg64SI66y0IOq5gClcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbC5udWxsYWJsZSA/IGAke2NvbE5hbWV9ID8gYCA6IFwiXCJ9W1ZlY3RvcjogeyR7Y29sTmFtZX0ke2NvbC5udWxsYWJsZSA/IFwiXCIgOiBcIiA/PyBbXVwifS5sZW5ndGh9ZF0ke2NvbC5udWxsYWJsZSA/IFwiIDogJy0nXCIgOiBcIlwifX08Lz5gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDroIzrjZQg67aI6rCAIOy7rOufvCAke2NvbC5yZW5kZXJUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlckNvbHVtbkltcG9ydChcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGNvbDogUmVuZGVyaW5nTm9kZSxcbiAgICBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQsXG4gICk6IChzdHJpbmcgfCBudWxsKVtdIHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKG5hbWVzLmNhcGl0YWwsIGNvbC5uYW1lKTtcbiAgICAgIHJldHVybiBbYGltcG9ydCB7ICR7ZW51bUlkfUxhYmVsIH0gZnJvbSAnQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkJztgXTtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGNvbC5jaGlsZHJlbiA/PyBbXSkubWFwKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGVudGl0eUlkID0gcmVsUHJvcC53aXRoO1xuICAgICAgICAgIG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChyZWxQcm9wLndpdGgpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbkltcG9ydChlbnRpdHlJZCwgY2hpbGQsIG5hbWVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmbGF0KHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtudWxsXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICAgIGlmICghY29sLmVsZW1lbnQpIHJldHVybiBbbnVsbF07XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJDb2x1bW5JbXBvcnQoZW50aXR5SWQsIGNvbC5lbGVtZW50LCBuYW1lcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtudWxsXTtcbiAgfVxuXG4gIHJlbmRlckZpbHRlckltcG9ydChlbnRpdHlJZDogc3RyaW5nLCBjb2w6IFJlbmRlcmluZ05vZGUsIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIGlmIChjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikge1xuICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9U2VhcmNoSW5wdXQgfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7bmFtZXMuZnN9LyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dFwiO2A7XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBpZiAoY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gYCR7bmFtZXMuY2FwaXRhbH0ke2luZmxlY3Rpb24uY2FtZWxpemUoY29sLm5hbWUpfVNlbGVjdGA7XG4gICAgICAgIHJldHVybiBgaW1wb3J0IHsgJHtjb21wb25lbnRJZH0gfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7bmFtZXMuZnN9LyR7Y29tcG9uZW50SWR9XCI7YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCwgdGFyZ2V0RW50aXR5TmFtZXM6IHRhcmdldE1ETmFtZXMgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoXG4gICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgIGNvbC5uYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBgJHtpZH1TZWxlY3RgO1xuICAgICAgICAgIHJldHVybiBgaW1wb3J0IHsgJHtjb21wb25lbnRJZH0gfSBmcm9tIFwiQC9jb21wb25lbnRzLyR7dGFyZ2V0TUROYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIGNvbnN0IHRhcmdldE5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChyZWxQcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGAke3JlbFByb3Aud2l0aH1JZEFzeW5jU2VsZWN0YDtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHt0YXJnZXROYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOugjOuNlCDrtojqsIDriqXtlZwg7ZWE7YSwIOyehO2PrO2KuCAke2NvbC5uYW1lfSAke2NvbC5yZW5kZXJUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlckZpbHRlcihlbnRpdHlJZDogc3RyaW5nLCBjb2w6IFJlbmRlcmluZ05vZGUsIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIGlmIChjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgY29uc3QgaXNDbGVhcmFibGUgPSBjb2wub3B0aW9uYWwgPT09IHRydWUgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiO1xuICAgIGxldCBjb21wb25lbnRJZDogc3RyaW5nO1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBpZiAoY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSB7XG4gICAgICAgIGNvbXBvbmVudElkID0gYCR7bmFtZXMuY2FwaXRhbH0ke2luZmxlY3Rpb24uY2FtZWxpemUoY29sLm5hbWUpfVNlbGVjdGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICBjb21wb25lbnRJZCA9IGAke2lkfVNlbGVjdGA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYDwke2NvbXBvbmVudElkfSB7Li4ucmVnaXN0ZXIoJyR7Y29sLm5hbWV9Jyl9ICR7aXNDbGVhcmFibGUgPyBcImNsZWFyYWJsZVwiIDogXCJcIn0gLz5gO1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIGNvbXBvbmVudElkID0gYCR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3RgO1xuICAgICAgICByZXR1cm4gYDwke2NvbXBvbmVudElkfSB7Li4ucmVnaXN0ZXIoJyR7Y29sLm5hbWV9Jyl9ICR7XG4gICAgICAgICAgaXNDbGVhcmFibGUgPyBcImNsZWFyYWJsZVwiIDogXCJcIlxuICAgICAgICB9IHN1YnNldD1cIkFcIiAvPmA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg66CM642UIOu2iOqwgOuKpe2VnCDtlYTthLAg7J6E7Y+s7Yq4ICR7Y29sLm5hbWV9ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVmYXVsdChjb2x1bW5zOiBSZW5kZXJpbmdOb2RlW10pOiB7XG4gICAgb3JkZXJCeTogc3RyaW5nO1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIGhhc1NlYXJjaDogYm9vbGVhbjtcbiAgICBoYXNPcmRlckJ5OiBib29sZWFuO1xuICB9IHtcbiAgICBjb25zdCBkZWYgPSB7XG4gICAgICBvcmRlckJ5OiBcIlwiLFxuICAgICAgc2VhcmNoOiBcIlwiLFxuICAgICAgaGFzU2VhcmNoOiBmYWxzZSxcbiAgICAgIGhhc09yZGVyQnk6IGZhbHNlLFxuICAgIH07XG4gICAgY29uc3Qgb3JkZXJCeVpvZFR5cGUgPSBjb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKT8uem9kVHlwZTtcbiAgICBpZiAob3JkZXJCeVpvZFR5cGUgJiYgb3JkZXJCeVpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICAgIGRlZi5vcmRlckJ5ID0gT2JqZWN0LmtleXMob3JkZXJCeVpvZFR5cGUuZW51bSlbMF07XG4gICAgICBkZWYuaGFzT3JkZXJCeSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFpvZFR5cGUgPSBjb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwic2VhcmNoXCIpPy56b2RUeXBlO1xuICAgIGlmIChzZWFyY2hab2RUeXBlICYmIHNlYXJjaFpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICAgIGRlZi5zZWFyY2ggPSBPYmplY3Qua2V5cyhzZWFyY2hab2RUeXBlLmVudW0pWzBdO1xuICAgICAgZGVmLmhhc1NlYXJjaCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBkZWY7XG4gIH1cblxuICBhc3luYyByZW5kZXIoeyBlbnRpdHlJZCB9OiBUZW1wbGF0ZU9wdGlvbnNbXCJ2aWV3X2xpc3RcIl0pIHtcbiAgICBjb25zdCB7IGdldENvbHVtbnNOb2RlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHktY29udmVydGVyXCIpO1xuICAgIGNvbnN0IHsgZ2V0Wm9kVHlwZUJ5SWQsIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3pvZC1jb252ZXJ0ZXJcIik7XG5cbiAgICBjb25zdCBjb2x1bW5zTm9kZSA9IGF3YWl0IGdldENvbHVtbnNOb2RlKGVudGl0eUlkLCBcIkFcIik7XG4gICAgY29uc3QgbGlzdFBhcmFtc1pvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChgJHtlbnRpdHlJZH1MaXN0UGFyYW1zYCk7XG4gICAgY29uc3QgbGlzdFBhcmFtc05vZGUgPSB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGxpc3RQYXJhbXNab2RUeXBlKTtcblxuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgLy8gUEsg7YOA7J6FIOqwkOyngFxuICAgIGNvbnN0IHBrVHlwZSA9IGVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICBjb25zdCBpZFRzVHlwZSA9IHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiID8gXCJzdHJpbmdcIiA6IFwibnVtYmVyXCI7XG5cbiAgICAvLyDsi6TsoJwg66as7Iqk7Yq4IOy7rOufvFxuICAgIGNvbnN0IGNvbHVtbnMgPSAoY29sdW1uc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuXG4gICAgICAuc29ydCgoYSwgYikgPT4gKGEubmFtZSA9PT0gXCJpZFwiID8gLTEgOiBiLm5hbWUgPT09IFwiaWRcIiA/IDEgOiAwKSlcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IHRoaXMucmVuZGVyQ29sdW1uKGVudGl0eUlkLCBjb2wsIG5hbWVzKTtcblxuICAgICAgICAvLyDrnbzrsqgg7IOd7ISxOiBjb21tb24g7ZWE65OcKGNyZWF0ZWRfYXQp64qUIFNEKFwiY29tbW9uLntmaWVsZH1cIiksIGVudGl0eSDtlYTrk5zripQgU0QoXCJlbnRpdHkue0VudGl0eX0ue2ZpZWxkfVwiKVxuICAgICAgICBsZXQgbGFiZWw6IHN0cmluZztcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgICBsYWJlbCA9ICdcIklEXCInO1xuICAgICAgICB9IGVsc2UgaWYgKFtcImNyZWF0ZWRfYXRcIl0uaW5jbHVkZXMoY29sLm5hbWUpKSB7XG4gICAgICAgICAgLy8gY2FtZWxDYXNl66GcIOuzgO2ZmCAoY3JlYXRlZF9hdCAtPiBjcmVhdGVkQXQpXG4gICAgICAgICAgY29uc3QgY2FtZWxOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGNoYXIpID0+IGNoYXIudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgbGFiZWwgPSBgU0QoXCJjb21tb24uJHtjYW1lbE5hbWV9XCIpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsYWJlbE5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGxhYmVsID0gYFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH0uJHtsYWJlbE5hbWV9XCIpYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdGM6IGAocm93KSA9PiAke3JlbmRlcmVkfWAsXG4gICAgICAgICAgZml0OlxuICAgICAgICAgICAgY29sLm5hbWUgPT09IFwiaWRcIiB8fFxuICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWlkXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcImRhdGV0aW1lXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiLFxuICAgICAgICAgIGFsaWduOiBjb2wubmFtZSA9PT0gXCJpZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1pZFwiID8gXCJjZW50ZXJcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvFxuICAgIGNvbnN0IGZpbHRlckNvbHVtbnMgPSAobGlzdFBhcmFtc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGNvbCkgPT5cbiAgICAgICAgICBjb2wubmFtZSAhPT0gXCJpZFwiICYmXG4gICAgICAgICAgY29sLm5hbWUgIT09IFwicXVlcnlNb2RlXCIgJiZcbiAgICAgICAgICBbXCJlbnVtc1wiLCBcIm51bWJlci1pZFwiLCBcIm51bWJlci1ma19pZFwiLCBcInN0cmluZy1ma19pZFwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSksXG4gICAgICApXG4gICAgICAvLyBvcmRlckJ56rCAIOqwgOyepSDrkqTroZwg7Jik6rKMIOyInOyEnCDsobDsoJVcbiAgICAgIC5zb3J0KChhKSA9PiB7XG4gICAgICAgIHJldHVybiBhLm5hbWUgPT09IFwib3JkZXJCeVwiID8gMSA6IC0xO1xuICAgICAgfSk7XG5cbiAgICAvLyDtlYTthLAg7Lus65+87J2EIO2UhOumrCDthZztlIzrpr/snLzroZwg7ISk7KCVXG4gICAgY29uc3QgcHJlVGVtcGxhdGVzOiBSZW5kZXJlZFRlbXBsYXRlW1wicHJlVGVtcGxhdGVzXCJdID0gW107XG5cbiAgICAvLyDsu6zrn7zsl5DshJwg7IKs7Jqp7ZWY64qUIGVudW3rk6Qg7IiY7KeRXG4gICAgY29uc3QgY29sdW1uRW51bXM6IHN0cmluZ1tdID0gW107XG4gICAgKGNvbHVtbnNOb2RlLmNoaWxkcmVuID8/IFtdKS5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgY29sdW1uRW51bXMucHVzaChlbnVtSWQpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDrlJTtj7Ttirgg7YyM652866+47YSwXG4gICAgLy8gY29uc3QgZGVmID0gdGhpcy5nZXREZWZhdWx0KGZpbHRlckNvbHVtbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyksXG4gICAgICBib2R5OiBgXG5pbXBvcnQgeyB1c2VTdGF0ZSwgRnJhZ21lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVSb3V0ZSwgdXNlTmF2aWdhdGUgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiO1xuXG5pbXBvcnQgeyBDYXJkLCBDYXJkQ29udGVudCwgQ2FyZEhlYWRlciB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEJhZGdlIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgUGFnaW5hdGlvbiwgVGFibGUsIFRhYmxlQm9keSwgVGFibGVDZWxsLCB0eXBlIFRhYmxlQ29sLCBUYWJsZUhlYWQsIFRhYmxlSGVhZGVyLCBUYWJsZVJvdyB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEVudW1TZWxlY3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBBbGVydERpYWxvZywgQWxlcnREaWFsb2dBY3Rpb24sIEFsZXJ0RGlhbG9nQ2FuY2VsLCBBbGVydERpYWxvZ0NvbnRlbnQsIEFsZXJ0RGlhbG9nRGVzY3JpcHRpb24sIEFsZXJ0RGlhbG9nRm9vdGVyLCBBbGVydERpYWxvZ0hlYWRlciwgQWxlcnREaWFsb2dUaXRsZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IElucHV0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQ2hlY2tib3ggfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBTb25hbXVGaWx0ZXJNb2RhbCwgU29uYW11RmlsdGVyUG9wb3ZlciwgZXh0cmFjdEZpZWxkTWV0YUZyb21TY2hlbWEsIHR5cGUgUnVsZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcblxuaW1wb3J0IHsgdXNlTGlzdFBhcmFtcywgbnVtRiwgZGF0ZUYsIGRhdGV0aW1lRiB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2xpYlwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVN1YnNldEEsICR7bmFtZXMuY2FwaXRhbH1CYXNlU2NoZW1hIH0gZnJvbSBcIkAvc2VydmljZXMvc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zIH0gZnJvbSBcIkAvc2VydmljZXMvJHtuYW1lcy5mc30vJHtuYW1lcy5mc30udHlwZXNcIjtcbmltcG9ydCB7ICR7KCgpID0+IHtcbiAgICAgICAgLy8g6riw67O4IGVudW0g7IiY7KeRIChmaWx0ZXJDb2x1bW5z7JeQIOyeiOuKlCDqsoPrp4wpXG4gICAgICAgIGNvbnN0IGJhc2VFbnVtczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpKSB7XG4gICAgICAgICAgYmFzZUVudW1zLnB1c2goYCR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5YCwgYCR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5TGFiZWxgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSkge1xuICAgICAgICAgIGJhc2VFbnVtcy5wdXNoKGAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRgLCBgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkTGFiZWxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2VhO2EsCBlbnVtIOyImOynkSAoY29uZmlnLmVudW1JZCDsmrDshKAsIOyXhuycvOuptCBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKVxuICAgICAgICBjb25zdCBmaWx0ZXJFbnVtSWRzID0gZmlsdGVyQ29sdW1uc1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiICYmIGNvbC5uYW1lICE9PSBcInNlYXJjaFwiICYmIGNvbC5uYW1lICE9PSBcIm9yZGVyQnlcIixcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLmNvbmZpZyAmJiBcImVudW1JZFwiIGluIGNvbC5jb25maWcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChjb2wuY29uZmlnIGFzIHsgZW51bUlkOiBzdHJpbmcgfSkuZW51bUlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgeyBpZDogZW51bUlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiBlbnVtSWQ7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIC8vIOuqqOuToCBlbnVtIO2Vqey5mOqzoCDspJHrs7Ug7KCc6rGwXG4gICAgICAgIGNvbnN0IGFsbEVudW1zID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckVudW1JZHMsIC4uLmNvbHVtbkVudW1zXSldO1xuICAgICAgICBjb25zdCBlbnVtSW1wb3J0cyA9IGFsbEVudW1zLmZsYXRNYXAoKGVudW1JZCkgPT4gW2Ake2VudW1JZH1gLCBgJHtlbnVtSWR9TGFiZWxgXSk7XG5cbiAgICAgICAgcmV0dXJuIFsuLi5iYXNlRW51bXMsIC4uLmVudW1JbXBvcnRzXS5qb2luKFwiLCBcIik7XG4gICAgICB9KSgpfSB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IElkQXN5bmNTZWxlY3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG4keygoKSA9PiB7XG4gIC8vIEZLIO2VhOuTnOydmCBBc3luY0lkQ29uZmlnIGltcG9ydFxuICBjb25zdCBma0NvbHVtbnMgPSBmaWx0ZXJDb2x1bW5zLmZpbHRlcihcbiAgICAoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIixcbiAgKTtcbiAgY29uc3QgY29uZmlnTmFtZXMgPSBma0NvbHVtbnNcbiAgICAubWFwKChjb2wpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIHJldHVybiBgJHtyZWxQcm9wLndpdGh9QXN5bmNJZENvbmZpZ2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICByZXR1cm4gY29uZmlnTmFtZXMubGVuZ3RoID4gMFxuICAgID8gYGltcG9ydCB7ICR7Y29uZmlnTmFtZXMuam9pbihcIiwgXCIpfSB9IGZyb20gXCJAL3NlcnZpY2VzL3NlcnZpY2VzLmdlbmVyYXRlZFwiO2BcbiAgICA6IFwiXCI7XG59KSgpfVxuXG5pbXBvcnQgRWRpdEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvc3F1YXJlLXBlblwiO1xuaW1wb3J0IFRyYXNoSWNvbiBmcm9tIFwifmljb25zL2x1Y2lkZS90cmFzaC0yXCI7XG5pbXBvcnQgRmlsdGVySWNvbiBmcm9tIFwifmljb25zL21kaS9maWx0ZXItdmFyaWFudFwiO1xuaW1wb3J0IExpc3RJY29uIGZyb20gXCJ+aWNvbnMvbWRpL2Zvcm1hdC1saXN0LWJ1bGxldGVkXCI7XG5pbXBvcnQgU2VhcmNoSWNvbiBmcm9tIFwifmljb25zL21kaS9tYWduaWZ5XCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCJAL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5cbmV4cG9ydCBjb25zdCBSb3V0ZSA9IGNyZWF0ZUZpbGVSb3V0ZShcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfS9cIikoe1xcbiAgaGVhZDogKCkgPT4gKHtcXG4gICAgbWV0YTogW1xcbiAgICAgIHsgdGl0bGU6IFwiJHtlbnRpdHkudGl0bGUgPz8gbmFtZXMuY2FwaXRhbH0gTGlzdFwiIH0sXFxuICAgICAgeyBuYW1lOiBcImRlc2NyaXB0aW9uXCIsIGNvbnRlbnQ6IFNEKFwiZW50aXR5Lmxpc3RNYW5hZ2VcIikoXCIke2VudGl0eS50aXRsZSA/PyBuYW1lcy5jYXBpdGFsfVwiKSB9LFxcbiAgICBdLFxcbiAgfSksXFxuICBjb21wb25lbnQ6ICR7bmFtZXMuY2FwaXRhbH1MaXN0LFxcbn0pO1xcblxcbnR5cGUgJHtuYW1lcy5jYXBpdGFsfUxpc3RQcm9wcyA9IHt9O1xuXG5mdW5jdGlvbiAke25hbWVzLmNhcGl0YWx9TGlzdCh7fTogJHtuYW1lcy5jYXBpdGFsfUxpc3RQcm9wcykge1xuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG5cbiAgLy8g7IOB7YOcIOq0gOumrFxuICBjb25zdCBbc2VsZWN0ZWRJdGVtcywgc2V0U2VsZWN0ZWRJdGVtc10gPSB1c2VTdGF0ZTxTZXQ8JHtpZFRzVHlwZX0+PihuZXcgU2V0KCkpO1xuICBjb25zdCBbZGVsZXRlRGlhbG9nT3Blbiwgc2V0RGVsZXRlRGlhbG9nT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpdGVtVG9EZWxldGUsIHNldEl0ZW1Ub0RlbGV0ZV0gPSB1c2VTdGF0ZTx7IGlkOiAke2lkVHNUeXBlfTsgbmFtZT86IHN0cmluZyB9IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtmaWx0ZXJNb2RhbE9wZW4sIHNldEZpbHRlck1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFthcHBsaWVkUnVsZXMsIHNldEFwcGxpZWRSdWxlc10gPSB1c2VTdGF0ZTxSdWxlW10+KFtdKTtcblxuICAvLyDrpqzsiqTtirgg7ZWE7YSwXG4gIGNvbnN0IHsgbGlzdFBhcmFtcywgcmVnaXN0ZXIsIHNldExpc3RQYXJhbXMgfSA9IHVzZUxpc3RQYXJhbXMoJHtuYW1lcy5jYXBpdGFsfUxpc3RQYXJhbXMsIHtcbiAgICBudW06IDEwLFxuICAgIHBhZ2U6IDEsXG4gICAga2V5d29yZDogXCJcIiwke1xuICAgICAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKVxuICAgICAgICA/IGBcbiAgICBzZWFyY2g6ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZC5vcHRpb25zWzBdLGBcbiAgICAgICAgOiBcIlwiXG4gICAgfSR7XG4gICAgICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKVxuICAgICAgICA/IGBcbiAgICBvcmRlckJ5OiAke25hbWVzLmNhcGl0YWx9T3JkZXJCeS5vcHRpb25zWzBdLGBcbiAgICAgICAgOiBcIlwiXG4gICAgfVxuICAgIHNvbmFtdUZpbHRlcjoge30sXG4gIH0pO1xuXG4gIC8vIOumrOyKpO2KuCDsv7zrpqxcbiAgY29uc3QgeyBkYXRhLCByZWZldGNoLCBpc0xvYWRpbmcgfSA9ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLnVzZSR7bmFtZXMuY2FwaXRhbFBsdXJhbH0oXCJBXCIsIGxpc3RQYXJhbXMpO1xuICBjb25zdCB7IHJvd3MsIHRvdGFsIH0gPSBkYXRhID8/IHt9O1xuXG4gIC8vIO2YhOyerCDqsr3roZzsmYAg7YOA7J207YuAXG4gIGNvbnN0IFBBR0UgPSB7XG4gICAgcm91dGU6IFwiL2FkbWluLyR7bmFtZXMuZnNQbHVyYWx9XCIsXG4gICAgdGl0bGU6IFNEKFwiZW50aXR5Lmxpc3RcIikoU0QoXCJlbnRpdHkuJHtuYW1lcy5jYXBpdGFsfVwiKSksXG4gIH07XG5cbiAgLy8g7Lus65+8IOygleydmFxuICB0eXBlICR7bmFtZXMuY2FwaXRhbH1Sb3cgPSBOb25OdWxsYWJsZTx0eXBlb2Ygcm93cz5bbnVtYmVyXTtcbiAgY29uc3QgY29sdW1uczogVGFibGVDb2w8JHtuYW1lcy5jYXBpdGFsfVJvdz5bXSA9IFtcbiR7Y29sdW1uc1xuICAubWFwKFxuICAgIChjb2wpID0+IGAgICAge1xuICAgICAgbGFiZWw6ICR7Y29sLmxhYmVsfSxcbiAgICAgIHRjOiAke2NvbC50Y30sJHtcbiAgICAgICAgY29sLmZpdFxuICAgICAgICAgID8gYFxuICAgICAgZml0OiB0cnVlLGBcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH0ke1xuICAgICAgICBjb2wuYWxpZ25cbiAgICAgICAgICA/IGBcbiAgICAgIGFsaWduOiBcIiR7Y29sLmFsaWdufVwiLGBcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH1cbiAgICB9YCxcbiAgKVxuICAuam9pbihcIixcXG5cIil9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBTRChcImNvbW1vbi5tYW5hZ2VcIiksXG4gICAgICBmaXQ6IHRydWUsXG4gICAgICBhbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIHRjOiAocm93KSA9PiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwieWVsbG93XCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICBpY29uPXs8RWRpdEljb24gLz59XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCwgc2VhcmNoOiB7IGlkOiByb3cuaWQgfSB9KX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJyZWRcIlxuICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgIGljb249ezxUcmFzaEljb24gLz59XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVEZWxldGVDbGljayhyb3cuaWQpfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSxcbiAgICB9LFxuICBdO1xuXG4gIC8vIOyEoO2DnSDtlbjrk6Trn6xcbiAgY29uc3QgaGFuZGxlVG9nZ2xlSXRlbSA9IChpZDogJHtpZFRzVHlwZX0pID0+IHtcbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgU2V0KHNlbGVjdGVkSXRlbXMpO1xuICAgIGlmIChuZXdTZWxlY3Rpb24uaGFzKGlkKSkge1xuICAgICAgbmV3U2VsZWN0aW9uLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1NlbGVjdGlvbi5hZGQoaWQpO1xuICAgIH1cbiAgICBzZXRTZWxlY3RlZEl0ZW1zKG5ld1NlbGVjdGlvbik7XG4gIH07XG5cbiAgY29uc3QgaXNBbGxTZWxlY3RlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gKHJvd3M/Lmxlbmd0aCA/PyAwKSA+IDAgJiYgcm93cyEuZXZlcnkoKHJvdykgPT4gc2VsZWN0ZWRJdGVtcy5oYXMocm93LmlkKSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0QWxsID0gKGNoZWNrZWQ6IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgc2V0U2VsZWN0ZWRJdGVtcyhuZXcgU2V0KHJvd3M/Lm1hcCgocm93KSA9PiByb3cuaWQpID8/IFtdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbXMobmV3IFNldCgpKTtcbiAgICB9XG4gIH07XG5cbiAgLy8g7IKt7KCcIO2VuOuTpOufrFxuICBjb25zdCBoYW5kbGVEZWxldGVDbGljayA9IChpZDogJHtpZFRzVHlwZX0sIG5hbWU/OiBzdHJpbmcpID0+IHtcbiAgICBzZXRJdGVtVG9EZWxldGUoeyBpZCwgbmFtZSB9KTtcbiAgICBzZXREZWxldGVEaWFsb2dPcGVuKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbmZpcm1EZWxldGUgPSAoKSA9PiB7XG4gICAgaWYgKGl0ZW1Ub0RlbGV0ZSkge1xuICAgICAgJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UuZGVsKFtpdGVtVG9EZWxldGUuaWRdKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVmZXRjaCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHNldERlbGV0ZURpYWxvZ09wZW4oZmFsc2UpO1xuICAgIHNldEl0ZW1Ub0RlbGV0ZShudWxsKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LXctWzE4MDBweF0gbXgtYXV0byBwLThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTYgbWItOFwiPlxuICAgICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPExpc3RJY29uIGNsYXNzTmFtZT1cImgtNSB3LTVcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIGgtNVwiPntQQUdFLnRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cInNoYWRvdy1zbSBib3JkZXItYm9yZGVyLzQwIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgPENhcmRIZWFkZXIgY2xhc3NOYW1lPVwicGItMCBweC0wIHB0LTBcIj5cbiAgICAgICAgICAgICAgey8qIEZpbHRlcnMgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctZ3JheS0xMDAgcHgtNiBweS00IHNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgZmxleC13cmFwXCI+XG4ke1xuICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwic2VhcmNoXCIpXG4gICAgPyBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZW51bT17JHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkfVxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM9eyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZExhYmVsfVxuICAgICAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCJzZWFyY2hcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtTRChcImNvbW1vbi5zZWFyY2hUeXBlXCIpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmBcbiAgICA6IFwiXCJcbn1cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBmbGV4LTEgbWF4LXcteHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwia2V5d29yZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCBwci04IHRleHQteHMgYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPXs8U2VhcmNoSWNvbiAvPn1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0wIHRvcC0wIGgtOCB3LTggaG92ZXI6YmctdHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWwtYXV0byBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04IHB4LTQgYmctcHJpbWFyeSBob3ZlcjpiZy1wcmltYXJ5LzkwIHRleHQtd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG5hdmlnYXRlKHsgdG86IFxcYFxcJHtQQUdFLnJvdXRlfS9mb3JtXFxgIH0pfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14c1wiPntTRChcImNvbW1vbi5jcmVhdGVcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPFNvbmFtdUZpbHRlclBvcG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICBydWxlcz17YXBwbGllZFJ1bGVzfVxuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTWV0YT17ZXh0cmFjdEZpZWxkTWV0YUZyb21TY2hlbWEoXG4gICAgICAgICAgICAgICAgICAgICAgICAke25hbWVzLmNhcGl0YWx9QmFzZVNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFNEIGFzIChrZXk6IHN0cmluZykgPT4gc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17PEZpbHRlckljb24gLz59XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRGaWx0ZXJNb2RhbE9wZW4odHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLThcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57U0QoXCJyYy5zb25hbXVGaWx0ZXIudGl0bGVcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAge2FwcGxpZWRSdWxlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEJhZGdlIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBjbGFzc05hbWU9XCJtbC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2FwcGxpZWRSdWxlcy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L1NvbmFtdUZpbHRlclBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgZmxleC13cmFwXCI+XG4ke2ZpbHRlckNvbHVtbnNcbiAgLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gXCJzZWFyY2hcIiAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCIpXG4gIC5tYXAoKGNvbCkgPT4ge1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBjb25maWcuZW51bUlk6rCAIOyeiOycvOuptCDsmrDshKAg7IKs7JqpLCDsl4bsnLzrqbQgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSDsi5zrj4RcbiAgICAgICAgY29uc3QgZW51bUlkID1cbiAgICAgICAgICBjb2wuY29uZmlnICYmIFwiZW51bUlkXCIgaW4gY29sLmNvbmZpZ1xuICAgICAgICAgICAgPyAoY29sLmNvbmZpZyBhcyB7IGVudW1JZDogc3RyaW5nIH0pLmVudW1JZFxuICAgICAgICAgICAgOiBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSkuaWQ7XG4gICAgICAgIHJldHVybiBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAga2V5PXtcXGAke2NvbC5uYW1lfS1cXCR7bGlzdFBhcmFtcy4ke2NvbC5uYW1lfX1cXGB9XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7ZW51bUlkfX1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske2VudW1JZH1MYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtjb2wubGFiZWx9XCJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJhYmxlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNTAgaC04IGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRksg7ZWE65OcIChJZEFzeW5jU2VsZWN0KVxuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgcmV0dXJuIGAgICAgICAgICAgICAgICAgICA8SWRBc3luY1NlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjb25maWc9eyR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWd9XG4gICAgICAgICAgICAgICAgICAgIHN1YnNldD1cIkFcIlxuICAgICAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCIke2NvbC5uYW1lfVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2NvbC5sYWJlbCA/PyByZWxQcm9wLndpdGh9XCJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJhYmxlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNTAgaC04IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfSlcbiAgLmZpbHRlcihCb29sZWFuKVxuICAuam9pbihcIlxcblwiKX1cbiR7XG4gIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpXG4gICAgPyBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZW51bT17JHtuYW1lcy5jYXBpdGFsfU9yZGVyQnl9XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtuYW1lcy5jYXBpdGFsfU9yZGVyQnlMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwib3JkZXJCeVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1NEKFwiY29tbW9uLnNvcnRcIil9XG4gICAgICAgICAgICAgICAgICAgIHRleHRQcmVmaXg9e1xcYFxcJHtTRChcImNvbW1vbi5zb3J0XCIpfTogXFxgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmBcbiAgICA6IFwiXCJcbn1cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e1NEKFwiY29tbW9uLnJlc3VsdHNcIikodG90YWwgPz8gMCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvQ2FyZEhlYWRlcj5cblxuICAgICAgICAgICAgPENhcmRDb250ZW50IGNsYXNzTmFtZT1cInB4LTYgcGItNiBwdC02IGJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgIHsvKiBUYWJsZSAqL31cbiAgICAgICAgICAgICAgPFRhYmxlPlxuICAgICAgICAgICAgICAgIDxUYWJsZUhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZVJvdyBjbGFzc05hbWU9XCJob3ZlcjpiZy10cmFuc3BhcmVudCBiZy1ncmF5LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICA8VGFibGVIZWFkIGNsYXNzTmFtZT1cImgtOSB0ZXh0LXhzIHctWzQwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0FsbFNlbGVjdGVkKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXtoYW5kbGVTZWxlY3RBbGx9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcCgoY29sLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8VGFibGVIZWFkIGtleT17aWR4fSBmaXQ9e2NvbC5maXR9IGFsaWduPXtjb2wuYWxpZ259PlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlSGVhZD5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxuICAgICAgICAgICAgICAgIDwvVGFibGVIZWFkZXI+XG4gICAgICAgICAgICAgICAgPFRhYmxlQm9keT5cbiAgICAgICAgICAgICAgICAgIHshaXNMb2FkaW5nICYmIHJvd3MgJiYgcm93cy5tYXAoKHJvdykgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8RnJhZ21lbnQga2V5PXtyb3cuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZUNlbGwgY2xhc3NOYW1lPVwicHktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZEl0ZW1zLmhhcyhyb3cuaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eygpID0+IGhhbmRsZVRvZ2dsZUl0ZW0ocm93LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbnMubWFwKChjb2wsIGlkeCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGtleT17aWR4fSBmaXQ9e2NvbC5maXR9IGFsaWduPXtjb2wuYWxpZ259IGNsYXNzTmFtZT1cInB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sLnRjKHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvVGFibGVCb2R5PlxuICAgICAgICAgICAgICA8L1RhYmxlPlxuXG4gICAgICAgICAgICAgIHsvKiBQYWdpbmF0aW9uICovfVxuICAgICAgICAgICAgICA8UGFnaW5hdGlvblxuICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcInBhZ2VcIil9XG4gICAgICAgICAgICAgICAgdG90YWw9e3RvdGFsID8/IDB9XG4gICAgICAgICAgICAgICAgaXRlbXNQZXJQYWdlPXtsaXN0UGFyYW1zLm51bSA/PyAxMH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgICAgICAgPC9DYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRGVsZXRlIERpYWxvZyAqL31cbiAgICAgIDxBbGVydERpYWxvZyBvcGVuPXtkZWxldGVEaWFsb2dPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERlbGV0ZURpYWxvZ09wZW59PlxuICAgICAgICA8QWxlcnREaWFsb2dDb250ZW50PlxuICAgICAgICAgIDxBbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ1RpdGxlPntTRChcImRlbGV0ZS5jb25maXJtLnRpdGxlXCIpfTwvQWxlcnREaWFsb2dUaXRsZT5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ0Rlc2NyaXB0aW9uPntTRChcImRlbGV0ZS5jb25maXJtLmRlc2NyaXB0aW9uXCIpfTwvQWxlcnREaWFsb2dEZXNjcmlwdGlvbj5cbiAgICAgICAgICA8L0FsZXJ0RGlhbG9nSGVhZGVyPlxuICAgICAgICAgIDxBbGVydERpYWxvZ0Zvb3Rlcj5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ0NhbmNlbD57U0QoXCJjb21tb24uY2FuY2VsXCIpfTwvQWxlcnREaWFsb2dDYW5jZWw+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dBY3Rpb24gb25DbGljaz17aGFuZGxlQ29uZmlybURlbGV0ZX0+XG4gICAgICAgICAgICAgIHtTRChcImNvbW1vbi5kZWxldGVcIil9XG4gICAgICAgICAgICA8L0FsZXJ0RGlhbG9nQWN0aW9uPlxuICAgICAgICAgIDwvQWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgIDwvQWxlcnREaWFsb2dDb250ZW50PlxuICAgICAgPC9BbGVydERpYWxvZz5cblxuICAgICAgey8qIFNvbmFtdSBGaWx0ZXIgTW9kYWwgKi99XG4gICAgICA8U29uYW11RmlsdGVyTW9kYWxcbiAgICAgICAgYmFzZVNjaGVtYT17JHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWF9XG4gICAgICAgIG9wZW49e2ZpbHRlck1vZGFsT3Blbn1cbiAgICAgICAgb25PcGVuQ2hhbmdlPXtzZXRGaWx0ZXJNb2RhbE9wZW59XG4gICAgICAgIGluaXRpYWxSdWxlcz17YXBwbGllZFJ1bGVzfVxuICAgICAgICBvbkFwcGx5PXsoZmlsdGVycywgcnVsZXMpID0+IHtcbiAgICAgICAgICBzZXRMaXN0UGFyYW1zKHsgLi4ubGlzdFBhcmFtcywgc29uYW11RmlsdGVyOiBmaWx0ZXJzLCBwYWdlOiAxIH0pO1xuICAgICAgICAgIHNldEFwcGxpZWRSdWxlcyhydWxlcyk7XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIHByZVRlbXBsYXRlcyxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsImZsYXQiLCJ6IiwiRW50aXR5TWFuYWdlciIsImdldEVudW1JbmZvRnJvbUNvbE5hbWUiLCJnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZSIsImdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lIiwiVGVtcGxhdGUiLCJUZW1wbGF0ZV9fdmlld19saXN0IiwiZ2V0VGFyZ2V0QW5kUGF0aCIsIm5hbWVzIiwidGFyZ2V0IiwicGF0aCIsImZzUGx1cmFsIiwiZ2V0UmVxdWlyZWREaWN0S2V5cyIsIndyYXBUYyIsImJvZHkiLCJrZXkiLCJjb2xsYXBzaW5nIiwiY2xhc3NOYW1lIiwicmVuZGVyQ29sdW1uIiwiZW50aXR5SWQiLCJjb2wiLCJwYXJlbnRPYmoiLCJ3aXRob3V0TmFtZSIsImNvbE5hbWUiLCJuYW1lIiwiaW5jbHVkZXMiLCJwYXJ0cyIsInNwbGl0Iiwiam9pbiIsInJlbmRlclR5cGUiLCJiYXNlTmFtZSIsInBvcCIsInJlcGxhY2UiLCJyZWxQcm9wRmsiLCJ3aXRoIiwibnVsbGFibGUiLCJpZCIsImVudW1JZCIsImxhYmVsIiwicGlja2VkQ2hpbGQiLCJjaGlsZHJlbiIsImZpbmQiLCJjaGlsZCIsImNvbmZpZyIsInBpY2tlZCIsIkVycm9yIiwicmVuZGVyQ29sdW1uSW1wb3J0IiwiY2FwaXRhbCIsInJlbFByb3AiLCJyZXN1bHQiLCJtYXAiLCJnZXROYW1lc0Zyb21JZCIsImVsZW1lbnQiLCJyZW5kZXJGaWx0ZXJJbXBvcnQiLCJmcyIsImNvbXBvbmVudElkIiwiY2FtZWxpemUiLCJ0YXJnZXRFbnRpdHlOYW1lcyIsInRhcmdldE1ETmFtZXMiLCJ0YXJnZXROYW1lcyIsInJlbmRlckZpbHRlciIsImlzQ2xlYXJhYmxlIiwib3B0aW9uYWwiLCJnZXREZWZhdWx0IiwiY29sdW1ucyIsImRlZiIsIm9yZGVyQnkiLCJzZWFyY2giLCJoYXNTZWFyY2giLCJoYXNPcmRlckJ5Iiwib3JkZXJCeVpvZFR5cGUiLCJ6b2RUeXBlIiwiWm9kRW51bSIsIk9iamVjdCIsImtleXMiLCJlbnVtIiwic2VhcmNoWm9kVHlwZSIsInJlbmRlciIsImdldENvbHVtbnNOb2RlIiwiZ2V0Wm9kVHlwZUJ5SWQiLCJ6b2RUeXBlVG9SZW5kZXJpbmdOb2RlIiwiY29sdW1uc05vZGUiLCJsaXN0UGFyYW1zWm9kVHlwZSIsImxpc3RQYXJhbXNOb2RlIiwiZW50aXR5IiwiZ2V0IiwicGtUeXBlIiwiZ2V0UGtUeXBlIiwiaWRUc1R5cGUiLCJzb3J0IiwiYSIsImIiLCJyZW5kZXJlZCIsImNhbWVsTmFtZSIsIl8iLCJjaGFyIiwidG9VcHBlckNhc2UiLCJsYWJlbE5hbWUiLCJ0YyIsImZpdCIsImFsaWduIiwidW5kZWZpbmVkIiwiZmlsdGVyQ29sdW1ucyIsImZpbHRlciIsInByZVRlbXBsYXRlcyIsImNvbHVtbkVudW1zIiwiZm9yRWFjaCIsInB1c2giLCJiYXNlRW51bXMiLCJzb21lIiwiZmlsdGVyRW51bUlkcyIsIkJvb2xlYW4iLCJhbGxFbnVtcyIsIlNldCIsImVudW1JbXBvcnRzIiwiZmxhdE1hcCIsImZrQ29sdW1ucyIsImNvbmZpZ05hbWVzIiwibGVuZ3RoIiwidGl0bGUiLCJjYXBpdGFsUGx1cmFsIiwidHJpbSIsImltcG9ydEtleXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLGdCQUFnQixhQUFhO0FBQ3BDLFNBQVNDLElBQUksUUFBUSxVQUFVO0FBQy9CLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBQ3hCLFNBQVNDLGFBQWEsUUFBZ0MsaUNBQThCO0FBRXBGLFNBQ0VDLHNCQUFzQixFQUN0QkMsNkJBQTZCLEVBQzdCQywwQkFBMEIsUUFDckIsZ0JBQWE7QUFFcEIsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBRXZDLE9BQU8sTUFBTUMsNEJBQTRCRDtJQUN2QyxhQUFjO1FBQ1osS0FBSyxDQUFDO0lBQ1I7SUFFQUUsaUJBQWlCQyxLQUF3QixFQUFFO1FBQ3pDLE9BQU87WUFDTEMsUUFBUTtZQUNSQyxNQUFNLEdBQUdGLE1BQU1HLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDckM7SUFDRjtJQUVTQyxzQkFBdUM7UUFDOUMsT0FBTztZQUFDO1lBQXFCO1NBQWE7SUFDNUM7SUFFQUMsT0FBT0Ms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
|