mmhglobal-dynamicform 2.20.0 → 2.21.0

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.
@@ -645,27 +645,27 @@ export class ZGridBindingDirective extends DataBindingDirective {
645
645
  const aggregateColumns = this.gridSetting.columns.filter(col => col.aggregateType);
646
646
  aggregateColumns.forEach(col => {
647
647
  const field = col.field;
648
- const aggregateType = col.aggregateType.toLowerCase();
649
- let _aggregateValue = null;
648
+ const aggregateType = col.aggregateType.toLowerCase().replace(':', '');
649
+ let aggregateValue = null;
650
650
  switch (aggregateType) {
651
651
  case "total":
652
652
  case "sum":
653
- _aggregateValue = data.reduce((total, next) => total + next[field], 0);
653
+ aggregateValue = data.reduce((total, next) => total + next[field], 0);
654
654
  break;
655
655
  case "average":
656
- _aggregateValue = data.reduce((total, next) => total + next[field], 0) / data.length;
656
+ aggregateValue = data.reduce((total, next) => total + next[field], 0) / data.length;
657
657
  break;
658
658
  case "count":
659
- _aggregateValue = data.length;
659
+ aggregateValue = data.length;
660
660
  break;
661
661
  case "max":
662
- _aggregateValue = data.reduce((p, c) => p[field] > c[field] ? p : c)[field];
662
+ aggregateValue = data.reduce((p, c) => p[field] > c[field] ? p : c)[field];
663
663
  break;
664
664
  case "min":
665
- _aggregateValue = data.reduce((p, c) => p[field] < c[field] ? p : c)[field];
665
+ aggregateValue = data.reduce((p, c) => p[field] < c[field] ? p : c)[field];
666
666
  break;
667
667
  }
668
- col.aggregateValue = _aggregateValue;
668
+ col.aggregateValue = aggregateValue;
669
669
  });
670
670
  }
