@omujs/omu 0.9.29 → 0.9.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/omu.js CHANGED
@@ -2463,26 +2463,12 @@ class I18nExtension {
2463
2463
  omu;
2464
2464
  type = I18N_EXTENSION_TYPE;
2465
2465
  localesRegistry;
2466
- locales;
2467
- defaultLocales;
2468
2466
  constructor(omu) {
2469
2467
  this.omu = omu;
2470
2468
  this.localesRegistry = omu.registries.get(I18N_LOCALES_REGISTRY_TYPE);
2471
- this.localesRegistry.listen((locale) => {
2472
- this.locales = locale;
2473
- });
2474
- }
2475
- getLocales() {
2476
- if (this.locales && this.locales.length > 0) {
2477
- return this.locales;
2478
- }
2479
- if (!this.defaultLocales || this.defaultLocales.length === 0) {
2480
- throw new Error("Default locales are not set");
2481
- }
2482
- return this.defaultLocales;
2483
2469
  }
2484
2470
  translate(localizedText) {
2485
- const locales = this.getLocales();
2471
+ const locales = this.localesRegistry.value;
2486
2472
  if (typeof localizedText === "string") {
2487
2473
  return localizedText;
2488
2474
  }
@@ -4628,5 +4614,5 @@ export {
4628
4614
  Omu
4629
4615
  };
4630
4616
 
4631
- //# debugId=A460206AEF23AC8364756E2164756E21
4632
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FwaS9leHRlbnNpb24tcmVnaXN0cnkudHMiLCAiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvaWRlbnRpZmllci50cyIsICIuLi8uLi9zcmMvYXBpL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvY29uc3QudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9ieXRlYnVmZmVyLnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvc2VyaWFsaXplci50cyIsICIuLi8uLi9zcmMvYXBpL2VuZHBvaW50L2VuZHBvaW50LnRzIiwgIi4uLy4uL3NyYy9hcGkvYXNzZXQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9yZWdpc3RyeS50cyIsICIuLi8uLi9zcmMvYXBpL3RhYmxlL3RhYmxlLnRzIiwgIi4uLy4uL3NyYy9hcGkvZGFzaGJvYXJkL3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS9kYXNoYm9hcmQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL2FwaS9lbmRwb2ludC9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvZW5kcG9pbnQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvaHR0cC9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2V2ZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9sb2NrLnRzIiwgIi4uLy4uL3NyYy9hcGkvcmVnaXN0cnkvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL3JlZ2lzdHJ5L2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL2kxOG4vZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvbG9nZ2VyL3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS9sb2dnZXIvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvcGVybWlzc2lvbi9wZXJtaXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvcGVybWlzc2lvbi9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9wbHVnaW4vZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvdGFibGUvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL3RhYmxlL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3NlcnZlci9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9zZXNzaW9uL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3NpZ25hbC9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvc2lnbmFsL3NpZ25hbC50cyIsICIuLi8uLi9zcmMvYXBpL3NpZ25hbC9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2Vycm9ycy50cyIsICIuLi8uLi9zcmMvdmVyc2lvbi50cyIsICIuLi8uLi9zcmMvbmV0d29yay9jb25uZWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL2VuY3J5cHRpb24udHMiLCAiLi4vLi4vc3JjL25ldHdvcmsvbmV0d29yay50cyIsICIuLi8uLi9zcmMvbmV0d29yay93ZWJzb2NrZXQtdHJhbnNwb3J0LnRzIiwgIi4uLy4uL3NyYy9oZWxwZXIudHMiLCAiLi4vLi4vc3JjL3Rva2VuLnRzIiwgIi4uLy4uL3NyYy9vbXUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi9leHRlbnNpb24uanMnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnkge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXh0ZW5zaW9uTWFwOiBNYXA8c3RyaW5nLCBFeHRlbnNpb24+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge31cblxuICAgIHJlZ2lzdGVyPFQgZXh0ZW5kcyBFeHRlbnNpb24+KHR5cGU6IEV4dGVuc2lvblR5cGU8VD4pOiBUIHtcbiAgICAgICAgaWYgKHRoaXMuZXh0ZW5zaW9uTWFwLmhhcyh0eXBlLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVuc2lvbiB0eXBlICR7dHlwZS5uYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSB0eXBlLmNyZWF0ZSh0aGlzLm9tdSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uTWFwLnNldCh0eXBlLm5hbWUsIGV4dGVuc2lvbik7XG4gICAgICAgIHJldHVybiBleHRlbnNpb247XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGUgfSBmcm9tICcuL2xvY2FsaXphdGlvbi9sb2NhbGUuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgQXBwTWV0YWRhdGEgPSB7XG4gICAgbG9jYWxlOiBMb2NhbGU7XG4gICAgbmFtZT86IExvY2FsaXplZFRleHQ7XG4gICAgaWNvbj86IExvY2FsaXplZFRleHQ7XG4gICAgZGVzY3JpcHRpb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGltYWdlPzogTG9jYWxpemVkVGV4dDtcbiAgICBzaXRlPzogTG9jYWxpemVkVGV4dDtcbiAgICByZXBvc2l0b3J5PzogTG9jYWxpemVkVGV4dDtcbiAgICBhdXRob3JzPzogTG9jYWxpemVkVGV4dDtcbiAgICBsaWNlbnNlPzogTG9jYWxpemVkVGV4dDtcbiAgICB0YWdzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBBcHBUeXBlID0gJ2FwcCcgfCAnc2VydmljZScgfCAncmVtb3RlJyB8ICdwbHVnaW4nIHwgJ2Rhc2hib2FyZCc7XG5cbmV4cG9ydCB0eXBlIERlcGVuZGVuY3lTcGVjaWZpZXIgPSB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIGluZGV4Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwSnNvbiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IEFwcFR5cGU7XG4gICAgcGFyZW50X2lkPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG59O1xuXG5leHBvcnQgY2xhc3MgQXBwIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEFwcFR5cGU7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhcmVudElkPzogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIHB1YmxpYyByZWFkb25seSBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IEludG9JZCwgb3B0aW9uczoge1xuICAgICAgICB0eXBlPzogQXBwVHlwZTtcbiAgICAgICAgcGFyZW50SWQ/OiBJbnRvSWQ7XG4gICAgICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgICAgIHVybD86IHN0cmluZztcbiAgICAgICAgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICAgICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG4gICAgfSkge1xuICAgICAgICB0aGlzLmlkID0gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICAgICAgdGhpcy5wYXJlbnRJZCA9IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKG9wdGlvbnMucGFyZW50SWQpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb247XG4gICAgICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmw7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgPz8gJ2FwcCc7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gb3B0aW9ucy5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpbmZvOiBBcHBKc29uKTogQXBwIHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkoaW5mby5pZCk7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKGlkLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogSWRlbnRpZmllci5mcm9tT3B0aW9uYWwoaW5mby5wYXJlbnRfaWQpLFxuICAgICAgICAgICAgdmVyc2lvbjogaW5mby52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBpbmZvLnVybCxcbiAgICAgICAgICAgIHR5cGU6IGluZm8udHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBpbmZvLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBpbmZvLmRlcGVuZGVuY2llcyA/PyB7fSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogQXBwKTogQXBwSnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogZGF0YS5pZC5rZXkoKSxcbiAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgIHBhcmVudF9pZDogZGF0YS5wYXJlbnRJZD8ua2V5KCksXG4gICAgICAgICAgICB2ZXJzaW9uOiBkYXRhLnZlcnNpb24sXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IGRhdGEuZGVwZW5kZW5jaWVzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGhzOiBzdHJpbmdbXSk6IEFwcCB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKHRoaXMuaWQuam9pbiguLi5wYXRocyksIHtcbiAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuL2FwcCc7XG5cbmNvbnN0IE5BTUVTUEFDRV9SRUdFWCA9IC9eKFxcLlteLzouXXxbXFx3LV0pKyQvO1xuY29uc3QgTkFNRV9SRUdFWCA9IC9eW14vOl0rJC87XG5cbmV4cG9ydCB0eXBlIEludG9JZCA9IElkZW50aWZpZXIgfCBzdHJpbmcgfCBFeHRlbnNpb25UeXBlIHwgQXBwO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpZmllciB7XG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmdbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgLi4ucGF0aDogc3RyaW5nW11cbiAgICApIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXIua2V5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uOiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUpzb24oanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tKGlkOiBJbnRvSWQpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgaWYgKGlkIGluc3RhbmNlb2YgSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9IGVsc2UgaWYgKGlkIGluc3RhbmNlb2YgQXBwKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQuaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUtleShpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gaW5mZXJcbiAgICAgICAgICAgIC8vIFZpdGUgZG9lcyBub3QgcHJlc2VydmUgY2xhc3MgaW5mb3JtYXRpb24gd2hlbiBpbXBvcnRpbmcgZnJvbSBkaWZmZXJlbnQgcGFja2FnZXNcbiAgICAgICAgICAgIGNvbnN0IGlkQ2FzdGVkID0gaWQgYXMgeyBuYW1lc3BhY2U6IHN0cmluZzsgcGF0aDogc3RyaW5nW10gfTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgaWRDYXN0ZWQubmFtZXNwYWNlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaWRDYXN0ZWQucGF0aCkgJiZcbiAgICAgICAgICAgICAgICBpZENhc3RlZC5wYXRoLmV2ZXJ5KChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIoaWRDYXN0ZWQubmFtZXNwYWNlLCAuLi5pZENhc3RlZC5wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkV2l0aElkID0gaWQgYXMgeyBpZDogSW50b0lkIHwgdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkV2l0aElkLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb20oaWRXaXRoSWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCB0byBJZGVudGlmaWVyOiAke2lkfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tT3B0aW9uYWwoaWQ6IEludG9JZCB8IHVuZGVmaW5lZCB8IG51bGwpOiBJZGVudGlmaWVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlKG5hbWVzcGFjZTogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIW5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5hbWVzcGFjZTogTmFtZXNwYWNlIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhdGg6IFBhdGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFOQU1FU1BBQ0VfUkVHRVgudGVzdChuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgbXVzdCBtYXRjaCAke05BTUVTUEFDRV9SRUdFWH1gKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcGF0aCkge1xuICAgICAgICAgICAgaWYgKCFOQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGF0aDogTmFtZSBtdXN0IG1hdGNoICR7TkFNRV9SRUdFWH0gYnV0IGdvdCAke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZm9ybWF0KG5hbWVzcGFjZTogc3RyaW5nLCAuLi5wYXRoOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIElkZW50aWZpZXIudmFsaWRhdGUobmFtZXNwYWNlLCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIGAke25hbWVzcGFjZX06JHtwYXRoLmpvaW4oJy8nKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tS2V5KGtleTogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IGtleS5pbmRleE9mKCc6Jyk7XG4gICAgICAgIGlmIChzZXBhcmF0b3IgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5OiBObyBzZXBhcmF0b3IgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5pbmRleE9mKCc6Jywgc2VwYXJhdG9yICsgMSkgIT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5OiBNdWx0aXBsZSBzZXBhcmF0b3JzIGZvdW5kIGluICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IGtleS5zbGljZSgwLCBzZXBhcmF0b3IpO1xuICAgICAgICBjb25zdCBwYXRoID0ga2V5LnNsaWNlKHNlcGFyYXRvciArIDEpO1xuICAgICAgICBpZiAoIW5hbWVzcGFjZSB8fCAhcGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleTogTmFtZXNwYWNlIGFuZCBwYXRoIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGguc3BsaXQoJy8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVXJsKHVybDogc3RyaW5nIHwgVVJMKTogSWRlbnRpZmllciB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gSWRlbnRpZmllci5uYW1lc3BhY2VGcm9tVXJsKHBhcnNlZFVybC5ocmVmKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcnNlZFVybC5wYXRobmFtZS5zbGljZSgxKS5zcGxpdCgnLycpO1xuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIobmFtZXNwYWNlLCAuLi5wYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5hbWVzcGFjZUZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIHJldHVybiBwYXJzZWQuaG9zdG5hbWUuc3BsaXQoJy4nKS5yZXZlcnNlKCkuam9pbignLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21Kc29uKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGpzb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZm9ybWF0KHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleSgpID09PSBvdGhlci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNOYW1lc3BhY2VFcXVhbChvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgPT09IG90aGVyLm5hbWVzcGFjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdWJwYXRoT2Yob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubmFtZXNwYWNlICE9PSBvdGhlci5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXRoLmxlbmd0aCA8IG90aGVyLnBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdGhlci5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXRoW2ldICE9PSBvdGhlci5wYXRoW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGg6IHN0cmluZ1tdKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcih0aGlzLm5hbWVzcGFjZSwgLi4udGhpcy5wYXRoLCAuLi5wYXRoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyTWFwPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hcDogTWFwPHN0cmluZywgVD4gPSBuZXcgTWFwKCk7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudHJpZXM/OiBJdGVyYWJsZTxbSWRlbnRpZmllciwgVF0+LFxuICAgICkge1xuICAgICAgICBpZiAoIWVudHJpZXMpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoaWQua2V5KCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLnNldChpZGVudGlmaWVyLmtleSgpLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5oYXMoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLmRlbGV0ZShpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm1hcC5rZXlzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBUXT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLm1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtJZGVudGlmaWVyLmZyb21LZXkoa2V5KSwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyU2V0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0LnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZChpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0LmFkZChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0LmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuc2V0LmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIElkZW50aWZpZXJdPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuc2V0LmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICAgICAgeWllbGQgW2lkZW50aWZpZXIsIGlkZW50aWZpZXJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIElkZW50aWZpZXJdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uL29tdSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uIHtcbiAgICByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlO1xufVxuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uVHlwZTxUIGV4dGVuZHMgRXh0ZW5zaW9uID0gRXh0ZW5zaW9uPiBleHRlbmRzIElkZW50aWZpZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlOiAob211OiBPbXUpID0+IFQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCdleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxufVxuIiwKICAgICJleHBvcnQgY29uc3QgdGV4dEVuY29kZXI6IFRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5leHBvcnQgY29uc3QgdGV4dERlY29kZXI6IFRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4iLAogICAgImltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uL2NvbnN0LmpzJztcbmltcG9ydCB7IEpzb25UeXBlIH0gZnJvbSAnLi9zZXJpYWxpemVyLmpzJztcblxuZXhwb3J0IGNsYXNzIEZsYWdzIHtcbiAgICBwcml2YXRlIHZhbHVlOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBsZW5ndGg6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgdmFsdWU/OiBudW1iZXI7IGxlbmd0aD86IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlID8/IDA7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0aW9ucy5sZW5ndGggPz8gMzI7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGlmU2V0PFQ+KHBvc2l0aW9uOiBudW1iZXIsIGNhbGxiYWNrOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLmhhcyhwb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChwb3NpdGlvbjogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgfD0gMSA8PCBwb3NpdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgJj0gfigxIDw8IHBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZSh3cml0ZXI6IEJ5dGVXcml0ZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYml0cyA9IG5ldyBVaW50OEFycmF5KCh0aGlzLmxlbmd0aCArIDcpIC8gOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYml0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYml0c1tpXSA9ICh0aGlzLnZhbHVlID4+IChpICogOCkpICYgMHhmZjtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGUoYml0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkKHJlYWRlcjogQnl0ZVJlYWRlciwgbGVuZ3RoOiBudW1iZXIpOiBGbGFncyB7XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGxlbmd0aCArIDcpIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZSB8PSByZWFkZXIucmVhZFVpbnQ4KCkgPDwgKGkgKiA4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZsYWdzKHsgdmFsdWUsIGxlbmd0aCB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHNpZ24gPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDgwMDApID8gLTEgOiAxO1xuICAgIGNvbnN0IGV4cG9uZW50ID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHg3YzAwKSA+PiAxMDtcbiAgICBjb25zdCBtYW50aXNzYSA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4MDNmZik7XG4gICAgaWYgKGV4cG9uZW50ID09PSAwICYmIG1hbnRpc3NhID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IDB4MWYpIHtcbiAgICAgICAgcmV0dXJuIG1hbnRpc3NhID09PSAwID8gSW5maW5pdHkgKiBzaWduIDogTmFOO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50IC0gMTU7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNYW50aXNzYSA9IG1hbnRpc3NhIC8gMTAyNDtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNYXRoLnBvdygyLCBub3JtYWxpemVkRXhwb25lbnQpICogKDEgKyBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2lnbiA9IHZhbHVlIDwgMCA/IDEgOiAwO1xuICAgIHZhbHVlID0gTWF0aC5hYnModmFsdWUpO1xuICAgIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhwb25lbnQgPSBNYXRoLmZsb29yKE1hdGgubG9nMih2YWx1ZSkpO1xuICAgIGNvbnN0IG1hbnRpc3NhID0gdmFsdWUgLyBNYXRoLnBvdygyLCBleHBvbmVudCkgLSAxO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50ICsgMTU7XG4gICAgY29uc3Qgbm9ybWFsaXplZE1hbnRpc3NhID0gTWF0aC5yb3VuZChtYW50aXNzYSAqIDEwMjQpO1xuICAgIGlmIChub3JtYWxpemVkRXhwb25lbnQgPD0gMCkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCBzaWduIDw8IDE1KTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRFeHBvbmVudCA+PSAweDFmKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgKHNpZ24gPDwgMTUpIHwgKG5vcm1hbGl6ZWRFeHBvbmVudCA8PCAxMCkgfCBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVXcml0ZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgYnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgICBwcml2YXRlIG9mZnNldCA9IDA7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoaW5pdD86IEFycmF5QnVmZmVyLCBvZmZzZXQ/OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQgPz8gMDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBpbml0ID8/IG5ldyBBcnJheUJ1ZmZlcigxMDI0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVWludDhBcnJheShidWZmZXI6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICB1aW50OEFycmF5LnNldChuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlV3JpdGVyKGFycmF5QnVmZmVyLCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhbGxvY2F0ZShsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vZmZzZXQgKyBsZW5ndGggPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdCeXRlTGVuZ3RoID0gTWF0aC5tYXgodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCAqIDIsIHRoaXMub2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihuZXdCeXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KG5ld0J1ZmZlcikuc2V0KG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGRhdGE6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG9jYXRlKGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpLnNldChkYXRhLCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVCb29sZWFuKHZhbHVlOiBib29sZWFuKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50OCh0aGlzLm9mZnNldCwgdmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDgodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50NjQodmFsdWU6IGJpZ2ludCk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDgpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEJpZ0ludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ2NCh2YWx1ZTogYmlnaW50KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoOCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0QmlnVWludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVMRUIxMjgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICAvLyBVbnNpZ25lZCBMRUIxMjhcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh2YWx1ZSA+IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCAodmFsdWUgJiAweDdmKSB8IDB4ODApO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgICAgIHZhbHVlID4+PSA3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsIHZhbHVlICYgMHg3Zik7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB3cml0ZUZsb2F0MTYodGhpcy5kYXRhVmlldywgdGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDY0KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRGbG9hdDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ4QXJyYXkodmFsdWU6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVVMRUIxMjgodmFsdWUuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMud3JpdGUodmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTdHJpbmcodmFsdWU6IHN0cmluZyk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlVWludDhBcnJheSh0ZXh0RW5jb2Rlci5lbmNvZGUodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSlNPTih2YWx1ZTogSnNvblR5cGUpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbGFncyhmbGFnczogRmxhZ3MpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgZmxhZ3Mud3JpdGUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlciwgMCwgdGhpcy5vZmZzZXQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVSZWFkZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgb2Zmc2V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZGF0YTogRGF0YVZpZXcpIHtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IGRhdGE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkoYnVmZmVyOiBVaW50OEFycmF5KTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdWludDhBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21BcnJheUJ1ZmZlcihidWZmZXI6IEFycmF5QnVmZmVyKTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmcm9tQmxvYihibG9iOiBCbG9iKTogUHJvbWlzZTxCeXRlUmVhZGVyPiB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWQoc2l6ZTogbnVtYmVyKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpemUgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIHNpemUgPiB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgVWludDhBcnJheSh0aGlzLmRhdGFWaWV3LmJ1ZmZlciwgdGhpcy5vZmZzZXQsIHNpemUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBzaXplO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRCb29sZWFuKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50OCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50NjQoKTogYmlnaW50IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEJpZ0ludDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDY0KCk6IGJpZ2ludCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRCaWdVaW50NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVTEVCMTI4KCk6IG51bWJlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBsZXQgc2hpZnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZTogbnVtYmVyO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ5dGUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB2YWx1ZSB8PSAoYnl0ZSAmIDBiMDExMTExMTEpIDw8IHNoaWZ0O1xuICAgICAgICAgICAgc2hpZnQgKz0gNztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoKGJ5dGUgJiAwYjEwMDAwMDAwKSAhPT0gMCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEZsb2F0MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDY0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRGbG9hdDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDhBcnJheSgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZWFkVUxFQjEyOCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkKGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gdGhpcy5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVBcnJheSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRKU09OPFQgZXh0ZW5kcyBKc29uVHlwZT4oKTogVCB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMucmVhZFN0cmluZygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsYWdzKGxlbmd0aDogbnVtYmVyKTogRmxhZ3Mge1xuICAgICAgICByZXR1cm4gRmxhZ3MucmVhZCh0aGlzLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCAhPT0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5cbmV4cG9ydCB0eXBlIEpzb25UeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgfCB7IFtrZXkgaW4gbmV2ZXJdPzogSnNvblR5cGUgfSB8IEpzb25UeXBlW107XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICBzZXJpYWxpemUoZGF0YTogVCk6IEQ7XG4gICAgZGVzZXJpYWxpemUoZGF0YTogRCk6IFQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZTogKGRhdGE6IFQpID0+IEQsXG4gICAgICAgIHB1YmxpYyBkZXNlcmlhbGl6ZTogKGRhdGE6IEQpID0+IFQsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgb2Y8VCwgRD4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIEQ+KTogU2VyaWFsaXplcjxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihzZXJpYWxpemVyLnNlcmlhbGl6ZSwgc2VyaWFsaXplci5kZXNlcmlhbGl6ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwaXBlPFQsIFIsIEQ+KHNlcjE6IFNlcmlhbGl6YWJsZTxULCBSPiwgc2VyMjogU2VyaWFsaXphYmxlPFIsIEQ+KTogU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcjIuc2VyaWFsaXplKHNlcjEuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIxLmRlc2VyaWFsaXplKHNlcjIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdHJhbnNmb3JtPFQ+KGZ1bmM6ICh2YWx1ZTogVCkgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vb3A8VD4oKTogU2VyaWFsaXplcjxULCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBUPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkPFxuICAgICAgICBLIGV4dGVuZHMga2V5b2YgRCxcbiAgICAgICAgUixcbiAgICA+KFxuICAgICAgICBrZXk6IEssXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxEW0tdLCBSPixcbiAgICApOiBTZXJpYWxpemVyPFxuICAgICAgICBULFxuICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICA+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFxuICAgICAgICAgICAgVCxcbiAgICAgICAgICAgIHsgW1AgaW4ga2V5b2YgRF06IFAgZXh0ZW5kcyBLID8gUiA6IERbUF0gfVxuICAgICAgICA+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2VyaWFsaXplZCxcbiAgICAgICAgICAgICAgICAgICAgW2tleV06IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHNlcmlhbGl6ZWRba2V5XSksXG4gICAgICAgICAgICAgICAgfSBhcyB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGFba2V5XSBhcyBSKSxcbiAgICAgICAgICAgICAgICB9IGFzIEQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMganNvbjxUIGV4dGVuZHMgSnNvblR5cGU+KCk6IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGV4dEVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlcmlhbGl6ZShkYXRhKSkpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BcnJheSgpOiBTZXJpYWxpemVyPFRbXSwgRFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxUW10sIERbXT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuc2VyaWFsaXplKGl0ZW0pKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm1hcCgoaXRlbSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvTWFwKCk6IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxNYXA8c3RyaW5nLCBUPiwgTWFwPHN0cmluZywgRD4+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgRD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgdGhpcy5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmYWxsYmFjayhmYWxsYmFjazogVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tNYXAoZmFsbGJhY2s6IChkYXRhOiBELCBlcnJvcjogdW5rbm93bikgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjayhkYXRhLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGlwZTxFPihzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RCwgRT4pOiBTZXJpYWxpemVyPFQsIEU+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEU+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB0aGlzLmRlc2VyaWFsaXplKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBKc29uVHlwZSwgdHlwZSBTZXJpYWxpemFibGUsIFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRUeXBlPFJlcSA9IHVua25vd24sIFJlcyA9IHVua25vd24+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxSZXEsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVzLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25JZD86IElkZW50aWZpZXIgfCB1bmRlZmluZWQsXG4gICAgKSB7IH1cblxuICAgIHN0YXRpYyBjcmVhdGVKc29uPFJlcSwgUmVzLCBSZXFEYXRhIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZSwgUmVzRGF0YSBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcixcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8UmVxLCBSZXFEYXRhPjtcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxSZXMsIFJlc0RhdGE+O1xuICAgICAgICAgICAgcGVybWlzc2lvbklkPzogSW50b0lkO1xuICAgICAgICB9LFxuICAgICk6IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4ge1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxSZXEsIEpzb25UeXBlLCBVaW50OEFycmF5PihyZXF1ZXN0U2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFJlcywgSnNvblR5cGUsIFVpbnQ4QXJyYXk+KHJlc3BvbnNlU2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgcGVybWlzc2lvbklkID8gSWRlbnRpZmllci5mcm9tKHBlcm1pc3Npb25JZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8UmVxLCBSZXM+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcixcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxSZXEsIFVpbnQ4QXJyYXk+O1xuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVzLCBVaW50OEFycmF5PjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZD86IEludG9JZDtcbiAgICAgICAgfSxcbiAgICApOiBFbmRwb2ludFR5cGU8UmVxLCBSZXM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFR5cGU8UmVxLCBSZXM+KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcixcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCA/IElkZW50aWZpZXIuZnJvbShwZXJtaXNzaW9uSWQpIDogdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5leHBvcnQgY29uc3QgQVNTRVRfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8QXNzZXRFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2Fzc2V0JyxcbiAgICAob211OiBPbXUpID0+IG5ldyBBc3NldEV4dGVuc2lvbihvbXUpLFxuKTtcblxuZXhwb3J0IHR5cGUgQXNzZXQgPSB7XG4gICAgaWRlbnRpZmllcjogSWRlbnRpZmllcjtcbiAgICBidWZmZXI6IFVpbnQ4QXJyYXk7XG59O1xuXG5jb25zdCBGSUxFX1NFUklBTElaRVIgPSBuZXcgU2VyaWFsaXplcjxBc3NldCwgVWludDhBcnJheT4oXG4gICAgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGZpbGUuaWRlbnRpZmllci5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoZmlsZS5idWZmZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH0sXG4gICAgKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJlYWRlci5maW5pc2goKTtcbiAgICAgICAgcmV0dXJuIHsgaWRlbnRpZmllciwgYnVmZmVyIH07XG4gICAgfSxcbik7XG5jb25zdCBGSUxFX0FSUkFZX1NFUklBTElaRVIgPSBuZXcgU2VyaWFsaXplcjxBc3NldFtdLCBVaW50OEFycmF5PihcbiAgICAoZmlsZXMpID0+IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChmaWxlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhmaWxlLmlkZW50aWZpZXIua2V5KCkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShmaWxlLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9LFxuICAgIChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBmaWxlczogQXNzZXRbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgaWRlbnRpZmllciwgYnVmZmVyIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlYWRlci5maW5pc2goKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH0sXG4pO1xuXG5leHBvcnQgY29uc3QgQVNTRVRfVVBMT0FEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBBU1NFVF9FWFRFTlNJT05fVFlQRS5qb2luKCd1cGxvYWQnKTtcbmNvbnN0IEFTU0VUX1VQTE9BRF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPEFzc2V0LCBJZGVudGlmaWVyPihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICd1cGxvYWQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogRklMRV9TRVJJQUxJWkVSLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9Kc29uKCksXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfVVBMT0FEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5jb25zdCBBU1NFVF9VUExPQURfTUFOWV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPEFzc2V0W10sIElkZW50aWZpZXJbXT4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAndXBsb2FkX21hbnknLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogRklMRV9BUlJBWV9TRVJJQUxJWkVSLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9BcnJheSgpLnBpcGUoU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX1VQTE9BRF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuZXhwb3J0IGNvbnN0IEFTU0VUX0RPV05MT0FEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBBU1NFVF9FWFRFTlNJT05fVFlQRS5qb2luKCdkb3dubG9hZCcpO1xuY29uc3QgQVNTRVRfRE9XTkxPQURfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxJZGVudGlmaWVyLCBBc3NldD4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAnZG93bmxvYWQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS5waXBlKFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBGSUxFX1NFUklBTElaRVIsXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfRE9XTkxPQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbmNvbnN0IEFTU0VUX0RPV05MT0FEX01BTllfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxJZGVudGlmaWVyW10sIEFzc2V0W10+KFxuICAgIEFTU0VUX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2Rvd25sb2FkX21hbnknLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCkucGlwZShTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogRklMRV9BUlJBWV9TRVJJQUxJWkVSLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX0RPV05MT0FEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5leHBvcnQgY29uc3QgQVNTRVRfREVMRVRFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBBU1NFVF9FWFRFTlNJT05fVFlQRS5qb2luKCdkZWxldGUnKTtcbmNvbnN0IEFTU0VUX0RFTEVURV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXIsIG51bGw+KFxuICAgIEFTU0VUX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2RlbGV0ZScsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBJZGVudGlmaWVyLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX0RFTEVURV9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuXG5leHBvcnQgY2xhc3MgQXNzZXRFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEFzc2V0RXh0ZW5zaW9uPiA9IEFTU0VUX0VYVEVOU0lPTl9UWVBFO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge31cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWQoaWRlbnRpZmllcjogSW50b0lkLCBidWZmZXI6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPElkZW50aWZpZXI+IHtcbiAgICAgICAgY29uc3QgYXNzZXRJZGVudGlmaWVyID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoQVNTRVRfVVBMT0FEX0VORFBPSU5ULCB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllciksXG4gICAgICAgICAgICBidWZmZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXNzZXRJZGVudGlmaWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWRNYW55KC4uLmZpbGVzOiBBc3NldFtdKTogUHJvbWlzZTxJZGVudGlmaWVyW10+IHtcbiAgICAgICAgY29uc3QgdXBsb2FkZWQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9VUExPQURfTUFOWV9FTkRQT0lOVCwgZmlsZXMpO1xuICAgICAgICByZXR1cm4gdXBsb2FkZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkKGlkZW50aWZpZXI6IEludG9JZCk6IFByb21pc2U8QXNzZXQ+IHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkZWQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9ET1dOTE9BRF9FTkRQT0lOVCwgaWQpO1xuICAgICAgICByZXR1cm4gZG93bmxvYWRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWRNYW55KC4uLmlkZW50aWZpZXJzOiBJbnRvSWRbXSk6IFByb21pc2U8QXNzZXRbXT4ge1xuICAgICAgICBjb25zdCBkb3dubG9hZGVkID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBBU1NFVF9ET1dOTE9BRF9NQU5ZX0VORFBPSU5ULFxuICAgICAgICAgICAgaWRlbnRpZmllcnMubWFwKChpZCkgPT4gSWRlbnRpZmllci5mcm9tKGlkKSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBkb3dubG9hZGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGUoaWRlbnRpZmllcjogSW50b0lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpO1xuICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9ERUxFVEVfRU5EUE9JTlQsIGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXJsKFxuICAgICAgICBpZDogSW50b0lkLFxuICAgICAgICBvcHRpb25zPzogeyBjYWNoZT86ICduby1jYWNoZScgfSxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBrZXkgPSBJZGVudGlmaWVyLmZyb20oaWQpLmtleSgpO1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5vbXUubmV0d29yay5hZGRyZXNzO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IGFkZHJlc3Muc2VjdXJlID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgaWYgKG9wdGlvbnM/LmNhY2hlID09PSAnbm8tY2FjaGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7cHJvdG9jb2x9Oi8vJHthZGRyZXNzLmhvc3R9OiR7YWRkcmVzcy5wb3J0fS9hc3NldD9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfSZ0PSR7RGF0ZS5ub3coKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke2FkZHJlc3MuaG9zdH06JHthZGRyZXNzLnBvcnR9L2Fzc2V0P2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHkodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5vbXUubmV0d29yay5hZGRyZXNzO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IGFkZHJlc3Muc2VjdXJlID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7YWRkcmVzcy5ob3N0fToke2FkZHJlc3MucG9ydH0vcHJveHk/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVybCl9YDtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSnNvblR5cGUsIHR5cGUgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgUGFja2V0RGF0YSA9IHtcbiAgICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZGF0YTogVWludDhBcnJheTtcbn07XG5cbmV4cG9ydCB0eXBlIFBhY2tldDxUID0gdW5rbm93bj4gPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogUGFja2V0VHlwZTxUPjtcbiAgICByZWFkb25seSBkYXRhOiBUO1xufTtcblxuZXhwb3J0IGNsYXNzIFBhY2tldFR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZXcoZGF0YTogVCk6IFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIG1hdGNoKHBhY2tldDogUGFja2V0KTogcGFja2V0IGlzIFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiBwYWNrZXQudHlwZSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSWRlbnRpZmllciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBQYWNrZXRUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXRUeXBlPFQ+KFxuICAgICAgICAgICAgaWRlbnRpZmllci5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICB9KTogUGFja2V0VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFja2V0VHlwZShcbiAgICAgICAgICAgIGlkZW50aWZpZXIuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IEpzb25UeXBlLCBTZXJpYWxpemFibGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnlQZXJtaXNzaW9uc0pTT04ge1xuICAgIGFsbD86IHN0cmluZztcbiAgICByZWFkPzogc3RyaW5nO1xuICAgIHdyaXRlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5UGVybWlzc2lvbnMge1xuICAgIGFsbD86IEludG9JZDtcbiAgICByZWFkPzogSW50b0lkO1xuICAgIHdyaXRlPzogSW50b0lkO1xufVxuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFZhbHVlOiBULFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFJlZ2lzdHJ5UGVybWlzc2lvbnMsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSW50b0lkLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogVDtcbiAgICAgICAgcGVybWlzc2lvbnM/OiBSZWdpc3RyeVBlcm1pc3Npb25zO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBSZWdpc3RyeVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5VHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJbnRvSWQsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBUO1xuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgICAgIHBlcm1pc3Npb25zPzogUmVnaXN0cnlQZXJtaXNzaW9ucztcbiAgICB9KTogUmVnaXN0cnlUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeVR5cGUoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyA/PyB7fSxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnk8VD4ge1xuICAgIHJlYWRvbmx5IHR5cGU6IFJlZ2lzdHJ5VHlwZTxUPjtcbiAgICByZWFkb25seSB2YWx1ZTogVDtcbiAgICBnZXQoKTogUHJvbWlzZTxUPjtcbiAgICBzZXQodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+O1xuICAgIG1vZGlmeShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+O1xuICAgIGxpc3RlbihmbjogKHZhbHVlOiBUKSA9PiB2b2lkKTogVW5saXN0ZW47XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgRXZlbnRFbWl0dGVyLCBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBKc29uVHlwZSwgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbmZpZyA9IHtcbiAgICBjYWNoZV9zaXplOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlPFQ+IHtcbiAgICByZWFkb25seSBjYWNoZTogUmVhZG9ubHlNYXA8c3RyaW5nLCBUPjtcbiAgICByZWFkb25seSBldmVudDogVGFibGVFdmVudHM8VD47XG4gICAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgICBnZXRNYW55KC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgYWRkKC4uLml0ZW06IFRbXSk6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKC4uLml0ZW06IFRbXSk6IFByb21pc2U8dm9pZD47XG4gICAgcmVtb3ZlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNsZWFyKCk6IFByb21pc2U8dm9pZD47XG4gICAgaGFzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICBoYXNNYW55PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oLi4ua2V5czogKGtleW9mIFQpW10pOiBQcm9taXNlPHsgW2tleSBpbiBrZXlvZiBUXTogYm9vbGVhbiB9PjtcbiAgICBoYXNBbGwoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGhhc0FueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgICBmZXRjaEl0ZW1zKHtcbiAgICAgICAgbGltaXQsXG4gICAgICAgIGJhY2t3YXJkLFxuICAgICAgICBjdXJzb3IsXG4gICAgfToge1xuICAgICAgICBsaW1pdDogbnVtYmVyO1xuICAgICAgICBiYWNrd2FyZD86IGJvb2xlYW47XG4gICAgICAgIGN1cnNvcj86IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgZmV0Y2hSYW5nZSh7IHN0YXJ0LCBlbmQgfTogeyBzdGFydDogc3RyaW5nOyBlbmQ6IHN0cmluZyB9KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgZmV0Y2hBbGwoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgaXRlcmF0ZSh7IGJhY2t3YXJkLCBjdXJzb3IgfTogeyBiYWNrd2FyZD86IGJvb2xlYW47IGN1cnNvcj86IHN0cmluZyB9KTogQXN5bmNJdGVyYWJsZTxUPjtcbiAgICBzaXplKCk6IFByb21pc2U8bnVtYmVyPjtcblxuICAgIHByb3h5KHByb3h5OiAoaXRlbTogVCkgPT4gVCB8IHVuZGVmaW5lZCk6IFVubGlzdGVuO1xuICAgIHNldENhY2hlU2l6ZShzaXplOiBudW1iZXIpOiB2b2lkO1xuICAgIHNldENvbmZpZyhjb25maWc6IFRhYmxlQ29uZmlnKTogdm9pZDtcbiAgICBzZXRQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogVGFibGVQZXJtaXNzaW9ucyk6IHZvaWQ7XG5cbiAgICBsaXN0ZW4obGlzdGVuZXI/OiAoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KSA9PiB2b2lkKTogVW5saXN0ZW47XG59XG5cbmV4cG9ydCB0eXBlIFRhYmxlRXZlbnRzPFQ+ID0ge1xuICAgIGFkZDogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIHVwZGF0ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIHJlbW92ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIGNsZWFyOiBFdmVudEVtaXR0ZXI8W10+O1xuICAgIGNhY2hlVXBkYXRlOiBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZVBlcm1pc3Npb25zID0ge1xuICAgIGFsbD86IElkZW50aWZpZXI7XG4gICAgcmVhZD86IElkZW50aWZpZXI7XG4gICAgd3JpdGU/OiBJZGVudGlmaWVyO1xuICAgIHJlbW92ZT86IElkZW50aWZpZXI7XG4gICAgcHJveHk/OiBJZGVudGlmaWVyO1xufTtcblxuZXhwb3J0IGNsYXNzIFRhYmxlVHlwZTxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIGtleUZ1bmN0aW9uOiAoaXRlbTogVCkgPT4gc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zIHwgdW5kZWZpbmVkLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiAoaXRlbTogVCkgPT4gc3RyaW5nO1xuICAgICAgICAgICAgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zO1xuICAgICAgICAgICAgc2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxULCBEPjtcbiAgICAgICAgfSxcbiAgICApOiBUYWJsZVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucz86IFRhYmxlUGVybWlzc2lvbnM7XG4gICAgICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgICAgIH0sXG4gICAgKTogVGFibGVUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVR5cGU8VD4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgQXBwSW5zdGFsbFJlc3BvbnNlID0ge1xuICAgIGFjY2VwdGVkOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BGaWxlID0ge1xuICAgIHR5cGU6ICdmaWxlJyB8ICdkaXJlY3RvcnknO1xuICAgIHNpemU6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFBvc2l0aW9uID0ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRW50ZXIgPSB7XG4gICAgdHlwZTogJ2VudGVyJztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgZmlsZXM6IERyYWdEcm9wRmlsZVtdO1xuICAgIHBvc2l0aW9uOiBEcmFnRHJvcFBvc2l0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ092ZXIgPSB7XG4gICAgdHlwZTogJ292ZXInO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbiAgICBwb3NpdGlvbjogRHJhZ0Ryb3BQb3NpdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wID0ge1xuICAgIHR5cGU6ICdkcm9wJztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgcG9zaXRpb246IERyYWdEcm9wUG9zaXRpb247XG4gICAgZmlsZXM6IERyYWdEcm9wRmlsZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0xlYXZlID0ge1xuICAgIHR5cGU6ICdsZWF2ZSc7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ1N0YXRlID0gRHJhZ0VudGVyIHwgRHJhZ092ZXIgfCBEcmFnRHJvcCB8IERyYWdMZWF2ZTtcblxuZXhwb3J0IHR5cGUgRmlsZURyYWdQYWNrZXQgPSB7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xuICAgIGFwcDogQXBwO1xuICAgIHN0YXRlOiBEcmFnU3RhdGU7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlYWRSZXF1ZXN0ID0ge1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVhZFJlcXVlc3REYXNoYm9hcmQgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVhZE1ldGEgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbiAgICBmaWxlczogcmVhZG9ubHkgRHJhZ0Ryb3BGaWxlW107XG59O1xuXG5leHBvcnQgdHlwZSBGaWxlRGF0YSA9IHtcbiAgICBmaWxlOiBEcmFnRHJvcEZpbGU7XG4gICAgYnVmZmVyOiBVaW50OEFycmF5O1xufTtcblxuZXhwb3J0IGNsYXNzIERyYWdEcm9wUmVhZFJlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG1ldGE6IERyYWdEcm9wUmVhZE1ldGEsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBmaWxlczogUmVjb3JkPHN0cmluZywgRmlsZURhdGE+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogbnVtYmVyID0gMSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBEcmFnRHJvcFJlYWRSZXNwb25zZSk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KGRhdGEudmVyc2lvbik7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeShkYXRhLm1ldGEpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhkYXRhLmZpbGVzKS5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgeyBmaWxlLCBidWZmZXIgfV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YS5maWxlcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKEpTT04uc3RyaW5naWZ5KGZpbGUpKTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogRHJhZ0Ryb3BSZWFkUmVzcG9uc2Uge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IG1ldGE6IERyYWdEcm9wUmVhZE1ldGEgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcblxuICAgICAgICBjb25zdCBmaWxlczogUmVjb3JkPHN0cmluZywgRmlsZURhdGE+ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCBmaWxlOiBEcmFnRHJvcEZpbGUgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgICAgICBmaWxlc1trZXldID0geyBmaWxlLCBidWZmZXIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRHJhZ0Ryb3BSZWFkUmVzcG9uc2UoXG4gICAgICAgICAgICBtZXRhLFxuICAgICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BSZXF1ZXN0ID0gb2JqZWN0O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlcXVlc3REYXNoYm9hcmQgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGFwcDogQXBwSnNvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVxdWVzdFJlc3BvbnNlID0ge1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICBvazogYm9vbGVhbjtcbn07XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQvcGFja2V0LmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUGVybWlzc2lvblR5cGVKc29uIH0gZnJvbSAnLi4vcGVybWlzc2lvbi9wZXJtaXNzaW9uLmpzJztcbmltcG9ydCB7IFBhY2thZ2VJbmZvIH0gZnJvbSAnLi4vcGx1Z2luL3BhY2thZ2UtaW5mby5qcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgUmVnaXN0cnlUeXBlIH0gZnJvbSAnLi4vcmVnaXN0cnkvcmVnaXN0cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBUYWJsZSB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLmpzJztcbmltcG9ydCB7IFRhYmxlVHlwZSB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLmpzJztcblxuaW1wb3J0IHR5cGUgeyBEYXNoYm9hcmRIYW5kbGVyIH0gZnJvbSAnLi9oYW5kbGVyLmpzJztcbmltcG9ydCB7IEFwcEluc3RhbGxSZXNwb25zZSwgRHJhZ0Ryb3AsIERyYWdEcm9wUmVhZFJlcXVlc3QsIERyYWdEcm9wUmVhZFJlcXVlc3REYXNoYm9hcmQsIERyYWdEcm9wUmVhZFJlc3BvbnNlLCBEcmFnRHJvcFJlcXVlc3QsIERyYWdEcm9wUmVxdWVzdERhc2hib2FyZCwgRHJhZ0Ryb3BSZXF1ZXN0UmVzcG9uc2UsIERyYWdFbnRlciwgRHJhZ0xlYXZlLCBEcmFnT3ZlciwgRmlsZURyYWdQYWNrZXQgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuXG5leHBvcnQgY29uc3QgREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPERhc2hib2FyZEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnZGFzaGJvYXJkJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBEYXNoYm9hcmRFeHRlbnNpb24ob211KSxcbik7XG5cbnR5cGUgRGFzaGJvYXJkU2V0UmVzcG9uc2UgPSB7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbn07XG5leHBvcnQgY29uc3QgREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3NldCcpO1xuY29uc3QgREFTSEJPQVJEX1NFVF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXIsIERhc2hib2FyZFNldFJlc3BvbnNlPihcbiAgICBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAnc2V0JyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG4gICAgICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9PUEVOX0FQUF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcCcsICdvcGVuJyk7XG5jb25zdCBEQVNIQk9BUkRfT1BFTl9BUFBfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxBcHAsIHZvaWQ+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdvcGVuX2FwcCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IEFwcCxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9PUEVOX0FQUF9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBEQVNIQk9BUkRfT1BFTl9BUFBfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEFwcD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ29wZW5fYXBwJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG59KTtcbmV4cG9ydCBjb25zdCBEQVNIT0JBUkRfQVBQX1JFQURfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHAnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IERBU0hPQkFSRF9BUFBfRURJVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcCcsICdlZGl0Jyk7XG5leHBvcnQgY29uc3QgREFTSEJPQVJEX0FQUF9JTlNUQUxMX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignYXBwJywgJ2luc3RhbGwnKTtcbmNvbnN0IERBU0hCT0FSRF9BUFBfSU5TVEFMTF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPEFwcCwgQXBwSW5zdGFsbFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaW5zdGFsbF9hcHAnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBBcHAsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfQVBQX0lOU1RBTExfUEVSTUlTU0lPTl9JRCxcbn0pO1xuZXhwb3J0IGNvbnN0IERBU2hCT0FSRF9EUkFHX0RST1BfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdkcmFnX2Ryb3AnKTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfU1RBVEVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEZpbGVEcmFnUGFja2V0PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3N0YXRlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8RmlsZURyYWdQYWNrZXQ+KClcbiAgICAgICAgLmZpZWxkKCdhcHAnLCBBcHApLFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEcmFnRHJvcFJlYWRSZXF1ZXN0LCBEcmFnRHJvcFJlYWRSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZWFkJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBEcmFnRHJvcFJlYWRSZXNwb25zZSxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFUVVFU1RfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPERyYWdEcm9wUmVhZFJlcXVlc3REYXNoYm9hcmQ+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVhZF9yZXF1ZXN0Jyxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFU1BPTlNFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEcmFnRHJvcFJlYWRSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZWFkX3Jlc3BvbnNlJyxcbiAgICBzZXJpYWxpemVyOiBEcmFnRHJvcFJlYWRSZXNwb25zZSxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248RHJhZ0Ryb3BSZXF1ZXN0LCBEcmFnRHJvcFJlcXVlc3RSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZXF1ZXN0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU2hCT0FSRF9EUkFHX0RST1BfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxEcmFnRHJvcFJlcXVlc3REYXNoYm9hcmQ+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVxdWVzdCcsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9BUFBST1ZBTF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RHJhZ0Ryb3BSZXF1ZXN0UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVxdWVzdF9hcHByb3ZhbCcsXG59KTtcblxudHlwZSBEcmFnRHJvcEhhbmRsZXIgPSB7XG4gICAgb25FbnRlcihmbjogKGV2ZW50OiBEcmFnRW50ZXIpID0+IHVua25vd24pOiB2b2lkO1xuICAgIG9uT3ZlcihmbjogKGV2ZW50OiBEcmFnT3ZlcikgPT4gdW5rbm93bik6IHZvaWQ7XG4gICAgb25Ecm9wKGZuOiAoZXZlbnQ6IERyYWdEcm9wKSA9PiB1bmtub3duKTogdm9pZDtcbiAgICBvbkxlYXZlKGZuOiAoZXZlbnQ6IERyYWdMZWF2ZSkgPT4gdW5rbm93bik6IHZvaWQ7XG4gICAgcmVhZChpZDogc3RyaW5nKTogUHJvbWlzZTxEcmFnRHJvcFJlYWRSZXNwb25zZT47XG59O1xuXG5leHBvcnQgdHlwZSBDb29raWUgPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3UmVxdWVzdCA9IHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBzY3JpcHQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdQYWNrZXQgPSB7XG4gICAgaWQ6IElkZW50aWZpZXI7XG59O1xuXG5leHBvcnQgdHlwZSBVc2VyUmVzcG9uc2U8VCA9IHVuZGVmaW5lZD4gPSB7XG4gICAgdHlwZTogJ29rJztcbiAgICB2YWx1ZTogVDtcbn0gfCB7XG4gICAgdHlwZTogJ2Jsb2NrZWQnO1xufSB8IHtcbiAgICB0eXBlOiAnY2FuY2VsbGVkJztcbn07XG5leHBvcnQgY2xhc3MgVXNlclJlc3VsdDxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZXN1bHQ6IHtcbiAgICAgICAgICAgIHR5cGU6ICdvayc7XG4gICAgICAgICAgICB2YWx1ZTogVDtcbiAgICAgICAgfSB8IHtcbiAgICAgICAgICAgIHR5cGU6ICdibG9ja2VkJztcbiAgICAgICAgfSB8IHtcbiAgICAgICAgICAgIHR5cGU6ICdjYW5jZWxsZWQnO1xuICAgICAgICB9LFxuICAgICkge31cblxuICAgIHB1YmxpYyB1bndyYXAoKTogVCB7XG4gICAgICAgIGlmICh0aGlzLnJlc3VsdC50eXBlID09PSAnb2snKSByZXR1cm4gdGhpcy5yZXN1bHQudmFsdWU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gdW53cmFwIGEgJHt0aGlzLnJlc3VsdC50eXBlfSByZXN1bHRgKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdSZXNwb25zZSA9IFVzZXJSZXNwb25zZSAmIFdlYnZpZXdQYWNrZXQ7XG5cbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3dlYnZpZXcnKTtcblxuZXhwb3J0IHR5cGUgSG9zdFJlcXVlc3QgPSB7XG4gICAgaG9zdDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgR2V0Q29va2llc1JlcXVlc3QgPSB7XG4gICAgdXJsOiBzdHJpbmc7XG59O1xuXG5jb25zdCBEQVNIQk9BUkRfQ09PS0lFU19HRVQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxHZXRDb29raWVzUmVxdWVzdCwgVXNlclJlc3BvbnNlPENvb2tpZVtdPj4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2Nvb2tpZXNfZ2V0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQsXG59KTtcblxuY29uc3QgREFTSEJPQVJEX1dFQlZJRVdfUkVRVUVTVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFdlYnZpZXdSZXF1ZXN0LCBXZWJ2aWV3UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3ZWJ2aWV3X3JlcXVlc3QnLFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPFdlYnZpZXdSZXNwb25zZT4oKVxuICAgICAgICAuZmllbGQoJ2lkJywgSWRlbnRpZmllciksXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxufSk7XG5cbmNvbnN0IERBU0hCT0FSRF9XRUJWSUVXX0NMT1NFID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248V2Vidmlld1BhY2tldCwgV2Vidmlld1Jlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd2Vidmlld19jbG9zZScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcDxXZWJ2aWV3UGFja2V0PigpXG4gICAgICAgIC5maWVsZCgnaWQnLCBJZGVudGlmaWVyKSxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcDxXZWJ2aWV3UmVzcG9uc2U+KClcbiAgICAgICAgLmZpZWxkKCdpZCcsIElkZW50aWZpZXIpLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3RXZlbnQgPSB7XG4gICAgdHlwZTogJ2Nsb3NlZCc7XG59IHwge1xuICAgIHR5cGU6ICdyZXNpemUnO1xuICAgIGRpbWVudGlvbnM6IHtcbiAgICAgICAgeDogbnVtYmVyO1xuICAgICAgICB5OiBudW1iZXI7XG4gICAgfTtcbn0gfCB7XG4gICAgdHlwZTogJ2Nvb2tpZSc7XG4gICAgY29va2llczogQ29va2llW107XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3RXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgW0sgaW4gV2Vidmlld0V2ZW50Wyd0eXBlJ11dPzogQXJyYXk8KGV2ZW50OiBFeHRyYWN0PFdlYnZpZXdFdmVudCwgeyB0eXBlOiBLIH0+KSA9PiB2b2lkPjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdFdmVudFBhY2tldCA9IHtcbiAgICBpZDogSWRlbnRpZmllcjtcbiAgICB0YXJnZXQ6IElkZW50aWZpZXI7XG4gICAgZXZlbnQ6IFdlYnZpZXdFdmVudDtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdIYW5kbGUgPSB7XG4gICAgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXI7XG4gICAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gICAgZ2V0Q29va2llcygpOiBQcm9taXNlPENvb2tpZVtdPjtcbiAgICBjbG9zZSgpOiB2b2lkO1xuICAgIG9uPFQgZXh0ZW5kcyBXZWJ2aWV3RXZlbnRbJ3R5cGUnXT4oa2V5OiBULCBjYWxsYmFjazogKGV2ZW50OiBFeHRyYWN0PFdlYnZpZXdFdmVudCwgeyB0eXBlOiBUIH0+KSA9PiB2b2lkKTogdm9pZDtcbiAgICBqb2luKCk6IFByb21pc2U8dm9pZD47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3RXZlbnRFbWl0ID0gPFQgZXh0ZW5kcyBXZWJ2aWV3RXZlbnRbJ3R5cGUnXT4oZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IFQgfT4pID0+IHZvaWQ7XG5cbmNvbnN0IERBU0hCT0FSRF9XRUJWSUVXX0VWRU5UX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxXZWJ2aWV3RXZlbnRQYWNrZXQ+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3ZWJ2aWV3X2V2ZW50JyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8V2Vidmlld0V2ZW50UGFja2V0PigpXG4gICAgICAgIC5maWVsZCgnaWQnLCBJZGVudGlmaWVyKVxuICAgICAgICAuZmllbGQoJ3RhcmdldCcsIElkZW50aWZpZXIpLFxufSk7XG5cbnR5cGUgQWxsb3dlZEhvc3QgPSB7XG4gICAgaG9zdDogc3RyaW5nO1xuICAgIGFwcHM6IElkZW50aWZpZXJbXTtcbn07XG5cbmNvbnN0IERBU0hCT0FSRF9BTExPV0VEX0hPU1RTID0gVGFibGVUeXBlLmNyZWF0ZUpzb248QWxsb3dlZEhvc3Q+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdob3N0cycsXG4gICAga2V5OiAoZW50cnkpID0+IGVudHJ5Lmhvc3QsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPEFsbG93ZWRIb3N0PigpXG4gICAgICAgIC5maWVsZCgnYXBwcycsIFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9BcnJheSgpKSxcbn0pO1xuXG5jb25zdCBEQVNIQk9BUkRfSE9TVF9SRVFVRVNUID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248e1xuICAgIGhvc3Q6IHN0cmluZztcbn0sIFVzZXJSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2hvc3RfcmVxdWVzdCcsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxufSk7XG5cbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfU1BFRUNIX1JFQ09HTklUSU9OX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignc3BlZWNoX3JlY29nbml0aW9uJyk7XG5cbmV4cG9ydCB0eXBlIFRyYW5zY3JpcHRTZWdtZW50ID0ge1xuICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICB0cmFuc2NyaXB0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUcmFuc2NyaXB0U3RhdHVzID0ge1xuICAgIHR5cGU6ICdpZGxlJztcbn0gfCB7XG4gICAgdHlwZTogJ3Jlc3VsdCc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgc2VnbWVudHM6IFRyYW5zY3JpcHRTZWdtZW50W107XG59IHwge1xuICAgIHR5cGU6ICdmaW5hbCc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgc2VnbWVudHM6IFRyYW5zY3JpcHRTZWdtZW50W107XG59IHwge1xuICAgIHR5cGU6ICdhdWRpb19zdGFydGVkJztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn0gfCB7XG4gICAgdHlwZTogJ2F1ZGlvX2VuZGVkJztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn07XG5cbmNvbnN0IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT04gPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxUcmFuc2NyaXB0U3RhdHVzPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc3BlZWNoX3JlY29nbml0aW9uJyxcbiAgICBkZWZhdWx0VmFsdWU6IHsgdHlwZTogJ2lkbGUnIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVhZDogREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9QRVJNSVNTSU9OX0lELFxuICAgICAgICB3cml0ZTogREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcblxuZXhwb3J0IHR5cGUgU3BlZWNoUmVjb2duaXRpb25TdGFydCA9IHtcbiAgICB0eXBlOiAnc3RhcnQnO1xufTtcblxuY29uc3QgREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFNwZWVjaFJlY29nbml0aW9uU3RhcnQsIFVzZXJSZXNwb25zZTx1bmRlZmluZWQ+PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc3BlZWNoX3JlY29nbml0aW9uX3N0YXJ0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5pbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEJhc2U8VCBleHRlbmRzIHN0cmluZz4ge1xuICAgIGtpbmQ6IFQ7XG4gICAgaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0QXBwUGVybWlzc2lvbnMgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3Blcm1pc3Npb25zJz4ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBwZXJtaXNzaW9uczogUGVybWlzc2lvblR5cGVKc29uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEFwcFBsdWdpbnMgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3BsdWdpbnMnPiB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBhY2thZ2VzOiBQYWNrYWdlSW5mb1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RBcHBJbnN0YWxsIGV4dGVuZHMgUHJvbXB0UmVxdWVzdEJhc2U8J2FwcC9pbnN0YWxsJz4ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIEFwcEpzb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RBcHBVcGRhdGUgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3VwZGF0ZSc+IHtcbiAgICBvbGRfYXBwOiBBcHBKc29uO1xuICAgIG5ld19hcHA6IEFwcEpzb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEluZGV4SW5zdGFsbCBleHRlbmRzIFByb21wdFJlcXVlc3RCYXNlPCdpbmRleC9pbnN0YWxsJz4ge1xuICAgIGluZGV4X3VybDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQcm9tcHRSZXF1ZXN0ID0gKFxuICAgIFByb21wdFJlcXVlc3RBcHBQZXJtaXNzaW9uc1xuICAgIHwgUHJvbXB0UmVxdWVzdEFwcFBsdWdpbnNcbiAgICB8IFByb21wdFJlcXVlc3RBcHBJbnN0YWxsXG4gICAgfCBQcm9tcHRSZXF1ZXN0QXBwVXBkYXRlXG4gICAgfCBQcm9tcHRSZXF1ZXN0SW5kZXhJbnN0YWxsXG4pO1xuXG5jb25zdCBEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UHJvbXB0UmVxdWVzdD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Byb21wdF9yZXF1ZXN0Jyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQcm9tcHRSZXN1bHQgPSAnYWNjZXB0JyB8ICdkZW55JztcblxuaW50ZXJmYWNlIFByb21wdFJlc3BvbnNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGtpbmQ6IHN0cmluZztcbiAgICByZXN1bHQ6IFByb21wdFJlc3VsdDtcbn1cblxuY29uc3QgREFTSEJPQVJEX1BST01QVF9SRVNQT05TRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxQcm9tcHRSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Byb21wdF9yZXNwb25zZScsXG59KTtcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RGFzaGJvYXJkRXh0ZW5zaW9uPiA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIGRhc2hib2FyZDogRGFzaGJvYXJkSGFuZGxlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZHJhZ0Ryb3BIYW5kbGVyOiBEcmFnRHJvcEhhbmRsZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGRyYWdEcm9wTGlzdGVuZXJzID0ge1xuICAgICAgICBlbnRlcjogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnRW50ZXIpID0+IHVua25vd24+LFxuICAgICAgICBvdmVyOiBbXSBhcyBBcnJheTwoc3RhdGU6IERyYWdPdmVyKSA9PiB1bmtub3duPixcbiAgICAgICAgZHJvcDogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnRHJvcCkgPT4gdW5rbm93bj4sXG4gICAgICAgIGxlYXZlOiBbXSBhcyBBcnJheTwoc3RhdGU6IERyYWdMZWF2ZSkgPT4gdW5rbm93bj4sXG4gICAgfTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWxsb3dlZEhvc3RzOiBUYWJsZTxBbGxvd2VkSG9zdD47XG4gICAgcHVibGljIHJlYWRvbmx5IHNwZWVjaFJlY29nbml0aW9uOiBSZWdpc3RyeTxUcmFuc2NyaXB0U3RhdHVzPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdlYnZpZXdIYW5kbGVzOiBJZGVudGlmaWVyTWFwPHsgaGFuZGxlOiBXZWJ2aWV3SGFuZGxlOyBlbWl0OiBXZWJ2aWV3RXZlbnRFbWl0IH0+ID0gbmV3IElkZW50aWZpZXJNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBEQVNIQk9BUkRfT1BFTl9BUFBfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVRVUVTVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVTUE9OU0VfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX1BBQ0tFVCxcbiAgICAgICAgICAgIERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9BUFBST1ZBTF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QsXG4gICAgICAgICAgICBEQVNIQk9BUkRfUFJPTVBUX1JFU1BPTlNFLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9QUk9NUFRfUkVRVUVTVCwgKHJlcXVlc3QpID0+XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByb21wdFJlcXVlc3QocmVxdWVzdCksXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX09QRU5fQVBQX1BBQ0tFVCwgKGFwcCkgPT5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT3BlbkFwcChhcHApLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9QQUNLRVQsIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZURyYWdEcm9wUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsICh7IHN0YXRlIH0pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VudGVyJzoge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdEcm9wTGlzdGVuZXJzLmVudGVyLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnb3Zlcic6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5vdmVyLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZHJvcCc6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5kcm9wLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbGVhdmUnOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BMaXN0ZW5lcnMubGVhdmUuZm9yRWFjaCgoZm4pID0+IGZuKHN0YXRlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFUVVFU1RfUEFDS0VULCAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEcmFnRHJvcFJlYWRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud2Vidmlld0hhbmRsZXMuZ2V0KHBhY2tldC5pZCk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuO1xuICAgICAgICAgICAgaGFuZGxlLmVtaXQocGFja2V0LmV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWxsb3dlZEhvc3RzID0gb211LnRhYmxlcy5nZXQoREFTSEJPQVJEX0FMTE9XRURfSE9TVFMpO1xuICAgICAgICB0aGlzLnNwZWVjaFJlY29nbml0aW9uID0gb211LnJlZ2lzdHJpZXMuZ2V0KERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT04pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVJlcXVlc3RGb3JEYXNoYm9hcmQocmVxdWVzdDogUHJvbXB0UmVxdWVzdCk6IFByb21pc2U8UHJvbXB0UmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIHN3aXRjaCAocmVxdWVzdC5raW5kKSB7XG4gICAgICAgICAgICBjYXNlICdhcHAvcGVybWlzc2lvbnMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlUGVybWlzc2lvblJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICBjYXNlICdhcHAvcGx1Z2lucyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVQbHVnaW5SZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICAgICAgY2FzZSAnYXBwL2luc3RhbGwnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlSW5zdGFsbEFwcChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGNhc2UgJ2FwcC91cGRhdGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlVXBkYXRlQXBwKHJlcXVlc3QpO1xuICAgICAgICAgICAgY2FzZSAnaW5kZXgvaW5zdGFsbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVJbmRleEluc3RhbGwocmVxdWVzdCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9tcHQgcmVxdWVzdGVkOiAke0pTT04uc3RyaW5naWZ5KHJlcXVlc3QpfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVQcm9tcHRSZXF1ZXN0KHJlcXVlc3Q6IFByb21wdFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVSZXF1ZXN0Rm9yRGFzaGJvYXJkKHJlcXVlc3QpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKERBU0hCT0FSRF9QUk9NUFRfUkVTUE9OU0UsIHtcbiAgICAgICAgICAgIGlkOiByZXF1ZXN0LmlkLFxuICAgICAgICAgICAga2luZDogcmVxdWVzdC5raW5kLFxuICAgICAgICAgICAgcmVzdWx0OiByZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVPcGVuQXBwKGFwcDogQXBwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVPcGVuQXBwKGFwcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEcmFnRHJvcFJlcXVlc3QocmVxdWVzdDogRHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGNvbnN0IGFjY2VwdGVkID0gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZURyYWdEcm9wUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfQVBQUk9WQUxfUEFDS0VULCB7XG4gICAgICAgICAgICBvazogYWNjZXB0ZWQsXG4gICAgICAgICAgICByZXF1ZXN0X2lkOiByZXF1ZXN0LnJlcXVlc3RfaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlRHJhZ0Ryb3BSZWFkUmVxdWVzdChyZXF1ZXN0OiBEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZURyYWdEcm9wUmVhZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIHRoaXMub211LnNlbmQoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFU1BPTlNFX1BBQ0tFVCwgcmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGFzaGJvYXJkKCk6IERhc2hib2FyZEhhbmRsZXIge1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFzaGJvYXJkIG5vdCBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXNoYm9hcmQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChkYXNoYm9hcmQ6IERhc2hib2FyZEhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQpO1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFzaGJvYXJkIGFscmVhZHkgc2V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXNoYm9hcmQgPSBkYXNoYm9hcmQ7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9DT09LSUVTX0dFVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPENvb2tpZVtdPj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB1cmwgfSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICBjb25zdCB7IGhvc3RuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkSG9zdCA9IGF3YWl0IHRoaXMuYWxsb3dlZEhvc3RzLmdldChob3N0bmFtZSkgPz8geyBob3N0OiBob3N0bmFtZSwgYXBwczogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSBhbGxvd2VkSG9zdC5hcHBzLnNvbWUoKGhvc3QpID0+IGhvc3QuaXNFcXVhbChwYXJhbXMuY2FsbGVyKSk7XG4gICAgICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2FuY2VsbGVkJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5nZXRDb29raWVzKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX0hPU1RfUkVRVUVTVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPiA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGhvc3QgfSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICBjb25zdCBob3N0RW50cnkgPSBhd2FpdCB0aGlzLmFsbG93ZWRIb3N0cy5nZXQoaG9zdCkgPz8geyBob3N0LCBhcHBzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGhvc3RFbnRyeS5hcHBzLnNvbWUoKGhvc3QpID0+IGhvc3QuaXNFcXVhbChwYXJhbXMuY2FsbGVyKSk7XG4gICAgICAgICAgICBpZiAoYWxsb3dlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvaycsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhc2hib2FyZC5ob3N0UmVxdWVzdGVkKHJlcXVlc3QsIHBhcmFtcyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnR5cGUgPT09ICdvaycpIHtcbiAgICAgICAgICAgICAgICBob3N0RW50cnkuYXBwcy5wdXNoKHBhcmFtcy5jYWxsZXIpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWxsb3dlZEhvc3RzLnVwZGF0ZShob3N0RW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFdlYnZpZXdSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1pdCA9IGFzeW5jIChldmVudDogV2Vidmlld0V2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogcGFyYW1zLmNhbGxlcixcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBkYXNoYm9hcmQuY3JlYXRlV2VidmlldyhyZXF1ZXN0LCBwYXJhbXMsIGVtaXQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2snLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFdlYnZpZXdSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBkYXNoYm9hcmQuZ2V0V2VidmlldyhyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYW5jZWxsZWQnLFxuICAgICAgICAgICAgICAgICAgICBpZDogcmVxdWVzdC5pZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZGFzaGJvYXJkLmNsb3NlV2VidmlldyhyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2snLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPHVuZGVmaW5lZD4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhc2hib2FyZC5zcGVlY2hSZWNvZ25pdGlvblN0YXJ0KHJlcXVlc3QsIHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUubmV0d29yay5hZGRUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICAgICAgREFTSEJPQVJEX1NFVF9FTkRQT0lOVCxcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5hcHAuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2V0IGRhc2hib2FyZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdEhvc3Qob3B0aW9uczogeyBob3N0OiBzdHJpbmcgfSk6IFByb21pc2U8VXNlclJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIERBU0hCT0FSRF9IT1NUX1JFUVVFU1QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0V2VidmlldyhvcHRpb25zOiBXZWJ2aWV3UmVxdWVzdCk6IFByb21pc2U8VXNlclJlc3VsdDxXZWJ2aWV3SGFuZGxlPj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0LnR5cGUgIT09ICdvaycpIHJldHVybiBuZXcgVXNlclJlc3VsdChyZXN1bHQpO1xuICAgICAgICBjb25zdCB7IGlkIH0gPSByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBXZWJ2aWV3RXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgICAgICAgY29uc3QgaGFuZGxlOiBXZWJ2aWV3SGFuZGxlID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgICAgICAgICAgY2xvc2U6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UsXG4gICAgICAgICAgICAgICAgICAgIHsgaWQgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENvb2tpZXM6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb29raWVzID0gKGF3YWl0IHRoaXMuZ2V0Q29va2llcyh7XG4gICAgICAgICAgICAgICAgICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgICAgICAgICAgICAgfSkpLnVud3JhcCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb29raWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uOiBmdW5jdGlvbiA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihrZXk6IFQsIGNhbGxiYWNrOiAoZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IFQgfT4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50TGlzdGVuZXJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRMaXN0ZW5lcnNba2V5XSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVyc1trZXldITtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgam9pbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZS5vbignY2xvc2VkJywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2Vidmlld0hhbmRsZXMuc2V0KGlkLCB7XG4gICAgICAgICAgICBoYW5kbGUsXG4gICAgICAgICAgICBlbWl0OiBmdW5jdGlvbiA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogVCB9Pik6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xuICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJzKSByZXR1cm47XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXN1bHQoe1xuICAgICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICAgIHZhbHVlOiBoYW5kbGUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb29raWVzKG9wdGlvbnM6IEdldENvb2tpZXNSZXF1ZXN0KTogUHJvbWlzZTxVc2VyUmVzdWx0PENvb2tpZVtdPj4ge1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXN1bHQoYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBEQVNIQk9BUkRfQ09PS0lFU19HRVQsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb3BlbkFwcChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoREFTSEJPQVJEX09QRU5fQVBQX0VORFBPSU5ULCBhcHApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbnN0YWxsQXBwKGFwcDogQXBwKTogUHJvbWlzZTxBcHBJbnN0YWxsUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9BUFBfSU5TVEFMTF9FTkRQT0lOVCwgYXBwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWlyZURyYWdEcm9wKCk6IFByb21pc2U8RHJhZ0Ryb3BIYW5kbGVyPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9FTkRQT0lOVCwge30pO1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmRyYWdEcm9wTGlzdGVuZXJzO1xuICAgICAgICBjb25zdCBjbGllbnQgPSB0aGlzLm9tdTtcbiAgICAgICAgdGhpcy5kcmFnRHJvcEhhbmRsZXIgPSB7XG4gICAgICAgICAgICBvbkVudGVyKGZuKSB7IGxpc3RlbmVycy5lbnRlci5wdXNoKGZuKTsgfSxcbiAgICAgICAgICAgIG9uT3ZlcihmbikgeyBsaXN0ZW5lcnMub3Zlci5wdXNoKGZuKTsgfSxcbiAgICAgICAgICAgIG9uRHJvcChmbikgeyBsaXN0ZW5lcnMuZHJvcC5wdXNoKGZuKTsgfSxcbiAgICAgICAgICAgIG9uTGVhdmUoZm4pIHsgbGlzdGVuZXJzLmxlYXZlLnB1c2goZm4pOyB9LFxuICAgICAgICAgICAgYXN5bmMgcmVhZChpZCkgeyByZXR1cm4gYXdhaXQgY2xpZW50LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9EUkFHX0RST1BfUkVBRF9FTkRQT0lOVCwgeyBkcmFnX2lkOiBpZCB9KTsgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BIYW5kbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBub3RpZnlEcm9wRHJhZ1N0YXRlKHBhY2tldDogRmlsZURyYWdQYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfRFJBR19EUk9QX1NUQVRFX1BBQ0tFVCwgcGFja2V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3BlZWNoUmVjb2duaXRpb25TdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCwgeyB0eXBlOiAnc3RhcnQnIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBcHBKc29uIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplL3NlcmlhbGl6ZXIuanMnO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4vcGFja2V0LmpzJztcblxuY29uc3QgSURFTlRJRklFUiA9IG5ldyBJZGVudGlmaWVyKCdjb3JlJywgJ3BhY2tldCcpO1xuXG50eXBlIFByb3RvY29sSW5mbyA9IHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG59O1xuXG50eXBlIFJTQU51bWJlcnMgPSB7XG4gICAgZTogc3RyaW5nO1xuICAgIG46IHN0cmluZztcbn07XG5cbnR5cGUgRW5jcnlwdGlvblJlcXVlc3QgPSB7XG4gICAga2luZDogJ3YxJztcbiAgICByc2E6IFJTQU51bWJlcnM7XG59O1xuXG50eXBlIEVuY3J5cHRpb25SZXNwb25zZSA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbiAgICBhZXM6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNlcnZlck1ldGEgPSB7XG4gICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVxdWVzdCB8IG51bGw7XG4gICAgaGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxudHlwZSBDb25uZWN0UGFja2V0SnNvbiA9IHtcbiAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG59O1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdFBhY2tldCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICAgIHB1YmxpYyByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgICAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgICAgICBhcHA6IEFwcDtcbiAgICAgICAgdG9rZW46IHN0cmluZztcbiAgICAgICAgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnByb3RvY29sID0gb3B0aW9ucy5wcm90b2NvbDtcbiAgICAgICAgdGhpcy5hcHAgPSBvcHRpb25zLmFwcDtcbiAgICAgICAgdGhpcy50b2tlbiA9IG9wdGlvbnMudG9rZW47XG4gICAgICAgIHRoaXMuZW5jcnlwdGlvbiA9IG9wdGlvbnMuZW5jcnlwdGlvbiA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogQ29ubmVjdFBhY2tldEpzb24pOiBDb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgIHByb3RvY29sOiBkYXRhLnByb3RvY29sLFxuICAgICAgICAgICAgYXBwOiBBcHAuZGVzZXJpYWxpemUoZGF0YS5hcHApLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogZGF0YS5lbmNyeXB0aW9uLFxuICAgICAgICAgICAgdG9rZW46IGRhdGEudG9rZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IENvbm5lY3RQYWNrZXQpOiBDb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcm90b2NvbDogZGF0YS5wcm90b2NvbCxcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShkYXRhLmFwcCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBkYXRhLmVuY3J5cHRpb24sXG4gICAgICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBlbnVtIERpc2Nvbm5lY3RUeXBlIHtcbiAgICBJTlZBTElEX1RPS0VOID0gJ2ludmFsaWRfdG9rZW4nLFxuICAgIElOVkFMSURfT1JJR0lOID0gJ2ludmFsaWRfb3JpZ2luJyxcbiAgICBJTlZBTElEX1ZFUlNJT04gPSAnaW52YWxpZF92ZXJzaW9uJyxcbiAgICBJTlZBTElEX1BBQ0tFVF9UWVBFID0gJ2ludmFsaWRfcGFja2V0X3R5cGUnLFxuICAgIElOVkFMSURfUEFDS0VUX0RBVEEgPSAnaW52YWxpZF9wYWNrZXRfZGF0YScsXG4gICAgSU5WQUxJRF9QQUNLRVQgPSAnaW52YWxpZF9wYWNrZXQnLFxuICAgIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsX2Vycm9yJyxcbiAgICBBTk9USEVSX0NPTk5FQ1RJT04gPSAnYW5vdGhlcl9jb25uZWN0aW9uJyxcbiAgICBQRVJNSVNTSU9OX0RFTklFRCA9ICdwZXJtaXNzaW9uX2RlbmllZCcsXG4gICAgQVBQX1JFTU9WRUQgPSAnYXBwX3JlbW92ZWQnLFxuICAgIFNFUlZFUl9SRVNUQVJUID0gJ3NlcnZlcl9yZXN0YXJ0JyxcbiAgICBTSFVURE9XTiA9ICdzaHV0ZG93bicsXG4gICAgQ0xPU0UgPSAnY2xvc2UnLFxufVxuXG50eXBlIERpc2Nvbm5lY3RQYWNrZXRKc29uID0ge1xuICAgIHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgIG1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG59O1xuXG5leHBvcnQgY2xhc3MgRGlzY29ubmVjdFBhY2tldCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgICAgICB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZyB8IG51bGw7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXQpOiBEaXNjb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSnNvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogRGlzY29ubmVjdFBhY2tldEpzb24pOiBEaXNjb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIERpc2Nvbm5lY3RQYWNrZXQuZnJvbUpzb24oZGF0YSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21Kc29uKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXRKc29uKTogRGlzY29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBuZXcgRGlzY29ubmVjdFBhY2tldCh7XG4gICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvSnNvbigpOiBEaXNjb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUEFDS0VUX1RZUEVTOiB7XG4gICAgU0VSVkVSX01FVEE6IFBhY2tldFR5cGU8U2VydmVyTWV0YT47XG4gICAgQ09OTkVDVDogUGFja2V0VHlwZTxDb25uZWN0UGFja2V0PjtcbiAgICBESVNDT05ORUNUOiBQYWNrZXRUeXBlPERpc2Nvbm5lY3RQYWNrZXQ+O1xuICAgIFRPS0VOOiBQYWNrZXRUeXBlPHN0cmluZz47XG4gICAgUkVBRFk6IFBhY2tldFR5cGU8dW5kZWZpbmVkPjtcbiAgICBFTkNSWVBURURfUEFDS0VUOiBQYWNrZXRUeXBlPFVpbnQ4QXJyYXk+O1xufSA9IHtcbiAgICBTRVJWRVJfTUVUQTogUGFja2V0VHlwZS5jcmVhdGVKc29uPFNlcnZlck1ldGE+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3NlcnZlcl9tZXRhJyxcbiAgICB9KSxcbiAgICBDT05ORUNUOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248Q29ubmVjdFBhY2tldD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnY29ubmVjdCcsXG4gICAgICAgIHNlcmlhbGl6ZXI6IENvbm5lY3RQYWNrZXQsXG4gICAgfSksXG4gICAgRElTQ09OTkVDVDogUGFja2V0VHlwZS5jcmVhdGVKc29uPERpc2Nvbm5lY3RQYWNrZXQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2Rpc2Nvbm5lY3QnLFxuICAgICAgICBzZXJpYWxpemVyOiBEaXNjb25uZWN0UGFja2V0LFxuICAgIH0pLFxuICAgIFRPS0VOOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248c3RyaW5nPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICd0b2tlbicsXG4gICAgfSksXG4gICAgUkVBRFk6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjx1bmRlZmluZWQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3JlYWR5JyxcbiAgICB9KSxcbiAgICBFTkNSWVBURURfUEFDS0VUOiBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VWludDhBcnJheT4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnZScsXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcCgpLFxuICAgIH0pLFxufTtcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludFJlZ2lzdGVyUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVuZHBvaW50czogSWRlbnRpZmllck1hcDxJZGVudGlmaWVyIHwgdW5kZWZpbmVkPixcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogRW5kcG9pbnRSZWdpc3RlclBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KGl0ZW0uZW5kcG9pbnRzLnNpemUpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpdGVtLmVuZHBvaW50cykge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGtleS5rZXkoKSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcodmFsdWU/LmtleSgpID8/ICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGl0ZW0pO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBlbmRwb2ludHMgPSBuZXcgSWRlbnRpZmllck1hcDxJZGVudGlmaWVyIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgZW5kcG9pbnRzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQoZW5kcG9pbnRzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZva2VkUGFyYW1zIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgY2FsbGVyOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBudW1iZXIsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEludm9rZWRQYXJhbXMpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQua2V5KCksXG4gICAgICAgICAgICBjYWxsZXI6IGl0ZW0uY2FsbGVyLmtleSgpLFxuICAgICAgICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBzdHJpbmcpOiBJbnZva2VkUGFyYW1zIHtcbiAgICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIGNhbGxlcjogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiBudW1iZXI7XG4gICAgICAgIH0gPSBKU09OLnBhcnNlKGl0ZW0pO1xuICAgICAgICByZXR1cm4gbmV3IEludm9rZWRQYXJhbXMoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb21LZXkoZGF0YS5pZCksXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb21LZXkoZGF0YS5jYWxsZXIpLFxuICAgICAgICAgICAgZGF0YS5rZXksXG4gICAgICAgICk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIEVuZHBvaW50SW52b2tlZFBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwYXJhbXM6IEludm9rZWRQYXJhbXMsXG4gICAgICAgIHB1YmxpYyBidWZmZXI6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEVuZHBvaW50SW52b2tlZFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSW52b2tlZFBhcmFtcy5zZXJpYWxpemUoaXRlbS5wYXJhbXMpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShpdGVtLmJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBVaW50OEFycmF5KTogRW5kcG9pbnRJbnZva2VkUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShpdGVtKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gSW52b2tlZFBhcmFtcy5kZXNlcmlhbGl6ZShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRJbnZva2VkUGFja2V0KHBhcmFtcywgYnVmZmVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZva2VQYXJhbXMge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBrZXk6IG51bWJlcixcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogSW52b2tlUGFyYW1zKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLmtleSgpLFxuICAgICAgICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBzdHJpbmcpOiBJbnZva2VQYXJhbXMge1xuICAgICAgICBjb25zdCBkYXRhOiB7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiBudW1iZXI7XG4gICAgICAgIH0gPSBKU09OLnBhcnNlKGl0ZW0pO1xuICAgICAgICByZXR1cm4gbmV3IEludm9rZVBhcmFtcyhcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbUtleShkYXRhLmlkKSxcbiAgICAgICAgICAgIGRhdGEua2V5LFxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludEludm9rZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwYXJhbXM6IEludm9rZVBhcmFtcyxcbiAgICAgICAgcHVibGljIGJ1ZmZlcjogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogRW5kcG9pbnRJbnZva2VQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKEludm9rZVBhcmFtcy5zZXJpYWxpemUoaXRlbS5wYXJhbXMpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShpdGVtLmJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBVaW50OEFycmF5KTogRW5kcG9pbnRJbnZva2VQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGl0ZW0pO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBJbnZva2VQYXJhbXMuZGVzZXJpYWxpemUocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50SW52b2tlUGFja2V0KHBhcmFtcywgYnVmZmVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNwb25zZVBhcmFtcyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZXJyb3I6IHN0cmluZyB8IG51bGwsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IFJlc3BvbnNlUGFyYW1zKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLmtleSgpLFxuICAgICAgICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgICAgICAgIGVycm9yOiBpdGVtLmVycm9yLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IHN0cmluZyk6IFJlc3BvbnNlUGFyYW1zIHtcbiAgICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogbnVtYmVyO1xuICAgICAgICAgICAgZXJyb3I6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIH0gPSBKU09OLnBhcnNlKGl0ZW0pO1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlUGFyYW1zKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuaWQpLFxuICAgICAgICAgICAgZGF0YS5rZXksXG4gICAgICAgICAgICBkYXRhLmVycm9yLFxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludFJlc3BvbnNlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBhcmFtczogUmVzcG9uc2VQYXJhbXMsXG4gICAgICAgIHB1YmxpYyBidWZmZXI6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEVuZHBvaW50UmVzcG9uc2VQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKFJlc3BvbnNlUGFyYW1zLnNlcmlhbGl6ZShpdGVtLnBhcmFtcykpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGl0ZW0uYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IFVpbnQ4QXJyYXkpOiBFbmRwb2ludFJlc3BvbnNlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShpdGVtKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gUmVzcG9uc2VQYXJhbXMuZGVzZXJpYWxpemUocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50UmVzcG9uc2VQYWNrZXQocGFyYW1zLCBidWZmZXIpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuL2VuZHBvaW50LmpzJztcbmltcG9ydCB7IEVuZHBvaW50SW52b2tlZFBhY2tldCwgRW5kcG9pbnRJbnZva2VQYWNrZXQsIEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQsIEVuZHBvaW50UmVzcG9uc2VQYWNrZXQsIEludm9rZWRQYXJhbXMsIEludm9rZVBhcmFtcywgUmVzcG9uc2VQYXJhbXMgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuXG5leHBvcnQgY29uc3QgRU5EUE9JTlRfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8RW5kcG9pbnRFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2VuZHBvaW50JyxcbiAgICAob211OiBPbXUpID0+IG5ldyBFbmRwb2ludEV4dGVuc2lvbihvbXUpLFxuKTtcblxudHlwZSBDYWxsUHJvbWlzZSA9IHtcbiAgICByZXNvbHZlOiAoZGF0YTogVWludDhBcnJheSkgPT4gdm9pZDtcbiAgICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59O1xuXG50eXBlIEVuZHBvaW50SGFuZGxlciA9IHtcbiAgICB0eXBlOiBFbmRwb2ludFR5cGU7XG4gICAgaGFuZGxlcjogKHBhY2tldDogRW5kcG9pbnRJbnZva2VkUGFja2V0KSA9PiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xufTtcblxuZXhwb3J0IGNsYXNzIEVuZHBvaW50RXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxFbmRwb2ludEV4dGVuc2lvbj4gPSBFTkRQT0lOVF9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kRW5kcG9pbnRzID0gbmV3IElkZW50aWZpZXJNYXA8RW5kcG9pbnRIYW5kbGVyPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzcG9uc2VQcm9taXNlczogTWFwPG51bWJlciwgQ2FsbFByb21pc2U+ID0gbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgY2FsbElkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIHRoaXMuY2FsbElkID0gTWF0aC5mbG9vcigocGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlLm5vdygpKSAqIDEwMDApO1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIEVORFBPSU5UX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIEVORFBPSU5UX0lOVk9LRV9QQUNLRVQsXG4gICAgICAgICAgICBFTkRQT0lOVF9JTlZPS0VEX1BBQ0tFVCxcbiAgICAgICAgICAgIEVORFBPSU5UX1JFU1BPTlNFX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihFTkRQT0lOVF9JTlZPS0VEX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVJbnZva2VkKHBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKEVORFBPSU5UX1JFU1BPTlNFX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucmVzcG9uc2VQcm9taXNlcy5nZXQocGFja2V0LnBhcmFtcy5rZXkpO1xuICAgICAgICAgICAgaWYgKCFwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24ga2V5ICR7cGFja2V0LnBhcmFtcy5rZXl9ICgke3BhY2tldC5wYXJhbXMuaWQua2V5KCl9KWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VQcm9taXNlcy5kZWxldGUocGFja2V0LnBhcmFtcy5rZXkpO1xuICAgICAgICAgICAgaWYgKHBhY2tldC5wYXJhbXMuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgRXJyb3IocGFja2V0LnBhcmFtcy5lcnJvcikpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZShwYWNrZXQuYnVmZmVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbnZva2VkKHBhY2tldDogRW5kcG9pbnRJbnZva2VkUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5ib3VuZEVuZHBvaW50cy5nZXQocGFja2V0LnBhcmFtcy5pZCk7XG4gICAgICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgaW52b2NhdGlvbiBmb3IgdW5rbm93biBlbmRwb2ludCAke3BhY2tldC5wYXJhbXMuaWQua2V5KCl9ICgke3BhY2tldC5wYXJhbXMua2V5fSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW5kcG9pbnQuaGFuZGxlcihwYWNrZXQpO1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsIG5ldyBFbmRwb2ludFJlc3BvbnNlUGFja2V0KFxuICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZVBhcmFtcyhwYWNrZXQucGFyYW1zLmlkLCBwYWNrZXQucGFyYW1zLmtleSwgbnVsbCksXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKEVORFBPSU5UX1JFU1BPTlNFX1BBQ0tFVCwgbmV3IEVuZHBvaW50UmVzcG9uc2VQYWNrZXQoXG4gICAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlUGFyYW1zKHBhY2tldC5wYXJhbXMuaWQsIHBhY2tldC5wYXJhbXMua2V5LCBKU09OLnN0cmluZ2lmeShlcnJvcikpLFxuICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KCksXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25UYXNrKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbmRwb2ludHMgPSBuZXcgSWRlbnRpZmllck1hcDxJZGVudGlmaWVyIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVuZHBvaW50XSBvZiB0aGlzLmJvdW5kRW5kcG9pbnRzKSB7XG4gICAgICAgICAgICBlbmRwb2ludHMuc2V0KGtleSwgZW5kcG9pbnQudHlwZS5wZXJtaXNzaW9uSWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBFbmRwb2ludFJlZ2lzdGVyUGFja2V0KGVuZHBvaW50cyk7XG4gICAgICAgIHRoaXMub211LnNlbmQoRU5EUE9JTlRfUkVHSVNURVJfUEFDS0VULCBwYWNrZXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBiaW5kPFJlcSwgUmVzPihcbiAgICAgICAgdHlwZTogRW5kcG9pbnRUeXBlPFJlcSwgUmVzPixcbiAgICAgICAgaGFuZGxlcjogKGRhdGE6IFJlcSwgcGFyYW1zOiBJbnZva2VkUGFyYW1zKSA9PiBQcm9taXNlPFJlcz4sXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBlbmRwb2ludHMgYWZ0ZXIgdGhlIGNsaWVudCBoYXMgc3RhcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJvdW5kRW5kcG9pbnRzLmhhcyh0eXBlLmlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbmRwb2ludCB3aXRoIGlkICR7dHlwZS5pZC5rZXkoKX0gaXMgYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib3VuZEVuZHBvaW50cy5zZXQodHlwZS5pZCwgeyB0eXBlLCBoYW5kbGVyOiBhc3luYyAoeyBidWZmZXIsIHBhcmFtcyB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXEgPSB0eXBlLnJlcXVlc3RTZXJpYWxpemVyLmRlc2VyaWFsaXplKGJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKHJlcSwgcGFyYW1zKTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlLnJlc3BvbnNlU2VyaWFsaXplci5zZXJpYWxpemUocmVzdWx0KTtcbiAgICAgICAgfSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsbDxSZXEsIFJlcz4oZW5kcG9pbnQ6IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4sIGRhdGE6IFJlcSk6IFByb21pc2U8UmVzPiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuY2FsbElkKys7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxVaW50OEFycmF5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlUHJvbWlzZXMuc2V0KGtleSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKEVORFBPSU5UX0lOVk9LRV9QQUNLRVQsIG5ldyBFbmRwb2ludEludm9rZVBhY2tldChcbiAgICAgICAgICAgIG5ldyBJbnZva2VQYXJhbXMoZW5kcG9pbnQuaWQsIGtleSksXG4gICAgICAgICAgICBlbmRwb2ludC5yZXF1ZXN0U2VyaWFsaXplci5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICkpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHByb21pc2U7XG4gICAgICAgIHJldHVybiBlbmRwb2ludC5yZXNwb25zZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzcG9uc2UpO1xuICAgIH1cbn1cblxuY29uc3QgRU5EUE9JTlRfUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQ+KEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlZ2lzdGVyJyxcbiAgICBzZXJpYWxpemVyOiBFbmRwb2ludFJlZ2lzdGVyUGFja2V0LFxufSk7XG5jb25zdCBFTkRQT0lOVF9JTlZPS0VfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPEVuZHBvaW50SW52b2tlUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbnZva2UnLFxuICAgIHNlcmlhbGl6ZXI6IEVuZHBvaW50SW52b2tlUGFja2V0LFxufSk7XG5jb25zdCBFTkRQT0lOVF9JTlZPS0VEX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludEludm9rZWRQYWNrZXQ+KEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2ludm9rZWQnLFxuICAgIHNlcmlhbGl6ZXI6IEVuZHBvaW50SW52b2tlZFBhY2tldCxcbn0pO1xuY29uc3QgRU5EUE9JTlRfUkVTUE9OU0VfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPEVuZHBvaW50UmVzcG9uc2VQYWNrZXQ+KEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Jlc3BvbnNlJyxcbiAgICBzZXJpYWxpemVyOiBFbmRwb2ludFJlc3BvbnNlUGFja2V0LFxufSk7XG4iLAogICAgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uLy4uL2NvbnN0JztcbmltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgSnNvblR5cGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uJztcblxuZXhwb3J0IGNvbnN0IEhUVFBfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8SHR0cEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnaHR0cCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgSHR0cEV4dGVuc2lvbihvbXUpLFxuKTtcblxuZXhwb3J0IGNvbnN0IEhUVFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gSFRUUF9FWFRFTlNJT05fVFlQRS5qb2luKCdyZXF1ZXN0Jyk7XG5cbnR5cGUgUmVxdWVzdEhhbmRsZSA9IHtcbiAgICBpZDogc3RyaW5nO1xufTtcblxudHlwZSBIdHRwUmVxdWVzdCA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgaGVhZGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIG1ldGhvZDogc3RyaW5nO1xuICAgIHJlZGlyZWN0OiBSZXF1ZXN0UmVkaXJlY3Q7XG4gICAgdXJsOiBzdHJpbmc7XG59O1xuXG5jb25zdCBSRVFVRVNUX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVxdWVzdD4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X2NyZWF0ZScsXG59KTtcblxuY2xhc3MgRGF0YUNodW5rPFQgZXh0ZW5kcyBKc29uVHlwZT4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YTogVCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplPFQgZXh0ZW5kcyBKc29uVHlwZT4oZGF0YTogRGF0YUNodW5rPFQ+KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZUpTT04oZGF0YS5tZXRhKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShkYXRhLmJvZHkpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemU8VCBleHRlbmRzIEpzb25UeXBlPihkYXRhOiBVaW50OEFycmF5KTogRGF0YUNodW5rPFQ+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgbWV0YSA9IHJlYWRlci5yZWFkSlNPTjxUPigpO1xuICAgICAgICBjb25zdCBib2R5ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YUNodW5rKG1ldGEsIGJvZHkpO1xuICAgIH1cbn1cblxuY29uc3QgUkVRVUVTVF9TRU5EID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPERhdGFDaHVuazxSZXF1ZXN0SGFuZGxlPj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X3NlbmQnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG50eXBlIEh0dHBSZXF1ZXN0Q2xvc2UgPSBSZXF1ZXN0SGFuZGxlO1xuXG5jb25zdCBSRVFVRVNUX0NMT1NFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXF1ZXN0Q2xvc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWVzdF9jbG9zZScsXG59KTtcblxudHlwZSBIdHRwUmVzcG9uc2UgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIGhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgaGlzdG9yeTogSHR0cFJlc3BvbnNlW107XG4gICAgcmVkaXJlY3RlZDogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFJFU1BPTlNFX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVzcG9uc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY3JlYXRlJyxcbn0pO1xuXG5jb25zdCBSRVNQT05TRV9DSFVOSyA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEYXRhQ2h1bms8UmVxdWVzdEhhbmRsZT4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY2h1bmsnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG5jb25zdCBSRVNQT05TRV9DTE9TRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxSZXF1ZXN0SGFuZGxlPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Jlc3BvbnNlX2Nsb3NlJyxcbn0pO1xuXG50eXBlIEhhbmRsZVN0YXRlUmVjZWl2aW5nID0ge1xuICAgIHR5cGU6ICdyZWNlaXZpbmcnO1xuICAgIHJlY2VpdmUoZGF0YTogVWludDhBcnJheSk6IHZvaWQ7XG4gICAgY2xvc2UoKTogdm9pZDtcbn07XG5cbnR5cGUgSGFuZGxlU3RhdGVDcmVhdGVkID0ge1xuICAgIHR5cGU6ICdjcmVhdGVkJztcbiAgICBzZXRSZXNwb25zZShyZXNwb25zZTogSHR0cFJlc3BvbnNlKTogdm9pZDtcbn07XG5cbnR5cGUgSGFuZGxlU3RhdGUgPSBIYW5kbGVTdGF0ZUNyZWF0ZWQgfCBIYW5kbGVTdGF0ZVJlY2VpdmluZztcblxudHlwZSBXU0RhdGEgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlckxpa2UgfCBCbG9iIHwgQXJyYXlCdWZmZXJWaWV3O1xuXG5leHBvcnQgY29uc3QgV1NNc2dUeXBlID0ge1xuICAgIENPTlRJTlVBVElPTjogMHgwLFxuICAgIFRFWFQ6IDB4MSxcbiAgICBCSU5BUlk6IDB4MixcbiAgICBQSU5HOiAweDksXG4gICAgUE9ORzogMHhBLFxuICAgIENMT1NFOiAweDgsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgV1NDbG9zZUNvZGUgPSB7XG4gICAgT0s6IDEwMDAsXG4gICAgR09JTkdfQVdBWTogMTAwMSxcbiAgICBQUk9UT0NPTF9FUlJPUjogMTAwMixcbiAgICBVTlNVUFBPUlRFRF9EQVRBOiAxMDAzLFxuICAgIEFCTk9STUFMX0NMT1NVUkU6IDEwMDYsXG4gICAgSU5WQUxJRF9URVhUOiAxMDA3LFxuICAgIFBPTElDWV9WSU9MQVRJT046IDEwMDgsXG4gICAgTUVTU0FHRV9UT09fQklHOiAxMDA5LFxuICAgIE1BTkRBVE9SWV9FWFRFTlNJT046IDEwMTAsXG4gICAgSU5URVJOQUxfRVJST1I6IDEwMTEsXG4gICAgU0VSVklDRV9SRVNUQVJUOiAxMDEyLFxuICAgIFRSWV9BR0FJTl9MQVRFUjogMTAxMyxcbiAgICBCQURfR0FURVdBWTogMTAxNCxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgV2ViU29ja2V0T3BlbiA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufTtcbnR5cGUgV2ViU29ja2V0Q2xvc2UgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIGNvZGU/OiBudW1iZXI7XG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgV2ViU29ja2V0SGFuZGxlID0ge1xuICAgIHdzOiBPbXVXUztcbiAgICBvcGVuOiAocmVzcG9uc2U6IFdlYlNvY2tldE9wZW4pID0+IHZvaWQ7XG4gICAgZGlzcGF0Y2g6IChkYXRhOiBEYXRhQ2h1bms8V1NEYXRhTWV0YT4pID0+IHZvaWQ7XG4gICAgY2xvc2U6IChyZXNwb25zZTogV2ViU29ja2V0Q2xvc2UpID0+IHZvaWQ7XG4gICAgZXJyb3I6IChyZXNwb25zZTogV2ViU29ja2V0RXJyb3IpID0+IHZvaWQ7XG59O1xuXG50eXBlIFdTRGF0YU1ldGEgPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOlxuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuVEVYVFxuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuQklOQVJZXG4gICAgICAgIHwgdHlwZW9mIFdTTXNnVHlwZS5QSU5HXG4gICAgICAgIHwgdHlwZW9mIFdTTXNnVHlwZS5QT05HO1xufTtcblxudHlwZSBXU0hhbmRsZVN0YXRlID0ge1xuICAgIHR5cGU6ICdjcmVhdGVkJyB8ICdyZWNlaXZpbmcnO1xuICAgIGhhbmRsZTogV2ViU29ja2V0SGFuZGxlO1xufTtcblxuY29uc3QgV0VCU09DS0VUX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVxdWVzdD4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19jcmVhdGUnLFxufSk7XG5cbmNvbnN0IFdFQlNPQ0tFVF9PUEVOID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFdlYlNvY2tldE9wZW4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3Nfb3BlbicsXG59KTtcblxuY29uc3QgV0VCU09DS0VUX0RBVEEgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RGF0YUNodW5rPFdTRGF0YU1ldGE+PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2RhdGEnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG5jb25zdCBXRUJTT0NLRVRfQ0xPU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248V2ViU29ja2V0Q2xvc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3NfY2xvc2UnLFxufSk7XG5cbnR5cGUgV2ViU29ja2V0RXJyb3IgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIHR5cGU6ICdDb25uZWN0aW9uUmVmdXNlZCc7XG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IFdFQlNPQ0tFVF9FUlJPUiA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxXZWJTb2NrZXRFcnJvcj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19lcnJvcicsXG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRnV0dXJlPFQ+KCk6IHtcbiAgICBwcm9taXNlOiBQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgICByZWplY3Q6IChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkO1xufSB7XG4gICAgbGV0IHJlc29sdmU6ICgodmFsdWU6IFQpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCByZWplY3Q6ICgocmVhc29uPzogdW5rbm93bikgPT4gdm9pZCkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXMsIHJlaikgPT4ge1xuICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICByZWplY3QgPSByZWo7XG4gICAgfSk7XG4gICAgaWYgKCFyZXNvbHZlIHx8ICFyZWplY3QpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBmdXR1cmUnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlLFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgfTtcbn1cblxudHlwZSBXU1NlbmRUYXNrID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZGF0YTogV1NEYXRhO1xufTtcblxuZXhwb3J0IGNsYXNzIEh0dHBFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEV4dGVuc2lvbj4gPSBIVFRQX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVxdWVzdENvdW50OiBudW1iZXIgPSAwO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwSGFuZGxlczogUmVjb3JkPHN0cmluZywgSGFuZGxlU3RhdGUgfCB1bmRlZmluZWQ+ID0ge307XG4gICAgcHJpdmF0ZSByZWFkb25seSB3c0hhbmRsZXM6IFJlY29yZDxzdHJpbmcsIFdTSGFuZGxlU3RhdGU+ID0ge307XG4gICAgcHJpdmF0ZSByZWFkb25seSB3c1NlbmRRdWV1ZTogV1NTZW5kVGFza1tdID0gW107XG4gICAgcHJpdmF0ZSB3c1NlbmRXYWl0UmVzb2x2ZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgKSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgUkVRVUVTVF9DUkVBVEUsXG4gICAgICAgICAgICBSRVFVRVNUX1NFTkQsXG4gICAgICAgICAgICBSRVFVRVNUX0NMT1NFLFxuICAgICAgICAgICAgUkVTUE9OU0VfQ1JFQVRFLFxuICAgICAgICAgICAgUkVTUE9OU0VfQ0hVTkssXG4gICAgICAgICAgICBSRVNQT05TRV9DTE9TRSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9DTE9TRSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9DUkVBVEUsXG4gICAgICAgICAgICBXRUJTT0NLRVRfREFUQSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9PUEVOLFxuICAgICAgICAgICAgV0VCU09DS0VUX0VSUk9SLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFJFU1BPTlNFX0NSRUFURSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgYWxyZWFkeSBoYW5kbGVkIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5zZXRSZXNwb25zZShwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRVNQT05TRV9DSFVOSywgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQubWV0YS5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gcmVxdWVzdCcsIHBhY2tldC5tZXRhLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdyZWNlaXZpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCBjaHVuayBmb3Igbm9uLXJlY2VpdmluZyByZXF1ZXN0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5yZWNlaXZlKHBhY2tldC5ib2R5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUkVTUE9OU0VfQ0xPU0UsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biByZXF1ZXN0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdyZWNlaXZpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCBjaHVuayBmb3Igbm9uLXJlY2VpdmluZyByZXF1ZXN0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9PUEVOLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAnY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciBhbHJlYWR5IGhhbmRsZWQgc29ja2V0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuaGFuZGxlLm9wZW4ocGFja2V0KTtcbiAgICAgICAgICAgIGhhbmRsZS50eXBlID0gJ3JlY2VpdmluZyc7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9EQVRBLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQubWV0YS5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gc29ja2V0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ3JlY2VpdmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIGNodW5rIGZvciBub24tcmVjZWl2aW5nIHNvY2tldCcsIHBhY2tldC5tZXRhLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuaGFuZGxlLmRpc3BhdGNoKHBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9DTE9TRSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy53c0hhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuY2xvc2UocGFja2V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9FUlJPUiwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy53c0hhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuZXJyb3IocGFja2V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUuZXZlbnQucmVhZHkubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3NTZW5kTG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdzU2VuZExvb3AoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBzZW5kID0gdGhpcy53c1NlbmRRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHNlbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IGF3YWl0IHRvVWludDhBcnJheShzZW5kLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2Ygc2VuZC5kYXRhID09PSAnc3RyaW5nJyA/IFdTTXNnVHlwZS5URVhUIDogV1NNc2dUeXBlLkJJTkFSWTtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFdFQlNPQ0tFVF9EQVRBLCBuZXcgRGF0YUNodW5rKHsgaWQ6IHNlbmQuaWQsIHR5cGUgfSwgYXJyYXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53c1NlbmRXYWl0UmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSGVhZGVycyhyZXF1ZXN0OiBSZXF1ZXN0LCBpbml0PzogUmVxdWVzdEluaXQpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBjb25zdCBrZXlzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IHNldCA9IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG93ZXJLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsS2V5ID0ga2V5c1tsb3dlcktleV07XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxLZXkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGVhZGVyc1tvcmlnaW5hbEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGtleXNbbG93ZXJLZXldID0ga2V5O1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluaXQ/LmhlYWRlcnMpIHtcbiAgICAgICAgICAgIGlmIChpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaW5pdC5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGluaXQuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpbml0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gaW5pdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW5pdC5oZWFkZXJzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIHNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUlkKCk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5vbXUuYXBwLmlkLmpvaW4oYCR7cGVyZm9ybWFuY2UudGltZU9yaWdpbn0tJHt0aGlzLnJlcXVlc3RDb3VudCsrfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0KGlucHV0OiBzdHJpbmcgfCBVUkwgfCBnbG9iYWxUaGlzLlJlcXVlc3QsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8eyByZXNwb25zZTogSHR0cFJlc3BvbnNlOyBzdHJlYW06IFJlYWRhYmxlU3RyZWFtIH0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlSWQoKS5rZXkoKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVRVNUX0NSRUFURSwge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMuZ2VuZXJhdGVIZWFkZXJzKHJlcXVlc3QsIGluaXQpLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmJvZHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IHJlcXVlc3QuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVRVUVTVF9TRU5ELCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGE6IHsgaWQgfSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub211LnNlbmQoUkVRVUVTVF9DTE9TRSwgeyBpZCB9KTtcbiAgICAgICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VGdXR1cmUgPSBjcmVhdGVGdXR1cmU8SHR0cFJlc3BvbnNlPigpO1xuICAgICAgICBsZXQgY2h1bmtFdmVudCA9IGNyZWF0ZUZ1dHVyZTxib29sZWFuPigpO1xuICAgICAgICBjb25zdCBzZXRSZXNwb25zZSA9IChyZXNwb25zZTogSHR0cFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuaHR0cEhhbmRsZXNbaWRdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNlaXZpbmcnLFxuICAgICAgICAgICAgICAgIHJlY2VpdmUoZGF0YTogVWludDhBcnJheTxBcnJheUJ1ZmZlckxpa2U+KSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua0V2ZW50LnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rRXZlbnQgPSBjcmVhdGVGdXR1cmU8Ym9vbGVhbj4oKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNsb3NlKCkge1xuICAgICAgICAgICAgICAgICAgICBjaHVua0V2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmh0dHBIYW5kbGVzW2lkXSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVkJyxcbiAgICAgICAgICAgIHNldFJlc3BvbnNlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlRnV0dXJlLnByb21pc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIHN0cmVhbTogbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICAgICAgICAgICAgICBhc3luYyBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChhd2FpdCBjaHVua0V2ZW50LnByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNodW5rKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2goaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxPbXVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCB7IHJlc3BvbnNlLCBzdHJlYW0gfSA9IGF3YWl0IHRoaXMucmVxdWVzdChpbnB1dCwgaW5pdCk7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICBuZXcgSGVhZGVycyhyZXNwb25zZS5oZWFkZXIpLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCAzMDAsXG4gICAgICAgICAgICByZXNwb25zZS5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICdiYXNpYycsXG4gICAgICAgICAgICByZXNwb25zZS51cmwsXG4gICAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3MoaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgb3B0aW9ucz86IHtcbiAgICAgICAgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgICBhdXRvY2xvc2U/OiBib29sZWFuO1xuICAgICAgICBhdXRvcGluZz86IGJvb2xlYW47XG4gICAgICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIH0pOiBQcm9taXNlPE9tdVdTPiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZW5lcmF0ZUlkKCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IE9tdVdTLmNyZWF0ZShcbiAgICAgICAgICAgIHRoaXMub211LFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud3NTZW5kUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZC5rZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFdhaXRSZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLndzSGFuZGxlc1tpZC5rZXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLndzSGFuZGxlc1tpZC5rZXkoKV0gPSB7XG4gICAgICAgICAgICB0eXBlOiAnY3JlYXRlZCcsXG4gICAgICAgICAgICBoYW5kbGUsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub211LnNlbmQoV0VCU09DS0VUX0NSRUFURSwge1xuICAgICAgICAgICAgaWQ6IGlkLmtleSgpLFxuICAgICAgICAgICAgaGVhZGVyOiB0aGlzLmdlbmVyYXRlSGVhZGVycyhyZXF1ZXN0LCBvcHRpb25zKSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaGFuZGxlLndzO1xuICAgIH1cbn1cblxuY2xhc3MgT211UmVzcG9uc2UgaW1wbGVtZW50cyBSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb2s6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZWRpcmVjdGVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNUZXh0OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZXNwb25zZVR5cGUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+PiB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5VXNlZDogYm9vbGVhbixcbiAgICApIHt9XG5cbiAgICBjbG9uZSgpOiBPbXVSZXNwb25zZSB7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICB0aGlzLm9rLFxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHQsXG4gICAgICAgICAgICB0aGlzLnR5cGUsXG4gICAgICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgICAgIHRoaXMuYm9keSxcbiAgICAgICAgICAgIHRoaXMuYm9keVVzZWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIGFzeW5jIGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCk7XG4gICAgfVxuICAgIGJsb2IoKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5ibG9iKCk7XG4gICAgfVxuICAgIGJ5dGVzKCk6IFByb21pc2U8VWludDhBcnJheTxBcnJheUJ1ZmZlcj4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCkudGhlbigoYnVmKSA9PiBuZXcgVWludDhBcnJheShidWYpKTtcbiAgICB9XG4gICAgZm9ybURhdGEoKTogUHJvbWlzZTxGb3JtRGF0YT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuZm9ybURhdGEoKTtcbiAgICB9XG4gICAganNvbigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuanNvbigpO1xuICAgIH1cbiAgICB0ZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS50ZXh0KCk7XG4gICAgfVxufVxuXG50eXBlIEV2ZW50TGlzdGVuZXJNYXA8VD4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06ICgoZXZlbnQ6IFRbS10pID0+IHVua25vd24pW11cbn07XG5cbmV4cG9ydCB0eXBlIFdTTXNnID0ge1xuICAgIHR5cGU6ICdvcGVuJztcbiAgICBkYXRhOiBXZWJTb2NrZXRPcGVuO1xufSB8IHtcbiAgICB0eXBlOiAnZXJyb3InO1xuICAgIGRhdGE6IFdlYlNvY2tldEVycm9yO1xufSB8IHtcbiAgICB0eXBlOiAndGV4dCc7XG4gICAgZGF0YTogc3RyaW5nO1xufSB8IHtcbiAgICB0eXBlOiAnYmluYXJ5JztcbiAgICBkYXRhOiBVaW50OEFycmF5O1xufSB8IHtcbiAgICB0eXBlOiAnY2xvc2UnO1xuICAgIGRhdGE6IFdlYlNvY2tldENsb3NlO1xufTtcblxuZXhwb3J0IGNsYXNzIE9tdVdTIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBhZGRRdWV1ZTogKGRhdGE6IFdTRGF0YSkgPT4gdm9pZCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2U6ICgpID0+IHZvaWQsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSByZWNlaXZlUXVldWU6IFdTTXNnW10gPSBbXSxcbiAgICAgICAgcHJpdmF0ZSByZWNlaXZlUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgICAgICBwcml2YXRlIHN0YXR1czogJ2Nvbm5lY3RpbmcnIHwgJ29wZW4nIHwgJ2Nsb3NlZCcgPSAnY29ubmVjdGluZycsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKG9tdTogT211LCBpZDogSWRlbnRpZmllciwgYWRkUXVldWU6IChkYXRhOiBXU0RhdGEpID0+IHZvaWQsIGRpc3Bvc2U6ICgpID0+IHZvaWQpOiBXZWJTb2NrZXRIYW5kbGUge1xuICAgICAgICBjb25zdCB3cyA9IG5ldyBPbXVXUyhvbXUsIGlkLCBhZGRRdWV1ZSwgZGlzcG9zZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3cyxcbiAgICAgICAgICAgIG9wZW46IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29wZW4nLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcGF0Y2g6IChkYXRhOiBEYXRhQ2h1bms8V1NEYXRhTWV0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tZXRhLnR5cGUgPT09IFdTTXNnVHlwZS5CSU5BUlkpIHtcbiAgICAgICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2JpbmFyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLmJvZHksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRleHREZWNvZGVyLmRlY29kZShkYXRhLmJvZHkpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbG9zZScsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kKGRhdGE6IFdTRGF0YSk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZFF1ZXVlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChXRUJTT0NLRVRfQ0xPU0UsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLmtleSgpLFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWNlaXZlKCk6IFByb21pc2U8V1NNc2c+IHtcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVJlc29sdmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxyZWFkeSByZWNlaXZpbmcgZnJvbSBhbm90aGVyIGFzeW5jIGNhbGwnKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5zdGF0dXMgIT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZWNlaXZlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB0aGlzLnJlY2VpdmVSZXNvbHZlID0gcmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnY2xvc2VkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdvcGVuJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ29wZW4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWNlaXZlUmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2aW5nIG9uIGFscmVhZHkgY2xvc2VkIHNvY2tldCcpO1xuICAgIH1cblxuICAgIHByb3RvY29sOiBzdHJpbmcgPSAnJztcbiAgICB1cmw6IHN0cmluZyA9ICcnO1xufVxuXG5leHBvcnQgY2xhc3MgT211V2ViU29ja2V0IGltcGxlbWVudHMgV2ViU29ja2V0IHtcbiAgICBwdWJsaWMgQ09OTkVDVElORyA9IDAgYXMgY29uc3Q7XG4gICAgcHVibGljIE9QRU4gPSAxIGFzIGNvbnN0O1xuICAgIHB1YmxpYyBDTE9TSU5HID0gMiBhcyBjb25zdDtcbiAgICBwdWJsaWMgQ0xPU0VEID0gMyBhcyBjb25zdDtcblxuICAgIGJpbmFyeVR5cGU6IEJpbmFyeVR5cGUgPSAnYmxvYic7XG4gICAgYnVmZmVyZWRBbW91bnQ6IG51bWJlciA9IDA7XG4gICAgZXh0ZW5zaW9uczogc3RyaW5nID0gJyc7XG4gICAgb25jbG9zZTogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBDbG9zZUV2ZW50KSA9PiBhbnkpIHwgbnVsbCA9IG51bGw7XG4gICAgb25lcnJvcjogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBFdmVudCkgPT4gYW55KSB8IG51bGwgPSBudWxsO1xuICAgIG9ubWVzc2FnZTogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBNZXNzYWdlRXZlbnQpID0+IGFueSkgfCBudWxsID0gbnVsbDtcbiAgICBvbm9wZW46ICgodGhpczogV2ViU29ja2V0LCBldjogRXZlbnQpID0+IGFueSkgfCBudWxsID0gbnVsbDtcbiAgICBwcm90b2NvbDogc3RyaW5nID0gJyc7XG4gICAgcmVhZHlTdGF0ZTogMCB8IDIgfCAxIHwgMyA9IDA7XG4gICAgdXJsOiBzdHJpbmcgPSAnJztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd3M6IE9tdVdTLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TGlzdGVuZXJzOiBFdmVudExpc3RlbmVyTWFwPFdlYlNvY2tldEV2ZW50TWFwPiA9IHtcbiAgICAgICAgICAgIGNsb3NlOiBbXSxcbiAgICAgICAgICAgIGVycm9yOiBbXSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IFtdLFxuICAgICAgICAgICAgb3BlbjogW10sXG4gICAgICAgIH0sXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVjZWl2ZUxvb3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlY2VpdmVMb29wKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ0xPU0VEKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIHR5cGUgfSA9IGF3YWl0IHRoaXMud3MucmVjZWl2ZSgpO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENsb3NlRXZlbnQoJ2Nsb3NlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogZGF0YS5jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBkYXRhLnJlYXNvbiA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnb3Blbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBkYXRhLnByb3RvY29sID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdvcGVuJywge30pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEVycm9yRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEucmVhc29uID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IE1lc3NhZ2VFdmVudCgnbWVzc2FnZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnb3BlbicpIHtcbiAgICAgICAgICAgIHRoaXMub25vcGVuPy4oZXZlbnQgYXMgTWVzc2FnZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhpcy5vbmVycm9yPy4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgIHRoaXMub25tZXNzYWdlPy4oZXZlbnQgYXMgTWVzc2FnZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlPy4oZXZlbnQgYXMgQ2xvc2VFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc2VuZChkYXRhOiBzdHJpbmcgfCBBcnJheUJ1ZmZlckxpa2UgfCBCbG9iIHwgQXJyYXlCdWZmZXJWaWV3KTogdm9pZCB7XG4gICAgICAgIHRoaXMud3Muc2VuZChkYXRhKTtcbiAgICB9XG5cbiAgICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cy5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIGFkZEV2ZW50TGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIFdlYlNvY2tldEV2ZW50TWFwPih0eXBlOiBLLCBsaXN0ZW5lcjogKHRoaXM6IFdlYlNvY2tldCwgZXY6IFdlYlNvY2tldEV2ZW50TWFwW0tdKSA9PiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICByZW1vdmVFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRFdmVudE1hcD4odHlwZTogSywgbGlzdGVuZXI6ICh0aGlzOiBXZWJTb2NrZXQsIGV2OiBXZWJTb2NrZXRFdmVudE1hcFtLXSkgPT4gYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbdHlwZV07XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdG9VaW50OEFycmF5KGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyTGlrZSB8IEJsb2IgfCBBcnJheUJ1ZmZlclZpZXcpOiBQcm9taXNlPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXJMaWtlPj4ge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRleHRFbmNvZGVyLmVuY29kZShkYXRhKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZGF0YS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhIGFzIEFycmF5QnVmZmVyTGlrZSk7XG4gICAgfVxufVxuIiwKICAgICJleHBvcnQgdHlwZSBVbmxpc3RlbiA9ICgpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXI8UCBleHRlbmRzIEFycmF5PGFueT4+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogQXJyYXk8KC4uLmFyZ3M6IFApID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPiA9IFtdO1xuXG4gICAgcHVibGljIGxpc3RlbihsaXN0ZW5lcjogKC4uLmFyZ3M6IFApID0+IGFueSk6IFVubGlzdGVuIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UodGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0KC4uLmFyZ3M6IFApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4udGhpcy5saXN0ZW5lcnNdKSB7XG4gICAgICAgICAgICBhd2FpdCBsaXN0ZW5lciguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsCiAgICAiXG50eXBlIFRhc2sgPSAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5leHBvcnQgY2xhc3MgTG9jayB7XG4gICAgcHJpdmF0ZSB0YXNrczogKFRhc2spW10gPSBbXTtcbiAgICBwcml2YXRlIHdhaXRlcjogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSB3YWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy53YWl0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndhaXRlcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndhaXRlciA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBydW5UYXNrcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy50YXNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSB0aGlzLnRhc2tzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy53YWl0ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBydW5UYXNrcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1c2U8VD4oY2FsbGJhY2s6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhd2FpdCBwcm9taXNlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMudGFza3MucHVzaCh0YXNrKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdCgpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgUmVnaXN0cnlQZXJtaXNzaW9ucywgUmVnaXN0cnlQZXJtaXNzaW9uc0pTT04gfSBmcm9tICcuL3JlZ2lzdHJ5JztcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5UGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IFVpbnQ4QXJyYXkgfCBudWxsLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFJlZ2lzdHJ5UGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVCb29sZWFuKHBhY2tldC52YWx1ZSAhPT0gbnVsbCk7XG4gICAgICAgIGlmIChwYWNrZXQudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkocGFja2V0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFJlZ2lzdHJ5UGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmVhZGVyLnJlYWRCb29sZWFuKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZXhpc3RpbmcgPyByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cnlQYWNrZXQoaWQsIHZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJQYWNrZXRKU09OIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHBlcm1pc3Npb25zOiBSZWdpc3RyeVBlcm1pc3Npb25zSlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFJlZ2lzdHJ5UGVybWlzc2lvbnMsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBSZWdpc3RlclBhY2tldCk6IFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBwYWNrZXQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogcGFja2V0LmlkLmtleSgpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5hbGwpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlYWQ6IHBlcm1zLnJlYWQgPyBJZGVudGlmaWVyLmZyb20ocGVybXMucmVhZCkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgd3JpdGU6IHBlcm1zLndyaXRlID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLndyaXRlKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBSZWdpc3RlclBhY2tldEpTT04pOiBSZWdpc3RlclBhY2tldCB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBkYXRhO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGRhdGEuaWQpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFsbDogcGVybXMuYWxsID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLmFsbCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVhZDogcGVybXMucmVhZCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5yZWFkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB3cml0ZTogcGVybXMud3JpdGUgPyBJZGVudGlmaWVyLmZyb20ocGVybXMud3JpdGUpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBMb2NrIH0gZnJvbSAnLi4vLi4vbG9jay5qcyc7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEpzb25UeXBlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB7IHR5cGUgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuaW1wb3J0IHsgUmVnaXN0ZXJQYWNrZXQsIFJlZ2lzdHJ5UGFja2V0IH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcbmltcG9ydCB7IHR5cGUgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSB9IGZyb20gJy4vcmVnaXN0cnkuanMnO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFJlZ2lzdHJ5RXh0ZW5zaW9uPiA9IFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmllcyA9IG5ldyBJZGVudGlmaWVyTWFwPFJlZ2lzdHJ5PHVua25vd24+PigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFJFR0lTVFJZX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIFJFR0lTVFJZX1VQREFURV9QQUNLRVQsXG4gICAgICAgICAgICBSRUdJU1RSWV9MSVNURU5fUEFDS0VULFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUmVnaXN0cnk8VD4ocmVnaXN0cnlUeXBlOiBSZWdpc3RyeVR5cGU8VD4pOiBSZWdpc3RyeTxUPiB7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKHJlZ2lzdHJ5VHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgd2l0aCBpZGVudGlmaWVyICcke3JlZ2lzdHJ5VHlwZS5pZH0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeUltcGwodGhpcy5vbXUsIHJlZ2lzdHJ5VHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihyZWdpc3RyeVR5cGU6IFJlZ2lzdHJ5VHlwZTxUPik6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHJlZ2lzdHJ5VHlwZS5pZDtcbiAgICAgICAgbGV0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyaWVzLmdldChpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKHJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5ID0gdGhpcy5jcmVhdGVSZWdpc3RyeShyZWdpc3RyeVR5cGUpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RyaWVzLnNldChpZGVudGlmaWVyLCByZWdpc3RyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5IGFzIFJlZ2lzdHJ5PFQ+O1xuICAgIH1cblxuICAgIHB1YmxpYyBqc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgZGVmYXVsdDogVDsgc2VyaWFsaXplcj86IFNlcmlhbGl6ZXI8VCwgRD4gfSk6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyaWVzLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpc3RyeSB3aXRoIG5hbWUgJyR7bmFtZX0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248VD4oaWRlbnRpZmllciwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogb3B0aW9ucy5kZWZhdWx0LFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVnaXN0cnkodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VyaWFsaXplZDxUPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgZGVmYXVsdDogVDsgc2VyaWFsaXplcjogU2VyaWFsaXplcjxULCBVaW50OEFycmF5PiB9KTogUmVnaXN0cnk8VD4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5IHdpdGggbmFtZSAnJHtuYW1lfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBvcHRpb25zLmRlZmF1bHQsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWdpc3RyeSh0YWJsZVR5cGUpO1xuICAgIH1cbn1cblxuY2xhc3MgUmVnaXN0cnlJbXBsPFQ+IGltcGxlbWVudHMgUmVnaXN0cnk8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8W1RdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2s6IExvY2sgPSBuZXcgTG9jaygpO1xuICAgIHByaXZhdGUgbGlzdGVuaW5nID0gZmFsc2U7XG4gICAgcHVibGljIHZhbHVlOiBUO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZWdpc3RyeVR5cGU8VD4sXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0eXBlLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRUdJU1RSWV9VUERBVEVfUEFDS0VULCAocGFja2V0KSA9PlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVVcGRhdGUocGFja2V0KSxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkVGFzaygoKSA9PiB0aGlzLm9uVGFzaygpKTtcbiAgICB9XG5cbiAgICBhc3luYyAjZ2V0KCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChSRUdJU1RSWV9HRVRfRU5EUE9JTlQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXN1bHQudmFsdWUpO1xuICAgIH1cblxuICAgIGFzeW5jICNzZXQodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9VUERBVEVfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy50eXBlLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudHlwZS5zZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5sb2NrLnVzZShhc3luYyAoKSA9PiB0aGlzLiNnZXQoKSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHRoaXMuI3NldCh2YWx1ZSkpO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubG9jay51c2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLiNnZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYXdhaXQgZm4odmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc2V0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1vZGlmeShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy4jZ2V0KCk7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGF3YWl0IGZuKHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3NldChuZXdWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4oaGFuZGxlcjogKHZhbHVlOiBUKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZyAmJiB0aGlzLm9tdS5yZWFkeSkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9MSVNURU5fUEFDS0VULCB0aGlzLnR5cGUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyLmxpc3RlbihoYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVVwZGF0ZShkYXRhOiBSZWdpc3RyeVBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGEuaWQuaXNFcXVhbCh0aGlzLnR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25UYXNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVHSVNUUllfTElTVEVOX1BBQ0tFVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHlwZS5pZC5pc1N1YnBhdGhPZih0aGlzLm9tdS5hcHAuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9SRUdJU1RFUl9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy50eXBlLnBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxSZWdpc3RyeUV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncmVnaXN0cnknLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IFJlZ2lzdHJ5RXh0ZW5zaW9uKG9tdSksXG4pO1xuZXhwb3J0IGNvbnN0IFJFR0lTVFJZX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRS5qb2luKCdwZXJtaXNzaW9uJyk7XG5jb25zdCBSRUdJU1RSWV9SRUdJU1RFUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UmVnaXN0ZXJQYWNrZXQ+KFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlZ2lzdGVyJyxcbiAgICBzZXJpYWxpemVyOiBSZWdpc3RlclBhY2tldCxcbn0pO1xuY29uc3QgUkVHSVNUUllfVVBEQVRFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxSZWdpc3RyeVBhY2tldD4oXG4gICAgUkVHSVNUUllfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAndXBkYXRlJyxcbiAgICAgICAgc2VyaWFsaXplcjogUmVnaXN0cnlQYWNrZXQsXG4gICAgfSxcbik7XG5jb25zdCBSRUdJU1RSWV9MSVNURU5fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2xpc3RlbicsXG4gICAgc2VyaWFsaXplcjogSWRlbnRpZmllcixcbn0pO1xuY29uc3QgUkVHSVNUUllfR0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8SWRlbnRpZmllciwgUmVnaXN0cnlQYWNrZXQ+KFxuICAgIFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2dldCcsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvSnNvbigpLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFJlZ2lzdHJ5UGFja2V0LFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IFJFR0lTVFJZX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgTG9jYWxlIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgdHlwZSB7IEV4dGVuc2lvbiB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IFJlZ2lzdHJ5VHlwZSwgdHlwZSBSZWdpc3RyeSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcblxuZXhwb3J0IGNvbnN0IEkxOE5fRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8STE4bkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZSgnaTE4bicsIChjbGllbnQpID0+IG5ldyBJMThuRXh0ZW5zaW9uKGNsaWVudCkpO1xuXG5leHBvcnQgY29uc3QgSTE4Tl9TRVRfTE9DQUxFU19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gSTE4Tl9FWFRFTlNJT05fVFlQRS5qb2luKCdsb2NhbGVzJywgJ3NldCcpO1xuZXhwb3J0IGNvbnN0IEkxOE5fR0VUX0xPQ0FMRVNfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IEkxOE5fRVhURU5TSU9OX1RZUEUuam9pbignbG9jYWxlcycsICdnZXQnKTtcbmNvbnN0IEkxOE5fTE9DQUxFU19SRUdJU1RSWV9UWVBFID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248TG9jYWxlW10+KEkxOE5fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbG9jYWxlcycsXG4gICAgZGVmYXVsdFZhbHVlOiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IFtdIDogd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXMgYXMgTG9jYWxlW10sXG59KTtcblxuZXhwb3J0IGNsYXNzIEkxOG5FeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEkxOG5FeHRlbnNpb24+ID0gSTE4Tl9FWFRFTlNJT05fVFlQRTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbG9jYWxlc1JlZ2lzdHJ5OiBSZWdpc3RyeTxMb2NhbGVbXT47XG4gICAgcHJpdmF0ZSBsb2NhbGVzPzogTG9jYWxlW107XG4gICAgcHVibGljIGRlZmF1bHRMb2NhbGVzPzogTG9jYWxlW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIHRoaXMubG9jYWxlc1JlZ2lzdHJ5ID0gb211LnJlZ2lzdHJpZXMuZ2V0KEkxOE5fTE9DQUxFU19SRUdJU1RSWV9UWVBFKTtcbiAgICAgICAgdGhpcy5sb2NhbGVzUmVnaXN0cnkubGlzdGVuKChsb2NhbGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxlcyA9IGxvY2FsZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExvY2FsZXMoKTogcmVhZG9ubHkgTG9jYWxlW10ge1xuICAgICAgICBpZiAodGhpcy5sb2NhbGVzICYmIHRoaXMubG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kZWZhdWx0TG9jYWxlcyB8fCB0aGlzLmRlZmF1bHRMb2NhbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZWZhdWx0IGxvY2FsZXMgYXJlIG5vdCBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0TG9jYWxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhbnNsYXRlKGxvY2FsaXplZFRleHQ6IExvY2FsaXplZFRleHQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsb2NhbGVzID0gdGhpcy5nZXRMb2NhbGVzKCk7XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxpemVkVGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5zZWxlY3RCZXN0VHJhbnNsYXRpb24obG9jYWxlcywgbG9jYWxpemVkVGV4dCk7XG4gICAgICAgIGlmICghdHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGxvY2FsaXplZFRleHQpWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0QmVzdFRyYW5zbGF0aW9uKFxuICAgICAgICBsb2NhbGVzOiByZWFkb25seSBMb2NhbGVbXSxcbiAgICAgICAgbG9jYWxpemVkVGV4dDogTG9jYWxpemVkVGV4dCxcbiAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsaXplZFRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxpemVkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBsb2NhbGl6ZWRUZXh0O1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZExvY2FsZXMgPSBsb2NhbGVzLnJlZHVjZSgoYWNjLCBsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGwuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaChwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCctJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10gYXMgc3RyaW5nW10pO1xuICAgICAgICBmb3IgKGNvbnN0IGwgb2YgdHJhbnNmb3JtZWRMb2NhbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uc1tsXTtcbiAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2NhbGUobG9jYWxlOiBMb2NhbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzUmVnaXN0cnkuc2V0KGxvY2FsZSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGVudW0gTG9nVHlwZSB7XG4gICAgRVJST1IgPSAnZXJyb3InLFxuICAgIFdBUk5JTkcgPSAnd2FybmluZycsXG4gICAgSU5GTyA9ICdpbmZvJyxcbiAgICBERUJVRyA9ICdkZWJ1ZycsXG59XG5cbmV4cG9ydCB0eXBlIExvZ01lc3NhZ2UgPSB7XG4gICAgdHlwZTogTG9nVHlwZTtcbiAgICB0ZXh0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgTG9nUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogTG9nTWVzc2FnZSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBMb2dQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGl0ZW0uaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoaXRlbS5tZXNzYWdlLnR5cGUpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoaXRlbS5tZXNzYWdlLnRleHQpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IExvZ1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IGlkID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHJlYWRlci5yZWFkU3RyaW5nKCkgYXMgTG9nVHlwZTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHR5cGUsIHRleHQgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2dQYWNrZXQoSWRlbnRpZmllci5mcm9tS2V5KGlkKSwgbWVzc2FnZSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHsgTG9nTWVzc2FnZSB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgeyBMb2dQYWNrZXQsIExvZ1R5cGUgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPExvZ2dlckV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnbG9nZ2VyJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgTG9nZ2VyRXh0ZW5zaW9uKGNsaWVudCksXG4pO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0xPR19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gTE9HR0VSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2xvZycpO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0xPR19QQUNLRVQ6IFBhY2tldFR5cGU8TG9nUGFja2V0PiA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxMb2dQYWNrZXQ+KExPR0dFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsb2cnLFxuICAgIHNlcmlhbGl6ZXI6IExvZ1BhY2tldCxcbn0pO1xuZXhwb3J0IGNvbnN0IExPR0dFUl9MSVNURU5fUEFDS0VUOiBQYWNrZXRUeXBlPElkZW50aWZpZXI+ID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KExPR0dFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcblxudHlwZSBMb2dMaXN0ZW5lciA9IChtZXNzYWdlOiBMb2dNZXNzYWdlKSA9PiB2b2lkO1xuZXhwb3J0IGNsYXNzIExvZ2dlckV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8TG9nZ2VyRXh0ZW5zaW9uPiA9IExPR0dFUl9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogSWRlbnRpZmllck1hcDxMb2dMaXN0ZW5lcltdPiA9IG5ldyBJZGVudGlmaWVyTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KExPR0dFUl9MT0dfUEFDS0VULCBMT0dHRVJfTElTVEVOX1BBQ0tFVCk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoTE9HR0VSX0xPR19QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5saXN0ZW5lcnMuZ2V0KHBhY2tldC5pZCk7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5mb3JFYWNoKChpdCkgPT4gaXQocGFja2V0Lm1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvZyhtZXNzYWdlOiBMb2dNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBMb2dQYWNrZXQodGhpcy5vbXUuYXBwLmlkLCBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChMT0dHRVJfTE9HX1BBQ0tFVCwgcGFja2V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXJyb3IodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5FUlJPUiwgdGV4dCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2FybmluZyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2coeyB0eXBlOiBMb2dUeXBlLldBUk5JTkcsIHRleHQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGluZm8odGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5JTkZPLCB0ZXh0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWJ1Zyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2coeyB0eXBlOiBMb2dUeXBlLkRFQlVHLCB0ZXh0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4oaWQ6IElkZW50aWZpZXIsIGxpc3RlbmVyOiBMb2dMaXN0ZW5lcik6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5vblJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKExPR0dFUl9MSVNURU5fUEFDS0VULCBpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGlkKSA/PyBbXTtcbiAgICAgICAgbGlzdC5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2V0KGlkLCBsaXN0KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGxpc3Quc3BsaWNlKGxpc3QuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbkxldmVsID0gJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJztcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbk1ldGFkYXRhID0ge1xuICAgIG5hbWU6IExvY2FsaXplZFRleHQ7XG4gICAgbm90ZT86IExvY2FsaXplZFRleHQ7XG4gICAgbGV2ZWw6IFBlcm1pc3Npb25MZXZlbDtcbn07XG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25UeXBlSnNvbiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGE7XG59O1xuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblR5cGUge1xuICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE6IFBlcm1pc3Npb25NZXRhZGF0YTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgaWQ6IElkZW50aWZpZXI7IG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGEgfSkge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGE7XG4gICAgICAgIH0sXG4gICAgKTogUGVybWlzc2lvblR5cGUge1xuICAgICAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25UeXBlKHtcbiAgICAgICAgICAgIGlkOiBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllciksXG4gICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IFBlcm1pc3Npb25UeXBlKTogUGVybWlzc2lvblR5cGVKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmlkLmtleSgpLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uOiBQZXJtaXNzaW9uVHlwZUpzb24pOiBQZXJtaXNzaW9uVHlwZSB7XG4gICAgICAgIHJldHVybiBuZXcgUGVybWlzc2lvblR5cGUoe1xuICAgICAgICAgICAgaWQ6IElkZW50aWZpZXIuZnJvbUtleShqc29uLmlkKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBqc29uLm1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAsIElkZW50aWZpZXJTZXQsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuaW1wb3J0IHsgUGVybWlzc2lvblR5cGUgfSBmcm9tICcuL3Blcm1pc3Npb24uanMnO1xuXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxQZXJtaXNzaW9uRXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdwZXJtaXNzaW9uJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgUGVybWlzc2lvbkV4dGVuc2lvbihjbGllbnQpLFxuKTtcbmNvbnN0IFBFUk1JU1NJT05fUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFBlcm1pc3Npb25UeXBlW10+KFxuICAgIFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAncmVnaXN0ZXInLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKFBlcm1pc3Npb25UeXBlKS50b0FycmF5KCksXG4gICAgfSxcbik7XG5jb25zdCBQRVJNSVNTSU9OX1JFUVVJUkVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXT4oUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1aXJlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKSxcbn0pO1xuY29uc3QgUEVSTUlTU0lPTl9SRVFVRVNUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcltdLCB2b2lkPihcbiAgICBQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3QnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG4gICAgfSxcbik7XG5jb25zdCBQRVJNSVNTSU9OX0dSQU5UX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxQZXJtaXNzaW9uVHlwZVtdPihQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2dyYW50JyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKFBlcm1pc3Npb25UeXBlKS50b0FycmF5KCksXG59KTtcblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25FeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFBlcm1pc3Npb25FeHRlbnNpb24+ID0gUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zID0gbmV3IElkZW50aWZpZXJNYXA8UGVybWlzc2lvblR5cGU+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RlcmVkUGVybWlzc2lvbnMgPSBuZXcgSWRlbnRpZmllck1hcDxQZXJtaXNzaW9uVHlwZT4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcXVpcmVkUGVybWlzc2lvbnMgPSBuZXcgSWRlbnRpZmllclNldCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFBFUk1JU1NJT05fUkVHSVNURVJfUEFDS0VULFxuICAgICAgICAgICAgUEVSTUlTU0lPTl9SRVFVSVJFX1BBQ0tFVCxcbiAgICAgICAgICAgIFBFUk1JU1NJT05fR1JBTlRfUEFDS0VULFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFBFUk1JU1NJT05fR1JBTlRfUEFDS0VULCAocGVybWlzc2lvbnMpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnMuc2V0KHBlcm1pc3Npb24uaWQsIHBlcm1pc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkVGFzaygoKSA9PiB0aGlzLm9uVGFzaygpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LmFwcC50eXBlID09PSAncmVtb3RlJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdGVyZWRQZXJtaXNzaW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChcbiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMucmVnaXN0ZXJlZFBlcm1pc3Npb25zLnZhbHVlcygpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChcbiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OX1JFUVVJUkVfUEFDS0VULFxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy5yZXF1aXJlZFBlcm1pc3Npb25zLnZhbHVlcygpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXIocGVybWlzc2lvbjogUGVybWlzc2lvblR5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUEVSTUlTU0lPTl9SRUdJU1RFUl9QQUNLRVQsIFtwZXJtaXNzaW9uXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkUGVybWlzc2lvbnMuc2V0KHBlcm1pc3Npb24uaWQsIHBlcm1pc3Npb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXF1aXJlKC4uLnBlcm1pc3Npb25JZHM6IEludG9JZFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkcyA9IHBlcm1pc3Npb25JZHMubWFwKElkZW50aWZpZXIuZnJvbSk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBpZHMuZmlsdGVyKChpZCkgPT4gIXRoaXMucGVybWlzc2lvbnMuaGFzKGlkKSk7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJtaXNzaW9ucyBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjbGllbnQgc3RhcnRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy5hZGQoaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3QoLi4ucGVybWlzc2lvbklkczogSWRlbnRpZmllcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFBFUk1JU1NJT05fUkVRVUVTVF9FTkRQT0lOVCwgcGVybWlzc2lvbklkcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwZXJtaXNzaW9uSWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5oYXMocGVybWlzc2lvbklkZW50aWZpZXIpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBUYWJsZSwgVGFibGVUeXBlIH0gZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgUExVR0lOX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFBsdWdpbkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncGx1Z2luJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBQbHVnaW5FeHRlbnNpb24ob211KSxcbik7XG5cbmV4cG9ydCBjbGFzcyBQbHVnaW5FeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFBsdWdpbkV4dGVuc2lvbj4gPSBQTFVHSU5fRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZFBsdWdpbnM6IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChQTFVHSU5fUkVRVUlSRV9QQUNLRVQpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxvd2VkUGFja2FnZXMoKTogVGFibGU8UGx1Z2luUGFja2FnZUluZm8+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub211LnRhYmxlcy5nZXQoUExVR0lOX0FMTE9XRURfUEFDS0FHRV9UQUJMRSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZChvcHRpb25zOiBSZWxvYWRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFBMVUdJTl9SRUxPQURfRU5EUE9JTlRfVFlQRSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblRhc2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoUExVR0lOX1JFUVVJUkVfUEFDS0VULCBPYmplY3QuZnJvbUVudHJpZXModGhpcy5yZXF1aXJlZFBsdWdpbnMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVxdWlyZShwbHVnaW5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVnaW5zIG11c3QgYmUgcmVxdWlyZWQgYmVmb3JlIHRoZSBjbGllbnQgc3RhcnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGx1Z2lucykpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQbHVnaW5zLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgUExVR0lOX1JFUVVJUkVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+PihcbiAgICBQTFVHSU5fRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgfSxcbik7XG5leHBvcnQgY2xhc3MgUGx1Z2luUGFja2FnZUluZm8ge1xuICAgIHB1YmxpYyBwYWNrYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKF9wYWNrYWdlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLnBhY2thZ2UgPSBfcGFja2FnZTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBQbHVnaW5QYWNrYWdlSW5mbyk6IHsgcGFja2FnZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSnNvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9KTogUGx1Z2luUGFja2FnZUluZm8ge1xuICAgICAgICByZXR1cm4gUGx1Z2luUGFja2FnZUluZm8uZnJvbUpzb24oZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSnNvbihqc29uOiB7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0pOiBQbHVnaW5QYWNrYWdlSW5mbyB7XG4gICAgICAgIHJldHVybiBuZXcgUGx1Z2luUGFja2FnZUluZm8oanNvbi5wYWNrYWdlLCBqc29uLnZlcnNpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIHsgcGFja2FnZTogdGhpcy5wYWNrYWdlLCB2ZXJzaW9uOiB0aGlzLnZlcnNpb24gfTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2thZ2U7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUExVR0lOX1JFQURfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUExVR0lOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3BhY2thZ2UnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9NQU5BR0VfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUExVR0lOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3BhY2thZ2UnLCAnbWFuYWdlJyk7XG5cbmNvbnN0IFBMVUdJTl9BTExPV0VEX1BBQ0tBR0VfVEFCTEUgPSBUYWJsZVR5cGUuY3JlYXRlSnNvbihQTFVHSU5fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnYWxsb3dlZF9wYWNrYWdlJyxcbiAgICBzZXJpYWxpemVyOiBQbHVnaW5QYWNrYWdlSW5mbyxcbiAgICBrZXk6IChpdGVtKSA9PiBpdGVtLmtleSgpLFxufSk7XG5cbnR5cGUgUmVsb2FkT3B0aW9ucyA9IHtcbiAgICBwYWNrYWdlczogc3RyaW5nW10gfCBudWxsO1xufTtcblxudHlwZSBSZWxvYWRSZXN1bHQgPSB7XG4gICAgcGFja2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5jb25zdCBQTFVHSU5fUkVMT0FEX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxSZWxvYWRPcHRpb25zLCBSZWxvYWRSZXN1bHQ+KFBMVUdJTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWxvYWQnLFxuICAgIHBlcm1pc3Npb25JZDogUExVR0lOX01BTkFHRV9QQUNLQUdFX1BFUk1JU1NJT05fSUQsXG59KTtcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgRmxhZ3MgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgdHlwZSB7IFRhYmxlQ29uZmlnIH0gZnJvbSAnLi90YWJsZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUGFja2V0KGlkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVJdGVtc1BhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgaXRlbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVJdGVtc1BhY2tldChpZCwgaXRlbXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlS2V5c1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleXM6IHN0cmluZ1tdLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVLZXlzUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5rZXlzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhY2tldC5rZXlzKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlS2V5c1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGtleXMucHVzaChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlS2V5c1BhY2tldChpZCwga2V5cyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVQcm94eVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVQcm94eVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQua2V5KTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVByb3h5UGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgIGl0ZW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUHJveHlQYWNrZXQoaWQsIGl0ZW1zLCBrZXkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUYWJsZUZldGNoUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbGltaXQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJhY2t3YXJkOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQubGltaXQpO1xuICAgICAgICBjb25zdCBmbGFncyA9IG5ldyBGbGFncyh7IGxlbmd0aDogMiB9KTtcbiAgICAgICAgZmxhZ3Muc2V0KDAsIHBhY2tldC5iYWNrd2FyZCk7XG4gICAgICAgIGZsYWdzLnNldCgxLCBwYWNrZXQuY3Vyc29yICE9PSBudWxsKTtcbiAgICAgICAgd3JpdGVyLndyaXRlRmxhZ3MoZmxhZ3MpO1xuICAgICAgICBpZiAocGFja2V0LmN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5jdXJzb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVGZXRjaFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBmbGFncyA9IHJlYWRlci5yZWFkRmxhZ3MoMik7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkID0gZmxhZ3MuZ2V0KDApO1xuICAgICAgICBjb25zdCBjdXJzb3IgPSBmbGFncy5pZlNldCgxLCAoKSA9PiByZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZldGNoUGFja2V0KGlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVGZXRjaFJhbmdlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnQ6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVuZDogc3RyaW5nLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFJhbmdlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnN0YXJ0KTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5lbmQpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGZXRjaFJhbmdlUGFja2V0KGlkLCBzdGFydCwgZW5kKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRDb25maWdQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjb25maWc6IFRhYmxlQ29uZmlnLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2V0Q29uZmlnUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkocGFja2V0LmNvbmZpZykpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNldENvbmZpZ1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFNldENvbmZpZ1BhY2tldChpZCwgY29uZmlnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYWxsOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlYWQ6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgd3JpdGU6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVtb3ZlOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHByb3h5OiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFNldFBlcm1pc3Npb25QYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIGxldCBmbGFncyA9IDA7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gMGIxMDAwMDtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGVVaW50OChmbGFncyk7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmFsbC5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlYWQua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQud3JpdGUua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlbW92ZS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5wcm94eS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICAgICAgICBjb25zdCBhbGwgPSBmbGFncyAmIDBiMSA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBmbGFncyAmIDBiMTAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCB3cml0ZSA9IGZsYWdzICYgMGIxMDAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCByZW1vdmUgPSBmbGFncyAmIDBiMTAwMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gZmxhZ3MgJiAwYjEwMDAwID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXRQZXJtaXNzaW9uUGFja2V0KGlkLCBhbGwsIHJlYWQsIHdyaXRlLCByZW1vdmUsIHByb3h5KTtcbiAgICB9XG59XG5cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQge1xuICAgIFNldENvbmZpZ1BhY2tldCxcbiAgICBTZXRQZXJtaXNzaW9uUGFja2V0LFxuICAgIFRhYmxlRmV0Y2hQYWNrZXQsXG4gICAgVGFibGVGZXRjaFJhbmdlUGFja2V0LFxuICAgIFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgVGFibGVLZXlzUGFja2V0LFxuICAgIFRhYmxlUGFja2V0LFxuICAgIFRhYmxlUHJveHlQYWNrZXQsXG59IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFRhYmxlLCBUYWJsZUNvbmZpZywgVGFibGVFdmVudHMsIFRhYmxlUGVybWlzc2lvbnMgfSBmcm9tICcuL3RhYmxlLmpzJztcbmltcG9ydCB7IFRhYmxlVHlwZSB9IGZyb20gJy4vdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgVEFCTEVfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8VGFibGVFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3RhYmxlJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgVGFibGVFeHRlbnNpb24oY2xpZW50KSxcbik7XG5leHBvcnQgY29uc3QgVEFCTEVfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3Blcm1pc3Npb24nKTtcblxuY29uc3QgVEFCTEVfU0VUX1BFUk1JU1NJT05fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNldFBlcm1pc3Npb25QYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9wZXJtaXNzaW9uJyxcbiAgICBzZXJpYWxpemVyOiBTZXRQZXJtaXNzaW9uUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxTZXRDb25maWdQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9jb25maWcnLFxuICAgIHNlcmlhbGl6ZXI6IFNldENvbmZpZ1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFRBQkxFX1BST1hZX0xJU1RFTl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHlfbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5jb25zdCBUQUJMRV9QUk9YWV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQcm94eVBhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHknLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlUHJveHlQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fQUREX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2FkZCcsXG4gICAgc2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1fdXBkYXRlJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX1JFTU9WRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV9yZW1vdmUnLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fR0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2dldCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlS2V5c1BhY2tldCwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVLZXlzUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUtleXNQYWNrZXQsIGJvb2xlYW4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzX2FsbCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9IQVNfQU5ZX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBib29sZWFuPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2hhc19hbnknLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUtleXNQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLmpzb24oKSxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2gnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUZldGNoUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX1JBTkdFX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFJhbmdlUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdmZXRjaF9yYW5nZScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9GRVRDSF9BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZVBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2hfYWxsJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfU0laRV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlUGFja2V0LCBudW1iZXI+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NpemUnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2NsZWFyJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgVGFibGVFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFRhYmxlRXh0ZW5zaW9uPiA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFibGVNYXAgPSBuZXcgSWRlbnRpZmllck1hcDxUYWJsZTx1bmtub3duPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBUQUJMRV9TRVRfUEVSTUlTU0lPTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCxcbiAgICAgICAgICAgIFRBQkxFX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9QUk9YWV9MSVNURU5fUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfUFJPWFlfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9BRERfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUYWJsZTxUPih0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShUQUJMRV9QRVJNSVNTSU9OX0lEKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHRhYmxlVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFibGUgYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZUltcGw8VD4odGhpcy5vbXUsIHRhYmxlVHlwZSk7XG4gICAgICAgIHRoaXMudGFibGVNYXAuc2V0KHRhYmxlVHlwZS5pZCwgdGFibGUgYXMgVGFibGU8dW5rbm93bj4pO1xuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD4gfSk6IFRhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEpzb25UeXBlLCBVaW50OEFycmF5PihvcHRpb25zLnNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIG9wdGlvbnMua2V5LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZSh0YWJsZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PiB9KTogVGFibGU8VD4ge1xuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSksXG4gICAgICAgICAgICBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmtleSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWJsZU1hcC5nZXQodHlwZS5pZCkgYXMgVGFibGU8VD47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlTWFwLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG59XG5cbmNsYXNzIFRhYmxlSW1wbDxUPiBpbXBsZW1lbnRzIFRhYmxlPFQ+IHtcbiAgICBwdWJsaWMgY2FjaGU6IE1hcDxzdHJpbmcsIFQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBldmVudDogVGFibGVFdmVudHM8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlTWFwOiBNYXA8c3RyaW5nLCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+PjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3hpZXM6IEFycmF5PChpdGVtOiBUKSA9PiBUIHwgdW5kZWZpbmVkPjtcbiAgICBwcml2YXRlIGlkOiBJZGVudGlmaWVyO1xuICAgIHByaXZhdGUgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgIHByaXZhdGUga2V5RnVuY3Rpb246IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjYWNoZVNpemU/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjb25maWc/OiBUYWJsZUNvbmZpZztcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICB0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPixcbiAgICApIHtcbiAgICAgICAgdGhpcy5pZCA9IHRhYmxlVHlwZS5pZDtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gdGFibGVUeXBlLnNlcmlhbGl6ZXI7XG4gICAgICAgIHRoaXMua2V5RnVuY3Rpb24gPSB0YWJsZVR5cGUua2V5RnVuY3Rpb247XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZXZlbnQgPSB7XG4gICAgICAgICAgICBhZGQ6IG5ldyBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT4oKSxcbiAgICAgICAgICAgIHVwZGF0ZTogbmV3IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPigpLFxuICAgICAgICAgICAgcmVtb3ZlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgICAgICBjbGVhcjogbmV3IEV2ZW50RW1pdHRlcjxbXT4oKSxcbiAgICAgICAgICAgIGNhY2hlVXBkYXRlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvbWlzZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5wcm94aWVzID0gW107XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9QUk9YWV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMucHJveGllcy5mb3JFYWNoKChwcm94eSkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gbmV3IE1hcChcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJveHlJdGVtID0gcHJveHkoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5SXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBwcm94eUl0ZW0gYXMgVF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgW3N0cmluZywgVF0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaXRlbSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbXUuc2VuZChUQUJMRV9QUk9YWV9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBrZXk6IHBhY2tldC5rZXksXG4gICAgICAgICAgICAgICAgaXRlbXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV0ubWFwKChba2V5LCBpdGVtXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlbSldO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX0lURU1fQUREX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHBhY2tldC5pdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuYWRkLmVtaXQoaXRlbXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX1VQREFURV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhwYWNrZXQuaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LnVwZGF0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhY2tldC5pZC5pc0VxdWFsKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQucmVtb3ZlLmVtaXQoaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5lbWl0KHRoaXMuY2FjaGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX0NMRUFSX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LmNsZWFyLmVtaXQoKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4gdGhpcy5vblJlYWR5KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FjaGUoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBpdGVtcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLnNsaWNlKC10aGlzLmNhY2hlU2l6ZSkpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGxpc3RlbmVyPzogKGl0ZW1zOiBNYXA8c3RyaW5nLCBUPikgPT4gdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9MSVNURU5fUEFDS0VULCB0aGlzLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUubGlzdGVuKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5KGNhbGxiYWNrOiAoaXRlbTogVCkgPT4gVCB8IHVuZGVmaW5lZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKHRoaXMucHJveGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGxldCBjYW5jZWwgPSAoKTogdm9pZCA9PiB7fTtcbiAgICAgICAgICAgIGNhbmNlbCA9IHRoaXMub211Lm9uUmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3hpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfUFJPWFlfTElTVEVOX1BBQ0tFVCwgdGhpcy5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3hpZXMucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3hpZXMuc3BsaWNlKHRoaXMucHJveGllcy5pbmRleE9mKGNhbGxiYWNrKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblJlYWR5KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfU0VUX0NPTkZJR19QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9taXNlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9taXNlTWFwLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlTWFwLnNldChrZXksIHByb21pc2UpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZS50aGVuKChpdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb21pc2VNYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldE1hbnkoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkS2V5cyA9IGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIXRoaXMuY2FjaGUuaGFzKGtleSkpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+ICF0aGlzLnByb21pc2VNYXAuaGFzKGtleSkpO1xuICAgICAgICBpZiAoZmlsdGVyZWRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXAoWy4uLnRoaXMuY2FjaGVdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogZmlsdGVyZWRLZXlzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5zZXQoXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbigoaXRlbXMpID0+IGl0ZW1zLmdldChrZXkpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGQoLi4uaXRlbXM6IFRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZXJpYWxpemVJdGVtcyhpdGVtcyk7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9BRERfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGl0ZW1zOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VyaWFsaXplSXRlbXMoaXRlbXMpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fVVBEQVRFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZSguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNlcmlhbGl6ZUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZV0uZmlsdGVyKChba2V5XSkgPT4gIWtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fUkVNT1ZFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fQ0xFQVJfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhcyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzW2tleV0gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc01hbnk8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiguLi5rZXlzOiAoa2V5b2YgVClbXSk6IFByb21pc2U8eyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czoga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXMgYXMgeyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FsbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTllfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoSXRlbXMoe1xuICAgICAgICBsaW1pdCxcbiAgICAgICAgYmFja3dhcmQsXG4gICAgICAgIGN1cnNvcixcbiAgICB9OiB7XG4gICAgICAgIGxpbWl0OiBudW1iZXI7XG4gICAgICAgIGJhY2t3YXJkPzogYm9vbGVhbjtcbiAgICAgICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFxuICAgICAgICAgICAgVEFCTEVfRkVUQ0hfRU5EUE9JTlQsXG4gICAgICAgICAgICBuZXcgVGFibGVGZXRjaFBhY2tldCh0aGlzLmlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvciksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoUmFuZ2Uoe1xuICAgICAgICBzdGFydCxcbiAgICAgICAgZW5kLFxuICAgIH06IHtcbiAgICAgICAgc3RhcnQ6IHN0cmluZztcbiAgICAgICAgZW5kOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfRkVUQ0hfUkFOR0VfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaEFsbCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFRBQkxFX0ZFVENIX0FMTF9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyAqaXRlcmF0ZSh7XG4gICAgICAgIGJhY2t3YXJkLFxuICAgICAgICBjdXJzb3IsXG4gICAgfToge1xuICAgICAgICBiYWNrd2FyZD86IGJvb2xlYW47XG4gICAgICAgIGN1cnNvcj86IHN0cmluZztcbiAgICB9KTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMuZmV0Y2hJdGVtcyh7XG4gICAgICAgICAgICAgICAgbGltaXQ6IHRoaXMuY2FjaGVTaXplID8/IDEwMCxcbiAgICAgICAgICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpdGVtcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCogaXRlbXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoY3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5kZWxldGUoY3Vyc29yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnNvckl0ZW0gPSBiYWNrd2FyZCA/IGl0ZW1zLnZhbHVlcygpLm5leHQoKS52YWx1ZSA6IFsuLi5pdGVtcy52YWx1ZXMoKV0ucG9wKCk7XG4gICAgICAgICAgICBpZiAoIWN1cnNvckl0ZW0pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnNvciA9IHRoaXMua2V5RnVuY3Rpb24oY3Vyc29ySXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2l6ZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfU0laRV9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZXJpYWxpemVJdGVtcyhpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4pOiBNYXA8c3RyaW5nLCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbXMpLm1hcCgoW2tleSwgZGF0YV0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIGl0ZW1dO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVJdGVtcyhpdGVtczogVFtdKTogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmtleUZ1bmN0aW9uKGl0ZW0pLCB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGl0ZW0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDYWNoZVNpemUoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FjaGVTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZzogVGFibGVDb25maWcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCBjb25maWcgYWZ0ZXIgY2xpZW50IGhhcyBzdGFydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBUYWJsZVBlcm1pc3Npb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUuanMnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSwgdHlwZSBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCB7IFRhYmxlVHlwZSwgdHlwZSBUYWJsZSB9IGZyb20gJy4uL3RhYmxlJztcblxuZXhwb3J0IGNvbnN0IFNFUlZFUl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTZXJ2ZXJFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3NlcnZlcicsXG4gICAgKG9tdTogT211KSA9PiBuZXcgU2VydmVyRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4RW50cnkge1xuICAgIHVybDogc3RyaW5nO1xuICAgIGFkZGVkX2F0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4IHtcbiAgICBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBBcHBJbmRleEVudHJ5Pjtcbn07XG5cbmV4cG9ydCBjb25zdCBTRVJWRVJfQVBQU19SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignYXBwcycsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0FQUFNfV1JJVEVfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHBzJywgJ3dyaXRlJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0lOREVYX1JFQURfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdpbmRleCcsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0lOREVYX1JFR0lTVFJZX1RZUEU6IFJlZ2lzdHJ5VHlwZTxBcHBJbmRleD4gPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxBcHBJbmRleD4oU0VSVkVSX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2luZGV4JyxcbiAgICBkZWZhdWx0VmFsdWU6IHsgJ2luZGV4ZXMnOiB7fSB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHdyaXRlOiBTRVJWRVJfQVBQU19XUklURV9QRVJNSVNTSU9OX0lELFxuICAgICAgICByZWFkOiBTRVJWRVJfSU5ERVhfUkVBRF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcbmNvbnN0IEFQUF9UQUJMRV9UWVBFID0gVGFibGVUeXBlLmNyZWF0ZUpzb24oU0VSVkVSX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2FwcHMnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbiAgICBrZXk6IChhcHApID0+IGFwcC5pZC5rZXkoKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICBhbGw6IFNFUlZFUl9BUFBTX1dSSVRFX1BFUk1JU1NJT05fSUQsXG4gICAgICAgIHJlYWQ6IFNFUlZFUl9BUFBTX1JFQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBTRVJWRVJfU0hVVERPV05fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdzaHV0ZG93bicpO1xuY29uc3QgU0hVVERPV05fRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPGJvb2xlYW4sIGJvb2xlYW4+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzaHV0ZG93bicsXG4gICAgcGVybWlzc2lvbklkOiBTRVJWRVJfU0hVVERPV05fUEVSTUlTU0lPTl9JRCxcbn0pO1xuZXhwb3J0IGNvbnN0IFRSVVNURURfT1JJR0lOU19HRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCd0cnVzdGVkX29yaWdpbnMnLCAnZ2V0Jyk7XG5leHBvcnQgY29uc3QgVFJVU1RFRF9PUklHSU5TX1NFVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3RydXN0ZWRfb3JpZ2lucycsICdzZXQnKTtcbmNvbnN0IFRSVVNURURfSE9TVFNfUkVHSVNUUllfVFlQRSA9IFJlZ2lzdHJ5VHlwZS5jcmVhdGVKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd0cnVzdGVkX2hvc3RzJyxcbiAgICBkZWZhdWx0VmFsdWU6IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHJlYWQ6IFRSVVNURURfT1JJR0lOU19HRVRfUEVSTUlTU0lPTl9JRCxcbiAgICAgICAgd3JpdGU6IFRSVVNURURfT1JJR0lOU19TRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFNlcnZlckV4dGVuc2lvbj4gPSBTRVJWRVJfRVhURU5TSU9OX1RZUEU7XG4gICAgcHVibGljIHJlYWRvbmx5IGFwcHM6IFRhYmxlPEFwcD47XG4gICAgcHVibGljIHJlYWRvbmx5IGluZGV4OiBSZWdpc3RyeTxBcHBJbmRleD47XG4gICAgcHVibGljIHJlYWRvbmx5IHRydXN0ZWRIb3N0czogUmVnaXN0cnk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIHRoaXMuYXBwcyA9IG9tdS50YWJsZXMuZ2V0KEFQUF9UQUJMRV9UWVBFKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9tdS5yZWdpc3RyaWVzLmdldChTRVJWRVJfSU5ERVhfUkVHSVNUUllfVFlQRSk7XG4gICAgICAgIHRoaXMudHJ1c3RlZEhvc3RzID0gb211LnJlZ2lzdHJpZXMuZ2V0KFRSVVNURURfSE9TVFNfUkVHSVNUUllfVFlQRSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKHJlc3RhcnQ/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFNIVVRET1dOX0VORFBPSU5UX1RZUEUsIHJlc3RhcnQgPz8gZmFsc2UpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5saXN0ZW4gPSB0aGlzLm9tdS5uZXR3b3JrLmV2ZW50LmRpc2Nvbm5lY3RlZC5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uT2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb25Db25uZWN0Q2FsbGJhY2tzOiBBcnJheTwoYXBwOiBBcHApID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9uRGlzY29ubmVjdENhbGxiYWNrczogQXJyYXk8KGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBvbkNvbm5lY3QoY2FsbGJhY2s6IChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNvbm5lY3RDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGlzY29ubmVjdChjYWxsYmFjazogKGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uRGlzY29ubmVjdENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwSW5kZXhSZWdpc3RyeUpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgYXBwczogUmVjb3JkPHN0cmluZywgQXBwSnNvbj47XG59XG5cbmV4cG9ydCBjbGFzcyBBcHBJbmRleFJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgYXBwczogSWRlbnRpZmllck1hcDxBcHA+LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGpzb246IEFwcEluZGV4UmVnaXN0cnlKU09OKTogQXBwSW5kZXhSZWdpc3RyeSB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGpzb25bJ2lkJ10pO1xuICAgICAgICBjb25zdCBhcHBzID0gbmV3IElkZW50aWZpZXJNYXA8QXBwPigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtpZFN0ciwgYXBwSlNPTl0gb2YgT2JqZWN0LmVudHJpZXMoanNvblsnYXBwcyddKSkge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkoaWRTdHIpO1xuICAgICAgICAgICAgY29uc3QgYXBwID0gQXBwLmRlc2VyaWFsaXplKGFwcEpTT04pO1xuICAgICAgICAgICAgaWYgKCFpZC5pc05hbWVzcGFjZUVxdWFsKGFwcC5pZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFwcCBJRCBkb2VzIG5vdCBtYXRjaCB0aGUgSUQgaW4gdGhlIGluZGV4LiAke2FwcC5pZH0gIT0gJHtpZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcHMuc2V0KGlkLCBhcHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQXBwSW5kZXhSZWdpc3RyeShcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgYXBwcyxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwLCBJZGVudGlmaWVyU2V0LCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludCc7XG5pbXBvcnQgeyBFeHRlbnNpb24sIEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24nO1xuaW1wb3J0IHsgU2Vzc2lvbk9ic2VydmVyIH0gZnJvbSAnLi4vc2VydmVyL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBUYWJsZSwgVGFibGVUeXBlIH0gZnJvbSAnLi4vdGFibGUnO1xuXG5leHBvcnQgY29uc3QgU0VTU0lPTl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTZXNzaW9uRXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKCdzZXNzaW9ucycsIChvbXU6IE9tdSkgPT4gbmV3IFNlc3Npb25FeHRlbnNpb24ob211KSk7XG5cbmV4cG9ydCBjb25zdCBTRVNTSU9OU19SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3JlYWQnKTtcbmNvbnN0IFNFU1NJT05fVEFCTEVfVFlQRSA9IFRhYmxlVHlwZS5jcmVhdGVKc29uKFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2Vzc2lvbnMnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbiAgICBrZXk6IChhcHApID0+IGFwcC5pZC5rZXkoKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICByZWFkOiBTRVNTSU9OU19SRUFEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuY29uc3QgUkVRVUlSRV9BUFBTX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXT4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1aXJlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKSxcbn0pO1xuY29uc3QgU0VTU0lPTl9PQlNFUlZFX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXT4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdvYnNlcnZlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKSxcbn0pO1xuY29uc3QgU0VTU0lPTl9DT05ORUNURURfUEFDS0VUX1RZUEUgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248QXBwPihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Nlc3Npb25fY29ubmVjdGVkJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG59KTtcbmNvbnN0IFNFU1NJT05fRElTQ09OTkVDVEVEX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEFwcD4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzZXNzaW9uX2Rpc2Nvbm5lY3RlZCcsXG4gICAgc2VyaWFsaXplcjogQXBwLFxufSk7XG5cbnR5cGUgUmVtb3RlQXBwUmVxdWVzdFBheWxvYWQgPSB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBlcm1pc3Npb25zOiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RSZW1vdGVBcHBSZXNwb25zZSA9IHtcbiAgICB0eXBlOiAnc3VjY2Vzcyc7XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBsYW5faXA6IHN0cmluZztcbn0gfCB7XG4gICAgdHlwZTogJ2Vycm9yJztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgUkVNT1RFX0FQUF9SRVFVRVNUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3JlbW90ZV9hcHAnLCAncmVxdWVzdCcpO1xuXG5jb25zdCBSRU1PVEVfQVBQX1JFUVVFU1RfRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFJlbW90ZUFwcFJlcXVlc3RQYXlsb2FkLCBSZXF1ZXN0UmVtb3RlQXBwUmVzcG9uc2U+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVtb3RlX2FwcF9yZXF1ZXN0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IFJFTU9URV9BUFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lELFxufSk7XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRlVG9rZW5SZXNwb25zZSA9IHtcbiAgICB0eXBlOiAnc3VjY2Vzcyc7XG4gICAgdG9rZW46IHN0cmluZztcbn0gfCB7XG4gICAgdHlwZTogJ2Vycm9yJztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgR0VORVJBVEVfVE9LRU5fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFU1NJT05fRVhURU5TSU9OX1RZUEUuam9pbignZ2VuZXJhdGVfdG9rZW4nKTtcblxudHlwZSBHZW5lcmF0ZVRva2VuUGF5bG9hZCA9IHtcbiAgICBhcHA6IEFwcEpzb247XG4gICAgcGVybWlzc2lvbnM6IHN0cmluZ1tdO1xufTtcblxuY29uc3QgR0VORVJBVEVfVE9LRU5fRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPEdlbmVyYXRlVG9rZW5QYXlsb2FkLCBHZW5lcmF0ZVRva2VuUmVzcG9uc2U+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZ2VuZXJhdGVfdG9rZW4nLFxuICAgIHBlcm1pc3Npb25JZDogR0VORVJBVEVfVE9LRU5fUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8U2Vzc2lvbkV4dGVuc2lvbj4gPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFO1xuICAgIHB1YmxpYyByZWFkb25seSBzZXNzaW9uczogVGFibGU8QXBwPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25PYnNlcnZlcnMgPSBuZXcgSWRlbnRpZmllck1hcDxTZXNzaW9uT2JzZXJ2ZXI+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZEFwcHMgPSBuZXcgSWRlbnRpZmllclNldCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFJFUVVJUkVfQVBQU19QQUNLRVRfVFlQRSxcbiAgICAgICAgICAgIFNFU1NJT05fT0JTRVJWRV9QQUNLRVRfVFlQRSxcbiAgICAgICAgICAgIFNFU1NJT05fQ09OTkVDVEVEX1BBQ0tFVF9UWVBFLFxuICAgICAgICAgICAgU0VTU0lPTl9ESVNDT05ORUNURURfUEFDS0VUX1RZUEUsXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoXG4gICAgICAgICAgICBTRVNTSU9OX0NPTk5FQ1RFRF9QQUNLRVRfVFlQRSwgKGFwcCkgPT4gdGhpcy5oYW5kbGVTZXNzaW9uQ29ubmVjdChhcHApLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFxuICAgICAgICAgICAgU0VTU0lPTl9ESVNDT05ORUNURURfUEFDS0VUX1RZUEUsIChhcHApID0+IHRoaXMuaGFuZGxlU2Vzc2lvbkRpc2Nvbm5lY3QoYXBwKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXNzaW9ucyA9IG9tdS50YWJsZXMuZ2V0KFNFU1NJT05fVEFCTEVfVFlQRSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgICAgIG9tdS5vblJlYWR5KCgpID0+IHRoaXMub25SZWFkeSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzKGlkOiBJbnRvSWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2Vzc2lvbnMuaGFzKElkZW50aWZpZXIuZnJvbShpZCkua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvYnNlcnZlKGFwcElkOiBJbnRvSWQsIHtcbiAgICAgICAgb25Db25uZWN0LFxuICAgICAgICBvbkRpc2Nvbm5lY3QsXG4gICAgfToge1xuICAgICAgICBvbkNvbm5lY3QoYXBwOiBBcHApOiB2b2lkO1xuICAgICAgICBvbkRpc2Nvbm5lY3QoYXBwOiBBcHApOiB2b2lkO1xuICAgIH0pOiBTZXNzaW9uT2JzZXJ2ZXIge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbShhcHBJZCk7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFNFU1NJT05fT0JTRVJWRV9QQUNLRVRfVFlQRSwgW2lkXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLnNlc3Npb25PYnNlcnZlcnMuZ2V0KGlkKSA/PyBuZXcgU2Vzc2lvbk9ic2VydmVyKFtdLCBbXSk7XG4gICAgICAgIG9ic2VydmVyLm9uQ29ubmVjdChvbkNvbm5lY3QpO1xuICAgICAgICBvYnNlcnZlci5vbkRpc2Nvbm5lY3Qob25EaXNjb25uZWN0KTtcbiAgICAgICAgdGhpcy5zZXNzaW9uT2JzZXJ2ZXJzLnNldChpZCwgb2JzZXJ2ZXIpO1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZXNzaW9uQ29ubmVjdChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IHRoaXMuc2Vzc2lvbk9ic2VydmVycy5nZXQoYXBwLmlkKTtcbiAgICAgICAgaWYgKCFvYnNlcnZlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2Ygb2JzZXJ2ZXIub25Db25uZWN0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBhd2FpdCBjYWxsYmFjayhhcHApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZXNzaW9uRGlzY29ubmVjdChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IHRoaXMuc2Vzc2lvbk9ic2VydmVycy5nZXQoYXBwLmlkKTtcbiAgICAgICAgaWYgKCFvYnNlcnZlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2Ygb2JzZXJ2ZXIub25EaXNjb25uZWN0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBhd2FpdCBjYWxsYmFjayhhcHApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlcXVpcmUoLi4uYXBwSWRzOiBJbnRvSWRbXSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVxdWlyZSBhcHBzIGFmdGVyIHRoZSBjbGllbnQgaGFzIHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGFwcElkIG9mIGFwcElkcykge1xuICAgICAgICAgICAgdGhpcy5yZXF1aXJlZEFwcHMuYWRkKElkZW50aWZpZXIuZnJvbShhcHBJZCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblRhc2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkQXBwcy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVSVJFX0FQUFNfUEFDS0VUX1RZUEUsIEFycmF5LmZyb20odGhpcy5yZXF1aXJlZEFwcHMudmFsdWVzKCkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25SZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbk9ic2VydmVycy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChTRVNTSU9OX09CU0VSVkVfUEFDS0VUX1RZUEUsIEFycmF5LmZyb20odGhpcy5zZXNzaW9uT2JzZXJ2ZXJzLmtleXMoKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3RSZW1vdGVBcHAob3B0aW9uczoge1xuICAgICAgICBhcHA6IEFwcDtcbiAgICAgICAgcGVybWlzc2lvbnM6IEludG9JZFtdO1xuICAgIH0pOiBQcm9taXNlPFJlcXVlc3RSZW1vdGVBcHBSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCB7IGFwcCB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKCFhcHAudXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcCBtdXN0IGhhdmUgYSBVUkwgdG8gcmVxdWVzdCBpdCByZW1vdGVseScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcHAudHlwZSAhPT0gJ3JlbW90ZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIG11c3QgYmUgYSByZW1vdGUgYXBwIHRvIHJlcXVlc3QgaXQgcmVtb3RlbHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFwcC5tZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHAgbXVzdCBoYXZlIG1ldGFkYXRhIHRvIHJlcXVlc3QgaXQgcmVtb3RlbHknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoUkVNT1RFX0FQUF9SRVFVRVNUX0VORFBPSU5UX1RZUEUsIHtcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShvcHRpb25zLmFwcCksXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogb3B0aW9ucy5wZXJtaXNzaW9ucy5tYXAoaWQgPT4gSWRlbnRpZmllci5mcm9tKGlkKS5rZXkoKSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZVRva2VuKG9wdGlvbnM6IHtcbiAgICAgICAgYXBwOiBBcHA7XG4gICAgICAgIHBlcm1pc3Npb25zOiBJbnRvSWRbXTtcbiAgICB9KTogUHJvbWlzZTxHZW5lcmF0ZVRva2VuUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub211LmVuZHBvaW50cy5jYWxsKEdFTkVSQVRFX1RPS0VOX0VORFBPSU5UX1RZUEUsIHtcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShvcHRpb25zLmFwcCksXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogb3B0aW9ucy5wZXJtaXNzaW9ucy5tYXAoaWQgPT4gSWRlbnRpZmllci5mcm9tKGlkKS5rZXkoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB7IFNpZ25hbFBlcm1pc3Npb25zLCBTaWduYWxQZXJtaXNzaW9uc0pTT04gfSBmcm9tICcuL3NpZ25hbC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaWduYWxQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5OiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFNpZ25hbFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShwYWNrZXQuYm9keSk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogU2lnbmFsUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxQYWNrZXQoaWQsIGJvZHkpO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIFNpZ25hbFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uczogU2lnbmFsUGVybWlzc2lvbnNKU09OO1xufVxuXG5leHBvcnQgY2xhc3MgU2lnbmFsUmVnaXN0ZXJQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uczogU2lnbmFsUGVybWlzc2lvbnMsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBTaWduYWxSZWdpc3RlclBhY2tldCk6IFNpZ25hbFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBwYWNrZXQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogcGFja2V0LmlkLmtleSgpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5hbGwpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGxpc3RlbjogcGVybXMubGlzdGVuID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLmxpc3Rlbikua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2VuZDogcGVybXMuc2VuZCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5zZW5kKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBTaWduYWxSZWdpc3RlclBhY2tldEpTT04pOiBTaWduYWxSZWdpc3RlclBhY2tldCB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBkYXRhO1xuICAgICAgICByZXR1cm4gbmV3IFNpZ25hbFJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuaWQpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFsbDogcGVybXMuYWxsID8gSWRlbnRpZmllci5mcm9tS2V5KHBlcm1zLmFsbCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbGlzdGVuOiBwZXJtcy5saXN0ZW4gPyBJZGVudGlmaWVyLmZyb21LZXkocGVybXMubGlzdGVuKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzZW5kOiBwZXJtcy5zZW5kID8gSWRlbnRpZmllci5mcm9tS2V5KHBlcm1zLnNlbmQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcm1pc3Npb25zSlNPTiB7XG4gICAgYWxsPzogc3RyaW5nO1xuICAgIGxpc3Rlbj86IHN0cmluZztcbiAgICBzZW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcm1pc3Npb25zIHtcbiAgICBhbGw/OiBJbnRvSWQgfCB1bmRlZmluZWQ7XG4gICAgbGlzdGVuPzogSW50b0lkIHwgdW5kZWZpbmVkO1xuICAgIHNlbmQ/OiBJbnRvSWQgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTaWduYWxUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFNpZ25hbFBlcm1pc3Npb25zLFxuICAgICkge31cblxuICAgIHN0YXRpYyBjcmVhdGVKc29uPFQ+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgYW55PjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zPzogU2lnbmFsUGVybWlzc2lvbnM7XG4gICAgICAgIH0sXG4gICAgKTogU2lnbmFsVHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmFsVHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5vZjxULCBhbnk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCkpLnRvSnNvbigpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMgPz8ge30sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8VD4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgICAgICAgICAgcGVybWlzc2lvbnM/OiBTaWduYWxQZXJtaXNzaW9ucztcbiAgICAgICAgfSxcbiAgICApOiBTaWduYWxUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxUeXBlKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMgPz8ge30sXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbDxUPiB7XG4gICAgbGlzdGVuKGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gdm9pZCk6IFVubGlzdGVuO1xuICAgIG5vdGlmeShib2R5OiBUKTogdm9pZDtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlLCB0eXBlIEV4dGVuc2lvbiB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBTaWduYWxQYWNrZXQsIFNpZ25hbFJlZ2lzdGVyUGFja2V0IH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcbmltcG9ydCB7IFNpZ25hbFR5cGUsIHR5cGUgU2lnbmFsIH0gZnJvbSAnLi9zaWduYWwuanMnO1xuXG5leHBvcnQgY29uc3QgU0lHTkFMX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFNpZ25hbEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnc2lnbmFsJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBTaWduYWxFeHRlbnNpb24ob211KSxcbik7XG5cbmNvbnN0IFNJR05BTF9SRUdJU1RFUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248U2lnbmFsUmVnaXN0ZXJQYWNrZXQ+KFNJR05BTF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWdpc3RlcicsXG4gICAgc2VyaWFsaXplcjogU2lnbmFsUmVnaXN0ZXJQYWNrZXQsXG59KTtcbmNvbnN0IFNJR05BTF9MSVNURU5fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KFNJR05BTF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFNJR05BTF9OT1RJRllfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNpZ25hbFBhY2tldD4oU0lHTkFMX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ25vdGlmeScsXG4gICAgc2VyaWFsaXplcjogU2lnbmFsUGFja2V0LFxufSk7XG5cbmV4cG9ydCBjbGFzcyBTaWduYWxFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFNpZ25hbEV4dGVuc2lvbj4gPSBTSUdOQUxfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzaWduYWxzID0gbmV3IElkZW50aWZpZXJNYXA8U2lnbmFsVHlwZTx1bmtub3duPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBTSUdOQUxfUkVHSVNURVJfUEFDS0VULFxuICAgICAgICAgICAgU0lHTkFMX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBTSUdOQUxfTk9USUZZX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVNpZ25hbDxUPihzaWduYWxUeXBlOiBTaWduYWxUeXBlPFQ+KTogU2lnbmFsPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmFscy5oYXMoc2lnbmFsVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2lnbmFsIGZvciBrZXkgJHtzaWduYWxUeXBlLmlkfSBhbHJlYWR5IGNyZWF0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFNpZ25hbEltcGwodGhpcy5vbXUsIHNpZ25hbFR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBqc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD4gfSk6IFNpZ25hbDxUPiB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBTaWduYWxUeXBlLmNyZWF0ZUpzb248VD4oaWQsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zPy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbmFsKHR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4gfSk6IFNpZ25hbDxUPiB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBTaWduYWxUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VD4oaWQsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zPy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbmFsKHR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4oc2lnbmFsVHlwZTogU2lnbmFsVHlwZTxUPik6IFNpZ25hbDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25hbChzaWduYWxUeXBlKTtcbiAgICB9XG59XG5cbmNsYXNzIFNpZ25hbEltcGw8VD4gaW1wbGVtZW50cyBTaWduYWw8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiAoKHZhbHVlOiBUKSA9PiB2b2lkKVtdID0gW107XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmcgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IFNpZ25hbFR5cGU8VD4sXG4gICAgKSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoU0lHTkFMX05PVElGWV9QQUNLRVQsIChkYXRhKSA9PiB0aGlzLmhhbmRsZUJyb2FkY2FzdChkYXRhKSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5vdGlmeShib2R5OiBUKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnR5cGUuc2VyaWFsaXplci5zZXJpYWxpemUoYm9keSk7XG4gICAgICAgIHRoaXMub211LnNlbmQoU0lHTkFMX05PVElGWV9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgbGlzdGVuZXIoYm9keSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChTSUdOQUxfTElTVEVOX1BBQ0tFVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UodGhpcy5saXN0ZW5lcnMuaW5kZXhPZihoYW5kbGVyKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVCcm9hZGNhc3QoZGF0YTogU2lnbmFsUGFja2V0KTogdm9pZCB7XG4gICAgICAgIGlmICghZGF0YS5pZC5pc0VxdWFsKHRoaXMudHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBib2R5ID0gdGhpcy50eXBlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YS5ib2R5KTtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgbGlzdGVuZXIoYm9keSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUuaWQuaXNTdWJwYXRoT2YodGhpcy5vbXUuYXBwLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub211LnNlbmQoU0lHTkFMX1JFR0lTVEVSX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMudHlwZS5pZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB0aGlzLnR5cGUucGVybWlzc2lvbnMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgRGlzY29ubmVjdFR5cGUgfSBmcm9tICcuL25ldHdvcmsvcGFja2V0L3BhY2tldC10eXBlcy5qcyc7XG5leHBvcnQgY2xhc3MgT211RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcihtZXNzYWdlID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb25uZWN0UmVhc29uIGV4dGVuZHMgT211RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgdHlwZTogRGlzY29ubmVjdFR5cGUsXG4gICAgICAgIHB1YmxpYyBtZXNzYWdlID0gJycsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcnZlclJlc3RhcnQgZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuU0VSVkVSX1JFU1RBUlQsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFub3RoZXJDb25uZWN0aW9uIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLkFOT1RIRVJfQ09OTkVDVElPTiwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbkRlbmllZCBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5QRVJNSVNTSU9OX0RFTklFRCwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXBwUmVtb3ZlZCBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5BUFBfUkVNT1ZFRCwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFRva2VuIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLklOVkFMSURfVE9LRU4sIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRPcmlnaW4gZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9PUklHSU4sIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRWZXJzaW9uIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLklOVkFMSURfVkVSU0lPTiwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFBhY2tldCBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5JTlZBTElEX1BBQ0tFVCwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxFcnJvciBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5JTlRFUk5BTF9FUlJPUiwgbWVzc2FnZSk7XG4gICAgfVxufVxuIiwKICAgICJleHBvcnQgY29uc3QgVkVSU0lPTiA9ICcwLjkuMjYnO1xuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2V0LCBQYWNrZXREYXRhLCBQYWNrZXRUeXBlIH0gZnJvbSAnLi9wYWNrZXQnO1xuXG5leHBvcnQgY2xhc3MgUGFja2V0TWFwcGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlPFBhY2tldCwgUGFja2V0RGF0YT4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0TWFwID0gbmV3IElkZW50aWZpZXJNYXA8UGFja2V0VHlwZTx1bmtub3duPj4oKTtcblxuICAgIHB1YmxpYyByZWdpc3RlciguLi5wYWNrZXRUeXBlczogUGFja2V0VHlwZTx1bmtub3duPltdKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBwYWNrZXRUeXBlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFja2V0TWFwLmhhcyh0eXBlLmlkKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2V0IGlkICR7dHlwZS5pZC5rZXkoKX0gYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBhY2tldE1hcC5zZXQodHlwZS5pZCwgdHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUocGFja2V0OiBQYWNrZXQpOiBQYWNrZXREYXRhIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IHBhY2tldC50eXBlLmlkLmtleSgpLFxuICAgICAgICAgICAgZGF0YTogcGFja2V0LnR5cGUuc2VyaWFsaXplci5zZXJpYWxpemUocGFja2V0LmRhdGEpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGRlc2VyaWFsaXplKGRhdGE6IFBhY2tldERhdGEpOiBQYWNrZXQge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KGRhdGEudHlwZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnBhY2tldE1hcC5nZXQoaWRlbnRpZmllcik7XG4gICAgICAgIGlmICghdHlwZSkgdGhyb3cgbmV3IEVycm9yKGBQYWNrZXQgdHlwZSAke2RhdGEudHlwZX0gbm90IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBkYXRhOiB0eXBlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YS5kYXRhKSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwb3J0IHtcbiAgICBjb25uZWN0KCk6IFByb21pc2U8Q29ubmVjdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbiB7XG4gICAgc2VuZChwYWNrZXQ6IFBhY2tldCwgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFBhY2tldCwgUGFja2V0RGF0YT4pOiB2b2lkO1xuICAgIHJlY2VpdmUoc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFBhY2tldCwgUGFja2V0RGF0YT4pOiBQcm9taXNlPFBhY2tldCB8IG51bGw+O1xuICAgIGNsb3NlKCk6IHZvaWQ7XG4gICAgY2xvc2VkOiBib29sZWFuO1xufVxuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdCc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFBhY2tldCwgUGFja2V0RGF0YSB9IGZyb20gJy4vcGFja2V0JztcbmltcG9ydCB7IFBBQ0tFVF9UWVBFUyB9IGZyb20gJy4vcGFja2V0L3BhY2tldC10eXBlcyc7XG5cbmZ1bmN0aW9uIGJhc2U2NFVybEVuY29kZShidWZmZXI6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWZmZXJcbiAgICAgICAgLnRvQmFzZTY0KClcbiAgICAgICAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxuICAgICAgICAucmVwbGFjZSgvPS9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFVybERlY29kZShkYXRhOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICBkYXRhID0gZGF0YS5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChkYXRhLmxlbmd0aCAlIDQpIHtcbiAgICAgICAgZGF0YSArPSAnPSc7XG4gICAgfVxuICAgIHJldHVybiBVaW50OEFycmF5LmZyb21CYXNlNjQoZGF0YSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcih1ODogVWludDhBcnJheSk6IEFycmF5QnVmZmVyIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIodTgubGVuZ3RoKTtcbiAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICB2aWV3LnNldCh1OCk7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxudHlwZSBSU0FOdW1iZXJzID0ge1xuICAgIGU6IHN0cmluZztcbiAgICBuOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBFbmNyeXB0aW9uUmVzcG9uc2UgPSB7XG4gICAga2luZDogJ3YxJztcbiAgICByc2E6IFJTQU51bWJlcnM7XG4gICAgYWVzOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgRU5DUllQVElPTl9BVkFJTEFCTEU6IGJvb2xlYW4gPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiAhIWNyeXB0by5zdWJ0bGU7XG5cbmV4cG9ydCBjbGFzcyBEZWNyeXB0b3Ige1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpdmF0ZUtleTogQ3J5cHRvS2V5LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHB1YmxpY0tleTogQ3J5cHRvS2V5LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbmV3KCk6IFByb21pc2U8RGVjcnlwdG9yPiB7XG4gICAgICAgIGNvbnN0IHsgcHJpdmF0ZUtleSwgcHVibGljS2V5IH0gPSBhd2FpdCBjcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCcsXG4gICAgICAgICAgICAgICAgbW9kdWx1c0xlbmd0aDogNDA5NixcbiAgICAgICAgICAgICAgICBwdWJsaWNFeHBvbmVudDogbmV3IFVpbnQ4QXJyYXkoWzEsIDAsIDFdKSxcbiAgICAgICAgICAgICAgICBoYXNoOiAnU0hBLTI1NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEZWNyeXB0b3IocHJpdmF0ZUtleSwgcHVibGljS2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdG9SZXF1ZXN0KCk6IFByb21pc2U8UlNBTnVtYmVycz4ge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmV4cG9ydEtleSgnandrJywgdGhpcy5wdWJsaWNLZXkpO1xuICAgICAgICBpZiAoIWtleS5lKSB0aHJvdyBuZXcgRXJyb3IoJ0tleSBleHBvcnQgZmFpbGVkOiBtaXNzaW5nIGV4cG9uZW50Jyk7XG4gICAgICAgIGlmICgha2V5Lm4pIHRocm93IG5ldyBFcnJvcignS2V5IGV4cG9ydCBmYWlsZWQ6IG1pc3NpbmcgbW9kdWx1cycpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZToga2V5LmUsXG4gICAgICAgICAgICBuOiBrZXkubixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVjcnlwdChkYXRhOiBBcnJheUJ1ZmZlcik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgICAgeyBuYW1lOiAnUlNBLU9BRVAnIH0sXG4gICAgICAgICAgICB0aGlzLnByaXZhdGVLZXksXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZGVjcnlwdGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWNyeXB0U3RyaW5nKGRhdGE6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHsgbmFtZTogJ1JTQS1PQUVQJyB9LFxuICAgICAgICAgICAgdGhpcy5wcml2YXRlS2V5LFxuICAgICAgICAgICAgY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKGJhc2U2NFVybERlY29kZShkYXRhKSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0ZXh0RGVjb2Rlci5kZWNvZGUoZGVjcnlwdGVkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmNyeXB0b3Ige1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHVibGljS2V5OiBDcnlwdG9LZXksXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBuZXcocmVxdWVzdDogUlNBTnVtYmVycyk6IFByb21pc2U8RW5jcnlwdG9yPiB7XG4gICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAgICAgJ2p3aycsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWxnOiAnUlNBLU9BRVAtMjU2JyxcbiAgICAgICAgICAgICAgICBleHQ6IHRydWUsXG4gICAgICAgICAgICAgICAga2V5X29wczogWydlbmNyeXB0J10sXG4gICAgICAgICAgICAgICAga3R5OiAnUlNBJyxcbiAgICAgICAgICAgICAgICBlOiByZXF1ZXN0LmUucmVwbGFjZSgvPSskLywgJycpLFxuICAgICAgICAgICAgICAgIG46IHJlcXVlc3Qubi5yZXBsYWNlKC89KyQvLCAnJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCcsXG4gICAgICAgICAgICAgICAgaGFzaDogJ1NIQS0yNTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmNyeXB0b3IocHVibGljS2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5jcnlwdChkYXRhOiBBcnJheUJ1ZmZlcik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMucHVibGljS2V5LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5jcnlwdFN0cmluZyhkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgIHRleHRFbmNvZGVyLmVuY29kZShkYXRhKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGJhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShlbmNyeXB0ZWQpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBRVMge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkga2V5OiBDcnlwdG9LZXksXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaXY6IEFycmF5QnVmZmVyLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbmV3KCk6IFByb21pc2U8QUVTPiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DQkMnLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTI4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpdiA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBRVMoa2V5LCBpdi5idWZmZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZGVzZXJpYWxpemUoYWVzOiBzdHJpbmcsIGRlY3J5cHRvcjogRGVjcnlwdG9yKTogUHJvbWlzZTxBRVM+IHtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjcnlwdG9yLmRlY3J5cHQoY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKGJhc2U2NFVybERlY29kZShhZXMpKSk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbUFycmF5QnVmZmVyKGRlY3J5cHRlZCk7XG4gICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICBjb25zdCBpdiA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuXG4gICAgICAgIGNvbnN0IGtleV9lbmNvZGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICAgICAgICAncmF3JyxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihrZXkpLFxuICAgICAgICAgICAgJ0FFUy1DQkMnLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IEFFUyhcbiAgICAgICAgICAgIGtleV9lbmNvZGVkLFxuICAgICAgICAgICAgY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKGl2KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VyaWFsaXplKGVuY3J5cHRvcjogRW5jcnlwdG9yKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoJ3JhdycsIHRoaXMua2V5KTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShuZXcgVWludDhBcnJheShyYXdLZXkpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShuZXcgVWludDhBcnJheSh0aGlzLml2KSk7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IGVuY3J5cHRvci5lbmNyeXB0KGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcih3cml0ZXIuZmluaXNoKCkpKTtcbiAgICAgICAgcmV0dXJuIGJhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShlbmNyeXB0ZWQpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5jcnlwdChkYXRhOiBQYWNrZXREYXRhKTogUHJvbWlzZTxQYWNrZXQ+IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGRhdGEudHlwZSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoZGF0YS5kYXRhKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJyxcbiAgICAgICAgICAgICAgICBpdjogdGhpcy5pdixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMua2V5LFxuICAgICAgICAgICAgY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKHdyaXRlci5maW5pc2goKSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBQQUNLRVRfVFlQRVMuRU5DUllQVEVEX1BBQ0tFVC5uZXcobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlY3J5cHQocGFja2V0OiBQYWNrZXQ8VWludDhBcnJheT4pOiBQcm9taXNlPFBhY2tldERhdGE+IHtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJyxcbiAgICAgICAgICAgICAgICBpdjogdGhpcy5pdixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMua2V5LFxuICAgICAgICAgICAgY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKHBhY2tldC5kYXRhKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tQXJyYXlCdWZmZXIoZGVjcnlwdGVkKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBZGRyZXNzIH0gZnJvbSAnLi4vYWRkcmVzcy5qcyc7XG5pbXBvcnQge1xuICAgIEFub3RoZXJDb25uZWN0aW9uLCBBcHBSZW1vdmVkLCBEaXNjb25uZWN0UmVhc29uLCBJbnRlcm5hbEVycm9yLFxuICAgIEludmFsaWRPcmlnaW4sXG4gICAgSW52YWxpZFBhY2tldCxcbiAgICBJbnZhbGlkVG9rZW4sXG4gICAgSW52YWxpZFZlcnNpb24sXG4gICAgUGVybWlzc2lvbkRlbmllZCxcbiAgICBTZXJ2ZXJSZXN0YXJ0LFxufSBmcm9tICcuLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211LmpzJztcbmltcG9ydCB0eXBlIHsgVG9rZW5Qcm92aWRlciB9IGZyb20gJy4uL3Rva2VuLmpzJztcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuLi92ZXJzaW9uLmpzJztcblxuaW1wb3J0IHR5cGUgeyBDb25uZWN0aW9uLCBUcmFuc3BvcnQgfSBmcm9tICcuL2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgUGFja2V0TWFwcGVyIH0gZnJvbSAnLi9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB7IEFFUywgRGVjcnlwdG9yLCBFTkNSWVBUSU9OX0FWQUlMQUJMRSwgRW5jcnlwdGlvblJlc3BvbnNlLCBFbmNyeXB0b3IgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgQ29ubmVjdFBhY2tldCwgRGlzY29ubmVjdFR5cGUsIFBBQ0tFVF9UWVBFUyB9IGZyb20gJy4vcGFja2V0L3BhY2tldC10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2tldCwgUGFja2V0VHlwZSB9IGZyb20gJy4vcGFja2V0L3BhY2tldC5qcyc7XG5cbnR5cGUgUGFja2V0SGFuZGxlcjxUPiA9IHtcbiAgICByZWFkb25seSB0eXBlOiBQYWNrZXRUeXBlPFQ+O1xuICAgIGV2ZW50OiBFdmVudEVtaXR0ZXI8W1RdPjtcbn07XG5cbnR5cGUgU3RhdHVzVHlwZTxUPiA9IHtcbiAgICB0eXBlOiBUO1xufTtcblxuZXhwb3J0IHR5cGUgTmV0d29ya1N0YXR1cyA9IFN0YXR1c1R5cGU8J2Nvbm5lY3RpbmcnPiB8IFN0YXR1c1R5cGU8J2Nvbm5lY3RlZCc+IHwgU3RhdHVzVHlwZTwncmVhZHknPiB8IHtcbiAgICB0eXBlOiAnZGlzY29ubmVjdGVkJztcbiAgICBhdHRlbXB0PzogbnVtYmVyO1xuICAgIHJlYXNvbj86IERpc2Nvbm5lY3RSZWFzb247XG59IHwge1xuICAgIHR5cGU6ICdyZWNvbm5lY3RpbmcnO1xuICAgIGF0dGVtcHQ6IG51bWJlcjtcbiAgICB0aW1lb3V0OiBudW1iZXI7XG4gICAgZGF0ZTogRGF0ZTtcbiAgICBjYW5jZWw6ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgY2xhc3MgTmV0d29yayB7XG4gICAgcHVibGljIHN0YXR1czogTmV0d29ya1N0YXR1cyA9IHsgdHlwZTogJ2Rpc2Nvbm5lY3RlZCcgfTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZXZlbnQ6IHsgY29ubmVjdGVkOiBFdmVudEVtaXR0ZXI8W10+OyBkaXNjb25uZWN0ZWQ6IEV2ZW50RW1pdHRlcjxbRGlzY29ubmVjdFJlYXNvbiB8IHVuZGVmaW5lZF0+OyBwYWNrZXQ6IEV2ZW50RW1pdHRlcjxbUGFja2V0PHVua25vd24+XT47IHN0YXR1czogRXZlbnRFbWl0dGVyPFtOZXR3b3JrU3RhdHVzXT4gfSA9IHtcbiAgICAgICAgY29ubmVjdGVkOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgIGRpc2Nvbm5lY3RlZDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICBwYWNrZXQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgc3RhdHVzOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgfTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhc2tzOiBBcnJheTwoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldE1hcHBlciA9IG5ldyBQYWNrZXRNYXBwZXIoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldEhhbmRsZXJzID0gbmV3IElkZW50aWZpZXJNYXA8UGFja2V0SGFuZGxlcjx1bmtub3duPj4oKTtcbiAgICBwcml2YXRlIGxpc3RlblRhc2s6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgcHVibGljIHJlYXNvbjogRGlzY29ubmVjdFJlYXNvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGF0dGVtcHQgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgICAgIHB1YmxpYyBhZGRyZXNzOiBBZGRyZXNzLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHRva2VuUHJvdmlkZXI6IFRva2VuUHJvdmlkZXIsXG4gICAgICAgIHByaXZhdGUgdHJhbnNwb3J0OiBUcmFuc3BvcnQsXG4gICAgICAgIHByaXZhdGUgY29ubmVjdGlvbj86IENvbm5lY3Rpb24gfCB1bmRlZmluZWQsXG4gICAgICAgIHByaXZhdGUgYWVzPzogQUVTIHwgdW5kZWZpbmVkLFxuICAgICkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLlNFUlZFUl9NRVRBLFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLkNPTk5FQ1QsXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuRElTQ09OTkVDVCxcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5UT0tFTixcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5SRUFEWSxcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5FTkNSWVBURURfUEFDS0VULFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZFBhY2tldEhhbmRsZXIoUEFDS0VUX1RZUEVTLkRJU0NPTk5FQ1QsIGFzeW5jIChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChyZWFzb24udHlwZSA9PT0gRGlzY29ubmVjdFR5cGUuU0hVVERPV05cbiAgICAgICAgICAgICAgICB8fCByZWFzb24udHlwZSA9PT0gRGlzY29ubmVjdFR5cGUuQ0xPU0UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdkaXNjb25uZWN0ZWQnIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IEVSUk9SX01BUCA9IHtcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuQU5PVEhFUl9DT05ORUNUSU9OXTogQW5vdGhlckNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLlBFUk1JU1NJT05fREVOSUVEXTogUGVybWlzc2lvbkRlbmllZCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuQVBQX1JFTU9WRURdOiBBcHBSZW1vdmVkLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX1RPS0VOXTogSW52YWxpZFRva2VuLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX09SSUdJTl06IEludmFsaWRPcmlnaW4sXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfVkVSU0lPTl06IEludmFsaWRWZXJzaW9uLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlRFUk5BTF9FUlJPUl06IEludGVybmFsRXJyb3IsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfUEFDS0VUXTogSW52YWxpZFBhY2tldCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9QQUNLRVRfVFlQRV06IEludmFsaWRQYWNrZXQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfUEFDS0VUX0RBVEFdOiBJbnZhbGlkUGFja2V0LFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5TRVJWRVJfUkVTVEFSVF06IFNlcnZlclJlc3RhcnQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLkNMT1NFXTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5TSFVURE9XTl06IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IEVSUk9SX01BUFtyZWFzb24udHlwZV07XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYXNvbiA9IG5ldyBlcnJvcihyZWFzb24ubWVzc2FnZSA/PyAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZFBhY2tldEhhbmRsZXIoUEFDS0VUX1RZUEVTLlJFQURZLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMudHlwZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2ZWQgUkVBRFkgcGFja2V0IHdoZW4gYWxyZWFkeSByZWFkeScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAncmVhZHknIH0pO1xuICAgICAgICAgICAgdGhpcy5hdHRlbXB0ID0gMDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbm5lY3Rpb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0dXMudHlwZSAhPT0gJ2Rpc2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNoYW5nZSBjb25uZWN0aW9uIHdoaWxlIGNvbm5lY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyUGFja2V0KC4uLnBhY2tldFR5cGVzOiBQYWNrZXRUeXBlPHVua25vd24+W10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWNrZXRNYXBwZXIucmVnaXN0ZXIoLi4ucGFja2V0VHlwZXMpO1xuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgcGFja2V0VHlwZXMpIHtcbiAgICAgICAgICAgIHRoaXMucGFja2V0SGFuZGxlcnMuc2V0KHR5cGUuaWQsIHtcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRQYWNrZXRIYW5kbGVyPFQ+KHR5cGU6IFBhY2tldFR5cGU8VD4sIGhhbmRsZXI6IChwYWNrZXQ6IFQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5wYWNrZXRIYW5kbGVycy5nZXQodHlwZS5pZCkgYXMgUGFja2V0SGFuZGxlcjx1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2V0IHR5cGUgJHt0eXBlLmlkLmtleSgpfSBub3QgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIGxpc3RlbmVycy5ldmVudC5saXN0ZW4oaGFuZGxlciBhcyAocGFja2V0OiB1bmtub3duKSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNjaGVkdWxlUmVjb25uZWN0KGF0dGVtcHQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gTWF0aC5taW4oMzAwMDAsIDIwMDAgKiAoTWF0aC5wb3coMS41LCBhdHRlbXB0KSAtIDEpICsgMjAwMCk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHN0YXR1czogRXh0cmFjdDxOZXR3b3JrU3RhdHVzLCB7IHR5cGU6ICdyZWNvbm5lY3RpbmcnIH0+ID0ge1xuICAgICAgICAgICAgdHlwZTogJ3JlY29ubmVjdGluZycsXG4gICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBjYW5jZWw6ICgpID0+IHtjYW5jZWxsZWQgPSB0cnVlO30sXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0U3RhdHVzKHN0YXR1cyk7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZW1haW5pbmcgPSBzdGF0dXMudGltZW91dCAtIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGRhdGUuZ2V0VGltZSgpKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgcmVtYWluaW5nKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KHJlY29ubmVjdCA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb25uZWN0IHdoaWxlICR7dGhpcy5zdGF0dXMudHlwZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saXN0ZW5UYXNrKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25uZWN0IHdoaWxlIGFscmVhZHkgY29ubmVjdGluZycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdHRlbXB0ID0gMDtcbiAgICAgICAgd2hpbGUgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0ZW1wdCsrO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5jb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAnY29ubmVjdGluZycgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YVJlY2VpdmVkID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLnJlY2VpdmUodGhpcy5wYWNrZXRNYXBwZXIpO1xuICAgICAgICAgICAgICAgIGlmICghbWV0YVJlY2VpdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiBjbG9zZWQgYmVmb3JlIHJlY2VpdmluZyBzZXJ2ZXIgbWV0YScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIVBBQ0tFVF9UWVBFUy5TRVJWRVJfTUVUQS5tYXRjaChtZXRhUmVjZWl2ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgcGFja2V0IHJlY2VpdmVkIHdhcyBub3Qgc2VydmVyIG1ldGEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBtZXRhIH0gPSBtZXRhUmVjZWl2ZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzLmhhc2ggPSBtZXRhLmhhc2g7XG4gICAgICAgICAgICAgICAgbGV0IHRva2VuID0gYXdhaXQgdGhpcy50b2tlblByb3ZpZGVyLmdldCh0aGlzLmFkZHJlc3MsIHRoaXMub211LmFwcCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuKGBObyB0b2tlbiBhdmFpbGFibGUgZm9yIGFwcCAke3RoaXMub211LmFwcC5pZC5rZXkoKX0gYXQgJHt0aGlzLmFkZHJlc3MuaG9zdH06JHt0aGlzLmFkZHJlc3MucG9ydH06JHt0aGlzLmFkZHJlc3MuaGFzaH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGVuY3J5cHRpb25SZXNwOiBFbmNyeXB0aW9uUmVzcG9uc2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub211LmFwcC50eXBlID09PSAncmVtb3RlJyAmJiBFTkNSWVBUSU9OX0FWQUlMQUJMRSAmJiBtZXRhLmVuY3J5cHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcnlwdG9yID0gYXdhaXQgRGVjcnlwdG9yLm5ldygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNyeXB0b3IgPSBhd2FpdCBFbmNyeXB0b3IubmV3KG1ldGEuZW5jcnlwdGlvbi5yc2EpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gYXdhaXQgZW5jcnlwdG9yLmVuY3J5cHRTdHJpbmcodG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWVzID0gYXdhaXQgQUVTLm5ldygpO1xuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uUmVzcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICd2MScsXG4gICAgICAgICAgICAgICAgICAgICAgICByc2E6IGF3YWl0IGRlY3J5cHRvci50b1JlcXVlc3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFlczogYXdhaXQgdGhpcy5hZXMuc2VyaWFsaXplKGVuY3J5cHRvciksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogUEFDS0VUX1RZUEVTLkNPTk5FQ1QsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG5ldyBDb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogdGhpcy5vbXUuYXBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2w6IHsgdmVyc2lvbjogVkVSU0lPTiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbjogZW5jcnlwdGlvblJlc3AsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSwgdGhpcy5wYWNrZXRNYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuVGFzayA9IHRoaXMubGlzdGVuKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAnY29ubmVjdGVkJyB9KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2ZW50LmNvbm5lY3RlZC5lbWl0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaFRhc2tzKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQQUNLRVRfVFlQRVMuUkVBRFksXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxpc3RlblRhc2s7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIERpc2Nvbm5lY3RSZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFzb24gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50LmRpc2Nvbm5lY3RlZC5lbWl0KHRoaXMucmVhc29uKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMudHlwZSAhPT0gJ2Rpc2Nvbm5lY3RlZCcgJiYgdGhpcy5zdGF0dXMudHlwZSAhPT0gJ3JlY29ubmVjdGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAnZGlzY29ubmVjdGVkJywgYXR0ZW1wdDogdGhpcy5hdHRlbXB0LCByZWFzb246IHRoaXMucmVhc29uIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24/LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuVGFzayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnJlYXNvbiAmJiAhW1xuICAgICAgICAgICAgICAgIERpc2Nvbm5lY3RUeXBlLlNIVVRET1dOLFxuICAgICAgICAgICAgICAgIERpc2Nvbm5lY3RUeXBlLlNFUlZFUl9SRVNUQVJULFxuICAgICAgICAgICAgXS5pbmNsdWRlcyh0aGlzLnJlYXNvbi50eXBlKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFzb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIXJlY29ubmVjdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVjb25uZWN0ID0gYXdhaXQgdGhpcy5zY2hlZHVsZVJlY29ubmVjdCh0aGlzLmF0dGVtcHQpO1xuICAgICAgICAgICAgaWYgKCFzaG91bGRSZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdkaXNjb25uZWN0ZWQnLCByZWFzb246IHRoaXMucmVhc29uIH0pO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24/LmNsb3NlKCk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU3RhdGUoc3RhdGU6IE5ldHdvcmtTdGF0dXNbJ3R5cGUnXSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXMudHlwZSA9PT0gc3RhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmQocGFja2V0OiBQYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFlcykge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMucGFja2V0TWFwcGVyLnNlcmlhbGl6ZShwYWNrZXQpO1xuICAgICAgICAgICAgcGFja2V0ID0gYXdhaXQgdGhpcy5hZXMuZW5jcnlwdChzZXJpYWxpemVkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZChwYWNrZXQsIHRoaXMucGFja2V0TWFwcGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxpc3RlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLnJlY2VpdmUodGhpcy5wYWNrZXRNYXBwZXIpO1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hQYWNrZXQocGFja2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hQYWNrZXQocGFja2V0OiBQYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKFBBQ0tFVF9UWVBFUy5FTkNSWVBURURfUEFDS0VULm1hdGNoKHBhY2tldCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hZXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmVkIGVuY3J5cHRlZCBwYWNrZXQgYmVmb3JlIGVuY3J5cHRpb24gd2FzIGVzdGFibGlzaGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCB0aGlzLmFlcy5kZWNyeXB0KHBhY2tldCk7XG4gICAgICAgICAgICBwYWNrZXQgPSB0aGlzLnBhY2tldE1hcHBlci5kZXNlcmlhbGl6ZShkZWNyeXB0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZXZlbnQucGFja2V0LmVtaXQocGFja2V0KTtcbiAgICAgICAgY29uc3QgcGFja2V0SGFuZGxlciA9IHRoaXMucGFja2V0SGFuZGxlcnMuZ2V0KHBhY2tldC50eXBlLmlkKTtcbiAgICAgICAgaWYgKCFwYWNrZXRIYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgcGFja2V0SGFuZGxlci5ldmVudC5lbWl0KHBhY2tldC5kYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkVGFzayh0YXNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIHRhc2sgYWZ0ZXIgY2xpZW50IGlzIHJlYWR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YXNrcy5wdXNoKHRhc2spO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVUYXNrKHRhc2s6ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGFza3Muc3BsaWNlKHRoaXMudGFza3MuaW5kZXhPZih0YXNrKSwgMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFRhc2tzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICAgICAgYXdhaXQgdGFzaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRTdGF0dXMoc3RhdHVzOiBOZXR3b3JrU3RhdHVzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gc3RhdHVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgc3RhdHVzIHRvICR7c3RhdHVzfSB3aGVuIGFscmVhZHkgJHtzdGF0dXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIGF3YWl0IHRoaXMuZXZlbnQuc3RhdHVzLmVtaXQoc3RhdHVzKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWRkcmVzcyB9IGZyb20gJy4uL2FkZHJlc3MuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB0eXBlIHsgQ29ubmVjdGlvbiwgVHJhbnNwb3J0IH0gZnJvbSAnLi9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2V0LCBQYWNrZXREYXRhIH0gZnJvbSAnLi9wYWNrZXQvcGFja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFRyYW5zcG9ydCBpbXBsZW1lbnRzIFRyYW5zcG9ydCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogQWRkcmVzcyxcbiAgICApIHsgfVxuXG4gICAgcHJpdmF0ZSBnZXQgd3NFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHRoaXMuYWRkcmVzcy5zZWN1cmUgPyAnd3NzJyA6ICd3cyc7XG4gICAgICAgIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gdGhpcy5hZGRyZXNzO1xuICAgICAgICByZXR1cm4gYCR7cHJvdG9jb2x9Oi8vJHtob3N0fToke3BvcnR9L3dzYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29ubmVjdCgpOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLndzRW5kcG9pbnQpO1xuICAgICAgICByZXR1cm4gV2Vic29ja2V0Q29ubmVjdGlvbi5mcm9tU29ja2V0KHNvY2tldCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2Vic29ja2V0Q29ubmVjdGlvbiBpbXBsZW1lbnRzIENvbm5lY3Rpb24ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0UXVldWU6IEFycmF5PFBhY2tldERhdGE+ID0gW107XG4gICAgcHJpdmF0ZSByZWNlaXZlV2FpdGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHJlYWRpbmdQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBiZWluZ0Nsb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgc29ja2V0OiBXZWJTb2NrZXQsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVNvY2tldChzb2NrZXQ6IFdlYlNvY2tldCk6IFByb21pc2U8V2Vic29ja2V0Q29ubmVjdGlvbj4ge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IFdlYnNvY2tldENvbm5lY3Rpb24oc29ja2V0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNvY2tldC5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5iZWluZ0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24ucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlY2VpdmVXYWl0ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWNlaXZlV2FpdGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IChldmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVhZGluZ1Byb21pc2UgPSBjb25uZWN0aW9uLm9uTWVzc2FnZShldmVudCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVhZGluZ1Byb21pc2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNvY2tldC5vbm9wZW4gPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25NZXNzYWdlKGV2ZW50OiBNZXNzYWdlRXZlbnQ8c3RyaW5nIHwgQmxvYj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBldmVudC5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBzdHJpbmcgZGF0YScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGF3YWl0IEJ5dGVSZWFkZXIuZnJvbUJsb2IoZXZlbnQuZGF0YSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICB0eXBlOiByZWFkZXIucmVhZFN0cmluZygpLFxuICAgICAgICAgICAgZGF0YTogcmVhZGVyLnJlYWRVaW50OEFycmF5KCksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucGFja2V0UXVldWUucHVzaChkYXRhKTtcbiAgICAgICAgcmVhZGVyLmZpbmlzaCgpO1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWNlaXZlKHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxQYWNrZXQ8dW5rbm93bj4sIFBhY2tldERhdGE+KTogUHJvbWlzZTxQYWNrZXQgfCBudWxsPiB7XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVXYWl0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxyZWFkeSByZWNlaXZpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5wYWNrZXRRdWV1ZS5sZW5ndGggPT09IDAgJiYgIXRoaXMuYmVpbmdDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlaXZlV2FpdGVyID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlV2FpdGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYWNrZXRRdWV1ZS5sZW5ndGggPT09IDAgJiYgdGhpcy5iZWluZ0Nsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFja2V0RGF0YSA9IHRoaXMucGFja2V0UXVldWUuc2hpZnQoKSE7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKHBhY2tldERhdGEpO1xuICAgIH1cblxuICAgIGdldCBjbG9zZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRpbmdQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFja2V0UXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVXYWl0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0LkNMT1NFRCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuQ0xPU0lORykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlV2FpdGVyKCk7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VuZChwYWNrZXQ6IFBhY2tldCwgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFBhY2tldDx1bmtub3duPiwgUGFja2V0RGF0YT4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFja2V0RGF0YSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHBhY2tldCk7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXREYXRhLnR5cGUpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KHBhY2tldERhdGEuZGF0YSk7XG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQod3JpdGVyLmZpbmlzaCgpKTtcbiAgICB9XG59XG4iLAogICAgInR5cGUgT2s8VD4gPSB7XG4gICAgb2s6IHRydWU7XG4gICAgZGF0YTogVDtcbn07XG50eXBlIEVycjxFPiA9IHtcbiAgICBvazogZmFsc2U7XG4gICAgZGF0YTogRTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnlDYXRjaDxULCBFID0gRXJyb3I+KGZ1bmM6ICgpID0+IFQpOiBPazxUPiB8IEVycjxFPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IGZ1bmMoKSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBkYXRhOiBlIGFzIEUgfTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWRkcmVzcyB9IGZyb20gJy4vYWRkcmVzcy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnLi9hcHAuanMnO1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuL2hlbHBlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Qcm92aWRlciB7XG4gICAgZ2V0KHNlcnZlckFkZHJlc3M6IEFkZHJlc3MsIGFwcDogQXBwKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xufVxuXG5leHBvcnQgdHlwZSBTZXNzaW9uUGFyYW0gPSB7XG4gICAgYWRkcmVzczogQWRkcmVzcztcbiAgICB0b2tlbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJUb2tlblByb3ZpZGVyIGltcGxlbWVudHMgVG9rZW5Qcm92aWRlciB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBUT0tFTl9QQVJBTV9LRVkgPSAnX29tdV9zZXNzaW9uJztcblxuICAgIHByaXZhdGUgZ2V0S2V5KGFkZHJlc3M6IEFkZHJlc3MsIGFwcDogQXBwKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFthZGRyZXNzLmhvc3QsIGFkZHJlc3MucG9ydCwgYWRkcmVzcy5oYXNoID8/ICcnLCBhcHAuaWQua2V5KCldKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGFkZHJlc3M6IEFkZHJlc3MsIGFwcDogQXBwKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgZm91bmRUb2tlbiA9IHRoaXMucGFyc2VQYXJhbVNlc3Npb24oYWRkcmVzcyk7XG4gICAgICAgIGlmIChmb3VuZFRva2VuKSByZXR1cm4gZm91bmRUb2tlbjtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VQYXJhbVNlc3Npb24oYWRkcmVzczogQWRkcmVzcyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgY29uc3QgcGFyYW0gPSBzZWFyY2hQYXJhbXMuZ2V0KEJyb3dzZXJUb2tlblByb3ZpZGVyLlRPS0VOX1BBUkFNX0tFWSk7XG4gICAgICAgIGlmICghcGFyYW0pIHJldHVybjtcbiAgICAgICAgY29uc3QgeyBvaywgZGF0YTogc2Vzc2lvbiB9ID0gdHJ5Q2F0Y2g8U2Vzc2lvblBhcmFtPigoKSA9PiBKU09OLnBhcnNlKHBhcmFtKSk7XG4gICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHBhcnNlIHNlc3Npb24gZnJvbSBVUkwgcGFyYW1ldGVyOiAke3Nlc3Npb259YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXNzaW9uLmFkZHJlc3MuaGFzaCAhPT0gYWRkcmVzcy5oYXNoKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFNlc3Npb24gYWRkcmVzcyBoYXNoIGRvZXMgbm90IG1hdGNoOiBleHBlY3RlZCAke2FkZHJlc3MuaGFzaH0sIGdvdCAke3Nlc3Npb24uYWRkcmVzcy5oYXNofWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2Vzc2lvbi50b2tlbjtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEV4dGVuc2lvblJlZ2lzdHJ5IH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgQVNTRVRfRVhURU5TSU9OX1RZUEUsIHR5cGUgQXNzZXRFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9hc3NldC9leHRlbnNpb24nO1xuaW1wb3J0IHsgREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB0eXBlIERhc2hib2FyZEV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2Rhc2hib2FyZC9leHRlbnNpb24nO1xuaW1wb3J0IHsgRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUsIHR5cGUgRW5kcG9pbnRFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9lbmRwb2ludC9leHRlbnNpb24nO1xuaW1wb3J0IHsgSFRUUF9FWFRFTlNJT05fVFlQRSwgSHR0cEV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2h0dHAvZXh0ZW5zaW9uJztcbmltcG9ydCB7IEkxOE5fRVhURU5TSU9OX1RZUEUsIHR5cGUgSTE4bkV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2kxOG4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IExPR0dFUl9FWFRFTlNJT05fVFlQRSwgdHlwZSBMb2dnZXJFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9sb2dnZXIvZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUsIHR5cGUgUGVybWlzc2lvbkV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3Blcm1pc3Npb24vZXh0ZW5zaW9uJztcbmltcG9ydCB7IFBMVUdJTl9FWFRFTlNJT05fVFlQRSwgdHlwZSBQbHVnaW5FeHRlbnNpb24gfSBmcm9tICcuL2FwaS9wbHVnaW4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFJlZ2lzdHJ5RXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvcmVnaXN0cnkvZXh0ZW5zaW9uJztcbmltcG9ydCB7IFNFUlZFUl9FWFRFTlNJT05fVFlQRSwgdHlwZSBTZXJ2ZXJFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9zZXJ2ZXIvZXh0ZW5zaW9uJztcbmltcG9ydCB7IFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIFNlc3Npb25FeHRlbnNpb24gfSBmcm9tICcuL2FwaS9zZXNzaW9uJztcbmltcG9ydCB7IFNJR05BTF9FWFRFTlNJT05fVFlQRSwgdHlwZSBTaWduYWxFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9zaWduYWwvZXh0ZW5zaW9uJztcbmltcG9ydCB7IFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFRhYmxlRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvdGFibGUvZXh0ZW5zaW9uJztcbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnLi9hcHAuanMnO1xuaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4vZXZlbnQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi9ldmVudCc7XG5pbXBvcnQgdHlwZSB7IEFkZHJlc3MsIENvbm5lY3Rpb24gfSBmcm9tICcuL25ldHdvcmsnO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gJy4vbmV0d29yayc7XG5pbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tICcuL25ldHdvcmsvY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBQQUNLRVRfVFlQRVMgfSBmcm9tICcuL25ldHdvcmsvcGFja2V0L3BhY2tldC10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2tldFR5cGUgfSBmcm9tICcuL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJzb2NrZXRUcmFuc3BvcnQgfSBmcm9tICcuL25ldHdvcmsvd2Vic29ja2V0LXRyYW5zcG9ydCc7XG5pbXBvcnQgeyBCcm93c2VyVG9rZW5Qcm92aWRlciwgdHlwZSBUb2tlblByb3ZpZGVyIH0gZnJvbSAnLi90b2tlbi5qcyc7XG5cbmV4cG9ydCB0eXBlIENsaWVudEV2ZW50cyA9IHtcbiAgICBzdGFydGVkOiBFdmVudEVtaXR0ZXI8W10+O1xuICAgIHN0b3BwZWQ6IEV2ZW50RW1pdHRlcjxbXT47XG4gICAgcmVhZHk6IEV2ZW50RW1pdHRlcjxbXT47XG59O1xuXG5leHBvcnQgY2xhc3MgT211IHtcbiAgICBwdWJsaWMgcmVhZHk6IGJvb2xlYW47XG4gICAgcHVibGljIHJ1bm5pbmc6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgZXZlbnQ6IENsaWVudEV2ZW50cyA9IHtcbiAgICAgICAgc3RhcnRlZDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICBzdG9wcGVkOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgIHJlYWR5OiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgfTtcbiAgICByZWFkb25seSB0b2tlbjogVG9rZW5Qcm92aWRlcjtcbiAgICByZWFkb25seSBhZGRyZXNzOiBBZGRyZXNzO1xuICAgIHJlYWRvbmx5IHNlc3Npb25zOiBTZXNzaW9uRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IG5ldHdvcms6IE5ldHdvcms7XG4gICAgcmVhZG9ubHkgZW5kcG9pbnRzOiBFbmRwb2ludEV4dGVuc2lvbjtcbiAgICByZWFkb25seSBwZXJtaXNzaW9uczogUGVybWlzc2lvbkV4dGVuc2lvbjtcbiAgICByZWFkb25seSBwbHVnaW5zOiBQbHVnaW5FeHRlbnNpb247XG4gICAgcmVhZG9ubHkgZGFzaGJvYXJkOiBEYXNoYm9hcmRFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgZXh0ZW5zaW9uczogRXh0ZW5zaW9uUmVnaXN0cnk7XG4gICAgcmVhZG9ubHkgdGFibGVzOiBUYWJsZUV4dGVuc2lvbjtcbiAgICByZWFkb25seSByZWdpc3RyaWVzOiBSZWdpc3RyeUV4dGVuc2lvbjtcbiAgICByZWFkb25seSBzaWduYWxzOiBTaWduYWxFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgYXNzZXRzOiBBc3NldEV4dGVuc2lvbjtcbiAgICByZWFkb25seSBpMThuOiBJMThuRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IHNlcnZlcjogU2VydmVyRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGh0dHA6IEh0dHBFeHRlbnNpb247XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwLFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgYWRkcmVzcz86IEFkZHJlc3M7XG4gICAgICAgICAgICB0b2tlbj86IFRva2VuUHJvdmlkZXIgfCBzdHJpbmc7XG4gICAgICAgICAgICB0cmFuc3BvcnQ/OiBUcmFuc3BvcnQ7XG4gICAgICAgICAgICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbiAgICAgICAgfSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zPy50b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gb3B0aW9ucz8udG9rZW47XG4gICAgICAgICAgICB0aGlzLnRva2VuID0ge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRva2VuKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRva2VuID0gb3B0aW9ucz8udG9rZW4gPz8gbmV3IEJyb3dzZXJUb2tlblByb3ZpZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRyZXNzID0gb3B0aW9ucz8uYWRkcmVzcyA/PyB7XG4gICAgICAgICAgICBob3N0OiAnMTI3LjAuMC4xJyxcbiAgICAgICAgICAgIHBvcnQ6IDI2NDIzLFxuICAgICAgICAgICAgc2VjdXJlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5uZXR3b3JrID0gbmV3IE5ldHdvcmsoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzLFxuICAgICAgICAgICAgdGhpcy50b2tlbixcbiAgICAgICAgICAgIG9wdGlvbnM/LnRyYW5zcG9ydCA/PyBuZXcgV2Vic29ja2V0VHJhbnNwb3J0KHRoaXMuYWRkcmVzcyksXG4gICAgICAgICAgICBvcHRpb25zPy5jb25uZWN0aW9uLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm5ldHdvcmsuZXZlbnQuZGlzY29ubmVjdGVkLmxpc3RlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihQQUNLRVRfVFlQRVMuUkVBRFksICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBSRUFEWSBwYWNrZXQgd2hlbiBhbHJlYWR5IHJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQucmVhZHkuZW1pdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5KHRoaXMpO1xuICAgICAgICB0aGlzLmVuZHBvaW50cyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihQTFVHSU5fRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnRhYmxlcyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihUQUJMRV9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoU0VTU0lPTl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMucmVnaXN0cmllcyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuc2lnbmFscyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihTSUdOQUxfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLmFzc2V0cyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihBU1NFVF9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuaTE4biA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihJMThOX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoU0VSVkVSX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoTE9HR0VSX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5odHRwID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKEhUVFBfRVhURU5TSU9OX1RZUEUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kPFQ+KHBhY2tldFR5cGU6IFBhY2tldFR5cGU8VD4sIGRhdGE6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZXR3b3JrLnNlbmQoe1xuICAgICAgICAgICAgdHlwZTogcGFja2V0VHlwZSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDbGllbnQgYWxyZWFkeSBydW5uaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgY29ubmVjdCA9IHRoaXMubmV0d29yay5jb25uZWN0KCk7XG4gICAgICAgIHRoaXMuZXZlbnQuc3RhcnRlZC5lbWl0KCk7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Q7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlbnQuc3RvcHBlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVhZHkoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiBVbmxpc3RlbiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5KSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50LnJlYWR5Lmxpc3RlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdhaXRGb3JSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHkpIHJldHVybjtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdW5saXN0ZW4gPSAoKSA9PiB7fTtcbiAgICAgICAgICAgIHVubGlzdGVuID0gdGhpcy5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHVubGlzdGVuKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7O0FBR08sTUFBTSxrQkFBa0I7QUFBQSxFQUdFO0FBQUEsRUFG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QUFBLElBQzVDO0FBQUEsSUFDQSxLQUFLLFVBQVU7QUFBQSxJQUNmLE1BQU0sVUFBVSxLQUFLLFFBQVEsUUFBUTtBQUFBLElBQ3JDLEtBQUssTUFBTSxRQUFRLEtBQUs7QUFBQSxJQUN4QixNQUFNO0FBQUE7QUFBQSxFQUdILElBQUksR0FBUztBQUFBLElBQ2hCLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLE1BQU0sUUFBUSxLQUFLO0FBQUE7QUFBQSxFQUdyQixPQUFPLENBQUMsVUFBZ0M7QUFBQSxJQUMzQyxJQUFJLEtBQUssT0FBTztBQUFBLE1BQ1osU0FBUztBQUFBLElBQ2I7QUFBQSxJQUNBLE9BQU8sS0FBSyxNQUFNLE1BQU0sT0FBTyxRQUFRO0FBQUE7QUFBQSxPQUc5QixhQUFZLEdBQWtCO0FBQUEsSUFDdkMsSUFBSSxLQUFLO0FBQUEsTUFBTztBQUFBLElBQ2hCLE9BQU8sSUFBSSxRQUFjLENBQUMsWUFBWTtBQUFBLE1BQ2xDLElBQUksV0FBVyxNQUFNO0FBQUEsTUFDckIsV0FBVyxLQUFLLE1BQU0sTUFBTSxPQUFPLE1BQU07QUFBQSxRQUNyQyxTQUFTO0FBQUEsUUFDVCxRQUFRO0FBQUEsT0FDWDtBQUFBLEtBQ0o7QUFBQTtBQUVUOyIsCiAgImRlYnVnSWQiOiAiQTQ2MDIwNkFFRjIzQUM4MzY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
4617
+ //# debugId=415277F056B4A9DB64756E2164756E21
4618
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FwaS9leHRlbnNpb24tcmVnaXN0cnkudHMiLCAiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvaWRlbnRpZmllci50cyIsICIuLi8uLi9zcmMvYXBpL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvY29uc3QudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9ieXRlYnVmZmVyLnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvc2VyaWFsaXplci50cyIsICIuLi8uLi9zcmMvYXBpL2VuZHBvaW50L2VuZHBvaW50LnRzIiwgIi4uLy4uL3NyYy9hcGkvYXNzZXQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9yZWdpc3RyeS50cyIsICIuLi8uLi9zcmMvYXBpL3RhYmxlL3RhYmxlLnRzIiwgIi4uLy4uL3NyYy9hcGkvZGFzaGJvYXJkL3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS9kYXNoYm9hcmQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL2FwaS9lbmRwb2ludC9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvZW5kcG9pbnQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvaHR0cC9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2V2ZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9sb2NrLnRzIiwgIi4uLy4uL3NyYy9hcGkvcmVnaXN0cnkvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL3JlZ2lzdHJ5L2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL2kxOG4vZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvbG9nZ2VyL3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS9sb2dnZXIvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvcGVybWlzc2lvbi9wZXJtaXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvcGVybWlzc2lvbi9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9wbHVnaW4vZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvdGFibGUvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL3RhYmxlL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3NlcnZlci9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9zZXNzaW9uL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3NpZ25hbC9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvc2lnbmFsL3NpZ25hbC50cyIsICIuLi8uLi9zcmMvYXBpL3NpZ25hbC9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2Vycm9ycy50cyIsICIuLi8uLi9zcmMvdmVyc2lvbi50cyIsICIuLi8uLi9zcmMvbmV0d29yay9jb25uZWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL2VuY3J5cHRpb24udHMiLCAiLi4vLi4vc3JjL25ldHdvcmsvbmV0d29yay50cyIsICIuLi8uLi9zcmMvbmV0d29yay93ZWJzb2NrZXQtdHJhbnNwb3J0LnRzIiwgIi4uLy4uL3NyYy9oZWxwZXIudHMiLCAiLi4vLi4vc3JjL3Rva2VuLnRzIiwgIi4uLy4uL3NyYy9vbXUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi9leHRlbnNpb24uanMnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnkge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXh0ZW5zaW9uTWFwOiBNYXA8c3RyaW5nLCBFeHRlbnNpb24+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge31cblxuICAgIHJlZ2lzdGVyPFQgZXh0ZW5kcyBFeHRlbnNpb24+KHR5cGU6IEV4dGVuc2lvblR5cGU8VD4pOiBUIHtcbiAgICAgICAgaWYgKHRoaXMuZXh0ZW5zaW9uTWFwLmhhcyh0eXBlLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVuc2lvbiB0eXBlICR7dHlwZS5uYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSB0eXBlLmNyZWF0ZSh0aGlzLm9tdSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uTWFwLnNldCh0eXBlLm5hbWUsIGV4dGVuc2lvbik7XG4gICAgICAgIHJldHVybiBleHRlbnNpb247XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGUgfSBmcm9tICcuL2xvY2FsaXphdGlvbi9sb2NhbGUuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgQXBwTWV0YWRhdGEgPSB7XG4gICAgbG9jYWxlOiBMb2NhbGU7XG4gICAgbmFtZT86IExvY2FsaXplZFRleHQ7XG4gICAgaWNvbj86IExvY2FsaXplZFRleHQ7XG4gICAgZGVzY3JpcHRpb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGltYWdlPzogTG9jYWxpemVkVGV4dDtcbiAgICBzaXRlPzogTG9jYWxpemVkVGV4dDtcbiAgICByZXBvc2l0b3J5PzogTG9jYWxpemVkVGV4dDtcbiAgICBhdXRob3JzPzogTG9jYWxpemVkVGV4dDtcbiAgICBsaWNlbnNlPzogTG9jYWxpemVkVGV4dDtcbiAgICB0YWdzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBBcHBUeXBlID0gJ2FwcCcgfCAnc2VydmljZScgfCAncmVtb3RlJyB8ICdwbHVnaW4nIHwgJ2Rhc2hib2FyZCc7XG5cbmV4cG9ydCB0eXBlIERlcGVuZGVuY3lTcGVjaWZpZXIgPSB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIGluZGV4Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwSnNvbiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IEFwcFR5cGU7XG4gICAgcGFyZW50X2lkPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG59O1xuXG5leHBvcnQgY2xhc3MgQXBwIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEFwcFR5cGU7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhcmVudElkPzogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIHB1YmxpYyByZWFkb25seSBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IEludG9JZCwgb3B0aW9uczoge1xuICAgICAgICB0eXBlPzogQXBwVHlwZTtcbiAgICAgICAgcGFyZW50SWQ/OiBJbnRvSWQ7XG4gICAgICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgICAgIHVybD86IHN0cmluZztcbiAgICAgICAgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICAgICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG4gICAgfSkge1xuICAgICAgICB0aGlzLmlkID0gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICAgICAgdGhpcy5wYXJlbnRJZCA9IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKG9wdGlvbnMucGFyZW50SWQpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb247XG4gICAgICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmw7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgPz8gJ2FwcCc7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gb3B0aW9ucy5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpbmZvOiBBcHBKc29uKTogQXBwIHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkoaW5mby5pZCk7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKGlkLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogSWRlbnRpZmllci5mcm9tT3B0aW9uYWwoaW5mby5wYXJlbnRfaWQpLFxuICAgICAgICAgICAgdmVyc2lvbjogaW5mby52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBpbmZvLnVybCxcbiAgICAgICAgICAgIHR5cGU6IGluZm8udHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBpbmZvLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBpbmZvLmRlcGVuZGVuY2llcyA/PyB7fSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogQXBwKTogQXBwSnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogZGF0YS5pZC5rZXkoKSxcbiAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgIHBhcmVudF9pZDogZGF0YS5wYXJlbnRJZD8ua2V5KCksXG4gICAgICAgICAgICB2ZXJzaW9uOiBkYXRhLnZlcnNpb24sXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IGRhdGEuZGVwZW5kZW5jaWVzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGhzOiBzdHJpbmdbXSk6IEFwcCB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKHRoaXMuaWQuam9pbiguLi5wYXRocyksIHtcbiAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuL2FwcCc7XG5cbmNvbnN0IE5BTUVTUEFDRV9SRUdFWCA9IC9eKFxcLlteLzouXXxbXFx3LV0pKyQvO1xuY29uc3QgTkFNRV9SRUdFWCA9IC9eW14vOl0rJC87XG5cbmV4cG9ydCB0eXBlIEludG9JZCA9IElkZW50aWZpZXIgfCBzdHJpbmcgfCBFeHRlbnNpb25UeXBlIHwgQXBwO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpZmllciB7XG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmdbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgLi4ucGF0aDogc3RyaW5nW11cbiAgICApIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXIua2V5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uOiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUpzb24oanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tKGlkOiBJbnRvSWQpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgaWYgKGlkIGluc3RhbmNlb2YgSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9IGVsc2UgaWYgKGlkIGluc3RhbmNlb2YgQXBwKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQuaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUtleShpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gaW5mZXJcbiAgICAgICAgICAgIC8vIFZpdGUgZG9lcyBub3QgcHJlc2VydmUgY2xhc3MgaW5mb3JtYXRpb24gd2hlbiBpbXBvcnRpbmcgZnJvbSBkaWZmZXJlbnQgcGFja2FnZXNcbiAgICAgICAgICAgIGNvbnN0IGlkQ2FzdGVkID0gaWQgYXMgeyBuYW1lc3BhY2U6IHN0cmluZzsgcGF0aDogc3RyaW5nW10gfTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgaWRDYXN0ZWQubmFtZXNwYWNlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaWRDYXN0ZWQucGF0aCkgJiZcbiAgICAgICAgICAgICAgICBpZENhc3RlZC5wYXRoLmV2ZXJ5KChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIoaWRDYXN0ZWQubmFtZXNwYWNlLCAuLi5pZENhc3RlZC5wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkV2l0aElkID0gaWQgYXMgeyBpZDogSW50b0lkIHwgdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkV2l0aElkLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb20oaWRXaXRoSWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCB0byBJZGVudGlmaWVyOiAke2lkfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tT3B0aW9uYWwoaWQ6IEludG9JZCB8IHVuZGVmaW5lZCB8IG51bGwpOiBJZGVudGlmaWVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlKG5hbWVzcGFjZTogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIW5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5hbWVzcGFjZTogTmFtZXNwYWNlIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhdGg6IFBhdGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFOQU1FU1BBQ0VfUkVHRVgudGVzdChuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgbXVzdCBtYXRjaCAke05BTUVTUEFDRV9SRUdFWH1gKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcGF0aCkge1xuICAgICAgICAgICAgaWYgKCFOQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGF0aDogTmFtZSBtdXN0IG1hdGNoICR7TkFNRV9SRUdFWH0gYnV0IGdvdCAke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZm9ybWF0KG5hbWVzcGFjZTogc3RyaW5nLCAuLi5wYXRoOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIElkZW50aWZpZXIudmFsaWRhdGUobmFtZXNwYWNlLCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIGAke25hbWVzcGFjZX06JHtwYXRoLmpvaW4oJy8nKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tS2V5KGtleTogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IGtleS5pbmRleE9mKCc6Jyk7XG4gICAgICAgIGlmIChzZXBhcmF0b3IgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5OiBObyBzZXBhcmF0b3IgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5pbmRleE9mKCc6Jywgc2VwYXJhdG9yICsgMSkgIT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5OiBNdWx0aXBsZSBzZXBhcmF0b3JzIGZvdW5kIGluICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IGtleS5zbGljZSgwLCBzZXBhcmF0b3IpO1xuICAgICAgICBjb25zdCBwYXRoID0ga2V5LnNsaWNlKHNlcGFyYXRvciArIDEpO1xuICAgICAgICBpZiAoIW5hbWVzcGFjZSB8fCAhcGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleTogTmFtZXNwYWNlIGFuZCBwYXRoIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGguc3BsaXQoJy8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVXJsKHVybDogc3RyaW5nIHwgVVJMKTogSWRlbnRpZmllciB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gSWRlbnRpZmllci5uYW1lc3BhY2VGcm9tVXJsKHBhcnNlZFVybC5ocmVmKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcnNlZFVybC5wYXRobmFtZS5zbGljZSgxKS5zcGxpdCgnLycpO1xuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIobmFtZXNwYWNlLCAuLi5wYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5hbWVzcGFjZUZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIHJldHVybiBwYXJzZWQuaG9zdG5hbWUuc3BsaXQoJy4nKS5yZXZlcnNlKCkuam9pbignLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21Kc29uKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGpzb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZm9ybWF0KHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleSgpID09PSBvdGhlci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNOYW1lc3BhY2VFcXVhbChvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgPT09IG90aGVyLm5hbWVzcGFjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdWJwYXRoT2Yob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubmFtZXNwYWNlICE9PSBvdGhlci5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXRoLmxlbmd0aCA8IG90aGVyLnBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdGhlci5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXRoW2ldICE9PSBvdGhlci5wYXRoW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGg6IHN0cmluZ1tdKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcih0aGlzLm5hbWVzcGFjZSwgLi4udGhpcy5wYXRoLCAuLi5wYXRoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyTWFwPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hcDogTWFwPHN0cmluZywgVD4gPSBuZXcgTWFwKCk7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudHJpZXM/OiBJdGVyYWJsZTxbSWRlbnRpZmllciwgVF0+LFxuICAgICkge1xuICAgICAgICBpZiAoIWVudHJpZXMpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoaWQua2V5KCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLnNldChpZGVudGlmaWVyLmtleSgpLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5oYXMoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLmRlbGV0ZShpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm1hcC5rZXlzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBUXT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLm1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtJZGVudGlmaWVyLmZyb21LZXkoa2V5KSwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyU2V0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0LnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZChpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0LmFkZChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0LmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuc2V0LmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIElkZW50aWZpZXJdPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuc2V0LmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICAgICAgeWllbGQgW2lkZW50aWZpZXIsIGlkZW50aWZpZXJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIElkZW50aWZpZXJdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uL29tdSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uIHtcbiAgICByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlO1xufVxuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uVHlwZTxUIGV4dGVuZHMgRXh0ZW5zaW9uID0gRXh0ZW5zaW9uPiBleHRlbmRzIElkZW50aWZpZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlOiAob211OiBPbXUpID0+IFQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCdleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxufVxuIiwKICAgICJleHBvcnQgY29uc3QgdGV4dEVuY29kZXI6IFRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5leHBvcnQgY29uc3QgdGV4dERlY29kZXI6IFRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4iLAogICAgImltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uL2NvbnN0LmpzJztcbmltcG9ydCB7IEpzb25UeXBlIH0gZnJvbSAnLi9zZXJpYWxpemVyLmpzJztcblxuZXhwb3J0IGNsYXNzIEZsYWdzIHtcbiAgICBwcml2YXRlIHZhbHVlOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBsZW5ndGg6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgdmFsdWU/OiBudW1iZXI7IGxlbmd0aD86IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlID8/IDA7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0aW9ucy5sZW5ndGggPz8gMzI7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGlmU2V0PFQ+KHBvc2l0aW9uOiBudW1iZXIsIGNhbGxiYWNrOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLmhhcyhwb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChwb3NpdGlvbjogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgfD0gMSA8PCBwb3NpdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgJj0gfigxIDw8IHBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZSh3cml0ZXI6IEJ5dGVXcml0ZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYml0cyA9IG5ldyBVaW50OEFycmF5KCh0aGlzLmxlbmd0aCArIDcpIC8gOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYml0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYml0c1tpXSA9ICh0aGlzLnZhbHVlID4+IChpICogOCkpICYgMHhmZjtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGUoYml0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkKHJlYWRlcjogQnl0ZVJlYWRlciwgbGVuZ3RoOiBudW1iZXIpOiBGbGFncyB7XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGxlbmd0aCArIDcpIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZSB8PSByZWFkZXIucmVhZFVpbnQ4KCkgPDwgKGkgKiA4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZsYWdzKHsgdmFsdWUsIGxlbmd0aCB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHNpZ24gPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDgwMDApID8gLTEgOiAxO1xuICAgIGNvbnN0IGV4cG9uZW50ID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHg3YzAwKSA+PiAxMDtcbiAgICBjb25zdCBtYW50aXNzYSA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4MDNmZik7XG4gICAgaWYgKGV4cG9uZW50ID09PSAwICYmIG1hbnRpc3NhID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IDB4MWYpIHtcbiAgICAgICAgcmV0dXJuIG1hbnRpc3NhID09PSAwID8gSW5maW5pdHkgKiBzaWduIDogTmFOO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50IC0gMTU7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNYW50aXNzYSA9IG1hbnRpc3NhIC8gMTAyNDtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNYXRoLnBvdygyLCBub3JtYWxpemVkRXhwb25lbnQpICogKDEgKyBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2lnbiA9IHZhbHVlIDwgMCA/IDEgOiAwO1xuICAgIHZhbHVlID0gTWF0aC5hYnModmFsdWUpO1xuICAgIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhwb25lbnQgPSBNYXRoLmZsb29yKE1hdGgubG9nMih2YWx1ZSkpO1xuICAgIGNvbnN0IG1hbnRpc3NhID0gdmFsdWUgLyBNYXRoLnBvdygyLCBleHBvbmVudCkgLSAxO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50ICsgMTU7XG4gICAgY29uc3Qgbm9ybWFsaXplZE1hbnRpc3NhID0gTWF0aC5yb3VuZChtYW50aXNzYSAqIDEwMjQpO1xuICAgIGlmIChub3JtYWxpemVkRXhwb25lbnQgPD0gMCkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCBzaWduIDw8IDE1KTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRFeHBvbmVudCA+PSAweDFmKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgKHNpZ24gPDwgMTUpIHwgKG5vcm1hbGl6ZWRFeHBvbmVudCA8PCAxMCkgfCBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVXcml0ZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgYnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgICBwcml2YXRlIG9mZnNldCA9IDA7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoaW5pdD86IEFycmF5QnVmZmVyLCBvZmZzZXQ/OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQgPz8gMDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBpbml0ID8/IG5ldyBBcnJheUJ1ZmZlcigxMDI0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVWludDhBcnJheShidWZmZXI6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICB1aW50OEFycmF5LnNldChuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlV3JpdGVyKGFycmF5QnVmZmVyLCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhbGxvY2F0ZShsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vZmZzZXQgKyBsZW5ndGggPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdCeXRlTGVuZ3RoID0gTWF0aC5tYXgodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCAqIDIsIHRoaXMub2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihuZXdCeXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KG5ld0J1ZmZlcikuc2V0KG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGRhdGE6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG9jYXRlKGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpLnNldChkYXRhLCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVCb29sZWFuKHZhbHVlOiBib29sZWFuKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50OCh0aGlzLm9mZnNldCwgdmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDgodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50NjQodmFsdWU6IGJpZ2ludCk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDgpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEJpZ0ludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ2NCh2YWx1ZTogYmlnaW50KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoOCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0QmlnVWludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVMRUIxMjgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICAvLyBVbnNpZ25lZCBMRUIxMjhcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh2YWx1ZSA+IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCAodmFsdWUgJiAweDdmKSB8IDB4ODApO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgICAgIHZhbHVlID4+PSA3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsIHZhbHVlICYgMHg3Zik7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB3cml0ZUZsb2F0MTYodGhpcy5kYXRhVmlldywgdGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDY0KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRGbG9hdDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ4QXJyYXkodmFsdWU6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVVMRUIxMjgodmFsdWUuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMud3JpdGUodmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTdHJpbmcodmFsdWU6IHN0cmluZyk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlVWludDhBcnJheSh0ZXh0RW5jb2Rlci5lbmNvZGUodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSlNPTih2YWx1ZTogSnNvblR5cGUpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbGFncyhmbGFnczogRmxhZ3MpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgZmxhZ3Mud3JpdGUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlciwgMCwgdGhpcy5vZmZzZXQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVSZWFkZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgb2Zmc2V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZGF0YTogRGF0YVZpZXcpIHtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IGRhdGE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkoYnVmZmVyOiBVaW50OEFycmF5KTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdWludDhBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21BcnJheUJ1ZmZlcihidWZmZXI6IEFycmF5QnVmZmVyKTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmcm9tQmxvYihibG9iOiBCbG9iKTogUHJvbWlzZTxCeXRlUmVhZGVyPiB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWQoc2l6ZTogbnVtYmVyKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpemUgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIHNpemUgPiB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgVWludDhBcnJheSh0aGlzLmRhdGFWaWV3LmJ1ZmZlciwgdGhpcy5vZmZzZXQsIHNpemUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBzaXplO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRCb29sZWFuKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50OCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50NjQoKTogYmlnaW50IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEJpZ0ludDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDY0KCk6IGJpZ2ludCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRCaWdVaW50NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVTEVCMTI4KCk6IG51bWJlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBsZXQgc2hpZnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZTogbnVtYmVyO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ5dGUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB2YWx1ZSB8PSAoYnl0ZSAmIDBiMDExMTExMTEpIDw8IHNoaWZ0O1xuICAgICAgICAgICAgc2hpZnQgKz0gNztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoKGJ5dGUgJiAwYjEwMDAwMDAwKSAhPT0gMCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEZsb2F0MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDY0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRGbG9hdDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDhBcnJheSgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZWFkVUxFQjEyOCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkKGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gdGhpcy5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVBcnJheSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRKU09OPFQgZXh0ZW5kcyBKc29uVHlwZT4oKTogVCB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMucmVhZFN0cmluZygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsYWdzKGxlbmd0aDogbnVtYmVyKTogRmxhZ3Mge1xuICAgICAgICByZXR1cm4gRmxhZ3MucmVhZCh0aGlzLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCAhPT0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5cbmV4cG9ydCB0eXBlIEpzb25UeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgfCB7IFtrZXkgaW4gbmV2ZXJdPzogSnNvblR5cGUgfSB8IEpzb25UeXBlW107XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICBzZXJpYWxpemUoZGF0YTogVCk6IEQ7XG4gICAgZGVzZXJpYWxpemUoZGF0YTogRCk6IFQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZTogKGRhdGE6IFQpID0+IEQsXG4gICAgICAgIHB1YmxpYyBkZXNlcmlhbGl6ZTogKGRhdGE6IEQpID0+IFQsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgb2Y8VCwgRD4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIEQ+KTogU2VyaWFsaXplcjxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihzZXJpYWxpemVyLnNlcmlhbGl6ZSwgc2VyaWFsaXplci5kZXNlcmlhbGl6ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwaXBlPFQsIFIsIEQ+KHNlcjE6IFNlcmlhbGl6YWJsZTxULCBSPiwgc2VyMjogU2VyaWFsaXphYmxlPFIsIEQ+KTogU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcjIuc2VyaWFsaXplKHNlcjEuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIxLmRlc2VyaWFsaXplKHNlcjIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdHJhbnNmb3JtPFQ+KGZ1bmM6ICh2YWx1ZTogVCkgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vb3A8VD4oKTogU2VyaWFsaXplcjxULCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBUPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkPFxuICAgICAgICBLIGV4dGVuZHMga2V5b2YgRCxcbiAgICAgICAgUixcbiAgICA+KFxuICAgICAgICBrZXk6IEssXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxEW0tdLCBSPixcbiAgICApOiBTZXJpYWxpemVyPFxuICAgICAgICBULFxuICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICA+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFxuICAgICAgICAgICAgVCxcbiAgICAgICAgICAgIHsgW1AgaW4ga2V5b2YgRF06IFAgZXh0ZW5kcyBLID8gUiA6IERbUF0gfVxuICAgICAgICA+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2VyaWFsaXplZCxcbiAgICAgICAgICAgICAgICAgICAgW2tleV06IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHNlcmlhbGl6ZWRba2V5XSksXG4gICAgICAgICAgICAgICAgfSBhcyB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGFba2V5XSBhcyBSKSxcbiAgICAgICAgICAgICAgICB9IGFzIEQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMganNvbjxUIGV4dGVuZHMgSnNvblR5cGU+KCk6IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGV4dEVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlcmlhbGl6ZShkYXRhKSkpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BcnJheSgpOiBTZXJpYWxpemVyPFRbXSwgRFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxUW10sIERbXT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuc2VyaWFsaXplKGl0ZW0pKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm1hcCgoaXRlbSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvTWFwKCk6IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxNYXA8c3RyaW5nLCBUPiwgTWFwPHN0cmluZywgRD4+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgRD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgdGhpcy5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmYWxsYmFjayhmYWxsYmFjazogVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tNYXAoZmFsbGJhY2s6IChkYXRhOiBELCBlcnJvcjogdW5rbm93bikgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjayhkYXRhLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGlwZTxFPihzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RCwgRT4pOiBTZXJpYWxpemVyPFQsIEU+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEU+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB0aGlzLmRlc2VyaWFsaXplKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBKc29uVHlwZSwgdHlwZSBTZXJpYWxpemFibGUsIFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRUeXBlPFJlcSA9IHVua25vd24sIFJlcyA9IHVua25vd24+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxSZXEsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVzLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25JZD86IElkZW50aWZpZXIgfCB1bmRlZmluZWQsXG4gICAgKSB7IH1cblxuICAgIHN0YXRpYyBjcmVhdGVKc29uPFJlcSwgUmVzLCBSZXFEYXRhIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZSwgUmVzRGF0YSBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcixcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8UmVxLCBSZXFEYXRhPjtcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxSZXMsIFJlc0RhdGE+O1xuICAgICAgICAgICAgcGVybWlzc2lvbklkPzogSW50b0lkO1xuICAgICAgICB9LFxuICAgICk6IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4ge1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxSZXEsIEpzb25UeXBlLCBVaW50OEFycmF5PihyZXF1ZXN0U2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFJlcywgSnNvblR5cGUsIFVpbnQ4QXJyYXk+KHJlc3BvbnNlU2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgcGVybWlzc2lvbklkID8gSWRlbnRpZmllci5mcm9tKHBlcm1pc3Npb25JZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8UmVxLCBSZXM+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcixcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxSZXEsIFVpbnQ4QXJyYXk+O1xuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVzLCBVaW50OEFycmF5PjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZD86IEludG9JZDtcbiAgICAgICAgfSxcbiAgICApOiBFbmRwb2ludFR5cGU8UmVxLCBSZXM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFR5cGU8UmVxLCBSZXM+KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcixcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCA/IElkZW50aWZpZXIuZnJvbShwZXJtaXNzaW9uSWQpIDogdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5leHBvcnQgY29uc3QgQVNTRVRfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8QXNzZXRFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2Fzc2V0JyxcbiAgICAob211OiBPbXUpID0+IG5ldyBBc3NldEV4dGVuc2lvbihvbXUpLFxuKTtcblxuZXhwb3J0IHR5cGUgQXNzZXQgPSB7XG4gICAgaWRlbnRpZmllcjogSWRlbnRpZmllcjtcbiAgICBidWZmZXI6IFVpbnQ4QXJyYXk7XG59O1xuXG5jb25zdCBGSUxFX1NFUklBTElaRVIgPSBuZXcgU2VyaWFsaXplcjxBc3NldCwgVWludDhBcnJheT4oXG4gICAgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGZpbGUuaWRlbnRpZmllci5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoZmlsZS5idWZmZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH0sXG4gICAgKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJlYWRlci5maW5pc2goKTtcbiAgICAgICAgcmV0dXJuIHsgaWRlbnRpZmllciwgYnVmZmVyIH07XG4gICAgfSxcbik7XG5jb25zdCBGSUxFX0FSUkFZX1NFUklBTElaRVIgPSBuZXcgU2VyaWFsaXplcjxBc3NldFtdLCBVaW50OEFycmF5PihcbiAgICAoZmlsZXMpID0+IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChmaWxlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhmaWxlLmlkZW50aWZpZXIua2V5KCkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShmaWxlLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9LFxuICAgIChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBmaWxlczogQXNzZXRbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgaWRlbnRpZmllciwgYnVmZmVyIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlYWRlci5maW5pc2goKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH0sXG4pO1xuXG5leHBvcnQgY29uc3QgQVNTRVRfVVBMT0FEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBBU1NFVF9FWFRFTlNJT05fVFlQRS5qb2luKCd1cGxvYWQnKTtcbmNvbnN0IEFTU0VUX1VQTE9BRF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPEFzc2V0LCBJZGVudGlmaWVyPihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICd1cGxvYWQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogRklMRV9TRVJJQUxJWkVSLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9Kc29uKCksXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfVVBMT0FEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5jb25zdCBBU1NFVF9VUExPQURfTUFOWV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPEFzc2V0W10sIElkZW50aWZpZXJbXT4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAndXBsb2FkX21hbnknLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogRklMRV9BUlJBWV9TRVJJQUxJWkVSLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9BcnJheSgpLnBpcGUoU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX1VQTE9BRF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuZXhwb3J0IGNvbnN0IEFTU0VUX0RPV05MT0FEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBBU1NFVF9FWFRFTlNJT05fVFlQRS5qb2luKCdkb3dubG9hZCcpO1xuY29uc3QgQVNTRVRfRE9XTkxPQURfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxJZGVudGlmaWVyLCBBc3NldD4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAnZG93bmxvYWQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS5waXBlKFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBGSUxFX1NFUklBTElaRVIsXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfRE9XTkxPQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbmNvbnN0IEFTU0VUX0RPV05MT0FEX01BTllfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxJZGVudGlmaWVyW10sIEFzc2V0W10+KFxuICAgIEFTU0VUX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2Rvd25sb2FkX21hbnknLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCkucGlwZShTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogRklMRV9BUlJBWV9TRVJJQUxJWkVSLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX0RPV05MT0FEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5leHBvcnQgY29uc3QgQVNTRVRfREVMRVRFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBBU1NFVF9FWFRFTlNJT05fVFlQRS5qb2luKCdkZWxldGUnKTtcbmNvbnN0IEFTU0VUX0RFTEVURV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXIsIG51bGw+KFxuICAgIEFTU0VUX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2RlbGV0ZScsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBJZGVudGlmaWVyLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX0RFTEVURV9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuXG5leHBvcnQgY2xhc3MgQXNzZXRFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEFzc2V0RXh0ZW5zaW9uPiA9IEFTU0VUX0VYVEVOU0lPTl9UWVBFO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge31cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWQoaWRlbnRpZmllcjogSW50b0lkLCBidWZmZXI6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPElkZW50aWZpZXI+IHtcbiAgICAgICAgY29uc3QgYXNzZXRJZGVudGlmaWVyID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoQVNTRVRfVVBMT0FEX0VORFBPSU5ULCB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllciksXG4gICAgICAgICAgICBidWZmZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXNzZXRJZGVudGlmaWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWRNYW55KC4uLmZpbGVzOiBBc3NldFtdKTogUHJvbWlzZTxJZGVudGlmaWVyW10+IHtcbiAgICAgICAgY29uc3QgdXBsb2FkZWQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9VUExPQURfTUFOWV9FTkRQT0lOVCwgZmlsZXMpO1xuICAgICAgICByZXR1cm4gdXBsb2FkZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkKGlkZW50aWZpZXI6IEludG9JZCk6IFByb21pc2U8QXNzZXQ+IHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkZWQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9ET1dOTE9BRF9FTkRQT0lOVCwgaWQpO1xuICAgICAgICByZXR1cm4gZG93bmxvYWRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWRNYW55KC4uLmlkZW50aWZpZXJzOiBJbnRvSWRbXSk6IFByb21pc2U8QXNzZXRbXT4ge1xuICAgICAgICBjb25zdCBkb3dubG9hZGVkID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBBU1NFVF9ET1dOTE9BRF9NQU5ZX0VORFBPSU5ULFxuICAgICAgICAgICAgaWRlbnRpZmllcnMubWFwKChpZCkgPT4gSWRlbnRpZmllci5mcm9tKGlkKSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBkb3dubG9hZGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGUoaWRlbnRpZmllcjogSW50b0lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpO1xuICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9ERUxFVEVfRU5EUE9JTlQsIGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXJsKFxuICAgICAgICBpZDogSW50b0lkLFxuICAgICAgICBvcHRpb25zPzogeyBjYWNoZT86ICduby1jYWNoZScgfSxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBrZXkgPSBJZGVudGlmaWVyLmZyb20oaWQpLmtleSgpO1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5vbXUubmV0d29yay5hZGRyZXNzO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IGFkZHJlc3Muc2VjdXJlID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgaWYgKG9wdGlvbnM/LmNhY2hlID09PSAnbm8tY2FjaGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7cHJvdG9jb2x9Oi8vJHthZGRyZXNzLmhvc3R9OiR7YWRkcmVzcy5wb3J0fS9hc3NldD9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfSZ0PSR7RGF0ZS5ub3coKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke2FkZHJlc3MuaG9zdH06JHthZGRyZXNzLnBvcnR9L2Fzc2V0P2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHkodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5vbXUubmV0d29yay5hZGRyZXNzO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IGFkZHJlc3Muc2VjdXJlID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7YWRkcmVzcy5ob3N0fToke2FkZHJlc3MucG9ydH0vcHJveHk/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVybCl9YDtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSnNvblR5cGUsIHR5cGUgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgUGFja2V0RGF0YSA9IHtcbiAgICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZGF0YTogVWludDhBcnJheTtcbn07XG5cbmV4cG9ydCB0eXBlIFBhY2tldDxUID0gdW5rbm93bj4gPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogUGFja2V0VHlwZTxUPjtcbiAgICByZWFkb25seSBkYXRhOiBUO1xufTtcblxuZXhwb3J0IGNsYXNzIFBhY2tldFR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZXcoZGF0YTogVCk6IFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIG1hdGNoKHBhY2tldDogUGFja2V0KTogcGFja2V0IGlzIFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiBwYWNrZXQudHlwZSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSWRlbnRpZmllciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBQYWNrZXRUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXRUeXBlPFQ+KFxuICAgICAgICAgICAgaWRlbnRpZmllci5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICB9KTogUGFja2V0VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFja2V0VHlwZShcbiAgICAgICAgICAgIGlkZW50aWZpZXIuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IEpzb25UeXBlLCBTZXJpYWxpemFibGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnlQZXJtaXNzaW9uc0pTT04ge1xuICAgIGFsbD86IHN0cmluZztcbiAgICByZWFkPzogc3RyaW5nO1xuICAgIHdyaXRlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5UGVybWlzc2lvbnMge1xuICAgIGFsbD86IEludG9JZDtcbiAgICByZWFkPzogSW50b0lkO1xuICAgIHdyaXRlPzogSW50b0lkO1xufVxuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFZhbHVlOiBULFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFJlZ2lzdHJ5UGVybWlzc2lvbnMsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSW50b0lkLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogVDtcbiAgICAgICAgcGVybWlzc2lvbnM/OiBSZWdpc3RyeVBlcm1pc3Npb25zO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBSZWdpc3RyeVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5VHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJbnRvSWQsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBUO1xuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgICAgIHBlcm1pc3Npb25zPzogUmVnaXN0cnlQZXJtaXNzaW9ucztcbiAgICB9KTogUmVnaXN0cnlUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeVR5cGUoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyA/PyB7fSxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnk8VD4ge1xuICAgIHJlYWRvbmx5IHR5cGU6IFJlZ2lzdHJ5VHlwZTxUPjtcbiAgICByZWFkb25seSB2YWx1ZTogVDtcbiAgICBnZXQoKTogUHJvbWlzZTxUPjtcbiAgICBzZXQodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+O1xuICAgIG1vZGlmeShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+O1xuICAgIGxpc3RlbihmbjogKHZhbHVlOiBUKSA9PiB2b2lkKTogVW5saXN0ZW47XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgRXZlbnRFbWl0dGVyLCBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBKc29uVHlwZSwgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbmZpZyA9IHtcbiAgICBjYWNoZV9zaXplOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlPFQ+IHtcbiAgICByZWFkb25seSBjYWNoZTogUmVhZG9ubHlNYXA8c3RyaW5nLCBUPjtcbiAgICByZWFkb25seSBldmVudDogVGFibGVFdmVudHM8VD47XG4gICAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgICBnZXRNYW55KC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgYWRkKC4uLml0ZW06IFRbXSk6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKC4uLml0ZW06IFRbXSk6IFByb21pc2U8dm9pZD47XG4gICAgcmVtb3ZlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNsZWFyKCk6IFByb21pc2U8dm9pZD47XG4gICAgaGFzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICBoYXNNYW55PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oLi4ua2V5czogKGtleW9mIFQpW10pOiBQcm9taXNlPHsgW2tleSBpbiBrZXlvZiBUXTogYm9vbGVhbiB9PjtcbiAgICBoYXNBbGwoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGhhc0FueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgICBmZXRjaEl0ZW1zKHtcbiAgICAgICAgbGltaXQsXG4gICAgICAgIGJhY2t3YXJkLFxuICAgICAgICBjdXJzb3IsXG4gICAgfToge1xuICAgICAgICBsaW1pdDogbnVtYmVyO1xuICAgICAgICBiYWNrd2FyZD86IGJvb2xlYW47XG4gICAgICAgIGN1cnNvcj86IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgZmV0Y2hSYW5nZSh7IHN0YXJ0LCBlbmQgfTogeyBzdGFydDogc3RyaW5nOyBlbmQ6IHN0cmluZyB9KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgZmV0Y2hBbGwoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgaXRlcmF0ZSh7IGJhY2t3YXJkLCBjdXJzb3IgfTogeyBiYWNrd2FyZD86IGJvb2xlYW47IGN1cnNvcj86IHN0cmluZyB9KTogQXN5bmNJdGVyYWJsZTxUPjtcbiAgICBzaXplKCk6IFByb21pc2U8bnVtYmVyPjtcblxuICAgIHByb3h5KHByb3h5OiAoaXRlbTogVCkgPT4gVCB8IHVuZGVmaW5lZCk6IFVubGlzdGVuO1xuICAgIHNldENhY2hlU2l6ZShzaXplOiBudW1iZXIpOiB2b2lkO1xuICAgIHNldENvbmZpZyhjb25maWc6IFRhYmxlQ29uZmlnKTogdm9pZDtcbiAgICBzZXRQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogVGFibGVQZXJtaXNzaW9ucyk6IHZvaWQ7XG5cbiAgICBsaXN0ZW4obGlzdGVuZXI/OiAoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KSA9PiB2b2lkKTogVW5saXN0ZW47XG59XG5cbmV4cG9ydCB0eXBlIFRhYmxlRXZlbnRzPFQ+ID0ge1xuICAgIGFkZDogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIHVwZGF0ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIHJlbW92ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIGNsZWFyOiBFdmVudEVtaXR0ZXI8W10+O1xuICAgIGNhY2hlVXBkYXRlOiBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZVBlcm1pc3Npb25zID0ge1xuICAgIGFsbD86IElkZW50aWZpZXI7XG4gICAgcmVhZD86IElkZW50aWZpZXI7XG4gICAgd3JpdGU/OiBJZGVudGlmaWVyO1xuICAgIHJlbW92ZT86IElkZW50aWZpZXI7XG4gICAgcHJveHk/OiBJZGVudGlmaWVyO1xufTtcblxuZXhwb3J0IGNsYXNzIFRhYmxlVHlwZTxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIGtleUZ1bmN0aW9uOiAoaXRlbTogVCkgPT4gc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zIHwgdW5kZWZpbmVkLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiAoaXRlbTogVCkgPT4gc3RyaW5nO1xuICAgICAgICAgICAgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zO1xuICAgICAgICAgICAgc2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxULCBEPjtcbiAgICAgICAgfSxcbiAgICApOiBUYWJsZVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucz86IFRhYmxlUGVybWlzc2lvbnM7XG4gICAgICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgICAgIH0sXG4gICAgKTogVGFibGVUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVR5cGU8VD4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgQXBwSW5zdGFsbFJlc3BvbnNlID0ge1xuICAgIGFjY2VwdGVkOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BGaWxlID0ge1xuICAgIHR5cGU6ICdmaWxlJyB8ICdkaXJlY3RvcnknO1xuICAgIHNpemU6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFBvc2l0aW9uID0ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRW50ZXIgPSB7XG4gICAgdHlwZTogJ2VudGVyJztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgZmlsZXM6IERyYWdEcm9wRmlsZVtdO1xuICAgIHBvc2l0aW9uOiBEcmFnRHJvcFBvc2l0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ092ZXIgPSB7XG4gICAgdHlwZTogJ292ZXInO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbiAgICBwb3NpdGlvbjogRHJhZ0Ryb3BQb3NpdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wID0ge1xuICAgIHR5cGU6ICdkcm9wJztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgcG9zaXRpb246IERyYWdEcm9wUG9zaXRpb247XG4gICAgZmlsZXM6IERyYWdEcm9wRmlsZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0xlYXZlID0ge1xuICAgIHR5cGU6ICdsZWF2ZSc7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ1N0YXRlID0gRHJhZ0VudGVyIHwgRHJhZ092ZXIgfCBEcmFnRHJvcCB8IERyYWdMZWF2ZTtcblxuZXhwb3J0IHR5cGUgRmlsZURyYWdQYWNrZXQgPSB7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xuICAgIGFwcDogQXBwO1xuICAgIHN0YXRlOiBEcmFnU3RhdGU7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlYWRSZXF1ZXN0ID0ge1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVhZFJlcXVlc3REYXNoYm9hcmQgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVhZE1ldGEgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbiAgICBmaWxlczogcmVhZG9ubHkgRHJhZ0Ryb3BGaWxlW107XG59O1xuXG5leHBvcnQgdHlwZSBGaWxlRGF0YSA9IHtcbiAgICBmaWxlOiBEcmFnRHJvcEZpbGU7XG4gICAgYnVmZmVyOiBVaW50OEFycmF5O1xufTtcblxuZXhwb3J0IGNsYXNzIERyYWdEcm9wUmVhZFJlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG1ldGE6IERyYWdEcm9wUmVhZE1ldGEsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBmaWxlczogUmVjb3JkPHN0cmluZywgRmlsZURhdGE+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogbnVtYmVyID0gMSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBEcmFnRHJvcFJlYWRSZXNwb25zZSk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KGRhdGEudmVyc2lvbik7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeShkYXRhLm1ldGEpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhkYXRhLmZpbGVzKS5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgeyBmaWxlLCBidWZmZXIgfV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YS5maWxlcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKEpTT04uc3RyaW5naWZ5KGZpbGUpKTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogRHJhZ0Ryb3BSZWFkUmVzcG9uc2Uge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IG1ldGE6IERyYWdEcm9wUmVhZE1ldGEgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcblxuICAgICAgICBjb25zdCBmaWxlczogUmVjb3JkPHN0cmluZywgRmlsZURhdGE+ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCBmaWxlOiBEcmFnRHJvcEZpbGUgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgICAgICBmaWxlc1trZXldID0geyBmaWxlLCBidWZmZXIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRHJhZ0Ryb3BSZWFkUmVzcG9uc2UoXG4gICAgICAgICAgICBtZXRhLFxuICAgICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BSZXF1ZXN0ID0gb2JqZWN0O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlcXVlc3REYXNoYm9hcmQgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGFwcDogQXBwSnNvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVxdWVzdFJlc3BvbnNlID0ge1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICBvazogYm9vbGVhbjtcbn07XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQvcGFja2V0LmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUGVybWlzc2lvblR5cGVKc29uIH0gZnJvbSAnLi4vcGVybWlzc2lvbi9wZXJtaXNzaW9uLmpzJztcbmltcG9ydCB7IFBhY2thZ2VJbmZvIH0gZnJvbSAnLi4vcGx1Z2luL3BhY2thZ2UtaW5mby5qcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgUmVnaXN0cnlUeXBlIH0gZnJvbSAnLi4vcmVnaXN0cnkvcmVnaXN0cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBUYWJsZSB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLmpzJztcbmltcG9ydCB7IFRhYmxlVHlwZSB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLmpzJztcblxuaW1wb3J0IHR5cGUgeyBEYXNoYm9hcmRIYW5kbGVyIH0gZnJvbSAnLi9oYW5kbGVyLmpzJztcbmltcG9ydCB7IEFwcEluc3RhbGxSZXNwb25zZSwgRHJhZ0Ryb3AsIERyYWdEcm9wUmVhZFJlcXVlc3QsIERyYWdEcm9wUmVhZFJlcXVlc3REYXNoYm9hcmQsIERyYWdEcm9wUmVhZFJlc3BvbnNlLCBEcmFnRHJvcFJlcXVlc3QsIERyYWdEcm9wUmVxdWVzdERhc2hib2FyZCwgRHJhZ0Ryb3BSZXF1ZXN0UmVzcG9uc2UsIERyYWdFbnRlciwgRHJhZ0xlYXZlLCBEcmFnT3ZlciwgRmlsZURyYWdQYWNrZXQgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuXG5leHBvcnQgY29uc3QgREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPERhc2hib2FyZEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnZGFzaGJvYXJkJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBEYXNoYm9hcmRFeHRlbnNpb24ob211KSxcbik7XG5cbnR5cGUgRGFzaGJvYXJkU2V0UmVzcG9uc2UgPSB7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbn07XG5leHBvcnQgY29uc3QgREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3NldCcpO1xuY29uc3QgREFTSEJPQVJEX1NFVF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXIsIERhc2hib2FyZFNldFJlc3BvbnNlPihcbiAgICBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAnc2V0JyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG4gICAgICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9PUEVOX0FQUF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcCcsICdvcGVuJyk7XG5jb25zdCBEQVNIQk9BUkRfT1BFTl9BUFBfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxBcHAsIHZvaWQ+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdvcGVuX2FwcCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IEFwcCxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9PUEVOX0FQUF9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBEQVNIQk9BUkRfT1BFTl9BUFBfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEFwcD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ29wZW5fYXBwJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG59KTtcbmV4cG9ydCBjb25zdCBEQVNIT0JBUkRfQVBQX1JFQURfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHAnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IERBU0hPQkFSRF9BUFBfRURJVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcCcsICdlZGl0Jyk7XG5leHBvcnQgY29uc3QgREFTSEJPQVJEX0FQUF9JTlNUQUxMX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignYXBwJywgJ2luc3RhbGwnKTtcbmNvbnN0IERBU0hCT0FSRF9BUFBfSU5TVEFMTF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPEFwcCwgQXBwSW5zdGFsbFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaW5zdGFsbF9hcHAnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBBcHAsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfQVBQX0lOU1RBTExfUEVSTUlTU0lPTl9JRCxcbn0pO1xuZXhwb3J0IGNvbnN0IERBU2hCT0FSRF9EUkFHX0RST1BfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdkcmFnX2Ryb3AnKTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfU1RBVEVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEZpbGVEcmFnUGFja2V0PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3N0YXRlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8RmlsZURyYWdQYWNrZXQ+KClcbiAgICAgICAgLmZpZWxkKCdhcHAnLCBBcHApLFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEcmFnRHJvcFJlYWRSZXF1ZXN0LCBEcmFnRHJvcFJlYWRSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZWFkJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBEcmFnRHJvcFJlYWRSZXNwb25zZSxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFUVVFU1RfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPERyYWdEcm9wUmVhZFJlcXVlc3REYXNoYm9hcmQ+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVhZF9yZXF1ZXN0Jyxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFU1BPTlNFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEcmFnRHJvcFJlYWRSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZWFkX3Jlc3BvbnNlJyxcbiAgICBzZXJpYWxpemVyOiBEcmFnRHJvcFJlYWRSZXNwb25zZSxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248RHJhZ0Ryb3BSZXF1ZXN0LCBEcmFnRHJvcFJlcXVlc3RSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZXF1ZXN0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU2hCT0FSRF9EUkFHX0RST1BfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxEcmFnRHJvcFJlcXVlc3REYXNoYm9hcmQ+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVxdWVzdCcsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9BUFBST1ZBTF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RHJhZ0Ryb3BSZXF1ZXN0UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVxdWVzdF9hcHByb3ZhbCcsXG59KTtcblxudHlwZSBEcmFnRHJvcEhhbmRsZXIgPSB7XG4gICAgb25FbnRlcihmbjogKGV2ZW50OiBEcmFnRW50ZXIpID0+IHVua25vd24pOiB2b2lkO1xuICAgIG9uT3ZlcihmbjogKGV2ZW50OiBEcmFnT3ZlcikgPT4gdW5rbm93bik6IHZvaWQ7XG4gICAgb25Ecm9wKGZuOiAoZXZlbnQ6IERyYWdEcm9wKSA9PiB1bmtub3duKTogdm9pZDtcbiAgICBvbkxlYXZlKGZuOiAoZXZlbnQ6IERyYWdMZWF2ZSkgPT4gdW5rbm93bik6IHZvaWQ7XG4gICAgcmVhZChpZDogc3RyaW5nKTogUHJvbWlzZTxEcmFnRHJvcFJlYWRSZXNwb25zZT47XG59O1xuXG5leHBvcnQgdHlwZSBDb29raWUgPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3UmVxdWVzdCA9IHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBzY3JpcHQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdQYWNrZXQgPSB7XG4gICAgaWQ6IElkZW50aWZpZXI7XG59O1xuXG5leHBvcnQgdHlwZSBVc2VyUmVzcG9uc2U8VCA9IHVuZGVmaW5lZD4gPSB7XG4gICAgdHlwZTogJ29rJztcbiAgICB2YWx1ZTogVDtcbn0gfCB7XG4gICAgdHlwZTogJ2Jsb2NrZWQnO1xufSB8IHtcbiAgICB0eXBlOiAnY2FuY2VsbGVkJztcbn07XG5leHBvcnQgY2xhc3MgVXNlclJlc3VsdDxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZXN1bHQ6IHtcbiAgICAgICAgICAgIHR5cGU6ICdvayc7XG4gICAgICAgICAgICB2YWx1ZTogVDtcbiAgICAgICAgfSB8IHtcbiAgICAgICAgICAgIHR5cGU6ICdibG9ja2VkJztcbiAgICAgICAgfSB8IHtcbiAgICAgICAgICAgIHR5cGU6ICdjYW5jZWxsZWQnO1xuICAgICAgICB9LFxuICAgICkge31cblxuICAgIHB1YmxpYyB1bndyYXAoKTogVCB7XG4gICAgICAgIGlmICh0aGlzLnJlc3VsdC50eXBlID09PSAnb2snKSByZXR1cm4gdGhpcy5yZXN1bHQudmFsdWU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gdW53cmFwIGEgJHt0aGlzLnJlc3VsdC50eXBlfSByZXN1bHRgKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdSZXNwb25zZSA9IFVzZXJSZXNwb25zZSAmIFdlYnZpZXdQYWNrZXQ7XG5cbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3dlYnZpZXcnKTtcblxuZXhwb3J0IHR5cGUgSG9zdFJlcXVlc3QgPSB7XG4gICAgaG9zdDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgR2V0Q29va2llc1JlcXVlc3QgPSB7XG4gICAgdXJsOiBzdHJpbmc7XG59O1xuXG5jb25zdCBEQVNIQk9BUkRfQ09PS0lFU19HRVQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxHZXRDb29raWVzUmVxdWVzdCwgVXNlclJlc3BvbnNlPENvb2tpZVtdPj4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2Nvb2tpZXNfZ2V0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQsXG59KTtcblxuY29uc3QgREFTSEJPQVJEX1dFQlZJRVdfUkVRVUVTVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFdlYnZpZXdSZXF1ZXN0LCBXZWJ2aWV3UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3ZWJ2aWV3X3JlcXVlc3QnLFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPFdlYnZpZXdSZXNwb25zZT4oKVxuICAgICAgICAuZmllbGQoJ2lkJywgSWRlbnRpZmllciksXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxufSk7XG5cbmNvbnN0IERBU0hCT0FSRF9XRUJWSUVXX0NMT1NFID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248V2Vidmlld1BhY2tldCwgV2Vidmlld1Jlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd2Vidmlld19jbG9zZScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcDxXZWJ2aWV3UGFja2V0PigpXG4gICAgICAgIC5maWVsZCgnaWQnLCBJZGVudGlmaWVyKSxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcDxXZWJ2aWV3UmVzcG9uc2U+KClcbiAgICAgICAgLmZpZWxkKCdpZCcsIElkZW50aWZpZXIpLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3RXZlbnQgPSB7XG4gICAgdHlwZTogJ2Nsb3NlZCc7XG59IHwge1xuICAgIHR5cGU6ICdyZXNpemUnO1xuICAgIGRpbWVudGlvbnM6IHtcbiAgICAgICAgeDogbnVtYmVyO1xuICAgICAgICB5OiBudW1iZXI7XG4gICAgfTtcbn0gfCB7XG4gICAgdHlwZTogJ2Nvb2tpZSc7XG4gICAgY29va2llczogQ29va2llW107XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3RXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgW0sgaW4gV2Vidmlld0V2ZW50Wyd0eXBlJ11dPzogQXJyYXk8KGV2ZW50OiBFeHRyYWN0PFdlYnZpZXdFdmVudCwgeyB0eXBlOiBLIH0+KSA9PiB2b2lkPjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdFdmVudFBhY2tldCA9IHtcbiAgICBpZDogSWRlbnRpZmllcjtcbiAgICB0YXJnZXQ6IElkZW50aWZpZXI7XG4gICAgZXZlbnQ6IFdlYnZpZXdFdmVudDtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdIYW5kbGUgPSB7XG4gICAgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXI7XG4gICAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gICAgZ2V0Q29va2llcygpOiBQcm9taXNlPENvb2tpZVtdPjtcbiAgICBjbG9zZSgpOiB2b2lkO1xuICAgIG9uPFQgZXh0ZW5kcyBXZWJ2aWV3RXZlbnRbJ3R5cGUnXT4oa2V5OiBULCBjYWxsYmFjazogKGV2ZW50OiBFeHRyYWN0PFdlYnZpZXdFdmVudCwgeyB0eXBlOiBUIH0+KSA9PiB2b2lkKTogdm9pZDtcbiAgICBqb2luKCk6IFByb21pc2U8dm9pZD47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3RXZlbnRFbWl0ID0gPFQgZXh0ZW5kcyBXZWJ2aWV3RXZlbnRbJ3R5cGUnXT4oZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IFQgfT4pID0+IHZvaWQ7XG5cbmNvbnN0IERBU0hCT0FSRF9XRUJWSUVXX0VWRU5UX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxXZWJ2aWV3RXZlbnRQYWNrZXQ+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3ZWJ2aWV3X2V2ZW50JyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8V2Vidmlld0V2ZW50UGFja2V0PigpXG4gICAgICAgIC5maWVsZCgnaWQnLCBJZGVudGlmaWVyKVxuICAgICAgICAuZmllbGQoJ3RhcmdldCcsIElkZW50aWZpZXIpLFxufSk7XG5cbnR5cGUgQWxsb3dlZEhvc3QgPSB7XG4gICAgaG9zdDogc3RyaW5nO1xuICAgIGFwcHM6IElkZW50aWZpZXJbXTtcbn07XG5cbmNvbnN0IERBU0hCT0FSRF9BTExPV0VEX0hPU1RTID0gVGFibGVUeXBlLmNyZWF0ZUpzb248QWxsb3dlZEhvc3Q+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdob3N0cycsXG4gICAga2V5OiAoZW50cnkpID0+IGVudHJ5Lmhvc3QsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPEFsbG93ZWRIb3N0PigpXG4gICAgICAgIC5maWVsZCgnYXBwcycsIFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9BcnJheSgpKSxcbn0pO1xuXG5jb25zdCBEQVNIQk9BUkRfSE9TVF9SRVFVRVNUID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248e1xuICAgIGhvc3Q6IHN0cmluZztcbn0sIFVzZXJSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2hvc3RfcmVxdWVzdCcsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxufSk7XG5cbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfU1BFRUNIX1JFQ09HTklUSU9OX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignc3BlZWNoX3JlY29nbml0aW9uJyk7XG5cbmV4cG9ydCB0eXBlIFRyYW5zY3JpcHRTZWdtZW50ID0ge1xuICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICB0cmFuc2NyaXB0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUcmFuc2NyaXB0U3RhdHVzID0ge1xuICAgIHR5cGU6ICdpZGxlJztcbn0gfCB7XG4gICAgdHlwZTogJ3Jlc3VsdCc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgc2VnbWVudHM6IFRyYW5zY3JpcHRTZWdtZW50W107XG59IHwge1xuICAgIHR5cGU6ICdmaW5hbCc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgc2VnbWVudHM6IFRyYW5zY3JpcHRTZWdtZW50W107XG59IHwge1xuICAgIHR5cGU6ICdhdWRpb19zdGFydGVkJztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn0gfCB7XG4gICAgdHlwZTogJ2F1ZGlvX2VuZGVkJztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn07XG5cbmNvbnN0IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT04gPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxUcmFuc2NyaXB0U3RhdHVzPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc3BlZWNoX3JlY29nbml0aW9uJyxcbiAgICBkZWZhdWx0VmFsdWU6IHsgdHlwZTogJ2lkbGUnIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVhZDogREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9QRVJNSVNTSU9OX0lELFxuICAgICAgICB3cml0ZTogREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcblxuZXhwb3J0IHR5cGUgU3BlZWNoUmVjb2duaXRpb25TdGFydCA9IHtcbiAgICB0eXBlOiAnc3RhcnQnO1xufTtcblxuY29uc3QgREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFNwZWVjaFJlY29nbml0aW9uU3RhcnQsIFVzZXJSZXNwb25zZTx1bmRlZmluZWQ+PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc3BlZWNoX3JlY29nbml0aW9uX3N0YXJ0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5pbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEJhc2U8VCBleHRlbmRzIHN0cmluZz4ge1xuICAgIGtpbmQ6IFQ7XG4gICAgaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0QXBwUGVybWlzc2lvbnMgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3Blcm1pc3Npb25zJz4ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBwZXJtaXNzaW9uczogUGVybWlzc2lvblR5cGVKc29uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEFwcFBsdWdpbnMgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3BsdWdpbnMnPiB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBhY2thZ2VzOiBQYWNrYWdlSW5mb1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RBcHBJbnN0YWxsIGV4dGVuZHMgUHJvbXB0UmVxdWVzdEJhc2U8J2FwcC9pbnN0YWxsJz4ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIEFwcEpzb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RBcHBVcGRhdGUgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3VwZGF0ZSc+IHtcbiAgICBvbGRfYXBwOiBBcHBKc29uO1xuICAgIG5ld19hcHA6IEFwcEpzb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEluZGV4SW5zdGFsbCBleHRlbmRzIFByb21wdFJlcXVlc3RCYXNlPCdpbmRleC9pbnN0YWxsJz4ge1xuICAgIGluZGV4X3VybDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQcm9tcHRSZXF1ZXN0ID0gKFxuICAgIFByb21wdFJlcXVlc3RBcHBQZXJtaXNzaW9uc1xuICAgIHwgUHJvbXB0UmVxdWVzdEFwcFBsdWdpbnNcbiAgICB8IFByb21wdFJlcXVlc3RBcHBJbnN0YWxsXG4gICAgfCBQcm9tcHRSZXF1ZXN0QXBwVXBkYXRlXG4gICAgfCBQcm9tcHRSZXF1ZXN0SW5kZXhJbnN0YWxsXG4pO1xuXG5jb25zdCBEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UHJvbXB0UmVxdWVzdD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Byb21wdF9yZXF1ZXN0Jyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQcm9tcHRSZXN1bHQgPSAnYWNjZXB0JyB8ICdkZW55JztcblxuaW50ZXJmYWNlIFByb21wdFJlc3BvbnNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGtpbmQ6IHN0cmluZztcbiAgICByZXN1bHQ6IFByb21wdFJlc3VsdDtcbn1cblxuY29uc3QgREFTSEJPQVJEX1BST01QVF9SRVNQT05TRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxQcm9tcHRSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Byb21wdF9yZXNwb25zZScsXG59KTtcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RGFzaGJvYXJkRXh0ZW5zaW9uPiA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIGRhc2hib2FyZDogRGFzaGJvYXJkSGFuZGxlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZHJhZ0Ryb3BIYW5kbGVyOiBEcmFnRHJvcEhhbmRsZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGRyYWdEcm9wTGlzdGVuZXJzID0ge1xuICAgICAgICBlbnRlcjogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnRW50ZXIpID0+IHVua25vd24+LFxuICAgICAgICBvdmVyOiBbXSBhcyBBcnJheTwoc3RhdGU6IERyYWdPdmVyKSA9PiB1bmtub3duPixcbiAgICAgICAgZHJvcDogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnRHJvcCkgPT4gdW5rbm93bj4sXG4gICAgICAgIGxlYXZlOiBbXSBhcyBBcnJheTwoc3RhdGU6IERyYWdMZWF2ZSkgPT4gdW5rbm93bj4sXG4gICAgfTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWxsb3dlZEhvc3RzOiBUYWJsZTxBbGxvd2VkSG9zdD47XG4gICAgcHVibGljIHJlYWRvbmx5IHNwZWVjaFJlY29nbml0aW9uOiBSZWdpc3RyeTxUcmFuc2NyaXB0U3RhdHVzPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdlYnZpZXdIYW5kbGVzOiBJZGVudGlmaWVyTWFwPHsgaGFuZGxlOiBXZWJ2aWV3SGFuZGxlOyBlbWl0OiBXZWJ2aWV3RXZlbnRFbWl0IH0+ID0gbmV3IElkZW50aWZpZXJNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBEQVNIQk9BUkRfT1BFTl9BUFBfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVRVUVTVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVTUE9OU0VfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX1BBQ0tFVCxcbiAgICAgICAgICAgIERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9BUFBST1ZBTF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QsXG4gICAgICAgICAgICBEQVNIQk9BUkRfUFJPTVBUX1JFU1BPTlNFLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9QUk9NUFRfUkVRVUVTVCwgKHJlcXVlc3QpID0+XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByb21wdFJlcXVlc3QocmVxdWVzdCksXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX09QRU5fQVBQX1BBQ0tFVCwgKGFwcCkgPT5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT3BlbkFwcChhcHApLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9QQUNLRVQsIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZURyYWdEcm9wUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsICh7IHN0YXRlIH0pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VudGVyJzoge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdEcm9wTGlzdGVuZXJzLmVudGVyLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnb3Zlcic6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5vdmVyLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZHJvcCc6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5kcm9wLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbGVhdmUnOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BMaXN0ZW5lcnMubGVhdmUuZm9yRWFjaCgoZm4pID0+IGZuKHN0YXRlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFUVVFU1RfUEFDS0VULCAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEcmFnRHJvcFJlYWRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud2Vidmlld0hhbmRsZXMuZ2V0KHBhY2tldC5pZCk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuO1xuICAgICAgICAgICAgaGFuZGxlLmVtaXQocGFja2V0LmV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWxsb3dlZEhvc3RzID0gb211LnRhYmxlcy5nZXQoREFTSEJPQVJEX0FMTE9XRURfSE9TVFMpO1xuICAgICAgICB0aGlzLnNwZWVjaFJlY29nbml0aW9uID0gb211LnJlZ2lzdHJpZXMuZ2V0KERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT04pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVJlcXVlc3RGb3JEYXNoYm9hcmQocmVxdWVzdDogUHJvbXB0UmVxdWVzdCk6IFByb21pc2U8UHJvbXB0UmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIHN3aXRjaCAocmVxdWVzdC5raW5kKSB7XG4gICAgICAgICAgICBjYXNlICdhcHAvcGVybWlzc2lvbnMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlUGVybWlzc2lvblJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICBjYXNlICdhcHAvcGx1Z2lucyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVQbHVnaW5SZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICAgICAgY2FzZSAnYXBwL2luc3RhbGwnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlSW5zdGFsbEFwcChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGNhc2UgJ2FwcC91cGRhdGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlVXBkYXRlQXBwKHJlcXVlc3QpO1xuICAgICAgICAgICAgY2FzZSAnaW5kZXgvaW5zdGFsbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVJbmRleEluc3RhbGwocmVxdWVzdCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9tcHQgcmVxdWVzdGVkOiAke0pTT04uc3RyaW5naWZ5KHJlcXVlc3QpfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVQcm9tcHRSZXF1ZXN0KHJlcXVlc3Q6IFByb21wdFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVSZXF1ZXN0Rm9yRGFzaGJvYXJkKHJlcXVlc3QpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKERBU0hCT0FSRF9QUk9NUFRfUkVTUE9OU0UsIHtcbiAgICAgICAgICAgIGlkOiByZXF1ZXN0LmlkLFxuICAgICAgICAgICAga2luZDogcmVxdWVzdC5raW5kLFxuICAgICAgICAgICAgcmVzdWx0OiByZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVPcGVuQXBwKGFwcDogQXBwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVPcGVuQXBwKGFwcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEcmFnRHJvcFJlcXVlc3QocmVxdWVzdDogRHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGNvbnN0IGFjY2VwdGVkID0gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZURyYWdEcm9wUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfQVBQUk9WQUxfUEFDS0VULCB7XG4gICAgICAgICAgICBvazogYWNjZXB0ZWQsXG4gICAgICAgICAgICByZXF1ZXN0X2lkOiByZXF1ZXN0LnJlcXVlc3RfaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlRHJhZ0Ryb3BSZWFkUmVxdWVzdChyZXF1ZXN0OiBEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZURyYWdEcm9wUmVhZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIHRoaXMub211LnNlbmQoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFU1BPTlNFX1BBQ0tFVCwgcmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGFzaGJvYXJkKCk6IERhc2hib2FyZEhhbmRsZXIge1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFzaGJvYXJkIG5vdCBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXNoYm9hcmQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChkYXNoYm9hcmQ6IERhc2hib2FyZEhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQpO1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFzaGJvYXJkIGFscmVhZHkgc2V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXNoYm9hcmQgPSBkYXNoYm9hcmQ7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9DT09LSUVTX0dFVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPENvb2tpZVtdPj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB1cmwgfSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICBjb25zdCB7IGhvc3RuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkSG9zdCA9IGF3YWl0IHRoaXMuYWxsb3dlZEhvc3RzLmdldChob3N0bmFtZSkgPz8geyBob3N0OiBob3N0bmFtZSwgYXBwczogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSBhbGxvd2VkSG9zdC5hcHBzLnNvbWUoKGhvc3QpID0+IGhvc3QuaXNFcXVhbChwYXJhbXMuY2FsbGVyKSk7XG4gICAgICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2FuY2VsbGVkJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5nZXRDb29raWVzKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX0hPU1RfUkVRVUVTVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPiA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGhvc3QgfSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICBjb25zdCBob3N0RW50cnkgPSBhd2FpdCB0aGlzLmFsbG93ZWRIb3N0cy5nZXQoaG9zdCkgPz8geyBob3N0LCBhcHBzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGhvc3RFbnRyeS5hcHBzLnNvbWUoKGhvc3QpID0+IGhvc3QuaXNFcXVhbChwYXJhbXMuY2FsbGVyKSk7XG4gICAgICAgICAgICBpZiAoYWxsb3dlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvaycsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhc2hib2FyZC5ob3N0UmVxdWVzdGVkKHJlcXVlc3QsIHBhcmFtcyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnR5cGUgPT09ICdvaycpIHtcbiAgICAgICAgICAgICAgICBob3N0RW50cnkuYXBwcy5wdXNoKHBhcmFtcy5jYWxsZXIpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWxsb3dlZEhvc3RzLnVwZGF0ZShob3N0RW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFdlYnZpZXdSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1pdCA9IGFzeW5jIChldmVudDogV2Vidmlld0V2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogcGFyYW1zLmNhbGxlcixcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBkYXNoYm9hcmQuY3JlYXRlV2VidmlldyhyZXF1ZXN0LCBwYXJhbXMsIGVtaXQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2snLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFdlYnZpZXdSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBkYXNoYm9hcmQuZ2V0V2VidmlldyhyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYW5jZWxsZWQnLFxuICAgICAgICAgICAgICAgICAgICBpZDogcmVxdWVzdC5pZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZGFzaGJvYXJkLmNsb3NlV2VidmlldyhyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2snLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPHVuZGVmaW5lZD4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhc2hib2FyZC5zcGVlY2hSZWNvZ25pdGlvblN0YXJ0KHJlcXVlc3QsIHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUubmV0d29yay5hZGRUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICAgICAgREFTSEJPQVJEX1NFVF9FTkRQT0lOVCxcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5hcHAuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2V0IGRhc2hib2FyZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdEhvc3Qob3B0aW9uczogeyBob3N0OiBzdHJpbmcgfSk6IFByb21pc2U8VXNlclJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIERBU0hCT0FSRF9IT1NUX1JFUVVFU1QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0V2VidmlldyhvcHRpb25zOiBXZWJ2aWV3UmVxdWVzdCk6IFByb21pc2U8VXNlclJlc3VsdDxXZWJ2aWV3SGFuZGxlPj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0LnR5cGUgIT09ICdvaycpIHJldHVybiBuZXcgVXNlclJlc3VsdChyZXN1bHQpO1xuICAgICAgICBjb25zdCB7IGlkIH0gPSByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBXZWJ2aWV3RXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgICAgICAgY29uc3QgaGFuZGxlOiBXZWJ2aWV3SGFuZGxlID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgICAgICAgICAgY2xvc2U6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UsXG4gICAgICAgICAgICAgICAgICAgIHsgaWQgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENvb2tpZXM6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb29raWVzID0gKGF3YWl0IHRoaXMuZ2V0Q29va2llcyh7XG4gICAgICAgICAgICAgICAgICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgICAgICAgICAgICAgfSkpLnVud3JhcCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb29raWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uOiBmdW5jdGlvbiA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihrZXk6IFQsIGNhbGxiYWNrOiAoZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IFQgfT4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50TGlzdGVuZXJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRMaXN0ZW5lcnNba2V5XSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVyc1trZXldITtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgam9pbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZS5vbignY2xvc2VkJywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2Vidmlld0hhbmRsZXMuc2V0KGlkLCB7XG4gICAgICAgICAgICBoYW5kbGUsXG4gICAgICAgICAgICBlbWl0OiBmdW5jdGlvbiA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogVCB9Pik6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xuICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJzKSByZXR1cm47XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXN1bHQoe1xuICAgICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICAgIHZhbHVlOiBoYW5kbGUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb29raWVzKG9wdGlvbnM6IEdldENvb2tpZXNSZXF1ZXN0KTogUHJvbWlzZTxVc2VyUmVzdWx0PENvb2tpZVtdPj4ge1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXN1bHQoYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBEQVNIQk9BUkRfQ09PS0lFU19HRVQsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb3BlbkFwcChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoREFTSEJPQVJEX09QRU5fQVBQX0VORFBPSU5ULCBhcHApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbnN0YWxsQXBwKGFwcDogQXBwKTogUHJvbWlzZTxBcHBJbnN0YWxsUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9BUFBfSU5TVEFMTF9FTkRQT0lOVCwgYXBwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWlyZURyYWdEcm9wKCk6IFByb21pc2U8RHJhZ0Ryb3BIYW5kbGVyPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9FTkRQT0lOVCwge30pO1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmRyYWdEcm9wTGlzdGVuZXJzO1xuICAgICAgICBjb25zdCBjbGllbnQgPSB0aGlzLm9tdTtcbiAgICAgICAgdGhpcy5kcmFnRHJvcEhhbmRsZXIgPSB7XG4gICAgICAgICAgICBvbkVudGVyKGZuKSB7IGxpc3RlbmVycy5lbnRlci5wdXNoKGZuKTsgfSxcbiAgICAgICAgICAgIG9uT3ZlcihmbikgeyBsaXN0ZW5lcnMub3Zlci5wdXNoKGZuKTsgfSxcbiAgICAgICAgICAgIG9uRHJvcChmbikgeyBsaXN0ZW5lcnMuZHJvcC5wdXNoKGZuKTsgfSxcbiAgICAgICAgICAgIG9uTGVhdmUoZm4pIHsgbGlzdGVuZXJzLmxlYXZlLnB1c2goZm4pOyB9LFxuICAgICAgICAgICAgYXN5bmMgcmVhZChpZCkgeyByZXR1cm4gYXdhaXQgY2xpZW50LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9EUkFHX0RST1BfUkVBRF9FTkRQT0lOVCwgeyBkcmFnX2lkOiBpZCB9KTsgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BIYW5kbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBub3RpZnlEcm9wRHJhZ1N0YXRlKHBhY2tldDogRmlsZURyYWdQYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfRFJBR19EUk9QX1NUQVRFX1BBQ0tFVCwgcGFja2V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3BlZWNoUmVjb2duaXRpb25TdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCwgeyB0eXBlOiAnc3RhcnQnIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBcHBKc29uIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplL3NlcmlhbGl6ZXIuanMnO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4vcGFja2V0LmpzJztcblxuY29uc3QgSURFTlRJRklFUiA9IG5ldyBJZGVudGlmaWVyKCdjb3JlJywgJ3BhY2tldCcpO1xuXG50eXBlIFByb3RvY29sSW5mbyA9IHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG59O1xuXG50eXBlIFJTQU51bWJlcnMgPSB7XG4gICAgZTogc3RyaW5nO1xuICAgIG46IHN0cmluZztcbn07XG5cbnR5cGUgRW5jcnlwdGlvblJlcXVlc3QgPSB7XG4gICAga2luZDogJ3YxJztcbiAgICByc2E6IFJTQU51bWJlcnM7XG59O1xuXG50eXBlIEVuY3J5cHRpb25SZXNwb25zZSA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbiAgICBhZXM6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNlcnZlck1ldGEgPSB7XG4gICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVxdWVzdCB8IG51bGw7XG4gICAgaGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxudHlwZSBDb25uZWN0UGFja2V0SnNvbiA9IHtcbiAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG59O1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdFBhY2tldCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICAgIHB1YmxpYyByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgICAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgICAgICBhcHA6IEFwcDtcbiAgICAgICAgdG9rZW46IHN0cmluZztcbiAgICAgICAgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnByb3RvY29sID0gb3B0aW9ucy5wcm90b2NvbDtcbiAgICAgICAgdGhpcy5hcHAgPSBvcHRpb25zLmFwcDtcbiAgICAgICAgdGhpcy50b2tlbiA9IG9wdGlvbnMudG9rZW47XG4gICAgICAgIHRoaXMuZW5jcnlwdGlvbiA9IG9wdGlvbnMuZW5jcnlwdGlvbiA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogQ29ubmVjdFBhY2tldEpzb24pOiBDb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgIHByb3RvY29sOiBkYXRhLnByb3RvY29sLFxuICAgICAgICAgICAgYXBwOiBBcHAuZGVzZXJpYWxpemUoZGF0YS5hcHApLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogZGF0YS5lbmNyeXB0aW9uLFxuICAgICAgICAgICAgdG9rZW46IGRhdGEudG9rZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IENvbm5lY3RQYWNrZXQpOiBDb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcm90b2NvbDogZGF0YS5wcm90b2NvbCxcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShkYXRhLmFwcCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBkYXRhLmVuY3J5cHRpb24sXG4gICAgICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBlbnVtIERpc2Nvbm5lY3RUeXBlIHtcbiAgICBJTlZBTElEX1RPS0VOID0gJ2ludmFsaWRfdG9rZW4nLFxuICAgIElOVkFMSURfT1JJR0lOID0gJ2ludmFsaWRfb3JpZ2luJyxcbiAgICBJTlZBTElEX1ZFUlNJT04gPSAnaW52YWxpZF92ZXJzaW9uJyxcbiAgICBJTlZBTElEX1BBQ0tFVF9UWVBFID0gJ2ludmFsaWRfcGFja2V0X3R5cGUnLFxuICAgIElOVkFMSURfUEFDS0VUX0RBVEEgPSAnaW52YWxpZF9wYWNrZXRfZGF0YScsXG4gICAgSU5WQUxJRF9QQUNLRVQgPSAnaW52YWxpZF9wYWNrZXQnLFxuICAgIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsX2Vycm9yJyxcbiAgICBBTk9USEVSX0NPTk5FQ1RJT04gPSAnYW5vdGhlcl9jb25uZWN0aW9uJyxcbiAgICBQRVJNSVNTSU9OX0RFTklFRCA9ICdwZXJtaXNzaW9uX2RlbmllZCcsXG4gICAgQVBQX1JFTU9WRUQgPSAnYXBwX3JlbW92ZWQnLFxuICAgIFNFUlZFUl9SRVNUQVJUID0gJ3NlcnZlcl9yZXN0YXJ0JyxcbiAgICBTSFVURE9XTiA9ICdzaHV0ZG93bicsXG4gICAgQ0xPU0UgPSAnY2xvc2UnLFxufVxuXG50eXBlIERpc2Nvbm5lY3RQYWNrZXRKc29uID0ge1xuICAgIHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgIG1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG59O1xuXG5leHBvcnQgY2xhc3MgRGlzY29ubmVjdFBhY2tldCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgICAgICB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZyB8IG51bGw7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXQpOiBEaXNjb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSnNvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogRGlzY29ubmVjdFBhY2tldEpzb24pOiBEaXNjb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIERpc2Nvbm5lY3RQYWNrZXQuZnJvbUpzb24oZGF0YSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21Kc29uKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXRKc29uKTogRGlzY29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBuZXcgRGlzY29ubmVjdFBhY2tldCh7XG4gICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvSnNvbigpOiBEaXNjb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUEFDS0VUX1RZUEVTOiB7XG4gICAgU0VSVkVSX01FVEE6IFBhY2tldFR5cGU8U2VydmVyTWV0YT47XG4gICAgQ09OTkVDVDogUGFja2V0VHlwZTxDb25uZWN0UGFja2V0PjtcbiAgICBESVNDT05ORUNUOiBQYWNrZXRUeXBlPERpc2Nvbm5lY3RQYWNrZXQ+O1xuICAgIFRPS0VOOiBQYWNrZXRUeXBlPHN0cmluZz47XG4gICAgUkVBRFk6IFBhY2tldFR5cGU8dW5kZWZpbmVkPjtcbiAgICBFTkNSWVBURURfUEFDS0VUOiBQYWNrZXRUeXBlPFVpbnQ4QXJyYXk+O1xufSA9IHtcbiAgICBTRVJWRVJfTUVUQTogUGFja2V0VHlwZS5jcmVhdGVKc29uPFNlcnZlck1ldGE+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3NlcnZlcl9tZXRhJyxcbiAgICB9KSxcbiAgICBDT05ORUNUOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248Q29ubmVjdFBhY2tldD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnY29ubmVjdCcsXG4gICAgICAgIHNlcmlhbGl6ZXI6IENvbm5lY3RQYWNrZXQsXG4gICAgfSksXG4gICAgRElTQ09OTkVDVDogUGFja2V0VHlwZS5jcmVhdGVKc29uPERpc2Nvbm5lY3RQYWNrZXQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2Rpc2Nvbm5lY3QnLFxuICAgICAgICBzZXJpYWxpemVyOiBEaXNjb25uZWN0UGFja2V0LFxuICAgIH0pLFxuICAgIFRPS0VOOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248c3RyaW5nPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICd0b2tlbicsXG4gICAgfSksXG4gICAgUkVBRFk6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjx1bmRlZmluZWQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3JlYWR5JyxcbiAgICB9KSxcbiAgICBFTkNSWVBURURfUEFDS0VUOiBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VWludDhBcnJheT4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnZScsXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcCgpLFxuICAgIH0pLFxufTtcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludFJlZ2lzdGVyUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVuZHBvaW50czogSWRlbnRpZmllck1hcDxJZGVudGlmaWVyIHwgdW5kZWZpbmVkPixcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogRW5kcG9pbnRSZWdpc3RlclBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KGl0ZW0uZW5kcG9pbnRzLnNpemUpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpdGVtLmVuZHBvaW50cykge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGtleS5rZXkoKSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcodmFsdWU/LmtleSgpID8/ICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGl0ZW0pO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBlbmRwb2ludHMgPSBuZXcgSWRlbnRpZmllck1hcDxJZGVudGlmaWVyIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgZW5kcG9pbnRzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQoZW5kcG9pbnRzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZva2VkUGFyYW1zIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgY2FsbGVyOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBudW1iZXIsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEludm9rZWRQYXJhbXMpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQua2V5KCksXG4gICAgICAgICAgICBjYWxsZXI6IGl0ZW0uY2FsbGVyLmtleSgpLFxuICAgICAgICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBzdHJpbmcpOiBJbnZva2VkUGFyYW1zIHtcbiAgICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIGNhbGxlcjogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiBudW1iZXI7XG4gICAgICAgIH0gPSBKU09OLnBhcnNlKGl0ZW0pO1xuICAgICAgICByZXR1cm4gbmV3IEludm9rZWRQYXJhbXMoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb21LZXkoZGF0YS5pZCksXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb21LZXkoZGF0YS5jYWxsZXIpLFxuICAgICAgICAgICAgZGF0YS5rZXksXG4gICAgICAgICk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIEVuZHBvaW50SW52b2tlZFBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwYXJhbXM6IEludm9rZWRQYXJhbXMsXG4gICAgICAgIHB1YmxpYyBidWZmZXI6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEVuZHBvaW50SW52b2tlZFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSW52b2tlZFBhcmFtcy5zZXJpYWxpemUoaXRlbS5wYXJhbXMpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShpdGVtLmJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBVaW50OEFycmF5KTogRW5kcG9pbnRJbnZva2VkUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShpdGVtKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gSW52b2tlZFBhcmFtcy5kZXNlcmlhbGl6ZShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRJbnZva2VkUGFja2V0KHBhcmFtcywgYnVmZmVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZva2VQYXJhbXMge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBrZXk6IG51bWJlcixcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogSW52b2tlUGFyYW1zKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLmtleSgpLFxuICAgICAgICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBzdHJpbmcpOiBJbnZva2VQYXJhbXMge1xuICAgICAgICBjb25zdCBkYXRhOiB7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiBudW1iZXI7XG4gICAgICAgIH0gPSBKU09OLnBhcnNlKGl0ZW0pO1xuICAgICAgICByZXR1cm4gbmV3IEludm9rZVBhcmFtcyhcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbUtleShkYXRhLmlkKSxcbiAgICAgICAgICAgIGRhdGEua2V5LFxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludEludm9rZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwYXJhbXM6IEludm9rZVBhcmFtcyxcbiAgICAgICAgcHVibGljIGJ1ZmZlcjogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogRW5kcG9pbnRJbnZva2VQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKEludm9rZVBhcmFtcy5zZXJpYWxpemUoaXRlbS5wYXJhbXMpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShpdGVtLmJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBVaW50OEFycmF5KTogRW5kcG9pbnRJbnZva2VQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGl0ZW0pO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBJbnZva2VQYXJhbXMuZGVzZXJpYWxpemUocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50SW52b2tlUGFja2V0KHBhcmFtcywgYnVmZmVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNwb25zZVBhcmFtcyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZXJyb3I6IHN0cmluZyB8IG51bGwsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IFJlc3BvbnNlUGFyYW1zKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLmtleSgpLFxuICAgICAgICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgICAgICAgIGVycm9yOiBpdGVtLmVycm9yLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IHN0cmluZyk6IFJlc3BvbnNlUGFyYW1zIHtcbiAgICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogbnVtYmVyO1xuICAgICAgICAgICAgZXJyb3I6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIH0gPSBKU09OLnBhcnNlKGl0ZW0pO1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlUGFyYW1zKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuaWQpLFxuICAgICAgICAgICAgZGF0YS5rZXksXG4gICAgICAgICAgICBkYXRhLmVycm9yLFxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludFJlc3BvbnNlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBhcmFtczogUmVzcG9uc2VQYXJhbXMsXG4gICAgICAgIHB1YmxpYyBidWZmZXI6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEVuZHBvaW50UmVzcG9uc2VQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKFJlc3BvbnNlUGFyYW1zLnNlcmlhbGl6ZShpdGVtLnBhcmFtcykpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGl0ZW0uYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IFVpbnQ4QXJyYXkpOiBFbmRwb2ludFJlc3BvbnNlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShpdGVtKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gUmVzcG9uc2VQYXJhbXMuZGVzZXJpYWxpemUocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50UmVzcG9uc2VQYWNrZXQocGFyYW1zLCBidWZmZXIpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuL2VuZHBvaW50LmpzJztcbmltcG9ydCB7IEVuZHBvaW50SW52b2tlZFBhY2tldCwgRW5kcG9pbnRJbnZva2VQYWNrZXQsIEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQsIEVuZHBvaW50UmVzcG9uc2VQYWNrZXQsIEludm9rZWRQYXJhbXMsIEludm9rZVBhcmFtcywgUmVzcG9uc2VQYXJhbXMgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuXG5leHBvcnQgY29uc3QgRU5EUE9JTlRfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8RW5kcG9pbnRFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2VuZHBvaW50JyxcbiAgICAob211OiBPbXUpID0+IG5ldyBFbmRwb2ludEV4dGVuc2lvbihvbXUpLFxuKTtcblxudHlwZSBDYWxsUHJvbWlzZSA9IHtcbiAgICByZXNvbHZlOiAoZGF0YTogVWludDhBcnJheSkgPT4gdm9pZDtcbiAgICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59O1xuXG50eXBlIEVuZHBvaW50SGFuZGxlciA9IHtcbiAgICB0eXBlOiBFbmRwb2ludFR5cGU7XG4gICAgaGFuZGxlcjogKHBhY2tldDogRW5kcG9pbnRJbnZva2VkUGFja2V0KSA9PiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xufTtcblxuZXhwb3J0IGNsYXNzIEVuZHBvaW50RXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxFbmRwb2ludEV4dGVuc2lvbj4gPSBFTkRQT0lOVF9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kRW5kcG9pbnRzID0gbmV3IElkZW50aWZpZXJNYXA8RW5kcG9pbnRIYW5kbGVyPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzcG9uc2VQcm9taXNlczogTWFwPG51bWJlciwgQ2FsbFByb21pc2U+ID0gbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgY2FsbElkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIHRoaXMuY2FsbElkID0gTWF0aC5mbG9vcigocGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlLm5vdygpKSAqIDEwMDApO1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIEVORFBPSU5UX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIEVORFBPSU5UX0lOVk9LRV9QQUNLRVQsXG4gICAgICAgICAgICBFTkRQT0lOVF9JTlZPS0VEX1BBQ0tFVCxcbiAgICAgICAgICAgIEVORFBPSU5UX1JFU1BPTlNFX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihFTkRQT0lOVF9JTlZPS0VEX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVJbnZva2VkKHBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKEVORFBPSU5UX1JFU1BPTlNFX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucmVzcG9uc2VQcm9taXNlcy5nZXQocGFja2V0LnBhcmFtcy5rZXkpO1xuICAgICAgICAgICAgaWYgKCFwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24ga2V5ICR7cGFja2V0LnBhcmFtcy5rZXl9ICgke3BhY2tldC5wYXJhbXMuaWQua2V5KCl9KWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VQcm9taXNlcy5kZWxldGUocGFja2V0LnBhcmFtcy5rZXkpO1xuICAgICAgICAgICAgaWYgKHBhY2tldC5wYXJhbXMuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgRXJyb3IocGFja2V0LnBhcmFtcy5lcnJvcikpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZShwYWNrZXQuYnVmZmVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbnZva2VkKHBhY2tldDogRW5kcG9pbnRJbnZva2VkUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5ib3VuZEVuZHBvaW50cy5nZXQocGFja2V0LnBhcmFtcy5pZCk7XG4gICAgICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgaW52b2NhdGlvbiBmb3IgdW5rbm93biBlbmRwb2ludCAke3BhY2tldC5wYXJhbXMuaWQua2V5KCl9ICgke3BhY2tldC5wYXJhbXMua2V5fSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW5kcG9pbnQuaGFuZGxlcihwYWNrZXQpO1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsIG5ldyBFbmRwb2ludFJlc3BvbnNlUGFja2V0KFxuICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZVBhcmFtcyhwYWNrZXQucGFyYW1zLmlkLCBwYWNrZXQucGFyYW1zLmtleSwgbnVsbCksXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKEVORFBPSU5UX1JFU1BPTlNFX1BBQ0tFVCwgbmV3IEVuZHBvaW50UmVzcG9uc2VQYWNrZXQoXG4gICAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlUGFyYW1zKHBhY2tldC5wYXJhbXMuaWQsIHBhY2tldC5wYXJhbXMua2V5LCBKU09OLnN0cmluZ2lmeShlcnJvcikpLFxuICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KCksXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25UYXNrKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbmRwb2ludHMgPSBuZXcgSWRlbnRpZmllck1hcDxJZGVudGlmaWVyIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVuZHBvaW50XSBvZiB0aGlzLmJvdW5kRW5kcG9pbnRzKSB7XG4gICAgICAgICAgICBlbmRwb2ludHMuc2V0KGtleSwgZW5kcG9pbnQudHlwZS5wZXJtaXNzaW9uSWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBFbmRwb2ludFJlZ2lzdGVyUGFja2V0KGVuZHBvaW50cyk7XG4gICAgICAgIHRoaXMub211LnNlbmQoRU5EUE9JTlRfUkVHSVNURVJfUEFDS0VULCBwYWNrZXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBiaW5kPFJlcSwgUmVzPihcbiAgICAgICAgdHlwZTogRW5kcG9pbnRUeXBlPFJlcSwgUmVzPixcbiAgICAgICAgaGFuZGxlcjogKGRhdGE6IFJlcSwgcGFyYW1zOiBJbnZva2VkUGFyYW1zKSA9PiBQcm9taXNlPFJlcz4sXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBlbmRwb2ludHMgYWZ0ZXIgdGhlIGNsaWVudCBoYXMgc3RhcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJvdW5kRW5kcG9pbnRzLmhhcyh0eXBlLmlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbmRwb2ludCB3aXRoIGlkICR7dHlwZS5pZC5rZXkoKX0gaXMgYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib3VuZEVuZHBvaW50cy5zZXQodHlwZS5pZCwgeyB0eXBlLCBoYW5kbGVyOiBhc3luYyAoeyBidWZmZXIsIHBhcmFtcyB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXEgPSB0eXBlLnJlcXVlc3RTZXJpYWxpemVyLmRlc2VyaWFsaXplKGJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKHJlcSwgcGFyYW1zKTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlLnJlc3BvbnNlU2VyaWFsaXplci5zZXJpYWxpemUocmVzdWx0KTtcbiAgICAgICAgfSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsbDxSZXEsIFJlcz4oZW5kcG9pbnQ6IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4sIGRhdGE6IFJlcSk6IFByb21pc2U8UmVzPiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuY2FsbElkKys7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxVaW50OEFycmF5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlUHJvbWlzZXMuc2V0KGtleSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKEVORFBPSU5UX0lOVk9LRV9QQUNLRVQsIG5ldyBFbmRwb2ludEludm9rZVBhY2tldChcbiAgICAgICAgICAgIG5ldyBJbnZva2VQYXJhbXMoZW5kcG9pbnQuaWQsIGtleSksXG4gICAgICAgICAgICBlbmRwb2ludC5yZXF1ZXN0U2VyaWFsaXplci5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICkpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHByb21pc2U7XG4gICAgICAgIHJldHVybiBlbmRwb2ludC5yZXNwb25zZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzcG9uc2UpO1xuICAgIH1cbn1cblxuY29uc3QgRU5EUE9JTlRfUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQ+KEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlZ2lzdGVyJyxcbiAgICBzZXJpYWxpemVyOiBFbmRwb2ludFJlZ2lzdGVyUGFja2V0LFxufSk7XG5jb25zdCBFTkRQT0lOVF9JTlZPS0VfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPEVuZHBvaW50SW52b2tlUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbnZva2UnLFxuICAgIHNlcmlhbGl6ZXI6IEVuZHBvaW50SW52b2tlUGFja2V0LFxufSk7XG5jb25zdCBFTkRQT0lOVF9JTlZPS0VEX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludEludm9rZWRQYWNrZXQ+KEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2ludm9rZWQnLFxuICAgIHNlcmlhbGl6ZXI6IEVuZHBvaW50SW52b2tlZFBhY2tldCxcbn0pO1xuY29uc3QgRU5EUE9JTlRfUkVTUE9OU0VfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPEVuZHBvaW50UmVzcG9uc2VQYWNrZXQ+KEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Jlc3BvbnNlJyxcbiAgICBzZXJpYWxpemVyOiBFbmRwb2ludFJlc3BvbnNlUGFja2V0LFxufSk7XG4iLAogICAgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uLy4uL2NvbnN0JztcbmltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgSnNvblR5cGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uJztcblxuZXhwb3J0IGNvbnN0IEhUVFBfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8SHR0cEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnaHR0cCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgSHR0cEV4dGVuc2lvbihvbXUpLFxuKTtcblxuZXhwb3J0IGNvbnN0IEhUVFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gSFRUUF9FWFRFTlNJT05fVFlQRS5qb2luKCdyZXF1ZXN0Jyk7XG5cbnR5cGUgUmVxdWVzdEhhbmRsZSA9IHtcbiAgICBpZDogc3RyaW5nO1xufTtcblxudHlwZSBIdHRwUmVxdWVzdCA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgaGVhZGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIG1ldGhvZDogc3RyaW5nO1xuICAgIHJlZGlyZWN0OiBSZXF1ZXN0UmVkaXJlY3Q7XG4gICAgdXJsOiBzdHJpbmc7XG59O1xuXG5jb25zdCBSRVFVRVNUX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVxdWVzdD4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X2NyZWF0ZScsXG59KTtcblxuY2xhc3MgRGF0YUNodW5rPFQgZXh0ZW5kcyBKc29uVHlwZT4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YTogVCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplPFQgZXh0ZW5kcyBKc29uVHlwZT4oZGF0YTogRGF0YUNodW5rPFQ+KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZUpTT04oZGF0YS5tZXRhKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShkYXRhLmJvZHkpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemU8VCBleHRlbmRzIEpzb25UeXBlPihkYXRhOiBVaW50OEFycmF5KTogRGF0YUNodW5rPFQ+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgbWV0YSA9IHJlYWRlci5yZWFkSlNPTjxUPigpO1xuICAgICAgICBjb25zdCBib2R5ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YUNodW5rKG1ldGEsIGJvZHkpO1xuICAgIH1cbn1cblxuY29uc3QgUkVRVUVTVF9TRU5EID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPERhdGFDaHVuazxSZXF1ZXN0SGFuZGxlPj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X3NlbmQnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG50eXBlIEh0dHBSZXF1ZXN0Q2xvc2UgPSBSZXF1ZXN0SGFuZGxlO1xuXG5jb25zdCBSRVFVRVNUX0NMT1NFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXF1ZXN0Q2xvc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWVzdF9jbG9zZScsXG59KTtcblxudHlwZSBIdHRwUmVzcG9uc2UgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIGhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgaGlzdG9yeTogSHR0cFJlc3BvbnNlW107XG4gICAgcmVkaXJlY3RlZDogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFJFU1BPTlNFX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVzcG9uc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY3JlYXRlJyxcbn0pO1xuXG5jb25zdCBSRVNQT05TRV9DSFVOSyA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEYXRhQ2h1bms8UmVxdWVzdEhhbmRsZT4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY2h1bmsnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG5jb25zdCBSRVNQT05TRV9DTE9TRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxSZXF1ZXN0SGFuZGxlPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Jlc3BvbnNlX2Nsb3NlJyxcbn0pO1xuXG50eXBlIEhhbmRsZVN0YXRlUmVjZWl2aW5nID0ge1xuICAgIHR5cGU6ICdyZWNlaXZpbmcnO1xuICAgIHJlY2VpdmUoZGF0YTogVWludDhBcnJheSk6IHZvaWQ7XG4gICAgY2xvc2UoKTogdm9pZDtcbn07XG5cbnR5cGUgSGFuZGxlU3RhdGVDcmVhdGVkID0ge1xuICAgIHR5cGU6ICdjcmVhdGVkJztcbiAgICBzZXRSZXNwb25zZShyZXNwb25zZTogSHR0cFJlc3BvbnNlKTogdm9pZDtcbn07XG5cbnR5cGUgSGFuZGxlU3RhdGUgPSBIYW5kbGVTdGF0ZUNyZWF0ZWQgfCBIYW5kbGVTdGF0ZVJlY2VpdmluZztcblxudHlwZSBXU0RhdGEgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlckxpa2UgfCBCbG9iIHwgQXJyYXlCdWZmZXJWaWV3O1xuXG5leHBvcnQgY29uc3QgV1NNc2dUeXBlID0ge1xuICAgIENPTlRJTlVBVElPTjogMHgwLFxuICAgIFRFWFQ6IDB4MSxcbiAgICBCSU5BUlk6IDB4MixcbiAgICBQSU5HOiAweDksXG4gICAgUE9ORzogMHhBLFxuICAgIENMT1NFOiAweDgsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgV1NDbG9zZUNvZGUgPSB7XG4gICAgT0s6IDEwMDAsXG4gICAgR09JTkdfQVdBWTogMTAwMSxcbiAgICBQUk9UT0NPTF9FUlJPUjogMTAwMixcbiAgICBVTlNVUFBPUlRFRF9EQVRBOiAxMDAzLFxuICAgIEFCTk9STUFMX0NMT1NVUkU6IDEwMDYsXG4gICAgSU5WQUxJRF9URVhUOiAxMDA3LFxuICAgIFBPTElDWV9WSU9MQVRJT046IDEwMDgsXG4gICAgTUVTU0FHRV9UT09fQklHOiAxMDA5LFxuICAgIE1BTkRBVE9SWV9FWFRFTlNJT046IDEwMTAsXG4gICAgSU5URVJOQUxfRVJST1I6IDEwMTEsXG4gICAgU0VSVklDRV9SRVNUQVJUOiAxMDEyLFxuICAgIFRSWV9BR0FJTl9MQVRFUjogMTAxMyxcbiAgICBCQURfR0FURVdBWTogMTAxNCxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgV2ViU29ja2V0T3BlbiA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufTtcbnR5cGUgV2ViU29ja2V0Q2xvc2UgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIGNvZGU/OiBudW1iZXI7XG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgV2ViU29ja2V0SGFuZGxlID0ge1xuICAgIHdzOiBPbXVXUztcbiAgICBvcGVuOiAocmVzcG9uc2U6IFdlYlNvY2tldE9wZW4pID0+IHZvaWQ7XG4gICAgZGlzcGF0Y2g6IChkYXRhOiBEYXRhQ2h1bms8V1NEYXRhTWV0YT4pID0+IHZvaWQ7XG4gICAgY2xvc2U6IChyZXNwb25zZTogV2ViU29ja2V0Q2xvc2UpID0+IHZvaWQ7XG4gICAgZXJyb3I6IChyZXNwb25zZTogV2ViU29ja2V0RXJyb3IpID0+IHZvaWQ7XG59O1xuXG50eXBlIFdTRGF0YU1ldGEgPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOlxuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuVEVYVFxuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuQklOQVJZXG4gICAgICAgIHwgdHlwZW9mIFdTTXNnVHlwZS5QSU5HXG4gICAgICAgIHwgdHlwZW9mIFdTTXNnVHlwZS5QT05HO1xufTtcblxudHlwZSBXU0hhbmRsZVN0YXRlID0ge1xuICAgIHR5cGU6ICdjcmVhdGVkJyB8ICdyZWNlaXZpbmcnO1xuICAgIGhhbmRsZTogV2ViU29ja2V0SGFuZGxlO1xufTtcblxuY29uc3QgV0VCU09DS0VUX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVxdWVzdD4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19jcmVhdGUnLFxufSk7XG5cbmNvbnN0IFdFQlNPQ0tFVF9PUEVOID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFdlYlNvY2tldE9wZW4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3Nfb3BlbicsXG59KTtcblxuY29uc3QgV0VCU09DS0VUX0RBVEEgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RGF0YUNodW5rPFdTRGF0YU1ldGE+PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2RhdGEnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG5jb25zdCBXRUJTT0NLRVRfQ0xPU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248V2ViU29ja2V0Q2xvc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3NfY2xvc2UnLFxufSk7XG5cbnR5cGUgV2ViU29ja2V0RXJyb3IgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIHR5cGU6ICdDb25uZWN0aW9uUmVmdXNlZCc7XG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IFdFQlNPQ0tFVF9FUlJPUiA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxXZWJTb2NrZXRFcnJvcj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19lcnJvcicsXG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRnV0dXJlPFQ+KCk6IHtcbiAgICBwcm9taXNlOiBQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgICByZWplY3Q6IChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkO1xufSB7XG4gICAgbGV0IHJlc29sdmU6ICgodmFsdWU6IFQpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCByZWplY3Q6ICgocmVhc29uPzogdW5rbm93bikgPT4gdm9pZCkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXMsIHJlaikgPT4ge1xuICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICByZWplY3QgPSByZWo7XG4gICAgfSk7XG4gICAgaWYgKCFyZXNvbHZlIHx8ICFyZWplY3QpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBmdXR1cmUnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlLFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgfTtcbn1cblxudHlwZSBXU1NlbmRUYXNrID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZGF0YTogV1NEYXRhO1xufTtcblxuZXhwb3J0IGNsYXNzIEh0dHBFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEV4dGVuc2lvbj4gPSBIVFRQX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVxdWVzdENvdW50OiBudW1iZXIgPSAwO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwSGFuZGxlczogUmVjb3JkPHN0cmluZywgSGFuZGxlU3RhdGUgfCB1bmRlZmluZWQ+ID0ge307XG4gICAgcHJpdmF0ZSByZWFkb25seSB3c0hhbmRsZXM6IFJlY29yZDxzdHJpbmcsIFdTSGFuZGxlU3RhdGU+ID0ge307XG4gICAgcHJpdmF0ZSByZWFkb25seSB3c1NlbmRRdWV1ZTogV1NTZW5kVGFza1tdID0gW107XG4gICAgcHJpdmF0ZSB3c1NlbmRXYWl0UmVzb2x2ZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgKSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgUkVRVUVTVF9DUkVBVEUsXG4gICAgICAgICAgICBSRVFVRVNUX1NFTkQsXG4gICAgICAgICAgICBSRVFVRVNUX0NMT1NFLFxuICAgICAgICAgICAgUkVTUE9OU0VfQ1JFQVRFLFxuICAgICAgICAgICAgUkVTUE9OU0VfQ0hVTkssXG4gICAgICAgICAgICBSRVNQT05TRV9DTE9TRSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9DTE9TRSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9DUkVBVEUsXG4gICAgICAgICAgICBXRUJTT0NLRVRfREFUQSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9PUEVOLFxuICAgICAgICAgICAgV0VCU09DS0VUX0VSUk9SLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFJFU1BPTlNFX0NSRUFURSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgYWxyZWFkeSBoYW5kbGVkIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5zZXRSZXNwb25zZShwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRVNQT05TRV9DSFVOSywgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQubWV0YS5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gcmVxdWVzdCcsIHBhY2tldC5tZXRhLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdyZWNlaXZpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCBjaHVuayBmb3Igbm9uLXJlY2VpdmluZyByZXF1ZXN0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5yZWNlaXZlKHBhY2tldC5ib2R5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUkVTUE9OU0VfQ0xPU0UsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biByZXF1ZXN0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdyZWNlaXZpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCBjaHVuayBmb3Igbm9uLXJlY2VpdmluZyByZXF1ZXN0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9PUEVOLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAnY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciBhbHJlYWR5IGhhbmRsZWQgc29ja2V0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuaGFuZGxlLm9wZW4ocGFja2V0KTtcbiAgICAgICAgICAgIGhhbmRsZS50eXBlID0gJ3JlY2VpdmluZyc7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9EQVRBLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQubWV0YS5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gc29ja2V0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ3JlY2VpdmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIGNodW5rIGZvciBub24tcmVjZWl2aW5nIHNvY2tldCcsIHBhY2tldC5tZXRhLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuaGFuZGxlLmRpc3BhdGNoKHBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9DTE9TRSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy53c0hhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuY2xvc2UocGFja2V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9FUlJPUiwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy53c0hhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuZXJyb3IocGFja2V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUuZXZlbnQucmVhZHkubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3NTZW5kTG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdzU2VuZExvb3AoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBzZW5kID0gdGhpcy53c1NlbmRRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHNlbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IGF3YWl0IHRvVWludDhBcnJheShzZW5kLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2Ygc2VuZC5kYXRhID09PSAnc3RyaW5nJyA/IFdTTXNnVHlwZS5URVhUIDogV1NNc2dUeXBlLkJJTkFSWTtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFdFQlNPQ0tFVF9EQVRBLCBuZXcgRGF0YUNodW5rKHsgaWQ6IHNlbmQuaWQsIHR5cGUgfSwgYXJyYXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53c1NlbmRXYWl0UmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSGVhZGVycyhyZXF1ZXN0OiBSZXF1ZXN0LCBpbml0PzogUmVxdWVzdEluaXQpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBjb25zdCBrZXlzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IHNldCA9IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG93ZXJLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsS2V5ID0ga2V5c1tsb3dlcktleV07XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxLZXkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGVhZGVyc1tvcmlnaW5hbEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGtleXNbbG93ZXJLZXldID0ga2V5O1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluaXQ/LmhlYWRlcnMpIHtcbiAgICAgICAgICAgIGlmIChpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaW5pdC5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGluaXQuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpbml0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gaW5pdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW5pdC5oZWFkZXJzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIHNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUlkKCk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5vbXUuYXBwLmlkLmpvaW4oYCR7cGVyZm9ybWFuY2UudGltZU9yaWdpbn0tJHt0aGlzLnJlcXVlc3RDb3VudCsrfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0KGlucHV0OiBzdHJpbmcgfCBVUkwgfCBnbG9iYWxUaGlzLlJlcXVlc3QsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8eyByZXNwb25zZTogSHR0cFJlc3BvbnNlOyBzdHJlYW06IFJlYWRhYmxlU3RyZWFtIH0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlSWQoKS5rZXkoKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVRVNUX0NSRUFURSwge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMuZ2VuZXJhdGVIZWFkZXJzKHJlcXVlc3QsIGluaXQpLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmJvZHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IHJlcXVlc3QuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVRVUVTVF9TRU5ELCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGE6IHsgaWQgfSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub211LnNlbmQoUkVRVUVTVF9DTE9TRSwgeyBpZCB9KTtcbiAgICAgICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VGdXR1cmUgPSBjcmVhdGVGdXR1cmU8SHR0cFJlc3BvbnNlPigpO1xuICAgICAgICBsZXQgY2h1bmtFdmVudCA9IGNyZWF0ZUZ1dHVyZTxib29sZWFuPigpO1xuICAgICAgICBjb25zdCBzZXRSZXNwb25zZSA9IChyZXNwb25zZTogSHR0cFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuaHR0cEhhbmRsZXNbaWRdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNlaXZpbmcnLFxuICAgICAgICAgICAgICAgIHJlY2VpdmUoZGF0YTogVWludDhBcnJheTxBcnJheUJ1ZmZlckxpa2U+KSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua0V2ZW50LnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rRXZlbnQgPSBjcmVhdGVGdXR1cmU8Ym9vbGVhbj4oKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNsb3NlKCkge1xuICAgICAgICAgICAgICAgICAgICBjaHVua0V2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmh0dHBIYW5kbGVzW2lkXSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVkJyxcbiAgICAgICAgICAgIHNldFJlc3BvbnNlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlRnV0dXJlLnByb21pc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIHN0cmVhbTogbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICAgICAgICAgICAgICBhc3luYyBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChhd2FpdCBjaHVua0V2ZW50LnByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNodW5rKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2goaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxPbXVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCB7IHJlc3BvbnNlLCBzdHJlYW0gfSA9IGF3YWl0IHRoaXMucmVxdWVzdChpbnB1dCwgaW5pdCk7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICBuZXcgSGVhZGVycyhyZXNwb25zZS5oZWFkZXIpLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCAzMDAsXG4gICAgICAgICAgICByZXNwb25zZS5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICdiYXNpYycsXG4gICAgICAgICAgICByZXNwb25zZS51cmwsXG4gICAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3MoaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgb3B0aW9ucz86IHtcbiAgICAgICAgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgICBhdXRvY2xvc2U/OiBib29sZWFuO1xuICAgICAgICBhdXRvcGluZz86IGJvb2xlYW47XG4gICAgICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIH0pOiBQcm9taXNlPE9tdVdTPiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZW5lcmF0ZUlkKCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IE9tdVdTLmNyZWF0ZShcbiAgICAgICAgICAgIHRoaXMub211LFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud3NTZW5kUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZC5rZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFdhaXRSZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLndzSGFuZGxlc1tpZC5rZXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLndzSGFuZGxlc1tpZC5rZXkoKV0gPSB7XG4gICAgICAgICAgICB0eXBlOiAnY3JlYXRlZCcsXG4gICAgICAgICAgICBoYW5kbGUsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub211LnNlbmQoV0VCU09DS0VUX0NSRUFURSwge1xuICAgICAgICAgICAgaWQ6IGlkLmtleSgpLFxuICAgICAgICAgICAgaGVhZGVyOiB0aGlzLmdlbmVyYXRlSGVhZGVycyhyZXF1ZXN0LCBvcHRpb25zKSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaGFuZGxlLndzO1xuICAgIH1cbn1cblxuY2xhc3MgT211UmVzcG9uc2UgaW1wbGVtZW50cyBSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb2s6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZWRpcmVjdGVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNUZXh0OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZXNwb25zZVR5cGUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+PiB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5VXNlZDogYm9vbGVhbixcbiAgICApIHt9XG5cbiAgICBjbG9uZSgpOiBPbXVSZXNwb25zZSB7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICB0aGlzLm9rLFxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHQsXG4gICAgICAgICAgICB0aGlzLnR5cGUsXG4gICAgICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgICAgIHRoaXMuYm9keSxcbiAgICAgICAgICAgIHRoaXMuYm9keVVzZWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIGFzeW5jIGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCk7XG4gICAgfVxuICAgIGJsb2IoKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5ibG9iKCk7XG4gICAgfVxuICAgIGJ5dGVzKCk6IFByb21pc2U8VWludDhBcnJheTxBcnJheUJ1ZmZlcj4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCkudGhlbigoYnVmKSA9PiBuZXcgVWludDhBcnJheShidWYpKTtcbiAgICB9XG4gICAgZm9ybURhdGEoKTogUHJvbWlzZTxGb3JtRGF0YT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuZm9ybURhdGEoKTtcbiAgICB9XG4gICAganNvbigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuanNvbigpO1xuICAgIH1cbiAgICB0ZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS50ZXh0KCk7XG4gICAgfVxufVxuXG50eXBlIEV2ZW50TGlzdGVuZXJNYXA8VD4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06ICgoZXZlbnQ6IFRbS10pID0+IHVua25vd24pW11cbn07XG5cbmV4cG9ydCB0eXBlIFdTTXNnID0ge1xuICAgIHR5cGU6ICdvcGVuJztcbiAgICBkYXRhOiBXZWJTb2NrZXRPcGVuO1xufSB8IHtcbiAgICB0eXBlOiAnZXJyb3InO1xuICAgIGRhdGE6IFdlYlNvY2tldEVycm9yO1xufSB8IHtcbiAgICB0eXBlOiAndGV4dCc7XG4gICAgZGF0YTogc3RyaW5nO1xufSB8IHtcbiAgICB0eXBlOiAnYmluYXJ5JztcbiAgICBkYXRhOiBVaW50OEFycmF5O1xufSB8IHtcbiAgICB0eXBlOiAnY2xvc2UnO1xuICAgIGRhdGE6IFdlYlNvY2tldENsb3NlO1xufTtcblxuZXhwb3J0IGNsYXNzIE9tdVdTIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBhZGRRdWV1ZTogKGRhdGE6IFdTRGF0YSkgPT4gdm9pZCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2U6ICgpID0+IHZvaWQsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSByZWNlaXZlUXVldWU6IFdTTXNnW10gPSBbXSxcbiAgICAgICAgcHJpdmF0ZSByZWNlaXZlUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgICAgICBwcml2YXRlIHN0YXR1czogJ2Nvbm5lY3RpbmcnIHwgJ29wZW4nIHwgJ2Nsb3NlZCcgPSAnY29ubmVjdGluZycsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKG9tdTogT211LCBpZDogSWRlbnRpZmllciwgYWRkUXVldWU6IChkYXRhOiBXU0RhdGEpID0+IHZvaWQsIGRpc3Bvc2U6ICgpID0+IHZvaWQpOiBXZWJTb2NrZXRIYW5kbGUge1xuICAgICAgICBjb25zdCB3cyA9IG5ldyBPbXVXUyhvbXUsIGlkLCBhZGRRdWV1ZSwgZGlzcG9zZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3cyxcbiAgICAgICAgICAgIG9wZW46IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29wZW4nLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcGF0Y2g6IChkYXRhOiBEYXRhQ2h1bms8V1NEYXRhTWV0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tZXRhLnR5cGUgPT09IFdTTXNnVHlwZS5CSU5BUlkpIHtcbiAgICAgICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2JpbmFyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLmJvZHksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRleHREZWNvZGVyLmRlY29kZShkYXRhLmJvZHkpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbG9zZScsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kKGRhdGE6IFdTRGF0YSk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZFF1ZXVlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChXRUJTT0NLRVRfQ0xPU0UsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLmtleSgpLFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWNlaXZlKCk6IFByb21pc2U8V1NNc2c+IHtcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVJlc29sdmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxyZWFkeSByZWNlaXZpbmcgZnJvbSBhbm90aGVyIGFzeW5jIGNhbGwnKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5zdGF0dXMgIT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZWNlaXZlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB0aGlzLnJlY2VpdmVSZXNvbHZlID0gcmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnY2xvc2VkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdvcGVuJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ29wZW4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWNlaXZlUmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2aW5nIG9uIGFscmVhZHkgY2xvc2VkIHNvY2tldCcpO1xuICAgIH1cblxuICAgIHByb3RvY29sOiBzdHJpbmcgPSAnJztcbiAgICB1cmw6IHN0cmluZyA9ICcnO1xufVxuXG5leHBvcnQgY2xhc3MgT211V2ViU29ja2V0IGltcGxlbWVudHMgV2ViU29ja2V0IHtcbiAgICBwdWJsaWMgQ09OTkVDVElORyA9IDAgYXMgY29uc3Q7XG4gICAgcHVibGljIE9QRU4gPSAxIGFzIGNvbnN0O1xuICAgIHB1YmxpYyBDTE9TSU5HID0gMiBhcyBjb25zdDtcbiAgICBwdWJsaWMgQ0xPU0VEID0gMyBhcyBjb25zdDtcblxuICAgIGJpbmFyeVR5cGU6IEJpbmFyeVR5cGUgPSAnYmxvYic7XG4gICAgYnVmZmVyZWRBbW91bnQ6IG51bWJlciA9IDA7XG4gICAgZXh0ZW5zaW9uczogc3RyaW5nID0gJyc7XG4gICAgb25jbG9zZTogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBDbG9zZUV2ZW50KSA9PiBhbnkpIHwgbnVsbCA9IG51bGw7XG4gICAgb25lcnJvcjogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBFdmVudCkgPT4gYW55KSB8IG51bGwgPSBudWxsO1xuICAgIG9ubWVzc2FnZTogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBNZXNzYWdlRXZlbnQpID0+IGFueSkgfCBudWxsID0gbnVsbDtcbiAgICBvbm9wZW46ICgodGhpczogV2ViU29ja2V0LCBldjogRXZlbnQpID0+IGFueSkgfCBudWxsID0gbnVsbDtcbiAgICBwcm90b2NvbDogc3RyaW5nID0gJyc7XG4gICAgcmVhZHlTdGF0ZTogMCB8IDIgfCAxIHwgMyA9IDA7XG4gICAgdXJsOiBzdHJpbmcgPSAnJztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd3M6IE9tdVdTLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TGlzdGVuZXJzOiBFdmVudExpc3RlbmVyTWFwPFdlYlNvY2tldEV2ZW50TWFwPiA9IHtcbiAgICAgICAgICAgIGNsb3NlOiBbXSxcbiAgICAgICAgICAgIGVycm9yOiBbXSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IFtdLFxuICAgICAgICAgICAgb3BlbjogW10sXG4gICAgICAgIH0sXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVjZWl2ZUxvb3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlY2VpdmVMb29wKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ0xPU0VEKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIHR5cGUgfSA9IGF3YWl0IHRoaXMud3MucmVjZWl2ZSgpO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENsb3NlRXZlbnQoJ2Nsb3NlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogZGF0YS5jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBkYXRhLnJlYXNvbiA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnb3Blbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBkYXRhLnByb3RvY29sID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdvcGVuJywge30pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEVycm9yRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEucmVhc29uID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IE1lc3NhZ2VFdmVudCgnbWVzc2FnZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnb3BlbicpIHtcbiAgICAgICAgICAgIHRoaXMub25vcGVuPy4oZXZlbnQgYXMgTWVzc2FnZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhpcy5vbmVycm9yPy4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgIHRoaXMub25tZXNzYWdlPy4oZXZlbnQgYXMgTWVzc2FnZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlPy4oZXZlbnQgYXMgQ2xvc2VFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc2VuZChkYXRhOiBzdHJpbmcgfCBBcnJheUJ1ZmZlckxpa2UgfCBCbG9iIHwgQXJyYXlCdWZmZXJWaWV3KTogdm9pZCB7XG4gICAgICAgIHRoaXMud3Muc2VuZChkYXRhKTtcbiAgICB9XG5cbiAgICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cy5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIGFkZEV2ZW50TGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIFdlYlNvY2tldEV2ZW50TWFwPih0eXBlOiBLLCBsaXN0ZW5lcjogKHRoaXM6IFdlYlNvY2tldCwgZXY6IFdlYlNvY2tldEV2ZW50TWFwW0tdKSA9PiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICByZW1vdmVFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRFdmVudE1hcD4odHlwZTogSywgbGlzdGVuZXI6ICh0aGlzOiBXZWJTb2NrZXQsIGV2OiBXZWJTb2NrZXRFdmVudE1hcFtLXSkgPT4gYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbdHlwZV07XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdG9VaW50OEFycmF5KGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyTGlrZSB8IEJsb2IgfCBBcnJheUJ1ZmZlclZpZXcpOiBQcm9taXNlPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXJMaWtlPj4ge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRleHRFbmNvZGVyLmVuY29kZShkYXRhKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZGF0YS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhIGFzIEFycmF5QnVmZmVyTGlrZSk7XG4gICAgfVxufVxuIiwKICAgICJleHBvcnQgdHlwZSBVbmxpc3RlbiA9ICgpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXI8UCBleHRlbmRzIEFycmF5PGFueT4+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogQXJyYXk8KC4uLmFyZ3M6IFApID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPiA9IFtdO1xuXG4gICAgcHVibGljIGxpc3RlbihsaXN0ZW5lcjogKC4uLmFyZ3M6IFApID0+IGFueSk6IFVubGlzdGVuIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UodGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0KC4uLmFyZ3M6IFApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4udGhpcy5saXN0ZW5lcnNdKSB7XG4gICAgICAgICAgICBhd2FpdCBsaXN0ZW5lciguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsCiAgICAiXG50eXBlIFRhc2sgPSAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5leHBvcnQgY2xhc3MgTG9jayB7XG4gICAgcHJpdmF0ZSB0YXNrczogKFRhc2spW10gPSBbXTtcbiAgICBwcml2YXRlIHdhaXRlcjogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSB3YWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy53YWl0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndhaXRlcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndhaXRlciA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBydW5UYXNrcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy50YXNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSB0aGlzLnRhc2tzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy53YWl0ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBydW5UYXNrcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1c2U8VD4oY2FsbGJhY2s6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhd2FpdCBwcm9taXNlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMudGFza3MucHVzaCh0YXNrKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdCgpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgUmVnaXN0cnlQZXJtaXNzaW9ucywgUmVnaXN0cnlQZXJtaXNzaW9uc0pTT04gfSBmcm9tICcuL3JlZ2lzdHJ5JztcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5UGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IFVpbnQ4QXJyYXkgfCBudWxsLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFJlZ2lzdHJ5UGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVCb29sZWFuKHBhY2tldC52YWx1ZSAhPT0gbnVsbCk7XG4gICAgICAgIGlmIChwYWNrZXQudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkocGFja2V0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFJlZ2lzdHJ5UGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmVhZGVyLnJlYWRCb29sZWFuKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZXhpc3RpbmcgPyByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cnlQYWNrZXQoaWQsIHZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJQYWNrZXRKU09OIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHBlcm1pc3Npb25zOiBSZWdpc3RyeVBlcm1pc3Npb25zSlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFJlZ2lzdHJ5UGVybWlzc2lvbnMsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBSZWdpc3RlclBhY2tldCk6IFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBwYWNrZXQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogcGFja2V0LmlkLmtleSgpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5hbGwpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlYWQ6IHBlcm1zLnJlYWQgPyBJZGVudGlmaWVyLmZyb20ocGVybXMucmVhZCkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgd3JpdGU6IHBlcm1zLndyaXRlID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLndyaXRlKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBSZWdpc3RlclBhY2tldEpTT04pOiBSZWdpc3RlclBhY2tldCB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBkYXRhO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGRhdGEuaWQpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFsbDogcGVybXMuYWxsID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLmFsbCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVhZDogcGVybXMucmVhZCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5yZWFkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB3cml0ZTogcGVybXMud3JpdGUgPyBJZGVudGlmaWVyLmZyb20ocGVybXMud3JpdGUpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBMb2NrIH0gZnJvbSAnLi4vLi4vbG9jay5qcyc7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEpzb25UeXBlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB7IHR5cGUgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuaW1wb3J0IHsgUmVnaXN0ZXJQYWNrZXQsIFJlZ2lzdHJ5UGFja2V0IH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcbmltcG9ydCB7IHR5cGUgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSB9IGZyb20gJy4vcmVnaXN0cnkuanMnO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFJlZ2lzdHJ5RXh0ZW5zaW9uPiA9IFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmllcyA9IG5ldyBJZGVudGlmaWVyTWFwPFJlZ2lzdHJ5PHVua25vd24+PigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFJFR0lTVFJZX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIFJFR0lTVFJZX1VQREFURV9QQUNLRVQsXG4gICAgICAgICAgICBSRUdJU1RSWV9MSVNURU5fUEFDS0VULFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUmVnaXN0cnk8VD4ocmVnaXN0cnlUeXBlOiBSZWdpc3RyeVR5cGU8VD4pOiBSZWdpc3RyeTxUPiB7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKHJlZ2lzdHJ5VHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgd2l0aCBpZGVudGlmaWVyICcke3JlZ2lzdHJ5VHlwZS5pZH0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeUltcGwodGhpcy5vbXUsIHJlZ2lzdHJ5VHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihyZWdpc3RyeVR5cGU6IFJlZ2lzdHJ5VHlwZTxUPik6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHJlZ2lzdHJ5VHlwZS5pZDtcbiAgICAgICAgbGV0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyaWVzLmdldChpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKHJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5ID0gdGhpcy5jcmVhdGVSZWdpc3RyeShyZWdpc3RyeVR5cGUpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RyaWVzLnNldChpZGVudGlmaWVyLCByZWdpc3RyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5IGFzIFJlZ2lzdHJ5PFQ+O1xuICAgIH1cblxuICAgIHB1YmxpYyBqc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgZGVmYXVsdDogVDsgc2VyaWFsaXplcj86IFNlcmlhbGl6ZXI8VCwgRD4gfSk6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyaWVzLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpc3RyeSB3aXRoIG5hbWUgJyR7bmFtZX0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248VD4oaWRlbnRpZmllciwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogb3B0aW9ucy5kZWZhdWx0LFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVnaXN0cnkodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VyaWFsaXplZDxUPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgZGVmYXVsdDogVDsgc2VyaWFsaXplcjogU2VyaWFsaXplcjxULCBVaW50OEFycmF5PiB9KTogUmVnaXN0cnk8VD4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5IHdpdGggbmFtZSAnJHtuYW1lfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBvcHRpb25zLmRlZmF1bHQsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWdpc3RyeSh0YWJsZVR5cGUpO1xuICAgIH1cbn1cblxuY2xhc3MgUmVnaXN0cnlJbXBsPFQ+IGltcGxlbWVudHMgUmVnaXN0cnk8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8W1RdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2s6IExvY2sgPSBuZXcgTG9jaygpO1xuICAgIHByaXZhdGUgbGlzdGVuaW5nID0gZmFsc2U7XG4gICAgcHVibGljIHZhbHVlOiBUO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZWdpc3RyeVR5cGU8VD4sXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0eXBlLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRUdJU1RSWV9VUERBVEVfUEFDS0VULCAocGFja2V0KSA9PlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVVcGRhdGUocGFja2V0KSxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkVGFzaygoKSA9PiB0aGlzLm9uVGFzaygpKTtcbiAgICB9XG5cbiAgICBhc3luYyAjZ2V0KCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChSRUdJU1RSWV9HRVRfRU5EUE9JTlQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXN1bHQudmFsdWUpO1xuICAgIH1cblxuICAgIGFzeW5jICNzZXQodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9VUERBVEVfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy50eXBlLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudHlwZS5zZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5sb2NrLnVzZShhc3luYyAoKSA9PiB0aGlzLiNnZXQoKSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHRoaXMuI3NldCh2YWx1ZSkpO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubG9jay51c2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLiNnZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYXdhaXQgZm4odmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc2V0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1vZGlmeShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy4jZ2V0KCk7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGF3YWl0IGZuKHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3NldChuZXdWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4oaGFuZGxlcjogKHZhbHVlOiBUKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZyAmJiB0aGlzLm9tdS5yZWFkeSkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9MSVNURU5fUEFDS0VULCB0aGlzLnR5cGUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyLmxpc3RlbihoYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVVwZGF0ZShkYXRhOiBSZWdpc3RyeVBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGEuaWQuaXNFcXVhbCh0aGlzLnR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25UYXNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVHSVNUUllfTElTVEVOX1BBQ0tFVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHlwZS5pZC5pc1N1YnBhdGhPZih0aGlzLm9tdS5hcHAuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9SRUdJU1RFUl9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy50eXBlLnBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxSZWdpc3RyeUV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncmVnaXN0cnknLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IFJlZ2lzdHJ5RXh0ZW5zaW9uKG9tdSksXG4pO1xuZXhwb3J0IGNvbnN0IFJFR0lTVFJZX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRS5qb2luKCdwZXJtaXNzaW9uJyk7XG5jb25zdCBSRUdJU1RSWV9SRUdJU1RFUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UmVnaXN0ZXJQYWNrZXQ+KFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlZ2lzdGVyJyxcbiAgICBzZXJpYWxpemVyOiBSZWdpc3RlclBhY2tldCxcbn0pO1xuY29uc3QgUkVHSVNUUllfVVBEQVRFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxSZWdpc3RyeVBhY2tldD4oXG4gICAgUkVHSVNUUllfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAndXBkYXRlJyxcbiAgICAgICAgc2VyaWFsaXplcjogUmVnaXN0cnlQYWNrZXQsXG4gICAgfSxcbik7XG5jb25zdCBSRUdJU1RSWV9MSVNURU5fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2xpc3RlbicsXG4gICAgc2VyaWFsaXplcjogSWRlbnRpZmllcixcbn0pO1xuY29uc3QgUkVHSVNUUllfR0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8SWRlbnRpZmllciwgUmVnaXN0cnlQYWNrZXQ+KFxuICAgIFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2dldCcsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvSnNvbigpLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFJlZ2lzdHJ5UGFja2V0LFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IFJFR0lTVFJZX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgTG9jYWxlIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgdHlwZSB7IEV4dGVuc2lvbiB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IFJlZ2lzdHJ5VHlwZSwgdHlwZSBSZWdpc3RyeSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcblxuZXhwb3J0IGNvbnN0IEkxOE5fRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8STE4bkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZSgnaTE4bicsIChjbGllbnQpID0+IG5ldyBJMThuRXh0ZW5zaW9uKGNsaWVudCkpO1xuXG5leHBvcnQgY29uc3QgSTE4Tl9TRVRfTE9DQUxFU19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gSTE4Tl9FWFRFTlNJT05fVFlQRS5qb2luKCdsb2NhbGVzJywgJ3NldCcpO1xuZXhwb3J0IGNvbnN0IEkxOE5fR0VUX0xPQ0FMRVNfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IEkxOE5fRVhURU5TSU9OX1RZUEUuam9pbignbG9jYWxlcycsICdnZXQnKTtcbmNvbnN0IEkxOE5fTE9DQUxFU19SRUdJU1RSWV9UWVBFID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248TG9jYWxlW10+KEkxOE5fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbG9jYWxlcycsXG4gICAgZGVmYXVsdFZhbHVlOiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IFtdIDogd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXMgYXMgTG9jYWxlW10sXG59KTtcblxuZXhwb3J0IGNsYXNzIEkxOG5FeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEkxOG5FeHRlbnNpb24+ID0gSTE4Tl9FWFRFTlNJT05fVFlQRTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbG9jYWxlc1JlZ2lzdHJ5OiBSZWdpc3RyeTxMb2NhbGVbXT47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIHRoaXMubG9jYWxlc1JlZ2lzdHJ5ID0gb211LnJlZ2lzdHJpZXMuZ2V0KEkxOE5fTE9DQUxFU19SRUdJU1RSWV9UWVBFKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhbnNsYXRlKGxvY2FsaXplZFRleHQ6IExvY2FsaXplZFRleHQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsb2NhbGVzID0gdGhpcy5sb2NhbGVzUmVnaXN0cnkudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxpemVkVGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5zZWxlY3RCZXN0VHJhbnNsYXRpb24obG9jYWxlcywgbG9jYWxpemVkVGV4dCk7XG4gICAgICAgIGlmICghdHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGxvY2FsaXplZFRleHQpWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0QmVzdFRyYW5zbGF0aW9uKFxuICAgICAgICBsb2NhbGVzOiByZWFkb25seSBMb2NhbGVbXSxcbiAgICAgICAgbG9jYWxpemVkVGV4dDogTG9jYWxpemVkVGV4dCxcbiAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsaXplZFRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxpemVkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBsb2NhbGl6ZWRUZXh0O1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZExvY2FsZXMgPSBsb2NhbGVzLnJlZHVjZSgoYWNjLCBsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGwuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaChwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCctJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10gYXMgc3RyaW5nW10pO1xuICAgICAgICBmb3IgKGNvbnN0IGwgb2YgdHJhbnNmb3JtZWRMb2NhbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uc1tsXTtcbiAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2NhbGUobG9jYWxlOiBMb2NhbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzUmVnaXN0cnkuc2V0KGxvY2FsZSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGVudW0gTG9nVHlwZSB7XG4gICAgRVJST1IgPSAnZXJyb3InLFxuICAgIFdBUk5JTkcgPSAnd2FybmluZycsXG4gICAgSU5GTyA9ICdpbmZvJyxcbiAgICBERUJVRyA9ICdkZWJ1ZycsXG59XG5cbmV4cG9ydCB0eXBlIExvZ01lc3NhZ2UgPSB7XG4gICAgdHlwZTogTG9nVHlwZTtcbiAgICB0ZXh0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgTG9nUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogTG9nTWVzc2FnZSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBMb2dQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGl0ZW0uaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoaXRlbS5tZXNzYWdlLnR5cGUpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoaXRlbS5tZXNzYWdlLnRleHQpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IExvZ1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IGlkID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHJlYWRlci5yZWFkU3RyaW5nKCkgYXMgTG9nVHlwZTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHR5cGUsIHRleHQgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2dQYWNrZXQoSWRlbnRpZmllci5mcm9tS2V5KGlkKSwgbWVzc2FnZSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHsgTG9nTWVzc2FnZSB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgeyBMb2dQYWNrZXQsIExvZ1R5cGUgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPExvZ2dlckV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnbG9nZ2VyJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgTG9nZ2VyRXh0ZW5zaW9uKGNsaWVudCksXG4pO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0xPR19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gTE9HR0VSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2xvZycpO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0xPR19QQUNLRVQ6IFBhY2tldFR5cGU8TG9nUGFja2V0PiA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxMb2dQYWNrZXQ+KExPR0dFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsb2cnLFxuICAgIHNlcmlhbGl6ZXI6IExvZ1BhY2tldCxcbn0pO1xuZXhwb3J0IGNvbnN0IExPR0dFUl9MSVNURU5fUEFDS0VUOiBQYWNrZXRUeXBlPElkZW50aWZpZXI+ID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KExPR0dFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcblxudHlwZSBMb2dMaXN0ZW5lciA9IChtZXNzYWdlOiBMb2dNZXNzYWdlKSA9PiB2b2lkO1xuZXhwb3J0IGNsYXNzIExvZ2dlckV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8TG9nZ2VyRXh0ZW5zaW9uPiA9IExPR0dFUl9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogSWRlbnRpZmllck1hcDxMb2dMaXN0ZW5lcltdPiA9IG5ldyBJZGVudGlmaWVyTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KExPR0dFUl9MT0dfUEFDS0VULCBMT0dHRVJfTElTVEVOX1BBQ0tFVCk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoTE9HR0VSX0xPR19QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5saXN0ZW5lcnMuZ2V0KHBhY2tldC5pZCk7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5mb3JFYWNoKChpdCkgPT4gaXQocGFja2V0Lm1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvZyhtZXNzYWdlOiBMb2dNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBMb2dQYWNrZXQodGhpcy5vbXUuYXBwLmlkLCBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChMT0dHRVJfTE9HX1BBQ0tFVCwgcGFja2V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXJyb3IodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5FUlJPUiwgdGV4dCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2FybmluZyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2coeyB0eXBlOiBMb2dUeXBlLldBUk5JTkcsIHRleHQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGluZm8odGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5JTkZPLCB0ZXh0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWJ1Zyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2coeyB0eXBlOiBMb2dUeXBlLkRFQlVHLCB0ZXh0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4oaWQ6IElkZW50aWZpZXIsIGxpc3RlbmVyOiBMb2dMaXN0ZW5lcik6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5vblJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKExPR0dFUl9MSVNURU5fUEFDS0VULCBpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGlkKSA/PyBbXTtcbiAgICAgICAgbGlzdC5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2V0KGlkLCBsaXN0KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGxpc3Quc3BsaWNlKGxpc3QuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbkxldmVsID0gJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJztcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbk1ldGFkYXRhID0ge1xuICAgIG5hbWU6IExvY2FsaXplZFRleHQ7XG4gICAgbm90ZT86IExvY2FsaXplZFRleHQ7XG4gICAgbGV2ZWw6IFBlcm1pc3Npb25MZXZlbDtcbn07XG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25UeXBlSnNvbiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGE7XG59O1xuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblR5cGUge1xuICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE6IFBlcm1pc3Npb25NZXRhZGF0YTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgaWQ6IElkZW50aWZpZXI7IG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGEgfSkge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGE7XG4gICAgICAgIH0sXG4gICAgKTogUGVybWlzc2lvblR5cGUge1xuICAgICAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25UeXBlKHtcbiAgICAgICAgICAgIGlkOiBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllciksXG4gICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IFBlcm1pc3Npb25UeXBlKTogUGVybWlzc2lvblR5cGVKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmlkLmtleSgpLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uOiBQZXJtaXNzaW9uVHlwZUpzb24pOiBQZXJtaXNzaW9uVHlwZSB7XG4gICAgICAgIHJldHVybiBuZXcgUGVybWlzc2lvblR5cGUoe1xuICAgICAgICAgICAgaWQ6IElkZW50aWZpZXIuZnJvbUtleShqc29uLmlkKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBqc29uLm1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAsIElkZW50aWZpZXJTZXQsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuaW1wb3J0IHsgUGVybWlzc2lvblR5cGUgfSBmcm9tICcuL3Blcm1pc3Npb24uanMnO1xuXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxQZXJtaXNzaW9uRXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdwZXJtaXNzaW9uJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgUGVybWlzc2lvbkV4dGVuc2lvbihjbGllbnQpLFxuKTtcbmNvbnN0IFBFUk1JU1NJT05fUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFBlcm1pc3Npb25UeXBlW10+KFxuICAgIFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAncmVnaXN0ZXInLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKFBlcm1pc3Npb25UeXBlKS50b0FycmF5KCksXG4gICAgfSxcbik7XG5jb25zdCBQRVJNSVNTSU9OX1JFUVVJUkVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXT4oUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1aXJlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKSxcbn0pO1xuY29uc3QgUEVSTUlTU0lPTl9SRVFVRVNUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcltdLCB2b2lkPihcbiAgICBQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3QnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG4gICAgfSxcbik7XG5jb25zdCBQRVJNSVNTSU9OX0dSQU5UX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxQZXJtaXNzaW9uVHlwZVtdPihQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2dyYW50JyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKFBlcm1pc3Npb25UeXBlKS50b0FycmF5KCksXG59KTtcblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25FeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFBlcm1pc3Npb25FeHRlbnNpb24+ID0gUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zID0gbmV3IElkZW50aWZpZXJNYXA8UGVybWlzc2lvblR5cGU+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RlcmVkUGVybWlzc2lvbnMgPSBuZXcgSWRlbnRpZmllck1hcDxQZXJtaXNzaW9uVHlwZT4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcXVpcmVkUGVybWlzc2lvbnMgPSBuZXcgSWRlbnRpZmllclNldCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFBFUk1JU1NJT05fUkVHSVNURVJfUEFDS0VULFxuICAgICAgICAgICAgUEVSTUlTU0lPTl9SRVFVSVJFX1BBQ0tFVCxcbiAgICAgICAgICAgIFBFUk1JU1NJT05fR1JBTlRfUEFDS0VULFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFBFUk1JU1NJT05fR1JBTlRfUEFDS0VULCAocGVybWlzc2lvbnMpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnMuc2V0KHBlcm1pc3Npb24uaWQsIHBlcm1pc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkVGFzaygoKSA9PiB0aGlzLm9uVGFzaygpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LmFwcC50eXBlID09PSAncmVtb3RlJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdGVyZWRQZXJtaXNzaW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChcbiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMucmVnaXN0ZXJlZFBlcm1pc3Npb25zLnZhbHVlcygpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChcbiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OX1JFUVVJUkVfUEFDS0VULFxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy5yZXF1aXJlZFBlcm1pc3Npb25zLnZhbHVlcygpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXIocGVybWlzc2lvbjogUGVybWlzc2lvblR5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUEVSTUlTU0lPTl9SRUdJU1RFUl9QQUNLRVQsIFtwZXJtaXNzaW9uXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkUGVybWlzc2lvbnMuc2V0KHBlcm1pc3Npb24uaWQsIHBlcm1pc3Npb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXF1aXJlKC4uLnBlcm1pc3Npb25JZHM6IEludG9JZFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkcyA9IHBlcm1pc3Npb25JZHMubWFwKElkZW50aWZpZXIuZnJvbSk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBpZHMuZmlsdGVyKChpZCkgPT4gIXRoaXMucGVybWlzc2lvbnMuaGFzKGlkKSk7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJtaXNzaW9ucyBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjbGllbnQgc3RhcnRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy5hZGQoaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3QoLi4ucGVybWlzc2lvbklkczogSWRlbnRpZmllcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFBFUk1JU1NJT05fUkVRVUVTVF9FTkRQT0lOVCwgcGVybWlzc2lvbklkcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwZXJtaXNzaW9uSWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5oYXMocGVybWlzc2lvbklkZW50aWZpZXIpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBUYWJsZSwgVGFibGVUeXBlIH0gZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgUExVR0lOX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFBsdWdpbkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncGx1Z2luJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBQbHVnaW5FeHRlbnNpb24ob211KSxcbik7XG5cbmV4cG9ydCBjbGFzcyBQbHVnaW5FeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFBsdWdpbkV4dGVuc2lvbj4gPSBQTFVHSU5fRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZFBsdWdpbnM6IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChQTFVHSU5fUkVRVUlSRV9QQUNLRVQpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxvd2VkUGFja2FnZXMoKTogVGFibGU8UGx1Z2luUGFja2FnZUluZm8+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub211LnRhYmxlcy5nZXQoUExVR0lOX0FMTE9XRURfUEFDS0FHRV9UQUJMRSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZChvcHRpb25zOiBSZWxvYWRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFBMVUdJTl9SRUxPQURfRU5EUE9JTlRfVFlQRSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblRhc2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoUExVR0lOX1JFUVVJUkVfUEFDS0VULCBPYmplY3QuZnJvbUVudHJpZXModGhpcy5yZXF1aXJlZFBsdWdpbnMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVxdWlyZShwbHVnaW5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVnaW5zIG11c3QgYmUgcmVxdWlyZWQgYmVmb3JlIHRoZSBjbGllbnQgc3RhcnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGx1Z2lucykpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQbHVnaW5zLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgUExVR0lOX1JFUVVJUkVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+PihcbiAgICBQTFVHSU5fRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgfSxcbik7XG5leHBvcnQgY2xhc3MgUGx1Z2luUGFja2FnZUluZm8ge1xuICAgIHB1YmxpYyBwYWNrYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKF9wYWNrYWdlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLnBhY2thZ2UgPSBfcGFja2FnZTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBQbHVnaW5QYWNrYWdlSW5mbyk6IHsgcGFja2FnZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSnNvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9KTogUGx1Z2luUGFja2FnZUluZm8ge1xuICAgICAgICByZXR1cm4gUGx1Z2luUGFja2FnZUluZm8uZnJvbUpzb24oZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSnNvbihqc29uOiB7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0pOiBQbHVnaW5QYWNrYWdlSW5mbyB7XG4gICAgICAgIHJldHVybiBuZXcgUGx1Z2luUGFja2FnZUluZm8oanNvbi5wYWNrYWdlLCBqc29uLnZlcnNpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIHsgcGFja2FnZTogdGhpcy5wYWNrYWdlLCB2ZXJzaW9uOiB0aGlzLnZlcnNpb24gfTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2thZ2U7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUExVR0lOX1JFQURfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUExVR0lOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3BhY2thZ2UnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9NQU5BR0VfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUExVR0lOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3BhY2thZ2UnLCAnbWFuYWdlJyk7XG5cbmNvbnN0IFBMVUdJTl9BTExPV0VEX1BBQ0tBR0VfVEFCTEUgPSBUYWJsZVR5cGUuY3JlYXRlSnNvbihQTFVHSU5fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnYWxsb3dlZF9wYWNrYWdlJyxcbiAgICBzZXJpYWxpemVyOiBQbHVnaW5QYWNrYWdlSW5mbyxcbiAgICBrZXk6IChpdGVtKSA9PiBpdGVtLmtleSgpLFxufSk7XG5cbnR5cGUgUmVsb2FkT3B0aW9ucyA9IHtcbiAgICBwYWNrYWdlczogc3RyaW5nW10gfCBudWxsO1xufTtcblxudHlwZSBSZWxvYWRSZXN1bHQgPSB7XG4gICAgcGFja2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5jb25zdCBQTFVHSU5fUkVMT0FEX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxSZWxvYWRPcHRpb25zLCBSZWxvYWRSZXN1bHQ+KFBMVUdJTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWxvYWQnLFxuICAgIHBlcm1pc3Npb25JZDogUExVR0lOX01BTkFHRV9QQUNLQUdFX1BFUk1JU1NJT05fSUQsXG59KTtcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgRmxhZ3MgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgdHlwZSB7IFRhYmxlQ29uZmlnIH0gZnJvbSAnLi90YWJsZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUGFja2V0KGlkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVJdGVtc1BhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgaXRlbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVJdGVtc1BhY2tldChpZCwgaXRlbXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlS2V5c1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleXM6IHN0cmluZ1tdLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVLZXlzUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5rZXlzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhY2tldC5rZXlzKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlS2V5c1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGtleXMucHVzaChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlS2V5c1BhY2tldChpZCwga2V5cyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVQcm94eVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVQcm94eVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQua2V5KTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVByb3h5UGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgIGl0ZW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUHJveHlQYWNrZXQoaWQsIGl0ZW1zLCBrZXkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUYWJsZUZldGNoUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbGltaXQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJhY2t3YXJkOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQubGltaXQpO1xuICAgICAgICBjb25zdCBmbGFncyA9IG5ldyBGbGFncyh7IGxlbmd0aDogMiB9KTtcbiAgICAgICAgZmxhZ3Muc2V0KDAsIHBhY2tldC5iYWNrd2FyZCk7XG4gICAgICAgIGZsYWdzLnNldCgxLCBwYWNrZXQuY3Vyc29yICE9PSBudWxsKTtcbiAgICAgICAgd3JpdGVyLndyaXRlRmxhZ3MoZmxhZ3MpO1xuICAgICAgICBpZiAocGFja2V0LmN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5jdXJzb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVGZXRjaFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBmbGFncyA9IHJlYWRlci5yZWFkRmxhZ3MoMik7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkID0gZmxhZ3MuZ2V0KDApO1xuICAgICAgICBjb25zdCBjdXJzb3IgPSBmbGFncy5pZlNldCgxLCAoKSA9PiByZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZldGNoUGFja2V0KGlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVGZXRjaFJhbmdlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnQ6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVuZDogc3RyaW5nLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFJhbmdlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnN0YXJ0KTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5lbmQpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGZXRjaFJhbmdlUGFja2V0KGlkLCBzdGFydCwgZW5kKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRDb25maWdQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjb25maWc6IFRhYmxlQ29uZmlnLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2V0Q29uZmlnUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkocGFja2V0LmNvbmZpZykpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNldENvbmZpZ1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFNldENvbmZpZ1BhY2tldChpZCwgY29uZmlnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYWxsOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlYWQ6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgd3JpdGU6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVtb3ZlOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHByb3h5OiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFNldFBlcm1pc3Npb25QYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIGxldCBmbGFncyA9IDA7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gMGIxMDAwMDtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGVVaW50OChmbGFncyk7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmFsbC5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlYWQua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQud3JpdGUua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlbW92ZS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5wcm94eS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICAgICAgICBjb25zdCBhbGwgPSBmbGFncyAmIDBiMSA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBmbGFncyAmIDBiMTAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCB3cml0ZSA9IGZsYWdzICYgMGIxMDAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCByZW1vdmUgPSBmbGFncyAmIDBiMTAwMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gZmxhZ3MgJiAwYjEwMDAwID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXRQZXJtaXNzaW9uUGFja2V0KGlkLCBhbGwsIHJlYWQsIHdyaXRlLCByZW1vdmUsIHByb3h5KTtcbiAgICB9XG59XG5cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQge1xuICAgIFNldENvbmZpZ1BhY2tldCxcbiAgICBTZXRQZXJtaXNzaW9uUGFja2V0LFxuICAgIFRhYmxlRmV0Y2hQYWNrZXQsXG4gICAgVGFibGVGZXRjaFJhbmdlUGFja2V0LFxuICAgIFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgVGFibGVLZXlzUGFja2V0LFxuICAgIFRhYmxlUGFja2V0LFxuICAgIFRhYmxlUHJveHlQYWNrZXQsXG59IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFRhYmxlLCBUYWJsZUNvbmZpZywgVGFibGVFdmVudHMsIFRhYmxlUGVybWlzc2lvbnMgfSBmcm9tICcuL3RhYmxlLmpzJztcbmltcG9ydCB7IFRhYmxlVHlwZSB9IGZyb20gJy4vdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgVEFCTEVfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8VGFibGVFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3RhYmxlJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgVGFibGVFeHRlbnNpb24oY2xpZW50KSxcbik7XG5leHBvcnQgY29uc3QgVEFCTEVfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3Blcm1pc3Npb24nKTtcblxuY29uc3QgVEFCTEVfU0VUX1BFUk1JU1NJT05fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNldFBlcm1pc3Npb25QYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9wZXJtaXNzaW9uJyxcbiAgICBzZXJpYWxpemVyOiBTZXRQZXJtaXNzaW9uUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxTZXRDb25maWdQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9jb25maWcnLFxuICAgIHNlcmlhbGl6ZXI6IFNldENvbmZpZ1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFRBQkxFX1BST1hZX0xJU1RFTl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHlfbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5jb25zdCBUQUJMRV9QUk9YWV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQcm94eVBhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHknLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlUHJveHlQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fQUREX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2FkZCcsXG4gICAgc2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1fdXBkYXRlJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX1JFTU9WRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV9yZW1vdmUnLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fR0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2dldCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlS2V5c1BhY2tldCwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVLZXlzUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUtleXNQYWNrZXQsIGJvb2xlYW4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzX2FsbCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9IQVNfQU5ZX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBib29sZWFuPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2hhc19hbnknLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUtleXNQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLmpzb24oKSxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2gnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUZldGNoUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX1JBTkdFX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFJhbmdlUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdmZXRjaF9yYW5nZScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9GRVRDSF9BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZVBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2hfYWxsJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfU0laRV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlUGFja2V0LCBudW1iZXI+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NpemUnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2NsZWFyJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgVGFibGVFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFRhYmxlRXh0ZW5zaW9uPiA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFibGVNYXAgPSBuZXcgSWRlbnRpZmllck1hcDxUYWJsZTx1bmtub3duPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBUQUJMRV9TRVRfUEVSTUlTU0lPTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCxcbiAgICAgICAgICAgIFRBQkxFX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9QUk9YWV9MSVNURU5fUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfUFJPWFlfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9BRERfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUYWJsZTxUPih0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShUQUJMRV9QRVJNSVNTSU9OX0lEKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHRhYmxlVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFibGUgYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZUltcGw8VD4odGhpcy5vbXUsIHRhYmxlVHlwZSk7XG4gICAgICAgIHRoaXMudGFibGVNYXAuc2V0KHRhYmxlVHlwZS5pZCwgdGFibGUgYXMgVGFibGU8dW5rbm93bj4pO1xuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD4gfSk6IFRhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEpzb25UeXBlLCBVaW50OEFycmF5PihvcHRpb25zLnNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIG9wdGlvbnMua2V5LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZSh0YWJsZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PiB9KTogVGFibGU8VD4ge1xuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSksXG4gICAgICAgICAgICBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmtleSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWJsZU1hcC5nZXQodHlwZS5pZCkgYXMgVGFibGU8VD47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlTWFwLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG59XG5cbmNsYXNzIFRhYmxlSW1wbDxUPiBpbXBsZW1lbnRzIFRhYmxlPFQ+IHtcbiAgICBwdWJsaWMgY2FjaGU6IE1hcDxzdHJpbmcsIFQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBldmVudDogVGFibGVFdmVudHM8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlTWFwOiBNYXA8c3RyaW5nLCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+PjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3hpZXM6IEFycmF5PChpdGVtOiBUKSA9PiBUIHwgdW5kZWZpbmVkPjtcbiAgICBwcml2YXRlIGlkOiBJZGVudGlmaWVyO1xuICAgIHByaXZhdGUgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgIHByaXZhdGUga2V5RnVuY3Rpb246IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjYWNoZVNpemU/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjb25maWc/OiBUYWJsZUNvbmZpZztcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICB0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPixcbiAgICApIHtcbiAgICAgICAgdGhpcy5pZCA9IHRhYmxlVHlwZS5pZDtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gdGFibGVUeXBlLnNlcmlhbGl6ZXI7XG4gICAgICAgIHRoaXMua2V5RnVuY3Rpb24gPSB0YWJsZVR5cGUua2V5RnVuY3Rpb247XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZXZlbnQgPSB7XG4gICAgICAgICAgICBhZGQ6IG5ldyBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT4oKSxcbiAgICAgICAgICAgIHVwZGF0ZTogbmV3IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPigpLFxuICAgICAgICAgICAgcmVtb3ZlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgICAgICBjbGVhcjogbmV3IEV2ZW50RW1pdHRlcjxbXT4oKSxcbiAgICAgICAgICAgIGNhY2hlVXBkYXRlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvbWlzZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5wcm94aWVzID0gW107XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9QUk9YWV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMucHJveGllcy5mb3JFYWNoKChwcm94eSkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gbmV3IE1hcChcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJveHlJdGVtID0gcHJveHkoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5SXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBwcm94eUl0ZW0gYXMgVF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgW3N0cmluZywgVF0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaXRlbSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbXUuc2VuZChUQUJMRV9QUk9YWV9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBrZXk6IHBhY2tldC5rZXksXG4gICAgICAgICAgICAgICAgaXRlbXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV0ubWFwKChba2V5LCBpdGVtXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlbSldO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX0lURU1fQUREX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHBhY2tldC5pdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuYWRkLmVtaXQoaXRlbXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX1VQREFURV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhwYWNrZXQuaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LnVwZGF0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhY2tldC5pZC5pc0VxdWFsKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQucmVtb3ZlLmVtaXQoaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5lbWl0KHRoaXMuY2FjaGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX0NMRUFSX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LmNsZWFyLmVtaXQoKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4gdGhpcy5vblJlYWR5KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FjaGUoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBpdGVtcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLnNsaWNlKC10aGlzLmNhY2hlU2l6ZSkpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGxpc3RlbmVyPzogKGl0ZW1zOiBNYXA8c3RyaW5nLCBUPikgPT4gdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9MSVNURU5fUEFDS0VULCB0aGlzLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUubGlzdGVuKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5KGNhbGxiYWNrOiAoaXRlbTogVCkgPT4gVCB8IHVuZGVmaW5lZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKHRoaXMucHJveGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGxldCBjYW5jZWwgPSAoKTogdm9pZCA9PiB7fTtcbiAgICAgICAgICAgIGNhbmNlbCA9IHRoaXMub211Lm9uUmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3hpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfUFJPWFlfTElTVEVOX1BBQ0tFVCwgdGhpcy5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3hpZXMucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3hpZXMuc3BsaWNlKHRoaXMucHJveGllcy5pbmRleE9mKGNhbGxiYWNrKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblJlYWR5KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfU0VUX0NPTkZJR19QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9taXNlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9taXNlTWFwLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlTWFwLnNldChrZXksIHByb21pc2UpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZS50aGVuKChpdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb21pc2VNYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldE1hbnkoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkS2V5cyA9IGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIXRoaXMuY2FjaGUuaGFzKGtleSkpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+ICF0aGlzLnByb21pc2VNYXAuaGFzKGtleSkpO1xuICAgICAgICBpZiAoZmlsdGVyZWRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXAoWy4uLnRoaXMuY2FjaGVdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogZmlsdGVyZWRLZXlzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5zZXQoXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbigoaXRlbXMpID0+IGl0ZW1zLmdldChrZXkpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGQoLi4uaXRlbXM6IFRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZXJpYWxpemVJdGVtcyhpdGVtcyk7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9BRERfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGl0ZW1zOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VyaWFsaXplSXRlbXMoaXRlbXMpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fVVBEQVRFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZSguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNlcmlhbGl6ZUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZV0uZmlsdGVyKChba2V5XSkgPT4gIWtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fUkVNT1ZFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fQ0xFQVJfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhcyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzW2tleV0gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc01hbnk8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiguLi5rZXlzOiAoa2V5b2YgVClbXSk6IFByb21pc2U8eyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czoga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXMgYXMgeyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FsbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTllfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoSXRlbXMoe1xuICAgICAgICBsaW1pdCxcbiAgICAgICAgYmFja3dhcmQsXG4gICAgICAgIGN1cnNvcixcbiAgICB9OiB7XG4gICAgICAgIGxpbWl0OiBudW1iZXI7XG4gICAgICAgIGJhY2t3YXJkPzogYm9vbGVhbjtcbiAgICAgICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFxuICAgICAgICAgICAgVEFCTEVfRkVUQ0hfRU5EUE9JTlQsXG4gICAgICAgICAgICBuZXcgVGFibGVGZXRjaFBhY2tldCh0aGlzLmlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvciksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoUmFuZ2Uoe1xuICAgICAgICBzdGFydCxcbiAgICAgICAgZW5kLFxuICAgIH06IHtcbiAgICAgICAgc3RhcnQ6IHN0cmluZztcbiAgICAgICAgZW5kOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfRkVUQ0hfUkFOR0VfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaEFsbCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFRBQkxFX0ZFVENIX0FMTF9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyAqaXRlcmF0ZSh7XG4gICAgICAgIGJhY2t3YXJkLFxuICAgICAgICBjdXJzb3IsXG4gICAgfToge1xuICAgICAgICBiYWNrd2FyZD86IGJvb2xlYW47XG4gICAgICAgIGN1cnNvcj86IHN0cmluZztcbiAgICB9KTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMuZmV0Y2hJdGVtcyh7XG4gICAgICAgICAgICAgICAgbGltaXQ6IHRoaXMuY2FjaGVTaXplID8/IDEwMCxcbiAgICAgICAgICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpdGVtcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCogaXRlbXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoY3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5kZWxldGUoY3Vyc29yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnNvckl0ZW0gPSBiYWNrd2FyZCA/IGl0ZW1zLnZhbHVlcygpLm5leHQoKS52YWx1ZSA6IFsuLi5pdGVtcy52YWx1ZXMoKV0ucG9wKCk7XG4gICAgICAgICAgICBpZiAoIWN1cnNvckl0ZW0pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnNvciA9IHRoaXMua2V5RnVuY3Rpb24oY3Vyc29ySXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2l6ZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfU0laRV9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZXJpYWxpemVJdGVtcyhpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4pOiBNYXA8c3RyaW5nLCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbXMpLm1hcCgoW2tleSwgZGF0YV0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIGl0ZW1dO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVJdGVtcyhpdGVtczogVFtdKTogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmtleUZ1bmN0aW9uKGl0ZW0pLCB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGl0ZW0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDYWNoZVNpemUoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FjaGVTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZzogVGFibGVDb25maWcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCBjb25maWcgYWZ0ZXIgY2xpZW50IGhhcyBzdGFydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBUYWJsZVBlcm1pc3Npb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUuanMnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSwgdHlwZSBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCB7IFRhYmxlVHlwZSwgdHlwZSBUYWJsZSB9IGZyb20gJy4uL3RhYmxlJztcblxuZXhwb3J0IGNvbnN0IFNFUlZFUl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTZXJ2ZXJFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3NlcnZlcicsXG4gICAgKG9tdTogT211KSA9PiBuZXcgU2VydmVyRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4RW50cnkge1xuICAgIHVybDogc3RyaW5nO1xuICAgIGFkZGVkX2F0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4IHtcbiAgICBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBBcHBJbmRleEVudHJ5Pjtcbn07XG5cbmV4cG9ydCBjb25zdCBTRVJWRVJfQVBQU19SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignYXBwcycsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0FQUFNfV1JJVEVfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHBzJywgJ3dyaXRlJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0lOREVYX1JFQURfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdpbmRleCcsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0lOREVYX1JFR0lTVFJZX1RZUEU6IFJlZ2lzdHJ5VHlwZTxBcHBJbmRleD4gPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxBcHBJbmRleD4oU0VSVkVSX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2luZGV4JyxcbiAgICBkZWZhdWx0VmFsdWU6IHsgJ2luZGV4ZXMnOiB7fSB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHdyaXRlOiBTRVJWRVJfQVBQU19XUklURV9QRVJNSVNTSU9OX0lELFxuICAgICAgICByZWFkOiBTRVJWRVJfSU5ERVhfUkVBRF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcbmNvbnN0IEFQUF9UQUJMRV9UWVBFID0gVGFibGVUeXBlLmNyZWF0ZUpzb24oU0VSVkVSX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2FwcHMnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbiAgICBrZXk6IChhcHApID0+IGFwcC5pZC5rZXkoKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICBhbGw6IFNFUlZFUl9BUFBTX1dSSVRFX1BFUk1JU1NJT05fSUQsXG4gICAgICAgIHJlYWQ6IFNFUlZFUl9BUFBTX1JFQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBTRVJWRVJfU0hVVERPV05fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdzaHV0ZG93bicpO1xuY29uc3QgU0hVVERPV05fRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPGJvb2xlYW4sIGJvb2xlYW4+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzaHV0ZG93bicsXG4gICAgcGVybWlzc2lvbklkOiBTRVJWRVJfU0hVVERPV05fUEVSTUlTU0lPTl9JRCxcbn0pO1xuZXhwb3J0IGNvbnN0IFRSVVNURURfT1JJR0lOU19HRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCd0cnVzdGVkX29yaWdpbnMnLCAnZ2V0Jyk7XG5leHBvcnQgY29uc3QgVFJVU1RFRF9PUklHSU5TX1NFVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3RydXN0ZWRfb3JpZ2lucycsICdzZXQnKTtcbmNvbnN0IFRSVVNURURfSE9TVFNfUkVHSVNUUllfVFlQRSA9IFJlZ2lzdHJ5VHlwZS5jcmVhdGVKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd0cnVzdGVkX2hvc3RzJyxcbiAgICBkZWZhdWx0VmFsdWU6IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHJlYWQ6IFRSVVNURURfT1JJR0lOU19HRVRfUEVSTUlTU0lPTl9JRCxcbiAgICAgICAgd3JpdGU6IFRSVVNURURfT1JJR0lOU19TRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFNlcnZlckV4dGVuc2lvbj4gPSBTRVJWRVJfRVhURU5TSU9OX1RZUEU7XG4gICAgcHVibGljIHJlYWRvbmx5IGFwcHM6IFRhYmxlPEFwcD47XG4gICAgcHVibGljIHJlYWRvbmx5IGluZGV4OiBSZWdpc3RyeTxBcHBJbmRleD47XG4gICAgcHVibGljIHJlYWRvbmx5IHRydXN0ZWRIb3N0czogUmVnaXN0cnk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIHRoaXMuYXBwcyA9IG9tdS50YWJsZXMuZ2V0KEFQUF9UQUJMRV9UWVBFKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9tdS5yZWdpc3RyaWVzLmdldChTRVJWRVJfSU5ERVhfUkVHSVNUUllfVFlQRSk7XG4gICAgICAgIHRoaXMudHJ1c3RlZEhvc3RzID0gb211LnJlZ2lzdHJpZXMuZ2V0KFRSVVNURURfSE9TVFNfUkVHSVNUUllfVFlQRSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKHJlc3RhcnQ/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFNIVVRET1dOX0VORFBPSU5UX1RZUEUsIHJlc3RhcnQgPz8gZmFsc2UpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5saXN0ZW4gPSB0aGlzLm9tdS5uZXR3b3JrLmV2ZW50LmRpc2Nvbm5lY3RlZC5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uT2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb25Db25uZWN0Q2FsbGJhY2tzOiBBcnJheTwoYXBwOiBBcHApID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9uRGlzY29ubmVjdENhbGxiYWNrczogQXJyYXk8KGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBvbkNvbm5lY3QoY2FsbGJhY2s6IChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNvbm5lY3RDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGlzY29ubmVjdChjYWxsYmFjazogKGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uRGlzY29ubmVjdENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwSW5kZXhSZWdpc3RyeUpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgYXBwczogUmVjb3JkPHN0cmluZywgQXBwSnNvbj47XG59XG5cbmV4cG9ydCBjbGFzcyBBcHBJbmRleFJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgYXBwczogSWRlbnRpZmllck1hcDxBcHA+LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGpzb246IEFwcEluZGV4UmVnaXN0cnlKU09OKTogQXBwSW5kZXhSZWdpc3RyeSB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGpzb25bJ2lkJ10pO1xuICAgICAgICBjb25zdCBhcHBzID0gbmV3IElkZW50aWZpZXJNYXA8QXBwPigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtpZFN0ciwgYXBwSlNPTl0gb2YgT2JqZWN0LmVudHJpZXMoanNvblsnYXBwcyddKSkge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkoaWRTdHIpO1xuICAgICAgICAgICAgY29uc3QgYXBwID0gQXBwLmRlc2VyaWFsaXplKGFwcEpTT04pO1xuICAgICAgICAgICAgaWYgKCFpZC5pc05hbWVzcGFjZUVxdWFsKGFwcC5pZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFwcCBJRCBkb2VzIG5vdCBtYXRjaCB0aGUgSUQgaW4gdGhlIGluZGV4LiAke2FwcC5pZH0gIT0gJHtpZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcHMuc2V0KGlkLCBhcHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQXBwSW5kZXhSZWdpc3RyeShcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgYXBwcyxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwLCBJZGVudGlmaWVyU2V0LCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludCc7XG5pbXBvcnQgeyBFeHRlbnNpb24sIEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24nO1xuaW1wb3J0IHsgU2Vzc2lvbk9ic2VydmVyIH0gZnJvbSAnLi4vc2VydmVyL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBUYWJsZSwgVGFibGVUeXBlIH0gZnJvbSAnLi4vdGFibGUnO1xuXG5leHBvcnQgY29uc3QgU0VTU0lPTl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTZXNzaW9uRXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKCdzZXNzaW9ucycsIChvbXU6IE9tdSkgPT4gbmV3IFNlc3Npb25FeHRlbnNpb24ob211KSk7XG5cbmV4cG9ydCBjb25zdCBTRVNTSU9OU19SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3JlYWQnKTtcbmNvbnN0IFNFU1NJT05fVEFCTEVfVFlQRSA9IFRhYmxlVHlwZS5jcmVhdGVKc29uKFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2Vzc2lvbnMnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbiAgICBrZXk6IChhcHApID0+IGFwcC5pZC5rZXkoKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICByZWFkOiBTRVNTSU9OU19SRUFEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuY29uc3QgUkVRVUlSRV9BUFBTX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXT4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1aXJlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKSxcbn0pO1xuY29uc3QgU0VTU0lPTl9PQlNFUlZFX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXT4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdvYnNlcnZlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKSxcbn0pO1xuY29uc3QgU0VTU0lPTl9DT05ORUNURURfUEFDS0VUX1RZUEUgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248QXBwPihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Nlc3Npb25fY29ubmVjdGVkJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG59KTtcbmNvbnN0IFNFU1NJT05fRElTQ09OTkVDVEVEX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEFwcD4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzZXNzaW9uX2Rpc2Nvbm5lY3RlZCcsXG4gICAgc2VyaWFsaXplcjogQXBwLFxufSk7XG5cbnR5cGUgUmVtb3RlQXBwUmVxdWVzdFBheWxvYWQgPSB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBlcm1pc3Npb25zOiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RSZW1vdGVBcHBSZXNwb25zZSA9IHtcbiAgICB0eXBlOiAnc3VjY2Vzcyc7XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBsYW5faXA6IHN0cmluZztcbn0gfCB7XG4gICAgdHlwZTogJ2Vycm9yJztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgUkVNT1RFX0FQUF9SRVFVRVNUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3JlbW90ZV9hcHAnLCAncmVxdWVzdCcpO1xuXG5jb25zdCBSRU1PVEVfQVBQX1JFUVVFU1RfRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFJlbW90ZUFwcFJlcXVlc3RQYXlsb2FkLCBSZXF1ZXN0UmVtb3RlQXBwUmVzcG9uc2U+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVtb3RlX2FwcF9yZXF1ZXN0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IFJFTU9URV9BUFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lELFxufSk7XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRlVG9rZW5SZXNwb25zZSA9IHtcbiAgICB0eXBlOiAnc3VjY2Vzcyc7XG4gICAgdG9rZW46IHN0cmluZztcbn0gfCB7XG4gICAgdHlwZTogJ2Vycm9yJztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgR0VORVJBVEVfVE9LRU5fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFU1NJT05fRVhURU5TSU9OX1RZUEUuam9pbignZ2VuZXJhdGVfdG9rZW4nKTtcblxudHlwZSBHZW5lcmF0ZVRva2VuUGF5bG9hZCA9IHtcbiAgICBhcHA6IEFwcEpzb247XG4gICAgcGVybWlzc2lvbnM6IHN0cmluZ1tdO1xufTtcblxuY29uc3QgR0VORVJBVEVfVE9LRU5fRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPEdlbmVyYXRlVG9rZW5QYXlsb2FkLCBHZW5lcmF0ZVRva2VuUmVzcG9uc2U+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZ2VuZXJhdGVfdG9rZW4nLFxuICAgIHBlcm1pc3Npb25JZDogR0VORVJBVEVfVE9LRU5fUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8U2Vzc2lvbkV4dGVuc2lvbj4gPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFO1xuICAgIHB1YmxpYyByZWFkb25seSBzZXNzaW9uczogVGFibGU8QXBwPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25PYnNlcnZlcnMgPSBuZXcgSWRlbnRpZmllck1hcDxTZXNzaW9uT2JzZXJ2ZXI+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZEFwcHMgPSBuZXcgSWRlbnRpZmllclNldCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFJFUVVJUkVfQVBQU19QQUNLRVRfVFlQRSxcbiAgICAgICAgICAgIFNFU1NJT05fT0JTRVJWRV9QQUNLRVRfVFlQRSxcbiAgICAgICAgICAgIFNFU1NJT05fQ09OTkVDVEVEX1BBQ0tFVF9UWVBFLFxuICAgICAgICAgICAgU0VTU0lPTl9ESVNDT05ORUNURURfUEFDS0VUX1RZUEUsXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoXG4gICAgICAgICAgICBTRVNTSU9OX0NPTk5FQ1RFRF9QQUNLRVRfVFlQRSwgKGFwcCkgPT4gdGhpcy5oYW5kbGVTZXNzaW9uQ29ubmVjdChhcHApLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFxuICAgICAgICAgICAgU0VTU0lPTl9ESVNDT05ORUNURURfUEFDS0VUX1RZUEUsIChhcHApID0+IHRoaXMuaGFuZGxlU2Vzc2lvbkRpc2Nvbm5lY3QoYXBwKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXNzaW9ucyA9IG9tdS50YWJsZXMuZ2V0KFNFU1NJT05fVEFCTEVfVFlQRSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgICAgIG9tdS5vblJlYWR5KCgpID0+IHRoaXMub25SZWFkeSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzKGlkOiBJbnRvSWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2Vzc2lvbnMuaGFzKElkZW50aWZpZXIuZnJvbShpZCkua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvYnNlcnZlKGFwcElkOiBJbnRvSWQsIHtcbiAgICAgICAgb25Db25uZWN0LFxuICAgICAgICBvbkRpc2Nvbm5lY3QsXG4gICAgfToge1xuICAgICAgICBvbkNvbm5lY3QoYXBwOiBBcHApOiB2b2lkO1xuICAgICAgICBvbkRpc2Nvbm5lY3QoYXBwOiBBcHApOiB2b2lkO1xuICAgIH0pOiBTZXNzaW9uT2JzZXJ2ZXIge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbShhcHBJZCk7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFNFU1NJT05fT0JTRVJWRV9QQUNLRVRfVFlQRSwgW2lkXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLnNlc3Npb25PYnNlcnZlcnMuZ2V0KGlkKSA/PyBuZXcgU2Vzc2lvbk9ic2VydmVyKFtdLCBbXSk7XG4gICAgICAgIG9ic2VydmVyLm9uQ29ubmVjdChvbkNvbm5lY3QpO1xuICAgICAgICBvYnNlcnZlci5vbkRpc2Nvbm5lY3Qob25EaXNjb25uZWN0KTtcbiAgICAgICAgdGhpcy5zZXNzaW9uT2JzZXJ2ZXJzLnNldChpZCwgb2JzZXJ2ZXIpO1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZXNzaW9uQ29ubmVjdChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IHRoaXMuc2Vzc2lvbk9ic2VydmVycy5nZXQoYXBwLmlkKTtcbiAgICAgICAgaWYgKCFvYnNlcnZlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2Ygb2JzZXJ2ZXIub25Db25uZWN0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBhd2FpdCBjYWxsYmFjayhhcHApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZXNzaW9uRGlzY29ubmVjdChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IHRoaXMuc2Vzc2lvbk9ic2VydmVycy5nZXQoYXBwLmlkKTtcbiAgICAgICAgaWYgKCFvYnNlcnZlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2Ygb2JzZXJ2ZXIub25EaXNjb25uZWN0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBhd2FpdCBjYWxsYmFjayhhcHApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlcXVpcmUoLi4uYXBwSWRzOiBJbnRvSWRbXSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVxdWlyZSBhcHBzIGFmdGVyIHRoZSBjbGllbnQgaGFzIHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGFwcElkIG9mIGFwcElkcykge1xuICAgICAgICAgICAgdGhpcy5yZXF1aXJlZEFwcHMuYWRkKElkZW50aWZpZXIuZnJvbShhcHBJZCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblRhc2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkQXBwcy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVSVJFX0FQUFNfUEFDS0VUX1RZUEUsIEFycmF5LmZyb20odGhpcy5yZXF1aXJlZEFwcHMudmFsdWVzKCkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25SZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbk9ic2VydmVycy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChTRVNTSU9OX09CU0VSVkVfUEFDS0VUX1RZUEUsIEFycmF5LmZyb20odGhpcy5zZXNzaW9uT2JzZXJ2ZXJzLmtleXMoKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3RSZW1vdGVBcHAob3B0aW9uczoge1xuICAgICAgICBhcHA6IEFwcDtcbiAgICAgICAgcGVybWlzc2lvbnM6IEludG9JZFtdO1xuICAgIH0pOiBQcm9taXNlPFJlcXVlc3RSZW1vdGVBcHBSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCB7IGFwcCB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKCFhcHAudXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcCBtdXN0IGhhdmUgYSBVUkwgdG8gcmVxdWVzdCBpdCByZW1vdGVseScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcHAudHlwZSAhPT0gJ3JlbW90ZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIG11c3QgYmUgYSByZW1vdGUgYXBwIHRvIHJlcXVlc3QgaXQgcmVtb3RlbHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFwcC5tZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHAgbXVzdCBoYXZlIG1ldGFkYXRhIHRvIHJlcXVlc3QgaXQgcmVtb3RlbHknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoUkVNT1RFX0FQUF9SRVFVRVNUX0VORFBPSU5UX1RZUEUsIHtcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShvcHRpb25zLmFwcCksXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogb3B0aW9ucy5wZXJtaXNzaW9ucy5tYXAoaWQgPT4gSWRlbnRpZmllci5mcm9tKGlkKS5rZXkoKSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZVRva2VuKG9wdGlvbnM6IHtcbiAgICAgICAgYXBwOiBBcHA7XG4gICAgICAgIHBlcm1pc3Npb25zOiBJbnRvSWRbXTtcbiAgICB9KTogUHJvbWlzZTxHZW5lcmF0ZVRva2VuUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub211LmVuZHBvaW50cy5jYWxsKEdFTkVSQVRFX1RPS0VOX0VORFBPSU5UX1RZUEUsIHtcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShvcHRpb25zLmFwcCksXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogb3B0aW9ucy5wZXJtaXNzaW9ucy5tYXAoaWQgPT4gSWRlbnRpZmllci5mcm9tKGlkKS5rZXkoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB7IFNpZ25hbFBlcm1pc3Npb25zLCBTaWduYWxQZXJtaXNzaW9uc0pTT04gfSBmcm9tICcuL3NpZ25hbC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaWduYWxQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5OiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFNpZ25hbFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShwYWNrZXQuYm9keSk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogU2lnbmFsUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxQYWNrZXQoaWQsIGJvZHkpO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIFNpZ25hbFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uczogU2lnbmFsUGVybWlzc2lvbnNKU09OO1xufVxuXG5leHBvcnQgY2xhc3MgU2lnbmFsUmVnaXN0ZXJQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uczogU2lnbmFsUGVybWlzc2lvbnMsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBTaWduYWxSZWdpc3RlclBhY2tldCk6IFNpZ25hbFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBwYWNrZXQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogcGFja2V0LmlkLmtleSgpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5hbGwpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGxpc3RlbjogcGVybXMubGlzdGVuID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLmxpc3Rlbikua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2VuZDogcGVybXMuc2VuZCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5zZW5kKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBTaWduYWxSZWdpc3RlclBhY2tldEpTT04pOiBTaWduYWxSZWdpc3RlclBhY2tldCB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBkYXRhO1xuICAgICAgICByZXR1cm4gbmV3IFNpZ25hbFJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuaWQpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFsbDogcGVybXMuYWxsID8gSWRlbnRpZmllci5mcm9tS2V5KHBlcm1zLmFsbCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbGlzdGVuOiBwZXJtcy5saXN0ZW4gPyBJZGVudGlmaWVyLmZyb21LZXkocGVybXMubGlzdGVuKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzZW5kOiBwZXJtcy5zZW5kID8gSWRlbnRpZmllci5mcm9tS2V5KHBlcm1zLnNlbmQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcm1pc3Npb25zSlNPTiB7XG4gICAgYWxsPzogc3RyaW5nO1xuICAgIGxpc3Rlbj86IHN0cmluZztcbiAgICBzZW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcm1pc3Npb25zIHtcbiAgICBhbGw/OiBJbnRvSWQgfCB1bmRlZmluZWQ7XG4gICAgbGlzdGVuPzogSW50b0lkIHwgdW5kZWZpbmVkO1xuICAgIHNlbmQ/OiBJbnRvSWQgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTaWduYWxUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFNpZ25hbFBlcm1pc3Npb25zLFxuICAgICkge31cblxuICAgIHN0YXRpYyBjcmVhdGVKc29uPFQ+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgYW55PjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zPzogU2lnbmFsUGVybWlzc2lvbnM7XG4gICAgICAgIH0sXG4gICAgKTogU2lnbmFsVHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmFsVHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5vZjxULCBhbnk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCkpLnRvSnNvbigpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMgPz8ge30sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8VD4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgICAgICAgICAgcGVybWlzc2lvbnM/OiBTaWduYWxQZXJtaXNzaW9ucztcbiAgICAgICAgfSxcbiAgICApOiBTaWduYWxUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxUeXBlKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMgPz8ge30sXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbDxUPiB7XG4gICAgbGlzdGVuKGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gdm9pZCk6IFVubGlzdGVuO1xuICAgIG5vdGlmeShib2R5OiBUKTogdm9pZDtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlLCB0eXBlIEV4dGVuc2lvbiB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBTaWduYWxQYWNrZXQsIFNpZ25hbFJlZ2lzdGVyUGFja2V0IH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcbmltcG9ydCB7IFNpZ25hbFR5cGUsIHR5cGUgU2lnbmFsIH0gZnJvbSAnLi9zaWduYWwuanMnO1xuXG5leHBvcnQgY29uc3QgU0lHTkFMX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFNpZ25hbEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnc2lnbmFsJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBTaWduYWxFeHRlbnNpb24ob211KSxcbik7XG5cbmNvbnN0IFNJR05BTF9SRUdJU1RFUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248U2lnbmFsUmVnaXN0ZXJQYWNrZXQ+KFNJR05BTF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWdpc3RlcicsXG4gICAgc2VyaWFsaXplcjogU2lnbmFsUmVnaXN0ZXJQYWNrZXQsXG59KTtcbmNvbnN0IFNJR05BTF9MSVNURU5fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KFNJR05BTF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFNJR05BTF9OT1RJRllfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNpZ25hbFBhY2tldD4oU0lHTkFMX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ25vdGlmeScsXG4gICAgc2VyaWFsaXplcjogU2lnbmFsUGFja2V0LFxufSk7XG5cbmV4cG9ydCBjbGFzcyBTaWduYWxFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFNpZ25hbEV4dGVuc2lvbj4gPSBTSUdOQUxfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzaWduYWxzID0gbmV3IElkZW50aWZpZXJNYXA8U2lnbmFsVHlwZTx1bmtub3duPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBTSUdOQUxfUkVHSVNURVJfUEFDS0VULFxuICAgICAgICAgICAgU0lHTkFMX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBTSUdOQUxfTk9USUZZX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVNpZ25hbDxUPihzaWduYWxUeXBlOiBTaWduYWxUeXBlPFQ+KTogU2lnbmFsPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmFscy5oYXMoc2lnbmFsVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2lnbmFsIGZvciBrZXkgJHtzaWduYWxUeXBlLmlkfSBhbHJlYWR5IGNyZWF0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFNpZ25hbEltcGwodGhpcy5vbXUsIHNpZ25hbFR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBqc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD4gfSk6IFNpZ25hbDxUPiB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBTaWduYWxUeXBlLmNyZWF0ZUpzb248VD4oaWQsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zPy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbmFsKHR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4gfSk6IFNpZ25hbDxUPiB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBTaWduYWxUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VD4oaWQsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zPy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbmFsKHR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4oc2lnbmFsVHlwZTogU2lnbmFsVHlwZTxUPik6IFNpZ25hbDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25hbChzaWduYWxUeXBlKTtcbiAgICB9XG59XG5cbmNsYXNzIFNpZ25hbEltcGw8VD4gaW1wbGVtZW50cyBTaWduYWw8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiAoKHZhbHVlOiBUKSA9PiB2b2lkKVtdID0gW107XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmcgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IFNpZ25hbFR5cGU8VD4sXG4gICAgKSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoU0lHTkFMX05PVElGWV9QQUNLRVQsIChkYXRhKSA9PiB0aGlzLmhhbmRsZUJyb2FkY2FzdChkYXRhKSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5vdGlmeShib2R5OiBUKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnR5cGUuc2VyaWFsaXplci5zZXJpYWxpemUoYm9keSk7XG4gICAgICAgIHRoaXMub211LnNlbmQoU0lHTkFMX05PVElGWV9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgbGlzdGVuZXIoYm9keSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChTSUdOQUxfTElTVEVOX1BBQ0tFVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UodGhpcy5saXN0ZW5lcnMuaW5kZXhPZihoYW5kbGVyKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVCcm9hZGNhc3QoZGF0YTogU2lnbmFsUGFja2V0KTogdm9pZCB7XG4gICAgICAgIGlmICghZGF0YS5pZC5pc0VxdWFsKHRoaXMudHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBib2R5ID0gdGhpcy50eXBlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YS5ib2R5KTtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgbGlzdGVuZXIoYm9keSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUuaWQuaXNTdWJwYXRoT2YodGhpcy5vbXUuYXBwLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub211LnNlbmQoU0lHTkFMX1JFR0lTVEVSX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMudHlwZS5pZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB0aGlzLnR5cGUucGVybWlzc2lvbnMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgRGlzY29ubmVjdFR5cGUgfSBmcm9tICcuL25ldHdvcmsvcGFja2V0L3BhY2tldC10eXBlcy5qcyc7XG5leHBvcnQgY2xhc3MgT211RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcihtZXNzYWdlID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb25uZWN0UmVhc29uIGV4dGVuZHMgT211RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgdHlwZTogRGlzY29ubmVjdFR5cGUsXG4gICAgICAgIHB1YmxpYyBtZXNzYWdlID0gJycsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcnZlclJlc3RhcnQgZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuU0VSVkVSX1JFU1RBUlQsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFub3RoZXJDb25uZWN0aW9uIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLkFOT1RIRVJfQ09OTkVDVElPTiwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbkRlbmllZCBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5QRVJNSVNTSU9OX0RFTklFRCwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXBwUmVtb3ZlZCBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5BUFBfUkVNT1ZFRCwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFRva2VuIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLklOVkFMSURfVE9LRU4sIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRPcmlnaW4gZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9PUklHSU4sIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRWZXJzaW9uIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLklOVkFMSURfVkVSU0lPTiwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFBhY2tldCBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5JTlZBTElEX1BBQ0tFVCwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxFcnJvciBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5JTlRFUk5BTF9FUlJPUiwgbWVzc2FnZSk7XG4gICAgfVxufVxuIiwKICAgICJleHBvcnQgY29uc3QgVkVSU0lPTiA9ICcwLjkuMjYnO1xuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2V0LCBQYWNrZXREYXRhLCBQYWNrZXRUeXBlIH0gZnJvbSAnLi9wYWNrZXQnO1xuXG5leHBvcnQgY2xhc3MgUGFja2V0TWFwcGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlPFBhY2tldCwgUGFja2V0RGF0YT4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0TWFwID0gbmV3IElkZW50aWZpZXJNYXA8UGFja2V0VHlwZTx1bmtub3duPj4oKTtcblxuICAgIHB1YmxpYyByZWdpc3RlciguLi5wYWNrZXRUeXBlczogUGFja2V0VHlwZTx1bmtub3duPltdKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBwYWNrZXRUeXBlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFja2V0TWFwLmhhcyh0eXBlLmlkKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2V0IGlkICR7dHlwZS5pZC5rZXkoKX0gYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBhY2tldE1hcC5zZXQodHlwZS5pZCwgdHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUocGFja2V0OiBQYWNrZXQpOiBQYWNrZXREYXRhIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IHBhY2tldC50eXBlLmlkLmtleSgpLFxuICAgICAgICAgICAgZGF0YTogcGFja2V0LnR5cGUuc2VyaWFsaXplci5zZXJpYWxpemUocGFja2V0LmRhdGEpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGRlc2VyaWFsaXplKGRhdGE6IFBhY2tldERhdGEpOiBQYWNrZXQge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KGRhdGEudHlwZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnBhY2tldE1hcC5nZXQoaWRlbnRpZmllcik7XG4gICAgICAgIGlmICghdHlwZSkgdGhyb3cgbmV3IEVycm9yKGBQYWNrZXQgdHlwZSAke2RhdGEudHlwZX0gbm90IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBkYXRhOiB0eXBlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YS5kYXRhKSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwb3J0IHtcbiAgICBjb25uZWN0KCk6IFByb21pc2U8Q29ubmVjdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbiB7XG4gICAgc2VuZChwYWNrZXQ6IFBhY2tldCwgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFBhY2tldCwgUGFja2V0RGF0YT4pOiB2b2lkO1xuICAgIHJlY2VpdmUoc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFBhY2tldCwgUGFja2V0RGF0YT4pOiBQcm9taXNlPFBhY2tldCB8IG51bGw+O1xuICAgIGNsb3NlKCk6IHZvaWQ7XG4gICAgY2xvc2VkOiBib29sZWFuO1xufVxuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdCc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFBhY2tldCwgUGFja2V0RGF0YSB9IGZyb20gJy4vcGFja2V0JztcbmltcG9ydCB7IFBBQ0tFVF9UWVBFUyB9IGZyb20gJy4vcGFja2V0L3BhY2tldC10eXBlcyc7XG5cbmZ1bmN0aW9uIGJhc2U2NFVybEVuY29kZShidWZmZXI6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWZmZXJcbiAgICAgICAgLnRvQmFzZTY0KClcbiAgICAgICAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxuICAgICAgICAucmVwbGFjZSgvPS9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFVybERlY29kZShkYXRhOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICBkYXRhID0gZGF0YS5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChkYXRhLmxlbmd0aCAlIDQpIHtcbiAgICAgICAgZGF0YSArPSAnPSc7XG4gICAgfVxuICAgIHJldHVybiBVaW50OEFycmF5LmZyb21CYXNlNjQoZGF0YSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcih1ODogVWludDhBcnJheSk6IEFycmF5QnVmZmVyIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIodTgubGVuZ3RoKTtcbiAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICB2aWV3LnNldCh1OCk7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxudHlwZSBSU0FOdW1iZXJzID0ge1xuICAgIGU6IHN0cmluZztcbiAgICBuOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBFbmNyeXB0aW9uUmVzcG9uc2UgPSB7XG4gICAga2luZDogJ3YxJztcbiAgICByc2E6IFJTQU51bWJlcnM7XG4gICAgYWVzOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgRU5DUllQVElPTl9BVkFJTEFCTEU6IGJvb2xlYW4gPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiAhIWNyeXB0by5zdWJ0bGU7XG5cbmV4cG9ydCBjbGFzcyBEZWNyeXB0b3Ige1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpdmF0ZUtleTogQ3J5cHRvS2V5LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHB1YmxpY0tleTogQ3J5cHRvS2V5LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbmV3KCk6IFByb21pc2U8RGVjcnlwdG9yPiB7XG4gICAgICAgIGNvbnN0IHsgcHJpdmF0ZUtleSwgcHVibGljS2V5IH0gPSBhd2FpdCBjcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCcsXG4gICAgICAgICAgICAgICAgbW9kdWx1c0xlbmd0aDogNDA5NixcbiAgICAgICAgICAgICAgICBwdWJsaWNFeHBvbmVudDogbmV3IFVpbnQ4QXJyYXkoWzEsIDAsIDFdKSxcbiAgICAgICAgICAgICAgICBoYXNoOiAnU0hBLTI1NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEZWNyeXB0b3IocHJpdmF0ZUtleSwgcHVibGljS2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdG9SZXF1ZXN0KCk6IFByb21pc2U8UlNBTnVtYmVycz4ge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmV4cG9ydEtleSgnandrJywgdGhpcy5wdWJsaWNLZXkpO1xuICAgICAgICBpZiAoIWtleS5lKSB0aHJvdyBuZXcgRXJyb3IoJ0tleSBleHBvcnQgZmFpbGVkOiBtaXNzaW5nIGV4cG9uZW50Jyk7XG4gICAgICAgIGlmICgha2V5Lm4pIHRocm93IG5ldyBFcnJvcignS2V5IGV4cG9ydCBmYWlsZWQ6IG1pc3NpbmcgbW9kdWx1cycpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZToga2V5LmUsXG4gICAgICAgICAgICBuOiBrZXkubixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVjcnlwdChkYXRhOiBBcnJheUJ1ZmZlcik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgICAgeyBuYW1lOiAnUlNBLU9BRVAnIH0sXG4gICAgICAgICAgICB0aGlzLnByaXZhdGVLZXksXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZGVjcnlwdGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWNyeXB0U3RyaW5nKGRhdGE6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHsgbmFtZTogJ1JTQS1PQUVQJyB9LFxuICAgICAgICAgICAgdGhpcy5wcml2YXRlS2V5LFxuICAgICAgICAgICAgY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKGJhc2U2NFVybERlY29kZShkYXRhKSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0ZXh0RGVjb2Rlci5kZWNvZGUoZGVjcnlwdGVkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmNyeXB0b3Ige1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHVibGljS2V5OiBDcnlwdG9LZXksXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBuZXcocmVxdWVzdDogUlNBTnVtYmVycyk6IFByb21pc2U8RW5jcnlwdG9yPiB7XG4gICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAgICAgJ2p3aycsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWxnOiAnUlNBLU9BRVAtMjU2JyxcbiAgICAgICAgICAgICAgICBleHQ6IHRydWUsXG4gICAgICAgICAgICAgICAga2V5X29wczogWydlbmNyeXB0J10sXG4gICAgICAgICAgICAgICAga3R5OiAnUlNBJyxcbiAgICAgICAgICAgICAgICBlOiByZXF1ZXN0LmUucmVwbGFjZSgvPSskLywgJycpLFxuICAgICAgICAgICAgICAgIG46IHJlcXVlc3Qubi5yZXBsYWNlKC89KyQvLCAnJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCcsXG4gICAgICAgICAgICAgICAgaGFzaDogJ1NIQS0yNTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmNyeXB0b3IocHVibGljS2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5jcnlwdChkYXRhOiBBcnJheUJ1ZmZlcik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMucHVibGljS2V5LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5jcnlwdFN0cmluZyhkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgIHRleHRFbmNvZGVyLmVuY29kZShkYXRhKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGJhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShlbmNyeXB0ZWQpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBRVMge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkga2V5OiBDcnlwdG9LZXksXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaXY6IEFycmF5QnVmZmVyLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbmV3KCk6IFByb21pc2U8QUVTPiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DQkMnLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTI4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpdiA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBRVMoa2V5LCBpdi5idWZmZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZGVzZXJpYWxpemUoYWVzOiBzdHJpbmcsIGRlY3J5cHRvcjogRGVjcnlwdG9yKTogUHJvbWlzZTxBRVM+IHtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjcnlwdG9yLmRlY3J5cHQoY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKGJhc2U2NFVybERlY29kZShhZXMpKSk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbUFycmF5QnVmZmVyKGRlY3J5cHRlZCk7XG4gICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICBjb25zdCBpdiA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuXG4gICAgICAgIGNvbnN0IGtleV9lbmNvZGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICAgICAgICAncmF3JyxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihrZXkpLFxuICAgICAgICAgICAgJ0FFUy1DQkMnLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IEFFUyhcbiAgICAgICAgICAgIGtleV9lbmNvZGVkLFxuICAgICAgICAgICAgY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKGl2KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VyaWFsaXplKGVuY3J5cHRvcjogRW5jcnlwdG9yKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoJ3JhdycsIHRoaXMua2V5KTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShuZXcgVWludDhBcnJheShyYXdLZXkpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShuZXcgVWludDhBcnJheSh0aGlzLml2KSk7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IGVuY3J5cHRvci5lbmNyeXB0KGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcih3cml0ZXIuZmluaXNoKCkpKTtcbiAgICAgICAgcmV0dXJuIGJhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShlbmNyeXB0ZWQpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5jcnlwdChkYXRhOiBQYWNrZXREYXRhKTogUHJvbWlzZTxQYWNrZXQ+IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGRhdGEudHlwZSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoZGF0YS5kYXRhKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJyxcbiAgICAgICAgICAgICAgICBpdjogdGhpcy5pdixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMua2V5LFxuICAgICAgICAgICAgY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKHdyaXRlci5maW5pc2goKSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBQQUNLRVRfVFlQRVMuRU5DUllQVEVEX1BBQ0tFVC5uZXcobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlY3J5cHQocGFja2V0OiBQYWNrZXQ8VWludDhBcnJheT4pOiBQcm9taXNlPFBhY2tldERhdGE+IHtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJyxcbiAgICAgICAgICAgICAgICBpdjogdGhpcy5pdixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMua2V5LFxuICAgICAgICAgICAgY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKHBhY2tldC5kYXRhKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tQXJyYXlCdWZmZXIoZGVjcnlwdGVkKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBZGRyZXNzIH0gZnJvbSAnLi4vYWRkcmVzcy5qcyc7XG5pbXBvcnQge1xuICAgIEFub3RoZXJDb25uZWN0aW9uLCBBcHBSZW1vdmVkLCBEaXNjb25uZWN0UmVhc29uLCBJbnRlcm5hbEVycm9yLFxuICAgIEludmFsaWRPcmlnaW4sXG4gICAgSW52YWxpZFBhY2tldCxcbiAgICBJbnZhbGlkVG9rZW4sXG4gICAgSW52YWxpZFZlcnNpb24sXG4gICAgUGVybWlzc2lvbkRlbmllZCxcbiAgICBTZXJ2ZXJSZXN0YXJ0LFxufSBmcm9tICcuLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211LmpzJztcbmltcG9ydCB0eXBlIHsgVG9rZW5Qcm92aWRlciB9IGZyb20gJy4uL3Rva2VuLmpzJztcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuLi92ZXJzaW9uLmpzJztcblxuaW1wb3J0IHR5cGUgeyBDb25uZWN0aW9uLCBUcmFuc3BvcnQgfSBmcm9tICcuL2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgUGFja2V0TWFwcGVyIH0gZnJvbSAnLi9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB7IEFFUywgRGVjcnlwdG9yLCBFTkNSWVBUSU9OX0FWQUlMQUJMRSwgRW5jcnlwdGlvblJlc3BvbnNlLCBFbmNyeXB0b3IgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgQ29ubmVjdFBhY2tldCwgRGlzY29ubmVjdFR5cGUsIFBBQ0tFVF9UWVBFUyB9IGZyb20gJy4vcGFja2V0L3BhY2tldC10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2tldCwgUGFja2V0VHlwZSB9IGZyb20gJy4vcGFja2V0L3BhY2tldC5qcyc7XG5cbnR5cGUgUGFja2V0SGFuZGxlcjxUPiA9IHtcbiAgICByZWFkb25seSB0eXBlOiBQYWNrZXRUeXBlPFQ+O1xuICAgIGV2ZW50OiBFdmVudEVtaXR0ZXI8W1RdPjtcbn07XG5cbnR5cGUgU3RhdHVzVHlwZTxUPiA9IHtcbiAgICB0eXBlOiBUO1xufTtcblxuZXhwb3J0IHR5cGUgTmV0d29ya1N0YXR1cyA9IFN0YXR1c1R5cGU8J2Nvbm5lY3RpbmcnPiB8IFN0YXR1c1R5cGU8J2Nvbm5lY3RlZCc+IHwgU3RhdHVzVHlwZTwncmVhZHknPiB8IHtcbiAgICB0eXBlOiAnZGlzY29ubmVjdGVkJztcbiAgICBhdHRlbXB0PzogbnVtYmVyO1xuICAgIHJlYXNvbj86IERpc2Nvbm5lY3RSZWFzb247XG59IHwge1xuICAgIHR5cGU6ICdyZWNvbm5lY3RpbmcnO1xuICAgIGF0dGVtcHQ6IG51bWJlcjtcbiAgICB0aW1lb3V0OiBudW1iZXI7XG4gICAgZGF0ZTogRGF0ZTtcbiAgICBjYW5jZWw6ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgY2xhc3MgTmV0d29yayB7XG4gICAgcHVibGljIHN0YXR1czogTmV0d29ya1N0YXR1cyA9IHsgdHlwZTogJ2Rpc2Nvbm5lY3RlZCcgfTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZXZlbnQ6IHsgY29ubmVjdGVkOiBFdmVudEVtaXR0ZXI8W10+OyBkaXNjb25uZWN0ZWQ6IEV2ZW50RW1pdHRlcjxbRGlzY29ubmVjdFJlYXNvbiB8IHVuZGVmaW5lZF0+OyBwYWNrZXQ6IEV2ZW50RW1pdHRlcjxbUGFja2V0PHVua25vd24+XT47IHN0YXR1czogRXZlbnRFbWl0dGVyPFtOZXR3b3JrU3RhdHVzXT4gfSA9IHtcbiAgICAgICAgY29ubmVjdGVkOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgIGRpc2Nvbm5lY3RlZDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICBwYWNrZXQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgc3RhdHVzOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgfTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhc2tzOiBBcnJheTwoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldE1hcHBlciA9IG5ldyBQYWNrZXRNYXBwZXIoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldEhhbmRsZXJzID0gbmV3IElkZW50aWZpZXJNYXA8UGFja2V0SGFuZGxlcjx1bmtub3duPj4oKTtcbiAgICBwcml2YXRlIGxpc3RlblRhc2s6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgcHVibGljIHJlYXNvbjogRGlzY29ubmVjdFJlYXNvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGF0dGVtcHQgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgICAgIHB1YmxpYyBhZGRyZXNzOiBBZGRyZXNzLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHRva2VuUHJvdmlkZXI6IFRva2VuUHJvdmlkZXIsXG4gICAgICAgIHByaXZhdGUgdHJhbnNwb3J0OiBUcmFuc3BvcnQsXG4gICAgICAgIHByaXZhdGUgY29ubmVjdGlvbj86IENvbm5lY3Rpb24gfCB1bmRlZmluZWQsXG4gICAgICAgIHByaXZhdGUgYWVzPzogQUVTIHwgdW5kZWZpbmVkLFxuICAgICkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLlNFUlZFUl9NRVRBLFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLkNPTk5FQ1QsXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuRElTQ09OTkVDVCxcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5UT0tFTixcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5SRUFEWSxcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5FTkNSWVBURURfUEFDS0VULFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZFBhY2tldEhhbmRsZXIoUEFDS0VUX1RZUEVTLkRJU0NPTk5FQ1QsIGFzeW5jIChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChyZWFzb24udHlwZSA9PT0gRGlzY29ubmVjdFR5cGUuU0hVVERPV05cbiAgICAgICAgICAgICAgICB8fCByZWFzb24udHlwZSA9PT0gRGlzY29ubmVjdFR5cGUuQ0xPU0UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdkaXNjb25uZWN0ZWQnIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IEVSUk9SX01BUCA9IHtcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuQU5PVEhFUl9DT05ORUNUSU9OXTogQW5vdGhlckNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLlBFUk1JU1NJT05fREVOSUVEXTogUGVybWlzc2lvbkRlbmllZCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuQVBQX1JFTU9WRURdOiBBcHBSZW1vdmVkLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX1RPS0VOXTogSW52YWxpZFRva2VuLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX09SSUdJTl06IEludmFsaWRPcmlnaW4sXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfVkVSU0lPTl06IEludmFsaWRWZXJzaW9uLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlRFUk5BTF9FUlJPUl06IEludGVybmFsRXJyb3IsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfUEFDS0VUXTogSW52YWxpZFBhY2tldCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9QQUNLRVRfVFlQRV06IEludmFsaWRQYWNrZXQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfUEFDS0VUX0RBVEFdOiBJbnZhbGlkUGFja2V0LFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5TRVJWRVJfUkVTVEFSVF06IFNlcnZlclJlc3RhcnQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLkNMT1NFXTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5TSFVURE9XTl06IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IEVSUk9SX01BUFtyZWFzb24udHlwZV07XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYXNvbiA9IG5ldyBlcnJvcihyZWFzb24ubWVzc2FnZSA/PyAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZFBhY2tldEhhbmRsZXIoUEFDS0VUX1RZUEVTLlJFQURZLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMudHlwZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2ZWQgUkVBRFkgcGFja2V0IHdoZW4gYWxyZWFkeSByZWFkeScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAncmVhZHknIH0pO1xuICAgICAgICAgICAgdGhpcy5hdHRlbXB0ID0gMDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbm5lY3Rpb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0dXMudHlwZSAhPT0gJ2Rpc2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNoYW5nZSBjb25uZWN0aW9uIHdoaWxlIGNvbm5lY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyUGFja2V0KC4uLnBhY2tldFR5cGVzOiBQYWNrZXRUeXBlPHVua25vd24+W10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWNrZXRNYXBwZXIucmVnaXN0ZXIoLi4ucGFja2V0VHlwZXMpO1xuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgcGFja2V0VHlwZXMpIHtcbiAgICAgICAgICAgIHRoaXMucGFja2V0SGFuZGxlcnMuc2V0KHR5cGUuaWQsIHtcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRQYWNrZXRIYW5kbGVyPFQ+KHR5cGU6IFBhY2tldFR5cGU8VD4sIGhhbmRsZXI6IChwYWNrZXQ6IFQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5wYWNrZXRIYW5kbGVycy5nZXQodHlwZS5pZCkgYXMgUGFja2V0SGFuZGxlcjx1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2V0IHR5cGUgJHt0eXBlLmlkLmtleSgpfSBub3QgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIGxpc3RlbmVycy5ldmVudC5saXN0ZW4oaGFuZGxlciBhcyAocGFja2V0OiB1bmtub3duKSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNjaGVkdWxlUmVjb25uZWN0KGF0dGVtcHQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gTWF0aC5taW4oMzAwMDAsIDIwMDAgKiAoTWF0aC5wb3coMS41LCBhdHRlbXB0KSAtIDEpICsgMjAwMCk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHN0YXR1czogRXh0cmFjdDxOZXR3b3JrU3RhdHVzLCB7IHR5cGU6ICdyZWNvbm5lY3RpbmcnIH0+ID0ge1xuICAgICAgICAgICAgdHlwZTogJ3JlY29ubmVjdGluZycsXG4gICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBjYW5jZWw6ICgpID0+IHtjYW5jZWxsZWQgPSB0cnVlO30sXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0U3RhdHVzKHN0YXR1cyk7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZW1haW5pbmcgPSBzdGF0dXMudGltZW91dCAtIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGRhdGUuZ2V0VGltZSgpKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgcmVtYWluaW5nKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KHJlY29ubmVjdCA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb25uZWN0IHdoaWxlICR7dGhpcy5zdGF0dXMudHlwZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saXN0ZW5UYXNrKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25uZWN0IHdoaWxlIGFscmVhZHkgY29ubmVjdGluZycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdHRlbXB0ID0gMDtcbiAgICAgICAgd2hpbGUgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0ZW1wdCsrO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5jb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAnY29ubmVjdGluZycgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YVJlY2VpdmVkID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLnJlY2VpdmUodGhpcy5wYWNrZXRNYXBwZXIpO1xuICAgICAgICAgICAgICAgIGlmICghbWV0YVJlY2VpdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiBjbG9zZWQgYmVmb3JlIHJlY2VpdmluZyBzZXJ2ZXIgbWV0YScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIVBBQ0tFVF9UWVBFUy5TRVJWRVJfTUVUQS5tYXRjaChtZXRhUmVjZWl2ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgcGFja2V0IHJlY2VpdmVkIHdhcyBub3Qgc2VydmVyIG1ldGEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBtZXRhIH0gPSBtZXRhUmVjZWl2ZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzLmhhc2ggPSBtZXRhLmhhc2g7XG4gICAgICAgICAgICAgICAgbGV0IHRva2VuID0gYXdhaXQgdGhpcy50b2tlblByb3ZpZGVyLmdldCh0aGlzLmFkZHJlc3MsIHRoaXMub211LmFwcCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuKGBObyB0b2tlbiBhdmFpbGFibGUgZm9yIGFwcCAke3RoaXMub211LmFwcC5pZC5rZXkoKX0gYXQgJHt0aGlzLmFkZHJlc3MuaG9zdH06JHt0aGlzLmFkZHJlc3MucG9ydH06JHt0aGlzLmFkZHJlc3MuaGFzaH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGVuY3J5cHRpb25SZXNwOiBFbmNyeXB0aW9uUmVzcG9uc2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub211LmFwcC50eXBlID09PSAncmVtb3RlJyAmJiBFTkNSWVBUSU9OX0FWQUlMQUJMRSAmJiBtZXRhLmVuY3J5cHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcnlwdG9yID0gYXdhaXQgRGVjcnlwdG9yLm5ldygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNyeXB0b3IgPSBhd2FpdCBFbmNyeXB0b3IubmV3KG1ldGEuZW5jcnlwdGlvbi5yc2EpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gYXdhaXQgZW5jcnlwdG9yLmVuY3J5cHRTdHJpbmcodG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWVzID0gYXdhaXQgQUVTLm5ldygpO1xuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uUmVzcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICd2MScsXG4gICAgICAgICAgICAgICAgICAgICAgICByc2E6IGF3YWl0IGRlY3J5cHRvci50b1JlcXVlc3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFlczogYXdhaXQgdGhpcy5hZXMuc2VyaWFsaXplKGVuY3J5cHRvciksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogUEFDS0VUX1RZUEVTLkNPTk5FQ1QsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG5ldyBDb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogdGhpcy5vbXUuYXBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2w6IHsgdmVyc2lvbjogVkVSU0lPTiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbjogZW5jcnlwdGlvblJlc3AsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSwgdGhpcy5wYWNrZXRNYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuVGFzayA9IHRoaXMubGlzdGVuKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAnY29ubmVjdGVkJyB9KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2ZW50LmNvbm5lY3RlZC5lbWl0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaFRhc2tzKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQQUNLRVRfVFlQRVMuUkVBRFksXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxpc3RlblRhc2s7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIERpc2Nvbm5lY3RSZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFzb24gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50LmRpc2Nvbm5lY3RlZC5lbWl0KHRoaXMucmVhc29uKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMudHlwZSAhPT0gJ2Rpc2Nvbm5lY3RlZCcgJiYgdGhpcy5zdGF0dXMudHlwZSAhPT0gJ3JlY29ubmVjdGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAnZGlzY29ubmVjdGVkJywgYXR0ZW1wdDogdGhpcy5hdHRlbXB0LCByZWFzb246IHRoaXMucmVhc29uIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24/LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuVGFzayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnJlYXNvbiAmJiAhW1xuICAgICAgICAgICAgICAgIERpc2Nvbm5lY3RUeXBlLlNIVVRET1dOLFxuICAgICAgICAgICAgICAgIERpc2Nvbm5lY3RUeXBlLlNFUlZFUl9SRVNUQVJULFxuICAgICAgICAgICAgXS5pbmNsdWRlcyh0aGlzLnJlYXNvbi50eXBlKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFzb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIXJlY29ubmVjdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVjb25uZWN0ID0gYXdhaXQgdGhpcy5zY2hlZHVsZVJlY29ubmVjdCh0aGlzLmF0dGVtcHQpO1xuICAgICAgICAgICAgaWYgKCFzaG91bGRSZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdkaXNjb25uZWN0ZWQnLCByZWFzb246IHRoaXMucmVhc29uIH0pO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24/LmNsb3NlKCk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU3RhdGUoc3RhdGU6IE5ldHdvcmtTdGF0dXNbJ3R5cGUnXSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXMudHlwZSA9PT0gc3RhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmQocGFja2V0OiBQYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFlcykge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMucGFja2V0TWFwcGVyLnNlcmlhbGl6ZShwYWNrZXQpO1xuICAgICAgICAgICAgcGFja2V0ID0gYXdhaXQgdGhpcy5hZXMuZW5jcnlwdChzZXJpYWxpemVkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZChwYWNrZXQsIHRoaXMucGFja2V0TWFwcGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxpc3RlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLnJlY2VpdmUodGhpcy5wYWNrZXRNYXBwZXIpO1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hQYWNrZXQocGFja2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hQYWNrZXQocGFja2V0OiBQYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKFBBQ0tFVF9UWVBFUy5FTkNSWVBURURfUEFDS0VULm1hdGNoKHBhY2tldCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hZXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmVkIGVuY3J5cHRlZCBwYWNrZXQgYmVmb3JlIGVuY3J5cHRpb24gd2FzIGVzdGFibGlzaGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCB0aGlzLmFlcy5kZWNyeXB0KHBhY2tldCk7XG4gICAgICAgICAgICBwYWNrZXQgPSB0aGlzLnBhY2tldE1hcHBlci5kZXNlcmlhbGl6ZShkZWNyeXB0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZXZlbnQucGFja2V0LmVtaXQocGFja2V0KTtcbiAgICAgICAgY29uc3QgcGFja2V0SGFuZGxlciA9IHRoaXMucGFja2V0SGFuZGxlcnMuZ2V0KHBhY2tldC50eXBlLmlkKTtcbiAgICAgICAgaWYgKCFwYWNrZXRIYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgcGFja2V0SGFuZGxlci5ldmVudC5lbWl0KHBhY2tldC5kYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkVGFzayh0YXNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIHRhc2sgYWZ0ZXIgY2xpZW50IGlzIHJlYWR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YXNrcy5wdXNoKHRhc2spO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVUYXNrKHRhc2s6ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGFza3Muc3BsaWNlKHRoaXMudGFza3MuaW5kZXhPZih0YXNrKSwgMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFRhc2tzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICAgICAgYXdhaXQgdGFzaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRTdGF0dXMoc3RhdHVzOiBOZXR3b3JrU3RhdHVzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gc3RhdHVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgc3RhdHVzIHRvICR7c3RhdHVzfSB3aGVuIGFscmVhZHkgJHtzdGF0dXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIGF3YWl0IHRoaXMuZXZlbnQuc3RhdHVzLmVtaXQoc3RhdHVzKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWRkcmVzcyB9IGZyb20gJy4uL2FkZHJlc3MuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB0eXBlIHsgQ29ubmVjdGlvbiwgVHJhbnNwb3J0IH0gZnJvbSAnLi9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2V0LCBQYWNrZXREYXRhIH0gZnJvbSAnLi9wYWNrZXQvcGFja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFRyYW5zcG9ydCBpbXBsZW1lbnRzIFRyYW5zcG9ydCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogQWRkcmVzcyxcbiAgICApIHsgfVxuXG4gICAgcHJpdmF0ZSBnZXQgd3NFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHRoaXMuYWRkcmVzcy5zZWN1cmUgPyAnd3NzJyA6ICd3cyc7XG4gICAgICAgIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gdGhpcy5hZGRyZXNzO1xuICAgICAgICByZXR1cm4gYCR7cHJvdG9jb2x9Oi8vJHtob3N0fToke3BvcnR9L3dzYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29ubmVjdCgpOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLndzRW5kcG9pbnQpO1xuICAgICAgICByZXR1cm4gV2Vic29ja2V0Q29ubmVjdGlvbi5mcm9tU29ja2V0KHNvY2tldCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2Vic29ja2V0Q29ubmVjdGlvbiBpbXBsZW1lbnRzIENvbm5lY3Rpb24ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0UXVldWU6IEFycmF5PFBhY2tldERhdGE+ID0gW107XG4gICAgcHJpdmF0ZSByZWNlaXZlV2FpdGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHJlYWRpbmdQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBiZWluZ0Nsb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgc29ja2V0OiBXZWJTb2NrZXQsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVNvY2tldChzb2NrZXQ6IFdlYlNvY2tldCk6IFByb21pc2U8V2Vic29ja2V0Q29ubmVjdGlvbj4ge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IFdlYnNvY2tldENvbm5lY3Rpb24oc29ja2V0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNvY2tldC5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5iZWluZ0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24ucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlY2VpdmVXYWl0ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWNlaXZlV2FpdGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IChldmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVhZGluZ1Byb21pc2UgPSBjb25uZWN0aW9uLm9uTWVzc2FnZShldmVudCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVhZGluZ1Byb21pc2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNvY2tldC5vbm9wZW4gPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25NZXNzYWdlKGV2ZW50OiBNZXNzYWdlRXZlbnQ8c3RyaW5nIHwgQmxvYj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBldmVudC5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBzdHJpbmcgZGF0YScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IGF3YWl0IEJ5dGVSZWFkZXIuZnJvbUJsb2IoZXZlbnQuZGF0YSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICB0eXBlOiByZWFkZXIucmVhZFN0cmluZygpLFxuICAgICAgICAgICAgZGF0YTogcmVhZGVyLnJlYWRVaW50OEFycmF5KCksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucGFja2V0UXVldWUucHVzaChkYXRhKTtcbiAgICAgICAgcmVhZGVyLmZpbmlzaCgpO1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWNlaXZlKHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxQYWNrZXQ8dW5rbm93bj4sIFBhY2tldERhdGE+KTogUHJvbWlzZTxQYWNrZXQgfCBudWxsPiB7XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVXYWl0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxyZWFkeSByZWNlaXZpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5wYWNrZXRRdWV1ZS5sZW5ndGggPT09IDAgJiYgIXRoaXMuYmVpbmdDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlaXZlV2FpdGVyID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlV2FpdGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYWNrZXRRdWV1ZS5sZW5ndGggPT09IDAgJiYgdGhpcy5iZWluZ0Nsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFja2V0RGF0YSA9IHRoaXMucGFja2V0UXVldWUuc2hpZnQoKSE7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKHBhY2tldERhdGEpO1xuICAgIH1cblxuICAgIGdldCBjbG9zZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRpbmdQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFja2V0UXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVXYWl0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0LkNMT1NFRCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuQ0xPU0lORykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlV2FpdGVyKCk7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VuZChwYWNrZXQ6IFBhY2tldCwgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFBhY2tldDx1bmtub3duPiwgUGFja2V0RGF0YT4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFja2V0RGF0YSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHBhY2tldCk7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXREYXRhLnR5cGUpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KHBhY2tldERhdGEuZGF0YSk7XG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQod3JpdGVyLmZpbmlzaCgpKTtcbiAgICB9XG59XG4iLAogICAgInR5cGUgT2s8VD4gPSB7XG4gICAgb2s6IHRydWU7XG4gICAgZGF0YTogVDtcbn07XG50eXBlIEVycjxFPiA9IHtcbiAgICBvazogZmFsc2U7XG4gICAgZGF0YTogRTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnlDYXRjaDxULCBFID0gRXJyb3I+KGZ1bmM6ICgpID0+IFQpOiBPazxUPiB8IEVycjxFPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IGZ1bmMoKSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBkYXRhOiBlIGFzIEUgfTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWRkcmVzcyB9IGZyb20gJy4vYWRkcmVzcy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnLi9hcHAuanMnO1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuL2hlbHBlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Qcm92aWRlciB7XG4gICAgZ2V0KHNlcnZlckFkZHJlc3M6IEFkZHJlc3MsIGFwcDogQXBwKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xufVxuXG5leHBvcnQgdHlwZSBTZXNzaW9uUGFyYW0gPSB7XG4gICAgYWRkcmVzczogQWRkcmVzcztcbiAgICB0b2tlbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJUb2tlblByb3ZpZGVyIGltcGxlbWVudHMgVG9rZW5Qcm92aWRlciB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBUT0tFTl9QQVJBTV9LRVkgPSAnX29tdV9zZXNzaW9uJztcblxuICAgIHByaXZhdGUgZ2V0S2V5KGFkZHJlc3M6IEFkZHJlc3MsIGFwcDogQXBwKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFthZGRyZXNzLmhvc3QsIGFkZHJlc3MucG9ydCwgYWRkcmVzcy5oYXNoID8/ICcnLCBhcHAuaWQua2V5KCldKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGFkZHJlc3M6IEFkZHJlc3MsIGFwcDogQXBwKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgZm91bmRUb2tlbiA9IHRoaXMucGFyc2VQYXJhbVNlc3Npb24oYWRkcmVzcyk7XG4gICAgICAgIGlmIChmb3VuZFRva2VuKSByZXR1cm4gZm91bmRUb2tlbjtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VQYXJhbVNlc3Npb24oYWRkcmVzczogQWRkcmVzcyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgY29uc3QgcGFyYW0gPSBzZWFyY2hQYXJhbXMuZ2V0KEJyb3dzZXJUb2tlblByb3ZpZGVyLlRPS0VOX1BBUkFNX0tFWSk7XG4gICAgICAgIGlmICghcGFyYW0pIHJldHVybjtcbiAgICAgICAgY29uc3QgeyBvaywgZGF0YTogc2Vzc2lvbiB9ID0gdHJ5Q2F0Y2g8U2Vzc2lvblBhcmFtPigoKSA9PiBKU09OLnBhcnNlKHBhcmFtKSk7XG4gICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHBhcnNlIHNlc3Npb24gZnJvbSBVUkwgcGFyYW1ldGVyOiAke3Nlc3Npb259YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXNzaW9uLmFkZHJlc3MuaGFzaCAhPT0gYWRkcmVzcy5oYXNoKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFNlc3Npb24gYWRkcmVzcyBoYXNoIGRvZXMgbm90IG1hdGNoOiBleHBlY3RlZCAke2FkZHJlc3MuaGFzaH0sIGdvdCAke3Nlc3Npb24uYWRkcmVzcy5oYXNofWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2Vzc2lvbi50b2tlbjtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEV4dGVuc2lvblJlZ2lzdHJ5IH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgQVNTRVRfRVhURU5TSU9OX1RZUEUsIHR5cGUgQXNzZXRFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9hc3NldC9leHRlbnNpb24nO1xuaW1wb3J0IHsgREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB0eXBlIERhc2hib2FyZEV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2Rhc2hib2FyZC9leHRlbnNpb24nO1xuaW1wb3J0IHsgRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUsIHR5cGUgRW5kcG9pbnRFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9lbmRwb2ludC9leHRlbnNpb24nO1xuaW1wb3J0IHsgSFRUUF9FWFRFTlNJT05fVFlQRSwgSHR0cEV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2h0dHAvZXh0ZW5zaW9uJztcbmltcG9ydCB7IEkxOE5fRVhURU5TSU9OX1RZUEUsIHR5cGUgSTE4bkV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2kxOG4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IExPR0dFUl9FWFRFTlNJT05fVFlQRSwgdHlwZSBMb2dnZXJFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9sb2dnZXIvZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUsIHR5cGUgUGVybWlzc2lvbkV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3Blcm1pc3Npb24vZXh0ZW5zaW9uJztcbmltcG9ydCB7IFBMVUdJTl9FWFRFTlNJT05fVFlQRSwgdHlwZSBQbHVnaW5FeHRlbnNpb24gfSBmcm9tICcuL2FwaS9wbHVnaW4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFJlZ2lzdHJ5RXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvcmVnaXN0cnkvZXh0ZW5zaW9uJztcbmltcG9ydCB7IFNFUlZFUl9FWFRFTlNJT05fVFlQRSwgdHlwZSBTZXJ2ZXJFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9zZXJ2ZXIvZXh0ZW5zaW9uJztcbmltcG9ydCB7IFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIFNlc3Npb25FeHRlbnNpb24gfSBmcm9tICcuL2FwaS9zZXNzaW9uJztcbmltcG9ydCB7IFNJR05BTF9FWFRFTlNJT05fVFlQRSwgdHlwZSBTaWduYWxFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9zaWduYWwvZXh0ZW5zaW9uJztcbmltcG9ydCB7IFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFRhYmxlRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvdGFibGUvZXh0ZW5zaW9uJztcbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnLi9hcHAuanMnO1xuaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4vZXZlbnQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi9ldmVudCc7XG5pbXBvcnQgdHlwZSB7IEFkZHJlc3MsIENvbm5lY3Rpb24gfSBmcm9tICcuL25ldHdvcmsnO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gJy4vbmV0d29yayc7XG5pbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tICcuL25ldHdvcmsvY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBQQUNLRVRfVFlQRVMgfSBmcm9tICcuL25ldHdvcmsvcGFja2V0L3BhY2tldC10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2tldFR5cGUgfSBmcm9tICcuL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJzb2NrZXRUcmFuc3BvcnQgfSBmcm9tICcuL25ldHdvcmsvd2Vic29ja2V0LXRyYW5zcG9ydCc7XG5pbXBvcnQgeyBCcm93c2VyVG9rZW5Qcm92aWRlciwgdHlwZSBUb2tlblByb3ZpZGVyIH0gZnJvbSAnLi90b2tlbi5qcyc7XG5cbmV4cG9ydCB0eXBlIENsaWVudEV2ZW50cyA9IHtcbiAgICBzdGFydGVkOiBFdmVudEVtaXR0ZXI8W10+O1xuICAgIHN0b3BwZWQ6IEV2ZW50RW1pdHRlcjxbXT47XG4gICAgcmVhZHk6IEV2ZW50RW1pdHRlcjxbXT47XG59O1xuXG5leHBvcnQgY2xhc3MgT211IHtcbiAgICBwdWJsaWMgcmVhZHk6IGJvb2xlYW47XG4gICAgcHVibGljIHJ1bm5pbmc6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgZXZlbnQ6IENsaWVudEV2ZW50cyA9IHtcbiAgICAgICAgc3RhcnRlZDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICBzdG9wcGVkOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgIHJlYWR5OiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgfTtcbiAgICByZWFkb25seSB0b2tlbjogVG9rZW5Qcm92aWRlcjtcbiAgICByZWFkb25seSBhZGRyZXNzOiBBZGRyZXNzO1xuICAgIHJlYWRvbmx5IHNlc3Npb25zOiBTZXNzaW9uRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IG5ldHdvcms6IE5ldHdvcms7XG4gICAgcmVhZG9ubHkgZW5kcG9pbnRzOiBFbmRwb2ludEV4dGVuc2lvbjtcbiAgICByZWFkb25seSBwZXJtaXNzaW9uczogUGVybWlzc2lvbkV4dGVuc2lvbjtcbiAgICByZWFkb25seSBwbHVnaW5zOiBQbHVnaW5FeHRlbnNpb247XG4gICAgcmVhZG9ubHkgZGFzaGJvYXJkOiBEYXNoYm9hcmRFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgZXh0ZW5zaW9uczogRXh0ZW5zaW9uUmVnaXN0cnk7XG4gICAgcmVhZG9ubHkgdGFibGVzOiBUYWJsZUV4dGVuc2lvbjtcbiAgICByZWFkb25seSByZWdpc3RyaWVzOiBSZWdpc3RyeUV4dGVuc2lvbjtcbiAgICByZWFkb25seSBzaWduYWxzOiBTaWduYWxFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgYXNzZXRzOiBBc3NldEV4dGVuc2lvbjtcbiAgICByZWFkb25seSBpMThuOiBJMThuRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IHNlcnZlcjogU2VydmVyRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGh0dHA6IEh0dHBFeHRlbnNpb247XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwLFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgYWRkcmVzcz86IEFkZHJlc3M7XG4gICAgICAgICAgICB0b2tlbj86IFRva2VuUHJvdmlkZXIgfCBzdHJpbmc7XG4gICAgICAgICAgICB0cmFuc3BvcnQ/OiBUcmFuc3BvcnQ7XG4gICAgICAgICAgICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbiAgICAgICAgfSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zPy50b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gb3B0aW9ucz8udG9rZW47XG4gICAgICAgICAgICB0aGlzLnRva2VuID0ge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRva2VuKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRva2VuID0gb3B0aW9ucz8udG9rZW4gPz8gbmV3IEJyb3dzZXJUb2tlblByb3ZpZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRyZXNzID0gb3B0aW9ucz8uYWRkcmVzcyA/PyB7XG4gICAgICAgICAgICBob3N0OiAnMTI3LjAuMC4xJyxcbiAgICAgICAgICAgIHBvcnQ6IDI2NDIzLFxuICAgICAgICAgICAgc2VjdXJlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5uZXR3b3JrID0gbmV3IE5ldHdvcmsoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzLFxuICAgICAgICAgICAgdGhpcy50b2tlbixcbiAgICAgICAgICAgIG9wdGlvbnM/LnRyYW5zcG9ydCA/PyBuZXcgV2Vic29ja2V0VHJhbnNwb3J0KHRoaXMuYWRkcmVzcyksXG4gICAgICAgICAgICBvcHRpb25zPy5jb25uZWN0aW9uLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm5ldHdvcmsuZXZlbnQuZGlzY29ubmVjdGVkLmxpc3RlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihQQUNLRVRfVFlQRVMuUkVBRFksICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBSRUFEWSBwYWNrZXQgd2hlbiBhbHJlYWR5IHJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQucmVhZHkuZW1pdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5KHRoaXMpO1xuICAgICAgICB0aGlzLmVuZHBvaW50cyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihQTFVHSU5fRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnRhYmxlcyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihUQUJMRV9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoU0VTU0lPTl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMucmVnaXN0cmllcyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuc2lnbmFscyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihTSUdOQUxfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLmFzc2V0cyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihBU1NFVF9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuaTE4biA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihJMThOX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoU0VSVkVSX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoTE9HR0VSX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5odHRwID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKEhUVFBfRVhURU5TSU9OX1RZUEUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kPFQ+KHBhY2tldFR5cGU6IFBhY2tldFR5cGU8VD4sIGRhdGE6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZXR3b3JrLnNlbmQoe1xuICAgICAgICAgICAgdHlwZTogcGFja2V0VHlwZSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDbGllbnQgYWxyZWFkeSBydW5uaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgY29ubmVjdCA9IHRoaXMubmV0d29yay5jb25uZWN0KCk7XG4gICAgICAgIHRoaXMuZXZlbnQuc3RhcnRlZC5lbWl0KCk7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Q7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlbnQuc3RvcHBlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVhZHkoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiBVbmxpc3RlbiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5KSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50LnJlYWR5Lmxpc3RlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdhaXRGb3JSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHkpIHJldHVybjtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdW5saXN0ZW4gPSAoKSA9PiB7fTtcbiAgICAgICAgICAgIHVubGlzdGVuID0gdGhpcy5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHVubGlzdGVuKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7O0FBR08sTUFBTSxrQkFBa0I7QUFBQSxFQUdFO0FBQUEsRUFGWixlQUF1QyxJQUFJO0FBQUEsRUFFNUQsV0FBVyxDQUFrQixLQUFVO0FBQUEsSUFBVjtBQUFBO0FBQUEsRUFFN0IsUUFBNkIsQ0FBQyxNQUEyQjtBQUFBLElBQ3JELElBQUksS0FBSyxhQUFhLElBQUksS0FBSyxJQUFJLEdBQUc7QUFBQSxNQUNsQyxNQUFNLElBQUksTUFBTSxrQkFBa0IsS0FBSyx5QkFBeUI7QUFBQSxJQUNwRTtBQUFBLElBQ0EsTUFBTSxZQUFZLEtBQUssT0FBTyxLQUFLLEdBQUc7QUFBQSxJQUN0QyxLQUFLLGFBQWEsSUFBSSxLQUFLLE1BQU0sU0FBUztBQUFBLElBQzFDLE9BQU87QUFBQTtBQUVmOztBQ2tCTyxNQUFNLElBQUk7QUFBQSxFQUNHO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFFaEIsV0FBVyxDQUFDLElBQVksU0FPckI7QUFBQSxJQUNDLEtBQUssS0FBSyxXQUFXLEtBQUssRUFBRTtBQUFBLElBQzVCLEtBQUssV0FBVyxXQUFXLGFBQWEsUUFBUSxRQUFRO0FBQUEsSUFDeEQsS0FBSyxVQUFVLFFBQVE7QUFBQSxJQUN2QixLQUFLLE1BQU0sUUFBUTtBQUFBLElBQ25CLEtBQUssV0FBVyxRQUFRO0FBQUEsSUFDeEIsS0FBSyxPQUFPLFFBQVEsUUFBUTtBQUFBLElBQzVCLEtBQUssZUFBZSxRQUFRLGdCQUFnQixDQUFDO0FBQUE7QUFBQSxTQUduQyxXQUFXLENBQUMsTUFBb0I7QUFBQSxJQUMxQyxNQUFNLEtBQUssV0FBVyxRQUFRLEtBQUssRUFBRTtBQUFBLElBQ3JDLE9BQU8sSUFBSSxJQUFJLElBQUk7QUFBQSxNQUNmLFVBQVUsV0FBVyxhQUFhLEtBQUssU0FBUztBQUFBLE1BQ2hELFNBQVMsS0FBSztBQUFBLE1BQ2QsS0FBSyxLQUFLO0FBQUEsTUFDVixNQUFNLEtBQUs7QUFBQSxNQUNYLFVBQVUsS0FBSztBQUFBLE1BQ2YsY0FBYyxLQUFLLGdCQUFnQixDQUFDO0FBQUEsSUFDeEMsQ0FBQztBQUFBO0FBQUEsU0FHUyxTQUFTLENBQUMsTUFBb0I7QUFBQSxJQUN4QyxPQUFPO0FBQUEsTUFDSCxJQUFJLEtBQUssR0FBRyxJQUFJO0FBQUEsTUFDaEIsTUFBTSxLQUFLO0FBQUEsTUFDWCxXQUFXLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDOUIsU0FBUyxLQUFLO0FBQUEsTUFDZCxLQUFLLEtBQUs7QUFBQSxNQUNWLFVBQVUsS0FBSztBQUFBLE1BQ2YsY0FBYyxLQUFLO0FBQUEsSUFDdkI7QUFBQTtBQUFBLEVBR0csSUFBSSxJQUFJLE9BQXNCO0FBQUEsSUFDakMsT0FBTyxJQUFJLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUc7QUFBQSxNQUNuQyxVQUFVLEtBQUs7QUFBQSxNQUNmLFNBQVMsS0FBSztBQUFBLE1BQ2QsS0FBSyxLQUFLO0FBQUEsTUFDVixNQUFNLEtBQUs7QUFBQSxNQUNYLFVBQVUsS0FBSztBQUFBLE1BQ2YsY0FBYyxLQUFLO0FBQUEsSUFDdkIsQ0FBQztBQUFBO0FBRVQ7OztBQzNGQSxJQUFNLGtCQUFrQjtBQUN4QixJQUFNLGFBQWE7QUFBQTtBQUlaLE1BQU0sV0FBVztBQUFBLEVBQ0o7QUFBQSxFQUNBO0FBQUEsRUFFaEIsV0FBVyxDQUNQLGNBQ0csTUFDTDtBQUFBLElBQ0UsV0FBVyxTQUFTLFdBQVcsSUFBSTtBQUFBLElBQ25DLEtBQUssWUFBWTtBQUFBLElBQ2pCLEtBQUssT0FBTztBQUFBO0FBQUEsU0FHRixTQUFTLENBQUMsWUFBZ0M7QUFBQSxJQUNwRCxPQUFPLFdBQVcsSUFBSTtBQUFBO0FBQUEsU0FHWixXQUFXLENBQUMsTUFBMEI7QUFBQSxJQUNoRCxPQUFPLFdBQVcsU0FBUyxJQUFJO0FBQUE7QUFBQSxTQUdyQixJQUFJLENBQUMsSUFBd0I7QUFBQSxJQUN2QyxJQUFJLGNBQWMsWUFBWTtBQUFBLE1BQzFCLE9BQU87QUFBQSxJQUNYLEVBQU8sU0FBSSxjQUFjLEtBQUs7QUFBQSxNQUMxQixPQUFPLEdBQUc7QUFBQSxJQUNkLEVBQU8sU0FBSSxPQUFPLE9BQU8sVUFBVTtBQUFBLE1BQy9CLE9BQU8sV0FBVyxRQUFRLEVBQUU7QUFBQSxJQUNoQyxFQUFPO0FBQUEsTUFHSCxNQUFNLFdBQVc7QUFBQSxNQUNqQixJQUNJLE9BQU8sU0FBUyxjQUFjLFlBQzlCLE1BQU0sUUFBUSxTQUFTLElBQUksS0FDM0IsU0FBUyxLQUFLLE1BQU0sQ0FBQyxNQUFNLE9BQU8sTUFBTSxRQUFRLEdBQ2xEO0FBQUEsUUFDRSxPQUFPLElBQUksV0FBVyxTQUFTLFdBQVcsR0FBRyxTQUFTLElBQUk7QUFBQSxNQUM5RDtBQUFBLE1BQ0EsTUFBTSxXQUFXO0FBQUEsTUFDakIsSUFBSSxPQUFPLFNBQVMsT0FBTyxhQUFhO0FBQUEsUUFDcEMsT0FBTyxXQUFXLEtBQUssU0FBUyxFQUFFO0FBQUEsTUFDdEM7QUFBQSxNQUNBLE1BQU0sSUFBSSxNQUFNLGlDQUFpQyxJQUFJO0FBQUE7QUFBQTtBQUFBLFNBSS9DLFlBQVksQ0FBQyxJQUF1RDtBQUFBLElBQzlFLElBQUksT0FBTyxhQUFhLE9BQU8sTUFBTTtBQUFBLE1BQ2pDO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTyxXQUFXLEtBQUssRUFBRTtBQUFBO0FBQUEsU0FHdEIsUUFBUSxDQUFDLFdBQW1CLE1BQXNCO0FBQUEsSUFDckQsSUFBSSxDQUFDLFdBQVc7QUFBQSxNQUNaLE1BQU0sSUFBSSxNQUFNLDhDQUE4QztBQUFBLElBQ2xFO0FBQUEsSUFDQSxJQUFJLEtBQUssV0FBVyxHQUFHO0FBQUEsTUFDbkIsTUFBTSxJQUFJLE1BQU0sZ0RBQWdEO0FBQUEsSUFDcEU7QUFBQSxJQUNBLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUNsQyxNQUFNLElBQUksTUFBTSwyQ0FBMkMsaUJBQWlCO0FBQUEsSUFDaEY7QUFBQSxJQUNBLFdBQVcsUUFBUSxNQUFNO0FBQUEsTUFDckIsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEdBQUc7QUFBQSxRQUN4QixNQUFNLElBQUksTUFBTSxpQ0FBaUMsc0JBQXNCLE1BQU07QUFBQSxNQUNqRjtBQUFBLElBQ0o7QUFBQTtBQUFBLFNBR0csTUFBTSxDQUFDLGNBQXNCLE1BQXdCO0FBQUEsSUFDeEQsV0FBVyxTQUFTLFdBQVcsSUFBSTtBQUFBLElBQ25DLE9BQU8sR0FBRyxhQUFhLEtBQUssS0FBSyxHQUFHO0FBQUE7QUFBQSxTQUdqQyxPQUFPLENBQUMsS0FBeUI7QUFBQSxJQUNwQyxNQUFNLFlBQVksSUFBSSxRQUFRLEdBQUc7QUFBQSxJQUNqQyxJQUFJLGNBQWMsSUFBSTtBQUFBLE1BQ2xCLE1BQU0sSUFBSSxNQUFNLHNDQUFzQyxLQUFLO0FBQUEsSUFDL0Q7QUFBQSxJQUNBLElBQUksSUFBSSxRQUFRLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSTtBQUFBLE1BQ3hDLE1BQU0sSUFBSSxNQUFNLDZDQUE2QyxLQUFLO0FBQUEsSUFDdEU7QUFBQSxJQUNBLE1BQU0sWUFBWSxJQUFJLE1BQU0sR0FBRyxTQUFTO0FBQUEsSUFDeEMsTUFBTSxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFBQSxJQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU07QUFBQSxNQUNyQixNQUFNLElBQUksTUFBTSxpREFBaUQ7QUFBQSxJQUNyRTtBQUFBLElBQ0EsT0FBTyxJQUFJLFdBQVcsV0FBVyxHQUFHLEtBQUssTUFBTSxHQUFHLENBQUM7QUFBQTtBQUFBLFNBR3pDLE9BQU8sQ0FBQyxLQUErQjtBQUFBLElBQ2pELE1BQU0sWUFBWSxJQUFJLElBQUksR0FBRztBQUFBLElBQzdCLE1BQU0sWUFBWSxXQUFXLGlCQUFpQixVQUFVLElBQUk7QUFBQSxJQUM1RCxNQUFNLE9BQU8sVUFBVSxTQUFTLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRztBQUFBLElBQ2xELE9BQU8sSUFBSSxXQUFXLFdBQVcsR0FBRyxJQUFJO0FBQUE7QUFBQSxTQUc5QixnQkFBZ0IsQ0FBQyxLQUEyQjtBQUFBLElBQ3RELE1BQU0sU0FBUyxJQUFJLElBQUksR0FBRztBQUFBLElBQzFCLE9BQU8sT0FBTyxTQUFTLE1BQU0sR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEdBQUc7QUFBQTtBQUFBLEVBR2pELE1BQU0sR0FBVztBQUFBLElBQ3BCLE9BQU8sS0FBSyxJQUFJO0FBQUE7QUFBQSxTQUdiLFFBQVEsQ0FBQyxNQUEwQjtBQUFBLElBQ3RDLE9BQU8sV0FBVyxRQUFRLElBQUk7QUFBQTtBQUFBLEVBRzNCLEdBQUcsR0FBVztBQUFBLElBQ2pCLE9BQU8sV0FBVyxPQUFPLEtBQUssV0FBVyxHQUFHLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFHbEQsT0FBTyxDQUFDLE9BQTRCO0FBQUEsSUFDdkMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLElBQUk7QUFBQTtBQUFBLEVBRzdCLGdCQUFnQixDQUFDLE9BQTRCO0FBQUEsSUFDaEQsT0FBTyxLQUFLLGNBQWMsTUFBTTtBQUFBO0FBQUEsRUFHN0IsV0FBVyxDQUFDLE9BQTRCO0FBQUEsSUFDM0MsSUFBSSxLQUFLLGNBQWMsTUFBTSxXQUFXO0FBQUEsTUFDcEMsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLElBQUksS0FBSyxLQUFLLFNBQVMsTUFBTSxLQUFLLFFBQVE7QUFBQSxNQUN0QyxPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsU0FBUyxJQUFJLEVBQUcsSUFBSSxNQUFNLEtBQUssUUFBUSxLQUFLO0FBQUEsTUFDeEMsSUFBSSxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssSUFBSTtBQUFBLFFBQ2hDLE9BQU87QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHSixJQUFJLElBQUksTUFBNEI7QUFBQSxJQUN2QyxPQUFPLElBQUksV0FBVyxLQUFLLFdBQVcsR0FBRyxLQUFLLE1BQU0sR0FBRyxJQUFJO0FBQUE7QUFFbkU7QUFBQTtBQUVPLE1BQU0sY0FBaUI7QUFBQSxFQUNULE1BQXNCLElBQUk7QUFBQSxFQUMzQyxXQUFXLENBQ1AsU0FDRjtBQUFBLElBQ0UsSUFBSSxDQUFDO0FBQUEsTUFBUztBQUFBLElBQ2QsWUFBWSxJQUFJLFVBQVUsU0FBUztBQUFBLE1BQy9CLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUs7QUFBQSxJQUNoQztBQUFBO0FBQUEsTUFHTyxJQUFJLEdBQVc7QUFBQSxJQUN0QixPQUFPLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFHYixHQUFHLENBQUMsWUFBd0IsT0FBZ0I7QUFBQSxJQUMvQyxLQUFLLElBQUksSUFBSSxXQUFXLElBQUksR0FBRyxLQUFLO0FBQUE7QUFBQSxFQUdqQyxHQUFHLENBQUMsWUFBdUM7QUFBQSxJQUM5QyxPQUFPLEtBQUssSUFBSSxJQUFJLFdBQVcsSUFBSSxDQUFDO0FBQUE7QUFBQSxFQUdqQyxHQUFHLENBQUMsWUFBaUM7QUFBQSxJQUN4QyxPQUFPLEtBQUssSUFBSSxJQUFJLFdBQVcsSUFBSSxDQUFDO0FBQUE7QUFBQSxFQUdqQyxNQUFNLENBQUMsWUFBOEI7QUFBQSxJQUN4QyxLQUFLLElBQUksT0FBTyxXQUFXLElBQUksQ0FBQztBQUFBO0FBQUEsRUFHN0IsS0FBSyxHQUFTO0FBQUEsSUFDakIsS0FBSyxJQUFJLE1BQU07QUFBQTtBQUFBLEdBR1gsSUFBSSxHQUFpQztBQUFBLElBQ3pDLFdBQVcsT0FBTyxLQUFLLElBQUksS0FBSyxHQUFHO0FBQUEsTUFDL0IsTUFBTSxXQUFXLFFBQVEsR0FBRztBQUFBLElBQ2hDO0FBQUE7QUFBQSxFQUdHLE1BQU0sR0FBd0I7QUFBQSxJQUNqQyxPQUFPLEtBQUssSUFBSSxPQUFPO0FBQUE7QUFBQSxHQUduQixPQUFPLEdBQXNDO0FBQUEsSUFDakQsWUFBWSxLQUFLLFVBQVUsS0FBSyxJQUFJLFFBQVEsR0FBRztBQUFBLE1BQzNDLE1BQU0sQ0FBQyxXQUFXLFFBQVEsR0FBRyxHQUFHLEtBQUs7QUFBQSxJQUN6QztBQUFBO0FBQUEsR0FHSSxPQUFPLFNBQVMsR0FBc0M7QUFBQSxJQUMxRCxPQUFPLEtBQUssUUFBUTtBQUFBO0FBRTVCO0FBQUE7QUFFTyxNQUFNLGNBQWM7QUFBQSxFQUNOLE1BQW1CLElBQUk7QUFBQSxNQUU3QixJQUFJLEdBQVc7QUFBQSxJQUN0QixPQUFPLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFHYixHQUFHLENBQUMsWUFBOEI7QUFBQSxJQUNyQyxLQUFLLElBQUksSUFBSSxXQUFXLElBQUksQ0FBQztBQUFBO0FBQUEsRUFHMUIsR0FBRyxDQUFDLFlBQWlDO0FBQUEsSUFDeEMsT0FBTyxLQUFLLElBQUksSUFBSSxXQUFXLElBQUksQ0FBQztBQUFBO0FBQUEsRUFHakMsTUFBTSxDQUFDLFlBQThCO0FBQUEsSUFDeEMsS0FBSyxJQUFJLE9BQU8sV0FBVyxJQUFJLENBQUM7QUFBQTtBQUFBLEVBRzdCLEtBQUssR0FBUztBQUFBLElBQ2pCLEtBQUssSUFBSSxNQUFNO0FBQUE7QUFBQSxHQUdYLElBQUksR0FBaUM7QUFBQSxJQUN6QyxXQUFXLE9BQU8sS0FBSyxJQUFJLEtBQUssR0FBRztBQUFBLE1BQy9CLE1BQU0sV0FBVyxRQUFRLEdBQUc7QUFBQSxJQUNoQztBQUFBO0FBQUEsRUFHRyxNQUFNLEdBQWlDO0FBQUEsSUFDMUMsT0FBTyxLQUFLLEtBQUs7QUFBQTtBQUFBLEdBR2IsT0FBTyxHQUErQztBQUFBLElBQzFELFdBQVcsT0FBTyxLQUFLLElBQUksS0FBSyxHQUFHO0FBQUEsTUFDL0IsTUFBTSxhQUFhLFdBQVcsUUFBUSxHQUFHO0FBQUEsTUFDekMsTUFBTSxDQUFDLFlBQVksVUFBVTtBQUFBLElBQ2pDO0FBQUE7QUFBQSxHQUdJLE9BQU8sU0FBUyxHQUErQztBQUFBLElBQ25FLE9BQU8sS0FBSyxRQUFRO0FBQUE7QUFFNUI7OztBQ3BQTyxNQUFNLHNCQUF1RCxXQUFXO0FBQUEsRUFFdkQ7QUFBQSxFQUNBO0FBQUEsRUFGcEIsV0FBVyxDQUNTLE1BQ0EsUUFDbEI7QUFBQSxJQUNFLE1BQU0sT0FBTyxJQUFJO0FBQUEsSUFIRDtBQUFBLElBQ0E7QUFBQTtBQUFBLEVBS2IsR0FBRyxHQUFXO0FBQUEsSUFDakIsT0FBTyxLQUFLO0FBQUE7QUFFcEI7O0FDbEJPLElBQU0sY0FBMkIsSUFBSTtBQUNyQyxJQUFNLGNBQTJCLElBQUk7OztBQ0VyQyxNQUFNLE1BQU07QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLEVBRVIsV0FBVyxDQUFDLFNBQThDO0FBQUEsSUFDdEQsS0FBSyxRQUFRLFFBQVEsU0FBUztBQUFBLElBQzlCLEtBQUssU0FBUyxRQUFRLFVBQVU7QUFBQTtBQUFBLEVBRzdCLEdBQUcsQ0FBQyxVQUEyQjtBQUFBLElBQ2xDLFFBQVEsS0FBSyxRQUFTLEtBQUssY0FBZTtBQUFBO0FBQUEsRUFHdkMsR0FBRyxDQUFDLFVBQTJCO0FBQUEsSUFDbEMsUUFBUSxLQUFLLFFBQVMsS0FBSyxjQUFlO0FBQUE7QUFBQSxFQUd2QyxLQUFRLENBQUMsVUFBa0IsVUFBa0M7QUFBQSxJQUNoRSxJQUFJLEtBQUssSUFBSSxRQUFRLEdBQUc7QUFBQSxNQUNwQixPQUFPLFNBQVM7QUFBQSxJQUNwQjtBQUFBLElBQ0E7QUFBQTtBQUFBLEVBR0csR0FBRyxDQUFDLFVBQWtCLE9BQXNCO0FBQUEsSUFDL0MsSUFBSSxPQUFPO0FBQUEsTUFDUCxLQUFLLFNBQVMsS0FBSztBQUFBLElBQ3ZCLEVBQU87QUFBQSxNQUNILEtBQUssU0FBUyxFQUFFLEtBQUs7QUFBQTtBQUFBO0FBQUEsRUFJdEIsS0FBSyxDQUFDLFFBQTBCO0FBQUEsSUFDbkMsTUFBTSxPQUFPLElBQUksWUFBWSxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBQUEsSUFDakQsU0FBUyxJQUFJLEVBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUFBLE1BQ2xDLEtBQUssS0FBTSxLQUFLLFNBQVUsSUFBSSxJQUFNO0FBQUEsSUFDeEM7QUFBQSxJQUNBLE9BQU8sTUFBTSxJQUFJO0FBQUE7QUFBQSxTQUdQLElBQUksQ0FBQyxRQUFvQixRQUF1QjtBQUFBLElBQzFELElBQUksUUFBUTtBQUFBLElBQ1osU0FBUyxJQUFJLEVBQUcsS0FBSyxTQUFTLEtBQUssR0FBRyxLQUFLO0FBQUEsTUFDdkMsU0FBUyxPQUFPLFVBQVUsS0FBTSxJQUFJO0FBQUEsSUFDeEM7QUFBQSxJQUNBLE9BQU8sSUFBSSxNQUFNLEVBQUUsT0FBTyxPQUFPLENBQUM7QUFBQTtBQUUxQztBQUVBLFNBQVMsV0FBVyxDQUFDLFVBQW9CLFFBQXdCO0FBQUEsRUFDN0QsTUFBTSxPQUFRLFNBQVMsVUFBVSxNQUFNLElBQUksUUFBVSxLQUFLO0FBQUEsRUFDMUQsTUFBTSxZQUFZLFNBQVMsVUFBVSxNQUFNLElBQUksVUFBVztBQUFBLEVBQzFELE1BQU0sV0FBWSxTQUFTLFVBQVUsTUFBTSxJQUFJO0FBQUEsRUFDL0MsSUFBSSxhQUFhLEtBQUssYUFBYSxHQUFHO0FBQUEsSUFDbEMsT0FBTztBQUFBLEVBQ1gsRUFBTyxTQUFJLGFBQWEsSUFBTTtBQUFBLElBQzFCLE9BQU8sYUFBYSxJQUFJLFdBQVcsT0FBTztBQUFBLEVBQzlDLEVBQU87QUFBQSxJQUNILE1BQU0scUJBQXFCLFdBQVc7QUFBQSxJQUN0QyxNQUFNLHFCQUFxQixXQUFXO0FBQUEsSUFDdEMsT0FBTyxPQUFPLEtBQUssSUFBSSxHQUFHLGtCQUFrQixLQUFLLElBQUk7QUFBQTtBQUFBO0FBSTdELFNBQVMsWUFBWSxDQUFDLFVBQW9CLFFBQWdCLE9BQXFCO0FBQUEsRUFDM0UsSUFBSSxVQUFVLEdBQUc7QUFBQSxJQUNiLFNBQVMsVUFBVSxRQUFRLENBQUM7QUFBQSxJQUM1QjtBQUFBLEVBQ0o7QUFBQSxFQUNBLE1BQU0sT0FBTyxRQUFRLElBQUksSUFBSTtBQUFBLEVBQzdCLFFBQVEsS0FBSyxJQUFJLEtBQUs7QUFBQSxFQUN0QixJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUc7QUFBQSxJQUNsQixTQUFTLFVBQVUsUUFBUSxRQUFVLFFBQVEsRUFBRztBQUFBLElBQ2hEO0FBQUEsRUFDSjtBQUFBLEVBQ0EsTUFBTSxXQUFXLEtBQUssTUFBTSxLQUFLLEtBQUssS0FBSyxDQUFDO0FBQUEsRUFDNUMsTUFBTSxXQUFXLFFBQVEsS0FBSyxJQUFJLEdBQUcsUUFBUSxJQUFJO0FBQUEsRUFDakQsTUFBTSxxQkFBcUIsV0FBVztBQUFBLEVBQ3RDLE1BQU0scUJBQXFCLEtBQUssTUFBTSxXQUFXLElBQUk7QUFBQSxFQUNyRCxJQUFJLHNCQUFzQixHQUFHO0FBQUEsSUFDekIsU0FBUyxVQUFVLFFBQVEsUUFBUSxFQUFFO0FBQUEsRUFDekMsRUFBTyxTQUFJLHNCQUFzQixJQUFNO0FBQUEsSUFDbkMsU0FBUyxVQUFVLFFBQVEsUUFBVSxRQUFRLEVBQUc7QUFBQSxFQUNwRCxFQUFPO0FBQUEsSUFDSCxTQUFTLFVBQVUsUUFBUyxRQUFRLEtBQU8sc0JBQXNCLEtBQU0sa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBSTFGLE1BQU0sV0FBVztBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsRUFDQSxTQUFTO0FBQUEsRUFDVCxXQUFXO0FBQUEsRUFFbkIsV0FBVyxDQUFDLE1BQW9CLFFBQWlCO0FBQUEsSUFDN0MsS0FBSyxTQUFTLFVBQVU7QUFBQSxJQUN4QixLQUFLLFNBQVMsUUFBUSxJQUFJLFlBQVksSUFBSTtBQUFBLElBQzFDLEtBQUssV0FBVyxJQUFJLFNBQVMsS0FBSyxNQUFNO0FBQUE7QUFBQSxTQUc5QixjQUFjLENBQUMsUUFBZ0M7QUFBQSxJQUN6RCxNQUFNLGNBQWMsSUFBSSxZQUFZLE9BQU8sVUFBVTtBQUFBLElBQ3JELE1BQU0sYUFBYSxJQUFJLFdBQVcsV0FBVztBQUFBLElBQzdDLFdBQVcsSUFBSSxJQUFJLFdBQVcsTUFBTSxDQUFDO0FBQUEsSUFDckMsT0FBTyxJQUFJLFdBQVcsYUFBYSxPQUFPLFVBQVU7QUFBQTtBQUFBLEVBR2hELFFBQVEsQ0FBQyxRQUFzQjtBQUFBLElBQ25DLElBQUksS0FBSyxTQUFTLFNBQVMsS0FBSyxPQUFPLFlBQVk7QUFBQSxNQUMvQyxNQUFNLGdCQUFnQixLQUFLLElBQUksS0FBSyxPQUFPLGFBQWEsR0FBRyxLQUFLLFNBQVMsTUFBTTtBQUFBLE1BQy9FLE1BQU0sWUFBWSxJQUFJLFlBQVksYUFBYTtBQUFBLE1BQy9DLElBQUksV0FBVyxTQUFTLEVBQUUsSUFBSSxJQUFJLFdBQVcsS0FBSyxNQUFNLENBQUM7QUFBQSxNQUN6RCxLQUFLLFNBQVM7QUFBQSxNQUNkLEtBQUssV0FBVyxJQUFJLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDNUM7QUFBQTtBQUFBLEVBR0csS0FBSyxDQUFDLE1BQThCO0FBQUEsSUFDdkMsSUFBSSxLQUFLLFVBQVU7QUFBQSxNQUNmLE1BQU0sSUFBSSxNQUFNLHlCQUF5QjtBQUFBLElBQzdDO0FBQUEsSUFDQSxLQUFLLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDekIsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFLElBQUksTUFBTSxLQUFLLE1BQU07QUFBQSxJQUNqRCxLQUFLLFVBQVUsS0FBSztBQUFBLElBQ3BCLE9BQU87QUFBQTtBQUFBLEVBR0osWUFBWSxDQUFDLE9BQTRCO0FBQUEsSUFDNUMsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNmLEtBQUssU0FBUyxRQUFRLEtBQUssUUFBUSxRQUFRLElBQUksQ0FBQztBQUFBLElBQ2hELEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixTQUFTLENBQUMsT0FBMkI7QUFBQSxJQUN4QyxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ2YsS0FBSyxTQUFTLFFBQVEsS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUN4QyxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osVUFBVSxDQUFDLE9BQTJCO0FBQUEsSUFDekMsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNmLEtBQUssU0FBUyxTQUFTLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDekMsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFVBQVUsQ0FBQyxPQUEyQjtBQUFBLElBQ3pDLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDZixLQUFLLFNBQVMsU0FBUyxLQUFLLFFBQVEsS0FBSztBQUFBLElBQ3pDLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixXQUFXLENBQUMsT0FBMkI7QUFBQSxJQUMxQyxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ2YsS0FBSyxTQUFTLFVBQVUsS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUMxQyxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osVUFBVSxDQUFDLE9BQTJCO0FBQUEsSUFDekMsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNmLEtBQUssU0FBUyxTQUFTLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDekMsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFdBQVcsQ0FBQyxPQUEyQjtBQUFBLElBQzFDLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDZixLQUFLLFNBQVMsVUFBVSxLQUFLLFFBQVEsS0FBSztBQUFBLElBQzFDLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixVQUFVLENBQUMsT0FBMkI7QUFBQSxJQUN6QyxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ2YsS0FBSyxTQUFTLFlBQVksS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUM1QyxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osV0FBVyxDQUFDLE9BQTJCO0FBQUEsSUFDMUMsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNmLEtBQUssU0FBUyxhQUFhLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDN0MsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFlBQVksQ0FBQyxPQUEyQjtBQUFBLElBRTNDLElBQUksUUFBUSxHQUFHO0FBQUEsTUFDWCxNQUFNLElBQUksTUFBTSw0QkFBNEI7QUFBQSxJQUNoRDtBQUFBLElBQ0EsT0FBTyxRQUFRLEtBQU07QUFBQSxNQUNqQixLQUFLLFNBQVMsQ0FBQztBQUFBLE1BQ2YsS0FBSyxTQUFTLFNBQVMsS0FBSyxRQUFTLFFBQVEsTUFBUSxHQUFJO0FBQUEsTUFDekQsS0FBSyxVQUFVO0FBQUEsTUFDZixVQUFVO0FBQUEsSUFDZDtBQUFBLElBQ0EsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNmLEtBQUssU0FBUyxTQUFTLEtBQUssUUFBUSxRQUFRLEdBQUk7QUFBQSxJQUNoRCxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osWUFBWSxDQUFDLE9BQTJCO0FBQUEsSUFDM0MsS0FBSyxTQUFTLENBQUM7QUFBQSxJQUNmLGFBQWEsS0FBSyxVQUFVLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDOUMsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFlBQVksQ0FBQyxPQUEyQjtBQUFBLElBQzNDLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDZixLQUFLLFNBQVMsV0FBVyxLQUFLLFFBQVEsS0FBSztBQUFBLElBQzNDLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixZQUFZLENBQUMsT0FBMkI7QUFBQSxJQUMzQyxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ2YsS0FBSyxTQUFTLFdBQVcsS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUMzQyxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osZUFBZSxDQUFDLE9BQStCO0FBQUEsSUFDbEQsS0FBSyxhQUFhLE1BQU0sVUFBVTtBQUFBLElBQ2xDLEtBQUssTUFBTSxLQUFLO0FBQUEsSUFDaEIsT0FBTztBQUFBO0FBQUEsRUFHSixXQUFXLENBQUMsT0FBMkI7QUFBQSxJQUMxQyxLQUFLLGdCQUFnQixZQUFZLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDOUMsT0FBTztBQUFBO0FBQUEsRUFHSixTQUFTLENBQUMsT0FBNkI7QUFBQSxJQUMxQyxLQUFLLFlBQVksS0FBSyxVQUFVLEtBQUssQ0FBQztBQUFBLElBQ3RDLE9BQU87QUFBQTtBQUFBLEVBR0osVUFBVSxDQUFDLE9BQTBCO0FBQUEsSUFDeEMsTUFBTSxNQUFNLElBQUk7QUFBQSxJQUNoQixPQUFPO0FBQUE7QUFBQSxFQUdKLE1BQU0sR0FBZTtBQUFBLElBQ3hCLElBQUksS0FBSyxVQUFVO0FBQUEsTUFDZixNQUFNLElBQUksTUFBTSx5QkFBeUI7QUFBQSxJQUM3QztBQUFBLElBQ0EsS0FBSyxXQUFXO0FBQUEsSUFDaEIsT0FBTyxJQUFJLFdBQVcsS0FBSyxRQUFRLEdBQUcsS0FBSyxNQUFNO0FBQUE7QUFFekQ7QUFBQTtBQUVPLE1BQU0sV0FBVztBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRUEsV0FBVyxDQUFDLE1BQWdCO0FBQUEsSUFDaEMsS0FBSyxXQUFXO0FBQUEsSUFDaEIsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLFdBQVc7QUFBQTtBQUFBLFNBR04sY0FBYyxDQUFDLFFBQWdDO0FBQUEsSUFDekQsTUFBTSxjQUFjLElBQUksWUFBWSxPQUFPLFVBQVU7QUFBQSxJQUNyRCxNQUFNLGFBQWEsSUFBSSxXQUFXLFdBQVc7QUFBQSxJQUM3QyxXQUFXLElBQUksSUFBSSxXQUFXLE1BQU0sQ0FBQztBQUFBLElBQ3JDLE1BQU0sV0FBVyxJQUFJLFNBQVMsV0FBVztBQUFBLElBQ3pDLE9BQU8sSUFBSSxXQUFXLFFBQVE7QUFBQTtBQUFBLFNBR3BCLGVBQWUsQ0FBQyxRQUFpQztBQUFBLElBQzNELE1BQU0sV0FBVyxJQUFJLFNBQVMsTUFBTTtBQUFBLElBQ3BDLE9BQU8sSUFBSSxXQUFXLFFBQVE7QUFBQTtBQUFBLGNBR2QsU0FBUSxDQUFDLE1BQWlDO0FBQUEsSUFDMUQsTUFBTSxjQUFjLE1BQU0sS0FBSyxZQUFZO0FBQUEsSUFDM0MsTUFBTSxXQUFXLElBQUksU0FBUyxXQUFXO0FBQUEsSUFDekMsT0FBTyxJQUFJLFdBQVcsUUFBUTtBQUFBO0FBQUEsRUFHM0IsSUFBSSxDQUFDLE1BQTBCO0FBQUEsSUFDbEMsSUFBSSxLQUFLLFVBQVU7QUFBQSxNQUNmLE1BQU0sSUFBSSxNQUFNLHlCQUF5QjtBQUFBLElBQzdDO0FBQUEsSUFDQSxJQUFJLE9BQU8sR0FBRztBQUFBLE1BQ1YsTUFBTSxJQUFJLE1BQU0sdUJBQXVCO0FBQUEsSUFDM0M7QUFBQSxJQUNBLElBQUksS0FBSyxTQUFTLE9BQU8sS0FBSyxTQUFTLFlBQVk7QUFBQSxNQUMvQyxNQUFNLElBQUksTUFBTSx1QkFBdUI7QUFBQSxJQUMzQztBQUFBLElBQ0EsTUFBTSxRQUFRLElBQUksV0FBVyxLQUFLLFNBQVMsUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUFBLElBQ3BFLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixXQUFXLEdBQVk7QUFBQSxJQUMxQixNQUFNLFFBQVEsS0FBSyxTQUFTLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDL0MsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPLFVBQVU7QUFBQTtBQUFBLEVBR2QsUUFBUSxHQUFXO0FBQUEsSUFDdEIsTUFBTSxRQUFRLEtBQUssU0FBUyxRQUFRLEtBQUssTUFBTTtBQUFBLElBQy9DLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixTQUFTLEdBQVc7QUFBQSxJQUN2QixNQUFNLFFBQVEsS0FBSyxTQUFTLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDaEQsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFNBQVMsR0FBVztBQUFBLElBQ3ZCLE1BQU0sUUFBUSxLQUFLLFNBQVMsU0FBUyxLQUFLLE1BQU07QUFBQSxJQUNoRCxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osVUFBVSxHQUFXO0FBQUEsSUFDeEIsTUFBTSxRQUFRLEtBQUssU0FBUyxVQUFVLEtBQUssTUFBTTtBQUFBLElBQ2pELEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixTQUFTLEdBQVc7QUFBQSxJQUN2QixNQUFNLFFBQVEsS0FBSyxTQUFTLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDaEQsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFVBQVUsR0FBVztBQUFBLElBQ3hCLE1BQU0sUUFBUSxLQUFLLFNBQVMsVUFBVSxLQUFLLE1BQU07QUFBQSxJQUNqRCxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osU0FBUyxHQUFXO0FBQUEsSUFDdkIsTUFBTSxRQUFRLEtBQUssU0FBUyxZQUFZLEtBQUssTUFBTTtBQUFBLElBQ25ELEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixVQUFVLEdBQVc7QUFBQSxJQUN4QixNQUFNLFFBQVEsS0FBSyxTQUFTLGFBQWEsS0FBSyxNQUFNO0FBQUEsSUFDcEQsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLFdBQVcsR0FBVztBQUFBLElBRXpCLElBQUksUUFBUTtBQUFBLElBQ1osSUFBSSxRQUFRO0FBQUEsSUFDWixJQUFJO0FBQUEsSUFDSixHQUFHO0FBQUEsTUFDQyxJQUFJLEtBQUssVUFBVSxLQUFLLFNBQVMsWUFBWTtBQUFBLFFBQ3pDLE1BQU0sSUFBSSxNQUFNLHVCQUF1QjtBQUFBLE1BQzNDO0FBQUEsTUFDQSxPQUFPLEtBQUssU0FBUyxTQUFTLEtBQUssTUFBTTtBQUFBLE1BQ3pDLEtBQUssVUFBVTtBQUFBLE1BQ2YsVUFBVSxPQUFPLFFBQWU7QUFBQSxNQUNoQyxTQUFTO0FBQUEsSUFDYixVQUNRLE9BQU8sU0FBZ0I7QUFBQSxJQUMvQixPQUFPO0FBQUE7QUFBQSxFQUdKLFdBQVcsR0FBVztBQUFBLElBQ3pCLE1BQU0sUUFBUSxZQUFZLEtBQUssVUFBVSxLQUFLLE1BQU07QUFBQSxJQUNwRCxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU87QUFBQTtBQUFBLEVBR0osV0FBVyxHQUFXO0FBQUEsSUFDekIsTUFBTSxRQUFRLEtBQUssU0FBUyxXQUFXLEtBQUssTUFBTTtBQUFBLElBQ2xELEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTztBQUFBO0FBQUEsRUFHSixXQUFXLEdBQVc7QUFBQSxJQUN6QixNQUFNLFFBQVEsS0FBSyxTQUFTLFdBQVcsS0FBSyxNQUFNO0FBQUEsSUFDbEQsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPO0FBQUE7QUFBQSxFQUdKLGNBQWMsR0FBZTtBQUFBLElBQ2hDLE1BQU0sU0FBUyxLQUFLLFlBQVk7QUFBQSxJQUNoQyxPQUFPLEtBQUssS0FBSyxNQUFNO0FBQUE7QUFBQSxFQUdwQixVQUFVLEdBQVc7QUFBQSxJQUN4QixNQUFNLFlBQVksS0FBSyxlQUFlO0FBQUEsSUFDdEMsT0FBTyxZQUFZLE9BQU8sU0FBUztBQUFBO0FBQUEsRUFHaEMsUUFBNEIsR0FBTTtBQUFBLElBQ3JDLE9BQU8sS0FBSyxNQUFNLEtBQUssV0FBVyxDQUFDO0FBQUE7QUFBQSxFQUdoQyxTQUFTLENBQUMsUUFBdUI7QUFBQSxJQUNwQyxPQUFPLE1BQU0sS0FBSyxNQUFNLE1BQU07QUFBQTtBQUFBLEVBRzNCLE1BQU0sR0FBUztBQUFBLElBQ2xCLElBQUksS0FBSyxVQUFVO0FBQUEsTUFDZixNQUFNLElBQUksTUFBTSx5QkFBeUI7QUFBQSxJQUM3QztBQUFBLElBQ0EsS0FBSyxXQUFXO0FBQUEsSUFDaEIsSUFBSSxLQUFLLFdBQVcsS0FBSyxTQUFTLFlBQVk7QUFBQSxNQUMxQyxNQUFNLElBQUksTUFBTSx1QkFBdUI7QUFBQSxJQUMzQztBQUFBO0FBRVI7O0FDOVpPLE1BQU0sV0FBaUI7QUFBQSxFQUVmO0FBQUEsRUFDQTtBQUFBLEVBRlgsV0FBVyxDQUNBLFdBQ0EsYUFDVDtBQUFBLElBRlM7QUFBQSxJQUNBO0FBQUE7QUFBQSxTQUdHLEVBQVEsQ0FBQyxZQUFrRDtBQUFBLElBQ3JFLE9BQU8sSUFBSSxXQUFpQixXQUFXLFdBQVcsV0FBVyxXQUFXO0FBQUE7QUFBQSxTQUc5RCxJQUFhLENBQUMsTUFBMEIsTUFBOEM7QUFBQSxJQUNoRyxPQUFPLElBQUksV0FDUCxDQUFDLFNBQVMsS0FBSyxVQUFVLEtBQUssVUFBVSxJQUFJLENBQUMsR0FDN0MsQ0FBQyxTQUFTLEtBQUssWUFBWSxLQUFLLFlBQVksSUFBSSxDQUFDLENBQ3JEO0FBQUE7QUFBQSxTQUdVLFNBQVksQ0FBQyxNQUF5QztBQUFBLElBQ2hFLE9BQU8sSUFBSSxXQUNQLE1BQ0EsSUFDSjtBQUFBO0FBQUEsU0FHVSxJQUFPLEdBQXFCO0FBQUEsSUFDdEMsT0FBTyxJQUFJLFdBQ1AsQ0FBQyxTQUFTLE1BQ1YsQ0FBQyxTQUFTLElBQ2Q7QUFBQTtBQUFBLEVBR0csS0FHTixDQUNHLEtBQ0EsWUFJRjtBQUFBLElBQ0UsT0FBTyxJQUFJLFdBSVAsQ0FBQyxTQUFTO0FBQUEsTUFDTixNQUFNLGFBQWEsS0FBSyxVQUFVLElBQUk7QUFBQSxNQUN0QyxPQUFPO0FBQUEsV0FDQTtBQUFBLFNBQ0YsTUFBTSxXQUFXLFVBQVUsV0FBVyxJQUFJO0FBQUEsTUFDL0M7QUFBQSxPQUVKLENBQUMsU0FBUztBQUFBLE1BQ04sT0FBTyxLQUFLLFlBQVk7QUFBQSxXQUNqQjtBQUFBLFNBQ0YsTUFBTSxXQUFXLFlBQVksS0FBSyxJQUFTO0FBQUEsTUFDaEQsQ0FBTTtBQUFBLEtBRWQ7QUFBQTtBQUFBLFNBR0csSUFBd0IsR0FBOEI7QUFBQSxJQUN6RCxPQUFPLElBQUksV0FDUCxDQUFDLFNBQVMsWUFBWSxPQUFPLEtBQUssVUFBVSxJQUFJLENBQUMsR0FDakQsQ0FBQyxTQUFTO0FBQUEsTUFDTixNQUFNLE9BQU8sWUFBWSxPQUFPLElBQUk7QUFBQSxNQUNwQyxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQUEsS0FFOUI7QUFBQTtBQUFBLEVBR0csTUFBTSxHQUE4QjtBQUFBLElBQ3ZDLE9BQU8sSUFBSSxXQUNQLENBQUMsU0FBUyxZQUFZLE9BQU8sS0FBSyxVQUFVLEtBQUssVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUNqRSxDQUFDLFNBQVM7QUFBQSxNQUNOLE1BQU0sT0FBTyxZQUFZLE9BQU8sSUFBSTtBQUFBLE1BQ3BDLE9BQU8sS0FBSyxZQUFZLEtBQUssTUFBTSxJQUFJLENBQUM7QUFBQSxLQUVoRDtBQUFBO0FBQUEsRUFHRyxPQUFPLEdBQXlCO0FBQUEsSUFDbkMsT0FBTyxJQUFJLFdBQ1AsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxVQUFVLElBQUksQ0FBQyxHQUNqRCxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQ3ZEO0FBQUE7QUFBQSxFQUdHLEtBQUssR0FBK0M7QUFBQSxJQUN2RCxPQUFPLElBQUksV0FDUCxDQUFDLFNBQVM7QUFBQSxNQUNOLE1BQU0sU0FBUyxJQUFJO0FBQUEsTUFDbkIsS0FBSyxRQUFRLENBQUMsT0FBTyxRQUFRO0FBQUEsUUFDekIsT0FBTyxJQUFJLEtBQUssS0FBSyxVQUFVLEtBQUssQ0FBQztBQUFBLE9BQ3hDO0FBQUEsTUFDRCxPQUFPO0FBQUEsT0FFWCxDQUFDLFNBQVM7QUFBQSxNQUNOLE1BQU0sU0FBUyxJQUFJO0FBQUEsTUFDbkIsS0FBSyxRQUFRLENBQUMsT0FBTyxRQUFRO0FBQUEsUUFDekIsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLEtBQUssQ0FBQztBQUFBLE9BQzFDO0FBQUEsTUFDRCxPQUFPO0FBQUEsS0FFZjtBQUFBO0FBQUEsRUFHRyxRQUFRLENBQUMsVUFBK0I7QUFBQSxJQUMzQyxPQUFPLElBQUksV0FDUCxDQUFDLFNBQVMsS0FBSyxVQUFVLElBQUksR0FDN0IsQ0FBQyxTQUFTO0FBQUEsTUFDTixJQUFJO0FBQUEsUUFDQSxPQUFPLEtBQUssWUFBWSxJQUFJO0FBQUEsUUFDOUIsTUFBTTtBQUFBLFFBQ0osT0FBTztBQUFBO0FBQUEsS0FHbkI7QUFBQTtBQUFBLEVBR0csV0FBVyxDQUFDLFVBQTREO0FBQUEsSUFDM0UsT0FBTyxJQUFJLFdBQ1AsQ0FBQyxTQUFTLEtBQUssVUFBVSxJQUFJLEdBQzdCLENBQUMsU0FBUztBQUFBLE1BQ04sSUFBSTtBQUFBLFFBQ0EsT0FBTyxLQUFLLFlBQVksSUFBSTtBQUFBLFFBQzlCLE9BQU8sT0FBTztBQUFBLFFBQ1osT0FBTyxTQUFTLE1BQU0sS0FBSztBQUFBO0FBQUEsS0FHdkM7QUFBQTtBQUFBLEVBR0csSUFBTyxDQUFDLFlBQWtEO0FBQUEsSUFDN0QsT0FBTyxJQUFJLFdBQ1AsQ0FBQyxTQUFTLFdBQVcsVUFBVSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQ25ELENBQUMsU0FBUyxLQUFLLFlBQVksV0FBVyxZQUFZLElBQUksQ0FBQyxDQUMzRDtBQUFBO0FBRVI7O0FDakpPLE1BQU0sYUFBMkM7QUFBQSxFQUVoQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBSnBCLFdBQVcsQ0FDUyxJQUNBLG1CQUNBLG9CQUNBLGNBQ2xCO0FBQUEsSUFKa0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR2IsVUFBOEYsQ0FDakc7QUFBQSxJQUVJO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsS0FPa0I7QUFBQSxJQUN0QixPQUFPLElBQUksYUFDUCxXQUFXLEtBQUssVUFBVSxFQUFFLEtBQUssSUFBSSxHQUNyQyxXQUFXLEtBQWdDLHFCQUFxQixXQUFXLEtBQUssR0FBRyxXQUFXLEtBQUssQ0FBQyxHQUNwRyxXQUFXLEtBQWdDLHNCQUFzQixXQUFXLEtBQUssR0FBRyxXQUFXLEtBQUssQ0FBQyxHQUNyRyxlQUFlLFdBQVcsS0FBSyxZQUFZLElBQUksU0FDbkQ7QUFBQTtBQUFBLFNBR0csZ0JBQTBCLENBQzdCO0FBQUEsSUFFSTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEtBT2tCO0FBQUEsSUFDdEIsT0FBTyxJQUFJLGFBQ1AsV0FBVyxLQUFLLFVBQVUsRUFBRSxLQUFLLElBQUksR0FDckMsbUJBQ0Esb0JBQ0EsZUFBZSxXQUFXLEtBQUssWUFBWSxJQUFJLFNBQ25EO0FBQUE7QUFFUjs7O0FDaERPLElBQU0sdUJBQXNELElBQUksY0FDbkUsU0FDQSxDQUFDLFFBQWEsSUFBSSxlQUFlLEdBQUcsQ0FDeEM7QUFPQSxJQUFNLGtCQUFrQixJQUFJLFdBQ3hCLENBQUMsU0FBUztBQUFBLEVBQ04sTUFBTSxTQUFTLElBQUk7QUFBQSxFQUNuQixPQUFPLFlBQVksS0FBSyxXQUFXLElBQUksQ0FBQztBQUFBLEVBQ3hDLE9BQU8sZ0JBQWdCLEtBQUssTUFBTTtBQUFBLEVBQ2xDLE9BQU8sT0FBTyxPQUFPO0FBQUEsR0FFekIsQ0FBQyxTQUFTO0FBQUEsRUFDTixNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxFQUM3QyxNQUFNLGFBQWEsV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQUEsRUFDekQsTUFBTSxTQUFTLE9BQU8sZUFBZTtBQUFBLEVBQ3JDLE9BQU8sT0FBTztBQUFBLEVBQ2QsT0FBTyxFQUFFLFlBQVksT0FBTztBQUFBLENBRXBDO0FBQ0EsSUFBTSx3QkFBd0IsSUFBSSxXQUM5QixDQUFDLFVBQVU7QUFBQSxFQUNQLE1BQU0sU0FBUyxJQUFJO0FBQUEsRUFDbkIsT0FBTyxhQUFhLE1BQU0sTUFBTTtBQUFBLEVBQ2hDLFdBQVcsUUFBUSxPQUFPO0FBQUEsSUFDdEIsT0FBTyxZQUFZLEtBQUssV0FBVyxJQUFJLENBQUM7QUFBQSxJQUN4QyxPQUFPLGdCQUFnQixLQUFLLE1BQU07QUFBQSxFQUN0QztBQUFBLEVBQ0EsT0FBTyxPQUFPLE9BQU87QUFBQSxHQUV6QixDQUFDLFNBQVM7QUFBQSxFQUNOLE1BQU0sU0FBUyxXQUFXLGVBQWUsSUFBSTtBQUFBLEVBQzdDLE1BQU0sU0FBUyxPQUFPLFlBQVk7QUFBQSxFQUNsQyxNQUFNLFFBQWlCLENBQUM7QUFBQSxFQUN4QixTQUFTLElBQUksRUFBRyxJQUFJLFFBQVEsS0FBSztBQUFBLElBQzdCLE1BQU0sYUFBYSxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUM7QUFBQSxJQUN6RCxNQUFNLFNBQVMsT0FBTyxlQUFlO0FBQUEsSUFDckMsTUFBTSxLQUFLLEVBQUUsWUFBWSxPQUFPLENBQUM7QUFBQSxFQUNyQztBQUFBLEVBQ0EsT0FBTyxPQUFPO0FBQUEsRUFDZCxPQUFPO0FBQUEsQ0FFZjtBQUVPLElBQU0sNkJBQXlDLHFCQUFxQixLQUFLLFFBQVE7QUFDeEYsSUFBTSx3QkFBd0IsYUFBYSxpQkFDdkMsc0JBQ0E7QUFBQSxFQUNJLE1BQU07QUFBQSxFQUNOLG1CQUFtQjtBQUFBLEVBQ25CLG9CQUFvQixXQUFXLEdBQUcsVUFBVSxFQUFFLE9BQU87QUFBQSxFQUNyRCxjQUFjO0FBQ2xCLENBQ0o7QUFDQSxJQUFNLDZCQUE2QixhQUFhLGlCQUM1QyxzQkFDQTtBQUFBLEVBQ0ksTUFBTTtBQUFBLEVBQ04sbUJBQW1CO0FBQUEsRUFDbkIsb0JBQW9CLFdBQVcsR0FBRyxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssV0FBVyxLQUFLLENBQUM7QUFBQSxFQUM5RSxjQUFjO0FBQ2xCLENBQ0o7QUFDTyxJQUFNLCtCQUEyQyxxQkFBcUIsS0FBSyxVQUFVO0FBQzVGLElBQU0sMEJBQTBCLGFBQWEsaUJBQ3pDLHNCQUNBO0FBQUEsRUFDSSxNQUFNO0FBQUEsRUFDTixtQkFBbUIsV0FBVyxHQUFHLFVBQVUsRUFBRSxLQUFLLFdBQVcsS0FBSyxDQUFDO0FBQUEsRUFDbkUsb0JBQW9CO0FBQUEsRUFDcEIsY0FBYztBQUNsQixDQUNKO0FBQ0EsSUFBTSwrQkFBK0IsYUFBYSxpQkFDOUMsc0JBQ0E7QUFBQSxFQUNJLE1BQU07QUFBQSxFQUNOLG1CQUFtQixXQUFXLEdBQUcsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLFdBQVcsS0FBSyxDQUFDO0FBQUEsRUFDN0Usb0JBQW9CO0FBQUEsRUFDcEIsY0FBYztBQUNsQixDQUNKO0FBQ08sSUFBTSw2QkFBeUMscUJBQXFCLEtBQUssUUFBUTtBQUN4RixJQUFNLHdCQUF3QixhQUFhLFdBQ3ZDLHNCQUNBO0FBQUEsRUFDSSxNQUFNO0FBQUEsRUFDTixtQkFBbUI7QUFBQSxFQUNuQixjQUFjO0FBQ2xCLENBQ0o7QUFBQTtBQUVPLE1BQU0sZUFBZTtBQUFBLEVBR0s7QUFBQSxFQUZiLE9BQXNDO0FBQUEsRUFFdEQsV0FBVyxDQUFrQixLQUFVO0FBQUEsSUFBVjtBQUFBO0FBQUEsT0FFaEIsT0FBTSxDQUFDLFlBQW9CLFFBQXlDO0FBQUEsSUFDN0UsTUFBTSxrQkFBa0IsTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLHVCQUF1QjtBQUFBLE1BQ3pFLFlBQVksV0FBVyxLQUFLLFVBQVU7QUFBQSxNQUN0QztBQUFBLElBQ0osQ0FBQztBQUFBLElBQ0QsT0FBTztBQUFBO0FBQUEsT0FHRSxXQUFVLElBQUksT0FBdUM7QUFBQSxJQUM5RCxNQUFNLFdBQVcsTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLDRCQUE0QixLQUFLO0FBQUEsSUFDaEYsT0FBTztBQUFBO0FBQUEsT0FHRSxTQUFRLENBQUMsWUFBb0M7QUFBQSxJQUN0RCxNQUFNLEtBQUssV0FBVyxLQUFLLFVBQVU7QUFBQSxJQUNyQyxNQUFNLGFBQWEsTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLHlCQUF5QixFQUFFO0FBQUEsSUFDNUUsT0FBTztBQUFBO0FBQUEsT0FHRSxhQUFZLElBQUksYUFBeUM7QUFBQSxJQUNsRSxNQUFNLGFBQWEsTUFBTSxLQUFLLElBQUksVUFBVSxLQUN4Qyw4QkFDQSxZQUFZLElBQUksQ0FBQyxPQUFPLFdBQVcsS0FBSyxFQUFFLENBQUMsQ0FDL0M7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLE9BR0UsT0FBTSxDQUFDLFlBQW1DO0FBQUEsSUFDbkQsTUFBTSxLQUFLLFdBQVcsS0FBSyxVQUFVO0FBQUEsSUFDckMsTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLHVCQUF1QixFQUFFO0FBQUE7QUFBQSxFQUdwRCxHQUFHLENBQ04sSUFDQSxTQUNNO0FBQUEsSUFDTixNQUFNLE1BQU0sV0FBVyxLQUFLLEVBQUUsRUFBRSxJQUFJO0FBQUEsSUFDcEMsTUFBTSxVQUFVLEtBQUssSUFBSSxRQUFRO0FBQUEsSUFDakMsTUFBTSxXQUFXLFFBQVEsU0FBUyxVQUFVO0FBQUEsSUFDNUMsSUFBSSxTQUFTLFVBQVUsWUFBWTtBQUFBLE1BQy9CLE9BQU8sR0FBRyxjQUFjLFFBQVEsUUFBUSxRQUFRLGlCQUFpQixtQkFBbUIsR0FBRyxPQUFPLEtBQUssSUFBSTtBQUFBLElBQzNHO0FBQUEsSUFDQSxPQUFPLEdBQUcsY0FBYyxRQUFRLFFBQVEsUUFBUSxpQkFBaUIsbUJBQW1CLEdBQUc7QUFBQTtBQUFBLEVBR3BGLEtBQUssQ0FBQyxLQUFxQjtBQUFBLElBQzlCLE1BQU0sVUFBVSxLQUFLLElBQUksUUFBUTtBQUFBLElBQ2pDLE1BQU0sV0FBVyxRQUFRLFNBQVMsVUFBVTtBQUFBLElBQzVDLE9BQU8sR0FBRyxjQUFjLFFBQVEsUUFBUSxRQUFRLGtCQUFrQixtQkFBbUIsR0FBRztBQUFBO0FBRWhHOzs7QUNqSk8sTUFBTSxXQUFjO0FBQUEsRUFFSDtBQUFBLEVBQ0E7QUFBQSxFQUZwQixXQUFXLENBQ1MsSUFDQSxZQUNsQjtBQUFBLElBRmtCO0FBQUEsSUFDQTtBQUFBO0FBQUEsRUFHYixHQUFHLENBQUMsTUFBb0I7QUFBQSxJQUMzQixPQUFPO0FBQUEsTUFDSCxNQUFNO0FBQUEsTUFDTjtBQUFBLElBQ0o7QUFBQTtBQUFBLEVBRUcsS0FBSyxDQUFDLFFBQXFDO0FBQUEsSUFDOUMsT0FBTyxPQUFPLFNBQVM7QUFBQTtBQUFBLFNBR3BCLFVBQTRDLENBQUM7QUFBQSxJQUNoRDtBQUFBLElBQ0E7QUFBQSxLQUljO0FBQUEsSUFDZCxPQUFPLElBQUksV0FDUCxXQUFXLEtBQUssSUFBSSxHQUNwQixXQUFXLEtBQXVCLGNBQWMsV0FBVyxLQUFLLEdBQUcsV0FBVyxLQUFLLENBQUMsQ0FDeEY7QUFBQTtBQUFBLFNBR0csZ0JBQW1CLENBQUM7QUFBQSxJQUN2QjtBQUFBLElBQ0E7QUFBQSxLQUljO0FBQUEsSUFDZCxPQUFPLElBQUksV0FDUCxXQUFXLEtBQUssSUFBSSxHQUNwQixVQUNKO0FBQUE7QUFFUjs7O0FDckNPLE1BQU0sYUFBZ0I7QUFBQSxFQUVMO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFKcEIsV0FBVyxDQUNTLElBQ0EsY0FDQSxZQUNBLGFBQ2xCO0FBQUEsSUFKa0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sVUFBNEMsQ0FBQztBQUFBLElBQ3ZEO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsS0FNZ0I7QUFBQSxJQUNoQixPQUFPLElBQUksYUFDUCxXQUFXLEtBQUssVUFBVSxFQUFFLEtBQUssSUFBSSxHQUNyQyxjQUNBLFdBQVcsS0FBdUIsY0FBYyxXQUFXLEtBQUssR0FBRyxXQUFXLEtBQUssQ0FBQyxHQUNwRixlQUFlLENBQUMsQ0FDcEI7QUFBQTtBQUFBLFNBR1UsZ0JBQW1CLENBQUM7QUFBQSxJQUM5QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEtBTWdCO0FBQUEsSUFDaEIsT0FBTyxJQUFJLGFBQ1AsV0FBVyxLQUFLLFVBQVUsRUFBRSxLQUFLLElBQUksR0FDckMsY0FDQSxZQUNBLGVBQWUsQ0FBQyxDQUNwQjtBQUFBO0FBRVI7OztBQ0RPLE1BQU0sVUFBYTtBQUFBLEVBRVg7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUpYLFdBQVcsQ0FDQSxJQUNBLFlBQ0EsYUFDQSxhQUNUO0FBQUEsSUFKUztBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHRyxVQUE0QyxDQUN0RDtBQUFBLElBRUk7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxLQU9RO0FBQUEsSUFDWixPQUFPLElBQUksVUFDUCxXQUFXLEtBQUssVUFBVSxFQUFFLEtBQUssSUFBSSxHQUNyQyxXQUFXLEtBQXVCLGNBQWMsV0FBVyxLQUFLLEdBQUcsV0FBVyxLQUFLLENBQUMsR0FDcEYsS0FDQSxXQUNKO0FBQUE7QUFBQSxTQUdVLGdCQUFtQixDQUM3QjtBQUFBLElBRUk7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxLQU9RO0FBQUEsSUFDWixPQUFPLElBQUksVUFDUCxXQUFXLEtBQUssVUFBVSxFQUFFLEtBQUssSUFBSSxHQUNyQyxZQUNBLEtBQ0EsV0FDSjtBQUFBO0FBRVI7OztBQ3pDTyxNQUFNLHFCQUFxQjtBQUFBLEVBRVY7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBSHBCLFdBQVcsQ0FDUyxNQUNBLE9BQ0EsVUFBa0IsR0FDcEM7QUFBQSxJQUhrQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUE7QUFBQSxTQUdOLFNBQVMsQ0FBQyxNQUF3QztBQUFBLElBQzVELE1BQU0sU0FBUyxJQUFJO0FBQUEsSUFDbkIsT0FBTyxhQUFhLEtBQUssT0FBTztBQUFBLElBQ2hDLE9BQU8sWUFBWSxLQUFLLFVBQVUsS0FBSyxJQUFJLENBQUM7QUFBQSxJQUM1QyxPQUFPLGFBQWEsT0FBTyxLQUFLLEtBQUssS0FBSyxFQUFFLE1BQU07QUFBQSxJQUVsRCxZQUFZLE9BQU8sTUFBTSxhQUFhLE9BQU8sUUFBUSxLQUFLLEtBQUssR0FBRztBQUFBLE1BQzlELE9BQU8sWUFBWSxHQUFHO0FBQUEsTUFDdEIsT0FBTyxZQUFZLEtBQUssVUFBVSxJQUFJLENBQUM7QUFBQSxNQUN2QyxPQUFPLGdCQUFnQixNQUFNO0FBQUEsSUFDakM7QUFBQSxJQUVBLE9BQU8sT0FBTyxPQUFPO0FBQUE7QUFBQSxTQUdYLFdBQVcsQ0FBQyxNQUF3QztBQUFBLElBQzlELE1BQU0sU0FBUyxXQUFXLGVBQWUsSUFBSTtBQUFBLElBQzdDLE1BQU0sVUFBVSxPQUFPLFlBQVk7QUFBQSxJQUNuQyxNQUFNLE9BQXlCLEtBQUssTUFBTSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQzdELE1BQU0sU0FBUyxPQUFPLFlBQVk7QUFBQSxJQUVsQyxNQUFNLFFBQWtDLENBQUM7QUFBQSxJQUN6QyxTQUFTLElBQUksRUFBRyxJQUFJLFFBQVEsS0FBSztBQUFBLE1BQzdCLE1BQU0sTUFBTSxPQUFPLFdBQVc7QUFBQSxNQUM5QixNQUFNLE9BQXFCLEtBQUssTUFBTSxPQUFPLFdBQVcsQ0FBQztBQUFBLE1BQ3pELE1BQU0sU0FBUyxPQUFPLGVBQWU7QUFBQSxNQUNyQyxNQUFNLE9BQU8sRUFBRSxNQUFNLE9BQU87QUFBQSxJQUNoQztBQUFBLElBRUEsT0FBTyxJQUFJLHFCQUNQLE1BQ0EsT0FDQSxPQUNKO0FBQUE7QUFFUjs7O0FDakdPLElBQU0sMkJBQThELElBQUksY0FDM0UsYUFDQSxDQUFDLFFBQWEsSUFBSSxtQkFBbUIsR0FBRyxDQUM1QztBQUtPLElBQU0sOEJBQTBDLHlCQUF5QixLQUFLLEtBQUs7QUFDMUYsSUFBTSx5QkFBeUIsYUFBYSxXQUN4QywwQkFDQTtBQUFBLEVBQ0ksTUFBTTtBQUFBLEVBQ04sbUJBQW1CO0FBQUEsRUFDbkIsY0FBYztBQUNsQixDQUNKO0FBQ08sSUFBTSxtQ0FBK0MseUJBQXlCLEtBQUssT0FBTyxNQUFNO0FBQ3ZHLElBQU0sOEJBQThCLGFBQWEsV0FBc0IsMEJBQTBCO0FBQUEsRUFDN0YsTUFBTTtBQUFBLEVBQ04sbUJBQW1CO0FBQUEsRUFDbkIsY0FBYztBQUNsQixDQUFDO0FBQ0QsSUFBTSw0QkFBNEIsV0FBVyxXQUFnQiwwQkFBMEI7QUFBQSxFQUNuRixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDTSxJQUFNLG1DQUErQyx5QkFBeUIsS0FBSyxPQUFPLE1BQU07QUFDaEcsSUFBTSxtQ0FBK0MseUJBQXlCLEtBQUssT0FBTyxNQUFNO0FBQ2hHLElBQU0sc0NBQWtELHlCQUF5QixLQUFLLE9BQU8sU0FBUztBQUM3RyxJQUFNLGlDQUFpQyxhQUFhLFdBQW9DLDBCQUEwQjtBQUFBLEVBQzlHLE1BQU07QUFBQSxFQUNOLG1CQUFtQjtBQUFBLEVBQ25CLGNBQWM7QUFDbEIsQ0FBQztBQUNNLElBQU0sb0NBQWdELHlCQUF5QixLQUFLLFdBQVc7QUFDdEcsSUFBTSxtQ0FBbUMsV0FBVyxXQUEyQiwwQkFBMEI7QUFBQSxFQUNyRyxNQUFNO0FBQUEsRUFDTixZQUFZLFdBQVcsS0FBcUIsRUFDdkMsTUFBTSxPQUFPLEdBQUc7QUFDekIsQ0FBQztBQUNELElBQU0sb0NBQW9DLGFBQWEsaUJBQTRELDBCQUEwQjtBQUFBLEVBQ3pJLE1BQU07QUFBQSxFQUNOLG1CQUFtQixXQUFXLEtBQUs7QUFBQSxFQUNuQyxvQkFBb0I7QUFDeEIsQ0FBQztBQUNELElBQU0sMENBQTBDLFdBQVcsV0FBeUMsMEJBQTBCO0FBQUEsRUFDMUgsTUFBTTtBQUNWLENBQUM7QUFDRCxJQUFNLDJDQUEyQyxXQUFXLGlCQUF1QywwQkFBMEI7QUFBQSxFQUN6SCxNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDRCxJQUFNLHVDQUF1QyxhQUFhLFdBQXFELDBCQUEwQjtBQUFBLEVBQ3JJLE1BQU07QUFBQSxFQUNOLGNBQWM7QUFDbEIsQ0FBQztBQUNELElBQU0scUNBQXFDLFdBQVcsV0FBcUMsMEJBQTBCO0FBQUEsRUFDakgsTUFBTTtBQUNWLENBQUM7QUFDRCxJQUFNLDhDQUE4QyxXQUFXLFdBQW9DLDBCQUEwQjtBQUFBLEVBQ3pILE1BQU07QUFDVixDQUFDO0FBQUE7QUFnQ00sTUFBTSxXQUFjO0FBQUEsRUFFWjtBQUFBLEVBRFgsV0FBVyxDQUNBLFFBUVQ7QUFBQSxJQVJTO0FBQUE7QUFBQSxFQVVKLE1BQU0sR0FBTTtBQUFBLElBQ2YsSUFBSSxLQUFLLE9BQU8sU0FBUztBQUFBLE1BQU0sT0FBTyxLQUFLLE9BQU87QUFBQSxJQUNsRCxNQUFNLElBQUksTUFBTSxxQkFBcUIsS0FBSyxPQUFPLGFBQWE7QUFBQTtBQUV0RTtBQUlPLElBQU0sa0NBQThDLHlCQUF5QixLQUFLLFNBQVM7QUFVbEcsSUFBTSx3QkFBd0IsYUFBYSxXQUFzRCwwQkFBMEI7QUFBQSxFQUN2SCxNQUFNO0FBQUEsRUFDTixjQUFjO0FBQ2xCLENBQUM7QUFFRCxJQUFNLDRCQUE0QixhQUFhLFdBQTRDLDBCQUEwQjtBQUFBLEVBQ2pILE1BQU07QUFBQSxFQUNOLG9CQUFvQixXQUFXLEtBQXNCLEVBQ2hELE1BQU0sTUFBTSxVQUFVO0FBQUEsRUFDM0IsY0FBYztBQUNsQixDQUFDO0FBRUQsSUFBTSwwQkFBMEIsYUFBYSxXQUEyQywwQkFBMEI7QUFBQSxFQUM5RyxNQUFNO0FBQUEsRUFDTixtQkFBbUIsV0FBVyxLQUFvQixFQUM3QyxNQUFNLE1BQU0sVUFBVTtBQUFBLEVBQzNCLG9CQUFvQixXQUFXLEtBQXNCLEVBQ2hELE1BQU0sTUFBTSxVQUFVO0FBQUEsRUFDM0IsY0FBYztBQUNsQixDQUFDO0FBb0NELElBQU0saUNBQWlDLFdBQVcsV0FBK0IsMEJBQTBCO0FBQUEsRUFDdkcsTUFBTTtBQUFBLEVBQ04sWUFBWSxXQUFXLEtBQXlCLEVBQzNDLE1BQU0sTUFBTSxVQUFVLEVBQ3RCLE1BQU0sVUFBVSxVQUFVO0FBQ25DLENBQUM7QUFPRCxJQUFNLDBCQUEwQixVQUFVLFdBQXdCLDBCQUEwQjtBQUFBLEVBQ3hGLE1BQU07QUFBQSxFQUNOLEtBQUssQ0FBQyxVQUFVLE1BQU07QUFBQSxFQUN0QixZQUFZLFdBQVcsS0FBa0IsRUFDcEMsTUFBTSxRQUFRLFdBQVcsR0FBRyxVQUFVLEVBQUUsUUFBUSxDQUFDO0FBQzFELENBQUM7QUFFRCxJQUFNLHlCQUF5QixhQUFhLFdBRTNCLDBCQUEwQjtBQUFBLEVBQ3ZDLE1BQU07QUFBQSxFQUNOLGNBQWM7QUFDbEIsQ0FBQztBQUVNLElBQU0sNkNBQXlELHlCQUF5QixLQUFLLG9CQUFvQjtBQXlCeEgsSUFBTSwrQkFBK0IsYUFBYSxXQUE2QiwwQkFBMEI7QUFBQSxFQUNyRyxNQUFNO0FBQUEsRUFDTixjQUFjLEVBQUUsTUFBTSxPQUFPO0FBQUEsRUFDN0IsYUFBYTtBQUFBLElBQ1QsTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLEVBQ1g7QUFDSixDQUFDO0FBTUQsSUFBTSxxQ0FBcUMsYUFBYSxXQUE0RCwwQkFBMEI7QUFBQSxFQUMxSSxNQUFNO0FBQUEsRUFDTixjQUFjO0FBQ2xCLENBQUM7QUF1Q0QsSUFBTSwyQkFBMkIsV0FBVyxXQUEwQiwwQkFBMEI7QUFBQSxFQUM1RixNQUFNO0FBQ1YsQ0FBQztBQVVELElBQU0sNEJBQTRCLFdBQVcsV0FBMkIsMEJBQTBCO0FBQUEsRUFDOUYsTUFBTTtBQUNWLENBQUM7QUFBQTtBQUVNLE1BQU0sbUJBQW1CO0FBQUEsRUFjQztBQUFBLEVBYmIsT0FBMEM7QUFBQSxFQUNsRCxZQUFxQztBQUFBLEVBQ3JDLGtCQUEwQztBQUFBLEVBQzFDLG9CQUFvQjtBQUFBLElBQ3hCLE9BQU8sQ0FBQztBQUFBLElBQ1IsTUFBTSxDQUFDO0FBQUEsSUFDUCxNQUFNLENBQUM7QUFBQSxJQUNQLE9BQU8sQ0FBQztBQUFBLEVBQ1o7QUFBQSxFQUNnQjtBQUFBLEVBQ0E7QUFBQSxFQUNDLGlCQUFtRixJQUFJO0FBQUEsRUFFeEcsV0FBVyxDQUFrQixLQUFVO0FBQUEsSUFBVjtBQUFBLElBQ3pCLElBQUksUUFBUSxlQUNSLDJCQUNBLGtDQUNBLHlDQUNBLDBDQUNBLG9DQUNBLDZDQUNBLGdDQUNBLDBCQUNBLHlCQUNKO0FBQUEsSUFDQSxJQUFJLFFBQVEsaUJBQWlCLDBCQUEwQixDQUFDLFlBQ3BELEtBQUssb0JBQW9CLE9BQU8sQ0FDcEM7QUFBQSxJQUNBLElBQUksUUFBUSxpQkFBaUIsMkJBQTJCLENBQUMsUUFDckQsS0FBSyxjQUFjLEdBQUcsQ0FDMUI7QUFBQSxJQUNBLElBQUksUUFBUSxpQkFBaUIsb0NBQW9DLENBQUMsWUFBWTtBQUFBLE1BQzFFLEtBQUssc0JBQXNCLE9BQU87QUFBQSxLQUNyQztBQUFBLElBQ0QsSUFBSSxRQUFRLGlCQUFpQixrQ0FBa0MsR0FBRyxZQUFZO0FBQUEsTUFDMUUsUUFBUSxNQUFNO0FBQUEsYUFDTCxTQUFTO0FBQUEsVUFDVixLQUFLLGtCQUFrQixNQUFNLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQUEsVUFDdEQ7QUFBQSxRQUNKO0FBQUEsYUFDSyxRQUFRO0FBQUEsVUFDVCxLQUFLLGtCQUFrQixLQUFLLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQUEsVUFDckQ7QUFBQSxRQUNKO0FBQUEsYUFDSyxRQUFRO0FBQUEsVUFDVCxLQUFLLGtCQUFrQixLQUFLLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQUEsVUFDckQ7QUFBQSxRQUNKO0FBQUEsYUFDSyxTQUFTO0FBQUEsVUFDVixLQUFLLGtCQUFrQixNQUFNLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQUEsVUFDdEQ7QUFBQSxRQUNKO0FBQUE7QUFBQSxLQUVQO0FBQUEsSUFDRCxJQUFJLFFBQVEsaUJBQWlCLHlDQUF5QyxDQUFDLFlBQVk7QUFBQSxNQUMvRSxLQUFLLDBCQUEwQixPQUFPO0FBQUEsS0FDekM7QUFBQSxJQUNELElBQUksUUFBUSxpQkFBaUIsZ0NBQWdDLENBQUMsV0FBVztBQUFBLE1BQ3JFLE1BQU0sU0FBUyxLQUFLLGVBQWUsSUFBSSxPQUFPLEVBQUU7QUFBQSxNQUNoRCxJQUFJLENBQUM7QUFBQSxRQUFRO0FBQUEsTUFDYixPQUFPLEtBQUssT0FBTyxLQUFLO0FBQUEsS0FDM0I7QUFBQSxJQUNELEtBQUssZUFBZSxJQUFJLE9BQU8sSUFBSSx1QkFBdUI7QUFBQSxJQUMxRCxLQUFLLG9CQUFvQixJQUFJLFdBQVcsSUFBSSw0QkFBNEI7QUFBQTtBQUFBLE9BRzlELDJCQUEwQixDQUFDLFNBQStDO0FBQUEsSUFDcEYsTUFBTSxZQUFZLEtBQUssYUFBYTtBQUFBLElBQ3BDLFFBQVEsUUFBUTtBQUFBLFdBQ1A7QUFBQSxRQUNELE9BQU8sTUFBTSxVQUFVLHdCQUF3QixPQUFPO0FBQUEsV0FDckQ7QUFBQSxRQUNELE9BQU8sTUFBTSxVQUFVLG9CQUFvQixPQUFPO0FBQUEsV0FDakQ7QUFBQSxRQUNELE9BQU8sTUFBTSxVQUFVLGlCQUFpQixPQUFPO0FBQUEsV0FDOUM7QUFBQSxRQUNELE9BQU8sTUFBTSxVQUFVLGdCQUFnQixPQUFPO0FBQUEsV0FDN0M7QUFBQSxRQUNELE9BQU8sTUFBTSxVQUFVLG1CQUFtQixPQUFPO0FBQUE7QUFBQSxRQUVqRCxNQUFNLElBQUksTUFBTSw2QkFBNkIsS0FBSyxVQUFVLE9BQU8sR0FBRztBQUFBO0FBQUE7QUFBQSxPQUlwRSxvQkFBbUIsQ0FBQyxTQUF1QztBQUFBLElBQ3JFLE1BQU0sV0FBVyxNQUFNLEtBQUssMkJBQTJCLE9BQU87QUFBQSxJQUM5RCxLQUFLLElBQUksS0FBSywyQkFBMkI7QUFBQSxNQUNyQyxJQUFJLFFBQVE7QUFBQSxNQUNaLE1BQU0sUUFBUTtBQUFBLE1BQ2QsUUFBUTtBQUFBLElBQ1osQ0FBQztBQUFBO0FBQUEsT0FHUyxjQUFhLENBQUMsS0FBeUI7QUFBQSxJQUNqRCxNQUFNLFlBQVksS0FBSyxhQUFhO0FBQUEsSUFDcEMsTUFBTSxVQUFVLGNBQWMsR0FBRztBQUFBO0FBQUEsT0FHdkIsc0JBQXFCLENBQUMsU0FBa0Q7QUFBQSxJQUNsRixNQUFNLFlBQVksS0FBSyxhQUFhO0FBQUEsSUFDcEMsTUFBTSxXQUFXLE1BQU0sVUFBVSxzQkFBc0IsT0FBTztBQUFBLElBQzlELEtBQUssSUFBSSxLQUFLLDZDQUE2QztBQUFBLE1BQ3ZELElBQUk7QUFBQSxNQUNKLFlBQVksUUFBUTtBQUFBLElBQ3hCLENBQUM7QUFBQTtBQUFBLE9BR1MsMEJBQXlCLENBQUMsU0FBc0Q7QUFBQSxJQUMxRixNQUFNLFlBQVksS0FBSyxhQUFhO0FBQUEsSUFDcEMsTUFBTSxXQUFXLE1BQU0sVUFBVSwwQkFBMEIsT0FBTztBQUFBLElBQ2xFLEtBQUssSUFBSSxLQUFLLDBDQUEwQyxRQUFRO0FBQUE7QUFBQSxFQUc1RCxZQUFZLEdBQXFCO0FBQUEsSUFDckMsSUFBSSxLQUFLLGNBQWMsTUFBTTtBQUFBLE1BQ3pCLE1BQU0sSUFBSSxNQUFNLG1CQUFtQjtBQUFBLElBQ3ZDO0FBQUEsSUFDQSxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBR1QsR0FBRyxDQUFDLFdBQW1DO0FBQUEsSUFDMUMsS0FBSyxJQUFJLFlBQVksUUFBUSwyQkFBMkI7QUFBQSxJQUN4RCxJQUFJLEtBQUssY0FBYyxNQUFNO0FBQUEsTUFDekIsTUFBTSxJQUFJLE1BQU0sdUJBQXVCO0FBQUEsSUFDM0M7QUFBQSxJQUNBLEtBQUssWUFBWTtBQUFBLElBQ2pCLEtBQUssSUFBSSxVQUFVLEtBQUssdUJBQXVCLE9BQU8sU0FBUyxXQUE0QztBQUFBLE1BQ3ZHLFFBQVEsUUFBUTtBQUFBLE1BQ2hCLFFBQVEsYUFBYSxJQUFJLElBQUksR0FBRztBQUFBLE1BQ2hDLE1BQU0sY0FBYyxNQUFNLEtBQUssYUFBYSxJQUFJLFFBQVEsS0FBSyxFQUFFLE1BQU0sVUFBVSxNQUFNLENBQUMsRUFBRTtBQUFBLE1BQ3hGLE1BQU0sVUFBVSxZQUFZLEtBQUssS0FBSyxDQUFDLFNBQVMsS0FBSyxRQUFRLE9BQU8sTUFBTSxDQUFDO0FBQUEsTUFDM0UsSUFBSSxDQUFDLFNBQVM7QUFBQSxRQUNWLE9BQU87QUFBQSxVQUNILE1BQU07QUFBQSxRQUNWO0FBQUEsTUFDSjtBQUFBLE1BQ0EsT0FBTyxNQUFNLFVBQVUsV0FBVyxPQUFPO0FBQUEsS0FDNUM7QUFBQSxJQUNELEtBQUssSUFBSSxVQUFVLEtBQUssd0JBQXdCLE9BQU8sU0FBUyxXQUFrQztBQUFBLE1BQzlGLFFBQVEsU0FBUztBQUFBLE1BQ2pCLE1BQU0sWUFBWSxNQUFNLEtBQUssYUFBYSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDLEVBQUU7QUFBQSxNQUN4RSxNQUFNLFVBQVUsVUFBVSxLQUFLLEtBQUssQ0FBQyxVQUFTLE1BQUssUUFBUSxPQUFPLE1BQU0sQ0FBQztBQUFBLE1BQ3pFLElBQUksU0FBUztBQUFBLFFBQ1QsT0FBTztBQUFBLFVBQ0gsTUFBTTtBQUFBLFVBQ04sT0FBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBQUEsTUFDQSxNQUFNLFNBQVMsTUFBTSxVQUFVLGNBQWMsU0FBUyxNQUFNO0FBQUEsTUFDNUQsSUFBSSxPQUFPLFNBQVMsTUFBTTtBQUFBLFFBQ3RCLFVBQVUsS0FBSyxLQUFLLE9BQU8sTUFBTTtBQUFBLFFBQ2pDLE1BQU0sS0FBSyxhQUFhLE9BQU8sU0FBUztBQUFBLE1BQzVDO0FBQUEsTUFDQSxPQUFPO0FBQUEsS0FDVjtBQUFBLElBQ0QsS0FBSyxJQUFJLFVBQVUsS0FBSywyQkFBMkIsT0FBTyxTQUFTLFdBQXFDO0FBQUEsTUFDcEcsTUFBTSxPQUFPLE9BQU8sVUFBd0I7QUFBQSxRQUN4QyxLQUFLLElBQUksS0FBSyxnQ0FBZ0M7QUFBQSxVQUMxQztBQUFBLFVBQ0EsUUFBUSxPQUFPO0FBQUEsVUFDZjtBQUFBLFFBQ0osQ0FBQztBQUFBO0FBQUEsTUFFTCxNQUFNLEtBQUssTUFBTSxVQUFVLGNBQWMsU0FBUyxRQUFRLElBQUk7QUFBQSxNQUM5RCxPQUFPO0FBQUEsUUFDSCxNQUFNO0FBQUEsUUFDTjtBQUFBLFFBQ0EsT0FBTztBQUFBLE1BQ1g7QUFBQSxLQUNIO0FBQUEsSUFDRCxLQUFLLElBQUksVUFBVSxLQUFLLHlCQUF5QixPQUFPLFNBQVMsV0FBcUM7QUFBQSxNQUNsRyxNQUFNLEtBQUssTUFBTSxVQUFVLFdBQVcsU0FBUyxNQUFNO0FBQUEsTUFDckQsSUFBSSxDQUFDLElBQUk7QUFBQSxRQUNMLE9BQU87QUFBQSxVQUNILE1BQU07QUFBQSxVQUNOLElBQUksUUFBUTtBQUFBLFFBQ2hCO0FBQUEsTUFDSjtBQUFBLE1BQ0EsTUFBTSxVQUFVLGFBQWEsU0FBUyxNQUFNO0FBQUEsTUFDNUMsT0FBTztBQUFBLFFBQ0gsTUFBTTtBQUFBLFFBQ047QUFBQSxRQUNBLE9BQU87QUFBQSxNQUNYO0FBQUEsS0FDSDtBQUFBLElBQ0QsS0FBSyxJQUFJLFVBQVUsS0FBSyxvQ0FBb0MsT0FBTyxTQUFTLFdBQTZDO0FBQUEsTUFDckgsTUFBTSxTQUFTLE1BQU0sVUFBVSx1QkFBdUIsU0FBUyxNQUFNO0FBQUEsTUFDckUsT0FBTztBQUFBLEtBQ1Y7QUFBQSxJQUNELEtBQUssSUFBSSxRQUFRLFFBQVEsWUFBWTtBQUFBLE1BQ2pDLE1BQU0sV0FBVyxNQUFNLEtBQUssSUFBSSxVQUFVLEtBQ3RDLHdCQUNBLEtBQUssSUFBSSxJQUFJLEVBQ2pCO0FBQUEsTUFDQSxJQUFJLENBQUMsU0FBUyxTQUFTO0FBQUEsUUFDbkIsTUFBTSxJQUFJLE1BQU0seUJBQXlCO0FBQUEsTUFDN0M7QUFBQSxLQUNIO0FBQUE7QUFBQSxPQUdRLFlBQVcsQ0FBQyxTQUFrRDtBQUFBLElBQ3ZFLE9BQU8sS0FBSyxJQUFJLFVBQVUsS0FDdEIsd0JBQ0EsT0FDSjtBQUFBO0FBQUEsT0FHUyxlQUFjLENBQUMsU0FBNkQ7QUFBQSxJQUNyRixNQUFNLFNBQVMsTUFBTSxLQUFLLElBQUksVUFBVSxLQUNwQywyQkFDQSxPQUNKO0FBQUEsSUFDQSxJQUFJLE9BQU8sU0FBUztBQUFBLE1BQU0sT0FBTyxJQUFJLFdBQVcsTUFBTTtBQUFBLElBQ3RELFFBQVEsT0FBTztBQUFBLElBQ2YsTUFBTSxpQkFBd0MsQ0FBQztBQUFBLElBQy9DLE1BQU0sU0FBd0I7QUFBQSxNQUMxQjtBQUFBLE1BQ0EsS0FBSyxRQUFRO0FBQUEsTUFDYixPQUFPLFlBQVk7QUFBQSxRQUNmLE1BQU0sS0FBSyxJQUFJLFVBQVUsS0FDckIseUJBQ0EsRUFBRSxHQUFHLENBQ1Q7QUFBQTtBQUFBLE1BRUosWUFBWSxZQUFZO0FBQUEsUUFDcEIsTUFBTSxXQUFXLE1BQU0sS0FBSyxXQUFXO0FBQUEsVUFDbkMsS0FBSyxRQUFRO0FBQUEsUUFDakIsQ0FBQyxHQUFHLE9BQU87QUFBQSxRQUNYLE9BQU87QUFBQTtBQUFBLE1BRVgsSUFBSSxRQUF5QyxDQUFDLEtBQVEsVUFBcUU7QUFBQSxRQUN2SCxJQUFJLENBQUMsZUFBZSxNQUFNO0FBQUEsVUFDdEIsZUFBZSxPQUFPLENBQUM7QUFBQSxRQUMzQjtBQUFBLFFBQ0EsTUFBTSxZQUFZLGVBQWU7QUFBQSxRQUNqQyxVQUFVLEtBQUssUUFBUTtBQUFBO0FBQUEsTUFFM0IsTUFBTSxZQUFZO0FBQUEsUUFDZCxNQUFNLElBQUksUUFBYyxDQUFDLFlBQVk7QUFBQSxVQUNqQyxPQUFPLEdBQUcsVUFBVSxNQUFNLFFBQVEsQ0FBQztBQUFBLFNBQ3RDO0FBQUE7QUFBQSxJQUVUO0FBQUEsSUFDQSxLQUFLLGVBQWUsSUFBSSxJQUFJO0FBQUEsTUFDeEI7QUFBQSxNQUNBLE1BQU0sUUFBeUMsQ0FBQyxPQUFpRDtBQUFBLFFBQzdGLE1BQU0sWUFBWSxlQUFlLE1BQU07QUFBQSxRQUN2QyxJQUFJLENBQUM7QUFBQSxVQUFXO0FBQUEsUUFDaEIsV0FBVyxZQUFZLFdBQVc7QUFBQSxVQUM5QixTQUFTLEtBQUs7QUFBQSxRQUNsQjtBQUFBO0FBQUEsSUFFUixDQUFDO0FBQUEsSUFDRCxPQUFPLElBQUksV0FBVztBQUFBLE1BQ2xCLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxJQUNYLENBQUM7QUFBQTtBQUFBLE9BR1EsV0FBVSxDQUFDLFNBQTJEO0FBQUEsSUFDL0UsT0FBTyxJQUFJLFdBQVcsTUFBTSxLQUFLLElBQUksVUFBVSxLQUMzQyx1QkFDQSxPQUNKLENBQUM7QUFBQTtBQUFBLE9BR1EsUUFBTyxDQUFDLEtBQXlCO0FBQUEsSUFDMUMsT0FBTyxNQUFNLEtBQUssSUFBSSxVQUFVLEtBQUssNkJBQTZCLEdBQUc7QUFBQTtBQUFBLE9BRzVELFdBQVUsQ0FBQyxLQUF1QztBQUFBLElBQzNELE9BQU8sTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLGdDQUFnQyxHQUFHO0FBQUE7QUFBQSxPQUcvRCxnQkFBZSxHQUE2QjtBQUFBLElBQ3JELE1BQU0sS0FBSyxJQUFJLFVBQVUsS0FBSyxzQ0FBc0MsQ0FBQyxDQUFDO0FBQUEsSUFDdEUsTUFBTSxZQUFZLEtBQUs7QUFBQSxJQUN2QixNQUFNLFNBQVMsS0FBSztBQUFBLElBQ3BCLEtBQUssa0JBQWtCO0FBQUEsTUFDbkIsT0FBTyxDQUFDLElBQUk7QUFBQSxRQUFFLFVBQVUsTUFBTSxLQUFLLEVBQUU7QUFBQTtBQUFBLE1BQ3JDLE1BQU0sQ0FBQyxJQUFJO0FBQUEsUUFBRSxVQUFVLEtBQUssS0FBSyxFQUFFO0FBQUE7QUFBQSxNQUNuQyxNQUFNLENBQUMsSUFBSTtBQUFBLFFBQUUsVUFBVSxLQUFLLEtBQUssRUFBRTtBQUFBO0FBQUEsTUFDbkMsT0FBTyxDQUFDLElBQUk7QUFBQSxRQUFFLFVBQVUsTUFBTSxLQUFLLEVBQUU7QUFBQTtBQUFBLFdBQy9CLEtBQUksQ0FBQyxJQUFJO0FBQUEsUUFBRSxPQUFPLE1BQU0sT0FBTyxVQUFVLEtBQUssbUNBQW1DLEVBQUUsU0FBUyxHQUFHLENBQUM7QUFBQTtBQUFBLElBQzFHO0FBQUEsSUFDQSxPQUFPLEtBQUs7QUFBQTtBQUFBLE9BR0gsb0JBQW1CLENBQUMsUUFBdUM7QUFBQSxJQUNwRSxLQUFLLElBQUksS0FBSyxrQ0FBa0MsTUFBTTtBQUFBO0FBQUEsT0FHN0MsdUJBQXNCLEdBQWtCO0FBQUEsSUFDakQsTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLG9DQUFvQyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQUE7QUFFM0Y7OztBQy9sQkEsSUFBTSxhQUFhLElBQUksV0FBVyxRQUFRLFFBQVE7QUFBQTtBQW1DM0MsTUFBTSxjQUFjO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRWhCLFdBQVcsQ0FBQyxTQUtUO0FBQUEsSUFDQyxLQUFLLFdBQVcsUUFBUTtBQUFBLElBQ3hCLEtBQUssTUFBTSxRQUFRO0FBQUEsSUFDbkIsS0FBSyxRQUFRLFFBQVE7QUFBQSxJQUNyQixLQUFLLGFBQWEsUUFBUSxjQUFjO0FBQUE7QUFBQSxTQUc5QixXQUFXLENBQUMsTUFBd0M7QUFBQSxJQUM5RCxPQUFPLElBQUksY0FBYztBQUFBLE1BQ3JCLFVBQVUsS0FBSztBQUFBLE1BQ2YsS0FBSyxJQUFJLFlBQVksS0FBSyxHQUFHO0FBQUEsTUFDN0IsWUFBWSxLQUFLO0FBQUEsTUFDakIsT0FBTyxLQUFLO0FBQUEsSUFDaEIsQ0FBQztBQUFBO0FBQUEsU0FHUyxTQUFTLENBQUMsTUFBd0M7QUFBQSxJQUM1RCxPQUFPO0FBQUEsTUFDSCxVQUFVLEtBQUs7QUFBQSxNQUNmLEtBQUssSUFBSSxVQUFVLEtBQUssR0FBRztBQUFBLE1BQzNCLFlBQVksS0FBSztBQUFBLE1BQ2pCLE9BQU8sS0FBSztBQUFBLElBQ2hCO0FBQUE7QUFFUjtBQXVCTyxNQUFNLGlCQUFpQjtBQUFBLEVBQ1Y7QUFBQSxFQUNBO0FBQUEsRUFFaEIsV0FBVyxDQUFDLFNBR1Q7QUFBQSxJQUNDLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsS0FBSyxVQUFVLFFBQVEsV0FBVztBQUFBO0FBQUEsU0FHeEIsU0FBUyxDQUFDLE1BQThDO0FBQUEsSUFDbEUsT0FBTyxLQUFLLE9BQU87QUFBQTtBQUFBLFNBR1QsV0FBVyxDQUFDLE1BQThDO0FBQUEsSUFDcEUsT0FBTyxpQkFBaUIsU0FBUyxJQUFJO0FBQUE7QUFBQSxTQUdsQyxRQUFRLENBQUMsTUFBOEM7QUFBQSxJQUMxRCxPQUFPLElBQUksaUJBQWlCO0FBQUEsTUFDeEIsTUFBTSxLQUFLO0FBQUEsTUFDWCxTQUFTLEtBQUs7QUFBQSxJQUNsQixDQUFDO0FBQUE7QUFBQSxFQUdMLE1BQU0sR0FBeUI7QUFBQSxJQUMzQixPQUFPO0FBQUEsTUFDSCxNQUFNLEtBQUs7QUFBQSxNQUNYLFNBQVMsS0FBSztBQUFBLElBQ2xCO0FBQUE7QUFFUjtBQUVPLElBQU0sZUFPVDtBQUFBLEVBQ0EsYUFBYSxXQUFXLFdBQXVCLFlBQVk7QUFBQSxJQUN2RCxNQUFNO0FBQUEsRUFDVixDQUFDO0FBQUEsRUFDRCxTQUFTLFdBQVcsV0FBMEIsWUFBWTtBQUFBLElBQ3RELE1BQU07QUFBQSxJQUNOLFlBQVk7QUFBQSxFQUNoQixDQUFDO0FBQUEsRUFDRCxZQUFZLFdBQVcsV0FBNkIsWUFBWTtBQUFBLElBQzVELE1BQU07QUFBQSxJQUNOLFlBQVk7QUFBQSxFQUNoQixDQUFDO0FBQUEsRUFDRCxPQUFPLFdBQVcsV0FBbUIsWUFBWTtBQUFBLElBQzdDLE1BQU07QUFBQSxFQUNWLENBQUM7QUFBQSxFQUNELE9BQU8sV0FBVyxXQUFzQixZQUFZO0FBQUEsSUFDaEQsTUFBTTtBQUFBLEVBQ1YsQ0FBQztBQUFBLEVBQ0Qsa0JBQWtCLFdBQVcsaUJBQTZCLFlBQVk7QUFBQSxJQUNsRSxNQUFNO0FBQUEsSUFDTixZQUFZLFdBQVcsS0FBSztBQUFBLEVBQ2hDLENBQUM7QUFDTDs7QUNoS08sTUFBTSx1QkFBdUI7QUFBQSxFQUVyQjtBQUFBLEVBRFgsV0FBVyxDQUNBLFdBQ1Q7QUFBQSxJQURTO0FBQUE7QUFBQSxTQUdHLFNBQVMsQ0FBQyxNQUEwQztBQUFBLElBQzlELE1BQU0sU0FBUyxJQUFJO0FBQUEsSUFDbkIsT0FBTyxhQUFhLEtBQUssVUFBVSxJQUFJO0FBQUEsSUFDdkMsWUFBWSxLQUFLLFVBQVUsS0FBSyxXQUFXO0FBQUEsTUFDdkMsT0FBTyxZQUFZLElBQUksSUFBSSxDQUFDO0FBQUEsTUFDNUIsT0FBTyxZQUFZLE9BQU8sSUFBSSxLQUFLLEVBQUU7QUFBQSxJQUN6QztBQUFBLElBQ0EsT0FBTyxPQUFPLE9BQU87QUFBQTtBQUFBLFNBR1gsV0FBVyxDQUFDLE1BQTBDO0FBQUEsSUFDaEUsTUFBTSxTQUFTLFdBQVcsZUFBZSxJQUFJO0FBQUEsSUFDN0MsTUFBTSxRQUFRLE9BQU8sWUFBWTtBQUFBLElBQ2pDLE1BQU0sWUFBWSxJQUFJO0FBQUEsSUFDdEIsU0FBUyxJQUFJLEVBQUcsSUFBSSxPQUFPLEtBQUs7QUFBQSxNQUM1QixNQUFNLE1BQU0sV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQUEsTUFDbEQsTUFBTSxRQUFRLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQztBQUFBLE1BQ3BELFVBQVUsSUFBSSxLQUFLLEtBQUs7QUFBQSxJQUM1QjtBQUFBLElBQ0EsT0FBTyxJQUFJLHVCQUF1QixTQUFTO0FBQUE7QUFFbkQ7QUFBQTtBQUVPLE1BQU0sY0FBYztBQUFBLEVBRUg7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBSHBCLFdBQVcsQ0FDUyxJQUNBLFFBQ0EsS0FDbEI7QUFBQSxJQUhrQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUE7QUFBQSxTQUdOLFNBQVMsQ0FBQyxNQUE2QjtBQUFBLElBQ2pELE9BQU8sS0FBSyxVQUFVO0FBQUEsTUFDbEIsSUFBSSxLQUFLLEdBQUcsSUFBSTtBQUFBLE1BQ2hCLFFBQVEsS0FBSyxPQUFPLElBQUk7QUFBQSxNQUN4QixLQUFLLEtBQUs7QUFBQSxJQUNkLENBQUM7QUFBQTtBQUFBLFNBR1MsV0FBVyxDQUFDLE1BQTZCO0FBQUEsSUFDbkQsTUFBTSxPQUlGLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFDbkIsT0FBTyxJQUFJLGNBQ1AsV0FBVyxRQUFRLEtBQUssRUFBRSxHQUMxQixXQUFXLFFBQVEsS0FBSyxNQUFNLEdBQzlCLEtBQUssR0FDVDtBQUFBO0FBRVI7QUFBQTtBQUVPLE1BQU0sc0JBQXNCO0FBQUEsRUFFcEI7QUFBQSxFQUNBO0FBQUEsRUFGWCxXQUFXLENBQ0EsUUFDQSxRQUNUO0FBQUEsSUFGUztBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR0csU0FBUyxDQUFDLE1BQXlDO0FBQUEsSUFDN0QsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksY0FBYyxVQUFVLEtBQUssTUFBTSxDQUFDO0FBQUEsSUFDdkQsT0FBTyxnQkFBZ0IsS0FBSyxNQUFNO0FBQUEsSUFDbEMsT0FBTyxPQUFPLE9BQU87QUFBQTtBQUFBLFNBR1gsV0FBVyxDQUFDLE1BQXlDO0FBQUEsSUFDL0QsTUFBTSxTQUFTLFdBQVcsZUFBZSxJQUFJO0FBQUEsSUFDN0MsTUFBTSxTQUFTLGNBQWMsWUFBWSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQzVELE1BQU0sU0FBUyxPQUFPLGVBQWU7QUFBQSxJQUNyQyxPQUFPLElBQUksc0JBQXNCLFFBQVEsTUFBTTtBQUFBO0FBRXZEO0FBQUE7QUFFTyxNQUFNLGFBQWE7QUFBQSxFQUVGO0FBQUEsRUFDQTtBQUFBLEVBRnBCLFdBQVcsQ0FDUyxJQUNBLEtBQ2xCO0FBQUEsSUFGa0I7QUFBQSxJQUNBO0FBQUE7QUFBQSxTQUdOLFNBQVMsQ0FBQyxNQUE0QjtBQUFBLElBQ2hELE9BQU8sS0FBSyxVQUFVO0FBQUEsTUFDbEIsSUFBSSxLQUFLLEdBQUcsSUFBSTtBQUFBLE1BQ2hCLEtBQUssS0FBSztBQUFBLElBQ2QsQ0FBQztBQUFBO0FBQUEsU0FHUyxXQUFXLENBQUMsTUFBNEI7QUFBQSxJQUNsRCxNQUFNLE9BR0YsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUNuQixPQUFPLElBQUksYUFDUCxXQUFXLFFBQVEsS0FBSyxFQUFFLEdBQzFCLEtBQUssR0FDVDtBQUFBO0FBRVI7QUFBQTtBQUVPLE1BQU0scUJBQXFCO0FBQUEsRUFFbkI7QUFBQSxFQUNBO0FBQUEsRUFGWCxXQUFXLENBQ0EsUUFDQSxRQUNUO0FBQUEsSUFGUztBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR0csU0FBUyxDQUFDLE1BQXdDO0FBQUEsSUFDNUQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksYUFBYSxVQUFVLEtBQUssTUFBTSxDQUFDO0FBQUEsSUFDdEQsT0FBTyxnQkFBZ0IsS0FBSyxNQUFNO0FBQUEsSUFDbEMsT0FBTyxPQUFPLE9BQU87QUFBQTtBQUFBLFNBR1gsV0FBVyxDQUFDLE1BQXdDO0FBQUEsSUFDOUQsTUFBTSxTQUFTLFdBQVcsZUFBZSxJQUFJO0FBQUEsSUFDN0MsTUFBTSxTQUFTLGFBQWEsWUFBWSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQzNELE1BQU0sU0FBUyxPQUFPLGVBQWU7QUFBQSxJQUNyQyxPQUFPLElBQUkscUJBQXFCLFFBQVEsTUFBTTtBQUFBO0FBRXREO0FBQUE7QUFFTyxNQUFNLGVBQWU7QUFBQSxFQUVKO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUhwQixXQUFXLENBQ1MsSUFDQSxLQUNBLE9BQ2xCO0FBQUEsSUFIa0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHTixTQUFTLENBQUMsTUFBOEI7QUFBQSxJQUNsRCxPQUFPLEtBQUssVUFBVTtBQUFBLE1BQ2xCLElBQUksS0FBSyxHQUFHLElBQUk7QUFBQSxNQUNoQixLQUFLLEtBQUs7QUFBQSxNQUNWLE9BQU8sS0FBSztBQUFBLElBQ2hCLENBQUM7QUFBQTtBQUFBLFNBR1MsV0FBVyxDQUFDLE1BQThCO0FBQUEsSUFDcEQsTUFBTSxPQUlGLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFDbkIsT0FBTyxJQUFJLGVBQ1AsV0FBVyxRQUFRLEtBQUssRUFBRSxHQUMxQixLQUFLLEtBQ0wsS0FBSyxLQUNUO0FBQUE7QUFFUjtBQUFBO0FBRU8sTUFBTSx1QkFBdUI7QUFBQSxFQUVyQjtBQUFBLEVBQ0E7QUFBQSxFQUZYLFdBQVcsQ0FDQSxRQUNBLFFBQ1Q7QUFBQSxJQUZTO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHRyxTQUFTLENBQUMsTUFBMEM7QUFBQSxJQUM5RCxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sWUFBWSxlQUFlLFVBQVUsS0FBSyxNQUFNLENBQUM7QUFBQSxJQUN4RCxPQUFPLGdCQUFnQixLQUFLLE1BQU07QUFBQSxJQUNsQyxPQUFPLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FHWCxXQUFXLENBQUMsTUFBMEM7QUFBQSxJQUNoRSxNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxJQUM3QyxNQUFNLFNBQVMsZUFBZSxZQUFZLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDN0QsTUFBTSxTQUFTLE9BQU8sZUFBZTtBQUFBLElBQ3JDLE9BQU8sSUFBSSx1QkFBdUIsUUFBUSxNQUFNO0FBQUE7QUFFeEQ7OztBQ3RLTyxJQUFNLDBCQUE0RCxJQUFJLGNBQ3pFLFlBQ0EsQ0FBQyxRQUFhLElBQUksa0JBQWtCLEdBQUcsQ0FDM0M7QUFBQTtBQVlPLE1BQU0sa0JBQWtCO0FBQUEsRUFNRTtBQUFBLEVBTGIsT0FBeUM7QUFBQSxFQUN4QyxpQkFBaUIsSUFBSTtBQUFBLEVBQ3JCLG1CQUE2QyxJQUFJO0FBQUEsRUFDMUQ7QUFBQSxFQUVSLFdBQVcsQ0FBa0IsS0FBVTtBQUFBLElBQVY7QUFBQSxJQUN6QixLQUFLLFNBQVMsS0FBSyxPQUFPLFlBQVksYUFBYSxZQUFZLElBQUksS0FBSyxJQUFJO0FBQUEsSUFDNUUsSUFBSSxRQUFRLGVBQ1IsMEJBQ0Esd0JBQ0EseUJBQ0Esd0JBQ0o7QUFBQSxJQUNBLElBQUksUUFBUSxpQkFBaUIseUJBQXlCLENBQUMsV0FBVztBQUFBLE1BQzlELEtBQUssY0FBYyxNQUFNO0FBQUEsS0FDNUI7QUFBQSxJQUNELElBQUksUUFBUSxpQkFBaUIsMEJBQTBCLENBQUMsV0FBVztBQUFBLE1BQy9ELE1BQU0sVUFBVSxLQUFLLGlCQUFpQixJQUFJLE9BQU8sT0FBTyxHQUFHO0FBQUEsTUFDM0QsSUFBSSxDQUFDLFNBQVM7QUFBQSxRQUNWLE1BQU0sSUFBSSxNQUNOLHFDQUFxQyxPQUFPLE9BQU8sUUFBUSxPQUFPLE9BQU8sR0FBRyxJQUFJLElBQ3BGO0FBQUEsTUFDSjtBQUFBLE1BQ0EsS0FBSyxpQkFBaUIsT0FBTyxPQUFPLE9BQU8sR0FBRztBQUFBLE1BQzlDLElBQUksT0FBTyxPQUFPLE9BQU87QUFBQSxRQUNyQixRQUFRLE9BQU8sSUFBSSxNQUFNLE9BQU8sT0FBTyxLQUFLLENBQUM7QUFBQSxRQUM3QztBQUFBLE1BQ0o7QUFBQSxNQUNBLFFBQVEsUUFBUSxPQUFPLE1BQU07QUFBQSxLQUNoQztBQUFBLElBQ0QsSUFBSSxRQUFRLFFBQVEsTUFBTSxLQUFLLE9BQU8sQ0FBQztBQUFBO0FBQUEsT0FHN0IsY0FBYSxDQUFDLFFBQStCO0FBQUEsSUFDdkQsTUFBTSxXQUFXLEtBQUssZUFBZSxJQUFJLE9BQU8sT0FBTyxFQUFFO0FBQUEsSUFDekQsSUFBSSxDQUFDLFVBQVU7QUFBQSxNQUNYLE1BQU0sSUFBSSxNQUFNLDRDQUE0QyxPQUFPLE9BQU8sR0FBRyxJQUFJLE1BQU0sT0FBTyxPQUFPLE1BQU07QUFBQSxJQUMvRztBQUFBLElBQ0EsSUFBSTtBQUFBLE1BQ0EsTUFBTSxTQUFTLE1BQU0sU0FBUyxRQUFRLE1BQU07QUFBQSxNQUM1QyxLQUFLLElBQUksS0FBSywwQkFBMEIsSUFBSSx1QkFDeEMsSUFBSSxlQUFlLE9BQU8sT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLElBQUksR0FDNUQsTUFDSixDQUFDO0FBQUEsTUFDSCxPQUFPLE9BQU87QUFBQSxNQUNaLEtBQUssSUFBSSxLQUFLLDBCQUEwQixJQUFJLHVCQUN4QyxJQUFJLGVBQWUsT0FBTyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssS0FBSyxVQUFVLEtBQUssQ0FBQyxHQUM3RSxJQUFJLFVBQ1IsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUlELE1BQU0sR0FBUztBQUFBLElBQ25CLE1BQU0sWUFBWSxJQUFJO0FBQUEsSUFDdEIsWUFBWSxLQUFLLGFBQWEsS0FBSyxnQkFBZ0I7QUFBQSxNQUMvQyxVQUFVLElBQUksS0FBSyxTQUFTLEtBQUssWUFBWTtBQUFBLElBQ2pEO0FBQUEsSUFDQSxNQUFNLFNBQVMsSUFBSSx1QkFBdUIsU0FBUztBQUFBLElBQ25ELEtBQUssSUFBSSxLQUFLLDBCQUEwQixNQUFNO0FBQUE7QUFBQSxFQUczQyxJQUFjLENBQ2pCLE1BQ0EsU0FDSTtBQUFBLElBQ0osSUFBSSxLQUFLLElBQUksU0FBUztBQUFBLE1BQ2xCLE1BQU0sSUFBSSxNQUFNLHdEQUF3RDtBQUFBLElBQzVFO0FBQUEsSUFDQSxJQUFJLEtBQUssZUFBZSxJQUFJLEtBQUssRUFBRSxHQUFHO0FBQUEsTUFDbEMsTUFBTSxJQUFJLE1BQU0sb0JBQW9CLEtBQUssR0FBRyxJQUFJLHlCQUF5QjtBQUFBLElBQzdFO0FBQUEsSUFDQSxLQUFLLGVBQWUsSUFBSSxLQUFLLElBQUksRUFBRSxNQUFNLFNBQVMsU0FBUyxRQUFRLGFBQWE7QUFBQSxNQUM1RSxNQUFNLE1BQU0sS0FBSyxrQkFBa0IsWUFBWSxNQUFNO0FBQUEsTUFDckQsTUFBTSxTQUFTLE1BQU0sUUFBUSxLQUFLLE1BQU07QUFBQSxNQUN4QyxPQUFPLEtBQUssbUJBQW1CLFVBQVUsTUFBTTtBQUFBLE1BQ2pELENBQUM7QUFBQTtBQUFBLE9BR00sS0FBYyxDQUFDLFVBQWtDLE1BQXlCO0FBQUEsSUFDbkYsTUFBTSxNQUFNLEtBQUs7QUFBQSxJQUNqQixNQUFNLFVBQVUsSUFBSSxRQUFvQixDQUFDLFNBQVMsV0FBVztBQUFBLE1BQ3pELEtBQUssaUJBQWlCLElBQUksS0FBSyxFQUFFLFNBQVMsT0FBTyxDQUFDO0FBQUEsS0FDckQ7QUFBQSxJQUNELEtBQUssSUFBSSxLQUFLLHdCQUF3QixJQUFJLHFCQUN0QyxJQUFJLGFBQWEsU0FBUyxJQUFJLEdBQUcsR0FDakMsU0FBUyxrQkFBa0IsVUFBVSxJQUFJLENBQzdDLENBQUM7QUFBQSxJQUNELE1BQU0sV0FBVyxNQUFNO0FBQUEsSUFDdkIsT0FBTyxTQUFTLG1CQUFtQixZQUFZLFFBQVE7QUFBQTtBQUUvRDtBQUVBLElBQU0sMkJBQTJCLFdBQVcsaUJBQXlDLHlCQUF5QjtBQUFBLEVBQzFHLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0seUJBQXlCLFdBQVcsaUJBQXVDLHlCQUF5QjtBQUFBLEVBQ3RHLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0sMEJBQTBCLFdBQVcsaUJBQXdDLHlCQUF5QjtBQUFBLEVBQ3hHLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0sMkJBQTJCLFdBQVcsaUJBQXlDLHlCQUF5QjtBQUFBLEVBQzFHLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQzs7O0FDNUhNLElBQU0sc0JBQW9ELElBQUksY0FDakUsUUFDQSxDQUFDLFFBQWEsSUFBSSxjQUFjLEdBQUcsQ0FDdkM7QUFFTyxJQUFNLDZCQUF5QyxvQkFBb0IsS0FBSyxTQUFTO0FBYXhGLElBQU0saUJBQWlCLFdBQVcsV0FBd0IscUJBQXFCO0FBQUEsRUFDM0UsTUFBTTtBQUNWLENBQUM7QUFBQTtBQUVELE1BQU0sVUFBOEI7QUFBQSxFQUVaO0FBQUEsRUFDQTtBQUFBLEVBRnBCLFdBQVcsQ0FDUyxNQUNBLE1BQ2xCO0FBQUEsSUFGa0I7QUFBQSxJQUNBO0FBQUE7QUFBQSxTQUdOLFNBQTZCLENBQUMsTUFBZ0M7QUFBQSxJQUN4RSxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sVUFBVSxLQUFLLElBQUk7QUFBQSxJQUMxQixPQUFPLGdCQUFnQixLQUFLLElBQUk7QUFBQSxJQUNoQyxPQUFPLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FHWCxXQUErQixDQUFDLE1BQWdDO0FBQUEsSUFDMUUsTUFBTSxTQUFTLFdBQVcsZUFBZSxJQUFJO0FBQUEsSUFDN0MsTUFBTSxPQUFPLE9BQU8sU0FBWTtBQUFBLElBQ2hDLE1BQU0sT0FBTyxPQUFPLGVBQWU7QUFBQSxJQUNuQyxPQUFPLElBQUksVUFBVSxNQUFNLElBQUk7QUFBQTtBQUV2QztBQUVBLElBQU0sZUFBZSxXQUFXLGlCQUEyQyxxQkFBcUI7QUFBQSxFQUM1RixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFJRCxJQUFNLGdCQUFnQixXQUFXLFdBQTZCLHFCQUFxQjtBQUFBLEVBQy9FLE1BQU07QUFDVixDQUFDO0FBV0QsSUFBTSxrQkFBa0IsV0FBVyxXQUF5QixxQkFBcUI7QUFBQSxFQUM3RSxNQUFNO0FBQ1YsQ0FBQztBQUVELElBQU0saUJBQWlCLFdBQVcsaUJBQTJDLHFCQUFxQjtBQUFBLEVBQzlGLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUVELElBQU0saUJBQWlCLFdBQVcsV0FBMEIscUJBQXFCO0FBQUEsRUFDN0UsTUFBTTtBQUNWLENBQUM7QUFpQk0sSUFBTSxZQUFZO0FBQUEsRUFDckIsY0FBYztBQUFBLEVBQ2QsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sT0FBTztBQUNYO0FBaURBLElBQU0sbUJBQW1CLFdBQVcsV0FBd0IscUJBQXFCO0FBQUEsRUFDN0UsTUFBTTtBQUNWLENBQUM7QUFFRCxJQUFNLGlCQUFpQixXQUFXLFdBQTBCLHFCQUFxQjtBQUFBLEVBQzdFLE1BQU07QUFDVixDQUFDO0FBRUQsSUFBTSxpQkFBaUIsV0FBVyxpQkFBd0MscUJBQXFCO0FBQUEsRUFDM0YsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUFDO0FBRUQsSUFBTSxrQkFBa0IsV0FBVyxXQUEyQixxQkFBcUI7QUFBQSxFQUMvRSxNQUFNO0FBQ1YsQ0FBQztBQU9ELElBQU0sa0JBQWtCLFdBQVcsV0FBMkIscUJBQXFCO0FBQUEsRUFDL0UsTUFBTTtBQUNWLENBQUM7QUFFRCxTQUFTLFlBQWUsR0FJdEI7QUFBQSxFQUNFLElBQUksVUFBNEM7QUFBQSxFQUNoRCxJQUFJLFNBQW1EO0FBQUEsRUFDdkQsTUFBTSxVQUFVLElBQUksUUFBVyxDQUFDLEtBQUssUUFBUTtBQUFBLElBQ3pDLFVBQVU7QUFBQSxJQUNWLFNBQVM7QUFBQSxHQUNaO0FBQUEsRUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDO0FBQUEsSUFBUSxNQUFNLElBQUksTUFBTSx5QkFBeUI7QUFBQSxFQUNsRSxPQUFPO0FBQUEsSUFDSDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFRRyxNQUFNLGNBQW1DO0FBQUEsRUFVdkI7QUFBQSxFQVRMLE9BQWlDO0FBQUEsRUFDekMsZUFBdUI7QUFBQSxFQUVkLGNBQXVELENBQUM7QUFBQSxFQUN4RCxZQUEyQyxDQUFDO0FBQUEsRUFDNUMsY0FBNEIsQ0FBQztBQUFBLEVBQ3RDLG9CQUFnQyxNQUFNO0FBQUEsRUFFOUMsV0FBVyxDQUNVLEtBQ25CO0FBQUEsSUFEbUI7QUFBQSxJQUVqQixJQUFJLFFBQVEsZUFDUixnQkFDQSxjQUNBLGVBQ0EsaUJBQ0EsZ0JBQ0EsZ0JBQ0EsaUJBQ0Esa0JBQ0EsZ0JBQ0EsZ0JBQ0EsZUFDSjtBQUFBLElBQ0EsSUFBSSxRQUFRLGlCQUFpQixpQkFBaUIsQ0FBQyxXQUFXO0FBQUEsTUFDdEQsTUFBTSxTQUFTLEtBQUssWUFBWSxPQUFPO0FBQUEsTUFDdkMsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUNULFFBQVEsS0FBSyx5Q0FBeUMsT0FBTyxFQUFFO0FBQUEsUUFDL0Q7QUFBQSxNQUNKO0FBQUEsTUFDQSxJQUFJLE9BQU8sU0FBUyxXQUFXO0FBQUEsUUFDM0IsUUFBUSxLQUFLLGlEQUFpRCxPQUFPLEVBQUU7QUFBQSxRQUN2RTtBQUFBLE1BQ0o7QUFBQSxNQUNBLE9BQU8sWUFBWSxNQUFNO0FBQUEsS0FDNUI7QUFBQSxJQUNELElBQUksUUFBUSxpQkFBaUIsZ0JBQWdCLENBQUMsV0FBVztBQUFBLE1BQ3JELE1BQU0sU0FBUyxLQUFLLFlBQVksT0FBTyxLQUFLO0FBQUEsTUFDNUMsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUNULFFBQVEsS0FBSyx5Q0FBeUMsT0FBTyxLQUFLLEVBQUU7QUFBQSxRQUNwRTtBQUFBLE1BQ0o7QUFBQSxNQUNBLElBQUksT0FBTyxTQUFTLGFBQWE7QUFBQSxRQUM3QixRQUFRLEtBQUssNENBQTRDLE9BQU8sS0FBSyxFQUFFO0FBQUEsUUFDdkU7QUFBQSxNQUNKO0FBQUEsTUFDQSxPQUFPLFFBQVEsT0FBTyxJQUFJO0FBQUEsS0FDN0I7QUFBQSxJQUNELElBQUksUUFBUSxpQkFBaUIsZ0JBQWdCLENBQUMsV0FBVztBQUFBLE1BQ3JELE1BQU0sU0FBUyxLQUFLLFlBQVksT0FBTztBQUFBLE1BQ3ZDLElBQUksQ0FBQyxRQUFRO0FBQUEsUUFDVCxRQUFRLEtBQUsseUNBQXlDLE9BQU8sRUFBRTtBQUFBLFFBQy9EO0FBQUEsTUFDSjtBQUFBLE1BQ0EsSUFBSSxPQUFPLFNBQVMsYUFBYTtBQUFBLFFBQzdCLFFBQVEsS0FBSyw0Q0FBNEMsT0FBTyxFQUFFO0FBQUEsUUFDbEU7QUFBQSxNQUNKO0FBQUEsTUFDQSxPQUFPLE1BQU07QUFBQSxNQUNiLE9BQU8sS0FBSyxZQUFZLE9BQU87QUFBQSxLQUNsQztBQUFBLElBQ0QsSUFBSSxRQUFRLGlCQUFpQixnQkFBZ0IsQ0FBQyxXQUFXO0FBQUEsTUFDckQsTUFBTSxTQUFTLEtBQUssVUFBVSxPQUFPO0FBQUEsTUFDckMsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUNULFFBQVEsS0FBSyx3Q0FBd0MsT0FBTyxFQUFFO0FBQUEsUUFDOUQ7QUFBQSxNQUNKO0FBQUEsTUFDQSxJQUFJLE9BQU8sU0FBUyxXQUFXO0FBQUEsUUFDM0IsUUFBUSxLQUFLLGdEQUFnRCxPQUFPLEVBQUU7QUFBQSxRQUN0RTtBQUFBLE1BQ0o7QUFBQSxNQUNBLE9BQU8sT0FBTyxLQUFLLE1BQU07QUFBQSxNQUN6QixPQUFPLE9BQU87QUFBQSxLQUNqQjtBQUFBLElBQ0QsSUFBSSxRQUFRLGlCQUFpQixnQkFBZ0IsQ0FBQyxXQUFXO0FBQUEsTUFDckQsTUFBTSxTQUFTLEtBQUssVUFBVSxPQUFPLEtBQUs7QUFBQSxNQUMxQyxJQUFJLENBQUMsUUFBUTtBQUFBLFFBQ1QsUUFBUSxLQUFLLHdDQUF3QyxPQUFPLEtBQUssRUFBRTtBQUFBLFFBQ25FO0FBQUEsTUFDSjtBQUFBLE1BQ0EsSUFBSSxPQUFPLFNBQVMsYUFBYTtBQUFBLFFBQzdCLFFBQVEsS0FBSywyQ0FBMkMsT0FBTyxLQUFLLEVBQUU7QUFBQSxRQUN0RTtBQUFBLE1BQ0o7QUFBQSxNQUNBLE9BQU8sT0FBTyxTQUFTLE1BQU07QUFBQSxLQUNoQztBQUFBLElBQ0QsSUFBSSxRQUFRLGlCQUFpQixpQkFBaUIsQ0FBQyxXQUFXO0FBQUEsTUFDdEQsTUFBTSxTQUFTLEtBQUssVUFBVSxPQUFPO0FBQUEsTUFDckMsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUNULFFBQVEsS0FBSyx3Q0FBd0MsT0FBTyxFQUFFO0FBQUEsUUFDOUQ7QUFBQSxNQUNKO0FBQUEsTUFDQSxPQUFPLE9BQU8sTUFBTSxNQUFNO0FBQUEsTUFDMUIsT0FBTyxLQUFLLFlBQVksT0FBTztBQUFBLEtBQ2xDO0FBQUEsSUFDRCxJQUFJLFFBQVEsaUJBQWlCLGlCQUFpQixDQUFDLFdBQVc7QUFBQSxNQUN0RCxNQUFNLFNBQVMsS0FBSyxVQUFVLE9BQU87QUFBQSxNQUNyQyxJQUFJLENBQUMsUUFBUTtBQUFBLFFBQ1QsUUFBUSxLQUFLLHdDQUF3QyxPQUFPLEVBQUU7QUFBQSxRQUM5RDtBQUFBLE1BQ0o7QUFBQSxNQUNBLE9BQU8sT0FBTyxNQUFNLE1BQU07QUFBQSxNQUMxQixPQUFPLEtBQUssWUFBWSxPQUFPO0FBQUEsS0FDbEM7QUFBQSxJQUNELElBQUksTUFBTSxNQUFNLE9BQU8sTUFBTTtBQUFBLE1BQ3pCLEtBQUssV0FBVztBQUFBLEtBQ25CO0FBQUE7QUFBQSxPQUdTLFdBQVUsR0FBRztBQUFBLElBQ3ZCLE9BQU8sS0FBSyxJQUFJLFNBQVM7QUFBQSxNQUNyQixNQUFNLE9BQU8sS0FBSyxZQUFZLE1BQU07QUFBQSxNQUNwQyxJQUFJLE1BQU07QUFBQSxRQUNOLE1BQU0sUUFBUSxNQUFNLGFBQWEsS0FBSyxJQUFJO0FBQUEsUUFDMUMsTUFBTSxPQUFPLE9BQU8sS0FBSyxTQUFTLFdBQVcsVUFBVSxPQUFPLFVBQVU7QUFBQSxRQUN4RSxLQUFLLElBQUksS0FBSyxnQkFBZ0IsSUFBSSxVQUFVLEVBQUUsSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUFBLE1BQzdFLEVBQU87QUFBQSxRQUNILE1BQU0sSUFBSSxRQUFjLENBQUMsWUFBWTtBQUFBLFVBQ2pDLEtBQUssb0JBQW9CO0FBQUEsU0FDNUI7QUFBQTtBQUFBLElBRVQ7QUFBQTtBQUFBLEVBR0ksZUFBZSxDQUFDLFNBQWtCLE1BQTRDO0FBQUEsSUFDbEYsTUFBTSxVQUFrQyxDQUFDO0FBQUEsSUFDekMsTUFBTSxPQUErQixDQUFDO0FBQUEsSUFDdEMsTUFBTSxNQUFNLENBQUMsS0FBYSxVQUFrQjtBQUFBLE1BQ3hDLE1BQU0sV0FBVyxJQUFJLFlBQVk7QUFBQSxNQUNqQyxNQUFNLGNBQWMsS0FBSztBQUFBLE1BQ3pCLElBQUksYUFBYTtBQUFBLFFBQ2IsT0FBTyxRQUFRO0FBQUEsTUFDbkI7QUFBQSxNQUNBLFFBQVEsT0FBTztBQUFBLE1BQ2YsS0FBSyxZQUFZO0FBQUE7QUFBQSxJQUVyQixRQUFRLFFBQVEsUUFBUSxDQUFDLE9BQU8sUUFBUTtBQUFBLE1BQ3BDLElBQUksS0FBSyxLQUFLO0FBQUEsS0FDakI7QUFBQSxJQUNELElBQUksTUFBTSxTQUFTO0FBQUEsTUFDZixJQUFJLEtBQUssbUJBQW1CLFNBQVM7QUFBQSxRQUNqQyxLQUFLLFFBQVEsUUFBUSxDQUFDLE9BQU8sUUFBUTtBQUFBLFVBQ2pDLElBQUksS0FBSyxLQUFLO0FBQUEsU0FDakI7QUFBQSxNQUNMLEVBQU8sU0FBSSxNQUFNLFFBQVEsS0FBSyxPQUFPLEdBQUc7QUFBQSxRQUNwQyxZQUFZLEtBQUssVUFBVSxLQUFLLFNBQVM7QUFBQSxVQUNyQyxJQUFJLEtBQUssS0FBSztBQUFBLFFBQ2xCO0FBQUEsTUFDSixFQUFPO0FBQUEsUUFDSCxXQUFXLE9BQU8sS0FBSyxTQUFTO0FBQUEsVUFDNUIsTUFBTSxRQUFRLEtBQUssUUFBUTtBQUFBLFVBQzNCLElBQUksS0FBSyxLQUFLO0FBQUEsUUFDbEI7QUFBQTtBQUFBLElBRVI7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBR0gsVUFBVSxHQUFlO0FBQUEsSUFDN0IsT0FBTyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxZQUFZLGNBQWMsS0FBSyxnQkFBZ0I7QUFBQTtBQUFBLE9BR3JFLFFBQU8sQ0FBQyxPQUEwQyxNQUFpRjtBQUFBLElBQzVJLE1BQU0sVUFBVSxJQUFJLFFBQVEsT0FBTyxJQUFJO0FBQUEsSUFDdkMsTUFBTSxLQUFLLEtBQUssV0FBVyxFQUFFLElBQUk7QUFBQSxJQUNqQyxLQUFLLElBQUksS0FBSyxnQkFBZ0I7QUFBQSxNQUMxQjtBQUFBLE1BQ0EsUUFBUSxLQUFLLGdCQUFnQixTQUFTLElBQUk7QUFBQSxNQUMxQyxRQUFRLFFBQVE7QUFBQSxNQUNoQixVQUFVLFFBQVE7QUFBQSxNQUNsQixLQUFLLFFBQVE7QUFBQSxJQUNqQixDQUFDO0FBQUEsSUFDRCxJQUFJLFFBQVEsTUFBTTtBQUFBLE1BQ2QsTUFBTSxTQUFTLFFBQVEsS0FBSyxVQUFVO0FBQUEsTUFDdEMsT0FBTyxNQUFNO0FBQUEsUUFDVCxNQUFNLFNBQVMsTUFBTSxPQUFPLEtBQUs7QUFBQSxRQUNqQyxJQUFJLE9BQU8sTUFBTTtBQUFBLFVBQ2I7QUFBQSxRQUNKO0FBQUEsUUFDQSxLQUFLLElBQUksS0FBSyxjQUFjO0FBQUEsVUFDeEIsTUFBTSxFQUFFLEdBQUc7QUFBQSxVQUNYLE1BQU0sT0FBTztBQUFBLFFBQ2pCLENBQUM7QUFBQSxNQUNMO0FBQUEsSUFDSjtBQUFBLElBQ0EsS0FBSyxJQUFJLEtBQUssZUFBZSxFQUFFLEdBQUcsQ0FBQztBQUFBLElBQ25DLE1BQU0sU0FBdUIsQ0FBQztBQUFBLElBQzlCLE1BQU0saUJBQWlCLGFBQTJCO0FBQUEsSUFDbEQsSUFBSSxhQUFhLGFBQXNCO0FBQUEsSUFDdkMsTUFBTSxjQUFjLENBQUMsY0FBMkI7QUFBQSxNQUM1QyxlQUFlLFFBQVEsU0FBUTtBQUFBLE1BQy9CLEtBQUssWUFBWSxNQUFNO0FBQUEsUUFDbkIsTUFBTTtBQUFBLFFBQ04sT0FBTyxDQUFDLE1BQW1DO0FBQUEsVUFDdkMsT0FBTyxLQUFLLElBQUk7QUFBQSxVQUNoQixXQUFXLFFBQVEsSUFBSTtBQUFBLFVBQ3ZCLGFBQWEsYUFBc0I7QUFBQTtBQUFBLFFBRXZDLEtBQUssR0FBRztBQUFBLFVBQ0osV0FBVyxRQUFRLEtBQUs7QUFBQTtBQUFBLE1BRWhDO0FBQUE7QUFBQSxJQUVKLEtBQUssWUFBWSxNQUFNO0FBQUEsTUFDbkIsTUFBTTtBQUFBLE1BQ047QUFBQSxJQUNKO0FBQUEsSUFDQSxNQUFNLFdBQVcsTUFBTSxlQUFlO0FBQUEsSUFDdEMsT0FBTztBQUFBLE1BQ0g7QUFBQSxNQUNBLFFBQVEsSUFBSSxlQUEyQjtBQUFBLGFBQzdCLE1BQUssQ0FBQyxZQUFZO0FBQUEsVUFDcEIsT0FBTyxNQUFNLFdBQVcsU0FBUztBQUFBLFlBQzdCLE1BQU0sUUFBUSxPQUFPLE1BQU07QUFBQSxZQUMzQixJQUFJLENBQUM7QUFBQSxjQUFPO0FBQUEsWUFDWixXQUFXLFFBQVEsS0FBSztBQUFBLFVBQzVCO0FBQUEsVUFDQSxXQUFXLE1BQU07QUFBQTtBQUFBLE1BRXpCLENBQUM7QUFBQSxJQUNMO0FBQUE7QUFBQSxPQUdTLE1BQUssQ0FBQyxPQUEwQyxNQUEwQztBQUFBLElBQ25HLFFBQVEsVUFBVSxXQUFXLE1BQU0sS0FBSyxRQUFRLE9BQU8sSUFBSTtBQUFBLElBQzNELE9BQU8sSUFBSSxZQUNQLElBQUksUUFBUSxTQUFTLE1BQU0sR0FDM0IsU0FBUyxVQUFVLE9BQU8sU0FBUyxTQUFTLEtBQzVDLFNBQVMsWUFDVCxTQUFTLFFBQ1QsU0FBUyxZQUNULFNBQ0EsU0FBUyxLQUNULFFBQ0EsS0FDSjtBQUFBO0FBQUEsT0FHUyxHQUFFLENBQUMsT0FBMEMsU0FNdkM7QUFBQSxJQUNmLE1BQU0sVUFBVSxJQUFJLFFBQVEsT0FBTyxPQUFPO0FBQUEsSUFDMUMsTUFBTSxLQUFLLEtBQUssV0FBVztBQUFBLElBQzNCLE1BQU0sU0FBUyxNQUFNLE9BQ2pCLEtBQUssS0FDTCxJQUNBLENBQUMsU0FBUztBQUFBLE1BQ04sS0FBSyxZQUFZLEtBQUs7QUFBQSxRQUNsQixJQUFJLEdBQUcsSUFBSTtBQUFBLFFBQ1g7QUFBQSxNQUNKLENBQUM7QUFBQSxNQUNELEtBQUssa0JBQWtCO0FBQUEsT0FFM0IsTUFBTTtBQUFBLE1BQ0YsT0FBTyxLQUFLLFVBQVUsR0FBRyxJQUFJO0FBQUEsS0FFckM7QUFBQSxJQUNBLEtBQUssVUFBVSxHQUFHLElBQUksS0FBSztBQUFBLE1BQ3ZCLE1BQU07QUFBQSxNQUNOO0FBQUEsSUFDSjtBQUFBLElBQ0EsS0FBSyxJQUFJLEtBQUssa0JBQWtCO0FBQUEsTUFDNUIsSUFBSSxHQUFHLElBQUk7QUFBQSxNQUNYLFFBQVEsS0FBSyxnQkFBZ0IsU0FBUyxPQUFPO0FBQUEsTUFDN0MsUUFBUSxRQUFRO0FBQUEsTUFDaEIsVUFBVSxRQUFRO0FBQUEsTUFDbEIsS0FBSyxRQUFRO0FBQUEsSUFDakIsQ0FBQztBQUFBLElBQ0QsT0FBTyxPQUFPO0FBQUE7QUFFdEI7QUFBQTtBQUVBLE1BQU0sWUFBZ0M7QUFBQSxFQUVkO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQVRwQixXQUFXLENBQ1MsU0FDQSxJQUNBLFlBQ0EsUUFDQSxZQUNBLE1BQ0EsS0FDQSxNQUNBLFVBQ2xCO0FBQUEsSUFUa0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsRUFHcEIsS0FBSyxHQUFnQjtBQUFBLElBQ2pCLE9BQU8sSUFBSSxZQUNQLEtBQUssU0FDTCxLQUFLLElBQ0wsS0FBSyxZQUNMLEtBQUssUUFDTCxLQUFLLFlBQ0wsS0FBSyxNQUNMLEtBQUssS0FDTCxLQUFLLE1BQ0wsS0FBSyxRQUNUO0FBQUE7QUFBQSxPQUVFLFlBQVcsR0FBeUI7QUFBQSxJQUN0QyxPQUFPLE1BQU0sSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLFlBQVk7QUFBQTtBQUFBLEVBRXJELElBQUksR0FBa0I7QUFBQSxJQUNsQixPQUFPLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxLQUFLO0FBQUE7QUFBQSxFQUV4QyxLQUFLLEdBQXFDO0FBQUEsSUFDdEMsT0FBTyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksV0FBVyxHQUFHLENBQUM7QUFBQTtBQUFBLEVBRWxGLFFBQVEsR0FBc0I7QUFBQSxJQUMxQixPQUFPLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxTQUFTO0FBQUE7QUFBQSxFQUU1QyxJQUFJLEdBQWlCO0FBQUEsSUFDakIsT0FBTyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUUsS0FBSztBQUFBO0FBQUEsRUFFeEMsSUFBSSxHQUFvQjtBQUFBLElBQ3BCLE9BQU8sSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLEtBQUs7QUFBQTtBQUU1QztBQUFBO0FBdUJPLE1BQU0sTUFBTTtBQUFBLEVBRVE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDWDtBQUFBLEVBQ0E7QUFBQSxFQVBaLFdBQVcsQ0FDWSxLQUNBLElBQ0EsVUFDQSxTQUNBLGVBQXdCLENBQUMsR0FDcEMsaUJBQTJDLFdBQzNDLFNBQTJDLGNBQ3JEO0FBQUEsSUFQcUI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDWDtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR0UsTUFBTSxDQUFDLEtBQVUsSUFBZ0IsVUFBa0MsU0FBc0M7QUFBQSxJQUNuSCxNQUFNLEtBQUssSUFBSSxNQUFNLEtBQUssSUFBSSxVQUFVLE9BQU87QUFBQSxJQUMvQyxPQUFPO0FBQUEsTUFDSDtBQUFBLE1BQ0EsTUFBTSxDQUFDLGFBQWE7QUFBQSxRQUNoQixHQUFHLGFBQWEsS0FBSztBQUFBLFVBQ2pCLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNWLENBQUM7QUFBQSxRQUNELEdBQUcsaUJBQWlCO0FBQUE7QUFBQSxNQUV4QixVQUFVLENBQUMsU0FBc0M7QUFBQSxRQUM3QyxJQUFJLEtBQUssS0FBSyxTQUFTLFVBQVUsUUFBUTtBQUFBLFVBQ3JDLEdBQUcsYUFBYSxLQUFLO0FBQUEsWUFDakIsTUFBTTtBQUFBLFlBQ04sTUFBTSxLQUFLO0FBQUEsVUFDZixDQUFDO0FBQUEsUUFDTCxFQUFPO0FBQUEsVUFDSCxHQUFHLGFBQWEsS0FBSztBQUFBLFlBQ2pCLE1BQU07QUFBQSxZQUNOLE1BQU0sWUFBWSxPQUFPLEtBQUssSUFBSTtBQUFBLFVBQ3RDLENBQUM7QUFBQTtBQUFBLFFBRUwsR0FBRyxpQkFBaUI7QUFBQTtBQUFBLE1BRXhCLE9BQU8sQ0FBQyxhQUFhO0FBQUEsUUFDakIsR0FBRyxhQUFhLEtBQUs7QUFBQSxVQUNqQixNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDVixDQUFDO0FBQUEsUUFDRCxHQUFHLGlCQUFpQjtBQUFBO0FBQUEsTUFFeEIsT0FBTyxDQUFDLGFBQWE7QUFBQSxRQUNqQixHQUFHLGFBQWEsS0FBSztBQUFBLFVBQ2pCLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNWLENBQUM7QUFBQSxRQUNELEdBQUcsaUJBQWlCO0FBQUE7QUFBQSxJQUU1QjtBQUFBO0FBQUEsRUFHRyxJQUFJLENBQUMsTUFBb0I7QUFBQSxJQUM1QixLQUFLLFNBQVMsSUFBSTtBQUFBO0FBQUEsRUFHZixLQUFLLENBQUMsTUFBZSxRQUF1QjtBQUFBLElBQy9DLEtBQUssSUFBSSxLQUFLLGlCQUFpQjtBQUFBLE1BQzNCLElBQUksS0FBSyxHQUFHLElBQUk7QUFBQSxNQUNoQjtBQUFBLE1BQ0E7QUFBQSxJQUNKLENBQUM7QUFBQSxJQUNELEtBQUssUUFBUTtBQUFBO0FBQUEsT0FHSixRQUFPLEdBQW1CO0FBQUEsSUFDbkMsSUFBSSxLQUFLLGdCQUFnQjtBQUFBLE1BQ3JCLE1BQU0sSUFBSSxNQUFNLDJDQUEyQztBQUFBLElBQy9EO0FBQUEsSUFDQSxPQUFPLEtBQUssV0FBVyxVQUFVO0FBQUEsTUFDN0IsTUFBTSxPQUFPLEtBQUssYUFBYSxNQUFNO0FBQUEsTUFDckMsSUFBSSxDQUFDLE1BQU07QUFBQSxRQUNQLE1BQU0sSUFBSSxRQUFjLENBQUMsWUFBWSxLQUFLLGlCQUFpQixPQUFPO0FBQUEsUUFDbEU7QUFBQSxNQUNKO0FBQUEsTUFDQSxJQUFJLEtBQUssU0FBUyxTQUFTO0FBQUEsUUFDdkIsS0FBSyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxNQUNBLElBQUksS0FBSyxTQUFTLFFBQVE7QUFBQSxRQUN0QixLQUFLLFNBQVM7QUFBQSxNQUNsQjtBQUFBLE1BQ0EsS0FBSyxpQkFBaUI7QUFBQSxNQUN0QixPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsTUFBTSxJQUFJLE1BQU0sb0NBQW9DO0FBQUE7QUFBQSxFQUd4RCxXQUFtQjtBQUFBLEVBQ25CLE1BQWM7QUFDbEI7QUF1R0EsZUFBZSxZQUFZLENBQUMsTUFBK0Y7QUFBQSxFQUN2SCxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsSUFDMUIsT0FBTyxZQUFZLE9BQU8sSUFBSTtBQUFBLEVBQ2xDLEVBQU8sU0FBSSxnQkFBZ0IsTUFBTTtBQUFBLElBQzdCLE1BQU0sY0FBYyxNQUFNLEtBQUssWUFBWTtBQUFBLElBQzNDLE9BQU8sSUFBSSxXQUFXLFdBQVc7QUFBQSxFQUNyQyxFQUFPO0FBQUEsSUFDSCxPQUFPLElBQUksV0FBVyxJQUF1QjtBQUFBO0FBQUE7OztBQzN1QjlDLE1BQU0sYUFBbUM7QUFBQSxFQUMzQixZQUF5RCxDQUFDO0FBQUEsRUFFcEUsTUFBTSxDQUFDLFVBQXlDO0FBQUEsSUFDbkQsS0FBSyxVQUFVLEtBQUssUUFBUTtBQUFBLElBQzVCLE9BQU8sTUFBTTtBQUFBLE1BQ1QsS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLFFBQVEsUUFBUSxHQUFHLENBQUM7QUFBQTtBQUFBO0FBQUEsT0FJcEQsS0FBSSxJQUFJLE1BQXdCO0FBQUEsSUFDekMsV0FBVyxZQUFZLENBQUMsR0FBRyxLQUFLLFNBQVMsR0FBRztBQUFBLE1BQ3hDLE1BQU0sU0FBUyxHQUFHLElBQUk7QUFBQSxJQUMxQjtBQUFBO0FBRVI7OztBQ2RPLE1BQU0sS0FBSztBQUFBLEVBQ04sUUFBa0IsQ0FBQztBQUFBLEVBQ25CLFNBQStCO0FBQUEsRUFFL0IsSUFBSSxHQUFrQjtBQUFBLElBQzFCLElBQUksS0FBSyxRQUFRO0FBQUEsTUFDYixPQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUFBLElBQ0EsS0FBSyxTQUFTLElBQUksUUFBYyxDQUFDLFlBQVk7QUFBQSxNQUN6QyxNQUFNLFdBQVcsWUFBWTtBQUFBLFFBQ3pCLE9BQU8sS0FBSyxNQUFNLFNBQVMsR0FBRztBQUFBLFVBQzFCLE1BQU0sT0FBTyxLQUFLLE1BQU0sTUFBTTtBQUFBLFVBQzlCLElBQUksTUFBTTtBQUFBLFlBQ04sTUFBTSxLQUFLO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFBQSxRQUNBLEtBQUssU0FBUztBQUFBLFFBQ2QsUUFBUTtBQUFBO0FBQUEsTUFFWixTQUFTO0FBQUEsS0FDWjtBQUFBLElBQ0QsT0FBTyxLQUFLO0FBQUE7QUFBQSxPQUdILElBQU0sQ0FBQyxVQUF3QztBQUFBLElBQ3hELE1BQU0sVUFBVSxJQUFJLFFBQVcsQ0FBQyxTQUFTLFdBQVc7QUFBQSxNQUNoRCxNQUFNLE9BQU8sWUFBWTtBQUFBLFFBQ3JCLE1BQU0sV0FBVSxTQUFTO0FBQUEsUUFDekIsSUFBSTtBQUFBLFVBQ0EsUUFBUSxNQUFNLFFBQU87QUFBQSxVQUN2QixPQUFPLFFBQVE7QUFBQSxVQUNiLE9BQU8sTUFBTTtBQUFBO0FBQUE7QUFBQSxNQUdyQixLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUEsS0FDdkI7QUFBQSxJQUNELE1BQU0sS0FBSyxLQUFLO0FBQUEsSUFDaEIsT0FBTztBQUFBO0FBRWY7OztBQ3RDTyxNQUFNLGVBQWU7QUFBQSxFQUVKO0FBQUEsRUFDQTtBQUFBLEVBRnBCLFdBQVcsQ0FDUyxJQUNBLE9BQ2xCO0FBQUEsSUFGa0I7QUFBQSxJQUNBO0FBQUE7QUFBQSxTQUdOLFNBQVMsQ0FBQyxRQUFvQztBQUFBLElBQ3hELE1BQU0sU0FBUyxJQUFJO0FBQUEsSUFDbkIsT0FBTyxZQUFZLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFBQSxJQUNsQyxPQUFPLGFBQWEsT0FBTyxVQUFVLElBQUk7QUFBQSxJQUN6QyxJQUFJLE9BQU8sVUFBVSxNQUFNO0FBQUEsTUFDdkIsT0FBTyxnQkFBZ0IsT0FBTyxLQUFLO0FBQUEsSUFDdkM7QUFBQSxJQUNBLE9BQU8sT0FBTyxPQUFPO0FBQUE7QUFBQSxTQUdYLFdBQVcsQ0FBQyxNQUFrQztBQUFBLElBQ3hELE1BQU0sU0FBUyxXQUFXLGVBQWUsSUFBSTtBQUFBLElBQzdDLE1BQU0sS0FBSyxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUM7QUFBQSxJQUNqRCxNQUFNLFdBQVcsT0FBTyxZQUFZO0FBQUEsSUFDcEMsTUFBTSxRQUFRLFdBQVcsT0FBTyxlQUFlLElBQUk7QUFBQSxJQUNuRCxPQUFPLElBQUksZUFBZSxJQUFJLEtBQUs7QUFBQTtBQUUzQztBQUFBO0FBT08sTUFBTSxlQUFlO0FBQUEsRUFFSjtBQUFBLEVBQ0E7QUFBQSxFQUZwQixXQUFXLENBQ1MsSUFDQSxhQUNsQjtBQUFBLElBRmtCO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHTixTQUFTLENBQUMsUUFBNEM7QUFBQSxJQUNoRSxRQUFRLGFBQWEsVUFBVTtBQUFBLElBQy9CLE9BQU87QUFBQSxNQUNILElBQUksT0FBTyxHQUFHLElBQUk7QUFBQSxNQUNsQixhQUFhO0FBQUEsUUFDVCxLQUFLLE1BQU0sTUFBTSxXQUFXLEtBQUssTUFBTSxHQUFHLEVBQUUsSUFBSSxJQUFJO0FBQUEsUUFDcEQsTUFBTSxNQUFNLE9BQU8sV0FBVyxLQUFLLE1BQU0sSUFBSSxFQUFFLElBQUksSUFBSTtBQUFBLFFBQ3ZELE9BQU8sTUFBTSxRQUFRLFdBQVcsS0FBSyxNQUFNLEtBQUssRUFBRSxJQUFJLElBQUk7QUFBQSxNQUM5RDtBQUFBLElBQ0o7QUFBQTtBQUFBLFNBR1UsV0FBVyxDQUFDLE1BQTBDO0FBQUEsSUFDaEUsUUFBUSxhQUFhLFVBQVU7QUFBQSxJQUMvQixPQUFPLElBQUksZUFDUCxXQUFXLEtBQUssS0FBSyxFQUFFLEdBQ3ZCO0FBQUEsTUFDSSxLQUFLLE1BQU0sTUFBTSxXQUFXLEtBQUssTUFBTSxHQUFHLElBQUk7QUFBQSxNQUM5QyxNQUFNLE1BQU0sT0FBTyxXQUFXLEtBQUssTUFBTSxJQUFJLElBQUk7QUFBQSxNQUNqRCxPQUFPLE1BQU0sUUFBUSxXQUFXLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQSxJQUN4RCxDQUNKO0FBQUE7QUFFUjs7O0FDbERPLE1BQU0sa0JBQXVDO0FBQUEsRUFJbkI7QUFBQSxFQUhiLE9BQXlDO0FBQUEsRUFDeEMsYUFBYSxJQUFJO0FBQUEsRUFFbEMsV0FBVyxDQUFrQixLQUFVO0FBQUEsSUFBVjtBQUFBLElBQ3pCLElBQUksUUFBUSxlQUNSLDBCQUNBLHdCQUNBLHNCQUNKO0FBQUE7QUFBQSxFQUdJLGNBQWlCLENBQUMsY0FBNEM7QUFBQSxJQUNsRSxJQUFJLEtBQUssV0FBVyxJQUFJLGFBQWEsRUFBRSxHQUFHO0FBQUEsTUFDdEMsTUFBTSxJQUFJLE1BQU0sNkJBQTZCLGFBQWEsb0JBQW9CO0FBQUEsSUFDbEY7QUFBQSxJQUNBLE9BQU8sSUFBSSxhQUFhLEtBQUssS0FBSyxZQUFZO0FBQUE7QUFBQSxFQUczQyxHQUFNLENBQUMsY0FBNEM7QUFBQSxJQUN0RCxNQUFNLGFBQWEsYUFBYTtBQUFBLElBQ2hDLElBQUksV0FBVyxLQUFLLFdBQVcsSUFBSSxVQUFVO0FBQUEsSUFDN0MsSUFBSSxhQUFhLFdBQVc7QUFBQSxNQUN4QixXQUFXLEtBQUssZUFBZSxZQUFZO0FBQUEsTUFDM0MsS0FBSyxXQUFXLElBQUksWUFBWSxRQUFRO0FBQUEsSUFDNUM7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBR0osSUFBc0MsQ0FBQyxNQUFjLFNBQXFFO0FBQUEsSUFDN0gsTUFBTSxhQUFhLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJO0FBQUEsSUFDNUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxVQUFVLEdBQUc7QUFBQSxNQUNqQyxNQUFNLElBQUksTUFBTSx1QkFBdUIsc0JBQXNCO0FBQUEsSUFDakU7QUFBQSxJQUNBLE1BQU0sWUFBWSxhQUFhLFdBQWMsWUFBWTtBQUFBLE1BQ3JEO0FBQUEsTUFDQSxjQUFjLFFBQVE7QUFBQSxNQUN0QixZQUFZLFFBQVE7QUFBQSxJQUN4QixDQUFDO0FBQUEsSUFDRCxPQUFPLEtBQUssZUFBZSxTQUFTO0FBQUE7QUFBQSxFQUdqQyxVQUFhLENBQUMsTUFBYyxTQUE2RTtBQUFBLElBQzVHLE1BQU0sYUFBYSxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssSUFBSTtBQUFBLElBQzVDLElBQUksS0FBSyxXQUFXLElBQUksVUFBVSxHQUFHO0FBQUEsTUFDakMsTUFBTSxJQUFJLE1BQU0sdUJBQXVCLHNCQUFzQjtBQUFBLElBQ2pFO0FBQUEsSUFDQSxNQUFNLFlBQVksYUFBYSxpQkFBb0IsWUFBWTtBQUFBLE1BQzNEO0FBQUEsTUFDQSxjQUFjLFFBQVE7QUFBQSxNQUN0QixZQUFZLFFBQVE7QUFBQSxJQUN4QixDQUFDO0FBQUEsSUFDRCxPQUFPLEtBQUssZUFBZSxTQUFTO0FBQUE7QUFFNUM7QUFBQTtBQUVBLE1BQU0sYUFBdUM7QUFBQSxFQU9wQjtBQUFBLEVBQ0Q7QUFBQSxFQVBILGVBQWtDLElBQUk7QUFBQSxFQUN0QyxPQUFhLElBQUk7QUFBQSxFQUMxQixZQUFZO0FBQUEsRUFDYjtBQUFBLEVBRVAsV0FBVyxDQUNVLEtBQ0QsTUFDbEI7QUFBQSxJQUZtQjtBQUFBLElBQ0Q7QUFBQSxJQUVoQixLQUFLLFFBQVEsS0FBSztBQUFBLElBQ2xCLElBQUksUUFBUSxpQkFBaUIsd0JBQXdCLENBQUMsV0FDbEQsS0FBSyxhQUFhLE1BQU0sQ0FDNUI7QUFBQSxJQUNBLElBQUksUUFBUSxRQUFRLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFBQTtBQUFBLE9BR3JDLElBQUksR0FBZTtBQUFBLElBQ3JCLE1BQU0sU0FBUyxNQUFNLEtBQUssSUFBSSxVQUFVLEtBQUssdUJBQXVCLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEYsSUFBSSxPQUFPLFVBQVUsTUFBTTtBQUFBLE1BQ3ZCLE9BQU8sS0FBSyxLQUFLO0FBQUEsSUFDckI7QUFBQSxJQUNBLE9BQU8sS0FBSyxLQUFLLFdBQVcsWUFBWSxPQUFPLEtBQUs7QUFBQTtBQUFBLE9BR2xELElBQUksQ0FBQyxPQUF5QjtBQUFBLElBQ2hDLEtBQUssSUFBSSxLQUFLLHdCQUF3QjtBQUFBLE1BQ2xDLElBQUksS0FBSyxLQUFLO0FBQUEsTUFDZCxPQUFPLEtBQUssS0FBSyxXQUFXLFVBQVUsS0FBSztBQUFBLElBQy9DLENBQUM7QUFBQTtBQUFBLE9BR1EsSUFBRyxHQUFlO0FBQUEsSUFDM0IsTUFBTSxRQUFRLE1BQU0sS0FBSyxLQUFLLElBQUksWUFBWSxLQUFLLEtBQUssQ0FBQztBQUFBLElBQ3pELEtBQUssYUFBYSxLQUFLLEtBQUs7QUFBQSxJQUM1QixPQUFPO0FBQUE7QUFBQSxPQUdFLElBQUcsQ0FBQyxPQUF5QjtBQUFBLElBQ3RDLE1BQU0sS0FBSyxLQUFLLElBQUksWUFBWSxLQUFLLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDaEQsS0FBSyxhQUFhLEtBQUssS0FBSztBQUFBO0FBQUEsT0FHbkIsT0FBTSxDQUFDLElBQWtEO0FBQUEsSUFDbEUsTUFBTSxRQUFRLE1BQU0sS0FBSyxLQUFLLElBQUksWUFBWTtBQUFBLE1BQzFDLE1BQU0sU0FBUSxNQUFNLEtBQUssS0FBSztBQUFBLE1BQzlCLE1BQU0sV0FBVyxNQUFNLEdBQUcsTUFBSztBQUFBLE1BQy9CLE1BQU0sS0FBSyxLQUFLLFFBQVE7QUFBQSxNQUN4QixPQUFPO0FBQUEsS0FDVjtBQUFBLElBQ0QsS0FBSyxhQUFhLEtBQUssS0FBSztBQUFBLElBQzVCLE9BQU87QUFBQTtBQUFBLE9BR0UsT0FBTSxDQUFDLElBQWtEO0FBQUEsSUFDbEUsTUFBTSxRQUFRLE1BQU0sS0FBSyxLQUFLLElBQUksWUFBWTtBQUFBLE1BQzFDLE1BQU0sU0FBUSxNQUFNLEtBQUssS0FBSztBQUFBLE1BQzlCLE1BQU0sV0FBVyxNQUFNLEdBQUcsTUFBSztBQUFBLE1BQy9CLE1BQU0sS0FBSyxLQUFLLFFBQVE7QUFBQSxNQUN4QixPQUFPO0FBQUEsS0FDVjtBQUFBLElBQ0QsS0FBSyxhQUFhLEtBQUssS0FBSztBQUFBLElBQzVCLE9BQU87QUFBQTtBQUFBLEVBR0osTUFBTSxDQUFDLFNBQXVEO0FBQUEsSUFDakUsSUFBSSxDQUFDLEtBQUssYUFBYSxLQUFLLElBQUksT0FBTztBQUFBLE1BQ25DLEtBQUssSUFBSSxLQUFLLHdCQUF3QixLQUFLLEtBQUssRUFBRTtBQUFBLElBQ3REO0FBQUEsSUFDQSxLQUFLLFlBQVk7QUFBQSxJQUNqQixPQUFPLEtBQUssYUFBYSxPQUFPLE9BQU87QUFBQTtBQUFBLEVBR25DLFlBQVksQ0FBQyxNQUE0QjtBQUFBLElBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxLQUFLLEtBQUssRUFBRSxHQUFHO0FBQUEsTUFDaEM7QUFBQSxJQUNKO0FBQUEsSUFDQSxJQUFJLEtBQUssVUFBVSxNQUFNO0FBQUEsTUFDckIsS0FBSyxRQUFRLEtBQUssS0FBSyxXQUFXLFlBQVksS0FBSyxLQUFLO0FBQUEsSUFDNUQ7QUFBQSxJQUNBLEtBQUssYUFBYSxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsRUFHN0IsTUFBTSxHQUFTO0FBQUEsSUFDbkIsSUFBSSxLQUFLLFdBQVc7QUFBQSxNQUNoQixLQUFLLElBQUksS0FBSyx3QkFBd0IsS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUN0RDtBQUFBLElBQ0EsSUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHLFlBQVksS0FBSyxJQUFJLElBQUksRUFBRSxHQUFHO0FBQUEsTUFDNUM7QUFBQSxJQUNKO0FBQUEsSUFDQSxLQUFLLElBQUksS0FBSywwQkFBMEI7QUFBQSxNQUNwQyxJQUFJLEtBQUssS0FBSztBQUFBLE1BQ2QsYUFBYSxLQUFLLEtBQUs7QUFBQSxJQUMzQixDQUFDO0FBQUE7QUFFVDtBQUVPLElBQU0sMEJBQTRELElBQUksY0FDekUsWUFDQSxDQUFDLFFBQWEsSUFBSSxrQkFBa0IsR0FBRyxDQUMzQztBQUNPLElBQU0seUJBQXFDLHdCQUF3QixLQUFLLFlBQVk7QUFDM0YsSUFBTSwyQkFBMkIsV0FBVyxXQUEyQix5QkFBeUI7QUFBQSxFQUM1RixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDRCxJQUFNLHlCQUF5QixXQUFXLGlCQUN0Qyx5QkFDQTtBQUFBLEVBQ0ksTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUNKO0FBQ0EsSUFBTSx5QkFBeUIsV0FBVyxXQUF1Qix5QkFBeUI7QUFBQSxFQUN0RixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDRCxJQUFNLHdCQUF3QixhQUFhLGlCQUN2Qyx5QkFDQTtBQUFBLEVBQ0ksTUFBTTtBQUFBLEVBQ04sbUJBQW1CLFdBQVcsR0FBRyxVQUFVLEVBQUUsT0FBTztBQUFBLEVBQ3BELG9CQUFvQjtBQUFBLEVBQ3BCLGNBQWM7QUFDbEIsQ0FDSjs7QUMxTE8sSUFBTSxzQkFBb0QsSUFBSSxjQUFjLFFBQVEsQ0FBQyxXQUFXLElBQUksY0FBYyxNQUFNLENBQUM7QUFFekgsSUFBTSxpQ0FBNkMsb0JBQW9CLEtBQUssV0FBVyxLQUFLO0FBQzVGLElBQU0saUNBQTZDLG9CQUFvQixLQUFLLFdBQVcsS0FBSztBQUNuRyxJQUFNLDZCQUE2QixhQUFhLFdBQXFCLHFCQUFxQjtBQUFBLEVBQ3RGLE1BQU07QUFBQSxFQUNOLGNBQWMsT0FBTyxXQUFXLGNBQWMsQ0FBQyxJQUFJLE9BQU8sVUFBVTtBQUN4RSxDQUFDO0FBQUE7QUFFTSxNQUFNLGNBQW1DO0FBQUEsRUFJZjtBQUFBLEVBSGIsT0FBcUM7QUFBQSxFQUNyQztBQUFBLEVBRWhCLFdBQVcsQ0FBa0IsS0FBVTtBQUFBLElBQVY7QUFBQSxJQUN6QixLQUFLLGtCQUFrQixJQUFJLFdBQVcsSUFBSSwwQkFBMEI7QUFBQTtBQUFBLEVBR2pFLFNBQVMsQ0FBQyxlQUFzQztBQUFBLElBQ25ELE1BQU0sVUFBVSxLQUFLLGdCQUFnQjtBQUFBLElBQ3JDLElBQUksT0FBTyxrQkFBa0IsVUFBVTtBQUFBLE1BQ25DLE9BQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxNQUFNLGNBQWMsS0FBSyxzQkFBc0IsU0FBUyxhQUFhO0FBQUEsSUFDckUsSUFBSSxDQUFDLGFBQWE7QUFBQSxNQUNkLE9BQU8sT0FBTyxPQUFPLGFBQWEsRUFBRTtBQUFBLElBQ3hDO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUdKLHFCQUFxQixDQUN4QixTQUNBLGVBQ2tCO0FBQUEsSUFDbEIsSUFBSSxPQUFPLGtCQUFrQixVQUFVO0FBQUEsTUFDbkMsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLE1BQU0sZUFBZTtBQUFBLElBQ3JCLE1BQU0scUJBQXFCLFFBQVEsT0FBTyxDQUFDLEtBQUssTUFBTTtBQUFBLE1BQ2xELE1BQU0sUUFBUSxFQUFFLE1BQU0sR0FBRztBQUFBLE1BQ3pCLFNBQVMsSUFBSSxNQUFNLE9BQVEsSUFBSSxHQUFHLEtBQUs7QUFBQSxRQUNuQyxJQUFJLEtBQUssTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDO0FBQUEsTUFDeEM7QUFBQSxNQUNBLE9BQU87QUFBQSxPQUNSLENBQUMsQ0FBYTtBQUFBLElBQ2pCLFdBQVcsS0FBSyxvQkFBb0I7QUFBQSxNQUNoQyxNQUFNLGNBQWMsYUFBYTtBQUFBLE1BQ2pDLElBQUksYUFBYTtBQUFBLFFBQ2IsT0FBTztBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBO0FBQUEsRUFHRyxTQUFTLENBQUMsUUFBaUM7QUFBQSxJQUM5QyxPQUFPLEtBQUssZ0JBQWdCLElBQUksTUFBTTtBQUFBO0FBRTlDOzs7QUNqRE8sTUFBTSxVQUFVO0FBQUEsRUFFQztBQUFBLEVBQ0E7QUFBQSxFQUZwQixXQUFXLENBQ1MsSUFDQSxTQUNsQjtBQUFBLElBRmtCO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHTixTQUFTLENBQUMsTUFBNkI7QUFBQSxJQUNqRCxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sWUFBWSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQUEsSUFDaEMsT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJO0FBQUEsSUFDcEMsT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJO0FBQUEsSUFDcEMsT0FBTyxPQUFPLE9BQU87QUFBQTtBQUFBLFNBR1gsV0FBVyxDQUFDLE1BQTZCO0FBQUEsSUFDbkQsTUFBTSxTQUFTLFdBQVcsZUFBZSxJQUFJO0FBQUEsSUFDN0MsTUFBTSxLQUFLLE9BQU8sV0FBVztBQUFBLElBQzdCLE1BQU0sT0FBTyxPQUFPLFdBQVc7QUFBQSxJQUMvQixNQUFNLE9BQU8sT0FBTyxXQUFXO0FBQUEsSUFDL0IsTUFBTSxVQUFVLEVBQUUsTUFBTSxLQUFLO0FBQUEsSUFDN0IsT0FBTyxJQUFJLFVBQVUsV0FBVyxRQUFRLEVBQUUsR0FBRyxPQUFPO0FBQUE7QUFFNUQ7OztBQzVCTyxJQUFNLHdCQUF3RCxJQUFJLGNBQ3JFLFVBQ0EsQ0FBQyxXQUFXLElBQUksZ0JBQWdCLE1BQU0sQ0FDMUM7QUFFTyxJQUFNLDJCQUF1QyxzQkFBc0IsS0FBSyxLQUFLO0FBRTdFLElBQU0sb0JBQTJDLFdBQVcsaUJBQTRCLHVCQUF1QjtBQUFBLEVBQ2xILE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNNLElBQU0sdUJBQStDLFdBQVcsV0FBdUIsdUJBQXVCO0FBQUEsRUFDakgsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUFDO0FBQUE7QUFHTSxNQUFNLGdCQUFnQjtBQUFBLEVBSUk7QUFBQSxFQUhiLE9BQXVDO0FBQUEsRUFDdEMsWUFBMEMsSUFBSTtBQUFBLEVBRS9ELFdBQVcsQ0FBa0IsS0FBVTtBQUFBLElBQVY7QUFBQSxJQUN6QixJQUFJLFFBQVEsZUFBZSxtQkFBbUIsb0JBQW9CO0FBQUEsSUFDbEUsSUFBSSxRQUFRLGlCQUFpQixtQkFBbUIsQ0FBQyxXQUFXO0FBQUEsTUFDeEQsTUFBTSxXQUFXLEtBQUssVUFBVSxJQUFJLE9BQU8sRUFBRTtBQUFBLE1BQzdDLElBQUksVUFBVTtBQUFBLFFBQ1YsU0FBUyxRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDL0M7QUFBQSxLQUNIO0FBQUE7QUFBQSxFQUdFLEdBQUcsQ0FBQyxTQUEyQjtBQUFBLElBQ2xDLE1BQU0sU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPO0FBQUEsSUFDckQsS0FBSyxJQUFJLEtBQUssbUJBQW1CLE1BQU07QUFBQTtBQUFBLEVBR3BDLEtBQUssQ0FBQyxNQUFvQjtBQUFBLElBQzdCLEtBQUssSUFBSSxFQUFFLDJCQUFxQixLQUFLLENBQUM7QUFBQTtBQUFBLEVBR25DLE9BQU8sQ0FBQyxNQUFvQjtBQUFBLElBQy9CLEtBQUssSUFBSSxFQUFFLCtCQUF1QixLQUFLLENBQUM7QUFBQTtBQUFBLEVBR3JDLElBQUksQ0FBQyxNQUFvQjtBQUFBLElBQzVCLEtBQUssSUFBSSxFQUFFLHlCQUFvQixLQUFLLENBQUM7QUFBQTtBQUFBLEVBR2xDLEtBQUssQ0FBQyxNQUFvQjtBQUFBLElBQzdCLEtBQUssSUFBSSxFQUFFLDJCQUFxQixLQUFLLENBQUM7QUFBQTtBQUFBLEVBR25DLE1BQU0sQ0FBQyxJQUFnQixVQUFpQztBQUFBLElBQzNELElBQUksQ0FBQyxLQUFLLFVBQVUsSUFBSSxFQUFFLEdBQUc7QUFBQSxNQUN6QixLQUFLLElBQUksUUFBUSxNQUFNO0FBQUEsUUFDbkIsS0FBSyxJQUFJLEtBQUssc0JBQXNCLEVBQUU7QUFBQSxPQUN6QztBQUFBLElBQ0w7QUFBQSxJQUNBLE1BQU0sT0FBTyxLQUFLLFVBQVUsSUFBSSxFQUFFLEtBQUssQ0FBQztBQUFBLElBQ3hDLEtBQUssS0FBSyxRQUFRO0FBQUEsSUFDbEIsS0FBSyxVQUFVLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDM0IsT0FBTyxNQUFNO0FBQUEsTUFDVCxLQUFLLE9BQU8sS0FBSyxRQUFRLFFBQVEsR0FBRyxDQUFDO0FBQUE7QUFBQTtBQUdqRDs7O0FDMURPLE1BQU0sZUFBZTtBQUFBLEVBQ1I7QUFBQSxFQUNBO0FBQUEsRUFFaEIsV0FBVyxDQUFDLFNBQTJEO0FBQUEsSUFDbkUsS0FBSyxLQUFLLFFBQVE7QUFBQSxJQUNsQixLQUFLLFdBQVcsUUFBUTtBQUFBO0FBQUEsU0FHZCxNQUFNLENBQ2hCO0FBQUEsSUFFSTtBQUFBLEtBSVU7QUFBQSxJQUNkLE9BQU8sSUFBSSxlQUFlO0FBQUEsTUFDdEIsSUFBSSxXQUFXLEtBQUssVUFBVTtBQUFBLE1BQzlCO0FBQUEsSUFDSixDQUFDO0FBQUE7QUFBQSxTQUdTLFNBQVMsQ0FBQyxNQUEwQztBQUFBLElBQzlELE9BQU87QUFBQSxNQUNILElBQUksS0FBSyxHQUFHLElBQUk7QUFBQSxNQUNoQixVQUFVLEtBQUs7QUFBQSxJQUNuQjtBQUFBO0FBQUEsU0FHVSxXQUFXLENBQUMsTUFBMEM7QUFBQSxJQUNoRSxPQUFPLElBQUksZUFBZTtBQUFBLE1BQ3RCLElBQUksV0FBVyxRQUFRLEtBQUssRUFBRTtBQUFBLE1BQzlCLFVBQVUsS0FBSztBQUFBLElBQ25CLENBQUM7QUFBQTtBQUVUOzs7QUMzQ08sSUFBTSw0QkFBZ0UsSUFBSSxjQUM3RSxjQUNBLENBQUMsV0FBVyxJQUFJLG9CQUFvQixNQUFNLENBQzlDO0FBQ0EsSUFBTSw2QkFBNkIsV0FBVyxXQUMxQywyQkFDQTtBQUFBLEVBQ0ksTUFBTTtBQUFBLEVBQ04sWUFBWSxXQUFXLEdBQUcsY0FBYyxFQUFFLFFBQVE7QUFDdEQsQ0FDSjtBQUNBLElBQU0sNEJBQTRCLFdBQVcsV0FBeUIsMkJBQTJCO0FBQUEsRUFDN0YsTUFBTTtBQUFBLEVBQ04sWUFBWSxXQUFXLEdBQUcsVUFBVSxFQUFFLFFBQVE7QUFDbEQsQ0FBQztBQUNELElBQU0sOEJBQThCLGFBQWEsV0FDN0MsMkJBQ0E7QUFBQSxFQUNJLE1BQU07QUFBQSxFQUNOLG1CQUFtQixXQUFXLEdBQUcsVUFBVSxFQUFFLFFBQVE7QUFDekQsQ0FDSjtBQUNBLElBQU0sMEJBQTBCLFdBQVcsV0FBNkIsMkJBQTJCO0FBQUEsRUFDL0YsTUFBTTtBQUFBLEVBQ04sWUFBWSxXQUFXLEdBQUcsY0FBYyxFQUFFLFFBQVE7QUFDdEQsQ0FBQztBQUFBO0FBRU0sTUFBTSxvQkFBb0I7QUFBQSxFQU1BO0FBQUEsRUFMYixPQUEyQztBQUFBLEVBQ25ELGNBQWMsSUFBSTtBQUFBLEVBQ1Qsd0JBQXdCLElBQUk7QUFBQSxFQUM1QixzQkFBc0IsSUFBSTtBQUFBLEVBRTNDLFdBQVcsQ0FBa0IsS0FBVTtBQUFBLElBQVY7QUFBQSxJQUN6QixJQUFJLFFBQVEsZUFDUiw0QkFDQSwyQkFDQSx1QkFDSjtBQUFBLElBQ0EsSUFBSSxRQUFRLGlCQUFpQix5QkFBeUIsQ0FBQyxnQkFBZ0I7QUFBQSxNQUNuRSxXQUFXLGNBQWMsYUFBYTtBQUFBLFFBQ2xDLEtBQUssWUFBWSxJQUFJLFdBQVcsSUFBSSxVQUFVO0FBQUEsTUFDbEQ7QUFBQSxLQUNIO0FBQUEsSUFDRCxJQUFJLFFBQVEsUUFBUSxNQUFNLEtBQUssT0FBTyxDQUFDO0FBQUE7QUFBQSxFQUduQyxNQUFNLEdBQVM7QUFBQSxJQUNuQixJQUFJLEtBQUssSUFBSSxJQUFJLFNBQVMsVUFBVTtBQUFBLE1BQ2hDO0FBQUEsSUFDSjtBQUFBLElBQ0EsSUFBSSxLQUFLLHNCQUFzQixPQUFPLEdBQUc7QUFBQSxNQUNyQyxLQUFLLElBQUksS0FDTCw0QkFDQSxNQUFNLEtBQUssS0FBSyxzQkFBc0IsT0FBTyxDQUFDLENBQ2xEO0FBQUEsSUFDSjtBQUFBLElBQ0EsSUFBSSxLQUFLLG9CQUFvQixPQUFPLEdBQUc7QUFBQSxNQUNuQyxLQUFLLElBQUksS0FDTCwyQkFDQSxNQUFNLEtBQUssS0FBSyxvQkFBb0IsT0FBTyxDQUFDLENBQ2hEO0FBQUEsSUFDSjtBQUFBO0FBQUEsRUFHRyxRQUFRLENBQUMsWUFBa0M7QUFBQSxJQUM5QyxJQUFJLEtBQUssSUFBSSxTQUFTO0FBQUEsTUFDbEIsS0FBSyxJQUFJLEtBQUssNEJBQTRCLENBQUMsVUFBVSxDQUFDO0FBQUEsSUFDMUQ7QUFBQSxJQUNBLEtBQUssc0JBQXNCLElBQUksV0FBVyxJQUFJLFVBQVU7QUFBQTtBQUFBLEVBR3JELE9BQU8sSUFBSSxlQUErQjtBQUFBLElBQzdDLE1BQU0sTUFBTSxjQUFjLElBQUksV0FBVyxJQUFJO0FBQUEsSUFDN0MsTUFBTSxVQUFVLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUM7QUFBQSxJQUM1RCxJQUFJLEtBQUssSUFBSSxTQUFTO0FBQUEsTUFDbEIsSUFBSSxRQUFRLFNBQVMsR0FBRztBQUFBLFFBQ3BCLE1BQU0sSUFBSSxNQUFNLHlEQUF5RDtBQUFBLE1BQzdFO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFBQSxJQUNBLFdBQVcsTUFBTSxLQUFLO0FBQUEsTUFDbEIsS0FBSyxvQkFBb0IsSUFBSSxFQUFFO0FBQUEsSUFDbkM7QUFBQTtBQUFBLE9BR1MsUUFBTyxJQUFJLGVBQTRDO0FBQUEsSUFDaEUsTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLDZCQUE2QixhQUFhO0FBQUE7QUFBQSxFQUdyRSxHQUFHLENBQUMsc0JBQTJDO0FBQUEsSUFDbEQsT0FBTyxLQUFLLFlBQVksSUFBSSxvQkFBb0I7QUFBQTtBQUV4RDs7O0FDL0ZPLElBQU0sd0JBQXdELElBQUksY0FDckUsVUFDQSxDQUFDLFFBQWEsSUFBSSxnQkFBZ0IsR0FBRyxDQUN6QztBQUFBO0FBRU8sTUFBTSxnQkFBZ0I7QUFBQSxFQUlJO0FBQUEsRUFIYixPQUF1QztBQUFBLEVBQ3RDLGtCQUE4QyxJQUFJO0FBQUEsRUFFbkUsV0FBVyxDQUFrQixLQUFVO0FBQUEsSUFBVjtBQUFBLElBQ3pCLElBQUksUUFBUSxlQUFlLHFCQUFxQjtBQUFBLElBQ2hELElBQUksUUFBUSxRQUFRLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFBQTtBQUFBLEVBR3BDLGtCQUFrQixHQUE2QjtBQUFBLElBQ2xELE9BQU8sS0FBSyxJQUFJLE9BQU8sSUFBSSw0QkFBNEI7QUFBQTtBQUFBLEVBR3BELE1BQU0sQ0FBQyxTQUE4QjtBQUFBLElBQ3hDLEtBQUssSUFBSSxVQUFVLEtBQUssNkJBQTZCLE9BQU87QUFBQTtBQUFBLE9BR2xELE9BQU0sR0FBa0I7QUFBQSxJQUNsQyxLQUFLLElBQUksS0FBSyx1QkFBdUIsT0FBTyxZQUFZLEtBQUssZUFBZSxDQUFDO0FBQUE7QUFBQSxFQUcxRSxPQUFPLENBQUMsU0FBOEM7QUFBQSxJQUN6RCxJQUFJLEtBQUssSUFBSSxTQUFTO0FBQUEsTUFDbEIsTUFBTSxJQUFJLE1BQU0sbURBQW1EO0FBQUEsSUFDdkU7QUFBQSxJQUNBLFlBQVksS0FBSyxVQUFVLE9BQU8sUUFBUSxPQUFPLEdBQUc7QUFBQSxNQUNoRCxLQUFLLGdCQUFnQixJQUFJLEtBQUssS0FBSztBQUFBLElBQ3ZDO0FBQUE7QUFFUjtBQUVBLElBQU0sd0JBQXdCLFdBQVcsV0FDckMsdUJBQ0E7QUFBQSxFQUNJLE1BQU07QUFDVixDQUNKO0FBQUE7QUFDTyxNQUFNLGtCQUFrQjtBQUFBLEVBQ3BCO0FBQUEsRUFDQTtBQUFBLEVBRVAsV0FBVyxDQUFDLFVBQWtCLFNBQWlCO0FBQUEsSUFDM0MsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFVBQVU7QUFBQTtBQUFBLFNBR0wsU0FBUyxDQUFDLE1BQStEO0FBQUEsSUFDbkYsT0FBTyxLQUFLLE9BQU87QUFBQTtBQUFBLFNBR1QsV0FBVyxDQUFDLE1BQStEO0FBQUEsSUFDckYsT0FBTyxrQkFBa0IsU0FBUyxJQUFJO0FBQUE7QUFBQSxTQUc1QixRQUFRLENBQUMsTUFBK0Q7QUFBQSxJQUNsRixPQUFPLElBQUksa0JBQWtCLEtBQUssU0FBUyxLQUFLLE9BQU87QUFBQTtBQUFBLEVBR3BELE1BQU0sR0FBeUM7QUFBQSxJQUNsRCxPQUFPLEVBQUUsU0FBUyxLQUFLLFNBQVMsU0FBUyxLQUFLLFFBQVE7QUFBQTtBQUFBLEVBR25ELEdBQUcsR0FBVztBQUFBLElBQ2pCLE9BQU8sS0FBSztBQUFBO0FBRXBCO0FBRU8sSUFBTSxvQ0FBZ0Qsc0JBQXNCLEtBQUssV0FBVyxNQUFNO0FBQ2xHLElBQU0sc0NBQWtELHNCQUFzQixLQUFLLFdBQVcsUUFBUTtBQUU3RyxJQUFNLCtCQUErQixVQUFVLFdBQVcsdUJBQXVCO0FBQUEsRUFDN0UsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osS0FBSyxDQUFDLFNBQVMsS0FBSyxJQUFJO0FBQzVCLENBQUM7QUFVRCxJQUFNLDhCQUE4QixhQUFhLFdBQXdDLHVCQUF1QjtBQUFBLEVBQzVHLE1BQU07QUFBQSxFQUNOLGNBQWM7QUFDbEIsQ0FBQzs7O0FDOUZNLE1BQU0sWUFBWTtBQUFBLEVBQ087QUFBQSxFQUE1QixXQUFXLENBQWlCLElBQWdCO0FBQUEsSUFBaEI7QUFBQTtBQUFBLFNBRWQsU0FBUyxDQUFDLFFBQWlDO0FBQUEsSUFDckQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sT0FBTyxPQUFPO0FBQUE7QUFBQSxTQUdYLFdBQVcsQ0FBQyxNQUErQjtBQUFBLElBQ3JELE1BQU0sU0FBUyxXQUFXLGVBQWUsSUFBSTtBQUFBLElBQzdDLE1BQU0sS0FBSyxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUM7QUFBQSxJQUNqRCxPQUFPLElBQUksWUFBWSxFQUFFO0FBQUE7QUFFakM7QUFBQTtBQUVPLE1BQU0saUJBQWlCO0FBQUEsRUFFTjtBQUFBLEVBQ0E7QUFBQSxFQUZwQixXQUFXLENBQ1MsSUFDQSxPQUNsQjtBQUFBLElBRmtCO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHTixTQUFTLENBQUMsUUFBc0M7QUFBQSxJQUMxRCxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sWUFBWSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQUEsSUFDbEMsT0FBTyxhQUFhLE9BQU8sS0FBSyxPQUFPLEtBQUssRUFBRSxNQUFNO0FBQUEsSUFDcEQsWUFBWSxLQUFLLFVBQVUsT0FBTyxRQUFRLE9BQU8sS0FBSyxHQUFHO0FBQUEsTUFDckQsT0FBTyxZQUFZLEdBQUc7QUFBQSxNQUN0QixPQUFPLGdCQUFnQixLQUFLO0FBQUEsSUFDaEM7QUFBQSxJQUNBLE9BQU8sT0FBTyxPQUFPO0FBQUE7QUFBQSxTQUdYLFdBQVcsQ0FBQyxNQUFvQztBQUFBLElBQzFELE1BQU0sU0FBUyxXQUFXLGVBQWUsSUFBSTtBQUFBLElBQzdDLE1BQU0sS0FBSyxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUM7QUFBQSxJQUNqRCxNQUFNLFFBQVEsT0FBTyxZQUFZO0FBQUEsSUFDakMsTUFBTSxRQUFvQyxDQUFDO0FBQUEsSUFDM0MsU0FBUyxJQUFJLEVBQUcsSUFBSSxPQUFPLEtBQUs7QUFBQSxNQUM1QixNQUFNLE1BQU0sT0FBTyxXQUFXO0FBQUEsTUFDOUIsTUFBTSxRQUFRLE9BQU8sZUFBZTtBQUFBLE1BQ3BDLE1BQU0sT0FBTztBQUFBLElBQ2pCO0FBQUEsSUFDQSxPQUFPLElBQUksaUJBQWlCLElBQUksS0FBSztBQUFBO0FBRTdDO0FBQUE7QUFFTyxNQUFNLGdCQUFnQjtBQUFBLEVBRUw7QUFBQSxFQUNBO0FBQUEsRUFGcEIsV0FBVyxDQUNTLElBQ0EsTUFDbEI7QUFBQSxJQUZrQjtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQXFDO0FBQUEsSUFDekQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sYUFBYSxPQUFPLEtBQUssTUFBTTtBQUFBLElBQ3RDLFdBQVcsT0FBTyxPQUFPLE1BQU07QUFBQSxNQUMzQixPQUFPLFlBQVksR0FBRztBQUFBLElBQzFCO0FBQUEsSUFDQSxPQUFPLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FHWCxXQUFXLENBQUMsTUFBbUM7QUFBQSxJQUN6RCxNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxJQUM3QyxNQUFNLEtBQUssV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDakQsTUFBTSxRQUFRLE9BQU8sWUFBWTtBQUFBLElBQ2pDLE1BQU0sT0FBaUIsQ0FBQztBQUFBLElBQ3hCLFNBQVMsSUFBSSxFQUFHLElBQUksT0FBTyxLQUFLO0FBQUEsTUFDNUIsS0FBSyxLQUFLLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDakM7QUFBQSxJQUNBLE9BQU8sSUFBSSxnQkFBZ0IsSUFBSSxJQUFJO0FBQUE7QUFFM0M7QUFBQTtBQUVPLE1BQU0saUJBQWlCO0FBQUEsRUFFTjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFIcEIsV0FBVyxDQUNTLElBQ0EsT0FDQSxLQUNsQjtBQUFBLElBSGtCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQXNDO0FBQUEsSUFDMUQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sYUFBYSxPQUFPLEdBQUc7QUFBQSxJQUM5QixPQUFPLGFBQWEsT0FBTyxLQUFLLE9BQU8sS0FBSyxFQUFFLE1BQU07QUFBQSxJQUNwRCxZQUFZLEtBQUssVUFBVSxPQUFPLFFBQVEsT0FBTyxLQUFLLEdBQUc7QUFBQSxNQUNyRCxPQUFPLFlBQVksR0FBRztBQUFBLE1BQ3RCLE9BQU8sZ0JBQWdCLEtBQUs7QUFBQSxJQUNoQztBQUFBLElBQ0EsT0FBTyxPQUFPLE9BQU87QUFBQTtBQUFBLFNBR1gsV0FBVyxDQUFDLE1BQW9DO0FBQUEsSUFDMUQsTUFBTSxTQUFTLFdBQVcsZUFBZSxJQUFJO0FBQUEsSUFDN0MsTUFBTSxLQUFLLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQ2pELE1BQU0sTUFBTSxPQUFPLFlBQVk7QUFBQSxJQUMvQixNQUFNLFFBQVEsT0FBTyxZQUFZO0FBQUEsSUFDakMsTUFBTSxRQUFvQyxDQUFDO0FBQUEsSUFDM0MsU0FBUyxJQUFJLEVBQUcsSUFBSSxPQUFPLEtBQUs7QUFBQSxNQUM1QixNQUFNLE9BQU0sT0FBTyxXQUFXO0FBQUEsTUFDOUIsTUFBTSxRQUFRLE9BQU8sZUFBZTtBQUFBLE1BQ3BDLE1BQU0sUUFBTztBQUFBLElBQ2pCO0FBQUEsSUFDQSxPQUFPLElBQUksaUJBQWlCLElBQUksT0FBTyxHQUFHO0FBQUE7QUFFbEQ7QUFBQTtBQUNPLE1BQU0saUJBQWlCO0FBQUEsRUFFTjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBSnBCLFdBQVcsQ0FDUyxJQUNBLE9BQ0EsV0FBb0IsT0FDcEIsU0FBd0IsTUFDMUM7QUFBQSxJQUprQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHTixTQUFTLENBQUMsUUFBc0M7QUFBQSxJQUMxRCxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sWUFBWSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQUEsSUFDbEMsT0FBTyxhQUFhLE9BQU8sS0FBSztBQUFBLElBQ2hDLE1BQU0sUUFBUSxJQUFJLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUFBLElBQ3JDLE1BQU0sSUFBSSxHQUFHLE9BQU8sUUFBUTtBQUFBLElBQzVCLE1BQU0sSUFBSSxHQUFHLE9BQU8sV0FBVyxJQUFJO0FBQUEsSUFDbkMsT0FBTyxXQUFXLEtBQUs7QUFBQSxJQUN2QixJQUFJLE9BQU8sV0FBVyxNQUFNO0FBQUEsTUFDeEIsT0FBTyxZQUFZLE9BQU8sTUFBTTtBQUFBLElBQ3BDO0FBQUEsSUFDQSxPQUFPLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FHWCxXQUFXLENBQUMsTUFBb0M7QUFBQSxJQUMxRCxNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxJQUM3QyxNQUFNLEtBQUssV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDakQsTUFBTSxRQUFRLE9BQU8sWUFBWTtBQUFBLElBQ2pDLE1BQU0sUUFBUSxPQUFPLFVBQVUsQ0FBQztBQUFBLElBQ2hDLE1BQU0sV0FBVyxNQUFNLElBQUksQ0FBQztBQUFBLElBQzVCLE1BQU0sU0FBUyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDdkQsT0FBTyxJQUFJLGlCQUFpQixJQUFJLE9BQU8sVUFBVSxNQUFNO0FBQUE7QUFFL0Q7QUFBQTtBQUVPLE1BQU0sc0JBQXNCO0FBQUEsRUFFWDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFIcEIsV0FBVyxDQUNTLElBQ0EsT0FDQSxLQUNsQjtBQUFBLElBSGtCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQTJDO0FBQUEsSUFDL0QsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sWUFBWSxPQUFPLEtBQUs7QUFBQSxJQUMvQixPQUFPLFlBQVksT0FBTyxHQUFHO0FBQUEsSUFDN0IsT0FBTyxPQUFPLE9BQU87QUFBQTtBQUFBLFNBR1gsV0FBVyxDQUFDLE1BQXlDO0FBQUEsSUFDL0QsTUFBTSxTQUFTLFdBQVcsZUFBZSxJQUFJO0FBQUEsSUFDN0MsTUFBTSxLQUFLLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQ2pELE1BQU0sUUFBUSxPQUFPLFdBQVc7QUFBQSxJQUNoQyxNQUFNLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDOUIsT0FBTyxJQUFJLHNCQUFzQixJQUFJLE9BQU8sR0FBRztBQUFBO0FBRXZEO0FBQUE7QUFFTyxNQUFNLGdCQUFnQjtBQUFBLEVBRUw7QUFBQSxFQUNBO0FBQUEsRUFGcEIsV0FBVyxDQUNTLElBQ0EsUUFDbEI7QUFBQSxJQUZrQjtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQXFDO0FBQUEsSUFDekQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sWUFBWSxLQUFLLFVBQVUsT0FBTyxNQUFNLENBQUM7QUFBQSxJQUNoRCxPQUFPLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FHWCxXQUFXLENBQUMsTUFBbUM7QUFBQSxJQUN6RCxNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxJQUM3QyxNQUFNLEtBQUssV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDakQsTUFBTSxTQUFTLEtBQUssTUFBTSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQzdDLE9BQU8sSUFBSSxnQkFBZ0IsSUFBSSxNQUFNO0FBQUE7QUFFN0M7QUFBQTtBQUVPLE1BQU0sb0JBQW9CO0FBQUEsRUFFVDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFOcEIsV0FBVyxDQUNTLElBQ0EsS0FDQSxNQUNBLE9BQ0EsUUFDQSxPQUNsQjtBQUFBLElBTmtCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQXlDO0FBQUEsSUFDN0QsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLElBQUksUUFBUTtBQUFBLElBQ1osSUFBSSxPQUFPLFFBQVEsTUFBTTtBQUFBLE1BQ3JCLFNBQVM7QUFBQSxJQUNiO0FBQUEsSUFDQSxJQUFJLE9BQU8sU0FBUyxNQUFNO0FBQUEsTUFDdEIsU0FBUztBQUFBLElBQ2I7QUFBQSxJQUNBLElBQUksT0FBTyxVQUFVLE1BQU07QUFBQSxNQUN2QixTQUFTO0FBQUEsSUFDYjtBQUFBLElBQ0EsSUFBSSxPQUFPLFdBQVcsTUFBTTtBQUFBLE1BQ3hCLFNBQVM7QUFBQSxJQUNiO0FBQUEsSUFDQSxJQUFJLE9BQU8sVUFBVSxNQUFNO0FBQUEsTUFDdkIsU0FBUztBQUFBLElBQ2I7QUFBQSxJQUNBLE9BQU8sV0FBVyxLQUFLO0FBQUEsSUFDdkIsSUFBSSxPQUFPLEtBQUs7QUFBQSxNQUNaLE9BQU8sWUFBWSxPQUFPLElBQUksSUFBSSxDQUFDO0FBQUEsSUFDdkM7QUFBQSxJQUNBLElBQUksT0FBTyxNQUFNO0FBQUEsTUFDYixPQUFPLFlBQVksT0FBTyxLQUFLLElBQUksQ0FBQztBQUFBLElBQ3hDO0FBQUEsSUFDQSxJQUFJLE9BQU8sT0FBTztBQUFBLE1BQ2QsT0FBTyxZQUFZLE9BQU8sTUFBTSxJQUFJLENBQUM7QUFBQSxJQUN6QztBQUFBLElBQ0EsSUFBSSxPQUFPLFFBQVE7QUFBQSxNQUNmLE9BQU8sWUFBWSxPQUFPLE9BQU8sSUFBSSxDQUFDO0FBQUEsSUFDMUM7QUFBQSxJQUNBLElBQUksT0FBTyxPQUFPO0FBQUEsTUFDZCxPQUFPLFlBQVksT0FBTyxNQUFNLElBQUksQ0FBQztBQUFBLElBQ3pDO0FBQUEsSUFDQSxPQUFPLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FHWCxXQUFXLENBQUMsTUFBdUM7QUFBQSxJQUM3RCxNQUFNLFNBQVMsV0FBVyxlQUFlLElBQUk7QUFBQSxJQUM3QyxNQUFNLEtBQUssV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDakQsTUFBTSxRQUFRLE9BQU8sVUFBVTtBQUFBLElBQy9CLE1BQU0sTUFBTSxRQUFRLElBQU0sV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDLElBQUk7QUFBQSxJQUNwRSxNQUFNLE9BQU8sUUFBUSxJQUFPLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQyxJQUFJO0FBQUEsSUFDdEUsTUFBTSxRQUFRLFFBQVEsSUFBUSxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUMsSUFBSTtBQUFBLElBQ3hFLE1BQU0sU0FBUyxRQUFRLElBQVMsV0FBVyxRQUFRLE9BQU8sV0FBVyxDQUFDLElBQUk7QUFBQSxJQUMxRSxNQUFNLFFBQVEsUUFBUSxLQUFVLFdBQVcsUUFBUSxPQUFPLFdBQVcsQ0FBQyxJQUFJO0FBQUEsSUFDMUUsT0FBTyxJQUFJLG9CQUFvQixJQUFJLEtBQUssTUFBTSxPQUFPLFFBQVEsS0FBSztBQUFBO0FBRTFFOzs7QUNsT08sSUFBTSx1QkFBc0QsSUFBSSxjQUNuRSxTQUNBLENBQUMsV0FBVyxJQUFJLGVBQWUsTUFBTSxDQUN6QztBQUNPLElBQU0sc0JBQWtDLHFCQUFxQixLQUFLLFlBQVk7QUFFckYsSUFBTSw4QkFBOEIsV0FBVyxpQkFBc0Msc0JBQXNCO0FBQUEsRUFDdkcsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUFDO0FBQ0QsSUFBTSwwQkFBMEIsV0FBVyxpQkFBa0Msc0JBQXNCO0FBQUEsRUFDL0YsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUFDO0FBQ0QsSUFBTSxzQkFBc0IsV0FBVyxXQUF1QixzQkFBc0I7QUFBQSxFQUNoRixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDRCxJQUFNLDRCQUE0QixXQUFXLFdBQXVCLHNCQUFzQjtBQUFBLEVBQ3RGLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0scUJBQXFCLFdBQVcsaUJBQW1DLHNCQUFzQjtBQUFBLEVBQzNGLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0sd0JBQXdCLFdBQVcsaUJBQW1DLHNCQUFzQjtBQUFBLEVBQzlGLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0sMkJBQTJCLFdBQVcsaUJBQW1DLHNCQUFzQjtBQUFBLEVBQ2pHLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0sMkJBQTJCLFdBQVcsaUJBQW1DLHNCQUFzQjtBQUFBLEVBQ2pHLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0sMEJBQTBCLGFBQWEsaUJBQW9ELHNCQUFzQjtBQUFBLEVBQ25ILE1BQU07QUFBQSxFQUNOLG1CQUFtQjtBQUFBLEVBQ25CLG9CQUFvQjtBQUFBLEVBQ3BCLGNBQWM7QUFDbEIsQ0FBQztBQUNELElBQU0sMEJBQTBCLGFBQWEsaUJBQTJELHNCQUFzQjtBQUFBLEVBQzFILE1BQU07QUFBQSxFQUNOLG1CQUFtQjtBQUFBLEVBQ25CLG9CQUFvQixXQUFXLEtBQUs7QUFBQSxFQUNwQyxjQUFjO0FBQ2xCLENBQUM7QUFDRCxJQUFNLDhCQUE4QixhQUFhLGlCQUEyQyxzQkFBc0I7QUFBQSxFQUM5RyxNQUFNO0FBQUEsRUFDTixtQkFBbUI7QUFBQSxFQUNuQixvQkFBb0IsV0FBVyxLQUFLO0FBQUEsRUFDcEMsY0FBYztBQUNsQixDQUFDO0FBQ0QsSUFBTSw4QkFBOEIsYUFBYSxpQkFBMkMsc0JBQXNCO0FBQUEsRUFDOUcsTUFBTTtBQUFBLEVBQ04sbUJBQW1CO0FBQUEsRUFDbkIsb0JBQW9CLFdBQVcsS0FBSztBQUFBLEVBQ3BDLGNBQWM7QUFDbEIsQ0FBQztBQUNELElBQU0sdUJBQXVCLGFBQWEsaUJBQXFELHNCQUFzQjtBQUFBLEVBQ2pILE1BQU07QUFBQSxFQUNOLG1CQUFtQjtBQUFBLEVBQ25CLG9CQUFvQjtBQUFBLEVBQ3BCLGNBQWM7QUFDbEIsQ0FBQztBQUNELElBQU0sNkJBQTZCLGFBQWEsaUJBQTBELHNCQUFzQjtBQUFBLEVBQzVILE1BQU07QUFBQSxFQUNOLG1CQUFtQjtBQUFBLEVBQ25CLG9CQUFvQjtBQUFBLEVBQ3BCLGNBQWM7QUFDbEIsQ0FBQztBQUNELElBQU0sMkJBQTJCLGFBQWEsaUJBQWdELHNCQUFzQjtBQUFBLEVBQ2hILE1BQU07QUFBQSxFQUNOLG1CQUFtQjtBQUFBLEVBQ25CLG9CQUFvQjtBQUFBLEVBQ3BCLGNBQWM7QUFDbEIsQ0FBQztBQUNELElBQU0sc0JBQXNCLGFBQWEsaUJBQXNDLHNCQUFzQjtBQUFBLEVBQ2pHLE1BQU07QUFBQSxFQUNOLG1CQUFtQjtBQUFBLEVBQ25CLG9CQUFvQixXQUFXLEtBQUs7QUFBQSxFQUNwQyxjQUFjO0FBQ2xCLENBQUM7QUFDRCxJQUFNLDBCQUEwQixXQUFXLGlCQUE4QixzQkFBc0I7QUFBQSxFQUMzRixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFBQTtBQUVNLE1BQU0sZUFBb0M7QUFBQSxFQUloQjtBQUFBLEVBSGIsT0FBc0M7QUFBQSxFQUNyQyxXQUFXLElBQUk7QUFBQSxFQUVoQyxXQUFXLENBQWtCLEtBQVU7QUFBQSxJQUFWO0FBQUEsSUFDekIsSUFBSSxRQUFRLGVBQ1IsNkJBQ0EseUJBQ0EscUJBQ0EsMkJBQ0Esb0JBQ0EsdUJBQ0EsMEJBQ0EsMEJBQ0EsdUJBQ0o7QUFBQTtBQUFBLEVBR0ksV0FBYyxDQUFDLFdBQW1DO0FBQUEsSUFDdEQsS0FBSyxJQUFJLFlBQVksUUFBUSxtQkFBbUI7QUFBQSxJQUNoRCxJQUFJLEtBQUssSUFBSSxVQUFVLEVBQUUsR0FBRztBQUFBLE1BQ3hCLE1BQU0sSUFBSSxNQUFNLHNCQUFzQjtBQUFBLElBQzFDO0FBQUEsSUFDQSxNQUFNLFFBQVEsSUFBSSxVQUFhLEtBQUssS0FBSyxTQUFTO0FBQUEsSUFDbEQsS0FBSyxTQUFTLElBQUksVUFBVSxJQUFJLEtBQXVCO0FBQUEsSUFDdkQsT0FBTztBQUFBO0FBQUEsRUFHSixJQUFzQyxDQUFDLE1BQWMsU0FBa0Y7QUFBQSxJQUMxSSxNQUFNLFlBQVksSUFBSSxVQUNsQixLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssSUFBSSxHQUN6QixXQUFXLEtBQThCLFFBQVEsY0FBYyxXQUFXLEtBQUssR0FBRyxXQUFXLEtBQUssQ0FBQyxHQUNuRyxRQUFRLEdBQ1o7QUFBQSxJQUNBLE9BQU8sS0FBSyxZQUFZLFNBQVM7QUFBQTtBQUFBLEVBRzlCLFVBQWEsQ0FBQyxNQUFjLFNBQTBGO0FBQUEsSUFDekgsTUFBTSxZQUFZLElBQUksVUFDbEIsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLElBQUksR0FDekIsUUFBUSxZQUNSLFFBQVEsR0FDWjtBQUFBLElBQ0EsT0FBTyxLQUFLLFlBQVksU0FBUztBQUFBO0FBQUEsRUFHOUIsR0FBTSxDQUFDLE1BQThCO0FBQUEsSUFDeEMsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFLEdBQUc7QUFBQSxNQUNuQixPQUFPLEtBQUssU0FBUyxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ3BDO0FBQUEsSUFDQSxPQUFPLEtBQUssWUFBWSxJQUFJO0FBQUE7QUFBQSxFQUd6QixHQUFHLENBQUMsWUFBaUM7QUFBQSxJQUN4QyxPQUFPLEtBQUssU0FBUyxJQUFJLFVBQVU7QUFBQTtBQUUzQztBQUFBO0FBRUEsTUFBTSxVQUFpQztBQUFBLEVBY2Q7QUFBQSxFQWJkO0FBQUEsRUFDUztBQUFBLEVBQ0M7QUFBQSxFQUNBO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRVIsV0FBVyxDQUNVLEtBQ2pCLFdBQ0Y7QUFBQSxJQUZtQjtBQUFBLElBR2pCLEtBQUssS0FBSyxVQUFVO0FBQUEsSUFDcEIsS0FBSyxhQUFhLFVBQVU7QUFBQSxJQUM1QixLQUFLLGNBQWMsVUFBVTtBQUFBLElBQzdCLEtBQUssUUFBUSxJQUFJO0FBQUEsSUFDakIsS0FBSyxRQUFRO0FBQUEsTUFDVCxLQUFLLElBQUk7QUFBQSxNQUNULFFBQVEsSUFBSTtBQUFBLE1BQ1osUUFBUSxJQUFJO0FBQUEsTUFDWixPQUFPLElBQUk7QUFBQSxNQUNYLGFBQWEsSUFBSTtBQUFBLElBQ3JCO0FBQUEsSUFDQSxLQUFLLGFBQWEsSUFBSTtBQUFBLElBQ3RCLEtBQUssVUFBVSxDQUFDO0FBQUEsSUFDaEIsS0FBSyxZQUFZO0FBQUEsSUFFakIsSUFBSSxRQUFRLGlCQUFpQixvQkFBb0IsQ0FBQyxXQUFXO0FBQUEsTUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLEtBQUssRUFBRSxHQUFHO0FBQUEsUUFDN0I7QUFBQSxNQUNKO0FBQUEsTUFDQSxJQUFJLFFBQVEsS0FBSyxpQkFBaUIsT0FBTyxLQUFLO0FBQUEsTUFDOUMsS0FBSyxRQUFRLFFBQVEsQ0FBQyxVQUFVO0FBQUEsUUFDNUIsUUFBUSxJQUFJLElBQ1IsQ0FBQyxHQUFHLE1BQU0sUUFBUSxDQUFDLEVBQ2QsSUFBSSxFQUFFLEtBQUssVUFBVTtBQUFBLFVBQ2xCLE1BQU0sWUFBWSxNQUFNLElBQUk7QUFBQSxVQUM1QixJQUFJLGNBQWMsV0FBVztBQUFBLFlBQ3pCLE9BQU8sQ0FBQyxLQUFLLFNBQWM7QUFBQSxVQUMvQjtBQUFBLFVBQ0E7QUFBQSxTQUNILEVBQ0EsT0FBTyxDQUFDLFNBQThCO0FBQUEsVUFDbkMsT0FBTyxPQUFPLFNBQVM7QUFBQSxTQUMxQixDQUNUO0FBQUEsT0FDSDtBQUFBLE1BQ0QsSUFBSSxLQUFLLG9CQUFvQjtBQUFBLFFBQ3pCLElBQUksS0FBSztBQUFBLFFBQ1QsS0FBSyxPQUFPO0FBQUEsUUFDWixPQUFPLE9BQU8sWUFDVixDQUFDLEdBQUcsTUFBTSxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxVQUFVO0FBQUEsVUFDdEMsT0FBTyxDQUFDLEtBQUssS0FBSyxXQUFXLFVBQVUsSUFBSSxDQUFDO0FBQUEsU0FDL0MsQ0FDTDtBQUFBLE1BQ0osQ0FBQztBQUFBLEtBQ0o7QUFBQSxJQUNELElBQUksUUFBUSxpQkFBaUIsdUJBQXVCLENBQUMsV0FBVztBQUFBLE1BQzVELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxLQUFLLEVBQUUsR0FBRztBQUFBLFFBQzdCO0FBQUEsTUFDSjtBQUFBLE1BQ0EsTUFBTSxRQUFRLEtBQUssaUJBQWlCLE9BQU8sS0FBSztBQUFBLE1BQ2hELEtBQUssWUFBWSxLQUFLO0FBQUEsTUFDdEIsS0FBSyxNQUFNLElBQUksS0FBSyxLQUFLO0FBQUEsS0FDNUI7QUFBQSxJQUNELElBQUksUUFBUSxpQkFBaUIsMEJBQTBCLENBQUMsV0FBVztBQUFBLE1BQy9ELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxLQUFLLEVBQUUsR0FBRztBQUFBLFFBQzdCO0FBQUEsTUFDSjtBQUFBLE1BQ0EsTUFBTSxRQUFRLEtBQUssaUJBQWlCLE9BQU8sS0FBSztBQUFBLE1BQ2hELEtBQUssWUFBWSxLQUFLO0FBQUEsTUFDdEIsS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLO0FBQUEsS0FDL0I7QUFBQSxJQUNELElBQUksUUFBUSxpQkFBaUIsMEJBQTBCLENBQUMsV0FBVztBQUFBLE1BQy9ELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxLQUFLLEVBQUUsR0FBRztBQUFBLFFBQzdCO0FBQUEsTUFDSjtBQUFBLE1BQ0EsTUFBTSxRQUFRLEtBQUssaUJBQWlCLE9BQU8sS0FBSztBQUFBLE1BQ2hELE1BQU0sUUFBUSxDQUFDLEdBQUcsUUFBUTtBQUFBLFFBQ3RCLEtBQUssTUFBTSxPQUFPLEdBQUc7QUFBQSxPQUN4QjtBQUFBLE1BQ0QsS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLO0FBQUEsTUFDNUIsS0FBSyxNQUFNLFlBQVksS0FBSyxLQUFLLEtBQUs7QUFBQSxLQUN6QztBQUFBLElBQ0QsSUFBSSxRQUFRLGlCQUFpQix5QkFBeUIsQ0FBQyxXQUFXO0FBQUEsTUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLEtBQUssRUFBRSxHQUFHO0FBQUEsUUFDN0I7QUFBQSxNQUNKO0FBQUEsTUFDQSxLQUFLLFFBQVEsSUFBSTtBQUFBLE1BQ2pCLEtBQUssTUFBTSxNQUFNLEtBQUs7QUFBQSxNQUN0QixLQUFLLE1BQU0sWUFBWSxLQUFLLEtBQUssS0FBSztBQUFBLEtBQ3pDO0FBQUEsSUFDRCxJQUFJLE1BQU0sTUFBTSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUM7QUFBQTtBQUFBLEVBR3ZDLFdBQVcsQ0FBQyxPQUE2QjtBQUFBLElBQzdDLElBQUksQ0FBQyxLQUFLLFdBQVc7QUFBQSxNQUNqQixLQUFLLFFBQVE7QUFBQSxJQUNqQixFQUFPO0FBQUEsTUFDSCxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLE9BQU8sR0FBRyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQUEsTUFDdEUsS0FBSyxRQUFRO0FBQUE7QUFBQSxJQUVqQixLQUFLLE1BQU0sWUFBWSxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsRUFHbkMsTUFBTSxDQUFDLFVBQXNEO0FBQUEsSUFDaEUsSUFBSSxDQUFDLEtBQUssV0FBVztBQUFBLE1BQ2pCLEtBQUssSUFBSSxRQUFRLE1BQU07QUFBQSxRQUNuQixLQUFLLElBQUksS0FBSyxxQkFBcUIsS0FBSyxFQUFFO0FBQUEsT0FDN0M7QUFBQSxNQUNELEtBQUssWUFBWTtBQUFBLElBQ3JCO0FBQUEsSUFDQSxJQUFJLFVBQVU7QUFBQSxNQUNWLE9BQU8sS0FBSyxNQUFNLFlBQVksT0FBTyxRQUFRO0FBQUEsSUFDakQ7QUFBQSxJQUNBLE9BQU8sTUFBTTtBQUFBO0FBQUEsRUFHVixLQUFLLENBQUMsVUFBZ0Q7QUFBQSxJQUN6RCxJQUFJLEtBQUssUUFBUSxXQUFXLEdBQUc7QUFBQSxNQUMzQixJQUFJLFNBQVMsTUFBWTtBQUFBLE1BQ3pCLFNBQVMsS0FBSyxJQUFJLFFBQVEsTUFBTTtBQUFBLFFBQzVCLElBQUksS0FBSyxRQUFRLFdBQVcsR0FBRztBQUFBLFVBQzNCLE9BQU87QUFBQSxVQUNQO0FBQUEsUUFDSjtBQUFBLFFBQ0EsS0FBSyxJQUFJLEtBQUssMkJBQTJCLEtBQUssRUFBRTtBQUFBLE9BQ25EO0FBQUEsSUFDTDtBQUFBLElBQ0EsS0FBSyxRQUFRLEtBQUssUUFBUTtBQUFBLElBQzFCLE9BQU8sTUFBTTtBQUFBLE1BQ1QsS0FBSyxRQUFRLE9BQU8sS0FBSyxRQUFRLFFBQVEsUUFBUSxHQUFHLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFJckQsT0FBTyxHQUFTO0FBQUEsSUFDcEIsSUFBSSxLQUFLLFFBQVE7QUFBQSxNQUNiLEtBQUssSUFBSSxLQUFLLHlCQUF5QjtBQUFBLFFBQ25DLElBQUksS0FBSztBQUFBLFFBQ1QsUUFBUSxLQUFLO0FBQUEsTUFDakIsQ0FBQztBQUFBLElBQ0w7QUFBQTtBQUFBLE9BR1MsSUFBRyxDQUFDLEtBQXFDO0FBQUEsSUFDbEQsSUFBSSxLQUFLLE1BQU0sSUFBSSxHQUFHLEdBQUc7QUFBQSxNQUNyQixPQUFPLEtBQUssTUFBTSxJQUFJLEdBQUc7QUFBQSxJQUM3QjtBQUFBLElBQ0EsSUFBSSxLQUFLLFdBQVcsSUFBSSxHQUFHLEdBQUc7QUFBQSxNQUMxQixPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksR0FBRztBQUFBLElBQ3hDO0FBQUEsSUFDQSxNQUFNLFVBQVUsS0FBSyxJQUFJLFVBQ3BCLEtBQUsseUJBQXlCO0FBQUEsTUFDM0IsSUFBSSxLQUFLO0FBQUEsTUFDVCxNQUFNLENBQUMsR0FBRztBQUFBLElBQ2QsQ0FBQyxFQUNBLEtBQUssQ0FBQyxRQUFRO0FBQUEsTUFDWCxNQUFNLFFBQVEsS0FBSyxpQkFBaUIsSUFBSSxLQUFLO0FBQUEsTUFDN0MsS0FBSyxZQUFZLEtBQUs7QUFBQSxNQUN0QixPQUFPLEtBQUssTUFBTSxJQUFJLEdBQUc7QUFBQSxLQUM1QjtBQUFBLElBQ0wsS0FBSyxXQUFXLElBQUksS0FBSyxPQUFPO0FBQUEsSUFDaEMsT0FBTyxNQUFNLFFBQVEsS0FBSyxDQUFDLFNBQVM7QUFBQSxNQUNoQyxLQUFLLFdBQVcsT0FBTyxHQUFHO0FBQUEsTUFDMUIsT0FBTztBQUFBLEtBQ1Y7QUFBQTtBQUFBLE9BR1EsUUFBTyxJQUFJLE1BQXlDO0FBQUEsSUFDN0QsTUFBTSxlQUFlLEtBQ2hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxNQUFNLElBQUksR0FBRyxDQUFDLEVBQ3BDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxXQUFXLElBQUksR0FBRyxDQUFDO0FBQUEsSUFDOUMsSUFBSSxhQUFhLFdBQVcsR0FBRztBQUFBLE1BQzNCLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxLQUFLLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFBQSxJQUN4RTtBQUFBLElBQ0EsTUFBTSxVQUFVLEtBQUssSUFBSSxVQUNwQixLQUFLLHlCQUF5QjtBQUFBLE1BQzNCLElBQUksS0FBSztBQUFBLE1BQ1QsTUFBTTtBQUFBLElBQ1YsQ0FBQyxFQUNBLEtBQUssQ0FBQyxRQUFRO0FBQUEsTUFDWCxNQUFNLFNBQVEsS0FBSyxpQkFBaUIsSUFBSSxLQUFLO0FBQUEsTUFDN0MsS0FBSyxZQUFZLE1BQUs7QUFBQSxNQUN0QixPQUFPO0FBQUEsS0FDVjtBQUFBLElBQ0wsV0FBVyxPQUFPLGNBQWM7QUFBQSxNQUM1QixLQUFLLFdBQVcsSUFDWixLQUNBLFFBQVEsS0FBSyxDQUFDLFdBQVUsT0FBTSxJQUFJLEdBQUcsQ0FBQyxDQUMxQztBQUFBLElBQ0o7QUFBQSxJQUNBLE1BQU0sUUFBUSxNQUFNO0FBQUEsSUFDcEIsV0FBVyxPQUFPLGNBQWM7QUFBQSxNQUM1QixLQUFLLFdBQVcsT0FBTyxHQUFHO0FBQUEsSUFDOUI7QUFBQSxJQUNBLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLE9BQU8sR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsS0FBSyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQUE7QUFBQSxPQUdyRSxJQUFHLElBQUksT0FBMkI7QUFBQSxJQUMzQyxNQUFNLE9BQU8sS0FBSyxlQUFlLEtBQUs7QUFBQSxJQUN0QyxLQUFLLElBQUksS0FBSyx1QkFBdUI7QUFBQSxNQUNqQyxJQUFJLEtBQUs7QUFBQSxNQUNULE9BQU87QUFBQSxJQUNYLENBQUM7QUFBQTtBQUFBLE9BR1EsT0FBTSxJQUFJLE9BQTJCO0FBQUEsSUFDOUMsTUFBTSxPQUFPLEtBQUssZUFBZSxLQUFLO0FBQUEsSUFDdEMsS0FBSyxJQUFJLEtBQUssMEJBQTBCO0FBQUEsTUFDcEMsSUFBSSxLQUFLO0FBQUEsTUFDVCxPQUFPO0FBQUEsSUFDWCxDQUFDO0FBQUE7QUFBQSxPQUdRLE9BQU0sSUFBSSxPQUEyQjtBQUFBLElBQzlDLE1BQU0sT0FBTyxLQUFLLGVBQWUsS0FBSztBQUFBLElBQ3RDLE1BQU0sT0FBTyxPQUFPLEtBQUssSUFBSTtBQUFBLElBQzdCLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsS0FBSyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFDM0UsS0FBSyxJQUFJLEtBQUssMEJBQTBCO0FBQUEsTUFDcEMsSUFBSSxLQUFLO0FBQUEsTUFDVCxPQUFPO0FBQUEsSUFDWCxDQUFDO0FBQUE7QUFBQSxPQUdRLE1BQUssR0FBa0I7QUFBQSxJQUNoQyxLQUFLLElBQUksS0FBSyx5QkFBeUI7QUFBQSxNQUNuQyxJQUFJLEtBQUs7QUFBQSxJQUNiLENBQUM7QUFBQTtBQUFBLE9BR1EsSUFBRyxDQUFDLEtBQStCO0FBQUEsSUFDNUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxHQUFHLEdBQUc7QUFBQSxNQUNyQixPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsTUFBTSxNQUFNLE1BQU0sS0FBSyxJQUFJLFVBQVUsS0FBSyx5QkFBeUI7QUFBQSxNQUMvRCxJQUFJLEtBQUs7QUFBQSxNQUNULE1BQU0sQ0FBQyxHQUFHO0FBQUEsSUFDZCxDQUFDO0FBQUEsSUFDRCxPQUFPLElBQUksUUFBUTtBQUFBO0FBQUEsT0FHVixRQUEwQyxJQUFJLE1BQTJEO0FBQUEsSUFDbEgsTUFBTSxNQUFNLE1BQU0sS0FBSyxJQUFJLFVBQVUsS0FBSyx5QkFBeUI7QUFBQSxNQUMvRCxJQUFJLEtBQUs7QUFBQSxNQUNUO0FBQUEsSUFDSixDQUFDO0FBQUEsSUFDRCxPQUFPO0FBQUE7QUFBQSxPQUdFLE9BQU0sSUFBSSxNQUFrQztBQUFBLElBQ3JELE1BQU0sTUFBTSxNQUFNLEtBQUssSUFBSSxVQUFVLEtBQUssNkJBQTZCO0FBQUEsTUFDbkUsSUFBSSxLQUFLO0FBQUEsTUFDVDtBQUFBLElBQ0osQ0FBQztBQUFBLElBQ0QsT0FBTztBQUFBO0FBQUEsT0FHRSxPQUFNLElBQUksTUFBa0M7QUFBQSxJQUNyRCxNQUFNLE1BQU0sTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLDZCQUE2QjtBQUFBLE1BQ25FLElBQUksS0FBSztBQUFBLE1BQ1Q7QUFBQSxJQUNKLENBQUM7QUFBQSxJQUNELE9BQU87QUFBQTtBQUFBLE9BR0UsV0FBVTtBQUFBLElBQ25CO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxLQUt3QjtBQUFBLElBQ3hCLE1BQU0sTUFBTSxNQUFNLEtBQUssSUFBSSxVQUFVLEtBQ2pDLHNCQUNBLElBQUksaUJBQWlCLEtBQUssSUFBSSxPQUFPLFVBQVUsTUFBTSxDQUN6RDtBQUFBLElBQ0EsTUFBTSxRQUFRLEtBQUssaUJBQWlCLElBQUksS0FBSztBQUFBLElBQzdDLEtBQUssWUFBWSxLQUFLO0FBQUEsSUFDdEIsT0FBTztBQUFBO0FBQUEsT0FHRSxXQUFVO0FBQUEsSUFDbkI7QUFBQSxJQUNBO0FBQUEsS0FJd0I7QUFBQSxJQUN4QixNQUFNLE1BQU0sTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLDRCQUE0QjtBQUFBLE1BQ2xFLElBQUksS0FBSztBQUFBLE1BQ1Q7QUFBQSxNQUNBO0FBQUEsSUFDSixDQUFDO0FBQUEsSUFDRCxNQUFNLFFBQVEsS0FBSyxpQkFBaUIsSUFBSSxLQUFLO0FBQUEsSUFDN0MsS0FBSyxZQUFZLEtBQUs7QUFBQSxJQUN0QixPQUFPO0FBQUE7QUFBQSxPQUdFLFNBQVEsR0FBNEI7QUFBQSxJQUM3QyxNQUFNLE1BQU0sTUFBTSxLQUFLLElBQUksVUFBVSxLQUFLLDBCQUEwQjtBQUFBLE1BQ2hFLElBQUksS0FBSztBQUFBLElBQ2IsQ0FBQztBQUFBLElBQ0QsTUFBTSxRQUFRLEtBQUssaUJBQWlCLElBQUksS0FBSztBQUFBLElBQzdDLEtBQUssWUFBWSxLQUFLO0FBQUEsSUFDdEIsT0FBTztBQUFBO0FBQUEsU0FHRyxPQUFPO0FBQUEsSUFDakI7QUFBQSxJQUNBO0FBQUEsS0FJaUI7QUFBQSxJQUNqQixPQUFPLE1BQU07QUFBQSxNQUNULE1BQU0sUUFBUSxNQUFNLEtBQUssV0FBVztBQUFBLFFBQ2hDLE9BQU8sS0FBSyxhQUFhO0FBQUEsUUFDekI7QUFBQSxRQUNBO0FBQUEsTUFDSixDQUFDO0FBQUEsTUFDRCxJQUFJLE1BQU0sU0FBUyxHQUFHO0FBQUEsUUFDbEI7QUFBQSxNQUNKO0FBQUEsTUFDQSxPQUFPLE1BQU0sT0FBTztBQUFBLE1BQ3BCLElBQUksV0FBVyxXQUFXO0FBQUEsUUFDdEIsTUFBTSxPQUFPLE1BQU07QUFBQSxNQUN2QjtBQUFBLE1BQ0EsTUFBTSxhQUFhLFdBQVcsTUFBTSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUFBLE1BQ3BGLElBQUksQ0FBQyxZQUFZO0FBQUEsUUFDYjtBQUFBLE1BQ0o7QUFBQSxNQUNBLFNBQVMsS0FBSyxZQUFZLFVBQVU7QUFBQSxJQUN4QztBQUFBO0FBQUEsT0FHUyxLQUFJLEdBQW9CO0FBQUEsSUFDakMsT0FBTyxNQUFNLEtBQUssSUFBSSxVQUFVLEtBQUsscUJBQXFCO0FBQUEsTUFDdEQsSUFBSSxLQUFLO0FBQUEsSUFDYixDQUFDO0FBQUE7QUFBQSxFQUdHLGdCQUFnQixDQUFDLE9BQW1EO0FBQUEsSUFDeEUsT0FBTyxJQUFJLElBQ1AsT0FBTyxRQUFRLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxVQUFVO0FBQUEsTUFDdkMsTUFBTSxPQUFPLEtBQUssV0FBVyxZQUFZLElBQUk7QUFBQSxNQUM3QyxLQUFLLE1BQU0sSUFBSSxLQUFLLElBQUk7QUFBQSxNQUN4QixPQUFPLENBQUMsS0FBSyxJQUFJO0FBQUEsS0FDcEIsQ0FDTDtBQUFBO0FBQUEsRUFHSSxjQUFjLENBQUMsT0FBd0M7QUFBQSxJQUMzRCxPQUFPLE9BQU8sWUFDVixNQUFNLElBQUksQ0FBQyxTQUFTO0FBQUEsTUFDaEIsT0FBTyxDQUFDLEtBQUssWUFBWSxJQUFJLEdBQUcsS0FBSyxXQUFXLFVBQVUsSUFBSSxDQUFDO0FBQUEsS0FDbEUsQ0FDTDtBQUFBO0FBQUEsRUFHRyxZQUFZLENBQUMsTUFBb0I7QUFBQSxJQUNwQyxLQUFLLFlBQVk7QUFBQTtBQUFBLEVBR2QsU0FBUyxDQUFDLFFBQTJCO0FBQUEsSUFDeEMsSUFBSSxLQUFLLElBQUksU0FBUztBQUFBLE1BQ2xCLE1BQU0sSUFBSSxNQUFNLDRDQUE0QztBQUFBLElBQ2hFO0FBQUEsSUFDQSxLQUFLLFNBQVM7QUFBQTtBQUFBLEVBR1gsY0FBYyxDQUFDLGFBQXFDO0FBQUEsSUFDdkQsS0FBSyxjQUFjO0FBQUE7QUFFM0I7O0FDamlCTyxJQUFNLHdCQUF3RCxJQUFJLGNBQ3JFLFVBQ0EsQ0FBQyxRQUFhLElBQUksZ0JBQWdCLEdBQUcsQ0FDekM7QUFXTyxJQUFNLGlDQUE2QyxzQkFBc0IsS0FBSyxRQUFRLE1BQU07QUFDNUYsSUFBTSxrQ0FBOEMsc0JBQXNCLEtBQUssUUFBUSxPQUFPO0FBQzlGLElBQU0sa0NBQThDLHNCQUFzQixLQUFLLFNBQVMsTUFBTTtBQUM5RixJQUFNLDZCQUFxRCxhQUFhLFdBQXFCLHVCQUF1QjtBQUFBLEVBQ3ZILE1BQU07QUFBQSxFQUNOLGNBQWMsRUFBRSxTQUFXLENBQUMsRUFBRTtBQUFBLEVBQzlCLGFBQWE7QUFBQSxJQUNULE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxFQUNWO0FBQ0osQ0FBQztBQUNELElBQU0saUJBQWlCLFVBQVUsV0FBVyx1QkFBdUI7QUFBQSxFQUMvRCxNQUFNO0FBQUEsRUFDTixZQUFZO0FBQUEsRUFDWixLQUFLLENBQUMsUUFBUSxJQUFJLEdBQUcsSUFBSTtBQUFBLEVBQ3pCLGFBQWE7QUFBQSxJQUNULEtBQUs7QUFBQSxJQUNMLE1BQU07QUFBQSxFQUNWO0FBQ0osQ0FBQztBQUVNLElBQU0sZ0NBQTRDLHNCQUFzQixLQUFLLFVBQVU7QUFDOUYsSUFBTSx5QkFBeUIsYUFBYSxXQUE2Qix1QkFBdUI7QUFBQSxFQUM1RixNQUFNO0FBQUEsRUFDTixjQUFjO0FBQ2xCLENBQUM7QUFDTSxJQUFNLG9DQUFnRCxzQkFBc0IsS0FBSyxtQkFBbUIsS0FBSztBQUN6RyxJQUFNLG9DQUFnRCxzQkFBc0IsS0FBSyxtQkFBbUIsS0FBSztBQUNoSCxJQUFNLDhCQUE4QixhQUFhLFdBQW1DLHVCQUF1QjtBQUFBLEVBQ3ZHLE1BQU07QUFBQSxFQUNOLGNBQWMsQ0FBQztBQUFBLEVBQ2YsYUFBYTtBQUFBLElBQ1QsTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLEVBQ1g7QUFDSixDQUFDO0FBQUE7QUFFTSxNQUFNLGdCQUFxQztBQUFBLEVBTWpCO0FBQUEsRUFMYixPQUF1QztBQUFBLEVBQ3ZDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVoQixXQUFXLENBQWtCLEtBQVU7QUFBQSxJQUFWO0FBQUEsSUFDekIsS0FBSyxPQUFPLElBQUksT0FBTyxJQUFJLGNBQWM7QUFBQSxJQUN6QyxLQUFLLFFBQVEsSUFBSSxXQUFXLElBQUksMEJBQTBCO0FBQUEsSUFDMUQsS0FBSyxlQUFlLElBQUksV0FBVyxJQUFJLDJCQUEyQjtBQUFBO0FBQUEsT0FHekQsU0FBUSxDQUFDLFNBQXFDO0FBQUEsSUFDdkQsS0FBSyxJQUFJLFVBQVUsS0FBSyx3QkFBd0IsV0FBVyxLQUFLO0FBQUEsSUFDaEUsTUFBTSxJQUFJLFFBQWMsQ0FBQyxZQUFZO0FBQUEsTUFDakMsTUFBTSxXQUFXLEtBQUssSUFBSSxRQUFRLE1BQU0sYUFBYSxPQUFPLE1BQU07QUFBQSxRQUM5RCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUEsT0FDWjtBQUFBLEtBQ0o7QUFBQSxJQUNELE9BQU87QUFBQTtBQUVmO0FBQUE7QUFFTyxNQUFNLGdCQUFnQjtBQUFBLEVBRUw7QUFBQSxFQUNBO0FBQUEsRUFGcEIsV0FBVyxDQUNTLG9CQUNBLHVCQUNsQjtBQUFBLElBRmtCO0FBQUEsSUFDQTtBQUFBO0FBQUEsRUFHYixTQUFTLENBQUMsVUFBb0Q7QUFBQSxJQUNqRSxLQUFLLG1CQUFtQixLQUFLLFFBQVE7QUFBQTtBQUFBLEVBR2xDLFlBQVksQ0FBQyxVQUFvRDtBQUFBLElBQ3BFLEtBQUssc0JBQXNCLEtBQUssUUFBUTtBQUFBO0FBRWhEOztBQ3RGTyxJQUFNLHlCQUEwRCxJQUFJLGNBQWMsWUFBWSxDQUFDLFFBQWEsSUFBSSxpQkFBaUIsR0FBRyxDQUFDO0FBRXJJLElBQU0sOEJBQTBDLHVCQUF1QixLQUFLLE1BQU07QUFDekYsSUFBTSxxQkFBcUIsVUFBVSxXQUFXLHdCQUF3QjtBQUFBLEVBQ3BFLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFBQSxFQUNaLEtBQUssQ0FBQyxRQUFRLElBQUksR0FBRyxJQUFJO0FBQUEsRUFDekIsYUFBYTtBQUFBLElBQ1QsTUFBTTtBQUFBLEVBQ1Y7QUFDSixDQUFDO0FBQ0QsSUFBTSwyQkFBMkIsV0FBVyxXQUF5Qix3QkFBd0I7QUFBQSxFQUN6RixNQUFNO0FBQUEsRUFDTixZQUFZLFdBQVcsR0FBRyxVQUFVLEVBQUUsUUFBUTtBQUNsRCxDQUFDO0FBQ0QsSUFBTSw4QkFBOEIsV0FBVyxXQUF5Qix3QkFBd0I7QUFBQSxFQUM1RixNQUFNO0FBQUEsRUFDTixZQUFZLFdBQVcsR0FBRyxVQUFVLEVBQUUsUUFBUTtBQUNsRCxDQUFDO0FBQ0QsSUFBTSxnQ0FBZ0MsV0FBVyxXQUFnQix3QkFBd0I7QUFBQSxFQUNyRixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQ2hCLENBQUM7QUFDRCxJQUFNLG1DQUFtQyxXQUFXLFdBQWdCLHdCQUF3QjtBQUFBLEVBQ3hGLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQWdCTSxJQUFNLG1DQUErQyx1QkFBdUIsS0FBSyxjQUFjLFNBQVM7QUFFL0csSUFBTSxtQ0FBbUMsYUFBYSxXQUE4RCx3QkFBd0I7QUFBQSxFQUN4SSxNQUFNO0FBQUEsRUFDTixjQUFjO0FBQ2xCLENBQUM7QUFVTSxJQUFNLCtCQUEyQyx1QkFBdUIsS0FBSyxnQkFBZ0I7QUFPcEcsSUFBTSwrQkFBK0IsYUFBYSxXQUF3RCx3QkFBd0I7QUFBQSxFQUM5SCxNQUFNO0FBQUEsRUFDTixjQUFjO0FBQ2xCLENBQUM7QUFBQTtBQUVNLE1BQU0saUJBQXNDO0FBQUEsRUFNbEI7QUFBQSxFQUxiLE9BQXdDO0FBQUEsRUFDeEM7QUFBQSxFQUNDLG1CQUFtQixJQUFJO0FBQUEsRUFDdkIsZUFBZSxJQUFJO0FBQUEsRUFFcEMsV0FBVyxDQUFrQixLQUFVO0FBQUEsSUFBVjtBQUFBLElBQ3pCLElBQUksUUFBUSxlQUNSLDBCQUNBLDZCQUNBLCtCQUNBLGdDQUNKO0FBQUEsSUFDQSxJQUFJLFFBQVEsaUJBQ1IsK0JBQStCLENBQUMsUUFBUSxLQUFLLHFCQUFxQixHQUFHLENBQ3pFO0FBQUEsSUFDQSxJQUFJLFFBQVEsaUJBQ1Isa0NBQWtDLENBQUMsUUFBUSxLQUFLLHdCQUF3QixHQUFHLENBQy9FO0FBQUEsSUFDQSxLQUFLLFdBQVcsSUFBSSxPQUFPLElBQUksa0JBQWtCO0FBQUEsSUFDakQsSUFBSSxRQUFRLFFBQVEsTUFBTSxLQUFLLE9BQU8sQ0FBQztBQUFBLElBQ3ZDLElBQUksUUFBUSxNQUFNLEtBQUssUUFBUSxDQUFDO0FBQUE7QUFBQSxPQUd2QixJQUFHLENBQUMsSUFBOEI7QUFBQSxJQUMzQyxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksV0FBVyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUM7QUFBQTtBQUFBLEVBR3JELE9BQU8sQ0FBQztBQUFBLElBQ1g7QUFBQSxJQUNBO0FBQUEsS0FJZ0I7QUFBQSxJQUNoQixNQUFNLEtBQUssV0FBVyxLQUFLLEtBQUs7QUFBQSxJQUNoQyxJQUFJLEtBQUssSUFBSSxTQUFTO0FBQUEsTUFDbEIsS0FBSyxJQUFJLEtBQUssNkJBQTZCLENBQUMsRUFBRSxDQUFDO0FBQUEsSUFDbkQ7QUFBQSxJQUNBLE1BQU0sV0FBVyxLQUFLLGlCQUFpQixJQUFJLEVBQUUsS0FBSyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFDNUUsU0FBUyxVQUFVLFNBQVM7QUFBQSxJQUM1QixTQUFTLGFBQWEsWUFBWTtBQUFBLElBQ2xDLEtBQUssaUJBQWlCLElBQUksSUFBSSxRQUFRO0FBQUEsSUFDdEMsT0FBTztBQUFBO0FBQUEsT0FHRyxxQkFBb0IsQ0FBQyxLQUF5QjtBQUFBLElBQ3hELE1BQU0sV0FBVyxLQUFLLGlCQUFpQixJQUFJLElBQUksRUFBRTtBQUFBLElBQ2pELElBQUksQ0FBQyxVQUFVO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFBQSxJQUNBLFdBQVcsWUFBWSxTQUFTLG9CQUFvQjtBQUFBLE1BQ2hELE1BQU0sU0FBUyxHQUFHO0FBQUEsSUFDdEI7QUFBQTtBQUFBLE9BR1Usd0JBQXVCLENBQUMsS0FBeUI7QUFBQSxJQUMzRCxNQUFNLFdBQVcsS0FBSyxpQkFBaUIsSUFBSSxJQUFJLEVBQUU7QUFBQSxJQUNqRCxJQUFJLENBQUMsVUFBVTtBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBQUEsSUFDQSxXQUFXLFlBQVksU0FBUyx1QkFBdUI7QUFBQSxNQUNuRCxNQUFNLFNBQVMsR0FBRztBQUFBLElBQ3RCO0FBQUE7QUFBQSxFQUdHLE9BQU8sSUFBSSxRQUF3QjtBQUFBLElBQ3RDLElBQUksS0FBSyxJQUFJLFNBQVM7QUFBQSxNQUNsQixNQUFNLElBQUksTUFBTSxrREFBa0Q7QUFBQSxJQUN0RTtBQUFBLElBQ0EsV0FBVyxTQUFTLFFBQVE7QUFBQSxNQUN4QixLQUFLLGFBQWEsSUFBSSxXQUFXLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDaEQ7QUFBQTtBQUFBLE9BR1UsT0FBTSxHQUFrQjtBQUFBLElBQ2xDLElBQUksS0FBSyxhQUFhLE9BQU8sR0FBRztBQUFBLE1BQzVCLEtBQUssSUFBSSxLQUFLLDBCQUEwQixNQUFNLEtBQUssS0FBSyxhQUFhLE9BQU8sQ0FBQyxDQUFDO0FBQUEsSUFDbEY7QUFBQTtBQUFBLE9BR1UsUUFBTyxHQUFrQjtBQUFBLElBQ25DLElBQUksS0FBSyxpQkFBaUIsT0FBTyxHQUFHO0FBQUEsTUFDaEMsS0FBSyxJQUFJLEtBQUssNkJBQTZCLE1BQU0sS0FBSyxLQUFLLGlCQUFpQixLQUFLLENBQUMsQ0FBQztBQUFBLElBQ3ZGO0FBQUE7QUFBQSxPQUdTLGlCQUFnQixDQUFDLFNBR1E7QUFBQSxJQUNsQyxRQUFRLFFBQVE7QUFBQSxJQUNoQixJQUFJLENBQUMsSUFBSSxLQUFLO0FBQUEsTUFDVixNQUFNLElBQUksTUFBTSw0Q0FBNEM7QUFBQSxJQUNoRTtBQUFBLElBQ0EsSUFBSSxJQUFJLFNBQVMsVUFBVTtBQUFBLE1BQ3ZCLE1BQU0sSUFBSSxNQUFNLGlEQUFpRDtBQUFBLElBQ3JFO0FBQUEsSUFDQSxJQUFJLENBQUMsSUFBSSxVQUFVO0FBQUEsTUFDZixNQUFNLElBQUksTUFBTSwrQ0FBK0M7QUFBQSxJQUNuRTtBQUFBLElBQ0EsT0FBTyxLQUFLLElBQUksVUFBVSxLQUFLLGtDQUFrQztBQUFBLE1BQzdELEtBQUssSUFBSSxVQUFVLFFBQVEsR0FBRztBQUFBLE1BQzlCLGFBQWEsUUFBUSxZQUFZLElBQUksUUFBTSxXQUFXLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQztBQUFBLElBQ3hFLENBQUM7QUFBQTtBQUFBLE9BR1EsY0FBYSxDQUFDLFNBR1E7QUFBQSxJQUMvQixPQUFPLEtBQUssSUFBSSxVQUFVLEtBQUssOEJBQThCO0FBQUEsTUFDekQsS0FBSyxJQUFJLFVBQVUsUUFBUSxHQUFHO0FBQUEsTUFDOUIsYUFBYSxRQUFRLFlBQVksSUFBSSxRQUFNLFdBQVcsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDO0FBQUEsSUFDeEUsQ0FBQztBQUFBO0FBRVQ7O0FDOUxPLE1BQU0sYUFBYTtBQUFBLEVBRUY7QUFBQSxFQUNBO0FBQUEsRUFGcEIsV0FBVyxDQUNTLElBQ0EsTUFDbEI7QUFBQSxJQUZrQjtBQUFBLElBQ0E7QUFBQTtBQUFBLFNBR04sU0FBUyxDQUFDLFFBQWtDO0FBQUEsSUFDdEQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDLE9BQU8sZ0JBQWdCLE9BQU8sSUFBSTtBQUFBLElBQ2xDLE9BQU8sT0FBTyxPQUFPO0FBQUE7QUFBQSxTQUdYLFdBQVcsQ0FBQyxNQUFnQztBQUFBLElBQ3RELE1BQU0sU0FBUyxXQUFXLGVBQWUsSUFBSTtBQUFBLElBQzdDLE1BQU0sS0FBSyxXQUFXLFFBQVEsT0FBTyxXQUFXLENBQUM7QUFBQSxJQUNqRCxNQUFNLE9BQU8sT0FBTyxlQUFlO0FBQUEsSUFDbkMsT0FBTyxJQUFJLGFBQWEsSUFBSSxJQUFJO0FBQUE7QUFFeEM7QUFBQTtBQU9PLE1BQU0scUJBQXFCO0FBQUEsRUFFVjtBQUFBLEVBQ0E7QUFBQSxFQUZwQixXQUFXLENBQ1MsSUFDQSxhQUNsQjtBQUFBLElBRmtCO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHTixTQUFTLENBQUMsUUFBd0Q7QUFBQSxJQUM1RSxRQUFRLGFBQWEsVUFBVTtBQUFBLElBQy9CLE9BQU87QUFBQSxNQUNILElBQUksT0FBTyxHQUFHLElBQUk7QUFBQSxNQUNsQixhQUFhO0FBQUEsUUFDVCxLQUFLLE1BQU0sTUFBTSxXQUFXLEtBQUssTUFBTSxHQUFHLEVBQUUsSUFBSSxJQUFJO0FBQUEsUUFDcEQsUUFBUSxNQUFNLFNBQVMsV0FBVyxLQUFLLE1BQU0sTUFBTSxFQUFFLElBQUksSUFBSTtBQUFBLFFBQzdELE1BQU0sTUFBTSxPQUFPLFdBQVcsS0FBSyxNQUFNLElBQUksRUFBRSxJQUFJLElBQUk7QUFBQSxNQUMzRDtBQUFBLElBQ0o7QUFBQTtBQUFBLFNBR1UsV0FBVyxDQUFDLE1BQXNEO0FBQUEsSUFDNUUsUUFBUSxhQUFhLFVBQVU7QUFBQSxJQUMvQixPQUFPLElBQUkscUJBQ1AsV0FBVyxRQUFRLEtBQUssRUFBRSxHQUMxQjtBQUFBLE1BQ0ksS0FBSyxNQUFNLE1BQU0sV0FBVyxRQUFRLE1BQU0sR0FBRyxJQUFJO0FBQUEsTUFDakQsUUFBUSxNQUFNLFNBQVMsV0FBVyxRQUFRLE1BQU0sTUFBTSxJQUFJO0FBQUEsTUFDMUQsTUFBTSxNQUFNLE9BQU8sV0FBVyxRQUFRLE1BQU0sSUFBSSxJQUFJO0FBQUEsSUFDeEQsQ0FDSjtBQUFBO0FBRVI7OztBQzNDTyxNQUFNLFdBQWM7QUFBQSxFQUVIO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUhwQixXQUFXLENBQ1MsSUFDQSxZQUNBLGFBQ2xCO0FBQUEsSUFIa0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsU0FHYixVQUFhLENBQ2hCO0FBQUEsSUFFSTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsS0FNUztBQUFBLElBQ2IsT0FBTyxJQUFJLFdBQ1AsV0FBVyxLQUFLLFVBQVUsRUFBRSxLQUFLLElBQUksR0FDckMsV0FBVyxHQUFXLGNBQWMsV0FBVyxLQUFLLENBQUMsRUFBRSxPQUFPLEdBQzlELGVBQWUsQ0FBQyxDQUNwQjtBQUFBO0FBQUEsU0FHRyxnQkFBbUIsQ0FDdEI7QUFBQSxJQUVJO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxLQU1TO0FBQUEsSUFDYixPQUFPLElBQUksV0FDUCxXQUFXLEtBQUssVUFBVSxFQUFFLEtBQUssSUFBSSxHQUNyQyxZQUNBLGVBQWUsQ0FBQyxDQUNwQjtBQUFBO0FBRVI7OztBQ3BETyxJQUFNLHdCQUF3RCxJQUFJLGNBQ3JFLFVBQ0EsQ0FBQyxRQUFhLElBQUksZ0JBQWdCLEdBQUcsQ0FDekM7QUFFQSxJQUFNLHlCQUF5QixXQUFXLFdBQWlDLHVCQUF1QjtBQUFBLEVBQzlGLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFDaEIsQ0FBQztBQUNELElBQU0sdUJBQXVCLFdBQVcsV0FBdUIsdUJBQXVCO0FBQUEsRUFDbEYsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUFDO0FBQ0QsSUFBTSx1QkFBdUIsV0FBVyxpQkFBK0IsdUJBQXVCO0FBQUEsRUFDMUYsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUNoQixDQUFDO0FBQUE7QUFFTSxNQUFNLGdCQUFxQztBQUFBLEVBSWpCO0FBQUEsRUFIYixPQUF1QztBQUFBLEVBQ3RDLFVBQVUsSUFBSTtBQUFBLEVBRS9CLFdBQVcsQ0FBa0IsS0FBVTtBQUFBLElBQVY7QUFBQSxJQUN6QixJQUFJLFFBQVEsZUFDUix3QkFDQSxzQkFDQSxvQkFDSjtBQUFBO0FBQUEsRUFHSSxZQUFlLENBQUMsWUFBc0M7QUFBQSxJQUMxRCxJQUFJLEtBQUssUUFBUSxJQUFJLFdBQVcsRUFBRSxHQUFHO0FBQUEsTUFDakMsTUFBTSxJQUFJLE1BQU0sa0JBQWtCLFdBQVcsb0JBQW9CO0FBQUEsSUFDckU7QUFBQSxJQUNBLE9BQU8sSUFBSSxXQUFXLEtBQUssS0FBSyxVQUFVO0FBQUE7QUFBQSxFQUd2QyxJQUFzQyxDQUFDLE1BQWMsU0FBMEQ7QUFBQSxJQUNsSCxNQUFNLEtBQUssS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLElBQUk7QUFBQSxJQUNwQyxNQUFNLE9BQU8sV0FBVyxXQUFjLElBQUk7QUFBQSxNQUN0QztBQUFBLE1BQ0EsWUFBWSxTQUFTO0FBQUEsSUFDekIsQ0FBQztBQUFBLElBQ0QsT0FBTyxLQUFLLGFBQWEsSUFBSTtBQUFBO0FBQUEsRUFHMUIsVUFBYSxDQUFDLE1BQWMsU0FBaUU7QUFBQSxJQUNoRyxNQUFNLEtBQUssS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLElBQUk7QUFBQSxJQUNwQyxNQUFNLE9BQU8sV0FBVyxpQkFBb0IsSUFBSTtBQUFBLE1BQzVDO0FBQUEsTUFDQSxZQUFZLFNBQVM7QUFBQSxJQUN6QixDQUFDO0FBQUEsSUFDRCxPQUFPLEtBQUssYUFBYSxJQUFJO0FBQUE7QUFBQSxFQUcxQixHQUFNLENBQUMsWUFBc0M7QUFBQSxJQUNoRCxPQUFPLEtBQUssYUFBYSxVQUFVO0FBQUE7QUFFM0M7QUFBQTtBQUVBLE1BQU0sV0FBbUM7QUFBQSxFQUtoQjtBQUFBLEVBQ0E7QUFBQSxFQUxKLFlBQW9DLENBQUM7QUFBQSxFQUM5QyxZQUFZO0FBQUEsRUFFcEIsV0FBVyxDQUNVLEtBQ0EsTUFDbkI7QUFBQSxJQUZtQjtBQUFBLElBQ0E7QUFBQSxJQUVqQixJQUFJLFFBQVEsaUJBQWlCLHNCQUFzQixDQUFDLFNBQVMsS0FBSyxnQkFBZ0IsSUFBSSxDQUFDO0FBQUEsSUFDdkYsSUFBSSxRQUFRLFFBQVEsTUFBTSxLQUFLLE9BQU8sQ0FBQztBQUFBO0FBQUEsRUFHcEMsTUFBTSxDQUFDLE1BQWU7QUFBQSxJQUN6QixNQUFNLE9BQU8sS0FBSyxLQUFLLFdBQVcsVUFBVSxJQUFJO0FBQUEsSUFDaEQsS0FBSyxJQUFJLEtBQUssc0JBQXNCO0FBQUEsTUFDaEMsSUFBSSxLQUFLLEtBQUs7QUFBQSxNQUNkLE1BQU07QUFBQSxJQUNWLENBQUM7QUFBQSxJQUNELFdBQVcsWUFBWSxLQUFLLFdBQVc7QUFBQSxNQUNuQyxTQUFTLElBQUk7QUFBQSxJQUNqQjtBQUFBO0FBQUEsRUFHRyxNQUFNLENBQUMsU0FBdUM7QUFBQSxJQUNqRCxJQUFJLENBQUMsS0FBSyxXQUFXO0FBQUEsTUFDakIsS0FBSyxJQUFJLFFBQVEsTUFBTTtBQUFBLFFBQ25CLEtBQUssSUFBSSxLQUFLLHNCQUFzQixLQUFLLEtBQUssRUFBRTtBQUFBLE9BQ25EO0FBQUEsTUFDRCxLQUFLLFlBQVk7QUFBQSxJQUNyQjtBQUFBLElBQ0EsS0FBSyxVQUFVLEtBQUssT0FBTztBQUFBLElBQzNCLE9BQU8sTUFBTTtBQUFBLE1BQ1QsS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLFFBQVEsT0FBTyxHQUFHLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFJeEQsZUFBZSxDQUFDLE1BQTBCO0FBQUEsSUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLEtBQUssS0FBSyxFQUFFLEdBQUc7QUFBQSxNQUNoQztBQUFBLElBQ0o7QUFBQSxJQUNBLE1BQU0sT0FBTyxLQUFLLEtBQUssV0FBVyxZQUFZLEtBQUssSUFBSTtBQUFBLElBQ3ZELFdBQVcsWUFBWSxLQUFLLFdBQVc7QUFBQSxNQUNuQyxTQUFTLElBQUk7QUFBQSxJQUNqQjtBQUFBO0FBQUEsRUFHSSxNQUFNLEdBQVM7QUFBQSxJQUNuQixJQUFJLENBQUMsS0FBSyxLQUFLLEdBQUcsWUFBWSxLQUFLLElBQUksSUFBSSxFQUFFLEdBQUc7QUFBQSxNQUM1QztBQUFBLElBQ0o7QUFBQSxJQUNBLEtBQUssSUFBSSxLQUFLLHdCQUF3QjtBQUFBLE1BQ2xDLElBQUksS0FBSyxLQUFLO0FBQUEsTUFDZCxhQUFhLEtBQUssS0FBSztBQUFBLElBQzNCLENBQUM7QUFBQTtBQUVUOztBQzNITyxNQUFNLGlCQUFpQixNQUFNO0FBQUEsRUFDaEMsV0FBVyxDQUFDLFNBQXdCO0FBQUEsSUFDaEMsTUFBTSxXQUFXLFNBQVM7QUFBQSxJQUMxQixLQUFLLE9BQU8sS0FBSyxZQUFZO0FBQUE7QUFFckM7QUFBQTtBQUVPLE1BQU0seUJBQXlCLFNBQVM7QUFBQSxFQUVoQztBQUFBLEVBQ0E7QUFBQSxFQUZYLFdBQVcsQ0FDQSxNQUNBLFVBQVUsSUFDbkI7QUFBQSxJQUNFLE1BQU0sT0FBTztBQUFBLElBSE47QUFBQSxJQUNBO0FBQUE7QUFJZjtBQUFBO0FBRU8sTUFBTSxzQkFBc0IsaUJBQWlCO0FBQUEsRUFDaEQsV0FBVyxDQUFDLFNBQWlCO0FBQUEsSUFDekIsNkNBQXFDLE9BQU87QUFBQTtBQUVwRDtBQUFBO0FBRU8sTUFBTSwwQkFBMEIsaUJBQWlCO0FBQUEsRUFDcEQsV0FBVyxDQUFDLFNBQWlCO0FBQUEsSUFDekIscURBQXlDLE9BQU87QUFBQTtBQUV4RDtBQUFBO0FBRU8sTUFBTSx5QkFBeUIsaUJBQWlCO0FBQUEsRUFDbkQsV0FBVyxDQUFDLFNBQWlCO0FBQUEsSUFDekIsbURBQXdDLE9BQU87QUFBQTtBQUV2RDtBQUFBO0FBRU8sTUFBTSxtQkFBbUIsaUJBQWlCO0FBQUEsRUFDN0MsV0FBVyxDQUFDLFNBQWlCO0FBQUEsSUFDekIsdUNBQWtDLE9BQU87QUFBQTtBQUVqRDtBQUFBO0FBRU8sTUFBTSxxQkFBcUIsaUJBQWlCO0FBQUEsRUFDL0MsV0FBVyxDQUFDLFNBQWlCO0FBQUEsSUFDekIsMkNBQW9DLE9BQU87QUFBQTtBQUVuRDtBQUFBO0FBRU8sTUFBTSxzQkFBc0IsaUJBQWlCO0FBQUEsRUFDaEQsV0FBVyxDQUFDLFNBQWlCO0FBQUEsSUFDekIsNkNBQXFDLE9BQU87QUFBQTtBQUVwRDtBQUFBO0FBRU8sTUFBTSx1QkFBdUIsaUJBQWlCO0FBQUEsRUFDakQsV0FBVyxDQUFDLFNBQWlCO0FBQUEsSUFDekIsK0NBQXNDLE9BQU87QUFBQTtBQUVyRDtBQUFBO0FBRU8sTUFBTSxzQkFBc0IsaUJBQWlCO0FBQUEsRUFDaEQsV0FBVyxDQUFDLFNBQWlCO0FBQUEsSUFDekIsNkNBQXFDLE9BQU87QUFBQTtBQUVwRDtBQUFBO0FBRU8sTUFBTSxzQkFBc0IsaUJBQWlCO0FBQUEsRUFDaEQsV0FBVyxDQUFDLFNBQWlCO0FBQUEsSUFDekIsNkNBQXFDLE9BQU87QUFBQTtBQUVwRDs7O0FDckVPLElBQU0sVUFBVTs7O0FDS2hCLE1BQU0sYUFBeUQ7QUFBQSxFQUNqRCxZQUFZLElBQUk7QUFBQSxFQUUxQixRQUFRLElBQUksYUFBMEM7QUFBQSxJQUN6RCxXQUFXLFFBQVEsYUFBYTtBQUFBLE1BQzVCLElBQUksS0FBSyxVQUFVLElBQUksS0FBSyxFQUFFLEdBQUc7QUFBQSxRQUM3QixNQUFNLElBQUksTUFBTSxhQUFhLEtBQUssR0FBRyxJQUFJLHNCQUFzQjtBQUFBLE1BQ25FO0FBQUEsTUFDQSxLQUFLLFVBQVUsSUFBSSxLQUFLLElBQUksSUFBSTtBQUFBLElBQ3BDO0FBQUE7QUFBQSxFQUdKLFNBQVMsQ0FBQyxRQUE0QjtBQUFBLElBQ2xDLE9BQU87QUFBQSxNQUNILE1BQU0sT0FBTyxLQUFLLEdBQUcsSUFBSTtBQUFBLE1BQ3pCLE1BQU0sT0FBTyxLQUFLLFdBQVcsVUFBVSxPQUFPLElBQUk7QUFBQSxJQUN0RDtBQUFBO0FBQUEsRUFHSixXQUFXLENBQUMsTUFBMEI7QUFBQSxJQUNsQyxNQUFNLGFBQWEsV0FBVyxRQUFRLEtBQUssSUFBSTtBQUFBLElBQy9DLE1BQU0sT0FBTyxLQUFLLFVBQVUsSUFBSSxVQUFVO0FBQUEsSUFDMUMsSUFBSSxDQUFDO0FBQUEsTUFBTSxNQUFNLElBQUksTUFBTSxlQUFlLEtBQUsscUJBQXFCO0FBQUEsSUFDcEUsT0FBTztBQUFBLE1BQ0g7QUFBQSxNQUNBLE1BQU0sS0FBSyxXQUFXLFlBQVksS0FBSyxJQUFJO0FBQUEsSUFDL0M7QUFBQTtBQUVSOzs7QUM1QkEsU0FBUyxlQUFlLENBQUMsUUFBNEI7QUFBQSxFQUNqRCxPQUFPLE9BQ0YsU0FBUyxFQUNULFFBQVEsT0FBTyxHQUFHLEVBQ2xCLFFBQVEsT0FBTyxHQUFHLEVBQ2xCLFFBQVEsTUFBTSxFQUFFO0FBQUE7QUFHekIsU0FBUyxlQUFlLENBQUMsTUFBMEI7QUFBQSxFQUMvQyxPQUFPLEtBQUssUUFBUSxNQUFNLEdBQUcsRUFBRSxRQUFRLE1BQU0sR0FBRztBQUFBLEVBQ2hELE9BQU8sS0FBSyxTQUFTLEdBQUc7QUFBQSxJQUNwQixRQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0EsT0FBTyxXQUFXLFdBQVcsSUFBSTtBQUFBO0FBR3JDLFNBQVMsOEJBQThCLENBQUMsSUFBNkI7QUFBQSxFQUNqRSxNQUFNLE1BQU0sSUFBSSxZQUFZLEdBQUcsTUFBTTtBQUFBLEVBQ3JDLE1BQU0sT0FBTyxJQUFJLFdBQVcsR0FBRztBQUFBLEVBQy9CLEtBQUssSUFBSSxFQUFFO0FBQUEsRUFDWCxPQUFPO0FBQUE7QUFjSixJQUFNLHVCQUFnQyxPQUFPLFdBQVcsZUFBZSxDQUFDLENBQUMsT0FBTztBQUFBO0FBRWhGLE1BQU0sVUFBVTtBQUFBLEVBRUU7QUFBQSxFQUNBO0FBQUEsRUFGYixXQUFXLENBQ0UsWUFDQSxXQUNuQjtBQUFBLElBRm1CO0FBQUEsSUFDQTtBQUFBO0FBQUEsY0FHRCxJQUFHLEdBQXVCO0FBQUEsSUFDMUMsUUFBUSxZQUFZLGNBQWMsTUFBTSxPQUFPLE9BQU8sWUFDbEQ7QUFBQSxNQUNJLE1BQU07QUFBQSxNQUNOLGVBQWU7QUFBQSxNQUNmLGdCQUFnQixJQUFJLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUEsTUFDeEMsTUFBTTtBQUFBLElBQ1YsR0FDQSxNQUNBLENBQUMsV0FBVyxTQUFTLENBQ3pCO0FBQUEsSUFFQSxPQUFPLElBQUksVUFBVSxZQUFZLFNBQVM7QUFBQTtBQUFBLE9BR2pDLFVBQVMsR0FBd0I7QUFBQSxJQUMxQyxNQUFNLE1BQU0sTUFBTSxPQUFPLE9BQU8sVUFBVSxPQUFPLEtBQUssU0FBUztBQUFBLElBQy9ELElBQUksQ0FBQyxJQUFJO0FBQUEsTUFBRyxNQUFNLElBQUksTUFBTSxxQ0FBcUM7QUFBQSxJQUNqRSxJQUFJLENBQUMsSUFBSTtBQUFBLE1BQUcsTUFBTSxJQUFJLE1BQU0sb0NBQW9DO0FBQUEsSUFDaEUsT0FBTztBQUFBLE1BQ0gsR0FBRyxJQUFJO0FBQUEsTUFDUCxHQUFHLElBQUk7QUFBQSxJQUNYO0FBQUE7QUFBQSxPQUdTLFFBQU8sQ0FBQyxNQUF5QztBQUFBLElBQzFELE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxRQUNsQyxFQUFFLE1BQU0sV0FBVyxHQUNuQixLQUFLLFlBQ0wsSUFDSjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsT0FHRSxjQUFhLENBQUMsTUFBK0I7QUFBQSxJQUN0RCxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sUUFDbEMsRUFBRSxNQUFNLFdBQVcsR0FDbkIsS0FBSyxZQUNMLCtCQUErQixnQkFBZ0IsSUFBSSxDQUFDLENBQ3hEO0FBQUEsSUFDQSxPQUFPLFlBQVksT0FBTyxTQUFTO0FBQUE7QUFFM0M7QUFBQTtBQUVPLE1BQU0sVUFBVTtBQUFBLEVBRUU7QUFBQSxFQURiLFdBQVcsQ0FDRSxXQUNuQjtBQUFBLElBRG1CO0FBQUE7QUFBQSxjQUdELElBQUcsQ0FBQyxTQUF5QztBQUFBLElBQzdELE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxVQUNsQyxPQUNBO0FBQUEsTUFDSSxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxTQUFTLENBQUMsU0FBUztBQUFBLE1BQ25CLEtBQUs7QUFBQSxNQUNMLEdBQUcsUUFBUSxFQUFFLFFBQVEsT0FBTyxFQUFFO0FBQUEsTUFDOUIsR0FBRyxRQUFRLEVBQUUsUUFBUSxPQUFPLEVBQUU7QUFBQSxJQUNsQyxHQUNBO0FBQUEsTUFDSSxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsSUFDVixHQUNBLE1BQ0EsQ0FBQyxTQUFTLENBQ2Q7QUFBQSxJQUNBLE9BQU8sSUFBSSxVQUFVLFNBQVM7QUFBQTtBQUFBLE9BR3JCLFFBQU8sQ0FBQyxNQUF5QztBQUFBLElBQzFELE9BQU8sTUFBTSxPQUFPLE9BQU8sUUFDdkI7QUFBQSxNQUNJLE1BQU07QUFBQSxJQUNWLEdBQ0EsS0FBSyxXQUNMLElBQ0o7QUFBQTtBQUFBLE9BR1MsY0FBYSxDQUFDLE1BQStCO0FBQUEsSUFDdEQsTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLFFBQ2xDO0FBQUEsTUFDSSxNQUFNO0FBQUEsSUFDVixHQUNBLEtBQUssV0FDTCxZQUFZLE9BQU8sSUFBSSxDQUMzQjtBQUFBLElBQ0EsT0FBTyxnQkFBZ0IsSUFBSSxXQUFXLFNBQVMsQ0FBQztBQUFBO0FBRXhEO0FBQUE7QUFFTyxNQUFNLElBQUk7QUFBQSxFQUVRO0FBQUEsRUFDQTtBQUFBLEVBRmIsV0FBVyxDQUNFLEtBQ0EsSUFDbkI7QUFBQSxJQUZtQjtBQUFBLElBQ0E7QUFBQTtBQUFBLGNBR0QsSUFBRyxHQUFpQjtBQUFBLElBQ3BDLE1BQU0sTUFBTSxNQUFNLE9BQU8sT0FBTyxZQUM1QjtBQUFBLE1BQ0ksTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLElBQ1osR0FDQSxNQUNBLENBQUMsV0FBVyxTQUFTLENBQ3pCO0FBQUEsSUFDQSxNQUFNLEtBQUssT0FBTyxnQkFBZ0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUFBLElBQ3BELE9BQU8sSUFBSSxJQUFJLEtBQUssR0FBRyxNQUFNO0FBQUE7QUFBQSxjQUdiLFlBQVcsQ0FBQyxLQUFhLFdBQW9DO0FBQUEsSUFDN0UsTUFBTSxZQUFZLE1BQU0sVUFBVSxRQUFRLCtCQUErQixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFBQSxJQUM5RixNQUFNLFNBQVMsV0FBVyxnQkFBZ0IsU0FBUztBQUFBLElBQ25ELE1BQU0sTUFBTSxPQUFPLGVBQWU7QUFBQSxJQUNsQyxNQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsSUFFakMsTUFBTSxjQUFjLE1BQU0sT0FBTyxPQUFPLFVBQ3BDLE9BQ0EsK0JBQStCLEdBQUcsR0FDbEMsV0FDQSxPQUNBLENBQUMsV0FBVyxTQUFTLENBQ3pCO0FBQUEsSUFDQSxPQUFPLElBQUksSUFDUCxhQUNBLCtCQUErQixFQUFFLENBQ3JDO0FBQUE7QUFBQSxPQUdTLFVBQVMsQ0FBQyxXQUF1QztBQUFBLElBQzFELE1BQU0sU0FBUyxJQUFJO0FBQUEsSUFDbkIsTUFBTSxTQUFTLE1BQU0sT0FBTyxPQUFPLFVBQVUsT0FBTyxLQUFLLEdBQUc7QUFBQSxJQUM1RCxPQUFPLGdCQUFnQixJQUFJLFdBQVcsTUFBTSxDQUFDO0FBQUEsSUFDN0MsT0FBTyxnQkFBZ0IsSUFBSSxXQUFXLEtBQUssRUFBRSxDQUFDO0FBQUEsSUFDOUMsTUFBTSxZQUFZLE1BQU0sVUFBVSxRQUFRLCtCQUErQixPQUFPLE9BQU8sQ0FBQyxDQUFDO0FBQUEsSUFDekYsT0FBTyxnQkFBZ0IsSUFBSSxXQUFXLFNBQVMsQ0FBQztBQUFBO0FBQUEsT0FHdkMsUUFBTyxDQUFDLE1BQW1DO0FBQUEsSUFDcEQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLFlBQVksS0FBSyxJQUFJO0FBQUEsSUFDNUIsT0FBTyxnQkFBZ0IsS0FBSyxJQUFJO0FBQUEsSUFDaEMsTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLFFBQ2xDO0FBQUEsTUFDSSxNQUFNO0FBQUEsTUFDTixJQUFJLEtBQUs7QUFBQSxNQUNULFFBQVE7QUFBQSxJQUNaLEdBQ0EsS0FBSyxLQUNMLCtCQUErQixPQUFPLE9BQU8sQ0FBQyxDQUNsRDtBQUFBLElBQ0EsT0FBTyxhQUFhLGlCQUFpQixJQUFJLElBQUksV0FBVyxTQUFTLENBQUM7QUFBQTtBQUFBLE9BR3pELFFBQU8sQ0FBQyxRQUFpRDtBQUFBLElBQ2xFLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxRQUNsQztBQUFBLE1BQ0ksTUFBTTtBQUFBLE1BQ04sSUFBSSxLQUFLO0FBQUEsTUFDVCxRQUFRO0FBQUEsSUFDWixHQUNBLEtBQUssS0FDTCwrQkFBK0IsT0FBTyxJQUFJLENBQzlDO0FBQUEsSUFDQSxNQUFNLFNBQVMsV0FBVyxnQkFBZ0IsU0FBUztBQUFBLElBQ25ELE1BQU0sT0FBTyxPQUFPLFdBQVc7QUFBQSxJQUMvQixNQUFNLE9BQU8sT0FBTyxlQUFlO0FBQUEsSUFDbkMsT0FBTztBQUFBLE1BQ0g7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUFBO0FBRVI7OztBQ2pMTyxNQUFNLFFBQVE7QUFBQSxFQWdCSTtBQUFBLEVBQ1Y7QUFBQSxFQUNVO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFwQkwsU0FBd0IsRUFBRSxNQUFNLGVBQWU7QUFBQSxFQUN0QyxRQUFxTDtBQUFBLElBQ2pNLFdBQVcsSUFBSTtBQUFBLElBQ2YsY0FBYyxJQUFJO0FBQUEsSUFDbEIsUUFBUSxJQUFJO0FBQUEsSUFDWixRQUFRLElBQUk7QUFBQSxFQUNoQjtBQUFBLEVBQ2lCLFFBQTJDLENBQUM7QUFBQSxFQUM1QyxlQUFlLElBQUk7QUFBQSxFQUNuQixpQkFBaUIsSUFBSTtBQUFBLEVBQzlCLGFBQXdDO0FBQUEsRUFDekMsU0FBdUM7QUFBQSxFQUN0QyxVQUFVO0FBQUEsRUFFbEIsV0FBVyxDQUNVLEtBQ1YsU0FDVSxlQUNULFdBQ0EsWUFDQSxLQUNWO0FBQUEsSUFObUI7QUFBQSxJQUNWO0FBQUEsSUFDVTtBQUFBLElBQ1Q7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBRVIsS0FBSyxlQUNELGFBQWEsYUFDYixhQUFhLFNBQ2IsYUFBYSxZQUNiLGFBQWEsT0FDYixhQUFhLE9BQ2IsYUFBYSxnQkFDakI7QUFBQSxJQUNBLEtBQUssaUJBQWlCLGFBQWEsWUFBWSxPQUFPLFdBQVc7QUFBQSxNQUM3RCxJQUFJLE9BQU8sc0NBQ0osT0FBTyw4QkFBK0I7QUFBQSxRQUN6QyxLQUFLLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUFBLFFBQ3ZDO0FBQUEsTUFDSjtBQUFBLE1BQ0EsTUFBTSxZQUFZO0FBQUEseURBQ3VCO0FBQUEsdURBQ0Q7QUFBQSwyQ0FDTjtBQUFBLCtDQUNFO0FBQUEsaURBQ0M7QUFBQSxtREFDQztBQUFBLGlEQUNEO0FBQUEsaURBQ0E7QUFBQSwyREFDSztBQUFBLDJEQUNBO0FBQUEsaURBQ0w7QUFBQSwrQkFDVDtBQUFBLHFDQUNHO0FBQUEsTUFDL0I7QUFBQSxNQUNBLE1BQU0sUUFBUSxVQUFVLE9BQU87QUFBQSxNQUMvQixJQUFJLE9BQU87QUFBQSxRQUNQLEtBQUssU0FBUyxJQUFJLE1BQU0sT0FBTyxXQUFXLEVBQUU7QUFBQSxNQUNoRDtBQUFBLEtBQ0g7QUFBQSxJQUNELEtBQUssaUJBQWlCLGFBQWEsT0FBTyxNQUFNO0FBQUEsTUFDNUMsSUFBSSxLQUFLLE9BQU8sU0FBUyxTQUFTO0FBQUEsUUFDOUIsTUFBTSxJQUFJLE1BQU0sMENBQTBDO0FBQUEsTUFDOUQ7QUFBQSxNQUNBLEtBQUssVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQUEsTUFDaEMsS0FBSyxVQUFVO0FBQUEsS0FDbEI7QUFBQTtBQUFBLEVBR0UsYUFBYSxDQUFDLFlBQThCO0FBQUEsSUFDL0MsSUFBSSxLQUFLLE9BQU8sU0FBUyxnQkFBZ0I7QUFBQSxNQUNyQyxNQUFNLElBQUksTUFBTSwwQ0FBMEM7QUFBQSxJQUM5RDtBQUFBLElBQ0EsS0FBSyxhQUFhO0FBQUE7QUFBQSxFQUdmLGNBQWMsSUFBSSxhQUEwQztBQUFBLElBQy9ELEtBQUssYUFBYSxTQUFTLEdBQUcsV0FBVztBQUFBLElBQ3pDLFdBQVcsUUFBUSxhQUFhO0FBQUEsTUFDNUIsS0FBSyxlQUFlLElBQUksS0FBSyxJQUFJO0FBQUEsUUFDN0I7QUFBQSxRQUNBLE9BQU8sSUFBSTtBQUFBLE1BQ2YsQ0FBQztBQUFBLElBQ0w7QUFBQTtBQUFBLEVBR0csZ0JBQW1CLENBQUMsTUFBcUIsU0FBb0M7QUFBQSxJQUNoRixNQUFNLFlBQVksS0FBSyxlQUFlLElBQUksS0FBSyxFQUFFO0FBQUEsSUFDakQsSUFBSSxDQUFDLFdBQVc7QUFBQSxNQUNaLE1BQU0sSUFBSSxNQUFNLGVBQWUsS0FBSyxHQUFHLElBQUksa0JBQWtCO0FBQUEsSUFDakU7QUFBQSxJQUNBLFVBQVUsTUFBTSxPQUFPLE9BQW9DO0FBQUE7QUFBQSxPQUdqRCxrQkFBaUIsQ0FBQyxTQUFtQztBQUFBLElBQy9ELE1BQU0sVUFBVSxLQUFLLElBQUksT0FBTyxRQUFRLEtBQUssSUFBSSxLQUFLLE9BQU8sSUFBSSxLQUFLLElBQUk7QUFBQSxJQUMxRSxNQUFNLE9BQU8sSUFBSTtBQUFBLElBQ2pCLElBQUksWUFBWTtBQUFBLElBQ2hCLE1BQU0sU0FBMkQ7QUFBQSxNQUM3RCxNQUFNO0FBQUEsTUFDTjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxRQUFRLE1BQU07QUFBQSxRQUFDLFlBQVk7QUFBQTtBQUFBLElBQy9CO0FBQUEsSUFDQSxNQUFNLEtBQUssVUFBVSxNQUFNO0FBQUEsSUFDM0IsSUFBSSxXQUFXO0FBQUEsTUFDWCxPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsTUFBTSxZQUFZLE9BQU8sV0FBVyxJQUFJLEtBQUssRUFBRSxRQUFRLElBQUksS0FBSyxRQUFRO0FBQUEsSUFDeEUsTUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZLFdBQVcsU0FBUyxTQUFTLENBQUM7QUFBQSxJQUM3RCxPQUFPO0FBQUE7QUFBQSxPQUdFLFFBQU8sQ0FBQyxZQUFZLE1BQXFCO0FBQUEsSUFDbEQsSUFBSSxDQUFDLEtBQUssUUFBUSxjQUFjLEdBQUc7QUFBQSxNQUMvQixNQUFNLElBQUksTUFBTSx3QkFBd0IsS0FBSyxPQUFPLE1BQU07QUFBQSxJQUM5RDtBQUFBLElBQ0EsSUFBSSxLQUFLLFlBQVk7QUFBQSxNQUNqQixNQUFNLElBQUksTUFBTSx5Q0FBeUM7QUFBQSxJQUM3RDtBQUFBLElBRUEsS0FBSyxVQUFVO0FBQUEsSUFDZixPQUFPLEtBQUssSUFBSSxTQUFTO0FBQUEsTUFDckIsS0FBSztBQUFBLE1BQ0wsSUFBSTtBQUFBLFFBQ0EsS0FBSyxNQUFNO0FBQUEsUUFDWCxLQUFLLGFBQWEsTUFBTSxLQUFLLFVBQVUsUUFBUTtBQUFBLFFBQy9DLE1BQU0sS0FBSyxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFBQSxRQUMzQyxNQUFNLGVBQWUsTUFBTSxLQUFLLFdBQVcsUUFBUSxLQUFLLFlBQVk7QUFBQSxRQUNwRSxJQUFJLENBQUMsY0FBYztBQUFBLFVBQ2YsTUFBTSxJQUFJLE1BQU0sZ0RBQWdEO0FBQUEsUUFDcEU7QUFBQSxRQUNBLElBQUksQ0FBQyxhQUFhLFlBQVksTUFBTSxZQUFZLEdBQUc7QUFBQSxVQUMvQyxNQUFNLElBQUksTUFBTSwyQ0FBMkM7QUFBQSxRQUMvRDtBQUFBLFFBQ0EsUUFBUSxNQUFNLFNBQVM7QUFBQSxRQUN2QixLQUFLLFFBQVEsT0FBTyxLQUFLO0FBQUEsUUFDekIsSUFBSSxRQUFRLE1BQU0sS0FBSyxjQUFjLElBQUksS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFHO0FBQUEsUUFDbkUsSUFBSSxDQUFDLE9BQU87QUFBQSxVQUNSLE1BQU0sSUFBSSxhQUFhLDhCQUE4QixLQUFLLElBQUksSUFBSSxHQUFHLElBQUksUUFBUSxLQUFLLFFBQVEsUUFBUSxLQUFLLFFBQVEsUUFBUSxLQUFLLFFBQVEsTUFBTTtBQUFBLFFBQ2xKO0FBQUEsUUFDQSxJQUFJLGlCQUFpRDtBQUFBLFFBQ3JELElBQUksS0FBSyxJQUFJLElBQUksU0FBUyxZQUFZLHdCQUF3QixLQUFLLFlBQVk7QUFBQSxVQUMzRSxNQUFNLFlBQVksTUFBTSxVQUFVLElBQUk7QUFBQSxVQUN0QyxNQUFNLFlBQVksTUFBTSxVQUFVLElBQUksS0FBSyxXQUFXLEdBQUc7QUFBQSxVQUN6RCxJQUFJLE9BQU87QUFBQSxZQUNQLFFBQVEsTUFBTSxVQUFVLGNBQWMsS0FBSztBQUFBLFVBQy9DO0FBQUEsVUFDQSxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUk7QUFBQSxVQUN6QixpQkFBaUI7QUFBQSxZQUNiLE1BQU07QUFBQSxZQUNOLEtBQUssTUFBTSxVQUFVLFVBQVU7QUFBQSxZQUMvQixLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsU0FBUztBQUFBLFVBQzNDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsS0FBSyxXQUFXLEtBQUs7QUFBQSxVQUNqQixNQUFNLGFBQWE7QUFBQSxVQUNuQixNQUFNLElBQUksY0FBYztBQUFBLFlBQ3BCLEtBQUssS0FBSyxJQUFJO0FBQUEsWUFDZCxVQUFVLEVBQUUsU0FBUyxRQUFRO0FBQUEsWUFDN0IsWUFBWTtBQUFBLFlBQ1o7QUFBQSxVQUNKLENBQUM7QUFBQSxRQUNMLEdBQUcsS0FBSyxZQUFZO0FBQUEsUUFDcEIsS0FBSyxhQUFhLEtBQUssT0FBTztBQUFBLFFBQzlCLE1BQU0sS0FBSyxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFBQSxRQUMxQyxNQUFNLEtBQUssTUFBTSxVQUFVLEtBQUs7QUFBQSxRQUNoQyxLQUFLLGNBQWMsRUFBRSxLQUFLLE1BQU07QUFBQSxVQUM1QixLQUFLLEtBQUs7QUFBQSxZQUNOLE1BQU0sYUFBYTtBQUFBLFlBQ25CLE1BQU07QUFBQSxVQUNWLENBQUM7QUFBQSxTQUNKO0FBQUEsUUFDRCxNQUFNLEtBQUs7QUFBQSxRQUNiLE9BQU8sT0FBTztBQUFBLFFBQ1osSUFBSSxpQkFBaUIsa0JBQWtCO0FBQUEsVUFDbkMsS0FBSyxTQUFTO0FBQUEsUUFDbEI7QUFBQSxRQUNBLElBQUksQ0FBQyxXQUFXO0FBQUEsVUFDWixNQUFNO0FBQUEsUUFDVjtBQUFBLGdCQUNGO0FBQUEsUUFDRSxLQUFLLE1BQU0sYUFBYSxLQUFLLEtBQUssTUFBTTtBQUFBLFFBQ3hDLElBQUksS0FBSyxPQUFPLFNBQVMsa0JBQWtCLEtBQUssT0FBTyxTQUFTLGdCQUFnQjtBQUFBLFVBQzVFLEtBQUssVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLFNBQVMsS0FBSyxTQUFTLFFBQVEsS0FBSyxPQUFPLENBQUM7QUFBQSxRQUN2RjtBQUFBLFFBQ0EsS0FBSyxZQUFZLE1BQU07QUFBQSxRQUN2QixLQUFLLGFBQWE7QUFBQSxRQUNsQixLQUFLLGFBQWE7QUFBQTtBQUFBLE1BRXRCLElBQUksS0FBSyxVQUFVLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHcEIsRUFBRSxTQUFTLEtBQUssT0FBTyxJQUFJLEdBQUc7QUFBQSxRQUMxQjtBQUFBLE1BQ0o7QUFBQSxNQUNBLEtBQUssU0FBUztBQUFBLE1BQ2QsSUFBSSxDQUFDLFdBQVc7QUFBQSxRQUNaO0FBQUEsTUFDSjtBQUFBLE1BQ0EsTUFBTSxrQkFBa0IsTUFBTSxLQUFLLGtCQUFrQixLQUFLLE9BQU87QUFBQSxNQUNqRSxJQUFJLENBQUMsaUJBQWlCO0FBQUEsUUFDbEI7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLElBQ0EsTUFBTSxLQUFLLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixRQUFRLEtBQUssT0FBTyxDQUFDO0FBQUEsSUFDbEUsS0FBSyxZQUFZLE1BQU07QUFBQSxJQUN2QixLQUFLLGFBQWE7QUFBQTtBQUFBLEVBR2QsT0FBTyxDQUFDLE9BQXVDO0FBQUEsSUFDbkQsT0FBTyxLQUFLLE9BQU8sU0FBUztBQUFBO0FBQUEsT0FHbkIsS0FBSSxDQUFDLFFBQStCO0FBQUEsSUFDN0MsSUFBSSxDQUFDLEtBQUssWUFBWTtBQUFBLE1BQ2xCLE1BQU0sSUFBSSxNQUFNLDJCQUEyQjtBQUFBLElBQy9DO0FBQUEsSUFDQSxJQUFJLEtBQUssS0FBSztBQUFBLE1BQ1YsTUFBTSxhQUFhLEtBQUssYUFBYSxVQUFVLE1BQU07QUFBQSxNQUNyRCxTQUFTLE1BQU0sS0FBSyxJQUFJLFFBQVEsVUFBVTtBQUFBLElBQzlDO0FBQUEsSUFDQSxLQUFLLFdBQVcsS0FBSyxRQUFRLEtBQUssWUFBWTtBQUFBO0FBQUEsT0FHcEMsT0FBTSxHQUFrQjtBQUFBLElBQ2xDLE9BQU8sS0FBSyxZQUFZO0FBQUEsTUFDcEIsTUFBTSxTQUFTLE1BQU0sS0FBSyxXQUFXLFFBQVEsS0FBSyxZQUFZO0FBQUEsTUFDOUQsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUNUO0FBQUEsTUFDSjtBQUFBLE1BQ0EsTUFBTSxLQUFLLGVBQWUsTUFBTTtBQUFBLElBQ3BDO0FBQUE7QUFBQSxPQUdVLGVBQWMsQ0FBQyxRQUErQjtBQUFBLElBQ3hELElBQUksYUFBYSxpQkFBaUIsTUFBTSxNQUFNLEdBQUc7QUFBQSxNQUM3QyxJQUFJLENBQUMsS0FBSyxLQUFLO0FBQUEsUUFDWCxNQUFNLElBQUksTUFBTSw2REFBNkQ7QUFBQSxNQUNqRjtBQUFBLE1BQ0EsTUFBTSxZQUFZLE1BQU0sS0FBSyxJQUFJLFFBQVEsTUFBTTtBQUFBLE1BQy9DLFNBQVMsS0FBSyxhQUFhLFlBQVksU0FBUztBQUFBLElBQ3BEO0FBQUEsSUFDQSxNQUFNLEtBQUssTUFBTSxPQUFPLEtBQUssTUFBTTtBQUFBLElBQ25DLE1BQU0sZ0JBQWdCLEtBQUssZUFBZSxJQUFJLE9BQU8sS0FBSyxFQUFFO0FBQUEsSUFDNUQsSUFBSSxDQUFDLGVBQWU7QUFBQSxNQUNoQjtBQUFBLElBQ0o7QUFBQSxJQUNBLE1BQU0sY0FBYyxNQUFNLEtBQUssT0FBTyxJQUFJO0FBQUE7QUFBQSxFQUd2QyxPQUFPLENBQUMsTUFBd0M7QUFBQSxJQUNuRCxJQUFJLEtBQUssSUFBSSxTQUFTO0FBQUEsTUFDbEIsTUFBTSxJQUFJLE1BQU0sdUNBQXVDO0FBQUEsSUFDM0Q7QUFBQSxJQUNBLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQTtBQUFBLEVBR2pCLFVBQVUsQ0FBQyxNQUF3QztBQUFBLElBQ3RELEtBQUssTUFBTSxPQUFPLEtBQUssTUFBTSxRQUFRLElBQUksR0FBRyxDQUFDO0FBQUE7QUFBQSxPQUduQyxjQUFhLEdBQWtCO0FBQUEsSUFDekMsV0FBVyxRQUFRLEtBQUssT0FBTztBQUFBLE1BQzNCLE1BQU0sS0FBSztBQUFBLElBQ2Y7QUFBQTtBQUFBLE9BR1UsVUFBUyxDQUFDLFFBQXNDO0FBQUEsSUFDMUQsSUFBSSxLQUFLLFdBQVcsUUFBUTtBQUFBLE1BQ3hCLE1BQU0sSUFBSSxNQUFNLHdCQUF3Qix1QkFBdUIsUUFBUTtBQUFBLElBQzNFO0FBQUEsSUFDQSxLQUFLLFNBQVM7QUFBQSxJQUNkLE1BQU0sS0FBSyxNQUFNLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFFM0M7O0FDclRPLE1BQU0sbUJBQXdDO0FBQUEsRUFFNUI7QUFBQSxFQURyQixXQUFXLENBQ1UsU0FDbkI7QUFBQSxJQURtQjtBQUFBO0FBQUEsTUFHVCxVQUFVLEdBQVc7QUFBQSxJQUM3QixNQUFNLFdBQVcsS0FBSyxRQUFRLFNBQVMsUUFBUTtBQUFBLElBQy9DLFFBQVEsTUFBTSxTQUFTLEtBQUs7QUFBQSxJQUM1QixPQUFPLEdBQUcsY0FBYyxRQUFRO0FBQUE7QUFBQSxFQUc3QixPQUFPLEdBQXdCO0FBQUEsSUFDbEMsTUFBTSxTQUFTLElBQUksVUFBVSxLQUFLLFVBQVU7QUFBQSxJQUM1QyxPQUFPLG9CQUFvQixXQUFXLE1BQU07QUFBQTtBQUVwRDtBQUFBO0FBRU8sTUFBTSxvQkFBMEM7QUFBQSxFQU92QztBQUFBLEVBTkssY0FBaUMsQ0FBQztBQUFBLEVBQzNDLGdCQUFxQztBQUFBLEVBQ3JDLGlCQUF1QztBQUFBLEVBQ3ZDLGNBQXVCO0FBQUEsRUFFL0IsV0FBVyxDQUNDLFFBQ1Y7QUFBQSxJQURVO0FBQUE7QUFBQSxTQUdFLFVBQVUsQ0FBQyxRQUFpRDtBQUFBLElBQ3RFLE1BQU0sYUFBYSxJQUFJLG9CQUFvQixNQUFNO0FBQUEsSUFDakQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFBQSxNQUNwQyxPQUFPLFVBQVU7QUFBQSxNQUNqQixPQUFPLFVBQVUsTUFBTTtBQUFBLFFBQ25CLFdBQVcsY0FBYztBQUFBLFFBQ3pCLElBQUksV0FBVyxlQUFlO0FBQUEsVUFDMUIsV0FBVyxjQUFjO0FBQUEsVUFDekIsV0FBVyxnQkFBZ0I7QUFBQSxRQUMvQjtBQUFBO0FBQUEsTUFFSixPQUFPLFlBQVksQ0FBQyxVQUFnQjtBQUFBLFFBQ2hDLFdBQVcsaUJBQWlCLFdBQVcsVUFBVSxLQUFLLEVBQUUsUUFBUSxNQUFNO0FBQUEsVUFDbEUsV0FBVyxpQkFBaUI7QUFBQSxTQUMvQjtBQUFBO0FBQUEsTUFFTCxPQUFPLFNBQVMsTUFBWTtBQUFBLFFBQ3hCLFFBQVEsVUFBVTtBQUFBO0FBQUEsS0FFekI7QUFBQTtBQUFBLE9BR1MsVUFBUyxDQUFDLE9BQW1EO0FBQUEsSUFDdkUsSUFBSSxPQUFPLE1BQU0sU0FBUyxVQUFVO0FBQUEsTUFDaEMsTUFBTSxJQUFJLE1BQU0sc0JBQXNCO0FBQUEsSUFDMUM7QUFBQSxJQUNBLE1BQU0sU0FBUyxNQUFNLFdBQVcsU0FBUyxNQUFNLElBQUk7QUFBQSxJQUNuRCxNQUFNLE9BQU87QUFBQSxNQUNULE1BQU0sT0FBTyxXQUFXO0FBQUEsTUFDeEIsTUFBTSxPQUFPLGVBQWU7QUFBQSxJQUNoQztBQUFBLElBQ0EsS0FBSyxZQUFZLEtBQUssSUFBSTtBQUFBLElBQzFCLE9BQU8sT0FBTztBQUFBLElBQ2QsSUFBSSxLQUFLLGVBQWU7QUFBQSxNQUNwQixLQUFLLGNBQWM7QUFBQSxJQUN2QjtBQUFBO0FBQUEsT0FHUyxRQUFPLENBQUMsWUFBK0U7QUFBQSxJQUNoRyxJQUFJLEtBQUssZUFBZTtBQUFBLE1BQ3BCLE1BQU0sSUFBSSxNQUFNLG1CQUFtQjtBQUFBLElBQ3ZDO0FBQUEsSUFDQSxPQUFPLEtBQUssWUFBWSxXQUFXLEtBQUssQ0FBQyxLQUFLLGFBQWE7QUFBQSxNQUN2RCxNQUFNLElBQUksUUFBYyxDQUFDLFlBQVk7QUFBQSxRQUNqQyxLQUFLLGdCQUFnQjtBQUFBLE9BQ3hCO0FBQUEsTUFDRCxLQUFLLGdCQUFnQjtBQUFBLElBQ3pCO0FBQUEsSUFDQSxJQUFJLEtBQUssWUFBWSxXQUFXLEtBQUssS0FBSyxhQUFhO0FBQUEsTUFDbkQsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLE1BQU0sYUFBYSxLQUFLLFlBQVksTUFBTTtBQUFBLElBQzFDLE9BQU8sV0FBVyxZQUFZLFVBQVU7QUFBQTtBQUFBLE1BR3hDLE1BQU0sR0FBWTtBQUFBLElBQ2xCLElBQUksS0FBSyxnQkFBZ0I7QUFBQSxNQUNyQixPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsSUFBSSxLQUFLLFlBQVksU0FBUyxHQUFHO0FBQUEsTUFDN0IsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLElBQUksS0FBSyxlQUFlO0FBQUEsTUFDcEIsT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLElBQUksS0FBSyxPQUFPLGVBQWUsVUFBVSxVQUFVLEtBQUssT0FBTyxlQUFlLFVBQVUsU0FBUztBQUFBLE1BQzdGLE9BQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUdYLEtBQUssR0FBUztBQUFBLElBQ1YsSUFBSSxLQUFLLFFBQVE7QUFBQSxNQUNiLEtBQUssT0FBTyxNQUFNO0FBQUEsSUFDdEI7QUFBQSxJQUNBLElBQUksS0FBSyxlQUFlO0FBQUEsTUFDcEIsS0FBSyxjQUFjO0FBQUEsTUFDbkIsS0FBSyxnQkFBZ0I7QUFBQSxJQUN6QjtBQUFBO0FBQUEsRUFHSixJQUFJLENBQUMsUUFBZ0IsWUFBNkQ7QUFBQSxJQUM5RSxNQUFNLGFBQWEsV0FBVyxVQUFVLE1BQU07QUFBQSxJQUM5QyxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sWUFBWSxXQUFXLElBQUk7QUFBQSxJQUNsQyxPQUFPLGdCQUFnQixXQUFXLElBQUk7QUFBQSxJQUN0QyxLQUFLLE9BQU8sS0FBSyxPQUFPLE9BQU8sQ0FBQztBQUFBO0FBRXhDOztBQ2pITyxTQUFTLFFBQXNCLENBQUMsTUFBK0I7QUFBQSxFQUNsRSxJQUFJO0FBQUEsSUFDQSxPQUFPLEVBQUUsSUFBSSxNQUFNLE1BQU0sS0FBSyxFQUFFO0FBQUEsSUFDbEMsT0FBTyxHQUFHO0FBQUEsSUFDUixPQUFPLEVBQUUsSUFBSSxPQUFPLE1BQU0sRUFBTztBQUFBO0FBQUE7OztBQ0NsQyxNQUFNLHFCQUE4QztBQUFBLFNBQ2hDLGtCQUFrQjtBQUFBLEVBRWpDLE1BQU0sQ0FBQyxTQUFrQixLQUFrQjtBQUFBLElBQy9DLE9BQU8sS0FBSyxVQUFVLENBQUMsUUFBUSxNQUFNLFFBQVEsTUFBTSxRQUFRLFFBQVEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFBQTtBQUFBLE9BRzNFLElBQUcsQ0FBQyxTQUFrQixLQUF1QztBQUFBLElBQ3RFLE1BQU0sYUFBYSxLQUFLLGtCQUFrQixPQUFPO0FBQUEsSUFDakQsSUFBSTtBQUFBLE1BQVksT0FBTztBQUFBLElBQ3ZCO0FBQUE7QUFBQSxFQUdJLGlCQUFpQixDQUFDLFNBQXNDO0FBQUEsSUFDNUQsTUFBTSxlQUFlLElBQUksZ0JBQWdCLFNBQVMsTUFBTTtBQUFBLElBQ3hELE1BQU0sUUFBUSxhQUFhLElBQUkscUJBQXFCLGVBQWU7QUFBQSxJQUNuRSxJQUFJLENBQUM7QUFBQSxNQUFPO0FBQUEsSUFDWixRQUFRLElBQUksTUFBTSxZQUFZLFNBQXVCLE1BQU0sS0FBSyxNQUFNLEtBQUssQ0FBQztBQUFBLElBQzVFLElBQUksQ0FBQyxJQUFJO0FBQUEsTUFDTCxRQUFRLEtBQUssK0NBQStDLFNBQVM7QUFBQSxNQUNyRTtBQUFBLElBQ0o7QUFBQSxJQUNBLElBQUksUUFBUSxRQUFRLFNBQVMsUUFBUSxNQUFNO0FBQUEsTUFDdkMsUUFBUSxLQUFLLGlEQUFpRCxRQUFRLGFBQWEsUUFBUSxRQUFRLE1BQU07QUFBQSxNQUN6RztBQUFBLElBQ0o7QUFBQSxJQUNBLE9BQU8sUUFBUTtBQUFBO0FBRXZCOzs7QUNYTyxNQUFNLElBQUk7QUFBQSxFQTJCTztBQUFBLEVBMUJiO0FBQUEsRUFDQTtBQUFBLEVBQ0UsUUFBc0I7QUFBQSxJQUMzQixTQUFTLElBQUk7QUFBQSxJQUNiLFNBQVMsSUFBSTtBQUFBLElBQ2IsT0FBTyxJQUFJO0FBQUEsRUFDZjtBQUFBLEVBQ1M7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFFVCxXQUFXLENBQ1MsS0FDaEIsU0FNRjtBQUFBLElBUGtCO0FBQUEsSUFRaEIsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLFVBQVU7QUFBQSxJQUNmLElBQUksT0FBTyxTQUFTLFVBQVUsVUFBVTtBQUFBLE1BQ3BDLE1BQU0sUUFBUSxTQUFTO0FBQUEsTUFDdkIsS0FBSyxRQUFRO0FBQUEsUUFDVCxLQUFLLE1BQU0sUUFBUSxRQUFRLEtBQUs7QUFBQSxNQUNwQztBQUFBLElBQ0osRUFBTztBQUFBLE1BQ0gsS0FBSyxRQUFRLFNBQVMsU0FBUyxJQUFJO0FBQUE7QUFBQSxJQUV2QyxLQUFLLFVBQVUsU0FBUyxXQUFXO0FBQUEsTUFDL0IsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLElBQ1o7QUFBQSxJQUNBLEtBQUssVUFBVSxJQUFJLFFBQ2YsTUFDQSxLQUFLLFNBQ0wsS0FBSyxPQUNMLFNBQVMsYUFBYSxJQUFJLG1CQUFtQixLQUFLLE9BQU8sR0FDekQsU0FBUyxVQUNiO0FBQUEsSUFDQSxLQUFLLFFBQVEsTUFBTSxhQUFhLE9BQU8sTUFBTTtBQUFBLE1BQ3pDLEtBQUssUUFBUTtBQUFBLEtBQ2hCO0FBQUEsSUFDRCxLQUFLLFFBQVEsaUJBQWlCLGFBQWEsT0FBTyxNQUFNO0FBQUEsTUFDcEQsSUFBSSxLQUFLLE9BQU87QUFBQSxRQUNaLE1BQU0sSUFBSSxNQUFNLDBDQUEwQztBQUFBLE1BQzlEO0FBQUEsTUFDQSxLQUFLLFFBQVE7QUFBQSxNQUNiLEtBQUssTUFBTSxNQUFNLEtBQUs7QUFBQSxLQUN6QjtBQUFBLElBQ0QsS0FBSyxhQUFhLElBQUksa0JBQWtCLElBQUk7QUFBQSxJQUM1QyxLQUFLLFlBQVksS0FBSyxXQUFXLFNBQVMsdUJBQXVCO0FBQUEsSUFDakUsS0FBSyxVQUFVLEtBQUssV0FBVyxTQUFTLHFCQUFxQjtBQUFBLElBQzdELEtBQUssY0FBYyxLQUFLLFdBQVcsU0FBUyx5QkFBeUI7QUFBQSxJQUNyRSxLQUFLLFNBQVMsS0FBSyxXQUFXLFNBQVMsb0JBQW9CO0FBQUEsSUFDM0QsS0FBSyxXQUFXLEtBQUssV0FBVyxTQUFTLHNCQUFzQjtBQUFBLElBQy9ELEtBQUssYUFBYSxLQUFLLFdBQVcsU0FBUyx1QkFBdUI7QUFBQSxJQUNsRSxLQUFLLFlBQVksS0FBSyxXQUFXLFNBQVMsd0JBQXdCO0FBQUEsSUFDbEUsS0FBSyxVQUFVLEtBQUssV0FBVyxTQUFTLHFCQUFxQjtBQUFBLElBQzdELEtBQUssU0FBUyxLQUFLLFdBQVcsU0FBUyxvQkFBb0I7QUFBQSxJQUMzRCxLQUFLLE9BQU8sS0FBSyxXQUFXLFNBQVMsbUJBQW1CO0FBQUEsSUFDeEQsS0FBSyxTQUFTLEtBQUssV0FBVyxTQUFTLHFCQUFxQjtBQUFBLElBQzVELEtBQUssU0FBUyxLQUFLLFdBQVcsU0FBUyxxQkFBcUI7QUFBQSxJQUM1RCxLQUFLLE9BQU8sS0FBSyxXQUFXLFNBQVMsbUJBQW1CO0FBQUE7QUFBQSxFQUdyRCxJQUFPLENBQUMsWUFBMkIsTUFBZTtBQUFBLElBQ3JELEtBQUssUUFBUSxLQUFLO0FBQUEsTUFDZCxNQUFNO0FBQUEsTUFDTjtBQUFBLElBQ0osQ0FBQztBQUFBO0FBQUEsT0FHUSxNQUFLLEdBQWtCO0FBQUEsSUFDaEMsSUFBSSxLQUFLLFNBQVM7QUFBQSxNQUNkLE1BQU0sSUFBSSxNQUFNLHdCQUF3QjtBQUFBLElBQzVDO0FBQUEsSUFDQSxLQUFLLFVBQVU7QUFBQSxJQUNmLE1BQU0sVUFBVSxLQUFLLFFBQVEsUUFBUTtBQUFBLElBQ3JDLEtBQUssTUFBTSxRQUFRLEtBQUs7QUFBQSxJQUN4QixNQUFNO0FBQUE7QUFBQSxFQUdILElBQUksR0FBUztBQUFBLElBQ2hCLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLE1BQU0sUUFBUSxLQUFLO0FBQUE7QUFBQSxFQUdyQixPQUFPLENBQUMsVUFBZ0M7QUFBQSxJQUMzQyxJQUFJLEtBQUssT0FBTztBQUFBLE1BQ1osU0FBUztBQUFBLElBQ2I7QUFBQSxJQUNBLE9BQU8sS0FBSyxNQUFNLE1BQU0sT0FBTyxRQUFRO0FBQUE7QUFBQSxPQUc5QixhQUFZLEdBQWtCO0FBQUEsSUFDdkMsSUFBSSxLQUFLO0FBQUEsTUFBTztBQUFBLElBQ2hCLE9BQU8sSUFBSSxRQUFjLENBQUMsWUFBWTtBQUFBLE1BQ2xDLElBQUksV0FBVyxNQUFNO0FBQUEsTUFDckIsV0FBVyxLQUFLLE1BQU0sTUFBTSxPQUFPLE1BQU07QUFBQSxRQUNyQyxTQUFTO0FBQUEsUUFDVCxRQUFRO0FBQUEsT0FDWDtBQUFBLEtBQ0o7QUFBQTtBQUVUOyIsCiAgImRlYnVnSWQiOiAiNDE1Mjc3RjA1NkI0QTlEQjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=