@omujs/omu 0.9.32 → 0.9.33

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 (58) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/dts/api/asset/extension.d.ts +3 -3
  3. package/dist/dts/api/asset/index.d.ts +1 -1
  4. package/dist/dts/api/dashboard/extension.d.ts +13 -3
  5. package/dist/dts/api/dashboard/handler.d.ts +2 -1
  6. package/dist/dts/api/dashboard/index.d.ts +1 -1
  7. package/dist/dts/api/http/extension.d.ts +2 -135
  8. package/dist/dts/api/http/http.d.ts +36 -0
  9. package/dist/dts/api/http/websocket.d.ts +123 -0
  10. package/dist/dts/api/permission/extension.d.ts +1 -0
  11. package/dist/dts/index.d.ts +1 -3
  12. package/dist/dts/version.d.ts +1 -1
  13. package/dist/esm/api/asset/extension.js +43 -18
  14. package/dist/esm/api/asset/index.js +42 -17
  15. package/dist/esm/api/dashboard/extension.js +17 -13
  16. package/dist/esm/api/dashboard/index.js +17 -13
  17. package/dist/esm/api/endpoint/extension.js +3 -3
  18. package/dist/esm/api/extension.js +3 -3
  19. package/dist/esm/api/http/extension.js +262 -277
  20. package/dist/esm/api/http/http.js +442 -0
  21. package/dist/esm/api/http/index.js +262 -165
  22. package/dist/esm/api/http/websocket.js +220 -0
  23. package/dist/esm/api/i18n/extension.js +3 -3
  24. package/dist/esm/api/i18n/index.js +3 -3
  25. package/dist/esm/api/index.js +3 -3
  26. package/dist/esm/api/logger/extension.js +3 -3
  27. package/dist/esm/api/logger/index.js +3 -3
  28. package/dist/esm/api/permission/extension.js +6 -3
  29. package/dist/esm/api/plugin/extension.js +3 -3
  30. package/dist/esm/api/plugin/index.js +3 -3
  31. package/dist/esm/api/registry/extension.js +3 -3
  32. package/dist/esm/api/registry/index.js +3 -3
  33. package/dist/esm/api/server/extension.js +3 -3
  34. package/dist/esm/api/server/index.js +3 -3
  35. package/dist/esm/api/session/extension.js +3 -3
  36. package/dist/esm/api/session/index.js +3 -3
  37. package/dist/esm/api/signal/extension.js +3 -3
  38. package/dist/esm/api/table/extension.js +3 -3
  39. package/dist/esm/api/table/index.js +3 -3
  40. package/dist/esm/index.js +319 -189
  41. package/dist/esm/network/index.js +3 -3
  42. package/dist/esm/network/network.js +3 -3
  43. package/dist/esm/omu.js +318 -186
  44. package/dist/esm/version.js +3 -3
  45. package/package.json +1 -1
  46. package/src/api/asset/extension.ts +46 -12
  47. package/src/api/asset/index.ts +1 -2
  48. package/src/api/dashboard/extension.ts +29 -13
  49. package/src/api/dashboard/handler.ts +2 -1
  50. package/src/api/dashboard/index.ts +2 -0
  51. package/src/api/extension.ts +1 -1
  52. package/src/api/http/extension.ts +13 -364
  53. package/src/api/http/http.ts +79 -0
  54. package/src/api/http/websocket.ts +283 -0
  55. package/src/api/permission/extension.ts +4 -0
  56. package/src/index.ts +3 -5
  57. package/src/version.ts +1 -1
  58. package/tsconfig.tsbuildinfo +1 -1
@@ -749,7 +749,7 @@ class ExtensionType extends Identifier {
749
749
  this.create = create;
750
750
  }
751
751
  key() {
752
- return this.name;
752
+ return new Identifier("ext", this.name).key();
753
753
  }
754
754
  }
755
755
 
@@ -2051,5 +2051,5 @@ export {
2051
2051
  AppIndexRegistry
2052
2052
  };
2053
2053
 
