@myop/sdk 0.3.24 → 0.3.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.
Files changed (41) hide show
  1. package/dist/bundled-declarations.d.ts +23 -0
  2. package/dist/cjs/_IframeSDK.8724e6a9.min.js +1 -0
  3. package/dist/cjs/{_IframeSDK.398c9caf.js → _IframeSDK.f8e27dc0.js} +63 -14
  4. package/dist/cjs/_IframeSDK.f8e27dc0.js.map +7 -0
  5. package/dist/cjs/_MyopHelpers.6fb8c382.min.js +1 -0
  6. package/dist/cjs/{_MyopHelpers.71a8a09b.js → _MyopHelpers.859b9bc8.js} +37 -0
  7. package/dist/cjs/{_MyopHelpers.71a8a09b.js.map → _MyopHelpers.859b9bc8.js.map} +2 -2
  8. package/dist/cjs/_WebComponentSDK.9222ca02.min.js +1 -0
  9. package/dist/cjs/{_WebComponentSDK.c8c6ebc0.js → _WebComponentSDK.f8bc2f3a.js} +63 -14
  10. package/dist/cjs/{_WebComponentSDK.c8c6ebc0.js.map → _WebComponentSDK.f8bc2f3a.js.map} +2 -2
  11. package/dist/cjs/{_hostSDK.6d5f8f31.js → _hostSDK.9c5e7767.js} +63 -14
  12. package/dist/cjs/_hostSDK.9c5e7767.js.map +7 -0
  13. package/dist/cjs/_hostSDK.e2851f6a.min.js +1 -0
  14. package/dist/cjs/myop_sdk.js +14 -14
  15. package/dist/cjs/myop_sdk.js.map +1 -1
  16. package/dist/cjs/myop_sdk.min.js +1 -1
  17. package/dist/cjs-bundled/myop_sdk.bundled.js +70 -16
  18. package/dist/cjs-bundled/myop_sdk.bundled.js.map +3 -3
  19. package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
  20. package/dist/module/Iframe/index.js +64 -15
  21. package/dist/module/Iframe/index.js.map +2 -2
  22. package/dist/module/SDK.js +70 -16
  23. package/dist/module/SDK.js.map +3 -3
  24. package/dist/module/embeddedSDK.js +1 -1
  25. package/dist/module/helpers/CloudRepository.d.ts +14 -0
  26. package/dist/module/helpers/cloudRepositoryHelpers.d.ts +1 -0
  27. package/dist/module/helpers/index.js +37 -1
  28. package/dist/module/helpers/index.js.map +2 -2
  29. package/dist/module/host/embeddedSDK.js +1 -1
  30. package/dist/module/host/hostSDK.d.ts +8 -0
  31. package/dist/module/host/index.js +64 -15
  32. package/dist/module/host/index.js.map +2 -2
  33. package/dist/module/webcomponent/index.js +64 -15
  34. package/dist/module/webcomponent/index.js.map +2 -2
  35. package/package.json +1 -1
  36. package/dist/cjs/_IframeSDK.398c9caf.js.map +0 -7
  37. package/dist/cjs/_IframeSDK.b1090eff.min.js +0 -1
  38. package/dist/cjs/_MyopHelpers.19dc0df3.min.js +0 -1
  39. package/dist/cjs/_WebComponentSDK.fc58ea5a.min.js +0 -1
  40. package/dist/cjs/_hostSDK.2c80162b.min.js +0 -1
  41. package/dist/cjs/_hostSDK.6d5f8f31.js.map +0 -7
@@ -410,6 +410,7 @@ var _CloudRepository = class _CloudRepository {
410
410
  constructor(_baseUrl = "https://cloud.myop.dev") {
411
411
  this._baseUrl = _baseUrl;
412
412
  // v2 cache - keyed by componentId:env:preview|live
413
+ // Each Promise is tagged with a `resolved` property after settling (see fetchComponentV2).
413
414
  __publicField(this, "variants", {});
414
415
  // Track which components were preloaded and with what params
415
416
  // Key: componentId, Value: { env, preview }
@@ -511,6 +512,7 @@ var _CloudRepository = class _CloudRepository {
511
512
  return;
512
513
  }
513
514
  const componentConfig = convertV2VariantToComponentConfig(variant);
515
+ this.variants[cacheKey].resolved = componentConfig;
514
516
  resolve(componentConfig);
515
517
  } catch (e) {
516
518
  reject(e);
@@ -521,6 +523,36 @@ var _CloudRepository = class _CloudRepository {
521
523
  return yield this.variants[cacheKey];
522
524
  });
523
525
  }
526
+ /**
527
+ * Synchronous version of fetchComponentV2 — returns the config only if
528
+ * the fetch already completed, null otherwise.
529
+ *
530
+ * Uses the same `this.variants` cache that fetchComponentV2/preloadComponents
531
+ * populate. Each cached Promise is tagged with a `.resolved` property when
532
+ * it settles — this method just reads that property. No separate cache.
533
+ *
534
+ * Why this exists: React Native needs the config at render time to embed it
535
+ * in the WebView HTML (can't await in useState). If preloadComponents ran
536
+ * earlier and the fetch completed, this returns the result synchronously,
537
+ * skipping the WEBVIEW_READY → fetch → inject round trip entirely.
538
+ */
539
+ getResolvedConfig(componentId, env, preview) {
540
+ var _a;
541
+ const preloaded = this.preloadedComponents[componentId];
542
+ const hasExplicitParams = env !== void 0 || preview !== void 0;
543
+ let resolvedEnv;
544
+ let usePreview;
545
+ if (!hasExplicitParams && preloaded) {
546
+ resolvedEnv = preloaded.env;
547
+ usePreview = preloaded.preview;
548
+ } else {
549
+ resolvedEnv = env || this._defaultEnv;
550
+ const hasEffectiveEnv = env || this._envExplicitlySet;
551
+ usePreview = preview === true ? true : preview === false ? false : !hasEffectiveEnv;
552
+ }
553
+ const cacheKey = `${componentId}:${resolvedEnv}:${usePreview ? "preview" : "live"}`;
554
+ return ((_a = this.variants[cacheKey]) == null ? void 0 : _a.resolved) || null;
555
+ }
524
556
  // ============ V1 Methods (Legacy) ============