671
671
  /**
@@ -841,4 +841,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
841
841
  }] }, { type: i1.WebApiService }, { type: i1.ToastService }, { type: i1.OfflineDatabaseService }, { type: i1.SignalrService }, { type: i2.ZGridService }, { type: i1.LoggingService }]; }, propDecorators: { zgridbinding: [{
842
842
  type: Input
843
843
  }] } });
844
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBeUMsTUFBTSw4QkFBOEIsQ0FBQztBQUcxSCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBZ0IsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRix5REFBeUQ7QUFDekQsT0FBTyxFQUNMLGdCQUFnQixFQUM2RCxVQUFVLEVBQ3hGLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFNekIsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG9CQUFvQjtJQXdEN0QsWUFDeUIsSUFBSSxFQUFFLHlGQUF5RjtJQUM5RyxhQUE0QixFQUM1QixZQUEwQjtJQUNsQyxtQ0FBbUM7SUFDM0Isc0JBQThDLEVBQzlDLGNBQThCLEVBQzlCLFdBQXlCLEVBQ3pCLGNBQThCO1FBRXRDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVJKLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBRTFCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxD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eyBEaXJlY3RpdmUsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBEYXRhQmluZGluZ0RpcmVjdGl2ZSwgR3JpZENvbXBvbmVudCwgRGF0YVN0YXRlQ2hhbmdlRXZlbnQsIFBhZ2VDaGFuZ2VFdmVudCB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkXCI7XHJcbmltcG9ydCB7IFNvcnREZXNjcmlwdG9yLCBGaWx0ZXJEZXNjcmlwdG9yLCB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeVwiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBHcmlkU2V0dGluZ1R5cGUsIEdyaWRTdGF0ZUxvZ2ljVHlwZSwgWkdyaWRTZXJ2aWNlIH0gZnJvbSBcIi4vemdyaWQuc2VydmljZVwiO1xyXG4vL2ltcG9ydCB7IE1haW5TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL21haW4uc2VydmljZVwiO1xyXG5pbXBvcnQge1xyXG4gIFpDb21wb25lbnRIZWxwZXIsIFpGaWVsZCwgWkdyaWRQb3N0QXBpUGFyYW1zLFxyXG4gIFdlYkFwaVNlcnZpY2UsIFpHcm91cCwgVG9hc3RTZXJ2aWNlLCBPZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLCBTaWduYWxyU2VydmljZSwgQWN0aW9uVHlwZSwgWkdyaWRDb2x1bW5Db25maWdzLCBaR3JpZFNldHRpbmdzLCBMb2dnaW5nU2VydmljZVxyXG59IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuXHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogXCJbemdyaWRiaW5kaW5nXVwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgWkdyaWRCaW5kaW5nRGlyZWN0aXZlIGV4dGVuZHMgRGF0YUJpbmRpbmdEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBjaGFuZ2VFdmVudCA9IHtcclxuICAgIHBhZ2VDaGFuZ2VkOiBmYWxzZSxcclxuICAgIGZpbHRlckNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgc29ydENoYW5nZWQ6IGZhbHNlXHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSB6Z3JpZGJpbmRpbmc6IHtcclxuICAgIGRhdGE6IFpGaWVsZDtcclxuICAgIGdyb3VwOiBaR3JvdXA7XHJcbiAgICBwYXJhbXM6IFpHcmlkUG9zdEFwaVBhcmFtcztcclxuICAgIGdyaWRTdWJqZWN0OiBTdWJqZWN0PGFueT47XHJcbiAgICBncmlkU2V0dGluZzogWkdyaWRTZXR0aW5ncztcclxuICB9O1xyXG5cclxuICAvL3N0YXRlOiBTdGF0ZSA9IHtcclxuICAvLyAgc2tpcDogMCxcclxuICAvLyAgdGFrZTogMTAsXHJcbiAgLy99O1xyXG5cclxuICAvL2dyaWRDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG5cclxuICAvL3VzYWJsZUNvbHVtbnM6IGFueVtdID0gW107XHJcblxyXG4gIHJlc291cmNlVVJMID0gbnVsbDtcclxuXHJcbiAgcGFnaW5hdGlvbkFwaVBvc3RVcmwgPSBudWxsO1xyXG5cclxuICBkYXRhU291cmNlID0gbnVsbDtcclxuXHJcbiAgZ2V0IGdyaWRTZXR0aW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTZXR0aW5nO1xyXG4gIH1cclxuICBzZXQgZ3JpZFNldHRpbmcodmFsdWUpIHtcclxuICAgIHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTZXR0aW5nID0gdmFsdWU7XHJcbiAgfVxyXG4gIGdldCBmaWVsZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5kYXRhO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdycCgpIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5ncm91cDtcclxuICB9XHJcblxyXG4gIGdldCBncmlkU3ViamVjdCgpIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5ncmlkU3ViamVjdDtcclxuICB9XHJcblxyXG4gIGdldCBwYXJhbXMoKTogWkdyaWRQb3N0QXBpUGFyYW1zIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5wYXJhbXM7XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0RGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLmdyaWQuZGF0YTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChHcmlkQ29tcG9uZW50KSBncmlkLCAvLyBJbmplY3RpbmcgR3JpZENvbXBvbmVudCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHNjb3BlIGFuZCBjb250ZXh0IG9mIHRoZSBHcmlkQ29tcG9uZW50LlxyXG4gICAgcHJpdmF0ZSB3ZWJhcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIC8vcHJpdmF0ZSBtYWluU2VydmljZTogTWFpblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG9mZmxpbmVEYXRhYmFzZVNlcnZpY2U6IE9mZmxpbmVEYXRhYmFzZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNpZ25hbHJTZXJ2aWNlOiBTaWduYWxyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IFpHcmlkU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9nZ2luZ1NlcnZpY2U6IExvZ2dpbmdTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihncmlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMuZmllbGQuUGFnZVNpemUgfHwgMjA7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmZpZWxkLkRhdGFTb3VyY2UgPz8gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xyXG4gICAgICB0aGlzLnJlc291cmNlVVJMID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICAgIHRoaXMuZmllbGQuUmVzb3VyY2VVUkwsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5yZXNvdXJjZVVSTCkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuTmFtZSAhPT0gXCJBY3Rpdml0eUxvZ0dyaWRcIikge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgICBcIk5vIGluaXRpYWxpc2UgZm9yIEZpZWxkLlJlc291cmNlVVJMOiBcIixcclxuICAgICAgICAgICAgdGhpcy5maWVsZC5SZXNvdXJjZVVSTFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNldFJlc291cmNlVXJsKHRoaXMucmVzb3VyY2VVUkwpO1xyXG5cclxuICAgICAgdGhpcy5zZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZmllbGQuRGlzYWJsZUdlbmVyYXRlQ29sdW1uQnlGb3JtKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbkZpZWxkcyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcywgdGhpcy5ncnApO1xyXG5cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1uRmllbGRzKSkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29sdW1ucyhjb2x1bW5GaWVsZHMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVHcmlkQ29sdW1ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5zdWJzY3JpYmVDYWNoZURhdGFDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJlc291cmNlVXJsKHJlc291cmNlVXJsOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGFycmF5ID0gcmVzb3VyY2VVcmwuc3BsaXQoXCIvYXBpL1wiKTtcclxuICAgIGlmICghIWFycmF5WzFdKSB7XHJcbiAgICAgIGFycmF5WzFdID0gXCJQYWdlXCIgKyBhcnJheVsxXTtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCA9IGFycmF5LmpvaW4oXCIvYXBpL1wiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGFyciA9IHRoaXMucmVzb3VyY2VVUkwuc3BsaXQoXCIvXCIpO1xyXG4gICAgICBhcnJbYXJyLmxlbmd0aCAtIDJdID0gXCJQYWdlXCIgKyBhcnJbYXJyLmxlbmd0aCAtIDJdO1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsID0gYXJyLmpvaW4oXCIvXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCkge1xyXG4gICAgLy8gVXNlIGZpZWxkIG93biByZWZlcmVuY2VJZCBpZiBhdmFpbGFibGVcclxuICAgIGNvbnN0IHJlZklkID0gdGhpcy5nZXRGaWVsZFJlZmVyZW5jZUlkKCkgfHwgdGhpcy5ncnAucmVmZXJlbmNlSWQ7XHJcbiAgICBjb25zdCByZWZGaWVsZCA9IHRoaXMuZmllbGQuUmVmZXJlbmNlRmllbGQgfHwgdGhpcy5ncnAucGFyZW50UmVmZXJlbmNlRmllbGQ7XHJcbiAgICBpZiAocmVmSWQgJiYgcmVmRmllbGQpIHtcclxuICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB7XHJcbiAgICAgICAga2V5OiByZWZGaWVsZCxcclxuICAgICAgICBvcHM6IFwiPVwiLFxyXG4gICAgICAgIHZhbHVlOiByZWZJZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmllbGRSZWZlcmVuY2VJZCgpIHtcclxuICAgIGxldCBmaWVsZFJlZmVyZW5jZUlkID0gbnVsbDtcclxuICAgIGlmICh0aGlzLmZpZWxkLlJlZmVyZW5jZUlkKSB7XHJcbiAgICAgIGZpZWxkUmVmZXJlbmNlSWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5SZWZlcmVuY2VJZCxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkUmVmZXJlbmNlSWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2VuZXJhdGVHcmlkQ29sdW1ucygpIHtcclxuICAgIGNvbnN0IGNvbHVtbkZpZWxkcyQ6IE9ic2VydmFibGU8YW55PiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgdGhpcy5maWVsZC5Db2x1bW5GaWVsZHMsXHJcbiAgICAgIHRoaXMuZ3JwXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChjb2x1bW5GaWVsZHMkKSB7XHJcbiAgICAgIGNvbHVtbkZpZWxkcyQucGlwZShcclxuICAgICAgICB0YXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgIGxldCBjb2x1bW5zQ29uZmlnID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAvLyBOb3RlOiBPYnRhaW5pbmcgdGhlIGdyaWQgc3RhdGUgaXMgZHVyaW5nIGluaXRpYWxpemF0aW9uOyBpZiBub3QsIGl0IHdpbGwgcHJldmVudCB0aGUgZ3JpZCBmcm9tIGxvYWRpbmcuXHJcbiAgICAgICAgICBjb25zdCBzZXR0aW5nQ2FjaGVOYW1lID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVDYWNoZVN0b3JhZ2VLZXkoR3JpZFNldHRpbmdUeXBlLlNhdmVkU2V0dGluZywgdGhpcy5maWVsZCk7XHJcbiAgICAgICAgICBjb25zdCBzZXR0aW5nQ2FjaGVWYWx1ZSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oc2V0dGluZ0NhY2hlTmFtZSk7XHJcbiAgICAgICAgICBpZiAoc2V0dGluZ0NhY2hlVmFsdWUpIHtcclxuICAgICAgICAgICAgY29sdW1uc0NvbmZpZyA9IChKU09OLnBhcnNlKHNldHRpbmdDYWNoZVZhbHVlKSBhcyBaR3JpZFNldHRpbmdzKS5jb2x1bW5Db25maWd1cmF0aW9ucztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWRTZXR0aW5nID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmdyaWRTZXR0aW5nLCAvLyBQcmVzZXJ2ZSBleGlzdGluZyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIGNvbHVtbkZpZWxkOiBkYXRhLFxyXG4gICAgICAgICAgICBncm91cDogdGhpcy56Z3JpZGJpbmRpbmcuZ3JvdXAsXHJcbiAgICAgICAgICAgIGNvbHVtbkNvbmZpZ3VyYXRpb25zOiBjb2x1bW5zQ29uZmlnXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyh0aGlzLmdyaWRTZXR0aW5nKTsgXHJcbiAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZ1RvQ29uc29sZUZvckRlYnVnKCdnZW5lcmF0ZWQgZ3JpZCBjb2x1bW5zJywgdGhpcy5ncmlkU2V0dGluZyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYXJhbXNDb2x1bW5zKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlcigpO1xyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYXJhbXMoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0U29ydGluZygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRHcmFudFR5cGUoKTtcclxuICAgICAgICAgIHRoaXMuc2V0SGlkZGVuQ29sdW1uKHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uQ29uZmlndXJhdGlvbnMpO1xyXG5cclxuICAgICAgICAgIHRoaXMucGFyYW1zLnJlZmVySWQgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlSWQoKSB8fCB0aGlzLmdycC5yZWZlcmVuY2VJZCB8fCBudWxsO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWwgdG8gZ2VuZXJhdGUgZ3JpZCBjb2x1bW4gZmllbGRzLicpO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZ3JwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTa2lwTG9hZFJlc291cmNlVVJMRGF0YShzZXR0aW5nVmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmllbGRbJ1NraXBMb2FkUmVzb3VyY2VVUkxEYXRhJ10gPSAhc2V0dGluZ1ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSB0aXRsZSBvZiBhIGNvbHVtbiBpbiB0aGUgZ3JpZCBzZXR0aW5nIGJhc2VkIG9uIGl0cyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sTmFtZSAtIFRoZSBuZXcgdGl0bGUgZm9yIHRoZSBjb2x1bW4uXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldENvbHVtbk5hbWUoY29sVmFsdWU6IHN0cmluZywgY29sTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBGaW5kIHRoZSBjb2x1bW4gd2l0aCB0aGUgbWF0Y2hpbmcgY29sVmFsdWUuXHJcbiAgICBjb25zdCBjb2x1bW5Ub1VwZGF0ZSA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGZpZWxkID0+IGZpZWxkLlZhbHVlID09PSBjb2xWYWx1ZSk7XHJcblxyXG4gICAgLy8gSWYgdGhlIGNvbHVtbiBpcyBmb3VuZCwgdXBkYXRlIGl0cyB0aXRsZSBwcm9wZXJ0eSB3aXRoIGNvbE5hbWUuXHJcbiAgICBpZiAoY29sdW1uVG9VcGRhdGUpIHtcclxuICAgICAgY29sdW1uVG9VcGRhdGUudGl0bGUgPSBjb2xOYW1lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB2aXNpYmlsaXR5IG9mIGEgY29sdW1uIGluIHRoZSBncmlkIGJhc2VkIG9uIGl0cyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIHRvIHNldCB2aXNpYmlsaXR5IGZvci5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzVmlzaWJsZSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBzaG91bGQgYmUgdmlzaWJsZSAodHJ1ZSkgb3IgaGlkZGVuIChmYWxzZSkuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldENvbHVtblZpc2libGUoY29sVmFsdWU6IHN0cmluZywgaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyBGaW5kIHRoZSBjb2x1bW4gd2l0aCB0aGUgbWF0Y2hpbmcgY29sVmFsdWUuXHJcbiAgICBjb25zdCBjb2x1bW5Ub1VwZGF0ZSA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGZpZWxkID0+IGZpZWxkLlZhbHVlID09PSBjb2xWYWx1ZSk7XHJcblxyXG4gICAgLy8gSWYgdGhlIGNvbHVtbiBpcyBmb3VuZCwgdXBkYXRlIGl0cyAnaGlkZGVuJyBwcm9wZXJ0eSBiYXNlZCBvbiAnaXNWaXNpYmxlJy5cclxuICAgIGlmIChjb2x1bW5Ub1VwZGF0ZSkge1xyXG4gICAgICBjb2x1bW5Ub1VwZGF0ZS5oaWRkZW4gPSAhaXNWaXNpYmxlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgZmlsdGVyIHBhcmFtZXRlcnMgZm9yIGNvbHVtbnMgYW5kIHNldCB0aGVtIGluIHRoZSAncGFyYW1zJyBvYmplY3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlclBhcmFtc0NvbHVtbnMoKSB7XHJcbiAgICAvLyBDcmVhdGUgYW4gYXJyYXkgdG8gc3RvcmUgY29sdW1uIGZpZWxkcy5cclxuICAgIGNvbnN0IGNvbEZpZWxkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZ3JpZCBjb2x1bW5zIHRvIGJ1aWxkIGNvbHVtbiBmaWVsZCBzdHJpbmdzLlxyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnZhbHVlRXhwcikge1xyXG4gICAgICAgIC8vIElmICd2YWx1ZUV4cHInIGV4aXN0cywgdXNlIGl0IGFzIGFuIGFsaWFzIGZvciB0aGUgZmllbGQuXHJcbiAgICAgICAgY29sRmllbGRzLnB1c2goY29sdW1uLnZhbHVlRXhwciArIFwiIGFzIFwiICsgY29sdW1uLmZpZWxkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2xGaWVsZHMucHVzaChjb2x1bW4uZmllbGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnSWQnIGlzIGluIHRoZSBjb2x1bW4gZmllbGRzOyBpZiBub3QsIGFkZCBpdC5cclxuICAgIGlmIChjb2xGaWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoY29sRmllbGRzLmluZGV4T2YoXCJJZFwiKSA9PT0gLTEpIHtcclxuICAgICAgICBjb2xGaWVsZHMucHVzaChcIklkXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuIGFycmF5IHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSBnZW5lcmF0ZWQgY29sdW1uIGZpZWxkcy5cclxuICAgIGNvbnN0IHRtcEdyaWRDb2x1bW46IGFueVtdID0gW107XHJcbiAgICB0bXBHcmlkQ29sdW1uLnB1c2goY29sRmllbGRzLmpvaW4oXCIsXCIpKTtcclxuXHJcbiAgICAvLyBJZiB0aGVyZSBhcmUgZ2VuZXJhdGVIaWRkZW5Db2x1bW5zIGluIHRoZSBzZXR0aW5nLCBhZGQgdGhlbSB0byB0aGUgYXJyYXkuXHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5nZW5lcmF0ZUhpZGRlbkNvbHVtbnM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdG1wR3JpZENvbHVtbi5wdXNoKHRoaXMuZ3JpZFNldHRpbmcuZ2VuZXJhdGVIaWRkZW5Db2x1bW5zLmpvaW4oXCIsXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgdGhlICdwYXJhbXMuY29sdW1ucycgcHJvcGVydHkgd2l0aCB0aGUgY29uY2F0ZW5hdGVkIGNvbHVtbiBmaWVsZHMuXHJcbiAgICB0aGlzLnBhcmFtcy5jb2x1bW5zID0gdG1wR3JpZENvbHVtbi5qb2luKFwiLFwiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgJ3BhcmFtcy5maWx0ZXJzJyBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgJ2ZpZWxkLkZpbHRlcnMnIHByb3BlcnR5LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXIoKSB7XHJcbiAgICBpZiAodGhpcy5wYXJhbXMuZmlsdGVycyAmJiB0aGlzLmZpZWxkLkZpbHRlcnMpIHtcclxuICAgICAgLy8gQ29tYmluZSAncGFyYW1zLmZpbHRlcnMnIGFuZCAnZmllbGQuRmlsdGVycycgdXNpbmcgJyYmJyBpZiBib3RoIGV4aXN0LiBcclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IGAke3RoaXMucGFyYW1zLmZpbHRlcnN9ICYmICR7dGhpcy5maWVsZC5GaWx0ZXJzfWA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5wYXJhbXMuZmlsdGVycyAmJiB0aGlzLmZpZWxkLkZpbHRlcnMpIHtcclxuICAgICAgLy8gVXNlICdmaWVsZC5GaWx0ZXJzJyBkaXJlY3RseSBpZiAncGFyYW1zLmZpbHRlcnMnIGRvZXNuJ3QgZXhpc3QuXHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlcnMgPSB0aGlzLmZpZWxkLkZpbHRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ2ZpZWxkLkZpbHRlcnMnIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gJ2dyb3VwLicgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIGFjdHVhbCB2YWx1ZXMuXHJcbiAgICBpZiAodGhpcy5maWVsZC5GaWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycy5zcGxpdChcIiBcIikuc29tZSgoZWxlbWVudCkgPT4gZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkpIHtcclxuICAgICAgY29uc3QgZmlsdGVyS2V5VmFsUGFpcnMgPSB0aGlzLmZpZWxkLkZpbHRlcnMuc3BsaXQoXCIgXCIpO1xyXG4gICAgICBjb25zdCBncnBWYWx1ZXMgPSBmaWx0ZXJLZXlWYWxQYWlycy5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQudHJpbSgpLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpO1xyXG5cclxuICAgICAgZ3JwVmFsdWVzLmZvckVhY2goKHZhbCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFjdHVhbFZhbCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh2YWwsIHRoaXMuZ3JwKTtcclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gdGhpcy5wYXJhbXMuZmlsdGVycy5yZXBsYWNlKHZhbCwgYWN0dWFsVmFsKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZpbHRlciBwYXJhbWV0ZXJzIGluIHRoZSAncGFyYW1zLmZpbHRlclBhcmFtcycgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkWydGaWx0ZXJQYXJhbXMnXScuIGZpbHRlclBhcmFtcyA9PT0gdXNlZCBmb3IgdGhlIGlucHV0IGluIHRoZSBjb2x1bW4gZmlsdGVyIGF0IHRoZSBVSS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyUGFyYW1zKCkgeyBcclxuICAgIGNvbnN0IGZpbHRlclBhcmFtcyA9IHRoaXMuZmllbGRbJ0ZpbHRlclBhcmFtcyddO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemUgZmlsdGVyIHBhcmFtZXRlcnMgaWYgdW5kZWZpbmVkLlxyXG4gICAgaWYgKCF0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpbHRlclBhcmFtcykge1xyXG4gICAgICBpZiAoZmlsdGVyUGFyYW1zLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpIHtcclxuICAgICAgICAvLyBJZiAnZmlsdGVyUGFyYW1zJyBzdGFydHMgd2l0aCBcImdyb3VwLlwiLCBleHRlbmQgdGhlIGV4aXN0aW5nIGFycmF5LlxyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtcclxuICAgICAgICAgIC4uLnRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyxcclxuICAgICAgICAgIC4uLlpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShmaWx0ZXJQYXJhbXMsIHRoaXMuZ3JwKVxyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gSWYgJ2ZpbHRlclBhcmFtcycgZG9lcyBub3Qgc3RhcnQgd2l0aCBcImdyb3VwLlwiLCB1c2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW1xyXG4gICAgICAgICAgLi4udGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLFxyXG4gICAgICAgICAgZmlsdGVyUGFyYW1zXHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBjb2x1bW4gZmlsdGVycyBpbiB0aGUgZ3JpZCBzdGF0ZSBhbmQgYXBwZW5kIHRvIGZpbHRlcnBhcmFtIFxyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlPy5maWx0ZXI/LmZpbHRlcnMpIHtcclxuICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuZmlsdGVyPy5maWx0ZXJzPy5mb3JFYWNoKChmaWx0ZXI6IEZpbHRlckRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJQYXJhbSA9IHtcclxuICAgICAgICAgIGtleTogZmlsdGVyLmZpZWxkIGFzIHN0cmluZyxcclxuICAgICAgICAgIG9wczogdGhpcy5tYXBGaWx0ZXJPcGVyYXRvcihmaWx0ZXIub3BlcmF0b3IpLFxyXG4gICAgICAgICAgdmFsdWU6IGZpbHRlci52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBDaGVjayBpZiBhIGZpbHRlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBrZXkgYWxyZWFkeSBleGlzdHMuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQYXJhbSA9IHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5maW5kKChwYXJhbSkgPT4gcGFyYW0ua2V5ID09PSBmaWx0ZXJQYXJhbS5rZXkpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ1BhcmFtKSB7XHJcbiAgICAgICAgICAvLyBJZiBhIGZpbHRlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBrZXkgZXhpc3RzLCB1cGRhdGUgaXRzIHZhbHVlLlxyXG4gICAgICAgICAgZXhpc3RpbmdQYXJhbS52YWx1ZSA9IGZpbHRlclBhcmFtLnZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBJZiBubyBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5LCBhZGQgaXQgdG8gdGhlIGZpbHRlciBwYXJhbWV0ZXJzLlxyXG4gICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyUGFyYW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHNvcnRpbmcgb3JkZXIgaW4gdGhlICdwYXJhbXMuc29ydE9yZGVyJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGQuU29ydE9yZGVyJy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0U29ydGluZygpIHtcclxuICAgIGNvbnN0IHNvcnRPcmRlciA9IHRoaXMuZmllbGQuU29ydE9yZGVyO1xyXG5cclxuICAgIC8vIENoZWNrIGlmICdzb3J0T3JkZXInIGlzIGRlZmluZWQgYW5kIHN0YXJ0cyB3aXRoIFwiZ3JvdXAuXCIuXHJcbiAgICBpZiAoc29ydE9yZGVyICYmIHNvcnRPcmRlci5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlciA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShzb3J0T3JkZXIsIHRoaXMuZ3JwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBJZiAnc29ydE9yZGVyJyBpcyBub3QgZGVmaW5lZCBvciBkb2Vzbid0IHN0YXJ0IHdpdGggXCJncm91cC5cIiwgdXNlIGl0IGRpcmVjdGx5LlxyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXIgPSBzb3J0T3JkZXI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIEluaXRpYWxpemUgc29ydCBwYXJhbWV0ZXJzIGlmIHVuZGVmaW5lZC5cclxuICAgIGlmICghdGhpcy5wYXJhbXMuc29ydE9yZGVycykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzID0gW107XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc29ydCkge1xyXG4gICAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5zb3J0LmZvckVhY2goKGRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgICBpZiAoZGVzY3JpcHRvci5kaXIpIHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBkZXNjcmlwdG9yLmZpZWxkKTtcclxuICAgICAgICAgIGNvbnN0IHNvcnRDb2x1bW5OYW1lID0gZmllbGQudmFsdWVFeHByICE9PSB1bmRlZmluZWQgPyBmaWVsZC52YWx1ZUV4cHIgOiBkZXNjcmlwdG9yLmZpZWxkO1xyXG5cclxuICAgICAgICAgIC8vIENoZWNrIGlmIGEgc29ydCBjb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdTb3J0Q29sdW1uSW5kZXggPSB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMuZmluZEluZGV4KChuYW1lKSA9PiBuYW1lID09PSBzb3J0Q29sdW1uTmFtZSk7XHJcblxyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nU29ydENvbHVtbkluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAvLyBJZiBhIHNvcnQgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSBleGlzdHMsIHVwZGF0ZSBpdHMgc29ydCBvcmRlci5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVyc1tleGlzdGluZ1NvcnRDb2x1bW5JbmRleF0gPSBkZXNjcmlwdG9yLmRpcjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIG5vIHNvcnQgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSwgYWRkIGl0IHRvIHRoZSBzb3J0IGNvbHVtbnMgYW5kIHNvcnQgb3JkZXJzLlxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMucHVzaChzb3J0Q29sdW1uTmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnMucHVzaChkZXNjcmlwdG9yLmRpcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZ3JhbnQgdHlwZSBpbiB0aGUgJ3BhcmFtcy5ncmFudFR5cGUnIHByb3BlcnR5IGJhc2VkIG9uICdmaWVsZC5HcmFudFR5cGUnLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHcmFudFR5cGUoKSB7XHJcbiAgICBjb25zdCBncmFudFR5cGUgPSB0aGlzLmZpZWxkLkdyYW50VHlwZTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnZ3JhbnRUeXBlJyBpcyBkZWZpbmVkLlxyXG4gICAgaWYgKGdyYW50VHlwZSkge1xyXG4gICAgICB0aGlzLnBhcmFtcy5ncmFudFR5cGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZ3JhbnRUeXBlLnRvU3RyaW5nKCksIHRoaXMuZ3JwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgJ2hpZGRlbicgcHJvcGVydHkgZm9yIGNvbHVtbnMgaW4gJ2dyaWRTZXR0aW5nJyBiYXNlZCBvbiAnY29sdW1uQ29uZmlncycuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1pHcmlkQ29sdW1uQ29uZmlnc1tdfSBjb2x1bW5Db25maWdzIC0gVGhlIGNvbHVtbiBjb25maWd1cmF0aW9uIHNldHRpbmdzLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0SGlkZGVuQ29sdW1uKGNvbHVtbkNvbmZpZ3M6IFpHcmlkQ29sdW1uQ29uZmlnc1tdKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zICYmIGNvbHVtbkNvbmZpZ3MpIHtcclxuICAgICAgLy8gRmlsdGVyIG91dCBoaWRkZW4gY29sdW1ucyBpbiAnY29sdW1uQ29uZmlncycuXHJcbiAgICAgIGNvbnN0IGhpZGRlbkNvbHVtbnMgPSBjb2x1bW5Db25maWdzLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmhpZGRlbiA9PT0gdHJ1ZSk7XHJcblxyXG4gICAgICAvLyBJdGVyYXRlIHRocm91Z2ggaGlkZGVuIGNvbHVtbnMgYW5kIHVwZGF0ZSAnZ3JpZFNldHRpbmcnIGFjY29yZGluZ2x5LlxyXG4gICAgICBoaWRkZW5Db2x1bW5zLmZvckVhY2goaGlkZGVuQ29sdW1uID0+IHtcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IGhpZGRlbkNvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgaWYgKGNvbHVtbikge1xyXG4gICAgICAgICAgY29sdW1uLmhpZGRlbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIGRhdGEgZm9yIGRhdGEgYmluZGluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2tpcFVzZUNhY2hlIC0gV2hldGhlciB0byBza2lwIHVzaW5nIGNhY2hlIGZvciBkYXRhIHJldHJpZXZhbC5cclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RGF0YUJpbmRpbmcoc2tpcFVzZUNhY2hlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gICAgaWYgKCFjYWNoZUluZm8gfHwgc2tpcFVzZUNhY2hlKSB7XHJcbiAgICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjYWNoZUluZm8pIHtcclxuICAgICAgY29uc3QgZ3JpZFN0YXRlTG9naWMgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUxvZ2ljKHRoaXMuZmllbGQpO1xyXG4gICAgICBpZiAoZ3JpZFN0YXRlTG9naWMgPT09IEdyaWRTdGF0ZUxvZ2ljVHlwZS5TZXR0aW5nT25seSkge1xyXG4gICAgICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY2hhbmdlRXZlbnQucGFnZUNoYW5nZWQgJiYgIXRoaXMuY2hhbmdlRXZlbnQuc29ydENoYW5nZWQgJiYgIXRoaXMuY2hhbmdlRXZlbnQuZmlsdGVyQ2hhbmdlZCkge1xyXG4gICAgICBjb25zdCBjdXJyZW50RGF0YUNhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5nZXRJdGVtQnlLZXkoY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhQ2FjaGVJbmZvLm9mZmxpbmVEYXRhYmFzZUtleSk7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUocmVzdWx0LmRhdGEsIHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIGdyaWQgZGF0YS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0R3JpZERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xyXG4gICAgICBpZiAoIXRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ0dyaWQgcGFnaW5hdGlvbiBBUEkgVVJMIGlzIHVuZGVmaW5lZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHN0YXRlU2tpcCA9IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID8gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc2tpcCA6IHRoaXMuc3RhdGUuc2tpcDtcclxuICAgICAgY29uc3Qgc3RhdGVUYWtlID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPyB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS50YWtlIDogdGhpcy5zdGF0ZS50YWtlO1xyXG5cclxuICAgICAgdGhpcy5wYXJhbXMucGFnZU5vID0gdGhpcy5nZXRQYWdlTm8oc3RhdGVTa2lwLCBzdGF0ZVRha2UpO1xyXG4gICAgICB0aGlzLnBhcmFtcy5wYWdlU2l6ZSA9IHN0YXRlVGFrZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmZpZWxkLkV4dGVybmFsUGFnaW5hdGlvbikge1xyXG4gICAgICAgIC8vIEZvciBQT1NUIG1ldGhvZCBQYWdlIFdlYkFQSSBcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2VcclxuICAgICAgICAgIC5wb3N0QXBpKHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwsIHRoaXMucGFyYW1zLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChyZXNwKSA9PiB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUocmVzcCksXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcIkVycm9yIG9jY3VyIGluIGxvYWRpbmcgdGhlIGRhdGFcIiwgXCJtaWRkbGVcIiwgZmFsc2UsIDE1MDAsIFwiZGFuZ2VyXCIpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIEZvciBHRVQgbWV0aG9kXHJcbiAgICAgICAgdGhpcy53ZWJhcGlTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0QXBpKHRoaXMucmVzb3VyY2VVUkwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHRvdGFsQ291bnQgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3AuZGF0YVNldCkge1xyXG4gICAgICAgICAgICAgIGRhdGEgPSByZXNwLmRhdGFTZXQ7XHJcbiAgICAgICAgICAgICAgdG90YWxDb3VudCA9IHJlc3AudG90YWxDb3VudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkYXRhID0gcmVzcDtcclxuICAgICAgICAgICAgICB0b3RhbENvdW50ID0gcmVzcC5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZSh7IGRhdGFTZXQ6IGRhdGEsIHRvdGFsQ291bnQ6IHRvdGFsQ291bnQgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IGRhdGFTZXQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5EYXRhU291cmNlLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmRhdGEgPSBkYXRhU2V0O1xyXG4gICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICAgIHRoaXMubm90aWZ5RGF0YUNoYW5nZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGRhdGE6IGFueSwgc2tpcENhY2hlRGF0YT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuYWdncmVnYXRlSGFuZGxpbmcoZGF0YS5kYXRhU2V0KTtcclxuICAgIHRoaXMuZ3JpZC5kYXRhID0geyBkYXRhOiBkYXRhLmRhdGFTZXQsIHRvdGFsOiBkYXRhLnRvdGFsQ291bnQgfTtcclxuICAgIGlmICghc2tpcENhY2hlRGF0YSkge1xyXG4gICAgICBjb25zdCBncmlkU3RhdGVMb2dpYyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlTG9naWModGhpcy5maWVsZCk7XHJcbiAgICAgIGlmIChncmlkU3RhdGVMb2dpYyA9PT0gR3JpZFN0YXRlTG9naWNUeXBlLkRhdGFDYWNoZU9ubHkgfHwgZ3JpZFN0YXRlTG9naWMgPT09IEdyaWRTdGF0ZUxvZ2ljVHlwZS5TZXR0aW5nQW5kRGF0YUNhY2hlKSB7XHJcbiAgICAgICAgdGhpcy5jYWNoZUdyaWREYXRhKCk7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVDYWNoZURhdGFDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmFmdGVyRGF0YUJpbmRlZChkYXRhKTtcclxuICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgIHRoaXMubm90aWZ5RGF0YUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENoYW5nZUV2ZW50RmxhZygpIHtcclxuICAgIHRoaXMuY2hhbmdlRXZlbnQgPSB7XHJcbiAgICAgIHBhZ2VDaGFuZ2VkOiBmYWxzZSxcclxuICAgICAgZmlsdGVyQ2hhbmdlZDogZmFsc2UsXHJcbiAgICAgIHNvcnRDaGFuZ2VkOiBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjYWNoZUdyaWREYXRhKCkge1xyXG4gICAgY29uc3QgbWUgPSB0aGlzO1xyXG4gICAgY29uc3QgZ3JpZFN0YXRlID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU7XHJcbiAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuZ3JpZD8uZGF0YSB8fCBudWxsO1xyXG5cclxuICAgIGlmICghZ3JpZERhdGFbJ2RhdGEnXSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gICAgaWYgKGNhY2hlSW5mbyAmJiAhY2FjaGVJbmZvLkRpc2FibGVDYWNoZURhdGEpIHtcclxuICAgICAgLy8ga2VlcCBvcmlnaW5hbERhdGEgXHJcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YUNhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5nZXRJdGVtQnlLZXkob3JpZ2luYWxEYXRhQ2FjaGVJbmZvLCBvcmlnaW5hbERhdGFDYWNoZUluZm8ub2ZmbGluZURhdGFiYXNlS2V5KTtcclxuICAgICAgbGV0IHVwZGF0ZWREYXRhID0gWy4uLmdyaWREYXRhWydkYXRhJ11dO1xyXG4gICAgICBsZXQgc2tpcExpc3QgPSBbZ3JpZFN0YXRlLnNraXBdO1xyXG4gICAgICBsZXQgY3VycmVudEdyaWRTa2lwID0gZ3JpZFN0YXRlLnNraXA7XHJcblxyXG4gICAgICBpZiAob3JpZ2luYWxEYXRhQ2FjaGVJbmZvLmFwcGVuZFBhZ2luYXRpb25EYXRhKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhcmVzdWx0LnNraXBMaXN0LmluY2x1ZGVzKGN1cnJlbnRHcmlkU2tpcCkpIHtcclxuICAgICAgICAgIHVwZGF0ZWREYXRhID0gWy4uLnJlc3VsdC5kYXRhLmRhdGFTZXQsIC4uLmdyaWREYXRhWydkYXRhJ11dO1xyXG4gICAgICAgICAgc2tpcExpc3QgPSBbLi4ucmVzdWx0LnNraXBMaXN0LCAuLi5za2lwTGlzdF07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBjYWNoZUdyaWREYXRhID0ge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGRhdGFTZXQ6IHVwZGF0ZWREYXRhLFxyXG4gICAgICAgICAgdG90YWxDb3VudDogZ3JpZERhdGFbJ3RvdGFsJ11cclxuICAgICAgICB9LFxyXG4gICAgICAgIGdyaWRTdGF0ZTogZ3JpZFN0YXRlLFxyXG4gICAgICAgIHNraXBMaXN0OiBza2lwTGlzdCxcclxuICAgICAgICBjYWNoZUR1cmF0aW9uOiBjYWNoZUluZm8uQ2FjaGVEdXJhdGlvblxyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UuYWRkSXRlbShvcmlnaW5hbERhdGFDYWNoZUluZm8sIGNhY2hlR3JpZERhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9cIkZlYXR1cmVEZXZlbG9wbWVudHxDb21wZXRlbmN5XCIgXHJcbiAgcHJpdmF0ZSBhc3luYyBzdWJzY3JpYmVDYWNoZURhdGFDaGFuZ2VzKCkge1xyXG4gICAgY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gICAgaWYgKGNhY2hlSW5mbyAmJiAhY2FjaGVJbmZvLkRpc2FibGVDYWNoZURhdGEpIHtcclxuICAgICAgLy8gY2Fubm90IHVzZSBtYWluIHNlcnZpY2UgaGVyZS4gd2lsbCBnZXQgY2lyY3VsYXIgZXJyb3Igd2hlbiBidWlsZCBsaWJcclxuICAgICAgLy90aGlzLm1haW5TZXJ2aWNlLmpvaW5Qcm9qZWN0U2lnbmFsUigpO1xyXG5cclxuICAgICAgY29uc3QgY2FsbEJhY2tGdW5jdGlvbiA9IGAke2NhY2hlSW5mby5OYW1lfV9oYW5kbGVSZWNlaXZlZE1lc3NhZ2VgO1xyXG5cclxuICAgICAgLy8gY3JlYXRlIGFuZCBiaW5kIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJhY2sgZm9yIHRoZSBncmlkIGluIHRoZSBncm91cCB0cmlnZ2VyIGJ5IHNpZ25hbFIuXHJcbiAgICAgIGlmICghdGhpcy5ncnAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlcikge1xyXG4gICAgICAgIHRoaXMuZ3JwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIgPSB7fTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdycC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyW2NhbGxCYWNrRnVuY3Rpb25dID0gdGhpcy5oYW5kbGVSZWNlaXZlZE1lc3NhZ2UuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgIGNvbnN0IGdlbmVyYXRlZENhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgICAgIGlmIChnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZERhdGFiYXNlICYmIGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkVGFibGUpIHtcclxuICAgICAgICBnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZERhdGFiYXNlLmZvckVhY2goZGIgPT4ge1xyXG4gICAgICAgICAgZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWRUYWJsZS5mb3JFYWNoKHRhYmxlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gYCR7ZGJ9fCR7dGFibGV9YDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYExpc3RlbmluZyB0byBldmVudCBuYW1lOiAke2V2ZW50TmFtZX1gKTtcclxuICAgICAgICAgICAgdGhpcy5zaWduYWxyU2VydmljZS5zdWJzY3JpYmVUb0V2ZW50KHRoaXMuZ3JwLCBgJHtldmVudE5hbWV9YCwgYGdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIuJHtjYWxsQmFja0Z1bmN0aW9ufWApO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZVJlY2VpdmVkTWVzc2FnZShncm91cDogWkdyb3VwLCByZXN1bHQ6IGFueSwgZXZlbnROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnNvbGUubG9nKGBUaGUgU2lnbmFsciB0cmlnZ2VyIGhhcyBiZWVuIGRldGVjdGVkLiBOb3csIHByb2NlZWQgdG8gdXBkYXRlIHRoZSBjYWNoZSBhbmQgZ3JpZCBkYXRhLmApO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlZFJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcclxuICAgIGNvbnN0IGFjdGlvblR5cGUgPSByZXNwb25zZWRSZXN1bHQuQWN0aW9uO1xyXG4gICAgY29uc3QgcmVzcG9uc2VkUmVzdWx0SWQgPSByZXNwb25zZWRSZXN1bHRbJ0lkJ107XHJcbiAgICBjb25zdCB0ZW1wUGFyYW1zID0gWkNvbXBvbmVudEhlbHBlci5kZWVwQ2xvbmUodGhpcy5wYXJhbXMpO1xyXG4gICAgY29uc3QgY3VycmVudERhdGFDYWNoZUluZm8gPSB0aGlzLmdyaWRTZXJ2aWNlLmdlbmVyYXRlQ2FjaGVJbmZvKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEpO1xyXG4gICAgY29uc3QgY3VycmVudERhdGEgPSBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UuZ2V0SXRlbUJ5S2V5KGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YUNhY2hlSW5mby5vZmZsaW5lRGF0YWJhc2VLZXkpO1xyXG5cclxuICAgIGlmIChjdXJyZW50RGF0YSkge1xyXG4gICAgICB0ZW1wUGFyYW1zLmZpbHRlcnMgPSBgSWQ9JHtyZXNwb25zZWRSZXN1bHRJZH1gO1xyXG5cclxuICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuRGVsZXRlKSB7XHJcbiAgICAgICAgY3VycmVudERhdGEuZGF0YS5kYXRhU2V0ID0gY3VycmVudERhdGEuZGF0YS5kYXRhU2V0LmZpbHRlcihpdGVtID0+IGl0ZW0uSWQgIT09IHBhcnNlSW50KHJlc3BvbnNlZFJlc3VsdElkKSk7XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuICAgICAgICBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UudXBkYXRlSXRlbShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGEpO1xyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBJdGVtIHVwZGF0ZWQ6ICR7Y3VycmVudERhdGF9YCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy53ZWJhcGlTZXJ2aWNlLnBvc3RBcGkodGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCwgdGVtcFBhcmFtcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSkuc3Vic2NyaWJlKGFzeW5jIHJlc3AgPT4ge1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRhdGFiYXNlUmVjb3JkID0gcmVzcC5kYXRhU2V0WzBdO1xyXG5cclxuICAgICAgICAgIGlmIChkYXRhYmFzZVJlY29yZCkge1xyXG4gICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5VcGRhdGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCBpbmRleFRvVXBkYXRlID0gY3VycmVudERhdGEuZGF0YS5kYXRhU2V0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uSWQgPT09IGRhdGFiYXNlUmVjb3JkLklkKTtcclxuICAgICAgICAgICAgICBpZiAoaW5kZXhUb1VwZGF0ZSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgdXBkYXRlZCBuYW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkSXRlbSA9IHsgLi4uY3VycmVudERhdGEuZGF0YS5kYXRhU2V0W2luZGV4VG9VcGRhdGVdLCAuLi5kYXRhYmFzZVJlY29yZCB9O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIG9sZCBpdGVtIHdpdGggdGhlIHVwZGF0ZWQgb25lXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXRbaW5kZXhUb1VwZGF0ZV0gPSB1cGRhdGVkSXRlbTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnVwZGF0ZUl0ZW0oY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSXRlbSB1cGRhdGVkOiAke2N1cnJlbnREYXRhfWApO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkl0ZW0gbm90IGZvdW5kIHdpdGggSUQ6XCIsIGRhdGFiYXNlUmVjb3JkLklkKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5BZGQgJiYgY3VycmVudERhdGEuZ3JpZFN0YXRlLnNraXAgPCAyMCkge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC51bnNoaWZ0KGRhdGFiYXNlUmVjb3JkKTtcclxuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnVwZGF0ZUl0ZW0oY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSXRlbSB1cGRhdGVkOiAke2N1cnJlbnREYXRhfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVW5hYmxlIHRvIGdldCBkYXRhLCByZWZyZXNoIHRoZSB3aG9sZSBncmlkIGRhdGEgZnJvbSBBUElcclxuICAgICAgICAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gVW5hYmxlIHRvIGdldCBmcm9tIGluZGV4ZWREQiBzdHJhaWdodCBnZXQgZnJvbSBBUElcclxuICAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckRhdGFCaW5kZWQoZGF0YSkge1xyXG4gICAgLy8gYWxsb3cgdG8gY2FsbCBiYWNrIHByb2plY3QgcGFnZSBhZnRlciBkYXRhIGJpbmRlZC5cclxuICAgIGxldCBiaW5kZWRWYWx1ZSA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGFbJ0FmdGVyRGF0YUJpbmRlZCddO1xyXG4gICAgaWYgKGJpbmRlZFZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IG1lID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcyk7XHJcbiAgICAgIGxldCBjYWxsRnVuYztcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0gYmluZGVkVmFsdWUubWF0Y2goL1xcYlxcKC4qL2dpKTtcclxuICAgICAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgICAgICBiaW5kZWRWYWx1ZSA9IGJpbmRlZFZhbHVlLnJlcGxhY2UocGFyYW1zWzBdLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmluZGVkVmFsdWUgPSBiaW5kZWRWYWx1ZS5yZXBsYWNlKCdtb2RhbEdyb3VwLicsICdncm91cC4nKTtcclxuICAgICAgICBjYWxsRnVuYyA9IGV2YWwoJ21lLnpncmlkYmluZGluZy4nICsgYmluZGVkVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiRXJyb3Igd2hlbiBnZXRHcm91cFZhbHVlOiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICAgIFwiID4gRXJyb3I6IFwiLFxyXG4gICAgICAgICAgZXJyb3JcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICBjb25zdCBuZXdGdW5jID0gY2FsbEZ1bmMuYmluZChtZSk7XHJcbiAgICAgICAgbmV3RnVuYyhldmVudCwgbWUuemdyaWRiaW5kaW5nLmRhdGEsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJEYXRhKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkLmRhdGEgPSB7IGRhdGE6IFtdLCB0b3RhbDogMCB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGNvbHVtbiBhZ2dyZWdhdGlvbiBmb3IgdGhlIGdpdmVuIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueVtdfSBkYXRhIC0gVGhlIGRhdGEgdG8gYWdncmVnYXRlLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWdncmVnYXRlSGFuZGxpbmcoZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBhZ2dyZWdhdGVDb2x1bW5zID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmFnZ3JlZ2F0ZVR5cGUpO1xyXG5cclxuICAgIGFnZ3JlZ2F0ZUNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IGNvbC5maWVsZDtcclxuICAgICAgY29uc3QgYWdncmVnYXRlVHlwZSA9IGNvbC5hZ2dyZWdhdGVUeXBlLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICBsZXQgX2FnZ3JlZ2F0ZVZhbHVlID0gbnVsbDtcclxuICAgICAgc3dpdGNoIChhZ2dyZWdhdGVUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInRvdGFsXCI6XHJcbiAgICAgICAgY2FzZSBcInN1bVwiOlxyXG4gICAgICAgICAgX2FnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArIG5leHRbZmllbGRdLCAwKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJhdmVyYWdlXCI6XHJcbiAgICAgICAgICBfYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgodG90YWwsIG5leHQpID0+IHRvdGFsICsgbmV4dFtmaWVsZF0sIDApIC8gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiY291bnRcIjpcclxuICAgICAgICAgIF9hZ2dyZWdhdGVWYWx1ZSA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIm1heFwiOlxyXG4gICAgICAgICAgX2FnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHAsIGMpID0+IHBbZmllbGRdID4gY1tmaWVsZF0gPyBwIDogYylbZmllbGRdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIm1pblwiOlxyXG4gICAgICAgICAgX2FnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHAsIGMpID0+IHBbZmllbGRdIDwgY1tmaWVsZF0gPyBwIDogYylbZmllbGRdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbC5hZ2dyZWdhdGVWYWx1ZSA9IF9hZ2dyZWdhdGVWYWx1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgYWdncmVnYXRlIHZhbHVlcyBmb3IgY29sdW1ucyB3aXRoIGFnZ3JlZ2F0ZSB0eXBlcy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWdncmVnYXRlUmVzZXRWYWx1ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFnZ3JlZ2F0ZUNvbHVtbnMgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuYWdncmVnYXRlVHlwZSk7XHJcbiAgICBhZ2dyZWdhdGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29sLmFnZ3JlZ2F0ZVZhbHVlID0gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHBhZ2UgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQYWdlQ2hhbmdlRXZlbnR9IGV2ZW50IC0gVGhlIHBhZ2UgY2hhbmdlIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlKGV2ZW50OiBQYWdlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucGFyYW1zLnBhZ2VObyA9IHRoaXMuZ2V0UGFnZU5vKGV2ZW50LnNraXAsIHRoaXMucGFyYW1zLnBhZ2VTaXplKTtcclxuICAgIHRoaXMuc3RhdGUuc2tpcCA9IGV2ZW50LnNraXA7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50LnBhZ2VDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBzb3J0IGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U29ydERlc2NyaXB0b3JbXX0gc29ydCAtIFRoZSBzb3J0IGRlc2NyaXB0b3IgYXJyYXkuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNvcnRDaGFuZ2Uoc29ydDogU29ydERlc2NyaXB0b3JbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0ID0gc29ydDtcclxuICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcyA9IFtdO1xyXG4gICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycyA9IFtdO1xyXG5cclxuICAgIHNvcnQuZm9yRWFjaCgoZGVzY3JpcHRvcjogU29ydERlc2NyaXB0b3IpID0+IHtcclxuICAgICAgaWYgKGRlc2NyaXB0b3IuZGlyKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycy5wdXNoKGRlc2NyaXB0b3IuZGlyKTtcclxuXHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGRlc2NyaXB0b3IuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW5OYW1lID0gZmllbGQudmFsdWVFeHByICE9PSB1bmRlZmluZWQgPyBmaWVsZC52YWx1ZUV4cHIgOiBkZXNjcmlwdG9yLmZpZWxkO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMucHVzaChzb3J0Q29sdW1uTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudC5zb3J0Q2hhbmdlZCA9IHRydWU7XHJcbiAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgZmlsdGVyIGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55fSBldmVudCAtIFRoZSBmaWx0ZXIgY2hhbmdlIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXJDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJhbXMucGFnZU5vID0gMDtcclxuICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtdO1xyXG4gICAgdGhpcy5zZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCk7XHJcblxyXG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmZpbHRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBldmVudC5maWx0ZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IGl0ZW0uZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBpdGVtLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YVsnRmlsdGVyV2l0aG91dEJyYWNrZXQnXSA/IGAke2ZpZWxkLnZhbHVlRXhwcn1gIDogYCgke2ZpZWxkLnZhbHVlRXhwcn0pYDtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0uZmlsdGVycykge1xyXG4gICAgICAgICAgaXRlbS5maWx0ZXJzLmZvckVhY2goKGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJQYXJhbSA9IHtcclxuICAgICAgICAgICAgICBrZXk6IGZpbHRlci5maWVsZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgb3BzOiB0aGlzLm1hcEZpbHRlck9wZXJhdG9yKGZpbHRlci5vcGVyYXRvciksXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlci52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGZpbHRlclBhcmFtID0ge1xyXG4gICAgICAgICAgICBrZXk6IGZpZWxkLnZhbHVlRXhwciAhPT0gdW5kZWZpbmVkID8gZmlsdGVyVmFsdWUgOiBpdGVtLmZpZWxkLFxyXG4gICAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoaXRlbS5vcGVyYXRvciksXHJcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJQYXJhbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5HcmlkRmlsdGVyQ29uZmlndXJhdGlvbj8uT25DaGFuZ2UpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJHcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZSB0cmlnZ2VyZWRcIik7XHJcbiAgICAgIC8vIFVzZSBzd2l0Y2hNYXAgdG8gaGFuZGxlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uXHJcbiAgICAgIG9mKHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcykucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlclBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgbGV0IGV4cHJlc3Npb24gPSB0aGlzLmZpZWxkLkdyaWRGaWx0ZXJDb25maWd1cmF0aW9uLk9uQ2hhbmdlOyBcclxuICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnJlcGxhY2UoJ21vZGFsR3JvdXAuJywgJ2dyb3VwLicpOyBcclxuICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnJlcGxhY2UoJ2dyb3VwLicsICdncnAuJyk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVuYyA9IGV2YWwoJ3RoaXMuJyArIGV4cHJlc3Npb24pOyAgXHJcbiAgICAgICAgICBjb25zdCBjYWxsRnVuYyA9IGZ1bmMuYmluZCh0aGlzLmdycCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGNhbGxGdW5jKGZpbHRlclBhcmFtcyk7IFxyXG4gICAgICAgIH0pXHJcbiAgICAgICkuc3Vic2NyaWJlKCh1cGRhdGVkRmlsdGVyUGFyYW1zOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHVwZGF0ZWRGaWx0ZXJQYXJhbXMpO1xyXG5cclxuICAgICAgICAvLyB1cGRhdGUgZmlsdGVyUGFyYW1zXHJcbiAgICAgICAgaWYgKHVwZGF0ZWRGaWx0ZXJQYXJhbXMpIHtcclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IHVwZGF0ZWRGaWx0ZXJQYXJhbXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZUV2ZW50LmZpbHRlckNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24uT25DaGFuZ2VcclxuICAgICAgdGhpcy5jaGFuZ2VFdmVudC5maWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRhdGFTdGF0ZUNoYW5nZShzdGF0ZTogRGF0YVN0YXRlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID0gc3RhdGU7XHJcbiAgICB0aGlzLmFnZ3JlZ2F0ZVJlc2V0VmFsdWUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcCBmaWx0ZXIgb3BlcmF0b3IgdG8gaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0b3IgLSBUaGUgZmlsdGVyIG9wZXJhdG9yLlxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIG1hcHBlZCBmaWx0ZXIgb3BlcmF0b3IgdmFsdWUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtYXBGaWx0ZXJPcGVyYXRvcihvcGVyYXRvcjogYW55KSB7XHJcbiAgICBjb25zdCBvcGVyYXRvck1hcHBpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgICBcImVxXCI6IFwiZXFcIixcclxuICAgICAgXCJuZXFcIjogXCJuZXFcIixcclxuICAgICAgXCJsdFwiOiBcImx0XCIsXHJcbiAgICAgIFwibHRlXCI6IFwibHRlXCIsXHJcbiAgICAgIFwiZ3RcIjogXCJndFwiLFxyXG4gICAgICBcImd0ZVwiOiBcImd0ZVwiLFxyXG4gICAgICBcInN0YXJ0c3dpdGhcIjogXCJzdGFydHN3aXRoXCIsXHJcbiAgICAgIFwiZW5kc3dpdGhcIjogXCJlbmRzd2l0aFwiLFxyXG4gICAgICBcImlzbnVsbFwiOiBcImlzbnVsbFwiLFxyXG4gICAgICBcImlzbm90bnVsbFwiOiBcImlzbm90bnVsbFwiLFxyXG4gICAgfTtcclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIFwiY29udGFpbnNcIlxyXG4gICAgaWYgKG9wZXJhdG9yID09PSBcImNvbnRhaW5zXCIgJiYgIXRoaXMuZmllbGRbJ0ZpbHRlckNvbnRhaW5zVXNpbmdFcXVhbCddKSB7XHJcbiAgICAgIHJldHVybiBcImNvbnRhaW5zXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBtYXBwZWQgb3BlcmF0b3Igb3IgZGVmYXVsdCB0byBcIj09XCJcclxuICAgIHJldHVybiBvcGVyYXRvck1hcHBpbmdzW29wZXJhdG9yXSB8fCBcIj09XCI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhZ2VObyhzdGF0ZVNraXA6IG51bWJlciwgc3RhdGVUYWtlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiBzdGF0ZVNraXAgLyBzdGF0ZVRha2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYmVmb3JlR3JpZEdldERhdGEoZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgY29uc29sZS53YXJuKFwiYmVmb3JlRGF0YUJpbmRpbmcgdHJpZ2dlcmVkXCIpO1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVHcmlkR2V0RGF0YSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVEYXRhQmluZGluZyBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVHcmlkR2V0RGF0YShncm91cCwgbWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIGNvbHVtbkZpZWxkID0gZGF0YTogQXJyYXk8WkZpZWxkPixcclxuICAvLyBjb2x1bW5zID0gZ3JpZENvbHVtbnM6IGFueVtdLFxyXG4gIC8vIGdyb3VwID0gZ3JvdXA6IFpHcm91cCxcclxuICAvLyBjb2x1bW5Db25maWd1cmF0aW9ucyA9IGdyaWRTZXR0aW5ncz86IFpHcmlkQ29sdW1uU2V0dGluZ3NbXSxcclxuICAvLyBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMgPSB1c2FibGVDb2x1bW5zPzogYW55W10sXHJcbiAgLy8gZ3JpZEF0dHJpYnV0ZXMgPSBncmlkRmllbGQ/OiBaRmllbGRcclxuXHJcbiAgcHVibGljIHNldENvbHVtbnMoY29sdW1uczogYW55W10pIHtcclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uRmllbGQgPSBjb2x1bW5zO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyh0aGlzLmdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZ1RvQ29uc29sZUZvckRlYnVnKCdnZW5lcmF0ZWQgZ3JpZCBjb2x1bW5zJywgdGhpcy5ncmlkU2V0dGluZyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
844
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBeUMsTUFBTSw4QkFBOEIsQ0FBQztBQUcxSCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBZ0IsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRix5REFBeUQ7QUFDekQsT0FBTyxFQUNMLGdCQUFnQixFQUM2RCxVQUFVLEVBQ3hGLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFNekIsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG9CQUFvQjtJQXdEN0QsWUFDeUIsSUFBSSxFQUFFLHlGQUF5RjtJQUM5RyxhQUE0QixFQUM1QixZQUEwQjtJQUNsQyxtQ0FBbUM7SUFDM0Isc0JBQThDLEVBQzlDLGNBQThCLEVBQzlCLFdBQXlCLEVBQ3pCLGNBQThCO1FBRXRDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVJKLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBRTFCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxD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KioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IERpcmVjdGl2ZSwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0LCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IERhdGFCaW5kaW5nRGlyZWN0aXZlLCBHcmlkQ29tcG9uZW50LCBEYXRhU3RhdGVDaGFuZ2VFdmVudCwgUGFnZUNoYW5nZUV2ZW50IH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWRcIjtcclxuaW1wb3J0IHsgU29ydERlc2NyaXB0b3IsIEZpbHRlckRlc2NyaXB0b3IsIH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1kYXRhLXF1ZXJ5XCI7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7IEdyaWRTZXR0aW5nVHlwZSwgR3JpZFN0YXRlTG9naWNUeXBlLCBaR3JpZFNlcnZpY2UgfSBmcm9tIFwiLi96Z3JpZC5zZXJ2aWNlXCI7XHJcbi8vaW1wb3J0IHsgTWFpblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvbWFpbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgWkNvbXBvbmVudEhlbHBlciwgWkZpZWxkLCBaR3JpZFBvc3RBcGlQYXJhbXMsXHJcbiAgV2ViQXBpU2VydmljZSwgWkdyb3VwLCBUb2FzdFNlcnZpY2UsIE9mZmxpbmVEYXRhYmFzZVNlcnZpY2UsIFNpZ25hbHJTZXJ2aWNlLCBBY3Rpb25UeXBlLCBaR3JpZENvbHVtbkNvbmZpZ3MsIFpHcmlkU2V0dGluZ3MsIExvZ2dpbmdTZXJ2aWNlXHJcbn0gZnJvbSBcIm1taGdsb2JhbC16Y29yZVwiO1xyXG5cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIlt6Z3JpZGJpbmRpbmddXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaR3JpZEJpbmRpbmdEaXJlY3RpdmUgZXh0ZW5kcyBEYXRhQmluZGluZ0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGNoYW5nZUV2ZW50ID0ge1xyXG4gICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgZmlsdGVyQ2hhbmdlZDogZmFsc2UsXHJcbiAgICBzb3J0Q2hhbmdlZDogZmFsc2VcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHpncmlkYmluZGluZzoge1xyXG4gICAgZGF0YTogWkZpZWxkO1xyXG4gICAgZ3JvdXA6IFpHcm91cDtcclxuICAgIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zO1xyXG4gICAgZ3JpZFN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGdyaWRTZXR0aW5nOiBaR3JpZFNldHRpbmdzO1xyXG4gIH07XHJcblxyXG4gIC8vc3RhdGU6IFN0YXRlID0ge1xyXG4gIC8vICBza2lwOiAwLFxyXG4gIC8vICB0YWtlOiAxMCxcclxuICAvL307XHJcblxyXG4gIC8vZ3JpZENvbHVtbnM6IGFueVtdID0gW107XHJcblxyXG4gIC8vdXNhYmxlQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgcmVzb3VyY2VVUkwgPSBudWxsO1xyXG5cclxuICBwYWdpbmF0aW9uQXBpUG9zdFVybCA9IG51bGw7XHJcblxyXG4gIGRhdGFTb3VyY2UgPSBudWxsO1xyXG5cclxuICBnZXQgZ3JpZFNldHRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmc7XHJcbiAgfVxyXG4gIHNldCBncmlkU2V0dGluZyh2YWx1ZSkge1xyXG4gICAgdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmcgPSB2YWx1ZTtcclxuICB9XHJcbiAgZ2V0IGZpZWxkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmRhdGE7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdyaWRTdWJqZWN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhcmFtcygpOiBaR3JpZFBvc3RBcGlQYXJhbXMge1xyXG4gICAgcmV0dXJuIHRoaXMuemdyaWRiaW5kaW5nLnBhcmFtcztcclxuICB9XHJcblxyXG4gIGdldCBnZXREYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5kYXRhO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KEdyaWRDb21wb25lbnQpIGdyaWQsIC8vIEluamVjdGluZyBHcmlkQ29tcG9uZW50IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2NvcGUgYW5kIGNvbnRleHQgb2YgdGhlIEdyaWRDb21wb25lbnQuXHJcbiAgICBwcml2YXRlIHdlYmFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgLy9wcml2YXRlIG1haW5TZXJ2aWNlOiBNYWluU2VydmljZSxcclxuICAgIHByaXZhdGUgb2ZmbGluZURhdGFiYXNlU2VydmljZTogT2ZmbGluZURhdGFiYXNlU2VydmljZSxcclxuICAgIHByaXZhdGUgc2lnbmFsclNlcnZpY2U6IFNpZ25hbHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBncmlkU2VydmljZTogWkdyaWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2dnaW5nU2VydmljZTogTG9nZ2luZ1NlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKGdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5maWVsZC5QYWdlU2l6ZSB8fCAyMDtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZmllbGQuRGF0YVNvdXJjZSA/PyBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMucmVzb3VyY2VVUkwgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5SZXNvdXJjZVVSTCxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnJlc291cmNlVVJMKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5OYW1lICE9PSBcIkFjdGl2aXR5TG9nR3JpZFwiKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgIFwiTm8gaW5pdGlhbGlzZSBmb3IgRmllbGQuUmVzb3VyY2VVUkw6IFwiLFxyXG4gICAgICAgICAgICB0aGlzLmZpZWxkLlJlc291cmNlVVJMXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2V0UmVzb3VyY2VVcmwodGhpcy5yZXNvdXJjZVVSTCk7XHJcblxyXG4gICAgICB0aGlzLnNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5EaXNhYmxlR2VuZXJhdGVDb2x1bW5CeUZvcm0pIHtcclxuICAgICAgY29uc3QgY29sdW1uRmllbGRzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZmllbGQuQ29sdW1uRmllbGRzLCB0aGlzLmdycCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5GaWVsZHMpKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb2x1bW5zKGNvbHVtbkZpZWxkcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnN1YnNjcmliZUNhY2hlRGF0YUNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVzb3VyY2VVcmwocmVzb3VyY2VVcmw6IHN0cmluZykge1xyXG4gICAgY29uc3QgYXJyYXkgPSByZXNvdXJjZVVybC5zcGxpdChcIi9hcGkvXCIpO1xyXG4gICAgaWYgKCEhYXJyYXlbMV0pIHtcclxuICAgICAgYXJyYXlbMV0gPSBcIlBhZ2VcIiArIGFycmF5WzFdO1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsID0gYXJyYXkuam9pbihcIi9hcGkvXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5yZXNvdXJjZVVSTC5zcGxpdChcIi9cIik7XHJcbiAgICAgIGFyclthcnIubGVuZ3RoIC0gMl0gPSBcIlBhZ2VcIiArIGFyclthcnIubGVuZ3RoIC0gMl07XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwgPSBhcnIuam9pbihcIi9cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKSB7XHJcbiAgICAvLyBVc2UgZmllbGQgb3duIHJlZmVyZW5jZUlkIGlmIGF2YWlsYWJsZVxyXG4gICAgY29uc3QgcmVmSWQgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlSWQoKSB8fCB0aGlzLmdycC5yZWZlcmVuY2VJZDtcclxuICAgIGNvbnN0IHJlZkZpZWxkID0gdGhpcy5maWVsZC5SZWZlcmVuY2VGaWVsZCB8fCB0aGlzLmdycC5wYXJlbnRSZWZlcmVuY2VGaWVsZDtcclxuICAgIGlmIChyZWZJZCAmJiByZWZGaWVsZCkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHtcclxuICAgICAgICBrZXk6IHJlZkZpZWxkLFxyXG4gICAgICAgIG9wczogXCI9XCIsXHJcbiAgICAgICAgdmFsdWU6IHJlZklkLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWVsZFJlZmVyZW5jZUlkKCkge1xyXG4gICAgbGV0IGZpZWxkUmVmZXJlbmNlSWQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuUmVmZXJlbmNlSWQpIHtcclxuICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLlJlZmVyZW5jZUlkLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRSZWZlcmVuY2VJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZUdyaWRDb2x1bW5zKCkge1xyXG4gICAgY29uc3QgY29sdW1uRmllbGRzJDogT2JzZXJ2YWJsZTxhbnk+ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcyxcclxuICAgICAgdGhpcy5ncnBcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGNvbHVtbkZpZWxkcyQpIHtcclxuICAgICAgY29sdW1uRmllbGRzJC5waXBlKFxyXG4gICAgICAgIHRhcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbHVtbnNDb25maWcgPSBudWxsO1xyXG5cclxuICAgICAgICAgIC8vIE5vdGU6IE9idGFpbmluZyB0aGUgZ3JpZCBzdGF0ZSBpcyBkdXJpbmcgaW5pdGlhbGl6YXRpb247IGlmIG5vdCwgaXQgd2lsbCBwcmV2ZW50IHRoZSBncmlkIGZyb20gbG9hZGluZy5cclxuICAgICAgICAgIGNvbnN0IHNldHRpbmdDYWNoZU5hbWUgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUNhY2hlU3RvcmFnZUtleShHcmlkU2V0dGluZ1R5cGUuU2F2ZWRTZXR0aW5nLCB0aGlzLmZpZWxkKTtcclxuICAgICAgICAgIGNvbnN0IHNldHRpbmdDYWNoZVZhbHVlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzZXR0aW5nQ2FjaGVOYW1lKTtcclxuICAgICAgICAgIGlmIChzZXR0aW5nQ2FjaGVWYWx1ZSkge1xyXG4gICAgICAgICAgICBjb2x1bW5zQ29uZmlnID0gKEpTT04ucGFyc2Uoc2V0dGluZ0NhY2hlVmFsdWUpIGFzIFpHcmlkU2V0dGluZ3MpLmNvbHVtbkNvbmZpZ3VyYXRpb25zO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZ3JpZFNldHRpbmcgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZ3JpZFNldHRpbmcsIC8vIFByZXNlcnZlIGV4aXN0aW5nIHByb3BlcnRpZXNcclxuICAgICAgICAgICAgY29sdW1uRmllbGQ6IGRhdGEsXHJcbiAgICAgICAgICAgIGdyb3VwOiB0aGlzLnpncmlkYmluZGluZy5ncm91cCxcclxuICAgICAgICAgICAgY29sdW1uQ29uZmlndXJhdGlvbnM6IGNvbHVtbnNDb25maWdcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zKHRoaXMuZ3JpZFNldHRpbmcpOyBcclxuICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UubG9nVG9Db25zb2xlRm9yRGVidWcoJ2dlbmVyYXRlZCBncmlkIGNvbHVtbnMnLCB0aGlzLmdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlclBhcmFtc0NvbHVtbnMoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0RmlsdGVyKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlclBhcmFtcygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRTb3J0aW5nKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEdyYW50VHlwZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRIaWRkZW5Db2x1bW4odGhpcy5ncmlkU2V0dGluZy5jb2x1bW5Db25maWd1cmF0aW9ucyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5wYXJhbXMucmVmZXJJZCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2VJZCgpIHx8IHRoaXMuZ3JwLnJlZmVyZW5jZUlkIHx8IG51bGw7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignRmFpbCB0byBnZW5lcmF0ZSBncmlkIGNvbHVtbiBmaWVsZHMuJyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZmllbGQuQ29sdW1uRmllbGRzKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5ncnApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNraXBMb2FkUmVzb3VyY2VVUkxEYXRhKHNldHRpbmdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSA9ICFzZXR0aW5nVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIHRpdGxlIG9mIGEgY29sdW1uIGluIHRoZSBncmlkIHNldHRpbmcgYmFzZWQgb24gaXRzIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xOYW1lIC0gVGhlIG5ldyB0aXRsZSBmb3IgdGhlIGNvbHVtbi5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Q29sdW1uTmFtZShjb2xWYWx1ZTogc3RyaW5nLCBjb2xOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIEZpbmQgdGhlIGNvbHVtbiB3aXRoIHRoZSBtYXRjaGluZyBjb2xWYWx1ZS5cclxuICAgIGNvbnN0IGNvbHVtblRvVXBkYXRlID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoZmllbGQgPT4gZmllbGQuVmFsdWUgPT09IGNvbFZhbHVlKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgY29sdW1uIGlzIGZvdW5kLCB1cGRhdGUgaXRzIHRpdGxlIHByb3BlcnR5IHdpdGggY29sTmFtZS5cclxuICAgIGlmIChjb2x1bW5Ub1VwZGF0ZSkge1xyXG4gICAgICBjb2x1bW5Ub1VwZGF0ZS50aXRsZSA9IGNvbE5hbWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZpc2liaWxpdHkgb2YgYSBjb2x1bW4gaW4gdGhlIGdyaWQgYmFzZWQgb24gaXRzIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gdG8gc2V0IHZpc2liaWxpdHkgZm9yLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNWaXNpYmxlIC0gV2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSB2aXNpYmxlICh0cnVlKSBvciBoaWRkZW4gKGZhbHNlKS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Q29sdW1uVmlzaWJsZShjb2xWYWx1ZTogc3RyaW5nLCBpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIC8vIEZpbmQgdGhlIGNvbHVtbiB3aXRoIHRoZSBtYXRjaGluZyBjb2xWYWx1ZS5cclxuICAgIGNvbnN0IGNvbHVtblRvVXBkYXRlID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoZmllbGQgPT4gZmllbGQuVmFsdWUgPT09IGNvbFZhbHVlKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgY29sdW1uIGlzIGZvdW5kLCB1cGRhdGUgaXRzICdoaWRkZW4nIHByb3BlcnR5IGJhc2VkIG9uICdpc1Zpc2libGUnLlxyXG4gICAgaWYgKGNvbHVtblRvVXBkYXRlKSB7XHJcbiAgICAgIGNvbHVtblRvVXBkYXRlLmhpZGRlbiA9ICFpc1Zpc2libGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBmaWx0ZXIgcGFyYW1ldGVycyBmb3IgY29sdW1ucyBhbmQgc2V0IHRoZW0gaW4gdGhlICdwYXJhbXMnIG9iamVjdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyUGFyYW1zQ29sdW1ucygpIHtcclxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSB0byBzdG9yZSBjb2x1bW4gZmllbGRzLlxyXG4gICAgY29uc3QgY29sRmllbGRzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBncmlkIGNvbHVtbnMgdG8gYnVpbGQgY29sdW1uIGZpZWxkIHN0cmluZ3MuXHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4udmFsdWVFeHByKSB7XHJcbiAgICAgICAgLy8gSWYgJ3ZhbHVlRXhwcicgZXhpc3RzLCB1c2UgaXQgYXMgYW4gYWxpYXMgZm9yIHRoZSBmaWVsZC5cclxuICAgICAgICBjb2xGaWVsZHMucHVzaChjb2x1bW4udmFsdWVFeHByICsgXCIgYXMgXCIgKyBjb2x1bW4uZmllbGQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKGNvbHVtbi5maWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIENoZWNrIGlmICdJZCcgaXMgaW4gdGhlIGNvbHVtbiBmaWVsZHM7IGlmIG5vdCwgYWRkIGl0LlxyXG4gICAgaWYgKGNvbEZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmIChjb2xGaWVsZHMuaW5kZXhPZihcIklkXCIpID09PSAtMSkge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKFwiSWRcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gYXJyYXkgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIGdlbmVyYXRlZCBjb2x1bW4gZmllbGRzLlxyXG4gICAgY29uc3QgdG1wR3JpZENvbHVtbjogYW55W10gPSBbXTtcclxuICAgIHRtcEdyaWRDb2x1bW4ucHVzaChjb2xGaWVsZHMuam9pbihcIixcIikpO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGFyZSBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMgaW4gdGhlIHNldHRpbmcsIGFkZCB0aGVtIHRvIHRoZSBhcnJheS5cclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdlbmVyYXRlSGlkZGVuQ29sdW1ucz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0bXBHcmlkQ29sdW1uLnB1c2godGhpcy5ncmlkU2V0dGluZy5nZW5lcmF0ZUhpZGRlbkNvbHVtbnMuam9pbihcIixcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNldCB0aGUgJ3BhcmFtcy5jb2x1bW5zJyBwcm9wZXJ0eSB3aXRoIHRoZSBjb25jYXRlbmF0ZWQgY29sdW1uIGZpZWxkcy5cclxuICAgIHRoaXMucGFyYW1zLmNvbHVtbnMgPSB0bXBHcmlkQ29sdW1uLmpvaW4oXCIsXCIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSAncGFyYW1zLmZpbHRlcnMnIHByb3BlcnR5IGJhc2VkIG9uIHRoZSAnZmllbGQuRmlsdGVycycgcHJvcGVydHkuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlcigpIHtcclxuICAgIGlmICh0aGlzLnBhcmFtcy5maWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycykge1xyXG4gICAgICAvLyBDb21iaW5lICdwYXJhbXMuZmlsdGVycycgYW5kICdmaWVsZC5GaWx0ZXJzJyB1c2luZyAnJiYnIGlmIGJvdGggZXhpc3QuIFxyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gYCR7dGhpcy5wYXJhbXMuZmlsdGVyc30gJiYgJHt0aGlzLmZpZWxkLkZpbHRlcnN9YDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCF0aGlzLnBhcmFtcy5maWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycykge1xyXG4gICAgICAvLyBVc2UgJ2ZpZWxkLkZpbHRlcnMnIGRpcmVjdGx5IGlmICdwYXJhbXMuZmlsdGVycycgZG9lc24ndCBleGlzdC5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IHRoaXMuZmllbGQuRmlsdGVycztcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiAnZmllbGQuRmlsdGVycycgY29udGFpbnMgcmVmZXJlbmNlcyB0byAnZ3JvdXAuJyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggYWN0dWFsIHZhbHVlcy5cclxuICAgIGlmICh0aGlzLmZpZWxkLkZpbHRlcnMgJiYgdGhpcy5maWVsZC5GaWx0ZXJzLnNwbGl0KFwiIFwiKS5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50LnRyaW0oKS5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJLZXlWYWxQYWlycyA9IHRoaXMuZmllbGQuRmlsdGVycy5zcGxpdChcIiBcIik7XHJcbiAgICAgIGNvbnN0IGdycFZhbHVlcyA9IGZpbHRlcktleVZhbFBhaXJzLmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChcImdyb3VwLlwiKSk7XHJcblxyXG4gICAgICBncnBWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsVmFsID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHZhbCwgdGhpcy5ncnApO1xyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlcnMgPSB0aGlzLnBhcmFtcy5maWx0ZXJzLnJlcGxhY2UodmFsLCBhY3R1YWxWYWwpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZmlsdGVyIHBhcmFtZXRlcnMgaW4gdGhlICdwYXJhbXMuZmlsdGVyUGFyYW1zJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGRbJ0ZpbHRlclBhcmFtcyddJy4gZmlsdGVyUGFyYW1zID09PSB1c2VkIGZvciB0aGUgaW5wdXQgaW4gdGhlIGNvbHVtbiBmaWx0ZXIgYXQgdGhlIFVJLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJQYXJhbXMoKSB7IFxyXG4gICAgY29uc3QgZmlsdGVyUGFyYW1zID0gdGhpcy5maWVsZFsnRmlsdGVyUGFyYW1zJ107XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBmaWx0ZXIgcGFyYW1ldGVycyBpZiB1bmRlZmluZWQuXHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLmZpbHRlclBhcmFtcykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgIGlmIChmaWx0ZXJQYXJhbXMuc3RhcnRzV2l0aChcImdyb3VwLlwiKSkge1xyXG4gICAgICAgIC8vIElmICdmaWx0ZXJQYXJhbXMnIHN0YXJ0cyB3aXRoIFwiZ3JvdXAuXCIsIGV4dGVuZCB0aGUgZXhpc3RpbmcgYXJyYXkuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW1xyXG4gICAgICAgICAgLi4udGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLFxyXG4gICAgICAgICAgLi4uWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGZpbHRlclBhcmFtcywgdGhpcy5ncnApXHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBJZiAnZmlsdGVyUGFyYW1zJyBkb2VzIG5vdCBzdGFydCB3aXRoIFwiZ3JvdXAuXCIsIHVzZSBpdCBkaXJlY3RseS5cclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXHJcbiAgICAgICAgICAuLi50aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMsXHJcbiAgICAgICAgICBmaWx0ZXJQYXJhbXNcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGNvbHVtbiBmaWx0ZXJzIGluIHRoZSBncmlkIHN0YXRlIGFuZCBhcHBlbmQgdG8gZmlsdGVycGFyYW0gXHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU/LmZpbHRlcj8uZmlsdGVycykge1xyXG4gICAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5maWx0ZXI/LmZpbHRlcnM/LmZvckVhY2goKGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlclBhcmFtID0ge1xyXG4gICAgICAgICAga2V5OiBmaWx0ZXIuZmllbGQgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgb3BzOiB0aGlzLm1hcEZpbHRlck9wZXJhdG9yKGZpbHRlci5vcGVyYXRvciksXHJcbiAgICAgICAgICB2YWx1ZTogZmlsdGVyLnZhbHVlID09PSBudWxsID8gXCJcIiA6IGZpbHRlci52YWx1ZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIENoZWNrIGlmIGEgZmlsdGVyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIGtleSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICBjb25zdCBleGlzdGluZ1BhcmFtID0gdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLmZpbmQoKHBhcmFtKSA9PiBwYXJhbS5rZXkgPT09IGZpbHRlclBhcmFtLmtleSk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nUGFyYW0pIHtcclxuICAgICAgICAgIC8vIElmIGEgZmlsdGVyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIGtleSBleGlzdHMsIHVwZGF0ZSBpdHMgdmFsdWUuXHJcbiAgICAgICAgICBleGlzdGluZ1BhcmFtLnZhbHVlID0gZmlsdGVyUGFyYW0udmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIElmIG5vIGZpbHRlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBrZXksIGFkZCBpdCB0byB0aGUgZmlsdGVyIHBhcmFtZXRlcnMuXHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJQYXJhbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgc29ydGluZyBvcmRlciBpbiB0aGUgJ3BhcmFtcy5zb3J0T3JkZXInIHByb3BlcnR5IGJhc2VkIG9uICdmaWVsZC5Tb3J0T3JkZXInLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRTb3J0aW5nKCkge1xyXG4gICAgY29uc3Qgc29ydE9yZGVyID0gdGhpcy5maWVsZC5Tb3J0T3JkZXI7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ3NvcnRPcmRlcicgaXMgZGVmaW5lZCBhbmQgc3RhcnRzIHdpdGggXCJncm91cC5cIi5cclxuICAgIGlmIChzb3J0T3JkZXIgJiYgc29ydE9yZGVyLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVyID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHNvcnRPcmRlciwgdGhpcy5ncnApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIElmICdzb3J0T3JkZXInIGlzIG5vdCBkZWZpbmVkIG9yIGRvZXNuJ3Qgc3RhcnQgd2l0aCBcImdyb3VwLlwiLCB1c2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlciA9IHNvcnRPcmRlcjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBzb3J0IHBhcmFtZXRlcnMgaWYgdW5kZWZpbmVkLlxyXG4gICAgaWYgKCF0aGlzLnBhcmFtcy5zb3J0T3JkZXJzKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnMgPSBbXTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5zb3J0KSB7XHJcbiAgICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNvcnQuZm9yRWFjaCgoZGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmRpcikge1xyXG4gICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGRlc2NyaXB0b3IuZmllbGQpO1xyXG4gICAgICAgICAgY29uc3Qgc29ydENvbHVtbk5hbWUgPSBmaWVsZC52YWx1ZUV4cHIgIT09IHVuZGVmaW5lZCA/IGZpZWxkLnZhbHVlRXhwciA6IGRlc2NyaXB0b3IuZmllbGQ7XHJcblxyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYSBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuXHJcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NvcnRDb2x1bW5JbmRleCA9IHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcy5maW5kSW5kZXgoKG5hbWUpID0+IG5hbWUgPT09IHNvcnRDb2x1bW5OYW1lKTtcclxuXHJcbiAgICAgICAgICBpZiAoZXhpc3RpbmdTb3J0Q29sdW1uSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIElmIGEgc29ydCBjb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXN0cywgdXBkYXRlIGl0cyBzb3J0IG9yZGVyLlxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzW2V4aXN0aW5nU29ydENvbHVtbkluZGV4XSA9IGRlc2NyaXB0b3IuZGlyO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSWYgbm8gc29ydCBjb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lLCBhZGQgaXQgdG8gdGhlIHNvcnQgY29sdW1ucyBhbmQgc29ydCBvcmRlcnMuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcy5wdXNoKHNvcnRDb2x1bW5OYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycy5wdXNoKGRlc2NyaXB0b3IuZGlyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBncmFudCB0eXBlIGluIHRoZSAncGFyYW1zLmdyYW50VHlwZScgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkLkdyYW50VHlwZScuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEdyYW50VHlwZSgpIHtcclxuICAgIGNvbnN0IGdyYW50VHlwZSA9IHRoaXMuZmllbGQuR3JhbnRUeXBlO1xyXG5cclxuICAgIC8vIENoZWNrIGlmICdncmFudFR5cGUnIGlzIGRlZmluZWQuXHJcbiAgICBpZiAoZ3JhbnRUeXBlKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLmdyYW50VHlwZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShncmFudFR5cGUudG9TdHJpbmcoKSwgdGhpcy5ncnApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSAnaGlkZGVuJyBwcm9wZXJ0eSBmb3IgY29sdW1ucyBpbiAnZ3JpZFNldHRpbmcnIGJhc2VkIG9uICdjb2x1bW5Db25maWdzJy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7WkdyaWRDb2x1bW5Db25maWdzW119IGNvbHVtbkNvbmZpZ3MgLSBUaGUgY29sdW1uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRIaWRkZW5Db2x1bW4oY29sdW1uQ29uZmlnczogWkdyaWRDb2x1bW5Db25maWdzW10pIHtcclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMgJiYgY29sdW1uQ29uZmlncykge1xyXG4gICAgICAvLyBGaWx0ZXIgb3V0IGhpZGRlbiBjb2x1bW5zIGluICdjb2x1bW5Db25maWdzJy5cclxuICAgICAgY29uc3QgaGlkZGVuQ29sdW1ucyA9IGNvbHVtbkNvbmZpZ3MuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uaGlkZGVuID09PSB0cnVlKTtcclxuXHJcbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBoaWRkZW4gY29sdW1ucyBhbmQgdXBkYXRlICdncmlkU2V0dGluZycgYWNjb3JkaW5nbHkuXHJcbiAgICAgIGhpZGRlbkNvbHVtbnMuZm9yRWFjaChoaWRkZW5Db2x1bW4gPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGMgPT4gYy5maWVsZCA9PT0gaGlkZGVuQ29sdW1uLmZpZWxkKTtcclxuICAgICAgICBpZiAoY29sdW1uKSB7XHJcbiAgICAgICAgICBjb2x1bW4uaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgZGF0YSBmb3IgZGF0YSBiaW5kaW5nLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBza2lwVXNlQ2FjaGUgLSBXaGV0aGVyIHRvIHNraXAgdXNpbmcgY2FjaGUgZm9yIGRhdGEgcmV0cmlldmFsLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXREYXRhQmluZGluZyhza2lwVXNlQ2FjaGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBjYWNoZUluZm8gPSB0aGlzLnpncmlkYmluZGluZy5kYXRhLkNhY2hlSW5mbztcclxuXHJcbiAgICBpZiAoIWNhY2hlSW5mbyB8fCBza2lwVXNlQ2FjaGUpIHtcclxuICAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNhY2hlSW5mbykge1xyXG4gICAgICBjb25zdCBncmlkU3RhdGVMb2dpYyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlTG9naWModGhpcy5maWVsZCk7XHJcbiAgICAgIGlmIChncmlkU3RhdGVMb2dpYyA9PT0gR3JpZFN0YXRlTG9naWNUeXBlLlNldHRpbmdPbmx5KSB7XHJcbiAgICAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5jaGFuZ2VFdmVudC5wYWdlQ2hhbmdlZCAmJiAhdGhpcy5jaGFuZ2VFdmVudC5zb3J0Q2hhbmdlZCAmJiAhdGhpcy5jaGFuZ2VFdmVudC5maWx0ZXJDaGFuZ2VkKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRhQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLmdldEl0ZW1CeUtleShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGFDYWNoZUluZm8ub2ZmbGluZURhdGFiYXNlS2V5KTtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShyZXN1bHQuZGF0YSwgdHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgZ3JpZCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHcmlkRGF0YSgpIHtcclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIGlmICghdGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignR3JpZCBwYWdpbmF0aW9uIEFQSSBVUkwgaXMgdW5kZWZpbmVkLicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc3RhdGVTa2lwID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPyB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5za2lwIDogdGhpcy5zdGF0ZS5za2lwO1xyXG4gICAgICBjb25zdCBzdGF0ZVRha2UgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA/IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnRha2UgOiB0aGlzLnN0YXRlLnRha2U7XHJcblxyXG4gICAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSB0aGlzLmdldFBhZ2VObyhzdGF0ZVNraXAsIHN0YXRlVGFrZSk7XHJcbiAgICAgIHRoaXMucGFyYW1zLnBhZ2VTaXplID0gc3RhdGVUYWtlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZmllbGQuRXh0ZXJuYWxQYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgLy8gRm9yIFBPU1QgbWV0aG9kIFBhZ2UgV2ViQVBJIFxyXG4gICAgICAgIHRoaXMud2ViYXBpU2VydmljZVxyXG4gICAgICAgICAgLnBvc3RBcGkodGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCwgdGhpcy5wYXJhbXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlc3ApID0+IHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShyZXNwKSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KFwiRXJyb3Igb2NjdXIgaW4gbG9hZGluZyB0aGUgZGF0YVwiLCBcIm1pZGRsZVwiLCBmYWxzZSwgMTUwMCwgXCJkYW5nZXJcIik7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gRm9yIEdFVCBtZXRob2RcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2VcclxuICAgICAgICAgIC5nZXRBcGkodGhpcy5yZXNvdXJjZVVSTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgdG90YWxDb3VudCA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcC5kYXRhU2V0KSB7XHJcbiAgICAgICAgICAgICAgZGF0YSA9IHJlc3AuZGF0YVNldDtcclxuICAgICAgICAgICAgICB0b3RhbENvdW50ID0gcmVzcC50b3RhbENvdW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRhdGEgPSByZXNwO1xyXG4gICAgICAgICAgICAgIHRvdGFsQ291bnQgPSByZXNwLmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKHsgZGF0YVNldDogZGF0YSwgdG90YWxDb3VudDogdG90YWxDb3VudCB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc3QgZGF0YVNldCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLkRhdGFTb3VyY2UsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGFTZXQ7XHJcbiAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoZGF0YTogYW55LCBza2lwQ2FjaGVEYXRhPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5hZ2dyZWdhdGVIYW5kbGluZyhkYXRhLmRhdGFTZXQpO1xyXG4gICAgdGhpcy5ncmlkLmRhdGEgPSB7IGRhdGE6IGRhdGEuZGF0YVNldCwgdG90YWw6IGRhdGEudG90YWxDb3VudCB9O1xyXG4gICAgaWYgKCFza2lwQ2FjaGVEYXRhKSB7XHJcbiAgICAgIGNvbnN0IGdyaWRTdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuICAgICAgaWYgKGdyaWRTdGF0ZUxvZ2ljID09PSBHcmlkU3RhdGVMb2dpY1R5cGUuRGF0YUNhY2hlT25seSB8fCBncmlkU3RhdGVMb2dpYyA9PT0gR3JpZFN0YXRlTG9naWNUeXBlLlNldHRpbmdBbmREYXRhQ2FjaGUpIHtcclxuICAgICAgICB0aGlzLmNhY2hlR3JpZERhdGEoKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZUNhY2hlRGF0YUNoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYWZ0ZXJEYXRhQmluZGVkKGRhdGEpO1xyXG4gICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2hhbmdlRXZlbnRGbGFnKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudCA9IHtcclxuICAgICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgICAgc29ydENoYW5nZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNhY2hlR3JpZERhdGEoKSB7XHJcbiAgICBjb25zdCBtZSA9IHRoaXM7XHJcbiAgICBjb25zdCBncmlkU3RhdGUgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZTtcclxuICAgIGNvbnN0IGdyaWREYXRhID0gdGhpcy5ncmlkPy5kYXRhIHx8IG51bGw7XHJcblxyXG4gICAgaWYgKCFncmlkRGF0YVsnZGF0YSddKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjYWNoZUluZm8gPSB0aGlzLnpncmlkYmluZGluZy5kYXRhLkNhY2hlSW5mbztcclxuXHJcbiAgICBpZiAoY2FjaGVJbmZvICYmICFjYWNoZUluZm8uRGlzYWJsZUNhY2hlRGF0YSkge1xyXG4gICAgICAvLyBrZWVwIG9yaWdpbmFsRGF0YSBcclxuICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLmdldEl0ZW1CeUtleShvcmlnaW5hbERhdGFDYWNoZUluZm8sIG9yaWdpbmFsRGF0YUNhY2hlSW5mby5vZmZsaW5lRGF0YWJhc2VLZXkpO1xyXG4gICAgICBsZXQgdXBkYXRlZERhdGEgPSBbLi4uZ3JpZERhdGFbJ2RhdGEnXV07XHJcbiAgICAgIGxldCBza2lwTGlzdCA9IFtncmlkU3RhdGUuc2tpcF07XHJcbiAgICAgIGxldCBjdXJyZW50R3JpZFNraXAgPSBncmlkU3RhdGUuc2tpcDtcclxuXHJcbiAgICAgIGlmIChvcmlnaW5hbERhdGFDYWNoZUluZm8uYXBwZW5kUGFnaW5hdGlvbkRhdGEpIHtcclxuICAgICAgICBpZiAocmVzdWx0ICYmICFyZXN1bHQuc2tpcExpc3QuaW5jbHVkZXMoY3VycmVudEdyaWRTa2lwKSkge1xyXG4gICAgICAgICAgdXBkYXRlZERhdGEgPSBbLi4ucmVzdWx0LmRhdGEuZGF0YVNldCwgLi4uZ3JpZERhdGFbJ2RhdGEnXV07XHJcbiAgICAgICAgICBza2lwTGlzdCA9IFsuLi5yZXN1bHQuc2tpcExpc3QsIC4uLnNraXBMaXN0XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNhY2hlR3JpZERhdGEgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZGF0YVNldDogdXBkYXRlZERhdGEsXHJcbiAgICAgICAgICB0b3RhbENvdW50OiBncmlkRGF0YVsndG90YWwnXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ3JpZFN0YXRlOiBncmlkU3RhdGUsXHJcbiAgICAgICAgc2tpcExpc3Q6IHNraXBMaXN0LFxyXG4gICAgICAgIGNhY2hlRHVyYXRpb246IGNhY2hlSW5mby5DYWNoZUR1cmF0aW9uXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5hZGRJdGVtKG9yaWdpbmFsRGF0YUNhY2hlSW5mbywgY2FjaGVHcmlkRGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1wiRmVhdHVyZURldmVsb3BtZW50fENvbXBldGVuY3lcIiBcclxuICBwcml2YXRlIGFzeW5jIHN1YnNjcmliZUNhY2hlRGF0YUNoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjYWNoZUluZm8gPSB0aGlzLnpncmlkYmluZGluZy5kYXRhLkNhY2hlSW5mbztcclxuXHJcbiAgICBpZiAoY2FjaGVJbmZvICYmICFjYWNoZUluZm8uRGlzYWJsZUNhY2hlRGF0YSkge1xyXG4gICAgICAvLyBjYW5ub3QgdXNlIG1haW4gc2VydmljZSBoZXJlLiB3aWxsIGdldCBjaXJjdWxhciBlcnJvciB3aGVuIGJ1aWxkIGxpYlxyXG4gICAgICAvL3RoaXMubWFpblNlcnZpY2Uuam9pblByb2plY3RTaWduYWxSKCk7XHJcblxyXG4gICAgICBjb25zdCBjYWxsQmFja0Z1bmN0aW9uID0gYCR7Y2FjaGVJbmZvLk5hbWV9X2hhbmRsZVJlY2VpdmVkTWVzc2FnZWA7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgYW5kIGJpbmQgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYmFjayBmb3IgdGhlIGdyaWQgaW4gdGhlIGdyb3VwIHRyaWdnZXIgYnkgc2lnbmFsUi5cclxuICAgICAgaWYgKCF0aGlzLmdycC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyKSB7XHJcbiAgICAgICAgdGhpcy5ncnAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlciA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXJbY2FsbEJhY2tGdW5jdGlvbl0gPSB0aGlzLmhhbmRsZVJlY2VpdmVkTWVzc2FnZS5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgY29uc3QgZ2VuZXJhdGVkQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAgICAgaWYgKGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkRGF0YWJhc2UgJiYgZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWRUYWJsZSkge1xyXG4gICAgICAgIGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkRGF0YWJhc2UuZm9yRWFjaChkYiA9PiB7XHJcbiAgICAgICAgICBnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZFRhYmxlLmZvckVhY2godGFibGUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBgJHtkYn18JHt0YWJsZX1gO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTGlzdGVuaW5nIHRvIGV2ZW50IG5hbWU6ICR7ZXZlbnROYW1lfWApO1xyXG4gICAgICAgICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLnN1YnNjcmliZVRvRXZlbnQodGhpcy5ncnAsIGAke2V2ZW50TmFtZX1gLCBgZ3JvdXAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlci4ke2NhbGxCYWNrRnVuY3Rpb259YCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlUmVjZWl2ZWRNZXNzYWdlKGdyb3VwOiBaR3JvdXAsIHJlc3VsdDogYW55LCBldmVudE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc29sZS5sb2coYFRoZSBTaWduYWxyIHRyaWdnZXIgaGFzIGJlZW4gZGV0ZWN0ZWQuIE5vdywgcHJvY2VlZCB0byB1cGRhdGUgdGhlIGNhY2hlIGFuZCBncmlkIGRhdGEuYCk7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2VkUmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xyXG4gICAgY29uc3QgYWN0aW9uVHlwZSA9IHJlc3BvbnNlZFJlc3VsdC5BY3Rpb247XHJcbiAgICBjb25zdCByZXNwb25zZWRSZXN1bHRJZCA9IHJlc3BvbnNlZFJlc3VsdFsnSWQnXTtcclxuICAgIGNvbnN0IHRlbXBQYXJhbXMgPSBaQ29tcG9uZW50SGVscGVyLmRlZXBDbG9uZSh0aGlzLnBhcmFtcyk7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0YUNhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0YSA9IGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS5nZXRJdGVtQnlLZXkoY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhQ2FjaGVJbmZvLm9mZmxpbmVEYXRhYmFzZUtleSk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnREYXRhKSB7XHJcbiAgICAgIHRlbXBQYXJhbXMuZmlsdGVycyA9IGBJZD0ke3Jlc3BvbnNlZFJlc3VsdElkfWA7XHJcblxyXG4gICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5EZWxldGUpIHtcclxuICAgICAgICBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQgPSBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQuZmlsdGVyKGl0ZW0gPT4gaXRlbS5JZCAhPT0gcGFyc2VJbnQocmVzcG9uc2VkUmVzdWx0SWQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2UucG9zdEFwaSh0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsLCB0ZW1wUGFyYW1zLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKS5zdWJzY3JpYmUoYXN5bmMgcmVzcCA9PiB7XHJcblxyXG4gICAgICAgICAgY29uc3QgZGF0YWJhc2VSZWNvcmQgPSByZXNwLmRhdGFTZXRbMF07XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFiYXNlUmVjb3JkKSB7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBY3Rpb25UeXBlLlVwZGF0ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4VG9VcGRhdGUgPSBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5JZCA9PT0gZGF0YWJhc2VSZWNvcmQuSWQpO1xyXG4gICAgICAgICAgICAgIGlmIChpbmRleFRvVXBkYXRlICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoZSB1cGRhdGVkIG5hbWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtID0geyAuLi5jdXJyZW50RGF0YS5kYXRhLmRhdGFTZXRbaW5kZXhUb1VwZGF0ZV0sIC4uLmRhdGFiYXNlUmVjb3JkIH07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb2xkIGl0ZW0gd2l0aCB0aGUgdXBkYXRlZCBvbmVcclxuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldFtpbmRleFRvVXBkYXRlXSA9IHVwZGF0ZWRJdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UudXBkYXRlSXRlbShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJdGVtIHVwZGF0ZWQ6ICR7Y3VycmVudERhdGF9YCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSXRlbSBub3QgZm91bmQgd2l0aCBJRDpcIiwgZGF0YWJhc2VSZWNvcmQuSWQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb25UeXBlID09PSBBY3Rpb25UeXBlLkFkZCAmJiBjdXJyZW50RGF0YS5ncmlkU3RhdGUuc2tpcCA8IDIwKSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudERhdGEuZGF0YS5kYXRhU2V0LnVuc2hpZnQoZGF0YWJhc2VSZWNvcmQpO1xyXG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UudXBkYXRlSXRlbShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGEpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJdGVtIHVwZGF0ZWQ6ICR7Y3VycmVudERhdGF9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBVbmFibGUgdG8gZ2V0IGRhdGEsIHJlZnJlc2ggdGhlIHdob2xlIGdyaWQgZGF0YSBmcm9tIEFQSVxyXG4gICAgICAgICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBVbmFibGUgdG8gZ2V0IGZyb20gaW5kZXhlZERCIHN0cmFpZ2h0IGdldCBmcm9tIEFQSVxyXG4gICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyRGF0YUJpbmRlZChkYXRhKSB7XHJcbiAgICAvLyBhbGxvdyB0byBjYWxsIGJhY2sgcHJvamVjdCBwYWdlIGFmdGVyIGRhdGEgYmluZGVkLlxyXG4gICAgbGV0IGJpbmRlZFZhbHVlID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YVsnQWZ0ZXJEYXRhQmluZGVkJ107XHJcbiAgICBpZiAoYmluZGVkVmFsdWUpIHtcclxuICAgICAgY29uc3QgbWUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzKTtcclxuICAgICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSBiaW5kZWRWYWx1ZS5tYXRjaCgvXFxiXFwoLiovZ2kpO1xyXG4gICAgICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgICAgIGJpbmRlZFZhbHVlID0gYmluZGVkVmFsdWUucmVwbGFjZShwYXJhbXNbMF0sIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBiaW5kZWRWYWx1ZSA9IGJpbmRlZFZhbHVlLnJlcGxhY2UoJ21vZGFsR3JvdXAuJywgJ2dyb3VwLicpO1xyXG4gICAgICAgIGNhbGxGdW5jID0gZXZhbCgnbWUuemdyaWRiaW5kaW5nLicgKyBiaW5kZWRWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgXCJFcnJvciB3aGVuIGdldEdyb3VwVmFsdWU6IFwiLFxyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgICAgXCIgPiBFcnJvcjogXCIsXHJcbiAgICAgICAgICBlcnJvclxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIGNvbnN0IG5ld0Z1bmMgPSBjYWxsRnVuYy5iaW5kKG1lKTtcclxuICAgICAgICBuZXdGdW5jKGV2ZW50LCBtZS56Z3JpZGJpbmRpbmcuZGF0YSwgZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckRhdGEoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQuZGF0YSA9IHsgZGF0YTogW10sIHRvdGFsOiAwIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgY29sdW1uIGFnZ3JlZ2F0aW9uIGZvciB0aGUgZ2l2ZW4gZGF0YS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55W119IGRhdGEgLSBUaGUgZGF0YSB0byBhZ2dyZWdhdGUuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZ2dyZWdhdGVIYW5kbGluZyhkYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGFnZ3JlZ2F0ZUNvbHVtbnMgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuYWdncmVnYXRlVHlwZSk7XHJcblxyXG4gICAgYWdncmVnYXRlQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkID0gY29sLmZpZWxkO1xyXG4gICAgICBjb25zdCBhZ2dyZWdhdGVUeXBlID0gY29sLmFnZ3JlZ2F0ZVR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCc6JywgJycpO1xyXG5cclxuICAgICAgbGV0IGFnZ3JlZ2F0ZVZhbHVlID0gbnVsbDtcclxuICAgICAgc3dpdGNoIChhZ2dyZWdhdGVUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInRvdGFsXCI6XHJcbiAgICAgICAgY2FzZSBcInN1bVwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgodG90YWwsIG5leHQpID0+IHRvdGFsICsgbmV4dFtmaWVsZF0sIDApO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImF2ZXJhZ2VcIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArIG5leHRbZmllbGRdLCAwKSAvIGRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImNvdW50XCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIm1heFwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgocCwgYykgPT4gcFtmaWVsZF0gPiBjW2ZpZWxkXSA/IHAgOiBjKVtmaWVsZF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibWluXCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKChwLCBjKSA9PiBwW2ZpZWxkXSA8IGNbZmllbGRdID8gcCA6IGMpW2ZpZWxkXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb2wuYWdncmVnYXRlVmFsdWUgPSBhZ2dyZWdhdGVWYWx1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgYWdncmVnYXRlIHZhbHVlcyBmb3IgY29sdW1ucyB3aXRoIGFnZ3JlZ2F0ZSB0eXBlcy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWdncmVnYXRlUmVzZXRWYWx1ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFnZ3JlZ2F0ZUNvbHVtbnMgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuYWdncmVnYXRlVHlwZSk7XHJcbiAgICBhZ2dyZWdhdGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29sLmFnZ3JlZ2F0ZVZhbHVlID0gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHBhZ2UgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQYWdlQ2hhbmdlRXZlbnR9IGV2ZW50IC0gVGhlIHBhZ2UgY2hhbmdlIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlKGV2ZW50OiBQYWdlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucGFyYW1zLnBhZ2VObyA9IHRoaXMuZ2V0UGFnZU5vKGV2ZW50LnNraXAsIHRoaXMucGFyYW1zLnBhZ2VTaXplKTtcclxuICAgIHRoaXMuc3RhdGUuc2tpcCA9IGV2ZW50LnNraXA7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50LnBhZ2VDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBzb3J0IGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U29ydERlc2NyaXB0b3JbXX0gc29ydCAtIFRoZSBzb3J0IGRlc2NyaXB0b3IgYXJyYXkuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNvcnRDaGFuZ2Uoc29ydDogU29ydERlc2NyaXB0b3JbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0ID0gc29ydDtcclxuICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcyA9IFtdO1xyXG4gICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycyA9IFtdO1xyXG5cclxuICAgIHNvcnQuZm9yRWFjaCgoZGVzY3JpcHRvcjogU29ydERlc2NyaXB0b3IpID0+IHtcclxuICAgICAgaWYgKGRlc2NyaXB0b3IuZGlyKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycy5wdXNoKGRlc2NyaXB0b3IuZGlyKTtcclxuXHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGRlc2NyaXB0b3IuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW5OYW1lID0gZmllbGQudmFsdWVFeHByICE9PSB1bmRlZmluZWQgPyBmaWVsZC52YWx1ZUV4cHIgOiBkZXNjcmlwdG9yLmZpZWxkO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMucHVzaChzb3J0Q29sdW1uTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudC5zb3J0Q2hhbmdlZCA9IHRydWU7XHJcbiAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgZmlsdGVyIGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55fSBldmVudCAtIFRoZSBmaWx0ZXIgY2hhbmdlIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXJDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJhbXMucGFnZU5vID0gMDtcclxuICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtdO1xyXG4gICAgdGhpcy5zZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCk7XHJcblxyXG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmZpbHRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBldmVudC5maWx0ZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IGl0ZW0uZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBpdGVtLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YVsnRmlsdGVyV2l0aG91dEJyYWNrZXQnXSA/IGAke2ZpZWxkLnZhbHVlRXhwcn1gIDogYCgke2ZpZWxkLnZhbHVlRXhwcn0pYDtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0uZmlsdGVycykge1xyXG4gICAgICAgICAgaXRlbS5maWx0ZXJzLmZvckVhY2goKGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJQYXJhbSA9IHtcclxuICAgICAgICAgICAgICBrZXk6IGZpbHRlci5maWVsZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgb3BzOiB0aGlzLm1hcEZpbHRlck9wZXJhdG9yKGZpbHRlci5vcGVyYXRvciksXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlci52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGZpbHRlclBhcmFtID0ge1xyXG4gICAgICAgICAgICBrZXk6IGZpZWxkLnZhbHVlRXhwciAhPT0gdW5kZWZpbmVkID8gZmlsdGVyVmFsdWUgOiBpdGVtLmZpZWxkLFxyXG4gICAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoaXRlbS5vcGVyYXRvciksXHJcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJQYXJhbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5HcmlkRmlsdGVyQ29uZmlndXJhdGlvbj8uT25DaGFuZ2UpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJHcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZSB0cmlnZ2VyZWRcIik7XHJcbiAgICAgIC8vIFVzZSBzd2l0Y2hNYXAgdG8gaGFuZGxlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uXHJcbiAgICAgIG9mKHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcykucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlclBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgbGV0IGV4cHJlc3Npb24gPSB0aGlzLmZpZWxkLkdyaWRGaWx0ZXJDb25maWd1cmF0aW9uLk9uQ2hhbmdlOyBcclxuICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnJlcGxhY2UoJ21vZGFsR3JvdXAuJywgJ2dyb3VwLicpOyBcclxuICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnJlcGxhY2UoJ2dyb3VwLicsICdncnAuJyk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVuYyA9IGV2YWwoJ3RoaXMuJyArIGV4cHJlc3Npb24pOyAgXHJcbiAgICAgICAgICBjb25zdCBjYWxsRnVuYyA9IGZ1bmMuYmluZCh0aGlzLmdycCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGNhbGxGdW5jKGZpbHRlclBhcmFtcyk7IFxyXG4gICAgICAgIH0pXHJcbiAgICAgICkuc3Vic2NyaWJlKCh1cGRhdGVkRmlsdGVyUGFyYW1zOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHVwZGF0ZWRGaWx0ZXJQYXJhbXMpO1xyXG5cclxuICAgICAgICAvLyB1cGRhdGUgZmlsdGVyUGFyYW1zXHJcbiAgICAgICAgaWYgKHVwZGF0ZWRGaWx0ZXJQYXJhbXMpIHtcclxuICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IHVwZGF0ZWRGaWx0ZXJQYXJhbXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZUV2ZW50LmZpbHRlckNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24uT25DaGFuZ2VcclxuICAgICAgdGhpcy5jaGFuZ2VFdmVudC5maWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRhdGFTdGF0ZUNoYW5nZShzdGF0ZTogRGF0YVN0YXRlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID0gc3RhdGU7XHJcbiAgICB0aGlzLmFnZ3JlZ2F0ZVJlc2V0VmFsdWUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcCBmaWx0ZXIgb3BlcmF0b3IgdG8gaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0b3IgLSBUaGUgZmlsdGVyIG9wZXJhdG9yLlxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIG1hcHBlZCBmaWx0ZXIgb3BlcmF0b3IgdmFsdWUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtYXBGaWx0ZXJPcGVyYXRvcihvcGVyYXRvcjogYW55KSB7XHJcbiAgICBjb25zdCBvcGVyYXRvck1hcHBpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgICBcImVxXCI6IFwiZXFcIixcclxuICAgICAgXCJuZXFcIjogXCJuZXFcIixcclxuICAgICAgXCJsdFwiOiBcImx0XCIsXHJcbiAgICAgIFwibHRlXCI6IFwibHRlXCIsXHJcbiAgICAgIFwiZ3RcIjogXCJndFwiLFxyXG4gICAgICBcImd0ZVwiOiBcImd0ZVwiLFxyXG4gICAgICBcInN0YXJ0c3dpdGhcIjogXCJzdGFydHN3aXRoXCIsXHJcbiAgICAgIFwiZW5kc3dpdGhcIjogXCJlbmRzd2l0aFwiLFxyXG4gICAgICBcImlzbnVsbFwiOiBcImlzbnVsbFwiLFxyXG4gICAgICBcImlzbm90bnVsbFwiOiBcImlzbm90bnVsbFwiLFxyXG4gICAgfTtcclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIFwiY29udGFpbnNcIlxyXG4gICAgaWYgKG9wZXJhdG9yID09PSBcImNvbnRhaW5zXCIgJiYgIXRoaXMuZmllbGRbJ0ZpbHRlckNvbnRhaW5zVXNpbmdFcXVhbCddKSB7XHJcbiAgICAgIHJldHVybiBcImNvbnRhaW5zXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBtYXBwZWQgb3BlcmF0b3Igb3IgZGVmYXVsdCB0byBcIj09XCJcclxuICAgIHJldHVybiBvcGVyYXRvck1hcHBpbmdzW29wZXJhdG9yXSB8fCBcIj09XCI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhZ2VObyhzdGF0ZVNraXA6IG51bWJlciwgc3RhdGVUYWtlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiBzdGF0ZVNraXAgLyBzdGF0ZVRha2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYmVmb3JlR3JpZEdldERhdGEoZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgY29uc29sZS53YXJuKFwiYmVmb3JlRGF0YUJpbmRpbmcgdHJpZ2dlcmVkXCIpO1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVHcmlkR2V0RGF0YSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVEYXRhQmluZGluZyBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVHcmlkR2V0RGF0YShncm91cCwgbWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIGNvbHVtbkZpZWxkID0gZGF0YTogQXJyYXk8WkZpZWxkPixcclxuICAvLyBjb2x1bW5zID0gZ3JpZENvbHVtbnM6IGFueVtdLFxyXG4gIC8vIGdyb3VwID0gZ3JvdXA6IFpHcm91cCxcclxuICAvLyBjb2x1bW5Db25maWd1cmF0aW9ucyA9IGdyaWRTZXR0aW5ncz86IFpHcmlkQ29sdW1uU2V0dGluZ3NbXSxcclxuICAvLyBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMgPSB1c2FibGVDb2x1bW5zPzogYW55W10sXHJcbiAgLy8gZ3JpZEF0dHJpYnV0ZXMgPSBncmlkRmllbGQ/OiBaRmllbGRcclxuXHJcbiAgcHVibGljIHNldENvbHVtbnMoY29sdW1uczogYW55W10pIHtcclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uRmllbGQgPSBjb2x1bW5zO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyh0aGlzLmdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZ1RvQ29uc29sZUZvckRlYnVnKCdnZW5lcmF0ZWQgZ3JpZCBjb2x1bW5zJywgdGhpcy5ncmlkU2V0dGluZyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==