sonamu 0.8.25 → 0.8.26

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.
@@ -27,7 +27,7 @@ export class FixtureGenerator {
27
27
  locale: options?.locale || "ko",
28
28
  useLLM: options?.useLLM || false,
29
29
  enableLLMCache: options?.enableLLMCache !== false,
30
- llmModel: options?.llmModel || "claude-sonnet-4-5"
30
+ llmModel: options?.llmModel || "claude-sonnet-4-6"
31
31
  };
32
32
  }
33
33
  /**
@@ -636,7 +636,7 @@ export class FixtureGenerator {
636
636
  const rowResponse = await generateText({
637
637
  model: createAnthropic({
638
638
  apiKey
639
- })(this.options.llmModel || "claude-sonnet-4-5"),
639
+ })(this.options.llmModel || "claude-sonnet-4-6"),
640
640
  prompt: this.buildRowLLMPrompt(llmProps, entity)
641
641
  });
642
642
  if (!rowResponse || typeof rowResponse.text !== "string") {
@@ -670,7 +670,7 @@ export class FixtureGenerator {
670
670
  const singleResponse = await generateText({
671
671
  model: createAnthropic({
672
672
  apiKey
673
- })(this.options.llmModel || "claude-sonnet-4-5"),
673
+ })(this.options.llmModel || "claude-sonnet-4-6"),
674
674
  prompt: this.buildLLMPrompt(fixtureHint, prop, entity)
675
675
  });
676
676
  if (!singleResponse || typeof singleResponse.text !== "string") {
@@ -943,7 +943,7 @@ Rules:
943
943
  let apiKey;
944
944
  try {
945
945
  const { Sonamu } = require("../api");
946
- apiKey = Sonamu.secret?.anthropic_api_key;
946
+ apiKey = Sonamu.secrets?.anthropic_api_key;
947
947
  } catch {
948
948
  // Sonamu가 초기화되지 않은 경우 (테스트 환경 등)
949
949
  }
@@ -1369,4 +1369,4 @@ Rules:
1369
1369
  }
1370
1370
  }
1371
1371
 
1372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVByb3AsIEZpeHR1cmVJbXBvcnRSZXN1bHQsIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLCBpc09uZVRvT25lUmVsYXRpb25Qcm9wLCBpc1JlbGF0aW9uUHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7XG4gIERhdGFFeHBsb3JlcixcbiAgdHlwZSBFeHBsb3JlV2l0aFJlbGF0aW9uc09wdGlvbnMsXG4gIHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQsXG59IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRmFrZXJNYXBwaW5ncywgZmFrZXJNYXBwaW5ncyB9IGZyb20gXCIuL2Zha2VyLW1hcHBpbmdzXCI7XG5pbXBvcnQgeyBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuL2ZpeHR1cmUtbWFuYWdlclwiO1xuXG5leHBvcnQgdHlwZSBMb2NhbGUgPSBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zID0ge1xuICBsb2NhbGU/OiBMb2NhbGU7XG4gIHVzZUxMTT86IGJvb2xlYW47XG4gIGVuYWJsZUxMTUNhY2hlPzogYm9vbGVhbjtcbiAgbGxtTW9kZWw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JDb250ZXh0ID0ge1xuICAvKiog7IOd7ISxIOykkeyduCBmaXh0dXJl65OkICjrqZTrqqjrpqwg7IOBKSAqL1xuICBmaXh0dXJlczogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4gIC8qKiDssLjsobAg642w7J207YSwIOy6kOyLnCAoRGF0YUV4cGxvcmVyIOqysOqzvCkgKi9cbiAgcmVmZXJlbmNlQ2FjaGU6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+O1xuXG4gIC8qKiDsnbTrr7ggaW1wb3J065CcIOugiOy9lOuTnOulvCDstpTsoIHtlZjsl6wg7KSR67O1IGltcG9ydOulvCDrsKnsp4Dtlanri4jri6QgKi9cbiAgaW1wb3J0ZWRSZWNvcmRzOiBTZXQ8c3RyaW5nPjsgLy8gXCJVc2VyIzEyM1wiXG59O1xuXG5leHBvcnQgY2xhc3MgRml4dHVyZUdlbmVyYXRvciB7XG4gIHByaXZhdGUgZGF0YUV4cGxvcmVyOiBEYXRhRXhwbG9yZXI7XG4gIHByaXZhdGUgbG9jYWxlOiBMb2NhbGU7XG4gIHByaXZhdGUgbWFwcGluZ3M6IEZha2VyTWFwcGluZ3M7XG4gIHByaXZhdGUgbGxtQ2FjaGU6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGVudGl0eUNhY2hlOiBNYXA8c3RyaW5nLCBFbnRpdHk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIG9wdGlvbnM6IEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc291cmNlRGI6IEtuZXgsXG4gICAgLy8gRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXPqsIAgZGJOYW1lIOusuOyekOyXtOydhCDrsJvquLAg65WM66y47JeQIOyngeygkSDsgqzsmqntlZjsp4Ag7JWK7Iq164uI64ukXG4gICAgLy8g66+4656YIO2ZleyepeyEseydhCDsnITtlbQgQVBJIOyLnOq3uOuLiOyymOyXkOuKlCDtj6ztlajsi5zsvLDsirXri4jri6RcbiAgICBfdGFyZ2V0RGI6IEtuZXgsXG4gICAgcHJpdmF0ZSB0YXJnZXREYk5hbWU6IFwiZml4dHVyZVwiIHwgXCJ0ZXN0XCIgfCBcInByb2R1Y3Rpb25fbWFzdGVyXCIsXG4gICAgcHJpdmF0ZSBlbnRpdHlNYW5hZ2VyOiB0eXBlb2YgRW50aXR5TWFuYWdlcixcbiAgICBvcHRpb25zPzogRml4dHVyZUdlbmVyYXRvck9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMuZGF0YUV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3Jlcihzb3VyY2VEYiwgZW50aXR5TWFuYWdlcik7XG4gICAgdGhpcy5sb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIHRoaXMubWFwcGluZ3MgPSBmYWtlck1hcHBpbmdzO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZTogb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIixcbiAgICAgIHVzZUxMTTogb3B0aW9ucz8udXNlTExNIHx8IGZhbHNlLFxuICAgICAgZW5hYmxlTExNQ2FjaGU6IG9wdGlvbnM/LmVuYWJsZUxMTUNhY2hlICE9PSBmYWxzZSxcbiAgICAgIGxsbU1vZGVsOiBvcHRpb25zPy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC01XCIsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlIOyDneyEsSAo64uo7J28KVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwgZml4dHVyZSDrjbDsnbTthLAgKOuplOuqqOumrCDsg4EpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIC8vIEVudGl0eSDsupDsi7E6IO2FjOyKpO2KuOyXkOyEnCBlbnRpdHkgY29uZSDsiJjsoJXsnbQg67CY7JiB65CY64+E66GdIOuztOyepVxuICAgIGxldCBlbnRpdHkgPSB0aGlzLmVudGl0eUNhY2hlLmdldChlbnRpdHlOYW1lKTtcbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICAgIHRoaXMuZW50aXR5Q2FjaGUuc2V0KGVudGl0eU5hbWUsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcElkID0gYCR7ZW50aXR5TmFtZX0jdGVtcCMke0RhdGUubm93KCl9YDsgLy8g7J6E7IucIElEXG5cbiAgICAvLyBMTE0gcm93IOuLqOychCDsg53shLHsnYQg7JyE7ZWcIOqzoOycoCDtgqQgKOqwmeydgCByb3fsnZgg7ZWE65Oc65Ok7J20IOuPmeydvO2VnCByb3dLZXnrpbwg6rO17JygKVxuICAgIGNvbnN0IHJvd0tleSA9IHRoaXMub3B0aW9ucy51c2VMTE0gPyBgJHtlbnRpdHlOYW1lfSNyb3cjJHtEYXRlLm5vdygpfWAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyDqsIEgcHJvcOuzhCDqsJIg7IOd7ISxXG4gICAgY29uc3QgZml4dHVyZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcOydgCDsiqTtgrVcbiAgICAgIGlmIChcInZpcnR1YWxcIiBpbiBwcm9wICYmIHByb3AudmlydHVhbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWQgcHJvcCDsspjrpqxcbiAgICAgIGlmIChwcm9wLm5hbWUgPT09IFwiaWRcIikge1xuICAgICAgICBpZiAoXCJjb25lXCIgaW4gcHJvcCAmJiBwcm9wLmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiKSB7XG4gICAgICAgICAgLy8gREIgc2VxdWVuY2XqsIAg7J6Q64+ZIO2VoOuLue2VmOuvgOuhnCDsiqTtgrUgKFVzZXIg65OxKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBEQiBERUZBVUxUIOyXhuuKlCBzdHJpbmcgUEs6IGFscGhhbnVtZXJpYyAzMuyekCDsg53shLEgKGJldHRlci1hdXRoIOyKpO2DgOydvClcbiAgICAgICAgICBjb25zdCB7IGZha2VyOiBfZmFrZXIgfSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBfZmFrZXIuc3RyaW5nLmFscGhhbnVtZXJpYygzMik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgICBjb25zdCB7IGZha2VyOiBfZmFrZXIgfSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBfZmFrZXIuc3RyaW5nLnV1aWQoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEs6IGdlbmVyYXRlQmF0Y2jsl5DshJwgdGVtcElk66W8IOuEo+ycvOuvgOuhnCDsl6zquLDshKAg7Iqk7YK1XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZeqwgCDsnojsnLzrqbQg7IKs7JqpXG4gICAgICBpZiAocHJvcC5uYW1lIGluIG92ZXJyaWRlcykge1xuICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBvdmVycmlkZXNbcHJvcC5uYW1lXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbmXsl5DshJwg7IOd7ISxIOyghOuetSDtmZXsnbhcbiAgICAgIGNvbnN0IGNvbmUgPSBwcm9wLmNvbmU7XG5cbiAgICAgIC8vIDEuIFJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgLy8gQmVsb25nc1RvT25lIC8gT25lVG9PbmUoaGFzSm9pbkNvbHVtbinsnYAgRksg7Lus65+866qFKHtwcm9wLm5hbWV9X2lkKeycvOuhnOuPhCBvdmVycmlkZeulvCDrsJvripTri6RcbiAgICAgICAgY29uc3QgZmtDb2xOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBma0NvbE5hbWUgaW4gb3ZlcnJpZGVzICYmXG4gICAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpXG4gICAgICAgICkge1xuICAgICAgICAgIGZpeHR1cmVbZmtDb2xOYW1lXSA9IG92ZXJyaWRlc1tma0NvbE5hbWVdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb25WYWx1ZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVSZWxhdGlvblZhbHVlKGVudGl0eSwgcHJvcCwgY29udGV4dCk7XG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSwgT25lVG9PbmUoaGFzSm9pbkNvbHVtbinsnZgg6rK97JqwIGZvcmVpZ24ga2V5IOy7rOufvOuqheycvOuhnCDsoIDsnqVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICBmaXh0dXJlW2Ake3Byb3AubmFtZX1faWRgXSA9IHJlbGF0aW9uVmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gcmVsYXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gY29uZS5ub3RlICsgTExNIOyCrOyaqSAodXNlTExN7J2066m0IGZpeHR1cmVHZW5lcmF0b3Lrs7Tri6Qg7Jqw7ISgKVxuICAgICAgaWYgKGNvbmU/Lm5vdGUgJiYgdGhpcy5vcHRpb25zLnVzZUxMTSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGxsbVZhbHVlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVdpdGhMTE0oY29uZS5ub3RlLCBwcm9wLCBlbnRpdHksIHJvd0tleSk7XG4gICAgICAgICAgLy8gc3RyaW5nIO2DgOyeheydtOqzoCBsZW5ndGgg7KCc7JW97J20IOyeiOycvOuptCDstIjqs7wg7IucIHRydW5jYXRpb25cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgbGxtVmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIFwibGVuZ3RoXCIgaW4gcHJvcCAmJlxuICAgICAgICAgICAgdHlwZW9mIHByb3AubGVuZ3RoID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgICBsbG1WYWx1ZS5sZW5ndGggPiBwcm9wLmxlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gbGxtVmFsdWUuc2xpY2UoMCwgcHJvcC5sZW5ndGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBsbG1WYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtGaXh0dXJlR2VuZXJhdG9yXSBMTE0gZ2VuZXJhdGlvbiBmYWlsZWQgZm9yICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX0sIGZhbGxpbmcgYmFjayB0byBmaXh0dXJlR2VuZXJhdG9yIG9yIGRlZmF1bHRgLFxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIGZhbGxiYWNrOiBmaXh0dXJlR2VuZXJhdG9yIOKGkiBmaXh0dXJlRGVmYXVsdCDihpIg6riw67O46rCS7Jy866GcIOqzhOyGjVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIGZpeHR1cmVHZW5lcmF0b3Ig7IKs7JqpXG4gICAgICBpZiAoY29uZT8uZml4dHVyZUdlbmVyYXRvcikge1xuICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZW5lcmF0b3IoXG4gICAgICAgICAgY29uZS5maXh0dXJlR2VuZXJhdG9yIGFzIHN0cmluZyxcbiAgICAgICAgICBwcm9wLFxuICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIGZpeHR1cmVEZWZhdWx0IOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gY29uZS5maXh0dXJlRGVmYXVsdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIO2DgOyeheuzhCDquLDrs7gg7IOd7ISxXG4gICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRGVmYXVsdFZhbHVlKHByb3AsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgLy8gNi4gZW1haWwg7ZWE65Oc6rCAIOyeiOqzoCBuYW1lIO2VhOuTnOqwgCDsnojsnLzrqbQsIGVtYWls7J2YIOuhnOy7rCDtjIztirjrpbwgbmFtZSDquLDrsJjsnLzroZwg67O07KCVXG4gICAgaWYgKFwiZW1haWxcIiBpbiBmaXh0dXJlICYmIHR5cGVvZiBmaXh0dXJlLmVtYWlsID09PSBcInN0cmluZ1wiICYmICEoXCJlbWFpbFwiIGluIG92ZXJyaWRlcykpIHtcbiAgICAgIGNvbnN0IG5hbWVWYWx1ZSA9IGZpeHR1cmUubmFtZSB8fCBmaXh0dXJlLnVzZXJuYW1lIHx8IGZpeHR1cmUuZnVsbF9uYW1lIHx8IGZpeHR1cmUubmFtZV9lbjtcbiAgICAgIGlmIChuYW1lVmFsdWUgJiYgdHlwZW9mIG5hbWVWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBkb21haW4gPSBmaXh0dXJlLmVtYWlsLnNwbGl0KFwiQFwiKVsxXSB8fCBcImV4YW1wbGUuY29tXCI7XG4gICAgICAgIGNvbnN0IHJvbWFuaXplZCA9IGF3YWl0IHRoaXMucm9tYW5pemVOYW1lKG5hbWVWYWx1ZSk7XG4gICAgICAgIGZpeHR1cmUuZW1haWwgPSBgJHtyb21hbml6ZWR9QCR7ZG9tYWlufWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNy4gcGFzc3dvcmQg7ZWE65OcIOyVlO2YuO2ZlFxuICAgIGlmIChcInBhc3N3b3JkXCIgaW4gZml4dHVyZSAmJiBmaXh0dXJlLnBhc3N3b3JkICYmIHR5cGVvZiBmaXh0dXJlLnBhc3N3b3JkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBiY3J5cHQgPSBhd2FpdCBpbXBvcnQoXCJiY3J5cHRcIik7XG4gICAgICBmaXh0dXJlLnBhc3N3b3JkID0gYXdhaXQgYmNyeXB0Lmhhc2goZml4dHVyZS5wYXNzd29yZCwgMTApO1xuICAgIH1cblxuICAgIGNvbnRleHQuZml4dHVyZXMuc2V0KHRlbXBJZCwgZml4dHVyZSk7XG4gICAgcmV0dXJuIGZpeHR1cmU7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb24g6rCSIOyDneyEsSArIOyekOuPmSBJbXBvcnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVSZWxhdGlvblZhbHVlKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgY29udGV4dDogR2VuZXJhdG9yQ29udGV4dCxcbiAgKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9IGlzIG5vdCBhIHJlbGF0aW9uIHByb3BgKTtcbiAgICB9XG5cbiAgICAvLyBCZWxvbmdzVG9PbmUsIE9uZVRvT25lKGhhc0pvaW5Db2x1bW4p66eMIOyymOumrFxuICAgIGlmIChcbiAgICAgICFpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgIShpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmUgPSBwcm9wLmNvbmU7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGNvbmU/LmRhdGFTb3VyY2U7XG5cbiAgICAvLyBEYXRhRXhwbG9yZXLroZwg7LC47KGwIOuNsOydtO2EsCDsobDtmowgKHNvdXJjZURiKVxuICAgIC8vIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCA6riwIOychO2VtCBleHBsb3JlV2l0aFJlbGF0aW9ucyDsgqzsmqlcbiAgICBpZiAoZGF0YVNvdXJjZSkge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtwcm9wLndpdGh9OiR7SlNPTi5zdHJpbmdpZnkoZGF0YVNvdXJjZSl9YDtcblxuICAgICAgaWYgKCFjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgICAgY29uc3QgZXhwbG9yZVJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YUV4cGxvcmVyLmV4cGxvcmVXaXRoUmVsYXRpb25zKHByb3Aud2l0aCwge1xuICAgICAgICAgIHN0cmF0ZWd5OiBkYXRhU291cmNlLnN0cmF0ZWd5LFxuICAgICAgICAgIGxpbWl0OlxuICAgICAgICAgICAgKChkYXRhU291cmNlLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmxpbWl0IGFzXG4gICAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICAgIHwgdW5kZWZpbmVkKSB8fCAxMCxcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgICAgIC4uLihkYXRhU291cmNlLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChjYWNoZUtleSwgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAgIC8vIOyhsO2ajO2VnCDrjbDsnbTthLDsmYAg6rSA6rOE65CcIOuqqOuToCDsl5Tti7Dti7DrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChleHBsb3JlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzICYmIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyDrnpzrjaTtlZjqsowg7ZWY64KYIOyEoO2DnVxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FuZGlkYXRlcy5sZW5ndGgpXTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmlkIGFzIG51bWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRhU291cmNl6rCAIOyXhuydhCDrlYwg7J6Q64+Z7Jy866GcIGZpeHR1cmUgRELsl5DshJwg7KGw7ZqMIOyLnOuPhFxuICAgIC8vIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCA6riwIOychO2VtCBleHBsb3JlV2l0aFJlbGF0aW9ucyDsgqzsmqlcbiAgICBjb25zdCBhdXRvS2V5ID0gYCR7cHJvcC53aXRofTphdXRvYDtcbiAgICBpZiAoIWNvbnRleHQucmVmZXJlbmNlQ2FjaGUuaGFzKGF1dG9LZXkpKSB7XG4gICAgICAvLyBmaXh0dXJlIERCKHNvdXJjZURiKeyXkOyEnCDsnpDrj5kg7KGw7ZqMICjqtIDqs4Qg7Y+s7ZWoKVxuICAgICAgY29uc3QgYXV0b0V4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhwcm9wLndpdGgsIHtcbiAgICAgICAgc3RyYXRlZ3k6IFwicmFuZG9tXCIsXG4gICAgICAgIGxpbWl0OiAxMCxcbiAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgbWF4RGVwdGg6IDMsXG4gICAgICB9KTtcbiAgICAgIGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuc2V0KGF1dG9LZXksIGF1dG9FeHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcyk7XG5cbiAgICAgIC8vIOyhsO2ajO2VnCDrjbDsnbTthLDsmYAg6rSA6rOE65CcIOuqqOuToCDsl5Tti7Dti7DrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAgICBpZiAoYXV0b0V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbXBvcnRFeHBsb3JlUmVzdWx0KGF1dG9FeHBsb3JlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhdXRvQ2FuZGlkYXRlcyA9IGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuZ2V0KGF1dG9LZXkpO1xuICAgIGlmIChhdXRvQ2FuZGlkYXRlcyAmJiBhdXRvQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyDrnpzrjaTtlZjqsowg7ZWY64KYIOyEoO2DnVxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBhdXRvQ2FuZGlkYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhdXRvQ2FuZGlkYXRlcy5sZW5ndGgpXTtcbiAgICAgIHJldHVybiBzZWxlY3RlZC5pZCBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgLy8g7LC47KGwIOuNsOydtO2EsOqwgCDsl4bsnLzrqbQgbnVsbCDrsJjtmZggKG51bGxhYmxl7J24IOqyveyasClcbiAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gbnVsbGFibGXsnbQg7JWE64uI6rOgIOuNsOydtO2EsOuPhCDsl4bsnLzrqbQg7JeQ65+sXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZpeHR1cmVHZW5lcmF0b3I6ICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX3sl5Ag7ZWE7JqU7ZWcICR7cHJvcC53aXRofSDrjbDsnbTthLDqsIAg7JeG7Iq164uI64ukLiBgICtcbiAgICAgICAgYOuovOyggCAke3Byb3Aud2l0aH3rpbwg7IOd7ISx7ZWY6rGw64KYIGNvbmUuZGF0YVNvdXJjZeulvCDshKTsoJXtlZjshLjsmpQuYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxvcmVXaXRoUmVsYXRpb25zIOqysOqzvOulvCB0YXJnZXREYuyXkCBpbXBvcnRcbiAgICpcbiAgICog6rSA6rOEIOyytOyduOydhCDrlLDrnbzqsIQg6rKw6rO8KG1haW4gKyByZWxhdGVkKeulvCDrqqjrkZAgaW1wb3J07ZWp64uI64ukLlxuICAgKiDsnZjsobTshLEg7Iic7ISc64qUIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVz6rCAIOyekOuPmeycvOuhnCDsspjrpqztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGltcG9ydEV4cGxvcmVSZXN1bHQoXG4gICAgZXhwbG9yZVJlc3VsdDogRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQsXG4gICAgY29udGV4dDogR2VuZXJhdG9yQ29udGV4dCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxsRml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuXG4gICAgLy8gMS4gUmVsYXRlZCBlbnRpdGllcyBpbXBvcnQgKENvbXBhbnksIERlcGFydG1lbnQg65OxKVxuICAgIGZvciAoY29uc3QgW2VudGl0eUlkLCByZWNvcmRzXSBvZiBleHBsb3JlUmVzdWx0LnJlbGF0ZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHJlY29yZHNUb0ltcG9ydDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuY3lhbihgSW1wb3J0aW5nIHJlbGF0ZWQgZW50aXR5OiAke2VudGl0eUlkfSAoJHtyZWNvcmRzLmxlbmd0aH0gcmVjb3JkcylgKSxcbiAgICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRLZXkgPSBgJHtlbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgICAgaWYgKCFjb250ZXh0LmltcG9ydGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICAgIHJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgY29udGV4dC5pbXBvcnRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZHNUb0ltcG9ydC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHNUb0ltcG9ydCkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgYCAgLSBQcm9jZXNzaW5nICR7ZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY29yZCkuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZml4dHVyZVJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgICAgIHsgX2RiOiB0aGlzLnNvdXJjZURiLCBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFsbEZpeHR1cmVSZWNvcmRzLnB1c2goLi4uZml4dHVyZVJlY29yZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTWFpbiBlbnRpdHkgaW1wb3J0IChFbXBsb3llZSDrk7EpXG4gICAgY29uc3QgbWFpbkVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkKTtcbiAgICBjb25zdCBtYWluUmVjb3Jkc1RvSW1wb3J0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBJbXBvcnRpbmcgbWFpbiBlbnRpdHk6ICR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSAoJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IHJlY29yZHMpYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcykge1xuICAgICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSMke3JlY29yZC5pZH1gO1xuICAgICAgaWYgKCFjb250ZXh0LmltcG9ydGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICBtYWluUmVjb3Jkc1RvSW1wb3J0LnB1c2gocmVjb3JkKTtcbiAgICAgICAgY29udGV4dC5pbXBvcnRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1haW5SZWNvcmRzVG9JbXBvcnQubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgbWFpblJlY29yZHNUb0ltcG9ydCkge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgIGAgIC0gUHJvY2Vzc2luZyAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gcmVjb3JkOmAsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY29yZCkuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZml4dHVyZVJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgIG1haW5FbnRpdHksXG4gICAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICAgIGFsbEZpeHR1cmVSZWNvcmRzLnB1c2goLi4uZml4dHVyZVJlY29yZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIOuqqOuToCBmaXh0dXJl66W8IO2VnCDrsojsl5Ag7IK97J6FICjsnZjsobTshLEg7Iic7IScIOyekOuPmSDsspjrpqwpXG4gICAgaWYgKGFsbEZpeHR1cmVSZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKHRoaXMudGFyZ2V0RGJOYW1lLCBhbGxGaXh0dXJlUmVjb3Jkcyk7XG5cbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBBdXRvLWltcG9ydGVkICR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSB3aXRoIHJlbGF0aW9uczogYCArXG4gICAgICAgICAgICAgIGAke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gbWFpbiArICR7ZXhwbG9yZVJlc3VsdC5yZWxhdGVkLnNpemV9IHJlbGF0ZWQgZW50aXRpZXNgLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZpeHR1cmVHZW5lcmF0b3Ig7Iuk7ZaJIChGYWtlci5qc+unjCDsp4Dsm5ApXG4gICAqXG4gICAqIGZha2VyLiog7ZiV7Iud7J2YIO2RnO2YhOyLneydhCDslYjsoITtlZjqsowg7YyM7Iux7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAgICog7JiIOiBcImZha2VyLmludGVybmV0LmVtYWlsKClcIiDihpIgZmFrZXIuaW50ZXJuZXQuZW1haWwoKVxuICAgKiDsmIg6IFwiZmFrZXIubG9yZW0ud29yZHMoMylcIiDihpIgZmFrZXIubG9yZW0ud29yZHMoMylcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUdlbmVyYXRvcihcbiAgICBnZW5lcmF0b3I6IHN0cmluZyxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGVudGl0eTogRW50aXR5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBGYWtlci5qcyDtkZztmITsi53rp4wg7KeA7JuQXG4gICAgaWYgKGdlbmVyYXRvci5zdGFydHNXaXRoKFwiZmFrZXIuXCIpKSB7XG4gICAgICAvLyB1c2VybmFtZeydtOuCmCBuYW1lIO2VhOuTnOuKlCDtlZzqta3slrQgZmFrZXIg7IKs7JqpXG4gICAgICBjb25zdCBpc05hbWVGaWVsZCA9IHByb3AubmFtZSA9PT0gXCJ1c2VybmFtZVwiIHx8IHByb3AubmFtZSA9PT0gXCJuYW1lXCI7XG4gICAgICBjb25zdCBmYWtlck1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgIGNvbnN0IGZha2VyID0gaXNOYW1lRmllbGQgPyBmYWtlck1vZHVsZS5mYWtlcktPIDogZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgICBjb25zdCBleHByID0gZ2VuZXJhdG9yLnNsaWNlKDYpOyAvLyBcImZha2VyLlwiIOygnOqxsFxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyDtlajsiJgg6rK966Gc7JmAIOyduOyekCDtjIzsi7FcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBleHByLm1hdGNoKC9eKFtcXHcuXSspKD86XFwoKC4qPylcXCkpPyQvKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBGaXh0dXJlR2VuZXJhdG9yOiBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtnZW5lcmF0b3J9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgWywgcGF0aCwgYXJnc1N0cl0gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgICAgICAvLyBmYWtlciDqsJ3ssrTsl5DshJwg7ZWo7IiYIOywvuq4sFxuICAgICAgICBsZXQgZm46IHVua25vd24gPSBmYWtlcjtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gXCJvYmplY3RcIiAmJiBmbiAhPT0gbnVsbCAmJiBwYXJ0IGluIGZuKSB7XG4gICAgICAgICAgICBmbiA9IChmbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcGFydF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRml4dHVyZUdlbmVyYXRvcjogSW52YWxpZCBmYWtlciBwYXRoIGZvciAke3Byb3AubmFtZX06IGZha2VyLiR7cGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtlajsiJjqsIAg7JWE64uI66m0IOyXkOufrFxuICAgICAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IGZha2VyLiR7cGF0aH0gaXMgbm90IGEgZnVuY3Rpb24gKGZvciAke3Byb3AubmFtZX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXJnczogdW5rbm93bltdID0gW107XG4gICAgICAgIGlmIChhcmdzU3RyPy50cmltKCkpIHtcbiAgICAgICAgICBhcmdzID0gdGhpcy5wYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0ciwgcHJvcC5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgZ2VuZXJhdG9yIFwiJHtnZW5lcmF0b3J9XCIgZm9yICR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQ6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZha2VyIOydtOyZuOydmCDtkZztmITsi53snYAg7KeA7JuQ7ZWY7KeAIOyViuydjFxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtnZW5lcmF0b3J9LiBPbmx5IGZha2VyLiogZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZC4gVXNpbmcgZGVmYXVsdCB2YWx1ZS5gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOuTnOydmCDtg4DsnoXqs7wg7J2066aE7J2EIOu2hOyEne2VmOyXrCDsoIHsoIjtlZwg6riw67O46rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICog7Jqw7ISg7Iic7JyEOlxuICAgKiAxLiDtlYTrk5zrqoUg7Yyo7YS0IOunpOy5rSAoc2FsYXJ5LCBidWRnZXQg65OxIOydmOuvuOyeiOuKlCDrjbDsnbTthLApXG4gICAqIDIuIO2KueyImCDsvIDsnbTsiqQgKERlcGFydG1lbnQgbmFtZSDrk7Eg64+E66mU7J24IOyngOyLnSlcbiAgICogMy4g67Cw7Je0IO2DgOyehSAoSlNPTiDrsLDsl7QpXG4gICAqIDQuIEVudW0g7YOA7J6FXG4gICAqIDUuIO2DgOyeheuzhCDquLDrs7jqsJJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcDogRW50aXR5UHJvcCwgZW50aXR5PzogRW50aXR5KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgY29uc3QgZmFrZXIgPSBmYWtlck1vZHVsZS5mYWtlcjtcbiAgICBjb25zdCBmYWtlcktPID0gZmFrZXJNb2R1bGUuZmFrZXJLTztcbiAgICBjb25zdCBmYWtlckpBID0gZmFrZXJNb2R1bGUuZmFrZXJKQTtcblxuICAgIGNvbnN0IGxvY2FsZUZha2VyID0gdGhpcy5sb2NhbGUgPT09IFwia29cIiA/IGZha2VyS08gOiB0aGlzLmxvY2FsZSA9PT0gXCJqYVwiID8gZmFrZXJKQSA6IGZha2VyO1xuXG4gICAgLyoqXG4gICAgICogMS4gRW50aXR5LXNwZWNpZmljIO2KueyImCDsvIDsnbTsiqTrpbwg66i87KCAIOyymOumrO2VqeuLiOuLpC5cbiAgICAgKiBmaWVsZF9wYXR0ZXJuc+uztOuLpCDsmrDshKDtlZjsl6wsIO2KueyglSDsl5Tti7Dti7DsnZgg7ZWE65Oc7JeQIOuPhOuplOyduOyXkCDrp57ripQg6rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICAgKiDsmIg6IERlcGFydG1lbnQubmFtZSDihpIg7ZWc6rWt7Ja0IOu2gOyEnOuqhSAo7IKs656MIOydtOumhOydtCDslYTri5gpXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBEZXBhcnRtZW50IG5hbWXsnYAg7ZWc6rWt7Ja0IOu2gOyEnOuqhSDrqqnroZ3sl5DshJwg7ISg7YOd7ZWp64uI64ukLlxuICAgICAqIOqzoOycoOyEseydhCDsnITtlbQgNzAlIO2ZleuloOuhnCBwcmVmaXgvc3VmZml466W8IOy2lOqwgO2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAoZW50aXR5Py5pZCA9PT0gXCJEZXBhcnRtZW50XCIgJiYgcHJvcC5uYW1lID09PSBcIm5hbWVcIikge1xuICAgICAgY29uc3QgZGVwYXJ0bWVudHMgPSBbXG4gICAgICAgIFwi6rCc67Cc7YyAXCIsXG4gICAgICAgIFwi6riw7ZqN7YyAXCIsXG4gICAgICAgIFwi66eI7LyA7YyF7YyAXCIsXG4gICAgICAgIFwi7JiB7JeF7YyAXCIsXG4gICAgICAgIFwi7J247IKs7YyAXCIsXG4gICAgICAgIFwi7LSd66y07YyAXCIsXG4gICAgICAgIFwi7J6s66y07YyAXCIsXG4gICAgICAgIFwi7ZqM6rOE7YyAXCIsXG4gICAgICAgIFwi67KV66y07YyAXCIsXG4gICAgICAgIFwi65SU7J6Q7J247YyAXCIsXG4gICAgICAgIFwiSVTtjIBcIixcbiAgICAgICAgXCLqs6DqsJ3sp4Dsm5DtjIBcIixcbiAgICAgICAgXCLtkojsp4jqtIDrpqztjIBcIixcbiAgICAgICAgXCLsl7DqtazqsJzrsJztjIBcIixcbiAgICAgICAgXCLsg53sgrDtjIBcIixcbiAgICAgICAgXCLqtazrp6TtjIBcIixcbiAgICAgICAgXCLrrLzrpZjtjIBcIixcbiAgICAgIF07XG4gICAgICBjb25zdCBwcmVmaXhlcyA9IFtcIuyLoOq3nFwiLCBcIu2Gte2VqVwiLCBcIuyghOuetVwiLCBcIuq4gOuhnOuyjFwiLCBcIuuUlOyngO2EuFwiLCBcIu2VteyLrFwiXTtcbiAgICAgIGNvbnN0IHN1ZmZpeGVzID0gW1wiMe2MgFwiLCBcIjLtjIBcIiwgXCIz7YyAXCIsIFwiQe2MgFwiLCBcIkLtjIBcIiwgXCLrs7jrtoBcIiwgXCLshLzthLBcIiwgXCLqt7jro7lcIl07XG5cbiAgICAgIGNvbnN0IGRlcHQgPSBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChkZXBhcnRtZW50cyk7XG5cbiAgICAgIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICBpZiAocmFuZG9tID4gMC43KSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KHByZWZpeGVzKTtcbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0gJHtkZXB0fWA7XG4gICAgICB9XG4gICAgICBpZiAocmFuZG9tID4gMC40KSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KHN1ZmZpeGVzKTtcbiAgICAgICAgcmV0dXJuIGAke2RlcHR9ICR7c3VmZml4fWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVwdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAyLiDtlYTrk5zrqoXsl5DshJwg7J2Y66+466W8IOy2lOuhoO2VmOyXrCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICAgKiDsmIg6IHNhbGFyeSDihpIgMzBNfjE1ME0gKO2VnOq1rSDsl7DrtIkg67KU7JyEKVxuICAgICAqICAgICBidWRnZXQg4oaSIDEwTX41MDBNICjtlITroZzsoJ3tirgg7JiI7IKwIOuylOychClcbiAgICAgKi9cbiAgICBjb25zdCBsb2NhbGVNYXBwaW5ncyA9IHRoaXMubWFwcGluZ3NbdGhpcy5sb2NhbGVdIHx8IHRoaXMubWFwcGluZ3MuZW47XG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBwcm9wLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiXCIpO1xuXG4gICAgZm9yIChjb25zdCBbcGF0dGVybiwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhsb2NhbGVNYXBwaW5ncy5maWVsZF9wYXR0ZXJucykpIHtcbiAgICAgIGlmIChub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhwYXR0ZXJuLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUZha2VyRXhwcmVzc2lvbihjb25maWcuZmFrZXIsIHByb3ApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgZmllbGQgcGF0dGVybiBcIiR7cGF0dGVybn1cIiBmb3IgJHtwcm9wLm5hbWV9LCBmYWxsaW5nIGJhY2s6YCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMy4gSlNPTiDtg4DsnoXsnbTrqbTshJwg67Cw7Je07J24IOqyveyasCAoU29uYW11RmlsZVtdLCBzdHJpbmdbXSDrk7EpXG4gICAgICog7ZWE65Oc66qFIO2MqO2EtOydhCDrs7Tqs6Ag7KCB7KCI7ZWcIOuwsOyXtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgICAqL1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwianNvblwiICYmIFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQpIHtcbiAgICAgIGlmIChwcm9wLmlkLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVBcnJheVZhbHVlKHByb3AsIGVudGl0eSwgZmFrZXIsIGxvY2FsZUZha2VyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogNC4gRW51bSDtg4DsnoXsnYAg7KCV7J2Y65CcIOqwkiDspJEg7ZWY64KY66W8IOuenOuNpCDshKDtg53tlanri4jri6QgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIikge1xuICAgICAgbGV0IGVudW1WYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGlmIChcImVudW1cIiBpbiBwcm9wICYmIEFycmF5LmlzQXJyYXkocHJvcC5lbnVtKSAmJiBwcm9wLmVudW0ubGVuZ3RoID4gMCkge1xuICAgICAgICBlbnVtVmFsdWVzID0gcHJvcC5lbnVtO1xuICAgICAgfSBlbHNlIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkICYmIGVudGl0eT8uZW51bUxhYmVscz8uW3Byb3AuaWRdKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVsc1twcm9wLmlkXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnVtVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KGVudW1WYWx1ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3AubnVsbGFibGUgPyBudWxsIDogXCJVTktOT1dOXCI7XG4gICAgfVxuXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtW11cIikge1xuICAgICAgbGV0IGVudW1WYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGlmIChcImVudW1cIiBpbiBwcm9wICYmIEFycmF5LmlzQXJyYXkocHJvcC5lbnVtKSAmJiBwcm9wLmVudW0ubGVuZ3RoID4gMCkge1xuICAgICAgICBlbnVtVmFsdWVzID0gcHJvcC5lbnVtO1xuICAgICAgfSBlbHNlIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkICYmIGVudGl0eT8uZW51bUxhYmVscz8uW3Byb3AuaWRdKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVsc1twcm9wLmlkXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnVtVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFtmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChlbnVtVmFsdWVzKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogNS4gVmVjdG9yIO2DgOyeheydgCDtmITsnqwg7KeA7JuQ7ZWY7KeAIOyViuycvOuvgOuhnCBudWxs7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKiDtlqXtm4QgQUkgZW1iZWRkaW5nIOyDneyEsSDquLDriqUg7LaU6rCAIOyLnCDqtaztmIQg7JiI7KCV7J6F64uI64ukLlxuICAgICAqL1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwidmVjdG9yXCIgfHwgcHJvcC50eXBlID09PSBcInZlY3RvcltdXCIgfHwgcHJvcC50eXBlID09PSBcInRzdmVjdG9yXCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKiA2LiDtg4DsnoXrs4Qg6riw67O4IEZha2VyIO2RnO2YhOyLneydhCDsi6Ttlontlanri4jri6QgKi9cbiAgICBjb25zdCB0eXBlRGVmYXVsdCA9IGxvY2FsZU1hcHBpbmdzLnR5cGVfZGVmYXVsdHNbcHJvcC50eXBlXTtcbiAgICBpZiAodHlwZURlZmF1bHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVGYWtlckV4cHJlc3Npb24odHlwZURlZmF1bHQuZmFrZXIsIHByb3ApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coYEZhaWxlZCB0byBleGVjdXRlIHR5cGUgZGVmYXVsdCBmb3IgJHtwcm9wLnR5cGV9LCB1c2luZyBmYWxsYmFjazpgLCBlcnJvciksXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogNy4g66ek7ZWR65CY7KeAIOyViuydgCDtg4DsnoXsnYAg6riw67O4IEZha2VyIO2VqOyImOuhnCDsspjrpqztlanri4jri6QgKi9cbiAgICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgY2FzZSBcInN0cmluZ1tdXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5sb3JlbS53b3JkcygzKTtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMDAgfSk7XG4gICAgICBjYXNlIFwiaW50ZWdlcltdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAwIH0pXTtcbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5udW1iZXIuYmlnSW50KHsgbWluOiAxbiwgbWF4OiAxMDAwbiB9KTtcbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5udW1iZXIuYmlnSW50KHsgbWluOiAxbiwgbWF4OiAxMDAwbiB9KV07XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmZsb2F0KHsgbWluOiAwLCBtYXg6IDEwMDAgfSk7XG4gICAgICBjYXNlIFwibnVtYmVyW11cIjpcbiAgICAgIGNhc2UgXCJudW1lcmljW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5udW1iZXIuZmxvYXQoeyBtaW46IDAsIG1heDogMTAwMCB9KV07XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gZmFrZXIuZGF0YXR5cGUuYm9vbGVhbigpO1xuICAgICAgY2FzZSBcImJvb2xlYW5bXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLmRhdGF0eXBlLmJvb2xlYW4oKV07XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgY2FzZSBcImRhdGVbXVwiOlxuICAgICAgICByZXR1cm4gZmFrZXIuZGF0ZS5wYXN0KCk7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4ge307XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgY2FzZSBcInV1aWRbXVwiOlxuICAgICAgICByZXR1cm4gZmFrZXIuc3RyaW5nLnV1aWQoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsl7Qg7YOA7J6F7J2YIOqwkuydhCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIO2DgOyehSBJROyZgCDtlYTrk5zrqoUg7Yyo7YS07J2EIOu2hOyEne2VmOyXrCDsoIHsoIjtlZwg67Cw7Je0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqIOyYiDogaW1hZ2VfdXJscyDihpIgW3t1cmwsIG5hbWUsIG1pbWVfdHlwZX0sIC4uLl1cbiAgICogICAgIHRhZ19pZHMg4oaSIFsxLCAyMywgNDVdXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlQXJyYXlWYWx1ZShcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIF9lbnRpdHk6IEVudGl0eSB8IHVuZGVmaW5lZCxcbiAgICBmYWtlcjogdHlwZW9mIGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKS5mYWtlcixcbiAgICBfbG9jYWxlRmFrZXI6IHR5cGVvZiBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIikuZmFrZXIsXG4gICk6IHVua25vd25bXSB7XG4gICAgY29uc3QgY291bnQgPSBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDMgfSk7XG5cbiAgICAvKiogU29uYW11RmlsZVtd7J2AIFNvbmFtdSDrgrTsnqUg7YOA7J6F7Jy866GcIOq1rOyhsOqwgCDsoJXtlbTsoLgg7J6I7Iq164uI64ukICovXG4gICAgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgPT09IFwiU29uYW11RmlsZVtdXCIpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiAoe1xuICAgICAgICB1cmw6IGZha2VyLmltYWdlLnVybCgpLFxuICAgICAgICBuYW1lOiBmYWtlci5zeXN0ZW0uZmlsZU5hbWUoKSxcbiAgICAgICAgbWltZV90eXBlOiBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChbXG4gICAgICAgICAgXCJpbWFnZS9qcGVnXCIsXG4gICAgICAgICAgXCJpbWFnZS9wbmdcIixcbiAgICAgICAgICBcImltYWdlL2dpZlwiLFxuICAgICAgICAgIFwiYXBwbGljYXRpb24vcGRmXCIsXG4gICAgICAgIF0pLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKiDtlYTrk5zrqoXsl5DshJwg67Cw7Je07J2YIOyaqeuPhOulvCDstpTroaDtlanri4jri6QgKi9cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCJcIik7XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJ1cmxcIikgfHwgbm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJpbWFnZVwiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLmludGVybmV0LnVybCgpKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJpZFwiKSAmJiBub3JtYWxpemVkTmFtZS5lbmRzV2l0aChcInNcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMCB9KSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwidGFnXCIpIHx8IG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwibmFtZVwiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLmxvcmVtLndvcmQoKSk7XG4gICAgfVxuXG4gICAgLyoqIO2MqO2EtCDrp6Tsua3rkJjsp4Ag7JWK7Jy866m0IOu5iCDrsLDsl7TsnYQg67CY7ZmY7ZWp64uI64ukICovXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04g66ek7ZWR7J2YIEZha2VyIO2RnO2YhOyLneydhCDtjIzsi7HtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKlxuICAgKiDtkZztmITsi50g7JiI7IucOlxuICAgKiAtIFwiZmFrZXIuaW50ZXJuZXQuZW1haWwoKVwiIOKGkiDsnbjsnpAg7JeG7J2MXG4gICAqIC0gXCJmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMCB9KVwiIOKGkiBKU09OIOyduOyekFxuICAgKiAtIFwie31cIiDihpIg66as7YSw65+0IOqwkiAoSlNPTi5wYXJzZSlcbiAgICpcbiAgICogZmFrZXJLTywgZmFrZXJKQeuPhCDsp4Dsm5DtlZjsl6wg64uk6rWt7Ja0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVGYWtlckV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgY29uc3QgZmFrZXIgPSBmYWtlck1vZHVsZS5mYWtlcjtcbiAgICBjb25zdCBmYWtlcktPID0gZmFrZXJNb2R1bGUuZmFrZXJLTztcbiAgICBjb25zdCBmYWtlckpBID0gZmFrZXJNb2R1bGUuZmFrZXJKQTtcblxuICAgIC8qKiBGYWtlciDtkZztmITsi53snbQg7JWE64uMIOumrO2EsOuftCDqsJLsnYAgSlNPTuycvOuhnCDtjIzsi7Htlanri4jri6QgKi9cbiAgICBpZiAoIWV4cHJlc3Npb24uc3RhcnRzV2l0aChcImZha2VyXCIpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShleHByZXNzaW9uKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiog7ZGc7ZiE7Iud7JeQ7IScIEZha2VyIOqwneyytOyZgCDqsr3roZzrpbwg7LaU7Lac7ZWp64uI64ukICovXG4gICAgY29uc3QgbWF0Y2ggPSBleHByZXNzaW9uLm1hdGNoKC9eKGZha2VyfGZha2VyS098ZmFrZXJKQSlcXC4oLio/KSQvKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbjogJHtleHByZXNzaW9ufWApO1xuICAgIH1cblxuICAgIGNvbnN0IFssIGZha2VyTmFtZSwgZXhwcl0gPSBtYXRjaDtcbiAgICBjb25zdCBzZWxlY3RlZEZha2VyID1cbiAgICAgIGZha2VyTmFtZSA9PT0gXCJmYWtlcktPXCIgPyBmYWtlcktPIDogZmFrZXJOYW1lID09PSBcImZha2VySkFcIiA/IGZha2VySkEgOiBmYWtlcjtcblxuICAgIGNvbnN0IGZ1bmNNYXRjaCA9IGV4cHIubWF0Y2goL14oW1xcdy5dKykoPzpcXCgoLio/KVxcKSk/JC8pO1xuICAgIGlmICghZnVuY01hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbiBmb3IgJHtwcm9wLm5hbWV9OiAke2V4cHJlc3Npb259YCk7XG4gICAgfVxuXG4gICAgY29uc3QgWywgcGF0aCwgYXJnc1N0cl0gPSBmdW5jTWF0Y2g7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgIC8qKiDsoJAg7ZGc6riw67KVKGRvdCBub3RhdGlvbinsnLzroZwgRmFrZXIg7ZWo7IiY66W8IOywvuyVhOqwkeuLiOuLpCAqL1xuICAgIGxldCBmbjogdW5rbm93biA9IHNlbGVjdGVkRmFrZXI7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBpZiAodHlwZW9mIGZuID09PSBcIm9iamVjdFwiICYmIGZuICE9PSBudWxsICYmIHBhcnQgaW4gZm4pIHtcbiAgICAgICAgZm4gPSAoZm4gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIHBhdGggZm9yICR7cHJvcC5uYW1lfTogJHtmYWtlck5hbWV9LiR7cGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtmYWtlck5hbWV9LiR7cGF0aH0gaXMgbm90IGEgZnVuY3Rpb24gKGZvciAke3Byb3AubmFtZX0pYCk7XG4gICAgfVxuXG4gICAgbGV0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICAgIGlmIChhcmdzU3RyPy50cmltKCkpIHtcbiAgICAgIGFyZ3MgPSB0aGlzLnBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyLCBwcm9wLm5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlSGludOulvCBMTE3sl5Dqsowg7KCE64us7ZWY7JesIO2YhOyLpOyggeyduCDthYzsiqTtirgg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogZmFrZXIuanProZzripQg7IOd7ISx7ZWY6riwIOyWtOugpOyatCDrs7XsnqHtlZwg7YWN7Iqk7Yq4KOyekOq4sOyGjOqwnCwg7ISk66qF66y4IOuTsSnrpbxcbiAgICogTExN7J2EIO2ZnOyaqe2VmOyXrCDsg53shLHtlanri4jri6QuIOuPmeydvO2VnCBoaW507JeQIOuMgO2VnCDspJHrs7Ug7Zi47Lac7J2EIOuwqeyngO2VmOq4sCDsnITtlbRcbiAgICog7LqQ7Iux7J2EIOq4sOuzuOycvOuhnCDsp4Dsm5Dtlanri4jri6QgKExMTSBBUEkg67mE7JqpIOygiOqwkCkuXG4gICAqXG4gICAqIGFpIO2MqO2CpOyngOuKlCBkeW5hbWljIGltcG9ydOuhnCDrtojrn6zsmKTrr4DroZwsIHVzZUxMTeydtCBmYWxzZeyduCDqsr3smrBcbiAgICog7J2Y7KG07ISx7J20IOyEpOy5mOuQmOyngCDslYrslYTrj4QgZml4dHVyZSDsg53shLHsnbQg7KCV7IOBIOuPmeyeke2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVXaXRoTExNKFxuICAgIGZpeHR1cmVIaW50OiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICByb3dLZXk/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIHJvd0tleeqwgCDsnojsnLzrqbQgcm93IOuLqOychCDsg53shLEg7KCE6561IOyCrOyaqVxuICAgIGlmIChyb3dLZXkpIHtcbiAgICAgIGNvbnN0IHJvd0NhY2hlS2V5ID0gYCR7cm93S2V5fToke3Byb3AubmFtZX1gO1xuXG4gICAgICAvLyDsnbTrr7gg7J20IHJvd+yXkCDrjIDtlZwgTExNIO2YuOy2nOydtCDsmYTro4zrkJwg6rK97JqwIOy6kOyLnOyXkOyEnCDrsJTroZwg67CY7ZmYXG4gICAgICBpZiAodGhpcy5sbG1DYWNoZS5oYXMocm93Q2FjaGVLZXkpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxsbUNhY2hlLmdldChyb3dDYWNoZUtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOyDiCByb3c6IExMTSDrjIDsg4EgcHJvcCDsoITssrTrpbwg7ZWcIOuyiOyXkCDsg53shLFcbiAgICAgIGNvbnN0IGxsbVByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcigocCkgPT4ge1xuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHAuY29uZT8uZml4dHVyZUdlbmVyYXRvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocC5uYW1lID09PSBcImlkXCIgJiYgcC5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gISFwLmNvbmU/Lm5vdGU7XG4gICAgICB9KTtcblxuICAgICAgLy8gbGxtUHJvcHPqsIAg67mE7Ja07J6I7Jy866m0IOuLqOydvCDtlYTrk5wg67Cp7Iud7Jy866GcIGZhbGxiYWNrXG4gICAgICBpZiAobGxtUHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtGaXh0dXJlR2VuZXJhdG9yXSBsbG1Qcm9wcyBpcyBlbXB0eSBmb3IgJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSwgdXNpbmcgc2luZ2xlIGZpZWxkIGZhbGxiYWNrYCxcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNpbmdsZVdpdGhMTE0oZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFwaUtleSA9IHRoaXMuZ2V0QXBpS2V5KCk7XG4gICAgICBjb25zdCB7IGNyZWF0ZUFudGhyb3BpYyB9ID0gYXdhaXQgaW1wb3J0KFwiQGFpLXNkay9hbnRocm9waWNcIik7XG4gICAgICBjb25zdCB7IGdlbmVyYXRlVGV4dCB9ID0gYXdhaXQgaW1wb3J0KFwiYWlcIik7XG5cbiAgICAgIGNvbnN0IHJvd1Jlc3BvbnNlID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgICAgbW9kZWw6IGNyZWF0ZUFudGhyb3BpYyh7IGFwaUtleSB9KSh0aGlzLm9wdGlvbnMubGxtTW9kZWwgfHwgXCJjbGF1ZGUtc29ubmV0LTQtNVwiKSxcbiAgICAgICAgcHJvbXB0OiB0aGlzLmJ1aWxkUm93TExNUHJvbXB0KGxsbVByb3BzLCBlbnRpdHkpLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJvd1Jlc3BvbnNlIHx8IHR5cGVvZiByb3dSZXNwb25zZS50ZXh0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTExNIHJlc3BvbnNlXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyDsnZHri7XsnYQg7YyM7Iux7ZWY7JesIOqwgSDtlYTrk5zsl5Ag64yA7ZWcIOqysOqzvOulvCDsupDsi5zsl5Ag7KCA7J6lXG4gICAgICBjb25zdCByb3dSZXN1bHQgPSB0aGlzLnBhcnNlUm93TExNUmVzcG9uc2Uocm93UmVzcG9uc2UudGV4dCwgbGxtUHJvcHMpO1xuICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocm93UmVzdWx0KSkge1xuICAgICAgICB0aGlzLmxsbUNhY2hlLnNldChgJHtyb3dLZXl9OiR7ZmllbGROYW1lfWAsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgLy8g7JqU7LKt7ZWcIO2VhOuTnOydmCDqsJIg67CY7ZmYICjsl4bsnLzrqbQg64uo7J28IO2VhOuTnCBmYWxsYmFjaylcbiAgICAgIGlmICh0aGlzLmxsbUNhY2hlLmhhcyhyb3dDYWNoZUtleSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KHJvd0NhY2hlS2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8g66eM7JW9IHJvdyDsnZHri7Xsl5Ag7J20IO2VhOuTnOqwgCDriITrnb3rkJwg6rK97JqwIOuLqOydvCDtlYTrk5wgZmFsbGJhY2tcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgICB9XG5cbiAgICAvLyByb3dLZXnqsIAg7JeG7Jy866m0IOq4sOyhtCDri6jsnbwg7ZWE65OcIOuwqeyLnVxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDri6jsnbwg7ZWE65Oc66W8IExMTeycvOuhnCDsg53shLHtlanri4jri6QgKHJvd0tleSDsl4bsnYQg65WMIGZhbGxiYWNr7JqpKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVNpbmdsZVdpdGhMTE0oXG4gICAgZml4dHVyZUhpbnQ6IHN0cmluZyxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGVudGl0eTogRW50aXR5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke2VudGl0eS5pZH06JHtwcm9wLm5hbWV9OiR7Zml4dHVyZUhpbnR9YDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlICYmIHRoaXMubGxtQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlLZXkgPSB0aGlzLmdldEFwaUtleSgpO1xuICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICBjb25zdCB7IGdlbmVyYXRlVGV4dCB9ID0gYXdhaXQgaW1wb3J0KFwiYWlcIik7XG5cbiAgICBjb25zdCBzaW5nbGVSZXNwb25zZSA9IGF3YWl0IGdlbmVyYXRlVGV4dCh7XG4gICAgICBtb2RlbDogY3JlYXRlQW50aHJvcGljKHsgYXBpS2V5IH0pKHRoaXMub3B0aW9ucy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC01XCIpLFxuICAgICAgcHJvbXB0OiB0aGlzLmJ1aWxkTExNUHJvbXB0KGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpLFxuICAgIH0pO1xuICAgIGlmICghc2luZ2xlUmVzcG9uc2UgfHwgdHlwZW9mIHNpbmdsZVJlc3BvbnNlLnRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTExNIHJlc3BvbnNlXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wYXJzZUxMTVJlc3BvbnNlKHNpbmdsZVJlc3BvbnNlLnRleHQsIHByb3AudHlwZSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMTE1DYWNoZSkge1xuICAgICAgdGhpcy5sbG1DYWNoZS5zZXQoY2FjaGVLZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogcm93IOyghOyytOulvCDtlZwg67KI7JeQIOyDneyEse2VmOuKlCBMTE0g7ZSE66Gs7ZSE7Yq466W8IOunjOuTreuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dMTE1Qcm9tcHQocHJvcHM6IEVudGl0eVByb3BbXSwgZW50aXR5OiBFbnRpdHkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gbG9jYWxlID09PSBcImtvXCIgPyBcIktvcmVhblwiIDogbG9jYWxlID09PSBcImphXCIgPyBcIkphcGFuZXNlXCIgOiBcIkVuZ2xpc2hcIjtcblxuICAgIGNvbnN0IGZpZWxkRGVzY3JpcHRpb25zID0gcHJvcHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgbGV0IGRlc2MgPSBgLSAke3AubmFtZX0gKCR7cC50eXBlfSk6ICR7cC5jb25lPy5ub3RlID8/IFwiXCJ9YDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwLnR5cGUgPT09IFwiZW51bVwiIHx8IHAudHlwZSA9PT0gXCJlbnVtW11cIikgJiZcbiAgICAgICAgICBcImlkXCIgaW4gcCAmJlxuICAgICAgICAgIHAuaWQgJiZcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscz8uW3AuaWRdXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3AuaWRdKS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgZGVzYyArPSBgIFthbGxvd2VkIHZhbHVlczogJHt2YWx1ZXN9XWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgICAvLyBMTE0g64yA7IOB7J20IOyVhOuLjCBwcm9w65Ok64+EIOunpeudveycvOuhnCDsoJzqs7UgKHJlbGF0aW9uIOygnOyZuClcbiAgICBjb25zdCBvdGhlclByb3BzID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICAhcHJvcHMuaW5jbHVkZXMocCkgJiZcbiAgICAgICAgICAhaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgICBwLm5hbWUgIT09IFwiaWRcIiAmJlxuICAgICAgICAgICEoXCJ2aXJ0dWFsXCIgaW4gcCAmJiBwLnZpcnR1YWwpLFxuICAgICAgKVxuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICBsZXQgZGVzYyA9IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KWA7XG4gICAgICAgIGlmIChwLmNvbmU/Lm5vdGUpIGRlc2MgKz0gYDogJHtwLmNvbmUubm90ZX1gO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHAudHlwZSA9PT0gXCJlbnVtXCIgfHwgcC50eXBlID09PSBcImVudW1bXVwiKSAmJlxuICAgICAgICAgIFwiaWRcIiBpbiBwICYmXG4gICAgICAgICAgcC5pZCAmJlxuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzPy5bcC5pZF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcC5pZF0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICBkZXNjICs9IGAgW2FsbG93ZWQgdmFsdWVzOiAke3ZhbHVlc31dYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBvdGhlclByb3BzQ29udGV4dCA9IG90aGVyUHJvcHNcbiAgICAgID8gYFxcblxcbk90aGVyIGZpZWxkcyBpbiB0aGlzIGVudGl0eSAoZm9yIGNvbnRleHQsIGRvIE5PVCBnZW5lcmF0ZSB0aGVzZSk6XFxuJHtvdGhlclByb3BzfWBcbiAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gcHJvcHMubWFwKChwKSA9PiBgICBcIiR7cC5uYW1lfVwiOiA8JHtwLnR5cGV9PmApLmpvaW4oXCIsXFxuXCIpO1xuXG4gICAgY29uc3QgZW50aXR5Q29udGV4dCA9IGVudGl0eS5jb25lPy5ub3RlID8gYFxcbkVudGl0eSBkZXNjcmlwdGlvbjogJHtlbnRpdHkuY29uZS5ub3RlfWAgOiBcIlwiO1xuXG4gICAgcmV0dXJuIGBHZW5lcmF0ZSB0ZXN0IGZpeHR1cmUgZGF0YSBmb3IgdGhlICR7ZW50aXR5LmlkfSBlbnRpdHkuIEFsbCBmaWVsZHMgbXVzdCBiZSBjb2hlcmVudCBhbmQgY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIuXG5cbkVudGl0eTogJHtlbnRpdHkuaWR9JHtlbnRpdHlDb250ZXh0fVxuTG9jYWxlOiAke2xvY2FsZX0gKHVzZSAke2xhbmd1YWdlfSBmb3IgdGV4dCBmaWVsZHMpXG5cbkZpZWxkcyB0byBnZW5lcmF0ZTpcbiR7ZmllbGREZXNjcmlwdGlvbnN9JHtvdGhlclByb3BzQ29udGV4dH1cblxuUnVsZXM6XG4tIEFsbCBmaWVsZHMgaW4gYSBzaW5nbGUgcm93IG11c3QgYmUgbG9naWNhbGx5IGNvbnNpc3RlbnQgKGUuZy4gbmFtZS9uYW1lX2VuL25hbWVfY24gc2hvdWxkIHJlcHJlc2VudCB0aGUgc2FtZSBwZXJzb24pXG4tIFJldHVybiBPTkxZIHZhbGlkIEpTT04sIG5vIG1hcmtkb3duIG9yIGV4cGxhbmF0aW9uXG4tIERhdGVzIGluIElTTyA4NjAxIGZvcm1hdFxuLSBVc2UgJHtsYW5ndWFnZX0gZm9yIHRleHQgdW5sZXNzIGZpZWxkIGRlc2NyaXB0aW9uIHNheXMgb3RoZXJ3aXNlXG5cblJldHVybiBleGFjdGx5IHRoaXMgSlNPTiBzaGFwZTpcbntcbiR7b3V0cHV0U2hhcGV9XG59YDtcbiAgfVxuXG4gIC8qKlxuICAgKiByb3cgTExNIOydkeuLteydhCDtjIzsi7HtlZjsl6wg7ZWE65Oc67OEIOqwkuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUm93TExNUmVzcG9uc2UodGV4dDogc3RyaW5nLCBwcm9wczogRW50aXR5UHJvcFtdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IGpzb25UZXh0ID0gdGV4dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnJlcGxhY2UoL15gYGBqc29uXFxzKi9pLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL2BgYFxccyokLywgXCJcIilcbiAgICAgIC50cmltKCk7XG5cbiAgICBsZXQgcGFyc2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4gICAgICBpZiAodHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIiB8fCByYXcgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUud2FybihcIltGaXh0dXJlR2VuZXJhdG9yXSBSb3cgTExNIHJlc3BvbnNlIGlzIG5vdCBhIHBsYWluIG9iamVjdDpcIiwgdGV4dCk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHBhcnNlZCA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLndhcm4oXCJbRml4dHVyZUdlbmVyYXRvcl0gRmFpbGVkIHRvIHBhcnNlIHJvdyBMTE0gcmVzcG9uc2U6XCIsIHRleHQpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgIGlmIChwcm9wLm5hbWUgaW4gcGFyc2VkKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wLm5hbWVdID0gdGhpcy5wYXJzZUxMTVJlc3BvbnNlKFN0cmluZyhwYXJzZWRbcHJvcC5uYW1lXSA/PyBcIlwiKSwgcHJvcC50eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMTE1Qcm9tcHQoaGludDogc3RyaW5nLCBwcm9wOiBFbnRpdHlQcm9wLCBlbnRpdHk6IEVudGl0eSk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5vcHRpb25zLmxvY2FsZSB8fCBcImtvXCI7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsb2NhbGUgPT09IFwia29cIiA/IFwiS29yZWFuXCIgOiBsb2NhbGUgPT09IFwiamFcIiA/IFwiSmFwYW5lc2VcIiA6IFwiRW5nbGlzaFwiO1xuXG4gICAgY29uc3QgZW50aXR5Q29udGV4dCA9IGVudGl0eS5jb25lPy5ub3RlID8gYFxcbkVudGl0eSBjb250ZXh0OiAke2VudGl0eS5jb25lLm5vdGV9YCA6IFwiXCI7XG5cbiAgICBjb25zdCBvdGhlckZpZWxkcyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocCkgPT4gcC5uYW1lICE9PSBwcm9wLm5hbWUgJiYgIWlzUmVsYXRpb25Qcm9wKHApICYmIHAuY29uZT8ubm90ZSlcbiAgICAgIC5tYXAoKHApID0+IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KTogJHtwLmNvbmU/Lm5vdGV9YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IG90aGVyRmllbGRzQ29udGV4dCA9IG90aGVyRmllbGRzXG4gICAgICA/IGBcXG5cXG5PdGhlciBmaWVsZHMgaW4gdGhpcyBlbnRpdHkgKGZvciBjb250ZXh0KTpcXG4ke290aGVyRmllbGRzfWBcbiAgICAgIDogXCJcIjtcblxuICAgIGxldCBwcm9tcHQgPSBgR2VuZXJhdGUgdGVzdCBkYXRhIGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9ICh0eXBlOiAke3Byb3AudHlwZX0pJHtlbnRpdHlDb250ZXh0fSR7b3RoZXJGaWVsZHNDb250ZXh0fVxuXG5SZXF1aXJlbWVudDogJHtoaW50fVxuXG5SdWxlczpcbi0gUmV0dXJuIE9OTFkgdGhlIHZhbHVlLCBubyBleHBsYW5hdGlvbiBvciBtYXJrZG93blxuLSBVc2UgJHtsYW5ndWFnZX0gbGFuZ3VhZ2UgaWYgYXBwbGljYWJsZVxuLSBGb3JtYXQ6ICR7dGhpcy5nZXRFeHBlY3RlZEZvcm1hdChwcm9wLnR5cGUpfWA7XG5cbiAgICAvLyBlbnVtIO2DgOyeheyduCDqsr3smrAg6rCA64ql7ZWcIOqwkiDrqqnroZ0g7LaU6rCAXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIgfHwgcHJvcC50eXBlID09PSBcImVudW1bXVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9tcHQgKz0gYFxcbi0gSU1QT1JUQU5UOiBDaG9vc2UgT05MWSBmcm9tIHRoZXNlIGFsbG93ZWQgdmFsdWVzOiAke2VudW1WYWx1ZXMuam9pbihcIiwgXCIpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvbXB0ICs9IGBcXG5cXG5FeGFtcGxlOiAke3RoaXMuZ2V0RXhhbXBsZUZvclR5cGUocHJvcC50eXBlLCBsb2NhbGUpfWA7XG5cbiAgICByZXR1cm4gcHJvbXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxMTVJlc3BvbnNlKHRleHQ6IHN0cmluZywgcHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IGNsZWFuZWQgPSB0ZXh0LnRyaW0oKTtcblxuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2xlYW5lZCk7XG4gICAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpOyAvLyBcImludGVnZXJbXVwiIC0+IFwiaW50ZWdlclwiXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZWQubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAvLyBudWxsL3VuZGVmaW5lZOuKlCDtg4DsnoXrs4Qg6riw67O46rCS7Jy866GcXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFZhbHVlRm9yVHlwZShiYXNlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDqsJ3ssrTripQgSlNPTi5zdHJpbmdpZnkg7ZuEIO2MjOyLsSAoanNvbiDtg4DsnoXsnbgg6rK97JqwKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlVHlwZSA9PT0gXCJqc29uXCJcbiAgICAgICAgICAgICAgICA/IGl0ZW1cbiAgICAgICAgICAgICAgICA6IHRoaXMucGFyc2VTY2FsYXJWYWx1ZShKU09OLnN0cmluZ2lmeShpdGVtKSwgYmFzZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHJpbWl0aXZlIOqwkuydgCDrrLjsnpDsl7TroZwg67OA7ZmYIO2bhCDtjIzsi7FcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoU3RyaW5nKGl0ZW0pLCBiYXNlVHlwZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDri6jsnbwg6rCS7J20IOyYqCDqsr3smrAg67Cw7Je066GcIOqwkOyLuOq4sFxuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsIHx8IHBhcnNlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIFt0aGlzLmdldERlZmF1bHRWYWx1ZUZvclR5cGUoYmFzZVR5cGUpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMucGFyc2VTY2FsYXJWYWx1ZShTdHJpbmcocGFyc2VkKSwgYmFzZVR5cGUpXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VTY2FsYXJWYWx1ZShjbGVhbmVkLCBwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRWYWx1ZUZvclR5cGUocHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgICAgcmV0dXJuIFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlU2NhbGFyVmFsdWUodGV4dDogc3RyaW5nLCBwcm9wVHlwZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgY2xlYW5lZCA9IHRleHQudHJpbSgpO1xuXG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjoge1xuICAgICAgICBjb25zdCBudW0gPSBwYXJzZUludChjbGVhbmVkLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IDAgOiBudW07XG4gICAgICB9XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChjbGVhbmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6IHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChjbGVhbmVkKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gMCA6IG51bTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjoge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoY2xlYW5lZCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG4gICAgICB9XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNsZWFuZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZha2VyIO2VqOyImCDsnbjsnpAg66y47J6Q7Je07J2EIO2MjOyLse2VmOyXrCDsnbjsnpAg67Cw7Je066GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogM+uLqOqzhCDsoITrnrU6XG4gICAqIDEuIEpTT04g7KeB7KCRIO2MjOyLsSAo7ZGc7KSAIEpTT04g7ZGc7ZiE7IudKVxuICAgKiAyLiBKUyDqsJ3ssrQg66as7YSw65+0IOKGkiBKU09OIOuzgO2ZmCDtm4Qg7J6s7Iuc64+EIChzaW5nbGUgcXVvdGUsIHVucXVvdGVkIGtleSDsspjrpqwpXG4gICAqIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsSAo7Iir7J6QLCDrrLjsnpDsl7QpXG4gICAqL1xuICBwcml2YXRlIHBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyOiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiB1bmtub3duW10ge1xuICAgIC8vIDEuIEpTT04g7KeB7KCRIO2MjOyLsVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGBbJHthcmdzU3RyfV1gKSBhcyB1bmtub3duO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZCA6IFtwYXJzZWRdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8g6rOE7IaNXG4gICAgfVxuXG4gICAgLy8gMi4gSlMg6rCd7LK0IOumrO2EsOuftCDihpIgSlNPTiDrs4DtmZgg7ZuEIOyerOyLnOuPhFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBqc29uU3RyID0gdGhpcy5jb252ZXJ0SnNMaXRlcmFsVG9Kc29uKGFyZ3NTdHIpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShgWyR7anNvblN0cn1dYCkgYXMgdW5rbm93bjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWQgOiBbcGFyc2VkXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOqzhOyGjVxuICAgIH1cblxuICAgIC8vIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsVxuICAgIGNvbnN0IHRyaW1tZWQgPSBhcmdzU3RyLnRyaW0oKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihOdW1iZXIodHJpbW1lZCkpKSB7XG4gICAgICByZXR1cm4gW051bWJlcih0cmltbWVkKV07XG4gICAgfVxuICAgIGlmIChcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoXCInXCIpICYmIHRyaW1tZWQuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIFt0cmltbWVkLnNsaWNlKDEsIC0xKV07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBDYW5ub3QgcGFyc2UgYXJndW1lbnRzIGZvciAke3Byb3BOYW1lfTogJHthcmdzU3RyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTIOqwneyytCDrpqzthLDrn7TsnYQgSlNPTuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOuRkCDqsIDsp4Ag67OA7ZmYOlxuICAgKiAxLiBTaW5nbGUtcXVvdGVkIOusuOyekOyXtCDihpIgZG91YmxlLXF1b3RlZCAo7J207Iqk7LyA7J207ZSEIOyymOumrCDtj6ztlagpXG4gICAqIDIuIFVucXVvdGVkIOqwneyytCDtgqQg4oaSIGRvdWJsZS1xdW90ZWRcbiAgICovXG4gIHByaXZhdGUgY29udmVydEpzTGl0ZXJhbFRvSnNvbihpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyAxLiAndmFsdWUnIOKGkiBcInZhbHVlXCIgKOuCtOu2gCBcIiDsnbTsiqTsvIDsnbTtlIQsIFxcJyDihpIgJylcbiAgICBjb25zdCB3aXRoRG91YmxlUXVvdGVzID0gaW5wdXQucmVwbGFjZShcbiAgICAgIC8nKFteJ1xcXFxdKig/OlxcXFwuW14nXFxcXF0qKSopJy9nLFxuICAgICAgKF8sIGNvbnRlbnQ6IHN0cmluZykgPT4gYFwiJHtjb250ZW50LnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIil9XCJgLFxuICAgICk7XG5cbiAgICAvLyAyLiB7IGtleTog4oaSIHsgXCJrZXlcIjpcbiAgICByZXR1cm4gd2l0aERvdWJsZVF1b3Rlcy5yZXBsYWNlKC8oW3ssXVxccyopKFthLXpBLVpfJF1bXFx3JF0qKShcXHMqOikvZywgJyQxXCIkMlwiJDMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb25hbXUuc2VjcmV07J2EIOyasOyEoOycvOuhnCDtlZjqs6AsIOyXhuycvOuptCDtmZjqsr3rs4DsiJjsl5DshJwgQVBJIO2CpOulvCDsnb3sirXri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdS5zZWNyZXTsnYAg7ZSE66Gc7KCd7Yq467OEIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuvgOuhnCDrjZQg64aS7J2AIOyasOyEoOyInOychOulvCDqsIDsp4DrqbAsXG4gICAqIO2ZmOqyveuzgOyImOuKlCDqsJzrsJwg7ZmY6rK97J2064KYIENJL0NE7JeQ7IScIGZhbGxiYWNr7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gICAgbGV0IGFwaUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgICAgYXBpS2V5ID0gU29uYW11LnNlY3JldD8uYW50aHJvcGljX2FwaV9rZXk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTb25hbXXqsIAg7LSI6riw7ZmU65CY7KeAIOyViuydgCDqsr3smrAgKO2FjOyKpO2KuCDtmZjqsr0g65OxKVxuICAgIH1cblxuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICBhcGlLZXkgPSBwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWTtcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFOVEhST1BJQ19BUElfS0VZIG5vdCBmb3VuZC4gU2V0IGl0IGluIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBTb25hbXUuc2VjcmV0LmFudGhyb3BpY19hcGlfa2V5XCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhcGlLZXk7XG4gIH1cblxuICBwcml2YXRlIGdldEV4cGVjdGVkRm9ybWF0KHByb3BUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpO1xuICAgICAgY29uc3QgYmFzZUZvcm1hdCA9IHRoaXMuZ2V0U2NhbGFyRm9ybWF0KGJhc2VUeXBlKTtcbiAgICAgIHJldHVybiBgSlNPTiBhcnJheSBvZiAke2Jhc2VGb3JtYXR9IChlLmcuLCBbJHt0aGlzLmdldEV4YW1wbGVGb3JUeXBlKGJhc2VUeXBlLCBcImVuXCIpfSwgLi4uXSlgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFNjYWxhckZvcm1hdChwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjYWxhckZvcm1hdChwcm9wVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiaW50ZWdlciBudW1iZXJzXCI7XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiBcImRlY2ltYWwgbnVtYmVyc1wiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwiYm9vbGVhbnMgKHRydWUgb3IgZmFsc2UpXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJJU08gODYwMSBkYXRlIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiBcInZhbGlkIEpTT04gb2JqZWN0IG9yIGFycmF5XCI7XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCJVVUlEIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBcIm9uZSBvZiB0aGUgYWxsb3dlZCBlbnVtIHZhbHVlc1wiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwicGxhaW4gdGV4dCBzdHJpbmdzXCI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeGFtcGxlRm9yVHlwZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgLy8g67Cw7Je0IO2DgOyehSDsspjrpqxcbiAgICBpZiAocHJvcFR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgY29uc3QgYmFzZVR5cGUgPSBwcm9wVHlwZS5zbGljZSgwLCAtMik7XG4gICAgICBjb25zdCBiYXNlRXhhbXBsZSA9IHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShiYXNlVHlwZSwgbG9jYWxlKTtcbiAgICAgIHJldHVybiBgWyR7YmFzZUV4YW1wbGV9XWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZSwgbG9jYWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgY29uc3QgaXNLb3JlYW4gPSBsb2NhbGUgPT09IFwia29cIjtcblxuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gXCI0MlwiO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gXCIzLjE0XCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCIyMDI0LTAxLTAxXCI7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gJ3tcImtleVwiOiBcInZhbHVlXCJ9JztcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIHJldHVybiBcIjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMFwiO1xuICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgcmV0dXJuIFwiRU5VTV9WQUxVRVwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGlzS29yZWFuID8gXCLslYjrhZXtlZjshLjsmpRcIiA6IFwiSGVsbG9cIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7J2066aE7J2EIOydtOuplOydvCDroZzsu6wg7YyM7Yq47JqpIOuhnOuniOuCmOydtOymiOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDtlZzquIAg7J2066aE7J2AIOy0iOyEsS3spJHshLEt7KKF7ISxIOu2hO2VtCDtm4Qg66Gc66eI64KY7J207KaIIOyymOumrO2VqeuLiOuLpC5cbiAgICog7JiB66y4IOydtOumhOydgCDshozrrLjsnpDroZwg67OA7ZmY7ZWY6rOgIOqzteuwseydhCDsoJAoLilcXHVjNzNj66GcIOy5mO2ZmO2VqeuLiOuLpC5cbiAgICog7JiIOiBcIuq5gOyyoOyImFwiIOKGkiBcImNoZW9sc3Uua2ltXCIsIFwiSm9obiBEb2VcIiDihpIgXCJqb2huLmRvZVwiXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJvbWFuaXplTmFtZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIO2VnOq4gCDtj6ztlagg7Jes67aAIO2ZleyduFxuICAgIGlmICgvW1xcdUFDMDAtXFx1RDdBRl0vLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvbWFuaXplS29yZWFuTmFtZShuYW1lKTtcbiAgICB9XG4gICAgLy8g7JiB66y4OiDshozrrLjsnpAgKyDsoJAg6rWs67aEXG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCBcIi5cIilcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5dL2csIFwiXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VnOq4gCDsnbTrpoTsnYQg66Gc66eI64KY7J207KaIIOyymOumrO2VqeuLiOuLpC5cbiAgICpcbiAgICog7LSI7ISxL+ykkeyEsS/sooXshLEg66ek7ZWRIO2FjOydtOu4lOydhCDsgqzsmqntlZjsl6wg7ZWc6riA7J2EIOuhnOuniOyekOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqIOyyqyDquIDsnpDrpbwg7ISx7Jy866GcIOqwhOyjvO2VmOyXrCBcIuq5gOyyoOyImFwiIOKGkiBcImNoZW9sc3Uua2ltXCIg7ZiV7YOc66GcIOy2nOugpe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgcm9tYW5pemVLb3JlYW5OYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgQ0hPU0VPTkcgPSBbXG4gICAgICBcImdcIixcbiAgICAgIFwia2tcIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJkXCIsXG4gICAgICBcInR0XCIsXG4gICAgICBcInJcIixcbiAgICAgIFwibVwiLFxuICAgICAgXCJiXCIsXG4gICAgICBcInBwXCIsXG4gICAgICBcInNcIixcbiAgICAgIFwic3NcIixcbiAgICAgIFwiXCIsXG4gICAgICBcImpcIixcbiAgICAgIFwiampcIixcbiAgICAgIFwiY2hcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInBcIixcbiAgICAgIFwiaFwiLFxuICAgIF07XG4gICAgY29uc3QgSlVOR1NFT05HID0gW1xuICAgICAgXCJhXCIsXG4gICAgICBcImFlXCIsXG4gICAgICBcInlhXCIsXG4gICAgICBcInlhZVwiLFxuICAgICAgXCJlb1wiLFxuICAgICAgXCJlXCIsXG4gICAgICBcInllb1wiLFxuICAgICAgXCJ5ZVwiLFxuICAgICAgXCJvXCIsXG4gICAgICBcIndhXCIsXG4gICAgICBcIndhZVwiLFxuICAgICAgXCJvZVwiLFxuICAgICAgXCJ5b1wiLFxuICAgICAgXCJ1XCIsXG4gICAgICBcIndvXCIsXG4gICAgICBcIndlXCIsXG4gICAgICBcIndpXCIsXG4gICAgICBcInl1XCIsXG4gICAgICBcImV1XCIsXG4gICAgICBcInVpXCIsXG4gICAgICBcImlcIixcbiAgICBdO1xuICAgIGNvbnN0IEpPTkdTRU9ORyA9IFtcbiAgICAgIFwiXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJrXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJuXCIsXG4gICAgICBcInRcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcIm1cIixcbiAgICAgIFwicFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcInRcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJuZ1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInRcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInBcIixcbiAgICAgIFwidFwiLFxuICAgIF07XG5cbiAgICBjb25zdCByb21hbml6ZSA9IChjaGFyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgIGlmIChjb2RlIDwgMHhhYzAwIHx8IGNvZGUgPiAweGQ3YWYpIHJldHVybiBjaGFyO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gY29kZSAtIDB4YWMwMDtcbiAgICAgIGNvbnN0IGNobyA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gNTg4KTtcbiAgICAgIGNvbnN0IGp1bmcgPSBNYXRoLmZsb29yKChvZmZzZXQgJSA1ODgpIC8gMjgpO1xuICAgICAgY29uc3Qgam9uZyA9IG9mZnNldCAlIDI4O1xuICAgICAgcmV0dXJuIENIT1NFT05HW2Nob10gKyBKVU5HU0VPTkdbanVuZ10gKyBKT05HU0VPTkdbam9uZ107XG4gICAgfTtcblxuICAgIGNvbnN0IGNoYXJzID0gWy4uLm5hbWVdO1xuICAgIC8vIOyyqyDquIDsnpDrpbwg7ISxKOWnkynsnLzroZwg6rCE7KO8XG4gICAgY29uc3QgZmFtaWx5TmFtZSA9IHJvbWFuaXplKGNoYXJzWzBdKTtcbiAgICBjb25zdCBnaXZlbk5hbWUgPSBjaGFycy5zbGljZSgxKS5tYXAocm9tYW5pemUpLmpvaW4oXCJcIik7XG5cbiAgICBpZiAoZ2l2ZW5OYW1lKSB7XG4gICAgICByZXR1cm4gYCR7Z2l2ZW5OYW1lfS4ke2ZhbWlseU5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbWlseU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnCDthrXqs4Trpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TExNQ2FjaGVTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZTogdGhpcy5sbG1DYWNoZS5zaXplLFxuICAgICAgZW5hYmxlZDogdGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnOulvCDstIjquLDtmZTtlanri4jri6QuXG4gICAqL1xuICBjbGVhckxMTUNhY2hlKCkge1xuICAgIHRoaXMubGxtQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6jthY3siqTtirgg7IOd7ISxXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbnRleHQoKTogR2VuZXJhdG9yQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpeHR1cmVzOiBuZXcgTWFwKCksXG4gICAgICByZWZlcmVuY2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgaW1wb3J0ZWRSZWNvcmRzOiBuZXcgU2V0KCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsuZgg7IOd7ISxIOuwjyDsnpDrj5kg7KCA7J6lXG4gICAqXG4gICAqIDEuIOqwgSBzcGVj67OE66GcIGZpeHR1cmUg7IOd7ISxICjrqZTrqqjrpqwpXG4gICAqIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAqIDMuIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKCnroZwgdGFyZ2V0RGLsl5Ag7KCA7J6lXG4gICAqXG4gICAqIEByZXR1cm5zIOyggOyepeuQnCBmaXh0dXJlIOuNsOydtO2EsCAo7Iuk7KCcIERCIElEIO2PrO2VqClcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQmF0Y2goXG4gICAgc3BlY3M6IEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGNvdW50OiBudW1iZXI7IG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+LFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRGaXh0dXJlczogQXJyYXk8e1xuICAgICAgZW50aXR5OiBzdHJpbmc7XG4gICAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGV4cGxpY2l0SWQ/OiBib29sZWFuO1xuICAgIH0+ID0gW107XG5cbiAgICAvLyAxLiDqsIEgc3BlY+uzhOuhnCBmaXh0dXJlIOyDneyEsVxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykge1xuICAgICAgY29uc3Qgc3BlY0VudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoc3BlYy5lbnRpdHkpO1xuXG4gICAgICBpZiAoc3BlY0VudGl0eS5wYXJlbnRJZCkge1xuICAgICAgICAvLyBwYXJlbnRJZCDsl5Tti7Dti7A6IERC7JeQ7IScIOyEnOu4jO2DgOyehSDtlonsnbQg7JeG64qUIOu2gOuqqCBpZOulvCDsobDtmoztlZjsl6wg7IKs7JqpXG4gICAgICAgIC8vICjsg4gg67aA66qoIOyDneyEsSDrjIDsi6Ag6riw7KG0IOuNsOydtO2EsCDsnqztmZzsmqkpXG4gICAgICAgIGNvbnN0IGlkUHJvcCA9IHNwZWNFbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgICBjb25zdCBwYXJlbnRPdmVycmlkZXMgPVxuICAgICAgICAgIChpZFByb3A/LmNvbmU/LmZpeHR1cmVQYXJlbnRPdmVycmlkZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpID8/IHt9O1xuICAgICAgICBjb25zdCBwYXJlbnRFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWNFbnRpdHkucGFyZW50SWQpO1xuXG4gICAgICAgIC8vIOu2gOuqqCDthYzsnbTruJTsl5DshJwg7ISc67iM7YOA7J6FIO2FjOydtOu4lOyXkCDsl4bripQgaWTrpbwg7KGw7ZqMXG4gICAgICAgIGxldCBxdWVyeSA9IHRoaXMuc291cmNlRGIocGFyZW50RW50aXR5LnRhYmxlKS5zZWxlY3QoYCR7cGFyZW50RW50aXR5LnRhYmxlfS5pZGApO1xuICAgICAgICBmb3IgKGNvbnN0IFtjb2wsIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMocGFyZW50T3ZlcnJpZGVzKSkge1xuICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoXG4gICAgICAgICAgICBgJHtwYXJlbnRFbnRpdHkudGFibGV9LiR7Y29sfWAsXG4gICAgICAgICAgICB2YWwgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBxdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgLmxlZnRKb2luKHNwZWNFbnRpdHkudGFibGUsIGAke3NwZWNFbnRpdHkudGFibGV9LmlkYCwgYCR7cGFyZW50RW50aXR5LnRhYmxlfS5pZGApXG4gICAgICAgICAgLndoZXJlTnVsbChgJHtzcGVjRW50aXR5LnRhYmxlfS5pZGApXG4gICAgICAgICAgLmxpbWl0KHNwZWMuY291bnQpO1xuXG4gICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlSWRzOiBudW1iZXJbXSA9IHJvd3MubWFwKChyOiB7IGlkOiBudW1iZXIgfSkgPT4gci5pZCk7XG5cbiAgICAgICAgaWYgKGF2YWlsYWJsZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIGBbcGFyZW50SWRdICR7c3BlYy5lbnRpdHl9OiDshJzruIztg4DsnoXsnbQg7JeG64qUIOu2gOuqqCDroIjsvZTrk5zqsIAg67aA7KGx7ZWp64uI64ukLiDqsbTrhIjrnIHri4jri6QuYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwYXJlbnRJZCBvZiBhdmFpbGFibGVJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlKHNwZWMuZW50aXR5LCBzcGVjLm92ZXJyaWRlcyB8fCB7fSwgY29udGV4dCk7XG4gICAgICAgICAgICBmaXh0dXJlLmlkID0gcGFyZW50SWQ7XG4gICAgICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHsgZW50aXR5OiBzcGVjLmVudGl0eSwgZGF0YTogZml4dHVyZSwgZXhwbGljaXRJZDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BlYy5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZml4dHVyZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGUoc3BlYy5lbnRpdHksIHNwZWMub3ZlcnJpZGVzIHx8IHt9LCBjb250ZXh0KTtcbiAgICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGVudGl0eTogc3BlYy5lbnRpdHksXG4gICAgICAgICAgICBkYXRhOiBmaXh0dXJlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICBjb25zdCBmaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgZm9yIChjb25zdCB7IGVudGl0eTogZW50aXR5TmFtZSwgZGF0YSwgZXhwbGljaXRJZCB9IG9mIGdlbmVyYXRlZEZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuXG4gICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEvripQg7J6E7IucIElEIOyDneyEsSAoREIg7Iuc7YCA7Iqk6rCAIOyLpOygnCBJRCDtlaDri7kpXG4gICAgICAvLyBzdHJpbmcgUEvripQgZ2VuZXJhdGUoKeyXkOyEnCDsnbTrr7gg7IOd7ISx65CcIGlkIOqwkuydhCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAvLyBwYXJlbnRJZCDsl5Tti7Dti7DripQg67aA66qo7J2YIOyLpOygnCBpZOulvCDqt7jrjIDroZwg7IKs7JqpICjsi5ztgIDsiqQg66+47IKs7JqpKVxuICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICFleHBsaWNpdElkICYmXG4gICAgICAgIChpZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgaWRQcm9wPy50eXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgIGlkUHJvcD8uY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCIpO1xuXG4gICAgICBjb25zdCBkYXRhRm9yUmVjb3JkID0gdXNlc1NlcXVlbmNlXG4gICAgICAgID8geyAuLi5kYXRhLCBpZDogTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCkgfVxuICAgICAgICA6IGRhdGE7XG5cbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICBlbnRpdHksXG4gICAgICAgIGRhdGFGb3JSZWNvcmQgYXMgeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB9LFxuICAgICAgICB7IHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgLy8gMy4gdGFyZ2V0RGLsl5Ag7IK97J6FIChGaXh0dXJlTWFuYWdlcuqwgCDsnZjsobTshLEg7KCV66CsIOyymOumrClcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXModGhpcy50YXJnZXREYk5hbWUsIGZpeHR1cmVSZWNvcmRzKTtcblxuICAgIC8vIDQuIGNvbXBhbmlvbiBmaXh0dXJlcyDsg53shLEgKGZpeHR1cmVDb21wYW5pb25z6rCAIOyEoOyWuOuQnCDqsr3smrApXG4gICAgY29uc3QgY29tcGFuaW9uUmVzdWx0cyA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVDb21wYW5pb25zKHNwZWNzLCByZXN1bHRzKTtcblxuICAgIGNvbnN0IHRvdGFsID0gcmVzdWx0cy5sZW5ndGggKyBjb21wYW5pb25SZXN1bHRzLmxlbmd0aDtcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBHZW5lcmF0ZWQgYW5kIHNhdmVkICR7dG90YWx9IGZpeHR1cmVzIHRvICR7dGhpcy50YXJnZXREYk5hbWV9YCkpO1xuICAgIHJldHVybiBbLi4ucmVzdWx0cywgLi4uY29tcGFuaW9uUmVzdWx0c107XG4gIH1cblxuICAvKipcbiAgICog67aA66qoIGZpeHR1cmUg6rKw6rO866W8IOq4sOuwmOycvOuhnCBmaXh0dXJlQ29tcGFuaW9uc+yXkCDshKDslrjrkJwgY29tcGFuaW9uIEVudGl0eeulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIGdlbmVyYXRlQmF0Y2goKeyXkOyEnOunjCDtmLjstpzrkJjrqbAsIGNvbXBhbmlvbiDsg53shLEg7IucIOyerOq3gOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIGdlbmVyYXRlQmF0Y2goKeulvCDri6Tsi5wg7Zi47Lac7ZWY7KeAIOyViuqzoCDsp4HsoJEg7IK97J6F7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUNvbXBhbmlvbnMoXG4gICAgc3BlY3M6IEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGNvdW50OiBudW1iZXI7IG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+LFxuICAgIHBhcmVudFJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBhbGxSZXN1bHRzOiBGaXh0dXJlSW1wb3J0UmVzdWx0W10gPSBbXTtcbiAgICBjb25zdCBwcm9jZXNzZWRFbnRpdGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHNwZWNzKSB7XG4gICAgICBpZiAocHJvY2Vzc2VkRW50aXRpZXMuaGFzKHNwZWMuZW50aXR5KSkgY29udGludWU7XG4gICAgICBwcm9jZXNzZWRFbnRpdGllcy5hZGQoc3BlYy5lbnRpdHkpO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWMuZW50aXR5KTtcbiAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICBjb25zdCBjb21wYW5pb25zID0gaWRQcm9wPy5jb25lPy5maXh0dXJlQ29tcGFuaW9ucztcbiAgICAgIGlmICghY29tcGFuaW9ucyB8fCBjb21wYW5pb25zLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGVudGl0eVJlc3VsdHMgPSBwYXJlbnRSZXN1bHRzLmZpbHRlcigocikgPT4gci5lbnRpdHlJZCA9PT0gc3BlYy5lbnRpdHkpO1xuICAgICAgaWYgKGVudGl0eVJlc3VsdHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBjb21wYW5pb24gb2YgY29tcGFuaW9ucykge1xuICAgICAgICAvLyBjb21wYW5pb24gZW50aXR57JeQ7IScIOu2gOuqqCBlbnRpdHnroZzsnZggQmVsb25nc1RvT25lIEZLIOy7rOufvOuqhSDtjIzslYVcbiAgICAgICAgY29uc3QgY29tcGFuaW9uRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChjb21wYW5pb24uZW50aXR5KTtcbiAgICAgICAgY29uc3QgZmtQcm9wID0gY29tcGFuaW9uRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gc3BlYy5lbnRpdHksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZmtQcm9wKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgW0NvbXBhbmlvbl0gTm8gQmVsb25nc1RvT25lIHJlbGF0aW9uIGZyb20gJHtjb21wYW5pb24uZW50aXR5fSB0byAke3NwZWMuZW50aXR5fS4gU2tpcHBpbmcuYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmtDb2xOYW1lID0gYCR7ZmtQcm9wLm5hbWV9X2lkYDtcblxuICAgICAgICAvLyBjb21wYW5pb27snZggaWRQcm9wLCB1c2VzU2VxdWVuY2UsIGNvdW5064qUIGNvbXBhbmlvbiDri6jsnITroZwg6rOg7KCVXG4gICAgICAgIGNvbnN0IGNvbXBhbmlvbklkUHJvcCA9IGNvbXBhbmlvbkVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgY29tcGFuaW9uSWRQcm9wPy50eXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGNvbXBhbmlvbklkUHJvcD8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICBjb21wYW5pb25JZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiO1xuICAgICAgICBjb25zdCBjb21wYW5pb25Db3VudCA9IGNvbXBhbmlvbi5jb3VudCA/PyAxO1xuXG4gICAgICAgIC8vIOqwgSBwYXJlbnQgcmVzdWx07JeQIOuMgO2VtCBjb21wYW5pb24gZml4dHVyZSDsg53shLFcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3JlYXRlQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBjb21wYW5pb25GaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXJlbnRSZXN1bHQgb2YgZW50aXR5UmVzdWx0cykge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkT3ZlcnJpZGVzID0gdGhpcy5yZXNvbHZlVGVtcGxhdGVPdmVycmlkZXMoXG4gICAgICAgICAgICBjb21wYW5pb24ub3ZlcnJpZGVzID8/IHt9LFxuICAgICAgICAgICAgcGFyZW50UmVzdWx0LmRhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXNvbHZlZE92ZXJyaWRlc1tma0NvbE5hbWVdID0gcGFyZW50UmVzdWx0LmRhdGEuaWQ7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBhbmlvbkNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlKGNvbXBhbmlvbi5lbnRpdHksIHJlc29sdmVkT3ZlcnJpZGVzLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgY29uc3QgZGF0YUZvclJlY29yZCA9IHVzZXNTZXF1ZW5jZVxuICAgICAgICAgICAgICA/IHsgLi4uZml4dHVyZSwgaWQ6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApIH1cbiAgICAgICAgICAgICAgOiBmaXh0dXJlO1xuXG4gICAgICAgICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICAgICAgY29tcGFuaW9uRW50aXR5LFxuICAgICAgICAgICAgICBkYXRhRm9yUmVjb3JkIGFzIHtcbiAgICAgICAgICAgICAgICBpZDogbnVtYmVyIHwgc3RyaW5nO1xuICAgICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcGFuaW9uUmVzdWx0cyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKFxuICAgICAgICAgIHRoaXMudGFyZ2V0RGJOYW1lLFxuICAgICAgICAgIGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzLFxuICAgICAgICApO1xuICAgICAgICBhbGxSZXN1bHRzLnB1c2goLi4uY29tcGFuaW9uUmVzdWx0cyk7XG5cbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgICAgYFtDb21wYW5pb25dIEdlbmVyYXRlZCAke2NvbXBhbmlvblJlc3VsdHMubGVuZ3RofSAke2NvbXBhbmlvbi5lbnRpdHl9IGZpeHR1cmVzYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBvdmVycmlkZXMg6rCS7J2YIFwie3tmaWVsZE5hbWV9fVwiIO2FnO2UjOumv+ydhCDrtoDrqqggZml4dHVyZSDrjbDsnbTthLDroZwg7LmY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IHsgXCJhY2NvdW50X2lkXCI6IFwie3tlbWFpbH19XCIgfSDihpIgeyBcImFjY291bnRfaWRcIjogXCJ1c2VyQGV4YW1wbGUuY29tXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVGVtcGxhdGVPdmVycmlkZXMoXG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBwYXJlbnREYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlIHwgbnVsbCB9LFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGVzKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5zdGFydHNXaXRoKFwie3tcIikgJiYgdmFsdWUuZW5kc1dpdGgoXCJ9fVwiKSkge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSB2YWx1ZS5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgICAgICBpZiAoIShmaWVsZE5hbWUgaW4gcGFyZW50RGF0YSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBg7YWc7ZSM66a/IO2VhOuTnCBcIiR7ZmllbGROYW1lfVwi7J20KOqwgCkg67aA66qoIGZpeHR1cmUg642w7J207YSw7JeQIOyhtOyerO2VmOyngCDslYrsirXri4jri6QgKG92ZXJyaWRlIGtleTogXCIke2tleX1cIilgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZWRba2V5XSA9IHBhcmVudERhdGFbZmllbGROYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCBEQihzb3VyY2VEYinsl5DshJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCBmaXh0dXJlIERCKHRhcmdldERiKeyXkCBpbXBvcnTtlanri4jri6QuXG4gICAqXG4gICAqIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICogMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICogMy4gdGFyZ2V0RGLsl5Ag7IK97J6FXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlOYW1lIC0g7KGw7ZqM7ZWgIGVudGl0eSDsnbTrpoRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDsobDtmowg7Ji17IWYIChzdHJhdGVneSwgbGltaXQsIGluY2x1ZGVSZWxhdGlvbnMg65OxKVxuICAgKiBAcmV0dXJucyDsoIDsnqXrkJwgZml4dHVyZSDrjbDsnbTthLAgKOyLpOygnCBEQiBJRCDtj6ztlagpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIO2UhOuhnOuNleyFmCBEQuyXkOyEnCBVc2VyIDEw66qFICsg6rSA66CoIEVtcGxveWVlLCBEZXBhcnRtZW50IOqwgOyguOyYpOq4sFxuICAgKiBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShcIlVzZXJcIiwge1xuICAgKiAgIHN0cmF0ZWd5OiBcInNhbXBsZVwiLFxuICAgKiAgIGxpbWl0OiAxMCxcbiAgICogICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgKiAgIG1heERlcHRoOiAyXG4gICAqIH0pO1xuICAgKi9cbiAgYXN5bmMgaW1wb3J0RnJvbVNvdXJjZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgYEltcG9ydGluZyAke2VudGl0eU5hbWV9IGZyb20gc291cmNlIERCIHdpdGggb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeSh7IHN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LCBsaW1pdDogb3B0aW9ucy5saW1pdCwgaW5jbHVkZVJlbGF0aW9uczogb3B0aW9ucy5pbmNsdWRlUmVsYXRpb25zLCBtYXhEZXB0aDogb3B0aW9ucy5tYXhEZXB0aCB9KX1gLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgIC8vIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICBjb25zdCBleHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMoZW50aXR5TmFtZSwgb3B0aW9ucyk7XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBGb3VuZCAke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSByZWNvcmRzIGFuZCAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAvLyAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgIC8vIOuplOyduCBlbnRpdHnsnZggcmVjb3Jkc+ulvCBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IG1haW5FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzKSB7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgbWFpbkVudGl0eSxcbiAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgLy8g6rSA66CoIGVudGl0eeydmCByZWNvcmRz66W8IEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgZm9yIChjb25zdCBbcmVsYXRlZEVudGl0eU5hbWUsIHJlbGF0ZWRSZWNvcmRzXSBvZiBleHBsb3JlUmVzdWx0LnJlbGF0ZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChyZWxhdGVkRW50aXR5TmFtZSk7XG4gICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWxhdGVkUmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICByZWxhdGVkRW50aXR5LFxuICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBmaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgICAgfVxuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAtICR7cmVsYXRlZEVudGl0eU5hbWV9OiAke3JlbGF0ZWRSZWNvcmRzLmxlbmd0aH0gcmVjb3Jkc2ApKTtcbiAgICB9XG5cbiAgICAvLyAzLiB0YXJnZXREYuyXkCDsgr3snoUgKEZpeHR1cmVNYW5hZ2Vy6rCAIOydmOyhtOyEsSDsoJXroKwg7LKY66asKVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgZml4dHVyZVJlY29yZHMpO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgYFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCAke3Jlc3VsdHMubGVuZ3RofSByZWNvcmRzIHRvICR7dGhpcy50YXJnZXREYk5hbWV9ICgke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSArICR7cmVzdWx0cy5sZW5ndGggLSBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IHJlbGF0ZWQpYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIl0sIm5hbWVzIjpbImNoYWxrIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1Rlc3QiLCJEYXRhRXhwbG9yZXIiLCJmYWtlck1hcHBpbmdzIiwiRml4dHVyZU1hbmFnZXIiLCJGaXh0dXJlR2VuZXJhdG9yIiwiZGF0YUV4cGxvcmVyIiwibG9jYWxlIiwibWFwcGluZ3MiLCJsbG1DYWNoZSIsIk1hcCIsImVudGl0eUNhY2hlIiwib3B0aW9ucyIsInNvdXJjZURiIiwiX3RhcmdldERiIiwidGFyZ2V0RGJOYW1lIiwiZW50aXR5TWFuYWdlciIsInVzZUxMTSIsImVuYWJsZUxMTUNhY2hlIiwibGxtTW9kZWwiLCJnZW5lcmF0ZSIsImVudGl0eU5hbWUiLCJvdmVycmlkZXMiLCJjb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsImVudGl0eSIsImdldCIsInNldCIsInRlbXBJZCIsIkRhdGUiLCJub3ciLCJyb3dLZXkiLCJ1bmRlZmluZWQiLCJmaXh0dXJlIiwicHJvcCIsInByb3BzIiwidmlydHVhbCIsIm5hbWUiLCJjb25lIiwiZml4dHVyZVN0cmF0ZWd5IiwidHlwZSIsImZha2VyIiwiX2Zha2VyIiwic3RyaW5nIiwiYWxwaGFudW1lcmljIiwidXVpZCIsImZrQ29sTmFtZSIsImhhc0pvaW5Db2x1bW4iLCJyZWxhdGlvblZhbHVlIiwiZ2VuZXJhdGVSZWxhdGlvblZhbHVlIiwibm90ZSIsImxsbVZhbHVlIiwiZ2VuZXJhdGVXaXRoTExNIiwibGVuZ3RoIiwic2xpY2UiLCJlcnJvciIsImNvbnNvbGUiLCJ3YXJuIiwiaWQiLCJFcnJvciIsIm1lc3NhZ2UiLCJmaXh0dXJlR2VuZXJhdG9yIiwiZXhlY3V0ZUdlbmVyYXRvciIsImZpeHR1cmVEZWZhdWx0IiwiZ2VuZXJhdGVEZWZhdWx0VmFsdWUiLCJlbWFpbCIsIm5hbWVWYWx1ZSIsInVzZXJuYW1lIiwiZnVsbF9uYW1lIiwibmFtZV9lbiIsImRvbWFpbiIsInNwbGl0Iiwicm9tYW5pemVkIiwicm9tYW5pemVOYW1lIiwicGFzc3dvcmQiLCJiY3J5cHQiLCJoYXNoIiwiZml4dHVyZXMiLCJkYXRhU291cmNlIiwiY2FjaGVLZXkiLCJ3aXRoIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlZmVyZW5jZUNhY2hlIiwiaGFzIiwiZXhwbG9yZVJlc3VsdCIsImV4cGxvcmVXaXRoUmVsYXRpb25zIiwic3RyYXRlZ3kiLCJsaW1pdCIsImNvbmZpZyIsImluY2x1ZGVSZWxhdGlvbnMiLCJtYXhEZXB0aCIsIm1haW4iLCJyZWNvcmRzIiwiaW1wb3J0RXhwbG9yZVJlc3VsdCIsImNhbmRpZGF0ZXMiLCJzZWxlY3RlZCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImF1dG9LZXkiLCJhdXRvRXhwbG9yZVJlc3VsdCIsImF1dG9DYW5kaWRhdGVzIiwibnVsbGFibGUiLCJhbGxGaXh0dXJlUmVjb3JkcyIsImVudGl0eUlkIiwicmVsYXRlZCIsImVudHJpZXMiLCJyZWNvcmRzVG9JbXBvcnQiLCJsb2ciLCJjeWFuIiwicmVjb3JkIiwicmVjb3JkS2V5IiwiaW1wb3J0ZWRSZWNvcmRzIiwicHVzaCIsImFkZCIsImdyYXkiLCJmaXh0dXJlUmVjb3JkcyIsImNyZWF0ZUZpeHR1cmVSZWNvcmQiLCJfZGIiLCJzaW5nbGVSZWNvcmQiLCJtYWluRW50aXR5IiwibWFpblJlY29yZHNUb0ltcG9ydCIsImluc2VydEZpeHR1cmVzIiwiZ3JlZW4iLCJzaXplIiwiZ2VuZXJhdG9yIiwic3RhcnRzV2l0aCIsImlzTmFtZUZpZWxkIiwiZmFrZXJNb2R1bGUiLCJmYWtlcktPIiwiZXhwciIsIm1hdGNoIiwicGF0aCIsImFyZ3NTdHIiLCJwYXJ0cyIsImZuIiwicGFydCIsImFyZ3MiLCJ0cmltIiwicGFyc2VHZW5lcmF0b3JBcmdzIiwieWVsbG93IiwiZmFrZXJKQSIsImxvY2FsZUZha2VyIiwiZGVwYXJ0bWVudHMiLCJwcmVmaXhlcyIsInN1ZmZpeGVzIiwiZGVwdCIsImhlbHBlcnMiLCJhcnJheUVsZW1lbnQiLCJwcmVmaXgiLCJzdWZmaXgiLCJsb2NhbGVNYXBwaW5ncyIsImVuIiwibm9ybWFsaXplZE5hbWUiLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJwYXR0ZXJuIiwiT2JqZWN0IiwiZmllbGRfcGF0dGVybnMiLCJpbmNsdWRlcyIsImV4ZWN1dGVGYWtlckV4cHJlc3Npb24iLCJlbmRzV2l0aCIsImdlbmVyYXRlQXJyYXlWYWx1ZSIsImVudW1WYWx1ZXMiLCJBcnJheSIsImlzQXJyYXkiLCJlbnVtIiwiZW51bUxhYmVscyIsImtleXMiLCJ0eXBlRGVmYXVsdCIsInR5cGVfZGVmYXVsdHMiLCJsb3JlbSIsIndvcmRzIiwibnVtYmVyIiwiaW50IiwibWluIiwibWF4IiwiYmlnSW50IiwiZmxvYXQiLCJkYXRhdHlwZSIsImJvb2xlYW4iLCJkYXRlIiwicGFzdCIsIl9lbnRpdHkiLCJfbG9jYWxlRmFrZXIiLCJjb3VudCIsImZyb20iLCJ1cmwiLCJpbWFnZSIsInN5c3RlbSIsImZpbGVOYW1lIiwibWltZV90eXBlIiwiaW50ZXJuZXQiLCJ3b3JkIiwiZXhwcmVzc2lvbiIsInBhcnNlIiwiZmFrZXJOYW1lIiwic2VsZWN0ZWRGYWtlciIsImZ1bmNNYXRjaCIsImZpeHR1cmVIaW50Iiwicm93Q2FjaGVLZXkiLCJsbG1Qcm9wcyIsImZpbHRlciIsInAiLCJnZW5lcmF0ZVNpbmdsZVdpdGhMTE0iLCJhcGlLZXkiLCJnZXRBcGlLZXkiLCJjcmVhdGVBbnRocm9waWMiLCJnZW5lcmF0ZVRleHQiLCJyb3dSZXNwb25zZSIsIm1vZGVsIiwicHJvbXB0IiwiYnVpbGRSb3dMTE1Qcm9tcHQiLCJ0ZXh0Iiwicm93UmVzdWx0IiwicGFyc2VSb3dMTE1SZXNwb25zZSIsImZpZWxkTmFtZSIsInZhbHVlIiwic2luZ2xlUmVzcG9uc2UiLCJidWlsZExMTVByb21wdCIsInBhcnNlTExNUmVzcG9uc2UiLCJsYW5ndWFnZSIsImZpZWxkRGVzY3JpcHRpb25zIiwibWFwIiwiZGVzYyIsInZhbHVlcyIsImpvaW4iLCJvdGhlclByb3BzIiwib3RoZXJQcm9wc0NvbnRleHQiLCJvdXRwdXRTaGFwZSIsImVudGl0eUNvbnRleHQiLCJqc29uVGV4dCIsInBhcnNlZCIsInJhdyIsInJlc3VsdCIsIlN0cmluZyIsImhpbnQiLCJvdGhlckZpZWxkcyIsIm90aGVyRmllbGRzQ29udGV4dCIsImdldEV4cGVjdGVkRm9ybWF0IiwiZ2V0RXhhbXBsZUZvclR5cGUiLCJwcm9wVHlwZSIsImNsZWFuZWQiLCJiYXNlVHlwZSIsIml0ZW0iLCJnZXREZWZhdWx0VmFsdWVGb3JUeXBlIiwicGFyc2VTY2FsYXJWYWx1ZSIsIm51bSIsInBhcnNlSW50IiwiTnVtYmVyIiwiaXNOYU4iLCJCaWdJbnQiLCJwYXJzZUZsb2F0IiwiZ2V0VGltZSIsInByb3BOYW1lIiwianNvblN0ciIsImNvbnZlcnRKc0xpdGVyYWxUb0pzb24iLCJ0cmltbWVkIiwiaW5wdXQiLCJ3aXRoRG91YmxlUXVvdGVzIiwiXyIsImNvbnRlbnQiLCJTb25hbXUiLCJyZXF1aXJlIiwic2VjcmV0IiwiYW50aHJvcGljX2FwaV9rZXkiLCJwcm9jZXNzIiwiZW52IiwiQU5USFJPUElDX0FQSV9LRVkiLCJiYXNlRm9ybWF0IiwiZ2V0U2NhbGFyRm9ybWF0IiwiYmFzZUV4YW1wbGUiLCJnZXRTY2FsYXJFeGFtcGxlIiwiaXNLb3JlYW4iLCJ0ZXN0Iiwicm9tYW5pemVLb3JlYW5OYW1lIiwiQ0hPU0VPTkciLCJKVU5HU0VPTkciLCJKT05HU0VPTkciLCJyb21hbml6ZSIsImNoYXIiLCJjb2RlIiwiY2hhckNvZGVBdCIsIm9mZnNldCIsImNobyIsImp1bmciLCJqb25nIiwiY2hhcnMiLCJmYW1pbHlOYW1lIiwiZ2l2ZW5OYW1lIiwiZ2V0TExNQ2FjaGVTdGF0cyIsImVuYWJsZWQiLCJjbGVhckxMTUNhY2hlIiwiY2xlYXIiLCJTZXQiLCJnZW5lcmF0ZUJhdGNoIiwic3BlY3MiLCJnZW5lcmF0ZWRGaXh0dXJlcyIsInNwZWMiLCJzcGVjRW50aXR5IiwicGFyZW50SWQiLCJpZFByb3AiLCJmaW5kIiwicGFyZW50T3ZlcnJpZGVzIiwiZml4dHVyZVBhcmVudE92ZXJyaWRlcyIsInBhcmVudEVudGl0eSIsInF1ZXJ5IiwidGFibGUiLCJzZWxlY3QiLCJjb2wiLCJ2YWwiLCJ3aGVyZSIsImxlZnRKb2luIiwid2hlcmVOdWxsIiwicm93cyIsImF2YWlsYWJsZUlkcyIsInIiLCJkYXRhIiwiZXhwbGljaXRJZCIsImkiLCJ1c2VzU2VxdWVuY2UiLCJkYXRhRm9yUmVjb3JkIiwicmVzdWx0cyIsImNvbXBhbmlvblJlc3VsdHMiLCJnZW5lcmF0ZUNvbXBhbmlvbnMiLCJ0b3RhbCIsInBhcmVudFJlc3VsdHMiLCJhbGxSZXN1bHRzIiwicHJvY2Vzc2VkRW50aXRpZXMiLCJjb21wYW5pb25zIiwiZml4dHVyZUNvbXBhbmlvbnMiLCJlbnRpdHlSZXN1bHRzIiwiY29tcGFuaW9uIiwiY29tcGFuaW9uRW50aXR5IiwiZmtQcm9wIiwiY29tcGFuaW9uSWRQcm9wIiwiY29tcGFuaW9uQ291bnQiLCJjb21wYW5pb25GaXh0dXJlUmVjb3JkcyIsInBhcmVudFJlc3VsdCIsInJlc29sdmVkT3ZlcnJpZGVzIiwicmVzb2x2ZVRlbXBsYXRlT3ZlcnJpZGVzIiwicGFyZW50RGF0YSIsInJlc29sdmVkIiwia2V5IiwiaW1wb3J0RnJvbVNvdXJjZSIsImJsdWUiLCJyZWxhdGVkRW50aXR5TmFtZSIsInJlbGF0ZWRSZWNvcmRzIiwicmVsYXRlZEVudGl0eSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBVyxRQUFRO0FBSzFCLFNBQVNDLDBCQUEwQixFQUFFQyxzQkFBc0IsRUFBRUMsY0FBYyxRQUFRLG9CQUFpQjtBQUNwRyxTQUFTQyxNQUFNLFFBQVEseUJBQXNCO0FBQzdDLFNBQ0VDLFlBQVksUUFHUCxxQkFBa0I7QUFDekIsU0FBNkJDLGFBQWEsUUFBUSxzQkFBbUI7QUFDckUsU0FBU0MsY0FBYyxRQUFRLHVCQUFvQjtBQXNCbkQsT0FBTyxNQUFNQzs7OztJQUNIQyxhQUEyQjtJQUMzQkMsT0FBZTtJQUNmQyxTQUF3QjtJQUN4QkMsV0FBaUMsSUFBSUMsTUFBTTtJQUMzQ0MsY0FBbUMsSUFBSUQsTUFBTTtJQUM3Q0UsUUFBaUM7SUFFekMsWUFDRSxBQUFRQyxRQUFjLEVBQ3RCLGlFQUFpRTtJQUNqRSxnQ0FBZ0M7SUFDaENDLFNBQWUsRUFDZixBQUFRQyxZQUFzRCxFQUM5RCxBQUFRQyxhQUFtQyxFQUMzQ0osT0FBaUMsQ0FD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
1372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVByb3AsIEZpeHR1cmVJbXBvcnRSZXN1bHQsIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLCBpc09uZVRvT25lUmVsYXRpb25Qcm9wLCBpc1JlbGF0aW9uUHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7XG4gIERhdGFFeHBsb3JlcixcbiAgdHlwZSBFeHBsb3JlV2l0aFJlbGF0aW9uc09wdGlvbnMsXG4gIHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQsXG59IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRmFrZXJNYXBwaW5ncywgZmFrZXJNYXBwaW5ncyB9IGZyb20gXCIuL2Zha2VyLW1hcHBpbmdzXCI7XG5pbXBvcnQgeyBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuL2ZpeHR1cmUtbWFuYWdlclwiO1xuXG5leHBvcnQgdHlwZSBMb2NhbGUgPSBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zID0ge1xuICBsb2NhbGU/OiBMb2NhbGU7XG4gIHVzZUxMTT86IGJvb2xlYW47XG4gIGVuYWJsZUxMTUNhY2hlPzogYm9vbGVhbjtcbiAgbGxtTW9kZWw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JDb250ZXh0ID0ge1xuICAvKiog7IOd7ISxIOykkeyduCBmaXh0dXJl65OkICjrqZTrqqjrpqwg7IOBKSAqL1xuICBmaXh0dXJlczogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4gIC8qKiDssLjsobAg642w7J207YSwIOy6kOyLnCAoRGF0YUV4cGxvcmVyIOqysOqzvCkgKi9cbiAgcmVmZXJlbmNlQ2FjaGU6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+O1xuXG4gIC8qKiDsnbTrr7ggaW1wb3J065CcIOugiOy9lOuTnOulvCDstpTsoIHtlZjsl6wg7KSR67O1IGltcG9ydOulvCDrsKnsp4Dtlanri4jri6QgKi9cbiAgaW1wb3J0ZWRSZWNvcmRzOiBTZXQ8c3RyaW5nPjsgLy8gXCJVc2VyIzEyM1wiXG59O1xuXG5leHBvcnQgY2xhc3MgRml4dHVyZUdlbmVyYXRvciB7XG4gIHByaXZhdGUgZGF0YUV4cGxvcmVyOiBEYXRhRXhwbG9yZXI7XG4gIHByaXZhdGUgbG9jYWxlOiBMb2NhbGU7XG4gIHByaXZhdGUgbWFwcGluZ3M6IEZha2VyTWFwcGluZ3M7XG4gIHByaXZhdGUgbGxtQ2FjaGU6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGVudGl0eUNhY2hlOiBNYXA8c3RyaW5nLCBFbnRpdHk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIG9wdGlvbnM6IEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc291cmNlRGI6IEtuZXgsXG4gICAgLy8gRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXPqsIAgZGJOYW1lIOusuOyekOyXtOydhCDrsJvquLAg65WM66y47JeQIOyngeygkSDsgqzsmqntlZjsp4Ag7JWK7Iq164uI64ukXG4gICAgLy8g66+4656YIO2ZleyepeyEseydhCDsnITtlbQgQVBJIOyLnOq3uOuLiOyymOyXkOuKlCDtj6ztlajsi5zsvLDsirXri4jri6RcbiAgICBfdGFyZ2V0RGI6IEtuZXgsXG4gICAgcHJpdmF0ZSB0YXJnZXREYk5hbWU6IFwiZml4dHVyZVwiIHwgXCJ0ZXN0XCIgfCBcInByb2R1Y3Rpb25fbWFzdGVyXCIsXG4gICAgcHJpdmF0ZSBlbnRpdHlNYW5hZ2VyOiB0eXBlb2YgRW50aXR5TWFuYWdlcixcbiAgICBvcHRpb25zPzogRml4dHVyZUdlbmVyYXRvck9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMuZGF0YUV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3Jlcihzb3VyY2VEYiwgZW50aXR5TWFuYWdlcik7XG4gICAgdGhpcy5sb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIHRoaXMubWFwcGluZ3MgPSBmYWtlck1hcHBpbmdzO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZTogb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIixcbiAgICAgIHVzZUxMTTogb3B0aW9ucz8udXNlTExNIHx8IGZhbHNlLFxuICAgICAgZW5hYmxlTExNQ2FjaGU6IG9wdGlvbnM/LmVuYWJsZUxMTUNhY2hlICE9PSBmYWxzZSxcbiAgICAgIGxsbU1vZGVsOiBvcHRpb25zPy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC02XCIsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlIOyDneyEsSAo64uo7J28KVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwgZml4dHVyZSDrjbDsnbTthLAgKOuplOuqqOumrCDsg4EpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIC8vIEVudGl0eSDsupDsi7E6IO2FjOyKpO2KuOyXkOyEnCBlbnRpdHkgY29uZSDsiJjsoJXsnbQg67CY7JiB65CY64+E66GdIOuztOyepVxuICAgIGxldCBlbnRpdHkgPSB0aGlzLmVudGl0eUNhY2hlLmdldChlbnRpdHlOYW1lKTtcbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICAgIHRoaXMuZW50aXR5Q2FjaGUuc2V0KGVudGl0eU5hbWUsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcElkID0gYCR7ZW50aXR5TmFtZX0jdGVtcCMke0RhdGUubm93KCl9YDsgLy8g7J6E7IucIElEXG5cbiAgICAvLyBMTE0gcm93IOuLqOychCDsg53shLHsnYQg7JyE7ZWcIOqzoOycoCDtgqQgKOqwmeydgCByb3fsnZgg7ZWE65Oc65Ok7J20IOuPmeydvO2VnCByb3dLZXnrpbwg6rO17JygKVxuICAgIGNvbnN0IHJvd0tleSA9IHRoaXMub3B0aW9ucy51c2VMTE0gPyBgJHtlbnRpdHlOYW1lfSNyb3cjJHtEYXRlLm5vdygpfWAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyDqsIEgcHJvcOuzhCDqsJIg7IOd7ISxXG4gICAgY29uc3QgZml4dHVyZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcOydgCDsiqTtgrVcbiAgICAgIGlmIChcInZpcnR1YWxcIiBpbiBwcm9wICYmIHByb3AudmlydHVhbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWQgcHJvcCDsspjrpqxcbiAgICAgIGlmIChwcm9wLm5hbWUgPT09IFwiaWRcIikge1xuICAgICAgICBpZiAoXCJjb25lXCIgaW4gcHJvcCAmJiBwcm9wLmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiKSB7XG4gICAgICAgICAgLy8gREIgc2VxdWVuY2XqsIAg7J6Q64+ZIO2VoOuLue2VmOuvgOuhnCDsiqTtgrUgKFVzZXIg65OxKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBEQiBERUZBVUxUIOyXhuuKlCBzdHJpbmcgUEs6IGFscGhhbnVtZXJpYyAzMuyekCDsg53shLEgKGJldHRlci1hdXRoIOyKpO2DgOydvClcbiAgICAgICAgICBjb25zdCB7IGZha2VyOiBfZmFrZXIgfSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBfZmFrZXIuc3RyaW5nLmFscGhhbnVtZXJpYygzMik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgICBjb25zdCB7IGZha2VyOiBfZmFrZXIgfSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBfZmFrZXIuc3RyaW5nLnV1aWQoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEs6IGdlbmVyYXRlQmF0Y2jsl5DshJwgdGVtcElk66W8IOuEo+ycvOuvgOuhnCDsl6zquLDshKAg7Iqk7YK1XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZeqwgCDsnojsnLzrqbQg7IKs7JqpXG4gICAgICBpZiAocHJvcC5uYW1lIGluIG92ZXJyaWRlcykge1xuICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBvdmVycmlkZXNbcHJvcC5uYW1lXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbmXsl5DshJwg7IOd7ISxIOyghOuetSDtmZXsnbhcbiAgICAgIGNvbnN0IGNvbmUgPSBwcm9wLmNvbmU7XG5cbiAgICAgIC8vIDEuIFJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgLy8gQmVsb25nc1RvT25lIC8gT25lVG9PbmUoaGFzSm9pbkNvbHVtbinsnYAgRksg7Lus65+866qFKHtwcm9wLm5hbWV9X2lkKeycvOuhnOuPhCBvdmVycmlkZeulvCDrsJvripTri6RcbiAgICAgICAgY29uc3QgZmtDb2xOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBma0NvbE5hbWUgaW4gb3ZlcnJpZGVzICYmXG4gICAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpXG4gICAgICAgICkge1xuICAgICAgICAgIGZpeHR1cmVbZmtDb2xOYW1lXSA9IG92ZXJyaWRlc1tma0NvbE5hbWVdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb25WYWx1ZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVSZWxhdGlvblZhbHVlKGVudGl0eSwgcHJvcCwgY29udGV4dCk7XG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSwgT25lVG9PbmUoaGFzSm9pbkNvbHVtbinsnZgg6rK97JqwIGZvcmVpZ24ga2V5IOy7rOufvOuqheycvOuhnCDsoIDsnqVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICBmaXh0dXJlW2Ake3Byb3AubmFtZX1faWRgXSA9IHJlbGF0aW9uVmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gcmVsYXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gY29uZS5ub3RlICsgTExNIOyCrOyaqSAodXNlTExN7J2066m0IGZpeHR1cmVHZW5lcmF0b3Lrs7Tri6Qg7Jqw7ISgKVxuICAgICAgaWYgKGNvbmU/Lm5vdGUgJiYgdGhpcy5vcHRpb25zLnVzZUxMTSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGxsbVZhbHVlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVdpdGhMTE0oY29uZS5ub3RlLCBwcm9wLCBlbnRpdHksIHJvd0tleSk7XG4gICAgICAgICAgLy8gc3RyaW5nIO2DgOyeheydtOqzoCBsZW5ndGgg7KCc7JW97J20IOyeiOycvOuptCDstIjqs7wg7IucIHRydW5jYXRpb25cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgbGxtVmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIFwibGVuZ3RoXCIgaW4gcHJvcCAmJlxuICAgICAgICAgICAgdHlwZW9mIHByb3AubGVuZ3RoID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgICBsbG1WYWx1ZS5sZW5ndGggPiBwcm9wLmxlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gbGxtVmFsdWUuc2xpY2UoMCwgcHJvcC5sZW5ndGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBsbG1WYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtGaXh0dXJlR2VuZXJhdG9yXSBMTE0gZ2VuZXJhdGlvbiBmYWlsZWQgZm9yICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX0sIGZhbGxpbmcgYmFjayB0byBmaXh0dXJlR2VuZXJhdG9yIG9yIGRlZmF1bHRgLFxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIGZhbGxiYWNrOiBmaXh0dXJlR2VuZXJhdG9yIOKGkiBmaXh0dXJlRGVmYXVsdCDihpIg6riw67O46rCS7Jy866GcIOqzhOyGjVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIGZpeHR1cmVHZW5lcmF0b3Ig7IKs7JqpXG4gICAgICBpZiAoY29uZT8uZml4dHVyZUdlbmVyYXRvcikge1xuICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZW5lcmF0b3IoXG4gICAgICAgICAgY29uZS5maXh0dXJlR2VuZXJhdG9yIGFzIHN0cmluZyxcbiAgICAgICAgICBwcm9wLFxuICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIGZpeHR1cmVEZWZhdWx0IOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gY29uZS5maXh0dXJlRGVmYXVsdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIO2DgOyeheuzhCDquLDrs7gg7IOd7ISxXG4gICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRGVmYXVsdFZhbHVlKHByb3AsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgLy8gNi4gZW1haWwg7ZWE65Oc6rCAIOyeiOqzoCBuYW1lIO2VhOuTnOqwgCDsnojsnLzrqbQsIGVtYWls7J2YIOuhnOy7rCDtjIztirjrpbwgbmFtZSDquLDrsJjsnLzroZwg67O07KCVXG4gICAgaWYgKFwiZW1haWxcIiBpbiBmaXh0dXJlICYmIHR5cGVvZiBmaXh0dXJlLmVtYWlsID09PSBcInN0cmluZ1wiICYmICEoXCJlbWFpbFwiIGluIG92ZXJyaWRlcykpIHtcbiAgICAgIGNvbnN0IG5hbWVWYWx1ZSA9IGZpeHR1cmUubmFtZSB8fCBmaXh0dXJlLnVzZXJuYW1lIHx8IGZpeHR1cmUuZnVsbF9uYW1lIHx8IGZpeHR1cmUubmFtZV9lbjtcbiAgICAgIGlmIChuYW1lVmFsdWUgJiYgdHlwZW9mIG5hbWVWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBkb21haW4gPSBmaXh0dXJlLmVtYWlsLnNwbGl0KFwiQFwiKVsxXSB8fCBcImV4YW1wbGUuY29tXCI7XG4gICAgICAgIGNvbnN0IHJvbWFuaXplZCA9IGF3YWl0IHRoaXMucm9tYW5pemVOYW1lKG5hbWVWYWx1ZSk7XG4gICAgICAgIGZpeHR1cmUuZW1haWwgPSBgJHtyb21hbml6ZWR9QCR7ZG9tYWlufWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNy4gcGFzc3dvcmQg7ZWE65OcIOyVlO2YuO2ZlFxuICAgIGlmIChcInBhc3N3b3JkXCIgaW4gZml4dHVyZSAmJiBmaXh0dXJlLnBhc3N3b3JkICYmIHR5cGVvZiBmaXh0dXJlLnBhc3N3b3JkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBiY3J5cHQgPSBhd2FpdCBpbXBvcnQoXCJiY3J5cHRcIik7XG4gICAgICBmaXh0dXJlLnBhc3N3b3JkID0gYXdhaXQgYmNyeXB0Lmhhc2goZml4dHVyZS5wYXNzd29yZCwgMTApO1xuICAgIH1cblxuICAgIGNvbnRleHQuZml4dHVyZXMuc2V0KHRlbXBJZCwgZml4dHVyZSk7XG4gICAgcmV0dXJuIGZpeHR1cmU7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb24g6rCSIOyDneyEsSArIOyekOuPmSBJbXBvcnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVSZWxhdGlvblZhbHVlKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgY29udGV4dDogR2VuZXJhdG9yQ29udGV4dCxcbiAgKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9IGlzIG5vdCBhIHJlbGF0aW9uIHByb3BgKTtcbiAgICB9XG5cbiAgICAvLyBCZWxvbmdzVG9PbmUsIE9uZVRvT25lKGhhc0pvaW5Db2x1bW4p66eMIOyymOumrFxuICAgIGlmIChcbiAgICAgICFpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgIShpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmUgPSBwcm9wLmNvbmU7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGNvbmU/LmRhdGFTb3VyY2U7XG5cbiAgICAvLyBEYXRhRXhwbG9yZXLroZwg7LC47KGwIOuNsOydtO2EsCDsobDtmowgKHNvdXJjZURiKVxuICAgIC8vIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCA6riwIOychO2VtCBleHBsb3JlV2l0aFJlbGF0aW9ucyDsgqzsmqlcbiAgICBpZiAoZGF0YVNvdXJjZSkge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtwcm9wLndpdGh9OiR7SlNPTi5zdHJpbmdpZnkoZGF0YVNvdXJjZSl9YDtcblxuICAgICAgaWYgKCFjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgICAgY29uc3QgZXhwbG9yZVJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YUV4cGxvcmVyLmV4cGxvcmVXaXRoUmVsYXRpb25zKHByb3Aud2l0aCwge1xuICAgICAgICAgIHN0cmF0ZWd5OiBkYXRhU291cmNlLnN0cmF0ZWd5LFxuICAgICAgICAgIGxpbWl0OlxuICAgICAgICAgICAgKChkYXRhU291cmNlLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmxpbWl0IGFzXG4gICAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICAgIHwgdW5kZWZpbmVkKSB8fCAxMCxcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgICAgIC4uLihkYXRhU291cmNlLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChjYWNoZUtleSwgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAgIC8vIOyhsO2ajO2VnCDrjbDsnbTthLDsmYAg6rSA6rOE65CcIOuqqOuToCDsl5Tti7Dti7DrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChleHBsb3JlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzICYmIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyDrnpzrjaTtlZjqsowg7ZWY64KYIOyEoO2DnVxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FuZGlkYXRlcy5sZW5ndGgpXTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmlkIGFzIG51bWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRhU291cmNl6rCAIOyXhuydhCDrlYwg7J6Q64+Z7Jy866GcIGZpeHR1cmUgRELsl5DshJwg7KGw7ZqMIOyLnOuPhFxuICAgIC8vIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCA6riwIOychO2VtCBleHBsb3JlV2l0aFJlbGF0aW9ucyDsgqzsmqlcbiAgICBjb25zdCBhdXRvS2V5ID0gYCR7cHJvcC53aXRofTphdXRvYDtcbiAgICBpZiAoIWNvbnRleHQucmVmZXJlbmNlQ2FjaGUuaGFzKGF1dG9LZXkpKSB7XG4gICAgICAvLyBmaXh0dXJlIERCKHNvdXJjZURiKeyXkOyEnCDsnpDrj5kg7KGw7ZqMICjqtIDqs4Qg7Y+s7ZWoKVxuICAgICAgY29uc3QgYXV0b0V4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhwcm9wLndpdGgsIHtcbiAgICAgICAgc3RyYXRlZ3k6IFwicmFuZG9tXCIsXG4gICAgICAgIGxpbWl0OiAxMCxcbiAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgbWF4RGVwdGg6IDMsXG4gICAgICB9KTtcbiAgICAgIGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuc2V0KGF1dG9LZXksIGF1dG9FeHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcyk7XG5cbiAgICAgIC8vIOyhsO2ajO2VnCDrjbDsnbTthLDsmYAg6rSA6rOE65CcIOuqqOuToCDsl5Tti7Dti7DrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAgICBpZiAoYXV0b0V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbXBvcnRFeHBsb3JlUmVzdWx0KGF1dG9FeHBsb3JlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhdXRvQ2FuZGlkYXRlcyA9IGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuZ2V0KGF1dG9LZXkpO1xuICAgIGlmIChhdXRvQ2FuZGlkYXRlcyAmJiBhdXRvQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyDrnpzrjaTtlZjqsowg7ZWY64KYIOyEoO2DnVxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBhdXRvQ2FuZGlkYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhdXRvQ2FuZGlkYXRlcy5sZW5ndGgpXTtcbiAgICAgIHJldHVybiBzZWxlY3RlZC5pZCBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgLy8g7LC47KGwIOuNsOydtO2EsOqwgCDsl4bsnLzrqbQgbnVsbCDrsJjtmZggKG51bGxhYmxl7J24IOqyveyasClcbiAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gbnVsbGFibGXsnbQg7JWE64uI6rOgIOuNsOydtO2EsOuPhCDsl4bsnLzrqbQg7JeQ65+sXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZpeHR1cmVHZW5lcmF0b3I6ICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX3sl5Ag7ZWE7JqU7ZWcICR7cHJvcC53aXRofSDrjbDsnbTthLDqsIAg7JeG7Iq164uI64ukLiBgICtcbiAgICAgICAgYOuovOyggCAke3Byb3Aud2l0aH3rpbwg7IOd7ISx7ZWY6rGw64KYIGNvbmUuZGF0YVNvdXJjZeulvCDshKTsoJXtlZjshLjsmpQuYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxvcmVXaXRoUmVsYXRpb25zIOqysOqzvOulvCB0YXJnZXREYuyXkCBpbXBvcnRcbiAgICpcbiAgICog6rSA6rOEIOyytOyduOydhCDrlLDrnbzqsIQg6rKw6rO8KG1haW4gKyByZWxhdGVkKeulvCDrqqjrkZAgaW1wb3J07ZWp64uI64ukLlxuICAgKiDsnZjsobTshLEg7Iic7ISc64qUIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVz6rCAIOyekOuPmeycvOuhnCDsspjrpqztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGltcG9ydEV4cGxvcmVSZXN1bHQoXG4gICAgZXhwbG9yZVJlc3VsdDogRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQsXG4gICAgY29udGV4dDogR2VuZXJhdG9yQ29udGV4dCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxsRml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuXG4gICAgLy8gMS4gUmVsYXRlZCBlbnRpdGllcyBpbXBvcnQgKENvbXBhbnksIERlcGFydG1lbnQg65OxKVxuICAgIGZvciAoY29uc3QgW2VudGl0eUlkLCByZWNvcmRzXSBvZiBleHBsb3JlUmVzdWx0LnJlbGF0ZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHJlY29yZHNUb0ltcG9ydDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuY3lhbihgSW1wb3J0aW5nIHJlbGF0ZWQgZW50aXR5OiAke2VudGl0eUlkfSAoJHtyZWNvcmRzLmxlbmd0aH0gcmVjb3JkcylgKSxcbiAgICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRLZXkgPSBgJHtlbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgICAgaWYgKCFjb250ZXh0LmltcG9ydGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICAgIHJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgY29udGV4dC5pbXBvcnRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZHNUb0ltcG9ydC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHNUb0ltcG9ydCkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgYCAgLSBQcm9jZXNzaW5nICR7ZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY29yZCkuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZml4dHVyZVJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgICAgIHsgX2RiOiB0aGlzLnNvdXJjZURiLCBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFsbEZpeHR1cmVSZWNvcmRzLnB1c2goLi4uZml4dHVyZVJlY29yZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTWFpbiBlbnRpdHkgaW1wb3J0IChFbXBsb3llZSDrk7EpXG4gICAgY29uc3QgbWFpbkVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkKTtcbiAgICBjb25zdCBtYWluUmVjb3Jkc1RvSW1wb3J0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBJbXBvcnRpbmcgbWFpbiBlbnRpdHk6ICR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSAoJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IHJlY29yZHMpYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcykge1xuICAgICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSMke3JlY29yZC5pZH1gO1xuICAgICAgaWYgKCFjb250ZXh0LmltcG9ydGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICBtYWluUmVjb3Jkc1RvSW1wb3J0LnB1c2gocmVjb3JkKTtcbiAgICAgICAgY29udGV4dC5pbXBvcnRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1haW5SZWNvcmRzVG9JbXBvcnQubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgbWFpblJlY29yZHNUb0ltcG9ydCkge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgIGAgIC0gUHJvY2Vzc2luZyAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gcmVjb3JkOmAsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY29yZCkuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZml4dHVyZVJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgIG1haW5FbnRpdHksXG4gICAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICAgIGFsbEZpeHR1cmVSZWNvcmRzLnB1c2goLi4uZml4dHVyZVJlY29yZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIOuqqOuToCBmaXh0dXJl66W8IO2VnCDrsojsl5Ag7IK97J6FICjsnZjsobTshLEg7Iic7IScIOyekOuPmSDsspjrpqwpXG4gICAgaWYgKGFsbEZpeHR1cmVSZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKHRoaXMudGFyZ2V0RGJOYW1lLCBhbGxGaXh0dXJlUmVjb3Jkcyk7XG5cbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBBdXRvLWltcG9ydGVkICR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSB3aXRoIHJlbGF0aW9uczogYCArXG4gICAgICAgICAgICAgIGAke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gbWFpbiArICR7ZXhwbG9yZVJlc3VsdC5yZWxhdGVkLnNpemV9IHJlbGF0ZWQgZW50aXRpZXNgLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZpeHR1cmVHZW5lcmF0b3Ig7Iuk7ZaJIChGYWtlci5qc+unjCDsp4Dsm5ApXG4gICAqXG4gICAqIGZha2VyLiog7ZiV7Iud7J2YIO2RnO2YhOyLneydhCDslYjsoITtlZjqsowg7YyM7Iux7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAgICog7JiIOiBcImZha2VyLmludGVybmV0LmVtYWlsKClcIiDihpIgZmFrZXIuaW50ZXJuZXQuZW1haWwoKVxuICAgKiDsmIg6IFwiZmFrZXIubG9yZW0ud29yZHMoMylcIiDihpIgZmFrZXIubG9yZW0ud29yZHMoMylcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUdlbmVyYXRvcihcbiAgICBnZW5lcmF0b3I6IHN0cmluZyxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGVudGl0eTogRW50aXR5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBGYWtlci5qcyDtkZztmITsi53rp4wg7KeA7JuQXG4gICAgaWYgKGdlbmVyYXRvci5zdGFydHNXaXRoKFwiZmFrZXIuXCIpKSB7XG4gICAgICAvLyB1c2VybmFtZeydtOuCmCBuYW1lIO2VhOuTnOuKlCDtlZzqta3slrQgZmFrZXIg7IKs7JqpXG4gICAgICBjb25zdCBpc05hbWVGaWVsZCA9IHByb3AubmFtZSA9PT0gXCJ1c2VybmFtZVwiIHx8IHByb3AubmFtZSA9PT0gXCJuYW1lXCI7XG4gICAgICBjb25zdCBmYWtlck1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgIGNvbnN0IGZha2VyID0gaXNOYW1lRmllbGQgPyBmYWtlck1vZHVsZS5mYWtlcktPIDogZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgICBjb25zdCBleHByID0gZ2VuZXJhdG9yLnNsaWNlKDYpOyAvLyBcImZha2VyLlwiIOygnOqxsFxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyDtlajsiJgg6rK966Gc7JmAIOyduOyekCDtjIzsi7FcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBleHByLm1hdGNoKC9eKFtcXHcuXSspKD86XFwoKC4qPylcXCkpPyQvKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBGaXh0dXJlR2VuZXJhdG9yOiBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtnZW5lcmF0b3J9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgWywgcGF0aCwgYXJnc1N0cl0gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgICAgICAvLyBmYWtlciDqsJ3ssrTsl5DshJwg7ZWo7IiYIOywvuq4sFxuICAgICAgICBsZXQgZm46IHVua25vd24gPSBmYWtlcjtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gXCJvYmplY3RcIiAmJiBmbiAhPT0gbnVsbCAmJiBwYXJ0IGluIGZuKSB7XG4gICAgICAgICAgICBmbiA9IChmbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcGFydF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRml4dHVyZUdlbmVyYXRvcjogSW52YWxpZCBmYWtlciBwYXRoIGZvciAke3Byb3AubmFtZX06IGZha2VyLiR7cGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtlajsiJjqsIAg7JWE64uI66m0IOyXkOufrFxuICAgICAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IGZha2VyLiR7cGF0aH0gaXMgbm90IGEgZnVuY3Rpb24gKGZvciAke3Byb3AubmFtZX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXJnczogdW5rbm93bltdID0gW107XG4gICAgICAgIGlmIChhcmdzU3RyPy50cmltKCkpIHtcbiAgICAgICAgICBhcmdzID0gdGhpcy5wYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0ciwgcHJvcC5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgZ2VuZXJhdG9yIFwiJHtnZW5lcmF0b3J9XCIgZm9yICR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQ6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZha2VyIOydtOyZuOydmCDtkZztmITsi53snYAg7KeA7JuQ7ZWY7KeAIOyViuydjFxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtnZW5lcmF0b3J9LiBPbmx5IGZha2VyLiogZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZC4gVXNpbmcgZGVmYXVsdCB2YWx1ZS5gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOuTnOydmCDtg4DsnoXqs7wg7J2066aE7J2EIOu2hOyEne2VmOyXrCDsoIHsoIjtlZwg6riw67O46rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICog7Jqw7ISg7Iic7JyEOlxuICAgKiAxLiDtlYTrk5zrqoUg7Yyo7YS0IOunpOy5rSAoc2FsYXJ5LCBidWRnZXQg65OxIOydmOuvuOyeiOuKlCDrjbDsnbTthLApXG4gICAqIDIuIO2KueyImCDsvIDsnbTsiqQgKERlcGFydG1lbnQgbmFtZSDrk7Eg64+E66mU7J24IOyngOyLnSlcbiAgICogMy4g67Cw7Je0IO2DgOyehSAoSlNPTiDrsLDsl7QpXG4gICAqIDQuIEVudW0g7YOA7J6FXG4gICAqIDUuIO2DgOyeheuzhCDquLDrs7jqsJJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcDogRW50aXR5UHJvcCwgZW50aXR5PzogRW50aXR5KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgY29uc3QgZmFrZXIgPSBmYWtlck1vZHVsZS5mYWtlcjtcbiAgICBjb25zdCBmYWtlcktPID0gZmFrZXJNb2R1bGUuZmFrZXJLTztcbiAgICBjb25zdCBmYWtlckpBID0gZmFrZXJNb2R1bGUuZmFrZXJKQTtcblxuICAgIGNvbnN0IGxvY2FsZUZha2VyID0gdGhpcy5sb2NhbGUgPT09IFwia29cIiA/IGZha2VyS08gOiB0aGlzLmxvY2FsZSA9PT0gXCJqYVwiID8gZmFrZXJKQSA6IGZha2VyO1xuXG4gICAgLyoqXG4gICAgICogMS4gRW50aXR5LXNwZWNpZmljIO2KueyImCDsvIDsnbTsiqTrpbwg66i87KCAIOyymOumrO2VqeuLiOuLpC5cbiAgICAgKiBmaWVsZF9wYXR0ZXJuc+uztOuLpCDsmrDshKDtlZjsl6wsIO2KueyglSDsl5Tti7Dti7DsnZgg7ZWE65Oc7JeQIOuPhOuplOyduOyXkCDrp57ripQg6rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICAgKiDsmIg6IERlcGFydG1lbnQubmFtZSDihpIg7ZWc6rWt7Ja0IOu2gOyEnOuqhSAo7IKs656MIOydtOumhOydtCDslYTri5gpXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBEZXBhcnRtZW50IG5hbWXsnYAg7ZWc6rWt7Ja0IOu2gOyEnOuqhSDrqqnroZ3sl5DshJwg7ISg7YOd7ZWp64uI64ukLlxuICAgICAqIOqzoOycoOyEseydhCDsnITtlbQgNzAlIO2ZleuloOuhnCBwcmVmaXgvc3VmZml466W8IOy2lOqwgO2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAoZW50aXR5Py5pZCA9PT0gXCJEZXBhcnRtZW50XCIgJiYgcHJvcC5uYW1lID09PSBcIm5hbWVcIikge1xuICAgICAgY29uc3QgZGVwYXJ0bWVudHMgPSBbXG4gICAgICAgIFwi6rCc67Cc7YyAXCIsXG4gICAgICAgIFwi6riw7ZqN7YyAXCIsXG4gICAgICAgIFwi66eI7LyA7YyF7YyAXCIsXG4gICAgICAgIFwi7JiB7JeF7YyAXCIsXG4gICAgICAgIFwi7J247IKs7YyAXCIsXG4gICAgICAgIFwi7LSd66y07YyAXCIsXG4gICAgICAgIFwi7J6s66y07YyAXCIsXG4gICAgICAgIFwi7ZqM6rOE7YyAXCIsXG4gICAgICAgIFwi67KV66y07YyAXCIsXG4gICAgICAgIFwi65SU7J6Q7J247YyAXCIsXG4gICAgICAgIFwiSVTtjIBcIixcbiAgICAgICAgXCLqs6DqsJ3sp4Dsm5DtjIBcIixcbiAgICAgICAgXCLtkojsp4jqtIDrpqztjIBcIixcbiAgICAgICAgXCLsl7DqtazqsJzrsJztjIBcIixcbiAgICAgICAgXCLsg53sgrDtjIBcIixcbiAgICAgICAgXCLqtazrp6TtjIBcIixcbiAgICAgICAgXCLrrLzrpZjtjIBcIixcbiAgICAgIF07XG4gICAgICBjb25zdCBwcmVmaXhlcyA9IFtcIuyLoOq3nFwiLCBcIu2Gte2VqVwiLCBcIuyghOuetVwiLCBcIuq4gOuhnOuyjFwiLCBcIuuUlOyngO2EuFwiLCBcIu2VteyLrFwiXTtcbiAgICAgIGNvbnN0IHN1ZmZpeGVzID0gW1wiMe2MgFwiLCBcIjLtjIBcIiwgXCIz7YyAXCIsIFwiQe2MgFwiLCBcIkLtjIBcIiwgXCLrs7jrtoBcIiwgXCLshLzthLBcIiwgXCLqt7jro7lcIl07XG5cbiAgICAgIGNvbnN0IGRlcHQgPSBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChkZXBhcnRtZW50cyk7XG5cbiAgICAgIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICBpZiAocmFuZG9tID4gMC43KSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KHByZWZpeGVzKTtcbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0gJHtkZXB0fWA7XG4gICAgICB9XG4gICAgICBpZiAocmFuZG9tID4gMC40KSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KHN1ZmZpeGVzKTtcbiAgICAgICAgcmV0dXJuIGAke2RlcHR9ICR7c3VmZml4fWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVwdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAyLiDtlYTrk5zrqoXsl5DshJwg7J2Y66+466W8IOy2lOuhoO2VmOyXrCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICAgKiDsmIg6IHNhbGFyeSDihpIgMzBNfjE1ME0gKO2VnOq1rSDsl7DrtIkg67KU7JyEKVxuICAgICAqICAgICBidWRnZXQg4oaSIDEwTX41MDBNICjtlITroZzsoJ3tirgg7JiI7IKwIOuylOychClcbiAgICAgKi9cbiAgICBjb25zdCBsb2NhbGVNYXBwaW5ncyA9IHRoaXMubWFwcGluZ3NbdGhpcy5sb2NhbGVdIHx8IHRoaXMubWFwcGluZ3MuZW47XG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBwcm9wLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiXCIpO1xuXG4gICAgZm9yIChjb25zdCBbcGF0dGVybiwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhsb2NhbGVNYXBwaW5ncy5maWVsZF9wYXR0ZXJucykpIHtcbiAgICAgIGlmIChub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhwYXR0ZXJuLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUZha2VyRXhwcmVzc2lvbihjb25maWcuZmFrZXIsIHByb3ApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgZmllbGQgcGF0dGVybiBcIiR7cGF0dGVybn1cIiBmb3IgJHtwcm9wLm5hbWV9LCBmYWxsaW5nIGJhY2s6YCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMy4gSlNPTiDtg4DsnoXsnbTrqbTshJwg67Cw7Je07J24IOqyveyasCAoU29uYW11RmlsZVtdLCBzdHJpbmdbXSDrk7EpXG4gICAgICog7ZWE65Oc66qFIO2MqO2EtOydhCDrs7Tqs6Ag7KCB7KCI7ZWcIOuwsOyXtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgICAqL1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwianNvblwiICYmIFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQpIHtcbiAgICAgIGlmIChwcm9wLmlkLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVBcnJheVZhbHVlKHByb3AsIGVudGl0eSwgZmFrZXIsIGxvY2FsZUZha2VyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogNC4gRW51bSDtg4DsnoXsnYAg7KCV7J2Y65CcIOqwkiDspJEg7ZWY64KY66W8IOuenOuNpCDshKDtg53tlanri4jri6QgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIikge1xuICAgICAgbGV0IGVudW1WYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGlmIChcImVudW1cIiBpbiBwcm9wICYmIEFycmF5LmlzQXJyYXkocHJvcC5lbnVtKSAmJiBwcm9wLmVudW0ubGVuZ3RoID4gMCkge1xuICAgICAgICBlbnVtVmFsdWVzID0gcHJvcC5lbnVtO1xuICAgICAgfSBlbHNlIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkICYmIGVudGl0eT8uZW51bUxhYmVscz8uW3Byb3AuaWRdKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVsc1twcm9wLmlkXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnVtVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KGVudW1WYWx1ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3AubnVsbGFibGUgPyBudWxsIDogXCJVTktOT1dOXCI7XG4gICAgfVxuXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtW11cIikge1xuICAgICAgbGV0IGVudW1WYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGlmIChcImVudW1cIiBpbiBwcm9wICYmIEFycmF5LmlzQXJyYXkocHJvcC5lbnVtKSAmJiBwcm9wLmVudW0ubGVuZ3RoID4gMCkge1xuICAgICAgICBlbnVtVmFsdWVzID0gcHJvcC5lbnVtO1xuICAgICAgfSBlbHNlIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkICYmIGVudGl0eT8uZW51bUxhYmVscz8uW3Byb3AuaWRdKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVsc1twcm9wLmlkXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnVtVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFtmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChlbnVtVmFsdWVzKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogNS4gVmVjdG9yIO2DgOyeheydgCDtmITsnqwg7KeA7JuQ7ZWY7KeAIOyViuycvOuvgOuhnCBudWxs7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKiDtlqXtm4QgQUkgZW1iZWRkaW5nIOyDneyEsSDquLDriqUg7LaU6rCAIOyLnCDqtaztmIQg7JiI7KCV7J6F64uI64ukLlxuICAgICAqL1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwidmVjdG9yXCIgfHwgcHJvcC50eXBlID09PSBcInZlY3RvcltdXCIgfHwgcHJvcC50eXBlID09PSBcInRzdmVjdG9yXCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKiA2LiDtg4DsnoXrs4Qg6riw67O4IEZha2VyIO2RnO2YhOyLneydhCDsi6Ttlontlanri4jri6QgKi9cbiAgICBjb25zdCB0eXBlRGVmYXVsdCA9IGxvY2FsZU1hcHBpbmdzLnR5cGVfZGVmYXVsdHNbcHJvcC50eXBlXTtcbiAgICBpZiAodHlwZURlZmF1bHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVGYWtlckV4cHJlc3Npb24odHlwZURlZmF1bHQuZmFrZXIsIHByb3ApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coYEZhaWxlZCB0byBleGVjdXRlIHR5cGUgZGVmYXVsdCBmb3IgJHtwcm9wLnR5cGV9LCB1c2luZyBmYWxsYmFjazpgLCBlcnJvciksXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogNy4g66ek7ZWR65CY7KeAIOyViuydgCDtg4DsnoXsnYAg6riw67O4IEZha2VyIO2VqOyImOuhnCDsspjrpqztlanri4jri6QgKi9cbiAgICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgY2FzZSBcInN0cmluZ1tdXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5sb3JlbS53b3JkcygzKTtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMDAgfSk7XG4gICAgICBjYXNlIFwiaW50ZWdlcltdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAwIH0pXTtcbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5udW1iZXIuYmlnSW50KHsgbWluOiAxbiwgbWF4OiAxMDAwbiB9KTtcbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5udW1iZXIuYmlnSW50KHsgbWluOiAxbiwgbWF4OiAxMDAwbiB9KV07XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmZsb2F0KHsgbWluOiAwLCBtYXg6IDEwMDAgfSk7XG4gICAgICBjYXNlIFwibnVtYmVyW11cIjpcbiAgICAgIGNhc2UgXCJudW1lcmljW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5udW1iZXIuZmxvYXQoeyBtaW46IDAsIG1heDogMTAwMCB9KV07XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gZmFrZXIuZGF0YXR5cGUuYm9vbGVhbigpO1xuICAgICAgY2FzZSBcImJvb2xlYW5bXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLmRhdGF0eXBlLmJvb2xlYW4oKV07XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgY2FzZSBcImRhdGVbXVwiOlxuICAgICAgICByZXR1cm4gZmFrZXIuZGF0ZS5wYXN0KCk7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4ge307XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgY2FzZSBcInV1aWRbXVwiOlxuICAgICAgICByZXR1cm4gZmFrZXIuc3RyaW5nLnV1aWQoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsl7Qg7YOA7J6F7J2YIOqwkuydhCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIO2DgOyehSBJROyZgCDtlYTrk5zrqoUg7Yyo7YS07J2EIOu2hOyEne2VmOyXrCDsoIHsoIjtlZwg67Cw7Je0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqIOyYiDogaW1hZ2VfdXJscyDihpIgW3t1cmwsIG5hbWUsIG1pbWVfdHlwZX0sIC4uLl1cbiAgICogICAgIHRhZ19pZHMg4oaSIFsxLCAyMywgNDVdXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlQXJyYXlWYWx1ZShcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIF9lbnRpdHk6IEVudGl0eSB8IHVuZGVmaW5lZCxcbiAgICBmYWtlcjogdHlwZW9mIGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKS5mYWtlcixcbiAgICBfbG9jYWxlRmFrZXI6IHR5cGVvZiBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIikuZmFrZXIsXG4gICk6IHVua25vd25bXSB7XG4gICAgY29uc3QgY291bnQgPSBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDMgfSk7XG5cbiAgICAvKiogU29uYW11RmlsZVtd7J2AIFNvbmFtdSDrgrTsnqUg7YOA7J6F7Jy866GcIOq1rOyhsOqwgCDsoJXtlbTsoLgg7J6I7Iq164uI64ukICovXG4gICAgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgPT09IFwiU29uYW11RmlsZVtdXCIpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiAoe1xuICAgICAgICB1cmw6IGZha2VyLmltYWdlLnVybCgpLFxuICAgICAgICBuYW1lOiBmYWtlci5zeXN0ZW0uZmlsZU5hbWUoKSxcbiAgICAgICAgbWltZV90eXBlOiBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChbXG4gICAgICAgICAgXCJpbWFnZS9qcGVnXCIsXG4gICAgICAgICAgXCJpbWFnZS9wbmdcIixcbiAgICAgICAgICBcImltYWdlL2dpZlwiLFxuICAgICAgICAgIFwiYXBwbGljYXRpb24vcGRmXCIsXG4gICAgICAgIF0pLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKiDtlYTrk5zrqoXsl5DshJwg67Cw7Je07J2YIOyaqeuPhOulvCDstpTroaDtlanri4jri6QgKi9cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCJcIik7XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJ1cmxcIikgfHwgbm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJpbWFnZVwiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLmludGVybmV0LnVybCgpKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJpZFwiKSAmJiBub3JtYWxpemVkTmFtZS5lbmRzV2l0aChcInNcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMCB9KSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwidGFnXCIpIHx8IG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwibmFtZVwiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLmxvcmVtLndvcmQoKSk7XG4gICAgfVxuXG4gICAgLyoqIO2MqO2EtCDrp6Tsua3rkJjsp4Ag7JWK7Jy866m0IOu5iCDrsLDsl7TsnYQg67CY7ZmY7ZWp64uI64ukICovXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04g66ek7ZWR7J2YIEZha2VyIO2RnO2YhOyLneydhCDtjIzsi7HtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKlxuICAgKiDtkZztmITsi50g7JiI7IucOlxuICAgKiAtIFwiZmFrZXIuaW50ZXJuZXQuZW1haWwoKVwiIOKGkiDsnbjsnpAg7JeG7J2MXG4gICAqIC0gXCJmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMCB9KVwiIOKGkiBKU09OIOyduOyekFxuICAgKiAtIFwie31cIiDihpIg66as7YSw65+0IOqwkiAoSlNPTi5wYXJzZSlcbiAgICpcbiAgICogZmFrZXJLTywgZmFrZXJKQeuPhCDsp4Dsm5DtlZjsl6wg64uk6rWt7Ja0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVGYWtlckV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgY29uc3QgZmFrZXIgPSBmYWtlck1vZHVsZS5mYWtlcjtcbiAgICBjb25zdCBmYWtlcktPID0gZmFrZXJNb2R1bGUuZmFrZXJLTztcbiAgICBjb25zdCBmYWtlckpBID0gZmFrZXJNb2R1bGUuZmFrZXJKQTtcblxuICAgIC8qKiBGYWtlciDtkZztmITsi53snbQg7JWE64uMIOumrO2EsOuftCDqsJLsnYAgSlNPTuycvOuhnCDtjIzsi7Htlanri4jri6QgKi9cbiAgICBpZiAoIWV4cHJlc3Npb24uc3RhcnRzV2l0aChcImZha2VyXCIpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShleHByZXNzaW9uKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiog7ZGc7ZiE7Iud7JeQ7IScIEZha2VyIOqwneyytOyZgCDqsr3roZzrpbwg7LaU7Lac7ZWp64uI64ukICovXG4gICAgY29uc3QgbWF0Y2ggPSBleHByZXNzaW9uLm1hdGNoKC9eKGZha2VyfGZha2VyS098ZmFrZXJKQSlcXC4oLio/KSQvKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbjogJHtleHByZXNzaW9ufWApO1xuICAgIH1cblxuICAgIGNvbnN0IFssIGZha2VyTmFtZSwgZXhwcl0gPSBtYXRjaDtcbiAgICBjb25zdCBzZWxlY3RlZEZha2VyID1cbiAgICAgIGZha2VyTmFtZSA9PT0gXCJmYWtlcktPXCIgPyBmYWtlcktPIDogZmFrZXJOYW1lID09PSBcImZha2VySkFcIiA/IGZha2VySkEgOiBmYWtlcjtcblxuICAgIGNvbnN0IGZ1bmNNYXRjaCA9IGV4cHIubWF0Y2goL14oW1xcdy5dKykoPzpcXCgoLio/KVxcKSk/JC8pO1xuICAgIGlmICghZnVuY01hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbiBmb3IgJHtwcm9wLm5hbWV9OiAke2V4cHJlc3Npb259YCk7XG4gICAgfVxuXG4gICAgY29uc3QgWywgcGF0aCwgYXJnc1N0cl0gPSBmdW5jTWF0Y2g7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgIC8qKiDsoJAg7ZGc6riw67KVKGRvdCBub3RhdGlvbinsnLzroZwgRmFrZXIg7ZWo7IiY66W8IOywvuyVhOqwkeuLiOuLpCAqL1xuICAgIGxldCBmbjogdW5rbm93biA9IHNlbGVjdGVkRmFrZXI7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBpZiAodHlwZW9mIGZuID09PSBcIm9iamVjdFwiICYmIGZuICE9PSBudWxsICYmIHBhcnQgaW4gZm4pIHtcbiAgICAgICAgZm4gPSAoZm4gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIHBhdGggZm9yICR7cHJvcC5uYW1lfTogJHtmYWtlck5hbWV9LiR7cGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtmYWtlck5hbWV9LiR7cGF0aH0gaXMgbm90IGEgZnVuY3Rpb24gKGZvciAke3Byb3AubmFtZX0pYCk7XG4gICAgfVxuXG4gICAgbGV0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICAgIGlmIChhcmdzU3RyPy50cmltKCkpIHtcbiAgICAgIGFyZ3MgPSB0aGlzLnBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyLCBwcm9wLm5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlSGludOulvCBMTE3sl5Dqsowg7KCE64us7ZWY7JesIO2YhOyLpOyggeyduCDthYzsiqTtirgg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogZmFrZXIuanProZzripQg7IOd7ISx7ZWY6riwIOyWtOugpOyatCDrs7XsnqHtlZwg7YWN7Iqk7Yq4KOyekOq4sOyGjOqwnCwg7ISk66qF66y4IOuTsSnrpbxcbiAgICogTExN7J2EIO2ZnOyaqe2VmOyXrCDsg53shLHtlanri4jri6QuIOuPmeydvO2VnCBoaW507JeQIOuMgO2VnCDspJHrs7Ug7Zi47Lac7J2EIOuwqeyngO2VmOq4sCDsnITtlbRcbiAgICog7LqQ7Iux7J2EIOq4sOuzuOycvOuhnCDsp4Dsm5Dtlanri4jri6QgKExMTSBBUEkg67mE7JqpIOygiOqwkCkuXG4gICAqXG4gICAqIGFpIO2MqO2CpOyngOuKlCBkeW5hbWljIGltcG9ydOuhnCDrtojrn6zsmKTrr4DroZwsIHVzZUxMTeydtCBmYWxzZeyduCDqsr3smrBcbiAgICog7J2Y7KG07ISx7J20IOyEpOy5mOuQmOyngCDslYrslYTrj4QgZml4dHVyZSDsg53shLHsnbQg7KCV7IOBIOuPmeyeke2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVXaXRoTExNKFxuICAgIGZpeHR1cmVIaW50OiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICByb3dLZXk/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIHJvd0tleeqwgCDsnojsnLzrqbQgcm93IOuLqOychCDsg53shLEg7KCE6561IOyCrOyaqVxuICAgIGlmIChyb3dLZXkpIHtcbiAgICAgIGNvbnN0IHJvd0NhY2hlS2V5ID0gYCR7cm93S2V5fToke3Byb3AubmFtZX1gO1xuXG4gICAgICAvLyDsnbTrr7gg7J20IHJvd+yXkCDrjIDtlZwgTExNIO2YuOy2nOydtCDsmYTro4zrkJwg6rK97JqwIOy6kOyLnOyXkOyEnCDrsJTroZwg67CY7ZmYXG4gICAgICBpZiAodGhpcy5sbG1DYWNoZS5oYXMocm93Q2FjaGVLZXkpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxsbUNhY2hlLmdldChyb3dDYWNoZUtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOyDiCByb3c6IExMTSDrjIDsg4EgcHJvcCDsoITssrTrpbwg7ZWcIOuyiOyXkCDsg53shLFcbiAgICAgIGNvbnN0IGxsbVByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcigocCkgPT4ge1xuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHAuY29uZT8uZml4dHVyZUdlbmVyYXRvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocC5uYW1lID09PSBcImlkXCIgJiYgcC5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gISFwLmNvbmU/Lm5vdGU7XG4gICAgICB9KTtcblxuICAgICAgLy8gbGxtUHJvcHPqsIAg67mE7Ja07J6I7Jy866m0IOuLqOydvCDtlYTrk5wg67Cp7Iud7Jy866GcIGZhbGxiYWNrXG4gICAgICBpZiAobGxtUHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtGaXh0dXJlR2VuZXJhdG9yXSBsbG1Qcm9wcyBpcyBlbXB0eSBmb3IgJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSwgdXNpbmcgc2luZ2xlIGZpZWxkIGZhbGxiYWNrYCxcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNpbmdsZVdpdGhMTE0oZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFwaUtleSA9IHRoaXMuZ2V0QXBpS2V5KCk7XG4gICAgICBjb25zdCB7IGNyZWF0ZUFudGhyb3BpYyB9ID0gYXdhaXQgaW1wb3J0KFwiQGFpLXNkay9hbnRocm9waWNcIik7XG4gICAgICBjb25zdCB7IGdlbmVyYXRlVGV4dCB9ID0gYXdhaXQgaW1wb3J0KFwiYWlcIik7XG5cbiAgICAgIGNvbnN0IHJvd1Jlc3BvbnNlID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgICAgbW9kZWw6IGNyZWF0ZUFudGhyb3BpYyh7IGFwaUtleSB9KSh0aGlzLm9wdGlvbnMubGxtTW9kZWwgfHwgXCJjbGF1ZGUtc29ubmV0LTQtNlwiKSxcbiAgICAgICAgcHJvbXB0OiB0aGlzLmJ1aWxkUm93TExNUHJvbXB0KGxsbVByb3BzLCBlbnRpdHkpLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJvd1Jlc3BvbnNlIHx8IHR5cGVvZiByb3dSZXNwb25zZS50ZXh0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTExNIHJlc3BvbnNlXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyDsnZHri7XsnYQg7YyM7Iux7ZWY7JesIOqwgSDtlYTrk5zsl5Ag64yA7ZWcIOqysOqzvOulvCDsupDsi5zsl5Ag7KCA7J6lXG4gICAgICBjb25zdCByb3dSZXN1bHQgPSB0aGlzLnBhcnNlUm93TExNUmVzcG9uc2Uocm93UmVzcG9uc2UudGV4dCwgbGxtUHJvcHMpO1xuICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocm93UmVzdWx0KSkge1xuICAgICAgICB0aGlzLmxsbUNhY2hlLnNldChgJHtyb3dLZXl9OiR7ZmllbGROYW1lfWAsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgLy8g7JqU7LKt7ZWcIO2VhOuTnOydmCDqsJIg67CY7ZmYICjsl4bsnLzrqbQg64uo7J28IO2VhOuTnCBmYWxsYmFjaylcbiAgICAgIGlmICh0aGlzLmxsbUNhY2hlLmhhcyhyb3dDYWNoZUtleSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KHJvd0NhY2hlS2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8g66eM7JW9IHJvdyDsnZHri7Xsl5Ag7J20IO2VhOuTnOqwgCDriITrnb3rkJwg6rK97JqwIOuLqOydvCDtlYTrk5wgZmFsbGJhY2tcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgICB9XG5cbiAgICAvLyByb3dLZXnqsIAg7JeG7Jy866m0IOq4sOyhtCDri6jsnbwg7ZWE65OcIOuwqeyLnVxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDri6jsnbwg7ZWE65Oc66W8IExMTeycvOuhnCDsg53shLHtlanri4jri6QgKHJvd0tleSDsl4bsnYQg65WMIGZhbGxiYWNr7JqpKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVNpbmdsZVdpdGhMTE0oXG4gICAgZml4dHVyZUhpbnQ6IHN0cmluZyxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGVudGl0eTogRW50aXR5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke2VudGl0eS5pZH06JHtwcm9wLm5hbWV9OiR7Zml4dHVyZUhpbnR9YDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlICYmIHRoaXMubGxtQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlLZXkgPSB0aGlzLmdldEFwaUtleSgpO1xuICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICBjb25zdCB7IGdlbmVyYXRlVGV4dCB9ID0gYXdhaXQgaW1wb3J0KFwiYWlcIik7XG5cbiAgICBjb25zdCBzaW5nbGVSZXNwb25zZSA9IGF3YWl0IGdlbmVyYXRlVGV4dCh7XG4gICAgICBtb2RlbDogY3JlYXRlQW50aHJvcGljKHsgYXBpS2V5IH0pKHRoaXMub3B0aW9ucy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC02XCIpLFxuICAgICAgcHJvbXB0OiB0aGlzLmJ1aWxkTExNUHJvbXB0KGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpLFxuICAgIH0pO1xuICAgIGlmICghc2luZ2xlUmVzcG9uc2UgfHwgdHlwZW9mIHNpbmdsZVJlc3BvbnNlLnRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTExNIHJlc3BvbnNlXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wYXJzZUxMTVJlc3BvbnNlKHNpbmdsZVJlc3BvbnNlLnRleHQsIHByb3AudHlwZSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMTE1DYWNoZSkge1xuICAgICAgdGhpcy5sbG1DYWNoZS5zZXQoY2FjaGVLZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogcm93IOyghOyytOulvCDtlZwg67KI7JeQIOyDneyEse2VmOuKlCBMTE0g7ZSE66Gs7ZSE7Yq466W8IOunjOuTreuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dMTE1Qcm9tcHQocHJvcHM6IEVudGl0eVByb3BbXSwgZW50aXR5OiBFbnRpdHkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gbG9jYWxlID09PSBcImtvXCIgPyBcIktvcmVhblwiIDogbG9jYWxlID09PSBcImphXCIgPyBcIkphcGFuZXNlXCIgOiBcIkVuZ2xpc2hcIjtcblxuICAgIGNvbnN0IGZpZWxkRGVzY3JpcHRpb25zID0gcHJvcHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgbGV0IGRlc2MgPSBgLSAke3AubmFtZX0gKCR7cC50eXBlfSk6ICR7cC5jb25lPy5ub3RlID8/IFwiXCJ9YDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwLnR5cGUgPT09IFwiZW51bVwiIHx8IHAudHlwZSA9PT0gXCJlbnVtW11cIikgJiZcbiAgICAgICAgICBcImlkXCIgaW4gcCAmJlxuICAgICAgICAgIHAuaWQgJiZcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscz8uW3AuaWRdXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3AuaWRdKS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgZGVzYyArPSBgIFthbGxvd2VkIHZhbHVlczogJHt2YWx1ZXN9XWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgICAvLyBMTE0g64yA7IOB7J20IOyVhOuLjCBwcm9w65Ok64+EIOunpeudveycvOuhnCDsoJzqs7UgKHJlbGF0aW9uIOygnOyZuClcbiAgICBjb25zdCBvdGhlclByb3BzID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICAhcHJvcHMuaW5jbHVkZXMocCkgJiZcbiAgICAgICAgICAhaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgICBwLm5hbWUgIT09IFwiaWRcIiAmJlxuICAgICAgICAgICEoXCJ2aXJ0dWFsXCIgaW4gcCAmJiBwLnZpcnR1YWwpLFxuICAgICAgKVxuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICBsZXQgZGVzYyA9IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KWA7XG4gICAgICAgIGlmIChwLmNvbmU/Lm5vdGUpIGRlc2MgKz0gYDogJHtwLmNvbmUubm90ZX1gO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHAudHlwZSA9PT0gXCJlbnVtXCIgfHwgcC50eXBlID09PSBcImVudW1bXVwiKSAmJlxuICAgICAgICAgIFwiaWRcIiBpbiBwICYmXG4gICAgICAgICAgcC5pZCAmJlxuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzPy5bcC5pZF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcC5pZF0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICBkZXNjICs9IGAgW2FsbG93ZWQgdmFsdWVzOiAke3ZhbHVlc31dYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBvdGhlclByb3BzQ29udGV4dCA9IG90aGVyUHJvcHNcbiAgICAgID8gYFxcblxcbk90aGVyIGZpZWxkcyBpbiB0aGlzIGVudGl0eSAoZm9yIGNvbnRleHQsIGRvIE5PVCBnZW5lcmF0ZSB0aGVzZSk6XFxuJHtvdGhlclByb3BzfWBcbiAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gcHJvcHMubWFwKChwKSA9PiBgICBcIiR7cC5uYW1lfVwiOiA8JHtwLnR5cGV9PmApLmpvaW4oXCIsXFxuXCIpO1xuXG4gICAgY29uc3QgZW50aXR5Q29udGV4dCA9IGVudGl0eS5jb25lPy5ub3RlID8gYFxcbkVudGl0eSBkZXNjcmlwdGlvbjogJHtlbnRpdHkuY29uZS5ub3RlfWAgOiBcIlwiO1xuXG4gICAgcmV0dXJuIGBHZW5lcmF0ZSB0ZXN0IGZpeHR1cmUgZGF0YSBmb3IgdGhlICR7ZW50aXR5LmlkfSBlbnRpdHkuIEFsbCBmaWVsZHMgbXVzdCBiZSBjb2hlcmVudCBhbmQgY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIuXG5cbkVudGl0eTogJHtlbnRpdHkuaWR9JHtlbnRpdHlDb250ZXh0fVxuTG9jYWxlOiAke2xvY2FsZX0gKHVzZSAke2xhbmd1YWdlfSBmb3IgdGV4dCBmaWVsZHMpXG5cbkZpZWxkcyB0byBnZW5lcmF0ZTpcbiR7ZmllbGREZXNjcmlwdGlvbnN9JHtvdGhlclByb3BzQ29udGV4dH1cblxuUnVsZXM6XG4tIEFsbCBmaWVsZHMgaW4gYSBzaW5nbGUgcm93IG11c3QgYmUgbG9naWNhbGx5IGNvbnNpc3RlbnQgKGUuZy4gbmFtZS9uYW1lX2VuL25hbWVfY24gc2hvdWxkIHJlcHJlc2VudCB0aGUgc2FtZSBwZXJzb24pXG4tIFJldHVybiBPTkxZIHZhbGlkIEpTT04sIG5vIG1hcmtkb3duIG9yIGV4cGxhbmF0aW9uXG4tIERhdGVzIGluIElTTyA4NjAxIGZvcm1hdFxuLSBVc2UgJHtsYW5ndWFnZX0gZm9yIHRleHQgdW5sZXNzIGZpZWxkIGRlc2NyaXB0aW9uIHNheXMgb3RoZXJ3aXNlXG5cblJldHVybiBleGFjdGx5IHRoaXMgSlNPTiBzaGFwZTpcbntcbiR7b3V0cHV0U2hhcGV9XG59YDtcbiAgfVxuXG4gIC8qKlxuICAgKiByb3cgTExNIOydkeuLteydhCDtjIzsi7HtlZjsl6wg7ZWE65Oc67OEIOqwkuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUm93TExNUmVzcG9uc2UodGV4dDogc3RyaW5nLCBwcm9wczogRW50aXR5UHJvcFtdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IGpzb25UZXh0ID0gdGV4dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnJlcGxhY2UoL15gYGBqc29uXFxzKi9pLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL2BgYFxccyokLywgXCJcIilcbiAgICAgIC50cmltKCk7XG5cbiAgICBsZXQgcGFyc2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4gICAgICBpZiAodHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIiB8fCByYXcgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUud2FybihcIltGaXh0dXJlR2VuZXJhdG9yXSBSb3cgTExNIHJlc3BvbnNlIGlzIG5vdCBhIHBsYWluIG9iamVjdDpcIiwgdGV4dCk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHBhcnNlZCA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLndhcm4oXCJbRml4dHVyZUdlbmVyYXRvcl0gRmFpbGVkIHRvIHBhcnNlIHJvdyBMTE0gcmVzcG9uc2U6XCIsIHRleHQpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgIGlmIChwcm9wLm5hbWUgaW4gcGFyc2VkKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wLm5hbWVdID0gdGhpcy5wYXJzZUxMTVJlc3BvbnNlKFN0cmluZyhwYXJzZWRbcHJvcC5uYW1lXSA/PyBcIlwiKSwgcHJvcC50eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMTE1Qcm9tcHQoaGludDogc3RyaW5nLCBwcm9wOiBFbnRpdHlQcm9wLCBlbnRpdHk6IEVudGl0eSk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5vcHRpb25zLmxvY2FsZSB8fCBcImtvXCI7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsb2NhbGUgPT09IFwia29cIiA/IFwiS29yZWFuXCIgOiBsb2NhbGUgPT09IFwiamFcIiA/IFwiSmFwYW5lc2VcIiA6IFwiRW5nbGlzaFwiO1xuXG4gICAgY29uc3QgZW50aXR5Q29udGV4dCA9IGVudGl0eS5jb25lPy5ub3RlID8gYFxcbkVudGl0eSBjb250ZXh0OiAke2VudGl0eS5jb25lLm5vdGV9YCA6IFwiXCI7XG5cbiAgICBjb25zdCBvdGhlckZpZWxkcyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocCkgPT4gcC5uYW1lICE9PSBwcm9wLm5hbWUgJiYgIWlzUmVsYXRpb25Qcm9wKHApICYmIHAuY29uZT8ubm90ZSlcbiAgICAgIC5tYXAoKHApID0+IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KTogJHtwLmNvbmU/Lm5vdGV9YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IG90aGVyRmllbGRzQ29udGV4dCA9IG90aGVyRmllbGRzXG4gICAgICA/IGBcXG5cXG5PdGhlciBmaWVsZHMgaW4gdGhpcyBlbnRpdHkgKGZvciBjb250ZXh0KTpcXG4ke290aGVyRmllbGRzfWBcbiAgICAgIDogXCJcIjtcblxuICAgIGxldCBwcm9tcHQgPSBgR2VuZXJhdGUgdGVzdCBkYXRhIGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9ICh0eXBlOiAke3Byb3AudHlwZX0pJHtlbnRpdHlDb250ZXh0fSR7b3RoZXJGaWVsZHNDb250ZXh0fVxuXG5SZXF1aXJlbWVudDogJHtoaW50fVxuXG5SdWxlczpcbi0gUmV0dXJuIE9OTFkgdGhlIHZhbHVlLCBubyBleHBsYW5hdGlvbiBvciBtYXJrZG93blxuLSBVc2UgJHtsYW5ndWFnZX0gbGFuZ3VhZ2UgaWYgYXBwbGljYWJsZVxuLSBGb3JtYXQ6ICR7dGhpcy5nZXRFeHBlY3RlZEZvcm1hdChwcm9wLnR5cGUpfWA7XG5cbiAgICAvLyBlbnVtIO2DgOyeheyduCDqsr3smrAg6rCA64ql7ZWcIOqwkiDrqqnroZ0g7LaU6rCAXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIgfHwgcHJvcC50eXBlID09PSBcImVudW1bXVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9tcHQgKz0gYFxcbi0gSU1QT1JUQU5UOiBDaG9vc2UgT05MWSBmcm9tIHRoZXNlIGFsbG93ZWQgdmFsdWVzOiAke2VudW1WYWx1ZXMuam9pbihcIiwgXCIpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvbXB0ICs9IGBcXG5cXG5FeGFtcGxlOiAke3RoaXMuZ2V0RXhhbXBsZUZvclR5cGUocHJvcC50eXBlLCBsb2NhbGUpfWA7XG5cbiAgICByZXR1cm4gcHJvbXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxMTVJlc3BvbnNlKHRleHQ6IHN0cmluZywgcHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IGNsZWFuZWQgPSB0ZXh0LnRyaW0oKTtcblxuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2xlYW5lZCk7XG4gICAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpOyAvLyBcImludGVnZXJbXVwiIC0+IFwiaW50ZWdlclwiXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZWQubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAvLyBudWxsL3VuZGVmaW5lZOuKlCDtg4DsnoXrs4Qg6riw67O46rCS7Jy866GcXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFZhbHVlRm9yVHlwZShiYXNlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDqsJ3ssrTripQgSlNPTi5zdHJpbmdpZnkg7ZuEIO2MjOyLsSAoanNvbiDtg4DsnoXsnbgg6rK97JqwKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlVHlwZSA9PT0gXCJqc29uXCJcbiAgICAgICAgICAgICAgICA/IGl0ZW1cbiAgICAgICAgICAgICAgICA6IHRoaXMucGFyc2VTY2FsYXJWYWx1ZShKU09OLnN0cmluZ2lmeShpdGVtKSwgYmFzZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHJpbWl0aXZlIOqwkuydgCDrrLjsnpDsl7TroZwg67OA7ZmYIO2bhCDtjIzsi7FcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoU3RyaW5nKGl0ZW0pLCBiYXNlVHlwZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDri6jsnbwg6rCS7J20IOyYqCDqsr3smrAg67Cw7Je066GcIOqwkOyLuOq4sFxuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsIHx8IHBhcnNlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIFt0aGlzLmdldERlZmF1bHRWYWx1ZUZvclR5cGUoYmFzZVR5cGUpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMucGFyc2VTY2FsYXJWYWx1ZShTdHJpbmcocGFyc2VkKSwgYmFzZVR5cGUpXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VTY2FsYXJWYWx1ZShjbGVhbmVkLCBwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRWYWx1ZUZvclR5cGUocHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgICAgcmV0dXJuIFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlU2NhbGFyVmFsdWUodGV4dDogc3RyaW5nLCBwcm9wVHlwZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgY2xlYW5lZCA9IHRleHQudHJpbSgpO1xuXG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjoge1xuICAgICAgICBjb25zdCBudW0gPSBwYXJzZUludChjbGVhbmVkLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IDAgOiBudW07XG4gICAgICB9XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChjbGVhbmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6IHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChjbGVhbmVkKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gMCA6IG51bTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjoge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoY2xlYW5lZCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG4gICAgICB9XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNsZWFuZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZha2VyIO2VqOyImCDsnbjsnpAg66y47J6Q7Je07J2EIO2MjOyLse2VmOyXrCDsnbjsnpAg67Cw7Je066GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogM+uLqOqzhCDsoITrnrU6XG4gICAqIDEuIEpTT04g7KeB7KCRIO2MjOyLsSAo7ZGc7KSAIEpTT04g7ZGc7ZiE7IudKVxuICAgKiAyLiBKUyDqsJ3ssrQg66as7YSw65+0IOKGkiBKU09OIOuzgO2ZmCDtm4Qg7J6s7Iuc64+EIChzaW5nbGUgcXVvdGUsIHVucXVvdGVkIGtleSDsspjrpqwpXG4gICAqIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsSAo7Iir7J6QLCDrrLjsnpDsl7QpXG4gICAqL1xuICBwcml2YXRlIHBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyOiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiB1bmtub3duW10ge1xuICAgIC8vIDEuIEpTT04g7KeB7KCRIO2MjOyLsVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGBbJHthcmdzU3RyfV1gKSBhcyB1bmtub3duO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZCA6IFtwYXJzZWRdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8g6rOE7IaNXG4gICAgfVxuXG4gICAgLy8gMi4gSlMg6rCd7LK0IOumrO2EsOuftCDihpIgSlNPTiDrs4DtmZgg7ZuEIOyerOyLnOuPhFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBqc29uU3RyID0gdGhpcy5jb252ZXJ0SnNMaXRlcmFsVG9Kc29uKGFyZ3NTdHIpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShgWyR7anNvblN0cn1dYCkgYXMgdW5rbm93bjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWQgOiBbcGFyc2VkXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOqzhOyGjVxuICAgIH1cblxuICAgIC8vIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsVxuICAgIGNvbnN0IHRyaW1tZWQgPSBhcmdzU3RyLnRyaW0oKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihOdW1iZXIodHJpbW1lZCkpKSB7XG4gICAgICByZXR1cm4gW051bWJlcih0cmltbWVkKV07XG4gICAgfVxuICAgIGlmIChcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoXCInXCIpICYmIHRyaW1tZWQuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIFt0cmltbWVkLnNsaWNlKDEsIC0xKV07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBDYW5ub3QgcGFyc2UgYXJndW1lbnRzIGZvciAke3Byb3BOYW1lfTogJHthcmdzU3RyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTIOqwneyytCDrpqzthLDrn7TsnYQgSlNPTuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOuRkCDqsIDsp4Ag67OA7ZmYOlxuICAgKiAxLiBTaW5nbGUtcXVvdGVkIOusuOyekOyXtCDihpIgZG91YmxlLXF1b3RlZCAo7J207Iqk7LyA7J207ZSEIOyymOumrCDtj6ztlagpXG4gICAqIDIuIFVucXVvdGVkIOqwneyytCDtgqQg4oaSIGRvdWJsZS1xdW90ZWRcbiAgICovXG4gIHByaXZhdGUgY29udmVydEpzTGl0ZXJhbFRvSnNvbihpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyAxLiAndmFsdWUnIOKGkiBcInZhbHVlXCIgKOuCtOu2gCBcIiDsnbTsiqTsvIDsnbTtlIQsIFxcJyDihpIgJylcbiAgICBjb25zdCB3aXRoRG91YmxlUXVvdGVzID0gaW5wdXQucmVwbGFjZShcbiAgICAgIC8nKFteJ1xcXFxdKig/OlxcXFwuW14nXFxcXF0qKSopJy9nLFxuICAgICAgKF8sIGNvbnRlbnQ6IHN0cmluZykgPT4gYFwiJHtjb250ZW50LnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIil9XCJgLFxuICAgICk7XG5cbiAgICAvLyAyLiB7IGtleTog4oaSIHsgXCJrZXlcIjpcbiAgICByZXR1cm4gd2l0aERvdWJsZVF1b3Rlcy5yZXBsYWNlKC8oW3ssXVxccyopKFthLXpBLVpfJF1bXFx3JF0qKShcXHMqOikvZywgJyQxXCIkMlwiJDMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb25hbXUuc2VjcmV07J2EIOyasOyEoOycvOuhnCDtlZjqs6AsIOyXhuycvOuptCDtmZjqsr3rs4DsiJjsl5DshJwgQVBJIO2CpOulvCDsnb3sirXri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdS5zZWNyZXTsnYAg7ZSE66Gc7KCd7Yq467OEIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuvgOuhnCDrjZQg64aS7J2AIOyasOyEoOyInOychOulvCDqsIDsp4DrqbAsXG4gICAqIO2ZmOqyveuzgOyImOuKlCDqsJzrsJwg7ZmY6rK97J2064KYIENJL0NE7JeQ7IScIGZhbGxiYWNr7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gICAgbGV0IGFwaUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgICAgYXBpS2V5ID0gU29uYW11LnNlY3JldHM/LmFudGhyb3BpY19hcGlfa2V5O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU29uYW116rCAIOy0iOq4sO2ZlOuQmOyngCDslYrsnYAg6rK97JqwICjthYzsiqTtirgg7ZmY6rK9IOuTsSlcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgYXBpS2V5ID0gcHJvY2Vzcy5lbnYuQU5USFJPUElDX0FQSV9LRVk7XG4gICAgfVxuXG4gICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJBTlRIUk9QSUNfQVBJX0tFWSBub3QgZm91bmQuIFNldCBpdCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgU29uYW11LnNlY3JldC5hbnRocm9waWNfYXBpX2tleVwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHBlY3RlZEZvcm1hdChwcm9wVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyDrsLDsl7Qg7YOA7J6FIOyymOumrFxuICAgIGlmIChwcm9wVHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgICBjb25zdCBiYXNlVHlwZSA9IHByb3BUeXBlLnNsaWNlKDAsIC0yKTtcbiAgICAgIGNvbnN0IGJhc2VGb3JtYXQgPSB0aGlzLmdldFNjYWxhckZvcm1hdChiYXNlVHlwZSk7XG4gICAgICByZXR1cm4gYEpTT04gYXJyYXkgb2YgJHtiYXNlRm9ybWF0fSAoZS5nLiwgWyR7dGhpcy5nZXRFeGFtcGxlRm9yVHlwZShiYXNlVHlwZSwgXCJlblwiKX0sIC4uLl0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRTY2FsYXJGb3JtYXQocHJvcFR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY2FsYXJGb3JtYXQocHJvcFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiBcImludGVnZXIgbnVtYmVyc1wiO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gXCJkZWNpbWFsIG51bWJlcnNcIjtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBcImJvb2xlYW5zICh0cnVlIG9yIGZhbHNlKVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIFwiSVNPIDg2MDEgZGF0ZSBzdHJpbmdzXCI7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gXCJ2YWxpZCBKU09OIG9iamVjdCBvciBhcnJheVwiO1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgICAgcmV0dXJuIFwiVVVJRCBzdHJpbmdzXCI7XG4gICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICByZXR1cm4gXCJvbmUgb2YgdGhlIGFsbG93ZWQgZW51bSB2YWx1ZXNcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcInBsYWluIHRleHQgc3RyaW5nc1wiO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXhhbXBsZUZvclR5cGUocHJvcFR5cGU6IHN0cmluZywgbG9jYWxlOiBMb2NhbGUpOiBzdHJpbmcge1xuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpO1xuICAgICAgY29uc3QgYmFzZUV4YW1wbGUgPSB0aGlzLmdldFNjYWxhckV4YW1wbGUoYmFzZVR5cGUsIGxvY2FsZSk7XG4gICAgICByZXR1cm4gYFske2Jhc2VFeGFtcGxlfV1gO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFNjYWxhckV4YW1wbGUocHJvcFR5cGUsIGxvY2FsZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjYWxhckV4YW1wbGUocHJvcFR5cGU6IHN0cmluZywgbG9jYWxlOiBMb2NhbGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlzS29yZWFuID0gbG9jYWxlID09PSBcImtvXCI7XG5cbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiNDJcIjtcbiAgICAgIGNhc2UgXCJmbG9hdFwiOlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgICAgcmV0dXJuIFwiMy4xNFwiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIFwiMjAyNC0wMS0wMVwiO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuICd7XCJrZXlcIjogXCJ2YWx1ZVwifSc7XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCI1NTBlODQwMC1lMjliLTQxZDQtYTcxNi00NDY2NTU0NDAwMDBcIjtcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBcIkVOVU1fVkFMVUVcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBpc0tvcmVhbiA/IFwi7JWI64WV7ZWY7IS47JqUXCIgOiBcIkhlbGxvXCI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOydtOumhOydhCDsnbTrqZTsnbwg66Gc7LusIO2MjO2KuOyaqSDroZzrp4jrgpjsnbTspojrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7ZWc6riAIOydtOumhOydgCDstIjshLEt7KSR7ISxLeyiheyEsSDrtoTtlbQg7ZuEIOuhnOuniOuCmOydtOymiCDsspjrpqztlanri4jri6QuXG4gICAqIOyYgeusuCDsnbTrpoTsnYAg7IaM66y47J6Q66GcIOuzgO2ZmO2VmOqzoCDqs7XrsLHsnYQg7KCQKC4pXFx1YzczY+uhnCDsuZjtmZjtlanri4jri6QuXG4gICAqIOyYiDogXCLquYDssqDsiJhcIiDihpIgXCJjaGVvbHN1LmtpbVwiLCBcIkpvaG4gRG9lXCIg4oaSIFwiam9obi5kb2VcIlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByb21hbml6ZU5hbWUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyDtlZzquIAg7Y+s7ZWoIOyXrOu2gCDtmZXsnbhcbiAgICBpZiAoL1tcXHVBQzAwLVxcdUQ3QUZdLy50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb21hbml6ZUtvcmVhbk5hbWUobmFtZSk7XG4gICAgfVxuICAgIC8vIOyYgeusuDog7IaM66y47J6QICsg7KCQIOq1rOu2hFxuICAgIHJldHVybiBuYW1lXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1xccysvZywgXCIuXCIpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTkuXS9nLCBcIlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZzquIAg7J2066aE7J2EIOuhnOuniOuCmOydtOymiCDsspjrpqztlanri4jri6QuXG4gICAqXG4gICAqIOy0iOyEsS/spJHshLEv7KKF7ISxIOunpO2VkSDthYzsnbTruJTsnYQg7IKs7Jqp7ZWY7JesIO2VnOq4gOydhCDroZzrp4jsnpDroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKiDssqsg6riA7J6Q66W8IOyEseycvOuhnCDqsITso7ztlZjsl6wgXCLquYDssqDsiJhcIiDihpIgXCJjaGVvbHN1LmtpbVwiIO2Yle2DnOuhnCDstpzroKXtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHJvbWFuaXplS29yZWFuTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IENIT1NFT05HID0gW1xuICAgICAgXCJnXCIsXG4gICAgICBcImtrXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiZFwiLFxuICAgICAgXCJ0dFwiLFxuICAgICAgXCJyXCIsXG4gICAgICBcIm1cIixcbiAgICAgIFwiYlwiLFxuICAgICAgXCJwcFwiLFxuICAgICAgXCJzXCIsXG4gICAgICBcInNzXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCJqXCIsXG4gICAgICBcImpqXCIsXG4gICAgICBcImNoXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcImhcIixcbiAgICBdO1xuICAgIGNvbnN0IEpVTkdTRU9ORyA9IFtcbiAgICAgIFwiYVwiLFxuICAgICAgXCJhZVwiLFxuICAgICAgXCJ5YVwiLFxuICAgICAgXCJ5YWVcIixcbiAgICAgIFwiZW9cIixcbiAgICAgIFwiZVwiLFxuICAgICAgXCJ5ZW9cIixcbiAgICAgIFwieWVcIixcbiAgICAgIFwib1wiLFxuICAgICAgXCJ3YVwiLFxuICAgICAgXCJ3YWVcIixcbiAgICAgIFwib2VcIixcbiAgICAgIFwieW9cIixcbiAgICAgIFwidVwiLFxuICAgICAgXCJ3b1wiLFxuICAgICAgXCJ3ZVwiLFxuICAgICAgXCJ3aVwiLFxuICAgICAgXCJ5dVwiLFxuICAgICAgXCJldVwiLFxuICAgICAgXCJ1aVwiLFxuICAgICAgXCJpXCIsXG4gICAgXTtcbiAgICBjb25zdCBKT05HU0VPTkcgPSBbXG4gICAgICBcIlwiLFxuICAgICAgXCJrXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJuXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJtXCIsXG4gICAgICBcInBcIixcbiAgICAgIFwicFwiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInRcIixcbiAgICAgIFwibmdcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcImtcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcInRcIixcbiAgICBdO1xuXG4gICAgY29uc3Qgcm9tYW5pemUgPSAoY2hhcjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAoY29kZSA8IDB4YWMwMCB8fCBjb2RlID4gMHhkN2FmKSByZXR1cm4gY2hhcjtcbiAgICAgIGNvbnN0IG9mZnNldCA9IGNvZGUgLSAweGFjMDA7XG4gICAgICBjb25zdCBjaG8gPSBNYXRoLmZsb29yKG9mZnNldCAvIDU4OCk7XG4gICAgICBjb25zdCBqdW5nID0gTWF0aC5mbG9vcigob2Zmc2V0ICUgNTg4KSAvIDI4KTtcbiAgICAgIGNvbnN0IGpvbmcgPSBvZmZzZXQgJSAyODtcbiAgICAgIHJldHVybiBDSE9TRU9OR1tjaG9dICsgSlVOR1NFT05HW2p1bmddICsgSk9OR1NFT05HW2pvbmddO1xuICAgIH07XG5cbiAgICBjb25zdCBjaGFycyA9IFsuLi5uYW1lXTtcbiAgICAvLyDssqsg6riA7J6Q66W8IOyEsSjlp5Mp7Jy866GcIOqwhOyjvFxuICAgIGNvbnN0IGZhbWlseU5hbWUgPSByb21hbml6ZShjaGFyc1swXSk7XG4gICAgY29uc3QgZ2l2ZW5OYW1lID0gY2hhcnMuc2xpY2UoMSkubWFwKHJvbWFuaXplKS5qb2luKFwiXCIpO1xuXG4gICAgaWYgKGdpdmVuTmFtZSkge1xuICAgICAgcmV0dXJuIGAke2dpdmVuTmFtZX0uJHtmYW1pbHlOYW1lfWA7XG4gICAgfVxuICAgIHJldHVybiBmYW1pbHlOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTSDsupDsi5wg7Ya16rOE66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIGdldExMTUNhY2hlU3RhdHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemU6IHRoaXMubGxtQ2FjaGUuc2l6ZSxcbiAgICAgIGVuYWJsZWQ6IHRoaXMub3B0aW9ucy5lbmFibGVMTE1DYWNoZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExMTSDsupDsi5zrpbwg7LSI6riw7ZmU7ZWp64uI64ukLlxuICAgKi9cbiAgY2xlYXJMTE1DYWNoZSgpIHtcbiAgICB0aGlzLmxsbUNhY2hlLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICog7Luo7YWN7Iqk7Yq4IOyDneyEsVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb250ZXh0KCk6IEdlbmVyYXRvckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBmaXh0dXJlczogbmV3IE1hcCgpLFxuICAgICAgcmVmZXJlbmNlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICAgIGltcG9ydGVkUmVjb3JkczogbmV3IFNldCgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog67Cw7LmYIOyDneyEsSDrsI8g7J6Q64+ZIOyggOyepVxuICAgKlxuICAgKiAxLiDqsIEgc3BlY+uzhOuhnCBmaXh0dXJlIOyDneyEsSAo66mU66qo66asKVxuICAgKiAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgKiAzLiBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcygp66GcIHRhcmdldERi7JeQIOyggOyepVxuICAgKlxuICAgKiBAcmV0dXJucyDsoIDsnqXrkJwgZml4dHVyZSDrjbDsnbTthLAgKOyLpOygnCBEQiBJRCDtj6ztlagpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUJhdGNoKFxuICAgIHNwZWNzOiBBcnJheTx7IGVudGl0eTogc3RyaW5nOyBjb3VudDogbnVtYmVyOyBvdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PixcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KCk7XG4gICAgY29uc3QgZ2VuZXJhdGVkRml4dHVyZXM6IEFycmF5PHtcbiAgICAgIGVudGl0eTogc3RyaW5nO1xuICAgICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBleHBsaWNpdElkPzogYm9vbGVhbjtcbiAgICB9PiA9IFtdO1xuXG4gICAgLy8gMS4g6rCBIHNwZWPrs4TroZwgZml4dHVyZSDsg53shLFcbiAgICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgIGNvbnN0IHNwZWNFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWMuZW50aXR5KTtcblxuICAgICAgaWYgKHNwZWNFbnRpdHkucGFyZW50SWQpIHtcbiAgICAgICAgLy8gcGFyZW50SWQg7JeU7Yuw7YuwOiBEQuyXkOyEnCDshJzruIztg4DsnoUg7ZaJ7J20IOyXhuuKlCDrtoDrqqggaWTrpbwg7KGw7ZqM7ZWY7JesIOyCrOyaqVxuICAgICAgICAvLyAo7IOIIOu2gOuqqCDsg53shLEg64yA7IugIOq4sOyhtCDrjbDsnbTthLAg7J6s7Zmc7JqpKVxuICAgICAgICBjb25zdCBpZFByb3AgPSBzcGVjRW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgcGFyZW50T3ZlcnJpZGVzID1cbiAgICAgICAgICAoaWRQcm9wPy5jb25lPy5maXh0dXJlUGFyZW50T3ZlcnJpZGVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSA/PyB7fTtcbiAgICAgICAgY29uc3QgcGFyZW50RW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChzcGVjRW50aXR5LnBhcmVudElkKTtcblxuICAgICAgICAvLyDrtoDrqqgg7YWM7J2067iU7JeQ7IScIOyEnOu4jO2DgOyehSDthYzsnbTruJTsl5Ag7JeG64qUIGlk66W8IOyhsO2ajFxuICAgICAgICBsZXQgcXVlcnkgPSB0aGlzLnNvdXJjZURiKHBhcmVudEVudGl0eS50YWJsZSkuc2VsZWN0KGAke3BhcmVudEVudGl0eS50YWJsZX0uaWRgKTtcbiAgICAgICAgZm9yIChjb25zdCBbY29sLCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmVudE92ZXJyaWRlcykpIHtcbiAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKFxuICAgICAgICAgICAgYCR7cGFyZW50RW50aXR5LnRhYmxlfS4ke2NvbH1gLFxuICAgICAgICAgICAgdmFsIGFzIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnkgPSBxdWVyeVxuICAgICAgICAgIC5sZWZ0Sm9pbihzcGVjRW50aXR5LnRhYmxlLCBgJHtzcGVjRW50aXR5LnRhYmxlfS5pZGAsIGAke3BhcmVudEVudGl0eS50YWJsZX0uaWRgKVxuICAgICAgICAgIC53aGVyZU51bGwoYCR7c3BlY0VudGl0eS50YWJsZX0uaWRgKVxuICAgICAgICAgIC5saW1pdChzcGVjLmNvdW50KTtcblxuICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnk7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZUlkczogbnVtYmVyW10gPSByb3dzLm1hcCgocjogeyBpZDogbnVtYmVyIH0pID0+IHIuaWQpO1xuXG4gICAgICAgIGlmIChhdmFpbGFibGVJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgW3BhcmVudElkXSAke3NwZWMuZW50aXR5fTog7ISc67iM7YOA7J6F7J20IOyXhuuKlCDrtoDrqqgg66CI7L2U65Oc6rCAIOu2gOyhse2VqeuLiOuLpC4g6rG064SI65yB64uI64ukLmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoY29uc3QgcGFyZW50SWQgb2YgYXZhaWxhYmxlSWRzKSB7XG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZShzcGVjLmVudGl0eSwgc3BlYy5vdmVycmlkZXMgfHwge30sIGNvbnRleHQpO1xuICAgICAgICAgICAgZml4dHVyZS5pZCA9IHBhcmVudElkO1xuICAgICAgICAgICAgZ2VuZXJhdGVkRml4dHVyZXMucHVzaCh7IGVudGl0eTogc3BlYy5lbnRpdHksIGRhdGE6IGZpeHR1cmUsIGV4cGxpY2l0SWQ6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwZWMuY291bnQ7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlKHNwZWMuZW50aXR5LCBzcGVjLm92ZXJyaWRlcyB8fCB7fSwgY29udGV4dCk7XG4gICAgICAgICAgZ2VuZXJhdGVkRml4dHVyZXMucHVzaCh7XG4gICAgICAgICAgICBlbnRpdHk6IHNwZWMuZW50aXR5LFxuICAgICAgICAgICAgZGF0YTogZml4dHVyZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgY29uc3QgZml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgeyBlbnRpdHk6IGVudGl0eU5hbWUsIGRhdGEsIGV4cGxpY2l0SWQgfSBvZiBnZW5lcmF0ZWRGaXh0dXJlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcblxuICAgICAgLy8gaW50ZWdlci9iaWdJbnRlZ2VyIFBL64qUIOyehOyLnCBJRCDsg53shLEgKERCIOyLnO2AgOyKpOqwgCDsi6TsoJwgSUQg7ZWg64u5KVxuICAgICAgLy8gc3RyaW5nIFBL64qUIGdlbmVyYXRlKCnsl5DshJwg7J2066+4IOyDneyEseuQnCBpZCDqsJLsnYQg6re464yA66GcIOyCrOyaqVxuICAgICAgLy8gcGFyZW50SWQg7JeU7Yuw7Yuw64qUIOu2gOuqqOydmCDsi6TsoJwgaWTrpbwg6re464yA66GcIOyCrOyaqSAo7Iuc7YCA7IqkIOuvuOyCrOyaqSlcbiAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAhZXhwbGljaXRJZCAmJlxuICAgICAgICAoaWRQcm9wPy50eXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGlkUHJvcD8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiKTtcblxuICAgICAgY29uc3QgZGF0YUZvclJlY29yZCA9IHVzZXNTZXF1ZW5jZVxuICAgICAgICA/IHsgLi4uZGF0YSwgaWQ6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApIH1cbiAgICAgICAgOiBkYXRhO1xuXG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgZW50aXR5LFxuICAgICAgICBkYXRhRm9yUmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgeyBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICk7XG4gICAgICBmaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgIH1cblxuICAgIC8vIDMuIHRhcmdldERi7JeQIOyCveyehSAoRml4dHVyZU1hbmFnZXLqsIAg7J2Y7KG07ISxIOygleugrCDsspjrpqwpXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKHRoaXMudGFyZ2V0RGJOYW1lLCBmaXh0dXJlUmVjb3Jkcyk7XG5cbiAgICAvLyA0LiBjb21wYW5pb24gZml4dHVyZXMg7IOd7ISxIChmaXh0dXJlQ29tcGFuaW9uc+qwgCDshKDslrjrkJwg6rK97JqwKVxuICAgIGNvbnN0IGNvbXBhbmlvblJlc3VsdHMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQ29tcGFuaW9ucyhzcGVjcywgcmVzdWx0cyk7XG5cbiAgICBjb25zdCB0b3RhbCA9IHJlc3VsdHMubGVuZ3RoICsgY29tcGFuaW9uUmVzdWx0cy5sZW5ndGg7XG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgR2VuZXJhdGVkIGFuZCBzYXZlZCAke3RvdGFsfSBmaXh0dXJlcyB0byAke3RoaXMudGFyZ2V0RGJOYW1lfWApKTtcbiAgICByZXR1cm4gWy4uLnJlc3VsdHMsIC4uLmNvbXBhbmlvblJlc3VsdHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIOu2gOuqqCBmaXh0dXJlIOqysOqzvOulvCDquLDrsJjsnLzroZwgZml4dHVyZUNvbXBhbmlvbnPsl5Ag7ISg7Ja465CcIGNvbXBhbmlvbiBFbnRpdHnrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBnZW5lcmF0ZUJhdGNoKCnsl5DshJzrp4wg7Zi47Lac65CY66mwLCBjb21wYW5pb24g7IOd7ISxIOyLnCDsnqzqt4Drpbwg67Cp7KeA7ZWY6riwIOychO2VtFxuICAgKiBnZW5lcmF0ZUJhdGNoKCnrpbwg64uk7IucIO2YuOy2nO2VmOyngCDslYrqs6Ag7KeB7KCRIOyCveyehe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVDb21wYW5pb25zKFxuICAgIHNwZWNzOiBBcnJheTx7IGVudGl0eTogc3RyaW5nOyBjb3VudDogbnVtYmVyOyBvdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PixcbiAgICBwYXJlbnRSZXN1bHRzOiBGaXh0dXJlSW1wb3J0UmVzdWx0W10sXG4gICk6IFByb21pc2U8Rml4dHVyZUltcG9ydFJlc3VsdFtdPiB7XG4gICAgY29uc3QgYWxsUmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdID0gW107XG4gICAgY29uc3QgcHJvY2Vzc2VkRW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykge1xuICAgICAgaWYgKHByb2Nlc3NlZEVudGl0aWVzLmhhcyhzcGVjLmVudGl0eSkpIGNvbnRpbnVlO1xuICAgICAgcHJvY2Vzc2VkRW50aXRpZXMuYWRkKHNwZWMuZW50aXR5KTtcblxuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChzcGVjLmVudGl0eSk7XG4gICAgICBjb25zdCBpZFByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgY29uc3QgY29tcGFuaW9ucyA9IGlkUHJvcD8uY29uZT8uZml4dHVyZUNvbXBhbmlvbnM7XG4gICAgICBpZiAoIWNvbXBhbmlvbnMgfHwgY29tcGFuaW9ucy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBlbnRpdHlSZXN1bHRzID0gcGFyZW50UmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuZW50aXR5SWQgPT09IHNwZWMuZW50aXR5KTtcbiAgICAgIGlmIChlbnRpdHlSZXN1bHRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgY29tcGFuaW9uIG9mIGNvbXBhbmlvbnMpIHtcbiAgICAgICAgLy8gY29tcGFuaW9uIGVudGl0eeyXkOyEnCDrtoDrqqggZW50aXR566Gc7J2YIEJlbG9uZ3NUb09uZSBGSyDsu6zrn7zrqoUg7YyM7JWFXG4gICAgICAgIGNvbnN0IGNvbXBhbmlvbkVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoY29tcGFuaW9uLmVudGl0eSk7XG4gICAgICAgIGNvbnN0IGZrUHJvcCA9IGNvbXBhbmlvbkVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IHNwZWMuZW50aXR5LFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWZrUHJvcCkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYFtDb21wYW5pb25dIE5vIEJlbG9uZ3NUb09uZSByZWxhdGlvbiBmcm9tICR7Y29tcGFuaW9uLmVudGl0eX0gdG8gJHtzcGVjLmVudGl0eX0uIFNraXBwaW5nLmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZrQ29sTmFtZSA9IGAke2ZrUHJvcC5uYW1lfV9pZGA7XG5cbiAgICAgICAgLy8gY29tcGFuaW9u7J2YIGlkUHJvcCwgdXNlc1NlcXVlbmNlLCBjb3VudOuKlCBjb21wYW5pb24g64uo7JyE66GcIOqzoOyglVxuICAgICAgICBjb25zdCBjb21wYW5pb25JZFByb3AgPSBjb21wYW5pb25FbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgIGNvbXBhbmlvbklkUHJvcD8udHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICBjb21wYW5pb25JZFByb3A/LnR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgY29tcGFuaW9uSWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcbiAgICAgICAgY29uc3QgY29tcGFuaW9uQ291bnQgPSBjb21wYW5pb24uY291bnQgPz8gMTtcblxuICAgICAgICAvLyDqsIEgcGFyZW50IHJlc3VsdOyXkCDrjIDtlbQgY29tcGFuaW9uIGZpeHR1cmUg7IOd7ISxXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKTtcbiAgICAgICAgY29uc3QgY29tcGFuaW9uRml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFyZW50UmVzdWx0IG9mIGVudGl0eVJlc3VsdHMpIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZE92ZXJyaWRlcyA9IHRoaXMucmVzb2x2ZVRlbXBsYXRlT3ZlcnJpZGVzKFxuICAgICAgICAgICAgY29tcGFuaW9uLm92ZXJyaWRlcyA/PyB7fSxcbiAgICAgICAgICAgIHBhcmVudFJlc3VsdC5kYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzb2x2ZWRPdmVycmlkZXNbZmtDb2xOYW1lXSA9IHBhcmVudFJlc3VsdC5kYXRhLmlkO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wYW5pb25Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZShjb21wYW5pb24uZW50aXR5LCByZXNvbHZlZE92ZXJyaWRlcywgY29udGV4dCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGFGb3JSZWNvcmQgPSB1c2VzU2VxdWVuY2VcbiAgICAgICAgICAgICAgPyB7IC4uLmZpeHR1cmUsIGlkOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKSB9XG4gICAgICAgICAgICAgIDogZml4dHVyZTtcblxuICAgICAgICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgICAgICAgICAgIGNvbXBhbmlvbkVudGl0eSxcbiAgICAgICAgICAgICAgZGF0YUZvclJlY29yZCBhcyB7XG4gICAgICAgICAgICAgICAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgICAgICAgICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb21wYW5pb25GaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBhbmlvblJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyhcbiAgICAgICAgICB0aGlzLnRhcmdldERiTmFtZSxcbiAgICAgICAgICBjb21wYW5pb25GaXh0dXJlUmVjb3JkcyxcbiAgICAgICAgKTtcbiAgICAgICAgYWxsUmVzdWx0cy5wdXNoKC4uLmNvbXBhbmlvblJlc3VsdHMpO1xuXG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICAgIGBbQ29tcGFuaW9uXSBHZW5lcmF0ZWQgJHtjb21wYW5pb25SZXN1bHRzLmxlbmd0aH0gJHtjb21wYW5pb24uZW50aXR5fSBmaXh0dXJlc2AsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogb3ZlcnJpZGVzIOqwkuydmCBcInt7ZmllbGROYW1lfX1cIiDthZztlIzrpr/snYQg67aA66qoIGZpeHR1cmUg642w7J207YSw66GcIOy5mO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JiIOiB7IFwiYWNjb3VudF9pZFwiOiBcInt7ZW1haWx9fVwiIH0g4oaSIHsgXCJhY2NvdW50X2lkXCI6IFwidXNlckBleGFtcGxlLmNvbVwiIH1cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVRlbXBsYXRlT3ZlcnJpZGVzKFxuICAgIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcGFyZW50RGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSB8IG51bGwgfSxcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc29sdmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlcykpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuc3RhcnRzV2l0aChcInt7XCIpICYmIHZhbHVlLmVuZHNXaXRoKFwifX1cIikpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gdmFsdWUuc2xpY2UoMiwgLTIpLnRyaW0oKTtcbiAgICAgICAgaWYgKCEoZmllbGROYW1lIGluIHBhcmVudERhdGEpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYO2FnO2UjOumvyDtlYTrk5wgXCIke2ZpZWxkTmFtZX1cIuydtCjqsIApIOu2gOuqqCBmaXh0dXJlIOuNsOydtO2EsOyXkCDsobTsnqztlZjsp4Ag7JWK7Iq164uI64ukIChvdmVycmlkZSBrZXk6IFwiJHtrZXl9XCIpYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSBwYXJlbnREYXRhW2ZpZWxkTmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlZFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsi6TsoJwgREIoc291cmNlRGIp7JeQ7IScIOuNsOydtO2EsOulvCDsobDtmoztlZjsl6wgZml4dHVyZSBEQih0YXJnZXREYinsl5AgaW1wb3J07ZWp64uI64ukLlxuICAgKlxuICAgKiAxLiBEYXRhRXhwbG9yZXLroZwgc291cmNlRGLsl5DshJwg642w7J207YSwIOyhsO2ajCAo6rSA66CoIOuNsOydtO2EsCDtj6ztlagpXG4gICAqIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAqIDMuIHRhcmdldERi7JeQIOyCveyehVxuICAgKlxuICAgKiBAcGFyYW0gZW50aXR5TmFtZSAtIOyhsO2ajO2VoCBlbnRpdHkg7J2066aEXG4gICAqIEBwYXJhbSBvcHRpb25zIC0g7KGw7ZqMIOyYteyFmCAoc3RyYXRlZ3ksIGxpbWl0LCBpbmNsdWRlUmVsYXRpb25zIOuTsSlcbiAgICogQHJldHVybnMg7KCA7J6l65CcIGZpeHR1cmUg642w7J207YSwICjsi6TsoJwgREIgSUQg7Y+s7ZWoKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyDtlITroZzrjZXshZggRELsl5DshJwgVXNlciAxMOuqhSArIOq0gOugqCBFbXBsb3llZSwgRGVwYXJ0bWVudCDqsIDsoLjsmKTquLBcbiAgICogYXdhaXQgZ2VuZXJhdG9yLmltcG9ydEZyb21Tb3VyY2UoXCJVc2VyXCIsIHtcbiAgICogICBzdHJhdGVneTogXCJzYW1wbGVcIixcbiAgICogICBsaW1pdDogMTAsXG4gICAqICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICogICBtYXhEZXB0aDogMlxuICAgKiB9KTtcbiAgICovXG4gIGFzeW5jIGltcG9ydEZyb21Tb3VyY2UoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEV4cGxvcmVXaXRoUmVsYXRpb25zT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgIGBJbXBvcnRpbmcgJHtlbnRpdHlOYW1lfSBmcm9tIHNvdXJjZSBEQiB3aXRoIG9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkoeyBzdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSwgbGltaXQ6IG9wdGlvbnMubGltaXQsIGluY2x1ZGVSZWxhdGlvbnM6IG9wdGlvbnMuaW5jbHVkZVJlbGF0aW9ucywgbWF4RGVwdGg6IG9wdGlvbnMubWF4RGVwdGggfSl9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAvLyAxLiBEYXRhRXhwbG9yZXLroZwgc291cmNlRGLsl5DshJwg642w7J207YSwIOyhsO2ajCAo6rSA66CoIOuNsOydtO2EsCDtj6ztlagpXG4gICAgY29uc3QgZXhwbG9yZVJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YUV4cGxvcmVyLmV4cGxvcmVXaXRoUmVsYXRpb25zKGVudGl0eU5hbWUsIG9wdGlvbnMpO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgRm91bmQgJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9ICR7ZW50aXR5TmFtZX0gcmVjb3JkcyBhbmQgJHtleHBsb3JlUmVzdWx0LnJlbGF0ZWQuc2l6ZX0gcmVsYXRlZCBlbnRpdGllc2AsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgLy8gMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICBjb25zdCBmaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAvLyDrqZTsnbggZW50aXR57J2YIHJlY29yZHPrpbwgRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICBjb25zdCBtYWluRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcykge1xuICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgICAgIG1haW5FbnRpdHksXG4gICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgIHsgX2RiOiB0aGlzLnNvdXJjZURiLCBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICk7XG4gICAgICBmaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgIH1cblxuICAgIC8vIOq0gOugqCBlbnRpdHnsnZggcmVjb3Jkc+ulvCBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGZvciAoY29uc3QgW3JlbGF0ZWRFbnRpdHlOYW1lLCByZWxhdGVkUmVjb3Jkc10gb2YgZXhwbG9yZVJlc3VsdC5yZWxhdGVkLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQocmVsYXRlZEVudGl0eU5hbWUpO1xuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVsYXRlZFJlY29yZHMpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgICAgICAgcmVsYXRlZEVudGl0eSxcbiAgICAgICAgICByZWNvcmQgYXMgeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB9LFxuICAgICAgICAgIHsgX2RiOiB0aGlzLnNvdXJjZURiLCBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICAgKTtcbiAgICAgICAgZml4dHVyZVJlY29yZHMucHVzaCguLi5yZWNvcmRzKTtcbiAgICAgIH1cblxuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgLSAke3JlbGF0ZWRFbnRpdHlOYW1lfTogJHtyZWxhdGVkUmVjb3Jkcy5sZW5ndGh9IHJlY29yZHNgKSk7XG4gICAgfVxuXG4gICAgLy8gMy4gdGFyZ2V0RGLsl5Ag7IK97J6FIChGaXh0dXJlTWFuYWdlcuqwgCDsnZjsobTshLEg7KCV66CsIOyymOumrClcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXModGhpcy50YXJnZXREYk5hbWUsIGZpeHR1cmVSZWNvcmRzKTtcblxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgIGBTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJHtyZXN1bHRzLmxlbmd0aH0gcmVjb3JkcyB0byAke3RoaXMudGFyZ2V0RGJOYW1lfSAoJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9ICR7ZW50aXR5TmFtZX0gKyAke3Jlc3VsdHMubGVuZ3RoIC0gZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSByZWxhdGVkKWAsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjaGFsayIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNUZXN0IiwiRGF0YUV4cGxvcmVyIiwiZmFrZXJNYXBwaW5ncyIsIkZpeHR1cmVNYW5hZ2VyIiwiRml4dHVyZUdlbmVyYXRvciIsImRhdGFFeHBsb3JlciIsImxvY2FsZSIsIm1hcHBpbmdzIiwibGxtQ2FjaGUiLCJNYXAiLCJlbnRpdHlDYWNoZSIsIm9wdGlvbnMiLCJzb3VyY2VEYiIsIl90YXJnZXREYiIsInRhcmdldERiTmFtZSIsImVudGl0eU1hbmFnZXIiLCJ1c2VMTE0iLCJlbmFibGVMTE1DYWNoZSIsImxsbU1vZGVsIiwiZ2VuZXJhdGUiLCJlbnRpdHlOYW1lIiwib3ZlcnJpZGVzIiwiY29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJlbnRpdHkiLCJnZXQiLCJzZXQiLCJ0ZW1wSWQiLCJEYXRlIiwibm93Iiwicm93S2V5IiwidW5kZWZpbmVkIiwiZml4dHVyZSIsInByb3AiLCJwcm9wcyIsInZpcnR1YWwiLCJuYW1lIiwiY29uZSIsImZpeHR1cmVTdHJhdGVneSIsInR5cGUiLCJmYWtlciIsIl9mYWtlciIsInN0cmluZyIsImFscGhhbnVtZXJpYyIsInV1aWQiLCJma0NvbE5hbWUiLCJoYXNKb2luQ29sdW1uIiwicmVsYXRpb25WYWx1ZSIsImdlbmVyYXRlUmVsYXRpb25WYWx1ZSIsIm5vdGUiLCJsbG1WYWx1ZSIsImdlbmVyYXRlV2l0aExMTSIsImxlbmd0aCIsInNsaWNlIiwiZXJyb3IiLCJjb25zb2xlIiwid2FybiIsImlkIiwiRXJyb3IiLCJtZXNzYWdlIiwiZml4dHVyZUdlbmVyYXRvciIsImV4ZWN1dGVHZW5lcmF0b3IiLCJmaXh0dXJlRGVmYXVsdCIsImdlbmVyYXRlRGVmYXVsdFZhbHVlIiwiZW1haWwiLCJuYW1lVmFsdWUiLCJ1c2VybmFtZSIsImZ1bGxfbmFtZSIsIm5hbWVfZW4iLCJkb21haW4iLCJzcGxpdCIsInJvbWFuaXplZCIsInJvbWFuaXplTmFtZSIsInBhc3N3b3JkIiwiYmNyeXB0IiwiaGFzaCIsImZpeHR1cmVzIiwiZGF0YVNvdXJjZSIsImNhY2hlS2V5Iiwid2l0aCIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZWZlcmVuY2VDYWNoZSIsImhhcyIsImV4cGxvcmVSZXN1bHQiLCJleHBsb3JlV2l0aFJlbGF0aW9ucyIsInN0cmF0ZWd5IiwibGltaXQiLCJjb25maWciLCJpbmNsdWRlUmVsYXRpb25zIiwibWF4RGVwdGgiLCJtYWluIiwicmVjb3JkcyIsImltcG9ydEV4cGxvcmVSZXN1bHQiLCJjYW5kaWRhdGVzIiwic2VsZWN0ZWQiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJhdXRvS2V5IiwiYXV0b0V4cGxvcmVSZXN1bHQiLCJhdXRvQ2FuZGlkYXRlcyIsIm51bGxhYmxlIiwiYWxsRml4dHVyZVJlY29yZHMiLCJlbnRpdHlJZCIsInJlbGF0ZWQiLCJlbnRyaWVzIiwicmVjb3Jkc1RvSW1wb3J0IiwibG9nIiwiY3lhbiIsInJlY29yZCIsInJlY29yZEtleSIsImltcG9ydGVkUmVjb3JkcyIsInB1c2giLCJhZGQiLCJncmF5IiwiZml4dHVyZVJlY29yZHMiLCJjcmVhdGVGaXh0dXJlUmVjb3JkIiwiX2RiIiwic2luZ2xlUmVjb3JkIiwibWFpbkVudGl0eSIsIm1haW5SZWNvcmRzVG9JbXBvcnQiLCJpbnNlcnRGaXh0dXJlcyIsImdyZWVuIiwic2l6ZSIsImdlbmVyYXRvciIsInN0YXJ0c1dpdGgiLCJpc05hbWVGaWVsZCIsImZha2VyTW9kdWxlIiwiZmFrZXJLTyIsImV4cHIiLCJtYXRjaCIsInBhdGgiLCJhcmdzU3RyIiwicGFydHMiLCJmbiIsInBhcnQiLCJhcmdzIiwidHJpbSIsInBhcnNlR2VuZXJhdG9yQXJncyIsInllbGxvdyIsImZha2VySkEiLCJsb2NhbGVGYWtlciIsImRlcGFydG1lbnRzIiwicHJlZml4ZXMiLCJzdWZmaXhlcyIsImRlcHQiLCJoZWxwZXJzIiwiYXJyYXlFbGVtZW50IiwicHJlZml4Iiwic3VmZml4IiwibG9jYWxlTWFwcGluZ3MiLCJlbiIsIm5vcm1hbGl6ZWROYW1lIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwicGF0dGVybiIsIk9iamVjdCIsImZpZWxkX3BhdHRlcm5zIiwiaW5jbHVkZXMiLCJleGVjdXRlRmFrZXJFeHByZXNzaW9uIiwiZW5kc1dpdGgiLCJnZW5lcmF0ZUFycmF5VmFsdWUiLCJlbnVtVmFsdWVzIiwiQXJyYXkiLCJpc0FycmF5IiwiZW51bSIsImVudW1MYWJlbHMiLCJrZXlzIiwidHlwZURlZmF1bHQiLCJ0eXBlX2RlZmF1bHRzIiwibG9yZW0iLCJ3b3JkcyIsIm51bWJlciIsImludCIsIm1pbiIsIm1heCIsImJpZ0ludCIsImZsb2F0IiwiZGF0YXR5cGUiLCJib29sZWFuIiwiZGF0ZSIsInBhc3QiLCJfZW50aXR5IiwiX2xvY2FsZUZha2VyIiwiY291bnQiLCJmcm9tIiwidXJsIiwiaW1hZ2UiLCJzeXN0ZW0iLCJmaWxlTmFtZSIsIm1pbWVfdHlwZSIsImludGVybmV0Iiwid29yZCIsImV4cHJlc3Npb24iLCJwYXJzZSIsImZha2VyTmFtZSIsInNlbGVjdGVkRmFrZXIiLCJmdW5jTWF0Y2giLCJmaXh0dXJlSGludCIsInJvd0NhY2hlS2V5IiwibGxtUHJvcHMiLCJmaWx0ZXIiLCJwIiwiZ2VuZXJhdGVTaW5nbGVXaXRoTExNIiwiYXBpS2V5IiwiZ2V0QXBpS2V5IiwiY3JlYXRlQW50aHJvcGljIiwiZ2VuZXJhdGVUZXh0Iiwicm93UmVzcG9uc2UiLCJtb2RlbCIsInByb21wdCIsImJ1aWxkUm93TExNUHJvbXB0IiwidGV4dCIsInJvd1Jlc3VsdCIsInBhcnNlUm93TExNUmVzcG9uc2UiLCJmaWVsZE5hbWUiLCJ2YWx1ZSIsInNpbmdsZVJlc3BvbnNlIiwiYnVpbGRMTE1Qcm9tcHQiLCJwYXJzZUxMTVJlc3BvbnNlIiwibGFuZ3VhZ2UiLCJmaWVsZERlc2NyaXB0aW9ucyIsIm1hcCIsImRlc2MiLCJ2YWx1ZXMiLCJqb2luIiwib3RoZXJQcm9wcyIsIm90aGVyUHJvcHNDb250ZXh0Iiwib3V0cHV0U2hhcGUiLCJlbnRpdHlDb250ZXh0IiwianNvblRleHQiLCJwYXJzZWQiLCJyYXciLCJyZXN1bHQiLCJTdHJpbmciLCJoaW50Iiwib3RoZXJGaWVsZHMiLCJvdGhlckZpZWxkc0NvbnRleHQiLCJnZXRFeHBlY3RlZEZvcm1hdCIsImdldEV4YW1wbGVGb3JUeXBlIiwicHJvcFR5cGUiLCJjbGVhbmVkIiwiYmFzZVR5cGUiLCJpdGVtIiwiZ2V0RGVmYXVsdFZhbHVlRm9yVHlwZSIsInBhcnNlU2NhbGFyVmFsdWUiLCJudW0iLCJwYXJzZUludCIsIk51bWJlciIsImlzTmFOIiwiQmlnSW50IiwicGFyc2VGbG9hdCIsImdldFRpbWUiLCJwcm9wTmFtZSIsImpzb25TdHIiLCJjb252ZXJ0SnNMaXRlcmFsVG9Kc29uIiwidHJpbW1lZCIsImlucHV0Iiwid2l0aERvdWJsZVF1b3RlcyIsIl8iLCJjb250ZW50IiwiU29uYW11IiwicmVxdWlyZSIsInNlY3JldHMiLCJhbnRocm9waWNfYXBpX2tleSIsInByb2Nlc3MiLCJlbnYiLCJBTlRIUk9QSUNfQVBJX0tFWSIsImJhc2VGb3JtYXQiLCJnZXRTY2FsYXJGb3JtYXQiLCJiYXNlRXhhbXBsZSIsImdldFNjYWxhckV4YW1wbGUiLCJpc0tvcmVhbiIsInRlc3QiLCJyb21hbml6ZUtvcmVhbk5hbWUiLCJDSE9TRU9ORyIsIkpVTkdTRU9ORyIsIkpPTkdTRU9ORyIsInJvbWFuaXplIiwiY2hhciIsImNvZGUiLCJjaGFyQ29kZUF0Iiwib2Zmc2V0IiwiY2hvIiwianVuZyIsImpvbmciLCJjaGFycyIsImZhbWlseU5hbWUiLCJnaXZlbk5hbWUiLCJnZXRMTE1DYWNoZVN0YXRzIiwiZW5hYmxlZCIsImNsZWFyTExNQ2FjaGUiLCJjbGVhciIsIlNldCIsImdlbmVyYXRlQmF0Y2giLCJzcGVjcyIsImdlbmVyYXRlZEZpeHR1cmVzIiwic3BlYyIsInNwZWNFbnRpdHkiLCJwYXJlbnRJZCIsImlkUHJvcCIsImZpbmQiLCJwYXJlbnRPdmVycmlkZXMiLCJmaXh0dXJlUGFyZW50T3ZlcnJpZGVzIiwicGFyZW50RW50aXR5IiwicXVlcnkiLCJ0YWJsZSIsInNlbGVjdCIsImNvbCIsInZhbCIsIndoZXJlIiwibGVmdEpvaW4iLCJ3aGVyZU51bGwiLCJyb3dzIiwiYXZhaWxhYmxlSWRzIiwiciIsImRhdGEiLCJleHBsaWNpdElkIiwiaSIsInVzZXNTZXF1ZW5jZSIsImRhdGFGb3JSZWNvcmQiLCJyZXN1bHRzIiwiY29tcGFuaW9uUmVzdWx0cyIsImdlbmVyYXRlQ29tcGFuaW9ucyIsInRvdGFsIiwicGFyZW50UmVzdWx0cyIsImFsbFJlc3VsdHMiLCJwcm9jZXNzZWRFbnRpdGllcyIsImNvbXBhbmlvbnMiLCJmaXh0dXJlQ29tcGFuaW9ucyIsImVudGl0eVJlc3VsdHMiLCJjb21wYW5pb24iLCJjb21wYW5pb25FbnRpdHkiLCJma1Byb3AiLCJjb21wYW5pb25JZFByb3AiLCJjb21wYW5pb25Db3VudCIsImNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzIiwicGFyZW50UmVzdWx0IiwicmVzb2x2ZWRPdmVycmlkZXMiLCJyZXNvbHZlVGVtcGxhdGVPdmVycmlkZXMiLCJwYXJlbnREYXRhIiwicmVzb2x2ZWQiLCJrZXkiLCJpbXBvcnRGcm9tU291cmNlIiwiYmx1ZSIsInJlbGF0ZWRFbnRpdHlOYW1lIiwicmVsYXRlZFJlY29yZHMiLCJyZWxhdGVkRW50aXR5Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFLMUIsU0FBU0MsMEJBQTBCLEVBQUVDLHNCQUFzQixFQUFFQyxjQUFjLFFBQVEsb0JBQWlCO0FBQ3BHLFNBQVNDLE1BQU0sUUFBUSx5QkFBc0I7QUFDN0MsU0FDRUMsWUFBWSxRQUdQLHFCQUFrQjtBQUN6QixTQUE2QkMsYUFBYSxRQUFRLHNCQUFtQjtBQUNyRSxTQUFTQyxjQUFjLFFBQVEsdUJBQW9CO0FBc0JuRCxPQUFPLE1BQU1DOzs7O0lBQ0hDLGFBQTJCO0lBQzNCQyxPQUFlO0lBQ2ZDLFNBQXdCO0lBQ3hCQyxXQUFpQyxJQUFJQyxNQUFNO0lBQzNDQyxjQUFtQyxJQUFJRCxNQUFNO0lBQzdDRSxRQUFpQztJQUV6QyxZQUNFLEFBQVFDLFFBQWMsRUFDdEIsaUVBQWlFO0lBQ2pFLGdDQUFnQztJQUNoQ0MsU0FBZSxFQUNmLEFBQVFDLFlBQXNELEVBQzlELEFBQVFDLGFBQW1DLEVBQzNDSixPQUFpQyxD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