sonamu 0.8.6 → 0.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/api/sonamu.d.ts +4 -0
  2. package/dist/api/sonamu.d.ts.map +1 -1
  3. package/dist/api/sonamu.js +9 -1
  4. package/dist/auth/auth-generator.d.ts.map +1 -1
  5. package/dist/auth/auth-generator.js +4 -3
  6. package/dist/auth/better-auth-entities.js +5 -2
  7. package/dist/bin/__tests__/test-command.test.js +37 -4
  8. package/dist/bin/test-command.d.ts.map +1 -1
  9. package/dist/bin/test-command.js +36 -13
  10. package/dist/cone/cone-generator.js +13 -2
  11. package/dist/naite/naite.d.ts +8 -7
  12. package/dist/naite/naite.d.ts.map +1 -1
  13. package/dist/naite/naite.js +1 -1
  14. package/dist/syncer/syncer.d.ts.map +1 -1
  15. package/dist/syncer/syncer.js +10 -1
  16. package/dist/testing/__tests__/dev-test-routes.test.js +3 -2
  17. package/dist/testing/bootstrap.d.ts +2 -7
  18. package/dist/testing/bootstrap.d.ts.map +1 -1
  19. package/dist/testing/bootstrap.js +1 -1
  20. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  21. package/dist/testing/dev-test-routes.js +19 -5
  22. package/dist/testing/dev-vitest-manager.d.ts +13 -0
  23. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  24. package/dist/testing/dev-vitest-manager.js +44 -4
  25. package/package.json +4 -4
  26. package/src/api/sonamu.ts +10 -0
  27. package/src/auth/auth-generator.ts +3 -2
  28. package/src/auth/better-auth-entities.ts +1 -1
  29. package/src/bin/__tests__/test-command.test.ts +32 -4
  30. package/src/bin/test-command.ts +48 -25
  31. package/src/cone/cone-generator.ts +12 -1
  32. package/src/naite/naite.ts +11 -7
  33. package/src/skills/sonamu/entity-basic.md +88 -0
  34. package/src/skills/sonamu/model.md +43 -0
  35. package/src/skills/sonamu/project-init.md +24 -0
  36. package/src/syncer/syncer.ts +10 -0
  37. package/src/testing/__tests__/dev-test-routes.test.ts +1 -0
  38. package/src/testing/bootstrap.ts +2 -9
  39. package/src/testing/dev-test-routes.ts +15 -5
  40. package/src/testing/dev-vitest-manager.ts +62 -1
@@ -8,6 +8,7 @@ import type { SonamuDBConfig } from "../database/db";
8
8
  import type { StorageManager } from "../storage/storage-manager";
9
9
  import type { Syncer } from "../syncer/syncer";
10
10
  import type { WorkflowManager } from "../tasks/workflow-manager";
11
+ import type { DevVitestManager } from "../testing/dev-vitest-manager";
11
12
  import type { SonamuFastifyConfig } from "../types/types";
12
13
  import type { AbsolutePath } from "../utils/path-utils";
13
14
  import type { SonamuConfig } from "./config";
@@ -49,6 +50,9 @@ declare class SonamuClass {
49
50
  get workflows(): WorkflowManager;
50
51
  private _auth;
51
52
  get auth(): Auth;
53
+ private _devVitestManager;
54
+ get devVitestManager(): DevVitestManager | null;
55
+ set devVitestManager(manager: DevVitestManager | null);
52
56
  watcher: FSWatcher | null;
53
57
  private pendingFiles;
54
58
  private hmrStartTime;
@@ -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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"}
@@ -113,6 +113,13 @@ class SonamuClass {
113
113
  }
114
114
  return this._auth;
115
115
  }
116
+ _devVitestManager = null;
117
+ get devVitestManager() {
118
+ return this._devVitestManager;
119
+ }
120
+ set devVitestManager(manager) {
121
+ this._devVitestManager = manager;
122
+ }
116
123
  // HMR 처리
117
124
  watcher = null;
118
125
  pendingFiles = [];
