sonamu 0.8.12 → 0.8.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +2 -3
- package/dist/auth/auth-generator.d.ts +8 -0
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +33 -1
- package/dist/auth/better-auth-entities.d.ts.map +1 -1
- package/dist/auth/better-auth-entities.js +12 -2
- package/dist/bin/cli.js +18 -3
- package/dist/cone/cone-generator.js +10 -4
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +64 -2
- package/dist/database/puri.d.ts +9 -1
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +42 -1
- package/dist/database/puri.types.d.ts +2 -0
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +6 -2
- package/dist/entity/entity-manager.d.ts +149 -1
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +68 -4
- package/dist/migration/__tests__/code-generation.search-text.test.js +435 -0
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +696 -32
- package/dist/migration/migration-set.js +3 -1
- package/dist/migration/postgresql-schema-reader.d.ts +16 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +281 -7
- package/dist/stream/sse.js +5 -3
- package/dist/template/__tests__/generated.template.search-text.test.js +99 -0
- package/dist/template/generated.template.test-d.js +24 -0
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +2 -2
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.js +11 -3
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +6 -2
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +5 -3
- package/dist/testing/fixture-generator.d.ts +13 -0
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +105 -8
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +19 -2
- package/dist/testing/parallel-db-manager.js +6 -3
- package/dist/types/__tests__/entity-json-schema-search-text.test.js +256 -0
- package/dist/types/types.d.ts +494 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +117 -13
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +14 -2
- package/dist/ui/cdd-service.d.ts +16 -14
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +145 -37
- package/dist/ui/cdd-types.d.ts +60 -0
- package/dist/ui/cdd-types.d.ts.map +1 -0
- package/dist/ui/cdd-types.js +3 -0
- package/dist/ui-web/assets/index-D4XFBV-f.css +1 -0
- package/dist/ui-web/assets/{index-CQ_S40bD.js → index-D_19-Pi4.js} +87 -87
- package/dist/ui-web/index.html +2 -2
- package/package.json +13 -9
- package/src/api/sonamu.ts +1 -2
- package/src/auth/auth-generator.ts +38 -0
- package/src/auth/better-auth-entities.ts +18 -1
- package/src/bin/cli.ts +15 -1
- package/src/cone/cone-generator.ts +9 -3
- package/src/database/knex.ts +62 -4
- package/src/database/puri.ts +71 -0
- package/src/database/puri.types.ts +2 -0
- package/src/entity/entity-manager.ts +95 -3
- package/src/migration/__tests__/code-generation.search-text.test.ts +390 -0
- package/src/migration/code-generation.ts +848 -34
- package/src/migration/migration-set.ts +2 -0
- package/src/migration/postgresql-schema-reader.ts +366 -9
- package/src/skills/sonamu/SKILL.md +5 -1
- package/src/skills/sonamu/api.md +26 -0
- package/src/skills/sonamu/auth-migration.md +80 -0
- package/src/skills/sonamu/auth.md +1 -1
- package/src/skills/sonamu/cdd.md +561 -0
- package/src/skills/sonamu/cone.md +16 -0
- package/src/skills/sonamu/entity-relations.md +18 -27
- package/src/skills/sonamu/fixture-cli.md +4 -0
- package/src/skills/sonamu/frontend.md +88 -16
- package/src/skills/sonamu/migration.md +3 -1
- package/src/skills/sonamu/model.md +29 -0
- package/src/skills/sonamu/workflow.md +59 -6
- package/src/stream/sse.ts +4 -2
- package/src/template/__tests__/generated.template.search-text.test.ts +89 -0
- package/src/template/generated.template.test-d.ts +46 -0
- package/src/template/implementations/generated.template.ts +4 -1
- package/src/template/implementations/init_types.template.ts +20 -5
- package/src/template/zod-converter.ts +5 -0
- package/src/testing/dev-test-routes.ts +4 -2
- package/src/testing/fixture-generator.ts +157 -9
- package/src/testing/fixture-manager.ts +15 -1
- package/src/testing/parallel-db-manager.ts +2 -2
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +179 -0
- package/src/types/types.ts +168 -12
- package/src/ui/api.ts +24 -1
- package/src/ui/cdd-service.ts +195 -55
- package/src/ui/cdd-types.ts +73 -0
- package/dist/ui-web/assets/index-egkMxKos.css +0 -1
package/dist/api/sonamu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sonamu.d.ts","sourceRoot":"","sources":["../../src/api/sonamu.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sonamu.d.ts","sourceRoot":"","sources":["../../src/api/sonamu.ts"],"names":[],"mappings":"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"}
|
package/dist/api/sonamu.js
CHANGED
|
@@ -378,8 +378,7 @@ class SonamuClass {
|
|
|
378
378
|
if (handler) {
|
|
379
379
|
return handler(request, reply);
|
|
380
380
|
}
|
|
381
|
-
//
|
|
382
|
-
// 안전빵으로 남겨놓습니다.
|
|
381
|
+
// 등록된 API와 일치하지 않는 요청에 대한 fallback입니다.
|
|
383
382
|
throw new NotFoundException(SD("error.api.notFound"));
|
|
384
383
|
}
|
|
385
384
|
});
|
|
@@ -1130,4 +1129,4 @@ export const Sonamu = new SonamuClass();
|
|
|
1130
1129
|
return `uploads/${timestamp}-${random}.${ext}`;
|
|
1131
1130
|
}
|
|
1132
1131
|
|
|
1133
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgdHlwZSB7IEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlciwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwiaHR0cFwiO1xuaW1wb3J0IG1pbWUsIHsgbG9va3VwIGFzIG1pbWVMb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBCQVNFX0ZJRUxEX01BUFBJTkdTLFxuICBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLFxuICBjcmVhdGVNb2NrU1NFRmFjdG9yeSxcbiAgREIsXG4gIGlzRGFlbW9uU2VydmVyLFxuICBtZXJnZSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCIuLlwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbmZpZywgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyBhcHBseUNhY2hlSGVhZGVycywgQ2FjaGVQcmVzZXRzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbnRyb2xDb25maWcsIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24gfSBmcm9tIFwiLi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgQ29tcHJlc3NPcHRpb25zIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgQnVmZmVyZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvYnVmZmVyZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWFuYWdlciB9IGZyb20gXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBEZXZWaXRlc3RNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVDb25maWcsIFNvbmFtdVNlcnZlck9wdGlvbnMsIFNvbmFtdVRhc2tPcHRpb25zIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cywgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5cbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBDb250ZXh0IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiBzdG9yZS5jb250ZXh0IGFzIENvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgLy8g7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlcXVlc3Q6IG51bGwsXG4gICAgICAgIHJlcGx5OiBudWxsLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgY3JlYXRlU1NFOiAoc2NoZW1hOiBab2RPYmplY3QpID0+IGNyZWF0ZU1vY2tTU0VGYWN0b3J5KHNjaGVtYSksXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcGlSb290UGF0aDogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5fYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgICBpZiAodGhpcy5fYXBpUm9vdFBhdGggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGJDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBkYkNvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpIHtcbiAgICB0aGlzLl9kYkNvbmZpZyA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2RiQ29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jZXI6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5fc3luY2VyID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5fc3luY2VyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3luY2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgY29uZmlnKCk6IFNvbmFtdUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXRzOiBTb25hbXVTZWNyZXRzID0gZ2V0U2VjcmV0cygpO1xuXG4gIHByaXZhdGUgX3N0b3JhZ2U6IFN0b3JhZ2VNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBTdG9yYWdlTWFuYWdlciDsnbjsiqTthLTsiqRcbiAgICovXG4gIGdldCBzdG9yYWdlKCk6IFN0b3JhZ2VNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGU6IENhY2hlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQ2FjaGVNYW5hZ2VyIOyduOyKpO2EtOyKpCAoQmVudG9DYWNoZSlcbiAgICovXG4gIGdldCBjYWNoZSgpOiBDYWNoZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5fY2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF93b3JrZmxvd3M6IFdvcmtmbG93TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgd29ya2Zsb3dzKCk6IFdvcmtmbG93TWFuYWdlciB7XG4gICAgaWYgKHRoaXMuX3dvcmtmbG93cyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29ya2Zsb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0aDogQXV0aCB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoIHtcbiAgICBpZiAoIXRoaXMuX2F1dGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF1dGggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBhdXRoIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2F1dGg7XG4gIH1cblxuICBwcml2YXRlIF9kZXZWaXRlc3RNYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCBkZXZWaXRlc3RNYW5hZ2VyKCk6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZGV2Vml0ZXN0TWFuYWdlcjtcbiAgfVxuICBzZXQgZGV2Vml0ZXN0TWFuYWdlcihtYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCkge1xuICAgIHRoaXMuX2RldlZpdGVzdE1hbmFnZXIgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrFxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0ZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGhtclN0YXJ0VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0Rm9yVGVzdGluZygpIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0KFxuICAgIGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgZW5hYmxlU3luYzogYm9vbGVhbiA9IHRydWUsXG4gICAgYXBpUm9vdFBhdGg/OiBBYnNvbHV0ZVBhdGgsXG4gICAgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICB0aGlzLmZvclRlc3RpbmcgPSBmb3JUZXN0aW5nO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc29sZS50aW1lKGNoYWxrLmN5YW4oYFNvbmFtdS5pbml0JHtmb3JUZXN0aW5nID8gXCIgZm9yIHRlc3RpbmdcIiA6IFwiXCJ9YCkpO1xuICAgIH1cblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IHsgbG9hZENvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb25maWdcIik7XG4gICAgdGhpcy5jb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIC8vIHNvbmFtdS5jb25maWcudHMg6riw67O46rCSIOyEpOyglVxuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlZmF1bHRPcHRpb25zLmNsaWVudCA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicGdcIjtcblxuICAgIC8vIOuhnOq5hSDshKTsoJVcbiAgICBjb25zdCB7IGNvbmZpZ3VyZUxvZ1RhcGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2xvZ2dlci9jb25maWd1cmVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCBjb25maWd1cmVMb2dUYXBlKHtcbiAgICAgICAgLi4udGhpcy5jb25maWcubG9nZ2luZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKHRoaXMuY29uZmlnLmRhdGFiYXNlKTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiREIgQ29uZmlnIExvYWRlZCFcIikpO1xuICAgIH1cblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyDthYzsiqTtjIXsnbgg6rK97JqwIOyLse2BrCDsl4bsnbQg7KSR64uoXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGFzayDrk7HroZ1cbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3JrZmxvd3ModGhpcy5jb25maWcudGFza3MpO1xuXG4gICAgLy8gU3luY2VyXG4gICAgY29uc3QgeyBTeW5jZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9zeW5jZXJcIik7XG4gICAgdGhpcy5zeW5jZXIgPSBuZXcgU3luY2VyKCk7XG5cbiAgICAvLyBBdXRvbG9hZDogTW9kZWxzIC8gVHlwZXMgLyBBUElzIC8gV29ya2Zsb3dzIC8gVGVtcGxhdGVzIC8gU1NSIFJvdXRlc1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgY29uc3QgeyBUZW1wbGF0ZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3RlbXBsYXRlXCIpO1xuICAgIGF3YWl0IFRlbXBsYXRlTWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkU1NSUm91dGVzKCk7XG5cbiAgICBjb25zdCB7IGlzTG9jYWwsIGlzVGVzdCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6zsl5DshJzripQg7L2U65OcIOyDneyEseydhCDsnITtlbQgQmlvbWUg7IWL7JeF7J20IO2VhOyalO2VqCAo7ZiE7J6sIGFwaVJvb3RQYXRoIOyghOuLrO2VmOyXrCDsi6TtlokpXG4gICAgICAoYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZm9ybWF0dGVyXCIpKS5zZXR1cEJpb21lKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaXNIb3RSZWxvYWRTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSAmJiAhaXNUZXN0KCkgJiYgaXNIb3RSZWxvYWRTZXJ2ZXIoKSAmJiBlbmFibGVTeW5jKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2F0Y2hlcigpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWVFbmQoY2hhbGsuY3lhbihcIlNvbmFtdS5pbml0XCIpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXJ2ZXIoaW5pdE9wdGlvbnM/OiB7IGVuYWJsZVN5bmM/OiBib29sZWFuOyBkb1NpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQoaW5pdE9wdGlvbnM/LmRvU2lsZW50LCBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IGZhc3RpZnkgfSA9IGF3YWl0IGltcG9ydChcImZhc3RpZnlcIik7XG4gICAgY29uc3QgeyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlciB9ID0gYXdhaXQgaW1wb3J0KFwiQGxvZ3RhcGUvZmFzdGlmeVwiKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBmYXN0aWZ5KHtcbiAgICAgIC4uLm9wdGlvbnMuZmFzdGlmeSxcbiAgICAgIGxvZ2dlcjpcbiAgICAgICAgdGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2VcbiAgICAgICAgICA/IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyKHtcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuY29uZmlnLmxvZ2dpbmc/LmZhc3RpZnlDYXRlZ29yeSA/PyBbXCJmYXN0aWZ5XCJdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIFN0b3JhZ2Ug7ISk7KCVIOKGkiBTdG9yYWdlTWFuYWdlciDsg53shLFcbiAgICBpZiAob3B0aW9ucy5zdG9yYWdlKSB7XG4gICAgICBjb25zdCB7IFN0b3JhZ2VNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiKTtcbiAgICAgIHRoaXMuX3N0b3JhZ2UgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFRpbWV6b25lIHNldCB0byAke3RpbWV6b25lfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUEkgKOuhnOy7rCDtmZjqsr3sl5DshJzrp4wpXG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIGNvbnN0IHsgc29uYW11VUlBcGlQbHVnaW4gfSA9IGF3YWl0IGltcG9ydChcIi4uL3VpL2FwaVwiKTtcbiAgICAgIHNlcnZlci5yZWdpc3Rlcihzb25hbXVVSUFwaVBsdWdpbik7XG4gICAgfVxuXG4gICAgLy8gRGV2UnVubmVyIO2FjOyKpO2KuCDsl5Trk5ztj6zsnbjtirggKOuhnOy7rCDtmZjqsr0gKyBkZXZSdW5uZXIg7Zmc7ISx7ZmUIOyLnClcbiAgICBpZiAoaXNMb2NhbCgpICYmIHRoaXMuY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgICAgY29uc3QgeyByZWdpc3RlckRldlRlc3RSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rlc3RpbmcvZGV2LXRlc3Qtcm91dGVzXCIpO1xuICAgICAgYXdhaXQgcmVnaXN0ZXJEZXZUZXN0Um91dGVzKHNlcnZlciwgdGhpcy5jb25maWcudGVzdC5kZXZSdW5uZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4odGhpcy5hcHBSb290UGF0aCwgXCJ3ZWJcIik7XG4gICAgY29uc3QgaGFzV2ViID0gYXdhaXQgZXhpc3RzKHdlYlBhdGgpO1xuXG4gICAgLy8g7KCE7JetIGNvbXByZXNzIOyYteyFmCDqs4TsgrAgKHJvdXRlLmNvbXByZXNzOiB0cnVl7J28IOuVjCDsgqzsmqkpXG4gICAgY29uc3QgcGx1Z2luQ29tcHJlc3MgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8uY29tcHJlc3M7XG4gICAgY29uc3QgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQgPSBwbHVnaW5Db21wcmVzc1xuICAgICAgPyBwbHVnaW5Db21wcmVzcyA9PT0gdHJ1ZVxuICAgICAgICA/IHsgdGhyZXNob2xkOiAxMDI0LCBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHRocmVzaG9sZDogcGx1Z2luQ29tcHJlc3MudGhyZXNob2xkLFxuICAgICAgICAgICAgZW5jb2RpbmdzOiBwbHVnaW5Db21wcmVzcy5lbmNvZGluZ3MsXG4gICAgICAgICAgICBjdXN0b21UeXBlczogcGx1Z2luQ29tcHJlc3MuY3VzdG9tVHlwZXMsXG4gICAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6wg6rCc67CcIO2ZmOqyvTogY2F0Y2gtYWxs66GcIEFQSeulvCDrj5nsoIEg66ek7Lmt7ZWY7JesIEhNUuydhCDsp4Dsm5Dtlanri4jri6QuXG4gICAgICAvLyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQj15ZXProZwg7ISk7KCV7ZWY66m0IGRldl9hcGkg66qo65Oc7JeQ7IScIFZpdGUg7Ya17ZWp7J2EIOu5hO2ZnOyEse2ZlO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgY29uc3QgZGlzYWJsZUludGVncmF0ZWRXZWIgPSBwcm9jZXNzLmVudi5TT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiA9PT0gXCJ5ZXNcIjtcbiAgICAgIGlmIChoYXNXZWIgJiYgIWRpc2FibGVJbnRlZ3JhdGVkV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZShzZXJ2ZXIsIHdlYlBhdGgsIGNvbmZpZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldHVwRGV2U2VydmVyKHNlcnZlciwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7ZSE66Gc642V7IWYIO2ZmOqyvTog6rCc67OEIEFQSSDrnbzsmrDtirggKyDsoJXsoIEg7YyM7J28IOyEnOu5mVxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgdGhpcy5zeW5jZXIuYXBpcykge1xuICAgICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgICAgIHVybDogdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuY3JlYXRlQXBpSGFuZGxlcihhcGksIGNvbmZpZyksXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKGFwaS5vcHRpb25zLmNvbXByZXNzLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZSE66Gc642V7IWY7JeQ7ISc64qUIHdlYiDshozsiqQoYXBwUm9vdC93ZWIpIOycoOustOyZgCDrrLTqtIDtlZjqsowsXG4gICAgICAvLyBhcGkvd2ViLWRpc3Qg7KG07J6sIOyXrOu2gOulvCBzZXR1cFN0YXRpY1dlYlNlcnZlciDrgrTrtoDsl5DshJwg7YyQ64uo7ZWp64uI64ukLlxuICAgICAgYXdhaXQgdGhpcy5zZXR1cFN0YXRpY1dlYlNlcnZlcihzZXJ2ZXIsIGNvbmZpZywgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGV2IOuqqOuTnCDqs7XthrU6IGNhdGNoLWFsbOyXkOyEnCBzeW5jZXIuYXBpc+ulvCDrj5nsoIHsnLzroZwg7YOQ7IOJ7ZWY7JesIEFQSSDsmpTssq3snYQg7LKY66as7ZWp64uI64ukLlxuICAgKiBzZXJ2ZXIucm91dGUoKeuhnCDqsJzrs4Qg65Ox66Gd7ZWY66m0IGhhbmRsZXLqsIAg6rOg7KCV65CY7Ja0IEhNUuydtCDrj5nsnpHtlZjsp4Ag7JWK7Jy866+A66GcLFxuICAgKiDrp6Qg7JqU7LKt66eI64ukIHN5bmNlci5hcGlz66W8IOyhsO2ajO2VmOuKlCDsnbQg67Cp7Iud7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAgICpcbiAgICog7JqU7LKt7J20IC9hcGko7KCV7ZmV7Z6I64qUIHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgp66GcIOyLnOyeke2VmOyngCDslYrripQg6rK97Jqw652866m0IG51bGzsnYQg67CY7ZmY7ZWY66mwIOuBneuDheuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRGV2QXBpUmVxdWVzdChcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6ICgocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4pIHwgbnVsbCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kO1xuXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gc3luY2VyLmFwaXPsnZggcGF0aOuKlCA6cGFyYW0g7ZiV7YOc66W8IO2PrO2VqO2VoCDsiJgg7J6I7Jy866+A66GcIOyEuOq3uOuovO2KuCDri6jsnITroZwg66ek7Lmt7ZWp64uI64ukLlxuICAgIC8vIOygleq3nOyLnSDsg53shLEg67Cp7Iud7J2AIHBhdGgg66y47J6Q7Je0IOuCtCDtirnsiJjrrLjsnpAoLiwgKywgKCwgWyDrk7Ep66GcIOyYpOyekeuPme2VoCDsiJgg7J6I7Ja0IOyCrOyaqe2VmOyngCDslYrsirXri4jri6QuXG4gICAgY29uc3QgbWF0Y2hlZEFwaSA9IHRoaXMuc3luY2VyLmFwaXMuZmluZCgoYXBpKSA9PiB7XG4gICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXBpTWV0aG9kID0gYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiO1xuICAgICAgaWYgKGFwaU1ldGhvZCAhPT0gbWV0aG9kKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoO1xuICAgICAgcmV0dXJuIHRoaXMuaXNQYXRoUGF0dGVybk1hdGNoKGZ1bGxQYXRoLCB1cmwpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFtYXRjaGVkQXBpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIobWF0Y2hlZEFwaSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYgYXBpIOuqqOuTnDogVml0ZSDsl4bsnbQgQVBJIOuPmeyggSDrnbzsmrDtjIXrp4wg7KCc6rO17ZWp64uI64ukLlxuICAgKiBITVLsnYQg7JyE7ZW0IGNhdGNoLWFsbOyXkOyEnCDrp6Qg7JqU7LKt66eI64ukIHN5bmNlci5hcGlz66W8IOyhsO2ajO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgc2V0dXBEZXZTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IHZvaWQge1xuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g7IKs7IukIC9hcGnroZwg7Iuc7J6R7ZWY7KeAIOyViuuKlCDsmpTssq3snYAg7Jes6riw7JeQIOuTpOyWtOyYpOyngOuPhCDslYrsnYQg6rGw6528IOydtCDrnbzsnbjsnYAg64+E64usIOu2iOqwgOuKpeyeheuLiOuLpOunjCxcbiAgICAgICAgLy8g7JWI7KCE67m17Jy866GcIOuCqOqyqOuGk+yKteuLiOuLpC5cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFZpdGVEZXZTZXJ2ZXIg7YOA7J6F7J2EIOuPmeyggeycvOuhnCDroZzrk5ztlbTslbwg7ZWoXG4gIHByaXZhdGUgdml0ZVNlcnZlcjogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogZGV2IGFsbCDrqqjrk5w6IFZpdGUgRGV2IFNlcnZlcuulvCDthrXtlantlZjsl6wgQVBJICsgU1NSICsgQ1NS7J2EIOuqqOuRkCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEFQSSDrj5nsoIEg66ek7Lmt7J2AIGhhbmRsZURldkFwaVJlcXVlc3Trpbwg6rO17Jyg7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cERldlNlcnZlcldpdGhWaXRlKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgd2ViUGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcblxuICAgIHRoaXMudml0ZVNlcnZlciA9IGF3YWl0IHZpdGUuY3JlYXRlU2VydmVyKHtcbiAgICAgIHJvb3Q6IHdlYlBhdGgsXG4gICAgICBzZXJ2ZXI6IHtcbiAgICAgICAgbWlkZGxld2FyZU1vZGU6IHRydWUsXG4gICAgICAgIGhtcjoge1xuICAgICAgICAgIHNlcnZlcjogc2VydmVyLnNlcnZlcixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcHBUeXBlOiBcImN1c3RvbVwiLFxuICAgIH0pO1xuXG4gICAgLy8gVml0ZSBtaWRkbGV3YXJlIOuTseuhnSAoVml0ZSDsl5DshYsg7LKY66asKVxuICAgIHNlcnZlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICAvLyBBUEnsmYAgU29uYW11IFVJ64qUIEZhc3RpZnkg65287Jqw7Yq46rCAIOyymOumrO2VmOuPhOuhnSBza2lwXG4gICAgICBpZiAocmVxLnVybD8uc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSB8fCByZXEudXJsPy5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuICAgICAgLy8g64KY66i47KeA64qUIFZpdGUgbWlkZGxld2FyZeuhnCDsoITri6xcbiAgICAgIHJldHVybiB0aGlzLnZpdGVTZXJ2ZXIubWlkZGxld2FyZXMocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuXG4gICAgLy8gY2F0Y2gtYWxsIOudvOyasO2KuOyXkOyEnCDrj5nsoIHsnLzroZwgQVBJL1NTUiDsspjrpqxcbiAgICAvLyDqsJzrsJwg7ZmY6rK97JeQ7ISc64qUIOudvOyasO2KuOuzhCBjb21wcmVzcyDsmLXshZjsnYQg7Y+s6riw7ZWY6rOgIEhNUiDsnbTsoJDsnYQg7Leo7ZWp64uI64ukLlxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IFwiLypcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAvLyAxLiBBUEkg7JqU7LKtIOyymOumrFxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICAgICAgLy8gMi4gU1NSIOudvOyasO2KuCDsspjrpqxcbiAgICAgICAgY29uc3QgeyBtYXRjaFNTUlJvdXRlLCByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgICAgY29uc3Qgc3NyTWF0Y2ggPSBtYXRjaFNTUlJvdXRlKHVybCk7XG4gICAgICAgIGlmIChzc3JNYXRjaCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3Nzck1hdGNoLnJvdXRlLnBhdGh9YCk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUihcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHNzck1hdGNoLnJvdXRlLFxuICAgICAgICAgICAgc3NyTWF0Y2gucGFyYW1zLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdGhpcy52aXRlU2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIENTUiBmYWxsYmFja1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSBhd2FpdCBmcy5yZWFkRmlsZShcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnZpdGVTZXJ2ZXIuY29uZmlnLnJvb3QsIFwiaW5kZXguaHRtbFwiKSxcbiAgICAgICAgICAgIFwidXRmLThcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHRlbXBsYXRlID0gYXdhaXQgdGhpcy52aXRlU2VydmVyLnRyYW5zZm9ybUluZGV4SHRtbCh1cmwsIHRlbXBsYXRlKTtcblxuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoZSBhcyBFcnJvcik7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNTAwKTtcbiAgICAgICAgICByZXR1cm4gKGUgYXMgRXJyb3IpLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7KKF66OMIOyLnCBWaXRl64+EIOyiheujjFxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKFwi4pyTIFZpdGUgZGV2IHNlcnZlciBpbnRlZ3JhdGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFN0YXRpY1dlYlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3dlYi1kaXN0L2NsaWVudCAo7KCV7KCBIO2MjOydvCksIGFwaS93ZWItZGlzdC9zZXJ2ZXIgKFNTUiBlbnRyeSksIGFwaS9kaXN0L3NzciAoU1NSIHJvdXRlcyAtIEFQSSDshozsnKApXG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcImNsaWVudFwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG4gICAgY29uc3Qgc3NyRW50cnlQYXRoID0gcGF0aC5qb2luKHNzclBhdGgsIFwiZW50cnktc2VydmVyLmdlbmVyYXRlZC5qc1wiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXNQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPSAocmVxdWVzdC5wYXJhbXMgYXMgeyBmaWxlbmFtZTogc3RyaW5nIH0pLmZpbGVuYW1lO1xuICAgICAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImFzc2V0c1wiKTtcbiAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKGFzc2V0c0RpciwgcmVxdWVzdGVkRmlsZSk7XG4gICAgICBpZiAoc2FmZUZpbGVQYXRoID09PSBudWxsKSB7XG4gICAgICAgIHJlcGx5LnN0YXR1cyg0MDMpLnNlbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUgPSBwYXRoLnJlbGF0aXZlKGFzc2V0c0Rpciwgc2FmZUZpbGVQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblxuICAgICAgY29uc3QgYXNzZXRQYXRoID0gYC9hc3NldHMvJHtub3JtYWxpemVkUmVxdWVzdGVkRmlsZX1gO1xuXG4gICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDqsrDsoJVcbiAgICAgIGNvbnN0IGdldENhY2hlQ29udHJvbEZvckFzc2V0ID0gKCk6IENhY2hlQ29udHJvbENvbmZpZyA9PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgIHR5cGU6IFwiYXNzZXRzXCIsXG4gICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICBwYXRoOiBhc3NldFBhdGgsXG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyDsgqzsmqnsnpAg7KCV7J2YIO2VuOuTpOufrCDsmrDshKBcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDquLDrs7jqsJI6IGltbXV0YWJsZVxuICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGluZGV4LSouanMg65iQ64qUIGluZGV4LSouY3NzIOyalOyyreyduCDqsr3smrBcbiAgICAgIGlmICgvXmluZGV4LVthLWYwLTldK1xcLihqc3xjc3MpJC8udGVzdChub3JtYWxpemVkUmVxdWVzdGVkRmlsZSkpIHtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoYXNzZXRzRGlyKTtcbiAgICAgICAgY29uc3QgY3VycmVudEZpbGUgPSBmaWxlcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoXCJpbmRleC1cIikgJiYgZi5lbmRzV2l0aChgLiR7ZXh0fWApKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpbGUpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihhc3NldHNEaXIsIGN1cnJlbnRGaWxlKTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgIHJlcGx5LnR5cGUoZXh0ID09PSBcImpzXCIgPyBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiA6IFwidGV4dC9jc3NcIik7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGdldENhY2hlQ29udHJvbEZvckFzc2V0KCkpO1xuICAgICAgICAgIHJldHVybiByZXBseS5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCDtjIzsnbwg7ISc67mZXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHNhZmVGaWxlUGF0aDtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dCA9IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogZXh0ID09PSBcImNzc1wiID8gXCJ0ZXh0L2Nzc1wiIDogXCJcIik7XG4gICAgICAgIGlmIChub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICB9XG5cbiAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICB9KTtcblxuICAgIC8vIFNTUiDrnbzsmrDtirgg6rCc67OEIOuTseuhnSAoY29tcHJlc3Mg7Ji17IWY7J20IOudvOyasO2KuOuzhOuhnCDsoIHsmqnrkJjrj4TroZ0pXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc3QgeyBnZXRTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgIGNvbnN0IHsgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3IvcmVuZGVyZXJcIik7XG4gICAgICBjb25zdCBzc3JSb3V0ZXMgPSBnZXRTU1JSb3V0ZXMoKTtcblxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzc3JSb3V0ZXMpIHtcbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICAgICAgdXJsOiByb3V0ZS5wYXRoLFxuICAgICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihyb3V0ZS5jb21wcmVzcyA/PyB0cnVlLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtyb3V0ZS5wYXRofWApO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlLnBhdGgsIHVybCk7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVuZGVyU1NSKHVybCwgcm91dGUsIHBhcmFtcywgcmVxdWVzdCwgcmVwbHksIGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDU1Igb3IgU3RhdGljIEZpbGUgRmFsbGJhY2sgKFNTUiDrnbzsmrDtirjsl5Ag66ek7Lmt65CY7KeAIOyViuuKlCDrqqjrk6Ag7JqU7LKtKVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICB1cmw6IFwiKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIC8vIC9hcGksIC9zb25hbXUtdWnripQgNDA0IOq3uOuMgOuhnFxuICAgICAgICBpZiAocmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9hcGlcIikgfHwgcmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9zb25hbXUtdWlcIikpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDA0KS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ1NS7JqpIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCBjc3JDYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiY3NyXCIsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgICAgcGF0aDogcmVxdWVzdC51cmwuc3BsaXQoXCI/XCIpWzBdLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlQ29uZmlnID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY3NyQ2FjaGVSZXEpO1xuXG4gICAgICAgICAgaWYgKGNzckNhY2hlQ29uZmlnKSB7XG4gICAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgY3NyQ2FjaGVDb25maWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOygleyggSDtjIzsnbzsnbQg7KG07J6s7ZWgIOqyveyasCwg7KCV7KCBIO2MjOydvOydhCDrqLzsoIAg7ISc67mZ7ZW07JW87ZWoXG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgICAgICBjb25zdCBzYWZlRmlsZVBhdGggPSB0aGlzLnJlc29sdmVQYXRoV2l0aGluQmFzZURpcih3ZWJEaXN0UGF0aCwgcmVxdWVzdFBhdGgpO1xuICAgICAgICBpZiAoc2FmZUZpbGVQYXRoID09PSBudWxsKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzYWZlRmlsZVBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHNhZmVGaWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnR5cGUobWltZUxvb2t1cChzYWZlRmlsZVBhdGgpIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIpLnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1IgZmFsbGJhY2s6IGluZGV4Lmh0bWwg7ISc67mZXG4gICAgICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpO1xuICAgICAgICByZXR1cm4gcmVwbHkudHlwZShcInRleHQvaHRtbFwiKS5zZW5kKGF3YWl0IGZzLnJlYWRGaWxlKGluZGV4UGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKckyBTdGF0aWMgd2ViIHNlcnZlciBjb25maWd1cmVkIHdpdGggJHtzc3JBdmFpbGFibGUgPyBcIlNTUlwiIDogXCJDU1Igb25seVwifSBzdXBwb3J0YCk7XG4gIH1cblxuICBjcmVhdGVBcGlIYW5kbGVyKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICAoYXBpLm9wdGlvbnMuZ3VhcmRzID8/IFtdKS5ldmVyeSgoZ3VhcmQpID0+IGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSkpO1xuXG4gICAgICAgIC8vIO2MjOudvOuvuO2EsCDsoJXrs7TroZwgem9kIOyKpO2CpOuniCDruYzrk5xcbiAgICAgICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICAgICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICAgIGxldCByZXFCb2R5OiB7XG4gICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgICAgLy8g7YyM7J28IOyXheuhnOuTnCDsnojripQg6rK97JqwIOyehOyLnCDrjbDsnbTthLBcbiAgICAgICAgY29uc3QgZmlsZXM6IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRlZEZpbGVbXTtcbiAgICAgICAgfSA9IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBbXSxcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSAocmVxdWVzdFt3aGljaF0gPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSByZXF1ZXN0LnBhcnRzKHtcbiAgICAgICAgICAgICAgbGltaXRzOiBhcGkudXBsb2FkT3B0aW9ucy5saW1pdHMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gRm9ybURhdGHsnZggZmllbGTrk6TsnYQg7J6E7Iuc66GcIOyggOyepVxuICAgICAgICAgICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICAgICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID09PSBcImJ1ZmZlclwiIHx8ICFhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lKSB7XG4gICAgICAgICAgICAgIC8vIEJ1ZmZlciDrqqjrk5w6IOuplOuqqOumrOyXkCDroZzrk5xcbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIENSSVRJQ0FMOiDtjIzsnbwg7Iqk7Yq466a87J2EIOymieyLnCBjb25zdW1l7ZW07JW8IOuLpOydjCBwYXJ066GcIOuEmOyWtOqwiCDsiJgg7J6I7J2MXG4gICAgICAgICAgICAgICAgICAvLyDsnbQg7Zi47Lac7J20IOyXhuycvOuptCDsooXsooUgbXVsdGlwYXJ0IO2MjOyLseydtCBwZW5kaW5nIOyDge2DnOuhnCDtg4DsnoTslYTsm4Mg67Cc7IOdXG4gICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBwYXJ0LnRvQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICBmaWxlcy5idWZmZXJlZEZpbGVzLnB1c2gobmV3IEJ1ZmZlcmVkRmlsZShwYXJ0LCBidWZmZXIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICAgIC8vIFN0cmVhbSDrqqjrk5w6IOymieyLnCDsoIDsnqXshozroZwg7Iqk7Yq466as67CNXG4gICAgICAgICAgICAgIGNvbnN0IGRpc2tOYW1lID0gYXBpLnVwbG9hZE9wdGlvbnMuZGVzdGluYXRpb247XG4gICAgICAgICAgICAgIGNvbnN0IGRpc2sgPSB0aGlzLnN0b3JhZ2UudXNlKGRpc2tOYW1lKTtcblxuICAgICAgICAgICAgICAvLyDsmrDshKDsiJzsnIQ6IOuNsOy9lOugiOydtO2EsCA+IOyghOyXrSDshKTsoJUgPiDquLDrs7jqsJJcbiAgICAgICAgICAgICAgY29uc3Qga2V5R2VuZXJhdG9yOiBLZXlHZW5lcmF0b3IgPVxuICAgICAgICAgICAgICAgIGFwaS51cGxvYWRPcHRpb25zLmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNlcnZlci5zdG9yYWdlPy5rZXlHZW5lcmF0b3IgPz9cbiAgICAgICAgICAgICAgICBkZWZhdWx0S2V5R2VuZXJhdG9yO1xuXG4gICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBrZXlHZW5lcmF0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgYXdhaXQgZGlzay5wdXRTdHJlYW0oa2V5LCBwYXJ0LmZpbGUsIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgZGlzay5nZXRVcmwoa2V5KTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZFVybCA9IGF3YWl0IGRpc2suZ2V0U2lnbmVkVXJsKGtleSk7XG5cbiAgICAgICAgICAgICAgICAgIGZpbGVzLnVwbG9hZGVkRmlsZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVwbG9hZGVkRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZTogcGFydC5maWxlLmJ5dGVzUmVhZCxcbiAgICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgc2lnbmVkVXJsLFxuICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNrTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHFz66GcIOykkeyyqSDqtazsobAg7YyM7IuxOiBwYXJhbXNbY2F0ZWdvcnldIOKGkiB7IHBhcmFtczogeyBjYXRlZ29yeTogXCJ0ZXN0XCIgfSB9XG4gICAgICAgICAgICBjb25zdCBxcyA9IGF3YWl0IGltcG9ydChcInFzXCIpO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcXMuZGVmYXVsdC5wYXJzZShmaWVsZHMpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihib2R5LCBwYXJzZWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZmFzdGlmeUNhc3RlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jYXN0ZXJcIik7XG4gICAgICAgICAgcmVxQm9keSA9IGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UoYm9keSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBab2RFcnJvcikge1xuICAgICAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAgICAgLm1hcCgoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24obWVzc2FnZXMgYXMgTG9jYWxpemVkU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udGVudC1UeXBlXG4gICAgICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICAgICAgICBjb25zdCBhcGlDYWNoZUNvbmZpZyA9IHRoaXMuZ2V0QXBpQ2FjaGVDb250cm9sKGFwaSwgcmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGFwaUNhY2hlQ29uZmlnKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGFwaUNhY2hlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOyXheuhnOuTnCDsmLXshZjsnbQg7J6I64qUIOqyveyasCDtjIzsnbwg642w7J207YSw66W8IENvbnRleHTsl5Ag7LaU6rCAXG4gICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGNvbnN1bWUgPSBhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID8/IFwiYnVmZmVyXCI7XG4gICAgICAgICAgaWYgKGNvbnN1bWUgPT09IFwiYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYnVmZmVyZWRGaWxlcyA9IGZpbGVzLmJ1ZmZlcmVkRmlsZXM7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25zdW1lID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICBjb250ZXh0LnVwbG9hZGVkRmlsZXMgPSBmaWxlcy51cGxvYWRlZEZpbGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuqqOuNuCDrqZTshozrk5wgYXJncyDsg53shLHtlZjsl6wg7Zi47LacXG4gICAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICAvLyBDb250ZXh0IOyduOygneyFmFxuICAgICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlcUJvZHlbcGFyYW0ubmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVVJM7JeQ7IScIHBhdGggcGFyYW1z66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICog7JiIOiBwYXR0ZXJuPVwiL2FkbWluL2NvbXBhbmllcy86Y29tcGFueUlkXCIsIHVybD1cIi9hZG1pbi9jb21wYW5pZXMvMTIzXCIg4oaSIHsgY29tcGFueUlkOiBcIjEyM1wiIH1cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFBhdGhQYXJhbXMocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGF0dGVyblBhcnRzW2ldLnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIHBhcmFtc1twYXR0ZXJuUGFydHNbaV0uc2xpY2UoMSldID0gdXJsUGFydHNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aFBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwodXJsKS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgaWYgKHBhdHRlcm5QYXJ0cy5sZW5ndGggIT09IHVybFBhcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXR0ZXJuUGFydCA9IHBhdHRlcm5QYXJ0c1tpXTtcbiAgICAgIGNvbnN0IHVybFBhcnQgPSB1cmxQYXJ0c1tpXTtcbiAgICAgIGlmIChwYXR0ZXJuUGFydC5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXR0ZXJuUGFydCAhPT0gdXJsUGFydCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldFBhdGhuYW1lRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybC5zcGxpdChcIj9cIilbMF07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQYXRoV2l0aGluQmFzZURpcihiYXNlRGlyOiBzdHJpbmcsIGlucHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVVUklDb21wb25lbnQoaW5wdXRQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICAgIGlmIChkZWNvZGVkLmluY2x1ZGVzKFwiXFwwXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZGVjb2RlZC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZUZyb21CYXNlID0gcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCByZXNvbHZlZFBhdGgpO1xuICAgICAgaWYgKHJlbGF0aXZlRnJvbUJhc2Uuc3RhcnRzV2l0aChcIi4uXCIpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZUZyb21CYXNlKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQVBJIOydkeuLteyXkCDsoIHsmqntlaAgQ2FjaGUtQ29udHJvbCDshKTsoJXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICAgKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGdldEFwaUNhY2hlQ29udHJvbChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKSB7XG4gICAgLy8g642w7L2U66CI7J207YSwIOyEpOyglSDsmrDshKBcbiAgICBpZiAoYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sKSB7XG4gICAgICByZXR1cm4gYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sO1xuICAgIH1cblxuICAgIC8vIOyghOyXrSDtlbjrk6Trn6xcbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICB0eXBlOiBcImFwaVwiLFxuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBwYXRoOiByZXF1ZXN0LnJvdXRlT3B0aW9ucz8udXJsID8/IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYXBpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU1NS7JqpIEFQSSDtmLjstpwgKEhUVFAg7Jik67KE7Zek65OcIOyXhuydtCDsp4HsoJEg7Zi47LacKVxuICAgKiBjcmVhdGVBcGlIYW5kbGVy7J2YIOuhnOyngeydhCDsnqzsgqzsmqntlZjrkJgsIHJlcXVlc3Qg7YyM7IuxIOuMgOyLoCBwYXJhbXMg7KeB7KCRIOyCrOyaqVxuICAgKi9cbiAgYXN5bmMgaW52b2tlQXBpRm9yU1NSKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBTU1Lsl5DshJwg64uk7JaR7ZWcIO2DgOyeheydmCBwYXJhbXPrpbwg67Cb7JWE7JW8IO2VqFxuICAgIHBhcmFtczogYW55W10sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbXNJbmRleCsrXTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGludm9rZU1vZGVsTWV0aG9kKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXJnczogdW5rbm93bltdLFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogbW9kZWzsnYAg66qo6424IOyduOyKpO2EtOyKpOydtOuvgOuhnCDrqZTshJzrk5wg7Zi47LacIOqwgOuKpVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChtb2RlbCBhcyBhbnkpW2FwaS5tZXRob2ROYW1lXS5hcHBseShtb2RlbCwgYXJncyk7XG4gICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQ29udGV4dChcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTxDb250ZXh0PiB7XG4gICAgLy8gY3JlYXRlU1NFRmFjdG9yeSDtlajsiJjsl5Ag66+466asIHJlcXVlc3TsnZggc29ja2V06rO8IHJlcGx566W8IOuwlOyduOuUqS5cbiAgICBjb25zdCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0cmVhbS9zc2VcIik7XG4gICAgY29uc3QgY3JlYXRlU1NFID0gKDxUIGV4dGVuZHMgWm9kT2JqZWN0PihcbiAgICAgIF9yZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICAgIF9yZXBseTogRmFzdGlmeVJlcGx5LFxuICAgICAgX2V2ZW50czogVCxcbiAgICApID0+IGNyZWF0ZVNTRUZhY3RvcnkoX3JlcXVlc3Quc29ja2V0LCBfcmVwbHksIF9ldmVudHMpKS5iaW5kKG51bGwsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIC8vIGxvY2FsZSDqsJDsp4BcbiAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgdGhpcy5kZXRlY3RMb2NhbGUocmVxdWVzdC5oZWFkZXJzW1wiYWNjZXB0LWxhbmd1YWdlXCJdLCB0aGlzLmNvbmZpZy5pMThuLnN1cHBvcnRlZExvY2FsZXMpID8/XG4gICAgICB0aGlzLmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGU7XG5cbiAgICAvLyBhdXRoIGNvbnRleHQg7LaU6rCAXG4gICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcbiAgICBjb25zdCBzZXNzaW9uID0gKGF3YWl0IHRoaXMuX2F1dGg/LmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KSkgPz8gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAuLi4oYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICAgIG5haXRlU3RvcmU6IE5haXRlLmNyZWF0ZVN0b3JlKCksXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICAgICAgICBzZXNzaW9uOiBzZXNzaW9uPy5zZXNzaW9uID8/IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5LFxuICAgICAgICApLFxuICAgICAgKSksXG4gICAgfTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQtTGFuZ3VhZ2Ug7Zek642U7JeQ7IScIOyngOybkO2VmOuKlCBsb2NhbGXsnYQg7LC+7Iq164uI64ukLlxuICAgKiBAZXhhbXBsZSBcImtvLUtSLGtvO3E9MC45LGVuO3E9MC44XCIg4oaSIFwia29cIlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RMb2NhbGUoXG4gICAgYWNjZXB0TGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdXBwb3J0ZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXB0TGFuZ3VhZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBBY2NlcHQtTGFuZ3VhZ2U6IGtvLUtSLGtvO3E9MC45LGVuO3E9MC44XG4gICAgY29uc3QgbGFuZ3MgPSBhY2NlcHRMYW5ndWFnZS5zcGxpdChcIixcIikubWFwKChsYW5nKSA9PiB7XG4gICAgICBjb25zdCBbY29kZV0gPSBsYW5nLnNwbGl0KFwiO1wiKTtcbiAgICAgIHJldHVybiBjb2RlLnRyaW0oKS5zcGxpdChcIi1cIilbMF07IC8vIGtvLUtSIOKGkiBrb1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmdzLmZpbmQoKGxhbmcpID0+IHN1cHBvcnRlZC5pbmNsdWRlcyhsYW5nKSk7XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2F0Y2hQYXRoID0gW3BhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiKV07XG5cbiAgICBjb25zdCBjaG9raWRhciA9IChhd2FpdCBpbXBvcnQoXCJjaG9raWRhclwiKSkuZGVmYXVsdDtcbiAgICB0aGlzLndhdGNoZXIgPSBjaG9raWRhci53YXRjaCh3YXRjaFBhdGgsIHtcbiAgICAgIGlnbm9yZWQ6IChwYXRoLCBzdGF0cykgPT5cbiAgICAgICAgISFzdGF0cz8uaXNGaWxlKCkgJiYgIXBhdGguZW5kc1dpdGgoXCIudHNcIikgJiYgIXBhdGguZW5kc1dpdGgoXCIuanNvblwiKSxcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy53YXRjaGVyLm9uKFwiYWxsXCIsIGFzeW5jIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCBhcyBBYnNvbHV0ZVBhdGg7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKHRoaXMuYXBpUm9vdFBhdGgpLFxuICAgICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBBUEkgcm9vdCBwYXRoXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBzb25hbXUuY29uZmlnLnRzIOuzgOqyvSDsi5wg7J6s7Iuc7J6RXG4gICAgICAgIGNvbnN0IGlzQ29uZmlnVHMgPSBmaWxlUGF0aCA9PT0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcblxuICAgICAgICBpZiAoaXNDb25maWdUcykge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UodGhpcy5hcGlSb290UGF0aCwgXCJhcGlcIik7XG4gICAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZUNoYW5nZShldmVudCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAgIEEgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5pdCBhbmQgZGVzdHJveSB3aGVuIHVzaW5nIFNvbmFtdSB2aWEgc2NyaXB0cy5cbiAgKi9cbiAgYXN5bmMgcnVuU2NyaXB0KGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlclBsdWdpbnMoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIHBsdWdpbnM6IFNvbmFtdVNlcnZlck9wdGlvbnNbXCJwbHVnaW5zXCJdKSB7XG4gICAgaWYgKCFwbHVnaW5zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY29tcHJlc3Mg7ZSM65+s6re47J247J2AIOuLpOuluCDtlIzrn6zqt7jsnbjrs7Tri6Qg66i87KCAIOuTseuhneuQmOyWtOyVvCDtlanri4jri6QuXG4gICAgaWYgKHBsdWdpbnMuY29tcHJlc3MpIHtcbiAgICAgIGNvbnN0IGNvbXByZXNzUGx1Z2luID0gKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L2NvbXByZXNzXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIHRocmVzaG9sZDogMTAyNCxcbiAgICAgICAgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIGFzIChcImJyXCIgfCBcImd6aXBcIiB8IFwiZGVmbGF0ZVwiKVtdLFxuICAgICAgfTtcblxuICAgICAgaWYgKHBsdWdpbnMuY29tcHJlc3MgPT09IHRydWUpIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKGNvbXByZXNzUGx1Z2luLCBkZWZhdWx0T3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIHtcbiAgICAgICAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAgICAgICAuLi5wbHVnaW5zLmNvbXByZXNzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwbHVnaW5zTW9kdWxlcyA9IHtcbiAgICAgIGNvcnM6IFwiQGZhc3RpZnkvY29yc1wiLFxuICAgICAgZm9ybWJvZHk6IFwiQGZhc3RpZnkvZm9ybWJvZHlcIixcbiAgICAgIG11bHRpcGFydDogXCJAZmFzdGlmeS9tdWx0aXBhcnRcIixcbiAgICAgIHFzOiBcImZhc3RpZnktcXNcIixcbiAgICAgIHNzZTogXCJmYXN0aWZ5LXNzZS12MlwiLFxuICAgICAgc3RhdGljOiBcIkBmYXN0aWZ5L3N0YXRpY1wiLFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICBjb25zdCByZWdpc3RlclBsdWdpbiA9IGFzeW5jIDxLIGV4dGVuZHMga2V5b2YgTm9uTnVsbGFibGU8dHlwZW9mIHBsdWdpbnM+PihcbiAgICAgIGtleTogSyxcbiAgICAgIHBsdWdpbk5hbWU6IHN0cmluZyxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHBsdWdpbnNba2V5XTtcbiAgICAgIGlmICghb3B0aW9uKSByZXR1cm47XG5cbiAgICAgIGlmIChvcHRpb24gPT09IHRydWUpIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKChhd2FpdCBpbXBvcnQocGx1Z2luTmFtZSkpLmRlZmF1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKChhd2FpdCBpbXBvcnQocGx1Z2luTmFtZSkpLmRlZmF1bHQsIG9wdGlvbik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgcGx1Z2luTmFtZV0gb2YgT2JqZWN0LmVudHJpZXMocGx1Z2luc01vZHVsZXMpKSB7XG4gICAgICBhd2FpdCByZWdpc3RlclBsdWdpbihrZXkgYXMga2V5b2YgdHlwZW9mIHBsdWdpbnMsIHBsdWdpbk5hbWUpO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW5zLmN1c3RvbSkge1xuICAgICAgcGx1Z2lucy5jdXN0b20oc2VydmVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmV0dGVyLWF1dGgg65287Jqw7Yq466W8IOuTseuhne2VqeuLiOuLpC5cbiAgICogL2FwaS9hdXRoLyog6rK966Gc66GcIOyduOymnSBBUEnqsIAg7J6Q64+ZIOuTseuhneuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJCZXR0ZXJBdXRoKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICAgIG9wdGlvbnM6IE5vbk51bGxhYmxlPFNvbmFtdVNlcnZlck9wdGlvbnNbXCJhdXRoXCJdPixcbiAgKSB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IG9wdGlvbnMuYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcblxuICAgIC8vIOyCrOyaqeyekCDshKTsoJXqs7wg6riw67O46rCS7J2EIG1lcmdlXG4gICAgY29uc3QgbWVyZ2VkRmllbGRNYXBwaW5ncyA9IG1lcmdlKEJBU0VfRklFTERfTUFQUElOR1MsIG9wdGlvbnMpO1xuXG4gICAgLy8gYmV0dGVyLWF1dGgg7J247Iqk7YS07IqkIOyDneyEsVxuICAgIGNvbnN0IHsgYmV0dGVyQXV0aCB9ID0gYXdhaXQgaW1wb3J0KFwiYmV0dGVyLWF1dGhcIik7XG4gICAgY29uc3QgeyBQb29sIH0gPSBhd2FpdCBpbXBvcnQoXCJwZ1wiKTtcblxuICAgIHRoaXMuX2F1dGggPSBiZXR0ZXJBdXRoKHtcbiAgICAgIGRhdGFiYXNlOiBuZXcgUG9vbChEQi5nZXREQkNvbmZpZyhcIndcIikuY29ubmVjdGlvbiBhcyBQb29sQ29uZmlnKSxcbiAgICAgIC4uLm1lcmdlZEZpZWxkTWFwcGluZ3MsXG4gICAgfSk7XG5cbiAgICAvLyBiZXR0ZXItYXV0aCDrnbzsmrDtirgg65Ox66GdXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiUE9TVFwiXSxcbiAgICAgIHVybDogYCR7YmFzZVBhdGh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwsIGBodHRwOi8vJHtyZXF1ZXN0LmhlYWRlcnMuaG9zdH1gKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcbiAgICAgICAgY29uc3QgcmVxID0gbmV3IFJlcXVlc3QodXJsLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgLi4uKHJlcXVlc3QuYm9keSA/IHsgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5ib2R5KSB9IDoge30pLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5oYW5kbGVyKHJlcSk7XG5cbiAgICAgICAgcmVwbHkuc3RhdHVzKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXBseS5oZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChyZXNwb25zZS5ib2R5ID8gYXdhaXQgcmVzcG9uc2UudGV4dCgpIDogbnVsbCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBiZXR0ZXItYXV0aCByZWdpc3RlcmVkIGF0ICR7YmFzZVBhdGh9LypgKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVDYWNoZShjb25maWc6IENhY2hlQ29uZmlnIHwgdW5kZWZpbmVkLCBmb3JUZXN0aW5nOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyBzZXRDYWNoZU1hbmFnZXJSZWYgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2RlY29yYXRvclwiKTtcblxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJwg66mU66qo66asIOuTnOudvOydtOuyhCDsnpDrj5kg7IKs7JqpXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIGNvbnN0IHsgY3JlYXRlVGVzdENhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICAgIHRoaXMuX2NhY2hlID0gY3JlYXRlVGVzdENhY2hlTWFuYWdlcigpO1xuICAgICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKHRoaXMuX2NhY2hlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsnbQg7JeG7Jy866m0IOy6kOyLnCDruYTtmZzshLHtmZRcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleyXkCDrlLDrnbwgQ2FjaGVNYW5hZ2VyIOyDneyEsVxuICAgIGNvbnN0IHsgY3JlYXRlQ2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgIHRoaXMuX2NhY2hlID0gY3JlYXRlQ2FjaGVNYW5hZ2VyKGNvbmZpZyk7XG4gICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKHRoaXMuX2NhY2hlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVdvcmtmbG93cyhvcHRpb25zOiBTb25hbXVUYXNrT3B0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHsgV29ya2Zsb3dNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90YXNrcy93b3JrZmxvdy1tYW5hZ2VyXCIpO1xuICAgIC8vIE5PVEU6IEBzb25hbXUta2l0L3Rhc2tzIOyViOyXkOyEoCBrbmV4IGNvbmZpZ+ulvCDsiJjsoJXtlZjquLAg65WM66y47JeQIGNvbm5lY3Rpb27snbQg7JWE64uMIGNvbmZpZyDsp7jroZwg67O064OF64uI64ukLlxuICAgIHRoaXMuX3dvcmtmbG93cyA9IG5ldyBXb3JrZmxvd01hbmFnZXIoREIuZ2V0REJDb25maWcoXCJ3XCIpKTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVXb3JrZXIgPSBvcHRpb25zLmVuYWJsZVdvcmtlciA/PyBpc0RhZW1vblNlcnZlcigpO1xuICAgIGNvbnN0IGRlZmF1bHRXb3JrZXJPcHRpb25zID0ge1xuICAgICAgY29uY3VycmVuY3k6IG9zLmNwdXMoKS5sZW5ndGggLSAxLFxuICAgICAgdXNlUHViU3ViOiB0cnVlLFxuICAgICAgbGlzdGVuRGVsYXk6IDUwMCxcbiAgICB9O1xuXG4gICAgaWYgKGVuYWJsZVdvcmtlcikge1xuICAgICAgdGhpcy53b3JrZmxvd3Muc2V0dXBXb3JrZXIoe1xuICAgICAgICAuLi5kZWZhdWx0V29ya2VyT3B0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucy53b3JrZXJPcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290KHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBvcHRpb25zOiBTb25hbXVTZXJ2ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgcG9ydCA9IG9wdGlvbnMubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gICAgY29uc3QgaG9zdCA9IG9wdGlvbnMubGlzdGVuPy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG5cbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU2h1dGRvd24/LihzZXJ2ZXIpO1xuICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3MuZGVzdHJveSgpO1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaHV0ZG93biA9IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGR1cmluZyBzaHV0ZG93bjpcIiwgZXJyKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBzaHV0ZG93bik7XG5cbiAgICBpZiAob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpIHtcbiAgICAgIHNlcnZlci5zZXRFcnJvckhhbmRsZXIob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpO1xuICAgIH1cblxuICAgIHNlcnZlclxuICAgICAgLmxpc3Rlbih7IHBvcnQsIGhvc3QgfSlcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3Muc3RhcnRXb3JrZXIoKTtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU3RhcnQ/LihzZXJ2ZXIpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIkZhaWxlZCB0byBzdGFydCBzZXJ2ZXI6XCIsIGVycikpO1xuICAgICAgICBhd2FpdCBzaHV0ZG93bigpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZpbGVDaGFuZ2UoZXZlbnQ6IHN0cmluZywgZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOyyqyDrsojsp7gg7YyM7J287J2066m0IEhNUiDsi5zsnpEg7Iuc6rCEIOq4sOuhnVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaG1yU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nRmlsZXMucHVzaChmaWxlUGF0aCk7XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMuYXBpUm9vdFBhdGgsIGZpbGVQYXRoKTtcbiAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfWApKTtcblxuICAgIGF3YWl0IHRoaXMuc3luY2VyLnN5bmNGcm9tV2F0Y2hlcihldmVudCwgZmlsZVBhdGgpO1xuXG4gICAgLy8g7LKY66asIOyZhOujjOuQnCDtjIzsnbzsnYQg64yA6riwIOuqqeuhneyXkOyEnCDsoJzqsbBcbiAgICB0aGlzLnBlbmRpbmdGaWxlcyA9IHRoaXMucGVuZGluZ0ZpbGVzLnNsaWNlKDEpO1xuXG4gICAgLy8g66qo65OgIO2MjOydvCDsspjrpqzqsIAg7JmE66OM65CY66m0IOy1nOyihSDrqZTsi5zsp4Ag7Lac66ClXG4gICAgaWYgKHRoaXMucGVuZGluZ0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgdGhpcy5maW5pc2hITVIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmlzaEhNUigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5yZW5ld0NoZWNrc3VtcygpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdG90YWxUaW1lID0gZW5kVGltZSAtIHRoaXMuaG1yU3RhcnRUaW1lO1xuICAgIGNvbnN0IFtjaGFsaywgeyBjZW50ZXJUZXh0IH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0LFxuICAgICAgaW1wb3J0KFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCIpLFxuICAgIF0pO1xuICAgIGNvbnN0IG1zZyA9IGBITVIgRG9uZSEgJHtjaGFsay5ib2xkLndoaXRlKGAke3RvdGFsVGltZX1tc2ApfWA7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQobXNnKSkpO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IEJhc2VNb2RlbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiKTtcbiAgICAvLyDrqLzsoIAg7LKY66as7ZW07JW87ZWoLlxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgIHRoaXMuX3dvcmtmbG93cz8uZGVzdHJveSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5fY2FjaGU/LmRpc2Nvbm5lY3QoKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuX2RldlZpdGVzdE1hbmFnZXI/LnNodXRkb3duKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICBsb2d0YXBlRGlzcG9zZSgpLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcblxuLyoqXG4gKiBzdHJlYW0g66qo65Oc7JeQ7IScIO2CpCDsg53shLEg7ZWo7IiY6rCAIOyngOygleuQmOyngCDslYrslZjsnYQg65WMIOyCrOyaqe2VmOuKlCDquLDrs7gg7ZWo7IiY7J6F64uI64ukLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0S2V5R2VuZXJhdG9yKGZpbGU6IHsgZmlsZW5hbWU6IHN0cmluZzsgbWltZXR5cGU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gbWltZS5leHRlbnNpb24oZmlsZS5taW1ldHlwZSkgfHwgXCJiaW5cIjtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG4gIHJldHVybiBgdXBsb2Fkcy8ke3RpbWVzdGFtcH0tJHtyYW5kb219LiR7ZXh0fWA7XG59XG4iXSwibmFtZXMiOlsiZGlzcG9zZSIsImxvZ3RhcGVEaXNwb3NlIiwiYXNzZXJ0IiwiQXN5bmNMb2NhbFN0b3JhZ2UiLCJmcyIsIm1pbWUiLCJsb29rdXAiLCJtaW1lTG9va3VwIiwib3MiLCJwYXRoIiwiQkFTRV9GSUVMRF9NQVBQSU5HUyIsImNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQiLCJjcmVhdGVNb2NrU1NFRmFjdG9yeSIsIkRCIiwiaXNEYWVtb25TZXJ2ZXIiLCJtZXJnZSIsIk5vdEZvdW5kRXhjZXB0aW9uIiwiYXBwbHlDYWNoZUhlYWRlcnMiLCJDYWNoZVByZXNldHMiLCJ0b0Zhc3RpZnlDb21wcmVzc09wdGlvbiIsIlNEIiwiTmFpdGUiLCJCdWZmZXJlZEZpbGUiLCJVcGxvYWRlZEZpbGUiLCJleGlzdHMiLCJmaWxlRXhpc3RzIiwiZ2V0U2VjcmV0cyIsIlNvbmFtdUNsYXNzIiwiaXNJbml0aWFsaXplZCIsImZvclRlc3RpbmciLCJhc3luY0xvY2FsU3RvcmFnZSIsImdldENvbnRleHQiLCJzdG9yZSIsImdldFN0b3JlIiwiY29udGV4dCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInJlcXVlc3QiLCJyZXBseSIsImhlYWRlcnMiLCJjcmVhdGVTU0UiLCJzY2hlbWEiLCJuYWl0ZVN0b3JlIiwiTWFwIiwiRXJyb3IiLCJfYXBpUm9vdFBhdGgiLCJhcGlSb290UGF0aCIsImFwcFJvb3RQYXRoIiwic3BsaXQiLCJzZXAiLCJzbGljZSIsImpvaW4iLCJfZGJDb25maWciLCJkYkNvbmZpZyIsIl9zeW5jZXIiLCJzeW5jZXIiLCJfY29uZmlnIiwiY29uZmlnIiwic2VjcmV0cyIsIl9zdG9yYWdlIiwic3RvcmFnZSIsIl9jYWNoZSIsImNhY2hlIiwiX3dvcmtmbG93cyIsIndvcmtmbG93cyIsIl9hdXRoIiwiYXV0aCIsIl9kZXZWaXRlc3RNYW5hZ2VyIiwiZGV2Vml0ZXN0TWFuYWdlciIsIm1hbmFnZXIiLCJ3YXRjaGVyIiwicGVuZGluZ0ZpbGVzIiwiaG1yU3RhcnRUaW1lIiwic2VydmVyIiwiaW5pdEZvclRlc3RpbmciLCJpbml0IiwidW5kZWZpbmVkIiwiZG9TaWxlbnQiLCJlbmFibGVTeW5jIiwiY2hhbGsiLCJkZWZhdWx0IiwiY29uc29sZSIsInRpbWUiLCJjeWFuIiwiZmluZEFwaVJvb3RQYXRoIiwibG9hZENvbmZpZyIsImRhdGFiYXNlIiwiZGVmYXVsdE9wdGlvbnMiLCJjbGllbnQiLCJjb25maWd1cmVMb2dUYXBlIiwibG9nZ2luZyIsImdlbmVyYXRlREJDb25maWciLCJsb2ciLCJncmVlbiIsIkVudGl0eU1hbmFnZXIiLCJhdXRvbG9hZCIsImluaXRpYWxpemVDYWNoZSIsImluaXRpYWxpemVXb3JrZmxvd3MiLCJ0YXNrcyIsIlN5bmNlciIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsImF1dG9sb2FkV29ya2Zsb3dzIiwiVGVtcGxhdGVNYW5hZ2VyIiwiYXV0b2xvYWRTU1JSb3V0ZXMiLCJpc0xvY2FsIiwiaXNUZXN0Iiwic2V0dXBCaW9tZSIsImlzSG90UmVsb2FkU2VydmVyIiwic3luYyIsInN0YXJ0V2F0Y2hlciIsInRpbWVFbmQiLCJjcmVhdGVTZXJ2ZXIiLCJpbml0T3B0aW9ucyIsIm9wdGlvbnMiLCJmYXN0aWZ5IiwiZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIiLCJsb2dnZXIiLCJjYXRlZ29yeSIsImZhc3RpZnlDYXRlZ29yeSIsIlN0b3JhZ2VNYW5hZ2VyIiwicGx1Z2lucyIsInJlZ2lzdGVyUGx1Z2lucyIsInJlZ2lzdGVyQmV0dGVyQXV0aCIsIndpdGhGYXN0aWZ5IiwiYXBpQ29uZmlnIiwiYm9vdCIsInRpbWV6b25lIiwiYXBpIiwiZm9ybWF0SW5UaW1lWm9uZSIsIklTT19EQVRFX1JFR0VYIiwiREFURV9GT1JNQVQiLCJzZXRSZXBseVNlcmlhbGl6ZXIiLCJwYXlsb2FkIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9rZXkiLCJ2YWx1ZSIsInRlc3QiLCJEYXRlIiwiZ2V0Iiwicm91dGUiLCJwcmVmaXgiLCJfcmVxdWVzdCIsIl9yZXBseSIsImFwaXMiLCJzb25hbXVVSUFwaVBsdWdpbiIsInJlZ2lzdGVyIiwiZGV2UnVubmVyIiwiZW5hYmxlZCIsInJlZ2lzdGVyRGV2VGVzdFJvdXRlcyIsIndlYlBhdGgiLCJoYXNXZWIiLCJwbHVnaW5Db21wcmVzcyIsImNvbXByZXNzIiwiZ2xvYmFsQ29tcHJlc3NPcHRpb25zIiwidGhyZXNob2xkIiwiZW5jb2RpbmdzIiwiY3VzdG9tVHlwZXMiLCJkaXNhYmxlSW50ZWdyYXRlZFdlYiIsIlNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCIiwic2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZSIsInNldHVwRGV2U2VydmVyIiwibW9kZWxzIiwibW9kZWxOYW1lIiwibWV0aG9kIiwiaHR0cE1ldGhvZCIsInVybCIsImhhbmRsZXIiLCJjcmVhdGVBcGlIYW5kbGVyIiwic2V0dXBTdGF0aWNXZWJTZXJ2ZXIiLCJoYW5kbGVEZXZBcGlSZXF1ZXN0IiwiZ2V0UGF0aG5hbWVGcm9tVXJsIiwic3RhcnRzV2l0aCIsIm1hdGNoZWRBcGkiLCJmaW5kIiwiYXBpTWV0aG9kIiwiZnVsbFBhdGgiLCJpc1BhdGhQYXR0ZXJuTWF0Y2giLCJ2aXRlU2VydmVyIiwidml0ZSIsInJvb3QiLCJtaWRkbGV3YXJlTW9kZSIsImhtciIsImFwcFR5cGUiLCJ1c2UiLCJyZXEiLCJyZXMiLCJuZXh0IiwibWlkZGxld2FyZXMiLCJyZXN1bHQiLCJtYXRjaFNTUlJvdXRlIiwicmVuZGVyU1NSIiwic3NyTWF0Y2giLCJodG1sIiwicGFyYW1zIiwidHlwZSIsInRlbXBsYXRlIiwicmVhZEZpbGUiLCJ0cmFuc2Zvcm1JbmRleEh0bWwiLCJlIiwic3NyRml4U3RhY2t0cmFjZSIsImVycm9yIiwic3RhdHVzIiwibWVzc2FnZSIsImFkZEhvb2siLCJjbG9zZSIsIndlYkRpc3RQYXRoIiwic3NyUGF0aCIsInNzckVudHJ5UGF0aCIsInNzclJvdXRlc1BhdGgiLCJ3YXJuIiwic3NyQXZhaWxhYmxlIiwicmVxdWVzdGVkRmlsZSIsImZpbGVuYW1lIiwiYXNzZXRzRGlyIiwic2FmZUZpbGVQYXRoIiwicmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyIiwic2VuZCIsIm5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlIiwicmVsYXRpdmUiLCJyZXBsYWNlIiwiYXNzZXRQYXRoIiwiZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQiLCJjYWNoZVJlcSIsImNhY2hlQ29udHJvbEhhbmRsZXIiLCJpbW11dGFibGUiLCJleHQiLCJwb3AiLCJmaWxlcyIsInJlYWRkaXIiLCJjdXJyZW50RmlsZSIsImYiLCJlbmRzV2l0aCIsImZpbGVQYXRoIiwiY29udGVudCIsImluY2x1ZGVzIiwiZ2V0U1NSUm91dGVzIiwic3NyUm91dGVzIiwiZXh0cmFjdFBhdGhQYXJhbXMiLCJjc3JDYWNoZVJlcSIsImNzckNhY2hlQ29uZmlnIiwicmVxdWVzdFBhdGgiLCJpbmRleFBhdGgiLCJjcmVhdGVDb250ZXh0IiwicnVuIiwiZ3VhcmRzIiwiZXZlcnkiLCJndWFyZCIsImd1YXJkSGFuZGxlciIsImdldFpvZE9iamVjdEZyb21BcGkiLCJSZXFUeXBlIiwidHlwZXMiLCJ3aGljaCIsInJlcUJvZHkiLCJidWZmZXJlZEZpbGVzIiwidXBsb2FkZWRGaWxlcyIsImJvZHkiLCJ1cGxvYWRPcHRpb25zIiwicGFydHMiLCJsaW1pdHMiLCJmaWVsZHMiLCJjb25zdW1lIiwicGFydCIsImJ1ZmZlciIsInRvQnVmZmVyIiwicHVzaCIsImZpZWxkbmFtZSIsIlN0cmluZyIsImRpc2tOYW1lIiwiZGVzdGluYXRpb24iLCJkaXNrIiwia2V5R2VuZXJhdG9yIiwiZGVmYXVsdEtleUdlbmVyYXRvciIsImtleSIsIm1pbWV0eXBlIiwicHV0U3RyZWFtIiwiZmlsZSIsImNvbnRlbnRUeXBlIiwiZ2V0VXJsIiwic2lnbmVkVXJsIiwiZ2V0U2lnbmVkVXJsIiwic2l6ZSIsImJ5dGVzUmVhZCIsInFzIiwicGFyc2VkIiwicGFyc2UiLCJPYmplY3QiLCJhc3NpZ24iLCJmYXN0aWZ5Q2FzdGVyIiwiWm9kRXJyb3IiLCJodW1hbml6ZVpvZEVycm9yIiwibWVzc2FnZXMiLCJtYXAiLCJpc3N1ZSIsIkJhZFJlcXVlc3RFeGNlcHRpb24iLCJ6b2RFcnJvciIsImFwaUNhY2hlQ29uZmlnIiwiZ2V0QXBpQ2FjaGVDb250cm9sIiwiQXBpUGFyYW1UeXBlIiwiYXJncyIsInBhcmFtZXRlcnMiLCJwYXJhbSIsImlzQ29udGV4dCIsIm5hbWUiLCJpbnZva2VNb2RlbE1ldGhvZCIsInBhdHRlcm4iLCJwYXR0ZXJuUGFydHMiLCJmaWx0ZXIiLCJCb29sZWFuIiwidXJsUGFydHMiLCJpIiwibGVuZ3RoIiwicGF0dGVyblBhcnQiLCJ1cmxQYXJ0IiwiYmFzZURpciIsImlucHV0UGF0aCIsImRlY29kZWQiLCJkZWNvZGVVUklDb21wb25lbnQiLCJyZWxhdGl2ZVBhdGgiLCJyZXNvbHZlZFBhdGgiLCJyZXNvbHZlIiwicmVsYXRpdmVGcm9tQmFzZSIsImlzQWJzb2x1dGUiLCJjYWNoZUNvbnRyb2wiLCJyb3V0ZU9wdGlvbnMiLCJpbnZva2VBcGlGb3JTU1IiLCJwYXJhbXNJbmRleCIsIm1vZGVsIiwibWV0aG9kTmFtZSIsImFwcGx5IiwiY3JlYXRlU1NFRmFjdG9yeSIsIl9ldmVudHMiLCJzb2NrZXQiLCJiaW5kIiwibG9jYWxlIiwiZGV0ZWN0TG9jYWxlIiwiaTE4biIsInN1cHBvcnRlZExvY2FsZXMiLCJkZWZhdWx0TG9jYWxlIiwic2Vzc2lvbiIsImdldFNlc3Npb24iLCJQcm9taXNlIiwiY29udGV4dFByb3ZpZGVyIiwiY3JlYXRlU3RvcmUiLCJ1c2VyIiwiYWNjZXB0TGFuZ3VhZ2UiLCJzdXBwb3J0ZWQiLCJsYW5ncyIsImxhbmciLCJjb2RlIiwidHJpbSIsIndhdGNoUGF0aCIsImNob2tpZGFyIiwid2F0Y2giLCJpZ25vcmVkIiwic3RhdHMiLCJpc0ZpbGUiLCJwZXJzaXN0ZW50IiwiaWdub3JlSW5pdGlhbCIsIm9uIiwiZXZlbnQiLCJhYnNvbHV0ZVBhdGgiLCJpc0NvbmZpZ1RzIiwiYm9sZCIsImJsdWUiLCJraWxsIiwicGlkIiwiaGFuZGxlRmlsZUNoYW5nZSIsInJ1blNjcmlwdCIsImZuIiwiZGVzdHJveSIsImNvbXByZXNzUGx1Z2luIiwicGx1Z2luc01vZHVsZXMiLCJjb3JzIiwiZm9ybWJvZHkiLCJtdWx0aXBhcnQiLCJzc2UiLCJzdGF0aWMiLCJyZWdpc3RlclBsdWdpbiIsInBsdWdpbk5hbWUiLCJvcHRpb24iLCJlbnRyaWVzIiwiY3VzdG9tIiwiYmFzZVBhdGgiLCJtZXJnZWRGaWVsZE1hcHBpbmdzIiwiYmV0dGVyQXV0aCIsIlBvb2wiLCJnZXREQkNvbmZpZyIsImNvbm5lY3Rpb24iLCJVUkwiLCJob3N0IiwiUmVxdWVzdCIsInRvU3RyaW5nIiwicmVzcG9uc2UiLCJmb3JFYWNoIiwiaGVhZGVyIiwidGV4dCIsInNldENhY2hlTWFuYWdlclJlZiIsImNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIiLCJjcmVhdGVDYWNoZU1hbmFnZXIiLCJXb3JrZmxvd01hbmFnZXIiLCJlbmFibGVXb3JrZXIiLCJkZWZhdWx0V29ya2VyT3B0aW9ucyIsImNvbmN1cnJlbmN5IiwiY3B1cyIsInVzZVB1YlN1YiIsImxpc3RlbkRlbGF5Iiwic2V0dXBXb3JrZXIiLCJ3b3JrZXJPcHRpb25zIiwicG9ydCIsImxpc3RlbiIsImxpZmVjeWNsZSIsIm9uU2h1dGRvd24iLCJzaHV0ZG93biIsImV4aXQiLCJlcnIiLCJvbkVycm9yIiwic2V0RXJyb3JIYW5kbGVyIiwidGhlbiIsInN0YXJ0V29ya2VyIiwib25TdGFydCIsImNhdGNoIiwicmVkIiwibm93Iiwic3luY0Zyb21XYXRjaGVyIiwiZmluaXNoSE1SIiwicmVuZXdDaGVja3N1bXMiLCJlbmRUaW1lIiwidG90YWxUaW1lIiwiY2VudGVyVGV4dCIsImFsbCIsIm1zZyIsIndoaXRlIiwiYmxhY2siLCJiZ0dyZWVuIiwiQmFzZU1vZGVsIiwiYWxsU2V0dGxlZCIsImRpc2Nvbm5lY3QiLCJTb25hbXUiLCJleHRlbnNpb24iLCJ0aW1lc3RhbXAiLCJyYW5kb20iLCJNYXRoIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxXQUFXQyxjQUFjLFFBQVEsbUJBQW1CO0FBQzdELE9BQU9DLFlBQVksU0FBUztBQUM1QixTQUFTQyxpQkFBaUIsUUFBUSxjQUFjO0FBSWhELE9BQU9DLFFBQVEsbUJBQWM7QUFFN0IsT0FBT0MsUUFBUUMsVUFBVUMsVUFBVSxRQUFRLGFBQWE7QUFDeEQsT0FBT0MsUUFBUSxLQUFLO0FBQ3BCLE9BQU9DLFVB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
|
|
1132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgdHlwZSB7IEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlciwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwiaHR0cFwiO1xuaW1wb3J0IG1pbWUsIHsgbG9va3VwIGFzIG1pbWVMb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBCQVNFX0ZJRUxEX01BUFBJTkdTLFxuICBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLFxuICBjcmVhdGVNb2NrU1NFRmFjdG9yeSxcbiAgREIsXG4gIGlzRGFlbW9uU2VydmVyLFxuICBtZXJnZSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCIuLlwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbmZpZywgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyBhcHBseUNhY2hlSGVhZGVycywgQ2FjaGVQcmVzZXRzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbnRyb2xDb25maWcsIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24gfSBmcm9tIFwiLi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgQ29tcHJlc3NPcHRpb25zIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgQnVmZmVyZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvYnVmZmVyZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWFuYWdlciB9IGZyb20gXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBEZXZWaXRlc3RNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVDb25maWcsIFNvbmFtdVNlcnZlck9wdGlvbnMsIFNvbmFtdVRhc2tPcHRpb25zIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cywgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5cbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBDb250ZXh0IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiBzdG9yZS5jb250ZXh0IGFzIENvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgLy8g7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlcXVlc3Q6IG51bGwsXG4gICAgICAgIHJlcGx5OiBudWxsLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgY3JlYXRlU1NFOiAoc2NoZW1hOiBab2RPYmplY3QpID0+IGNyZWF0ZU1vY2tTU0VGYWN0b3J5KHNjaGVtYSksXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcGlSb290UGF0aDogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5fYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgICBpZiAodGhpcy5fYXBpUm9vdFBhdGggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGJDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBkYkNvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpIHtcbiAgICB0aGlzLl9kYkNvbmZpZyA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2RiQ29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jZXI6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5fc3luY2VyID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5fc3luY2VyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3luY2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgY29uZmlnKCk6IFNvbmFtdUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXRzOiBTb25hbXVTZWNyZXRzID0gZ2V0U2VjcmV0cygpO1xuXG4gIHByaXZhdGUgX3N0b3JhZ2U6IFN0b3JhZ2VNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBTdG9yYWdlTWFuYWdlciDsnbjsiqTthLTsiqRcbiAgICovXG4gIGdldCBzdG9yYWdlKCk6IFN0b3JhZ2VNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGU6IENhY2hlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQ2FjaGVNYW5hZ2VyIOyduOyKpO2EtOyKpCAoQmVudG9DYWNoZSlcbiAgICovXG4gIGdldCBjYWNoZSgpOiBDYWNoZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5fY2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF93b3JrZmxvd3M6IFdvcmtmbG93TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgd29ya2Zsb3dzKCk6IFdvcmtmbG93TWFuYWdlciB7XG4gICAgaWYgKHRoaXMuX3dvcmtmbG93cyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29ya2Zsb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0aDogQXV0aCB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoIHtcbiAgICBpZiAoIXRoaXMuX2F1dGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF1dGggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBhdXRoIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2F1dGg7XG4gIH1cblxuICBwcml2YXRlIF9kZXZWaXRlc3RNYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCBkZXZWaXRlc3RNYW5hZ2VyKCk6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZGV2Vml0ZXN0TWFuYWdlcjtcbiAgfVxuICBzZXQgZGV2Vml0ZXN0TWFuYWdlcihtYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCkge1xuICAgIHRoaXMuX2RldlZpdGVzdE1hbmFnZXIgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrFxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0ZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGhtclN0YXJ0VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0Rm9yVGVzdGluZygpIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0KFxuICAgIGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgZW5hYmxlU3luYzogYm9vbGVhbiA9IHRydWUsXG4gICAgYXBpUm9vdFBhdGg/OiBBYnNvbHV0ZVBhdGgsXG4gICAgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICB0aGlzLmZvclRlc3RpbmcgPSBmb3JUZXN0aW5nO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc29sZS50aW1lKGNoYWxrLmN5YW4oYFNvbmFtdS5pbml0JHtmb3JUZXN0aW5nID8gXCIgZm9yIHRlc3RpbmdcIiA6IFwiXCJ9YCkpO1xuICAgIH1cblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IHsgbG9hZENvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb25maWdcIik7XG4gICAgdGhpcy5jb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIC8vIHNvbmFtdS5jb25maWcudHMg6riw67O46rCSIOyEpOyglVxuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlZmF1bHRPcHRpb25zLmNsaWVudCA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicGdcIjtcblxuICAgIC8vIOuhnOq5hSDshKTsoJVcbiAgICBjb25zdCB7IGNvbmZpZ3VyZUxvZ1RhcGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2xvZ2dlci9jb25maWd1cmVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCBjb25maWd1cmVMb2dUYXBlKHtcbiAgICAgICAgLi4udGhpcy5jb25maWcubG9nZ2luZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKHRoaXMuY29uZmlnLmRhdGFiYXNlKTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiREIgQ29uZmlnIExvYWRlZCFcIikpO1xuICAgIH1cblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyDthYzsiqTtjIXsnbgg6rK97JqwIOyLse2BrCDsl4bsnbQg7KSR64uoXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGFzayDrk7HroZ1cbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3JrZmxvd3ModGhpcy5jb25maWcudGFza3MpO1xuXG4gICAgLy8gU3luY2VyXG4gICAgY29uc3QgeyBTeW5jZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9zeW5jZXJcIik7XG4gICAgdGhpcy5zeW5jZXIgPSBuZXcgU3luY2VyKCk7XG5cbiAgICAvLyBBdXRvbG9hZDogTW9kZWxzIC8gVHlwZXMgLyBBUElzIC8gV29ya2Zsb3dzIC8gVGVtcGxhdGVzIC8gU1NSIFJvdXRlc1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgY29uc3QgeyBUZW1wbGF0ZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3RlbXBsYXRlXCIpO1xuICAgIGF3YWl0IFRlbXBsYXRlTWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkU1NSUm91dGVzKCk7XG5cbiAgICBjb25zdCB7IGlzTG9jYWwsIGlzVGVzdCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6zsl5DshJzripQg7L2U65OcIOyDneyEseydhCDsnITtlbQgQmlvbWUg7IWL7JeF7J20IO2VhOyalO2VqCAo7ZiE7J6sIGFwaVJvb3RQYXRoIOyghOuLrO2VmOyXrCDsi6TtlokpXG4gICAgICAoYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZm9ybWF0dGVyXCIpKS5zZXR1cEJpb21lKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaXNIb3RSZWxvYWRTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSAmJiAhaXNUZXN0KCkgJiYgaXNIb3RSZWxvYWRTZXJ2ZXIoKSAmJiBlbmFibGVTeW5jKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2F0Y2hlcigpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWVFbmQoY2hhbGsuY3lhbihcIlNvbmFtdS5pbml0XCIpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXJ2ZXIoaW5pdE9wdGlvbnM/OiB7IGVuYWJsZVN5bmM/OiBib29sZWFuOyBkb1NpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQoaW5pdE9wdGlvbnM/LmRvU2lsZW50LCBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IGZhc3RpZnkgfSA9IGF3YWl0IGltcG9ydChcImZhc3RpZnlcIik7XG4gICAgY29uc3QgeyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlciB9ID0gYXdhaXQgaW1wb3J0KFwiQGxvZ3RhcGUvZmFzdGlmeVwiKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBmYXN0aWZ5KHtcbiAgICAgIC4uLm9wdGlvbnMuZmFzdGlmeSxcbiAgICAgIGxvZ2dlcjpcbiAgICAgICAgdGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2VcbiAgICAgICAgICA/IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyKHtcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuY29uZmlnLmxvZ2dpbmc/LmZhc3RpZnlDYXRlZ29yeSA/PyBbXCJmYXN0aWZ5XCJdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIFN0b3JhZ2Ug7ISk7KCVIOKGkiBTdG9yYWdlTWFuYWdlciDsg53shLFcbiAgICBpZiAob3B0aW9ucy5zdG9yYWdlKSB7XG4gICAgICBjb25zdCB7IFN0b3JhZ2VNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiKTtcbiAgICAgIHRoaXMuX3N0b3JhZ2UgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFRpbWV6b25lIHNldCB0byAke3RpbWV6b25lfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUEkgKOuhnOy7rCDtmZjqsr3sl5DshJzrp4wpXG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIGNvbnN0IHsgc29uYW11VUlBcGlQbHVnaW4gfSA9IGF3YWl0IGltcG9ydChcIi4uL3VpL2FwaVwiKTtcbiAgICAgIHNlcnZlci5yZWdpc3Rlcihzb25hbXVVSUFwaVBsdWdpbik7XG4gICAgfVxuXG4gICAgLy8gRGV2UnVubmVyIO2FjOyKpO2KuCDsl5Trk5ztj6zsnbjtirggKOuhnOy7rCDtmZjqsr0gKyBkZXZSdW5uZXIg7Zmc7ISx7ZmUIOyLnClcbiAgICBpZiAoaXNMb2NhbCgpICYmIHRoaXMuY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgICAgY29uc3QgeyByZWdpc3RlckRldlRlc3RSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rlc3RpbmcvZGV2LXRlc3Qtcm91dGVzXCIpO1xuICAgICAgYXdhaXQgcmVnaXN0ZXJEZXZUZXN0Um91dGVzKHNlcnZlciwgdGhpcy5jb25maWcudGVzdC5kZXZSdW5uZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4odGhpcy5hcHBSb290UGF0aCwgXCJ3ZWJcIik7XG4gICAgY29uc3QgaGFzV2ViID0gYXdhaXQgZXhpc3RzKHdlYlBhdGgpO1xuXG4gICAgLy8g7KCE7JetIGNvbXByZXNzIOyYteyFmCDqs4TsgrAgKHJvdXRlLmNvbXByZXNzOiB0cnVl7J28IOuVjCDsgqzsmqkpXG4gICAgY29uc3QgcGx1Z2luQ29tcHJlc3MgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8uY29tcHJlc3M7XG4gICAgY29uc3QgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQgPSBwbHVnaW5Db21wcmVzc1xuICAgICAgPyBwbHVnaW5Db21wcmVzcyA9PT0gdHJ1ZVxuICAgICAgICA/IHsgdGhyZXNob2xkOiAxMDI0LCBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHRocmVzaG9sZDogcGx1Z2luQ29tcHJlc3MudGhyZXNob2xkLFxuICAgICAgICAgICAgZW5jb2RpbmdzOiBwbHVnaW5Db21wcmVzcy5lbmNvZGluZ3MsXG4gICAgICAgICAgICBjdXN0b21UeXBlczogcGx1Z2luQ29tcHJlc3MuY3VzdG9tVHlwZXMsXG4gICAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6wg6rCc67CcIO2ZmOqyvTogY2F0Y2gtYWxs66GcIEFQSeulvCDrj5nsoIEg66ek7Lmt7ZWY7JesIEhNUuydhCDsp4Dsm5Dtlanri4jri6QuXG4gICAgICAvLyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQj15ZXProZwg7ISk7KCV7ZWY66m0IGRldl9hcGkg66qo65Oc7JeQ7IScIFZpdGUg7Ya17ZWp7J2EIOu5hO2ZnOyEse2ZlO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgY29uc3QgZGlzYWJsZUludGVncmF0ZWRXZWIgPSBwcm9jZXNzLmVudi5TT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiA9PT0gXCJ5ZXNcIjtcbiAgICAgIGlmIChoYXNXZWIgJiYgIWRpc2FibGVJbnRlZ3JhdGVkV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZShzZXJ2ZXIsIHdlYlBhdGgsIGNvbmZpZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldHVwRGV2U2VydmVyKHNlcnZlciwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7ZSE66Gc642V7IWYIO2ZmOqyvTog6rCc67OEIEFQSSDrnbzsmrDtirggKyDsoJXsoIEg7YyM7J28IOyEnOu5mVxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgdGhpcy5zeW5jZXIuYXBpcykge1xuICAgICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgICAgIHVybDogdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuY3JlYXRlQXBpSGFuZGxlcihhcGksIGNvbmZpZyksXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKGFwaS5vcHRpb25zLmNvbXByZXNzLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZSE66Gc642V7IWY7JeQ7ISc64qUIHdlYiDshozsiqQoYXBwUm9vdC93ZWIpIOycoOustOyZgCDrrLTqtIDtlZjqsowsXG4gICAgICAvLyBhcGkvd2ViLWRpc3Qg7KG07J6sIOyXrOu2gOulvCBzZXR1cFN0YXRpY1dlYlNlcnZlciDrgrTrtoDsl5DshJwg7YyQ64uo7ZWp64uI64ukLlxuICAgICAgYXdhaXQgdGhpcy5zZXR1cFN0YXRpY1dlYlNlcnZlcihzZXJ2ZXIsIGNvbmZpZywgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGV2IOuqqOuTnCDqs7XthrU6IGNhdGNoLWFsbOyXkOyEnCBzeW5jZXIuYXBpc+ulvCDrj5nsoIHsnLzroZwg7YOQ7IOJ7ZWY7JesIEFQSSDsmpTssq3snYQg7LKY66as7ZWp64uI64ukLlxuICAgKiBzZXJ2ZXIucm91dGUoKeuhnCDqsJzrs4Qg65Ox66Gd7ZWY66m0IGhhbmRsZXLqsIAg6rOg7KCV65CY7Ja0IEhNUuydtCDrj5nsnpHtlZjsp4Ag7JWK7Jy866+A66GcLFxuICAgKiDrp6Qg7JqU7LKt66eI64ukIHN5bmNlci5hcGlz66W8IOyhsO2ajO2VmOuKlCDsnbQg67Cp7Iud7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAgICpcbiAgICog7JqU7LKt7J20IC9hcGko7KCV7ZmV7Z6I64qUIHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgp66GcIOyLnOyeke2VmOyngCDslYrripQg6rK97Jqw652866m0IG51bGzsnYQg67CY7ZmY7ZWY66mwIOuBneuDheuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRGV2QXBpUmVxdWVzdChcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6ICgocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4pIHwgbnVsbCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kO1xuXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gc3luY2VyLmFwaXPsnZggcGF0aOuKlCA6cGFyYW0g7ZiV7YOc66W8IO2PrO2VqO2VoCDsiJgg7J6I7Jy866+A66GcIOyEuOq3uOuovO2KuCDri6jsnITroZwg66ek7Lmt7ZWp64uI64ukLlxuICAgIC8vIOygleq3nOyLnSDsg53shLEg67Cp7Iud7J2AIHBhdGgg66y47J6Q7Je0IOuCtCDtirnsiJjrrLjsnpAoLiwgKywgKCwgWyDrk7Ep66GcIOyYpOyekeuPme2VoCDsiJgg7J6I7Ja0IOyCrOyaqe2VmOyngCDslYrsirXri4jri6QuXG4gICAgY29uc3QgbWF0Y2hlZEFwaSA9IHRoaXMuc3luY2VyLmFwaXMuZmluZCgoYXBpKSA9PiB7XG4gICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXBpTWV0aG9kID0gYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiO1xuICAgICAgaWYgKGFwaU1ldGhvZCAhPT0gbWV0aG9kKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoO1xuICAgICAgcmV0dXJuIHRoaXMuaXNQYXRoUGF0dGVybk1hdGNoKGZ1bGxQYXRoLCB1cmwpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFtYXRjaGVkQXBpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIobWF0Y2hlZEFwaSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYgYXBpIOuqqOuTnDogVml0ZSDsl4bsnbQgQVBJIOuPmeyggSDrnbzsmrDtjIXrp4wg7KCc6rO17ZWp64uI64ukLlxuICAgKiBITVLsnYQg7JyE7ZW0IGNhdGNoLWFsbOyXkOyEnCDrp6Qg7JqU7LKt66eI64ukIHN5bmNlci5hcGlz66W8IOyhsO2ajO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgc2V0dXBEZXZTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IHZvaWQge1xuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g65Ox66Gd65CcIEFQSeyZgCDsnbzsuZjtlZjsp4Ag7JWK64qUIOyalOyyreyXkCDrjIDtlZwgZmFsbGJhY2vsnoXri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBWaXRlRGV2U2VydmVyIO2DgOyeheydhCDrj5nsoIHsnLzroZwg66Gc65Oc7ZW07JW8IO2VqFxuICBwcml2YXRlIHZpdGVTZXJ2ZXI6IGFueSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIGRldiBhbGwg66qo65OcOiBWaXRlIERldiBTZXJ2ZXLrpbwg7Ya17ZWp7ZWY7JesIEFQSSArIFNTUiArIENTUuydhCDrqqjrkZAg7KCc6rO17ZWp64uI64ukLlxuICAgKiBBUEkg64+Z7KCBIOunpOy5reydgCBoYW5kbGVEZXZBcGlSZXF1ZXN066W8IOqzteycoO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZShcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIHdlYlBhdGg6IHN0cmluZyxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEBmYXN0aWZ5L21pZGRpZSDrk7HroZ0gKENvbm5lY3Qtc3R5bGUgbWlkZGxld2FyZSDsp4Dsm5ApXG4gICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9taWRkaWVcIikpLmRlZmF1bHQpO1xuXG4gICAgY29uc3Qgdml0ZSA9IGF3YWl0IGltcG9ydChcInZpdGVcIik7XG5cbiAgICB0aGlzLnZpdGVTZXJ2ZXIgPSBhd2FpdCB2aXRlLmNyZWF0ZVNlcnZlcih7XG4gICAgICByb290OiB3ZWJQYXRoLFxuICAgICAgc2VydmVyOiB7XG4gICAgICAgIG1pZGRsZXdhcmVNb2RlOiB0cnVlLFxuICAgICAgICBobXI6IHtcbiAgICAgICAgICBzZXJ2ZXI6IHNlcnZlci5zZXJ2ZXIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXBwVHlwZTogXCJjdXN0b21cIixcbiAgICB9KTtcblxuICAgIC8vIFZpdGUgbWlkZGxld2FyZSDrk7HroZ0gKFZpdGUg7JeQ7IWLIOyymOumrClcbiAgICBzZXJ2ZXIudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgLy8gQVBJ7JmAIFNvbmFtdSBVSeuKlCBGYXN0aWZ5IOudvOyasO2KuOqwgCDsspjrpqztlZjrj4TroZ0gc2tpcFxuICAgICAgaWYgKHJlcS51cmw/LnN0YXJ0c1dpdGgodGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCkgfHwgcmVxLnVybD8uc3RhcnRzV2l0aChcIi9zb25hbXUtdWlcIikpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cbiAgICAgIC8vIOuCmOuouOyngOuKlCBWaXRlIG1pZGRsZXdhcmXroZwg7KCE64usXG4gICAgICByZXR1cm4gdGhpcy52aXRlU2VydmVyLm1pZGRsZXdhcmVzKHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9KTtcblxuICAgIC8vIGNhdGNoLWFsbCDrnbzsmrDtirjsl5DshJwg64+Z7KCB7Jy866GcIEFQSS9TU1Ig7LKY66asXG4gICAgLy8g6rCc67CcIO2ZmOqyveyXkOyEnOuKlCDrnbzsmrDtirjrs4QgY29tcHJlc3Mg7Ji17IWY7J2EIO2PrOq4sO2VmOqzoCBITVIg7J207KCQ7J2EIOy3qO2VqeuLiOuLpC5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiLCBcIlBBVENIXCJdLFxuICAgICAgdXJsOiBcIi8qXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gMS4gQVBJIOyalOyyrSDsspjrpqxcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0KHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuXG4gICAgICAgIC8vIDIuIFNTUiDrnbzsmrDtirgg7LKY66asXG4gICAgICAgIGNvbnN0IHsgbWF0Y2hTU1JSb3V0ZSwgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICAgIGNvbnN0IHNzck1hdGNoID0gbWF0Y2hTU1JSb3V0ZSh1cmwpO1xuICAgICAgICBpZiAoc3NyTWF0Y2gpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtzc3JNYXRjaC5yb3V0ZS5wYXRofWApO1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IoXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBzc3JNYXRjaC5yb3V0ZSxcbiAgICAgICAgICAgIHNzck1hdGNoLnBhcmFtcyxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHRoaXMudml0ZVNlcnZlcixcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBDU1IgZmFsbGJhY2tcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICAgICAgbGV0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy52aXRlU2VydmVyLmNvbmZpZy5yb290LCBcImluZGV4Lmh0bWxcIiksXG4gICAgICAgICAgICBcInV0Zi04XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudml0ZVNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwodXJsLCB0ZW1wbGF0ZSk7XG5cbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudml0ZVNlcnZlci5zc3JGaXhTdGFja3RyYWNlKGUgYXMgRXJyb3IpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIChlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcIuKckyBWaXRlIGRldiBzZXJ2ZXIgaW50ZWdyYXRlZFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBTdGF0aWNXZWJTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOqyveuhnCDrqoXtmZXtmZQ6IGFwaS93ZWItZGlzdC9jbGllbnQgKOygleyggSDtjIzsnbwpLCBhcGkvd2ViLWRpc3Qvc2VydmVyIChTU1IgZW50cnkpLCBhcGkvZGlzdC9zc3IgKFNTUiByb3V0ZXMgLSBBUEkg7IaM7JygKVxuICAgIGNvbnN0IHdlYkRpc3RQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJjbGllbnRcIik7XG4gICAgY29uc3Qgc3NyUGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwic2VydmVyXCIpO1xuICAgIGNvbnN0IHNzckVudHJ5UGF0aCA9IHBhdGguam9pbihzc3JQYXRoLCBcImVudHJ5LXNlcnZlci5nZW5lcmF0ZWQuanNcIik7XG4gICAgY29uc3Qgc3NyUm91dGVzUGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcImRpc3RcIiwgXCJzc3JcIiwgXCJyb3V0ZXMuanNcIik7XG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMod2ViRGlzdFBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgV2ViIGRpc3Qgbm90IGZvdW5kOiAke3dlYkRpc3RQYXRofWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNTUiBlbnRyeSDsobTsnqwg7Jes67aAIO2ZleyduFxuICAgIGNvbnN0IHNzckF2YWlsYWJsZSA9IGF3YWl0IGV4aXN0cyhzc3JFbnRyeVBhdGgpO1xuXG4gICAgaWYgKCFzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiBlbnRyeSBub3QgZm91bmQ6ICR7c3NyRW50cnlQYXRofWApO1xuICAgICAgY29uc29sZS53YXJuKFwiICBTU1Igd2lsbCBiZSBkaXNhYmxlZC4gT25seSBDU1Igd2lsbCB3b3JrLlwiKTtcbiAgICB9XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOuhnOuTnCAocHJvZHVjdGlvbuyXkOyEnOunjCwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOydmCBzc3Ivcm91dGVzLnRzKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoc3NyUm91dGVzUGF0aCkpIHtcbiAgICAgICAgLy8gdHMtbG9hZGVy652866m0IFwiZmlsZTovL1wi66GcIOyLnOyeke2VmOuKlCBmdWxseS1yZXNvbHZlZCBwYXRo66eMIOuwm+q4sOyXkCDsnbTrpbwg7LKY66as7ZW07KO864qUIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZW07JW8IO2WiOqyoOyngOunjCxcbiAgICAgICAgLy8g7Jes6riw64qUIO2UhOuhnOuNleyFmCDtmZjqsr3sl5DshJwgbG9hZGVyIOyXhuydtCDrj4zslYTqsIDquLAg65WM66y47JeQIFwi7KeE7KecIGpzIO2MjOydvFwi7J2YIFwi6re464OlXCIg7KCI64yA6rK966Gc66W8IOuwlOuhnCBpbXBvcnTtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgICAvLyDsnbQg64K07Jqp7J2AIOydtCDtlajsiJgg64K07JeQ7IScIOyVhOuemOyXkCDrgpjsmKwg64uk66W4IGltcG9ydCDtmLjstpzsl5Drj4Qg64+Z7J287ZWY6rKMIOyggeyaqeuQqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgaW1wb3J0KHNzclJvdXRlc1BhdGgpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuKckyBTU1Igcm91dGVzIGxvYWRlZFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiByb3V0ZXMgbm90IGZvdW5kOiAke3NzclJvdXRlc1BhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g66Gk66eBIOyXheuNsOydtO2KuCDrjIDsnZE6IGFzc2V0IGhhc2gg67aI7J287LmYIOyLnCDtmITsnqwg67KE7KCEIOyngeygkSDshJzruZlcbiAgICBzZXJ2ZXIuZ2V0KFwiL2Fzc2V0cy86ZmlsZW5hbWVcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRGaWxlID0gKHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9KS5maWxlbmFtZTtcbiAgICAgIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJhc3NldHNcIik7XG4gICAgICBjb25zdCBzYWZlRmlsZVBhdGggPSB0aGlzLnJlc29sdmVQYXRoV2l0aGluQmFzZURpcihhc3NldHNEaXIsIHJlcXVlc3RlZEZpbGUpO1xuICAgICAgaWYgKHNhZmVGaWxlUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlID0gcGF0aC5yZWxhdGl2ZShhc3NldHNEaXIsIHNhZmVGaWxlUGF0aCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG5cbiAgICAgIGNvbnN0IGFzc2V0UGF0aCA9IGAvYXNzZXRzLyR7bm9ybWFsaXplZFJlcXVlc3RlZEZpbGV9YDtcblxuICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg6rKw7KCVXG4gICAgICBjb25zdCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCA9ICgpOiBDYWNoZUNvbnRyb2xDb25maWcgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICB0eXBlOiBcImFzc2V0c1wiLFxuICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgcGF0aDogYXNzZXRQYXRoLFxuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOygleydmCDtlbjrk6Trn6wg7Jqw7ISgXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6riw67O46rCSOiBpbW11dGFibGVcbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICB9O1xuXG4gICAgICAvLyBpbmRleC0qLmpzIOuYkOuKlCBpbmRleC0qLmNzcyDsmpTssq3snbgg6rK97JqwXG4gICAgICBpZiAoL15pbmRleC1bYS1mMC05XStcXC4oanN8Y3NzKSQvLnRlc3Qobm9ybWFsaXplZFJlcXVlc3RlZEZpbGUpKSB7XG4gICAgICAgIGNvbnN0IGV4dCA9IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGFzc2V0c0Rpcik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWxlID0gZmlsZXMuZmluZCgoZikgPT4gZi5zdGFydHNXaXRoKFwiaW5kZXgtXCIpICYmIGYuZW5kc1dpdGgoYC4ke2V4dH1gKSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRGaWxlKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCBjdXJyZW50RmlsZSk7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBcInRleHQvY3NzXCIpO1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJgg7YyM7J28IOyEnOu5mVxuICAgICAgY29uc3QgZmlsZVBhdGggPSBzYWZlRmlsZVBhdGg7XG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIHJlcGx5LnR5cGUoZXh0ID09PSBcImpzXCIgPyBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiA6IGV4dCA9PT0gXCJjc3NcIiA/IFwidGV4dC9jc3NcIiA6IFwiXCIpO1xuICAgICAgICBpZiAobm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGdldENhY2hlQ29udHJvbEZvckFzc2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXBseS5zZW5kKGNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXBseS5zdGF0dXMoNDA0KS5zZW5kKCk7XG4gICAgfSk7XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOqwnOuzhCDrk7HroZ0gKGNvbXByZXNzIOyYteyFmOydtCDrnbzsmrDtirjrs4TroZwg7KCB7Jqp65CY64+E66GdKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHsgZ2V0U1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICBjb25zdCB7IHJlbmRlclNTUiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL3JlbmRlcmVyXCIpO1xuICAgICAgY29uc3Qgc3NyUm91dGVzID0gZ2V0U1NSUm91dGVzKCk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc3NyUm91dGVzKSB7XG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgICAgIHVybDogcm91dGUucGF0aCxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24ocm91dGUuY29tcHJlc3MgPz8gdHJ1ZSwgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtTU1JdIE1hdGNoZWQgcm91dGU6ICR7cm91dGUucGF0aH1gKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5leHRyYWN0UGF0aFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpO1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUih1cmwsIHJvdXRlLCBwYXJhbXMsIHJlcXVlc3QsIHJlcGx5LCBjb25maWcpO1xuXG4gICAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ1NSIG9yIFN0YXRpYyBGaWxlIEZhbGxiYWNrIChTU1Ig65287Jqw7Yq47JeQIOunpOy5reuQmOyngCDslYrripQg66qo65OgIOyalOyyrSlcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIipcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAvLyAvYXBpLCAvc29uYW11LXVp64qUIDQwNCDqt7jrjIDroZxcbiAgICAgICAgaWYgKHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpIHx8IHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUuyaqSBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImNzclwiLFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgIHBhdGg6IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjc3JDYWNoZUNvbmZpZyA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNzckNhY2hlUmVxKTtcblxuICAgICAgICAgIGlmIChjc3JDYWNoZUNvbmZpZykge1xuICAgICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGNzckNhY2hlQ29uZmlnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsoJXsoIEg7YyM7J287J20IOyhtOyerO2VoCDqsr3smrAsIOygleyggSDtjIzsnbzsnYQg66i87KCAIOyEnOu5me2VtOyVvO2VqFxuICAgICAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHJlcXVlc3QudXJsKTtcbiAgICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIod2ViRGlzdFBhdGgsIHJlcXVlc3RQYXRoKTtcbiAgICAgICAgaWYgKHNhZmVGaWxlUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDMpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF3YWl0IGZpbGVFeGlzdHMoc2FmZUZpbGVQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShzYWZlRmlsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiByZXBseS50eXBlKG1pbWVMb29rdXAoc2FmZUZpbGVQYXRoKSB8fCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKS5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ1NSIGZhbGxiYWNrOiBpbmRleC5odG1sIOyEnOu5mVxuICAgICAgICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIikuc2VuZChhd2FpdCBmcy5yZWFkRmlsZShpbmRleFBhdGgsIFwidXRmLThcIikpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinJMgU3RhdGljIHdlYiBzZXJ2ZXIgY29uZmlndXJlZCB3aXRoICR7c3NyQXZhaWxhYmxlID8gXCJTU1JcIiA6IFwiQ1NSIG9ubHlcIn0gc3VwcG9ydGApO1xuICB9XG5cbiAgY3JlYXRlQXBpSGFuZGxlcihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgICAvLyBDb250ZXh0IOyDneyEsVxuICAgICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIGd1YXJkcyDsspjrpqxcbiAgICAgICAgKGFwaS5vcHRpb25zLmd1YXJkcyA/PyBbXSkuZXZlcnkoKGd1YXJkKSA9PiBjb25maWcuZ3VhcmRIYW5kbGVyKGd1YXJkLCByZXF1ZXN0LCBhcGkpKTtcblxuICAgICAgICAvLyDtjIzrnbzrr7jthLAg7KCV67O066GcIHpvZCDsiqTtgqTrp4gg67mM65OcXG4gICAgICAgIGNvbnN0IHsgZ2V0Wm9kT2JqZWN0RnJvbUFwaSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb2RlLWNvbnZlcnRlcnNcIik7XG4gICAgICAgIGNvbnN0IFJlcVR5cGUgPSBnZXRab2RPYmplY3RGcm9tQXBpKGFwaSwgdGhpcy5zeW5jZXIudHlwZXMpO1xuXG4gICAgICAgIC8vIHJlcXVlc3Qg7YyM7IuxXG4gICAgICAgIGNvbnN0IHdoaWNoID0gYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIiA/IFwicXVlcnlcIiA6IFwiYm9keVwiO1xuICAgICAgICBsZXQgcmVxQm9keToge1xuICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIC8vIO2MjOydvCDsl4XroZzrk5wg7J6I64qUIOqyveyasCDsnoTsi5wg642w7J207YSwXG4gICAgICAgIGNvbnN0IGZpbGVzOiB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogQnVmZmVyZWRGaWxlW107XG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogVXBsb2FkZWRGaWxlW107XG4gICAgICAgIH0gPSB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogW10sXG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKHJlcXVlc3Rbd2hpY2hdID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcmVxdWVzdC5wYXJ0cyh7XG4gICAgICAgICAgICAgIGxpbWl0czogYXBpLnVwbG9hZE9wdGlvbnMubGltaXRzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEZvcm1EYXRh7J2YIGZpZWxk65Ok7J2EIOyehOyLnOuhnCDsoIDsnqVcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA9PT0gXCJidWZmZXJcIiB8fCAhYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSkge1xuICAgICAgICAgICAgICAvLyBCdWZmZXIg66qo65OcOiDrqZTrqqjrpqzsl5Ag66Gc65OcXG4gICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAvLyBDUklUSUNBTDog7YyM7J28IOyKpO2KuOumvOydhCDsponsi5wgY29uc3VtZe2VtOyVvCDri6TsnYwgcGFydOuhnCDrhJjslrTqsIgg7IiYIOyeiOydjFxuICAgICAgICAgICAgICAgICAgLy8g7J20IO2YuOy2nOydtCDsl4bsnLzrqbQg7KKF7KKFIG11bHRpcGFydCDtjIzsi7HsnbQgcGVuZGluZyDsg4Htg5zroZwg7YOA7J6E7JWE7JuDIOuwnOyDnVxuICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcGFydC50b0J1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgZmlsZXMuYnVmZmVyZWRGaWxlcy5wdXNoKG5ldyBCdWZmZXJlZEZpbGUocGFydCwgYnVmZmVyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgICAvLyBTdHJlYW0g66qo65OcOiDsponsi5wg7KCA7J6l7IaM66GcIOyKpO2KuOumrOuwjVxuICAgICAgICAgICAgICBjb25zdCBkaXNrTmFtZSA9IGFwaS51cGxvYWRPcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgICBjb25zdCBkaXNrID0gdGhpcy5zdG9yYWdlLnVzZShkaXNrTmFtZSk7XG5cbiAgICAgICAgICAgICAgLy8g7Jqw7ISg7Iic7JyEOiDrjbDsvZTroIjsnbTthLAgPiDsoITsl60g7ISk7KCVID4g6riw67O46rCSXG4gICAgICAgICAgICAgIGNvbnN0IGtleUdlbmVyYXRvcjogS2V5R2VuZXJhdG9yID1cbiAgICAgICAgICAgICAgICBhcGkudXBsb2FkT3B0aW9ucy5rZXlHZW5lcmF0b3IgPz9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXJ2ZXIuc3RvcmFnZT8ua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgZGVmYXVsdEtleUdlbmVyYXRvcjtcblxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQga2V5R2VuZXJhdG9yKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGRpc2sucHV0U3RyZWFtKGtleSwgcGFydC5maWxlLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGRpc2suZ2V0VXJsKGtleSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWRVcmwgPSBhd2FpdCBkaXNrLmdldFNpZ25lZFVybChrZXkpO1xuXG4gICAgICAgICAgICAgICAgICBmaWxlcy51cGxvYWRlZEZpbGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIG5ldyBVcGxvYWRlZEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHBhcnQuZmlsZS5ieXRlc1JlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZFVybCxcbiAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgZGlza05hbWUsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBxc+uhnCDspJHssqkg6rWs7KGwIO2MjOyLsTogcGFyYW1zW2NhdGVnb3J5XSDihpIgeyBwYXJhbXM6IHsgY2F0ZWdvcnk6IFwidGVzdFwiIH0gfVxuICAgICAgICAgICAgY29uc3QgcXMgPSBhd2FpdCBpbXBvcnQoXCJxc1wiKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHFzLmRlZmF1bHQucGFyc2UoZmllbGRzKTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYm9keSwgcGFyc2VkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgICAgIHJlcUJvZHkgPSBmYXN0aWZ5Q2FzdGVyKFJlcVR5cGUpLnBhcnNlKGJvZHkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc3QgeyBab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiem9kXCIpO1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaHVtYW5pemVab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvem9kLWVycm9yXCIpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBodW1hbml6ZVpvZEVycm9yKGUpXG4gICAgICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgICAgICBjb25zdCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZywge1xuICAgICAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZVxuICAgICAgICByZXBseS50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgY29uc3QgYXBpQ2FjaGVDb25maWcgPSB0aGlzLmdldEFwaUNhY2hlQ29udHJvbChhcGksIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChhcGlDYWNoZUNvbmZpZykge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBhcGlDYWNoZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsl4XroZzrk5wg7Ji17IWY7J20IOyeiOuKlCDqsr3smrAg7YyM7J28IOuNsOydtO2EsOulvCBDb250ZXh07JeQIOy2lOqwgFxuICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBjb25zdW1lID0gYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA/PyBcImJ1ZmZlclwiO1xuICAgICAgICAgIGlmIChjb25zdW1lID09PSBcImJ1ZmZlclwiKSB7XG4gICAgICAgICAgICBjb250ZXh0LmJ1ZmZlcmVkRmlsZXMgPSBmaWxlcy5idWZmZXJlZEZpbGVzO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uc3VtZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgY29udGV4dC51cGxvYWRlZEZpbGVzID0gZmlsZXMudXBsb2FkZWRGaWxlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrqqjrjbgg66mU7IaM65OcIGFyZ3Mg7IOd7ISx7ZWY7JesIO2YuOy2nFxuICAgICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgLy8gQ29udGV4dCDsnbjsoJ3shZhcbiAgICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXFCb2R5W3BhcmFtLm5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVSTOyXkOyEnCBwYXRoIHBhcmFtc+ulvCDstpTstpztlanri4jri6QuXG4gICAqIOyYiDogcGF0dGVybj1cIi9hZG1pbi9jb21wYW5pZXMvOmNvbXBhbnlJZFwiLCB1cmw9XCIvYWRtaW4vY29tcGFuaWVzLzEyM1wiIOKGkiB7IGNvbXBhbnlJZDogXCIxMjNcIiB9XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RQYXRoUGFyYW1zKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgdXJsUGFydHMgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybCh1cmwpLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhdHRlcm5QYXJ0c1tpXS5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBwYXJhbXNbcGF0dGVyblBhcnRzW2ldLnNsaWNlKDEpXSA9IHVybFBhcnRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSB1cmxQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVyblBhcnQgPSBwYXR0ZXJuUGFydHNbaV07XG4gICAgICBjb25zdCB1cmxQYXJ0ID0gdXJsUGFydHNbaV07XG4gICAgICBpZiAocGF0dGVyblBhcnQuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocGF0dGVyblBhcnQgIT09IHVybFBhcnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXRobmFtZUZyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmwuc3BsaXQoXCI/XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYmFzZURpcjogc3RyaW5nLCBpbnB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KGlucHV0UGF0aCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICBpZiAoZGVjb2RlZC5pbmNsdWRlcyhcIlxcMFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGRlY29kZWQucmVwbGFjZSgvXlxcLysvLCBcIlwiKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVGcm9tQmFzZSA9IHBhdGgucmVsYXRpdmUoYmFzZURpciwgcmVzb2x2ZWRQYXRoKTtcbiAgICAgIGlmIChyZWxhdGl2ZUZyb21CYXNlLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVGcm9tQmFzZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFQSSDsnZHri7Xsl5Ag7KCB7Jqp7ZWgIENhY2hlLUNvbnRyb2wg7ISk7KCV7J2EIOqysOygle2VqeuLiOuLpC5cbiAgICog7Jqw7ISg7Iic7JyEOiDqsJzrs4Qg7KeA7KCVID4gY2FjaGVDb250cm9sSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBcGlDYWNoZUNvbnRyb2woXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICkge1xuICAgIC8vIOuNsOy9lOugiOydtO2EsCDshKTsoJUg7Jqw7ISgXG4gICAgaWYgKGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbCkge1xuICAgICAgcmV0dXJuIGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbDtcbiAgICB9XG5cbiAgICAvLyDsoITsl60g7ZW465Ok65+sXG4gICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlcIixcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgcGF0aDogcmVxdWVzdC5yb3V0ZU9wdGlvbnM/LnVybCA/PyByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGFwaSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNTUuyaqSBBUEkg7Zi47LacIChIVFRQIOyYpOuyhO2XpOuTnCDsl4bsnbQg7KeB7KCRIO2YuOy2nClcbiAgICogY3JlYXRlQXBpSGFuZGxlcuydmCDroZzsp4HsnYQg7J6s7IKs7Jqp7ZWY65CYLCByZXF1ZXN0IO2MjOyLsSDrjIDsi6AgcGFyYW1zIOyngeygkSDsgqzsmqlcbiAgICovXG4gIGFzeW5jIGludm9rZUFwaUZvclNTUihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogU1NS7JeQ7IScIOuLpOyWke2VnCDtg4DsnoXsnZggcGFyYW1z66W8IOuwm+yVhOyVvCDtlahcbiAgICBwYXJhbXM6IGFueVtdLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBDb250ZXh0IOyDneyEsSAo6riw7KG0IOuplOyGjOuTnCDsnqzsgqzsmqkpXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYXJncyDsg53shLE6IENvbnRleHQg7YyM652866+47YSw64qUIOyjvOyehSwg64KY66i47KeA64qUIHBhcmFtc+yXkOyEnCDqsIDsoLjsmKTquLBcbiAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgIGxldCBwYXJhbXNJbmRleCA9IDA7XG4gICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbXNbcGFyYW1zSW5kZXgrK107XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo6424IOuplOyEnOuTnCDtmLjstpwgKOq4sOyhtCDrqZTshJzrk5wg7J6s7IKs7JqpKVxuICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBpbnZva2VNb2RlbE1ldGhvZChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGFyZ3M6IHVua25vd25bXSxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IG1vZGVs7J2AIOuqqOuNuCDsnbjsiqTthLTsiqTsnbTrr4DroZwg66mU7ISc65OcIO2YuOy2nCDqsIDriqVcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAobW9kZWwgYXMgYW55KVthcGkubWV0aG9kTmFtZV0uYXBwbHkobW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8Q29udGV4dD4ge1xuICAgIC8vIGNyZWF0ZVNTRUZhY3Rvcnkg7ZWo7IiY7JeQIOuvuOumrCByZXF1ZXN07J2YIHNvY2tldOqzvCByZXBseeulvCDrsJTsnbjrlKkuXG4gICAgY29uc3QgeyBjcmVhdGVTU0VGYWN0b3J5IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdHJlYW0vc3NlXCIpO1xuICAgIGNvbnN0IGNyZWF0ZVNTRSA9ICg8VCBleHRlbmRzIFpvZE9iamVjdD4oXG4gICAgICBfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgICBfcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgICAgIF9ldmVudHM6IFQsXG4gICAgKSA9PiBjcmVhdGVTU0VGYWN0b3J5KF9yZXF1ZXN0LnNvY2tldCwgX3JlcGx5LCBfZXZlbnRzKSkuYmluZChudWxsLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAvLyBsb2NhbGUg6rCQ7KeAXG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIHRoaXMuZGV0ZWN0TG9jYWxlKHJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1sYW5ndWFnZVwiXSwgdGhpcy5jb25maWcuaTE4bi5zdXBwb3J0ZWRMb2NhbGVzKSA/P1xuICAgICAgdGhpcy5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlO1xuXG4gICAgLy8gYXV0aCBjb250ZXh0IOy2lOqwgFxuICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLl9hdXRoPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0ge1xuICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgY29uZmlnLmNvbnRleHRQcm92aWRlcihcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgcmVwbHksXG4gICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgICAgICBjcmVhdGVTU0UsXG4gICAgICAgICAgICBuYWl0ZVN0b3JlOiBOYWl0ZS5jcmVhdGVTdG9yZSgpLFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgLy8gYXV0aFxuICAgICAgICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXBseSxcbiAgICAgICAgKSxcbiAgICAgICkpLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0LUxhbmd1YWdlIO2XpOuNlOyXkOyEnCDsp4Dsm5DtlZjripQgbG9jYWxl7J2EIOywvuyKteuLiOuLpC5cbiAgICogQGV4YW1wbGUgXCJrby1LUixrbztxPTAuOSxlbjtxPTAuOFwiIOKGkiBcImtvXCJcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0TG9jYWxlKFxuICAgIGFjY2VwdExhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3VwcG9ydGVkOiBzdHJpbmdbXSxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFjY2VwdExhbmd1YWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gQWNjZXB0LUxhbmd1YWdlOiBrby1LUixrbztxPTAuOSxlbjtxPTAuOFxuICAgIGNvbnN0IGxhbmdzID0gYWNjZXB0TGFuZ3VhZ2Uuc3BsaXQoXCIsXCIpLm1hcCgobGFuZykgPT4ge1xuICAgICAgY29uc3QgW2NvZGVdID0gbGFuZy5zcGxpdChcIjtcIik7XG4gICAgICByZXR1cm4gY29kZS50cmltKCkuc3BsaXQoXCItXCIpWzBdOyAvLyBrby1LUiDihpIga29cbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ncy5maW5kKChsYW5nKSA9PiBzdXBwb3J0ZWQuaW5jbHVkZXMobGFuZykpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRXYXRjaGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdhdGNoUGF0aCA9IFtwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJzcmNcIildO1xuXG4gICAgY29uc3QgY2hva2lkYXIgPSAoYXdhaXQgaW1wb3J0KFwiY2hva2lkYXJcIikpLmRlZmF1bHQ7XG4gICAgdGhpcy53YXRjaGVyID0gY2hva2lkYXIud2F0Y2god2F0Y2hQYXRoLCB7XG4gICAgICBpZ25vcmVkOiAocGF0aCwgc3RhdHMpID0+XG4gICAgICAgICEhc3RhdHM/LmlzRmlsZSgpICYmICFwYXRoLmVuZHNXaXRoKFwiLnRzXCIpICYmICFwYXRoLmVuZHNXaXRoKFwiLmpzb25cIiksXG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMud2F0Y2hlci5vbihcImFsbFwiLCBhc3luYyAoZXZlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aCh0aGlzLmFwaVJvb3RQYXRoKSxcbiAgICAgICAgXCJGaWxlIHBhdGggaXMgbm90IHdpdGhpbiB0aGUgQVBJIHJvb3QgcGF0aFwiLFxuICAgICAgKTtcblxuICAgICAgaWYgKGV2ZW50ICE9PSBcImNoYW5nZVwiICYmIGV2ZW50ICE9PSBcImFkZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gc29uYW11LmNvbmZpZy50cyDrs4Dqsr0g7IucIOyerOyLnOyekVxuICAgICAgICBjb25zdCBpc0NvbmZpZ1RzID0gZmlsZVBhdGggPT09IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcInNvbmFtdS5jb25maWcudHNcIik7XG5cbiAgICAgICAgaWYgKGlzQ29uZmlnVHMpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKHRoaXMuYXBpUm9vdFBhdGgsIFwiYXBpXCIpO1xuICAgICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX0gLSBSZXN0YXJ0aW5nLi4uYCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIFwiU0lHVVNSMlwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpbGVDaGFuZ2UoZXZlbnQsIGFic29sdXRlUGF0aCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKlxuICAgICBBIGZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSBoYW5kbGVzIGluaXQgYW5kIGRlc3Ryb3kgd2hlbiB1c2luZyBTb25hbXUgdmlhIHNjcmlwdHMuXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbXByZXNzIO2UjOufrOq3uOyduOydgCDri6Trpbgg7ZSM65+s6re47J2467O064ukIOuovOyggCDrk7HroZ3rkJjslrTslbwg7ZWp64uI64ukLlxuICAgIGlmIChwbHVnaW5zLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBjb21wcmVzc1BsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9jb21wcmVzc1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSBhcyAoXCJiclwiIHwgXCJnemlwXCIgfCBcImRlZmxhdGVcIilbXSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChwbHVnaW5zLmNvbXByZXNzID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKGNvbXByZXNzUGx1Z2luLCB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgLi4ucGx1Z2lucy5jb21wcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGx1Z2luc01vZHVsZXMgPSB7XG4gICAgICBjb3JzOiBcIkBmYXN0aWZ5L2NvcnNcIixcbiAgICAgIGZvcm1ib2R5OiBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCIsXG4gICAgICBtdWx0aXBhcnQ6IFwiQGZhc3RpZnkvbXVsdGlwYXJ0XCIsXG4gICAgICBxczogXCJmYXN0aWZ5LXFzXCIsXG4gICAgICBzc2U6IFwiZmFzdGlmeS1zc2UtdjJcIixcbiAgICAgIHN0YXRpYzogXCJAZmFzdGlmeS9zdGF0aWNcIixcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJQbHVnaW4gPSBhc3luYyA8SyBleHRlbmRzIGtleW9mIE5vbk51bGxhYmxlPHR5cGVvZiBwbHVnaW5zPj4oXG4gICAgICBrZXk6IEssXG4gICAgICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb24gPSBwbHVnaW5zW2tleV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAob3B0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0LCBvcHRpb24pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHBsdWdpbk5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHBsdWdpbnNNb2R1bGVzKSkge1xuICAgICAgYXdhaXQgcmVnaXN0ZXJQbHVnaW4oa2V5IGFzIGtleW9mIHR5cGVvZiBwbHVnaW5zLCBwbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy5jdXN0b20pIHtcbiAgICAgIHBsdWdpbnMuY3VzdG9tKHNlcnZlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJldHRlci1hdXRoIOudvOyasO2KuOulvCDrk7HroZ3tlanri4jri6QuXG4gICAqIC9hcGkvYXV0aC8qIOqyveuhnOuhnCDsnbjspp0gQVBJ6rCAIOyekOuPmSDrk7HroZ3rkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQmV0dGVyQXV0aChcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSxcbiAgICBvcHRpb25zOiBOb25OdWxsYWJsZTxTb25hbXVTZXJ2ZXJPcHRpb25zW1wiYXV0aFwiXT4sXG4gICkge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBvcHRpb25zLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG5cbiAgICAvLyDsgqzsmqnsnpAg7ISk7KCV6rO8IOq4sOuzuOqwkuydhCBtZXJnZVxuICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBvcHRpb25zKTtcblxuICAgIC8vIGJldHRlci1hdXRoIOyduOyKpO2EtOyKpCDsg53shLFcbiAgICBjb25zdCB7IGJldHRlckF1dGggfSA9IGF3YWl0IGltcG9ydChcImJldHRlci1hdXRoXCIpO1xuICAgIGNvbnN0IHsgUG9vbCB9ID0gYXdhaXQgaW1wb3J0KFwicGdcIik7XG5cbiAgICB0aGlzLl9hdXRoID0gYmV0dGVyQXV0aCh7XG4gICAgICBkYXRhYmFzZTogbmV3IFBvb2woREIuZ2V0REJDb25maWcoXCJ3XCIpLmNvbm5lY3Rpb24gYXMgUG9vbENvbmZpZyksXG4gICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgIH0pO1xuXG4gICAgLy8gYmV0dGVyLWF1dGgg65287Jqw7Yq4IOuTseuhnVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIlBPU1RcIl0sXG4gICAgICB1cmw6IGAke2Jhc2VQYXRofS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsLCBgaHR0cDovLyR7cmVxdWVzdC5oZWFkZXJzLmhvc3R9YCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIC4uLihyZXF1ZXN0LmJvZHkgPyB7IGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuYm9keSkgfSA6IHt9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguaGFuZGxlcihyZXEpO1xuXG4gICAgICAgIHJlcGx5LnN0YXR1cyhyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVwbHkuaGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQocmVzcG9uc2UuYm9keSA/IGF3YWl0IHJlc3BvbnNlLnRleHQoKSA6IG51bGwpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgYmV0dGVyLWF1dGggcmVnaXN0ZXJlZCBhdCAke2Jhc2VQYXRofS8qYCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIoKTtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7J20IOyXhuycvOuptCDsupDsi5wg67mE7Zmc7ISx7ZmUXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZihudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsl5Ag65Sw6528IENhY2hlTWFuYWdlciDsg53shLFcbiAgICBjb25zdCB7IGNyZWF0ZUNhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVXb3JrZmxvd3Mob3B0aW9uczogU29uYW11VGFza09wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7IFdvcmtmbG93TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiKTtcbiAgICAvLyBOT1RFOiBAc29uYW11LWtpdC90YXNrcyDslYjsl5DshKAga25leCBjb25maWfrpbwg7IiY7KCV7ZWY6riwIOuVjOusuOyXkCBjb25uZWN0aW9u7J20IOyVhOuLjCBjb25maWcg7Ke466GcIOuztOuDheuLiOuLpC5cbiAgICB0aGlzLl93b3JrZmxvd3MgPSBuZXcgV29ya2Zsb3dNYW5hZ2VyKERCLmdldERCQ29uZmlnKFwid1wiKSk7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlV29ya2VyID0gb3B0aW9ucy5lbmFibGVXb3JrZXIgPz8gaXNEYWVtb25TZXJ2ZXIoKTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2VyT3B0aW9ucyA9IHtcbiAgICAgIGNvbmN1cnJlbmN5OiBvcy5jcHVzKCkubGVuZ3RoIC0gMSxcbiAgICAgIHVzZVB1YlN1YjogdHJ1ZSxcbiAgICAgIGxpc3RlbkRlbGF5OiA1MDAsXG4gICAgfTtcblxuICAgIGlmIChlbmFibGVXb3JrZXIpIHtcbiAgICAgIHRoaXMud29ya2Zsb3dzLnNldHVwV29ya2VyKHtcbiAgICAgICAgLi4uZGVmYXVsdFdvcmtlck9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMud29ya2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgb3B0aW9uczogU29uYW11U2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLmxpc3Rlbj8ucG9ydCA/PyAzMDAwO1xuICAgIGNvbnN0IGhvc3QgPSBvcHRpb25zLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblNodXRkb3duPy4oc2VydmVyKTtcbiAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgc2h1dGRvd246XCIsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgc2h1dGRvd24pO1xuXG4gICAgaWYgKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKSB7XG4gICAgICBzZXJ2ZXIuc2V0RXJyb3JIYW5kbGVyKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKTtcbiAgICB9XG5cbiAgICBzZXJ2ZXJcbiAgICAgIC5saXN0ZW4oeyBwb3J0LCBob3N0IH0pXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLnN0YXJ0V29ya2VyKCk7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblN0YXJ0Py4oc2VydmVyKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGVycikgPT4ge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlKGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDssqsg67KI7Ke4IO2MjOydvOydtOuptCBITVIg7Iuc7J6RIOyLnOqwhCDquLDroZ1cbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmhtclN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0ZpbGVzLnB1c2goZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX1gKSk7XG5cbiAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jRnJvbVdhdGNoZXIoZXZlbnQsIGZpbGVQYXRoKTtcblxuICAgIC8vIOyymOumrCDsmYTro4zrkJwg7YyM7J287J2EIOuMgOq4sCDrqqnroZ3sl5DshJwg7KCc6rGwXG4gICAgdGhpcy5wZW5kaW5nRmlsZXMgPSB0aGlzLnBlbmRpbmdGaWxlcy5zbGljZSgxKTtcblxuICAgIC8vIOuqqOuToCDtjIzsnbwg7LKY66as6rCAIOyZhOujjOuQmOuptCDstZzsooUg66mU7Iuc7KeAIOy2nOugpVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoSE1SKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2hITVIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLmhtclN0YXJ0VGltZTtcbiAgICBjb25zdCBbY2hhbGssIHsgY2VudGVyVGV4dCB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdCxcbiAgICAgIGltcG9ydChcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiKSxcbiAgICBdKTtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KG1zZykpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICB0aGlzLl93b3JrZmxvd3M/LmRlc3Ryb3koKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuX2NhY2hlPy5kaXNjb25uZWN0KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLl9kZXZWaXRlc3RNYW5hZ2VyPy5zaHV0ZG93bigpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy53YXRjaGVyPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgbG9ndGFwZURpc3Bvc2UoKSxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU29uYW11ID0gbmV3IFNvbmFtdUNsYXNzKCk7XG5cbi8qKlxuICogc3RyZWFtIOuqqOuTnOyXkOyEnCDtgqQg7IOd7ISxIO2VqOyImOqwgCDsp4DsoJXrkJjsp4Ag7JWK7JWY7J2EIOuVjCDsgqzsmqntlZjripQg6riw67O4IO2VqOyImOyeheuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEtleUdlbmVyYXRvcihmaWxlOiB7IGZpbGVuYW1lOiBzdHJpbmc7IG1pbWV0eXBlOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dCA9IG1pbWUuZXh0ZW5zaW9uKGZpbGUubWltZXR5cGUpIHx8IFwiYmluXCI7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpO1xuICByZXR1cm4gYHVwbG9hZHMvJHt0aW1lc3RhbXB9LSR7cmFuZG9tfS4ke2V4dH1gO1xufVxuIl0sIm5hbWVzIjpbImRpc3Bvc2UiLCJsb2d0YXBlRGlzcG9zZSIsImFzc2VydCIsIkFzeW5jTG9jYWxTdG9yYWdlIiwiZnMiLCJtaW1lIiwibG9va3VwIiwibWltZUxvb2t1cCIsIm9zIiwicGF0aCIsIkJBU0VfRklFTERfTUFQUElOR1MiLCJjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkIiwiY3JlYXRlTW9ja1NTRUZhY3RvcnkiLCJEQiIsImlzRGFlbW9uU2VydmVyIiwibWVyZ2UiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsImFwcGx5Q2FjaGVIZWFkZXJzIiwiQ2FjaGVQcmVzZXRzIiwidG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24iLCJTRCIsIk5haXRlIiwiQnVmZmVyZWRGaWxlIiwiVXBsb2FkZWRGaWxlIiwiZXhpc3RzIiwiZmlsZUV4aXN0cyIsImdldFNlY3JldHMiLCJTb25hbXVDbGFzcyIsImlzSW5pdGlhbGl6ZWQiLCJmb3JUZXN0aW5nIiwiYXN5bmNMb2NhbFN0b3JhZ2UiLCJnZXRDb250ZXh0Iiwic3RvcmUiLCJnZXRTdG9yZSIsImNvbnRleHQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJyZXF1ZXN0IiwicmVwbHkiLCJoZWFkZXJzIiwiY3JlYXRlU1NFIiwic2NoZW1hIiwibmFpdGVTdG9yZSIsIk1hcCIsIkVycm9yIiwiX2FwaVJvb3RQYXRoIiwiYXBpUm9vdFBhdGgiLCJhcHBSb290UGF0aCIsInNwbGl0Iiwic2VwIiwic2xpY2UiLCJqb2luIiwiX2RiQ29uZmlnIiwiZGJDb25maWciLCJfc3luY2VyIiwic3luY2VyIiwiX2NvbmZpZyIsImNvbmZpZyIsInNlY3JldHMiLCJfc3RvcmFnZSIsInN0b3JhZ2UiLCJfY2FjaGUiLCJjYWNoZSIsIl93b3JrZmxvd3MiLCJ3b3JrZmxvd3MiLCJfYXV0aCIsImF1dGgiLCJfZGV2Vml0ZXN0TWFuYWdlciIsImRldlZpdGVzdE1hbmFnZXIiLCJtYW5hZ2VyIiwid2F0Y2hlciIsInBlbmRpbmdGaWxlcyIsImhtclN0YXJ0VGltZSIsInNlcnZlciIsImluaXRGb3JUZXN0aW5nIiwiaW5pdCIsInVuZGVmaW5lZCIsImRvU2lsZW50IiwiZW5hYmxlU3luYyIsImNoYWxrIiwiZGVmYXVsdCIsImNvbnNvbGUiLCJ0aW1lIiwiY3lhbiIsImZpbmRBcGlSb290UGF0aCIsImxvYWRDb25maWciLCJkYXRhYmFzZSIsImRlZmF1bHRPcHRpb25zIiwiY2xpZW50IiwiY29uZmlndXJlTG9nVGFwZSIsImxvZ2dpbmciLCJnZW5lcmF0ZURCQ29uZmlnIiwibG9nIiwiZ3JlZW4iLCJFbnRpdHlNYW5hZ2VyIiwiYXV0b2xvYWQiLCJpbml0aWFsaXplQ2FjaGUiLCJpbml0aWFsaXplV29ya2Zsb3dzIiwidGFza3MiLCJTeW5jZXIiLCJhdXRvbG9hZFR5cGVzIiwiYXV0b2xvYWRNb2RlbHMiLCJhdXRvbG9hZEFwaXMiLCJhdXRvbG9hZFdvcmtmbG93cyIsIlRlbXBsYXRlTWFuYWdlciIsImF1dG9sb2FkU1NSUm91dGVzIiwiaXNMb2NhbCIsImlzVGVzdCIsInNldHVwQmlvbWUiLCJpc0hvdFJlbG9hZFNlcnZlciIsInN5bmMiLCJzdGFydFdhdGNoZXIiLCJ0aW1lRW5kIiwiY3JlYXRlU2VydmVyIiwiaW5pdE9wdGlvbnMiLCJvcHRpb25zIiwiZmFzdGlmeSIsImdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIiwibG9nZ2VyIiwiY2F0ZWdvcnkiLCJmYXN0aWZ5Q2F0ZWdvcnkiLCJTdG9yYWdlTWFuYWdlciIsInBsdWdpbnMiLCJyZWdpc3RlclBsdWdpbnMiLCJyZWdpc3RlckJldHRlckF1dGgiLCJ3aXRoRmFzdGlmeSIsImFwaUNvbmZpZyIsImJvb3QiLCJ0aW1lem9uZSIsImFwaSIsImZvcm1hdEluVGltZVpvbmUiLCJJU09fREFURV9SRUdFWCIsIkRBVEVfRk9STUFUIiwic2V0UmVwbHlTZXJpYWxpemVyIiwicGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJfa2V5IiwidmFsdWUiLCJ0ZXN0IiwiRGF0ZSIsImdldCIsInJvdXRlIiwicHJlZml4IiwiX3JlcXVlc3QiLCJfcmVwbHkiLCJhcGlzIiwic29uYW11VUlBcGlQbHVnaW4iLCJyZWdpc3RlciIsImRldlJ1bm5lciIsImVuYWJsZWQiLCJyZWdpc3RlckRldlRlc3RSb3V0ZXMiLCJ3ZWJQYXRoIiwiaGFzV2ViIiwicGx1Z2luQ29tcHJlc3MiLCJjb21wcmVzcyIsImdsb2JhbENvbXByZXNzT3B0aW9ucyIsInRocmVzaG9sZCIsImVuY29kaW5ncyIsImN1c3RvbVR5cGVzIiwiZGlzYWJsZUludGVncmF0ZWRXZWIiLCJTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiIsInNldHVwRGV2U2VydmVyV2l0aFZpdGUiLCJzZXR1cERldlNlcnZlciIsIm1vZGVscyIsIm1vZGVsTmFtZSIsIm1ldGhvZCIsImh0dHBNZXRob2QiLCJ1cmwiLCJoYW5kbGVyIiwiY3JlYXRlQXBpSGFuZGxlciIsInNldHVwU3RhdGljV2ViU2VydmVyIiwiaGFuZGxlRGV2QXBpUmVxdWVzdCIsImdldFBhdGhuYW1lRnJvbVVybCIsInN0YXJ0c1dpdGgiLCJtYXRjaGVkQXBpIiwiZmluZCIsImFwaU1ldGhvZCIsImZ1bGxQYXRoIiwiaXNQYXRoUGF0dGVybk1hdGNoIiwidml0ZVNlcnZlciIsInZpdGUiLCJyb290IiwibWlkZGxld2FyZU1vZGUiLCJobXIiLCJhcHBUeXBlIiwidXNlIiwicmVxIiwicmVzIiwibmV4dCIsIm1pZGRsZXdhcmVzIiwicmVzdWx0IiwibWF0Y2hTU1JSb3V0ZSIsInJlbmRlclNTUiIsInNzck1hdGNoIiwiaHRtbCIsInBhcmFtcyIsInR5cGUiLCJ0ZW1wbGF0ZSIsInJlYWRGaWxlIiwidHJhbnNmb3JtSW5kZXhIdG1sIiwiZSIsInNzckZpeFN0YWNrdHJhY2UiLCJlcnJvciIsInN0YXR1cyIsIm1lc3NhZ2UiLCJhZGRIb29rIiwiY2xvc2UiLCJ3ZWJEaXN0UGF0aCIsInNzclBhdGgiLCJzc3JFbnRyeVBhdGgiLCJzc3JSb3V0ZXNQYXRoIiwid2FybiIsInNzckF2YWlsYWJsZSIsInJlcXVlc3RlZEZpbGUiLCJmaWxlbmFtZSIsImFzc2V0c0RpciIsInNhZmVGaWxlUGF0aCIsInJlc29sdmVQYXRoV2l0aGluQmFzZURpciIsInNlbmQiLCJub3JtYWxpemVkUmVxdWVzdGVkRmlsZSIsInJlbGF0aXZlIiwicmVwbGFjZSIsImFzc2V0UGF0aCIsImdldENhY2hlQ29udHJvbEZvckFzc2V0IiwiY2FjaGVSZXEiLCJjYWNoZUNvbnRyb2xIYW5kbGVyIiwiaW1tdXRhYmxlIiwiZXh0IiwicG9wIiwiZmlsZXMiLCJyZWFkZGlyIiwiY3VycmVudEZpbGUiLCJmIiwiZW5kc1dpdGgiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJpbmNsdWRlcyIsImdldFNTUlJvdXRlcyIsInNzclJvdXRlcyIsImV4dHJhY3RQYXRoUGFyYW1zIiwiY3NyQ2FjaGVSZXEiLCJjc3JDYWNoZUNvbmZpZyIsInJlcXVlc3RQYXRoIiwiaW5kZXhQYXRoIiwiY3JlYXRlQ29udGV4dCIsInJ1biIsImd1YXJkcyIsImV2ZXJ5IiwiZ3VhcmQiLCJndWFyZEhhbmRsZXIiLCJnZXRab2RPYmplY3RGcm9tQXBpIiwiUmVxVHlwZSIsInR5cGVzIiwid2hpY2giLCJyZXFCb2R5IiwiYnVmZmVyZWRGaWxlcyIsInVwbG9hZGVkRmlsZXMiLCJib2R5IiwidXBsb2FkT3B0aW9ucyIsInBhcnRzIiwibGltaXRzIiwiZmllbGRzIiwiY29uc3VtZSIsInBhcnQiLCJidWZmZXIiLCJ0b0J1ZmZlciIsInB1c2giLCJmaWVsZG5hbWUiLCJTdHJpbmciLCJkaXNrTmFtZSIsImRlc3RpbmF0aW9uIiwiZGlzayIsImtleUdlbmVyYXRvciIsImRlZmF1bHRLZXlHZW5lcmF0b3IiLCJrZXkiLCJtaW1ldHlwZSIsInB1dFN0cmVhbSIsImZpbGUiLCJjb250ZW50VHlwZSIsImdldFVybCIsInNpZ25lZFVybCIsImdldFNpZ25lZFVybCIsInNpemUiLCJieXRlc1JlYWQiLCJxcyIsInBhcnNlZCIsInBhcnNlIiwiT2JqZWN0IiwiYXNzaWduIiwiZmFzdGlmeUNhc3RlciIsIlpvZEVycm9yIiwiaHVtYW5pemVab2RFcnJvciIsIm1lc3NhZ2VzIiwibWFwIiwiaXNzdWUiLCJCYWRSZXF1ZXN0RXhjZXB0aW9uIiwiem9kRXJyb3IiLCJhcGlDYWNoZUNvbmZpZyIsImdldEFwaUNhY2hlQ29udHJvbCIsIkFwaVBhcmFtVHlwZSIsImFyZ3MiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJpc0NvbnRleHQiLCJuYW1lIiwiaW52b2tlTW9kZWxNZXRob2QiLCJwYXR0ZXJuIiwicGF0dGVyblBhcnRzIiwiZmlsdGVyIiwiQm9vbGVhbiIsInVybFBhcnRzIiwiaSIsImxlbmd0aCIsInBhdHRlcm5QYXJ0IiwidXJsUGFydCIsImJhc2VEaXIiLCJpbnB1dFBhdGgiLCJkZWNvZGVkIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwicmVsYXRpdmVQYXRoIiwicmVzb2x2ZWRQYXRoIiwicmVzb2x2ZSIsInJlbGF0aXZlRnJvbUJhc2UiLCJpc0Fic29sdXRlIiwiY2FjaGVDb250cm9sIiwicm91dGVPcHRpb25zIiwiaW52b2tlQXBpRm9yU1NSIiwicGFyYW1zSW5kZXgiLCJtb2RlbCIsIm1ldGhvZE5hbWUiLCJhcHBseSIsImNyZWF0ZVNTRUZhY3RvcnkiLCJfZXZlbnRzIiwic29ja2V0IiwiYmluZCIsImxvY2FsZSIsImRldGVjdExvY2FsZSIsImkxOG4iLCJzdXBwb3J0ZWRMb2NhbGVzIiwiZGVmYXVsdExvY2FsZSIsInNlc3Npb24iLCJnZXRTZXNzaW9uIiwiUHJvbWlzZSIsImNvbnRleHRQcm92aWRlciIsImNyZWF0ZVN0b3JlIiwidXNlciIsImFjY2VwdExhbmd1YWdlIiwic3VwcG9ydGVkIiwibGFuZ3MiLCJsYW5nIiwiY29kZSIsInRyaW0iLCJ3YXRjaFBhdGgiLCJjaG9raWRhciIsIndhdGNoIiwiaWdub3JlZCIsInN0YXRzIiwiaXNGaWxlIiwicGVyc2lzdGVudCIsImlnbm9yZUluaXRpYWwiLCJvbiIsImV2ZW50IiwiYWJzb2x1dGVQYXRoIiwiaXNDb25maWdUcyIsImJvbGQiLCJibHVlIiwia2lsbCIsInBpZCIsImhhbmRsZUZpbGVDaGFuZ2UiLCJydW5TY3JpcHQiLCJmbiIsImRlc3Ryb3kiLCJjb21wcmVzc1BsdWdpbiIsInBsdWdpbnNNb2R1bGVzIiwiY29ycyIsImZvcm1ib2R5IiwibXVsdGlwYXJ0Iiwic3NlIiwic3RhdGljIiwicmVnaXN0ZXJQbHVnaW4iLCJwbHVnaW5OYW1lIiwib3B0aW9uIiwiZW50cmllcyIsImN1c3RvbSIsImJhc2VQYXRoIiwibWVyZ2VkRmllbGRNYXBwaW5ncyIsImJldHRlckF1dGgiLCJQb29sIiwiZ2V0REJDb25maWciLCJjb25uZWN0aW9uIiwiVVJMIiwiaG9zdCIsIlJlcXVlc3QiLCJ0b1N0cmluZyIsInJlc3BvbnNlIiwiZm9yRWFjaCIsImhlYWRlciIsInRleHQiLCJzZXRDYWNoZU1hbmFnZXJSZWYiLCJjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyIiwiY3JlYXRlQ2FjaGVNYW5hZ2VyIiwiV29ya2Zsb3dNYW5hZ2VyIiwiZW5hYmxlV29ya2VyIiwiZGVmYXVsdFdvcmtlck9wdGlvbnMiLCJjb25jdXJyZW5jeSIsImNwdXMiLCJ1c2VQdWJTdWIiLCJsaXN0ZW5EZWxheSIsInNldHVwV29ya2VyIiwid29ya2VyT3B0aW9ucyIsInBvcnQiLCJsaXN0ZW4iLCJsaWZlY3ljbGUiLCJvblNodXRkb3duIiwic2h1dGRvd24iLCJleGl0IiwiZXJyIiwib25FcnJvciIsInNldEVycm9ySGFuZGxlciIsInRoZW4iLCJzdGFydFdvcmtlciIsIm9uU3RhcnQiLCJjYXRjaCIsInJlZCIsIm5vdyIsInN5bmNGcm9tV2F0Y2hlciIsImZpbmlzaEhNUiIsInJlbmV3Q2hlY2tzdW1zIiwiZW5kVGltZSIsInRvdGFsVGltZSIsImNlbnRlclRleHQiLCJhbGwiLCJtc2ciLCJ3aGl0ZSIsImJsYWNrIiwiYmdHcmVlbiIsIkJhc2VNb2RlbCIsImFsbFNldHRsZWQiLCJkaXNjb25uZWN0IiwiU29uYW11IiwiZXh0ZW5zaW9uIiwidGltZXN0YW1wIiwicmFuZG9tIiwiTWF0aCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsV0FBV0MsY0FBYyxRQUFRLG1CQUFtQjtBQUM3RCxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsaUJBQWlCLFFBQVEsY0FBYztBQUloRCxPQUFPQyxRQUFRLG1CQUFjO0FBRTdCLE9BQU9DLFFBQVFDLFVBQVVDLFVBQVUsUUFBUSxhQUFhO0FBQ3hELE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFHeEIsU0FDRUMsbUJBQW1CLEVBQ25CQywrQkFBK0IsRUFDL0JDLG9CQUFvQixFQUNwQkMsRUFBRSxFQUNGQyxjQUFjLEVBQ2RDLEtBQUssRUFDTEMsaUJBQWlCLFFB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
|
|
@@ -6,6 +6,14 @@ export interface GenerateBetterAuthEntitiesOptions {
|
|
|
6
6
|
*/
|
|
7
7
|
plugins?: BetterAuthPluginId[];
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* 기존 프로젝트의 entity.json에 fixtureCompanions를 소급 추가합니다.
|
|
11
|
+
*
|
|
12
|
+
* betterAuthV1 기준으로 fixtureCompanions가 정의된 entity를 찾아
|
|
13
|
+
* 프로젝트 내 entity.json에 해당 prop의 cone에 fixtureCompanions가
|
|
14
|
+
* 없을 때만 추가합니다. 이미 있으면 스킵합니다.
|
|
15
|
+
*/
|
|
16
|
+
export declare function addCompanionsToEntities(): Promise<void>;
|
|
9
17
|
/**
|
|
10
18
|
* better-auth 엔티티들을 Sonamu에 생성/업데이트
|
|
11
19
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-generator.d.ts","sourceRoot":"","sources":["../../src/auth/auth-generator.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,8BAA8B,CAAC;AAyLtC,MAAM,WAAW,iCAAiC;IAChD;;;OAGG;IACH,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
|
|
1
|
+
{"version":3,"file":"auth-generator.d.ts","sourceRoot":"","sources":["../../src/auth/auth-generator.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,8BAA8B,CAAC;AAyLtC,MAAM,WAAW,iCAAiC;IAChD;;;OAGG;IACH,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6B7D;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
|