sonamu 0.13.5 → 0.13.7
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/syncer/syncer.d.ts +4 -1
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +6 -4
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +6 -3
- package/package.json +1 -1
- package/src/syncer/__tests__/http-validator-registry.test.ts +15 -0
- package/src/syncer/syncer.ts +12 -3
- package/src/template/zod-converter.ts +8 -2
package/dist/syncer/syncer.d.ts
CHANGED
|
@@ -59,9 +59,12 @@ export declare class Syncer {
|
|
|
59
59
|
* 변경된 파일들을 타입별로 분류하고 각 타입에 맞는 액션을 실행합니다.
|
|
60
60
|
*
|
|
61
61
|
* @param diffFilePaths - 변경된 파일들의 절대 경로 목록
|
|
62
|
+
* @param options.skipDriftCheck - true이면 처리되지 않은 생성물 변경을 drift로 경고하지 않습니다.
|
|
62
63
|
* @returns diffTypes - 변경된 파일의 타입 목록 (entity, types, model 등)
|
|
63
64
|
*/
|
|
64
|
-
doSyncActions(diffFilePaths: AbsolutePath[]
|
|
65
|
+
doSyncActions(diffFilePaths: AbsolutePath[], { skipDriftCheck }?: {
|
|
66
|
+
skipDriftCheck?: boolean;
|
|
67
|
+
}): Promise<{
|
|
65
68
|
diffTypes: FileType[];
|
|
66
69
|
}>;
|
|
67
70
|
calculateDiffGroups(diffFiles: AbsolutePath[]): Partial<Record<DiffGroupKey, `/${string}`[]>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAOtC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKnD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAItD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOxD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGvF,KAAK,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;AACzC,KAAK,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;AAEhE,qBAAa,MAAM;IACjB,IAAI,EAAE,UAAU,CAAM;IACtB,KAAK,EAAE,WAAW,CAAM;IACxB,MAAM,EAAE,YAAY,CAAM;IAC1B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAa;IACvD,YAAY,EAAE,YAAY,CAAsB;IAEhD;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"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"}
|
package/dist/syncer/syncer.js
CHANGED
|
@@ -59,6 +59,7 @@ var init_syncer = __esmMin((() => {
|
|
|
59
59
|
async sync() {
|
|
60
60
|
await actionCopySharedToTargetsIfNotExists();
|
|
61
61
|
await actionGenerateSsrEntryServerIfNotExists();
|
|
62
|
+
const hasChecksumBaseline = await syncerFileExists(path.join(Sonamu.apiRootPath, "sonamu.lock"));
|
|
62
63
|
const changedFiles = await findChangedFilesUsingChecksums();
|
|
63
64
|
if (changedFiles.length === 0) {
|
|
64
65
|
if (await this.reconcileHttpValidatorRegistry()) await renewChecksums();
|
|
@@ -66,7 +67,7 @@ var init_syncer = __esmMin((() => {
|
|
|
66
67
|
return;
|
|
67
68
|
}
|
|
68
69
|
await runWithGracefulShutdown(async () => {
|
|
69
|
-
await this.doSyncActions(changedFiles);
|
|
70
|
+
await this.doSyncActions(changedFiles, { skipDriftCheck: !hasChecksumBaseline });
|
|
70
71
|
await this.reconcileHttpValidatorRegistry();
|
|
71
72
|
await renewChecksums();
|
|
72
73
|
}, {
|
|
@@ -204,9 +205,10 @@ var init_syncer = __esmMin((() => {
|
|
|
204
205
|
* 변경된 파일들을 타입별로 분류하고 각 타입에 맞는 액션을 실행합니다.
|
|
205
206
|
*
|
|
206
207
|
* @param diffFilePaths - 변경된 파일들의 절대 경로 목록
|
|
208
|
+
* @param options.skipDriftCheck - true이면 처리되지 않은 생성물 변경을 drift로 경고하지 않습니다.
|
|
207
209
|
* @returns diffTypes - 변경된 파일의 타입 목록 (entity, types, model 등)
|
|
208
210
|
*/
|
|
209
|
-
async doSyncActions(diffFilePaths) {
|
|
211
|
+
async doSyncActions(diffFilePaths, { skipDriftCheck = false } = {}) {
|
|
210
212
|
const diffGroups = this.calculateDiffGroups(diffFilePaths);
|
|
211
213
|
const diffTypes = Object.keys(diffGroups);
|
|
212
214
|
const { changeMatches, unhandledPaths, unhandledChangesLeft } = this.changeMatcher(diffTypes, diffGroups);
|
|
@@ -217,7 +219,7 @@ var init_syncer = __esmMin((() => {
|
|
|
217
219
|
if (changeMatches("workflow")) {}
|
|
218
220
|
if (changeMatches("i18n", "entity", "config")) await this.handleSonamuDictionaryRelatedChanges();
|
|
219
221
|
if (changeMatches("entity", "types", "model", "frame", "config", "httpValidatorsGenerated")) await this.handleHttpValidatorRelatedChanges();
|
|
220
|
-
if (unhandledChangesLeft()) await this.handleDrifts(unhandledPaths());
|
|
222
|
+
if (!skipDriftCheck && unhandledChangesLeft()) await this.handleDrifts(unhandledPaths());
|
|
221
223
|
return { diffTypes };
|
|
222
224
|
}
|
|
223
225
|
calculateDiffGroups(diffFiles) {
|
|
@@ -401,4 +403,4 @@ var init_syncer = __esmMin((() => {
|
|
|
401
403
|
init_syncer();
|
|
402
404
|
export { Syncer, init_syncer };
|
|
403
405
|
|
|
404
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLmpzIiwibmFtZXMiOlsiU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVIdHRwVmFsaWRhdG9ycyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWciLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBob3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvaG1yLWhvb2tcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB0eXBlIHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSBcIi4uL3Rhc2tzL2RlY29yYXRvclwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgR2VuZXJhdGVPcHRpb25zLCB0eXBlIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBpc09iamVjdFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXAsIGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgc3luY2VyRmlsZUV4aXN0cywgc3luY2VyRmlsZXN5c3RlbSB9IGZyb20gXCIuL2ZpbGVzeXN0ZW0tZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBsb2FkQXBpcywgbG9hZE1vZGVscywgbG9hZFR5cGVzLCBsb2FkV29ya2Zsb3dzIH0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuaW1wb3J0IHsgdHlwZSBMb2FkZWRBcGlzLCB0eXBlIExvYWRlZE1vZGVscywgdHlwZSBMb2FkZWRUeXBlcyB9IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcbmltcG9ydCAqIGFzIFN5bmNlckFjdGlvbnMgZnJvbSBcIi4vc3luY2VyLWFjdGlvbnNcIjtcblxudHlwZSBEaWZmR3JvdXBLZXkgPSBGaWxlVHlwZSB8IFwidW5rbm93blwiO1xudHlwZSBEaWZmR3JvdXBzID0gUGFydGlhbDxSZWNvcmQ8RGlmZkdyb3VwS2V5LCBBYnNvbHV0ZVBhdGhbXT4+O1xuXG5leHBvcnQgY2xhc3MgU3luY2VyIHtcbiAgYXBpczogTG9hZGVkQXBpcyA9IFtdO1xuICB0eXBlczogTG9hZGVkVHlwZXMgPSB7fTtcbiAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+ID0gbmV3IE1hcCgpO1xuICBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIGRldiDshJzrsoTqsIAg7LKY7J2MIOuWtOydhCDrlYwsIHNvbmFtdSBzeW5jIO2VoCDrlYwg7Iuk7ZaJ65Cp64uI64ukLiDsnbTtm4Tsl5DripQgaG1yQW5kU3luYyDqsr3roZzrpbwg7YOA7JqULlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDstIjquLAg67aA7Yq47Iqk7Yq4656pISDslpjrhKTrk6TsnYAgaWRlbXBvdGVudO2VmOqzoCDqsIDrs43quLAg65WM66y47JeQIOustOyngOyEsSDsi6TtlontlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIOyWmOuEpOuTpOydgCBzb25hbXUubG9ja+yXkCDrk6TslrTqsIDsp4Drj4Qg7JWK6rOgIOuUsOudvOyEnCBITVIg6rK966Gc66W8IO2DgOyngOuPhCDslYrripQg7Lmc6rWs65Ok7J6F64uI64ukLlxuICAgIC8vIOq3uOuemOyEnCDslYTrrLQg65WM64KYIOq3uOuDpSDrj4zroKTso7zrqbQg65CY64qU642wLCBobXJBbmRTeW5j7JeQ7IScIOunpOuyiCDtlZjripQg6rKD7J2AIOuCreu5hOydtOuLiCDsl6zquLDshJwg7ZWcIOuyiOunjCDtlanri4jri6QuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMoKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cygpO1xuXG4gICAgLy8g67CU64CQIOqyg+ydtCDsl4bsnLzrqbQg6re464OlIOuEmOyWtOqwgOyalC5cbiAgICBjb25zdCBjaGFuZ2VkRmlsZXMgPSBhd2FpdCBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTtcbiAgICBpZiAoY2hhbmdlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGF3YWl0IHRoaXMucmVjb25jaWxlSHR0cFZhbGlkYXRvclJlZ2lzdHJ5KCkpIHtcbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChcIkFsbCBmaWxlcyBhcmUgc3luY2VkIVwiKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyXrOq4sOyEnCDsi6TsoJwg7Iux7YGsIOuPmeyekeydhCDsiJjtlontlanri4jri6QuXG4gICAgLy8g64uk66eMIOyLse2BrCDspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveycvOuptCDqvKzsl6zrsoTrpqzquLAg65WM66y47JeQLFxuICAgIC8vIOyLnOq3uOuEkOyXkOuPhCDsnqDsi5wg67KE7Yu4IOyImCDsnojripQg7ZmY6rK9IOyGjeyXkOyEnCDsi7Htgazrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGF3YWl0IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDslpjqsIAg7Iux7YGsIOyekeyXhSDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoY2hhbmdlZEZpbGVzKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKTtcblxuICAgICAgICAvLyDsi7Htgawg7JWh7IWY7J20IOuBneuCmOuptCDtla3sg4Eg7LK07YGs7ISs7J2EIOuLpOyLnCDqsLHsi6Dtlanri4jri6QuXG4gICAgICAgIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gICAgICB9LFxuICAgICAgeyB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLCB3YWl0Rm9yVXBUbzogMjAwMDAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWNvbmNpbGVIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcmVnaXN0cnlQYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgXCJzcmMvYXBwbGljYXRpb24vc29uYW11LnZhbGlkYXRvcnMuZ2VuZXJhdGVkLnRzXCIsXG4gICAgKTtcbiAgICBjb25zdCBwb2xpY3kgPSBTb25hbXUuY29uZmlnLnZhbGlkYXRpb24/LnpvZENvbXBpbGVyO1xuICAgIGNvbnN0IGlzQW90ID0gaXNPYmplY3RWYWx1ZShwb2xpY3kpICYmIHBvbGljeSAhPT0gbnVsbCAmJiBwb2xpY3kuYXBpID09PSBcImFvdFwiO1xuICAgIGlmIChpc0FvdCA9PT0gKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyDrs4Dqsr0g66qp66Gd7J20IHJlZ2lzdHJ5IOyCreygnOulvCDrhpPss5Drj4QgY2hlY2tzdW0g6rCx7IugIOyghOyXkCDsoJXssYXqs7wg7IKw7Lac66y87J2EIOuLpOyLnCDrp57stqXri4jri6QuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBWYWxpZGF0b3JzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICog6rCV7KCcIO2SgC3si7Htgaw6IGxvY2vsnYQg66y07Iuc7ZWY6rOgIOyymOydjOu2gO2EsCDri6Tsi5wg7Iux7YGs7ZWp64uI64ukLlxuICAgKlxuICAgKiAqKuyCrOyaqeyymCoqOiBnaXQgcG9zdC1tZXJnZSBob29rLCBDSSwgZGV2IOyEnOuyhOydmCBgZmAg7ZWr7YKkLlxuICAgKiAqKuyLpO2MqCDslYjsoITshLEqKjog64+E7KSR7JeQIO2UhOuhnOyEuOyKpOqwgCDso73slrQgbG9jayDsl4bripQg7IOB7YOc66GcIOuCqOyVhOuPhCDrrLTtlbQg4oCUIOuLpOydjCBzeW5j7JeQ7IScXG4gICAqIGxvY2sg7JeG7Jy866m0IOyekOyXsOyKpOufveqyjCDtkoAt7Iux7YGs6rCAIO2KuOumrOqxsOuQmOyWtCDsg4ggbG9ja+ydtCDsnpHshLHrkKguXG4gICAqL1xuICBhc3luYyBmb3JjZVN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9ja1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNvbmFtdS5sb2NrXCIpO1xuICAgIGlmIChhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKGxvY2tQYXRoKSkge1xuICAgICAgYXdhaXQgc3luY2VyRmlsZXN5c3RlbS51bmxpbmsobG9ja1BhdGgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVy6rCAIGJhdGNo66GcIOuqqOydgCDrs4Dqsr0g7YyM7J2865Ok7JeQIOuMgO2VtCDtlZwg67KI7J2YIEhNUi9zeW5jIOyCrOydtO2BtOydhCDrj5Xri4jri6QuXG4gICAqXG4gICAqIEhNUuydgCBhcGkvc3JjIOyViOyXkOyEnCDsnbzslrTrgpjripQg66qo65OgIO2MjOydvOuTpOyXkCDrjIDtlbTshJwg7IiY7ZaJ7ZWp64uI64ukLlxuICAgKiBjaGVja3N1bVBhdHRlcm5Hcm91cCDrp6Tsua0g7Jes67aA7JmAIOustOq0gO2VmOqyjCBhcGkvc3JjIOyghOyytCDrjIDsg4HsnoXri4jri6QuXG4gICAqIOqwgOuguSBhcGkvc3JjL3V0aWxzL3N1YnNldC1sb2FkZXJzLnRzIOqwmeydgCDtjIzsnbzrj4Qg67OA6rK965CY66m0IEhNUuydgCDtlbTspI3ri4jri6QuXG4gICAqXG4gICAqIFN5bmPripQgY2hlY2tzdW1QYXR0ZXJuR3JvdXDsnLzroZwg66ek7Lmt65CY64qUIO2MjOydvOuTpOyXkCDrjIDtlbTshJzrp4wg7IiY7ZaJ7ZWp64uI64ukLlxuICAgKiDsl6zquLDsl5DripQgd2ViL3NyY+uCmCBhcHAvc3JjIOqwmeydgCDri6TrpbggdGFyZ2V07J2YIO2MjOydvOydtCDtj6ztlajrkKAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7J2065+wIG5vbi1hcGkg6rK966Gc7J2YIO2MjOydvOuTpOydgCBITVLqs7zripQg7JWE66y0IOyDgeq0gOydtCDsl4bsnLzrr4DroZwsIGludmFsaWRhdGXsnYQg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVFdmVudHMgLSBwYXRoIOKGkiBldmVudCDrp7UuIGV2ZW5064qUIFwiY2hhbmdlXCIgfCBcImFkZFwiLlxuICAgKi9cbiAgYXN5bmMgaG1yQW5kU3luYyhmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBobXJBY3Rpb25SZXF1aXJlZEV2ZW50cyA9IHRoaXMuZXh0cmFjdEhtckFjdGlvblJlcXVpcmVkRmlsZUV2ZW50cyhmaWxlRXZlbnRzKTtcbiAgICBjb25zdCBzeW5jVHJpZ2dlcmluZ1BhdGhzID0gYXdhaXQgdGhpcy5leHRyYWN0U3luY1RyaWdnZXJpbmdGaWxlRXZlbnRQYXRocyhmaWxlRXZlbnRzKTtcblxuICAgIC8vIEhNUiDsmIHsl606IO2MjOydvCDsnbTrsqTtirgg7KSRIGFwaeydmCDrqqjrk4gg6re4656Y7ZSE7JeQIOyeiOuKlCDtjIzsnbzrk6Tsl5Ag64yA7ZWcIOuzgOuPmeydgCBobXJBY3Rpb25SZXF1aXJlZEV2ZW50c+uhnCDsnqHtnpnri4jri6QuXG4gICAgLy8g7J20IOy5nOq1rOuTpOydgCBpbnZhbGlkYXRlIOyymOumrO2VtOykjeuLiOuLpC5cbiAgICAvLyDsnbQg7Zi47Lac7J2AIOyVhOuemCBzeW5j67O064ukIOustOyhsOqxtCDrqLzsoIAg7J287Ja064KY7JW8IO2VqeuLiOuLpCFcbiAgICAvLyDsmZzrg5DtlZjrqbQgc3luY+yXkOyEnOuKlCDrs4Dqsr3rkJwgbW9kZWwg7L2U65Oc66W8IOyDiOuhnCBpbXBvcnTtlbTshJwg7LKY66as7ZW07JW8IO2VmOuKlCDqsr3smrDrj4Qg7J6I6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVEZXBlbmRlbnRzQWZmZWN0ZWRCeUZpbGVFdmVudHMoaG1yQWN0aW9uUmVxdWlyZWRFdmVudHMpO1xuXG4gICAgLy8gU3luYyDsmIHsl606IGNoZWNrc3VtUGF0dGVybkdyb3Vw7JeQIOuqheyLnOuQnCDtjIzsnbzrk6Tsl5Ag64yA7ZWcIOuzgOuPmeydgCBzeW5jVHJpZ2dlcmluZ1BhdGhz66GcIOyeoe2emeuLiOuLpC5cbiAgICAvLyDsnbQg7Lmc6rWs65Ok7J2AIOyggeygiO2VnCBzeW5jIOyekeyXheycvOuhnCDrjIDsnZHtlanri4jri6QuXG4gICAgaWYgKHN5bmNUcmlnZ2VyaW5nUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKHN5bmNUcmlnZ2VyaW5nUGF0aHMpO1xuICAgIH1cblxuICAgIC8vIOyLse2BrCDsnpHsl4XsnbQg64Gd64Ks7Jy866m0IOustOyngOyEsSDroZzrk5zrpbwg7IiY7ZaJ7ZWp64uI64ukLlxuICAgIC8vIOyLse2BrOulvCDslYgg7ZWcIOqyveyasOyXkOuPhCDroZzrk5zripQg7ZW07JW8IO2VtOyalC4g7JyE7JeQ7IScIOq0gOugqOyeiOuKlCDsuZzqtazrk6TsnYAg64ukIGludmFsaWRhdGUg65CY7JeI6rGw65Og7JqUIVxuICAgIC8vXG4gICAgLy8g67OA6rK965CcIO2MjOydvOuTpOyXkCDrjIDtlbTshJwg7IOI66Gt6rKMIOuLueqyqOyYpOuKlChsb2FkKSDtlonsnITripQgZG9TeW5jQWN0aW9uc+yXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgIC8vIGRvU3luY0FjdGlvbnPsl5DshJzripQg7YyM7J287J2EIOydveqzoCDrp4zrk5zripQg7Iux7YGsIO2WieychOunjCDtlanri4jri6QuXG4gICAgLy8g6rGw6riw7IScIOuUsSDrs4Dqsr3rkJwg67aA67aE7JeQIOyYge2Wpeuwm+uKlCBhdXRvbG9hZOunjCDshKDrs4TtlbTshJwg7IiY7ZaJ7ZWY66Ck66m0IOuEiOustCDsp4DsoIDrtoTtlZjqs6Ag67O17J6h7ZW07KeR64uI64ukLlxuICAgIC8vXG4gICAgLy8g7Y287Y+s66i87IqkIOyYge2WpeydgCDrrLTsi5ztlbTrj4Qg7KKL7Iq164uI64ukLlxuICAgIC8vIOyWtOywqO2UvCBobXItaG9va+yXkCDsnZjtlbQgaW52YWxpZGF0ZeuQnCDrtoDrtoTrk6TsnbQg7JWE64uI652866m0IOy6kOyLnCDqt7jrjIDroZwg7Jyg7KeA7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkU3NyUm91dGVzKCk7XG4gICAgYXdhaXQgU29uYW11LnJlZnJlc2hIdHRwVmFsaWRhdG9ycygpO1xuXG4gICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChcIm9uSE1SQ29tcGxldGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG1yQWN0aW9uUmVxdWlyZWRGaWxlRXZlbnRzKFxuICAgIGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPixcbiAgKTogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+IHtcbiAgICBjb25zdCBhcGlTcmMgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiKTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KCk7XG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICBpZiAoIWZpbGVQYXRoLnN0YXJ0c1dpdGgoYXBpU3JjKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5zZXQoZmlsZVBhdGgsIGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXh0cmFjdFN5bmNUcmlnZ2VyaW5nRmlsZUV2ZW50UGF0aHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgY29uc3QgY2hlY2tQYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk7XG4gICAgY29uc3Qgc3luY1RyaWdnZXJpbmdQYXRoczogQWJzb2x1dGVQYXRoW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtkaWZmRmlsZVBhdGhdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIGNvbnN0IGlzSW5DaGVja1BhdHRlcm5Hcm91cCA9IE9iamVjdC52YWx1ZXMoY2hlY2tQYXR0ZXJuR3JvdXApLnNvbWUoKHBhdHRlcm4pID0+XG4gICAgICAgIG1pbmltYXRjaChkaWZmRmlsZVBhdGgsIHBhdHRlcm4pLFxuICAgICAgKTtcbiAgICAgIGlmICghaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc3luY1RyaWdnZXJpbmdQYXRocy5wdXNoKGRpZmZGaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN5bmNUcmlnZ2VyaW5nUGF0aHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGludmFsaWRhdGVEZXBlbmRlbnRzQWZmZWN0ZWRCeUZpbGVFdmVudHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApIHtcbiAgICBmb3IgKGNvbnN0IFtkaWZmRmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICAvLyDrs4Dqsr3rkJwg7YyM7J286rO8IGRlcGVuZGVudCDtjIzsnbzrk6TsnYQgaW52YWxpZGF0ZSDtlanri4jri6QuXG4gICAgICAvLyDtlZwg67KIIOydtOyDgSBpbXBvcnTrkJwg7Lmc6rWs65Ok7JeQIOuMgO2VtOyEnOunjCDsi6TsoJwg7J6R7JeF7J20IOydvOyWtOuCqeuLiOuLpC5cbiAgICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOuKlCBob3QuaW52YWxpZGF0ZUZpbGXsi5wg7LSI6riwIOyXkOufrOqwgCDrsJzsg53tlZjquLAg65WM66y47JeQIGludmFsaWRhdGUg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9XG4gICAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKFxuICAgICAgICAgICAgZGlmZkZpbGVQYXRoLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgKSkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgICAgICAgaWYgKGludmFsaWRhdGVkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBpbnZhbGlkYXRlZFBhdGggb2YgaW52YWxpZGF0ZWRQYXRocykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAgICAgLy8gcmVnaXN0ZXJlZEFwaXPripQg7Ya17Jy866GcIOuLpCDrgqDroKTrsoTrprQg7IiYIOyXhuyKteuLiOuLpC4gcmVnaXN0ZXJlZEFwaXPsl5Ag7Jis65287Jik64qUIOy5nOq1rOuTpOydgCDstIjquLAg66Gc65Oc7IucIOuYkOuKlCBITVLsi5zsl5Drp4wg65Ox66Gd65CY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICAgICAgICAgICAgLy8g65Sw65287IScIG1vZGVsLnRzIO2MjOydvOydmCDrs4Dqsr3snLzroZwg64uk7J2M67KIIOyDiOuhnOyatCBldmFs7J20IOyYiOyDgeuQmOuKlCDsnbQg7Iuc7KCQ7JeQ7ISc66eMLCDsnbQg66qo64247JeQ7IScIOuCmOyYqCByZWdpc3RlcmVkQXBpc+uTpOydhCDsp4Dsm4zspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICAgICAgaWYgKHJlbW92ZWRBcGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoYCh3aXRoICR7cmVtb3ZlZEFwaXMubGVuZ3RofSBBUElzKWApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIGNoYWxrLnJlZChgRmFpbGVkIHRvIHJlbW92ZSBpbnZhbGlkYXRlZCByZWdpc3RlcmVkIEFQSXMgZm9yICR7aW52YWxpZGF0ZWRQYXRofWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBkZXZSdW5uZXIg7Zmc7ISx7ZmUIOyLnCwg67OA6rK965CcIOyGjOyKpCDtjIzsnbzsnYQgVml0ZXN0IOuqqOuTiCDqt7jrnpjtlITsl5DshJzrj4Qg66y07Zqo7ZmU7ZWp64uI64ukLlxuICAgICAgLy8gVml0ZeydmCBtb2R1bGVHcmFwaC5pbnZhbGlkYXRlTW9kdWxlKCnsnbQgaW1wb3J0ZXIg67Cp7Zal7Jy866GcIOyerOq3gOyggSBjYXNjYWRl7ZWY66+A66GcLFxuICAgICAgLy8g7IaM7IqkIO2MjOydvCDtlZjrgpjrp4wg66y07Zqo7ZmU7ZWY66m0IOydtOulvCBpbXBvcnTtlZjripQg7YWM7Iqk7Yq4IO2MjOydvOuPhCDsnpDrj5nsnLzroZwg66y07Zqo7ZmU65Cp64uI64ukLlxuICAgICAgaWYgKCFpc1Rlc3QoKSAmJiBTb25hbXUuY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCAmJiBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlcikge1xuICAgICAgICBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlci5pbnZhbGlkYXRlRmlsZXMoW2RpZmZGaWxlUGF0aF0pO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5kaW0oYFRlc3QgaW52YWxpZGF0ZWQ6ICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGRpZmZGaWxlUGF0aCl9YCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICAvLyDshozsiqQg7L2U65Oc66W8IOuLpOujqOuKlCDsg4HtmansnbTri4ggLnRzIOqyveuhnOuhnCDrtIXri4jri6QuXG4gICAgY29uc3QgaXNNb2RlbCA9IGludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKTtcbiAgICBjb25zdCBpc0ZyYW1lID0gaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLmZyYW1lLnRzXCIpO1xuICAgIGlmICghaXNNb2RlbCAmJiAhaXNGcmFtZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdGFyZ2V0TW9kZWxOYW1lID0gYCR7ZW50aXR5SWR9JHtpc01vZGVsID8gXCJNb2RlbFwiIDogXCJGcmFtZVwifWA7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gdGFyZ2V0TW9kZWxOYW1lKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgY29uc3QgaWR4ID0gcmVnaXN0ZXJlZEFwaXMuaW5kZXhPZihhcGkpO1xuICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRUeXBlcygpIHtcbiAgICB0aGlzLnR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVscyA9IGF3YWl0IGxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkQXBpcygpIHtcbiAgICB0aGlzLmFwaXMgPSBhd2FpdCBsb2FkQXBpcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRXb3JrZmxvd3MoKSB7XG4gICAgdGhpcy53b3JrZmxvd3MgPSBhd2FpdCBsb2FkV29ya2Zsb3dzKCk7XG4gICAgYXdhaXQgU29uYW11LndvcmtmbG93cy5zeW5jaHJvbml6ZSh0aGlzLndvcmtmbG93cyk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFNzclJvdXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzc3JDb25maWdQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmMvc3NyXCIpO1xuXG4gICAgLy8g6riw7KG0IHJvdXRlcyDstIjquLDtmZRcbiAgICBjb25zdCB7IGNsZWFyU1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgY2xlYXJTU1JSb3V0ZXMoKTtcblxuICAgIC8vIHNzciDtj7TrjZQg7JeG7Jy866m0IOyKpO2CtVxuICAgIGlmICghKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoc3NyQ29uZmlnUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3NyIO2PtOuNlCDslYjsnZgg66qo65OgIC50cyDtjIzsnbwg66Gc65OcXG4gICAgY29uc3QgeyBnbG9iQXN5bmMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgaW1wb3J0TWVtYmVycyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZXNtLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgcnVudGltZVBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIik7XG5cbiAgICAvLyBydW50aW1lUGF0aOulvCDsgqzsmqntlZjsl6wg6rCc67CcL+2UhOuhnOuNleyFmCDtmZjqsr3sl5Ag66ee64qUIO2ZleyepeyekCDsspjrpqxcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2JBc3luYyhwYXRoLmpvaW4oc3NyQ29uZmlnUGF0aCwgcnVudGltZVBhdGgoXCIqKi8qLnRzXCIpKSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZWY66m0IO2MjOydvOydmCBzaWRlIGVmZmVjdChyZWdpc3RlclNTUiDtmLjstpwp6rCAIOyLpO2WieuQqFxuICAgICAgICBhd2FpdCBpbXBvcnRNZW1iZXJzKGZpbGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBTU1Igcm91dGU6ICR7ZmlsZX1gLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IEZpbGVUeXBlW10gfT4ge1xuICAgIGNvbnN0IGRpZmZHcm91cHMgPSB0aGlzLmNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVQYXRocyk7XG4gICAgY29uc3QgZGlmZlR5cGVzID1cbiAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gT2JqZWN0LmtleXMoXG4gICAgICAgIGRpZmZHcm91cHMsXG4gICAgICApIGFzIEZpbGVUeXBlW107XG5cbiAgICAvLyDsl6zquLDripQg67OE66GcIOykkeyalO2VnCDtjIztirjripQg7JWE64uZ64uI64ukLlxuICAgIC8vIOyVhOuemOydmCBpZiDsoITqsJzrpbwg6rmU64GU7ZWY6rKMIO2VmOugpOqzoCDrp4zrk6AgRFNMIOqwmeydgCDqsbDrnbzshJwsIOustOyLnO2VmOyFlOuPhCDrkKnri4jri6QuXG4gICAgY29uc3QgeyBjaGFuZ2VNYXRjaGVzLCB1bmhhbmRsZWRQYXRocywgdW5oYW5kbGVkQ2hhbmdlc0xlZnQgfSA9IHRoaXMuY2hhbmdlTWF0Y2hlcihcbiAgICAgIGRpZmZUeXBlcyxcbiAgICAgIGRpZmZHcm91cHMsXG4gICAgKTtcblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwiZW50aXR5XCIsIFwidHlwZXNcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwibW9kZWxcIiwgXCJmcmFtZVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJ0eXBlc1wiLCBcImZ1bmN0aW9uc1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVBdXhpbGlhcnlTeW1ib2xDaGFuZ2VzKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwiY29uZmlnXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUNvbmZpZ0NoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcIndvcmtmbG93XCIpKSB7XG4gICAgICAvLyDrrZAg65Sx7Z6IIOyViCDtlbTsmpQuIOq3uOuemOuPhCDsnbQgaWYg7KGw6rG07J2AIGV2YWzrkJjslrTslbwg7ZWY6riwIOuVjOusuOyXkCDrgqjqsqjrkaHri4jri6Qg44WO44WOXG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJpMThuXCIsIFwiZW50aXR5XCIgLyrroIjsnbTruJQqLywgXCJjb25maWdcIiAvKmRlZmF1bHRMb2NhbGXrk7EqLykpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU29uYW11RGljdGlvbmFyeVJlbGF0ZWRDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJlbnRpdHlcIiwgXCJ0eXBlc1wiLCBcIm1vZGVsXCIsIFwiZnJhbWVcIiwgXCJjb25maWdcIiwgXCJodHRwVmFsaWRhdG9yc0dlbmVyYXRlZFwiKSkge1xuICAgICAgLy8g7IOd7ISx66y8KGh0dHBWYWxpZGF0b3JzR2VuZXJhdGVkKeyXkCDrk5zrpqztlITtirjqsIAg7IOd6ri0IOqyveyasOuPhCDsspjrpqztlanri4jri6QuXG4gICAgICAvLyDri6Trpbgg6rKDIOyViCDrsJTrgIzqs6Ag65SxIGh0dHBWYWxpZGF0b3JzR2VuZXJhdGVk66eMIOuwlOuAkCDqsr3smrDsl5Drj4Qg64+Z65Ox7ZWcIOyymOumrCg966y07KeA7ISxIOyYpO2GoOuhnOuTnCnrpbwg7ZWp64uI64ukLiDqt7jrg6Ug7J2067uQ7ISc7JqUIOOFi1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVIdHRwVmFsaWRhdG9yUmVsYXRlZENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvLyDsnITsl5DshJwg7LKY66asIOyViCDrkJwg67OA6rK965Ok7J20IOyeiOuLpD9cbiAgICAvLyDssrTtgazshKwg6rSA66asIOuMgOyDgeydtOq4tCDtlZzrjbAg7JyE7JeQ7IScIO2VuOuTpOungeydtCDslYgg65CcIOqyg+ydtOudvOuptCDqsrDqta0g7IOd7ISx66y87J6F64uI64ukLlxuICAgIC8vIOydtCDsuZzqtazrk6TsnbQg67OA6rK965CcIOqyg+ydgCBkcmlmdOuhnCDqsITso7ztlbTrj4Qg66eI65WF7ZWp64uI64ukLlxuICAgIGlmICh1bmhhbmRsZWRDaGFuZ2VzTGVmdCgpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZURyaWZ0cyh1bmhhbmRsZWRQYXRocygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pIHtcbiAgICBjb25zdCBwYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cCgpO1xuICAgIGNvbnN0IGZpbGVUeXBlcyA9XG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIE9iamVjdC5rZXlzKFxuICAgICAgICBwYXR0ZXJuR3JvdXAsXG4gICAgICApIGFzIEZpbGVUeXBlW107XG5cbiAgICBjb25zdCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzID0ge307XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBkaWZmRmlsZXMpIHtcbiAgICAgIC8vIOygiOuMgCDqsr3roZzrpbwgYXBwUm9vdCDquLDspIAg7IOB64yAIOqyveuhnOuhnCDrsJTqv5Qg7LK07YGs7ISsIO2MqO2EtOqzvCDruYTqtZDtlZzri6QuXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlVHlwZXMuZmluZCgoY2FuZGlkYXRlKSA9PlxuICAgICAgICBtaW5pbWF0Y2gocmVsYXRpdmVQYXRoLCBwYXR0ZXJuR3JvdXBbY2FuZGlkYXRlXSksXG4gICAgICApO1xuICAgICAgY29uc3QgZ3JvdXBLZXk6IERpZmZHcm91cEtleSA9IHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiLi5cIilcbiAgICAgICAgPyBcInVua25vd25cIlxuICAgICAgICA6IChmaWxlVHlwZSA/PyBcInVua25vd25cIik7XG4gICAgICAoZGlmZkdyb3Vwc1tncm91cEtleV0gPz89IFtdKS5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpZmZHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZU1hdGNoZXIoZGlmZlR5cGVzOiBGaWxlVHlwZVtdLCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKSB7XG4gICAgY29uc3QgaGFuZGxlZCA9IG5ldyBTZXQ8RmlsZVR5cGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiDrs4Dqsr0g7IKs7ZWt7J20IOyduOyekOuhnCDrsJvsnYAgRmlsZVR5cGXrk6Qg7KSRIO2VmOuCmCDsnbTsg4HsnYQg7Y+s7ZWo7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICAgKiDqsIDroLkgW1wiZW50aXR5XCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImVudGl0eVwiKeuKlCB0cnll66W8IOuwmO2ZmO2VmOupsCxcbiAgICAgKiBbXCJ0eXBlc1wiLCBcImkxOG5cIl3snbQg67OA6rK965CcIO2YuOy2nOyXkOyEnCBjaGFuZ2VNYXRjaGVzKFwidHlwZXNcIiwgXCJmdW5jdGlvbnNcIinrj4QgdHJ1ZeulvCDrsJjtmZjtlZjsp4Drp4wsXG4gICAgICogW1wiZnVuY3Rpb25zXCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImZyYW1lXCIp7J2AIGZhbHNl66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKiBAcGFyYW0gdHlwZXNcbiAgICAgKi9cbiAgICBjb25zdCBjaGFuZ2VNYXRjaGVzID0gKC4uLnR5cGVzOiBGaWxlVHlwZVtdKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZyA9IHR5cGVzLmZpbHRlcigodCkgPT4gZGlmZlR5cGVzLmluY2x1ZGVzKHQpKTtcbiAgICAgIG1hdGNoaW5nLmZvckVhY2goKHQpID0+IGhhbmRsZWQuYWRkKHQpKTtcbiAgICAgIHJldHVybiBtYXRjaGluZy5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiDslrTrlqQgY2hhbmdlTWF0Y2hlcyDtmLjstpzsl5Drj4Qg6rG466as7KeAIOyViuydgCBGaWxlVHlwZeuTpOydmCDsi6TsoJwg7YyM7J28IOqyveuhnOulvCDrqqjslYTshJwg67CY7ZmY7ZWp64uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IHVuaGFuZGxlZFBhdGhzID0gKCk6IEFic29sdXRlUGF0aFtdID0+XG4gICAgICBkaWZmVHlwZXMuZmlsdGVyKCh0KSA9PiAhaGFuZGxlZC5oYXModCkpLmZsYXRNYXAoKHQpID0+IGRpZmZHcm91cHNbdF0gPz8gW10pO1xuXG4gICAgLyoqXG4gICAgICogY2hhbmdlTWF0Y2hlcyDtmLjstpzsl5Drj4Qg6rG466as7KeAIOyViuydgCBGaWxlVHlwZeuTpOydtCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IHVuaGFuZGxlZENoYW5nZXNMZWZ0ID0gKCkgPT4gdW5oYW5kbGVkUGF0aHMoKS5sZW5ndGggPiAwO1xuXG4gICAgcmV0dXJuIHsgY2hhbmdlTWF0Y2hlcywgdW5oYW5kbGVkUGF0aHMsIHVuaGFuZGxlZENoYW5nZXNMZWZ0IH07XG4gIH1cblxuICBhc3luYyBoYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWxvYWQoKTtcblxuICAgIC8vIHR5cGVzIOyDneyEsShlbnRpdHkg7IOI66GcIOy2lOqwgOuQnCDqsr3smrApXG4gICAgLy8gcGFyZW50SWTqsIAg7JeG6rOgLCB0eXBlc+qwgCDsl4bripQg6rK97Jqw7JeQ66eMIOyDneyEsVxuICAgIGNvbnN0IGVudGl0eVBhdGggPSBkaWZmR3JvdXBzLmVudGl0eT8uYXQoMCk7XG4gICAgaWYgKGVudGl0eVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoZW50aXR5UGF0aCk7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIO2UhOuhnOygne2KuOyXkCDsg53shLHrkJjslrTslbwg7ZWY64qUIC50cyDtjIzsnbzsnZgg6rK966Gc7J6F64uI64ukLlxuICAgICAgY29uc3QgdHlwZUZpbGVQYXRoID1cbiAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXRoLmpvaW4oXG4gICAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICAgIGBzcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMuZnN9LyR7ZW50aXR5Lm5hbWVzLmZzfS50eXBlcy50c2AsXG4gICAgICAgICkgYXMgQWJzb2x1dGVQYXRoO1xuXG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHR5cGVGaWxlUGF0aCkpKSB7XG4gICAgICAgIC8vICoudHlwZXMudHPqsIAg66eM65Ok7Ja07KeR64uI64ukLlxuICAgICAgICBjb25zdCB0eXBlcyA9IGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMoZW50aXR5SWQpO1xuXG4gICAgICAgIC8vIOq3uOqxuCDtg4Dqsp/sl5Ag6rCW64uk65Gs7JqULlxuICAgICAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0eXBlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+qwgCDrp4zrk6TslrTsp5Hri4jri6QuXG4gICAgY29uc3QgZ2VuZXJhdGVkID0gYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTtcblxuICAgIC8vIOuqqOuToCDqsoPrk6TsnYQgdGFyZ2V07JeQIOuztOuCtOyngOuKlCDslYrsirXri4jri6QuXG4gICAgLy8gc29uYW11LmdlbmVyYXRlZC5zc28udHPripQgc2VydmljZS1zaWRlLW9ubHnri4jquYwg67Cw7KCc7ZWp64uI64ukLlxuICAgIC8vIFRPRE8o67OR7KSAKTog7J20IO2VmOuTnOy9lOuTnOulvCDriITqsIAg7ZW06rKwIOyigCDtlbTso7zshLjsmpQuIOydvOuLqOydgCDqsJDri7kg6rCA64ql7ZWY64uIIOuGlOuRkOqyoOyKteuLiOuLpC4uLlxuICAgIGNvbnN0IGRpc3RyaWJ1dGFibGUgPSBnZW5lcmF0ZWQuZmlsdGVyKChwKSA9PiAhcC5lbmRzV2l0aChcIi5zc28udHNcIikpO1xuXG4gICAgLy8g7J207KCcIOuztOuCvCDqsoPrk6Trp4wgdGFyZ2V07JeQIOuztOuCtOyalC5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyhkaXN0cmlidXRhYmxlKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlc1wiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLnR5cGVz66W8IOyUgeuLiOuLpC5cbiAgICAvLyBzZXJ2aWNlLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci5hcGlz66W8IOyUgeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcblxuICAgIGNvbnN0IHBhcmFtczoge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSA9IG1lcmdlZEdyb3VwLm1hcCgobW9kZWxQYXRoKSA9PiB7XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpIHx8IG1vZGVsUGF0aC5lbmRzV2l0aChcIi5mcmFtZS50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyUXVlcmllcygpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlQXV4aWxpYXJ5U3ltYm9sQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IHRzUGF0aHMgPSB1bmlxdWUoWy4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnVuY3Rpb25zID8/IFtdKV0pO1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHMpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlQ29uZmlnQ2hhbmdlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuSE9UID09PSBcInllc1wiKSB7XG4gICAgICBjb25zdCB7IGxvYWRDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9jb25maWdcIik7XG4gICAgICBTb25hbXUuY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhTb25hbXUuYXBpUm9vdFBhdGgpO1xuICAgIH1cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWcoKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVNvbmFtdURpY3Rpb25hcnlSZWxhdGVkQ2hhbmdlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5KCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVIdHRwVmFsaWRhdG9yUmVsYXRlZENoYW5nZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBWYWxpZGF0b3JzKCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEcmlmdHMoZHJpZnRzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChkcmlmdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBcIuKaoO+4jyBTb25hbXXqsIAg7J6Q64+ZIOyDneyEse2VnCDtjIzsnbzsl5Ag64yA7ZWcIOuzgOqyveydtCDqsJDsp4DrkJjsl4jsirXri4jri6QuIO2MjOydvOydtCBTb25hbXUgd2F0Y2hlciDsmbjrtoDsl5DshJwg67OA6rK965CcIOqyg+ycvOuhnCDstpTsoJXrkKnri4jri6QuXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBwIG9mIGRyaWZ0cykge1xuICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgICAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIHApfWApKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKGNoYWxrLmRpbShcIiAg4oaSIGBwbnBtIHNvbmFtdSBzeW5jIC0tZm9yY2Vg66W8IOq2jOyepe2VqeuLiOuLpC5cIikpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtO1xuICAgIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+PiB7XG4gICAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFRlbXBsYXRlS2V5Lm9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnVtc0tleXMgPSBPYmplY3Qua2V5cyhlbnVtcykuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBuYW1lcy5jb25zdGFudCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVkdWNlQXN5bmMoXG4gICAgICBrZXlzLFxuICAgICAgYXN5bmMgKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHRwbCA9IFRlbXBsYXRlTWFuYWdlci5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwidmlld19lbnVtc1wiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKGVudW1zS2V5cywgYXN5bmMgKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMsIGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke2NvbXBvbmVudElkfWBdID0gYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHt9IGFzIFJlY29yZDxcbiAgICAgICAgYCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCxcbiAgICAgICAgYm9vbGVhblxuICAgICAgPixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FVa0QsZ0JBQUE7Q0FDWixZQUFBO0NBQ2tCLG9CQUFBO0NBRWxCLFdBQUE7Q0FFd0Isc0JBQUE7Q0FFbEIsV0FBQTtDQUVnQixpQkFBQTtDQUNWLGtCQUFBO0NBQ04sZ0JBQUE7Q0FFb0IsbUJBQUE7Q0FDVixtQkFBQTtDQUNxQixjQUFBO0NBQ1Isb0JBQUE7Q0FDTix1QkFBQTtDQUNtQyxtQkFBQTtDQUVsQiw2QkFBQTtDQUNFLG1CQUFBO0NBRS9CLG9CQUFBO0NBS3BDLFNBQWIsTUFBb0I7RUFDbEIsT0FBbUIsQ0FBQztFQUNwQixRQUFxQixDQUFDO0VBQ3RCLFNBQXVCLENBQUM7RUFDeEIsNEJBQTZDLElBQUksSUFBSTtFQUNyRCxlQUE2QixJQUFJLGFBQWE7Ozs7OztFQU85QyxNQUFNLE9BQXNCO0dBSTFCLE1BQU1BLHFDQUFtRDtHQUN6RCxNQUFNQyx3Q0FBc0Q7R0FHNUQsTUFBTSxlQUFlLE1BQU0sK0JBQStCO0dBQzFELElBQUksYUFBYSxXQUFXLEdBQUc7SUFDN0IsSUFBSSxNQUFNLEtBQUssK0JBQStCLEdBQzVDLE1BQU0sZUFBZTtJQUV2QixRQUFRLElBQUksTUFBTSxNQUFNLFFBQVEsV0FBVyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3BFO0dBQ0Y7R0FLQSxNQUFNLHdCQUNKLFlBQVk7SUFFVixNQUFNLEtBQUssY0FBYyxZQUFZO0lBQ3JDLE1BQU0sS0FBSywrQkFBK0I7SUFHMUMsTUFBTSxlQUFlO0dBQ3ZCLEdBQ0E7SUFBRSxpQkFBaUI7SUFBVyxhQUFhO0dBQU0sQ0FD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
|
|
406
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLmpzIiwibmFtZXMiOlsiU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVIdHRwVmFsaWRhdG9ycyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWciLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBob3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvaG1yLWhvb2tcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB0eXBlIHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSBcIi4uL3Rhc2tzL2RlY29yYXRvclwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgR2VuZXJhdGVPcHRpb25zLCB0eXBlIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBpc09iamVjdFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXAsIGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgc3luY2VyRmlsZUV4aXN0cywgc3luY2VyRmlsZXN5c3RlbSB9IGZyb20gXCIuL2ZpbGVzeXN0ZW0tZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBsb2FkQXBpcywgbG9hZE1vZGVscywgbG9hZFR5cGVzLCBsb2FkV29ya2Zsb3dzIH0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuaW1wb3J0IHsgdHlwZSBMb2FkZWRBcGlzLCB0eXBlIExvYWRlZE1vZGVscywgdHlwZSBMb2FkZWRUeXBlcyB9IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcbmltcG9ydCAqIGFzIFN5bmNlckFjdGlvbnMgZnJvbSBcIi4vc3luY2VyLWFjdGlvbnNcIjtcblxudHlwZSBEaWZmR3JvdXBLZXkgPSBGaWxlVHlwZSB8IFwidW5rbm93blwiO1xudHlwZSBEaWZmR3JvdXBzID0gUGFydGlhbDxSZWNvcmQ8RGlmZkdyb3VwS2V5LCBBYnNvbHV0ZVBhdGhbXT4+O1xuXG5leHBvcnQgY2xhc3MgU3luY2VyIHtcbiAgYXBpczogTG9hZGVkQXBpcyA9IFtdO1xuICB0eXBlczogTG9hZGVkVHlwZXMgPSB7fTtcbiAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+ID0gbmV3IE1hcCgpO1xuICBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIGRldiDshJzrsoTqsIAg7LKY7J2MIOuWtOydhCDrlYwsIHNvbmFtdSBzeW5jIO2VoCDrlYwg7Iuk7ZaJ65Cp64uI64ukLiDsnbTtm4Tsl5DripQgaG1yQW5kU3luYyDqsr3roZzrpbwg7YOA7JqULlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDstIjquLAg67aA7Yq47Iqk7Yq4656pISDslpjrhKTrk6TsnYAgaWRlbXBvdGVudO2VmOqzoCDqsIDrs43quLAg65WM66y47JeQIOustOyngOyEsSDsi6TtlontlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIOyWmOuEpOuTpOydgCBzb25hbXUubG9ja+yXkCDrk6TslrTqsIDsp4Drj4Qg7JWK6rOgIOuUsOudvOyEnCBITVIg6rK966Gc66W8IO2DgOyngOuPhCDslYrripQg7Lmc6rWs65Ok7J6F64uI64ukLlxuICAgIC8vIOq3uOuemOyEnCDslYTrrLQg65WM64KYIOq3uOuDpSDrj4zroKTso7zrqbQg65CY64qU642wLCBobXJBbmRTeW5j7JeQ7IScIOunpOuyiCDtlZjripQg6rKD7J2AIOuCreu5hOydtOuLiCDsl6zquLDshJwg7ZWcIOuyiOunjCDtlanri4jri6QuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMoKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cygpO1xuXG4gICAgLy8gbG9ja+ydtCDsl4bsnLzrqbQg67mE6rWQIOq4sOykgOydtCDsl4bslrQg66qo65OgIO2MjOydvOydtCDrs4Dqsr3snLzroZwg7J6h7Z6I66+A66GcLCDsg53shLHrrLwgZHJpZnTrpbwg7YyQ7KCV7ZWgIOyImCDsl4bsirXri4jri6QuXG4gICAgY29uc3QgaGFzQ2hlY2tzdW1CYXNlbGluZSA9IGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoXG4gICAgICBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNvbmFtdS5sb2NrXCIpLFxuICAgICk7XG5cbiAgICAvLyDrsJTrgJAg6rKD7J20IOyXhuycvOuptCDqt7jrg6Ug64SY7Ja06rCA7JqULlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5yZWNvbmNpbGVIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKSkge1xuICAgICAgICBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KFwiQWxsIGZpbGVzIGFyZSBzeW5jZWQhXCIpKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7Jes6riw7IScIOyLpOygnCDsi7Htgawg64+Z7J6R7J2EIOyImO2Wie2VqeuLiOuLpC5cbiAgICAvLyDri6Trp4wg7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMsIHsgc2tpcERyaWZ0Q2hlY2s6ICFoYXNDaGVja3N1bUJhc2VsaW5lIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLnJlY29uY2lsZUh0dHBWYWxpZGF0b3JSZWdpc3RyeSgpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY29uY2lsZUh0dHBWYWxpZGF0b3JSZWdpc3RyeSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZWdpc3RyeVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICBcInNyYy9hcHBsaWNhdGlvbi9zb25hbXUudmFsaWRhdG9ycy5nZW5lcmF0ZWQudHNcIixcbiAgICApO1xuICAgIGNvbnN0IHBvbGljeSA9IFNvbmFtdS5jb25maWcudmFsaWRhdGlvbj8uem9kQ29tcGlsZXI7XG4gICAgY29uc3QgaXNBb3QgPSBpc09iamVjdFZhbHVlKHBvbGljeSkgJiYgcG9saWN5ICE9PSBudWxsICYmIHBvbGljeS5hcGkgPT09IFwiYW90XCI7XG4gICAgaWYgKGlzQW90ID09PSAoYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhyZWdpc3RyeVBhdGgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIOuzgOqyvSDrqqnroZ3snbQgcmVnaXN0cnkg7IKt7KCc66W8IOuGk+yzkOuPhCBjaGVja3N1bSDqsLHsi6Ag7KCE7JeQIOygleyxheqzvCDsgrDstpzrrLzsnYQg64uk7IucIOunnuy2peuLiOuLpC5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlSHR0cFZhbGlkYXRvcnMoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDqsJXsoJwg7ZKALeyLse2BrDogbG9ja+ydhCDrrLTsi5ztlZjqs6Ag7LKY7J2M67aA7YSwIOuLpOyLnCDsi7Htgaztlanri4jri6QuXG4gICAqXG4gICAqICoq7IKs7Jqp7LKYKio6IGdpdCBwb3N0LW1lcmdlIGhvb2ssIENJLCBkZXYg7ISc67KE7J2YIGBmYCDtlavtgqQuXG4gICAqICoq7Iuk7YyoIOyViOyghOyEsSoqOiDrj4TspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveyWtCBsb2NrIOyXhuuKlCDsg4Htg5zroZwg64Ko7JWE64+EIOustO2VtCDigJQg64uk7J2MIHN5bmPsl5DshJxcbiAgICogbG9jayDsl4bsnLzrqbQg7J6Q7Jew7Iqk65+96rKMIO2SgC3si7HtgazqsIAg7Yq466as6rGw65CY7Ja0IOyDiCBsb2Nr7J20IOyekeyEseuQqC5cbiAgICovXG4gIGFzeW5jIGZvcmNlU3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic29uYW11LmxvY2tcIik7XG4gICAgaWYgKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMobG9ja1BhdGgpKSB7XG4gICAgICBhd2FpdCBzeW5jZXJGaWxlc3lzdGVtLnVubGluayhsb2NrUGF0aCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAgYmF0Y2jroZwg66qo7J2AIOuzgOqyvSDtjIzsnbzrk6Tsl5Ag64yA7ZW0IO2VnCDrsojsnZggSE1SL3N5bmMg7IKs7J207YG07J2EIOuPleuLiOuLpC5cbiAgICpcbiAgICogSE1S7J2AIGFwaS9zcmMg7JWI7JeQ7IScIOydvOyWtOuCmOuKlCDrqqjrk6Ag7YyM7J2865Ok7JeQIOuMgO2VtOyEnCDsiJjtlontlanri4jri6QuXG4gICAqIGNoZWNrc3VtUGF0dGVybkdyb3VwIOunpOy5rSDsl6zrtoDsmYAg66y06rSA7ZWY6rKMIGFwaS9zcmMg7KCE7LK0IOuMgOyDgeyeheuLiOuLpC5cbiAgICog6rCA66C5IGFwaS9zcmMvdXRpbHMvc3Vic2V0LWxvYWRlcnMudHMg6rCZ7J2AIO2MjOydvOuPhCDrs4Dqsr3rkJjrqbQgSE1S7J2AIO2VtOykjeuLiOuLpC5cbiAgICpcbiAgICogU3luY+uKlCBjaGVja3N1bVBhdHRlcm5Hcm91cOycvOuhnCDrp6Tsua3rkJjripQg7YyM7J2865Ok7JeQIOuMgO2VtOyEnOunjCDsiJjtlontlanri4jri6QuXG4gICAqIOyXrOq4sOyXkOuKlCB3ZWIvc3Jj64KYIGFwcC9zcmMg6rCZ7J2AIOuLpOuluCB0YXJnZXTsnZgg7YyM7J287J20IO2PrO2VqOuQoCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDsnbTrn7Agbm9uLWFwaSDqsr3roZzsnZgg7YyM7J2865Ok7J2AIEhNUuqzvOuKlCDslYTrrLQg7IOB6rSA7J20IOyXhuycvOuvgOuhnCwgaW52YWxpZGF0ZeydhCDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZUV2ZW50cyAtIHBhdGgg4oaSIGV2ZW50IOuntS4gZXZlbnTripQgXCJjaGFuZ2VcIiB8IFwiYWRkXCIuXG4gICAqL1xuICBhc3luYyBobXJBbmRTeW5jKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhtckFjdGlvblJlcXVpcmVkRXZlbnRzID0gdGhpcy5leHRyYWN0SG1yQWN0aW9uUmVxdWlyZWRGaWxlRXZlbnRzKGZpbGVFdmVudHMpO1xuICAgIGNvbnN0IHN5bmNUcmlnZ2VyaW5nUGF0aHMgPSBhd2FpdCB0aGlzLmV4dHJhY3RTeW5jVHJpZ2dlcmluZ0ZpbGVFdmVudFBhdGhzKGZpbGVFdmVudHMpO1xuXG4gICAgLy8gSE1SIOyYgeyXrTog7YyM7J28IOydtOuypO2KuCDspJEgYXBp7J2YIOuqqOuTiCDqt7jrnpjtlITsl5Ag7J6I64qUIO2MjOydvOuTpOyXkCDrjIDtlZwg67OA64+Z7J2AIGhtckFjdGlvblJlcXVpcmVkRXZlbnRz66GcIOyeoe2emeuLiOuLpC5cbiAgICAvLyDsnbQg7Lmc6rWs65Ok7J2AIGludmFsaWRhdGUg7LKY66as7ZW07KSN64uI64ukLlxuICAgIC8vIOydtCDtmLjstpzsnYAg7JWE656YIHN5bmPrs7Tri6Qg66y07KGw6rG0IOuovOyggCDsnbzslrTrgpjslbwg7ZWp64uI64ukIVxuICAgIC8vIOyZnOuDkO2VmOuptCBzeW5j7JeQ7ISc64qUIOuzgOqyveuQnCBtb2RlbCDsvZTrk5zrpbwg7IOI66GcIGltcG9ydO2VtOyEnCDsspjrpqztlbTslbwg7ZWY64qUIOqyveyasOuPhCDsnojquLAg65WM66y47J6F64uI64ukLlxuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZURlcGVuZGVudHNBZmZlY3RlZEJ5RmlsZUV2ZW50cyhobXJBY3Rpb25SZXF1aXJlZEV2ZW50cyk7XG5cbiAgICAvLyBTeW5jIOyYgeyXrTogY2hlY2tzdW1QYXR0ZXJuR3JvdXDsl5Ag66qF7Iuc65CcIO2MjOydvOuTpOyXkCDrjIDtlZwg67OA64+Z7J2AIHN5bmNUcmlnZ2VyaW5nUGF0aHProZwg7J6h7Z6Z64uI64ukLlxuICAgIC8vIOydtCDsuZzqtazrk6TsnYAg7KCB7KCI7ZWcIHN5bmMg7J6R7JeF7Jy866GcIOuMgOydke2VqeuLiOuLpC5cbiAgICBpZiAoc3luY1RyaWdnZXJpbmdQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoc3luY1RyaWdnZXJpbmdQYXRocyk7XG4gICAgfVxuXG4gICAgLy8g7Iux7YGsIOyekeyXheydtCDrgZ3rgqzsnLzrqbQg66y07KeA7ISxIOuhnOuTnOulvCDsiJjtlontlanri4jri6QuXG4gICAgLy8g7Iux7YGs66W8IOyViCDtlZwg6rK97Jqw7JeQ64+EIOuhnOuTnOuKlCDtlbTslbwg7ZW07JqULiDsnITsl5DshJwg6rSA66Co7J6I64qUIOy5nOq1rOuTpOydgCDri6QgaW52YWxpZGF0ZSDrkJjsl4jqsbDrk6DsmpQhXG4gICAgLy9cbiAgICAvLyDrs4Dqsr3rkJwg7YyM7J2865Ok7JeQIOuMgO2VtOyEnCDsg4jroa3qsowg64u56rKo7Jik64qUKGxvYWQpIO2WieychOuKlCBkb1N5bmNBY3Rpb25z7JeQ7IScIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgLy8gZG9TeW5jQWN0aW9uc+yXkOyEnOuKlCDtjIzsnbzsnYQg7J296rOgIOunjOuTnOuKlCDsi7Htgawg7ZaJ7JyE66eMIO2VqeuLiOuLpC5cbiAgICAvLyDqsbDquLDshJwg65SxIOuzgOqyveuQnCDrtoDrtoTsl5Ag7JiB7Zal67Cb64qUIGF1dG9sb2Fk66eMIOyEoOuzhO2VtOyEnCDsiJjtlontlZjroKTrqbQg64SI66y0IOyngOyggOu2hO2VmOqzoCDrs7XsnqHtlbTsp5Hri4jri6QuXG4gICAgLy9cbiAgICAvLyDtjbztj6zrqLzsiqQg7JiB7Zal7J2AIOustOyLnO2VtOuPhCDsoovsirXri4jri6QuXG4gICAgLy8g7Ja07LCo7ZS8IGhtci1ob29r7JeQIOydmO2VtCBpbnZhbGlkYXRl65CcIOu2gOu2hOuTpOydtCDslYTri4jrnbzrqbQg7LqQ7IucIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRTc3JSb3V0ZXMoKTtcbiAgICBhd2FpdCBTb25hbXUucmVmcmVzaEh0dHBWYWxpZGF0b3JzKCk7XG5cbiAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwib25ITVJDb21wbGV0ZWRcIik7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RIbXJBY3Rpb25SZXF1aXJlZEZpbGVFdmVudHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4ge1xuICAgIGNvbnN0IGFwaVNyYyA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4oKTtcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZXZlbnRdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIGlmICghZmlsZVBhdGguc3RhcnRzV2l0aChhcGlTcmMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnNldChmaWxlUGF0aCwgZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleHRyYWN0U3luY1RyaWdnZXJpbmdGaWxlRXZlbnRQYXRocyhcbiAgICBmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4sXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICBjb25zdCBjaGVja1BhdHRlcm5Hcm91cCA9IGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKTtcbiAgICBjb25zdCBzeW5jVHJpZ2dlcmluZ1BhdGhzOiBBYnNvbHV0ZVBhdGhbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2RpZmZGaWxlUGF0aF0gb2YgZmlsZUV2ZW50cykge1xuICAgICAgY29uc3QgaXNJbkNoZWNrUGF0dGVybkdyb3VwID0gT2JqZWN0LnZhbHVlcyhjaGVja1BhdHRlcm5Hcm91cCkuc29tZSgocGF0dGVybikgPT5cbiAgICAgICAgbWluaW1hdGNoKGRpZmZGaWxlUGF0aCwgcGF0dGVybiksXG4gICAgICApO1xuICAgICAgaWYgKCFpc0luQ2hlY2tQYXR0ZXJuR3JvdXApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzeW5jVHJpZ2dlcmluZ1BhdGhzLnB1c2goZGlmZkZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3luY1RyaWdnZXJpbmdQYXRocztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW52YWxpZGF0ZURlcGVuZGVudHNBZmZlY3RlZEJ5RmlsZUV2ZW50cyhcbiAgICBmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4sXG4gICkge1xuICAgIGZvciAoY29uc3QgW2RpZmZGaWxlUGF0aCwgZXZlbnRdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIC8vIOuzgOqyveuQnCDtjIzsnbzqs7wgZGVwZW5kZW50IO2MjOydvOuTpOydhCBpbnZhbGlkYXRlIO2VqeuLiOuLpC5cbiAgICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgICAgLy8g6re465+s64uIIOyViOyLrO2VmOqzoCBpbnZhbGlkYXRlIO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIGhvdC5pbnZhbGlkYXRlRmlsZeyLnCDstIjquLAg7JeQ65+s6rCAIOuwnOyDne2VmOq4sCDrlYzrrLjsl5AgaW52YWxpZGF0ZSDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgICBjb25zdCBpbnZhbGlkYXRlZFBhdGhzID1cbiAgICAgICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoXG4gICAgICAgICAgICBkaWZmRmlsZVBhdGgsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICApKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICAgICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChg8J+UhCBJbnZhbGlkYXRlZDpgKSk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGludmFsaWRhdGVkUGF0aCBvZiBpbnZhbGlkYXRlZFBhdGhzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyDrp4zslb0gbW9kZWwudHMg7YyM7J287J20IOuzgOqyvShpbnZhbGlkYXRlKeuQmOyXiOuLpD8g6re465+s66m0IHJlZ2lzdGVyZWRBcGlzIOykkeyXkOyEnCDsnbQg66qo64247JeQIO2VtOuLue2VmOuKlCBhcGnrk6TsnYAg7KeA7JuM7KSY7JqULlxuICAgICAgICAgICAgICAvLyByZWdpc3RlcmVkQXBpc+uKlCDthrXsnLzroZwg64ukIOuCoOugpOuyhOumtCDsiJgg7JeG7Iq164uI64ukLiByZWdpc3RlcmVkQXBpc+yXkCDsmKzrnbzsmKTripQg7Lmc6rWs65Ok7J2AIOy0iOq4sCDroZzrk5zsi5wg65iQ64qUIEhNUuyLnOyXkOunjCDrk7HroZ3rkJjquLAg65WM66y47J6F64uI64ukLlxuICAgICAgICAgICAgICAvLyDrlLDrnbzshJwgbW9kZWwudHMg7YyM7J287J2YIOuzgOqyveycvOuhnCDri6TsnYzrsogg7IOI66Gc7Jq0IGV2YWzsnbQg7JiI7IOB65CY64qUIOydtCDsi5zsoJDsl5DshJzrp4wsIOydtCDrqqjrjbjsl5DshJwg64KY7JioIHJlZ2lzdGVyZWRBcGlz65Ok7J2EIOyngOybjOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAgICAgICBjb25zdCByZW1vdmVkQXBpcyA9IHRoaXMucmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhpbnZhbGlkYXRlZFBhdGgpO1xuICAgICAgICAgICAgICBpZiAocmVtb3ZlZEFwaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApLFxuICAgICAgICAgICAgICAgICAgY2hhbGsuZ3JheShgKHdpdGggJHtyZW1vdmVkQXBpcy5sZW5ndGh9IEFQSXMpYCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgY2hhbGsucmVkKGBGYWlsZWQgdG8gcmVtb3ZlIGludmFsaWRhdGVkIHJlZ2lzdGVyZWQgQVBJcyBmb3IgJHtpbnZhbGlkYXRlZFBhdGh9YCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGRldlJ1bm5lciDtmZzshLHtmZQg7IucLCDrs4Dqsr3rkJwg7IaM7IqkIO2MjOydvOydhCBWaXRlc3Qg66qo65OIIOq3uOuemO2UhOyXkOyEnOuPhCDrrLTtmqjtmZTtlanri4jri6QuXG4gICAgICAvLyBWaXRl7J2YIG1vZHVsZUdyYXBoLmludmFsaWRhdGVNb2R1bGUoKeydtCBpbXBvcnRlciDrsKntlqXsnLzroZwg7J6s6reA7KCBIGNhc2NhZGXtlZjrr4DroZwsXG4gICAgICAvLyDshozsiqQg7YyM7J28IO2VmOuCmOunjCDrrLTtmqjtmZTtlZjrqbQg7J2066W8IGltcG9ydO2VmOuKlCDthYzsiqTtirgg7YyM7J2864+EIOyekOuPmeycvOuhnCDrrLTtmqjtmZTrkKnri4jri6QuXG4gICAgICBpZiAoIWlzVGVzdCgpICYmIFNvbmFtdS5jb25maWcudGVzdD8uZGV2UnVubmVyPy5lbmFibGVkICYmIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyKSB7XG4gICAgICAgIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyLmludmFsaWRhdGVGaWxlcyhbZGlmZkZpbGVQYXRoXSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmRpbShgVGVzdCBpbnZhbGlkYXRlZDogJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgZGlmZkZpbGVQYXRoKX1gKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKFxuICAgIGludmFsaWRhdGVkUGF0aDogQWJzb2x1dGVQYXRoLFxuICApOiAodHlwZW9mIHJlZ2lzdGVyZWRBcGlzKVtudW1iZXJdW10ge1xuICAgIC8vIOyGjOyKpCDsvZTrk5zrpbwg64uk66Oo64qUIOyDge2ZqeydtOuLiCAudHMg6rK966Gc66GcIOu0heuLiOuLpC5cbiAgICBjb25zdCBpc01vZGVsID0gaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpO1xuICAgIGNvbnN0IGlzRnJhbWUgPSBpbnZhbGlkYXRlZFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIik7XG4gICAgaWYgKCFpc01vZGVsICYmICFpc0ZyYW1lKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICBjb25zdCB0YXJnZXRNb2RlbE5hbWUgPSBgJHtlbnRpdHlJZH0ke2lzTW9kZWwgPyBcIk1vZGVsXCIgOiBcIkZyYW1lXCJ9YDtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSB0YXJnZXRNb2RlbE5hbWUpO1xuICAgIGZvciAoY29uc3QgYXBpIG9mIHRvUmVtb3ZlKSB7XG4gICAgICBjb25zdCBpZHggPSByZWdpc3RlcmVkQXBpcy5pbmRleE9mKGFwaSk7XG4gICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICByZWdpc3RlcmVkQXBpcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9SZW1vdmU7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFR5cGVzKCkge1xuICAgIHRoaXMudHlwZXMgPSBhd2FpdCBsb2FkVHlwZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkTW9kZWxzKCkge1xuICAgIHRoaXMubW9kZWxzID0gYXdhaXQgbG9hZE1vZGVscygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRBcGlzKCkge1xuICAgIHRoaXMuYXBpcyA9IGF3YWl0IGxvYWRBcGlzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFdvcmtmbG93cygpIHtcbiAgICB0aGlzLndvcmtmbG93cyA9IGF3YWl0IGxvYWRXb3JrZmxvd3MoKTtcbiAgICBhd2FpdCBTb25hbXUud29ya2Zsb3dzLnN5bmNocm9uaXplKHRoaXMud29ya2Zsb3dzKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkU3NyUm91dGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNzckNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyYy9zc3JcIik7XG5cbiAgICAvLyDquLDsobQgcm91dGVzIOy0iOq4sO2ZlFxuICAgIGNvbnN0IHsgY2xlYXJTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICBjbGVhclNTUlJvdXRlcygpO1xuXG4gICAgLy8gc3NyIO2PtOuNlCDsl4bsnLzrqbQg7Iqk7YK1XG4gICAgaWYgKCEoYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhzc3JDb25maWdQYXRoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzc3Ig7Y+0642UIOyViOydmCDrqqjrk6AgLnRzIO2MjOydvCDroZzrk5xcbiAgICBjb25zdCB7IGdsb2JBc3luYyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIik7XG4gICAgY29uc3QgeyBpbXBvcnRNZW1iZXJzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9lc20tdXRpbHNcIik7XG4gICAgY29uc3QgeyBydW50aW1lUGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiKTtcblxuICAgIC8vIHJ1bnRpbWVQYXRo66W8IOyCrOyaqe2VmOyXrCDqsJzrsJwv7ZSE66Gc642V7IWYIO2ZmOqyveyXkCDrp57ripQg7ZmV7J6l7J6QIOyymOumrFxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYkFzeW5jKHBhdGguam9pbihzc3JDb25maWdQYXRoLCBydW50aW1lUGF0aChcIioqLyoudHNcIikpKTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlZjrqbQg7YyM7J287J2YIHNpZGUgZWZmZWN0KHJlZ2lzdGVyU1NSIO2YuOy2nCnqsIAg7Iuk7ZaJ65CoXG4gICAgICAgIGF3YWl0IGltcG9ydE1lbWJlcnMoZmlsZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBsb2FkIFNTUiByb3V0ZTogJHtmaWxlfWAsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDsi6TsoJwg7Iux7YGs66W8IOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAqIOuzgOqyveuQnCDtjIzsnbzrk6TsnYQg7YOA7J6F67OE66GcIOu2hOulmO2VmOqzoCDqsIEg7YOA7J6F7JeQIOunnuuKlCDslaHshZjsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRocyAtIOuzgOqyveuQnCDtjIzsnbzrk6TsnZgg7KCI64yAIOqyveuhnCDrqqnroZ1cbiAgICogQHBhcmFtIG9wdGlvbnMuc2tpcERyaWZ0Q2hlY2sgLSB0cnVl7J2066m0IOyymOumrOuQmOyngCDslYrsnYAg7IOd7ISx66y8IOuzgOqyveydhCBkcmlmdOuhnCDqsr3qs6DtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgKiBAcmV0dXJucyBkaWZmVHlwZXMgLSDrs4Dqsr3rkJwg7YyM7J287J2YIO2DgOyehSDrqqnroZ0gKGVudGl0eSwgdHlwZXMsIG1vZGVsIOuTsSlcbiAgICovXG4gIGFzeW5jIGRvU3luY0FjdGlvbnMoXG4gICAgZGlmZkZpbGVQYXRoczogQWJzb2x1dGVQYXRoW10sXG4gICAgeyBza2lwRHJpZnRDaGVjayA9IGZhbHNlIH06IHsgc2tpcERyaWZ0Q2hlY2s/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogUHJvbWlzZTx7IGRpZmZUeXBlczogRmlsZVR5cGVbXSB9PiB7XG4gICAgY29uc3QgZGlmZkdyb3VwcyA9IHRoaXMuY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZVBhdGhzKTtcbiAgICBjb25zdCBkaWZmVHlwZXMgPVxuICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBPYmplY3Qua2V5cyhcbiAgICAgICAgZGlmZkdyb3VwcyxcbiAgICAgICkgYXMgRmlsZVR5cGVbXTtcblxuICAgIC8vIOyXrOq4sOuKlCDrs4TroZwg7KSR7JqU7ZWcIO2MjO2KuOuKlCDslYTri5nri4jri6QuXG4gICAgLy8g7JWE656Y7J2YIGlmIOyghOqwnOulvCDquZTrgZTtlZjqsowg7ZWY66Ck6rOgIOunjOuToCBEU0wg6rCZ7J2AIOqxsOudvOyEnCwg66y07Iuc7ZWY7IWU64+EIOuQqeuLiOuLpC5cbiAgICBjb25zdCB7IGNoYW5nZU1hdGNoZXMsIHVuaGFuZGxlZFBhdGhzLCB1bmhhbmRsZWRDaGFuZ2VzTGVmdCB9ID0gdGhpcy5jaGFuZ2VNYXRjaGVyKFxuICAgICAgZGlmZlR5cGVzLFxuICAgICAgZGlmZkdyb3VwcyxcbiAgICApO1xuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJlbnRpdHlcIiwgXCJ0eXBlc1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJtb2RlbFwiLCBcImZyYW1lXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlcyhkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcInR5cGVzXCIsIFwiZnVuY3Rpb25zXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJjb25maWdcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29uZmlnQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwid29ya2Zsb3dcIikpIHtcbiAgICAgIC8vIOutkCDrlLHtnogg7JWIIO2VtOyalC4g6re4656Y64+EIOydtCBpZiDsobDqsbTsnYAgZXZhbOuQmOyWtOyVvCDtlZjquLAg65WM66y47JeQIOuCqOqyqOuRoeuLiOuLpCDjhY7jhY5cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcImkxOG5cIiwgXCJlbnRpdHlcIiAvKuugiOydtOu4lCovLCBcImNvbmZpZ1wiIC8qZGVmYXVsdExvY2FsZeuTsSovKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTb25hbXVEaWN0aW9uYXJ5UmVsYXRlZENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcImVudGl0eVwiLCBcInR5cGVzXCIsIFwibW9kZWxcIiwgXCJmcmFtZVwiLCBcImNvbmZpZ1wiLCBcImh0dHBWYWxpZGF0b3JzR2VuZXJhdGVkXCIpKSB7XG4gICAgICAvLyDsg53shLHrrLwoaHR0cFZhbGlkYXRvcnNHZW5lcmF0ZWQp7JeQIOuTnOumrO2UhO2KuOqwgCDsg53quLQg6rK97Jqw64+EIOyymOumrO2VqeuLiOuLpC5cbiAgICAgIC8vIOuLpOuluCDqsoMg7JWIIOuwlOuAjOqzoCDrlLEgaHR0cFZhbGlkYXRvcnNHZW5lcmF0ZWTrp4wg67CU64CQIOqyveyasOyXkOuPhCDrj5nrk7HtlZwg7LKY66asKD3rrLTsp4DshLEg7Jik7Yag66Gc65OcKeulvCDtlanri4jri6QuIOq3uOuDpSDsnbTru5DshJzsmpQg44WLXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUh0dHBWYWxpZGF0b3JSZWxhdGVkQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8vIOychOyXkOyEnCDsspjrpqwg7JWIIOuQnCDrs4Dqsr3rk6TsnbQg7J6I64ukP1xuICAgIC8vIOyytO2BrOyErCDqtIDrpqwg64yA7IOB7J206ri0IO2VnOuNsCDsnITsl5DshJwg7ZW465Ok66eB7J20IOyViCDrkJwg6rKD7J20652866m0IOqysOq1rSDsg53shLHrrLzsnoXri4jri6QuXG4gICAgLy8g7J20IOy5nOq1rOuTpOydtCDrs4Dqsr3rkJwg6rKD7J2AIGRyaWZ066GcIOqwhOyjvO2VtOuPhCDrp4jrlYXtlanri4jri6QuXG4gICAgaWYgKCFza2lwRHJpZnRDaGVjayAmJiB1bmhhbmRsZWRDaGFuZ2VzTGVmdCgpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZURyaWZ0cyh1bmhhbmRsZWRQYXRocygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pIHtcbiAgICBjb25zdCBwYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cCgpO1xuICAgIGNvbnN0IGZpbGVUeXBlcyA9XG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIE9iamVjdC5rZXlzKFxuICAgICAgICBwYXR0ZXJuR3JvdXAsXG4gICAgICApIGFzIEZpbGVUeXBlW107XG5cbiAgICBjb25zdCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzID0ge307XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBkaWZmRmlsZXMpIHtcbiAgICAgIC8vIOygiOuMgCDqsr3roZzrpbwgYXBwUm9vdCDquLDspIAg7IOB64yAIOqyveuhnOuhnCDrsJTqv5Qg7LK07YGs7ISsIO2MqO2EtOqzvCDruYTqtZDtlZzri6QuXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlVHlwZXMuZmluZCgoY2FuZGlkYXRlKSA9PlxuICAgICAgICBtaW5pbWF0Y2gocmVsYXRpdmVQYXRoLCBwYXR0ZXJuR3JvdXBbY2FuZGlkYXRlXSksXG4gICAgICApO1xuICAgICAgY29uc3QgZ3JvdXBLZXk6IERpZmZHcm91cEtleSA9IHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiLi5cIilcbiAgICAgICAgPyBcInVua25vd25cIlxuICAgICAgICA6IChmaWxlVHlwZSA/PyBcInVua25vd25cIik7XG4gICAgICAoZGlmZkdyb3Vwc1tncm91cEtleV0gPz89IFtdKS5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpZmZHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZU1hdGNoZXIoZGlmZlR5cGVzOiBGaWxlVHlwZVtdLCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKSB7XG4gICAgY29uc3QgaGFuZGxlZCA9IG5ldyBTZXQ8RmlsZVR5cGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiDrs4Dqsr0g7IKs7ZWt7J20IOyduOyekOuhnCDrsJvsnYAgRmlsZVR5cGXrk6Qg7KSRIO2VmOuCmCDsnbTsg4HsnYQg7Y+s7ZWo7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICAgKiDqsIDroLkgW1wiZW50aXR5XCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImVudGl0eVwiKeuKlCB0cnll66W8IOuwmO2ZmO2VmOupsCxcbiAgICAgKiBbXCJ0eXBlc1wiLCBcImkxOG5cIl3snbQg67OA6rK965CcIO2YuOy2nOyXkOyEnCBjaGFuZ2VNYXRjaGVzKFwidHlwZXNcIiwgXCJmdW5jdGlvbnNcIinrj4QgdHJ1ZeulvCDrsJjtmZjtlZjsp4Drp4wsXG4gICAgICogW1wiZnVuY3Rpb25zXCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImZyYW1lXCIp7J2AIGZhbHNl66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKiBAcGFyYW0gdHlwZXNcbiAgICAgKi9cbiAgICBjb25zdCBjaGFuZ2VNYXRjaGVzID0gKC4uLnR5cGVzOiBGaWxlVHlwZVtdKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZyA9IHR5cGVzLmZpbHRlcigodCkgPT4gZGlmZlR5cGVzLmluY2x1ZGVzKHQpKTtcbiAgICAgIG1hdGNoaW5nLmZvckVhY2goKHQpID0+IGhhbmRsZWQuYWRkKHQpKTtcbiAgICAgIHJldHVybiBtYXRjaGluZy5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiDslrTrlqQgY2hhbmdlTWF0Y2hlcyDtmLjstpzsl5Drj4Qg6rG466as7KeAIOyViuydgCBGaWxlVHlwZeuTpOydmCDsi6TsoJwg7YyM7J28IOqyveuhnOulvCDrqqjslYTshJwg67CY7ZmY7ZWp64uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IHVuaGFuZGxlZFBhdGhzID0gKCk6IEFic29sdXRlUGF0aFtdID0+XG4gICAgICBkaWZmVHlwZXMuZmlsdGVyKCh0KSA9PiAhaGFuZGxlZC5oYXModCkpLmZsYXRNYXAoKHQpID0+IGRpZmZHcm91cHNbdF0gPz8gW10pO1xuXG4gICAgLyoqXG4gICAgICogY2hhbmdlTWF0Y2hlcyDtmLjstpzsl5Drj4Qg6rG466as7KeAIOyViuydgCBGaWxlVHlwZeuTpOydtCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IHVuaGFuZGxlZENoYW5nZXNMZWZ0ID0gKCkgPT4gdW5oYW5kbGVkUGF0aHMoKS5sZW5ndGggPiAwO1xuXG4gICAgcmV0dXJuIHsgY2hhbmdlTWF0Y2hlcywgdW5oYW5kbGVkUGF0aHMsIHVuaGFuZGxlZENoYW5nZXNMZWZ0IH07XG4gIH1cblxuICBhc3luYyBoYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWxvYWQoKTtcblxuICAgIC8vIHR5cGVzIOyDneyEsShlbnRpdHkg7IOI66GcIOy2lOqwgOuQnCDqsr3smrApXG4gICAgLy8gcGFyZW50SWTqsIAg7JeG6rOgLCB0eXBlc+qwgCDsl4bripQg6rK97Jqw7JeQ66eMIOyDneyEsVxuICAgIGNvbnN0IGVudGl0eVBhdGggPSBkaWZmR3JvdXBzLmVudGl0eT8uYXQoMCk7XG4gICAgaWYgKGVudGl0eVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoZW50aXR5UGF0aCk7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIO2UhOuhnOygne2KuOyXkCDsg53shLHrkJjslrTslbwg7ZWY64qUIC50cyDtjIzsnbzsnZgg6rK966Gc7J6F64uI64ukLlxuICAgICAgY29uc3QgdHlwZUZpbGVQYXRoID1cbiAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXRoLmpvaW4oXG4gICAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICAgIGBzcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMuZnN9LyR7ZW50aXR5Lm5hbWVzLmZzfS50eXBlcy50c2AsXG4gICAgICAgICkgYXMgQWJzb2x1dGVQYXRoO1xuXG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHR5cGVGaWxlUGF0aCkpKSB7XG4gICAgICAgIC8vICoudHlwZXMudHPqsIAg66eM65Ok7Ja07KeR64uI64ukLlxuICAgICAgICBjb25zdCB0eXBlcyA9IGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMoZW50aXR5SWQpO1xuXG4gICAgICAgIC8vIOq3uOqxuCDtg4Dqsp/sl5Ag6rCW64uk65Gs7JqULlxuICAgICAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0eXBlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+qwgCDrp4zrk6TslrTsp5Hri4jri6QuXG4gICAgY29uc3QgZ2VuZXJhdGVkID0gYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTtcblxuICAgIC8vIOuqqOuToCDqsoPrk6TsnYQgdGFyZ2V07JeQIOuztOuCtOyngOuKlCDslYrsirXri4jri6QuXG4gICAgLy8gc29uYW11LmdlbmVyYXRlZC5zc28udHPripQgc2VydmljZS1zaWRlLW9ubHnri4jquYwg67Cw7KCc7ZWp64uI64ukLlxuICAgIC8vIFRPRE8o67OR7KSAKTog7J20IO2VmOuTnOy9lOuTnOulvCDriITqsIAg7ZW06rKwIOyigCDtlbTso7zshLjsmpQuIOydvOuLqOydgCDqsJDri7kg6rCA64ql7ZWY64uIIOuGlOuRkOqyoOyKteuLiOuLpC4uLlxuICAgIGNvbnN0IGRpc3RyaWJ1dGFibGUgPSBnZW5lcmF0ZWQuZmlsdGVyKChwKSA9PiAhcC5lbmRzV2l0aChcIi5zc28udHNcIikpO1xuXG4gICAgLy8g7J207KCcIOuztOuCvCDqsoPrk6Trp4wgdGFyZ2V07JeQIOuztOuCtOyalC5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyhkaXN0cmlidXRhYmxlKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlc1wiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLnR5cGVz66W8IOyUgeuLiOuLpC5cbiAgICAvLyBzZXJ2aWNlLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci5hcGlz66W8IOyUgeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcblxuICAgIGNvbnN0IHBhcmFtczoge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSA9IG1lcmdlZEdyb3VwLm1hcCgobW9kZWxQYXRoKSA9PiB7XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpIHx8IG1vZGVsUGF0aC5lbmRzV2l0aChcIi5mcmFtZS50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyUXVlcmllcygpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlQXV4aWxpYXJ5U3ltYm9sQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IHRzUGF0aHMgPSB1bmlxdWUoWy4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnVuY3Rpb25zID8/IFtdKV0pO1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHMpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlQ29uZmlnQ2hhbmdlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuSE9UID09PSBcInllc1wiKSB7XG4gICAgICBjb25zdCB7IGxvYWRDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9jb25maWdcIik7XG4gICAgICBTb25hbXUuY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhTb25hbXUuYXBpUm9vdFBhdGgpO1xuICAgIH1cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWcoKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVNvbmFtdURpY3Rpb25hcnlSZWxhdGVkQ2hhbmdlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5KCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVIdHRwVmFsaWRhdG9yUmVsYXRlZENoYW5nZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBWYWxpZGF0b3JzKCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEcmlmdHMoZHJpZnRzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChkcmlmdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBcIuKaoO+4jyBTb25hbXXqsIAg7J6Q64+ZIOyDneyEse2VnCDtjIzsnbzsl5Ag64yA7ZWcIOuzgOqyveydtCDqsJDsp4DrkJjsl4jsirXri4jri6QuIO2MjOydvOydtCBTb25hbXUgd2F0Y2hlciDsmbjrtoDsl5DshJwg67OA6rK965CcIOqyg+ycvOuhnCDstpTsoJXrkKnri4jri6QuXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBwIG9mIGRyaWZ0cykge1xuICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgICAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIHApfWApKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKGNoYWxrLmRpbShcIiAg4oaSIGBwbnBtIHNvbmFtdSBzeW5jIC0tZm9yY2Vg66W8IOq2jOyepe2VqeuLiOuLpC5cIikpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtO1xuICAgIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+PiB7XG4gICAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFRlbXBsYXRlS2V5Lm9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnVtc0tleXMgPSBPYmplY3Qua2V5cyhlbnVtcykuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBuYW1lcy5jb25zdGFudCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVkdWNlQXN5bmMoXG4gICAgICBrZXlzLFxuICAgICAgYXN5bmMgKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHRwbCA9IFRlbXBsYXRlTWFuYWdlci5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwidmlld19lbnVtc1wiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKGVudW1zS2V5cywgYXN5bmMgKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMsIGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke2NvbXBvbmVudElkfWBdID0gYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHt9IGFzIFJlY29yZDxcbiAgICAgICAgYCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCxcbiAgICAgICAgYm9vbGVhblxuICAgICAgPixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FVa0QsZ0JBQUE7Q0FDWixZQUFBO0NBQ2tCLG9CQUFBO0NBRWxCLFdBQUE7Q0FFd0Isc0JBQUE7Q0FFbEIsV0FBQTtDQUVnQixpQkFBQTtDQUNWLGtCQUFBO0NBQ04sZ0JBQUE7Q0FFb0IsbUJBQUE7Q0FDVixtQkFBQTtDQUNxQixjQUFBO0NB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoCxB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,gBAAgB,CAAC;AAexB;;GAEG;AACH,eAAO,MAAM,cAAc;aACzB,UAAU;iBACR,MAAM;iBACN,UAAU,EAAE,iBAAiB;iBAC7B,UAAU,EAAE,kBAAkB;;aAEhC,cAAc;iBACZ,MAAM;iBACN,UAAU,EAAE,uBAAuB;iBACnC,UAAU,EAAE,uBAAuB;;CAE7B,CAAC;AAqGX;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CA8B7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAsG3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0HrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoCxB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,gBAAgB,CAAC;AAexB;;GAEG;AACH,eAAO,MAAM,cAAc;aACzB,UAAU;iBACR,MAAM;iBACN,UAAU,EAAE,iBAAiB;iBAC7B,UAAU,EAAE,kBAAkB;;aAEhC,cAAc;iBACZ,MAAM;iBACN,UAAU,EAAE,uBAAuB;iBACnC,UAAU,EAAE,uBAAuB;;CAE7B,CAAC;AAqGX;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CA8B7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAsG3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0HrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CAwHxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAE,MAAM,EAAO,GAAG,MAAM,CAwJvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,CAAC,UAAU,EACrB,OAAO,GAAE,MAAe,GACvB,aAAa,CAiGf"}
|
|
@@ -259,7 +259,10 @@ function zodTypeToTsTypeDef(zt) {
|
|
|
259
259
|
case "default": return zodTypeToTsTypeDef(zt.def.innerType);
|
|
260
260
|
case "record": {
|
|
261
261
|
const recordType = zt;
|
|
262
|
-
|
|
262
|
+
const keyType = zodTypeToTsTypeDef(recordType.def.keyType);
|
|
263
|
+
const valueType = zodTypeToTsTypeDef(recordType.def.valueType);
|
|
264
|
+
if (recordType.def.partial) return `Partial<Record<${keyType}, ${valueType}>>`;
|
|
265
|
+
return `{ [ key: ${keyType} ]: ${valueType}}`;
|
|
263
266
|
}
|
|
264
267
|
case "literal": return Array.from(zt.values).map((value) => {
|
|
265
268
|
if (isStringValue(value)) return `"${value}"`;
|
|
@@ -322,7 +325,7 @@ function zodTypeToZodCode(zt, injectImportKeys = []) {
|
|
|
322
325
|
}
|
|
323
326
|
case "record": {
|
|
324
327
|
const zRecordDef = zt.def;
|
|
325
|
-
return `z.record(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(zRecordDef.valueType, injectImportKeys)})`;
|
|
328
|
+
return `z.${zRecordDef.partial ? "partialRecord" : "record"}(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(zRecordDef.valueType, injectImportKeys)})`;
|
|
326
329
|
}
|
|
327
330
|
case "literal": {
|
|
328
331
|
const items = Array.from(zt.values).map((value) => {
|
|
@@ -479,4 +482,4 @@ var init_zod_converter = __esmMin((() => {
|
|
|
479
482
|
init_zod_converter();
|
|
480
483
|
export { BUILT_IN_TYPES, getZodTypeById, init_zod_converter, propNodeToZodTypeDef, propToZodType, propToZodTypeDef, zodTypeToRenderingNode, zodTypeToTsTypeDef, zodTypeToZodCode };
|
|
481
484
|
|
|
482
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvem9kLWNvbnZlcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsO1xuXG4vKipcbiAqIOuCtOyepSDtg4DsnoUg7KCV7J2YIChab2Qg7Iqk7YKk66eIICsgVUkg66CM642U66eBIO2DgOyehSlcbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxUX0lOX1RZUEVTID0ge1xuICBTb25hbXVGaWxlOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlU2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlU2NoZW1hXCIsXG4gIH0sXG4gIFwiU29uYW11RmlsZVtdXCI6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCIsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRCdWlsdEluU2NoZW1hTmFtZSh6b2RUeXBlOiB6LlpvZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkID0gT2JqZWN0LmVudHJpZXMoQlVJTFRfSU5fVFlQRVMpLmZpbmQoKFt0eXBlSWRdKSA9PiB6b2RUeXBlLmRlc2NyaXB0aW9uID09PSB0eXBlSWQpO1xuICByZXR1cm4gbWF0Y2hlZD8uWzFdLnNjaGVtYU5hbWU7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJpc29EYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRlKClcIjtcbiAgICBjYXNlIFwiaXNvVGltZVwiOlxuICAgICAgcmV0dXJuIFwiei5pc28udGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRldGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0R1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kdXJhdGlvbigpXCI7XG4gICAgY2FzZSBcImhhc2hNZDVcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwibWQ1XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMVwiKSc7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMjU2XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTM4NFwiOlxuICAgICAgcmV0dXJuICd6Lmhhc2goXCJzaGEzODRcIiknO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gJ3ouaGFzaChcInNoYTUxMlwiKSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG4gIH1cbn1cblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9UeXBlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogei5ab2RUeXBlIHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiB6LmVtYWlsKCk7XG4gICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIHJldHVybiB6LnV1aWQoKTtcbiAgICBjYXNlIFwidXJsXCI6XG4gICAgICByZXR1cm4gei51cmwoKTtcbiAgICBjYXNlIFwiaHR0cFVybFwiOlxuICAgICAgcmV0dXJuIHouaHR0cFVybCgpO1xuICAgIGNhc2UgXCJob3N0bmFtZVwiOlxuICAgICAgcmV0dXJuIHouaG9zdG5hbWUoKTtcbiAgICBjYXNlIFwiZW1vamlcIjpcbiAgICAgIHJldHVybiB6LmVtb2ppKCk7XG4gICAgY2FzZSBcImJhc2U2NFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0KCk7XG4gICAgY2FzZSBcImJhc2U2NHVybFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0dXJsKCk7XG4gICAgY2FzZSBcImhleFwiOlxuICAgICAgcmV0dXJuIHouaGV4KCk7XG4gICAgY2FzZSBcImp3dFwiOlxuICAgICAgcmV0dXJuIHouand0KCk7XG4gICAgY2FzZSBcIm5hbm9pZFwiOlxuICAgICAgcmV0dXJuIHoubmFub2lkKCk7XG4gICAgY2FzZSBcImN1aWRcIjpcbiAgICAgIHJldHVybiB6LmN1aWQoKTtcbiAgICBjYXNlIFwiY3VpZDJcIjpcbiAgICAgIHJldHVybiB6LmN1aWQyKCk7XG4gICAgY2FzZSBcInVsaWRcIjpcbiAgICAgIHJldHVybiB6LnVsaWQoKTtcbiAgICBjYXNlIFwiaXB2NFwiOlxuICAgICAgcmV0dXJuIHouaXB2NCgpO1xuICAgIGNhc2UgXCJpcHY2XCI6XG4gICAgICByZXR1cm4gei5pcHY2KCk7XG4gICAgY2FzZSBcIm1hY1wiOlxuICAgICAgcmV0dXJuIHoubWFjKCk7XG4gICAgY2FzZSBcImNpZHJ2NFwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY0KCk7XG4gICAgY2FzZSBcImNpZHJ2NlwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY2KCk7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIGNhc2UgXCJoYXNoTWQ1XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwibWQ1XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTFcIik7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEyNTZcIik7XG4gICAgY2FzZSBcImhhc2hTaGEzODRcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEzODRcIik7XG4gICAgY2FzZSBcImhhc2hTaGE1MTJcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGE1MTJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXVxuICAgICkuaW5jbHVkZXMoem9kVHlwZUlkKVxuICApIHtcbiAgICBjb25zdCBidWlsdEluVHlwZSA9XG4gICAgICBCVUlMVF9JTl9UWVBFU1tcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXG4gICAgICBdO1xuICAgIGlmICghYnVpbHRJblR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg64K07J6lIO2DgOyehSAke3pvZFR5cGVJZH3snZgg7Iqk7YKk66eI6rCAIOygleydmOuQmOyngCDslYrslZjsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0SW5UeXBlLnNjaGVtYS5kZXNjcmliZSh6b2RUeXBlSWQpO1xuICB9XG5cbiAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoUg64+Z7KCBIOuhnOuTnFxuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgKTtcbiAgY29uc3QgaW1wb3J0VXJsID0gY3JlYXRlSW1wb3J0VXJsKG1vZHVsZUFic1BhdGgpO1xuICBjb25zdCBpbXBvcnRlZCA9IGF3YWl0IGltcG9ydChpbXBvcnRVcmwpO1xuXG4gIGlmICghaW1wb3J0ZWRbem9kVHlwZUlkXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB6b2RUeXBlSWQgJHt6b2RUeXBlSWR9YCk7XG4gIH1cbiAgcmV0dXJuIGltcG9ydGVkW3pvZFR5cGVJZF0uZGVzY3JpYmUoem9kVHlwZUlkKTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIHByb3DsnZgg7YOA7J6F7JeQIOuUsOudvCDsoIHsoIjtlZwgWm9kIHZhbGlkYXRvcuulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlKHByb3A6IEVudGl0eVByb3ApOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBsZXQgem9kVHlwZTogei5ab2RUeXBlQW55ID0gei51bmtub3duKCk7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSAoYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCkpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICB6b2RUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIHpvZFR5cGUpIHtcbiAgICAgICAgem9kVHlwZSA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGxldCBlbGVtZW50VHlwZTogei5ab2RUeXBlO1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gZWxlbWVudFR5cGUpIHtcbiAgICAgICAgZWxlbWVudFR5cGUgPVxuICAgICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZWxlbWVudFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgICApLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gICAgem9kVHlwZSA9IGVsZW1lbnRUeXBlLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH1cbiAgICApLnVuc2lnbmVkXG4gICkge1xuICAgIHpvZFR5cGUgPSAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgIHpvZFR5cGUgYXMgei5ab2ROdW1iZXJcbiAgICApLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0uYXJyYXkoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIC8vIOuCtOyepSDtg4DsnoXsnbgg6rK97JqwIOyKpO2CpOuniCDsnbTrpoTsnLzroZwg67OA7ZmYXG4gICAgaWYgKFxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgICApLmluY2x1ZGVzKHByb3AuaWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzY2hlbWFOYW1lID0gcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlXCIgPyBcIlNvbmFtdUZpbGVTY2hlbWFcIiA6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCI7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtzY2hlbWFOYW1lfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goc2NoZW1hTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKFxuICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgcHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9XG4gICAgKS51bnNpZ25lZFxuICApIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgLy8gbnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIG51bGxhYmxlIOydtO2bhOyXkCBtZXRhIOy2lOqwgCAo66mU7YOA642w7J207YSw6rCAIOy1nOyDgeychCDroIjrsqjsl5Ag7J6I7Ja07JW8IO2VqClcbiAgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCArPSAnLm1ldGEoeyBTb25hbXVQcm9wVHlwZTogXCJudW1lcmljXCIgfSknO1xuICB9XG5cbiAgcmV0dXJuIGAke3N0bXR9LGA7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcE5vZGXrpbwgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBwbGFpbiwgYXJyYXksIG9iamVjdCDrhbjrk5wg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCDsspjrpqztlZjsl6wg7KSR7LKpIOq1rOyhsOulvCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZURlZihwcm9wTm9kZS5wcm9wLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5hcnJheSh6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgXCJ9KSksXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIGB9KSR7cHJvcE5vZGUucHJvcD8ubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiRGF0ZVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZERlZmF1bHRcbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIHJldHVybiBgeyBbIGtleTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSl9IF06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLnZhbHVlVHlwZSl9fWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgei5ab2RMaXRlcmFsXG4gICAgICAgICkudmFsdWVzLFxuICAgICAgKVxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiB8IFwiKTtcbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgJHtcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kVW5pb25cbiAgICAgICAgKS5vcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB6b2RUeXBlVG9Uc1R5cGVEZWYob3B0aW9uKSlcbiAgICAgICAgICAuam9pbihcIiB8IFwiKVxuICAgICAgfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZEVudW0pLm9wdGlvbnMubWFwKCh2YWwpID0+IGBcIiR7dmFsfVwiYCkuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2RBcnJheSkuZWxlbWVudCl9W11gO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgb2JqZWN0RmllbGRzID0gLyogU0FGRVRZOiBab2TsnZggb2JqZWN0IO2MkOuzhCDrtoTquLDqsIAg6rCd7LK0IO2VhOuTnCDqs4Tslb3snYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHp0IGFzIEFueVpvZE9iamVjdFxuICAgICAgKVtcInNoYXBlXCJdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKG9iamVjdEZpZWxkcykubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAob2JqZWN0RmllbGRzW2tleV0uZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX0/OiAke3pvZFR5cGVUb1RzVHlwZURlZihvYmplY3RGaWVsZHNba2V5XS5kZWYuaW5uZXJUeXBlKX0sYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX06ICR7em9kVHlwZVRvVHNUeXBlRGVmKG9iamVjdEZpZWxkc1trZXldKX0sYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKX0gfCB1bmRlZmluZWRgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWxcbiAgICAgICkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbOydgCBzdHJpbmfsnLzroZwg7Y+067CxXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgLy8g66as7YSw65+0IOqwkiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUocGFydCkpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cGFydH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgaXNPYmplY3RWYWx1ZShwYXJ0KSAmJiBwYXJ0IGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVRvVHNUeXBlRGVmKFxuICAgICAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXJ0IGFzIHouWm9kVHlwZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBgJFxceyR7aW5uZXJUeXBlfX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBgXFwke3N0cmluZ31gO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgXFxgJHtwYXJ0cy5qb2luKFwiXCIpfVxcYGA7XG4gICAgfVxuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gXCJGaWxlXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgYnVpbHRJblNjaGVtYU5hbWUgPSBnZXRCdWlsdEluU2NoZW1hTmFtZSh6dCk7XG4gIGlmIChidWlsdEluU2NoZW1hTmFtZSkge1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChidWlsdEluU2NoZW1hTmFtZSk7XG4gICAgcmV0dXJuIGJ1aWx0SW5TY2hlbWFOYW1lO1xuICB9XG5cbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ubnVsbGFibGUoKWA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjoge1xuICAgICAgY29uc3QgekRlZmF1bHREZWYgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyBBbnlab2REZWZhdWx0XG4gICAgICAgICkuZGVmO1xuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0uZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYDtcbiAgICB9XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID1cbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kUmVjb3JkXG4gICAgICAgICkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGUsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSlgO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kTGl0ZXJhbDxzdHJpbmcgfCBudW1iZXI+XG4gICAgICAgICkudmFsdWVzLFxuICAgICAgKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGB6LnVuaW9uKFske1xuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyBBbnlab2RVbmlvblxuICAgICAgICApLmRlZi5vcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uOiB6LlpvZFR5cGUpID0+IHpvZFR5cGVUb1pvZENvZGUob3B0aW9uLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgICAuam9pbihcIixcIilcbiAgICAgIH1dKWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIC8vIE5PVEU6IHouZW51bShbXCJBXCIsIFwiQlwiXSnrj4Qgei5lbnVtKHsgQTogXCJBXCIsIEI6IFwiQlwiIH0p66GcIOyymOumrOuQqC5cbiAgICAgIHJldHVybiBgei5lbnVtKHske09iamVjdC5lbnRyaWVzKFxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyB6LlpvZEVudW1cbiAgICAgICAgKS5kZWYuZW50cmllcyxcbiAgICAgIClcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsXSkgPT4gKGlzU3RyaW5nVmFsdWUodmFsKSA/IGAke2tleX06IFwiJHt2YWx9XCJgIDogYCR7a2V5fTogJHt2YWx9YCkpXG4gICAgICAgIC5qb2luKFwiLCBcIil9fSlgO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGB6LmFycmF5KCR7em9kVHlwZVRvWm9kQ29kZSgvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZEFycmF5PHouWm9kVHlwZT4pLmRlZi5lbGVtZW50LCBpbmplY3RJbXBvcnRLZXlzKX0pYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IG9iamVjdEZpZWxkcyA9IC8qIFNBRkVUWTogWm9k7J2YIG9iamVjdCDtjJDrs4Qg67aE6riw6rCAIOqwneyytCDtlYTrk5wg6rOE7JW97J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RPYmplY3RcbiAgICAgIClbXCJzaGFwZVwiXTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhvYmplY3RGaWVsZHMpLm1hcChcbiAgICAgICAgICAoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUob2JqZWN0RmllbGRzW2tleV0sIGluamVjdEltcG9ydEtleXMpfSxgLFxuICAgICAgICApLFxuICAgICAgICBcIn0pXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoenQgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ub3B0aW9uYWwoKWA7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBgei5maWxlKClgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWxcbiAgICAgICkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbFxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJ6LnRlbXBsYXRlTGl0ZXJhbChbXSlcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgICAgICBpZiAoaXNTdHJpbmdWYWx1ZShwYXJ0KSkge1xuICAgICAgICAgIHJldHVybiBgXCIke3BhcnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIGlzT2JqZWN0VmFsdWUocGFydCkgJiYgcGFydCBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIHJldHVybiB6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXJ0IGFzIHouWm9kVHlwZSxcbiAgICAgICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGB6LnRlbXBsYXRlTGl0ZXJhbChbJHtwYXJ0cy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwiaW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIGNvbnN0IHpJbnRlcnNlY3Rpb25EZWYgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyB6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGUsIHouWm9kVHlwZT5cbiAgICAgICAgKS5kZWY7XG4gICAgICByZXR1cm4gYHouaW50ZXJzZWN0aW9uKCR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgekludGVyc2VjdGlvbkRlZi5sZWZ0LFxuICAgICAgICBpbmplY3RJbXBvcnRLZXlzLFxuICAgICAgKX0sICR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLnJpZ2h0LCBpbmplY3RJbXBvcnRLZXlzKX0pYDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyerOq3gOyggeycvOuhnCDspJHssqnrkJwg7YOA7J6F65Ok7J2EIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gIHpvZFR5cGU6IHouWm9kVHlwZUFueSxcbiAgYmFzZUtleTogc3RyaW5nID0gXCJyb290XCIsXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG5cbiAgLyoqXG4gICAqIOy8gOydtOyKpCDsspjrpqwg7Iic7IScXG4gICAqXG4gICAqIDEuIO2KueyImCDsvIDsnbTsiqQgKGRlc2NyaXB0aW9uIOq4sOuwmClcbiAgICogICAgLSBTb25hbXVGaWxlL1NvbmFtdUZpbGVbXSA6IHoub2JqZWN0L3ouYXJyYXnsnbTsp4Drp4wg7YyM7J28IOyXheuhnOuTnOyaqSDrgrTsnqUg7YOA7J6FXG4gICAqXG4gICAqIDIuIOydvOuwmCDsvIDsnbTsiqQgKGluc3RhbmNlb2Yg6riw67CYKVxuICAgKiAgICAtIHouWm9kT2JqZWN0IDog7J2867CYIOqwneyytFxuICAgKiAgICAtIHouWm9kQXJyYXkgOiDsnbzrsJgg67Cw7Je0XG4gICAqICAgICAgLSB2ZWN0b3IgOiB6LmFycmF5KHoubnVtYmVyKeydtOyngOunjCDrhKTsnbTrsI0g6riw67CY7Jy866GcIOuyoe2EsCDsnoTrsqDrlKlcbiAgICogICAgICAtIOydvOuwmCDrsLDsl7QgOiDqt7gg7Jm4XG4gICAqICAgIC0gei5ab2RVbmlvbiwgei5ab2RPcHRpb25hbCwgei5ab2ROdWxsYWJsZSA6IOycoO2LuOumrO2LsCDtg4DsnoVcbiAgICogICAgLSDquLDtg4AgOiByZXNvbHZlUmVuZGVyVHlwZSgp7Jy866GcIOyymOumrFxuICAgKi9cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlW10g7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIiB9O1xuICB9XG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZSDri6jsnbwg7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIgfTtcbiAgfVxuXG4gIC8vIOydvOuwmCDsvIDsnbTsiqQ6IFpvZE9iamVjdCDssrTtgaxcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlW1wic2hhcGVcIl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY29sdW1uS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVtcInNoYXBlXCJdW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID1cbiAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6b2RUeXBlIGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlQW55PlxuICAgICAgKS5kZWYuZWxlbWVudDtcbiAgICAvLyB2ZWN0b3Ig7YOA7J6FIO2MkOuzhDogbnVtYmVyIOuwsOyXtOydtOuptOyEnCBlbWJlZGRpbmcsIHZlY3RvciDrk7HsnZgg7J2066aE7J2EIOqwgOynhCDqsr3smrBcbiAgICBpZiAoXG4gICAgICBpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlciAmJlxuICAgICAgKGJhc2VLZXkuaW5jbHVkZXMoXCJlbWJlZGRpbmdcIikgfHwgYmFzZUtleS5pbmNsdWRlcyhcInZlY3RvclwiKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgcmVuZGVyVHlwZTogXCJ2ZWN0b3JcIixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiBcImFycmF5XCIsXG4gICAgICBlbGVtZW50OiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIGNvbnN0IG9wdGlvbk5vZGVzID1cbiAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+XG4gICAgICApLmRlZi5vcHRpb25zLm1hcCgob3B0KSA9PiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSkpO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+XG4gICAgICAgICkuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+XG4gICAgICAgICkuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleSxcbiAgICAgICksXG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiByZXNvbHZlUmVuZGVyVHlwZShiYXNlS2V5LCB6b2RUeXBlKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheqzvCDtgqQg7J2066aE7Jy866Gc67aA7YSwIOyggeygiO2VnCBSZW5kZXJUeXBl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlbmRlclR5cGUoa2V5OiBzdHJpbmcsIHpvZFR5cGU6IHouWm9kVHlwZUFueSk6IFJlbmRlcmluZ05vZGVbXCJyZW5kZXJUeXBlXCJdIHtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZERhdGUpIHtcbiAgICByZXR1cm4gXCJkYXRldGltZVwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LmNvcmUuJFpvZFN0cmluZykge1xuICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgIC8vIEZJWE1FOiBlbWFpbOydtOuCmCB1cmwg7YOA7J6FIOuTseyXkCDrjIDtlZwg7LKY66as6rCAIO2VhOyalO2VqFxuICAgIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNRTERhdGVUaW1lU3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRldGltZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiZGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGVcIjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIpIHtcbiAgICBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEJvb2xlYW4pIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgIHJldHVybiBcImVudW1zXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kUmVjb3JkKSB7XG4gICAgcmV0dXJuIFwicmVjb3JkXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQW55IHx8IHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZExpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RUZW1wbGF0ZUxpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlLmRlZi50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIFwib2JqZWN0XCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThGQSxTQUFTLHFCQUFxQixTQUF3QztDQUVwRSxPQURnQixPQUFPLFFBQVEsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksUUFBUSxnQkFBZ0IsTUFDbkYsQ0FBQSxHQUFVLEVBQUUsQ0FBQztBQUN0Qjs7Ozs7QUFNQSxTQUFTLGdCQUFnQixRQUFpQztDQUN4RCxRQUFRLFFBQVI7RUFDRSxLQUFLLFdBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxlQUNILE9BQU87RUFDVCxLQUFLLGVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxZQUNILE9BQU87RUFDVCxLQUFLLGNBQ0gsT0FBTztFQUNULEtBQUssY0FDSCxPQUFPO0VBQ1QsS0FBSyxjQUNILE9BQU87RUFDVCxTQUNFLE9BQU8sS0FBSyxPQUFPO0NBQ3ZCO0FBQ0Y7Ozs7O0FBTUEsU0FBUyxnQkFBZ0IsUUFBb0M7Q0FDM0QsUUFBUSxRQUFSO0VBQ0UsS0FBSyxTQUNILE9BQU8sRUFBRSxNQUFNO0VBQ2pCLEtBQUssUUFDSCxPQUFPLEVBQUUsS0FBSztFQUNoQixLQUFLLE9BQ0gsT0FBTyxFQUFFLElBQUk7RUFDZixLQUFLLFdBQ0gsT0FBTyxFQUFFLFFBQVE7RUFDbkIsS0FBSyxZQUNILE9BQU8sRUFBRSxTQUFTO0VBQ3BCLEtBQUssU0FDSCxPQUFPLEVBQUUsTUFBTTtFQUNqQixLQUFLLFVBQ0gsT0FBTyxFQUFFLE9BQU87RUFDbEIsS0FBSyxhQUNILE9BQU8sRUFBRSxVQUFVO0VBQ3JCLEtBQUssT0FDSCxPQUFPLEVBQUUsSUFBSTtFQUNmLEtBQUssT0FDSCxPQUFPLEVBQUUsSUFBSTtFQUNmLEtBQUssVUFDSCxP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
|
|
485
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvem9kLWNvbnZlcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsO1xuXG4vKipcbiAqIOuCtOyepSDtg4DsnoUg7KCV7J2YIChab2Qg7Iqk7YKk66eIICsgVUkg66CM642U66eBIO2DgOyehSlcbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxUX0lOX1RZUEVTID0ge1xuICBTb25hbXVGaWxlOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlU2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlU2NoZW1hXCIsXG4gIH0sXG4gIFwiU29uYW11RmlsZVtdXCI6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCIsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRCdWlsdEluU2NoZW1hTmFtZSh6b2RUeXBlOiB6LlpvZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkID0gT2JqZWN0LmVudHJpZXMoQlVJTFRfSU5fVFlQRVMpLmZpbmQoKFt0eXBlSWRdKSA9PiB6b2RUeXBlLmRlc2NyaXB0aW9uID09PSB0eXBlSWQpO1xuICByZXR1cm4gbWF0Y2hlZD8uWzFdLnNjaGVtYU5hbWU7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJpc29EYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRlKClcIjtcbiAgICBjYXNlIFwiaXNvVGltZVwiOlxuICAgICAgcmV0dXJuIFwiei5pc28udGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRldGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0R1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kdXJhdGlvbigpXCI7XG4gICAgY2FzZSBcImhhc2hNZDVcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwibWQ1XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMVwiKSc7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMjU2XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTM4NFwiOlxuICAgICAgcmV0dXJuICd6Lmhhc2goXCJzaGEzODRcIiknO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gJ3ouaGFzaChcInNoYTUxMlwiKSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG4gIH1cbn1cblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9UeXBlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogei5ab2RUeXBlIHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiB6LmVtYWlsKCk7XG4gICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIHJldHVybiB6LnV1aWQoKTtcbiAgICBjYXNlIFwidXJsXCI6XG4gICAgICByZXR1cm4gei51cmwoKTtcbiAgICBjYXNlIFwiaHR0cFVybFwiOlxuICAgICAgcmV0dXJuIHouaHR0cFVybCgpO1xuICAgIGNhc2UgXCJob3N0bmFtZVwiOlxuICAgICAgcmV0dXJuIHouaG9zdG5hbWUoKTtcbiAgICBjYXNlIFwiZW1vamlcIjpcbiAgICAgIHJldHVybiB6LmVtb2ppKCk7XG4gICAgY2FzZSBcImJhc2U2NFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0KCk7XG4gICAgY2FzZSBcImJhc2U2NHVybFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0dXJsKCk7XG4gICAgY2FzZSBcImhleFwiOlxuICAgICAgcmV0dXJuIHouaGV4KCk7XG4gICAgY2FzZSBcImp3dFwiOlxuICAgICAgcmV0dXJuIHouand0KCk7XG4gICAgY2FzZSBcIm5hbm9pZFwiOlxuICAgICAgcmV0dXJuIHoubmFub2lkKCk7XG4gICAgY2FzZSBcImN1aWRcIjpcbiAgICAgIHJldHVybiB6LmN1aWQoKTtcbiAgICBjYXNlIFwiY3VpZDJcIjpcbiAgICAgIHJldHVybiB6LmN1aWQyKCk7XG4gICAgY2FzZSBcInVsaWRcIjpcbiAgICAgIHJldHVybiB6LnVsaWQoKTtcbiAgICBjYXNlIFwiaXB2NFwiOlxuICAgICAgcmV0dXJuIHouaXB2NCgpO1xuICAgIGNhc2UgXCJpcHY2XCI6XG4gICAgICByZXR1cm4gei5pcHY2KCk7XG4gICAgY2FzZSBcIm1hY1wiOlxuICAgICAgcmV0dXJuIHoubWFjKCk7XG4gICAgY2FzZSBcImNpZHJ2NFwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY0KCk7XG4gICAgY2FzZSBcImNpZHJ2NlwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY2KCk7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIGNhc2UgXCJoYXNoTWQ1XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwibWQ1XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTFcIik7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEyNTZcIik7XG4gICAgY2FzZSBcImhhc2hTaGEzODRcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEzODRcIik7XG4gICAgY2FzZSBcImhhc2hTaGE1MTJcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGE1MTJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXVxuICAgICkuaW5jbHVkZXMoem9kVHlwZUlkKVxuICApIHtcbiAgICBjb25zdCBidWlsdEluVHlwZSA9XG4gICAgICBCVUlMVF9JTl9UWVBFU1tcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXG4gICAgICBdO1xuICAgIGlmICghYnVpbHRJblR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg64K07J6lIO2DgOyehSAke3pvZFR5cGVJZH3snZgg7Iqk7YKk66eI6rCAIOygleydmOuQmOyngCDslYrslZjsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0SW5UeXBlLnNjaGVtYS5kZXNjcmliZSh6b2RUeXBlSWQpO1xuICB9XG5cbiAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoUg64+Z7KCBIOuhnOuTnFxuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgKTtcbiAgY29uc3QgaW1wb3J0VXJsID0gY3JlYXRlSW1wb3J0VXJsKG1vZHVsZUFic1BhdGgpO1xuICBjb25zdCBpbXBvcnRlZCA9IGF3YWl0IGltcG9ydChpbXBvcnRVcmwpO1xuXG4gIGlmICghaW1wb3J0ZWRbem9kVHlwZUlkXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB6b2RUeXBlSWQgJHt6b2RUeXBlSWR9YCk7XG4gIH1cbiAgcmV0dXJuIGltcG9ydGVkW3pvZFR5cGVJZF0uZGVzY3JpYmUoem9kVHlwZUlkKTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIHByb3DsnZgg7YOA7J6F7JeQIOuUsOudvCDsoIHsoIjtlZwgWm9kIHZhbGlkYXRvcuulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlKHByb3A6IEVudGl0eVByb3ApOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBsZXQgem9kVHlwZTogei5ab2RUeXBlQW55ID0gei51bmtub3duKCk7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSAoYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCkpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICB6b2RUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIHpvZFR5cGUpIHtcbiAgICAgICAgem9kVHlwZSA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGxldCBlbGVtZW50VHlwZTogei5ab2RUeXBlO1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gZWxlbWVudFR5cGUpIHtcbiAgICAgICAgZWxlbWVudFR5cGUgPVxuICAgICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZWxlbWVudFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgICApLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gICAgem9kVHlwZSA9IGVsZW1lbnRUeXBlLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH1cbiAgICApLnVuc2lnbmVkXG4gICkge1xuICAgIHpvZFR5cGUgPSAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgIHpvZFR5cGUgYXMgei5ab2ROdW1iZXJcbiAgICApLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0uYXJyYXkoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIC8vIOuCtOyepSDtg4DsnoXsnbgg6rK97JqwIOyKpO2CpOuniCDsnbTrpoTsnLzroZwg67OA7ZmYXG4gICAgaWYgKFxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgICApLmluY2x1ZGVzKHByb3AuaWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzY2hlbWFOYW1lID0gcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlXCIgPyBcIlNvbmFtdUZpbGVTY2hlbWFcIiA6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCI7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtzY2hlbWFOYW1lfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goc2NoZW1hTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKFxuICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgcHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9XG4gICAgKS51bnNpZ25lZFxuICApIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgLy8gbnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIG51bGxhYmxlIOydtO2bhOyXkCBtZXRhIOy2lOqwgCAo66mU7YOA642w7J207YSw6rCAIOy1nOyDgeychCDroIjrsqjsl5Ag7J6I7Ja07JW8IO2VqClcbiAgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCArPSAnLm1ldGEoeyBTb25hbXVQcm9wVHlwZTogXCJudW1lcmljXCIgfSknO1xuICB9XG5cbiAgcmV0dXJuIGAke3N0bXR9LGA7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcE5vZGXrpbwgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBwbGFpbiwgYXJyYXksIG9iamVjdCDrhbjrk5wg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCDsspjrpqztlZjsl6wg7KSR7LKpIOq1rOyhsOulvCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZURlZihwcm9wTm9kZS5wcm9wLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5hcnJheSh6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgXCJ9KSksXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIGB9KSR7cHJvcE5vZGUucHJvcD8ubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiRGF0ZVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZERlZmF1bHRcbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIGNvbnN0IGtleVR5cGUgPSB6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSk7XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSB6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYudmFsdWVUeXBlKTtcbiAgICAgIGlmIChyZWNvcmRUeXBlLmRlZi5wYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBgUGFydGlhbDxSZWNvcmQ8JHtrZXlUeXBlfSwgJHt2YWx1ZVR5cGV9Pj5gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB7IFsga2V5OiAke2tleVR5cGV9IF06ICR7dmFsdWVUeXBlfX1gO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kTGl0ZXJhbFxuICAgICAgICApLnZhbHVlcyxcbiAgICAgIClcbiAgICAgICAgLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAoaXNTdHJpbmdWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIik7XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYCR7XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZFVuaW9uXG4gICAgICAgICkub3B0aW9uc1xuICAgICAgICAgIC5tYXAoKG9wdGlvbikgPT4gem9kVHlwZVRvVHNUeXBlRGVmKG9wdGlvbikpXG4gICAgICAgICAgLmpvaW4oXCIgfCBcIilcbiAgICAgIH1gO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICByZXR1cm4gYCR7LyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoenQgYXMgei5ab2RFbnVtKS5vcHRpb25zLm1hcCgodmFsKSA9PiBgXCIke3ZhbH1cImApLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoenQgYXMgQW55Wm9kQXJyYXkpLmVsZW1lbnQpfVtdYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IG9iamVjdEZpZWxkcyA9IC8qIFNBRkVUWTogWm9k7J2YIG9iamVjdCDtjJDrs4Qg67aE6riw6rCAIOqwneyytCDtlYTrk5wg6rOE7JW97J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RPYmplY3RcbiAgICAgIClbXCJzaGFwZVwiXTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwie1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhvYmplY3RGaWVsZHMpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKG9iamVjdEZpZWxkc1trZXldLmRlZi50eXBlID09PSBcIm9wdGlvbmFsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PzogJHt6b2RUeXBlVG9Uc1R5cGVEZWYob2JqZWN0RmllbGRzW2tleV0uZGVmLmlubmVyVHlwZSl9LGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9OiAke3pvZFR5cGVUb1RzVHlwZURlZihvYmplY3RGaWVsZHNba2V5XSl9LGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2RPcHRpb25hbCkuZGVmLmlubmVyVHlwZSl9IHwgdW5kZWZpbmVkYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsXG4gICAgICApLmRlZjtcblxuICAgICAgLy8g67mIIHRlbXBsYXRlIGxpdGVyYWzsnYAgc3RyaW5n7Jy866GcIO2PtOuwsVxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgVHlwZVNjcmlwdCDtg4DsnoUg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBkZWYucGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgIC8vIOumrO2EsOuftCDqsJIgKHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsLCB1bmRlZmluZWQpXG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHBhcnQpKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIGlzT2JqZWN0VmFsdWUocGFydCkgJiYgcGFydCBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGVUb1RzVHlwZURlZihcbiAgICAgICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcGFydCBhcyB6LlpvZFR5cGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gYCRcXHske2lubmVyVHlwZX19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gYFxcJHtzdHJpbmd9YDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYFxcYCR7cGFydHMuam9pbihcIlwiKX1cXGBgO1xuICAgIH1cbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIFwiRmlsZVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyehSDsnbjsiqTthLTsiqTrpbwg7ZW064u57ZWY64qUIFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1pvZENvZGUoenQ6IHouWm9kVHlwZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGJ1aWx0SW5TY2hlbWFOYW1lID0gZ2V0QnVpbHRJblNjaGVtYU5hbWUoenQpO1xuICBpZiAoYnVpbHRJblNjaGVtYU5hbWUpIHtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goYnVpbHRJblNjaGVtYU5hbWUpO1xuICAgIHJldHVybiBidWlsdEluU2NoZW1hTmFtZTtcbiAgfVxuXG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwiei5udW1iZXIoKVwiO1xuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgIHJldHVybiBcInouYmlnaW50KClcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiei5ib29sZWFuKClcIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiei5kYXRlKClcIjtcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgcmV0dXJuIFwiei5udWxsKClcIjtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ6LnVuZGVmaW5lZCgpXCI7XG4gICAgY2FzZSBcImFueVwiOlxuICAgICAgcmV0dXJuIFwiei5hbnkoKVwiO1xuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIFwiei5uZXZlcigpXCI7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSwgaW5qZWN0SW1wb3J0S2V5cyl9Lm51bGxhYmxlKClgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6IHtcbiAgICAgIGNvbnN0IHpEZWZhdWx0RGVmID1cbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kRGVmYXVsdFxuICAgICAgICApLmRlZjtcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKHpEZWZhdWx0RGVmLmlubmVyVHlwZSwgaW5qZWN0SW1wb3J0S2V5cyl9LmRlZmF1bHQoJHt6RGVmYXVsdERlZi5kZWZhdWx0VmFsdWV9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgelJlY29yZERlZiA9XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZFJlY29yZFxuICAgICAgICApLmRlZjtcbiAgICAgIGNvbnN0IHJlY29yZEZuID0gelJlY29yZERlZi5wYXJ0aWFsID8gXCJwYXJ0aWFsUmVjb3JkXCIgOiBcInJlY29yZFwiO1xuICAgICAgcmV0dXJuIGB6LiR7cmVjb3JkRm59KCR7em9kVHlwZVRvWm9kQ29kZSh6UmVjb3JkRGVmLmtleVR5cGUsIGluamVjdEltcG9ydEtleXMpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6UmVjb3JkRGVmLnZhbHVlVHlwZSxcbiAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICl9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgei5ab2RMaXRlcmFsPHN0cmluZyB8IG51bWJlcj5cbiAgICAgICAgKS52YWx1ZXMsXG4gICAgICApLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYHoubGl0ZXJhbCgke2l0ZW1zWzBdfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoWyR7aXRlbXMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYHoudW5pb24oWyR7XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZFVuaW9uXG4gICAgICAgICkuZGVmLm9wdGlvbnNcbiAgICAgICAgICAubWFwKChvcHRpb246IHouWm9kVHlwZSkgPT4gem9kVHlwZVRvWm9kQ29kZShvcHRpb24sIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAgIC5qb2luKFwiLFwiKVxuICAgICAgfV0pYDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgLy8gTk9URTogei5lbnVtKFtcIkFcIiwgXCJCXCJdKeuPhCB6LmVudW0oeyBBOiBcIkFcIiwgQjogXCJCXCIgfSnroZwg7LKY66as65CoLlxuICAgICAgcmV0dXJuIGB6LmVudW0oeyR7T2JqZWN0LmVudHJpZXMoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kRW51bVxuICAgICAgICApLmRlZi5lbnRyaWVzLFxuICAgICAgKVxuICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiAoaXNTdHJpbmdWYWx1ZSh2YWwpID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX19KWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYHouYXJyYXkoJHt6b2RUeXBlVG9ab2RDb2RlKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlPikuZGVmLmVsZW1lbnQsIGluamVjdEltcG9ydEtleXMpfSlgO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgb2JqZWN0RmllbGRzID0gLyogU0FGRVRZOiBab2TsnZggb2JqZWN0IO2MkOuzhCDrtoTquLDqsIAg6rCd7LK0IO2VhOuTnCDqs4Tslb3snYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHp0IGFzIEFueVpvZE9iamVjdFxuICAgICAgKVtcInNoYXBlXCJdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKG9iamVjdEZpZWxkcykubWFwKFxuICAgICAgICAgIChrZXkpID0+IGAke2tleX06ICR7em9kVHlwZVRvWm9kQ29kZShvYmplY3RGaWVsZHNba2V5XSwgaW5qZWN0SW1wb3J0S2V5cyl9LGAsXG4gICAgICAgICksXG4gICAgICAgIFwifSlcIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGluamVjdEltcG9ydEtleXMpfS5vcHRpb25hbCgpYDtcbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIGB6LmZpbGUoKWA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbFxuICAgICAgKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFsXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInoudGVtcGxhdGVMaXRlcmFsKFtdKVwiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAvLyDrrLjsnpDsl7Qg66as7YSw65+0XG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHBhcnQpKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7cGFydH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgaXNPYmplY3RWYWx1ZShwYXJ0KSAmJiBwYXJ0IGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHpvZFR5cGVUb1pvZENvZGUoXG4gICAgICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHBhcnQgYXMgei5ab2RUeXBlLFxuICAgICAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYHoudGVtcGxhdGVMaXRlcmFsKFske3BhcnRzLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJpbnRlcnNlY3Rpb25cIjoge1xuICAgICAgY29uc3QgekludGVyc2VjdGlvbkRlZiA9XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPlxuICAgICAgICApLmRlZjtcbiAgICAgIHJldHVybiBgei5pbnRlcnNlY3Rpb24oJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6SW50ZXJzZWN0aW9uRGVmLmxlZnQsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQsIGluamVjdEltcG9ydEtleXMpfSlgO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlQW55LFxuICBiYXNlS2V5OiBzdHJpbmcgPSBcInJvb3RcIixcbik6IFJlbmRlcmluZ05vZGUge1xuICBjb25zdCBkZWYgPSB7XG4gICAgbmFtZTogYmFzZUtleSxcbiAgICBsYWJlbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShiYXNlS2V5LCBmYWxzZSksXG4gICAgem9kVHlwZSxcbiAgfTtcblxuICAvKipcbiAgICog7LyA7J207IqkIOyymOumrCDsiJzshJxcbiAgICpcbiAgICogMS4g7Yq57IiYIOy8gOydtOyKpCAoZGVzY3JpcHRpb24g6riw67CYKVxuICAgKiAgICAtIFNvbmFtdUZpbGUvU29uYW11RmlsZVtdIDogei5vYmplY3Qvei5hcnJheeydtOyngOunjCDtjIzsnbwg7JeF66Gc65Oc7JqpIOuCtOyepSDtg4DsnoVcbiAgICpcbiAgICogMi4g7J2867CYIOy8gOydtOyKpCAoaW5zdGFuY2VvZiDquLDrsJgpXG4gICAqICAgIC0gei5ab2RPYmplY3QgOiDsnbzrsJgg6rCd7LK0XG4gICAqICAgIC0gei5ab2RBcnJheSA6IOydvOuwmCDrsLDsl7RcbiAgICogICAgICAtIHZlY3RvciA6IHouYXJyYXkoei5udW1iZXIp7J207KeA66eMIOuEpOydtOuwjSDquLDrsJjsnLzroZwg67Kh7YSwIOyehOuyoOuUqVxuICAgKiAgICAgIC0g7J2867CYIOuwsOyXtCA6IOq3uCDsmbhcbiAgICogICAgLSB6LlpvZFVuaW9uLCB6LlpvZE9wdGlvbmFsLCB6LlpvZE51bGxhYmxlIDog7Jyg7Yu466as7YuwIO2DgOyehVxuICAgKiAgICAtIOq4sO2DgCA6IHJlc29sdmVSZW5kZXJUeXBlKCnsnLzroZwg7LKY66asXG4gICAqL1xuXG4gIC8vIO2KueyImCDsvIDsnbTsiqQ6IFNvbmFtdUZpbGVbXSDtg4DsnoUg6rCQ7KeAXG4gIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgcmV0dXJuIHsgLi4uZGVmLCByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiIH07XG4gIH1cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlIOuLqOydvCDtg4DsnoUg6rCQ7KeAXG4gIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNvbmFtdUZpbGVcIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGVcIiB9O1xuICB9XG5cbiAgLy8g7J2867CYIOy8gOydtOyKpDogWm9kT2JqZWN0IOyytO2BrFxuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0KSB7XG4gICAgY29uc3QgY29sdW1uS2V5cyA9IE9iamVjdC5rZXlzKHpvZFR5cGVbXCJzaGFwZVwiXSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlW1wic2hhcGVcIl1ba2V5XTtcbiAgICAgIHJldHVybiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICBjb25zdCBpbm5lclR5cGUgPVxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGVBbnk+XG4gICAgICApLmRlZi5lbGVtZW50O1xuICAgIC8vIHZlY3RvciDtg4DsnoUg7YyQ67OEOiBudW1iZXIg67Cw7Je07J2066m07IScIGVtYmVkZGluZywgdmVjdG9yIOuTseydmCDsnbTrpoTsnYQg6rCA7KeEIOqyveyasFxuICAgIGlmIChcbiAgICAgIGlubmVyVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyICYmXG4gICAgICAoYmFzZUtleS5pbmNsdWRlcyhcImVtYmVkZGluZ1wiKSB8fCBiYXNlS2V5LmluY2x1ZGVzKFwidmVjdG9yXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICByZW5kZXJUeXBlOiBcInZlY3RvclwiLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGVsZW1lbnQ6IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgY29uc3Qgb3B0aW9uTm9kZXMgPVxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHpvZFR5cGUgYXMgei5ab2RVbmlvbjx6LlpvZFR5cGVbXT5cbiAgICAgICkuZGVmLm9wdGlvbnMubWFwKChvcHQpID0+IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUob3B0LCBiYXNlS2V5KSk7XG4gICAgLy8gVE9ETzogWm9kVW5pb27snbQg65Ok7Ja07J6I64qUIOqyveyasCDtlbjrk6Trp4FcbiAgICByZXR1cm4gb3B0aW9uTm9kZXNbMF07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT3B0aW9uYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgem9kVHlwZSBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT5cbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgICBiYXNlS2V5LFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgem9kVHlwZSBhcyB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT5cbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgICBiYXNlS2V5LFxuICAgICAgKSxcbiAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IHJlc29sdmVSZW5kZXJUeXBlKGJhc2VLZXksIHpvZFR5cGUpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F6rO8IO2CpCDsnbTrpoTsnLzroZzrtoDthLAg7KCB7KCI7ZWcIFJlbmRlclR5cGXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVuZGVyVHlwZShrZXk6IHN0cmluZywgem9kVHlwZTogei5ab2RUeXBlQW55KTogUmVuZGVyaW5nTm9kZVtcInJlbmRlclR5cGVcIl0ge1xuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRGF0ZSkge1xuICAgIHJldHVybiBcImRhdGV0aW1lXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouY29yZS4kWm9kU3RyaW5nKSB7XG4gICAgLy8gTk9URTogei5ab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWY66m0IHoudXJsKCksIHouZW1haWwoKSDrk7HsnZgg7YOA7J6F7JeQ7IScIOusuOygnOqwgCDsg53quLDrr4DroZwgei5jb3JlLiRab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWoXG4gICAgLy8gRklYTUU6IGVtYWls7J2064KYIHVybCDtg4DsnoUg65Ox7JeQIOuMgO2VnCDsspjrpqzqsIAg7ZWE7JqU7ZWoXG4gICAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlcikge1xuICAgIGlmIChrZXkgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWlkXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJfaWRcIikpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1ma19pZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQm9vbGVhbikge1xuICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgcmV0dXJuIFwiZW51bXNcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RSZWNvcmQpIHtcbiAgICByZXR1cm4gXCJyZWNvcmRcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBbnkgfHwgem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5rbm93bikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFRlbXBsYXRlTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVmLnR5cGUgPT09IFwiY3VzdG9tXCIpIHtcbiAgICByZXR1cm4gXCJvYmplY3RcIjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2DgOyehSDtjIzsi7Eg67aI6rCAICR7a2V5fSAke3pvZFR5cGUuZGVmLnR5cGV9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEZBLFNBQVMscUJBQXFCLFNBQXdDO0NBRXBFLE9BRGdCLE9BQU8sUUFBUSxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxRQUFRLGdCQUFnQixNQUNuRixDQUFBLEdBQVUsRUFBRSxDQUFDO0FBQ3RCOzs7OztBQU1BLFNBQVMsZ0JBQWdCLFFBQWlDO0NBQ3hELFFBQVEsUUFBUjtFQUNFLEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxLQUFLLGVBQ0gsT0FBTztFQUNULEtBQUssZUFDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxLQUFLLFlBQ0gsT0FBTztFQUNULEtBQUssY0FDSCxPQUFPO0VBQ1QsS0FBSyxjQUNILE9BQU87RUFDVCxLQUFLLGNBQ0gsT0FBTztFQUNULFNBQ0UsT0FBTyxLQUFLLE9BQU87Q0FDdkI7QUFDRjs7Ozs7QUFNQSxTQUFTLGdCQUFnQixRQUFvQztDQUMzRCxRQUFRLFFBQVI7RUFDRSxLQUFLLFNBQ0gsT0FBTyxFQUFFLE1BQU07RUFDakIsS0FBSyxRQUNILE9BQU8sRUFBRSxLQUFLO0VBQ2hC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
|
package/package.json
CHANGED
|
@@ -168,4 +168,19 @@ describe("HTTP validator registry sync 정리", () => {
|
|
|
168
168
|
await expect(findChangedFilesUsingChecksums()).resolves.toEqual([]);
|
|
169
169
|
expect(warn.mock.calls.flat().join(" ")).toContain("queries.generated.ts");
|
|
170
170
|
});
|
|
171
|
+
|
|
172
|
+
it("forceSync는 lock을 지운 뒤에도 생성물을 drift로 경고하지 않는다", async () => {
|
|
173
|
+
const { apiRootPath, syncer } = await createTestProject(false);
|
|
174
|
+
await writeFile(
|
|
175
|
+
path.join(apiRootPath, "src/application/queries.generated.ts"),
|
|
176
|
+
"// generated output\n",
|
|
177
|
+
);
|
|
178
|
+
await syncer.renewChecksums();
|
|
179
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => undefined);
|
|
180
|
+
|
|
181
|
+
await syncer.forceSync();
|
|
182
|
+
|
|
183
|
+
expect(warn).not.toHaveBeenCalled();
|
|
184
|
+
await expect(findChangedFilesUsingChecksums()).resolves.toEqual([]);
|
|
185
|
+
});
|
|
171
186
|
});
|
package/src/syncer/syncer.ts
CHANGED
|
@@ -56,6 +56,11 @@ export class Syncer {
|
|
|
56
56
|
await SyncerActions.actionCopySharedToTargetsIfNotExists();
|
|
57
57
|
await SyncerActions.actionGenerateSsrEntryServerIfNotExists();
|
|
58
58
|
|
|
59
|
+
// lock이 없으면 비교 기준이 없어 모든 파일이 변경으로 잡히므로, 생성물 drift를 판정할 수 없습니다.
|
|
60
|
+
const hasChecksumBaseline = await syncerFileExists(
|
|
61
|
+
path.join(Sonamu.apiRootPath, "sonamu.lock"),
|
|
62
|
+
);
|
|
63
|
+
|
|
59
64
|
// 바뀐 것이 없으면 그냥 넘어가요.
|
|
60
65
|
const changedFiles = await findChangedFilesUsingChecksums();
|
|
61
66
|
if (changedFiles.length === 0) {
|
|
@@ -72,7 +77,7 @@ export class Syncer {
|
|
|
72
77
|
await runWithGracefulShutdown(
|
|
73
78
|
async () => {
|
|
74
79
|
// 얘가 싱크 작업 수행하는 본체입니다.
|
|
75
|
-
await this.doSyncActions(changedFiles);
|
|
80
|
+
await this.doSyncActions(changedFiles, { skipDriftCheck: !hasChecksumBaseline });
|
|
76
81
|
await this.reconcileHttpValidatorRegistry();
|
|
77
82
|
|
|
78
83
|
// 싱크 액션이 끝나면 항상 체크섬을 다시 갱신합니다.
|
|
@@ -322,9 +327,13 @@ export class Syncer {
|
|
|
322
327
|
* 변경된 파일들을 타입별로 분류하고 각 타입에 맞는 액션을 실행합니다.
|
|
323
328
|
*
|
|
324
329
|
* @param diffFilePaths - 변경된 파일들의 절대 경로 목록
|
|
330
|
+
* @param options.skipDriftCheck - true이면 처리되지 않은 생성물 변경을 drift로 경고하지 않습니다.
|
|
325
331
|
* @returns diffTypes - 변경된 파일의 타입 목록 (entity, types, model 등)
|
|
326
332
|
*/
|
|
327
|
-
async doSyncActions(
|
|
333
|
+
async doSyncActions(
|
|
334
|
+
diffFilePaths: AbsolutePath[],
|
|
335
|
+
{ skipDriftCheck = false }: { skipDriftCheck?: boolean } = {},
|
|
336
|
+
): Promise<{ diffTypes: FileType[] }> {
|
|
328
337
|
const diffGroups = this.calculateDiffGroups(diffFilePaths);
|
|
329
338
|
const diffTypes =
|
|
330
339
|
/* SAFETY: TypeScript AST 파싱과 동기화 입력 계약이 이 값의 타입을 보장한다. */ Object.keys(
|
|
@@ -371,7 +380,7 @@ export class Syncer {
|
|
|
371
380
|
// 위에서 처리 안 된 변경들이 있다?
|
|
372
381
|
// 체크섬 관리 대상이긴 한데 위에서 핸들링이 안 된 것이라면 결국 생성물입니다.
|
|
373
382
|
// 이 친구들이 변경된 것은 drift로 간주해도 마땅합니다.
|
|
374
|
-
if (unhandledChangesLeft()) {
|
|
383
|
+
if (!skipDriftCheck && unhandledChangesLeft()) {
|
|
375
384
|
await this.handleDrifts(unhandledPaths());
|
|
376
385
|
}
|
|
377
386
|
|
|
@@ -520,7 +520,12 @@ export function zodTypeToTsTypeDef(zt: z.ZodType): string {
|
|
|
520
520
|
case "record": {
|
|
521
521
|
const recordType =
|
|
522
522
|
/* SAFETY: 선행 Zod 종류 분기와 템플릿 입력 계약이 이 값의 타입을 보장한다. */ zt as AnyZodRecord;
|
|
523
|
-
|
|
523
|
+
const keyType = zodTypeToTsTypeDef(recordType.def.keyType);
|
|
524
|
+
const valueType = zodTypeToTsTypeDef(recordType.def.valueType);
|
|
525
|
+
if (recordType.def.partial) {
|
|
526
|
+
return `Partial<Record<${keyType}, ${valueType}>>`;
|
|
527
|
+
}
|
|
528
|
+
return `{ [ key: ${keyType} ]: ${valueType}}`;
|
|
524
529
|
}
|
|
525
530
|
case "literal":
|
|
526
531
|
return Array.from(
|
|
@@ -657,7 +662,8 @@ export function zodTypeToZodCode(zt: z.ZodType, injectImportKeys: string[] = [])
|
|
|
657
662
|
/* SAFETY: 선행 Zod 종류 분기와 템플릿 입력 계약이 이 값의 타입을 보장한다. */ (
|
|
658
663
|
zt as AnyZodRecord
|
|
659
664
|
).def;
|
|
660
|
-
|
|
665
|
+
const recordFn = zRecordDef.partial ? "partialRecord" : "record";
|
|
666
|
+
return `z.${recordFn}(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(
|
|
661
667
|
zRecordDef.valueType,
|
|
662
668
|
injectImportKeys,
|
|
663
669
|
)})`;
|