@@ -1107,6 +1114,7 @@ class SonamuClass {
1107
1114
  await Promise.allSettled([
1108
1115
  this._workflows?.destroy() ?? Promise.resolve(),
1109
1116
  this._cache?.disconnect() ?? Promise.resolve(),
1117
+ this._devVitestManager?.shutdown() ?? Promise.resolve(),
1110
1118
  this.watcher?.close() ?? Promise.resolve(),
1111
1119
  logtapeDispose()
1112
1120
  ]);
@@ -1122,4 +1130,4 @@ export const Sonamu = new SonamuClass();
1122
1130
  return `uploads/${timestamp}-${random}.${ext}`;
1123
1131
  }
1124
1132
 
1125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgdHlwZSB7IEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlciwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwiaHR0cFwiO1xuaW1wb3J0IG1pbWUsIHsgbG9va3VwIGFzIG1pbWVMb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBCQVNFX0ZJRUxEX01BUFBJTkdTLFxuICBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLFxuICBjcmVhdGVNb2NrU1NFRmFjdG9yeSxcbiAgREIsXG4gIGlzRGFlbW9uU2VydmVyLFxuICBtZXJnZSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCIuLlwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbmZpZywgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyBhcHBseUNhY2hlSGVhZGVycywgQ2FjaGVQcmVzZXRzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbnRyb2xDb25maWcsIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24gfSBmcm9tIFwiLi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgQ29tcHJlc3NPcHRpb25zIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgQnVmZmVyZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvYnVmZmVyZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWFuYWdlciB9IGZyb20gXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBleGlzdHMsIGZpbGVFeGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11Q29uZmlnLCBTb25hbXVTZXJ2ZXJPcHRpb25zLCBTb25hbXVUYXNrT3B0aW9ucyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IGdldFNlY3JldHMsIHR5cGUgU29uYW11U2VjcmV0cyB9IGZyb20gXCIuL3NlY3JldFwiO1xuXG5jbGFzcyBTb25hbXVDbGFzcyB7XG4gIHB1YmxpYyBpc0luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBhc3luY0xvY2FsU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8e1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gIH0+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbiAgcHVibGljIGdldENvbnRleHQoKTogQ29udGV4dCB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKHN0b3JlPy5jb250ZXh0KSB7XG4gICAgICByZXR1cm4gc3RvcmUuY29udGV4dCBhcyBDb250ZXh0O1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXF1ZXN0OiBudWxsLFxuICAgICAgICByZXBseTogbnVsbCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGNyZWF0ZVNTRTogKHNjaGVtYTogWm9kT2JqZWN0KSA9PiBjcmVhdGVNb2NrU1NFRmFjdG9yeShzY2hlbWEpLFxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICAgIG5haXRlU3RvcmU6IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCksXG4gICAgICB9IGFzIHVua25vd24gYXMgQ29udGV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGNhbm5vdCBmaW5kIGNvbnRleHRcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuX2FwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwaVJvb3RQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gICAgaWYgKHRoaXMuX2FwaVJvb3RQYXRoID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RiQ29uZmlnOiBTb25hbXVEQkNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBzZXQgZGJDb25maWcoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKSB7XG4gICAgdGhpcy5fZGJDb25maWcgPSBkYkNvbmZpZztcbiAgfVxuICBnZXQgZGJDb25maWcoKTogU29uYW11REJDb25maWcge1xuICAgIGlmICh0aGlzLl9kYkNvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RiQ29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY2VyOiBTeW5jZXIgfCBudWxsID0gbnVsbDtcbiAgc2V0IHN5bmNlcihzeW5jZXI6IFN5bmNlcikge1xuICAgIHRoaXMuX3N5bmNlciA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuX3N5bmNlciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N5bmNlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbmZpZzogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gIH1cbiAgZ2V0IGNvbmZpZygpOiBTb25hbXVDb25maWcge1xuICAgIGlmICh0aGlzLl9jb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IGdldFNlY3JldHMoKTtcblxuICBwcml2YXRlIF9zdG9yYWdlOiBTdG9yYWdlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogU3RvcmFnZU1hbmFnZXIg7J247Iqk7YS07IqkXG4gICAqL1xuICBnZXQgc3RvcmFnZSgpOiBTdG9yYWdlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLl9zdG9yYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdG9yYWdlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgc3RvcmFnZSBjb25maWcuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhY2hlOiBDYWNoZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIENhY2hlTWFuYWdlciDsnbjsiqTthLTsiqQgKEJlbnRvQ2FjaGUpXG4gICAqL1xuICBnZXQgY2FjaGUoKTogQ2FjaGVNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2NhY2hlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGNhY2hlIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBfd29ya2Zsb3dzOiBXb3JrZmxvd01hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgZ2V0IHdvcmtmbG93cygpOiBXb3JrZmxvd01hbmFnZXIge1xuICAgIGlmICh0aGlzLl93b3JrZmxvd3MgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtmbG93cztcbiAgfVxuXG4gIHByaXZhdGUgX2F1dGg6IEF1dGggfCBudWxsID0gbnVsbDtcbiAgZ2V0IGF1dGgoKTogQXV0aCB7XG4gICAgaWYgKCF0aGlzLl9hdXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgYXV0aCBjb25maWcgaW4gc29uYW11LmNvbmZpZy50cy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hdXRoO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrFxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0ZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGhtclN0YXJ0VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0Rm9yVGVzdGluZygpIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0KFxuICAgIGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgZW5hYmxlU3luYzogYm9vbGVhbiA9IHRydWUsXG4gICAgYXBpUm9vdFBhdGg/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/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMud2F0Y2hlcj8uY2xvc2UoKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIGxvZ3RhcGVEaXNwb3NlKCksXG4gICAgXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFNvbmFtdSA9IG5ldyBTb25hbXVDbGFzcygpO1xuXG4vKipcbiAqIHN0cmVhbSDrqqjrk5zsl5DshJwg7YKkIOyDneyEsSDtlajsiJjqsIAg7KeA7KCV65CY7KeAIOyViuyVmOydhCDrlYwg7IKs7Jqp7ZWY64qUIOq4sOuzuCDtlajsiJjsnoXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRLZXlHZW5lcmF0b3IoZmlsZTogeyBmaWxlbmFtZTogc3RyaW5nOyBtaW1ldHlwZTogc3RyaW5nIH0pOiBzdHJpbmcge1xuICBjb25zdCBleHQgPSBtaW1lLmV4dGVuc2lvbihmaWxlLm1pbWV0eXBlKSB8fCBcImJpblwiO1xuICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KTtcbiAgcmV0dXJuIGB1cGxvYWRzLyR7dGltZXN0YW1wfS0ke3JhbmRvbX0uJHtleHR9YDtcbn1cbiJdLCJuYW1lcyI6WyJkaXNwb3NlIiwibG9ndGFwZURpc3Bvc2UiLCJhc3NlcnQiLCJBc3luY0xvY2FsU3RvcmFnZSIsImZzIiwibWltZSIsImxvb2t1cCIsIm1pbWVMb29rdXAiLCJvcyIsInBhdGgiLCJCQVNFX0ZJRUxEX01BUFBJTkdTIiwiY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZCIsImNyZWF0ZU1vY2tTU0VGYWN0b3J5IiwiREIiLCJpc0RhZW1vblNlcnZlciIsIm1lcmdlIiwiTm90Rm91bmRFeGNlcHRpb24iLCJhcHBseUNhY2hlSGVhZGVycyIsIkNhY2hlUHJlc2V0cyIsInRvRmFzdGlmeUNvbXByZXNzT3B0aW9uIiwiU0QiLCJOYWl0ZSIsIkJ1ZmZlcmVkRmlsZSIsIlVwbG9hZGVkRmlsZSIsImV4aXN0cyIsImZpbGVFeGlzdHMiLCJnZXRTZWNyZXRzIiwiU29uYW11Q2xhc3MiLCJpc0luaXRpYWxpemVkIiwiZm9yVGVzdGluZyIsImFzeW5jTG9jYWxTdG9yYWdlIiwiZ2V0Q29udGV4dCIsInN0b3JlIiwiZ2V0U3RvcmUiLCJjb250ZXh0IiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwicmVxdWVzdCIsInJlcGx5IiwiaGVhZGVycyIsImNyZWF0ZVNTRSIsInNjaGVtYSIsIm5haXRlU3RvcmUiLCJNYXAiLCJFcnJvciIsIl9hcGlSb290UGF0aCIsImFwaVJvb3RQYXRoIiwiYXBwUm9vdFBhdGgiLCJzcGxpdCIsInNlcCIsInNsaWNlIiwiam9pbiIsIl9kYkNvbmZpZyIsImRiQ29uZmlnIiwiX3N5bmNlciIsInN5bmNlciIsIl9jb25maWciLCJjb25maWciLCJzZWNyZXRzIiwiX3N0b3JhZ2UiLCJzdG9yYWdlIiwiX2NhY2hlIiwiY2FjaGUiLCJfd29ya2Zsb3dzIiwid29ya2Zsb3dzIiwiX2F1dGgiLCJhdXRoIiwid2F0Y2hlciIsInBlbmRpbmdGaWxlcyIsImhtclN0YXJ0VGltZSIsInNlcnZlciIsImluaXRGb3JUZXN0aW5nIiwiaW5pdCIsInVuZGVmaW5lZCIsImRvU2lsZW50IiwiZW5hYmxlU3luYyIsImNoYWxrIiwiZGVmYXVsdCIsImNvbnNvbGUiLCJ0aW1lIiwiY3lhbiIsImZpbmRBcGlSb290UGF0aCIsImxvYWRDb25maWciLCJkYXRhYmFzZSIsImRlZmF1bHRPcHRpb25zIiwiY2xpZW50IiwiY29uZmlndXJlTG9nVGFwZSIsImxvZ2dpbmciLCJnZW5lcmF0ZURCQ29uZmlnIiwibG9nIiwiZ3JlZW4iLCJFbnRpdHlNYW5hZ2VyIiwiYXV0b2xvYWQiLCJpbml0aWFsaXplQ2FjaGUiLCJpbml0aWFsaXplV29ya2Zsb3dzIiwidGFza3MiLCJTeW5jZXIiLCJhdXRvbG9hZFR5cGVzIiwiYXV0b2xvYWRNb2RlbHMiLCJhdXRvbG9hZEFwaXMiLCJhdXRvbG9hZFdvcmtmbG93cyIsIlRlbXBsYXRlTWFuYWdlciIsImF1dG9sb2FkU1NSUm91dGVzIiwiaXNMb2NhbCIsImlzVGVzdCIsInNldHVwQmlvbWUiLCJpc0hvdFJlbG9hZFNlcnZlciIsInN5bmMiLCJzdGFydFdhdGNoZXIiLCJ0aW1lRW5kIiwiY3JlYXRlU2VydmVyIiwiaW5pdE9wdGlvbnMiLCJvcHRpb25zIiwiZmFzdGlmeSIsImdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIiwibG9nZ2VyIiwiY2F0ZWdvcnkiLCJmYXN0aWZ5Q2F0ZWdvcnkiLCJTdG9yYWdlTWFuYWdlciIsInBsdWdpbnMiLCJyZWdpc3RlclBsdWdpbnMiLCJyZWdpc3RlckJldHRlckF1dGgiLCJ3aXRoRmFzdGlmeSIsImFwaUNvbmZpZyIsImJvb3QiLCJ0aW1lem9uZSIsImFwaSIsImZvcm1hdEluVGltZVpvbmUiLCJJU09fREFURV9SRUdFWCIsIkRBVEVfRk9STUFUIiwic2V0UmVwbHlTZXJpYWxpemVyIiwicGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJfa2V5IiwidmFsdWUiLCJ0ZXN0IiwiRGF0ZSIsImdldCIsInJvdXRlIiwicHJlZml4IiwiX3JlcXVlc3QiLCJfcmVwbHkiLCJhcGlzIiwic29uYW11VUlBcGlQbHVnaW4iLCJyZWdpc3RlciIsImRldlJ1bm5lciIsImVuYWJsZWQiLCJyZWdpc3RlckRldlRlc3RSb3V0ZXMiLCJ3ZWJQYXRoIiwiaGFzV2ViIiwicGx1Z2luQ29tcHJlc3MiLCJjb21wcmVzcyIsImdsb2JhbENvbXByZXNzT3B0aW9ucyIsInRocmVzaG9sZCIsImVuY29kaW5ncyIsImN1c3RvbVR5cGVzIiwiZGlzYWJsZUludGVncmF0ZWRXZWIiLCJTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiIsInNldHVwRGV2U2VydmVyV2l0aFZpdGUiLCJzZXR1cERldlNlcnZlciIsIm1vZGVscyIsIm1vZGVsTmFtZSIsIm1ldGhvZCIsImh0dHBNZXRob2QiLCJ1cmwiLCJoYW5kbGVyIiwiY3JlYXRlQXBpSGFuZGxlciIsInNldHVwU3RhdGljV2ViU2VydmVyIiwiaGFuZGxlRGV2QXBpUmVxdWVzdCIsImdldFBhdGhuYW1lRnJvbVVybCIsInN0YXJ0c1dpdGgiLCJtYXRjaGVkQXBpIiwiZmluZCIsImFwaU1ldGhvZCIsImZ1bGxQYXRoIiwiaXNQYXRoUGF0dGVybk1hdGNoIiwidml0ZVNlcnZlciIsInZpdGUiLCJyb290IiwibWlkZGxld2FyZU1vZGUiLCJobXIiLCJhcHBUeXBlIiwidXNlIiwicmVxIiwicmVzIiwibmV4dCIsIm1pZGRsZXdhcmVzIiwicmVzdWx0IiwibWF0Y2hTU1JSb3V0ZSIsInJlbmRlclNTUiIsInNzck1hdGNoIiwiaHRtbCIsInBhcmFtcyIsInR5cGUiLCJ0ZW1wbGF0ZSIsInJlYWRGaWxlIiwidHJhbnNmb3JtSW5kZXhIdG1sIiwiZSIsInNzckZpeFN0YWNrdHJhY2UiLCJlcnJvciIsInN0YXR1cyIsIm1lc3NhZ2UiLCJhZGRIb29rIiwiY2xvc2UiLCJ3ZWJEaXN0UGF0aCIsInNzclBhdGgiLCJzc3JFbnRyeVBhdGgiLCJzc3JSb3V0ZXNQYXRoIiwid2FybiIsInNzckF2YWlsYWJsZSIsInJlcXVlc3RlZEZpbGUiLCJmaWxlbmFtZSIsImFzc2V0c0RpciIsInNhZmVGaWxlUGF0aCIsInJlc29sdmVQYXRoV2l0aGluQmFzZURpciIsInNlbmQiLCJub3JtYWxpemVkUmVxdWVzdGVkRmlsZSIsInJlbGF0aXZlIiwicmVwbGFjZSIsImFzc2V0UGF0aCIsImdldENhY2hlQ29udHJvbEZvckFzc2V0IiwiY2FjaGVSZXEiLCJjYWNoZUNvbnRyb2xIYW5kbGVyIiwiaW1tdXRhYmxlIiwiZXh0IiwicG9wIiwiZmlsZXMiLCJyZWFkZGlyIiwiY3VycmVudEZpbGUiLCJmIiwiZW5kc1dpdGgiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJpbmNsdWRlcyIsImdldFNTUlJvdXRlcyIsInNzclJvdXRlcyIsImV4dHJhY3RQYXRoUGFyYW1zIiwiY3NyQ2FjaGVSZXEiLCJjc3JDYWNoZUNvbmZpZyIsInJlcXVlc3RQYXRoIiwiaW5kZXhQYXRoIiwiY3JlYXRlQ29udGV4dCIsInJ1biIsImd1YXJkcyIsImV2ZXJ5IiwiZ3VhcmQiLCJndWFyZEhhbmRsZXIiLCJnZXRab2RPYmplY3RGcm9tQXBpIiwiUmVxVHlwZSIsInR5cGVzIiwid2hpY2giLCJyZXFCb2R5IiwiYnVmZmVyZWRGaWxlcyIsInVwbG9hZGVkRmlsZXMiLCJib2R5IiwidXBsb2FkT3B0aW9ucyIsInBhcnRzIiwibGltaXRzIiwiZmllbGRzIiwiY29uc3VtZSIsInBhcnQiLCJidWZmZXIiLCJ0b0J1ZmZlciIsInB1c2giLCJmaWVsZG5hbWUiLCJTdHJpbmciLCJkaXNrTmFtZSIsImRlc3RpbmF0aW9uIiwiZGlzayIsImtleUdlbmVyYXRvciIsImRlZmF1bHRLZXlHZW5lcmF0b3IiLCJrZXkiLCJtaW1ldHlwZSIsInB1dFN0cmVhbSIsImZpbGUiLCJjb250ZW50VHlwZSIsImdldFVybCIsInNpZ25lZFVybCIsImdldFNpZ25lZFVybCIsInNpemUiLCJieXRlc1JlYWQiLCJxcyIsInBhcnNlZCIsInBhcnNlIiwiT2JqZWN0IiwiYXNzaWduIiwiZmFzdGlmeUNhc3RlciIsIlpvZEVycm9yIiwiaHVtYW5pemVab2RFcnJvciIsIm1lc3NhZ2VzIiwibWFwIiwiaXNzdWUiLCJCYWRSZXF1ZXN0RXhjZXB0aW9uIiwiem9kRXJyb3IiLCJhcGlDYWNoZUNvbmZpZyIsImdldEFwaUNhY2hlQ29udHJvbCIsIkFwaVBhcmFtVHlwZSIsImFyZ3MiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJpc0NvbnRleHQiLCJuYW1lIiwiaW52b2tlTW9kZWxNZXRob2QiLCJwYXR0ZXJuIiwicGF0dGVyblBhcnRzIiwiZmlsdGVyIiwiQm9vbGVhbiIsInVybFBhcnRzIiwiaSIsImxlbmd0aCIsInBhdHRlcm5QYXJ0IiwidXJsUGFydCIsImJhc2VEaXIiLCJpbnB1dFBhdGgiLCJkZWNvZGVkIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwicmVsYXRpdmVQYXRoIiwicmVzb2x2ZWRQYXRoIiwicmVzb2x2ZSIsInJlbGF0aXZlRnJvbUJhc2UiLCJpc0Fic29sdXRlIiwiY2FjaGVDb250cm9sIiwicm91dGVPcHRpb25zIiwiaW52b2tlQXBpRm9yU1NSIiwicGFyYW1zSW5kZXgiLCJtb2RlbCIsIm1ldGhvZE5hbWUiLCJhcHBseSIsImNyZWF0ZVNTRUZhY3RvcnkiLCJfZXZlbnRzIiwic29ja2V0IiwiYmluZCIsImxvY2FsZSIsImRldGVjdExvY2FsZSIsImkxOG4iLCJzdXBwb3J0ZWRMb2NhbGVzIiwiZGVmYXVsdExvY2FsZSIsInNlc3Npb24iLCJnZXRTZXNzaW9uIiwiUHJvbWlzZSIsImNvbnRleHRQcm92aWRlciIsImNyZWF0ZVN0b3JlIiwidXNlciIsImFjY2VwdExhbmd1YWdlIiwic3VwcG9ydGVkIiwibGFuZ3MiLCJsYW5nIiwiY29kZSIsInRyaW0iLCJ3YXRjaFBhdGgiLCJjaG9raWRhciIsIndhdGNoIiwiaWdub3JlZCIsInN0YXRzIiwiaXNGaWxlIiwicGVyc2lzdGVudCIsImlnbm9yZUluaXRpYWwiLCJvbiIsImV2ZW50IiwiYWJzb2x1dGVQYXRoIiwiaXNDb25maWdUcyIsImJvbGQiLCJibHVlIiwia2lsbCIsInBpZCIsImhhbmRsZUZpbGVDaGFuZ2UiLCJydW5TY3JpcHQiLCJmbiIsImRlc3Ryb3kiLCJjb21wcmVzc1BsdWdpbiIsInBsdWdpbnNNb2R1bGVzIiwiY29ycyIsImZvcm1ib2R5IiwibXVsdGlwYXJ0Iiwic3NlIiwic3RhdGljIiwicmVnaXN0ZXJQbHVnaW4iLCJwbHVnaW5OYW1lIiwib3B0aW9uIiwiZW50cmllcyIsImN1c3RvbSIsImJhc2VQYXRoIiwibWVyZ2VkRmllbGRNYXBwaW5ncyIsImJldHRlckF1dGgiLCJQb29sIiwiZ2V0REJDb25maWciLCJjb25uZWN0aW9uIiwiVVJMIiwiaG9zdCIsIlJlcXVlc3QiLCJ0b1N0cmluZyIsInJlc3BvbnNlIiwiZm9yRWFjaCIsImhlYWRlciIsInRleHQiLCJzZXRDYWNoZU1hbmFnZXJSZWYiLCJjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyIiwiY3JlYXRlQ2FjaGVNYW5hZ2VyIiwiV29ya2Zsb3dNYW5hZ2VyIiwiZW5hYmxlV29ya2VyIiwiZGVmYXVsdFdvcmtlck9wdGlvbnMiLCJjb25jdXJyZW5jeSIsImNwdXMiLCJ1c2VQdWJTdWIiLCJsaXN0ZW5EZWxheSIsInNldHVwV29ya2VyIiwid29ya2VyT3B0aW9ucyIsInBvcnQiLCJsaXN0ZW4iLCJsaWZlY3ljbGUiLCJvblNodXRkb3duIiwic2h1dGRvd24iLCJleGl0IiwiZXJyIiwib25FcnJvciIsInNldEVycm9ySGFuZGxlciIsInRoZW4iLCJzdGFydFdvcmtlciIsIm9uU3RhcnQiLCJjYXRjaCIsInJlZCIsIm5vdyIsInN5bmNGcm9tV2F0Y2hlciIsImZpbmlzaEhNUiIsInJlbmV3Q2hlY2tzdW1zIiwiZW5kVGltZSIsInRvdGFsVGltZSIsImNlbnRlclRleHQiLCJhbGwiLCJtc2ciLCJ3aGl0ZSIsImJsYWNrIiwiYmdHcmVlbiIsIkJhc2VNb2RlbCIsImFsbFNldHRsZWQiLCJkaXNjb25uZWN0IiwiU29uYW11IiwiZXh0ZW5zaW9uIiwidGltZXN0YW1wIiwicmFuZG9tIiwiTWF0aCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsV0FBV0MsY0FBYyxRQUFRLG1CQUFtQjtBQUM3RCxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsaUJBQWlCLFFBQVEsY0FBYztBQUloRCxPQUFPQyxRQUFRLG1CQUFjO0FBRTdCLE9BQU9DLFFBQVFDLFVBQVVDLFVBQVUsUUFBUSxhQUFhO0FBQ3hELE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFHeEIsU0FDRUMsbUJBQW1CLEVBQ25CQywrQkFBK0IsRUFDL0JDLG9CQUFvQixFQUNwQkMsRUFBRSxFQUNGQyxjQUFjLEVBQ2RDLEtBQUssRUFDTEMsaUJBQWlCLFFBQ1osY0FBSztBQUVaLFNBQVNDLGlCQUFpQixFQUFFQyxZQUFZLFFBQVEsb0NBQWlDO0FBRWpGLFNBQVNDLHVCQUF1QixRQUFRLDBCQUF1QjtBQUcvRCxTQUFTQyxFQUFFLFFBQVEsZ0JBQWE7QUFFaEMsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQUN2QyxTQUFTQyxZQUFZLFFBQVEsOEJBQTJCO0FBR3hELFNBQVNDLFlBQVksUUFBUSw4QkFBMkI7QUFJeEQsU0FBU0MsTUFBTSxFQUFFQyxVQUFVLFFBQVEsdUJBQW9CO0FBS3ZELFNBQVNDLFVBQVUsUUFBNEIsY0FBVztBQUUxRCxNQUFNQztJQUNHQyxnQkFBeUIsTUFBTTtJQUMvQkMsYUFBc0IsTUFBTTtJQUM1QkMsb0JBRUYsSUFBSTNCLG9CQUFvQjtJQUV0QjRC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
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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
@@ -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;AAwLtC,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;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,IAAI,CAAC,CA0Cf"}