525
557
  /**
526
558
  * Fetch a v1 component from a flow
@@ -617,6 +649,9 @@ var setCloudRepository = (repository) => {
617
649
  var setEnvironment = (env) => {
618
650
  _cloudRepository.setEnvironment(env);
619
651
  };
652
+ var getResolvedConfig = (componentId, env, preview) => {
653
+ return _cloudRepository.getResolvedConfig(componentId, env, preview);
654
+ };
620
655
  var preloadComponents = (ids, env, preview) => __async(void 0, null, function* () {
621
656
  return Promise.allSettled(
622
657
  ids.map((id) => _cloudRepository.fetchComponentV2(id, env, preview))
@@ -635,6 +670,7 @@ export {
635
670
  exec,
636
671
  getCloudRepository,
637
672
  getPreloadedParams,
673
+ getResolvedConfig,
638
674
  isPreloaded,
639
675
  preloadComponents,
640
676
  removeClass,
@@ -643,4 +679,4 @@ export {
643
679
  setEnvironment,
644
680
  v2_CloudRepository
645
681
  };
646
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Jhc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9FeGVjdXRlU2NyaXB0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3VzdG9tUmVmTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL0Nsb3VkUmVwb3NpdG9yeS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9leGVjLnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vVE9ETyA6IHJldXNlIGZyb20gb25lIHBsYWNlLlxuLy8gbmVlZHMgdG8gYmUgdXNlZCBpbiBteW9wLXNkaywgbXlvcC1kYXNoYmFvcmQsIG15b3Atc2VydmVyLCBteW9wLWNsaSAuLlxuXG5leHBvcnQgY29uc3QgdXVpZHY0ID0gKCkgPT4ge1xuICAgIHJldHVybiBcIjEwMDAwMDAwLTEwMDAtNDAwMC04MDAwLTEwMDAwMDAwMDAwMFwiLnJlcGxhY2UoL1swMThdL2csIGMgPT5cbiAgICAgICAgKCtjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiArYyAvIDQpLnRvU3RyaW5nKDE2KVxuICAgICk7XG59XG5cbi8vIENvbnZlcnQgVVVJRCBzdHJpbmcgdG8gYnl0ZXNcbmV4cG9ydCBjb25zdCB1dWlkVG9CeXRlcyA9ICh1dWlkOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKFxuICAgICAgICB1dWlkLnJlcGxhY2UoLy0vZywgJycpLm1hdGNoKC8uezEsMn0vZykhLm1hcChieXRlID0+IHBhcnNlSW50KGJ5dGUsIDE2KSlcbiAgICApO1xufTtcblxuLy8gQ29udmVydCBieXRlcyB0byBVVUlEIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGJ5dGVzVG9VdWlkID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBoZXggPSBbLi4uYnl0ZXNdLm1hcChiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGhleC5zbGljZSgwLCA4KSxcbiAgICAgICAgaGV4LnNsaWNlKDgsIDEyKSxcbiAgICAgICAgaGV4LnNsaWNlKDEyLCAxNiksXG4gICAgICAgIGhleC5zbGljZSgxNiwgMjApLFxuICAgICAgICBoZXguc2xpY2UoMjApXG4gICAgXS5qb2luKCctJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZW5jb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRW5jb2RlID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMpKTtcbiAgICByZXR1cm4gYmFzZTY0LnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoLz0rJC8sICcnKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBkZWNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxEZWNvZGUgPSAoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICBsZXQgYmFzZTY0ID0gc3RyLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgd2hpbGUgKGJhc2U2NC5sZW5ndGggJSA0KSBiYXNlNjQgKz0gJz0nO1xuICAgIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGJpbmFyeSwgY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpO1xufTtcblxuLy8gQ29tcHJlc3MgYW4gYXJyYXkgb2YgVVVJRHMgaW50byBhIHNob3J0IFVSTC1zYWZlIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGNvbXByZXNzVVVJRHMgPSAodXVpZHM6IHN0cmluZ1tdKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBhbGxCeXRlcyA9IHV1aWRzLmZsYXRNYXAodXVpZCA9PiBBcnJheS5mcm9tKHV1aWRUb0J5dGVzKHV1aWQpKSk7XG4gICAgcmV0dXJuIGJhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShhbGxCeXRlcykpO1xufTtcblxuLy8gRGVjb21wcmVzcyBmcm9tIFVSTC1zYWZlIHN0cmluZyBiYWNrIHRvIGFuIGFycmF5IG9mIFVVSURzXG5leHBvcnQgY29uc3QgZGVjb21wcmVzc1VVSURzID0gKGVuY29kZWQ6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGJhc2U2NFVybERlY29kZShlbmNvZGVkKTtcbiAgICBpZiAoYnl0ZXMubGVuZ3RoICUgMTYgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCBsZW5ndGgnKTtcblxuICAgIGNvbnN0IHV1aWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgICAgIHV1aWRzLnB1c2goYnl0ZXNUb1V1aWQoYnl0ZXMuc2xpY2UoaSwgaSArIDE2KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZHM7XG59O1xuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSAqIGFzIENTUyBmcm9tIFwiY3NzdHlwZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG4vLyBpZ25vcmluZyBkb2N1bWVudGF0aW9uXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGludGVyZmFjZSBDU1NQcm9wZXJ0aWVzIGV4dGVuZHMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiB7XG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlc2hlZXREZWZpbml0aW9uID0geyBba2V5OiBzdHJpbmddOiBDU1NQcm9wZXJ0aWVzIH07XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXQgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgc3R5bGVzaGVldDogU3R5bGVzaGVldERlZmluaXRpb24sIGNzcz86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfc3R5bGVzaGVldCwgX3RhZ0lkLCBfY3NzfSkgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlVGFnLnR5cGUgPSAndGV4dC9jc3MnO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBDU1Mgc3RyaW5nIGZyb20gdGhlIHN0eWxlcyBvYmplY3RcbiAgICAgICAgbGV0IGNzc1N0cmluZyA9IF9jc3M7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBpbiBfc3R5bGVzaGVldCkge1xuICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3NlbGVjdG9yfSB7IGA7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gX3N0eWxlc2hlZXRbc2VsZWN0b3JdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3Byb3BlcnR5fTogJHtwcm9wZXJ0aWVzW3Byb3BlcnR5XX07IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gJ30gJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgQ1NTIHN0cmluZyBhcyB0aGUgY29udGVudCBvZiB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIHN0eWxlVGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1N0cmluZykpO1xuICAgICAgICBzdHlsZVRhZy5pZCA9IF90YWdJZDtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuXG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX3N0eWxlc2hlZXQ6IHN0eWxlc2hlZXQsXG4gICAgICAgIF9jc3MgOiBjc3MgPyBjc3MgOiAnJyxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0TGluayA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBsaW5rOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkLCBfbGlua30pID0+IHtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlkID0gX3RhZ0lkO1xuICAgICAgICBsaW5rRWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBfbGluaztcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9saW5rIDogbGluayxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgVG9rZW5NYXAgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8IG51bWJlcj5cblxuY29uc3QgcmVwbGFjZVRva2VucyA9IChpbnB1dDogc3RyaW5nLCB0b2tlbk1hcDogVG9rZW5NYXApOiBzdHJpbmcgPT4ge1xuICAgIC8vIENyZWF0ZSBhIHJlZ2V4IHBhdHRlcm4gZnJvbSB0aGUga2V5cyBvZiB0aGUgdG9rZW5NYXBcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyh0b2tlbk1hcCkuam9pbignfCcpLCAnZycpO1xuXG4gICAgLy8gUmVwbGFjZSB0b2tlbnMgaW4gdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcmVnZXhcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShwYXR0ZXJuLCAobWF0Y2hlZCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZyb20gdGhlIHRva2VuTWFwXG4gICAgICAgIHJldHVybiAodG9rZW5NYXBbbWF0Y2hlZF0gfHwgbWF0Y2hlZCkudG9TdHJpbmcoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplciA9IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnLCB0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICBjb25zdCB0eXBlZFNraW5Db25maWcgPSAoc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKVxuICAgIGlmICh0eXBlZFNraW5Db25maWcudHlwZSAhPT0gJ0lmcmFtZUxvYWRlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZnJhbWVTa2luVXJsVG9rZW5pemVyIHJlY2VpdmVkIHNraW4gd2l0aCBsb2FkZXIgdHlwZSBcIiR7dHlwZWRTa2luQ29uZmlnLnR5cGV9XCIsIGN1cnJlbnRseSBvbmx5IFwiSWZyYW1lTG9hZGVyXCIgaXMgc3VwcG9ydGVkYClcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyID0ge1xuICAgICAgICAuLi5zZWxlY3RlZFNraW4ubG9hZGVyXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlci51cmwgPSByZXBsYWNlVG9rZW5zKHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsLCB0b2tlbk1hcCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRTa2luO1xufVxuXG5leHBvcnQgY29uc3QgY2hhbmdlU2tpblVybEJ5VG9rZW5pemVyID0gKHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIHJldHVybiBhc3luYyAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyKHNlbGVjdGVkU2tpbiwgdG9rZW5NYXApO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtDdXN0b21SZWZNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5cbi8vIGNvbnN0IHNwYWNlID0gJyAnO1xuLy8gZXhwb3J0IGNvbnN0IGdldENsYXNzZXMgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiAoYXdhaXQgZXhlYyhhY3RBczxIVE1MRGl2RWxlbWVudD4oY29ubmVjdGVkUmVmKS5jbGFzc0xpc3QpKS52YWx1ZS5zcGxpdChzcGFjZSk7XG4vLyBleHBvcnQgY29uc3QgYWRkQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICBjbGFzc2VzLmluY2x1ZGVzKGNsYXNzTmFtZSkgfHwgY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy8gZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZywpID0+IHtcbi8vICAgICBsZXQgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuZmlsdGVyKGMgPT4gYyAhPT0gY2xhc3NOYW1lKS5qb2luKHNwYWNlKTtcbi8vIH1cbi8vXG4vL1xuXG5leHBvcnQgY29uc3QgYWRkQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LmFkZChfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QucmVtb3ZlKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn0iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZywgSUhUTUxMb2FkZXJDb25maWcsIElSZWZDb25maWcsXG4gICAgSVNraW5Mb2FkZXJDb25maWcsXG4gICAgSVNraW5TZWxlY3RvckNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSVNraW5Db25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2tpbkNvbmZpZyBpbXBsZW1lbnRzIElTa2luQ29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2tpbkNvbmZpZygpO1xuICAgIH1cblxuICAgIGlkID0gdGhpcy5fcnVuVGltZUlkO1xuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZTtcbiAgICBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGxvYWRlciA9IG51bGwgYXMgdW5rbm93biBhcyBJU2tpbkxvYWRlckNvbmZpZztcblxuICAgIHdpdGhMb2FkZXIgPSAobG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEhUTUxMb2FkZXIgPSAobG9hZGVyOiBPbWl0PElIVE1MTG9hZGVyQ29uZmlnLCAndHlwZSc+KSA9PiB7XG4gICAgICAgIGxvYWRlci50eXBlID0gJ0hUTUxMb2FkZXInO1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbmZpZyBpbXBsZW1lbnRzIElDb21wb25lbnRDb25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDb25maWcoKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJbnN0YW5jZUlkLFxuICAgICAgICBjb21wb25lbnRJZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBjb21wb25lbnROYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgc2tpblNlbGVjdG9yOiBudWxsIGFzIHVua25vd24gYXMgSVNraW5TZWxlY3RvckNvbmZpZ1xuICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnO1xuXG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lXG4gICAgdHlwZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgbmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgc2tpbnM6IFtdLFxuICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIHdpdGhJbnN0YW5jZSA9IChpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFR5cGUgPSAodHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhEZWZhdWx0U2tpbiA9IChkZWZhdWx0U2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnNraW5zLnB1c2goZGVmYXVsdFNraW4pO1xuICAgICAgICB0aGlzLnR5cGUuZGVmYXVsdFNraW4gPSB0aGlzLnR5cGUuc2tpbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICBpZDogZGVmYXVsdFNraW4uaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhSZWYgPSAocmVmOiBJUmVmQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEJhc2ljUmVmID0gKHJlZlNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmFzaWNSZWYgPSB7XG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBuYW1lOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICBzZWxlY3RvcjogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElSZWZDb25maWdcblxuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKG5ld0Jhc2ljUmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0ICogZnJvbSAnLi9NeW9wRWxlbWVudFJlZic7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2VNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0Jhc2VNeW9wU0RLJztcblxuZXhwb3J0IHR5cGUgQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VD4gPSB7IFtrZXk6IHN0cmluZ106IFQ7IH07XG5cbi8vZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSAnSWZyYW1lTG9hZGVyJyB8ICdXZWJDb21wb25lbnRMb2FkZXInIHwgJ0hUTUxMb2FkZXInIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgU2tpbkxvYWRlcnMgPSB7XG4gICAgXCJJZnJhbWVMb2FkZXJcIjogXCJJZnJhbWVMb2FkZXJcIixcbiAgICBcIldlYkNvbXBvbmVudExvYWRlclwiOiBcIldlYkNvbXBvbmVudExvYWRlclwiLFxuICAgIFwiSFRNTExvYWRlclwiOiBcIkhUTUxMb2FkZXJcIixcbiAgICBcIk1pbmltaXplZExvYWRlclwiOiBcIk1pbmltaXplZExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xufVxuXG4vL2ZvciBpbnRlcm5hbCBkYXNoYm9hcmQgdXNhZ2VcbmV4cG9ydCBpbnRlcmZhY2UgSU1pbmltaXplZExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIk1pbmltaXplZExvYWRlclwiO1xufVxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkT2JqZWN0IHtcbiAgICBfdGVtcF9jbGllbnRfaWQ/OiBzdHJpbmcsXG59XG5cbnR5cGUgRXh0ZW5kPFQsIFU+ID0gVCAmIFU7XG5cbnR5cGUgRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgRV06IEVbS107XG59ICYge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgID8gRXh0ZW5kUmVjdXJzaXZlbHk8VFtLXSwgRT5cbiAgICAgICAgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgSURhc2hib2FyZDxUPiA9IEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIERhc2hib2FyZE9iamVjdD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlXG5cbiAgICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVJlbGVhc2VNZXRhZGF0YSB7XG4gICAgZW52aXJvbm1lbnRJZDogc3RyaW5nO1xuICAgIGVudmlyb25tZW50SWRlbnRpZmllcjogc3RyaW5nO1xuICAgIC8vXG4gICAgLy8gdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgLy8gdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVZhcmlhbnRDb25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICByZWxlYXNlcz86IHYyX0lSZWxlYXNlTWV0YWRhdGFbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JU2tpbkNvbmZpZyBleHRlbmRzIElTa2luQ29uZmlnIHtcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpbmRNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgY29uc3QgUHJvcE1lc3NhZ2VNb2RlcyA9IHtcbiAgICBcImlucHV0XCI6IFwiaW5wdXRcIixcbiAgICBcIm91dHB1dFwiOiBcIm91dHB1dFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMgPSB7XG4gICAgXCJtZXNzYWdlXCI6IFwibWVzc2FnZVwiLFxuICAgIFwiY29kZVwiOiBcImNvZGVcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtIHtcbiAgICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFByb3BDb25maWdCZWhhdmlvclR5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb2RlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcImNvZGVcIlxuICAgIHJlbWFwPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIlxuICAgIG1lc3NhZ2U6IE15b3BNZXNzYWdlS2V5XG4gICAgcmVmOiBzdHJpbmcsIC8vVE9ETyBtYWtlIGl0IGlkXG4gICAgcGFyYW1zOiBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtW11cbiAgICBtb2RlOiBrZXlvZiB0eXBlb2YgUHJvcE1lc3NhZ2VNb2Rlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgYmVoYXZpb3I6IElQcm9wQmVoYXZpb3Jcbn1cblxuXG5leHBvcnQgY2xhc3MgUmVmQmVoYXZpb3JUeXBlIHtcbiAgICBzdGF0aWMgY29kZSA9ICdjb2RlJyBhcyBjb25zdFxuICAgIHN0YXRpYyBjb21wb25lbnQgPSAnY29tcG9uZW50JyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBJUmVmQmVoYXZpb3JUeXBlID0gJ2NvZGUnIHwgJ2NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiBJUmVmQmVoYXZpb3JUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29tcG9uZW50J1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogUHJvcGVydHkgaW5zdGFuY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvZGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBzZWxlY3RvclR5cGU6IFJlZlNlbGVjdG9yVHlwZVxuICAgIHNlbGVjdG9yOiBzdHJpbmdcbiAgICBiZWhhdmlvcjogSVJlZkJlaGF2aW9yXG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlIHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJjZW50YWdlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdCB7XG4gICAgdmVyc2lvbnM6IElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb25bXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBydWxlczogSUV4cGVyaWVuY2VTZWdtZW50UnVsZVtdO1xuICAgIHVzZUFiOiBib29sZWFuO1xuICAgIGNvbXBvbmVudFZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgICBhYlNwbGl0PzogSUV4cGVyaWVuY2VBQlNwbGl0O1xuICAgIHN0aWNreVByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIGRlZmluaXRpb24gY29uZmlnICh2MilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZURlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRHMgKi9cbiAgICBjb21wb25lbnRzOiBzdHJpbmdbXTtcbiAgICAvKiogU2VnbWVudCBjb25maWd1cmF0aW9ucyAqL1xuICAgIHNlZ21lbnRzOiBJRXhwZXJpZW5jZVNlZ21lbnRbXTtcbiAgICAvKiogRmFsbGJhY2sgdmFyaWFudCBwZXIgY29tcG9uZW50ICovXG4gICAgZmFsbGJhY2s6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgLyoqIFRhZ3MgKi9cbiAgICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAvLyBwcm9wczogUmVjb3JkPHN0cmluZywgSVByb3BDb25maWc+IC8vaWQgLSB0eXBlXG4gICAgLy8gcmVmczogUmVjb3JkPHN0cmluZywgSVJlZkNvbmZpZz4sXG4gICAgLy8gc2tpbnM6IFJlY29yZDxzdHJpbmcsIElTa2luQ29uZmlnPlxuICAgIHByb3BzOiBJUHJvcENvbmZpZ1tdLFxuICAgIHJlZnM6IElSZWZDb25maWdbXSxcbiAgICBza2luczogSVNraW5Db25maWdbXSxcbiAgICBkZWZhdWx0U2tpbjogbnVtYmVyO1xuXG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIC8vcmVzb2x2ZWREZWZpbml0aW9ucz86IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnW11cbiAgICAvL1RPRE8gOiBtb3ZlIHRvIGJhc2UgY2xhc3MgKCBJU3RvcmFibGVJdGVtIG9yIHNvLi4uKVxuXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSU15b3BTdG9yZWRPYmplY3QgZXh0ZW5kcyB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudEFjY2VzcyB7XG4gICAgdmlzaWJpbGl0eTogJ3ByaXZhdGUnIHwgJ3VubGlzdGVkJyB8ICdwdWJsaWMnO1xuICAgIHVubGlzdGVkPzoge1xuICAgICAgICBzbHVnOiBzdHJpbmc7XG4gICAgfTtcbiAgICBtYXJrZXRwbGFjZT86IHtcbiAgICAgICAgc3RhdHVzOiAnZHJhZnQnIHwgJ3N1Ym1pdHRlZCcgfCAnY2xhaW1lZCcgfCAnY2xvc2VkJztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgY29udGFjdEVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlYWRsaW5lOiBzdHJpbmc7XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICB2YXJpYW50c19pZHM6IHN0cmluZ1tdLFxuICAgIERUT3M6IHYyX0lEVE9bXSxcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgICBhY2Nlc3M/OiBDb21wb25lbnRBY2Nlc3MsXG5cbiAgICAvL1xuICAgIHZhcmlhbnRzX25hbWVzOiBzdHJpbmdbXSxcbiAgICB2YXJpYW50c19kYXRhOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgaWQ6IHN0cmluZ1xuICAgICAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG4gICAgICAgIGhhc19yZWxlYXNlcz86IGJvb2xlYW5cbiAgICB9W10sXG5cbiAgICBwcmV2aWV3X3ZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnO1xuICAgIGV4dHJhPzoge1xuICAgICAgICBmaXJzdFZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnOyAvL3doZW4gbmV3IGNvbXBvbmVudCBjcmVhdGVzIGF0IHRoZSBjbGllbnRcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSURUTyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICBkYXRhOiBvYmplY3RcbiAgICBtZXRob2ROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLFxuICAgIC8vc2tpbnM6IElTa2luSW5zdGFuY2VDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgU2VnbWVudFR5cGUgPSB7XG4gICAgXCJGdW5jdGlvblJlc3VsdFwiOiBcIkZ1bmN0aW9uUmVzdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50SW5zdGFuY2Uge1xuICAgIHNlZ21lbnRJZDogc3RyaW5nO1xuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2VnbWVudFR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCBleHRlbmRzIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiB0eXBlb2YgU2VnbWVudFR5cGUuRnVuY3Rpb25SZXN1bHRcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgZnVuY3Rpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2tpblNlbGVjdG9yVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50ZWRcIjogXCJTZWdtZW50ZWRcIixcbiAgICBcIkRlZGljYXRlZFwiOiBcIkRlZGljYXRlZFwiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBTZWxlY3RvciBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBcIkRlZmF1bHRcIjogXCJEZWZhdWx0XCJcbn0gYXMgY29uc3Q7XG5cblxuLyoqXG4gKiBUaGlzIFNraW4gQ29uZmlnIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAqXG4gKiBAdHlwZSB7SURlZmF1bHRTa2luQ29uZmlnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEZWZhdWx0U2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWZhdWx0LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCxcbiAgICBzZWdtZW50czogSVNlZ21lbnRJbnN0YW5jZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlZGljYXRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBza2lufSBpbnN0ZWFkLlxuICAgICAqIFByb3BlcnR5IHNraW5zIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICogUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIHtAbGluayBza2lufSBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNraW5zPzogSVNraW5JbnN0YW5jZUNvbmZpZ1tdIC8vIGRlcHJlY2F0ZWRcbiAgICBza2luOiBJU2tpbkluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICAvL1RPRE8gOlxuICAgIC8vIFJlZklEID8gdG8gc3VwcG9ydCBtb3JlIHRoYW4gMSBjb21wb25lbnQgZnJvbSB0aGUgc2FtZSB0eXBlIGluIGNvbXBvc2l0ZXMgP1xuXG4gICAgLy9UT0RPIDogcmVtb3ZlXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nOyAvLyA8PCBjaGVja1xuXG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG5cbiAgICAvLyBzdG9yaW5nIHRoZSBuZXN0ZWQgY29uZmlnIGZvciByZWYgY29tcG9uZW50c1xuICAgIG5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXVxuXG4gICAgLy9vbmx5IG9uIEdFVD9cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgcmVzb2x2ZWRFeHBlcmllbmNlcz86IElFeHBlcmllbmNlW11cbiAgICAvLyB3aWxsIGluY2x1ZGUgaW5zdGFuY2UgYW5kIGRlZiBjb25maWcgaW4gb3JkZXIgdG8gcmVuZGVyIGluIHByb2R1Y3Rpb25cbiAgICByZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IEV4cGVyaWVuY2VUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRcIjogXCJTZWdtZW50XCIsXG4gICAgXCJQcm9tb1wiOiBcIlByb21vXCIsXG4gICAgXCJBQlwiOiBcIkFCXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgLy9zdGlja2luZXNzRmFjdG9yXG4gICAgLy9FbmREYXRlXG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZUdyb3VwIHtcbi8vICAgICBpZDogc3RyaW5nXG4vLyAgICAgbmFtZTogc3RyaW5nXG4vLyAgICAgcGVyY2VudGFnZTogbnVtYmVyXG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzLkFCXG4gICAgLy8gZ3JvdXBzOiBJQUJFeHBlcmllbmNlR3JvdXBbXVxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgcGVyY2VudGFnZTogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGVSYW5nZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHN0YXJ0OiBEYXRlXG4gICAgZW5kOiBEYXRlXG4gICAgdGltZXpvbmU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgc2VnbWVudDogSVNlZ21lbnREZWZpbml0aW9uXG4gICAgZGF0ZVJhbmdlPzogSURhdGVSYW5nZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvd0RlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW107XG4gICAgb3JpZ2luczogc3RyaW5nW10sXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG4gICAgdHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIC8vIFRPRE8gOiB2ZXJpZnkgdW5pcXVlbmVzcyAoZGFzaGJvYXJkICYgc2VydmVyKVxuICAgIG5hbWU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgSUJyYW5jaGFibGUge1xuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvdyBleHRlbmRzIE9taXQ8SVVzZXJGbG93RGVmaW5pdGlvbiwgJ2NvbXBvbmVudHMnPiwgSUJyYW5jaGFibGUge1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY2xhc3MgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290PzogU2hhZG93Um9vdCkge1xuXG4gICAgfVxuXG4gICAgZ2V0Um9vdERpdiA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpXG4gICAgfVxuXG4gICAgZ2V0Um9vdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElQcm9wQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLFxuICAgIElVc2VyRmxvdyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyA9IChjb25maWc6IHYyX0lWYXJpYW50Q29uZmlnKTogSUNvbXBvbmVudENvbmZpZyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2U6IHtcbiAgICAgICAgICAgIGlkOiAnYXV0bycsXG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29uZmlnLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZTogY29uZmlnLm5hbWUsXG5cbiAgICAgICAgICAgIHNraW5TZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcbiAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfaW5pdF9pbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWcsXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnb3V0X2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfY3RhX2hhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgICAgIHNraW5zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRsZSBlbXB0eSA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBjb25maWcuY29uc3VtZV92YXJpYW50WzBdLmxvYWRlclxuICAgICAgICAgICAgICAgIH0gYXMgSVNraW5Db25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgICAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBuYW1lOiBjb25maWcubmFtZVxuICAgIH0gYXMgSUNvbXBvbmVudENvbmZpZztcbn07XG5cbi8qKlxuICogQ2xvdWRSZXBvc2l0b3J5IC0gVW5pZmllZCBjbG91ZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgTXlvcCBjb21wb25lbnRzXG4gKlxuICogU3VwcG9ydHMgYm90aCB2MiAoZGVmYXVsdCkgYW5kIHYxIG1vZGVzOlxuICogLSB2MjogVXNlcyAvY29uc3VtZSBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdmFyaWFudHNcbiAqIC0gdjE6IFVzZXMgL2Zsb3cgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHVzZXIgZmxvd3NcbiAqL1xuLy8gVXNlIGEgZ2xvYmFsIHNpbmdsZXRvbiB0byBlbnN1cmUgb25seSBvbmUgQ2xvdWRSZXBvc2l0b3J5Lk1haW4gZXhpc3RzXG4vLyBldmVuIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXMgYnkgZGlmZmVyZW50IGJ1bmRsZXJzXG5jb25zdCBHTE9CQUxfS0VZID0gJ19fTVlPUF9DTE9VRF9SRVBPU0lUT1JZX01BSU5fXyc7XG5cbmNvbnN0IGdldEdsb2JhbE1haW4gPSAoKTogQ2xvdWRSZXBvc2l0b3J5IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IHNldEdsb2JhbE1haW4gPSAoaW5zdGFuY2U6IENsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX21haW46IENsb3VkUmVwb3NpdG9yeSB8IG51bGwgPSBudWxsO1xuXG4gICAgc3RhdGljIGdldCBNYWluKCk6IENsb3VkUmVwb3NpdG9yeSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGEgZ2xvYmFsIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzIChmcm9tIGFub3RoZXIgYnVuZGxlKVxuICAgICAgICBjb25zdCBnbG9iYWxNYWluID0gZ2V0R2xvYmFsTWFpbigpO1xuICAgICAgICBpZiAoZ2xvYmFsTWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbE1haW47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIUNsb3VkUmVwb3NpdG9yeS5fbWFpbikge1xuICAgICAgICAgICAgQ2xvdWRSZXBvc2l0b3J5Ll9tYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgc2V0R2xvYmFsTWFpbihDbG91ZFJlcG9zaXRvcnkuX21haW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDbG91ZFJlcG9zaXRvcnkuX21haW47XG4gICAgfVxuXG4gICAgLy8gdjIgY2FjaGUgLSBrZXllZCBieSBjb21wb25lbnRJZDplbnY6cHJldmlld3xsaXZlXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPj4gPSB7fTtcblxuICAgIC8vIFRyYWNrIHdoaWNoIGNvbXBvbmVudHMgd2VyZSBwcmVsb2FkZWQgYW5kIHdpdGggd2hhdCBwYXJhbXNcbiAgICAvLyBLZXk6IGNvbXBvbmVudElkLCBWYWx1ZTogeyBlbnYsIHByZXZpZXcgfVxuICAgIHByaXZhdGUgcHJlbG9hZGVkQ29tcG9uZW50czogUmVjb3JkPHN0cmluZywgeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9PiA9IHt9O1xuXG4gICAgLy8gdjEgY2FjaGVcbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEVudiA9ICdwcm9kdWN0aW9uJztcbiAgICBwcml2YXRlIF9lbnZFeHBsaWNpdGx5U2V0ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGZvciB0aGlzIENsb3VkUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHNldEVudmlyb25tZW50KGVudjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuX2VudkV4cGxpY2l0bHlTZXQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0IGVudmlyb25tZW50XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdEVudmlyb25tZW50KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RW52O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMiBNZXRob2RzIChEZWZhdWx0KSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgY29tcG9uZW50IGlzIGFscmVhZHkgY2FjaGVkL3ByZWxvYWRlZCAodjIpXG4gICAgICogSWYgZW52IGFuZCBwcmV2aWV3IGFyZSBub3QgcHJvdmlkZWQsIGNoZWNrcyBpZiBBTlkgdmVyc2lvbiBpcyBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBpc1ByZWxvYWRlZChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIElmIHNwZWNpZmljIGVudi9wcmV2aWV3IHJlcXVlc3RlZCwgY2hlY2sgZXhhY3QgbWF0Y2hcbiAgICAgICAgaWYgKGVudiAhPT0gdW5kZWZpbmVkIHx8IHByZXZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb21wb25lbnRJZH06JHtlbnYgfHwgdGhpcy5fZGVmYXVsdEVudn06JHtwcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWA7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50cztcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgY2hlY2sgaWYgYW55IHZlcnNpb24gd2FzIHByZWxvYWRlZFxuICAgICAgICByZXR1cm4gY29tcG9uZW50SWQgaW4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcHJlbG9hZGVkIHBhcmFtcyBmb3IgYSBjb21wb25lbnQgKGlmIHByZWxvYWRlZClcbiAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub3QgcHJlbG9hZGVkXG4gICAgICovXG4gICAgZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkOiBzdHJpbmcpOiB7IGVudjogc3RyaW5nOyBwcmV2aWV3OiBib29sZWFuIH0gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYyIGNvbXBvbmVudCBjb25maWdcbiAgICAgKiBJZiBlbnYvcHJldmlldyBub3Qgc3BlY2lmaWVkIGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlcyBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGVudi9wcmV2aWV3IGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkID0gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQYXJhbXMgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGVudjogc3RyaW5nO1xuICAgICAgICBsZXQgdXNlUHJldmlldzogYm9vbGVhbjtcblxuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UGFyYW1zICYmIHByZWxvYWRlZCkge1xuICAgICAgICAgICAgLy8gVXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgICAgIGVudiA9IHByZWxvYWRlZC5lbnY7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJlbG9hZGVkLnByZXZpZXc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJvdmlkZWQgcGFyYW1zIG9yIGRlZmF1bHRzXG4gICAgICAgICAgICBlbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZGVmYXVsdEVudjtcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSB0cnVlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgZmFsc2UgXHUyMTkyIGZhbHNlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IHVuZGVmaW5lZDogZW52IHdhcyBzcGVjaWZpZWQgKHZpYSBwYXJhbSBvciBzZXRFbnZpcm9ubWVudCkgXHUyMTkyIGZhbHNlLCBvdGhlcndpc2UgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIGNvbnN0IGhhc0VmZmVjdGl2ZUVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZXZpZXcgPT09IHRydWUgPyB0cnVlIDogKHByZXZpZXcgPT09IGZhbHNlID8gZmFsc2UgOiAhaGFzRWZmZWN0aXZlRW52KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7ZW52fToke3VzZVByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcblxuICAgICAgICBjb25zb2xlLmxvZygnW0Nsb3VkUmVwb3NpdG9yeV0gZmV0Y2hDb21wb25lbnRWMicsIHtcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb21wb25lbnRJZC5zbGljZSgwLCA4KSArICcuLi4nLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgdXNlUHJldmlldyxcbiAgICAgICAgICAgIGNhY2hlS2V5LFxuICAgICAgICAgICAgY2FjaGVkOiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50c1tjYWNoZUtleV0pIHtcbiAgICAgICAgICAgIC8vIFRyYWNrIHRoaXMgYXMgcHJlbG9hZGVkIChmaXJzdCBmZXRjaCBjb3VudHMgYXMgcHJlbG9hZClcbiAgICAgICAgICAgIGlmICghdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0gPSB7IGVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZ9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmcHJldmlldz10cnVlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbZmxvd0lkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2Zsb3dJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJleHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuIiwgImltcG9ydCB7IENsb3VkUmVwb3NpdG9yeSB9IGZyb20gXCIuL0Nsb3VkUmVwb3NpdG9yeVwiO1xuXG5sZXQgX2Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeS5NYWluO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xvdWRSZXBvc2l0b3J5ID0gKCkgPT4gX2Nsb3VkUmVwb3NpdG9yeTtcblxuZXhwb3J0IGNvbnN0IGlzUHJlbG9hZGVkID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5pc1ByZWxvYWRlZChjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQcmVsb2FkZWRQYXJhbXMgPSAoY29tcG9uZW50SWQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZW5hYmxlTG9jYWxEZXYgPSAoKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoXCJodHRwOi8vbG9jYWxob3N0OjkyOTJcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5VXJsID0gKHVybDogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkodXJsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnkgPSAocmVwb3NpdG9yeTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RW52aXJvbm1lbnQgPSAoZW52OiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldEVudmlyb25tZW50KGVudik7XG59O1xuXG5leHBvcnQgY29uc3QgcHJlbG9hZENvbXBvbmVudHMgPSBhc3luYyAoaWRzOiBzdHJpbmdbXSwgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgIGlkcy5tYXAoKGlkKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmZldGNoQ29tcG9uZW50VjIoaWQsIGVudiwgcHJldmlldykpLFxuICAgICk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR08sSUFBTSxTQUFTLE1BQU07QUFDeEIsU0FBTyx1Q0FBdUM7QUFBQSxJQUFRO0FBQUEsSUFBVSxRQUMzRCxDQUFDLElBQUksT0FBTyxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsRUFBRTtBQUFBLEVBQ2xGO0FBQ0o7OztBQ0tPLElBQWUsa0JBQWYsTUFBd0M7QUFBQSxFQVczQyxjQUFjO0FBVmQsOEJBQUssT0FBTztBQWNaLGdDQUFPO0FBSVA7QUFHQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQSxxQ0FBcUI7QUFBQSxFQWxCckI7QUFBQSxFQVZBLE9BQU8sVUFFQSxNQUNzQjtBQUV6QixXQUFPLElBQUksS0FBSyxHQUFHLElBQUk7QUFBQSxFQUMzQjtBQUFBLEVBd0JB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QUFBO0FBQzVCLFVBQUksQ0FBQyxLQUFLLFVBQVUsTUFBTSxHQUFHO0FBRXpCLGFBQUssVUFBVSxNQUFNLElBQUksSUFBSTtBQUFBLFVBQ3pCLENBQU8sU0FBUyxXQUFXO0FBQ3ZCLGdCQUFJO0FBQ0Esb0JBQU0sTUFBTSxNQUFNO0FBQUEsZ0JBQ2QsR0FBRyxLQUFLLFFBQVEsWUFBWSxNQUFNO0FBQUEsY0FDdEM7QUFDQSxvQkFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLHNCQUFRLEtBQUssSUFBSTtBQUFBLFlBQ3JCLFNBQVMsR0FBRztBQUNSLHFCQUFPLENBQUM7QUFBQSxZQUNaO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsYUFBTyxNQUFNLEtBQUssVUFBVSxNQUFNO0FBQUEsSUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFNLGVBQWUsYUFBcUIsUUFBaUI7QUFBQTtBQUN2RCxhQUFPLEtBQUssaUJBQWlCLGFBQWEsTUFBTTtBQUFBLElBQ3BEO0FBQUE7QUFDSjtBQXROSSxjQURTLGtCQUNNLFNBQWdDO0FBRDVDLElBQU0sa0JBQU47QUE0TkEsSUFBTSxxQkFBcUI7OztBQzdUM0IsSUFBTSxPQUFPLENBQU8sV0FBZ0I7QUFDdkMsU0FBTyxNQUFNLE9BQU87QUFDeEI7OztBQ0FBLElBQUksbUJBQW1CLGdCQUFnQjtBQUVoQyxJQUFNLHFCQUFxQixNQUFNO0FBRWpDLElBQU0sY0FBYyxDQUFDLGFBQXFCLEtBQWMsWUFBK0I7QUFDMUYsU0FBTyxpQkFBaUIsWUFBWSxhQUFhLEtBQUssT0FBTztBQUNqRTtBQUVPLElBQU0scUJBQXFCLENBQUMsZ0JBQXdCO0FBQ3ZELFNBQU8saUJBQWlCLG1CQUFtQixXQUFXO0FBQzFEO0FBRU8sSUFBTSxpQkFBaUIsTUFBTTtBQUNoQyxxQkFBbUIsSUFBSSxnQkFBZ0IsdUJBQXVCO0FBQ2xFO0FBRU8sSUFBTSx3QkFBd0IsQ0FBQyxRQUFnQjtBQUNsRCxxQkFBbUIsSUFBSSxnQkFBZ0IsR0FBRztBQUM5QztBQUVPLElBQU0scUJBQXFCLENBQUMsZUFBZ0M7QUFDL0QscUJBQW1CO0FBQ3ZCO0FBRU8sSUFBTSxpQkFBaUIsQ0FBQyxRQUFnQjtBQUMzQyxtQkFBaUIsZUFBZSxHQUFHO0FBQ3ZDO0FBRU8sSUFBTSxvQkFBb0IsQ0FBTyxLQUFlLEtBQWMsWUFBc0I7QUFDdkYsU0FBTyxRQUFRO0FBQUEsSUFDWCxJQUFJLElBQUksQ0FBQyxPQUFPLGlCQUFpQixpQkFBaUIsSUFBSSxLQUFLLE9BQU8sQ0FBQztBQUFBLEVBQ3ZFO0FBQ0o7IiwKICAibmFtZXMiOiBbIm1hdGNoIiwgInNjcmlwdElucHV0cyIsICJzY3JpcHRJbnB1dHMiXQp9Cg==
682
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Jhc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9FeGVjdXRlU2NyaXB0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3VzdG9tUmVmTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL0Nsb3VkUmVwb3NpdG9yeS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9leGVjLnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vVE9ETyA6IHJldXNlIGZyb20gb25lIHBsYWNlLlxuLy8gbmVlZHMgdG8gYmUgdXNlZCBpbiBteW9wLXNkaywgbXlvcC1kYXNoYmFvcmQsIG15b3Atc2VydmVyLCBteW9wLWNsaSAuLlxuXG5leHBvcnQgY29uc3QgdXVpZHY0ID0gKCkgPT4ge1xuICAgIHJldHVybiBcIjEwMDAwMDAwLTEwMDAtNDAwMC04MDAwLTEwMDAwMDAwMDAwMFwiLnJlcGxhY2UoL1swMThdL2csIGMgPT5cbiAgICAgICAgKCtjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiArYyAvIDQpLnRvU3RyaW5nKDE2KVxuICAgICk7XG59XG5cbi8vIENvbnZlcnQgVVVJRCBzdHJpbmcgdG8gYnl0ZXNcbmV4cG9ydCBjb25zdCB1dWlkVG9CeXRlcyA9ICh1dWlkOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKFxuICAgICAgICB1dWlkLnJlcGxhY2UoLy0vZywgJycpLm1hdGNoKC8uezEsMn0vZykhLm1hcChieXRlID0+IHBhcnNlSW50KGJ5dGUsIDE2KSlcbiAgICApO1xufTtcblxuLy8gQ29udmVydCBieXRlcyB0byBVVUlEIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGJ5dGVzVG9VdWlkID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBoZXggPSBbLi4uYnl0ZXNdLm1hcChiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGhleC5zbGljZSgwLCA4KSxcbiAgICAgICAgaGV4LnNsaWNlKDgsIDEyKSxcbiAgICAgICAgaGV4LnNsaWNlKDEyLCAxNiksXG4gICAgICAgIGhleC5zbGljZSgxNiwgMjApLFxuICAgICAgICBoZXguc2xpY2UoMjApXG4gICAgXS5qb2luKCctJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZW5jb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRW5jb2RlID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMpKTtcbiAgICByZXR1cm4gYmFzZTY0LnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoLz0rJC8sICcnKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBkZWNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxEZWNvZGUgPSAoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICBsZXQgYmFzZTY0ID0gc3RyLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgd2hpbGUgKGJhc2U2NC5sZW5ndGggJSA0KSBiYXNlNjQgKz0gJz0nO1xuICAgIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGJpbmFyeSwgY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpO1xufTtcblxuLy8gQ29tcHJlc3MgYW4gYXJyYXkgb2YgVVVJRHMgaW50byBhIHNob3J0IFVSTC1zYWZlIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGNvbXByZXNzVVVJRHMgPSAodXVpZHM6IHN0cmluZ1tdKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBhbGxCeXRlcyA9IHV1aWRzLmZsYXRNYXAodXVpZCA9PiBBcnJheS5mcm9tKHV1aWRUb0J5dGVzKHV1aWQpKSk7XG4gICAgcmV0dXJuIGJhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShhbGxCeXRlcykpO1xufTtcblxuLy8gRGVjb21wcmVzcyBmcm9tIFVSTC1zYWZlIHN0cmluZyBiYWNrIHRvIGFuIGFycmF5IG9mIFVVSURzXG5leHBvcnQgY29uc3QgZGVjb21wcmVzc1VVSURzID0gKGVuY29kZWQ6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGJhc2U2NFVybERlY29kZShlbmNvZGVkKTtcbiAgICBpZiAoYnl0ZXMubGVuZ3RoICUgMTYgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCBsZW5ndGgnKTtcblxuICAgIGNvbnN0IHV1aWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgICAgIHV1aWRzLnB1c2goYnl0ZXNUb1V1aWQoYnl0ZXMuc2xpY2UoaSwgaSArIDE2KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZHM7XG59O1xuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSAqIGFzIENTUyBmcm9tIFwiY3NzdHlwZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG4vLyBpZ25vcmluZyBkb2N1bWVudGF0aW9uXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGludGVyZmFjZSBDU1NQcm9wZXJ0aWVzIGV4dGVuZHMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiB7XG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlc2hlZXREZWZpbml0aW9uID0geyBba2V5OiBzdHJpbmddOiBDU1NQcm9wZXJ0aWVzIH07XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXQgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgc3R5bGVzaGVldDogU3R5bGVzaGVldERlZmluaXRpb24sIGNzcz86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfc3R5bGVzaGVldCwgX3RhZ0lkLCBfY3NzfSkgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlVGFnLnR5cGUgPSAndGV4dC9jc3MnO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBDU1Mgc3RyaW5nIGZyb20gdGhlIHN0eWxlcyBvYmplY3RcbiAgICAgICAgbGV0IGNzc1N0cmluZyA9IF9jc3M7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBpbiBfc3R5bGVzaGVldCkge1xuICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3NlbGVjdG9yfSB7IGA7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gX3N0eWxlc2hlZXRbc2VsZWN0b3JdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3Byb3BlcnR5fTogJHtwcm9wZXJ0aWVzW3Byb3BlcnR5XX07IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gJ30gJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgQ1NTIHN0cmluZyBhcyB0aGUgY29udGVudCBvZiB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIHN0eWxlVGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1N0cmluZykpO1xuICAgICAgICBzdHlsZVRhZy5pZCA9IF90YWdJZDtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuXG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX3N0eWxlc2hlZXQ6IHN0eWxlc2hlZXQsXG4gICAgICAgIF9jc3MgOiBjc3MgPyBjc3MgOiAnJyxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0TGluayA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBsaW5rOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkLCBfbGlua30pID0+IHtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlkID0gX3RhZ0lkO1xuICAgICAgICBsaW5rRWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBfbGluaztcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9saW5rIDogbGluayxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgVG9rZW5NYXAgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8IG51bWJlcj5cblxuY29uc3QgcmVwbGFjZVRva2VucyA9IChpbnB1dDogc3RyaW5nLCB0b2tlbk1hcDogVG9rZW5NYXApOiBzdHJpbmcgPT4ge1xuICAgIC8vIENyZWF0ZSBhIHJlZ2V4IHBhdHRlcm4gZnJvbSB0aGUga2V5cyBvZiB0aGUgdG9rZW5NYXBcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyh0b2tlbk1hcCkuam9pbignfCcpLCAnZycpO1xuXG4gICAgLy8gUmVwbGFjZSB0b2tlbnMgaW4gdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcmVnZXhcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShwYXR0ZXJuLCAobWF0Y2hlZCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZyb20gdGhlIHRva2VuTWFwXG4gICAgICAgIHJldHVybiAodG9rZW5NYXBbbWF0Y2hlZF0gfHwgbWF0Y2hlZCkudG9TdHJpbmcoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplciA9IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnLCB0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICBjb25zdCB0eXBlZFNraW5Db25maWcgPSAoc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKVxuICAgIGlmICh0eXBlZFNraW5Db25maWcudHlwZSAhPT0gJ0lmcmFtZUxvYWRlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZnJhbWVTa2luVXJsVG9rZW5pemVyIHJlY2VpdmVkIHNraW4gd2l0aCBsb2FkZXIgdHlwZSBcIiR7dHlwZWRTa2luQ29uZmlnLnR5cGV9XCIsIGN1cnJlbnRseSBvbmx5IFwiSWZyYW1lTG9hZGVyXCIgaXMgc3VwcG9ydGVkYClcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyID0ge1xuICAgICAgICAuLi5zZWxlY3RlZFNraW4ubG9hZGVyXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlci51cmwgPSByZXBsYWNlVG9rZW5zKHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsLCB0b2tlbk1hcCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRTa2luO1xufVxuXG5leHBvcnQgY29uc3QgY2hhbmdlU2tpblVybEJ5VG9rZW5pemVyID0gKHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIHJldHVybiBhc3luYyAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyKHNlbGVjdGVkU2tpbiwgdG9rZW5NYXApO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtDdXN0b21SZWZNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5cbi8vIGNvbnN0IHNwYWNlID0gJyAnO1xuLy8gZXhwb3J0IGNvbnN0IGdldENsYXNzZXMgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiAoYXdhaXQgZXhlYyhhY3RBczxIVE1MRGl2RWxlbWVudD4oY29ubmVjdGVkUmVmKS5jbGFzc0xpc3QpKS52YWx1ZS5zcGxpdChzcGFjZSk7XG4vLyBleHBvcnQgY29uc3QgYWRkQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICBjbGFzc2VzLmluY2x1ZGVzKGNsYXNzTmFtZSkgfHwgY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy8gZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZywpID0+IHtcbi8vICAgICBsZXQgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuZmlsdGVyKGMgPT4gYyAhPT0gY2xhc3NOYW1lKS5qb2luKHNwYWNlKTtcbi8vIH1cbi8vXG4vL1xuXG5leHBvcnQgY29uc3QgYWRkQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LmFkZChfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QucmVtb3ZlKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn0iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZywgSUhUTUxMb2FkZXJDb25maWcsIElSZWZDb25maWcsXG4gICAgSVNraW5Mb2FkZXJDb25maWcsXG4gICAgSVNraW5TZWxlY3RvckNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSVNraW5Db25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2tpbkNvbmZpZyBpbXBsZW1lbnRzIElTa2luQ29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2tpbkNvbmZpZygpO1xuICAgIH1cblxuICAgIGlkID0gdGhpcy5fcnVuVGltZUlkO1xuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZTtcbiAgICBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGxvYWRlciA9IG51bGwgYXMgdW5rbm93biBhcyBJU2tpbkxvYWRlckNvbmZpZztcblxuICAgIHdpdGhMb2FkZXIgPSAobG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEhUTUxMb2FkZXIgPSAobG9hZGVyOiBPbWl0PElIVE1MTG9hZGVyQ29uZmlnLCAndHlwZSc+KSA9PiB7XG4gICAgICAgIGxvYWRlci50eXBlID0gJ0hUTUxMb2FkZXInO1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbmZpZyBpbXBsZW1lbnRzIElDb21wb25lbnRDb25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDb25maWcoKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJbnN0YW5jZUlkLFxuICAgICAgICBjb21wb25lbnRJZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBjb21wb25lbnROYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgc2tpblNlbGVjdG9yOiBudWxsIGFzIHVua25vd24gYXMgSVNraW5TZWxlY3RvckNvbmZpZ1xuICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnO1xuXG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lXG4gICAgdHlwZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgbmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgc2tpbnM6IFtdLFxuICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIHdpdGhJbnN0YW5jZSA9IChpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFR5cGUgPSAodHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhEZWZhdWx0U2tpbiA9IChkZWZhdWx0U2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnNraW5zLnB1c2goZGVmYXVsdFNraW4pO1xuICAgICAgICB0aGlzLnR5cGUuZGVmYXVsdFNraW4gPSB0aGlzLnR5cGUuc2tpbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICBpZDogZGVmYXVsdFNraW4uaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhSZWYgPSAocmVmOiBJUmVmQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEJhc2ljUmVmID0gKHJlZlNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmFzaWNSZWYgPSB7XG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBuYW1lOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICBzZWxlY3RvcjogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElSZWZDb25maWdcblxuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKG5ld0Jhc2ljUmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0ICogZnJvbSAnLi9NeW9wRWxlbWVudFJlZic7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2VNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0Jhc2VNeW9wU0RLJztcblxuZXhwb3J0IHR5cGUgQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VD4gPSB7IFtrZXk6IHN0cmluZ106IFQ7IH07XG5cbi8vZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSAnSWZyYW1lTG9hZGVyJyB8ICdXZWJDb21wb25lbnRMb2FkZXInIHwgJ0hUTUxMb2FkZXInIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgU2tpbkxvYWRlcnMgPSB7XG4gICAgXCJJZnJhbWVMb2FkZXJcIjogXCJJZnJhbWVMb2FkZXJcIixcbiAgICBcIldlYkNvbXBvbmVudExvYWRlclwiOiBcIldlYkNvbXBvbmVudExvYWRlclwiLFxuICAgIFwiSFRNTExvYWRlclwiOiBcIkhUTUxMb2FkZXJcIixcbiAgICBcIk1pbmltaXplZExvYWRlclwiOiBcIk1pbmltaXplZExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xufVxuXG4vL2ZvciBpbnRlcm5hbCBkYXNoYm9hcmQgdXNhZ2VcbmV4cG9ydCBpbnRlcmZhY2UgSU1pbmltaXplZExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIk1pbmltaXplZExvYWRlclwiO1xufVxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkT2JqZWN0IHtcbiAgICBfdGVtcF9jbGllbnRfaWQ/OiBzdHJpbmcsXG59XG5cbnR5cGUgRXh0ZW5kPFQsIFU+ID0gVCAmIFU7XG5cbnR5cGUgRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgRV06IEVbS107XG59ICYge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgID8gRXh0ZW5kUmVjdXJzaXZlbHk8VFtLXSwgRT5cbiAgICAgICAgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgSURhc2hib2FyZDxUPiA9IEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIERhc2hib2FyZE9iamVjdD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlXG5cbiAgICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVJlbGVhc2VNZXRhZGF0YSB7XG4gICAgZW52aXJvbm1lbnRJZDogc3RyaW5nO1xuICAgIGVudmlyb25tZW50SWRlbnRpZmllcjogc3RyaW5nO1xuICAgIC8vXG4gICAgLy8gdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgLy8gdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVZhcmlhbnRDb25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICByZWxlYXNlcz86IHYyX0lSZWxlYXNlTWV0YWRhdGFbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JU2tpbkNvbmZpZyBleHRlbmRzIElTa2luQ29uZmlnIHtcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpbmRNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgY29uc3QgUHJvcE1lc3NhZ2VNb2RlcyA9IHtcbiAgICBcImlucHV0XCI6IFwiaW5wdXRcIixcbiAgICBcIm91dHB1dFwiOiBcIm91dHB1dFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMgPSB7XG4gICAgXCJtZXNzYWdlXCI6IFwibWVzc2FnZVwiLFxuICAgIFwiY29kZVwiOiBcImNvZGVcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtIHtcbiAgICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFByb3BDb25maWdCZWhhdmlvclR5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb2RlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcImNvZGVcIlxuICAgIHJlbWFwPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIlxuICAgIG1lc3NhZ2U6IE15b3BNZXNzYWdlS2V5XG4gICAgcmVmOiBzdHJpbmcsIC8vVE9ETyBtYWtlIGl0IGlkXG4gICAgcGFyYW1zOiBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtW11cbiAgICBtb2RlOiBrZXlvZiB0eXBlb2YgUHJvcE1lc3NhZ2VNb2Rlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgYmVoYXZpb3I6IElQcm9wQmVoYXZpb3Jcbn1cblxuXG5leHBvcnQgY2xhc3MgUmVmQmVoYXZpb3JUeXBlIHtcbiAgICBzdGF0aWMgY29kZSA9ICdjb2RlJyBhcyBjb25zdFxuICAgIHN0YXRpYyBjb21wb25lbnQgPSAnY29tcG9uZW50JyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBJUmVmQmVoYXZpb3JUeXBlID0gJ2NvZGUnIHwgJ2NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiBJUmVmQmVoYXZpb3JUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29tcG9uZW50J1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogUHJvcGVydHkgaW5zdGFuY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvZGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBzZWxlY3RvclR5cGU6IFJlZlNlbGVjdG9yVHlwZVxuICAgIHNlbGVjdG9yOiBzdHJpbmdcbiAgICBiZWhhdmlvcjogSVJlZkJlaGF2aW9yXG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlIHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJjZW50YWdlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdCB7XG4gICAgdmVyc2lvbnM6IElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb25bXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBydWxlczogSUV4cGVyaWVuY2VTZWdtZW50UnVsZVtdO1xuICAgIHVzZUFiOiBib29sZWFuO1xuICAgIGNvbXBvbmVudFZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgICBhYlNwbGl0PzogSUV4cGVyaWVuY2VBQlNwbGl0O1xuICAgIHN0aWNreVByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIGRlZmluaXRpb24gY29uZmlnICh2MilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZURlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRHMgKi9cbiAgICBjb21wb25lbnRzOiBzdHJpbmdbXTtcbiAgICAvKiogU2VnbWVudCBjb25maWd1cmF0aW9ucyAqL1xuICAgIHNlZ21lbnRzOiBJRXhwZXJpZW5jZVNlZ21lbnRbXTtcbiAgICAvKiogRmFsbGJhY2sgdmFyaWFudCBwZXIgY29tcG9uZW50ICovXG4gICAgZmFsbGJhY2s6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgLyoqIFRhZ3MgKi9cbiAgICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAvLyBwcm9wczogUmVjb3JkPHN0cmluZywgSVByb3BDb25maWc+IC8vaWQgLSB0eXBlXG4gICAgLy8gcmVmczogUmVjb3JkPHN0cmluZywgSVJlZkNvbmZpZz4sXG4gICAgLy8gc2tpbnM6IFJlY29yZDxzdHJpbmcsIElTa2luQ29uZmlnPlxuICAgIHByb3BzOiBJUHJvcENvbmZpZ1tdLFxuICAgIHJlZnM6IElSZWZDb25maWdbXSxcbiAgICBza2luczogSVNraW5Db25maWdbXSxcbiAgICBkZWZhdWx0U2tpbjogbnVtYmVyO1xuXG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIC8vcmVzb2x2ZWREZWZpbml0aW9ucz86IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnW11cbiAgICAvL1RPRE8gOiBtb3ZlIHRvIGJhc2UgY2xhc3MgKCBJU3RvcmFibGVJdGVtIG9yIHNvLi4uKVxuXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSU15b3BTdG9yZWRPYmplY3QgZXh0ZW5kcyB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudEFjY2VzcyB7XG4gICAgdmlzaWJpbGl0eTogJ3ByaXZhdGUnIHwgJ3VubGlzdGVkJyB8ICdwdWJsaWMnO1xuICAgIHVubGlzdGVkPzoge1xuICAgICAgICBzbHVnOiBzdHJpbmc7XG4gICAgfTtcbiAgICBtYXJrZXRwbGFjZT86IHtcbiAgICAgICAgc3RhdHVzOiAnZHJhZnQnIHwgJ3N1Ym1pdHRlZCcgfCAnY2xhaW1lZCcgfCAnY2xvc2VkJztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgY29udGFjdEVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlYWRsaW5lOiBzdHJpbmc7XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICB2YXJpYW50c19pZHM6IHN0cmluZ1tdLFxuICAgIERUT3M6IHYyX0lEVE9bXSxcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgICBhY2Nlc3M/OiBDb21wb25lbnRBY2Nlc3MsXG5cbiAgICAvL1xuICAgIHZhcmlhbnRzX25hbWVzOiBzdHJpbmdbXSxcbiAgICB2YXJpYW50c19kYXRhOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgaWQ6IHN0cmluZ1xuICAgICAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG4gICAgICAgIGhhc19yZWxlYXNlcz86IGJvb2xlYW5cbiAgICB9W10sXG5cbiAgICBwcmV2aWV3X3ZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnO1xuICAgIGV4dHJhPzoge1xuICAgICAgICBmaXJzdFZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnOyAvL3doZW4gbmV3IGNvbXBvbmVudCBjcmVhdGVzIGF0IHRoZSBjbGllbnRcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSURUTyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICBkYXRhOiBvYmplY3RcbiAgICBtZXRob2ROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLFxuICAgIC8vc2tpbnM6IElTa2luSW5zdGFuY2VDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgU2VnbWVudFR5cGUgPSB7XG4gICAgXCJGdW5jdGlvblJlc3VsdFwiOiBcIkZ1bmN0aW9uUmVzdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50SW5zdGFuY2Uge1xuICAgIHNlZ21lbnRJZDogc3RyaW5nO1xuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2VnbWVudFR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCBleHRlbmRzIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiB0eXBlb2YgU2VnbWVudFR5cGUuRnVuY3Rpb25SZXN1bHRcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgZnVuY3Rpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2tpblNlbGVjdG9yVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50ZWRcIjogXCJTZWdtZW50ZWRcIixcbiAgICBcIkRlZGljYXRlZFwiOiBcIkRlZGljYXRlZFwiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBTZWxlY3RvciBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBcIkRlZmF1bHRcIjogXCJEZWZhdWx0XCJcbn0gYXMgY29uc3Q7XG5cblxuLyoqXG4gKiBUaGlzIFNraW4gQ29uZmlnIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAqXG4gKiBAdHlwZSB7SURlZmF1bHRTa2luQ29uZmlnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEZWZhdWx0U2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWZhdWx0LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCxcbiAgICBzZWdtZW50czogSVNlZ21lbnRJbnN0YW5jZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlZGljYXRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBza2lufSBpbnN0ZWFkLlxuICAgICAqIFByb3BlcnR5IHNraW5zIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICogUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIHtAbGluayBza2lufSBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNraW5zPzogSVNraW5JbnN0YW5jZUNvbmZpZ1tdIC8vIGRlcHJlY2F0ZWRcbiAgICBza2luOiBJU2tpbkluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICAvL1RPRE8gOlxuICAgIC8vIFJlZklEID8gdG8gc3VwcG9ydCBtb3JlIHRoYW4gMSBjb21wb25lbnQgZnJvbSB0aGUgc2FtZSB0eXBlIGluIGNvbXBvc2l0ZXMgP1xuXG4gICAgLy9UT0RPIDogcmVtb3ZlXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nOyAvLyA8PCBjaGVja1xuXG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG5cbiAgICAvLyBzdG9yaW5nIHRoZSBuZXN0ZWQgY29uZmlnIGZvciByZWYgY29tcG9uZW50c1xuICAgIG5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXVxuXG4gICAgLy9vbmx5IG9uIEdFVD9cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgcmVzb2x2ZWRFeHBlcmllbmNlcz86IElFeHBlcmllbmNlW11cbiAgICAvLyB3aWxsIGluY2x1ZGUgaW5zdGFuY2UgYW5kIGRlZiBjb25maWcgaW4gb3JkZXIgdG8gcmVuZGVyIGluIHByb2R1Y3Rpb25cbiAgICByZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IEV4cGVyaWVuY2VUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRcIjogXCJTZWdtZW50XCIsXG4gICAgXCJQcm9tb1wiOiBcIlByb21vXCIsXG4gICAgXCJBQlwiOiBcIkFCXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgLy9zdGlja2luZXNzRmFjdG9yXG4gICAgLy9FbmREYXRlXG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZUdyb3VwIHtcbi8vICAgICBpZDogc3RyaW5nXG4vLyAgICAgbmFtZTogc3RyaW5nXG4vLyAgICAgcGVyY2VudGFnZTogbnVtYmVyXG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzLkFCXG4gICAgLy8gZ3JvdXBzOiBJQUJFeHBlcmllbmNlR3JvdXBbXVxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgcGVyY2VudGFnZTogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGVSYW5nZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHN0YXJ0OiBEYXRlXG4gICAgZW5kOiBEYXRlXG4gICAgdGltZXpvbmU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgc2VnbWVudDogSVNlZ21lbnREZWZpbml0aW9uXG4gICAgZGF0ZVJhbmdlPzogSURhdGVSYW5nZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvd0RlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW107XG4gICAgb3JpZ2luczogc3RyaW5nW10sXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG4gICAgdHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIC8vIFRPRE8gOiB2ZXJpZnkgdW5pcXVlbmVzcyAoZGFzaGJvYXJkICYgc2VydmVyKVxuICAgIG5hbWU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgSUJyYW5jaGFibGUge1xuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvdyBleHRlbmRzIE9taXQ8SVVzZXJGbG93RGVmaW5pdGlvbiwgJ2NvbXBvbmVudHMnPiwgSUJyYW5jaGFibGUge1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY2xhc3MgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290PzogU2hhZG93Um9vdCkge1xuXG4gICAgfVxuXG4gICAgZ2V0Um9vdERpdiA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpXG4gICAgfVxuXG4gICAgZ2V0Um9vdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElQcm9wQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLFxuICAgIElVc2VyRmxvdyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyA9IChjb25maWc6IHYyX0lWYXJpYW50Q29uZmlnKTogSUNvbXBvbmVudENvbmZpZyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2U6IHtcbiAgICAgICAgICAgIGlkOiAnYXV0bycsXG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29uZmlnLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZTogY29uZmlnLm5hbWUsXG5cbiAgICAgICAgICAgIHNraW5TZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcbiAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfaW5pdF9pbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWcsXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnb3V0X2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfY3RhX2hhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgICAgIHNraW5zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRsZSBlbXB0eSA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBjb25maWcuY29uc3VtZV92YXJpYW50WzBdLmxvYWRlclxuICAgICAgICAgICAgICAgIH0gYXMgSVNraW5Db25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgICAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBuYW1lOiBjb25maWcubmFtZVxuICAgIH0gYXMgSUNvbXBvbmVudENvbmZpZztcbn07XG5cbi8qKlxuICogQ2xvdWRSZXBvc2l0b3J5IC0gVW5pZmllZCBjbG91ZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgTXlvcCBjb21wb25lbnRzXG4gKlxuICogU3VwcG9ydHMgYm90aCB2MiAoZGVmYXVsdCkgYW5kIHYxIG1vZGVzOlxuICogLSB2MjogVXNlcyAvY29uc3VtZSBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdmFyaWFudHNcbiAqIC0gdjE6IFVzZXMgL2Zsb3cgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHVzZXIgZmxvd3NcbiAqL1xuLy8gVXNlIGEgZ2xvYmFsIHNpbmdsZXRvbiB0byBlbnN1cmUgb25seSBvbmUgQ2xvdWRSZXBvc2l0b3J5Lk1haW4gZXhpc3RzXG4vLyBldmVuIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXMgYnkgZGlmZmVyZW50IGJ1bmRsZXJzXG5jb25zdCBHTE9CQUxfS0VZID0gJ19fTVlPUF9DTE9VRF9SRVBPU0lUT1JZX01BSU5fXyc7XG5cbmNvbnN0IGdldEdsb2JhbE1haW4gPSAoKTogQ2xvdWRSZXBvc2l0b3J5IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IHNldEdsb2JhbE1haW4gPSAoaW5zdGFuY2U6IENsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX21haW46IENsb3VkUmVwb3NpdG9yeSB8IG51bGwgPSBudWxsO1xuXG4gICAgc3RhdGljIGdldCBNYWluKCk6IENsb3VkUmVwb3NpdG9yeSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGEgZ2xvYmFsIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzIChmcm9tIGFub3RoZXIgYnVuZGxlKVxuICAgICAgICBjb25zdCBnbG9iYWxNYWluID0gZ2V0R2xvYmFsTWFpbigpO1xuICAgICAgICBpZiAoZ2xvYmFsTWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbE1haW47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIUNsb3VkUmVwb3NpdG9yeS5fbWFpbikge1xuICAgICAgICAgICAgQ2xvdWRSZXBvc2l0b3J5Ll9tYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgc2V0R2xvYmFsTWFpbihDbG91ZFJlcG9zaXRvcnkuX21haW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDbG91ZFJlcG9zaXRvcnkuX21haW47XG4gICAgfVxuXG4gICAgLy8gdjIgY2FjaGUgLSBrZXllZCBieSBjb21wb25lbnRJZDplbnY6cHJldmlld3xsaXZlXG4gICAgLy8gRWFjaCBQcm9taXNlIGlzIHRhZ2dlZCB3aXRoIGEgYHJlc29sdmVkYCBwcm9wZXJ0eSBhZnRlciBzZXR0bGluZyAoc2VlIGZldGNoQ29tcG9uZW50VjIpLlxuICAgIHByaXZhdGUgdmFyaWFudHM6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4gJiB7IHJlc29sdmVkPzogSUNvbXBvbmVudENvbmZpZyB9PiA9IHt9O1xuXG4gICAgLy8gVHJhY2sgd2hpY2ggY29tcG9uZW50cyB3ZXJlIHByZWxvYWRlZCBhbmQgd2l0aCB3aGF0IHBhcmFtc1xuICAgIC8vIEtleTogY29tcG9uZW50SWQsIFZhbHVlOiB7IGVudiwgcHJldmlldyB9XG4gICAgcHJpdmF0ZSBwcmVsb2FkZWRDb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCB7IGVudjogc3RyaW5nOyBwcmV2aWV3OiBib29sZWFuIH0+ID0ge307XG5cbiAgICAvLyB2MSBjYWNoZVxuICAgIHByaXZhdGUgdXNlckZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0RW52ID0gJ3Byb2R1Y3Rpb24nO1xuICAgIHByaXZhdGUgX2VudkV4cGxpY2l0bHlTZXQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgQ2xvdWRSZXBvc2l0b3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgc2V0RW52aXJvbm1lbnQoZW52OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEVudiA9IGVudjtcbiAgICAgICAgdGhpcy5fZW52RXhwbGljaXRseVNldCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBnZXREZWZhdWx0RW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYyIE1ldGhvZHMgKERlZmF1bHQpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQgaXMgYWxyZWFkeSBjYWNoZWQvcHJlbG9hZGVkICh2MilcbiAgICAgKiBJZiBlbnYgYW5kIHByZXZpZXcgYXJlIG5vdCBwcm92aWRlZCwgY2hlY2tzIGlmIEFOWSB2ZXJzaW9uIGlzIHByZWxvYWRlZFxuICAgICAqL1xuICAgIGlzUHJlbG9hZGVkKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgLy8gSWYgc3BlY2lmaWMgZW52L3ByZXZpZXcgcmVxdWVzdGVkLCBjaGVjayBleGFjdCBtYXRjaFxuICAgICAgICBpZiAoZW52ICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2NvbXBvbmVudElkfToke2VudiB8fCB0aGlzLl9kZWZhdWx0RW52fToke3ByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBpZiBhbnkgdmVyc2lvbiB3YXMgcHJlbG9hZGVkXG4gICAgICAgIHJldHVybiBjb21wb25lbnRJZCBpbiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcmVsb2FkZWQgcGFyYW1zIGZvciBhIGNvbXBvbmVudCAoaWYgcHJlbG9hZGVkKVxuICAgICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBnZXRQcmVsb2FkZWRQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZyk6IHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjIgY29tcG9uZW50IGNvbmZpZ1xuICAgICAqIElmIGVudi9wcmV2aWV3IG5vdCBzcGVjaWZpZWQgYW5kIGNvbXBvbmVudCB3YXMgcHJlbG9hZGVkLCB1c2VzIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudmlyb25tZW50SWRlbnRpZmllcj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBQcm9taXNlPElDb21wb25lbnRDb25maWc+IHtcbiAgICAgICAgLy8gSWYgbm8gZXhwbGljaXQgZW52L3ByZXZpZXcgYW5kIGNvbXBvbmVudCB3YXMgcHJlbG9hZGVkLCB1c2UgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAgICBjb25zdCBwcmVsb2FkZWQgPSB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdO1xuICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFBhcmFtcyA9IGVudmlyb25tZW50SWRlbnRpZmllciAhPT0gdW5kZWZpbmVkIHx8IHByZXZpZXcgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgZW52OiBzdHJpbmc7XG4gICAgICAgIGxldCB1c2VQcmV2aWV3OiBib29sZWFuO1xuXG4gICAgICAgIGlmICghaGFzRXhwbGljaXRQYXJhbXMgJiYgcHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAgICAgICAgZW52ID0gcHJlbG9hZGVkLmVudjtcbiAgICAgICAgICAgIHVzZVByZXZpZXcgPSBwcmVsb2FkZWQucHJldmlldztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVzZSBwcm92aWRlZCBwYXJhbXMgb3IgZGVmYXVsdHNcbiAgICAgICAgICAgIGVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9kZWZhdWx0RW52O1xuICAgICAgICAgICAgLy8gSWYgcHJldmlldyBleHBsaWNpdGx5IHRydWUgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSBmYWxzZSBcdTIxOTIgZmFsc2VcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgdW5kZWZpbmVkOiBlbnYgd2FzIHNwZWNpZmllZCAodmlhIHBhcmFtIG9yIHNldEVudmlyb25tZW50KSBcdTIxOTIgZmFsc2UsIG90aGVyd2lzZSBcdTIxOTIgdHJ1ZVxuICAgICAgICAgICAgY29uc3QgaGFzRWZmZWN0aXZlRW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2VudkV4cGxpY2l0bHlTZXQ7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJldmlldyA9PT0gdHJ1ZSA/IHRydWUgOiAocHJldmlldyA9PT0gZmFsc2UgPyBmYWxzZSA6ICFoYXNFZmZlY3RpdmVFbnYpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb21wb25lbnRJZH06JHtlbnZ9OiR7dXNlUHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2xvdWRSZXBvc2l0b3J5XSBmZXRjaENvbXBvbmVudFYyJywge1xuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudElkLnNsaWNlKDAsIDgpICsgJy4uLicsXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICB1c2VQcmV2aWV3LFxuICAgICAgICAgICAgY2FjaGVLZXksXG4gICAgICAgICAgICBjYWNoZWQ6IGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSkge1xuICAgICAgICAgICAgLy8gVHJhY2sgdGhpcyBhcyBwcmVsb2FkZWQgKGZpcnN0IGZldGNoIGNvdW50cyBhcyBwcmVsb2FkKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jb25zdW1lP2lkPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwcmV2aWV3PXRydWUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFudCA9IGpzb24uaXRlbTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBub3QgZm91bmRgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhbnQuY29uc3VtZV92YXJpYW50IHx8ICF2YXJpYW50LmNvbnN1bWVfdmFyaWFudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiIGhhcyBubyBpbXBsZW1lbnRhdGlvbiBmb3IgZW52aXJvbm1lbnQgXCIke2Vudn1cImApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbmZpZyA9IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyh2YXJpYW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhZyB0aGUgUHJvbWlzZSBzbyBnZXRSZXNvbHZlZENvbmZpZyBjYW4gcmVhZCBpdCBzeW5jaHJvbm91c2x5XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGNvbXBvbmVudENvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91cyB2ZXJzaW9uIG9mIGZldGNoQ29tcG9uZW50VjIgXHUyMDE0IHJldHVybnMgdGhlIGNvbmZpZyBvbmx5IGlmXG4gICAgICogdGhlIGZldGNoIGFscmVhZHkgY29tcGxldGVkLCBudWxsIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIFVzZXMgdGhlIHNhbWUgYHRoaXMudmFyaWFudHNgIGNhY2hlIHRoYXQgZmV0Y2hDb21wb25lbnRWMi9wcmVsb2FkQ29tcG9uZW50c1xuICAgICAqIHBvcHVsYXRlLiBFYWNoIGNhY2hlZCBQcm9taXNlIGlzIHRhZ2dlZCB3aXRoIGEgYC5yZXNvbHZlZGAgcHJvcGVydHkgd2hlblxuICAgICAqIGl0IHNldHRsZXMgXHUyMDE0IHRoaXMgbWV0aG9kIGp1c3QgcmVhZHMgdGhhdCBwcm9wZXJ0eS4gTm8gc2VwYXJhdGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBXaHkgdGhpcyBleGlzdHM6IFJlYWN0IE5hdGl2ZSBuZWVkcyB0aGUgY29uZmlnIGF0IHJlbmRlciB0aW1lIHRvIGVtYmVkIGl0XG4gICAgICogaW4gdGhlIFdlYlZpZXcgSFRNTCAoY2FuJ3QgYXdhaXQgaW4gdXNlU3RhdGUpLiBJZiBwcmVsb2FkQ29tcG9uZW50cyByYW5cbiAgICAgKiBlYXJsaWVyIGFuZCB0aGUgZmV0Y2ggY29tcGxldGVkLCB0aGlzIHJldHVybnMgdGhlIHJlc3VsdCBzeW5jaHJvbm91c2x5LFxuICAgICAqIHNraXBwaW5nIHRoZSBXRUJWSUVXX1JFQURZIFx1MjE5MiBmZXRjaCBcdTIxOTIgaW5qZWN0IHJvdW5kIHRyaXAgZW50aXJlbHkuXG4gICAgICovXG4gICAgZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IElDb21wb25lbnRDb25maWcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkID0gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQYXJhbXMgPSBlbnYgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IHJlc29sdmVkRW52OiBzdHJpbmc7XG4gICAgICAgIGxldCB1c2VQcmV2aWV3OiBib29sZWFuO1xuXG4gICAgICAgIGlmICghaGFzRXhwbGljaXRQYXJhbXMgJiYgcHJlbG9hZGVkKSB7XG4gICAgICAgICAgICByZXNvbHZlZEVudiA9IHByZWxvYWRlZC5lbnY7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJlbG9hZGVkLnByZXZpZXc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlZEVudiA9IGVudiB8fCB0aGlzLl9kZWZhdWx0RW52O1xuICAgICAgICAgICAgY29uc3QgaGFzRWZmZWN0aXZlRW52ID0gZW52IHx8IHRoaXMuX2VudkV4cGxpY2l0bHlTZXQ7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJldmlldyA9PT0gdHJ1ZSA/IHRydWUgOiAocHJldmlldyA9PT0gZmFsc2UgPyBmYWxzZSA6ICFoYXNFZmZlY3RpdmVFbnYpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb21wb25lbnRJZH06JHtyZXNvbHZlZEVudn06JHt1c2VQcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWA7XG4gICAgICAgIHJldHVybiB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XT8ucmVzb2x2ZWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gVjEgTWV0aG9kcyAoTGVnYWN5KSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjEgY29tcG9uZW50IGZyb20gYSBmbG93XG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGZsb3dJZCkge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50c1swXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtjb21wb25lbnRJZH0mYXV0bz10cnVlYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tmbG93SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbZmxvd0lkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tmbG93SWRdO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5ID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGZldGNoQ29tcG9uZW50VjIgb3IgZmV0Y2hDb21wb25lbnRWMSBleHBsaWNpdGx5XG4gICAgICogRGVmYXVsdHMgdG8gdjEgYmVoYXZpb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQsIGZsb3dJZCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBDbG91ZFJlcG9zaXRvcnkgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgdjJfQ2xvdWRSZXBvc2l0b3J5ID0gQ2xvdWRSZXBvc2l0b3J5O1xuIiwgImV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG4iLCAiaW1wb3J0IHsgQ2xvdWRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5cbmxldCBfY2xvdWRSZXBvc2l0b3J5ID0gQ2xvdWRSZXBvc2l0b3J5Lk1haW47XG5cbmV4cG9ydCBjb25zdCBnZXRDbG91ZFJlcG9zaXRvcnkgPSAoKSA9PiBfY2xvdWRSZXBvc2l0b3J5O1xuXG5leHBvcnQgY29uc3QgaXNQcmVsb2FkZWQgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmlzUHJlbG9hZGVkKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFByZWxvYWRlZFBhcmFtcyA9IChjb21wb25lbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbmFibGVMb2NhbERldiA9ICgpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeShcImh0dHA6Ly9sb2NhbGhvc3Q6OTI5MlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnlVcmwgPSAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeSh1cmwpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldENsb3VkUmVwb3NpdG9yeSA9IChyZXBvc2l0b3J5OiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRFbnZpcm9ubWVudCA9IChlbnY6IHN0cmluZykgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RW52aXJvbm1lbnQoZW52KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNvbHZlZENvbmZpZyA9IChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG59O1xuXG5leHBvcnQgY29uc3QgcHJlbG9hZENvbXBvbmVudHMgPSBhc3luYyAoaWRzOiBzdHJpbmdbXSwgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgIGlkcy5tYXAoKGlkKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmZldGNoQ29tcG9uZW50VjIoaWQsIGVudiwgcHJldmlldykpLFxuICAgICk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR08sSUFBTSxTQUFTLE1BQU07QUFDeEIsU0FBTyx1Q0FBdUM7QUFBQSxJQUFRO0FBQUEsSUFBVSxRQUMzRCxDQUFDLElBQUksT0FB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Q3pCLENBQU8sU0FBUyxXQUFXO0FBQ3ZCLGdCQUFJO0FBQ0Esb0JBQU0sTUFBTSxNQUFNO0FBQUEsZ0JBQ2QsR0FBRyxLQUFLLFFBQVEsWUFBWSxNQUFNO0FBQUEsY0FDdEM7QUFDQSxvQkFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLHNCQUFRLEtBQUssSUFBSTtBQUFBLFlBQ3JCLFNBQVMsR0FBRztBQUNSLHFCQUFPLENBQUM7QUFBQSxZQUNaO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsYUFBTyxNQUFNLEtBQUssVUFBVSxNQUFNO0FBQUEsSUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFNLGVBQWUsYUFBcUIsUUFBaUI7QUFBQTtBQUN2RCxhQUFPLEtBQUssaUJBQWlCLGFBQWEsTUFBTTtBQUFBLElBQ3BEO0FBQUE7QUFDSjtBQTFQSSxjQURTLGtCQUNNLFNBQWdDO0FBRDVDLElBQU0sa0JBQU47QUFnUUEsSUFBTSxxQkFBcUI7OztBQ2pXM0IsSUFBTSxPQUFPLENBQU8sV0FBZ0I7QUFDdkMsU0FBTyxNQUFNLE9BQU87QUFDeEI7OztBQ0FBLElBQUksbUJBQW1CLGdCQUFnQjtBQUVoQyxJQUFNLHFCQUFxQixNQUFNO0FBRWpDLElBQU0sY0FBYyxDQUFDLGFBQXFCLEtBQWMsWUFBK0I7QUFDMUYsU0FBTyxpQkFBaUIsWUFBWSxhQUFhLEtBQUssT0FBTztBQUNqRTtBQUVPLElBQU0scUJBQXFCLENBQUMsZ0JBQXdCO0FBQ3ZELFNBQU8saUJBQWlCLG1CQUFtQixXQUFXO0FBQzFEO0FBRU8sSUFBTSxpQkFBaUIsTUFBTTtBQUNoQyxxQkFBbUIsSUFBSSxnQkFBZ0IsdUJBQXVCO0FBQ2xFO0FBRU8sSUFBTSx3QkFBd0IsQ0FBQyxRQUFnQjtBQUNsRCxxQkFBbUIsSUFBSSxnQkFBZ0IsR0FBRztBQUM5QztBQUVPLElBQU0scUJBQXFCLENBQUMsZUFBZ0M7QUFDL0QscUJBQW1CO0FBQ3ZCO0FBRU8sSUFBTSxpQkFBaUIsQ0FBQyxRQUFnQjtBQUMzQyxtQkFBaUIsZUFBZSxHQUFHO0FBQ3ZDO0FBRU8sSUFBTSxvQkFBb0IsQ0FBQyxhQUFxQixLQUFjLFlBQXNCO0FBQ3ZGLFNBQU8saUJBQWlCLGtCQUFrQixhQUFhLEtBQUssT0FBTztBQUN2RTtBQUVPLElBQU0sb0JBQW9CLENBQU8sS0FBZSxLQUFjLFlBQXNCO0FBQ3ZGLFNBQU8sUUFBUTtBQUFBLElBQ1gsSUFBSSxJQUFJLENBQUMsT0FBTyxpQkFBaUIsaUJBQWlCLElBQUksS0FBSyxPQUFPLENBQUM7QUFBQSxFQUN2RTtBQUNKOyIsCiAgIm5hbWVzIjogWyJtYXRjaCIsICJzY3JpcHRJbnB1dHMiLCAic2NyaXB0SW5wdXRzIl0KfQo=