2054
- //# debugId=70064EA4247DC4C664756E2164756E21
2055
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2lkZW50aWZpZXIudHMiLCAiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvY29uc3QudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9ieXRlYnVmZmVyLnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvc2VyaWFsaXplci50cyIsICIuLi8uLi9zcmMvYXBpL2VuZHBvaW50L2VuZHBvaW50LnRzIiwgIi4uLy4uL3NyYy9hcGkvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9ldmVudC9pbmRleC50cyIsICIuLi8uLi9zcmMvbG9jay50cyIsICIuLi8uLi9zcmMvbmV0d29yay9wYWNrZXQvcGFja2V0LnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvcmVnaXN0cnkvcmVnaXN0cnkudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS90YWJsZS9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvdGFibGUvdGFibGUudHMiLCAiLi4vLi4vc3JjL2FwaS90YWJsZS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIvZXh0ZW5zaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4vYXBwJztcblxuY29uc3QgTkFNRVNQQUNFX1JFR0VYID0gL14oXFwuW14vOi5dfFtcXHctXSkrJC87XG5jb25zdCBOQU1FX1JFR0VYID0gL15bXi86XSskLztcblxuZXhwb3J0IHR5cGUgSW50b0lkID0gSWRlbnRpZmllciB8IHN0cmluZyB8IEV4dGVuc2lvblR5cGUgfCBBcHA7XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZ1tdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICAuLi5wYXRoOiBzdHJpbmdbXVxuICAgICkge1xuICAgICAgICBJZGVudGlmaWVyLnZhbGlkYXRlKG5hbWVzcGFjZSwgcGF0aCk7XG4gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tSnNvbihqc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb20oaWQ6IEludG9JZCk6IElkZW50aWZpZXIge1xuICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgaW5zdGFuY2VvZiBBcHApIHtcbiAgICAgICAgICAgIHJldHVybiBpZC5pZDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBpbmZlclxuICAgICAgICAgICAgLy8gVml0ZSBkb2VzIG5vdCBwcmVzZXJ2ZSBjbGFzcyBpbmZvcm1hdGlvbiB3aGVuIGltcG9ydGluZyBmcm9tIGRpZmZlcmVudCBwYWNrYWdlc1xuICAgICAgICAgICAgY29uc3QgaWRDYXN0ZWQgPSBpZCBhcyB7IG5hbWVzcGFjZTogc3RyaW5nOyBwYXRoOiBzdHJpbmdbXSB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBpZENhc3RlZC5uYW1lc3BhY2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpZENhc3RlZC5wYXRoKSAmJlxuICAgICAgICAgICAgICAgIGlkQ2FzdGVkLnBhdGguZXZlcnkoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihpZENhc3RlZC5uYW1lc3BhY2UsIC4uLmlkQ2FzdGVkLnBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWRXaXRoSWQgPSBpZCBhcyB7IGlkOiBJbnRvSWQgfCB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRXaXRoSWQuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZFdpdGhJZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IHRvIElkZW50aWZpZXI6ICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21PcHRpb25hbChpZDogSW50b0lkIHwgdW5kZWZpbmVkIHwgbnVsbCk6IElkZW50aWZpZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGUobmFtZXNwYWNlOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF0aDogUGF0aCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5hbWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU5BTUVTUEFDRV9SRUdFWC50ZXN0KG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuYW1lc3BhY2U6IE5hbWVzcGFjZSBtdXN0IG1hdGNoICR7TkFNRVNQQUNFX1JFR0VYfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBwYXRoKSB7XG4gICAgICAgICAgICBpZiAoIU5BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXRoOiBOYW1lIG11c3QgbWF0Y2ggJHtOQU1FX1JFR0VYfSBidXQgZ290ICR7bmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmb3JtYXQobmFtZXNwYWNlOiBzdHJpbmcsIC4uLnBhdGg6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICByZXR1cm4gYCR7bmFtZXNwYWNlfToke3BhdGguam9pbignLycpfWA7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21LZXkoa2V5OiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0ga2V5LmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHNlcGFyYXRvciA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE5vIHNlcGFyYXRvciBmb3VuZCBpbiAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJzonLCBzZXBhcmF0b3IgKyAxKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE11bHRpcGxlIHNlcGFyYXRvcnMgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0ga2V5LnNsaWNlKDAsIHNlcGFyYXRvcik7XG4gICAgICAgIGNvbnN0IHBhdGggPSBrZXkuc2xpY2Uoc2VwYXJhdG9yICsgMSk7XG4gICAgICAgIGlmICghbmFtZXNwYWNlIHx8ICFwYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5OiBOYW1lc3BhY2UgYW5kIHBhdGggY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKG5hbWVzcGFjZSwgLi4ucGF0aC5zcGxpdCgnLycpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBJZGVudGlmaWVyLm5hbWVzcGFjZUZyb21VcmwocGFyc2VkVXJsLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXRoID0gcGFyc2VkVXJsLnBhdGhuYW1lLnNsaWNlKDEpLnNwbGl0KCcvJyk7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbmFtZXNwYWNlRnJvbVVybCh1cmw6IHN0cmluZyB8IFVSTCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlZC5ob3N0bmFtZS5zcGxpdCgnLicpLnJldmVyc2UoKS5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXkoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpzb24oanNvbjogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb21LZXkoanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mb3JtYXQodGhpcy5uYW1lc3BhY2UsIC4uLnRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWwob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCkgPT09IG90aGVyLmtleSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc05hbWVzcGFjZUVxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZSA9PT0gb3RoZXIubmFtZXNwYWNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1N1YnBhdGhPZihvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5uYW1lc3BhY2UgIT09IG90aGVyLm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhdGgubGVuZ3RoIDwgb3RoZXIucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG90aGVyLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhdGhbaV0gIT09IG90aGVyLnBhdGhbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW4oLi4ucGF0aDogc3RyaW5nW10pOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgsIC4uLnBhdGgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJNYXA8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFwOiBNYXA8c3RyaW5nLCBUPiA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50cmllcz86IEl0ZXJhYmxlPFtJZGVudGlmaWVyLCBUXT4sXG4gICAgKSB7XG4gICAgICAgIGlmICghZW50cmllcykgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChpZC5rZXkoKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoaWRlbnRpZmllcjogSWRlbnRpZmllciwgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0KGlkZW50aWZpZXIua2V5KCksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMubWFwLmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMubWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW0lkZW50aWZpZXIuZnJvbUtleShrZXkpLCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgVF0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJTZXQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuYWRkKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuaGFzKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5kZWxldGUoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqa2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPElkZW50aWZpZXI+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICB5aWVsZCBJZGVudGlmaWVyLmZyb21LZXkoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgICAgICB5aWVsZCBbaWRlbnRpZmllciwgaWRlbnRpZmllcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgTG9jYWxlIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxlLmpzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxpemVkVGV4dCB9IGZyb20gJy4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5cbmV4cG9ydCB0eXBlIEFwcE1ldGFkYXRhID0ge1xuICAgIGxvY2FsZTogTG9jYWxlO1xuICAgIG5hbWU/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGljb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGRlc2NyaXB0aW9uPzogTG9jYWxpemVkVGV4dDtcbiAgICBpbWFnZT86IExvY2FsaXplZFRleHQ7XG4gICAgc2l0ZT86IExvY2FsaXplZFRleHQ7XG4gICAgcmVwb3NpdG9yeT86IExvY2FsaXplZFRleHQ7XG4gICAgYXV0aG9ycz86IExvY2FsaXplZFRleHQ7XG4gICAgbGljZW5zZT86IExvY2FsaXplZFRleHQ7XG4gICAgdGFncz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwVHlwZSA9ICdhcHAnIHwgJ3NlcnZpY2UnIHwgJ3JlbW90ZScgfCAncGx1Z2luJyB8ICdkYXNoYm9hcmQnO1xuXG5leHBvcnQgdHlwZSBEZXBlbmRlbmN5U3BlY2lmaWVyID0ge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBpbmRleD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFwcEpzb24gPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBBcHBUeXBlO1xuICAgIHBhcmVudF9pZD86IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xufTtcblxuZXhwb3J0IGNsYXNzIEFwcCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyO1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBBcHBUeXBlO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXJlbnRJZD86IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHVybD86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBEZXBlbmRlbmN5U3BlY2lmaWVyIHwgc3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBJbnRvSWQsIG9wdGlvbnM6IHtcbiAgICAgICAgdHlwZT86IEFwcFR5cGU7XG4gICAgICAgIHBhcmVudElkPzogSW50b0lkO1xuICAgICAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgICAgICB1cmw/OiBzdHJpbmc7XG4gICAgICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgICAgIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5pZCA9IElkZW50aWZpZXIuZnJvbShpZCk7XG4gICAgICAgIHRoaXMucGFyZW50SWQgPSBJZGVudGlmaWVyLmZyb21PcHRpb25hbChvcHRpb25zLnBhcmVudElkKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uO1xuICAgICAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlID8/ICdhcHAnO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG9wdGlvbnMuZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaW5mbzogQXBwSnNvbik6IEFwcCB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGluZm8uaWQpO1xuICAgICAgICByZXR1cm4gbmV3IEFwcChpZCwge1xuICAgICAgICAgICAgcGFyZW50SWQ6IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKGluZm8ucGFyZW50X2lkKSxcbiAgICAgICAgICAgIHZlcnNpb246IGluZm8udmVyc2lvbixcbiAgICAgICAgICAgIHVybDogaW5mby51cmwsXG4gICAgICAgICAgICB0eXBlOiBpbmZvLnR5cGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogaW5mby5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogaW5mby5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IEFwcCk6IEFwcEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGRhdGEuaWQua2V5KCksXG4gICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICBwYXJlbnRfaWQ6IGRhdGEucGFyZW50SWQ/LmtleSgpLFxuICAgICAgICAgICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBkYXRhLnVybCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBkYXRhLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBkYXRhLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbiguLi5wYXRoczogc3RyaW5nW10pOiBBcHAge1xuICAgICAgICByZXR1cm4gbmV3IEFwcCh0aGlzLmlkLmpvaW4oLi4ucGF0aHMpLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogdGhpcy5kZXBlbmRlbmNpZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IHRleHRFbmNvZGVyOiBUZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuZXhwb3J0IGNvbnN0IHRleHREZWNvZGVyOiBUZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5pbXBvcnQgeyBKc29uVHlwZSB9IGZyb20gJy4vc2VyaWFsaXplci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBGbGFncyB7XG4gICAgcHJpdmF0ZSB2YWx1ZTogbnVtYmVyO1xuICAgIHByaXZhdGUgbGVuZ3RoOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IHZhbHVlPzogbnVtYmVyOyBsZW5ndGg/OiBudW1iZXIgfSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy52YWx1ZSA/PyAwO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdGlvbnMubGVuZ3RoID8/IDMyO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMocG9zaXRpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgJiAoMSA8PCBwb3NpdGlvbikpICE9PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQocG9zaXRpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgJiAoMSA8PCBwb3NpdGlvbikpICE9PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBpZlNldDxUPihwb3NpdGlvbjogbnVtYmVyLCBjYWxsYmFjazogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy5oYXMocG9zaXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocG9zaXRpb246IG51bWJlciwgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlIHw9IDEgPDwgcG9zaXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlICY9IH4oMSA8PCBwb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUod3JpdGVyOiBCeXRlV3JpdGVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJpdHMgPSBuZXcgVWludDhBcnJheSgodGhpcy5sZW5ndGggKyA3KSAvIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJpdHNbaV0gPSAodGhpcy52YWx1ZSA+PiAoaSAqIDgpKSAmIDB4ZmY7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLndyaXRlKGJpdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZChyZWFkZXI6IEJ5dGVSZWFkZXIsIGxlbmd0aDogbnVtYmVyKTogRmxhZ3Mge1xuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IChsZW5ndGggKyA3KSAvIDg7IGkrKykge1xuICAgICAgICAgICAgdmFsdWUgfD0gcmVhZGVyLnJlYWRVaW50OCgpIDw8IChpICogOCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGbGFncyh7IHZhbHVlLCBsZW5ndGggfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkRmxvYXQxNihkYXRhVmlldzogRGF0YVZpZXcsIG9mZnNldDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzaWduID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHg4MDAwKSA/IC0xIDogMTtcbiAgICBjb25zdCBleHBvbmVudCA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4N2MwMCkgPj4gMTA7XG4gICAgY29uc3QgbWFudGlzc2EgPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDAzZmYpO1xuICAgIGlmIChleHBvbmVudCA9PT0gMCAmJiBtYW50aXNzYSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGV4cG9uZW50ID09PSAweDFmKSB7XG4gICAgICAgIHJldHVybiBtYW50aXNzYSA9PT0gMCA/IEluZmluaXR5ICogc2lnbiA6IE5hTjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkRXhwb25lbnQgPSBleHBvbmVudCAtIDE1O1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTWFudGlzc2EgPSBtYW50aXNzYSAvIDEwMjQ7XG4gICAgICAgIHJldHVybiBzaWduICogTWF0aC5wb3coMiwgbm9ybWFsaXplZEV4cG9uZW50KSAqICgxICsgbm9ybWFsaXplZE1hbnRpc3NhKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQxNihkYXRhVmlldzogRGF0YVZpZXcsIG9mZnNldDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNpZ24gPSB2YWx1ZSA8IDAgPyAxIDogMDtcbiAgICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcbiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAweDdjMDAgfCAoc2lnbiA8PCAxNSkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4cG9uZW50ID0gTWF0aC5mbG9vcihNYXRoLmxvZzIodmFsdWUpKTtcbiAgICBjb25zdCBtYW50aXNzYSA9IHZhbHVlIC8gTWF0aC5wb3coMiwgZXhwb25lbnQpIC0gMTtcbiAgICBjb25zdCBub3JtYWxpemVkRXhwb25lbnQgPSBleHBvbmVudCArIDE1O1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRNYW50aXNzYSA9IE1hdGgucm91bmQobWFudGlzc2EgKiAxMDI0KTtcbiAgICBpZiAobm9ybWFsaXplZEV4cG9uZW50IDw9IDApIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgc2lnbiA8PCAxNSk7XG4gICAgfSBlbHNlIGlmIChub3JtYWxpemVkRXhwb25lbnQgPj0gMHgxZikge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAweDdjMDAgfCAoc2lnbiA8PCAxNSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIChzaWduIDw8IDE1KSB8IChub3JtYWxpemVkRXhwb25lbnQgPDwgMTApIHwgbm9ybWFsaXplZE1hbnRpc3NhKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCeXRlV3JpdGVyIHtcbiAgICBwcml2YXRlIGRhdGFWaWV3OiBEYXRhVmlldztcbiAgICBwcml2YXRlIGJ1ZmZlcjogQXJyYXlCdWZmZXI7XG4gICAgcHJpdmF0ZSBvZmZzZXQgPSAwO1xuICAgIHByaXZhdGUgZmluaXNoZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGluaXQ/OiBBcnJheUJ1ZmZlciwgb2Zmc2V0PzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0ID8/IDA7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gaW5pdCA/PyBuZXcgQXJyYXlCdWZmZXIoMTAyNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWZmZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkoYnVmZmVyOiBVaW50OEFycmF5KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdWludDhBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVdyaXRlcihhcnJheUJ1ZmZlciwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWxsb2NhdGUobGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICsgbGVuZ3RoID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbmV3Qnl0ZUxlbmd0aCA9IE1hdGgubWF4KHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGggKiAyLCB0aGlzLm9mZnNldCArIGxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBuZXdCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobmV3Qnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICBuZXcgVWludDhBcnJheShuZXdCdWZmZXIpLnNldChuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlcikpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXdCdWZmZXI7XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZShkYXRhOiBVaW50OEFycmF5KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGxvY2F0ZShkYXRhLmxlbmd0aCk7XG4gICAgICAgIG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKS5zZXQoZGF0YSwgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlQm9vbGVhbih2YWx1ZTogYm9vbGVhbik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDgodGhpcy5vZmZzZXQsIHZhbHVlID8gMSA6IDApO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQ4KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ4KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50OCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50MTYodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50MTYodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50MzIodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDMyKHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDMyKHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDY0KHZhbHVlOiBiaWdpbnQpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg4KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRCaWdJbnQ2NCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50NjQodmFsdWU6IGJpZ2ludCk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDgpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEJpZ1VpbnQ2NCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVTEVCMTI4KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgLy8gVW5zaWduZWQgTEVCMTI4XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodmFsdWUgPiAweDdmKSB7XG4gICAgICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50OCh0aGlzLm9mZnNldCwgKHZhbHVlICYgMHg3ZikgfCAweDgwKTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB2YWx1ZSA+Pj0gNztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSAmIDB4N2YpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgd3JpdGVGbG9hdDE2KHRoaXMuZGF0YVZpZXcsIHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0MzIodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEZsb2F0MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQ2NCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQ2NCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50OEFycmF5KHZhbHVlOiBVaW50OEFycmF5KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMud3JpdGVVTEVCMTI4KHZhbHVlLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLndyaXRlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVVpbnQ4QXJyYXkodGV4dEVuY29kZXIuZW5jb2RlKHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUpTT04odmFsdWU6IEpzb25UeXBlKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxhZ3MoZmxhZ3M6IEZsYWdzKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIGZsYWdzLndyaXRlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluaXNoKCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIsIDAsIHRoaXMub2Zmc2V0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCeXRlUmVhZGVyIHtcbiAgICBwcml2YXRlIGRhdGFWaWV3OiBEYXRhVmlldztcbiAgICBwcml2YXRlIG9mZnNldDogbnVtYmVyO1xuICAgIHByaXZhdGUgZmluaXNoZWQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGRhdGE6IERhdGFWaWV3KSB7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcgPSBkYXRhO1xuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VaW50OEFycmF5KGJ1ZmZlcjogVWludDhBcnJheSk6IEJ5dGVSZWFkZXIge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgIHVpbnQ4QXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQXJyYXlCdWZmZXIoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IEJ5dGVSZWFkZXIge1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVSZWFkZXIoZGF0YVZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZnJvbUJsb2IoYmxvYjogQmxvYik6IFByb21pc2U8Qnl0ZVJlYWRlcj4ge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGJsb2IuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVSZWFkZXIoZGF0YVZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkKHNpemU6IG51bWJlcik6IFVpbnQ4QXJyYXkge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaXplIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vZmZzZXQgKyBzaXplID4gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhVmlldy5idWZmZXIsIHRoaXMub2Zmc2V0LCBzaXplKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkQm9vbGVhbigpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQ4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDE2KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDE2KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDY0KCk6IGJpZ2ludCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRCaWdJbnQ2NCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQ2NCgpOiBiaWdpbnQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0QmlnVWludDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVUxFQjEyOCgpOiBudW1iZXIge1xuICAgICAgICAvLyBVbnNpZ25lZCBMRUIxMjhcbiAgICAgICAgbGV0IHZhbHVlID0gMDtcbiAgICAgICAgbGV0IHNoaWZ0ID0gMDtcbiAgICAgICAgbGV0IGJ5dGU6IG51bWJlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMuZGF0YVZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBieXRlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICAgICAgdmFsdWUgfD0gKGJ5dGUgJiAwYjAxMTExMTExKSA8PCBzaGlmdDtcbiAgICAgICAgICAgIHNoaWZ0ICs9IDc7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKChieXRlICYgMGIxMDAwMDAwMCkgIT09IDApO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDE2KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVhZEZsb2F0MTYodGhpcy5kYXRhVmlldywgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRGbG9hdDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxvYXQ2NCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0RmxvYXQ2NCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQ4QXJyYXkoKTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucmVhZFVMRUIxMjgoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZChsZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IHRoaXMucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIHRleHREZWNvZGVyLmRlY29kZShieXRlQXJyYXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSlNPTjxUIGV4dGVuZHMgSnNvblR5cGU+KCk6IFQge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLnJlYWRTdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbGFncyhsZW5ndGg6IG51bWJlcik6IEZsYWdzIHtcbiAgICAgICAgcmV0dXJuIEZsYWdzLnJlYWQodGhpcywgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5vZmZzZXQgIT09IHRoaXMuZGF0YVZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuXG5leHBvcnQgdHlwZSBKc29uVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkIHwgeyBba2V5IGluIG5ldmVyXT86IEpzb25UeXBlIH0gfCBKc29uVHlwZVtdO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZTxULCBEPiB7XG4gICAgc2VyaWFsaXplKGRhdGE6IFQpOiBEO1xuICAgIGRlc2VyaWFsaXplKGRhdGE6IEQpOiBUO1xufVxuXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplcjxULCBEPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZXJpYWxpemU6IChkYXRhOiBUKSA9PiBELFxuICAgICAgICBwdWJsaWMgZGVzZXJpYWxpemU6IChkYXRhOiBEKSA9PiBULFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG9mPFQsIEQ+KHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBEPik6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oc2VyaWFsaXplci5zZXJpYWxpemUsIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGlwZTxULCBSLCBEPihzZXIxOiBTZXJpYWxpemFibGU8VCwgUj4sIHNlcjI6IFNlcmlhbGl6YWJsZTxSLCBEPik6IFNlcmlhbGl6YWJsZTxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIyLnNlcmlhbGl6ZShzZXIxLnNlcmlhbGl6ZShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gc2VyMS5kZXNlcmlhbGl6ZShzZXIyLmRlc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYW5zZm9ybTxUPihmdW5jOiAodmFsdWU6IFQpID0+IFQpOiBTZXJpYWxpemVyPFQsIFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFQ+KFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBub29wPFQ+KCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZDxcbiAgICAgICAgSyBleHRlbmRzIGtleW9mIEQsXG4gICAgICAgIFIsXG4gICAgPihcbiAgICAgICAga2V5OiBLLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RFtLXSwgUj4sXG4gICAgKTogU2VyaWFsaXplcjxcbiAgICAgICAgVCxcbiAgICAgICAgeyBbUCBpbiBrZXlvZiBEXTogUCBleHRlbmRzIEsgPyBSIDogRFtQXSB9XG4gICAgPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxcbiAgICAgICAgICAgIFQsXG4gICAgICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICAgICAgPihcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNlcmlhbGl6ZWQsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLnNlcmlhbGl6ZShzZXJpYWxpemVkW2tleV0pLFxuICAgICAgICAgICAgICAgIH0gYXMgeyBbUCBpbiBrZXlvZiBEXTogUCBleHRlbmRzIEsgPyBSIDogRFtQXSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBba2V5XTogc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhW2tleV0gYXMgUiksXG4gICAgICAgICAgICAgICAgfSBhcyBEKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGpzb248VCBleHRlbmRzIEpzb25UeXBlPigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogU2VyaWFsaXplcjxULCBVaW50OEFycmF5PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBVaW50OEFycmF5PihcbiAgICAgICAgICAgIChkYXRhKSA9PiB0ZXh0RW5jb2Rlci5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJpYWxpemUoZGF0YSkpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShKU09OLnBhcnNlKHRleHQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvQXJyYXkoKTogU2VyaWFsaXplcjxUW10sIERbXT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VFtdLCBEW10+KFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEubWFwKChpdGVtKSA9PiB0aGlzLnNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuZGVzZXJpYWxpemUoaXRlbSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b01hcCgpOiBTZXJpYWxpemVyPE1hcDxzdHJpbmcsIFQ+LCBNYXA8c3RyaW5nLCBEPj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PihcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIEQ+KCk7XG4gICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCB0aGlzLnNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2soZmFsbGJhY2s6IFQpOiBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRoaXMuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZhbGxiYWNrTWFwKGZhbGxiYWNrOiAoZGF0YTogRCwgZXJyb3I6IHVua25vd24pID0+IFQpOiBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRoaXMuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2soZGF0YSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHBpcGU8RT4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPEQsIEU+KTogU2VyaWFsaXplcjxULCBFPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBFPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLnNlcmlhbGl6ZShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSnNvblR5cGUsIHR5cGUgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGNsYXNzIEVuZHBvaW50VHlwZTxSZXEgPSB1bmtub3duLCBSZXMgPSB1bmtub3duPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVxLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFJlcywgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uSWQ/OiBJZGVudGlmaWVyIHwgdW5kZWZpbmVkLFxuICAgICkgeyB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxSZXEsIFJlcywgUmVxRGF0YSBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGUsIFJlc0RhdGEgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFJlcSwgUmVxRGF0YT47XG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8UmVzLCBSZXNEYXRhPjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZD86IEludG9JZDtcbiAgICAgICAgfSxcbiAgICApOiBFbmRwb2ludFR5cGU8UmVxLCBSZXM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFR5cGU8UmVxLCBSZXM+KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8UmVxLCBKc29uVHlwZSwgVWludDhBcnJheT4ocmVxdWVzdFNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxSZXMsIEpzb25UeXBlLCBVaW50OEFycmF5PihyZXNwb25zZVNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCA/IElkZW50aWZpZXIuZnJvbShwZXJtaXNzaW9uSWQpIDogdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFJlcSwgUmVzPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVxLCBVaW50OEFycmF5PjtcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFJlcywgVWludDhBcnJheT47XG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQ/OiBJbnRvSWQ7XG4gICAgICAgIH0sXG4gICAgKTogRW5kcG9pbnRUeXBlPFJlcSwgUmVzPiB7XG4gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRUeXBlPFJlcSwgUmVzPihcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQgPyBJZGVudGlmaWVyLmZyb20ocGVybWlzc2lvbklkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211JztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRlbnNpb24ge1xuICAgIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU7XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25UeXBlPFQgZXh0ZW5kcyBFeHRlbnNpb24gPSBFeHRlbnNpb24+IGV4dGVuZHMgSWRlbnRpZmllciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGU6IChvbXU6IE9tdSkgPT4gVCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ2V4dCcsIG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG59XG4iLAogICAgImV4cG9ydCB0eXBlIFVubGlzdGVuID0gKCkgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlcjxQIGV4dGVuZHMgQXJyYXk8YW55Pj4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiBBcnJheTwoLi4uYXJnczogUCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+ID0gW107XG5cbiAgICBwdWJsaWMgbGlzdGVuKGxpc3RlbmVyOiAoLi4uYXJnczogUCkgPT4gYW55KTogVW5saXN0ZW4ge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZSh0aGlzLmxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQoLi4uYXJnczogUCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIFsuLi50aGlzLmxpc3RlbmVyc10pIHtcbiAgICAgICAgICAgIGF3YWl0IGxpc3RlbmVyKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwKICAgICJcbnR5cGUgVGFzayA9ICgpID0+IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBjbGFzcyBMb2NrIHtcbiAgICBwcml2YXRlIHRhc2tzOiAoVGFzaylbXSA9IFtdO1xuICAgIHByaXZhdGUgd2FpdGVyOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHdhaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLndhaXRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FpdGVyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2FpdGVyID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJ1blRhc2tzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLnRhc2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHRoaXMudGFza3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRhc2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLndhaXRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJ1blRhc2tzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVzZTxUPihjYWxsYmFjazogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFzayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGF3YWl0IHByb21pc2UpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy50YXNrcy5wdXNoKHRhc2spO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0KCk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBKc29uVHlwZSwgdHlwZSBTZXJpYWxpemFibGUsIFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgdHlwZSBQYWNrZXREYXRhID0ge1xuICAgIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcbiAgICByZWFkb25seSBkYXRhOiBVaW50OEFycmF5O1xufTtcblxuZXhwb3J0IHR5cGUgUGFja2V0PFQgPSB1bmtub3duPiA9IHtcbiAgICByZWFkb25seSB0eXBlOiBQYWNrZXRUeXBlPFQ+O1xuICAgIHJlYWRvbmx5IGRhdGE6IFQ7XG59O1xuXG5leHBvcnQgY2xhc3MgUGFja2V0VHlwZTxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PixcbiAgICApIHsgfVxuXG4gICAgcHVibGljIG5ldyhkYXRhOiBUKTogUGFja2V0PFQ+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgbWF0Y2gocGFja2V0OiBQYWNrZXQpOiBwYWNrZXQgaXMgUGFja2V0PFQ+IHtcbiAgICAgICAgcmV0dXJuIHBhY2tldC50eXBlID09PSB0aGlzO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVKc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD47XG4gICAgfSk6IFBhY2tldFR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhY2tldFR5cGU8VD4oXG4gICAgICAgICAgICBpZGVudGlmaWVyLmpvaW4obmFtZSksXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8VCwgRCwgVWludDhBcnJheT4oc2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFQ+KGlkZW50aWZpZXI6IElkZW50aWZpZXIsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2VyaWFsaXplcixcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgIH0pOiBQYWNrZXRUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXRUeXBlKFxuICAgICAgICAgICAgaWRlbnRpZmllci5qb2luKG5hbWUpLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZS9zZXJpYWxpemVyLmpzJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuL3BhY2tldC5qcyc7XG5cbmNvbnN0IElERU5USUZJRVIgPSBuZXcgSWRlbnRpZmllcignY29yZScsICdwYWNrZXQnKTtcblxudHlwZSBQcm90b2NvbEluZm8gPSB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxudHlwZSBSU0FOdW1iZXJzID0ge1xuICAgIGU6IHN0cmluZztcbiAgICBuOiBzdHJpbmc7XG59O1xuXG50eXBlIEVuY3J5cHRpb25SZXF1ZXN0ID0ge1xuICAgIGtpbmQ6ICd2MSc7XG4gICAgcnNhOiBSU0FOdW1iZXJzO1xufTtcblxudHlwZSBFbmNyeXB0aW9uUmVzcG9uc2UgPSB7XG4gICAga2luZDogJ3YxJztcbiAgICByc2E6IFJTQU51bWJlcnM7XG4gICAgYWVzOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTZXJ2ZXJNZXRhID0ge1xuICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgZW5jcnlwdGlvbjogRW5jcnlwdGlvblJlcXVlc3QgfCBudWxsO1xuICAgIGhhc2g6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbnR5cGUgQ29ubmVjdFBhY2tldEpzb24gPSB7XG4gICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBhcHA6IEFwcEpzb247XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xufTtcblxuZXhwb3J0IGNsYXNzIENvbm5lY3RQYWNrZXQge1xuICAgIHB1YmxpYyByZWFkb25seSBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIHB1YmxpYyByZWFkb25seSBhcHA6IEFwcDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdG9rZW46IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbjogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHtcbiAgICAgICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICAgICAgYXBwOiBBcHA7XG4gICAgICAgIHRva2VuOiBzdHJpbmc7XG4gICAgICAgIGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5wcm90b2NvbCA9IG9wdGlvbnMucHJvdG9jb2w7XG4gICAgICAgIHRoaXMuYXBwID0gb3B0aW9ucy5hcHA7XG4gICAgICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuICAgICAgICB0aGlzLmVuY3J5cHRpb24gPSBvcHRpb25zLmVuY3J5cHRpb24gPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IENvbm5lY3RQYWNrZXRKc29uKTogQ29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBuZXcgQ29ubmVjdFBhY2tldCh7XG4gICAgICAgICAgICBwcm90b2NvbDogZGF0YS5wcm90b2NvbCxcbiAgICAgICAgICAgIGFwcDogQXBwLmRlc2VyaWFsaXplKGRhdGEuYXBwKSxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IGRhdGEuZW5jcnlwdGlvbixcbiAgICAgICAgICAgIHRva2VuOiBkYXRhLnRva2VuLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBDb25uZWN0UGFja2V0KTogQ29ubmVjdFBhY2tldEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvdG9jb2w6IGRhdGEucHJvdG9jb2wsXG4gICAgICAgICAgICBhcHA6IEFwcC5zZXJpYWxpemUoZGF0YS5hcHApLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogZGF0YS5lbmNyeXB0aW9uLFxuICAgICAgICAgICAgdG9rZW46IGRhdGEudG9rZW4sXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgZW51bSBEaXNjb25uZWN0VHlwZSB7XG4gICAgSU5WQUxJRF9UT0tFTiA9ICdpbnZhbGlkX3Rva2VuJyxcbiAgICBJTlZBTElEX09SSUdJTiA9ICdpbnZhbGlkX29yaWdpbicsXG4gICAgSU5WQUxJRF9WRVJTSU9OID0gJ2ludmFsaWRfdmVyc2lvbicsXG4gICAgSU5WQUxJRF9QQUNLRVRfVFlQRSA9ICdpbnZhbGlkX3BhY2tldF90eXBlJyxcbiAgICBJTlZBTElEX1BBQ0tFVF9EQVRBID0gJ2ludmFsaWRfcGFja2V0X2RhdGEnLFxuICAgIElOVkFMSURfUEFDS0VUID0gJ2ludmFsaWRfcGFja2V0JyxcbiAgICBJTlRFUk5BTF9FUlJPUiA9ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgQU5PVEhFUl9DT05ORUNUSU9OID0gJ2Fub3RoZXJfY29ubmVjdGlvbicsXG4gICAgUEVSTUlTU0lPTl9ERU5JRUQgPSAncGVybWlzc2lvbl9kZW5pZWQnLFxuICAgIEFQUF9SRU1PVkVEID0gJ2FwcF9yZW1vdmVkJyxcbiAgICBTRVJWRVJfUkVTVEFSVCA9ICdzZXJ2ZXJfcmVzdGFydCcsXG4gICAgU0hVVERPV04gPSAnc2h1dGRvd24nLFxuICAgIENMT1NFID0gJ2Nsb3NlJyxcbn1cblxudHlwZSBEaXNjb25uZWN0UGFja2V0SnNvbiA9IHtcbiAgICB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IGNsYXNzIERpc2Nvbm5lY3RQYWNrZXQge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHtcbiAgICAgICAgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2UgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBEaXNjb25uZWN0UGFja2V0KTogRGlzY29ubmVjdFBhY2tldEpzb24ge1xuICAgICAgICByZXR1cm4gZGF0YS50b0pzb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXRKc29uKTogRGlzY29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBEaXNjb25uZWN0UGFja2V0LmZyb21Kc29uKGRhdGEpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSnNvbihkYXRhOiBEaXNjb25uZWN0UGFja2V0SnNvbik6IERpc2Nvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gbmV3IERpc2Nvbm5lY3RQYWNrZXQoe1xuICAgICAgICAgICAgdHlwZTogZGF0YS50eXBlLFxuICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0b0pzb24oKTogRGlzY29ubmVjdFBhY2tldEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBBQ0tFVF9UWVBFUzoge1xuICAgIFNFUlZFUl9NRVRBOiBQYWNrZXRUeXBlPFNlcnZlck1ldGE+O1xuICAgIENPTk5FQ1Q6IFBhY2tldFR5cGU8Q29ubmVjdFBhY2tldD47XG4gICAgRElTQ09OTkVDVDogUGFja2V0VHlwZTxEaXNjb25uZWN0UGFja2V0PjtcbiAgICBUT0tFTjogUGFja2V0VHlwZTxzdHJpbmc+O1xuICAgIFJFQURZOiBQYWNrZXRUeXBlPHVuZGVmaW5lZD47XG4gICAgRU5DUllQVEVEX1BBQ0tFVDogUGFja2V0VHlwZTxVaW50OEFycmF5Pjtcbn0gPSB7XG4gICAgU0VSVkVSX01FVEE6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxTZXJ2ZXJNZXRhPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdzZXJ2ZXJfbWV0YScsXG4gICAgfSksXG4gICAgQ09OTkVDVDogUGFja2V0VHlwZS5jcmVhdGVKc29uPENvbm5lY3RQYWNrZXQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2Nvbm5lY3QnLFxuICAgICAgICBzZXJpYWxpemVyOiBDb25uZWN0UGFja2V0LFxuICAgIH0pLFxuICAgIERJU0NPTk5FQ1Q6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxEaXNjb25uZWN0UGFja2V0PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdkaXNjb25uZWN0JyxcbiAgICAgICAgc2VyaWFsaXplcjogRGlzY29ubmVjdFBhY2tldCxcbiAgICB9KSxcbiAgICBUT0tFTjogUGFja2V0VHlwZS5jcmVhdGVKc29uPHN0cmluZz4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAndG9rZW4nLFxuICAgIH0pLFxuICAgIFJFQURZOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248dW5kZWZpbmVkPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdyZWFkeScsXG4gICAgfSksXG4gICAgRU5DUllQVEVEX1BBQ0tFVDogUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFVpbnQ4QXJyYXk+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2UnLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3AoKSxcbiAgICB9KSxcbn07XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgUmVnaXN0cnlQZXJtaXNzaW9ucywgUmVnaXN0cnlQZXJtaXNzaW9uc0pTT04gfSBmcm9tICcuL3JlZ2lzdHJ5JztcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5UGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IFVpbnQ4QXJyYXkgfCBudWxsLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFJlZ2lzdHJ5UGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVCb29sZWFuKHBhY2tldC52YWx1ZSAhPT0gbnVsbCk7XG4gICAgICAgIGlmIChwYWNrZXQudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkocGFja2V0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFJlZ2lzdHJ5UGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmVhZGVyLnJlYWRCb29sZWFuKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZXhpc3RpbmcgPyByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cnlQYWNrZXQoaWQsIHZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJQYWNrZXRKU09OIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHBlcm1pc3Npb25zOiBSZWdpc3RyeVBlcm1pc3Npb25zSlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFJlZ2lzdHJ5UGVybWlzc2lvbnMsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBSZWdpc3RlclBhY2tldCk6IFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBwYWNrZXQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogcGFja2V0LmlkLmtleSgpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5hbGwpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlYWQ6IHBlcm1zLnJlYWQgPyBJZGVudGlmaWVyLmZyb20ocGVybXMucmVhZCkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgd3JpdGU6IHBlcm1zLndyaXRlID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLndyaXRlKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBSZWdpc3RlclBhY2tldEpTT04pOiBSZWdpc3RlclBhY2tldCB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBkYXRhO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGRhdGEuaWQpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFsbDogcGVybXMuYWxsID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLmFsbCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVhZDogcGVybXMucmVhZCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5yZWFkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB3cml0ZTogcGVybXMud3JpdGUgPyBJZGVudGlmaWVyLmZyb20ocGVybXMud3JpdGUpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeVBlcm1pc3Npb25zSlNPTiB7XG4gICAgYWxsPzogc3RyaW5nO1xuICAgIHJlYWQ/OiBzdHJpbmc7XG4gICAgd3JpdGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnlQZXJtaXNzaW9ucyB7XG4gICAgYWxsPzogSW50b0lkO1xuICAgIHJlYWQ/OiBJbnRvSWQ7XG4gICAgd3JpdGU/OiBJbnRvSWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyeVR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VmFsdWU6IFQsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uczogUmVnaXN0cnlQZXJtaXNzaW9ucyxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVKc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihpZGVudGlmaWVyOiBJbnRvSWQsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgc2VyaWFsaXplcixcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBUO1xuICAgICAgICBwZXJtaXNzaW9ucz86IFJlZ2lzdHJ5UGVybWlzc2lvbnM7XG4gICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD47XG4gICAgfSk6IFJlZ2lzdHJ5VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cnlUeXBlKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8VCwgRCwgVWludDhBcnJheT4oc2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMgPz8ge30sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFQ+KGlkZW50aWZpZXI6IEludG9JZCwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgIHBlcm1pc3Npb25zLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFQ7XG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICAgICAgcGVybWlzc2lvbnM/OiBSZWdpc3RyeVBlcm1pc3Npb25zO1xuICAgIH0pOiBSZWdpc3RyeVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5VHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeTxUPiB7XG4gICAgcmVhZG9ubHkgdHlwZTogUmVnaXN0cnlUeXBlPFQ+O1xuICAgIHJlYWRvbmx5IHZhbHVlOiBUO1xuICAgIGdldCgpOiBQcm9taXNlPFQ+O1xuICAgIHNldCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD47XG4gICAgbW9kaWZ5KGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD47XG4gICAgbGlzdGVuKGZuOiAodmFsdWU6IFQpID0+IHZvaWQpOiBVbmxpc3RlbjtcblxuICAgIGNvbXBhdFN2ZWx0ZSgpOiBXcml0YWJsZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgU3Vic2NyaWJlcjxUPiA9ICh2YWx1ZTogVCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmVyID0gKCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBkYXRlcjxUPiA9ICh2YWx1ZTogVCkgPT4gVDtcblxuZXhwb3J0IHR5cGUgU3RhcnRTdG9wTm90aWZpZXI8VD4gPSAoXG4gICAgc2V0OiAodmFsdWU6IFQpID0+IHZvaWQsXG4gICAgdXBkYXRlOiAoZm46IFVwZGF0ZXI8VD4pID0+IHZvaWRcbikgPT4gdm9pZCB8ICgoKSA9PiB2b2lkKTtcblxuZXhwb3J0IGludGVyZmFjZSBSZWFkYWJsZTxUPiB7XG4gICAgc3Vic2NyaWJlKHRoaXM6IHZvaWQsIHJ1bjogU3Vic2NyaWJlcjxUPik6IFVuc3Vic2NyaWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0YWJsZTxUPiBleHRlbmRzIFJlYWRhYmxlPFQ+IHtcbiAgICBzZXQodGhpczogdm9pZCwgdmFsdWU6IFQpOiB2b2lkO1xuICAgIHVwZGF0ZSh0aGlzOiB2b2lkLCB1cGRhdGVyOiBVcGRhdGVyPFQ+KTogdm9pZDtcbiAgICB3YWl0KCk6IFByb21pc2U8VD47XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBMb2NrIH0gZnJvbSAnLi4vLi4vbG9jay5qcyc7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEpzb25UeXBlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB7IHR5cGUgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuaW1wb3J0IHsgUmVnaXN0ZXJQYWNrZXQsIFJlZ2lzdHJ5UGFja2V0IH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcbmltcG9ydCB7IHR5cGUgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSwgV3JpdGFibGUgfSBmcm9tICcuL3JlZ2lzdHJ5LmpzJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5RXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxSZWdpc3RyeUV4dGVuc2lvbj4gPSBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJpZXMgPSBuZXcgSWRlbnRpZmllck1hcDxSZWdpc3RyeTx1bmtub3duPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBSRUdJU1RSWV9SRUdJU1RFUl9QQUNLRVQsXG4gICAgICAgICAgICBSRUdJU1RSWV9VUERBVEVfUEFDS0VULFxuICAgICAgICAgICAgUkVHSVNUUllfTElTVEVOX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVJlZ2lzdHJ5PFQ+KHJlZ2lzdHJ5VHlwZTogUmVnaXN0cnlUeXBlPFQ+KTogUmVnaXN0cnk8VD4ge1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyaWVzLmhhcyhyZWdpc3RyeVR5cGUuaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5IHdpdGggaWRlbnRpZmllciAnJHtyZWdpc3RyeVR5cGUuaWR9JyBhbHJlYWR5IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cnlJbXBsKHRoaXMub211LCByZWdpc3RyeVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocmVnaXN0cnlUeXBlOiBSZWdpc3RyeVR5cGU8VD4pOiBSZWdpc3RyeTxUPiB7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSByZWdpc3RyeVR5cGUuaWQ7XG4gICAgICAgIGxldCByZWdpc3RyeSA9IHRoaXMucmVnaXN0cmllcy5nZXQoaWRlbnRpZmllcik7XG4gICAgICAgIGlmIChyZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZWdpc3RyeSA9IHRoaXMuY3JlYXRlUmVnaXN0cnkocmVnaXN0cnlUeXBlKTtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0cmllcy5zZXQoaWRlbnRpZmllciwgcmVnaXN0cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWdpc3RyeSBhcyBSZWdpc3RyeTxUPjtcbiAgICB9XG5cbiAgICBwdWJsaWMganNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4obmFtZTogc3RyaW5nLCBvcHRpb25zOiB7IGRlZmF1bHQ6IFQ7IHNlcmlhbGl6ZXI/OiBTZXJpYWxpemVyPFQsIEQ+IH0pOiBSZWdpc3RyeTxUPiB7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLm9tdS5hcHAuaWQuam9pbihuYW1lKTtcbiAgICAgICAgaWYgKHRoaXMucmVnaXN0cmllcy5oYXMoaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgd2l0aCBuYW1lICcke25hbWV9JyBhbHJlYWR5IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlVHlwZSA9IFJlZ2lzdHJ5VHlwZS5jcmVhdGVKc29uPFQ+KGlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IG9wdGlvbnMuZGVmYXVsdCxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI6IG9wdGlvbnMuc2VyaWFsaXplcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJlZ2lzdHJ5KHRhYmxlVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlcmlhbGl6ZWQ8VD4obmFtZTogc3RyaW5nLCBvcHRpb25zOiB7IGRlZmF1bHQ6IFQ7IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4gfSk6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyaWVzLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpc3RyeSB3aXRoIG5hbWUgJyR7bmFtZX0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gUmVnaXN0cnlUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VD4oaWRlbnRpZmllciwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogb3B0aW9ucy5kZWZhdWx0LFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVnaXN0cnkodGFibGVUeXBlKTtcbiAgICB9XG59XG5cbmNsYXNzIFJlZ2lzdHJ5SW1wbDxUPiBpbXBsZW1lbnRzIFJlZ2lzdHJ5PFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPFtUXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2NrOiBMb2NrID0gbmV3IExvY2soKTtcbiAgICBwcml2YXRlIGxpc3RlbmluZyA9IGZhbHNlO1xuICAgIHB1YmxpYyB2YWx1ZTogVDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUmVnaXN0cnlUeXBlPFQ+LFxuICAgICkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdHlwZS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUkVHSVNUUllfVVBEQVRFX1BBQ0tFVCwgKHBhY2tldCkgPT5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVXBkYXRlKHBhY2tldCksXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgI2dldCgpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoUkVHSVNUUllfR0VUX0VORFBPSU5ULCB0aGlzLnR5cGUuaWQpO1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzdWx0LnZhbHVlKTtcbiAgICB9XG5cbiAgICBhc3luYyAjc2V0KHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoUkVHSVNUUllfVVBEQVRFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMudHlwZS5pZCxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnR5cGUuc2VyaWFsaXplci5zZXJpYWxpemUodmFsdWUpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubG9jay51c2UoYXN5bmMgKCkgPT4gdGhpcy4jZ2V0KCkpO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2NrLnVzZShhc3luYyAoKSA9PiB0aGlzLiNzZXQodmFsdWUpKTtcbiAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy4jZ2V0KCk7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGF3YWl0IGZuKHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3NldChuZXdWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtb2RpZnkoZm46ICh2YWx1ZTogVCkgPT4gUHJvbWlzZUxpa2U8VD4gfCBUKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5sb2NrLnVzZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuI2dldCgpO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhd2FpdCBmbih2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNzZXQobmV3VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiBVbmxpc3RlbiB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5pbmcgJiYgdGhpcy5vbXUucmVhZHkpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVHSVNUUllfTElTVEVOX1BBQ0tFVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RlbmluZyA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50RW1pdHRlci5saXN0ZW4oaGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVVcGRhdGUoZGF0YTogUmVnaXN0cnlQYWNrZXQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFkYXRhLmlkLmlzRXF1YWwodGhpcy50eXBlLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy50eXBlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubGlzdGVuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFJFR0lTVFJZX0xJU1RFTl9QQUNLRVQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnR5cGUuaWQuaXNTdWJwYXRoT2YodGhpcy5vbXUuYXBwLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub211LnNlbmQoUkVHSVNUUllfUkVHSVNURVJfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy50eXBlLmlkLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMudHlwZS5wZXJtaXNzaW9ucyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBhdFN2ZWx0ZSgpOiBXcml0YWJsZTxUPiB7XG4gICAgICAgIGxldCByZWFkeSA9IGZhbHNlO1xuICAgICAgICBsZXQgdmFsdWU6IFQgPSB0aGlzLnZhbHVlO1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgU2V0PCh2YWx1ZTogVCkgPT4gdm9pZD4oKTtcbiAgICAgICAgdGhpcy5saXN0ZW4oKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICByZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKHJ1bikgPT4ge1xuICAgICAgICAgICAgICAgIHJ1bih2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZXQ6ICh2YWx1ZTogVCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpc3RyeSAke3RoaXMudHlwZS5pZC5rZXkoKX0gaXMgbm90IHJlYWR5YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHZhbHVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJzY3JpYmU6IChydW4pID0+IHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuYWRkKHJ1bik7XG4gICAgICAgICAgICAgICAgcnVuKHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKHJ1bik7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGU6IChmbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpc3RyeSAke3RoaXMudHlwZS5pZC5rZXkoKX0gaXMgbm90IHJlYWR5YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGZuKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YWl0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFJlZ2lzdHJ5RXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdyZWdpc3RyeScsXG4gICAgKG9tdTogT211KSA9PiBuZXcgUmVnaXN0cnlFeHRlbnNpb24ob211KSxcbik7XG5leHBvcnQgY29uc3QgUkVHSVNUUllfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3Blcm1pc3Npb24nKTtcbmNvbnN0IFJFR0lTVFJZX1JFR0lTVEVSX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxSZWdpc3RlclBhY2tldD4oUkVHSVNUUllfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVnaXN0ZXInLFxuICAgIHNlcmlhbGl6ZXI6IFJlZ2lzdGVyUGFja2V0LFxufSk7XG5jb25zdCBSRUdJU1RSWV9VUERBVEVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFJlZ2lzdHJ5UGFja2V0PihcbiAgICBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICd1cGRhdGUnLFxuICAgICAgICBzZXJpYWxpemVyOiBSZWdpc3RyeVBhY2tldCxcbiAgICB9LFxuKTtcbmNvbnN0IFJFR0lTVFJZX0xJU1RFTl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcj4oUkVHSVNUUllfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5jb25zdCBSRUdJU1RSWV9HRVRfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxJZGVudGlmaWVyLCBSZWdpc3RyeVBhY2tldD4oXG4gICAgUkVHSVNUUllfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAnZ2V0JyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9Kc29uKCksXG4gICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogUmVnaXN0cnlQYWNrZXQsXG4gICAgICAgIHBlcm1pc3Npb25JZDogUkVHSVNUUllfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgRmxhZ3MgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgdHlwZSB7IFRhYmxlQ29uZmlnIH0gZnJvbSAnLi90YWJsZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUGFja2V0KGlkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVJdGVtc1BhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgaXRlbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVJdGVtc1BhY2tldChpZCwgaXRlbXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlS2V5c1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleXM6IHN0cmluZ1tdLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVLZXlzUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5rZXlzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhY2tldC5rZXlzKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlS2V5c1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGtleXMucHVzaChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlS2V5c1BhY2tldChpZCwga2V5cyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVQcm94eVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVQcm94eVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQua2V5KTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVByb3h5UGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgIGl0ZW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUHJveHlQYWNrZXQoaWQsIGl0ZW1zLCBrZXkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUYWJsZUZldGNoUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbGltaXQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJhY2t3YXJkOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQubGltaXQpO1xuICAgICAgICBjb25zdCBmbGFncyA9IG5ldyBGbGFncyh7IGxlbmd0aDogMiB9KTtcbiAgICAgICAgZmxhZ3Muc2V0KDAsIHBhY2tldC5iYWNrd2FyZCk7XG4gICAgICAgIGZsYWdzLnNldCgxLCBwYWNrZXQuY3Vyc29yICE9PSBudWxsKTtcbiAgICAgICAgd3JpdGVyLndyaXRlRmxhZ3MoZmxhZ3MpO1xuICAgICAgICBpZiAocGFja2V0LmN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5jdXJzb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVGZXRjaFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBmbGFncyA9IHJlYWRlci5yZWFkRmxhZ3MoMik7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkID0gZmxhZ3MuZ2V0KDApO1xuICAgICAgICBjb25zdCBjdXJzb3IgPSBmbGFncy5pZlNldCgxLCAoKSA9PiByZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZldGNoUGFja2V0KGlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVGZXRjaFJhbmdlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnQ6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVuZDogc3RyaW5nLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFJhbmdlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnN0YXJ0KTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5lbmQpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGZXRjaFJhbmdlUGFja2V0KGlkLCBzdGFydCwgZW5kKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRDb25maWdQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjb25maWc6IFRhYmxlQ29uZmlnLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2V0Q29uZmlnUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkocGFja2V0LmNvbmZpZykpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNldENvbmZpZ1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFNldENvbmZpZ1BhY2tldChpZCwgY29uZmlnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYWxsOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlYWQ6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgd3JpdGU6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVtb3ZlOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHByb3h5OiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFNldFBlcm1pc3Npb25QYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIGxldCBmbGFncyA9IDA7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gMGIxMDAwMDtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGVVaW50OChmbGFncyk7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmFsbC5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlYWQua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQud3JpdGUua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlbW92ZS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5wcm94eS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICAgICAgICBjb25zdCBhbGwgPSBmbGFncyAmIDBiMSA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBmbGFncyAmIDBiMTAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCB3cml0ZSA9IGZsYWdzICYgMGIxMDAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCByZW1vdmUgPSBmbGFncyAmIDBiMTAwMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gZmxhZ3MgJiAwYjEwMDAwID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXRQZXJtaXNzaW9uUGFja2V0KGlkLCBhbGwsIHJlYWQsIHdyaXRlLCByZW1vdmUsIHByb3h5KTtcbiAgICB9XG59XG5cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBFdmVudEVtaXR0ZXIsIFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IEpzb25UeXBlLCBTZXJpYWxpemFibGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ29uZmlnID0ge1xuICAgIGNhY2hlX3NpemU6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGU8VD4ge1xuICAgIHJlYWRvbmx5IGNhY2hlOiBSZWFkb25seU1hcDxzdHJpbmcsIFQ+O1xuICAgIHJlYWRvbmx5IGV2ZW50OiBUYWJsZUV2ZW50czxUPjtcbiAgICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICAgIGdldE1hbnkoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PjtcbiAgICBhZGQoLi4uaXRlbTogVFtdKTogUHJvbWlzZTx2b2lkPjtcbiAgICB1cGRhdGUoLi4uaXRlbTogVFtdKTogUHJvbWlzZTx2b2lkPjtcbiAgICByZW1vdmUoLi4uaXRlbXM6IFRbXSk6IFByb21pc2U8dm9pZD47XG4gICAgY2xlYXIoKTogUHJvbWlzZTx2b2lkPjtcbiAgICBoYXMoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGhhc01hbnk8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiguLi5rZXlzOiAoa2V5b2YgVClbXSk6IFByb21pc2U8eyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH0+O1xuICAgIGhhc0FsbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj47XG4gICAgaGFzQW55KC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPjtcblxuICAgIGZldGNoSXRlbXMoe1xuICAgICAgICBsaW1pdCxcbiAgICAgICAgYmFja3dhcmQsXG4gICAgICAgIGN1cnNvcixcbiAgICB9OiB7XG4gICAgICAgIGxpbWl0OiBudW1iZXI7XG4gICAgICAgIGJhY2t3YXJkPzogYm9vbGVhbjtcbiAgICAgICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PjtcbiAgICBmZXRjaFJhbmdlKHsgc3RhcnQsIGVuZCB9OiB7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PjtcbiAgICBmZXRjaEFsbCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PjtcbiAgICBpdGVyYXRlKHsgYmFja3dhcmQsIGN1cnNvciB9OiB7IGJhY2t3YXJkPzogYm9vbGVhbjsgY3Vyc29yPzogc3RyaW5nIH0pOiBBc3luY0l0ZXJhYmxlPFQ+O1xuICAgIHNpemUoKTogUHJvbWlzZTxudW1iZXI+O1xuXG4gICAgcHJveHkocHJveHk6IChpdGVtOiBUKSA9PiBUIHwgdW5kZWZpbmVkKTogVW5saXN0ZW47XG4gICAgc2V0Q2FjaGVTaXplKHNpemU6IG51bWJlcik6IHZvaWQ7XG4gICAgc2V0Q29uZmlnKGNvbmZpZzogVGFibGVDb25maWcpOiB2b2lkO1xuICAgIHNldFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBUYWJsZVBlcm1pc3Npb25zKTogdm9pZDtcblxuICAgIGxpc3RlbihsaXN0ZW5lcj86IChpdGVtczogTWFwPHN0cmluZywgVD4pID0+IHZvaWQpOiBVbmxpc3Rlbjtcbn1cblxuZXhwb3J0IHR5cGUgVGFibGVFdmVudHM8VD4gPSB7XG4gICAgYWRkOiBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT47XG4gICAgdXBkYXRlOiBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT47XG4gICAgcmVtb3ZlOiBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT47XG4gICAgY2xlYXI6IEV2ZW50RW1pdHRlcjxbXT47XG4gICAgY2FjaGVVcGRhdGU6IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlUGVybWlzc2lvbnMgPSB7XG4gICAgYWxsPzogSWRlbnRpZmllcjtcbiAgICByZWFkPzogSWRlbnRpZmllcjtcbiAgICB3cml0ZT86IElkZW50aWZpZXI7XG4gICAgcmVtb3ZlPzogSWRlbnRpZmllcjtcbiAgICBwcm94eT86IElkZW50aWZpZXI7XG59O1xuXG5leHBvcnQgY2xhc3MgVGFibGVUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMga2V5RnVuY3Rpb246IChpdGVtOiBUKSA9PiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBwZXJtaXNzaW9ucz86IFRhYmxlUGVybWlzc2lvbnMgfCB1bmRlZmluZWQsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVKc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucz86IFRhYmxlUGVybWlzc2lvbnM7XG4gICAgICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgICAgICB9LFxuICAgICk6IFRhYmxlVHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8VCwgRCwgVWludDhBcnJheT4oc2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFQ+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogKGl0ZW06IFQpID0+IHN0cmluZztcbiAgICAgICAgICAgIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucztcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICAgICAgfSxcbiAgICApOiBUYWJsZVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQge1xuICAgIFNldENvbmZpZ1BhY2tldCxcbiAgICBTZXRQZXJtaXNzaW9uUGFja2V0LFxuICAgIFRhYmxlRmV0Y2hQYWNrZXQsXG4gICAgVGFibGVGZXRjaFJhbmdlUGFja2V0LFxuICAgIFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgVGFibGVLZXlzUGFja2V0LFxuICAgIFRhYmxlUGFja2V0LFxuICAgIFRhYmxlUHJveHlQYWNrZXQsXG59IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFRhYmxlLCBUYWJsZUNvbmZpZywgVGFibGVFdmVudHMsIFRhYmxlUGVybWlzc2lvbnMgfSBmcm9tICcuL3RhYmxlLmpzJztcbmltcG9ydCB7IFRhYmxlVHlwZSB9IGZyb20gJy4vdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgVEFCTEVfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8VGFibGVFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3RhYmxlJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgVGFibGVFeHRlbnNpb24oY2xpZW50KSxcbik7XG5leHBvcnQgY29uc3QgVEFCTEVfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3Blcm1pc3Npb24nKTtcblxuY29uc3QgVEFCTEVfU0VUX1BFUk1JU1NJT05fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNldFBlcm1pc3Npb25QYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9wZXJtaXNzaW9uJyxcbiAgICBzZXJpYWxpemVyOiBTZXRQZXJtaXNzaW9uUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxTZXRDb25maWdQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9jb25maWcnLFxuICAgIHNlcmlhbGl6ZXI6IFNldENvbmZpZ1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFRBQkxFX1BST1hZX0xJU1RFTl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHlfbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5jb25zdCBUQUJMRV9QUk9YWV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQcm94eVBhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHknLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlUHJveHlQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fQUREX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2FkZCcsXG4gICAgc2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1fdXBkYXRlJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX1JFTU9WRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV9yZW1vdmUnLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fR0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2dldCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlS2V5c1BhY2tldCwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVLZXlzUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUtleXNQYWNrZXQsIGJvb2xlYW4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzX2FsbCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9IQVNfQU5ZX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBib29sZWFuPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2hhc19hbnknLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUtleXNQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLmpzb24oKSxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2gnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUZldGNoUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX1JBTkdFX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFJhbmdlUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdmZXRjaF9yYW5nZScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9GRVRDSF9BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZVBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2hfYWxsJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfU0laRV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlUGFja2V0LCBudW1iZXI+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NpemUnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2NsZWFyJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgVGFibGVFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFRhYmxlRXh0ZW5zaW9uPiA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFibGVNYXAgPSBuZXcgSWRlbnRpZmllck1hcDxUYWJsZTx1bmtub3duPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBUQUJMRV9TRVRfUEVSTUlTU0lPTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCxcbiAgICAgICAgICAgIFRBQkxFX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9QUk9YWV9MSVNURU5fUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfUFJPWFlfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9BRERfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUYWJsZTxUPih0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShUQUJMRV9QRVJNSVNTSU9OX0lEKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHRhYmxlVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFibGUgYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZUltcGw8VD4odGhpcy5vbXUsIHRhYmxlVHlwZSk7XG4gICAgICAgIHRoaXMudGFibGVNYXAuc2V0KHRhYmxlVHlwZS5pZCwgdGFibGUgYXMgVGFibGU8dW5rbm93bj4pO1xuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD4gfSk6IFRhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEpzb25UeXBlLCBVaW50OEFycmF5PihvcHRpb25zLnNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIG9wdGlvbnMua2V5LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZSh0YWJsZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PiB9KTogVGFibGU8VD4ge1xuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSksXG4gICAgICAgICAgICBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmtleSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWJsZU1hcC5nZXQodHlwZS5pZCkgYXMgVGFibGU8VD47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlTWFwLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG59XG5cbmNsYXNzIFRhYmxlSW1wbDxUPiBpbXBsZW1lbnRzIFRhYmxlPFQ+IHtcbiAgICBwdWJsaWMgY2FjaGU6IE1hcDxzdHJpbmcsIFQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBldmVudDogVGFibGVFdmVudHM8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlTWFwOiBNYXA8c3RyaW5nLCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+PjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3hpZXM6IEFycmF5PChpdGVtOiBUKSA9PiBUIHwgdW5kZWZpbmVkPjtcbiAgICBwcml2YXRlIGlkOiBJZGVudGlmaWVyO1xuICAgIHByaXZhdGUgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgIHByaXZhdGUga2V5RnVuY3Rpb246IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjYWNoZVNpemU/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjb25maWc/OiBUYWJsZUNvbmZpZztcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICB0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPixcbiAgICApIHtcbiAgICAgICAgdGhpcy5pZCA9IHRhYmxlVHlwZS5pZDtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gdGFibGVUeXBlLnNlcmlhbGl6ZXI7XG4gICAgICAgIHRoaXMua2V5RnVuY3Rpb24gPSB0YWJsZVR5cGUua2V5RnVuY3Rpb247XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZXZlbnQgPSB7XG4gICAgICAgICAgICBhZGQ6IG5ldyBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT4oKSxcbiAgICAgICAgICAgIHVwZGF0ZTogbmV3IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPigpLFxuICAgICAgICAgICAgcmVtb3ZlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgICAgICBjbGVhcjogbmV3IEV2ZW50RW1pdHRlcjxbXT4oKSxcbiAgICAgICAgICAgIGNhY2hlVXBkYXRlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvbWlzZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5wcm94aWVzID0gW107XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9QUk9YWV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMucHJveGllcy5mb3JFYWNoKChwcm94eSkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gbmV3IE1hcChcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJveHlJdGVtID0gcHJveHkoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5SXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBwcm94eUl0ZW0gYXMgVF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgW3N0cmluZywgVF0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaXRlbSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbXUuc2VuZChUQUJMRV9QUk9YWV9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBrZXk6IHBhY2tldC5rZXksXG4gICAgICAgICAgICAgICAgaXRlbXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV0ubWFwKChba2V5LCBpdGVtXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlbSldO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX0lURU1fQUREX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHBhY2tldC5pdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuYWRkLmVtaXQoaXRlbXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX1VQREFURV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhwYWNrZXQuaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LnVwZGF0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhY2tldC5pZC5pc0VxdWFsKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQucmVtb3ZlLmVtaXQoaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5lbWl0KHRoaXMuY2FjaGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX0NMRUFSX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LmNsZWFyLmVtaXQoKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4gdGhpcy5vblJlYWR5KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FjaGUoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBpdGVtcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLnNsaWNlKC10aGlzLmNhY2hlU2l6ZSkpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGxpc3RlbmVyPzogKGl0ZW1zOiBNYXA8c3RyaW5nLCBUPikgPT4gdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9MSVNURU5fUEFDS0VULCB0aGlzLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUubGlzdGVuKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5KGNhbGxiYWNrOiAoaXRlbTogVCkgPT4gVCB8IHVuZGVmaW5lZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKHRoaXMucHJveGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGxldCBjYW5jZWwgPSAoKTogdm9pZCA9PiB7fTtcbiAgICAgICAgICAgIGNhbmNlbCA9IHRoaXMub211Lm9uUmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3hpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfUFJPWFlfTElTVEVOX1BBQ0tFVCwgdGhpcy5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3hpZXMucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3hpZXMuc3BsaWNlKHRoaXMucHJveGllcy5pbmRleE9mKGNhbGxiYWNrKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblJlYWR5KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfU0VUX0NPTkZJR19QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9taXNlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9taXNlTWFwLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlTWFwLnNldChrZXksIHByb21pc2UpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZS50aGVuKChpdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb21pc2VNYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldE1hbnkoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkS2V5cyA9IGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIXRoaXMuY2FjaGUuaGFzKGtleSkpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+ICF0aGlzLnByb21pc2VNYXAuaGFzKGtleSkpO1xuICAgICAgICBpZiAoZmlsdGVyZWRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXAoWy4uLnRoaXMuY2FjaGVdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogZmlsdGVyZWRLZXlzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5zZXQoXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbigoaXRlbXMpID0+IGl0ZW1zLmdldChrZXkpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGQoLi4uaXRlbXM6IFRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZXJpYWxpemVJdGVtcyhpdGVtcyk7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9BRERfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGl0ZW1zOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VyaWFsaXplSXRlbXMoaXRlbXMpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fVVBEQVRFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZSguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNlcmlhbGl6ZUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZV0uZmlsdGVyKChba2V5XSkgPT4gIWtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fUkVNT1ZFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fQ0xFQVJfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhcyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzW2tleV0gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc01hbnk8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiguLi5rZXlzOiAoa2V5b2YgVClbXSk6IFByb21pc2U8eyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czoga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXMgYXMgeyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FsbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTllfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoSXRlbXMoe1xuICAgICAgICBsaW1pdCxcbiAgICAgICAgYmFja3dhcmQsXG4gICAgICAgIGN1cnNvcixcbiAgICB9OiB7XG4gICAgICAgIGxpbWl0OiBudW1iZXI7XG4gICAgICAgIGJhY2t3YXJkPzogYm9vbGVhbjtcbiAgICAgICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFxuICAgICAgICAgICAgVEFCTEVfRkVUQ0hfRU5EUE9JTlQsXG4gICAgICAgICAgICBuZXcgVGFibGVGZXRjaFBhY2tldCh0aGlzLmlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvciksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoUmFuZ2Uoe1xuICAgICAgICBzdGFydCxcbiAgICAgICAgZW5kLFxuICAgIH06IHtcbiAgICAgICAgc3RhcnQ6IHN0cmluZztcbiAgICAgICAgZW5kOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfRkVUQ0hfUkFOR0VfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaEFsbCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFRBQkxFX0ZFVENIX0FMTF9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyAqaXRlcmF0ZSh7XG4gICAgICAgIGJhY2t3YXJkLFxuICAgICAgICBjdXJzb3IsXG4gICAgfToge1xuICAgICAgICBiYWNrd2FyZD86IGJvb2xlYW47XG4gICAgICAgIGN1cnNvcj86IHN0cmluZztcbiAgICB9KTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMuZmV0Y2hJdGVtcyh7XG4gICAgICAgICAgICAgICAgbGltaXQ6IHRoaXMuY2FjaGVTaXplID8/IDEwMCxcbiAgICAgICAgICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpdGVtcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCogaXRlbXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoY3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5kZWxldGUoY3Vyc29yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnNvckl0ZW0gPSBiYWNrd2FyZCA/IGl0ZW1zLnZhbHVlcygpLm5leHQoKS52YWx1ZSA6IFsuLi5pdGVtcy52YWx1ZXMoKV0ucG9wKCk7XG4gICAgICAgICAgICBpZiAoIWN1cnNvckl0ZW0pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnNvciA9IHRoaXMua2V5RnVuY3Rpb24oY3Vyc29ySXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2l6ZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfU0laRV9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZXJpYWxpemVJdGVtcyhpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4pOiBNYXA8c3RyaW5nLCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbXMpLm1hcCgoW2tleSwgZGF0YV0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIGl0ZW1dO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVJdGVtcyhpdGVtczogVFtdKTogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmtleUZ1bmN0aW9uKGl0ZW0pLCB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGl0ZW0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDYWNoZVNpemUoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FjaGVTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZzogVGFibGVDb25maWcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCBjb25maWcgYWZ0ZXIgY2xpZW50IGhhcyBzdGFydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBUYWJsZVBlcm1pc3Npb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUuanMnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSwgdHlwZSBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCB7IFRhYmxlVHlwZSwgdHlwZSBUYWJsZSB9IGZyb20gJy4uL3RhYmxlJztcblxuZXhwb3J0IGNvbnN0IFNFUlZFUl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTZXJ2ZXJFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3NlcnZlcicsXG4gICAgKG9tdTogT211KSA9PiBuZXcgU2VydmVyRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4RW50cnkge1xuICAgIHVybDogc3RyaW5nO1xuICAgIG1ldGE/OiBBcHBJbmRleFJlZ2lzdHJ5TWV0YTtcbiAgICBhZGRlZF9hdDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBcHBJbmRleCB7XG4gICAgaW5kZXhlczogUmVjb3JkPHN0cmluZywgQXBwSW5kZXhFbnRyeT47XG59O1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX0FQUFNfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcHMnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9BUFBTX1dSSVRFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignYXBwcycsICd3cml0ZScpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9JTkRFWF9SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignaW5kZXgnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9JTkRFWF9SRUdJU1RSWV9UWVBFOiBSZWdpc3RyeVR5cGU8QXBwSW5kZXg+ID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248QXBwSW5kZXg+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbmRleCcsXG4gICAgZGVmYXVsdFZhbHVlOiB7ICdpbmRleGVzJzoge30gfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICB3cml0ZTogU0VSVkVSX0FQUFNfV1JJVEVfUEVSTUlTU0lPTl9JRCxcbiAgICAgICAgcmVhZDogU0VSVkVSX0lOREVYX1JFQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5jb25zdCBBUFBfVEFCTEVfVFlQRSA9IFRhYmxlVHlwZS5jcmVhdGVKc29uKFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdhcHBzJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG4gICAga2V5OiAoYXBwKSA9PiBhcHAuaWQua2V5KCksXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgYWxsOiBTRVJWRVJfQVBQU19XUklURV9QRVJNSVNTSU9OX0lELFxuICAgICAgICByZWFkOiBTRVJWRVJfQVBQU19SRUFEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignc2h1dGRvd24nKTtcbmNvbnN0IFNIVVRET1dOX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxib29sZWFuLCBib29sZWFuPihTRVJWRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2h1dGRvd24nLFxuICAgIHBlcm1pc3Npb25JZDogU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQsXG59KTtcbmV4cG9ydCBjb25zdCBUUlVTVEVEX09SSUdJTlNfR0VUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbigndHJ1c3RlZF9vcmlnaW5zJywgJ2dldCcpO1xuZXhwb3J0IGNvbnN0IFRSVVNURURfT1JJR0lOU19TRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCd0cnVzdGVkX29yaWdpbnMnLCAnc2V0Jyk7XG5jb25zdCBUUlVTVEVEX0hPU1RTX1JFR0lTVFJZX1RZUEUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihTRVJWRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAndHJ1c3RlZF9ob3N0cycsXG4gICAgZGVmYXVsdFZhbHVlOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICByZWFkOiBUUlVTVEVEX09SSUdJTlNfR0VUX1BFUk1JU1NJT05fSUQsXG4gICAgICAgIHdyaXRlOiBUUlVTVEVEX09SSUdJTlNfU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgY2xhc3MgU2VydmVyRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxTZXJ2ZXJFeHRlbnNpb24+ID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFO1xuICAgIHB1YmxpYyByZWFkb25seSBhcHBzOiBUYWJsZTxBcHA+O1xuICAgIHB1YmxpYyByZWFkb25seSBpbmRleDogUmVnaXN0cnk8QXBwSW5kZXg+O1xuICAgIHB1YmxpYyByZWFkb25seSB0cnVzdGVkSG9zdHM6IFJlZ2lzdHJ5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICB0aGlzLmFwcHMgPSBvbXUudGFibGVzLmdldChBUFBfVEFCTEVfVFlQRSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvbXUucmVnaXN0cmllcy5nZXQoU0VSVkVSX0lOREVYX1JFR0lTVFJZX1RZUEUpO1xuICAgICAgICB0aGlzLnRydXN0ZWRIb3N0cyA9IG9tdS5yZWdpc3RyaWVzLmdldChUUlVTVEVEX0hPU1RTX1JFR0lTVFJZX1RZUEUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihyZXN0YXJ0PzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChTSFVURE9XTl9FTkRQT0lOVF9UWVBFLCByZXN0YXJ0ID8/IGZhbHNlKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVubGlzdGVuID0gdGhpcy5vbXUubmV0d29yay5ldmVudC5kaXNjb25uZWN0ZWQubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9uQ29ubmVjdENhbGxiYWNrczogQXJyYXk8KGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBvbkRpc2Nvbm5lY3RDYWxsYmFja3M6IEFycmF5PChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgb25Db25uZWN0KGNhbGxiYWNrOiAoYXBwOiBBcHApID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Db25uZWN0Q2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkRpc2Nvbm5lY3QoY2FsbGJhY2s6IChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkRpc2Nvbm5lY3RDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBBcHBJbmRleFJlZ2lzdHJ5TWV0YSA9IHtcbiAgICBuYW1lOiBMb2NhbGl6ZWRUZXh0O1xuICAgIG5vdGU6IExvY2FsaXplZFRleHQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4UmVnaXN0cnlKU09OIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1ldGE/OiBBcHBJbmRleFJlZ2lzdHJ5TWV0YTtcbiAgICBhcHBzOiBSZWNvcmQ8c3RyaW5nLCBBcHBKc29uPjtcbn1cblxuZXhwb3J0IGNsYXNzIEFwcEluZGV4UmVnaXN0cnkge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyBhcHBzOiBJZGVudGlmaWVyTWFwPEFwcD4sXG4gICAgICAgIHB1YmxpYyBtZXRhOiBBcHBJbmRleFJlZ2lzdHJ5TWV0YSB8IHVuZGVmaW5lZCxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihqc29uOiBBcHBJbmRleFJlZ2lzdHJ5SlNPTik6IEFwcEluZGV4UmVnaXN0cnkge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShqc29uWydpZCddKTtcbiAgICAgICAgY29uc3QgYXBwcyA9IG5ldyBJZGVudGlmaWVyTWFwPEFwcD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBbaWRTdHIsIGFwcEpTT05dIG9mIE9iamVjdC5lbnRyaWVzKGpzb25bJ2FwcHMnXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGlkU3RyKTtcbiAgICAgICAgICAgIGNvbnN0IGFwcCA9IEFwcC5kZXNlcmlhbGl6ZShhcHBKU09OKTtcbiAgICAgICAgICAgIGlmICghaWQuaXNOYW1lc3BhY2VFcXVhbChhcHAuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcHAgSUQgZG9lcyBub3QgbWF0Y2ggdGhlIElEIGluIHRoZSBpbmRleC4gJHthcHAuaWR9ICE9ICR7aWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcHBzLnNldChpZCwgYXBwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFwcEluZGV4UmVnaXN0cnkoXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGFwcHMsXG4gICAgICAgICAgICBqc29uLm1ldGEsXG4gICAgICAgICk7XG4gICAgfVxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7QUFHQSxJQUFNLGtCQUFrQjtBQUN4QixJQUFNLGFBQWE7QUFBQTtBQUlaLE1BQU0sV0FBVztBQUFBLEVBQ0o7QUFBQSxFQUNBO0FBQUEsRUFFaEIsV0FBVyxDQUNQLGNBQ0csTUFDTDtBQUFBLElBQ0UsV0FBVyxTQUFTLFdBQVcsSUFBSTtBQUFBLElBQ25DLEtBQUssWUFBWTtBQUFBLElBQ2pCLEtBQUssT0FBTztBQUFBO0FBQUEsU0FHRixTQUFTLENBQUMsWUFBZ0M7QUFBQSxJQUNwRCxPQUFPLFdBQVcsSUFBSTtBQUFBO0FBQUEsU0FHWixXQUFXLENBQUMsTUFBMEI7QUFBQSxJQUNoRCxPQUFPLFdBQVcsU0FBUyxJQUFJO0FBQUE7QUFBQSxTQUdyQixJQUFJLENBQUMsSUFBd0I7QUFBQSxJQUN2QyxJQUFJLGNBQWMsWUFBWTtBQUFBLE1BQzFCLE9BQU87QUFBQSxJQUNYLEVBQU8sU0FBSSxjQUFjLEtBQUs7QUFBQSxNQUMxQixPQUFPLEdBQUc7QUFBQSxJQUNkLEVBQU8sU0FBSSxPQUFPLE9BQU8sVUFBVTtBQUFBLE1BQy9CLE9BQU8sV0FBVyxRQUFRLEVBQUU7QUFBQSxJQUNoQyxFQUFPO0FBQUEsTUFHSCxNQUFNLFdBQVc7QUFBQSxNQUNqQixJQUNJLE9BQU8sU0FBUyxjQUFjLFlBQzlCLE1BQU0sUUFBUSxTQUFTLElBQUksS0FDM0IsU0FBUyxLQUFLLE1BQU0sQ0FBQyxNQUFNLE9BQU8sTUFBTSxRQUFRLEdBQ2xEO0FBQUEsUUFDRSxPQUFPLElBQUksV0FBVyxTQUFTLFdBQVcsR0FBRyxTQUFTLElBQUk7QUFBQSxNQUM5RDtBQUFBLE1BQ0EsTUFBTSxXQUFXO0FBQUEsTUFDakIsSUFBSSxPQUFPLFNBQVMsT0FBTyxhQUFhO0FBQUEsUUFDcEMsT0FBTyxXQUFXLEtBQUssU0FBUyxFQUFFO0FBQUEsTUFDdEM7QUFBQSxNQUNBLE1BQU0sSUFBSSxNQUFNLGlDQUFpQyxJQUFJO0FBQUE7QUFBQTtBQUFBLFNBSS9DLFlBQVksQ0FBQyxJQUF1RDtBQUFBLElBQzlFLElBQUksT0FBTyxhQUFhLE9BQU8sTUFBTTtBQUFBLE1BQ2pDO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTyxXQUFXLEtBQUssRUFBRTtBQUFBO0FBQUEsU0FHdEIsUUFBUSxDQUFDLFdBQW1CLE1BQXNCO0FBQUEsSUFDckQsSUFBSSxDQUFDLFdBQVc7QUFBQSxNQUNaLE1BQU0sSUFBSSxNQUFNLDhDQUE4QztBQUFBLElBQ2xFO0FBQUEsSUFDQSxJQUFJLEtBQUssV0FBVyxHQUFHO0FBQUEsTUFDbkIsTUFBTSxJQUFJLE1BQU0sZ0RBQWdEO0FBQUEsSUFDcEU7QUFBQSxJQUNBLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUNsQyxNQUFNLElBQUksTUFBTSwyQ0FBMkMsaUJBQWlCO0FBQUEsSUFDaEY7QUFBQSxJQUNBLFdBQVcsUUFBUSxNQUFNO0FBQUEsTUFDckIsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEdBQUc7QUFBQSxRQUN4QixNQUFNLElBQUksTUFBTSxpQ0FBaUMsc0JBQXNCLE1BQU07QUFBQSxNQUNqRjtBQUFBLElBQ0o7QUFBQTtBQUFBLFNBR0csTUFBTSxDQUFDLGNBQXNCLE1BQXdCO0FBQUEsSUFDeEQsV0FBVyxTQUFTLFdBQVcsSUFBSTtBQUFBLElBQ25DLE9BQU8sR0FBRyxhQUFhLEtBQUssS0FBSyxHQUFHO0FBQUE7QUFBQSxTQUdqQyxPQUFPLENBQUMsS0FBeUI7QUFBQSxJQUNwQyxNQUFNLFlBQVksSUFBSSxRQUFRLEdBQUc7QUFBQSxJQUNqQyxJQUFJLGNBQWMsSUFBSTtBQUFBLE1BQ2xCLE1BQU0sSUFBSSxNQUFNLHNDQUFzQyxLQUFLO0FBQUEsSUFDL0Q7QUFBQSxJQUNBLElBQUksSUFBSSxRQUFRLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSTtBQUFBLE1BQ3hDLE1BQU0sSUFBSSxNQUFNLDZDQUE2QyxLQUFLO0FBQUEsSUFDdEU7QUFBQSxJQUNBLE1BQU0sWUFBWSxJQUFJLE1BQU0sR0FBRyxTQUFTO0FBQUEsSUFDeEMsTUFBTSxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFBQSxJQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU07QUFBQSxNQUNyQixNQUFNLElBQUksTUFBTSxpREFBaUQ7QUFBQSxJQUNyRTtBQUFBLElBQ0EsT0FBTyxJQUFJLFdBQVcsV0FBVyxHQUFHLEtBQUssTUFBTSxHQUFHLENBQUM7QUFBQTtBQUFBLFNBR3pDLE9BQU8sQ0FBQyxLQUErQjtBQUFBLElBQ2pELE1BQU0sWUFBWSxJQUFJLElBQUksR0FBRztBQUFBLElBQzdCLE1BQU0sWUFBWSxXQUFXLGlCQUFpQixVQUFVLElBQUk7QUFBQSxJQUM1RCxNQUFNLE9BQU8sVUFBVSxTQUFTLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRztBQUFBLElBQ2xELE9BQU8sSUFBSSxXQUFXLFdBQVcsR0FBRyxJQUFJO0FBQUE7QUFBQSxTQUc5QixnQkFBZ0IsQ0FBQyxLQUEyQjtBQUFBLElBQ3RELE1BQU0sU0FBUyxJQUFJLElBQUksR0FBRztBQUFBLElBQzFCLE9BQU8sT0FBTyxTQUFTLE1BQU0sR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEdBQUc7QUFBQTtBQUFBLEVBR2pELE1BQU0sR0FBVztBQUFBLElBQ3BCLE9BQU8sS0FBSyxJQUFJO0FBQUE7QUFBQSxTQUdiLFFBQVEsQ0FBQyxNQUEwQjtBQUFBLElBQ3RDLE9BQU8sV0FBVyxRQUFRLElBQUk7QUFBQTtBQUFBLEVBRzNCLEdBQUcsR0FBVztBQUFBLElBQ2pCLE9BQU8sV0FBVyxPQUFPLEtBQUssV0FBVyxHQUFHLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFHbEQsT0FBTyxDQUFDLE9BQTRCO0FBQUEsSUFDdkMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLElBQUk7QUFBQTtBQUFBLEVBRzdCLGdCQUFnQixDQUFDLE9BQTRCO0FBQUEsSUFDaEQsT0FBTyxLQUFLLGNBQWMsTUFBTTtBQUFBO0FBQUEsRUFHN0IsV0FBVyxDQUFDLE9BQTRCO0FBQUEsSUFDM0MsSUFBSSxLQUFLLGNBQWMsTUFBTSxXQUFXO0FBQUEsTUFDcEMsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLElBQUksS0FBSyxLQUFLLFNBQVMsTUFBTSxLQUFLLFFBQVE7QUFBQSxNQUN0QyxPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsU0FBUyxJQUFJLEVBQUcsSUFBSSxNQUFNLEtBQUssUUFBUSxLQUFLO0FBQUEsTUFDeEMsSUFBSSxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssSUFBSTtBQUFBLFFBQ2hDLE9BQU87QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHSixJQUFJLElBQUksTUFBNEI7QUFBQSxJQUN2QyxPQUFPLElBQUksV0FBVyxLQUFLLFdBQVcsR0FBRyxLQUFLLE1BQU0sR0FBRyxJQUFJO0FBQUE7QUFFbkU7QUFBQTtBQUVPLE1BQU0sY0FBaUI7QUFBQSxFQUNULE1BQXNCLElBQUk7QUFBQSxFQUMzQyxXQUFXLENBQ1AsU0FDRjtBQUFBLElBQ0UsSUFBSSxDQUFDO0FBQUEsTUFBUztBQUFBLElBQ2QsWUFBWSxJQUFJLFVBQVUsU0FBUztBQUFBLE1BQy9CLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUs7QUFBQSxJQUNoQztBQUFBO0FBQUEsTUFHTyxJQUFJLEdBQVc7QUFBQSxJQUN0QixPQUFPLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFHYixHQUFHLENBQUMsWUFBd0IsT0FBZ0I7QUFBQSxJQUMvQyxLQUFLLElBQUksSUFBSSxXQUFXLElBQUksR0FBRyxLQUFLO0FBQUE7QUFBQSxFQUdqQyxHQUFHLENBQUMsWUFBdUM7QUFBQSxJQUM5QyxPQUFPLEtBQUssSUFBSSxJQUFJLFdBQVcsSUFBSSxDQUFDO0FBQUE7QUFBQSxFQUdqQyxHQUFHLENBQUMsWUFBaUM7QUFBQSxJQUN4QyxPQUFPLEtBQUssSUFBSSxJQUFJLFdBQVcsSUFBSSxDQUFDO0FBQUE7QUFBQSxFQUdqQyxNQUFNLENBQUMsWUFBOEI7QUFBQSxJQUN4QyxLQUFLLElBQUksT0FBTyxXQUFXLElBQUksQ0FBQztBQUFBO0FBQUEsRUFHN0IsS0FBSyxHQUFTO0FBQUEsSUFDakIsS0FBSyxJQUFJLE1BQU07QUFBQTtBQUFBLEdBR1gsSUFBSSxHQUFpQztBQUFBLElBQ3pDLFdBQVcsT0FBTyxLQUFLLElBQUksS0FBSyxHQUFHO0FBQUEsTUFDL0IsTUFBTSxXQUFXLFFBQVEsR0FBRztBQUFBLElBQ2hDO0FBQUE7QUFBQSxFQUdHLE1BQU0sR0FBd0I7QUFBQSxJQUNqQyxPQUFPLEtBQUssSUFBSSxPQUFPO0FBQUE7QUFBQSxHQUduQixPQUFPLEdBQXNDO0FBQUEsSUFDakQsWUFBWSxLQUFLLFVBQVUsS0FBSyxJQUFJLFFBQVEsR0FBRztBQUFBLE1BQzNDLE1BQU0sQ0FBQyxXQUFXLFFBQVEsR0FBRyxHQUFHLEtBQUs7QUFBQSxJQUN6QztBQUFBO0FBQUEsR0FHSSxPQUFPLFNBQVMsR0FBc0M7QUFBQSxJQUMxRCxPQUFPLEtBQUssUUFBUTtBQUFBO0FBRTVCO0FBQUE7QUFFTyxNQUFNLGNBQWM7QUFBQSxFQUNOLE1BQW1CLElBQUk7QUFBQSxNQUU3QixJQUFJLEdBQVc7QUFBQSxJQUN0QixPQUFPLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFHYixHQUFHLENBQUMsWUFBOEI7QUFBQSxJQUNyQyxLQUFLLElBQUksSUFBSSxXQUFXLElBQUksQ0FBQztBQUFBO0FBQUEsRUFHMUIsR0FBRyxDQUFDLFlBQWlDO0FBQUEsSUFDeEMsT0FBTyxLQUFLLElBQUksSUFBSSxXQUFXLElBQUksQ0FBQztBQUFBO0FBQUEsRUFHakMsTUFBTSxDQUFDLFlBQThCO0FBQUEsSUFDeEMsS0FBSyxJQUFJLE9BQU8sV0FBVyxJQUFJLENBQUM7QUFBQTtBQUFBLEVBRzdCLEtBQUssR0FBUztBQUFBLElBQ2pCLEtBQUssSUFBSSxNQUFNO0FBQUE7QUFBQSxHQUdYLElBQUksR0FBaUM7QUFBQSxJQUN6QyxXQUFXLE9BQU8sS0FBSyxJQUFJLEtBQUssR0FBRztBQUFBLE1BQy9CLE1BQU0sV0FBVyxRQUFRLEdBQUc7QUFBQSxJQUNoQztBQUFBO0FBQUEsRUFHRyxNQUFNLEdBQWlDO0FBQUEsSUFDMUMsT0FBTyxLQUFLLEtBQUs7QUFBQTtBQUFBLEdBR2IsT0FBTyxHQUErQztBQUFBLElBQzFELFdBQVcsT0FBTyxLQUFLLElBQUksS0FBSyxHQUFHO0FBQUEsTUFDL0IsTUFBTSxhQUFhLFdBQVcsUUFBUSxHQUFHO0FBQUEsTUFDekMsTUFBTSxDQUFDLFlBQVksVUFBVTtBQUFBLElBQ2pDO0FBQUE7QUFBQSxHQUdJLE9BQU8sU0FBUyxHQUErQztBQUFBLElBQ25FLE9BQU8sS0FBSyxRQUFRO0FBQUE7QUFFNUI7OztBQ3pOTyxNQUFNLElBQUk7QUFBQSxFQUNHO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFFaEIsV0FBVyxDQUFDLElBQVksU0FPckI7QUFBQSxJQUNDLEtBQUssS0FBSyxXQUFXLEtBQUssRUFBRTtBQUFBLElBQzVCLEtBQUssV0FBVyxXQUFXLGFBQWEsUUFBUSxRQUFRO0FBQUEsSUFDeEQsS0FBSyxVQUFVLFFBQVE7QUFBQSxJQUN2QixLQUFLLE1BQU0sUUFBUTtBQUFBLElBQ25CLEtBQUssV0FBVyxRQUFRO0FBQUEsSUFDeEIsS0FBSyxPQUFPLFFBQVEsUUFBUTtBQUFBLElBQzVCLEtBQUssZUFBZSxRQUFRLGdCQUFnQixDQUFDO0FBQUE7QUFBQSxTQUduQyxXQUFXLENBQUMsTUFBb0I7QUFBQSxJQUMxQyxNQUFNLEtBQUssV0FBVyxRQUFRLEtBQUssRUFBRTtBQUFBLElBQ3JDLE9BQU8sSUFBSSxJQUFJLElBQUk7QUFBQSxNQUNmLFVBQVUsV0FBVyxhQUFhLEtBQUssU0FBUztBQUFBLE1BQ2hELFNBQVMsS0FBSztBQUFBLE1BQ2QsS0FBSyxLQUFLO0FBQUEsTUFDVixNQUFNLEtBQUs7QUFBQSxNQUNYLFVBQVUsS0FBSztBQUFBLE1BQ2YsY0FBYyxLQUFLLGdCQUFnQixDQUFDO0FBQUEsSUFDeEMsQ0FBQztBQUFBO0FBQUEsU0FHUyxTQUFTLENBQUMsTUFBb0I7QUFBQSxJQUN4QyxPQUFPO0FBQUEsTUFDSCxJQUFJLEtBQUssR0FBRyxJQUFJO0FBQUEsTUFDaEIsTUFBTSxLQUFLO0FBQUEsTUFDWCxXQUFXLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDOUIsU0FBUyxLQUFLO0FBQUEsTUFDZCxLQUFLLEtBQUs7QUFBQSxNQUNWLFVBQVUsS0FBSztBQUFBLE1BQ2YsY0FBYyxLQUFLO0FBQUEsSUFDdkI7QUFBQTtBQUFBLEVBR0csSUFBSSxJQUFJLE9BQXNCO0FBQUEsSUFDakMsT0FBTyxJQUFJLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUc7QUFBQSxNQUNuQyxVQUFVLEtBQUs7QUFBQSxNQUNmLFNBQVMsS0FBSztBQUFBLE1BQ2QsS0FBSyxLQUFLO0FBQUEsTUFDVixNQUFNLEtBQUs7QUFBQSxNQUNYLFVBQVUsS0FBSztBQUFBLE1BQ2YsY0FBYyxLQUFLO0FBQUEsSUFDdkIsQ0FBQztBQUFBO0FBRVQ7OztBQzlGTyxJQUFNLGNBQTJCLElBQUk7QUFDckMsSUFBTSxjQUEyQixJQUFJOzs7QUNFckMsTUFBTSxNQUFNO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxFQUVSLFdBQVcsQ0FBQyxTQUE4QztBQUFBLElBQ3RELEtBQUssUUFBUSxRQUFRLFNBQVM7QUFBQSxJQUM5QixLQUFLLFNBQVMsUUFBUSxVQUFVO0FBQUE7QUFBQSxFQUc3QixHQUFHLENBQUMsVUFBMkI7QUFBQSxJQUNsQyxRQUFRLEtBQUssUUFBUyxLQUFLLGNBQWU7QUFBQTtBQUFBLEVBR3ZDLEdBQUcsQ0FBQyxVQUEyQjtBQUFBLElBQ2xDLFFBQVEsS0FBSyxRQUFTLEtBQUssY0FBZTtBQUFBO0FBQUEsRUFHdkMsS0FBUSxDQUFDLFVBQWtCLFVBQWtDO0FBQUEsSUFDaEUsSUFBSSxLQUFLLElBQUksUUFBUSxHQUFHO0FBQUEsTUFDcEIsT0FBTyxTQUFTO0FBQUEsSUFDcEI7QUFBQSxJQUNBO0FBQUE7QUFBQSxFQUdHLEdBQUcsQ0FBQyxVQUFrQixPQUFzQjtBQUFBLElBQy9DLElBQUksT0FBTztBQUFBLE1BQ1AsS0FBSyxTQUFTLEtBQUs7QUFBQSxJQUN2QixFQUFPO0FBQUEsTUFDSCxLQUFLLFNBQVMsRUFBRSxLQUFLO0FBQUE7QUFBQTtBQUFBLEVBSXRCLEtBQUssQ0FBQyxRQUEwQjtBQUFBLElBQ25DLE1BQU0sT0FBTyxJQUFJLFlBQVksS0FBSyxTQUFTLEtBQUssQ0FBQztBQUFBLElBQ2pELFNBQVMsSUFBSSxFQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFBQSxNQUNsQyxLQUFLLEtBQU0sS0FBSyxTQUFVLElBQUksSUFBTTtBQUFBLElBQ3hDO0FBQUEsSUFDQSxPQUFPLE1BQU0sSUFBSTtBQUFBO0FBQUEsU0FHUCxJQUFJLENBQUMsUUFBb0IsUUFBdUI7QUFBQSxJQUMxRCxJQUFJLFFBQVE7QUFBQSxJQUNaLFNBQVMsSUFBSSxFQUFHLEtBQUssU0FBUyxLQUFLLEdBQUcsS0FBSztBQUFBLE1BQ3ZDLFNBQVMsT0FBTyxVQUFVLEtBQU0sSUFBSTtBQUFBLElBQ3hDO0FBQUEsSUFDQSxPQUFPLElBQUksTUFBTSxFQUFFLE9BQU8sT0FBTyxDQUFDO0FBQUE7QUFFMUM7QUFFQSxTQUFTLFdBQVcsQ0FBQyxVQUFvQixRQUF3QjtBQUFBLEVBQzdELE1BQU0sT0FBUSxTQUFTLFVBQVUsTUFBTSxJQUFJLFFBQVUsS0FBSztBQUFBLEVBQzFELE1BQU0sWUFBWSxTQUFTLFVBQVUsTUFBTSxJQUFJLFVBQVc7QUFBQSxFQUMxRCxNQUFNLFdBQVksU0FBUyxVQUFVLE1BQU0sSUFBSTtBQUFBLEVBQy9DLElBQUksYUFBYSxLQUFLLGFBQWEsR0FBRztBQUFBLElBQ2xDLE9BQU87QUFBQSxFQUNYLEVBQU8sU0FBSSxhQUFhLElBQU07QUFBQSxJQUMxQixPQUFPLGFBQWEsSUFBSSxXQUFXLE9BQU87QUFBQSxFQUM5QyxFQUFPO0FBQUEsSUFDSCxNQUFNLHFCQUFxQixXQUFXO0FBQUEsSUFDdEMsTUFBTSxxQkFBcUIsV0FBVztBQUFBLElBQ3RDLE9BQU8sT0FBTyxLQUFLLElBQUksR0FBRyxrQkFBa0IsS0FBSyxJQUFJO0FBQUE7QUFBQTtBQUk3RCxTQUFTLFlBQVksQ0FBQyxVQUFvQixRQUFnQixPQUFxQjtBQUFBLEVBQzNFLElBQUksVUFBVSxHQUFHO0FBQUEsSUFDYixTQUFTLFVBQVUsUUFBUSxDQUFDO0FBQUEsSUFDNUI7QUFBQSxFQUNKO0FBQUEsRUFDQSxNQUFNLE9BQU8sUUFBUSxJQUFJLElBQUk7QUFBQSxFQUM3QixRQUFRLEtBQUssSUFBSSxLQUFLO0FBQUEsRUFDdEIsSUFBSSxDQUFDLFNBQVMsS0FBSyxHQUFHO0FBQUEsSUFDbEIsU0FBUyxVQUFVLFFBQVEsUUFBVSxRQUFRLEVBQUc7QUFBQSxJQUNoRDtBQUFBLEVBQ0o7QUFBQSxFQUNBLE1BQU0sV0FBVyxLQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUssQ0FBQztBQUFBLEVBQzVDLE1BQU0sV0FBVyxRQUFRLEtBQUssSUFBSSxHQUFHLFFBQVEsSUFBSTtBQUFBLEVBQ2pELE1BQU0scUJBQXFCLFdBQVc7QUFBQSxFQUN0QyxNQUFNLHFCQUFxQixLQUFLLE1BQU0sV0FBVyxJQUFJO0FBQUEsRUFDckQsSUFBSSxzQkFBc0IsR0FBRztBQUFBLElBQ3pCLFNBQVMsVUFBVSxRQUFRLFFBQVEsRUFBRTtBQUFBLEVBQ3pDLEVBQU8sU0FBSSxzQkFBc0IsSUFBTTtBQUFBLElBQ25DLFNBQVMsVUFBVSxRQUFRLFFBQVUsUUFBUSxFQUFHO0FBQUEsRUFDcEQsRUFBTztBQUFBLElBQ0gsU0FBUyxVQUFVLFFBQVMsUUFBUSxLQUFPLHNCQUFzQixLQUFNLGtCQUFrQjtBQUFBO0FBQUE7QUFBQTtBQUkxRixNQUFNLFdBQVc7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLEVBQ0EsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBRW5CLFdBQVcsQ0FBQyxNQUFvQixRQUFpQjtBQUFBLElBQzdDLEtBQUssU0FBUyxVQUFVO0FBQUEsSUFDeEIsS0FBSyxTQUFTLFFBQVEsSUFBSSxZQUFZLElBQUk7QUFBQSxJQUMxQyxLQUFLLFdBQVcsSUFBSSxTQUFTLEtBQUssTUFBTTtBQUFBO0FBQUEsU0FHOUIsY0FBYyxDQUFDLFFBQWdDO0FBQUEsSUFDekQsTUFBTSxjQUFjLElBQUksWUFBWSxPQUFPLFVBQVU7QUFBQSxJQUNyRCxNQUFNLGFBQWEsSUFBSSxXQUFXLFdBQVc7QUFBQSxJQUM3QyxXQUFXLElBQUksSUFBSSxXQUFXLE1BQU0sQ0FBQztBQUFBLElBQ3JDLE9BQU8sSUFBSSxXQUFXLGFBQWEsT0FBTyxVQUFVO0FBQUE7QUFBQSxFQUdoRCxRQUFRLENBQUMsUUFBc0I7QUFBQSxJQUNuQyxJQUFJLEtBQUssU0FBUyxTQUFTLEtBQUssT0FBTyxZQUFZO0FBQUEsTUFDL0MsTUFBTSxnQkFBZ0IsS0FBSyxJQUFJLEtBQUssT0FBTyxhQUFhLEdBQUcsS0FBSyxTQUFTLE1BQU07QUFBQSxNQUMvRSxNQUFNLFlBQVksSUFBSSxZQUFZLGFBQWE7QUFBQSxNQUMvQyxJQUFJLFdBQVcsU0FBUyxFQUFFLElBQUksSUFBSSxXQUFXLEtBQUssTUFBTSxDQUFDO0FBQUEsTUFDekQsS0FBSyxTQUFTO0FBQUEsTUFDZCxLQUFLLFdBQVcsSUFBSSxTQUFTLEtBQUssTUFBTTtBQUFBLElBQzVDO0FBQUE7QUFBQSxFQUdHLEtBQUssQ0FBQyxNQUE4QjtBQUFBLElBQ3ZDLElBQUksS0FBSyxVQUFVO0FBQUEsTUFDZixNQUFNLElBQUksTUFBTSx5QkFBeUI7QUFBQSxJQUM3QztBQUFBLElBQ0EsS0FBSyxTQUFTLEtBQUssTUFBTTtBQUFBLElBQ3pCLElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sS0FBSyxNQUFNO0FBQUEsSUFDakQsS0FBSyxVQUFVLEtBQUs7QUFBQSxJQUNwQixPQUFPO0FBQUE7QUFBQSxFQUdKLFlBQVksQ0FBQyxPQUE0QjtBQUFBLElBQzVDLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDZixLQUFLLFNBQVMsUUFBUSxLQUFLLFFBQVEsUUFBUSxJQUFJLENBQUM7QUFBQSxJQUNoRCxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osU0FBUyxDQUFDLE9BQTJCO0FBQUEsSUFDeEMsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNmLEtBQUssU0FBUyxRQUFRLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDeEMsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFVBQVUsQ0FBQyxPQUEyQjtBQUFBLElBQ3pDLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDZixLQUFLLFNBQVMsU0FBUyxLQUFLLFFBQVEsS0FBSztBQUFBLElBQ3pDLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixVQUFVLENBQUMsT0FBMkI7QUFBQSxJQUN6QyxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ2YsS0FBSyxTQUFTLFNBQVMsS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUN6QyxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osV0FBVyxDQUFDLE9BQTJCO0FBQUEsSUFDMUMsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNmLEtBQUssU0FBUyxVQUFVLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDMUMsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFVBQVUsQ0FBQyxPQUEyQjtBQUFBLElBQ3pDLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDZixLQUFLLFNBQVMsU0FBUyxLQUFLLFFBQVEsS0FBSztBQUFBLElBQ3pDLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixXQUFXLENBQUMsT0FBMkI7QUFBQSxJQUMxQyxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ2YsS0FBSyxTQUFTLFVBQVUsS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUMxQyxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osVUFBVSxDQUFDLE9BQTJCO0FBQUEsSUFDekMsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNmLEtBQUssU0FBUyxZQUFZLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDNUMsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFdBQVcsQ0FBQyxPQUEyQjtBQUFBLElBQzFDLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDZixLQUFLLFNBQVMsYUFBYSxLQUFLLFFBQVEsS0FBSztBQUFBLElBQzdDLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixZQUFZLENBQUMsT0FBMkI7QUFBQSxJQUUzQyxJQUFJLFFBQVEsR0FBRztBQUFBLE1BQ1gsTUFBTSxJQUFJLE1BQU0sNEJBQTRCO0FBQUEsSUFDaEQ7QUFBQSxJQUNBLE9BQU8sUUFBUSxLQUFNO0FBQUEsTUFDakIsS0FBSyxTQUFTLENBQUM7QUFBQSxNQUNmLEtBQUssU0FBUyxTQUFTLEtBQUssUUFBUyxRQUFRLE1BQVEsR0FBSTtBQUFBLE1BQ3pELEtBQUssVUFBVTtBQUFBLE1BQ2YsVUFBVTtBQUFBLElBQ2Q7QUFBQSxJQUNBLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDZixLQUFLLFNBQVMsU0FBUyxLQUFLLFFBQVEsUUFBUSxHQUFJO0FBQUEsSUFDaEQsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFlBQVksQ0FBQyxPQUEyQjtBQUFBLElBQzNDLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDZixhQUFhLEtBQUssVUFBVSxLQUFLLFFBQVEsS0FBSztBQUFBLElBQzlDLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixZQUFZLENBQUMsT0FBMkI7QUFBQSxJQUMzQyxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ2YsS0FBSyxTQUFTLFdBQVcsS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUMzQyxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osWUFBWSxDQUFDLE9BQTJCO0FBQUEsSUFDM0MsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNmLEtBQUssU0FBUyxXQUFXLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDM0MsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLGVBQWUsQ0FBQyxPQUErQjtBQUFBLElBQ2xELEtBQUssYUFBYSxNQUFNLFVBQVU7QUFBQSxJQUNsQyxLQUFLLE1BQU0sS0FBSztBQUFBLElBQ2hCLE9BQU87QUFBQTtBQUFBLEVBR0osV0FBVyxDQUFDLE9BQTJCO0FBQUEsSUFDMUMsS0FBSyxnQkFBZ0IsWUFBWSxPQUFPLEtBQUssQ0FBQztBQUFBLElBQzlDLE9BQU87QUFBQTtBQUFBLEVBR0osU0FBUyxDQUFDLE9BQTZCO0FBQUEsSUFDMUMsS0FBSyxZQUFZLEtBQUssVUFBVSxLQUFLLENBQUM7QUFBQSxJQUN0QyxPQUFPO0FBQUE7QUFBQSxFQUdKLFVBQVUsQ0FBQyxPQUEwQjtBQUFBLElBQ3hDLE1BQU0sTUFBTSxJQUFJO0FBQUEsSUFDaEIsT0FBTztBQUFBO0FBQUEsRUFHSixNQUFNLEdBQWU7QUFBQSxJQUN4QixJQUFJLEtBQUssVUFBVTtBQUFBLE1BQ2YsTUFBTSxJQUFJLE1BQU0seUJBQXlCO0FBQUEsSUFDN0M7QUFBQSxJQUNBLEtBQUssV0FBVztBQUFBLElBQ2hCLE9BQU8sSUFBSSxXQUFXLEtBQUssUUFBUSxHQUFHLEtBQUssTUFBTTtBQUFBO0FBRXpEO0FBQUE7QUFFTyxNQUFNLFdBQVc7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVBLFdBQVcsQ0FBQyxNQUFnQjtBQUFBLElBQ2hDLEtBQUssV0FBVztBQUFBLElBQ2hCLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxXQUFXO0FBQUE7QUFBQSxTQUdOLGNBQWMsQ0FBQyxRQUFnQztBQUFBLElBQ3pELE1BQU0sY0FBYyxJQUFJLFlBQVksT0FBTyxVQUFVO0FBQUEsSUFDckQsTUFBTSxhQUFhLElBQUksV0FBVyxXQUFXO0FBQUEsSUFDN0MsV0FBVyxJQUFJLElBQUksV0FBVyxNQUFNLENBQUM7QUFBQSxJQUNyQyxNQUFNLFdBQVcsSUFBSSxTQUFTLFdBQVc7QUFBQSxJQUN6QyxPQUFPLElBQUksV0FBVyxRQUFRO0FBQUE7QUFBQSxTQUdwQixlQUFlLENBQUMsUUFBaUM7QUFBQSxJQUMzRCxNQUFNLFdBQVcsSUFBSSxTQUFTLE1BQU07QUFBQSxJQUNwQyxPQUFPLElBQUksV0FBVyxRQUFRO0FBQUE7QUFBQSxjQUdkLFNBQVEsQ0FBQyxNQUFpQztBQUFBLElBQzFELE1BQU0sY0FBYyxNQUFNLEtBQUssWUFBWTtBQUFBLElBQzNDLE1BQU0sV0FBVyxJQUFJLFNBQVMsV0FBVztBQUFBLElBQ3pDLE9BQU8sSUFBSSxXQUFXLFFBQVE7QUFBQTtBQUFBLEVBRzNCLElBQUksQ0FBQyxNQUEwQjtBQUFBLElBQ2xDLElBQUksS0FBSyxVQUFVO0FBQUEsTUFDZixNQUFNLElBQUksTUFBTSx5QkFBeUI7QUFBQSxJQUM3QztBQUFBLElBQ0EsSUFBSSxPQUFPLEdBQUc7QUFBQSxNQUNWLE1BQU0sSUFBSSxNQUFNLHVCQUF1QjtBQUFBLElBQzNDO0FBQUEsSUFDQSxJQUFJLEtBQUssU0FBUyxPQUFPLEtBQUssU0FBUyxZQUFZO0FBQUEsTUFDL0MsTUFBTSxJQUFJLE1BQU0sdUJBQXVCO0FBQUEsSUFDM0M7QUFBQSxJQUNBLE1BQU0sUUFBUSxJQUFJLFdBQVcsS0FBSyxTQUFTLFFBQVEsS0FBSyxRQUFRLElBQUk7QUFBQSxJQUNwRSxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osV0FBVyxHQUFZO0FBQUEsSUFDMUIsTUFBTSxRQUFRLEtBQUssU0FBUyxRQUFRLEtBQUssTUFBTTtBQUFBLElBQy9DLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTyxVQUFVO0FBQUE7QUFBQSxFQUdkLFFBQVEsR0FBVztBQUFBLElBQ3RCLE1BQU0sUUFBUSxLQUFLLFNBQVMsUUFBUSxLQUFLLE1BQU07QUFBQSxJQUMvQyxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osU0FBUyxHQUFXO0FBQUEsSUFDdkIsTUFBTSxRQUFRLEtBQUssU0FBUyxTQUFTLEtBQUssTUFBTTtBQUFBLElBQ2hELEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixTQUFTLEdBQVc7QUFBQSxJQUN2QixNQUFNLFFBQVEsS0FBSyxTQUFTLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDaEQsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFVBQVUsR0FBVztBQUFBLElBQ3hCLE1BQU0sUUFBUSxLQUFLLFNBQVMsVUFBVSxLQUFLLE1BQU07QUFBQSxJQUNqRCxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osU0FBUyxHQUFXO0FBQUEsSUFDdkIsTUFBTSxRQUFRLEtBQUssU0FBUyxTQUFTLEtBQUssTUFBTTtBQUFBLElBQ2hELEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixVQUFVLEdBQVc7QUFBQSxJQUN4QixNQUFNLFFBQVEsS0FBSyxTQUFTLFVBQVUsS0FBSyxNQUFNO0FBQUEsSUFDakQsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFNBQVMsR0FBVztBQUFBLElBQ3ZCLE1BQU0sUUFBUSxLQUFLLFNBQVMsWUFBWSxLQUFLLE1BQU07QUFBQSxJQUNuRCxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osVUFBVSxHQUFXO0FBQUEsSUFDeEIsTUFBTSxRQUFRLEtBQUssU0FBUyxhQUFhLEtBQUssTUFBTTtBQUFBLElBQ3BELEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixXQUFXLEdBQVc7QUFBQSxJQUV6QixJQUFJLFFBQVE7QUFBQSxJQUNaLElBQUksUUFBUTtBQUFBLElBQ1osSUFBSTtBQUFBLElBQ0osR0FBRztBQUFBLE1BQ0MsSUFBSSxLQUFLLFVBQVUsS0FBSyxTQUFTLFlBQVk7QUFBQSxRQUN6QyxNQUFNLElBQUksTUFBTSx1QkFBdUI7QUFBQSxNQUMzQztBQUFBLE1BQ0EsT0FBTyxLQUFLLFNBQVMsU0FBUyxLQUFLLE1BQU07QUFBQSxNQUN6QyxLQUFLLFVBQVU7QUFBQSxNQUNmLFVBQVUsT0FBTyxRQUFlO0FBQUEsTUFDaEMsU0FBUztBQUFBLElBQ2IsVUFDUSxPQUFPLFNBQWdCO0FBQUEsSUFDL0IsT0FBTztBQUFBO0FBQUEsRUFHSixXQUFXLEdBQVc7QUFBQSxJQUN6QixNQUFNLFFBQVEsWUFBWSxLQUFLLFVBQVUsS0FBSyxNQUFNO0FBQUEsSUFDcEQsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFdBQVcsR0FBVztBQUFBLElBQ3pCLE1BQU0sUUFBUSxLQUFLLFNBQVMsV0FBVyxLQUFLLE1BQU07QUFBQSxJQUNsRCxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osV0FBVyxHQUFXO0FBQUEsSUFDekIsTUFBTSxRQUFRLEtBQUssU0FBUyxXQUFXLEtBQUssTUFBTTtBQUFBLElBQ2xELEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixjQUFjLEdBQWU7QUFBQSxJQUNoQyxNQUFNLFNBQVMsS0FBSyxZQUFZO0FBQUEsSUFDaEMsT0FBTyxLQUFLLEtBQUssTUFBTTtBQUFBO0FBQUEsRUFHcEIsVUFBVSxHQUFXO0FBQUEsSUFDeEIsTUFBTSxZQUFZLEtBQUssZUFBZTtBQUFBLElBQ3RDLE9BQU8sWUFBWSxPQUFPLFNBQVM7QUFBQTtBQUFBLEVBR2hDLFFBQTRCLEdBQU07QUFBQSxJQUNyQyxPQUFPLEtBQUssTUFBTSxLQUFLLFdBQVcsQ0FBQztBQUFBO0FBQUEsRUFHaEMsU0FBUyxDQUFDLFFBQXVCO0FBQUEsSUFDcEMsT0FBTyxNQUFNLEtBQUssTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUczQixNQUFNLEdBQVM7QUFBQSxJQUNsQixJQUFJLEtBQUssVUFBVTtBQUFBLE1BQ2YsTUFBTSxJQUFJLE1BQU0seUJBQXlCO0FBQUEsSUFDN0M7QUFBQSxJQUNBLEtBQUssV0FBVztBQUFBLElBQ2hCLElBQUksS0FBSyxXQUFXLEtBQUssU0FBUyxZQUFZO0FBQUEsTUFDMUMsTUFBTSxJQUFJLE1BQU0sdUJBQXVCO0FBQUEsSUFDM0M7QUFBQTtBQUVSOztBQzlaTyxNQUFNLFdBQWlCO0FBQUEsRUFFZjtBQUFBLEVBQ0E7QUFBQSxFQUZYLFdBQVcsQ0FDQSxXQUNBLGFBQ1Q7QUFBQSxJQUZTO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHRyxFQUFRLENBQUMsWUFBa0Q7QUFBQSxJQUNyRSxPQUFPLElBQUksV0FBaUIsV0FBVyxXQUFXLFdBQVcsV0FBVztBQUFBO0FBQUEsU0FHOUQsSUFBYSxDQUFDLE1BQTBCLE1BQThDO0FBQUEsSUFDaEcsT0FBTyxJQUFJLFdBQ1AsQ0FBQyxTQUFTLEtBQUssVUFBVSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQzdDLENBQUMsU0FBUyxLQUFLLFlBQVksS0FBSyxZQUFZLElBQUksQ0FBQyxDQUNyRDtBQUFBO0FBQUEsU0FHVSxTQUFZLENBQUMsTUFBeUM7QUFBQSxJQUNoRSxPQUFPLElBQUksV0FDUCxNQUNBLElBQ0o7QUFBQTtBQUFBLFNBR1UsSUFBTyxHQUFxQjtBQUFBLElBQ3RDLE9BQU8sSUFBSSxXQUNQLENBQUMsU0FBUyxNQUNWLENBQUMsU0FBUyxJQUNkO0FBQUE7QUFBQSxFQUdHLEtBR04sQ0FDRyxLQUNBLFlBSUY7QUFBQSxJQUNFLE9BQU8sSUFBSSxXQUlQLENBQUMsU0FBUztBQUFBLE1BQ04sTUFBTSxhQUFhLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDdEMsT0FBTztBQUFBLFdBQ0E7QUFBQSxTQUNGLE1BQU0sV0FBVyxVQUFVLFdBQVcsSUFBSTtBQUFBLE1BQy9DO0FBQUEsT0FFSixDQUFDLFNBQVM7QUFBQSxNQUNOLE9BQU8sS0FBSyxZQUFZO0FBQUEsV0FDakI7QUFBQSxTQUNGLE1BQU0sV0FBVyxZQUFZLEtBQUssSUFBUztBQUFBLE1BQ2hELENBQU07QUFBQSxLQUVkO0FBQUE7QUFBQSxTQUdHLElBQXdCLEdBQThCO0FBQUEsSUFDekQsT0FBTyxJQUFJLFdBQ1AsQ0FBQyxTQUFTLFlBQVksT0FBTyxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQ2pELENBQUMsU0FBUztBQUFBLE1BQ04sTUFBTSxPQUFPLFlBQVksT0FBTyxJQUFJO0FBQUEsTUFDcEMsT0FBTyxLQUFLLE1BQU0sSUFBSTtBQUFBLEtBRTlCO0FBQUE7QUFBQSxFQUdHLE1BQU0sR0FBOEI7QUFBQSxJQUN2QyxPQUFPLElBQUksV0FDUCxDQUFDLFNBQVMsWUFBWSxPQUFPLEtBQUssVUFBVSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsR0FDakUsQ0FBQyxTQUFTO0FBQUEsTUFDTixNQUFNLE9BQU8sWUFBWSxPQUFPLElBQUk7QUFBQSxNQUNwQyxPQUFPLEtBQUssWUFBWSxLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQUEsS0FFaEQ7QUFBQTtBQUFBLEVBR0csT0FBTyxHQUF5QjtBQUFBLElBQ25DLE9BQU8sSUFBSSxXQUNQLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxJQUFJLENBQUMsR0FDakQsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUN2RDtBQUFBO0FBQUEsRUFHRyxLQUFLLEdBQStDO0FBQUEsSUFDdkQsT0FBTyxJQUFJLFdBQ1AsQ0FBQyxTQUFTO0FBQUEsTUFDTixNQUFNLFNBQVMsSUFBSTtBQUFBLE1BQ25CLEtBQUssUUFBUSxDQUFDLE9BQU8sUUFBUTtBQUFBLFFBQ3pCLE9BQU8sSUFBSSxLQUFLLEtBQUssVUFBVSxLQUFLLENBQUM7QUFBQSxPQUN4QztBQUFBLE1BQ0QsT0FBTztBQUFBLE9BRVgsQ0FBQyxTQUFTO0FBQUEsTUFDTixNQUFNLFNBQVMsSUFBSTtBQUFBLE1BQ25CLEtBQUssUUFBUSxDQUFDLE9BQU8sUUFBUTtBQUFBLFFBQ3pCLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxLQUFLLENBQUM7QUFBQSxPQUMxQztBQUFBLE1BQ0QsT0FBTztBQUFBLEtBRWY7QUFBQTtBQUFBLEVBR0csUUFBUSxDQUFDLFVBQStCO0FBQUEsSUFDM0MsT0FBTyxJQUFJLFdBQ1AsQ0FBQyxTQUFTLEtBQUssVUFBVSxJQUFJLEdBQzdCLENBQUMsU0FBUztBQUFBLE1BQ04sSUFBSTtBQUFBLFFBQ0EsT0FBTyxLQUFLLFlBQVksSUFBSTtBQUFBLFFBQzlCLE1BQU07QUFBQSxRQUNKLE9BQU87QUFBQTtBQUFBLEtBR25CO0FBQUE7QUFBQSxFQUdHLFdBQVcsQ0FBQyxVQUE0RDtBQUFBLElBQzNFLE9BQU8sSUFBSSxXQUNQLENBQUMsU0FBUyxLQUFLLFVBQVUsSUFBSSxHQUM3QixDQUFDLFNBQVM7QUFBQSxNQUNOLElBQUk7QUFBQSxRQUNBLE9BQU8sS0FBSyxZQUFZLElBQUk7QUFBQSxRQUM5QixPQUFPLE9BQU87QUFBQSxRQUNaLE9BQU8sU0FBUyxNQUFNLEtBQUs7QUFBQTtBQUFBLEtBR3ZDO0FBQUE7QUFBQSxFQUdHLElBQU8sQ0FBQyxZQUFrRDtBQUFBLElBQzdELE9BQU8sSUFBSSxXQUNQLENBQUMsU0FBUyxXQUFXLFVBQVUsS0FBSyxVQUFVLElBQUksQ0FBQyxHQUNuRCxDQUFDLFNBQVMsS0FBSyxZQUFZLFdBQVcsWUFBWSxJQUFJLENBQUMsQ0FDM0Q7QUFBQTtBQUVSOztBQ2pKTyxNQUFNLGFBQTJDO0FBQUEsRUFFaEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUpwQixXQUFXLENBQ1MsSUFDQSxtQkFDQSxvQkFDQSxjQUNsQjtBQUFBLElBSmtCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUE7QUFBQSxTQUdiLFVBQThGLENBQ2pHO0FBQUEsSUFFSTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEtBT2tCO0FBQUEsSUFDdEIsT0FBTyxJQUFJLGFBQ1AsV0FBVyxLQUFLLFVBQVUsRUFBRSxLQUFLLElBQUksR0FDckMsV0FBVyxLQUFnQyxxQkFBcUIsV0FBVyxLQUFLLEdBQUcsV0FBVyxLQUFLLENBQUMsR0FDcEcsV0FBVyxLQUFnQyxzQkFBc0IsV0FBVyxLQUFLLEdBQUcsV0FBVyxLQUFLLENBQUMsR0FDckcsZUFBZSxXQUFXLEtBQUssWUFBWSxJQUFJLFNBQ25EO0FBQUE7QUFBQSxTQUdHLGdCQUEwQixDQUM3QjtBQUFBLElBRUk7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxLQU9rQjtBQUFBLElBQ3RCLE9BQU8sSUFBSSxhQUNQLFdBQVcsS0FBSyxVQUFVLEVBQUUsS0FBSyxJQUFJLEdBQ3JDLG1CQUNBLG9CQUNBLGVBQWUsV0FBVyxLQUFLLFlBQVksSUFBSSxTQUNuRDtBQUFBO0FBRVI7OztBQy9DTyxNQUFNLHNCQUF1RCxXQUFXO0FBQUEsRUFFdkQ7QUFBQSxFQUNBO0FBQUEsRUFGcEIsV0FBVyxDQUNTLE1BQ0EsUUFDbEI7QUFBQSxJQUNFLE1BQU0sT0FBTyxJQUFJO0FBQUEsSUFIRDtBQUFBLElBQ0E7QUFBQTtBQUFBLEVBS2IsR0FBRyxHQUFXO0FBQUEsSUFDakIsT0FBTyxLQUFLO0FBQUE7QUFFcEI7OztBQ2hCTyxNQUFNLGFBQW1DO0FBQUEsRUFDM0IsWUFBeUQsQ0FBQztBQUFBLEVBRXBFLE1BQU0sQ0FBQyxVQUF5QztBQUFBLElBQ25ELEtBQUssVUFBVSxLQUFLLFFBQVE7QUFBQSxJQUM1QixPQUFPLE1BQU07QUFBQSxNQUNULEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxRQUFRLFFBQVEsR0FBRyxDQUFDO0FBQUE7QUFBQTtBQUFBLE9BSXBELEtBQUksSUFBSSxNQUF3QjtBQUFBLElBQ3pDLFdBQVcsWUFBWSxDQUFDLEdBQUcsS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUN4QyxNQUFNLFNBQVMsR0FBRyxJQUFJO0FBQUEsSUFDMUI7QUFBQTtBQUVSOzs7QUNkTyxNQUFNLEtBQUs7QUFBQSxFQUNOLFFBQWtCLENBQUM7QUFBQSxFQUNuQixTQUErQjtBQUFBLEVBRS9CLElBQUksR0FBa0I7QUFBQSxJQUMxQixJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2IsT0FBTyxLQUFLO0FBQUEsSUFDaEI7QUFBQSxJQUNBLEtBQUssU0FBUyxJQUFJLFFBQWMsQ0FBQyxZQUFZO0FBQUEsTUFDekMsTUFBTSxXQUFXLFlBQVk7QUFBQSxRQUN6QixPQUFPLEtBQUssTUFBTSxTQUFTLEdBQUc7QUFBQSxVQUMxQixNQUFNLE9BQU8sS0FBSyxNQUFNLE1BQU07QUFBQSxVQUM5QixJQUFJLE1BQU07QUFBQSxZQUNOLE1BQU0sS0FBSztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxLQUFLLFNBQVM7QUFBQSxRQUNkLFFBQVE7QUFBQTtBQUFBLE1BRVosU0FBUztBQUFBLEtBQ1o7QUFBQSxJQUNELE9BQU8sS0FBSztBQUFBO0FBQUEsT0FHSCxJQUFNLENBQUMsVUFBd0M7QUFBQSxJQUN4RCxNQUFNLFVBQVUsSUFBSSxRQUFXLENBQUMsU0FBUyxXQUFXO0FBQUEsTUFDaEQsTUFBTSxPQUFPLFlBQVk7QUFBQSxRQUNyQixNQUFNLFdBQVUsU0FBUztBQUFBLFFBQ3pCLElBQUk7QUFBQSxVQUNBLFFBQVEsTUFBTSxRQUFPO0FBQUEsVUFDdkIsT0FBTyxRQUFRO0FBQUEsVUFDYixPQUFPLE1BQU07QUFBQTtBQUFBO0FBQUEsTUFHckIsS0FBSyxNQUFNLEtBQUssSUFBSTtBQUFBLEtBQ3ZCO0FBQUEsSUFDRCxNQUFNLEtBQUssS0FBSztBQUFBLElBQ2hCLE9BQU87QUFBQTtBQUVmOzs7QUM3Qk8sTUFBTSxXQUFjO0FBQUEsRUFFSDtBQUFBLEVBQ0E7QUFBQSxFQUZwQixXQUFXLENBQ1MsSUFDQSxZQUNsQjtBQUFBLElBRmtCO0FBQUEsSUFDQTtBQUFBO0FBQUEsRUFHYixHQUFHLENBQUMsTUFBb0I7QUFBQSxJQUMzQixPQUFPO0FBQUEsTUFDSCxNQUFNO0FBQUEsTUFDTjtBQUFBLElBQ0o7QUFBQTtBQUFBLEVBRUcsS0FBSyxDQUFDLFFBQXFDO0FBQUEsSUFDOUMsT0FBTyxPQUFPLFNBQVM7QUFBQTtBQUFBLFNBR3BCLFVBQTRDLENBQUM7QUFBQSxJQUNoRDtBQUFBLElBQ0E7QUFBQSxLQUljO0FBQUEsSUFDZCxPQUFPLElBQUksV0FDUCxXQUFXLEtBQUssSUFBSSxHQUNwQixXQUFXLEtBQXVCLGNBQWMsV0FBVyxLQUFLLEdBQUcsV0FBVyxLQUFLLENBQUMsQ0FDeEY7QUFBQTtBQUFBLFNBR0csZ0JBQW1CLENBQUM7QUFBQSxJQUN2QjtBQUFBLElBQ0E7QUFBQSxLQUljO0FBQUEsSUFDZCxPQUFPLElBQUksV0FDUCxXQUFXLEtBQUssSUFBSSxHQUNwQixVQUNKO0FBQUE7QUFFUjs7O0FDaERBLElBQU0sYUFBYSxJQUFJLFdBQVcsUUFBUSxRQUFRO0FBQUE7QUFtQzNDLE1BQU0sY0FBYztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVoQixXQUFXLENBQUMsU0FLVDtBQUFBLElBQ0MsS0FBSyxXQUFXLFFBQVE7QUFBQSxJQUN4QixLQUFLLE1BQU0sUUFBUTtBQUFBLElBQ25CLEtBQUssUUFBUSxRQUFRO0FBQUEsSUFDckIsS0FBSyxhQUFhLFFBQVEsY0FBYztBQUFBO0FBQUEsU0FHOUIsV0FBVyxDQUFDLE1BQXdDO0FBQUEsSUFDOUQsT0FBTyxJQUFJLGNBQWM7QUFBQSxNQUNyQixVQUFVLEtBQUs7QUFBQSxNQUNmLEtBQUssSUFBSSxZQUFZLEtBQUssR0FBRztBQUFBLE1BQzdCLFlBQVksS0FBSztBQUFBLE1BQ2pCLE9BQU8sS0FBSztBQUFBLElBQ2hCLENBQUM7QUFBQTtBQUFBLFNBR1MsU0FBUyxDQUFDLE1BQXdDO0FBQUEsSUFDNUQsT0FBTztBQUFBLE1BQ0gsVUFBVSxLQUFLO0FBQUEsTUFDZixLQUFLLElBQUksVUFBVSxLQUFLLEdBQUc7QUFBQSxNQUMzQixZQUFZLEtBQUs7QUFBQSxNQUNqQixPQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUFBO0FBRVI7QUF1Qk8sTUFBTSxpQkFBaUI7QUFBQSxFQUNWO0FBQUEsRUFDQTtBQUFBLEVBRWhCLFdBQVcsQ0FBQyxTQUdUO0FBQUEsSUFDQyxLQUFLLE9BQU8sUUFBUTtBQUFBLElBQ3BCLEtBQUssVUFBVSxRQUFRLFdBQVc7QUFBQTtBQUFBLFNBR3hCLFNBQVMsQ0FBQyxNQUE4QztBQUFBLElBQ2xFLE9BQU8sS0FBSyxPQUFPO0FBQUE7QUFBQSxTQUdULFdBQVcsQ0FBQyxNQUE4QztBQUFBLElBQ3BFLE9BQU8saUJBQWlCLFNBQVMsSUFBSTtBQUFBO0FBQUEsU0FHbEMsUUFBUSxDQUFDLE1BQThDO0FBQUEsSUFDMUQsT0FBTyxJQUFJLGlCQUFpQjtBQUFBLE1BQ3hCLE1BQU0sS0FBSztBQUFBLE1BQ1gsU0FBUyxLQUFLO0FBQUEsSUFDbEIsQ0FBQztBQUFBO0FBQUEsRUFHTCxNQUFNLEdBQXlCO0FBQUEsSUFDM0IsT0FBTztBQUFBLE1BQ0gsTUFBTSxLQUFLO0FBQUEsTUFDWCxTQUFTLEtBQUs7QUFBQSxJQUNsQjtBQUFBO0FBRVI7QUFFTyxJQUFNLGVBT1Q7QUFBQSxFQUNBLGFBQWEsV0FBVyxXQUF1QixZQUFZO0FBQUEsSUFDdkQsTUFBTTtBQUFBLEVBQ1YsQ0FBQztBQUFBLEVBQ0QsU0FBUyxXQUFXLFdBQTBCLFlBQVk7QUFBQSxJQUN0RCxNQUFNO0FBQUEsSUFDTixZQUFZO0FBQUEsRUFDaEIsQ0FBQztBQUFBLEVBQ0QsWUFBWSxXQUFXLFdBQTZCLFlBQVk7QUFBQSxJQUM1RCxNQUFNO0FBQUEsSUFDTixZQUFZO0FBQUEsRUFDaEIsQ0FBQztBQUFBLEVBQ0QsT0FBTyxXQUFXLFdBQW1CLFlBQVk7QUFBQSxJQUM3QyxNQUFNO0FBQUEsRUFDVixDQUFDO0FBQUEsRUFDRCxPQUFPLFdBQVcsV0FBc0IsWUFBWTtBQUFBLElBQ2hELE1BQU07QUFBQSxFQUNWLENBQUM7QUFBQSxFQUNELGtCQUFrQixXQUFXLGlCQUE2QixZQUFZO0FBQUEsSUFDbEUsTUFBTTtBQUFBLElBQ04sWUFBWSxXQUFXLEtBQUs7QUFBQSxFQUNoQyxDQUFDO0FBQ0w7O0FDL0pPLE1BQU0sZUFBZTtBQUFBLEVBRUo7QUFBQSxFQUNBO0FBQUEsRUFGcEIsV0FBVyxDQUNTLElBQ0EsT0FDbEI7QUFBQSxJQUZrQjtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQW9DO0FBQUEsSUFDeEQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sYUFBYSxPQUFPLFVBQVUsSUFBSTtBQUFBLElBQ3pDLElBQUksT0FBTyxVQUFVLE1BQU07QUFBQSxNQUN2QixPQUFPLGdCQUFnQixPQUFPLEtBQUs7QUFBQSxJQUN2QztBQUFBLElBQ0EsT0FBTyxPQUFPLE9BQU87QUFBQTtBQUFBLFNBR1gsV0FBVyxDQUFDLE1BQWtDO0FBQUEsSUFDeEQsTUFBTSxTQUFTLFdBQVcsZUFBZSxJQUFJO0FBQUEsSUFDN0MsTUFBTSxLQUFLLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQ2pELE1BQU0sV0FBVyxPQUFPLFlBQVk7QUFBQSxJQUNwQyxNQUFNLFFBQVEsV0FBVyxPQUFPLGVBQWUsSUFBSTtBQUFBLElBQ25ELE9BQU8sSUFBSSxlQUFlLElBQUksS0FBSztBQUFBO0FBRTNDO0FBQUE7QUFPTyxNQUFNLGVBQWU7QUFBQSxFQUVKO0FBQUEsRUFDQTtBQUFBLEVBRnBCLFdBQVcsQ0FDUyxJQUNBLGFBQ2xCO0FBQUEsSUFGa0I7QUFBQSxJQUNBO0FBQUE7QUFBQSxTQUdOLFNBQVMsQ0FBQyxRQUE0QztBQUFBLElBQ2hFLFFBQVEsYUFBYSxVQUFVO0FBQUEsSUFDL0IsT0FBTztBQUFBLE1BQ0gsSUFBSSxPQUFPLEdBQUcsSUFBSTtBQUFBLE1BQ2xCLGFBQWE7QUFBQSxRQUNULEtBQUssTUFBTSxNQUFNLFdBQVcsS0FBSyxNQUFNLEdBQUcsRUFBRSxJQUFJLElBQUk7QUFBQSxRQUNwRCxNQUFNLE1BQU0sT0FBTyxXQUFXLEtBQUssTUFBTSxJQUFJLEVBQUUsSUFBSSxJQUFJO0FBQUEsUUFDdkQsT0FBTyxNQUFNLFFBQVEsV0FBVyxLQUFLLE1BQU0sS0FBSyxFQUFFLElBQUksSUFBSTtBQUFBLE1BQzlEO0FBQUEsSUFDSjtBQUFBO0FBQUEsU0FHVSxXQUFXLENBQUMsTUFBMEM7QUFBQSxJQUNoRSxRQUFRLGFBQWEsVUFBVTtBQUFBLElBQy9CLE9BQU8sSUFBSSxlQUNQLFdBQVcsS0FBSyxLQUFLLEVBQUUsR0FDdkI7QUFBQSxNQUNJLEtBQUssTUFBTSxNQUFNLFdBQVcsS0FBSyxNQUFNLEdBQUcsSUFBSTtBQUFBLE1BQzlDLE1BQU0sTUFBTSxPQUFPLFdBQVcsS0FBSyxNQUFNLElBQUksSUFBSTtBQUFBLE1BQ2pELE9BQU8sTUFBTSxRQUFRLFdBQVcsS0FBSyxNQUFNLEtBQUssSUFBSTtBQUFBLElBQ3hELENBQ0o7QUFBQTtBQUVSOzs7QUM5Q08sTUFBTSxhQUFnQjtBQUFBLEVBRUw7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUpwQixXQUFXLENBQ1MsSUFDQSxjQUNBLFlBQ0EsYUFDbEI7QUFBQSxJQUprQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHTixVQUE0QyxDQUFDO0FBQUEsSUFDdkQ7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxLQU1nQjtBQUFBLElBQ2hCLE9BQU8sSUFBSSxhQUNQLFdBQVcsS0FBSyxVQUFVLEVBQUUsS0FBSyxJQUFJLEdBQ3JDLGNBQ0EsV0FBVyxLQUF1QixjQUFjLFdBQVcsS0FBSyxHQUFHLFdBQVcsS0FBSyxDQUFDLEdBQ3BGLGVBQWUsQ0FBQyxDQUNwQjtBQUFBO0FBQUEsU0FHVSxnQkFBbUIsQ0FBQztBQUFBLElBQzlCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsS0FNZ0I7QUFBQSxJQUNoQixPQUFPLElBQUksYUFDUCxXQUFXLEtBQUssVUFBVSxFQUFFLEtBQUssSUFBSSxHQUNyQyxjQUNBLFlBQ0EsZUFBZSxDQUFDLENBQ3BCO0FBQUE7QUFFUjs7O0FDakRPLE1BQU0sa0JBQXVDO0FBQUEsRUFJbkI7QUFBQSxFQUhiLE9BQXlDO0FBQUEsRUFDeEMsYUFBYSxJQUFJO0FBQUEsRUFFbEMsV0FBVyxDQUFrQixLQUFVO0FBQUEsSUFBVjtBQUFBLElBQ3pCLElBQUksUUFBUSxlQUNSLDBCQUNBLHdCQUNBLHNCQUNKO0FBQUE7QUFBQSxFQUdJLGNBQWlCLENBQUMsY0FBNEM7QUFBQSxJQUNsRSxJQUFJLEtBQUssV0FBVyxJQUFJLGFBQWEsRUFBRSxHQUFHO0FBQUEsTUFDdEMsTUFBTSxJQUFJLE1BQU0sNkJBQTZCLGFBQWEsb0JBQW9CO0FBQUEsSUFDbEY7QUFBQSxJQUNBLE9BQU8sSUFBSSxhQUFhLEtBQUssS0FBSyxZQUFZO0FBQUE7QUFBQSxFQUczQyxHQUFNLENBQUMsY0FBNEM7QUFBQSxJQUN0RCxNQUFNLGFBQWEsYUFBYTtBQUFBLElBQ2hDLElBQUksV0FBVyxLQUFLLFdBQVcsSUFBSSxVQUFVO0FBQUEsSUFDN0MsSUFBSSxhQUFhLFdBQVc7QUFBQSxNQUN4QixXQUFXLEtBQUssZUFBZSxZQUFZO0FBQUEsTUFDM0MsS0FBSyxXQUFXLElBQUksWUFBWSxRQUFRO0FBQUEsSUFDNUM7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBR0osSUFBc0MsQ0FBQyxNQUFjLFNBQXFFO0FBQUEsSUFDN0gsTUFBTSxhQUFhLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJO0FBQUEsSUFDNUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxVQUFVLEdBQUc7QUFBQSxNQUNqQyxNQUFNLElBQUksTUFBTSx1QkFBdUIsc0JBQXNCO0FBQUEsSUFDakU7QUFBQSxJQUNBLE1BQU0sWUFBWSxhQUFhLFdBQWMsWUFBWTtBQUFBLE1BQ3JEO0FBQUEsTUFDQSxjQUFjLFFBQVE7QUFBQSxNQUN0QixZQUFZLFFBQVE7QUFBQSxJQUN4QixDQUFDO0FBQUEsSUFDRCxPQUFPLEtBQUssZUFBZSxTQUFTO0FBQUE7QUFBQSxFQUdqQyxVQUFhLENBQUMsTUFBYyxTQUE2RTtBQUFBLElBQzVHLE1BQU0sYUFBYSxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssSUFBSTtBQUFBLElBQzVDLElBQUksS0FBSyxXQUFXLElBQUksVUFBVSxHQUFHO0FBQUEsTUFDakMsTUFBTSxJQUFJLE1BQU0sdUJBQXVCLHNCQUFzQjtBQUFBLElBQ2pFO0FBQUEsSUFDQSxNQUFNLFlBQVksYUFBYSxpQkFBb0IsWUFBWTtBQUFBLE1BQzNEO0FBQUEsTUFDQSxjQUFjLFFBQVE7QUFBQSxNQUN0QixZQUFZLFFBQVE7QUFBQSxJQUN4QixDQUFDO0FBQUEsSUFDRCxPQUFPLEtBQUssZUFBZSxTQUFTO0FBQUE7QUFFNUM7QUFBQTtBQUVBLE1BQU0sYUFBdUM7QUFBQSxFQU9wQjtBQUFBLEVBQ0Q7QUFBQSxFQVBILGVBQWtDLElBQUk7QUFBQSxFQUN0QyxPQUFhLElBQUk7QUFBQSxFQUMxQixZQUFZO0FBQUEsRUFDYjtBQUFBLEVBRVAsV0FBVyxDQUNVLEtBQ0QsTUFDbEI7QUFBQSxJQUZtQjtBQUFBLElBQ0Q7QUFBQSxJQUVoQixLQUFLLFFBQVEsS0FBSztBQUFBLElBQ2xCLElBQUksUUFBUSxpQkFBaUIsd0JBQXdCLENBQUMsV0FDbEQsS0FBSyxhQUFhLE1BQU0sQ0FDNUI7QUFBQSxJQUNBLElBQUksUUFBUSxRQUFRLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFBQTtBQUFBLE9BR3JDLElBQUksR0FBZTtBQUFBLElBQ3JCLE1BQU0sU0FBUyxNQUFNLEtBQUssSUFBSSxVQUFVLEtBQUssdUJBQXVCLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEYsSUFBSSxPQUFPLFVBQVUsTUFBTTtBQUFBLE1BQ3ZCLE9BQU8sS0FBSyxLQUFLO0FBQUEsSUFDckI7QUFBQSxJQUNBLE9BQU8sS0FBSyxLQUFLLFdBQVcsWUFBWSxPQUFPLEtBQUs7QUFBQTtBQUFBLE9BR2xELElBQUksQ0FBQyxPQUF5QjtBQUFBLElBQ2hDLEtBQUssSUFBSSxLQUFLLHdCQUF3QjtBQUFBLE1BQ2xDLElBQUksS0FBSyxLQUFLO0FBQUEsTUFDZCxPQUFPLEtBQUssS0FBSyxXQUFXLFVBQVUsS0FBSztBQUFBLElBQy9DLENBQUM7QUFBQTtBQUFBLE9BR1EsSUFBRyxHQUFlO0FBQUEsSUFDM0IsTUFBTSxRQUFRLE1BQU0sS0FBSyxLQUFLLElBQUksWUFBWSxLQUFLLEtBQUssQ0FBQztBQUFBLElBQ3pELEtBQUssYUFBYSxLQUFLLEtBQUs7QUFBQSxJQUM1QixPQUFPO0FBQUE7QUFBQSxPQUdFLElBQUcsQ0FBQyxPQUF5QjtBQUFBLElBQ3RDLE1BQU0sS0FBSyxLQUFLLElBQUksWUFBWSxLQUFLLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDaEQsS0FBSyxhQUFhLEtBQUssS0FBSztBQUFBO0FBQUEsT0FHbkIsT0FBTSxDQUFDLElBQWtEO0FBQUEsSUFDbEUsTUFBTSxRQUFRLE1BQU0sS0FBSyxLQUFLLElBQUksWUFBWTtBQUFBLE1BQzFDLE1BQU0sU0FBUSxNQUFNLEtBQUssS0FBSztBQUFBLE1BQzlCLE1BQU0sV0FBVyxNQUFNLEdBQUcsTUFBSztBQUFBLE1BQy9CLE1BQU0sS0FBSyxLQUFLLFFBQVE7QUFBQSxNQUN4QixPQUFPO0FBQUEsS0FDVjtBQUFBLElBQ0QsS0FBSyxhQUFhLEtBQUssS0FBSztBQUFBLElBQzVCLE9BQU87QUFBQTtBQUFBLE9BR0UsT0FBTSxDQUFDLElBQWtEO0FBQUEsSUFDbEUsTUFBTSxRQUFRLE1BQU0sS0FBSyxLQUFLLElBQUksWUFBWTtBQUFBLE1BQzFDLE1BQU0sU0FBUSxNQUFNLEtBQUssS0FBSztBQUFBLE1BQzlCLE1BQU0sV0FBVyxNQUFNLEdBQUcsTUFBSztBQUFBLE1BQy9CLE1BQU0sS0FBSyxLQUFLLFFBQVE7QUFBQSxNQUN4QixPQUFPO0FBQUEsS0FDVjtBQUFBLElBQ0QsS0FBSyxhQUFhLEtBQUssS0FBSztBQUFBLElBQzVCLE9BQU87QUFBQTtBQUFBLEVBR0osTUFBTSxDQUFDLFNBQXVEO0FBQUEsSUFDakUsSUFBSSxDQUFDLEtBQUssYUFBYSxLQUFLLElBQUksT0FBTztBQUFBLE1BQ25DLEtBQUssSUFBSSxLQUFLLHdCQUF3QixLQUFLLEtBQUssRUFBRTtBQUFBLElBQ3REO0FBQUEsSUFDQSxLQUFLLFlBQVk7QUFBQSxJQUNqQixPQUFPLEtBQUssYUFBYSxPQUFPLE9BQU87QUFBQTtBQUFBLEVBR25DLFlBQVksQ0FBQyxNQUE0QjtBQUFBLElBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxLQUFLLEtBQUssRUFBRSxHQUFHO0FBQUEsTUFDaEM7QUFBQSxJQUNKO0FBQUEsSUFDQSxJQUFJLEtBQUssVUFBVSxNQUFNO0FBQUEsTUFDckIsS0FBSyxRQUFRLEtBQUssS0FBSyxXQUFXLFlBQVksS0FBSyxLQUFLO0FBQUEsSUFDNUQ7QUFBQSxJQUNBLEtBQUssYUFBYSxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsRUFHN0IsTUFBTSxHQUFTO0FBQUEsSUFDbkIsSUFBSSxLQUFLLFdBQVc7QUFBQSxNQUNoQixLQUFLLElBQUksS0FBSyx3QkFBd0IsS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUN0RDtBQUFBLElBQ0EsSUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHLFlBQVksS0FBSyxJQUFJLElBQUksRUFBRSxHQUFHO0FBQUEsTUFDNUM7QUFBQSxJQUNKO0FBQUEsSUFDQSxLQUFLLElBQUksS0FBSywwQkFBMEI7QUFBQSxNQUNwQyxJQUFJLEtBQUssS0FBSztBQUFBLE1BQ2QsYUFBYSxLQUFLLEtBQUs7QUFBQSxJQUMzQixDQUFDO0FBQUE7QUFBQSxFQUdFLFlBQVksR0FBZ0I7QUFBQSxJQUMvQixJQUFJLFFBQVE7QUFBQSxJQUNaLElBQUksUUFBVyxLQUFLO0FBQUEsSUFDcEIsTUFBTSxZQUFZLElBQUk7QUFBQSxJQUN0QixLQUFLLE9BQU8sQ0FBQyxhQUFhO0FBQUEsTUFDdEIsUUFBUTtBQUFBLE1BQ1IsUUFBUTtBQUFBLE1BQ1IsVUFBVSxRQUFRLENBQUMsUUFBUTtBQUFBLFFBQ3ZCLElBQUksS0FBSztBQUFBLE9BQ1o7QUFBQSxLQUNKO0FBQUEsSUFDRCxPQUFPO0FBQUEsTUFDSCxLQUFLLENBQUMsV0FBYTtBQUFBLFFBQ2YsSUFBSSxDQUFDLE9BQU87QUFBQSxVQUNSLE1BQU0sSUFBSSxNQUFNLFlBQVksS0FBSyxLQUFLLEdBQUcsSUFBSSxnQkFBZ0I7QUFBQSxRQUNqRTtBQUFBLFFBQ0EsS0FBSyxJQUFJLE1BQUs7QUFBQTtBQUFBLE1BRWxCLFdBQVcsQ0FBQyxRQUFRO0FBQUEsUUFDaEIsVUFBVSxJQUFJLEdBQUc7QUFBQSxRQUNqQixJQUFJLEtBQUs7QUFBQSxRQUNULE9BQU8sTUFBTTtBQUFBLFVBQ1QsVUFBVSxPQUFPLEdBQUc7QUFBQTtBQUFBO0FBQUEsTUFHNUIsUUFBUSxDQUFDLE9BQU87QUFBQSxRQUNaLElBQUksQ0FBQyxPQUFPO0FBQUEsVUFDUixNQUFNLElBQUksTUFBTSxZQUFZLEtBQUssS0FBSyxHQUFHLElBQUksZ0JBQWdCO0FBQUEsUUFDakU7QUFBQSxRQUNBLEtBQUssT0FBTyxFQUFFO0FBQUE7QUFBQSxNQUVsQixNQUFNLE1BQU07QUFBQSxRQUNSLE9BQU8sSUFBSSxRQUFXLENBQUMsWUFBWTtBQUFBLFVBQy9CLElBQUksT0FBTztBQUFBLFlBQ1AsUUFBUSxLQUFLO0FBQUEsVUFDakIsRUFBTztBQUFBLFlBQ0gsVUFBVSxJQUFJLE1BQU07QUFBQSxjQUNoQixRQUFRLEtBQUs7QUFBQSxhQUNoQjtBQUFBO0FBQUEsU0FFUjtBQUFBO0FBQUEsSUFFVDtBQUFBO0FBRVI7QUFFTyxJQUFNLDBCQUE0RCxJQUFJLGNBQ3pFLFlBQ0EsQ0FBQyxRQUFhLElBQUksa0JBQWtCLEdBQUcsQ0FDM0M7QUFDTyxJQUFNLHlCQUFxQyx3QkFBd0IsS0FBSyxZQUFZO0FBQzNGLElBQU0sMkJBQTJCLFdBQVcsV0FBMkIseUJBQXlCO0FBQUEsRUFDNUYsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUFDO0FBQ0QsSUFBTSx5QkFBeUIsV0FBVyxpQkFDdEMseUJBQ0E7QUFBQSxFQUNJLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FDSjtBQUNBLElBQU0seUJBQXlCLFdBQVcsV0FBdUIseUJBQXlCO0FBQUEsRUFDdEYsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUFDO0FBQ0QsSUFBTSx3QkFBd0IsYUFBYSxpQkFDdkMseUJBQ0E7QUFBQSxFQUNJLE1BQU07QUFBQSxFQUNOLG1CQUFtQixXQUFXLEdBQUcsVUFBVSxFQUFFLE9BQU87QUFBQSxFQUNwRCxvQkFBb0I7QUFBQSxFQUNwQixjQUFjO0FBQ2xCLENBQ0o7O0FDMU9PLE1BQU0sWUFBWTtBQUFBLEVBQ087QUFBQSxFQUE1QixXQUFXLENBQWlCLElBQWdCO0FBQUEsSUFBaEI7QUFBQTtBQUFBLFNBRWQsU0FBUyxDQUFDLFFBQWlDO0FBQUEsSUFDckQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sT0FBTyxPQUFPO0FBQUE7QUFBQSxTQUdYLFdBQVcsQ0FBQyxNQUErQjtBQUFBLElBQ3JELE1BQU0sU0FBUyxXQUFXLGVBQWUsSUFBSTtBQUFBLElBQzdDLE1BQU0sS0FBSyxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUM7QUFBQSxJQUNqRCxPQUFPLElBQUksWUFBWSxFQUFFO0FBQUE7QUFFakM7QUFBQTtBQUVPLE1BQU0saUJBQWlCO0FBQUEsRUFFTjtBQUFBLEVBQ0E7QUFBQSxFQUZwQixXQUFXLENBQ1MsSUFDQSxPQUNsQjtBQUFBLElBRmtCO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHTixTQUFTLENBQUMsUUFBc0M7QUFBQSxJQUMxRCxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sWUFBWSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQUEsSUFDbEMsT0FBTyxhQUFhLE9BQU8sS0FBSyxPQUFPLEtBQUssRUFBRSxNQUFNO0FBQUEsSUFDcEQsWUFBWSxLQUFLLFVBQVUsT0FBTyxRQUFRLE9BQU8sS0FBSyxHQUFHO0FBQUEsTUFDckQsT0FBTyxZQUFZLEdBQUc7QUFBQSxNQUN0QixPQUFPLGdCQUFnQixLQUFLO0FBQUEsSUFDaEM7QUFBQSxJQUNBLE9BQU8sT0FBTyxPQUFPO0FBQUE7QUFBQSxTQUdYLFdBQVcsQ0FBQyxNQUFvQztBQUFBLElBQzFELE1BQU0sU0FBUyxXQUFXLGVBQWUsSUFBSTtBQUFBLElBQzdDLE1BQU0sS0FBSyxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUM7QUFBQSxJQUNqRCxNQUFNLFFBQVEsT0FBTyxZQUFZO0FBQUEsSUFDakMsTUFBTSxRQUFvQyxDQUFDO0FBQUEsSUFDM0MsU0FBUyxJQUFJLEVBQUcsSUFBSSxPQUFPLEtBQUs7QUFBQSxNQUM1QixNQUFNLE1BQU0sT0FBTyxXQUFXO0FBQUEsTUFDOUIsTUFBTSxRQUFRLE9BQU8sZUFBZTtBQUFBLE1BQ3BDLE1BQU0sT0FBTztBQUFBLElBQ2pCO0FBQUEsSUFDQSxPQUFPLElBQUksaUJBQWlCLElBQUksS0FBSztBQUFBO0FBRTdDO0FBQUE7QUFFTyxNQUFNLGdCQUFnQjtBQUFBLEVBRUw7QUFBQSxFQUNBO0FBQUEsRUFGcEIsV0FBVyxDQUNTLElBQ0EsTUFDbEI7QUFBQSxJQUZrQjtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQXFDO0FBQUEsSUFDekQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sYUFBYSxPQUFPLEtBQUssTUFBTTtBQUFBLElBQ3RDLFdBQVcsT0FBTyxPQUFPLE1BQU07QUFBQSxNQUMzQixPQUFPLFlBQVksR0FBRztBQUFBLElBQzFCO0FBQUEsSUFDQSxPQUFPLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FHWCxXQUFXLENBQUMsTUFBbUM7QUFBQSxJQUN6RCxNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxJQUM3QyxNQUFNLEtBQUssV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDakQsTUFBTSxRQUFRLE9BQU8sWUFBWTtBQUFBLElBQ2pDLE1BQU0sT0FBaUIsQ0FBQztBQUFBLElBQ3hCLFNBQVMsSUFBSSxFQUFHLElBQUksT0FBTyxLQUFLO0FBQUEsTUFDNUIsS0FBSyxLQUFLLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDakM7QUFBQSxJQUNBLE9BQU8sSUFBSSxnQkFBZ0IsSUFBSSxJQUFJO0FBQUE7QUFFM0M7QUFBQTtBQUVPLE1BQU0saUJBQWlCO0FBQUEsRUFFTjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFIcEIsV0FBVyxDQUNTLElBQ0EsT0FDQSxLQUNsQjtBQUFBLElBSGtCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQXNDO0FBQUEsSUFDMUQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sYUFBYSxPQUFPLEdBQUc7QUFBQSxJQUM5QixPQUFPLGFBQWEsT0FBTyxLQUFLLE9BQU8sS0FBSyxFQUFFLE1BQU07QUFBQSxJQUNwRCxZQUFZLEtBQUssVUFBVSxPQUFPLFFBQVEsT0FBTyxLQUFLLEdBQUc7QUFBQSxNQUNyRCxPQUFPLFlBQVksR0FBRztBQUFBLE1BQ3RCLE9BQU8sZ0JBQWdCLEtBQUs7QUFBQSxJQUNoQztBQUFBLElBQ0EsT0FBTyxPQUFPLE9BQU87QUFBQTtBQUFBLFNBR1gsV0FBVyxDQUFDLE1BQW9DO0FBQUEsSUFDMUQsTUFBTSxTQUFTLFdBQVcsZUFBZSxJQUFJO0FBQUEsSUFDN0MsTUFBTSxLQUFLLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQ2pELE1BQU0sTUFBTSxPQUFPLFlBQVk7QUFBQSxJQUMvQixNQUFNLFFBQVEsT0FBTyxZQUFZO0FBQUEsSUFDakMsTUFBTSxRQUFvQyxDQUFDO0FBQUEsSUFDM0MsU0FBUyxJQUFJLEVBQUcsSUFBSSxPQUFPLEtBQUs7QUFBQSxNQUM1QixNQUFNLE9BQU0sT0FBTyxXQUFXO0FBQUEsTUFDOUIsTUFBTSxRQUFRLE9BQU8sZUFBZTtBQUFBLE1BQ3BDLE1BQU0sUUFBTztBQUFBLElBQ2pCO0FBQUEsSUFDQSxPQUFPLElBQUksaUJBQWlCLElBQUksT0FBTyxHQUFHO0FBQUE7QUFFbEQ7QUFBQTtBQUNPLE1BQU0saUJBQWlCO0FBQUEsRUFFTjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBSnBCLFdBQVcsQ0FDUyxJQUNBLE9BQ0EsV0FBb0IsT0FDcEIsU0FBd0IsTUFDMUM7QUFBQSxJQUprQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHTixTQUFTLENBQUMsUUFBc0M7QUFBQSxJQUMxRCxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sWUFBWSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQUEsSUFDbEMsT0FBTyxhQUFhLE9BQU8sS0FBSztBQUFBLElBQ2hDLE1BQU0sUUFBUSxJQUFJLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUFBLElBQ3JDLE1BQU0sSUFBSSxHQUFHLE9BQU8sUUFBUTtBQUFBLElBQzVCLE1BQU0sSUFBSSxHQUFHLE9BQU8sV0FBVyxJQUFJO0FBQUEsSUFDbkMsT0FBTyxXQUFXLEtBQUs7QUFBQSxJQUN2QixJQUFJLE9BQU8sV0FBVyxNQUFNO0FBQUEsTUFDeEIsT0FBTyxZQUFZLE9BQU8sTUFBTTtBQUFBLElBQ3BDO0FBQUEsSUFDQSxPQUFPLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FHWCxXQUFXLENBQUMsTUFBb0M7QUFBQSxJQUMxRCxNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxJQUM3QyxNQUFNLEtBQUssV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDakQsTUFBTSxRQUFRLE9BQU8sWUFBWTtBQUFBLElBQ2pDLE1BQU0sUUFBUSxPQUFPLFVBQVUsQ0FBQztBQUFBLElBQ2hDLE1BQU0sV0FBVyxNQUFNLElBQUksQ0FBQztBQUFBLElBQzVCLE1BQU0sU0FBUyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDdkQsT0FBTyxJQUFJLGlCQUFpQixJQUFJLE9BQU8sVUFBVSxNQUFNO0FBQUE7QUFFL0Q7QUFBQTtBQUVPLE1BQU0sc0JBQXNCO0FBQUEsRUFFWDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFIcEIsV0FBVyxDQUNTLElBQ0EsT0FDQSxLQUNsQjtBQUFBLElBSGtCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQTJDO0FBQUEsSUFDL0QsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sWUFBWSxPQUFPLEtBQUs7QUFBQSxJQUMvQixPQUFPLFlBQVksT0FBTyxHQUFHO0FBQUEsSUFDN0IsT0FBTyxPQUFPLE9BQU87QUFBQTtBQUFBLFNBR1gsV0FBVyxDQUFDLE1BQXlDO0FBQUEsSUFDL0QsTUFBTSxTQUFTLFdBQVcsZUFBZSxJQUFJO0FBQUEsSUFDN0MsTUFBTSxLQUFLLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQ2pELE1BQU0sUUFBUSxPQUFPLFdBQVc7QUFBQSxJQUNoQyxNQUFNLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDOUIsT0FBTyxJQUFJLHNCQUFzQixJQUFJLE9BQU8sR0FBRztBQUFBO0FBRXZEO0FBQUE7QUFFTyxNQUFNLGdCQUFnQjtBQUFBLEVBRUw7QUFBQSxFQUNBO0FBQUEsRUFGcEIsV0FBVyxDQUNTLElBQ0EsUUFDbEI7QUFBQSxJQUZrQjtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQXFDO0FBQUEsSUFDekQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sWUFBWSxLQUFLLFVBQVUsT0FBTyxNQUFNLENBQUM7QUFBQSxJQUNoRCxPQUFPLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FHWCxXQUFXLENBQUMsTUFBbUM7QUFBQSxJQUN6RCxNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxJQUM3QyxNQUFNLEtBQUssV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDakQsTUFBTSxTQUFTLEtBQUssTUFBTSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQzdDLE9BQU8sSUFBSSxnQkFBZ0IsSUFBSSxNQUFNO0FBQUE7QUFFN0M7QUFBQTtBQUVPLE1BQU0sb0JBQW9CO0FBQUEsRUFFVDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFOcEIsV0FBVyxDQUNTLElBQ0EsS0FDQSxNQUNBLE9BQ0EsUUFDQSxPQUNsQjtBQUFBLElBTmtCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQXlDO0FBQUEsSUFDN0QsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLElBQUksUUFBUTtBQUFBLElBQ1osSUFBSSxPQUFPLFFBQVEsTUFBTTtBQUFBLE1BQ3JCLFNBQVM7QUFBQSxJQUNiO0FBQUEsSUFDQSxJQUFJLE9BQU8sU0FBUyxNQUFNO0FBQUEsTUFDdEIsU0FBUztBQUFBLElBQ2I7QUFBQSxJQUNBLElBQUksT0FBTyxVQUFVLE1BQU07QUFBQSxNQUN2QixTQUFTO0FBQUEsSUFDYjtBQUFBLElBQ0EsSUFBSSxPQUFPLFdBQVcsTUFBTTtBQUFBLE1BQ3hCLFNBQVM7QUFBQSxJQUNiO0FBQUEsSUFDQSxJQUFJLE9BQU8sVUFBVSxNQUFNO0FBQUEsTUFDdkIsU0FBUztBQUFBLElBQ2I7QUFBQSxJQUNBLE9BQU8sV0FBVyxLQUFLO0FBQUEsSUFDdkIsSUFBSSxPQUFPLEtBQUs7QUFBQSxNQUNaLE9BQU8sWUFBWSxPQUFPLElBQUksSUFBSSxDQUFDO0FBQUEsSUFDdkM7QUFBQSxJQUNBLElBQUksT0FBTyxNQUFNO0FBQUEsTUFDYixPQUFPLFlBQVksT0FBTyxLQUFLLElBQUksQ0FBQztBQUFBLElBQ3hDO0FBQUEsSUFDQSxJQUFJLE9BQU8sT0FBTztBQUFBLE1BQ2QsT0FBTyxZQUFZLE9BQU8sTUFBTSxJQUFJLENBQUM7QUFBQSxJQUN6QztBQUFBLElBQ0EsSUFBSSxPQUFPLFFBQVE7QUFBQSxNQUNmLE9BQU8sWUFBWSxPQUFPLE9BQU8sSUFBSSxDQUFDO0FBQUEsSUFDMUM7QUFBQSxJQUNBLElBQUksT0FBTyxPQUFPO0FBQUEsTUFDZCxPQUFPLFlBQVksT0FBTyxNQUFNLElBQUksQ0FBQztBQUFBLElBQ3pDO0FBQUEsSUFDQSxPQUFPLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FHWCxXQUFXLENBQUMsTUFBdUM7QUFBQSxJQUM3RCxNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxJQUM3QyxNQUFNLEtBQUssV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDakQsTUFBTSxRQUFRLE9BQU8sVUFBVTtBQUFBLElBQy9CLE1BQU0sTUFBTSxRQUFRLElBQU0sV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDLElBQUk7QUFBQSxJQUNwRSxNQUFNLE9BQU8sUUFBUSxJQUFPLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQyxJQUFJO0FBQUEsSUFDdEUsTUFBTSxRQUFRLFFBQVEsSUFBUSxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUMsSUFBSTtBQUFBLElBQ3hFLE1BQU0sU0FBUyxRQUFRLElBQVMsV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDLElBQUk7QUFBQSxJQUMxRSxNQUFNLFFBQVEsUUFBUSxLQUFVLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQyxJQUFJO0FBQUEsSUFDMUUsT0FBTyxJQUFJLG9CQUFvQixJQUFJLEtBQUssTUFBTSxPQUFPLFFBQVEsS0FBSztBQUFBO0FBRTFFOzs7QUM3TE8sTUFBTSxVQUFhO0FBQUEsRUFFWDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBSlgsV0FBVyxDQUNBLElBQ0EsWUFDQSxhQUNBLGFBQ1Q7QUFBQSxJQUpTO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUE7QUFBQSxTQUdHLFVBQTRDLENBQ3REO0FBQUEsSUFFSTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEtBT1E7QUFBQSxJQUNaLE9BQU8sSUFBSSxVQUNQLFdBQVcsS0FBSyxVQUFVLEVBQUUsS0FBSyxJQUFJLEdBQ3JDLFdBQVcsS0FBdUIsY0FBYyxXQUFXLEtBQUssR0FBRyxXQUFXLEtBQUssQ0FBQyxHQUNwRixLQUNBLFdBQ0o7QUFBQTtBQUFBLFNBR1UsZ0JBQW1CLENBQzdCO0FBQUEsSUFFSTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEtBT1E7QUFBQSxJQUNaLE9BQU8sSUFBSSxVQUNQLFdBQVcsS0FBSyxVQUFVLEVBQUUsS0FBSyxJQUFJLEdBQ3JDLFlBQ0EsS0FDQSxXQUNKO0FBQUE7QUFFUjs7O0FDeEZPLElBQU0sdUJBQXNELElBQUksY0FDbkUsU0FDQSxDQUFDLFdBQVcsSUFBSSxlQUFlLE1BQU0sQ0FDekM7QUFDTyxJQUFNLHNCQUFrQyxxQkFBcUIsS0FBSyxZQUFZO0FBRXJGLElBQU0sOEJBQThCLFdBQVcsaUJBQXNDLHNCQUFzQjtBQUFBLEVBQ3ZHLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0sMEJBQTBCLFdBQVcsaUJBQWtDLHNCQUFzQjtBQUFBLEVBQy9GLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0sc0JBQXNCLFdBQVcsV0FBdUIsc0JBQXNCO0FBQUEsRUFDaEYsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUFDO0FBQ0QsSUFBTSw0QkFBNEIsV0FBVyxXQUF1QixzQkFBc0I7QUFBQSxFQUN0RixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDRCxJQUFNLHFCQUFxQixXQUFXLGlCQUFtQyxzQkFBc0I7QUFBQSxFQUMzRixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDRCxJQUFNLHdCQUF3QixXQUFXLGlCQUFtQyxzQkFBc0I7QUFBQSxFQUM5RixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDRCxJQUFNLDJCQUEyQixXQUFXLGlCQUFtQyxzQkFBc0I7QUFBQSxFQUNqRyxNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDRCxJQUFNLDJCQUEyQixXQUFXLGlCQUFtQyxzQkFBc0I7QUFBQSxFQUNqRyxNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDRCxJQUFNLDBCQUEwQixhQUFhLGlCQUFvRCxzQkFBc0I7QUFBQSxFQUNuSCxNQUFNO0FBQUEsRUFDTixtQkFBbUI7QUFBQSxFQUNuQixvQkFBb0I7QUFBQSxFQUNwQixjQUFjO0FBQ2xCLENBQUM7QUFDRCxJQUFNLDBCQUEwQixhQUFhLGlCQUEyRCxzQkFBc0I7QUFBQSxFQUMxSCxNQUFNO0FBQUEsRUFDTixtQkFBbUI7QUFBQSxFQUNuQixvQkFBb0IsV0FBVyxLQUFLO0FBQUEsRUFDcEMsY0FBYztBQUNsQixDQUFDO0FBQ0QsSUFBTSw4QkFBOEIsYUFBYSxpQkFBMkMsc0JBQXNCO0FBQUEsRUFDOUcsTUFBTTtBQUFBLEVBQ04sbUJBQW1CO0FBQUEsRUFDbkIsb0JBQW9CLFdBQVcsS0FBSztBQUFBLEVBQ3BDLGNBQWM7QUFDbEIsQ0FBQztBQUNELElBQU0sOEJBQThCLGFBQWEsaUJBQTJDLHNCQUFzQjtBQUFBLEVBQzlHLE1BQU07QUFBQSxFQUNOLG1CQUFtQjtBQUFBLEVBQ25CLG9CQUFvQixXQUFXLEtBQUs7QUFBQSxFQUNwQyxjQUFjO0FBQ2xCLENBQUM7QUFDRCxJQUFNLHVCQUF1QixhQUFhLGlCQUFxRCxzQkFBc0I7QUFBQSxFQUNqSCxNQUFNO0FBQUEsRUFDTixtQkFBbUI7QUFBQSxFQUNuQixvQkFBb0I7QUFBQSxFQUNwQixjQUFjO0FBQ2xCLENBQUM7QUFDRCxJQUFNLDZCQUE2QixhQUFhLGlCQUEwRCxzQkFBc0I7QUFBQSxFQUM1SCxNQUFNO0FBQUEsRUFDTixtQkFBbUI7QUFBQSxFQUNuQixvQkFBb0I7QUFBQSxFQUNwQixjQUFjO0FBQ2xCLENBQUM7QUFDRCxJQUFNLDJCQUEyQixhQUFhLGlCQUFnRCxzQkFBc0I7QUFBQSxFQUNoSCxNQUFNO0FBQUEsRUFDTixtQkFBbUI7QUFBQSxFQUNuQixvQkFBb0I7QUFBQSxFQUNwQixjQUFjO0FBQ2xCLENBQUM7QUFDRCxJQUFNLHNCQUFzQixhQUFhLGlCQUFzQyxzQkFBc0I7QUFBQSxFQUNqRyxNQUFNO0FBQUEsRUFDTixtQkFBbUI7QUFBQSxFQUNuQixvQkFBb0IsV0FBVyxLQUFLO0FBQUEsRUFDcEMsY0FBYztBQUNsQixDQUFDO0FBQ0QsSUFBTSwwQkFBMEIsV0FBVyxpQkFBOEIsc0JBQXNCO0FBQUEsRUFDM0YsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUFDO0FBQUE7QUFFTSxNQUFNLGVBQW9DO0FBQUEsRUFJaEI7QUFBQSxFQUhiLE9BQXNDO0FBQUEsRUFDckMsV0FBVyxJQUFJO0FBQUEsRUFFaEMsV0FBVyxDQUFrQixLQUFVO0FBQUEsSUFBVjtBQUFBLElBQ3pCLElBQUksUUFBUSxlQUNSLDZCQUNBLHlCQUNBLHFCQUNBLDJCQUNBLG9CQUNBLHVCQUNBLDBCQUNBLDBCQUNBLHVCQUNKO0FBQUE7QUFBQSxFQUdJLFdBQWMsQ0FBQyxXQUFtQztBQUFBLElBQ3RELEtBQUssSUFBSSxZQUFZLFFBQVEsbUJBQW1CO0FBQUEsSUFDaEQsSUFBSSxLQUFLLElBQUksVUFBVSxFQUFFLEdBQUc7QUFBQSxNQUN4QixNQUFNLElBQUksTUFBTSxzQkFBc0I7QUFBQSxJQUMxQztBQUFBLElBQ0EsTUFBTSxRQUFRLElBQUksVUFBYSxLQUFLLEtBQUssU0FBUztBQUFBLElBQ2xELEtBQUssU0FBUyxJQUFJLFVBQVUsSUFBSSxLQUF1QjtBQUFBLElBQ3ZELE9BQU87QUFBQTtBQUFBLEVBR0osSUFBc0MsQ0FBQyxNQUFjLFNBQWtGO0FBQUEsSUFDMUksTUFBTSxZQUFZLElBQUksVUFDbEIsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLElBQUksR0FDekIsV0FBVyxLQUE4QixRQUFRLGNBQWMsV0FBVyxLQUFLLEdBQUcsV0FBVyxLQUFLLENBQUMsR0FDbkcsUUFBUSxHQUNaO0FBQUEsSUFDQSxPQUFPLEtBQUssWUFBWSxTQUFTO0FBQUE7QUFBQSxFQUc5QixVQUFhLENBQUMsTUFBYyxTQUEwRjtBQUFBLElBQ3pILE1BQU0sWUFBWSxJQUFJLFVBQ2xCLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQ3pCLFFBQVEsWUFDUixRQUFRLEdBQ1o7QUFBQSxJQUNBLE9BQU8sS0FBSyxZQUFZLFNBQVM7QUFBQTtBQUFBLEVBRzlCLEdBQU0sQ0FBQyxNQUE4QjtBQUFBLElBQ3hDLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxHQUFHO0FBQUEsTUFDbkIsT0FBTyxLQUFLLFNBQVMsSUFBSSxLQUFLLEVBQUU7QUFBQSxJQUNwQztBQUFBLElBQ0EsT0FBTyxLQUFLLFlBQVksSUFBSTtBQUFBO0FBQUEsRUFHekIsR0FBRyxDQUFDLFlBQWlDO0FBQUEsSUFDeEMsT0FBTyxLQUFLLFNBQVMsSUFBSSxVQUFVO0FBQUE7QUFFM0M7QUFBQTtBQUVBLE1BQU0sVUFBaUM7QUFBQSxFQWNkO0FBQUEsRUFiZDtBQUFBLEVBQ1M7QUFBQSxFQUNDO0FBQUEsRUFDQTtBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVSLFdBQVcsQ0FDVSxLQUNqQixXQUNGO0FBQUEsSUFGbUI7QUFBQSxJQUdqQixLQUFLLEtBQUssVUFBVTtBQUFBLElBQ3BCLEtBQUssYUFBYSxVQUFVO0FBQUEsSUFDNUIsS0FBSyxjQUFjLFVBQVU7QUFBQSxJQUM3QixLQUFLLFFBQVEsSUFBSTtBQUFBLElBQ2pCLEtBQUssUUFBUTtBQUFBLE1BQ1QsS0FBSyxJQUFJO0FBQUEsTUFDVCxRQUFRLElBQUk7QUFBQSxNQUNaLFFBQVEsSUFBSTtBQUFBLE1BQ1osT0FBTyxJQUFJO0FBQUEsTUFDWCxhQUFhLElBQUk7QUFBQSxJQUNyQjtBQUFBLElBQ0EsS0FBSyxhQUFhLElBQUk7QUFBQSxJQUN0QixLQUFLLFVBQVUsQ0FBQztBQUFBLElBQ2hCLEtBQUssWUFBWTtBQUFBLElBRWpCLElBQUksUUFBUSxpQkFBaUIsb0JBQW9CLENBQUMsV0FBVztBQUFBLE1BQ3pELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxLQUFLLEVBQUUsR0FBRztBQUFBLFFBQzdCO0FBQUEsTUFDSjtBQUFBLE1BQ0EsSUFBSSxRQUFRLEtBQUssaUJBQWlCLE9BQU8sS0FBSztBQUFBLE1BQzlDLEtBQUssUUFBUSxRQUFRLENBQUMsVUFBVTtBQUFBLFFBQzVCLFFBQVEsSUFBSSxJQUNSLENBQUMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxFQUNkLElBQUksRUFBRSxLQUFLLFVBQVU7QUFBQSxVQUNsQixNQUFNLFlBQVksTUFBTSxJQUFJO0FBQUEsVUFDNUIsSUFBSSxjQUFjLFdBQVc7QUFBQSxZQUN6QixPQUFPLENBQUMsS0FBSyxTQUFjO0FBQUEsVUFDL0I7QUFBQSxVQUNBO0FBQUEsU0FDSCxFQUNBLE9BQU8sQ0FBQyxTQUE4QjtBQUFBLFVBQ25DLE9BQU8sT0FBTyxTQUFTO0FBQUEsU0FDMUIsQ0FDVDtBQUFBLE9BQ0g7QUFBQSxNQUNELElBQUksS0FBSyxvQkFBb0I7QUFBQSxRQUN6QixJQUFJLEtBQUs7QUFBQSxRQUNULEtBQUssT0FBTztBQUFBLFFBQ1osT0FBTyxPQUFPLFlBQ1YsQ0FBQyxHQUFHLE1BQU0sUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssVUFBVTtBQUFBLFVBQ3RDLE9BQU8sQ0FBQyxLQUFLLEtBQUssV0FBVyxVQUFVLElBQUksQ0FBQztBQUFBLFNBQy9DLENBQ0w7QUFBQSxNQUNKLENBQUM7QUFBQSxLQUNKO0FBQUEsSUFDRCxJQUFJLFFBQVEsaUJBQWlCLHVCQUF1QixDQUFDLFdBQVc7QUFBQSxNQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsS0FBSyxFQUFFLEdBQUc7QUFBQSxRQUM3QjtBQUFBLE1BQ0o7QUFBQSxNQUNBLE1BQU0sUUFBUSxLQUFLLGlCQUFpQixPQUFPLEtBQUs7QUFBQSxNQUNoRCxLQUFLLFlBQVksS0FBSztBQUFBLE1BQ3RCLEtBQUssTUFBTSxJQUFJLEtBQUssS0FBSztBQUFBLEtBQzVCO0FBQUEsSUFDRCxJQUFJLFFBQVEsaUJBQWlCLDBCQUEwQixDQUFDLFdBQVc7QUFBQSxNQUMvRCxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsS0FBSyxFQUFFLEdBQUc7QUFBQSxRQUM3QjtBQUFBLE1BQ0o7QUFBQSxNQUNBLE1BQU0sUUFBUSxLQUFLLGlCQUFpQixPQUFPLEtBQUs7QUFBQSxNQUNoRCxLQUFLLFlBQVksS0FBSztBQUFBLE1BQ3RCLEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSztBQUFBLEtBQy9CO0FBQUEsSUFDRCxJQUFJLFFBQVEsaUJBQWlCLDBCQUEwQixDQUFDLFdBQVc7QUFBQSxNQUMvRCxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsS0FBSyxFQUFFLEdBQUc7QUFBQSxRQUM3QjtBQUFBLE1BQ0o7QUFBQSxNQUNBLE1BQU0sUUFBUSxLQUFLLGlCQUFpQixPQUFPLEtBQUs7QUFBQSxNQUNoRCxNQUFNLFFBQVEsQ0FBQyxHQUFHLFFBQVE7QUFBQSxRQUN0QixLQUFLLE1BQU0sT0FBTyxHQUFHO0FBQUEsT0FDeEI7QUFBQSxNQUNELEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSztBQUFBLE1BQzVCLEtBQUssTUFBTSxZQUFZLEtBQUssS0FBSyxLQUFLO0FBQUEsS0FDekM7QUFBQSxJQUNELElBQUksUUFBUSxpQkFBaUIseUJBQXlCLENBQUMsV0FBVztBQUFBLE1BQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxLQUFLLEVBQUUsR0FBRztBQUFBLFFBQzdCO0FBQUEsTUFDSjtBQUFBLE1BQ0EsS0FBSyxRQUFRLElBQUk7QUFBQSxNQUNqQixLQUFLLE1BQU0sTUFBTSxLQUFLO0FBQUEsTUFDdEIsS0FBSyxNQUFNLFlBQVksS0FBSyxLQUFLLEtBQUs7QUFBQSxLQUN6QztBQUFBLElBQ0QsSUFBSSxNQUFNLE1BQU0sT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDO0FBQUE7QUFBQSxFQUd2QyxXQUFXLENBQUMsT0FBNkI7QUFBQSxJQUM3QyxJQUFJLENBQUMsS0FBSyxXQUFXO0FBQUEsTUFDakIsS0FBSyxRQUFRO0FBQUEsSUFDakIsRUFBTztBQUFBLE1BQ0gsTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxPQUFPLEdBQUcsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUFBLE1BQ3RFLEtBQUssUUFBUTtBQUFBO0FBQUEsSUFFakIsS0FBSyxNQUFNLFlBQVksS0FBSyxLQUFLLEtBQUs7QUFBQTtBQUFBLEVBR25DLE1BQU0sQ0FBQyxVQUFzRDtBQUFBLElBQ2hFLElBQUksQ0FBQyxLQUFLLFdBQVc7QUFBQSxNQUNqQixLQUFLLElBQUksUUFBUSxNQUFNO0FBQUEsUUFDbkIsS0FBSyxJQUFJLEtBQUsscUJBQXFCLEtBQUssRUFBRTtBQUFBLE9BQzdDO0FBQUEsTUFDRCxLQUFLLFlBQVk7QUFBQSxJQUNyQjtBQUFBLElBQ0EsSUFBSSxVQUFVO0FBQUEsTUFDVixPQUFPLEtBQUssTUFBTSxZQUFZLE9BQU8sUUFBUTtBQUFBLElBQ2pEO0FBQUEsSUFDQSxPQUFPLE1BQU07QUFBQTtBQUFBLEVBR1YsS0FBSyxDQUFDLFVBQWdEO0FBQUEsSUFDekQsSUFBSSxLQUFLLFFBQVEsV0FBVyxHQUFHO0FBQUEsTUFDM0IsSUFBSSxTQUFTLE1BQVk7QUFBQSxNQUN6QixTQUFTLEtBQUssSUFBSSxRQUFRLE1BQU07QUFBQSxRQUM1QixJQUFJLEtBQUssUUFBUSxXQUFXLEdBQUc7QUFBQSxVQUMzQixPQUFPO0FBQUEsVUFDUDtBQUFBLFFBQ0o7QUFBQSxRQUNBLEtBQUssSUFBSSxLQUFLLDJCQUEyQixLQUFLLEVBQUU7QUFBQSxPQUNuRDtBQUFBLElBQ0w7QUFBQSxJQUNBLEtBQUssUUFBUSxLQUFLLFFBQVE7QUFBQSxJQUMxQixPQUFPLE1BQU07QUFBQSxNQUNULEtBQUssUUFBUSxPQUFPLEtBQUssUUFBUSxRQUFRLFFBQVEsR0FBRyxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBSXJELE9BQU8sR0FBUztBQUFBLElBQ3BCLElBQUksS0FBSyxRQUFRO0FBQUEsTUFDYixLQUFLLElBQUksS0FBSyx5QkFBeUI7QUFBQSxRQUNuQyxJQUFJLEtBQUs7QUFBQSxRQUNULFFBQVEsS0FBSztBQUFBLE1BQ2pCLENBQUM7QUFBQSxJQUNMO0FBQUE7QUFBQSxPQUdTLElBQUcsQ0FBQyxLQUFxQztBQUFBLElBQ2xELElBQUksS0FBSyxNQUFNLElBQUksR0FBRyxHQUFHO0FBQUEsTUFDckIsT0FBTyxLQUFLLE1BQU0sSUFBSSxHQUFHO0FBQUEsSUFDN0I7QUFBQSxJQUNBLElBQUksS0FBSyxXQUFXLElBQUksR0FBRyxHQUFHO0FBQUEsTUFDMUIsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLEdBQUc7QUFBQSxJQUN4QztBQUFBLElBQ0EsTUFBTSxVQUFVLEtBQUssSUFBSSxVQUNwQixLQUFLLHlCQUF5QjtBQUFBLE1BQzNCLElBQUksS0FBSztBQUFBLE1BQ1QsTUFBTSxDQUFDLEdBQUc7QUFBQSxJQUNkLENBQUMsRUFDQSxLQUFLLENBQUMsUUFBUTtBQUFBLE1BQ1gsTUFBTSxRQUFRLEtBQUssaUJBQWlCLElBQUksS0FBSztBQUFBLE1BQzdDLEtBQUssWUFBWSxLQUFLO0FBQUEsTUFDdEIsT0FBTyxLQUFLLE1BQU0sSUFBSSxHQUFHO0FBQUEsS0FDNUI7QUFBQSxJQUNMLEtBQUssV0FBVyxJQUFJLEtBQUssT0FBTztBQUFBLElBQ2hDLE9BQU8sTUFBTSxRQUFRLEtBQUssQ0FBQyxTQUFTO0FBQUEsTUFDaEMsS0FBSyxXQUFXLE9BQU8sR0FBRztBQUFBLE1BQzFCLE9BQU87QUFBQSxLQUNWO0FBQUE7QUFBQSxPQUdRLFFBQU8sSUFBSSxNQUF5QztBQUFBLElBQzdELE1BQU0sZUFBZSxLQUNoQixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUNwQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssV0FBVyxJQUFJLEdBQUcsQ0FBQztBQUFBLElBQzlDLElBQUksYUFBYSxXQUFXLEdBQUc7QUFBQSxNQUMzQixPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsS0FBSyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFDeEU7QUFBQSxJQUNBLE1BQU0sVUFBVSxLQUFLLElBQUksVUFDcEIsS0FBSyx5QkFBeUI7QUFBQSxNQUMzQixJQUFJLEtBQUs7QUFBQSxNQUNULE1BQU07QUFBQSxJQUNWLENBQUMsRUFDQSxLQUFLLENBQUMsUUFBUTtBQUFBLE1BQ1gsTUFBTSxTQUFRLEtBQUssaUJBQWlCLElBQUksS0FBSztBQUFBLE1BQzdDLEtBQUssWUFBWSxNQUFLO0FBQUEsTUFDdEIsT0FBTztBQUFBLEtBQ1Y7QUFBQSxJQUNMLFdBQVcsT0FBTyxjQUFjO0FBQUEsTUFDNUIsS0FBSyxXQUFXLElBQ1osS0FDQSxRQUFRLEtBQUssQ0FBQyxXQUFVLE9BQU0sSUFBSSxHQUFHLENBQUMsQ0FDMUM7QUFBQSxJQUNKO0FBQUEsSUFDQSxNQUFNLFFBQVEsTUFBTTtBQUFBLElBQ3BCLFdBQVcsT0FBTyxjQUFjO0FBQUEsTUFDNUIsS0FBSyxXQUFXLE9BQU8sR0FBRztBQUFBLElBQzlCO0FBQUEsSUFDQSxPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxPQUFPLEdBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEtBQUssU0FBUyxHQUFHLENBQUMsQ0FBQztBQUFBO0FBQUEsT0FHckUsSUFBRyxJQUFJLE9BQTJCO0FBQUEsSUFDM0MsTUFBTSxPQUFPLEtBQUssZUFBZSxLQUFLO0FBQUEsSUFDdEMsS0FBSyxJQUFJLEtBQUssdUJBQXVCO0FBQUEsTUFDakMsSUFBSSxLQUFLO0FBQUEsTUFDVCxPQUFPO0FBQUEsSUFDWCxDQUFDO0FBQUE7QUFBQSxPQUdRLE9BQU0sSUFBSSxPQUEyQjtBQUFBLElBQzlDLE1BQU0sT0FBTyxLQUFLLGVBQWUsS0FBSztBQUFBLElBQ3RDLEtBQUssSUFBSSxLQUFLLDBCQUEwQjtBQUFBLE1BQ3BDLElBQUksS0FBSztBQUFBLE1BQ1QsT0FBTztBQUFBLElBQ1gsQ0FBQztBQUFBO0FBQUEsT0FHUSxPQUFNLElBQUksT0FBMkI7QUFBQSxJQUM5QyxNQUFNLE9BQU8sS0FBSyxlQUFlLEtBQUs7QUFBQSxJQUN0QyxNQUFNLE9BQU8sT0FBTyxLQUFLLElBQUk7QUFBQSxJQUM3QixLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLEtBQUssU0FBUyxHQUFHLENBQUMsQ0FBQztBQUFBLElBQzNFLEtBQUssSUFBSSxLQUFLLDBCQUEwQjtBQUFBLE1BQ3BDLElBQUksS0FBSztBQUFBLE1BQ1QsT0FBTztBQUFBLElBQ1gsQ0FBQztBQUFBO0FBQUEsT0FHUSxNQUFLLEdBQWtCO0FBQUEsSUFDaEMsS0FBSyxJQUFJLEtBQUsseUJBQXlCO0FBQUEsTUFDbkMsSUFBSSxLQUFLO0FBQUEsSUFDYixDQUFDO0FBQUE7QUFBQSxPQUdRLElBQUcsQ0FBQyxLQUErQjtBQUFBLElBQzVDLElBQUksS0FBSyxNQUFNLElBQUksR0FBRyxHQUFHO0FBQUEsTUFDckIsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLE1BQU0sTUFBTSxNQUFNLEtBQUssSUFBSSxVQUFVLEtBQUsseUJBQXlCO0FBQUEsTUFDL0QsSUFBSSxLQUFLO0FBQUEsTUFDVCxNQUFNLENBQUMsR0FBRztBQUFBLElBQ2QsQ0FBQztBQUFBLElBQ0QsT0FBTyxJQUFJLFFBQVE7QUFBQTtBQUFBLE9BR1YsUUFBMEMsSUFBSSxNQUEyRDtBQUFBLElBQ2xILE1BQU0sTUFBTSxNQUFNLEtBQUssSUFBSSxVQUFVLEtBQUsseUJBQXlCO0FBQUEsTUFDL0QsSUFBSSxLQUFLO0FBQUEsTUFDVDtBQUFBLElBQ0osQ0FBQztBQUFBLElBQ0QsT0FBTztBQUFBO0FBQUEsT0FHRSxPQUFNLElBQUksTUFBa0M7QUFBQSxJQUNyRCxNQUFNLE1BQU0sTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLDZCQUE2QjtBQUFBLE1BQ25FLElBQUksS0FBSztBQUFBLE1BQ1Q7QUFBQSxJQUNKLENBQUM7QUFBQSxJQUNELE9BQU87QUFBQTtBQUFBLE9BR0UsT0FBTSxJQUFJLE1BQWtDO0FBQUEsSUFDckQsTUFBTSxNQUFNLE1BQU0sS0FBSyxJQUFJLFVBQVUsS0FBSyw2QkFBNkI7QUFBQSxNQUNuRSxJQUFJLEtBQUs7QUFBQSxNQUNUO0FBQUEsSUFDSixDQUFDO0FBQUEsSUFDRCxPQUFPO0FBQUE7QUFBQSxPQUdFLFdBQVU7QUFBQSxJQUNuQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsS0FLd0I7QUFBQSxJQUN4QixNQUFNLE1BQU0sTUFBTSxLQUFLLElBQUksVUFBVSxLQUNqQyxzQkFDQSxJQUFJLGlCQUFpQixLQUFLLElBQUksT0FBTyxVQUFVLE1BQU0sQ0FDekQ7QUFBQSxJQUNBLE1BQU0sUUFBUSxLQUFLLGlCQUFpQixJQUFJLEtBQUs7QUFBQSxJQUM3QyxLQUFLLFlBQVksS0FBSztBQUFBLElBQ3RCLE9BQU87QUFBQTtBQUFBLE9BR0UsV0FBVTtBQUFBLElBQ25CO0FBQUEsSUFDQTtBQUFBLEtBSXdCO0FBQUEsSUFDeEIsTUFBTSxNQUFNLE1BQU0sS0FBSyxJQUFJLFVBQVUsS0FBSyw0QkFBNEI7QUFBQSxNQUNsRSxJQUFJLEtBQUs7QUFBQSxNQUNUO0FBQUEsTUFDQTtBQUFBLElBQ0osQ0FBQztBQUFBLElBQ0QsTUFBTSxRQUFRLEtBQUssaUJBQWlCLElBQUksS0FBSztBQUFBLElBQzdDLEtBQUssWUFBWSxLQUFLO0FBQUEsSUFDdEIsT0FBTztBQUFBO0FBQUEsT0FHRSxTQUFRLEdBQTRCO0FBQUEsSUFDN0MsTUFBTSxNQUFNLE1BQU0sS0FBSyxJQUFJLFVBQVUsS0FBSywwQkFBMEI7QUFBQSxNQUNoRSxJQUFJLEtBQUs7QUFBQSxJQUNiLENBQUM7QUFBQSxJQUNELE1BQU0sUUFBUSxLQUFLLGlCQUFpQixJQUFJLEtBQUs7QUFBQSxJQUM3QyxLQUFLLFlBQVksS0FBSztBQUFBLElBQ3RCLE9BQU87QUFBQTtBQUFBLFNBR0csT0FBTztBQUFBLElBQ2pCO0FBQUEsSUFDQTtBQUFBLEtBSWlCO0FBQUEsSUFDakIsT0FBTyxNQUFNO0FBQUEsTUFDVCxNQUFNLFFBQVEsTUFBTSxLQUFLLFdBQVc7QUFBQSxRQUNoQyxPQUFPLEtBQUssYUFBYTtBQUFBLFFBQ3pCO0FBQUEsUUFDQTtBQUFBLE1BQ0osQ0FBQztBQUFBLE1BQ0QsSUFBSSxNQUFNLFNBQVMsR0FBRztBQUFBLFFBQ2xCO0FBQUEsTUFDSjtBQUFBLE1BQ0EsT0FBTyxNQUFNLE9BQU87QUFBQSxNQUNwQixJQUFJLFdBQVcsV0FBVztBQUFBLFFBQ3RCLE1BQU0sT0FBTyxNQUFNO0FBQUEsTUFDdkI7QUFBQSxNQUNBLE1BQU0sYUFBYSxXQUFXLE1BQU0sT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLElBQUk7QUFBQSxNQUNwRixJQUFJLENBQUMsWUFBWTtBQUFBLFFBQ2I7QUFBQSxNQUNKO0FBQUEsTUFDQSxTQUFTLEtBQUssWUFBWSxVQUFVO0FBQUEsSUFDeEM7QUFBQTtBQUFBLE9BR1MsS0FBSSxHQUFvQjtBQUFBLElBQ2pDLE9BQU8sTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLHFCQUFxQjtBQUFBLE1BQ3RELElBQUksS0FBSztBQUFBLElBQ2IsQ0FBQztBQUFBO0FBQUEsRUFHRyxnQkFBZ0IsQ0FBQyxPQUFtRDtBQUFBLElBQ3hFLE9BQU8sSUFBSSxJQUNQLE9BQU8sUUFBUSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssVUFBVTtBQUFBLE1BQ3ZDLE1BQU0sT0FBTyxLQUFLLFdBQVcsWUFBWSxJQUFJO0FBQUEsTUFDN0MsS0FBSyxNQUFNLElBQUksS0FBSyxJQUFJO0FBQUEsTUFDeEIsT0FBTyxDQUFDLEtBQUssSUFBSTtBQUFBLEtBQ3BCLENBQ0w7QUFBQTtBQUFBLEVBR0ksY0FBYyxDQUFDLE9BQXdDO0FBQUEsSUFDM0QsT0FBTyxPQUFPLFlBQ1YsTUFBTSxJQUFJLENBQUMsU0FBUztBQUFBLE1BQ2hCLE9BQU8sQ0FBQyxLQUFLLFlBQVksSUFBSSxHQUFHLEtBQUssV0FBVyxVQUFVLElBQUksQ0FBQztBQUFBLEtBQ2xFLENBQ0w7QUFBQTtBQUFBLEVBR0csWUFBWSxDQUFDLE1BQW9CO0FBQUEsSUFDcEMsS0FBSyxZQUFZO0FBQUE7QUFBQSxFQUdkLFNBQVMsQ0FBQyxRQUEyQjtBQUFBLElBQ3hDLElBQUksS0FBSyxJQUFJLFNBQVM7QUFBQSxNQUNsQixNQUFNLElBQUksTUFBTSw0Q0FBNEM7QUFBQSxJQUNoRTtBQUFBLElBQ0EsS0FBSyxTQUFTO0FBQUE7QUFBQSxFQUdYLGNBQWMsQ0FBQyxhQUFxQztBQUFBLElBQ3ZELEtBQUssY0FBYztBQUFBO0FBRTNCOztBQ2hpQk8sSUFBTSx3QkFBd0QsSUFBSSxjQUNyRSxVQUNBLENBQUMsUUFBYSxJQUFJLGdCQUFnQixHQUFHLENBQ3pDO0FBWU8sSUFBTSxpQ0FBNkMsc0JBQXNCLEtBQUssUUFBUSxNQUFNO0FBQzVGLElBQU0sa0NBQThDLHNCQUFzQixLQUFLLFFBQVEsT0FBTztBQUM5RixJQUFNLGtDQUE4QyxzQkFBc0IsS0FBSyxTQUFTLE1BQU07QUFDOUYsSUFBTSw2QkFBcUQsYUFBYSxXQUFxQix1QkFBdUI7QUFBQSxFQUN2SCxNQUFNO0FBQUEsRUFDTixjQUFjLEVBQUUsU0FBVyxDQUFDLEVBQUU7QUFBQSxFQUM5QixhQUFhO0FBQUEsSUFDVCxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsRUFDVjtBQUNKLENBQUM7QUFDRCxJQUFNLGlCQUFpQixVQUFVLFdBQVcsdUJBQXVCO0FBQUEsRUFDL0QsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osS0FBSyxDQUFDLFFBQVEsSUFBSSxHQUFHLElBQUk7QUFBQSxFQUN6QixhQUFhO0FBQUEsSUFDVCxLQUFLO0FBQUEsSUFDTCxNQUFNO0FBQUEsRUFDVjtBQUNKLENBQUM7QUFFTSxJQUFNLGdDQUE0QyxzQkFBc0IsS0FBSyxVQUFVO0FBQzlGLElBQU0seUJBQXlCLGFBQWEsV0FBNkIsdUJBQXVCO0FBQUEsRUFDNUYsTUFBTTtBQUFBLEVBQ04sY0FBYztBQUNsQixDQUFDO0FBQ00sSUFBTSxvQ0FBZ0Qsc0JBQXNCLEtBQUssbUJBQW1CLEtBQUs7QUFDekcsSUFBTSxvQ0FBZ0Qsc0JBQXNCLEtBQUssbUJBQW1CLEtBQUs7QUFDaEgsSUFBTSw4QkFBOEIsYUFBYSxXQUFtQyx1QkFBdUI7QUFBQSxFQUN2RyxNQUFNO0FBQUEsRUFDTixjQUFjLENBQUM7QUFBQSxFQUNmLGFBQWE7QUFBQSxJQUNULE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxFQUNYO0FBQ0osQ0FBQztBQUFBO0FBRU0sTUFBTSxnQkFBcUM7QUFBQSxFQU1qQjtBQUFBLEVBTGIsT0FBdUM7QUFBQSxFQUN2QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFFaEIsV0FBVyxDQUFrQixLQUFVO0FBQUEsSUFBVjtBQUFBLElBQ3pCLEtBQUssT0FBTyxJQUFJLE9BQU8sSUFBSSxjQUFjO0FBQUEsSUFDekMsS0FBSyxRQUFRLElBQUksV0FBVyxJQUFJLDBCQUEwQjtBQUFBLElBQzFELEtBQUssZUFBZSxJQUFJLFdBQVcsSUFBSSwyQkFBMkI7QUFBQTtBQUFBLE9BR3pELFNBQVEsQ0FBQyxTQUFxQztBQUFBLElBQ3ZELEtBQUssSUFBSSxVQUFVLEtBQUssd0JBQXdCLFdBQVcsS0FBSztBQUFBLElBQ2hFLE1BQU0sSUFBSSxRQUFjLENBQUMsWUFBWTtBQUFBLE1BQ2pDLE1BQU0sV0FBVyxLQUFLLElBQUksUUFBUSxNQUFNLGFBQWEsT0FBTyxNQUFNO0FBQUEsUUFDOUQsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBLE9BQ1o7QUFBQSxLQUNKO0FBQUEsSUFDRCxPQUFPO0FBQUE7QUFFZjtBQUFBO0FBRU8sTUFBTSxnQkFBZ0I7QUFBQSxFQUVMO0FBQUEsRUFDQTtBQUFBLEVBRnBCLFdBQVcsQ0FDUyxvQkFDQSx1QkFDbEI7QUFBQSxJQUZrQjtBQUFBLElBQ0E7QUFBQTtBQUFBLEVBR2IsU0FBUyxDQUFDLFVBQW9EO0FBQUEsSUFDakUsS0FBSyxtQkFBbUIsS0FBSyxRQUFRO0FBQUE7QUFBQSxFQUdsQyxZQUFZLENBQUMsVUFBb0Q7QUFBQSxJQUNwRSxLQUFLLHNCQUFzQixLQUFLLFFBQVE7QUFBQTtBQUVoRDtBQUFBO0FBYU8sTUFBTSxpQkFBaUI7QUFBQSxFQUVmO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUhYLFdBQVcsQ0FDQSxJQUNBLE1BQ0EsTUFDVDtBQUFBLElBSFM7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHRyxRQUFRLENBQUMsTUFBOEM7QUFBQSxJQUNqRSxNQUFNLEtBQUssV0FBVyxRQUFRLEtBQUssS0FBSztBQUFBLElBQ3hDLE1BQU0sT0FBTyxJQUFJO0FBQUEsSUFDakIsWUFBWSxPQUFPLFlBQVksT0FBTyxRQUFRLEtBQUssT0FBTyxHQUFHO0FBQUEsTUFDekQsTUFBTSxNQUFLLFdBQVcsUUFBUSxLQUFLO0FBQUEsTUFDbkMsTUFBTSxNQUFNLElBQUksWUFBWSxPQUFPO0FBQUEsTUFDbkMsSUFBSSxDQUFDLElBQUcsaUJBQWlCLElBQUksRUFBRSxHQUFHO0FBQUEsUUFDOUIsTUFBTSxJQUFJLE1BQU0sOENBQThDLElBQUksU0FBUyxLQUFJO0FBQUEsTUFDbkY7QUFBQSxNQUNBLEtBQUssSUFBSSxLQUFJLEdBQUc7QUFBQSxJQUNwQjtBQUFBLElBQ0EsT0FBTyxJQUFJLGlCQUNQLElBQ0EsTUFDQSxLQUFLLElBQ1Q7QUFBQTtBQUVSOyIsCiAgImRlYnVnSWQiOiAiNzAwNjRFQTQyNDdEQzRDNjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
2054
+ //# debugId=0B9316D72703ED4B64756E2164756E21
2055
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2lkZW50aWZpZXIudHMiLCAiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvY29uc3QudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9ieXRlYnVmZmVyLnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvc2VyaWFsaXplci50cyIsICIuLi8uLi9zcmMvYXBpL2VuZHBvaW50L2VuZHBvaW50LnRzIiwgIi4uLy4uL3NyYy9hcGkvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9ldmVudC9pbmRleC50cyIsICIuLi8uLi9zcmMvbG9jay50cyIsICIuLi8uLi9zcmMvbmV0d29yay9wYWNrZXQvcGFja2V0LnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvcmVnaXN0cnkvcmVnaXN0cnkudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS90YWJsZS9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvdGFibGUvdGFibGUudHMiLCAiLi4vLi4vc3JjL2FwaS90YWJsZS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIvZXh0ZW5zaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4vYXBwJztcblxuY29uc3QgTkFNRVNQQUNFX1JFR0VYID0gL14oXFwuW14vOi5dfFtcXHctXSkrJC87XG5jb25zdCBOQU1FX1JFR0VYID0gL15bXi86XSskLztcblxuZXhwb3J0IHR5cGUgSW50b0lkID0gSWRlbnRpZmllciB8IHN0cmluZyB8IEV4dGVuc2lvblR5cGUgfCBBcHA7XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZ1tdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICAuLi5wYXRoOiBzdHJpbmdbXVxuICAgICkge1xuICAgICAgICBJZGVudGlmaWVyLnZhbGlkYXRlKG5hbWVzcGFjZSwgcGF0aCk7XG4gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tSnNvbihqc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb20oaWQ6IEludG9JZCk6IElkZW50aWZpZXIge1xuICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgaW5zdGFuY2VvZiBBcHApIHtcbiAgICAgICAgICAgIHJldHVybiBpZC5pZDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBpbmZlclxuICAgICAgICAgICAgLy8gVml0ZSBkb2VzIG5vdCBwcmVzZXJ2ZSBjbGFzcyBpbmZvcm1hdGlvbiB3aGVuIGltcG9ydGluZyBmcm9tIGRpZmZlcmVudCBwYWNrYWdlc1xuICAgICAgICAgICAgY29uc3QgaWRDYXN0ZWQgPSBpZCBhcyB7IG5hbWVzcGFjZTogc3RyaW5nOyBwYXRoOiBzdHJpbmdbXSB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBpZENhc3RlZC5uYW1lc3BhY2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpZENhc3RlZC5wYXRoKSAmJlxuICAgICAgICAgICAgICAgIGlkQ2FzdGVkLnBhdGguZXZlcnkoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihpZENhc3RlZC5uYW1lc3BhY2UsIC4uLmlkQ2FzdGVkLnBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWRXaXRoSWQgPSBpZCBhcyB7IGlkOiBJbnRvSWQgfCB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRXaXRoSWQuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZFdpdGhJZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IHRvIElkZW50aWZpZXI6ICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21PcHRpb25hbChpZDogSW50b0lkIHwgdW5kZWZpbmVkIHwgbnVsbCk6IElkZW50aWZpZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGUobmFtZXNwYWNlOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF0aDogUGF0aCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5hbWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU5BTUVTUEFDRV9SRUdFWC50ZXN0KG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuYW1lc3BhY2U6IE5hbWVzcGFjZSBtdXN0IG1hdGNoICR7TkFNRVNQQUNFX1JFR0VYfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBwYXRoKSB7XG4gICAgICAgICAgICBpZiAoIU5BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXRoOiBOYW1lIG11c3QgbWF0Y2ggJHtOQU1FX1JFR0VYfSBidXQgZ290ICR7bmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmb3JtYXQobmFtZXNwYWNlOiBzdHJpbmcsIC4uLnBhdGg6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICByZXR1cm4gYCR7bmFtZXNwYWNlfToke3BhdGguam9pbignLycpfWA7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21LZXkoa2V5OiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0ga2V5LmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHNlcGFyYXRvciA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE5vIHNlcGFyYXRvciBmb3VuZCBpbiAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJzonLCBzZXBhcmF0b3IgKyAxKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE11bHRpcGxlIHNlcGFyYXRvcnMgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0ga2V5LnNsaWNlKDAsIHNlcGFyYXRvcik7XG4gICAgICAgIGNvbnN0IHBhdGggPSBrZXkuc2xpY2Uoc2VwYXJhdG9yICsgMSk7XG4gICAgICAgIGlmICghbmFtZXNwYWNlIHx8ICFwYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5OiBOYW1lc3BhY2UgYW5kIHBhdGggY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKG5hbWVzcGFjZSwgLi4ucGF0aC5zcGxpdCgnLycpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBJZGVudGlmaWVyLm5hbWVzcGFjZUZyb21VcmwocGFyc2VkVXJsLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXRoID0gcGFyc2VkVXJsLnBhdGhuYW1lLnNsaWNlKDEpLnNwbGl0KCcvJyk7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbmFtZXNwYWNlRnJvbVVybCh1cmw6IHN0cmluZyB8IFVSTCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlZC5ob3N0bmFtZS5zcGxpdCgnLicpLnJldmVyc2UoKS5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXkoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpzb24oanNvbjogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb21LZXkoanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mb3JtYXQodGhpcy5uYW1lc3BhY2UsIC4uLnRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWwob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCkgPT09IG90aGVyLmtleSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc05hbWVzcGFjZUVxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZSA9PT0gb3RoZXIubmFtZXNwYWNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1N1YnBhdGhPZihvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5uYW1lc3BhY2UgIT09IG90aGVyLm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhdGgubGVuZ3RoIDwgb3RoZXIucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG90aGVyLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhdGhbaV0gIT09IG90aGVyLnBhdGhbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW4oLi4ucGF0aDogc3RyaW5nW10pOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgsIC4uLnBhdGgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJNYXA8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFwOiBNYXA8c3RyaW5nLCBUPiA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50cmllcz86IEl0ZXJhYmxlPFtJZGVudGlmaWVyLCBUXT4sXG4gICAgKSB7XG4gICAgICAgIGlmICghZW50cmllcykgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChpZC5rZXkoKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoaWRlbnRpZmllcjogSWRlbnRpZmllciwgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0KGlkZW50aWZpZXIua2V5KCksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMubWFwLmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMubWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW0lkZW50aWZpZXIuZnJvbUtleShrZXkpLCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgVF0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJTZXQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuYWRkKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuaGFzKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5kZWxldGUoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqa2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPElkZW50aWZpZXI+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICB5aWVsZCBJZGVudGlmaWVyLmZyb21LZXkoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgICAgICB5aWVsZCBbaWRlbnRpZmllciwgaWRlbnRpZmllcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgTG9jYWxlIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxlLmpzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxpemVkVGV4dCB9IGZyb20gJy4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5cbmV4cG9ydCB0eXBlIEFwcE1ldGFkYXRhID0ge1xuICAgIGxvY2FsZTogTG9jYWxlO1xuICAgIG5hbWU/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGljb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGRlc2NyaXB0aW9uPzogTG9jYWxpemVkVGV4dDtcbiAgICBpbWFnZT86IExvY2FsaXplZFRleHQ7XG4gICAgc2l0ZT86IExvY2FsaXplZFRleHQ7XG4gICAgcmVwb3NpdG9yeT86IExvY2FsaXplZFRleHQ7XG4gICAgYXV0aG9ycz86IExvY2FsaXplZFRleHQ7XG4gICAgbGljZW5zZT86IExvY2FsaXplZFRleHQ7XG4gICAgdGFncz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwVHlwZSA9ICdhcHAnIHwgJ3NlcnZpY2UnIHwgJ3JlbW90ZScgfCAncGx1Z2luJyB8ICdkYXNoYm9hcmQnO1xuXG5leHBvcnQgdHlwZSBEZXBlbmRlbmN5U3BlY2lmaWVyID0ge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBpbmRleD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFwcEpzb24gPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBBcHBUeXBlO1xuICAgIHBhcmVudF9pZD86IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xufTtcblxuZXhwb3J0IGNsYXNzIEFwcCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyO1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBBcHBUeXBlO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXJlbnRJZD86IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHVybD86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBEZXBlbmRlbmN5U3BlY2lmaWVyIHwgc3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBJbnRvSWQsIG9wdGlvbnM6IHtcbiAgICAgICAgdHlwZT86IEFwcFR5cGU7XG4gICAgICAgIHBhcmVudElkPzogSW50b0lkO1xuICAgICAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgICAgICB1cmw/OiBzdHJpbmc7XG4gICAgICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgICAgIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5pZCA9IElkZW50aWZpZXIuZnJvbShpZCk7XG4gICAgICAgIHRoaXMucGFyZW50SWQgPSBJZGVudGlmaWVyLmZyb21PcHRpb25hbChvcHRpb25zLnBhcmVudElkKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uO1xuICAgICAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlID8/ICdhcHAnO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG9wdGlvbnMuZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaW5mbzogQXBwSnNvbik6IEFwcCB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGluZm8uaWQpO1xuICAgICAgICByZXR1cm4gbmV3IEFwcChpZCwge1xuICAgICAgICAgICAgcGFyZW50SWQ6IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKGluZm8ucGFyZW50X2lkKSxcbiAgICAgICAgICAgIHZlcnNpb246IGluZm8udmVyc2lvbixcbiAgICAgICAgICAgIHVybDogaW5mby51cmwsXG4gICAgICAgICAgICB0eXBlOiBpbmZvLnR5cGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogaW5mby5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogaW5mby5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IEFwcCk6IEFwcEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGRhdGEuaWQua2V5KCksXG4gICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICBwYXJlbnRfaWQ6IGRhdGEucGFyZW50SWQ/LmtleSgpLFxuICAgICAgICAgICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBkYXRhLnVybCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBkYXRhLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBkYXRhLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbiguLi5wYXRoczogc3RyaW5nW10pOiBBcHAge1xuICAgICAgICByZXR1cm4gbmV3IEFwcCh0aGlzLmlkLmpvaW4oLi4ucGF0aHMpLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogdGhpcy5kZXBlbmRlbmNpZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IHRleHRFbmNvZGVyOiBUZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuZXhwb3J0IGNvbnN0IHRleHREZWNvZGVyOiBUZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5pbXBvcnQgeyBKc29uVHlwZSB9IGZyb20gJy4vc2VyaWFsaXplci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBGbGFncyB7XG4gICAgcHJpdmF0ZSB2YWx1ZTogbnVtYmVyO1xuICAgIHByaXZhdGUgbGVuZ3RoOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IHZhbHVlPzogbnVtYmVyOyBsZW5ndGg/OiBudW1iZXIgfSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy52YWx1ZSA/PyAwO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdGlvbnMubGVuZ3RoID8/IDMyO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMocG9zaXRpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgJiAoMSA8PCBwb3NpdGlvbikpICE9PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQocG9zaXRpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgJiAoMSA8PCBwb3NpdGlvbikpICE9PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBpZlNldDxUPihwb3NpdGlvbjogbnVtYmVyLCBjYWxsYmFjazogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy5oYXMocG9zaXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocG9zaXRpb246IG51bWJlciwgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlIHw9IDEgPDwgcG9zaXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlICY9IH4oMSA8PCBwb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUod3JpdGVyOiBCeXRlV3JpdGVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJpdHMgPSBuZXcgVWludDhBcnJheSgodGhpcy5sZW5ndGggKyA3KSAvIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJpdHNbaV0gPSAodGhpcy52YWx1ZSA+PiAoaSAqIDgpKSAmIDB4ZmY7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLndyaXRlKGJpdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZChyZWFkZXI6IEJ5dGVSZWFkZXIsIGxlbmd0aDogbnVtYmVyKTogRmxhZ3Mge1xuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IChsZW5ndGggKyA3KSAvIDg7IGkrKykge1xuICAgICAgICAgICAgdmFsdWUgfD0gcmVhZGVyLnJlYWRVaW50OCgpIDw8IChpICogOCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGbGFncyh7IHZhbHVlLCBsZW5ndGggfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkRmxvYXQxNihkYXRhVmlldzogRGF0YVZpZXcsIG9mZnNldDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzaWduID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHg4MDAwKSA/IC0xIDogMTtcbiAgICBjb25zdCBleHBvbmVudCA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4N2MwMCkgPj4gMTA7XG4gICAgY29uc3QgbWFudGlzc2EgPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDAzZmYpO1xuICAgIGlmIChleHBvbmVudCA9PT0gMCAmJiBtYW50aXNzYSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGV4cG9uZW50ID09PSAweDFmKSB7XG4gICAgICAgIHJldHVybiBtYW50aXNzYSA9PT0gMCA/IEluZmluaXR5ICogc2lnbiA6IE5hTjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkRXhwb25lbnQgPSBleHBvbmVudCAtIDE1O1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTWFudGlzc2EgPSBtYW50aXNzYSAvIDEwMjQ7XG4gICAgICAgIHJldHVybiBzaWduICogTWF0aC5wb3coMiwgbm9ybWFsaXplZEV4cG9uZW50KSAqICgxICsgbm9ybWFsaXplZE1hbnRpc3NhKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQxNihkYXRhVmlldzogRGF0YVZpZXcsIG9mZnNldDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNpZ24gPSB2YWx1ZSA8IDAgPyAxIDogMDtcbiAgICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcbiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAweDdjMDAgfCAoc2lnbiA8PCAxNSkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4cG9uZW50ID0gTWF0aC5mbG9vcihNYXRoLmxvZzIodmFsdWUpKTtcbiAgICBjb25zdCBtYW50aXNzYSA9IHZhbHVlIC8gTWF0aC5wb3coMiwgZXhwb25lbnQpIC0gMTtcbiAgICBjb25zdCBub3JtYWxpemVkRXhwb25lbnQgPSBleHBvbmVudCArIDE1O1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRNYW50aXNzYSA9IE1hdGgucm91bmQobWFudGlzc2EgKiAxMDI0KTtcbiAgICBpZiAobm9ybWFsaXplZEV4cG9uZW50IDw9IDApIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgc2lnbiA8PCAxNSk7XG4gICAgfSBlbHNlIGlmIChub3JtYWxpemVkRXhwb25lbnQgPj0gMHgxZikge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAweDdjMDAgfCAoc2lnbiA8PCAxNSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIChzaWduIDw8IDE1KSB8IChub3JtYWxpemVkRXhwb25lbnQgPDwgMTApIHwgbm9ybWFsaXplZE1hbnRpc3NhKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCeXRlV3JpdGVyIHtcbiAgICBwcml2YXRlIGRhdGFWaWV3OiBEYXRhVmlldztcbiAgICBwcml2YXRlIGJ1ZmZlcjogQXJyYXlCdWZmZXI7XG4gICAgcHJpdmF0ZSBvZmZzZXQgPSAwO1xuICAgIHByaXZhdGUgZmluaXNoZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGluaXQ/OiBBcnJheUJ1ZmZlciwgb2Zmc2V0PzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0ID8/IDA7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gaW5pdCA/PyBuZXcgQXJyYXlCdWZmZXIoMTAyNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWZmZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkoYnVmZmVyOiBVaW50OEFycmF5KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdWludDhBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVdyaXRlcihhcnJheUJ1ZmZlciwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWxsb2NhdGUobGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICsgbGVuZ3RoID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbmV3Qnl0ZUxlbmd0aCA9IE1hdGgubWF4KHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGggKiAyLCB0aGlzLm9mZnNldCArIGxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBuZXdCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobmV3Qnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICBuZXcgVWludDhBcnJheShuZXdCdWZmZXIpLnNldChuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlcikpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXdCdWZmZXI7XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZShkYXRhOiBVaW50OEFycmF5KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGxvY2F0ZShkYXRhLmxlbmd0aCk7XG4gICAgICAgIG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKS5zZXQoZGF0YSwgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlQm9vbGVhbih2YWx1ZTogYm9vbGVhbik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDgodGhpcy5vZmZzZXQsIHZhbHVlID8gMSA6IDApO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQ4KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ4KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50OCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50MTYodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50MTYodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50MzIodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDMyKHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDMyKHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDY0KHZhbHVlOiBiaWdpbnQpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg4KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRCaWdJbnQ2NCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50NjQodmFsdWU6IGJpZ2ludCk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDgpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEJpZ1VpbnQ2NCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVTEVCMTI4KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgLy8gVW5zaWduZWQgTEVCMTI4XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodmFsdWUgPiAweDdmKSB7XG4gICAgICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50OCh0aGlzLm9mZnNldCwgKHZhbHVlICYgMHg3ZikgfCAweDgwKTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB2YWx1ZSA+Pj0gNztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSAmIDB4N2YpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgd3JpdGVGbG9hdDE2KHRoaXMuZGF0YVZpZXcsIHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0MzIodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEZsb2F0MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQ2NCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQ2NCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50OEFycmF5KHZhbHVlOiBVaW50OEFycmF5KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMud3JpdGVVTEVCMTI4KHZhbHVlLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLndyaXRlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVVpbnQ4QXJyYXkodGV4dEVuY29kZXIuZW5jb2RlKHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUpTT04odmFsdWU6IEpzb25UeXBlKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxhZ3MoZmxhZ3M6IEZsYWdzKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIGZsYWdzLndyaXRlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluaXNoKCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIsIDAsIHRoaXMub2Zmc2V0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCeXRlUmVhZGVyIHtcbiAgICBwcml2YXRlIGRhdGFWaWV3OiBEYXRhVmlldztcbiAgICBwcml2YXRlIG9mZnNldDogbnVtYmVyO1xuICAgIHByaXZhdGUgZmluaXNoZWQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGRhdGE6IERhdGFWaWV3KSB7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcgPSBkYXRhO1xuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VaW50OEFycmF5KGJ1ZmZlcjogVWludDhBcnJheSk6IEJ5dGVSZWFkZXIge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgIHVpbnQ4QXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQXJyYXlCdWZmZXIoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IEJ5dGVSZWFkZXIge1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVSZWFkZXIoZGF0YVZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZnJvbUJsb2IoYmxvYjogQmxvYik6IFByb21pc2U8Qnl0ZVJlYWRlcj4ge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGJsb2IuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVSZWFkZXIoZGF0YVZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkKHNpemU6IG51bWJlcik6IFVpbnQ4QXJyYXkge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaXplIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vZmZzZXQgKyBzaXplID4gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhVmlldy5idWZmZXIsIHRoaXMub2Zmc2V0LCBzaXplKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkQm9vbGVhbigpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQ4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDE2KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDE2KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDY0KCk6IGJpZ2ludCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRCaWdJbnQ2NCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQ2NCgpOiBiaWdpbnQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0QmlnVWludDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVUxFQjEyOCgpOiBudW1iZXIge1xuICAgICAgICAvLyBVbnNpZ25lZCBMRUIxMjhcbiAgICAgICAgbGV0IHZhbHVlID0gMDtcbiAgICAgICAgbGV0IHNoaWZ0ID0gMDtcbiAgICAgICAgbGV0IGJ5dGU6IG51bWJlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMuZGF0YVZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBieXRlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICAgICAgdmFsdWUgfD0gKGJ5dGUgJiAwYjAxMTExMTExKSA8PCBzaGlmdDtcbiAgICAgICAgICAgIHNoaWZ0ICs9IDc7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKChieXRlICYgMGIxMDAwMDAwMCkgIT09IDApO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDE2KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVhZEZsb2F0MTYodGhpcy5kYXRhVmlldywgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRGbG9hdDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxvYXQ2NCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0RmxvYXQ2NCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQ4QXJyYXkoKTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucmVhZFVMRUIxMjgoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZChsZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IHRoaXMucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIHRleHREZWNvZGVyLmRlY29kZShieXRlQXJyYXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSlNPTjxUIGV4dGVuZHMgSnNvblR5cGU+KCk6IFQge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLnJlYWRTdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbGFncyhsZW5ndGg6IG51bWJlcik6IEZsYWdzIHtcbiAgICAgICAgcmV0dXJuIEZsYWdzLnJlYWQodGhpcywgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5vZmZzZXQgIT09IHRoaXMuZGF0YVZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuXG5leHBvcnQgdHlwZSBKc29uVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkIHwgeyBba2V5IGluIG5ldmVyXT86IEpzb25UeXBlIH0gfCBKc29uVHlwZVtdO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZTxULCBEPiB7XG4gICAgc2VyaWFsaXplKGRhdGE6IFQpOiBEO1xuICAgIGRlc2VyaWFsaXplKGRhdGE6IEQpOiBUO1xufVxuXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplcjxULCBEPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZXJpYWxpemU6IChkYXRhOiBUKSA9PiBELFxuICAgICAgICBwdWJsaWMgZGVzZXJpYWxpemU6IChkYXRhOiBEKSA9PiBULFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG9mPFQsIEQ+KHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBEPik6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oc2VyaWFsaXplci5zZXJpYWxpemUsIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGlwZTxULCBSLCBEPihzZXIxOiBTZXJpYWxpemFibGU8VCwgUj4sIHNlcjI6IFNlcmlhbGl6YWJsZTxSLCBEPik6IFNlcmlhbGl6YWJsZTxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIyLnNlcmlhbGl6ZShzZXIxLnNlcmlhbGl6ZShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gc2VyMS5kZXNlcmlhbGl6ZShzZXIyLmRlc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYW5zZm9ybTxUPihmdW5jOiAodmFsdWU6IFQpID0+IFQpOiBTZXJpYWxpemVyPFQsIFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFQ+KFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBub29wPFQ+KCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZDxcbiAgICAgICAgSyBleHRlbmRzIGtleW9mIEQsXG4gICAgICAgIFIsXG4gICAgPihcbiAgICAgICAga2V5OiBLLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RFtLXSwgUj4sXG4gICAgKTogU2VyaWFsaXplcjxcbiAgICAgICAgVCxcbiAgICAgICAgeyBbUCBpbiBrZXlvZiBEXTogUCBleHRlbmRzIEsgPyBSIDogRFtQXSB9XG4gICAgPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxcbiAgICAgICAgICAgIFQsXG4gICAgICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICAgICAgPihcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNlcmlhbGl6ZWQsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLnNlcmlhbGl6ZShzZXJpYWxpemVkW2tleV0pLFxuICAgICAgICAgICAgICAgIH0gYXMgeyBbUCBpbiBrZXlvZiBEXTogUCBleHRlbmRzIEsgPyBSIDogRFtQXSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBba2V5XTogc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhW2tleV0gYXMgUiksXG4gICAgICAgICAgICAgICAgfSBhcyBEKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGpzb248VCBleHRlbmRzIEpzb25UeXBlPigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogU2VyaWFsaXplcjxULCBVaW50OEFycmF5PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBVaW50OEFycmF5PihcbiAgICAgICAgICAgIChkYXRhKSA9PiB0ZXh0RW5jb2Rlci5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJpYWxpemUoZGF0YSkpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShKU09OLnBhcnNlKHRleHQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvQXJyYXkoKTogU2VyaWFsaXplcjxUW10sIERbXT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VFtdLCBEW10+KFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEubWFwKChpdGVtKSA9PiB0aGlzLnNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuZGVzZXJpYWxpemUoaXRlbSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b01hcCgpOiBTZXJpYWxpemVyPE1hcDxzdHJpbmcsIFQ+LCBNYXA8c3RyaW5nLCBEPj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PihcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIEQ+KCk7XG4gICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCB0aGlzLnNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2soZmFsbGJhY2s6IFQpOiBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRoaXMuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZhbGxiYWNrTWFwKGZhbGxiYWNrOiAoZGF0YTogRCwgZXJyb3I6IHVua25vd24pID0+IFQpOiBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRoaXMuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2soZGF0YSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHBpcGU8RT4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPEQsIEU+KTogU2VyaWFsaXplcjxULCBFPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBFPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLnNlcmlhbGl6ZShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSnNvblR5cGUsIHR5cGUgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGNsYXNzIEVuZHBvaW50VHlwZTxSZXEgPSB1bmtub3duLCBSZXMgPSB1bmtub3duPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVxLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFJlcywgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uSWQ/OiBJZGVudGlmaWVyIHwgdW5kZWZpbmVkLFxuICAgICkgeyB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxSZXEsIFJlcywgUmVxRGF0YSBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGUsIFJlc0RhdGEgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFJlcSwgUmVxRGF0YT47XG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8UmVzLCBSZXNEYXRhPjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZD86IEludG9JZDtcbiAgICAgICAgfSxcbiAgICApOiBFbmRwb2ludFR5cGU8UmVxLCBSZXM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFR5cGU8UmVxLCBSZXM+KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8UmVxLCBKc29uVHlwZSwgVWludDhBcnJheT4ocmVxdWVzdFNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxSZXMsIEpzb25UeXBlLCBVaW50OEFycmF5PihyZXNwb25zZVNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCA/IElkZW50aWZpZXIuZnJvbShwZXJtaXNzaW9uSWQpIDogdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFJlcSwgUmVzPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVxLCBVaW50OEFycmF5PjtcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFJlcywgVWludDhBcnJheT47XG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQ/OiBJbnRvSWQ7XG4gICAgICAgIH0sXG4gICAgKTogRW5kcG9pbnRUeXBlPFJlcSwgUmVzPiB7XG4gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRUeXBlPFJlcSwgUmVzPihcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQgPyBJZGVudGlmaWVyLmZyb20ocGVybWlzc2lvbklkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211JztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRlbnNpb24ge1xuICAgIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU7XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25UeXBlPFQgZXh0ZW5kcyBFeHRlbnNpb24gPSBFeHRlbnNpb24+IGV4dGVuZHMgSWRlbnRpZmllciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGU6IChvbXU6IE9tdSkgPT4gVCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ2V4dCcsIG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKCdleHQnLCB0aGlzLm5hbWUpLmtleSgpO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgVW5saXN0ZW4gPSAoKSA9PiB2b2lkO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFAgZXh0ZW5kcyBBcnJheTxhbnk+PiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IEFycmF5PCguLi5hcmdzOiBQKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4gPSBbXTtcblxuICAgIHB1YmxpYyBsaXN0ZW4obGlzdGVuZXI6ICguLi5hcmdzOiBQKSA9PiBhbnkpOiBVbmxpc3RlbiB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKHRoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdCguLi5hcmdzOiBQKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgWy4uLnRoaXMubGlzdGVuZXJzXSkge1xuICAgICAgICAgICAgYXdhaXQgbGlzdGVuZXIoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLAogICAgIlxudHlwZSBUYXNrID0gKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGNsYXNzIExvY2sge1xuICAgIHByaXZhdGUgdGFza3M6IChUYXNrKVtdID0gW107XG4gICAgcHJpdmF0ZSB3YWl0ZXI6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgd2FpdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMud2FpdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWl0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53YWl0ZXIgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVuVGFza3MgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMudGFza3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gdGhpcy50YXNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGFzaygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMud2FpdGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcnVuVGFza3MoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXNlPFQ+KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXNrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXdhaXQgcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnRhc2tzLnB1c2godGFzayk7XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXQoKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEpzb25UeXBlLCB0eXBlIFNlcmlhbGl6YWJsZSwgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCB0eXBlIFBhY2tldERhdGEgPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGRhdGE6IFVpbnQ4QXJyYXk7XG59O1xuXG5leHBvcnQgdHlwZSBQYWNrZXQ8VCA9IHVua25vd24+ID0ge1xuICAgIHJlYWRvbmx5IHR5cGU6IFBhY2tldFR5cGU8VD47XG4gICAgcmVhZG9ubHkgZGF0YTogVDtcbn07XG5cbmV4cG9ydCBjbGFzcyBQYWNrZXRUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmV3KGRhdGE6IFQpOiBQYWNrZXQ8VD4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdGhpcyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBtYXRjaChwYWNrZXQ6IFBhY2tldCk6IHBhY2tldCBpcyBQYWNrZXQ8VD4ge1xuICAgICAgICByZXR1cm4gcGFja2V0LnR5cGUgPT09IHRoaXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZUpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KGlkZW50aWZpZXI6IElkZW50aWZpZXIsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2VyaWFsaXplcixcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgc2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxULCBEPjtcbiAgICB9KTogUGFja2V0VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFja2V0VHlwZTxUPihcbiAgICAgICAgICAgIGlkZW50aWZpZXIuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxULCBELCBVaW50OEFycmF5PihzZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8VD4oaWRlbnRpZmllcjogSWRlbnRpZmllciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgfSk6IFBhY2tldFR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhY2tldFR5cGUoXG4gICAgICAgICAgICBpZGVudGlmaWVyLmpvaW4obmFtZSksXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBcHBKc29uIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplL3NlcmlhbGl6ZXIuanMnO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4vcGFja2V0LmpzJztcblxuY29uc3QgSURFTlRJRklFUiA9IG5ldyBJZGVudGlmaWVyKCdjb3JlJywgJ3BhY2tldCcpO1xuXG50eXBlIFByb3RvY29sSW5mbyA9IHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG59O1xuXG50eXBlIFJTQU51bWJlcnMgPSB7XG4gICAgZTogc3RyaW5nO1xuICAgIG46IHN0cmluZztcbn07XG5cbnR5cGUgRW5jcnlwdGlvblJlcXVlc3QgPSB7XG4gICAga2luZDogJ3YxJztcbiAgICByc2E6IFJTQU51bWJlcnM7XG59O1xuXG50eXBlIEVuY3J5cHRpb25SZXNwb25zZSA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbiAgICBhZXM6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNlcnZlck1ldGEgPSB7XG4gICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVxdWVzdCB8IG51bGw7XG4gICAgaGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxudHlwZSBDb25uZWN0UGFja2V0SnNvbiA9IHtcbiAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG59O1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdFBhY2tldCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICAgIHB1YmxpYyByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgICAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgICAgICBhcHA6IEFwcDtcbiAgICAgICAgdG9rZW46IHN0cmluZztcbiAgICAgICAgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnByb3RvY29sID0gb3B0aW9ucy5wcm90b2NvbDtcbiAgICAgICAgdGhpcy5hcHAgPSBvcHRpb25zLmFwcDtcbiAgICAgICAgdGhpcy50b2tlbiA9IG9wdGlvbnMudG9rZW47XG4gICAgICAgIHRoaXMuZW5jcnlwdGlvbiA9IG9wdGlvbnMuZW5jcnlwdGlvbiA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogQ29ubmVjdFBhY2tldEpzb24pOiBDb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgIHByb3RvY29sOiBkYXRhLnByb3RvY29sLFxuICAgICAgICAgICAgYXBwOiBBcHAuZGVzZXJpYWxpemUoZGF0YS5hcHApLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogZGF0YS5lbmNyeXB0aW9uLFxuICAgICAgICAgICAgdG9rZW46IGRhdGEudG9rZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IENvbm5lY3RQYWNrZXQpOiBDb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcm90b2NvbDogZGF0YS5wcm90b2NvbCxcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShkYXRhLmFwcCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBkYXRhLmVuY3J5cHRpb24sXG4gICAgICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBlbnVtIERpc2Nvbm5lY3RUeXBlIHtcbiAgICBJTlZBTElEX1RPS0VOID0gJ2ludmFsaWRfdG9rZW4nLFxuICAgIElOVkFMSURfT1JJR0lOID0gJ2ludmFsaWRfb3JpZ2luJyxcbiAgICBJTlZBTElEX1ZFUlNJT04gPSAnaW52YWxpZF92ZXJzaW9uJyxcbiAgICBJTlZBTElEX1BBQ0tFVF9UWVBFID0gJ2ludmFsaWRfcGFja2V0X3R5cGUnLFxuICAgIElOVkFMSURfUEFDS0VUX0RBVEEgPSAnaW52YWxpZF9wYWNrZXRfZGF0YScsXG4gICAgSU5WQUxJRF9QQUNLRVQgPSAnaW52YWxpZF9wYWNrZXQnLFxuICAgIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsX2Vycm9yJyxcbiAgICBBTk9USEVSX0NPTk5FQ1RJT04gPSAnYW5vdGhlcl9jb25uZWN0aW9uJyxcbiAgICBQRVJNSVNTSU9OX0RFTklFRCA9ICdwZXJtaXNzaW9uX2RlbmllZCcsXG4gICAgQVBQX1JFTU9WRUQgPSAnYXBwX3JlbW92ZWQnLFxuICAgIFNFUlZFUl9SRVNUQVJUID0gJ3NlcnZlcl9yZXN0YXJ0JyxcbiAgICBTSFVURE9XTiA9ICdzaHV0ZG93bicsXG4gICAgQ0xPU0UgPSAnY2xvc2UnLFxufVxuXG50eXBlIERpc2Nvbm5lY3RQYWNrZXRKc29uID0ge1xuICAgIHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgIG1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG59O1xuXG5leHBvcnQgY2xhc3MgRGlzY29ubmVjdFBhY2tldCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgICAgICB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZyB8IG51bGw7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXQpOiBEaXNjb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSnNvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogRGlzY29ubmVjdFBhY2tldEpzb24pOiBEaXNjb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIERpc2Nvbm5lY3RQYWNrZXQuZnJvbUpzb24oZGF0YSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21Kc29uKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXRKc29uKTogRGlzY29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBuZXcgRGlzY29ubmVjdFBhY2tldCh7XG4gICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvSnNvbigpOiBEaXNjb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUEFDS0VUX1RZUEVTOiB7XG4gICAgU0VSVkVSX01FVEE6IFBhY2tldFR5cGU8U2VydmVyTWV0YT47XG4gICAgQ09OTkVDVDogUGFja2V0VHlwZTxDb25uZWN0UGFja2V0PjtcbiAgICBESVNDT05ORUNUOiBQYWNrZXRUeXBlPERpc2Nvbm5lY3RQYWNrZXQ+O1xuICAgIFRPS0VOOiBQYWNrZXRUeXBlPHN0cmluZz47XG4gICAgUkVBRFk6IFBhY2tldFR5cGU8dW5kZWZpbmVkPjtcbiAgICBFTkNSWVBURURfUEFDS0VUOiBQYWNrZXRUeXBlPFVpbnQ4QXJyYXk+O1xufSA9IHtcbiAgICBTRVJWRVJfTUVUQTogUGFja2V0VHlwZS5jcmVhdGVKc29uPFNlcnZlck1ldGE+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3NlcnZlcl9tZXRhJyxcbiAgICB9KSxcbiAgICBDT05ORUNUOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248Q29ubmVjdFBhY2tldD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnY29ubmVjdCcsXG4gICAgICAgIHNlcmlhbGl6ZXI6IENvbm5lY3RQYWNrZXQsXG4gICAgfSksXG4gICAgRElTQ09OTkVDVDogUGFja2V0VHlwZS5jcmVhdGVKc29uPERpc2Nvbm5lY3RQYWNrZXQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2Rpc2Nvbm5lY3QnLFxuICAgICAgICBzZXJpYWxpemVyOiBEaXNjb25uZWN0UGFja2V0LFxuICAgIH0pLFxuICAgIFRPS0VOOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248c3RyaW5nPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICd0b2tlbicsXG4gICAgfSksXG4gICAgUkVBRFk6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjx1bmRlZmluZWQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3JlYWR5JyxcbiAgICB9KSxcbiAgICBFTkNSWVBURURfUEFDS0VUOiBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VWludDhBcnJheT4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnZScsXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcCgpLFxuICAgIH0pLFxufTtcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBSZWdpc3RyeVBlcm1pc3Npb25zLCBSZWdpc3RyeVBlcm1pc3Npb25zSlNPTiB9IGZyb20gJy4vcmVnaXN0cnknO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZTogVWludDhBcnJheSB8IG51bGwsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogUmVnaXN0cnlQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZUJvb2xlYW4ocGFja2V0LnZhbHVlICE9PSBudWxsKTtcbiAgICAgICAgaWYgKHBhY2tldC52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShwYWNrZXQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogUmVnaXN0cnlQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZWFkZXIucmVhZEJvb2xlYW4oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBleGlzdGluZyA/IHJlYWRlci5yZWFkVWludDhBcnJheSgpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeVBhY2tldChpZCwgdmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclBhY2tldEpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVybWlzc2lvbnM6IFJlZ2lzdHJ5UGVybWlzc2lvbnNKU09OO1xufVxuXG5leHBvcnQgY2xhc3MgUmVnaXN0ZXJQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uczogUmVnaXN0cnlQZXJtaXNzaW9ucyxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFJlZ2lzdGVyUGFja2V0KTogUmVnaXN0ZXJQYWNrZXRKU09OIHtcbiAgICAgICAgY29uc3QgeyBwZXJtaXNzaW9uczogcGVybXMgfSA9IHBhY2tldDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBwYWNrZXQuaWQua2V5KCksXG4gICAgICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgICAgICAgIGFsbDogcGVybXMuYWxsID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLmFsbCkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVhZDogcGVybXMucmVhZCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5yZWFkKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB3cml0ZTogcGVybXMud3JpdGUgPyBJZGVudGlmaWVyLmZyb20ocGVybXMud3JpdGUpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFJlZ2lzdGVyUGFja2V0SlNPTik6IFJlZ2lzdGVyUGFja2V0IHtcbiAgICAgICAgY29uc3QgeyBwZXJtaXNzaW9uczogcGVybXMgfSA9IGRhdGE7XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oZGF0YS5pZCksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWxsOiBwZXJtcy5hbGwgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuYWxsKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWFkOiBwZXJtcy5yZWFkID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLnJlYWQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHdyaXRlOiBwZXJtcy53cml0ZSA/IElkZW50aWZpZXIuZnJvbShwZXJtcy53cml0ZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBKc29uVHlwZSwgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5UGVybWlzc2lvbnNKU09OIHtcbiAgICBhbGw/OiBzdHJpbmc7XG4gICAgcmVhZD86IHN0cmluZztcbiAgICB3cml0ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeVBlcm1pc3Npb25zIHtcbiAgICBhbGw/OiBJbnRvSWQ7XG4gICAgcmVhZD86IEludG9JZDtcbiAgICB3cml0ZT86IEludG9JZDtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5VHlwZTxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogVCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBSZWdpc3RyeVBlcm1pc3Npb25zLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KGlkZW50aWZpZXI6IEludG9JZCwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFQ7XG4gICAgICAgIHBlcm1pc3Npb25zPzogUmVnaXN0cnlQZXJtaXNzaW9ucztcbiAgICAgICAgc2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxULCBEPjtcbiAgICB9KTogUmVnaXN0cnlUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeVR5cGUoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxULCBELCBVaW50OEFycmF5PihzZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyA/PyB7fSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8VD4oaWRlbnRpZmllcjogSW50b0lkLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogVDtcbiAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgICAgICBwZXJtaXNzaW9ucz86IFJlZ2lzdHJ5UGVybWlzc2lvbnM7XG4gICAgfSk6IFJlZ2lzdHJ5VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cnlUeXBlKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMgPz8ge30sXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5PFQ+IHtcbiAgICByZWFkb25seSB0eXBlOiBSZWdpc3RyeVR5cGU8VD47XG4gICAgcmVhZG9ubHkgdmFsdWU6IFQ7XG4gICAgZ2V0KCk6IFByb21pc2U8VD47XG4gICAgc2V0KHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPjtcbiAgICB1cGRhdGUoZm46ICh2YWx1ZTogVCkgPT4gUHJvbWlzZUxpa2U8VD4gfCBUKTogUHJvbWlzZTxUPjtcbiAgICBtb2RpZnkoZm46ICh2YWx1ZTogVCkgPT4gUHJvbWlzZUxpa2U8VD4gfCBUKTogUHJvbWlzZTxUPjtcbiAgICBsaXN0ZW4oZm46ICh2YWx1ZTogVCkgPT4gdm9pZCk6IFVubGlzdGVuO1xuXG4gICAgY29tcGF0U3ZlbHRlKCk6IFdyaXRhYmxlPFQ+O1xufVxuXG5leHBvcnQgdHlwZSBTdWJzY3JpYmVyPFQ+ID0gKHZhbHVlOiBUKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBVbnN1YnNjcmliZXIgPSAoKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVyPFQ+ID0gKHZhbHVlOiBUKSA9PiBUO1xuXG5leHBvcnQgdHlwZSBTdGFydFN0b3BOb3RpZmllcjxUPiA9IChcbiAgICBzZXQ6ICh2YWx1ZTogVCkgPT4gdm9pZCxcbiAgICB1cGRhdGU6IChmbjogVXBkYXRlcjxUPikgPT4gdm9pZFxuKSA9PiB2b2lkIHwgKCgpID0+IHZvaWQpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRhYmxlPFQ+IHtcbiAgICBzdWJzY3JpYmUodGhpczogdm9pZCwgcnVuOiBTdWJzY3JpYmVyPFQ+KTogVW5zdWJzY3JpYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRhYmxlPFQ+IGV4dGVuZHMgUmVhZGFibGU8VD4ge1xuICAgIHNldCh0aGlzOiB2b2lkLCB2YWx1ZTogVCk6IHZvaWQ7XG4gICAgdXBkYXRlKHRoaXM6IHZvaWQsIHVwZGF0ZXI6IFVwZGF0ZXI8VD4pOiB2b2lkO1xuICAgIHdhaXQoKTogUHJvbWlzZTxUPjtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IExvY2sgfSBmcm9tICcuLi8uLi9sb2NrLmpzJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgSnNvblR5cGUsIFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgdHlwZSBFeHRlbnNpb24sIEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQgeyBSZWdpc3RlclBhY2tldCwgUmVnaXN0cnlQYWNrZXQgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuaW1wb3J0IHsgdHlwZSBSZWdpc3RyeSwgUmVnaXN0cnlUeXBlLCBXcml0YWJsZSB9IGZyb20gJy4vcmVnaXN0cnkuanMnO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFJlZ2lzdHJ5RXh0ZW5zaW9uPiA9IFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmllcyA9IG5ldyBJZGVudGlmaWVyTWFwPFJlZ2lzdHJ5PHVua25vd24+PigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFJFR0lTVFJZX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIFJFR0lTVFJZX1VQREFURV9QQUNLRVQsXG4gICAgICAgICAgICBSRUdJU1RSWV9MSVNURU5fUEFDS0VULFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUmVnaXN0cnk8VD4ocmVnaXN0cnlUeXBlOiBSZWdpc3RyeVR5cGU8VD4pOiBSZWdpc3RyeTxUPiB7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKHJlZ2lzdHJ5VHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgd2l0aCBpZGVudGlmaWVyICcke3JlZ2lzdHJ5VHlwZS5pZH0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeUltcGwodGhpcy5vbXUsIHJlZ2lzdHJ5VHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihyZWdpc3RyeVR5cGU6IFJlZ2lzdHJ5VHlwZTxUPik6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHJlZ2lzdHJ5VHlwZS5pZDtcbiAgICAgICAgbGV0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyaWVzLmdldChpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKHJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5ID0gdGhpcy5jcmVhdGVSZWdpc3RyeShyZWdpc3RyeVR5cGUpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RyaWVzLnNldChpZGVudGlmaWVyLCByZWdpc3RyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5IGFzIFJlZ2lzdHJ5PFQ+O1xuICAgIH1cblxuICAgIHB1YmxpYyBqc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgZGVmYXVsdDogVDsgc2VyaWFsaXplcj86IFNlcmlhbGl6ZXI8VCwgRD4gfSk6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyaWVzLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpc3RyeSB3aXRoIG5hbWUgJyR7bmFtZX0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248VD4oaWRlbnRpZmllciwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogb3B0aW9ucy5kZWZhdWx0LFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVnaXN0cnkodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VyaWFsaXplZDxUPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgZGVmYXVsdDogVDsgc2VyaWFsaXplcjogU2VyaWFsaXplcjxULCBVaW50OEFycmF5PiB9KTogUmVnaXN0cnk8VD4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5IHdpdGggbmFtZSAnJHtuYW1lfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBvcHRpb25zLmRlZmF1bHQsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWdpc3RyeSh0YWJsZVR5cGUpO1xuICAgIH1cbn1cblxuY2xhc3MgUmVnaXN0cnlJbXBsPFQ+IGltcGxlbWVudHMgUmVnaXN0cnk8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8W1RdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2s6IExvY2sgPSBuZXcgTG9jaygpO1xuICAgIHByaXZhdGUgbGlzdGVuaW5nID0gZmFsc2U7XG4gICAgcHVibGljIHZhbHVlOiBUO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZWdpc3RyeVR5cGU8VD4sXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0eXBlLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRUdJU1RSWV9VUERBVEVfUEFDS0VULCAocGFja2V0KSA9PlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVVcGRhdGUocGFja2V0KSxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkVGFzaygoKSA9PiB0aGlzLm9uVGFzaygpKTtcbiAgICB9XG5cbiAgICBhc3luYyAjZ2V0KCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChSRUdJU1RSWV9HRVRfRU5EUE9JTlQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXN1bHQudmFsdWUpO1xuICAgIH1cblxuICAgIGFzeW5jICNzZXQodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9VUERBVEVfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy50eXBlLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudHlwZS5zZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5sb2NrLnVzZShhc3luYyAoKSA9PiB0aGlzLiNnZXQoKSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHRoaXMuI3NldCh2YWx1ZSkpO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubG9jay51c2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLiNnZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYXdhaXQgZm4odmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc2V0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1vZGlmeShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy4jZ2V0KCk7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGF3YWl0IGZuKHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3NldChuZXdWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4oaGFuZGxlcjogKHZhbHVlOiBUKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZyAmJiB0aGlzLm9tdS5yZWFkeSkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9MSVNURU5fUEFDS0VULCB0aGlzLnR5cGUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyLmxpc3RlbihoYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVVwZGF0ZShkYXRhOiBSZWdpc3RyeVBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGEuaWQuaXNFcXVhbCh0aGlzLnR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25UYXNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVHSVNUUllfTElTVEVOX1BBQ0tFVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHlwZS5pZC5pc1N1YnBhdGhPZih0aGlzLm9tdS5hcHAuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9SRUdJU1RFUl9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy50eXBlLnBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcGF0U3ZlbHRlKCk6IFdyaXRhYmxlPFQ+IHtcbiAgICAgICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgICAgIGxldCB2YWx1ZTogVCA9IHRoaXMudmFsdWU7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBTZXQ8KHZhbHVlOiBUKSA9PiB2b2lkPigpO1xuICAgICAgICB0aGlzLmxpc3RlbigobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgocnVuKSA9PiB7XG4gICAgICAgICAgICAgICAgcnVuKHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldDogKHZhbHVlOiBUKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5ICR7dGhpcy50eXBlLmlkLmtleSgpfSBpcyBub3QgcmVhZHlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1YnNjcmliZTogKHJ1bikgPT4ge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5hZGQocnVuKTtcbiAgICAgICAgICAgICAgICBydW4odmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUocnVuKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZTogKGZuKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5ICR7dGhpcy50eXBlLmlkLmtleSgpfSBpcyBub3QgcmVhZHlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZm4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhaXQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUkVHSVNUUllfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8UmVnaXN0cnlFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3JlZ2lzdHJ5JyxcbiAgICAob211OiBPbXUpID0+IG5ldyBSZWdpc3RyeUV4dGVuc2lvbihvbXUpLFxuKTtcbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUkVHSVNUUllfRVhURU5TSU9OX1RZUEUuam9pbigncGVybWlzc2lvbicpO1xuY29uc3QgUkVHSVNUUllfUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlZ2lzdGVyUGFja2V0PihSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWdpc3RlcicsXG4gICAgc2VyaWFsaXplcjogUmVnaXN0ZXJQYWNrZXQsXG59KTtcbmNvbnN0IFJFR0lTVFJZX1VQREFURV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8UmVnaXN0cnlQYWNrZXQ+KFxuICAgIFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3VwZGF0ZScsXG4gICAgICAgIHNlcmlhbGl6ZXI6IFJlZ2lzdHJ5UGFja2V0LFxuICAgIH0sXG4pO1xuY29uc3QgUkVHSVNUUllfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFJFR0lTVFJZX0dFVF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPElkZW50aWZpZXIsIFJlZ2lzdHJ5UGFja2V0PihcbiAgICBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdnZXQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0pzb24oKSxcbiAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBSZWdpc3RyeVBhY2tldCxcbiAgICAgICAgcGVybWlzc2lvbklkOiBSRUdJU1RSWV9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyLCBGbGFncyB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB0eXBlIHsgVGFibGVDb25maWcgfSBmcm9tICcuL3RhYmxlLmpzJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIpIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFRhYmxlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVQYWNrZXQoaWQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlSXRlbXNQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4sXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUl0ZW1zUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KE9iamVjdC5rZXlzKHBhY2tldC5pdGVtcykubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2V0Lml0ZW1zKSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGtleSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlSXRlbXNQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcbiAgICAgICAgY29uc3QgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgICAgICBpdGVtc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUl0ZW1zUGFja2V0KGlkLCBpdGVtcyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVLZXlzUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5czogc3RyaW5nW10sXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUtleXNQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVMRUIxMjgocGFja2V0LmtleXMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcGFja2V0LmtleXMpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVLZXlzUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAga2V5cy5wdXNoKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVLZXlzUGFja2V0KGlkLCBrZXlzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVByb3h5UGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBudW1iZXIsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZVByb3h5UGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5rZXkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KE9iamVjdC5rZXlzKHBhY2tldC5pdGVtcykubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2V0Lml0ZW1zKSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGtleSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlUHJveHlQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3Qga2V5ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgaXRlbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVQcm94eVBhY2tldChpZCwgaXRlbXMsIGtleSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRhYmxlRmV0Y2hQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBsaW1pdDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYmFja3dhcmQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUZldGNoUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5saW1pdCk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gbmV3IEZsYWdzKHsgbGVuZ3RoOiAyIH0pO1xuICAgICAgICBmbGFncy5zZXQoMCwgcGFja2V0LmJhY2t3YXJkKTtcbiAgICAgICAgZmxhZ3Muc2V0KDEsIHBhY2tldC5jdXJzb3IgIT09IG51bGwpO1xuICAgICAgICB3cml0ZXIud3JpdGVGbGFncyhmbGFncyk7XG4gICAgICAgIGlmIChwYWNrZXQuY3Vyc29yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmN1cnNvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZUZldGNoUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcmVhZGVyLnJlYWRGbGFncygyKTtcbiAgICAgICAgY29uc3QgYmFja3dhcmQgPSBmbGFncy5nZXQoMCk7XG4gICAgICAgIGNvbnN0IGN1cnNvciA9IGZsYWdzLmlmU2V0KDEsICgpID0+IHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlRmV0Y2hQYWNrZXQoaWQsIGxpbWl0LCBiYWNrd2FyZCwgY3Vyc29yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUZldGNoUmFuZ2VQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGFydDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZW5kOiBzdHJpbmcsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUZldGNoUmFuZ2VQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuc3RhcnQpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmVuZCk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVGZXRjaFJhbmdlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZW5kID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZldGNoUmFuZ2VQYWNrZXQoaWQsIHN0YXJ0LCBlbmQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldENvbmZpZ1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogVGFibGVDb25maWcsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBTZXRDb25maWdQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeShwYWNrZXQuY29uZmlnKSk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogU2V0Q29uZmlnUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiBuZXcgU2V0Q29uZmlnUGFja2V0KGlkLCBjb25maWcpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldFBlcm1pc3Npb25QYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBhbGw6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVhZDogSWRlbnRpZmllciB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB3cml0ZTogSWRlbnRpZmllciB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZW1vdmU6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcHJveHk6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2V0UGVybWlzc2lvblBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgbGV0IGZsYWdzID0gMDtcbiAgICAgICAgaWYgKHBhY2tldC5hbGwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnJlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC53cml0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gMGIxMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZW1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTAwMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnByb3h5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwMDAwO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4KGZsYWdzKTtcbiAgICAgICAgaWYgKHBhY2tldC5hbGwpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuYWxsLmtleSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnJlYWQpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQucmVhZC5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC53cml0ZSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC53cml0ZS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZW1vdmUpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQucmVtb3ZlLmtleSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnByb3h5KSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnByb3h5LmtleSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNldFBlcm1pc3Npb25QYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSByZWFkZXIucmVhZFVpbnQ4KCk7XG4gICAgICAgIGNvbnN0IGFsbCA9IGZsYWdzICYgMGIxID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVhZCA9IGZsYWdzICYgMGIxMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHdyaXRlID0gZmxhZ3MgJiAwYjEwMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IGZsYWdzICYgMGIxMDAwID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcHJveHkgPSBmbGFncyAmIDBiMTAwMDAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFNldFBlcm1pc3Npb25QYWNrZXQoaWQsIGFsbCwgcmVhZCwgd3JpdGUsIHJlbW92ZSwgcHJveHkpO1xuICAgIH1cbn1cblxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEV2ZW50RW1pdHRlciwgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgVGFibGVDb25maWcgPSB7XG4gICAgY2FjaGVfc2l6ZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZTxUPiB7XG4gICAgcmVhZG9ubHkgY2FjaGU6IFJlYWRvbmx5TWFwPHN0cmluZywgVD47XG4gICAgcmVhZG9ubHkgZXZlbnQ6IFRhYmxlRXZlbnRzPFQ+O1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG4gICAgZ2V0TWFueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGFkZCguLi5pdGVtOiBUW10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZSguLi5pdGVtOiBUW10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIHJlbW92ZSguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPjtcbiAgICBjbGVhcigpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGhhcyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG4gICAgaGFzTWFueTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KC4uLmtleXM6IChrZXlvZiBUKVtdKTogUHJvbWlzZTx7IFtrZXkgaW4ga2V5b2YgVF06IGJvb2xlYW4gfT47XG4gICAgaGFzQWxsKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICBoYXNBbnkoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gICAgZmV0Y2hJdGVtcyh7XG4gICAgICAgIGxpbWl0LFxuICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgY3Vyc29yLFxuICAgIH06IHtcbiAgICAgICAgbGltaXQ6IG51bWJlcjtcbiAgICAgICAgYmFja3dhcmQ/OiBib29sZWFuO1xuICAgICAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGZldGNoUmFuZ2UoeyBzdGFydCwgZW5kIH06IHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGZldGNoQWxsKCk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGl0ZXJhdGUoeyBiYWNrd2FyZCwgY3Vyc29yIH06IHsgYmFja3dhcmQ/OiBib29sZWFuOyBjdXJzb3I/OiBzdHJpbmcgfSk6IEFzeW5jSXRlcmFibGU8VD47XG4gICAgc2l6ZSgpOiBQcm9taXNlPG51bWJlcj47XG5cbiAgICBwcm94eShwcm94eTogKGl0ZW06IFQpID0+IFQgfCB1bmRlZmluZWQpOiBVbmxpc3RlbjtcbiAgICBzZXRDYWNoZVNpemUoc2l6ZTogbnVtYmVyKTogdm9pZDtcbiAgICBzZXRDb25maWcoY29uZmlnOiBUYWJsZUNvbmZpZyk6IHZvaWQ7XG4gICAgc2V0UGVybWlzc2lvbnMocGVybWlzc2lvbnM6IFRhYmxlUGVybWlzc2lvbnMpOiB2b2lkO1xuXG4gICAgbGlzdGVuKGxpc3RlbmVyPzogKGl0ZW1zOiBNYXA8c3RyaW5nLCBUPikgPT4gdm9pZCk6IFVubGlzdGVuO1xufVxuXG5leHBvcnQgdHlwZSBUYWJsZUV2ZW50czxUPiA9IHtcbiAgICBhZGQ6IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPjtcbiAgICB1cGRhdGU6IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPjtcbiAgICByZW1vdmU6IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPjtcbiAgICBjbGVhcjogRXZlbnRFbWl0dGVyPFtdPjtcbiAgICBjYWNoZVVwZGF0ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVQZXJtaXNzaW9ucyA9IHtcbiAgICBhbGw/OiBJZGVudGlmaWVyO1xuICAgIHJlYWQ/OiBJZGVudGlmaWVyO1xuICAgIHdyaXRlPzogSWRlbnRpZmllcjtcbiAgICByZW1vdmU/OiBJZGVudGlmaWVyO1xuICAgIHByb3h5PzogSWRlbnRpZmllcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyBrZXlGdW5jdGlvbjogKGl0ZW06IFQpID0+IHN0cmluZyxcbiAgICAgICAgcHVibGljIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucyB8IHVuZGVmaW5lZCxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogKGl0ZW06IFQpID0+IHN0cmluZztcbiAgICAgICAgICAgIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucztcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD47XG4gICAgICAgIH0sXG4gICAgKTogVGFibGVUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVR5cGU8VD4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxULCBELCBVaW50OEFycmF5PihzZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8VD4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiAoaXRlbTogVCkgPT4gc3RyaW5nO1xuICAgICAgICAgICAgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zO1xuICAgICAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgICAgICB9LFxuICAgICk6IFRhYmxlVHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHR5cGUgeyBKc29uVHlwZSwgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB7XG4gICAgU2V0Q29uZmlnUGFja2V0LFxuICAgIFNldFBlcm1pc3Npb25QYWNrZXQsXG4gICAgVGFibGVGZXRjaFBhY2tldCxcbiAgICBUYWJsZUZldGNoUmFuZ2VQYWNrZXQsXG4gICAgVGFibGVJdGVtc1BhY2tldCxcbiAgICBUYWJsZUtleXNQYWNrZXQsXG4gICAgVGFibGVQYWNrZXQsXG4gICAgVGFibGVQcm94eVBhY2tldCxcbn0gZnJvbSAnLi9wYWNrZXRzLmpzJztcbmltcG9ydCB0eXBlIHsgVGFibGUsIFRhYmxlQ29uZmlnLCBUYWJsZUV2ZW50cywgVGFibGVQZXJtaXNzaW9ucyB9IGZyb20gJy4vdGFibGUuanMnO1xuaW1wb3J0IHsgVGFibGVUeXBlIH0gZnJvbSAnLi90YWJsZS5qcyc7XG5cbmV4cG9ydCBjb25zdCBUQUJMRV9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxUYWJsZUV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAndGFibGUnLFxuICAgIChjbGllbnQpID0+IG5ldyBUYWJsZUV4dGVuc2lvbihjbGllbnQpLFxuKTtcbmV4cG9ydCBjb25zdCBUQUJMRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gVEFCTEVfRVhURU5TSU9OX1RZUEUuam9pbigncGVybWlzc2lvbicpO1xuXG5jb25zdCBUQUJMRV9TRVRfUEVSTUlTU0lPTl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8U2V0UGVybWlzc2lvblBhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2V0X3Blcm1pc3Npb24nLFxuICAgIHNlcmlhbGl6ZXI6IFNldFBlcm1pc3Npb25QYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX1NFVF9DT05GSUdfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNldENvbmZpZ1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2V0X2NvbmZpZycsXG4gICAgc2VyaWFsaXplcjogU2V0Q29uZmlnUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9MSVNURU5fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2xpc3RlbicsXG4gICAgc2VyaWFsaXplcjogSWRlbnRpZmllcixcbn0pO1xuY29uc3QgVEFCTEVfUFJPWFlfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm94eV9saXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFRBQkxFX1BST1hZX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZVByb3h5UGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm94eScsXG4gICAgc2VyaWFsaXplcjogVGFibGVQcm94eVBhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9BRERfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1fYWRkJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX1VQREFURV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV91cGRhdGUnLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fUkVNT1ZFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX3JlbW92ZScsXG4gICAgc2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9HRVRfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUtleXNQYWNrZXQsIFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1fZ2V0JyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVLZXlzUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fSEFTX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV9oYXMnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUtleXNQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLmpzb24oKSxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fSEFTX0FMTF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlS2V5c1BhY2tldCwgYm9vbGVhbj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV9oYXNfYWxsJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVLZXlzUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19BTllfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUtleXNQYWNrZXQsIGJvb2xlYW4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzX2FueScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfRkVUQ0hfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUZldGNoUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdmZXRjaCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlRmV0Y2hQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfRkVUQ0hfUkFOR0VfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUZldGNoUmFuZ2VQYWNrZXQsIFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2ZldGNoX3JhbmdlJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVGZXRjaFJhbmdlUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX0FMTF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdmZXRjaF9hbGwnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9TSVpFX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQYWNrZXQsIG51bWJlcj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2l6ZScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0NMRUFSX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZVBhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnY2xlYXInLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlUGFja2V0LFxufSk7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8VGFibGVFeHRlbnNpb24+ID0gVEFCTEVfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0YWJsZU1hcCA9IG5ldyBJZGVudGlmaWVyTWFwPFRhYmxlPHVua25vd24+PigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFRBQkxFX1NFVF9QRVJNSVNTSU9OX1BBQ0tFVCxcbiAgICAgICAgICAgIFRBQkxFX1NFVF9DT05GSUdfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfTElTVEVOX1BBQ0tFVCxcbiAgICAgICAgICAgIFRBQkxFX1BST1hZX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9QUk9YWV9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9JVEVNX0FERF9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9JVEVNX1VQREFURV9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9JVEVNX1JFTU9WRV9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9JVEVNX0NMRUFSX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRhYmxlPFQ+KHRhYmxlVHlwZTogVGFibGVUeXBlPFQ+KTogVGFibGU8VD4ge1xuICAgICAgICB0aGlzLm9tdS5wZXJtaXNzaW9ucy5yZXF1aXJlKFRBQkxFX1BFUk1JU1NJT05fSUQpO1xuICAgICAgICBpZiAodGhpcy5oYXModGFibGVUeXBlLmlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYWJsZSBhbHJlYWR5IGV4aXN0cycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlSW1wbDxUPih0aGlzLm9tdSwgdGFibGVUeXBlKTtcbiAgICAgICAgdGhpcy50YWJsZU1hcC5zZXQodGFibGVUeXBlLmlkLCB0YWJsZSBhcyBUYWJsZTx1bmtub3duPik7XG4gICAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMganNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4obmFtZTogc3RyaW5nLCBvcHRpb25zOiB7IGtleTogKGl0ZW06IFQpID0+IHN0cmluZzsgc2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxULCBEPiB9KTogVGFibGU8VD4ge1xuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSksXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8VCwgSnNvblR5cGUsIFVpbnQ4QXJyYXk+KG9wdGlvbnMuc2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgb3B0aW9ucy5rZXksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRhYmxlKHRhYmxlVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlcmlhbGl6ZWQ8VD4obmFtZTogc3RyaW5nLCBvcHRpb25zOiB7IGtleTogKGl0ZW06IFQpID0+IHN0cmluZzsgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+IH0pOiBUYWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IHRhYmxlVHlwZSA9IG5ldyBUYWJsZVR5cGU8VD4oXG4gICAgICAgICAgICB0aGlzLm9tdS5hcHAuaWQuam9pbihuYW1lKSxcbiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWFsaXplcixcbiAgICAgICAgICAgIG9wdGlvbnMua2V5LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZSh0YWJsZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4odHlwZTogVGFibGVUeXBlPFQ+KTogVGFibGU8VD4ge1xuICAgICAgICBpZiAodGhpcy5oYXModHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhYmxlTWFwLmdldCh0eXBlLmlkKSBhcyBUYWJsZTxUPjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZSh0eXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVNYXAuaGFzKGlkZW50aWZpZXIpO1xuICAgIH1cbn1cblxuY2xhc3MgVGFibGVJbXBsPFQ+IGltcGxlbWVudHMgVGFibGU8VD4ge1xuICAgIHB1YmxpYyBjYWNoZTogTWFwPHN0cmluZywgVD47XG4gICAgcHVibGljIHJlYWRvbmx5IGV2ZW50OiBUYWJsZUV2ZW50czxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2VNYXA6IE1hcDxzdHJpbmcsIFByb21pc2U8VCB8IHVuZGVmaW5lZD4+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJveGllczogQXJyYXk8KGl0ZW06IFQpID0+IFQgfCB1bmRlZmluZWQ+O1xuICAgIHByaXZhdGUgaWQ6IElkZW50aWZpZXI7XG4gICAgcHJpdmF0ZSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgcHJpdmF0ZSBrZXlGdW5jdGlvbjogKGl0ZW06IFQpID0+IHN0cmluZztcbiAgICBwcml2YXRlIGxpc3RlbmluZzogYm9vbGVhbjtcbiAgICBwcml2YXRlIGNhY2hlU2l6ZT86IG51bWJlcjtcbiAgICBwcml2YXRlIGNvbmZpZz86IFRhYmxlQ29uZmlnO1xuICAgIHByaXZhdGUgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgICAgIHRhYmxlVHlwZTogVGFibGVUeXBlPFQ+LFxuICAgICkge1xuICAgICAgICB0aGlzLmlkID0gdGFibGVUeXBlLmlkO1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSB0YWJsZVR5cGUuc2VyaWFsaXplcjtcbiAgICAgICAgdGhpcy5rZXlGdW5jdGlvbiA9IHRhYmxlVHlwZS5rZXlGdW5jdGlvbjtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5ldmVudCA9IHtcbiAgICAgICAgICAgIGFkZDogbmV3IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPigpLFxuICAgICAgICAgICAgdXBkYXRlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgICAgICByZW1vdmU6IG5ldyBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT4oKSxcbiAgICAgICAgICAgIGNsZWFyOiBuZXcgRXZlbnRFbWl0dGVyPFtdPigpLFxuICAgICAgICAgICAgY2FjaGVVcGRhdGU6IG5ldyBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT4oKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcm9taXNlTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnByb3hpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSBmYWxzZTtcblxuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX1BST1hZX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhwYWNrZXQuaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5wcm94aWVzLmZvckVhY2goKHByb3h5KSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbXMgPSBuZXcgTWFwKFxuICAgICAgICAgICAgICAgICAgICBbLi4uaXRlbXMuZW50cmllcygpXVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm94eUl0ZW0gPSBwcm94eShpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJveHlJdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHByb3h5SXRlbSBhcyBUXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBbc3RyaW5nLCBUXSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBpdGVtICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9tdS5zZW5kKFRBQkxFX1BST1hZX1BBQ0tFVCwge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGtleTogcGFja2V0LmtleSxcbiAgICAgICAgICAgICAgICBpdGVtczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgICAgICBbLi4uaXRlbXMuZW50cmllcygpXS5tYXAoKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShpdGVtKV07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoVEFCTEVfSVRFTV9BRERfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhY2tldC5pZC5pc0VxdWFsKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5hZGQuZW1pdChpdGVtcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX0lURU1fVVBEQVRFX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHBhY2tldC5pdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQudXBkYXRlLmVtaXQoaXRlbXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX1JFTU9WRV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhwYWNrZXQuaXRlbXMpO1xuICAgICAgICAgICAgaXRlbXMuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5yZW1vdmUuZW1pdChpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LmNhY2hlVXBkYXRlLmVtaXQodGhpcy5jYWNoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX0lURU1fQ0xFQVJfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhY2tldC5pZC5pc0VxdWFsKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuY2xlYXIuZW1pdCgpO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5lbWl0KHRoaXMuY2FjaGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211LmV2ZW50LnJlYWR5Lmxpc3RlbigoKSA9PiB0aGlzLm9uUmVhZHkoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDYWNoZShpdGVtczogTWFwPHN0cmluZywgVD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlU2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGl0ZW1zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKFsuLi50aGlzLmNhY2hlLCAuLi5pdGVtc10uc2xpY2UoLXRoaXMuY2FjaGVTaXplKSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5lbWl0KHRoaXMuY2FjaGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4obGlzdGVuZXI/OiAoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KSA9PiB2b2lkKTogVW5saXN0ZW4ge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5vblJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0xJU1RFTl9QQUNLRVQsIHRoaXMuaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5saXN0ZW4obGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHkoY2FsbGJhY2s6IChpdGVtOiBUKSA9PiBUIHwgdW5kZWZpbmVkKTogVW5saXN0ZW4ge1xuICAgICAgICBpZiAodGhpcy5wcm94aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbGV0IGNhbmNlbCA9ICgpOiB2b2lkID0+IHt9O1xuICAgICAgICAgICAgY2FuY2VsID0gdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9QUk9YWV9MSVNURU5fUEFDS0VULCB0aGlzLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJveGllcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJveGllcy5zcGxpY2UodGhpcy5wcm94aWVzLmluZGV4T2YoY2FsbGJhY2spLCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uUmVhZHkoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCwge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb21pc2VNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnByb21pc2VNYXAuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMub211LmVuZHBvaW50c1xuICAgICAgICAgICAgLmNhbGwoVEFCTEVfSVRFTV9HRVRfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBrZXlzOiBba2V5XSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocmVzLml0ZW1zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb21pc2VNYXAuc2V0KGtleSwgcHJvbWlzZSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlLnRoZW4oKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0TWFueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRLZXlzID0ga2V5c1xuICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiAhdGhpcy5jYWNoZS5oYXMoa2V5KSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIXRoaXMucHJvbWlzZU1hcC5oYXMoa2V5KSk7XG4gICAgICAgIGlmIChmaWx0ZXJlZEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hcChbLi4udGhpcy5jYWNoZV0uZmlsdGVyKChba2V5XSkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMub211LmVuZHBvaW50c1xuICAgICAgICAgICAgLmNhbGwoVEFCTEVfSVRFTV9HRVRfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBrZXlzOiBmaWx0ZXJlZEtleXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGZpbHRlcmVkS2V5cykge1xuICAgICAgICAgICAgdGhpcy5wcm9taXNlTWFwLnNldChcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChpdGVtcykgPT4gaXRlbXMuZ2V0KGtleSkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHByb21pc2U7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGZpbHRlcmVkS2V5cykge1xuICAgICAgICAgICAgdGhpcy5wcm9taXNlTWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTWFwKFsuLi50aGlzLmNhY2hlLCAuLi5pdGVtc10uZmlsdGVyKChba2V5XSkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZCguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNlcmlhbGl6ZUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9JVEVNX0FERF9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgaXRlbXM6IGRhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoLi4uaXRlbXM6IFRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZXJpYWxpemVJdGVtcyhpdGVtcyk7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGl0ZW1zOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VyaWFsaXplSXRlbXMoaXRlbXMpO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKFsuLi50aGlzLmNhY2hlXS5maWx0ZXIoKFtrZXldKSA9PiAha2V5cy5pbmNsdWRlcyhrZXkpKSk7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGl0ZW1zOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBrZXlzOiBba2V5XSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNba2V5XSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzTWFueTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KC4uLmtleXM6IChrZXlvZiBUKVtdKTogUHJvbWlzZTx7IFtrZXkgaW4ga2V5b2YgVF06IGJvb2xlYW4gfT4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBrZXlzOiBrZXlzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcyBhcyB7IFtrZXkgaW4ga2V5b2YgVF06IGJvb2xlYW4gfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzQWxsKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFRBQkxFX0lURU1fSEFTX0FMTF9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBrZXlzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzQW55KC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFRBQkxFX0lURU1fSEFTX0FOWV9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBrZXlzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2hJdGVtcyh7XG4gICAgICAgIGxpbWl0LFxuICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgY3Vyc29yLFxuICAgIH06IHtcbiAgICAgICAgbGltaXQ6IG51bWJlcjtcbiAgICAgICAgYmFja3dhcmQ/OiBib29sZWFuO1xuICAgICAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBUQUJMRV9GRVRDSF9FTkRQT0lOVCxcbiAgICAgICAgICAgIG5ldyBUYWJsZUZldGNoUGFja2V0KHRoaXMuaWQsIGxpbWl0LCBiYWNrd2FyZCwgY3Vyc29yKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocmVzLml0ZW1zKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2hSYW5nZSh7XG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBlbmQsXG4gICAgfToge1xuICAgICAgICBzdGFydDogc3RyaW5nO1xuICAgICAgICBlbmQ6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9GRVRDSF9SQU5HRV9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgIGVuZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoQWxsKCk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfRkVUQ0hfQUxMX0VORFBPSU5ULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jICppdGVyYXRlKHtcbiAgICAgICAgYmFja3dhcmQsXG4gICAgICAgIGN1cnNvcixcbiAgICB9OiB7XG4gICAgICAgIGJhY2t3YXJkPzogYm9vbGVhbjtcbiAgICAgICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIH0pOiBBc3luY0l0ZXJhYmxlPFQ+IHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5mZXRjaEl0ZW1zKHtcbiAgICAgICAgICAgICAgICBsaW1pdDogdGhpcy5jYWNoZVNpemUgPz8gMTAwLFxuICAgICAgICAgICAgICAgIGJhY2t3YXJkLFxuICAgICAgICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkKiBpdGVtcy52YWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChjdXJzb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGl0ZW1zLmRlbGV0ZShjdXJzb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3Vyc29ySXRlbSA9IGJhY2t3YXJkID8gaXRlbXMudmFsdWVzKCkubmV4dCgpLnZhbHVlIDogWy4uLml0ZW1zLnZhbHVlcygpXS5wb3AoKTtcbiAgICAgICAgICAgIGlmICghY3Vyc29ySXRlbSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3Vyc29yID0gdGhpcy5rZXlGdW5jdGlvbihjdXJzb3JJdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaXplKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9TSVpFX0VORFBPSU5ULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXNlcmlhbGl6ZUl0ZW1zKGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5Pik6IE1hcDxzdHJpbmcsIFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhpdGVtcykubWFwKChba2V5LCBkYXRhXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgaXRlbV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlcmlhbGl6ZUl0ZW1zKGl0ZW1zOiBUW10pOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3RoaXMua2V5RnVuY3Rpb24oaXRlbSksIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlbSldO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENhY2hlU2l6ZShzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYWNoZVNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDb25maWcoY29uZmlnOiBUYWJsZUNvbmZpZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IGNvbmZpZyBhZnRlciBjbGllbnQgaGFzIHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UGVybWlzc2lvbnMocGVybWlzc2lvbnM6IFRhYmxlUGVybWlzc2lvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgQXBwLCBBcHBKc29uIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdS5qcyc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlLCB0eXBlIEV4dGVuc2lvbiB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgUmVnaXN0cnlUeXBlIH0gZnJvbSAnLi4vcmVnaXN0cnknO1xuaW1wb3J0IHsgVGFibGVUeXBlLCB0eXBlIFRhYmxlIH0gZnJvbSAnLi4vdGFibGUnO1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFNlcnZlckV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnc2VydmVyJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBTZXJ2ZXJFeHRlbnNpb24ob211KSxcbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwSW5kZXhFbnRyeSB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgbWV0YT86IEFwcEluZGV4UmVnaXN0cnlNZXRhO1xuICAgIGFkZGVkX2F0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4IHtcbiAgICBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBBcHBJbmRleEVudHJ5Pjtcbn07XG5cbmV4cG9ydCBjb25zdCBTRVJWRVJfQVBQU19SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignYXBwcycsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0FQUFNfV1JJVEVfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHBzJywgJ3dyaXRlJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0lOREVYX1JFQURfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdpbmRleCcsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0lOREVYX1JFR0lTVFJZX1RZUEU6IFJlZ2lzdHJ5VHlwZTxBcHBJbmRleD4gPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxBcHBJbmRleD4oU0VSVkVSX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2luZGV4JyxcbiAgICBkZWZhdWx0VmFsdWU6IHsgJ2luZGV4ZXMnOiB7fSB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHdyaXRlOiBTRVJWRVJfQVBQU19XUklURV9QRVJNSVNTSU9OX0lELFxuICAgICAgICByZWFkOiBTRVJWRVJfSU5ERVhfUkVBRF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcbmNvbnN0IEFQUF9UQUJMRV9UWVBFID0gVGFibGVUeXBlLmNyZWF0ZUpzb24oU0VSVkVSX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2FwcHMnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbiAgICBrZXk6IChhcHApID0+IGFwcC5pZC5rZXkoKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICBhbGw6IFNFUlZFUl9BUFBTX1dSSVRFX1BFUk1JU1NJT05fSUQsXG4gICAgICAgIHJlYWQ6IFNFUlZFUl9BUFBTX1JFQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBTRVJWRVJfU0hVVERPV05fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdzaHV0ZG93bicpO1xuY29uc3QgU0hVVERPV05fRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPGJvb2xlYW4sIGJvb2xlYW4+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzaHV0ZG93bicsXG4gICAgcGVybWlzc2lvbklkOiBTRVJWRVJfU0hVVERPV05fUEVSTUlTU0lPTl9JRCxcbn0pO1xuZXhwb3J0IGNvbnN0IFRSVVNURURfT1JJR0lOU19HRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCd0cnVzdGVkX29yaWdpbnMnLCAnZ2V0Jyk7XG5leHBvcnQgY29uc3QgVFJVU1RFRF9PUklHSU5TX1NFVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3RydXN0ZWRfb3JpZ2lucycsICdzZXQnKTtcbmNvbnN0IFRSVVNURURfSE9TVFNfUkVHSVNUUllfVFlQRSA9IFJlZ2lzdHJ5VHlwZS5jcmVhdGVKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd0cnVzdGVkX2hvc3RzJyxcbiAgICBkZWZhdWx0VmFsdWU6IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHJlYWQ6IFRSVVNURURfT1JJR0lOU19HRVRfUEVSTUlTU0lPTl9JRCxcbiAgICAgICAgd3JpdGU6IFRSVVNURURfT1JJR0lOU19TRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFNlcnZlckV4dGVuc2lvbj4gPSBTRVJWRVJfRVhURU5TSU9OX1RZUEU7XG4gICAgcHVibGljIHJlYWRvbmx5IGFwcHM6IFRhYmxlPEFwcD47XG4gICAgcHVibGljIHJlYWRvbmx5IGluZGV4OiBSZWdpc3RyeTxBcHBJbmRleD47XG4gICAgcHVibGljIHJlYWRvbmx5IHRydXN0ZWRIb3N0czogUmVnaXN0cnk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIHRoaXMuYXBwcyA9IG9tdS50YWJsZXMuZ2V0KEFQUF9UQUJMRV9UWVBFKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9tdS5yZWdpc3RyaWVzLmdldChTRVJWRVJfSU5ERVhfUkVHSVNUUllfVFlQRSk7XG4gICAgICAgIHRoaXMudHJ1c3RlZEhvc3RzID0gb211LnJlZ2lzdHJpZXMuZ2V0KFRSVVNURURfSE9TVFNfUkVHSVNUUllfVFlQRSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKHJlc3RhcnQ/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFNIVVRET1dOX0VORFBPSU5UX1RZUEUsIHJlc3RhcnQgPz8gZmFsc2UpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5saXN0ZW4gPSB0aGlzLm9tdS5uZXR3b3JrLmV2ZW50LmRpc2Nvbm5lY3RlZC5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uT2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb25Db25uZWN0Q2FsbGJhY2tzOiBBcnJheTwoYXBwOiBBcHApID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9uRGlzY29ubmVjdENhbGxiYWNrczogQXJyYXk8KGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBvbkNvbm5lY3QoY2FsbGJhY2s6IChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNvbm5lY3RDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGlzY29ubmVjdChjYWxsYmFjazogKGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uRGlzY29ubmVjdENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEFwcEluZGV4UmVnaXN0cnlNZXRhID0ge1xuICAgIG5hbWU6IExvY2FsaXplZFRleHQ7XG4gICAgbm90ZTogTG9jYWxpemVkVGV4dDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwSW5kZXhSZWdpc3RyeUpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWV0YT86IEFwcEluZGV4UmVnaXN0cnlNZXRhO1xuICAgIGFwcHM6IFJlY29yZDxzdHJpbmcsIEFwcEpzb24+O1xufVxuXG5leHBvcnQgY2xhc3MgQXBwSW5kZXhSZWdpc3RyeSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIGFwcHM6IElkZW50aWZpZXJNYXA8QXBwPixcbiAgICAgICAgcHVibGljIG1ldGE6IEFwcEluZGV4UmVnaXN0cnlNZXRhIHwgdW5kZWZpbmVkLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGpzb246IEFwcEluZGV4UmVnaXN0cnlKU09OKTogQXBwSW5kZXhSZWdpc3RyeSB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGpzb25bJ2lkJ10pO1xuICAgICAgICBjb25zdCBhcHBzID0gbmV3IElkZW50aWZpZXJNYXA8QXBwPigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtpZFN0ciwgYXBwSlNPTl0gb2YgT2JqZWN0LmVudHJpZXMoanNvblsnYXBwcyddKSkge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkoaWRTdHIpO1xuICAgICAgICAgICAgY29uc3QgYXBwID0gQXBwLmRlc2VyaWFsaXplKGFwcEpTT04pO1xuICAgICAgICAgICAgaWYgKCFpZC5pc05hbWVzcGFjZUVxdWFsKGFwcC5pZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFwcCBJRCBkb2VzIG5vdCBtYXRjaCB0aGUgSUQgaW4gdGhlIGluZGV4LiAke2FwcC5pZH0gIT0gJHtpZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcHMuc2V0KGlkLCBhcHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQXBwSW5kZXhSZWdpc3RyeShcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgYXBwcyxcbiAgICAgICAgICAgIGpzb24ubWV0YSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOztBQUdBLElBQU0sa0JBQWtCO0FBQ3hCLElBQU0sYUFBYTtBQUFBO0FBSVosTUFBTSxXQUFXO0FBQUEsRUFDSjtBQUFBLEVBQ0E7QUFBQSxFQUVoQixXQUFXLENBQ1AsY0FDRyxNQUNMO0FBQUEsSUFDRSxXQUFXLFNBQVMsV0FBVyxJ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QUFBQSxJQUN6QyxLQUFLLFFBQVEsSUFBSSxXQUFXLElBQUksMEJBQTBCO0FBQUEsSUFDMUQsS0FBSyxlQUFlLElBQUksV0FBVyxJQUFJLDJCQUEyQjtBQUFBO0FBQUEsT0FHekQsU0FBUSxDQUFDLFNBQXFDO0FBQUEsSUFDdkQsS0FBSyxJQUFJLFVBQVUsS0FBSyx3QkFBd0IsV0FBVyxLQUFLO0FBQUEsSUFDaEUsTUFBTSxJQUFJLFFBQWMsQ0FBQyxZQUFZO0FBQUEsTUFDakMsTUFBTSxXQUFXLEtBQUssSUFBSSxRQUFRLE1BQU0sYUFBYSxPQUFPLE1BQU07QUFBQSxRQUM5RCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUEsT0FDWjtBQUFBLEtBQ0o7QUFBQSxJQUNELE9BQU87QUFBQTtBQUVmO0FBQUE7QUFFTyxNQUFNLGdCQUFnQjtBQUFBLEVBRUw7QUFBQSxFQUNBO0FBQUEsRUFGcEIsV0FBVyxDQUNTLG9CQUNBLHVCQUNsQjtBQUFBLElBRmtCO0FBQUEsSUFDQTtBQUFBO0FBQUEsRUFHYixTQUFTLENBQUMsVUFBb0Q7QUFBQSxJQUNqRSxLQUFLLG1CQUFtQixLQUFLLFFBQVE7QUFBQTtBQUFBLEVBR2xDLFlBQVksQ0FBQyxVQUFvRDtBQUFBLElBQ3BFLEtBQUssc0JBQXNCLEtBQUssUUFBUTtBQUFBO0FBRWhEO0FBQUE7QUFhTyxNQUFNLGlCQUFpQjtBQUFBLEVBRWY7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBSFgsV0FBVyxDQUNBLElBQ0EsTUFDQSxNQUNUO0FBQUEsSUFIUztBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUE7QUFBQSxTQUdHLFFBQVEsQ0FBQyxNQUE4QztBQUFBLElBQ2pFLE1BQU0sS0FBSyxXQUFXLFFBQVEsS0FBSyxLQUFLO0FBQUEsSUFDeEMsTUFBTSxPQUFPLElBQUk7QUFBQSxJQUNqQixZQUFZLE9BQU8sWUFBWSxPQUFPLFFBQVEsS0FBSyxPQUFPLEdBQUc7QUFBQSxNQUN6RCxNQUFNLE1BQUssV0FBVyxRQUFRLEtBQUs7QUFBQSxNQUNuQyxNQUFNLE1BQU0sSUFBSSxZQUFZLE9BQU87QUFBQSxNQUNuQyxJQUFJLENBQUMsSUFBRyxpQkFBaUIsSUFBSSxFQUFFLEdBQUc7QUFBQSxRQUM5QixNQUFNLElBQUksTUFBTSw4Q0FBOEMsSUFBSSxTQUFTLEtBQUk7QUFBQSxNQUNuRjtBQUFBLE1BQ0EsS0FBSyxJQUFJLEtBQUksR0FBRztBQUFBLElBQ3BCO0FBQUEsSUFDQSxPQUFPLElBQUksaUJBQ1AsSUFDQSxNQUNBLEtBQUssSUFDVDtBQUFBO0FBRVI7IiwKICAiZGVidWdJZCI6ICIwQjkzMTZENzI3MDNFRDRCNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==