igniteui-angular 12.3.19 → 12.3.20

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.
@@ -2577,7 +2577,8 @@ export class IgxGridBaseDirective extends DisplayDensityBase {
2577
2577
  this._setupServices();
2578
2578
  this._setupListeners();
2579
2579
  this.rowListDiffer = this.differs.find([]).create(null);
2580
- this.columnListDiffer = this.differs.find([]).create(null);
2580
+ // compare based on field, not on object ref.
2581
+ this.columnListDiffer = this.differs.find([]).create((index, col) => col.field);
2581
2582
  this.calcWidth = this.width && this.width.indexOf('%') === -1 ? parseInt(this.width, 10) : 0;
2582
2583
  this.shouldGenerate = this.autoGenerate;
2583
2584
  }
@@ -4978,6 +4979,20 @@ export class IgxGridBaseDirective extends DisplayDensityBase {
4978
4979
  console.warn('The row with the specified PK or index is outside of the current data view.');
4979
4980
  }
4980
4981
  }
4982
+ /**
4983
+ * Update internal column's collection.
4984
+ *
4985
+ * @hidden
4986
+ */
4987
+ updateColumns(newColumns) {
4988
+ // update internal collections to retain order.
4989
+ this._pinnedColumns = newColumns
4990
+ .filter((c) => c.pinned).sort((a, b) => this._pinnedColumns.indexOf(a) - this._pinnedColumns.indexOf(b));
4991
+ this._unpinnedColumns = newColumns.filter((c) => !c.pinned);
4992
+ this.columnList.reset(newColumns);
4993
+ this.columnList.notifyOnChanges();
4994
+ this._columns = this.columnList.toArray();
4995
+ }
4981
4996
  /**
4982
4997
  * Enters add mode by spawning the UI at the specified index.
4983
4998
  *
@@ -5189,9 +5204,7 @@ export class IgxGridBaseDirective extends DisplayDensityBase {
5189
5204
  const list = this.columnList.toArray();
5190
5205
  this._reorderColumns(from, to, pos, list);
5191
5206
  const newList = this._resetColumnList(list);
5192
- this.columnList.reset(newList);
5193
- this.columnList.notifyOnChanges();
5194
- this._columns = this.columnList.toArray();
5207
+ this.updateColumns(newList);
5195
5208
  }
5196
5209
  /**
5197
5210
  * @hidden
@@ -5619,6 +5632,20 @@ export class IgxGridBaseDirective extends DisplayDensityBase {
5619
5632
  generateDataFields(data) {
5620
5633
  return Object.keys(data && data.length !== 0 ? data[0] : []);
5621
5634
  }
5635
+ /**
5636
+ * @hidden
5637
+ * @internal
5638
+ */
5639
+ _getResolvedDataIndex(index) {
5640
+ let newIndex = index;
5641
+ if ((index < 0 || index >= this.dataView.length) && this.pagingMode === 1 && this.paginator.page !== 0) {
5642
+ newIndex = index - this.paginator.perPage * this.paginator.page;
5643
+ }
5644
+ else if (this.gridAPI.grid.verticalScrollContainer.isRemote) {
5645
+ newIndex = index - this.gridAPI.grid.virtualizationState.startIndex;
5646
+ }
5647
+ return newIndex;
5648
+ }
5622
5649
  /**
5623
5650
  * @hidden
5624
5651
  */
@@ -5661,10 +5688,12 @@ export class IgxGridBaseDirective extends DisplayDensityBase {
5661
5688
  */
5662
5689
  reinitPinStates() {
5663
5690
  this._pinnedColumns = this.columnList
5664
- .filter((c) => c.pinned).sort((a, b) => this._pinnedColumns.indexOf(a) - this._pinnedColumns.indexOf(b));
5691
+ .filter((c) => c.pinned)
5692
+ .sort((a, b) => this._pinnedColumns.indexOf(a) - this._pinnedColumns.indexOf(b));
5665
5693
  this._unpinnedColumns = this.hasColumnGroups ? this.columnList.filter((c) => !c.pinned) :
5666
5694
  this.columnList.filter((c) => !c.pinned)
5667
- .sort((a, b) => a.index - b.index);
5695
+ .sort((a, b) => this._unpinnedColumns.findIndex(x => x.field === a.field) -
5696
+ this._unpinnedColumns.findIndex(x => x.field === b.field));
5668
5697
  }
5669
5698
  extractDataFromSelection(source, formatters = false, headers = false, columnData) {
5670
5699
  var _a;
@@ -6485,4 +6514,4 @@ __decorate([
6485
6514
  __decorate([
6486
6515
  WatchChanges()
6487
6516
  ], IgxGridBaseDirective.prototype, "selectRowOnClick", null);
6488
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9ncmlkLWJhc2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZJLE9BQU8sRUFHSCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFFTCxlQUFlLEVBQ2YsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxRQUFRLEVBRVIsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxF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SztxQ0E2QkwsS0FBSzt5QkEwQkwsS0FBSzs4QkF3QkwsS0FBSztxQ0FvQkwsS0FBSztvQ0F5QkwsS0FBSzs2QkFrQkwsS0FBSzsyQkFpQkwsS0FBSzsyQkFtQkwsS0FBSzt3QkF1UEwsV0FBVyxTQUFDLFlBQVk7aUNBd0J4QixLQUFLO2dDQXNETCxLQUFLO2dDQXVCTCxLQUFLOzJCQW9CTCxLQUFLOzBCQTRETCxLQUFLOzJCQWtCTCxLQUFLOzBCQW9CTCxLQUFLO3dCQW1CTCxLQUFLO3lCQW1CTCxLQUFLOzhCQW1CTCxLQUFLOzRCQW1CTCxLQUFLOzRCQWlCTCxLQUFLOzJCQXFCTCxLQUFLOzhCQXFCTCxLQUFLOzhCQXdmTCxZQUFZLFNBQUMsWUFBWTs4QkE4b0J6QixLQUFLO3FCQWtITCxLQUFLOzJCQXVUTCxLQUFLOytCQTBqQ0wsS0FBSzs7QUF4NUpOO0lBRkMsWUFBWSxFQUFFO3dEQUVHO0FBOCtCbEI7SUFGQyxZQUFZLEVBQUU7MERBSWQ7QUFrQkQ7SUFGQyxZQUFZLEVBQUU7b0VBSWQ7QUF5Q0Q7SUFGQyxZQUFZLEVBQUU7NEVBSWQ7QUFtS0Q7SUFGQyxZQUFZLEVBQUU7NERBSWQ7QUFvREQ7SUFGQyxZQUFZLEVBQUU7dURBSWQ7QUFxQkQ7SUFIQyxZQUFZLEVBQUU7a0RBS2Q7QUE0QkQ7SUFGQyxZQUFZLEVBQUU7aURBSWQ7QUFnQ0Q7SUFGQyxZQUFZLEVBQUU7cURBSWQ7QUFnQkQ7SUFGQyxZQUFZLEVBQUU7dURBSWQ7QUFpQ0Q7SUFGQyxZQUFZLEVBQUU7cURBYWQ7QUF1a0JEO0lBRkMsWUFBWSxFQUFFOzhEQUlkO0FBOFJEO0lBRkMsWUFBWSxFQUFFO3lEQUlkO0FBbUJEO0lBRkMsWUFBWSxFQUFFO3dEQUlkO0FBbUJEO0lBRkMsWUFBWSxFQUFFOzJEQUlkO0FBdW1GRDtJQUZDLFlBQVksRUFBRTs0REFJZCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5ULCBEYXRlUGlwZSwgRGVjaW1hbFBpcGUsIGdldExvY2FsZU51bWJlckZvcm1hdCwgTnVtYmVyRm9ybWF0U3R5bGUsIEN1cnJlbmN5UGlwZSwgUGVyY2VudFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkLFxuICAgIEl0ZXJhYmxlRGlmZmVycyxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBJbmplY3Rpb25Ub2tlbixcbiAgICBPcHRpb25hbCxcbiAgICBEb0NoZWNrLFxuICAgIERpcmVjdGl2ZSxcbiAgICBMT0NBTEVfSUQsXG4gICAgSG9zdExpc3RlbmVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcmVzaXplT2JzZXJ2YWJsZSB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0ICdpZ25pdGV1aS10cmlhbC13YXRlcm1hcmsnO1xuaW1wb3J0IHsgU3ViamVjdCwgcGlwZSwgZnJvbUV2ZW50LCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgZmlyc3QsIGZpbHRlciwgdGhyb3R0bGVUaW1lLCBtYXAsIHNoYXJlUmVwbGF5LCB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjbG9uZUFycmF5LCBtZXJnZU9iamVjdHMsIGNvbXBhcmVNYXBzLCByZXNvbHZlTmVzdGVkUGF0aCwgaXNPYmplY3QsIFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgR3JpZENvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdMb2dpYywgSUZpbHRlcmluZ0V4cHJlc3Npb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElHcm91cEJ5UmVjb3JkIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2dyb3VwYnktcmVjb3JkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJU29ydGluZ0V4cHJlc3Npb24sIFNvcnRpbmdEaXJlY3Rpb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvc29ydGluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRm9yT2ZEYXRhQ2hhbmdpbmdFdmVudEFyZ3MsIElneEdyaWRGb3JPZkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZm9yLW9mL2Zvcl9vZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGV4dC1oaWdobGlnaHQvdGV4dC1oaWdobGlnaHQuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gICAgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSxcbiAgICBIb3Jpem9udGFsQWxpZ25tZW50LFxuICAgIFZlcnRpY2FsQWxpZ25tZW50LFxuICAgIElneE92ZXJsYXlTZXJ2aWNlLFxuICAgIE92ZXJsYXlTZXR0aW5ncyxcbiAgICBQb3NpdGlvblNldHRpbmdzLFxuICAgIENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3ksXG4gICAgQ29udGFpbmVyUG9zaXRpb25TdHJhdGVneSxcbiAgICBTdGF0ZVVwZGF0ZUV2ZW50LFxuICAgIFRyYW5zYWN0aW9uRXZlbnRPcmlnaW4sXG4gICAgQWN0aW9uLFxufSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4vYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSVN1bW1hcnlFeHByZXNzaW9uIH0gZnJvbSAnLi9zdW1tYXJpZXMvZ3JpZC1zdW1tYXJ5JztcbmltcG9ydCB7IFJvd0VkaXRQb3NpdGlvblN0cmF0ZWd5LCBJUGlubmluZ0NvbmZpZyB9IGZyb20gJy4vZ3JpZC5jb21tb24nO1xuaW1wb3J0IHsgSWd4R3JpZFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL3Rvb2xiYXIvZ3JpZC10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hSb3dEaXJlY3RpdmUgfSBmcm9tICcuL3Jvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgSWd4VG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZVxufSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ09wZXJhdGlvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblR5cGUsIFRyYW5zYWN0aW9uU2VydmljZSwgU3RhdGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7XG4gICAgSWd4Um93QWRkVGV4dERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgSWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmUsXG4gICAgSWd4Um93RWRpdFRleHREaXJlY3RpdmUsXG4gICAgSWd4Um93RWRpdEFjdGlvbnNEaXJlY3RpdmVcbn0gZnJvbSAnLi9ncmlkLnJvd0VkaXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWROYXZpZ2F0aW9uU2VydmljZSwgSUFjdGl2ZU5vZGUgfSBmcm9tICcuL2dyaWQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsIERpc3BsYXlEZW5zaXR5VG9rZW4sIERpc3BsYXlEZW5zaXR5QmFzZSwgRGlzcGxheURlbnNpdHkgfSBmcm9tICcuLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuL2ZpbHRlcmluZy9ncmlkLWZpbHRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRGaWx0ZXJpbmdDZWxsQ29tcG9uZW50IH0gZnJvbSAnLi9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1jZWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXYXRjaENoYW5nZXMgfSBmcm9tICcuL3dhdGNoLWNoYW5nZXMnO1xuaW1wb3J0IHsgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi9oZWFkZXJzL2dyaWQtaGVhZGVyLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJR3JpZFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9ncmlkLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBJZ3hHcmlkU3VtbWFyeVNlcnZpY2UgfSBmcm9tICcuL3N1bW1hcmllcy9ncmlkLXN1bW1hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50IH0gZnJvbSAnLi9zdW1tYXJpZXMvc3VtbWFyeS1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgSWd4R3JpZFNlbGVjdGlvblNlcnZpY2UsXG4gICAgR3JpZFNlbGVjdGlvblJhbmdlXG59IGZyb20gJy4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEVkaXRSb3csIElneENlbGwsIElneEFkZFJvdyB9IGZyb20gJy4vY29tbW9uL2NydWQuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2FjaGVkVmlld0xvYWRlZEV2ZW50QXJncywgSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RlbXBsYXRlLW91dGxldC90ZW1wbGF0ZV9vdXRsZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL2ZpbHRlcmluZy9leGNlbC1zdHlsZS9leGNlbC1zdHlsZS1zZWFyY2guY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRDb2x1bW5SZXNpemVyQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNpemluZy9yZXNpemVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGFyU2VwYXJhdGVkVmFsdWVEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvY3N2L2NoYXItc2VwYXJhdGVkLXZhbHVlLWRhdGEnO1xuaW1wb3J0IHsgSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlIH0gZnJvbSAnLi9yZXNpemluZy9yZXNpemluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElGaWx0ZXJpbmdTdHJhdGVneSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHtcbiAgICBJZ3hSb3dFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZSwgSWd4Um93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLFxuICAgIElneEhlYWRlckV4cGFuZEluZGljYXRvckRpcmVjdGl2ZSwgSWd4SGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JEaXJlY3RpdmUsIElneEV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlXG59IGZyb20gJy4vZ3JpZC9ncmlkLmRpcmVjdGl2ZXMnO1xuaW1wb3J0IHtcbiAgICBHcmlkS2V5ZG93blRhcmdldFR5cGUsXG4gICAgR3JpZFNlbGVjdGlvbk1vZGUsXG4gICAgR3JpZFN1bW1hcnlQb3NpdGlvbixcbiAgICBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSxcbiAgICBGaWx0ZXJNb2RlLFxuICAgIENvbHVtblBpbm5pbmdQb3NpdGlvbixcbiAgICBSb3dQaW5uaW5nUG9zaXRpb24sXG4gICAgR3JpZFBhZ2luZ01vZGVcbn0gZnJvbSAnLi9jb21tb24vZW51bXMnO1xuaW1wb3J0IHtcbiAgICBJR3JpZENlbGxFdmVudEFyZ3MsXG4gICAgSVJvd1NlbGVjdGlvbkV2ZW50QXJncyxcbiAgICBJUGluQ29sdW1uRXZlbnRBcmdzLFxuICAgIElHcmlkRWRpdEV2ZW50QXJncyxcbiAgICBJUm93RGF0YUV2ZW50QXJncyxcbiAgICBJQ29sdW1uUmVzaXplRXZlbnRBcmdzLFxuICAgIElDb2x1bW5Nb3ZpbmdTdGFydEV2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nRXZlbnRBcmdzLFxuICAgIElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3MsXG4gICAgSUdyaWRLZXlkb3duRXZlbnRBcmdzLFxuICAgIElSb3dEcmFnU3RhcnRFdmVudEFyZ3MsXG4gICAgSVJvd0RyYWdFbmRFdmVudEFyZ3MsXG4gICAgSUdyaWRDbGlwYm9hcmRFdmVudCxcbiAgICBJR3JpZFRvb2xiYXJFeHBvcnRFdmVudEFyZ3MsXG4gICAgSVNlYXJjaEluZm8sXG4gICAgSUNlbGxQb3NpdGlvbixcbiAgICBJUm93VG9nZ2xlRXZlbnRBcmdzLFxuICAgIElDb2x1bW5TZWxlY3Rpb25FdmVudEFyZ3MsXG4gICAgSVBpblJvd0V2ZW50QXJncyxcbiAgICBJR3JpZFNjcm9sbEV2ZW50QXJncyxcbiAgICBJR3JpZEVkaXREb25lRXZlbnRBcmdzLFxuICAgIElBY3RpdmVOb2RlQ2hhbmdlRXZlbnRBcmdzLFxuICAgIElTb3J0aW5nRXZlbnRBcmdzLFxuICAgIElGaWx0ZXJpbmdFdmVudEFyZ3MsXG4gICAgSUNvbHVtblZpc2liaWxpdHlDaGFuZ2VkRXZlbnRBcmdzLFxuICAgIElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmdFdmVudEFyZ3MsXG4gICAgSVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzXG59IGZyb20gJy4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyaW5nL2FkdmFuY2VkLWZpbHRlcmluZy9hZHZhbmNlZC1maWx0ZXJpbmctZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHcmlkVHlwZSB9IGZyb20gJy4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERyb3BQb3NpdGlvbiB9IGZyb20gJy4vbW92aW5nL21vdmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZSwgSWd4Um93U2VsZWN0b3JEaXJlY3RpdmUgfSBmcm9tICcuL3NlbGVjdGlvbi9yb3ctc2VsZWN0b3JzJztcbmltcG9ydCB7IElneENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbHVtbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW5zL2NvbHVtbi1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUdyaWRTb3J0aW5nU3RyYXRlZ3kgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvc29ydGluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBJZ3hSb3dEcmFnR2hvc3REaXJlY3RpdmUsIElneERyYWdJbmRpY2F0b3JJY29uRGlyZWN0aXZlIH0gZnJvbSAnLi9yb3ctZHJhZy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9leGNlbC1zdHlsZS9ncmlkLmV4Y2VsLXN0eWxlLWZpbHRlcmluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U25hY2tiYXJDb21wb25lbnQgfSBmcm9tICcuLi9zbmFja2Jhci9zbmFja2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBJZ3hBY3Rpb25TdHJpcENvbXBvbmVudCB9IGZyb20gJy4uL2FjdGlvbi1zdHJpcC9hY3Rpb24tc3RyaXAuY29tcG9uZW50JztcbmltcG9ydCB7IFJvd1R5cGUgfSBmcm9tICcuL2NvbW1vbi9yb3cuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneEdyaWRSb3dDb21wb25lbnQgfSBmcm9tICcuL2dyaWQvZ3JpZC1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IElQYWdlRXZlbnRBcmdzIH0gZnJvbSAnLi4vcGFnaW5hdG9yL3BhZ2luYXRvci1pbnRlcmZhY2VzJztcbmltcG9ydCB7IElneFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJSb3dDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlcnMvZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkR3JvdXBCeUFyZWFDb21wb25lbnQgfSBmcm9tICcuL2dyb3VwaW5nL2dyaWQtZ3JvdXAtYnktYXJlYS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4RmxhdFRyYW5zYWN0aW9uRmFjdG9yeSwgVFJBTlNBQ1RJT05fVFlQRSB9IGZyb20gJy4uL3NlcnZpY2VzL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uLWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBEZWZhdWx0RGF0YUNsb25lU3RyYXRlZ3ksIElEYXRhQ2xvbmVTdHJhdGVneSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLWNsb25lLXN0cmF0ZWd5JztcblxubGV0IEZBS0VfUk9XX0lEID0gLTE7XG5jb25zdCBERUZBVUxUX0lURU1TX1BFUl9QQUdFID0gMTU7XG5jb25zdCBNSU5JTVVNX0NPTFVNTl9XSURUSCA9IDEzNjtcbmNvbnN0IEZJTFRFUl9ST1dfSEVJR0hUID0gNTA7XG4vLyBCeSBkZWZhdWx0IHJvdyBlZGl0aW5nIG92ZXJsYXkgb3V0bGV0IGlzIGluc2lkZSBncmlkIGJvZHkgc28gdGhhdCBvdmVybGF5IGlzIGhpZGRlbiBiZWxvdyBncmlkIGhlYWRlciB3aGVuIHNjcm9sbGluZy5cbi8vIEluIGNhc2VzIHdoZW4gZ3JpZCBoYXMgMS0yIHJvd3MgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlIGluIGdyaWQgYm9keSBhbmQgcm93IGVkaXRpbmcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd24gYWJvdmUgaGVhZGVyLlxuLy8gRGVmYXVsdCByb3cgZWRpdGluZyBvdmVybGF5IGhlaWdodCBpcyBoaWdoZXIgdGhlbiByb3cgaGVpZ2h0IHRoYXQgaXMgd2h5IHRoZSBjYXNlIGlzIHZhbGlkIGFsc28gZm9yIHJvdyB3aXRoIDIgcm93cy5cbi8vIE1vcmUgYWNjdXJhdGUgY2FsY3VsYXRpb24gaXMgbm90IHBvc3NpYmxlLCBjYXVzZSByb3cgZWRpdGluZyBvdmVybGF5IGlzIHN0aWxsIG5vdCBzaG93biBhbmQgd2UgZG9uJ3Qga25vdyBpdHMgaGVpZ2h0LFxuLy8gYnV0IGluIHRoZSBzYW1lIHRpbWUgd2UgbmVlZCB0byBzZXQgcm93IGVkaXRpbmcgb3ZlcmxheSBvdXRsZXQgYmVmb3JlIG9wZW5pbmcgdGhlIG92ZXJsYXkgaXRzZWxmLlxuY29uc3QgTUlOX1JPV19FRElUSU5HX0NPVU5UX1RIUkVTSE9MRCA9IDI7XG5cbmV4cG9ydCBjb25zdCBJZ3hHcmlkVHJhbnNhY3Rpb24gPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignSWd4R3JpZFRyYW5zYWN0aW9uJyk7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElneEdyaWRCYXNlRGlyZWN0aXZlIGV4dGVuZHMgRGlzcGxheURlbnNpdHlCYXNlIGltcGxlbWVudHMgR3JpZFR5cGUsXG4gICAgT25Jbml0LCBEb0NoZWNrLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkaXNwbGF5IHRpbWUgZm9yIHRoZSByb3cgYWRkaW5nIHNuYWNrYmFyIG5vdGlmaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyA2MDAwbXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc25hY2tiYXJEaXNwbGF5VGltZSA9IDYwMDA7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0byBhdXRvZ2VuZXJhdGUgdGhlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLiBXaGVuIHNldCB0byB0cnVlLCBpdCB3aWxsIG92ZXJyaWRlIGFsbCBjb2x1bW5zIGRlY2xhcmVkIHRocm91Z2ggY29kZSBvciBpbiBtYXJrdXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGF1dG9HZW5lcmF0ZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIHRlbXBsYXRlIHdoZW4gZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbZW1wdHlHcmlkVGVtcGxhdGVdPVwibXlUZW1wbGF0ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZW1wdHlHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSBjdXN0b20gdGVtcGxhdGUgZm9yIGFkZGluZyByb3cgVUkgd2hlbiBncmlkIGlzIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZF09XCInaWd4LWdyaWQtMSdcIiBbZGF0YV09XCJEYXRhXCIgW2FkZFJvd0VtcHR5VGVtcGxhdGVdPVwibXlUZW1wbGF0ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYWRkUm93RW1wdHlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB3aGVuIGxvYWRpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbbG9hZGluZ0dyaWRUZW1wbGF0ZV09XCJteVRlbXBsYXRlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb2FkaW5nR3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIGNvcHkgYmVoYXZpb3Igb2YgdGhlIGdyaWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY2xpcGJvYXJkT3B0aW9ucyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZXMvZGlzYWJsZXMgdGhlIGNvcHkgYmVoYXZpb3JcbiAgICAgICAgICovXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmNsdWRlIHRoZSBjb2x1bW5zIGhlYWRlcnMgaW4gdGhlIGNsaXBib2FyZCBvdXRwdXQuXG4gICAgICAgICAqL1xuICAgICAgICBjb3B5SGVhZGVyczogdHJ1ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGx5IHRoZSBjb2x1bW5zIGZvcm1hdHRlcnMgKGlmIGFueSkgb24gdGhlIGRhdGEgaW4gdGhlIGNsaXBib2FyZCBvdXRwdXQuXG4gICAgICAgICAqL1xuICAgICAgICBjb3B5Rm9ybWF0dGVyczogdHJ1ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzZXBhcmF0b3IgdXNlZCBmb3IgZm9ybWF0dGluZyB0aGUgY29weSBvdXRwdXQuIERlZmF1bHRzIHRvIGBcXHRgLlxuICAgICAgICAgKi9cbiAgICAgICAgc2VwYXJhdG9yOiAnXFx0J1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmluZyBleHByZXNzaW9ucyB0cmVlIG9mIHRoZSBjb2x1bW4gZm9yIHdoaWNoIGZpbHRlcmluZyB3YXMgcGVyZm9ybWVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIlxuICAgICAqICAgICAgICAgICAgICAoZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlQ2hhbmdlKT1cImZpbHRlcmluZ0V4cHJUcmVlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGFkdmFuY2VkIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBleHByZXNzaW9ucyB0cmVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIlxuICAgICAqICAgICAgICAgICAoYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UpPVwiYWR2YW5jZWRGaWx0ZXJpbmdFeHByVHJlZUNoYW5nZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZ3JpZCBpcyBzY3JvbGxlZCBob3Jpem9udGFsbHkvdmVydGljYWxseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIlxuICAgICAqICAgICAgICAgICAgICAoZ3JpZFNjcm9sbCk9XCJvblNjcm9sbCgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZ3JpZFNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRTY3JvbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmAgY29tcG9uZW50IGluc3RlYWRcbiAgICAgKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgcGFnZSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIG9uUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpIHtcbiAgICAgKiAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBFbWl0dGVkIHdoZW4gYHBlclBhZ2VgIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBncmlkIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChwZXJQYWdlQ2hhbmdlKT1cIm9uUGVyUGFnZUNoYW5nZSgkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIG9uUGVyUGFnZUNoYW5nZShwZXJQYWdlOiBudW1iZXIpIHtcbiAgICAgKiAgIHRoaXMucGVyUGFnZSA9IHBlclBhZ2U7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwZXJQYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY2xhc3MgPSAnJztcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMi4wLiBXZSBzdWdnZXN0IHVzaW5nIGByb3dDbGFzc2VzYCBwcm9wZXJ0eSBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN0eWxpbmcgY2xhc3NlcyBhcHBsaWVkIHRvIGFsbCBldmVuIGBJZ3hHcmlkUm93Q29tcG9uZW50YHMgaW4gdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtldmVuUm93Q1NTXT1cIidpZ3gtZ3JpZC0tbXktZXZlbi1jbGFzcydcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGV2ZW5Sb3dDU1MgPSAnaWd4LWdyaWRfX3RyLS1ldmVuJztcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMi4wLiBXZSBzdWdnZXN0IHVzaW5nIGByb3dDbGFzc2VzYCBwcm9wZXJ0eSBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN0eWxpbmcgY2xhc3NlcyBhcHBsaWVkIHRvIGFsbCBvZGQgYElneEdyaWRSb3dDb21wb25lbnRgcyBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2V2ZW5Sb3dDU1NdPVwiJ2lneC1ncmlkLS1teS1vZGQtY2xhc3MnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvZGRSb3dDU1MgPSAnaWd4LWdyaWRfX3RyLS1vZGQnO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNvbmRpdGlvbmFsIGNsYXNzIHNlbGVjdG9yIHRvIHRoZSBncmlkJ3Mgcm93IGVsZW1lbnQuXG4gICAgICogQWNjZXB0cyBhbiBvYmplY3QgbGl0ZXJhbCwgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMsXG4gICAgICogd2hlcmUgdGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgQ1NTIGNsYXNzIGFuZCB0aGUgdmFsdWUgaXNcbiAgICAgKiBlaXRoZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBib29sZWFuLCBvciBib29sZWFuLCBsaWtlIHNvOlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjYWxsYmFjayA9IChyb3c6IFJvd1R5cGUpID0+IHsgcmV0dXJuIHJvdy5zZWxlY3RlZCA+IDY7IH1cbiAgICAgKiByb3dDbGFzc2VzID0geyAnY2xhc3NOYW1lJyA6IHRoaXMuY2FsbGJhY2sgfTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbcm93Q2xhc3Nlc10gPSBcInJvd0NsYXNzZXNcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvd0NsYXNzZXM6IGFueTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgY29uZGl0aW9uYWwgc3R5bGUgcHJvcGVydGllcyBvbiB0aGUgZ3JpZCByb3cgZWxlbWVudC5cbiAgICAgKiBJdCBhY2NlcHRzIGFuIG9iamVjdCBsaXRlcmFsIHdoZXJlIHRoZSBrZXlzIGFyZVxuICAgICAqIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGFuZCB0aGUgdmFsdWUgaXMgYW4gZXhwcmVzc2lvbiB0byBiZSBldmFsdWF0ZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHN0eWxlcyA9IHtcbiAgICAgKiAgYmFja2dyb3VuZDogJ3llbGxvdycsXG4gICAgICogIGNvbG9yOiAocm93OiBSb3dUeXBlKSA9PiByb3cuc2VsZWN0ZWQgOiAncmVkJzogJ3doaXRlJ1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbcm93U3R5bGVzXT1cInN0eWxlc1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcm93U3R5bGVzID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgcHJpbWFyeSBrZXkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcHJpbWFyeUtleTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIHVuaXF1ZSB2YWx1ZXMgc3RyYXRlZ3kgdXNlZCBieSB0aGUgRXhjZWwgU3R5bGUgRmlsdGVyaW5nXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFByb3ZpZGVzIGEgY2FsbGJhY2sgZm9yIGxvYWRpbmcgdW5pcXVlIGNvbHVtbiB2YWx1ZXMgb24gZGVtYW5kLlxuICAgICAqIElmIHRoaXMgcHJvcGVydHkgaXMgcHJvdmlkZWQsIHRoZSB1bmlxdWUgdmFsdWVzIGl0IGdlbmVyYXRlcyB3aWxsIGJlIHVzZWQgYnkgdGhlIEV4Y2VsIFN0eWxlIEZpbHRlcmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2ZpbHRlck1vZGVdPVwiJ2V4Y2VsU3R5bGVGaWx0ZXInXCIgW3VuaXF1ZUNvbHVtblZhbHVlc1N0cmF0ZWd5XT1cImNvbHVtblZhbHVlc1N0cmF0ZWd5XCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB1bmlxdWVDb2x1bW5WYWx1ZXNTdHJhdGVneTogKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50LFxuICAgICAgICBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGRvbmU6ICh2YWx1ZXM6IGFueVtdKSA9PiB2b2lkKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCB7IHJlYWQ6IElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudD47XG5cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckdyb3VwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZGF0YSBjbG9uZSBzdHJhdGVneSBvZiB0aGUgZ3JpZCB3aGVuIGluIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2RhdGFDbG9uZVN0cmF0ZWd5XT1cImN1c3RvbUNsb25lU3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICBASW5wdXQoKVxuICAgICBwdWJsaWMgZ2V0IGRhdGFDbG9uZVN0cmF0ZWd5KCk6IElEYXRhQ2xvbmVTdHJhdGVneSB7XG4gICAgICAgICByZXR1cm4gdGhpcy5fZGF0YUNsb25lU3RyYXRlZ3k7XG4gICAgIH1cblxuICAgICBwdWJsaWMgc2V0IGRhdGFDbG9uZVN0cmF0ZWd5KHN0cmF0ZWd5OiBJRGF0YUNsb25lU3RyYXRlZ3kpIHtcbiAgICAgICAgaWYgKHN0cmF0ZWd5KSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhQ2xvbmVTdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zLmNsb25lU3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgICAgICAgfVxuICAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjZWxsIGlzIGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChjZWxsQ2xpY2spPVwiY2VsbENsaWNrKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2VsbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNlbGwgaXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqICBSZXR1cm5zIHRoZSBgSWd4R3JpZENlbGxgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAoc2VsZWN0ZWQpPVwib25DZWxsU2VsZWN0KCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogIEVtaXR0ZWQgd2hlbiBgSWd4R3JpZFJvd0NvbXBvbmVudGAgaXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHJvd1NlbGVjdGVkKT1cIm9uQ2VsbENsaWNrQ2hhbmdlKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd1NlbGVjdGlvbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqICBFbWl0dGVkIHdoZW4gYElneENvbHVtbkNvbXBvbmVudGAgaXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKGNvbHVtblNlbGVjdGVkKT1cImNvbHVtblNlbGVjdGVkKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5TZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtblNlbGVjdGlvbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIGBJZ3hDb2x1bW5Db21wb25lbnRgIGlzIHBpbm5lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgY29sdW1uIG1heSBiZSBjaGFuZ2VkIHRocm91Z2ggdGhlIGBpbnNlcnRBdEluZGV4YCBwcm9wZXJ0eS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgY29sdW1uUGlubmluZyhldmVudCkge1xuICAgICAqICAgICBpZiAoZXZlbnQuY29sdW1uLmZpZWxkID09PSBcIk5hbWVcIikge1xuICAgICAqICAgICAgIGV2ZW50Lmluc2VydEF0SW5kZXggPSAwO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5QaW4gPSBuZXcgRXZlbnRFbWl0dGVyPElQaW5Db2x1bW5DYW5jZWxsYWJsZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgYElneENvbHVtbkNvbXBvbmVudGAgaXMgcGlubmVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgaW5kZXggdGhhdCB0aGUgY29sdW1uIGlzIGluc2VydGVkIGF0IG1heSBiZSBjaGFuZ2VkIHRocm91Z2ggdGhlIGBpbnNlcnRBdEluZGV4YCBwcm9wZXJ0eS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgY29sdW1uUGlubmluZyhldmVudCkge1xuICAgICAqICAgICBpZiAoZXZlbnQuY29sdW1uLmZpZWxkID09PSBcIk5hbWVcIikge1xuICAgICAqICAgICAgIGV2ZW50Lmluc2VydEF0SW5kZXggPSAwO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5QaW5uZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElQaW5Db2x1bW5FdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY2VsbCBlbnRlcnMgZWRpdCBtb2RlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXRFbnRlcik9XCJlZGl0U3RhcnQoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjZWxsIGV4aXRzIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKGNlbGxFZGl0RXhpdCk9XCJlZGl0RXhpdCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXRFeGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXREb25lRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNlbGwgaGFzIGJlZW4gZWRpdGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBFdmVudCBpcyBmaXJlZCBhZnRlciBlZGl0aW5nIGlzIGNvbXBsZXRlZCwgd2hlbiB0aGUgY2VsbCBpcyBleGl0aW5nIGVkaXQgbW9kZS5cbiAgICAgKiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXQpPVwiZWRpdERvbmUoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGNlbGwgaGFzIGJlZW4gZWRpdGVkIGFuZCBlZGl0aW5nIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKGNlbGxFZGl0RG9uZSk9XCJlZGl0RG9uZSgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXREb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXREb25lRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGVudGVycyBlZGl0IG1vZGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXR0ZWQgd2hlbiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0RW50ZXIpPVwiZWRpdFN0YXJ0KCRldmVudClcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZXhpdGluZyBlZGl0IG1vZGUgZm9yIGEgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBFbWl0dGVkIHdoZW4gW3Jvd0VkaXRhYmxlXT1cInRydWVcIiAmIGBlbmRFZGl0KHRydWUpYCBpcyBjYWxsZWQuXG4gICAgICogRW1pdHRlZCB3aGVuIGNoYW5naW5nIHJvd3MgZHVyaW5nIGVkaXQgbW9kZSwgc2VsZWN0aW5nIGFuIHVuLWVkaXRhYmxlIGNlbGwgaW4gdGhlIGVkaXRlZCByb3csXG4gICAgICogcGVyZm9ybWluZyBwYWdpbmcgb3BlcmF0aW9uLCBjb2x1bW4gcmVzaXppbmcsIHBpbm5pbmcsIG1vdmluZyBvciBoaXR0aW5nIGBEb25lYFxuICAgICAqIGJ1dHRvbiBpbnNpZGUgb2YgdGhlIHJvd0VkaXRpbmdPdmVybGF5LCBvciBoaXR0aW5nIHRoZSBgRW50ZXJgIGtleSB3aGlsZSBlZGl0aW5nIGEgY2VsbC5cbiAgICAgKiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAocm93RWRpdCk9XCJlZGl0RG9uZSgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGV4aXRpbmcgZWRpdCBtb2RlIGZvciBhIHJvdyBhbmQgZWRpdGluZyBoYXMgYmVlbiBjb21taXR0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXR0ZWQgd2hlbiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiICYgYGVuZEVkaXQodHJ1ZSlgIGlzIGNhbGxlZC5cbiAgICAgKiBFbWl0dGVkIHdoZW4gY2hhbmdpbmcgcm93cyBkdXJpbmcgZWRpdCBtb2RlLCBzZWxlY3RpbmcgYW4gdW4tZWRpdGFibGUgY2VsbCBpbiB0aGUgZWRpdGVkIHJvdyxcbiAgICAgKiBwZXJmb3JtaW5nIHBhZ2luZyBvcGVyYXRpb24sIGNvbHVtbiByZXNpemluZywgcGlubmluZywgbW92aW5nIG9yIGhpdHRpbmcgYERvbmVgXG4gICAgICogYnV0dG9uIGluc2lkZSBvZiB0aGUgcm93RWRpdGluZ092ZXJsYXksIG9yIGhpdHRpbmcgdGhlIGBFbnRlcmAga2V5IHdoaWxlIGVkaXRpbmcgYSBjZWxsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKHJvd0VkaXREb25lKT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0VkaXREb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXREb25lRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHJvdyBlZGl0aW5nIGlzIGNhbmNlbGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBFbWl0cyB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIgJiBgZW5kRWRpdChmYWxzZSlgIGlzIGNhbGxlZC5cbiAgICAgKiBFbWl0dGVkIHdoZW4gY2hhbmdpbmcgaGl0dGluZyBgRXNjYCBrZXkgZHVyaW5nIGNlbGwgZWRpdGluZyBhbmQgd2hlbiBjbGljayBvbiB0aGUgYENhbmNlbGAgYnV0dG9uXG4gICAgICogaW4gdGhlIHJvdyBlZGl0aW5nIG92ZXJsYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAocm93RWRpdEV4aXQpPVwiZWRpdEV4aXQoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdEV4aXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb2x1bW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGNvbHVtbiBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChjb2x1bW5Jbml0KT1cImluaXRDb2x1bW5zKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Jbml0ID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hDb2x1bW5Db21wb25lbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBzb3J0aW5nIGV4cHJlc3Npb25zIGFyZSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIGBJU29ydGluZ0V2ZW50QXJnc2Agb2JqZWN0LiBgc29ydGluZ0V4cHJlc3Npb25zYCBrZXkgaG9sZHMgdGhlIHNvcnRpbmcgZXhwcmVzc2lvbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChzb3J0aW5nKT1cInNvcnRpbmcoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNvcnRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBzb3J0aW5nIGlzIGNvbXBsZXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgc29ydGluZyBleHByZXNzaW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoc29ydGluZ0RvbmUpPVwic29ydGluZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNvcnRpbmdEb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJU29ydGluZ0V4cHJlc3Npb24gfCBBcnJheTxJU29ydGluZ0V4cHJlc3Npb24+PigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIGFyZSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIGBJRmlsdGVyaW5nRXZlbnRBcmdzYCBvYmplY3QuIGBmaWx0ZXJpbmdFeHByZXNzaW9uc2Aga2V5IGhvbGRzIHRoZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBjb2x1bW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChmaWx0ZXJpbmcpPVwiZmlsdGVyaW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBmaWx0ZXJpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXJpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgdGhyb3VnaCB0aGUgVUkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmluZyBleHByZXNzaW9ucyB0cmVlIG9mIHRoZSBjb2x1bW4gZm9yIHdoaWNoIGZpbHRlcmluZyB3YXMgcGVyZm9ybWVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZmlsdGVyaW5nRG9uZSk9XCJmaWx0ZXJpbmdEb25lKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBmaWx0ZXJpbmdEb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlPigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHBhZ2luZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIHByZXZpb3VzIGFuZCBuZXh0IHBhZ2VzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAocGFnaW5nRG9uZSk9XCJwYWdpbmdEb25lKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwYWdpbmdEb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJUGFnZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHJvdyBpcyBhZGRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgZGF0YSBmb3IgdGhlIG5ldyBgSWd4R3JpZFJvd0NvbXBvbmVudGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAocm93QWRkZWQpPVwicm93QWRkZWQoJGV2ZW50KVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0FkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHJvdyBpcyBkZWxldGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIGBJUm93RGF0YUV2ZW50QXJnc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAocm93RGVsZXRlZCk9XCJyb3dEZWxldGVkKCRldmVudClcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtbWl0ZWQgd2hlbiBkZWxldGluZyBhIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIFJldHVybnMgYW4gYElHcmlkRWRpdEV2ZW50QXJnc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAocm93RGVsZXRlKT1cInJvd0RlbGV0ZSgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbW1pdGVkIGp1c3QgYmVmb3JlIHRoZSBuZXdseSBhZGRlZCByb3cgaXMgY29tbWl0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBSZXR1cm5zIGFuIGBJR3JpZEVkaXRFdmVudEFyZ3NgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKHJvd0FkZCk9XCJyb3dBZGQoJGV2ZW50KVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0FkZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBjb2x1bW4gaXMgcmVzaXplZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0J3Mgb2xkIGFuZCBuZXcgd2lkdGguXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChjb2x1bW5SZXNpemVkKT1cInJlc2l6aW5nKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5SZXNpemVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uUmVzaXplRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY2VsbCBpcyByaWdodCBjbGlja2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4R3JpZENlbGxgIG9iamVjdC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChjb250ZXh0TWVudSk9XCJjb250ZXh0TWVudSgkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29udGV4dE1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2VsbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNlbGwgaXMgZG91YmxlIGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAoZG91YmxlQ2xpY2spPVwiZGJsQ2xpY2soJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRvdWJsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENlbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBjb2x1bW4gdmlzaWJpbGl0eSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBcmdzOiB7IGNvbHVtbjogYW55LCBuZXdWYWx1ZTogYm9vbGVhbiB9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgKGNvbHVtblZpc2liaWxpdHlDaGFuZ2luZyk9XCJ2aXNpYmlsaXR5Q2hhbmdpbmcoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblZpc2liaWxpdHlDaGFuZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtblZpc2liaWxpdHlDaGFuZ2luZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgY29sdW1uIHZpc2liaWxpdHkgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQXJnczogeyBjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCwgbmV3VmFsdWU6IGJvb2xlYW4gfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbY29sdW1uSGlkaW5nXT1cInRydWVcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIChjb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZCk9XCJ2aXNpYmlsaXR5Q2hhbmdlZCgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uVmlzaWJpbGl0eUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjb2x1bW4gbW92aW5nIHN0YXJ0cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgbW92ZWQgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbY29sdW1uSGlkaW5nXT1cInRydWVcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIChjb2x1bW5Nb3ZpbmdTdGFydCk9XCJtb3ZpbmdTdGFydCgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uTW92aW5nU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdTdGFydEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgZHVyaW5nIHRoZSBjb2x1bW4gbW92aW5nIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlIGFuZCB0YXJnZXQgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0cy4gVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbY29sdW1uSGlkaW5nXT1cInRydWVcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIChjb2x1bW5Nb3ZpbmcpPVwibW92aW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY29sdW1uIG1vdmluZyBlbmRzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3RzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbY29sdW1uSGlkaW5nXT1cInRydWVcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIChjb2x1bW5Nb3ZpbmdFbmQpPVwibW92aW5nRW5kcygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uTW92aW5nRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uTW92aW5nRW5kRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGtleWRvd24gaXMgdHJpZ2dlcmVkIG92ZXIgZWxlbWVudCBpbnNpZGUgZ3JpZCdzIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgb25seSBpZiB0aGUga2V5IGNvbWJpbmF0aW9uIGlzIHN1cHBvcnRlZCBpbiB0aGUgZ3JpZC5cbiAgICAgKiBSZXR1cm4gdGhlIHRhcmdldCB0eXBlLCB0YXJnZXQgb2JqZWN0IGFuZCB0aGUgb3JpZ2luYWwgZXZlbnQuIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkIChncmlkS2V5ZG93bik9XCJjdXN0b21LZXlkb3duKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBncmlkS2V5ZG93biA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRLZXlkb3duRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHN0YXJ0IGRyYWdnaW5nIGEgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm4gdGhlIGRyYWdnZWQgcm93LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEcmFnU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEcmFnU3RhcnRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZHJvcHBpbmcgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybiB0aGUgZHJvcHBlZCByb3cuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEcmFnRW5kRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY29weSBvcGVyYXRpb24gaXMgZXhlY3V0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEZpcmVkIG9ubHkgaWYgY29weSBiZWhhdmlvciBpcyBlbmFibGVkIHRocm91Z2ggdGhlIFtgY2xpcGJvYXJkT3B0aW9uc2Bde0BsaW5rIElneEdyaWRCYXNlRGlyZWN0aXZlI2NsaXBib2FyZE9wdGlvbnN9LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBncmlkQ29weSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDbGlwYm9hcmRFdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGV4cGFuc2lvblN0YXRlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TWFwPGFueSwgYm9vbGVhbj4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGV4cGFuZGVkIHN0YXRlIG9mIGEgcm93IGdldHMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJlbXBsb3llZURhdGFcIiAocm93VG9nZ2xlKT1cInJvd1RvZ2dsZSgkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93VG9nZ2xlID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93VG9nZ2xlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBwaW5uZWQgc3RhdGUgb2YgYSByb3cgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJlbXBsb3llZURhdGFcIiAocm93UGlubmluZyk9XCJyb3dQaW4oJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1Bpbm5pbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElQaW5Sb3dFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHBpbm5lZCBzdGF0ZSBvZiBhIHJvdyBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImVtcGxveWVlRGF0YVwiIChyb3dQaW5uZWQpPVwicm93UGluKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dQaW5uZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElQaW5Sb3dFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbW1pdGVkIHdoZW4gdGhlIGFjdGl2ZSBub2RlIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJkYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKGFjdGl2ZU5vZGVDaGFuZ2UpPVwiYWN0aXZlTm9kZUNoYW5nZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgYWN0aXZlTm9kZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUFjdGl2ZU5vZGVDaGFuZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBzb3J0aW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgc29ydGluZyBleHByZXNzaW9ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKHNvcnRpbmdFeHByZXNzaW9uc0NoYW5nZSk9XCJzb3J0aW5nRXhwckNoYW5nZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJU29ydGluZ0V4cHJlc3Npb25bXT4oKTtcblxuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGFuIGV4cG9ydCBwcm9jZXNzIGlzIGluaXRpYXRlZCBieSB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRvb2xiYXJFeHBvcnRpbmcoZXZlbnQ6IElHcmlkVG9vbGJhckV4cG9ydEV2ZW50QXJncyl7XG4gICAgICogICAgIGNvbnN0IHRvb2xiYXJFeHBvcnRpbmcgPSBldmVudDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHRvb2xiYXJFeHBvcnRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkVG9vbGJhckV4cG9ydEV2ZW50QXJncz4oKTtcblxuICAgIC8qIEVuZCBvZiB0b29sYmFyIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi9cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBtYWtpbmcgYSByYW5nZSBzZWxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJhbmdlIHNlbGVjdGlvbiBjYW4gYmUgbWFkZSBlaXRoZXIgdGhyb3VnaCBkcmFnIHNlbGVjdGlvbiBvciB0aHJvdWdoIGtleWJvYXJkIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmFuZ2VTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZFNlbGVjdGlvblJhbmdlPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgYWZ0ZXIgdGhlIG5nQWZ0ZXJWaWV3SW5pdCBob29rLiBBdCB0aGlzIHBvaW50IHRoZSBncmlkIGV4aXN0cyBpbiB0aGUgRE9NICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlbmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbG9jYWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgdGhlIGdyaWQncyBkYXRhIHZpZXcgaXMgY2hhbmdlZCBiZWNhdXNlIG9mIGEgZGF0YSBvcGVyYXRpb24sIHJlYmluZGluZywgZXRjLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZGF0YUNoYW5naW5nKT0naGFuZGxlRGF0YUNoYW5naW5nRXZlbnQoKSc+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAgQE91dHB1dCgpXG4gICAgIHB1YmxpYyBkYXRhQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGdyaWQncyBkYXRhIHZpZXcgaXMgY2hhbmdlZCBiZWNhdXNlIG9mIGEgZGF0YSBvcGVyYXRpb24sIHJlYmluZGluZywgZXRjLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZGF0YUNoYW5nZWQpPSdoYW5kbGVEYXRhQ2hhbmdlZEV2ZW50KCknPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRhdGFDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4U25hY2tiYXJDb21wb25lbnQpXG4gICAgcHVibGljIGFkZFJvd1NuYWNrYmFyOiBJZ3hTbmFja2JhckNvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkQ29sdW1uUmVzaXplckNvbXBvbmVudClcbiAgICBwdWJsaWMgcmVzaXplTGluZTogSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2xvYWRpbmdPdmVybGF5JywgeyByZWFkOiBJZ3hUb2dnbGVEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nT3ZlcmxheTogSWd4VG9nZ2xlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hMb2FkaW5nT3ZlcmxheU91dGxldCcsIHsgcmVhZDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGxvYWRpbmdPdXRsZXQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Q29sdW1uQ29tcG9uZW50LCB7IHJlYWQ6IElneENvbHVtbkNvbXBvbmVudCwgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgY29sdW1uTGlzdDogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4gPSBuZXcgUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4oKTtcblxuICAgIEBDb250ZW50Q2hpbGQoSWd4QWN0aW9uU3RyaXBDb21wb25lbnQpXG4gICAgcHVibGljIGFjdGlvblN0cmlwOiBJZ3hBY3Rpb25TdHJpcENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBleGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlOiBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQSB0ZW1wbGF0ZSByZWZlcmVuY2UgZm9yIHRoZSB0ZW1wbGF0ZSB3aGVuIHRoZSBmaWx0ZXJlZCBncmlkIGlzIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBlbXB0eVRlbXBhbHRlID0gdGhpcy5ncmlkLmVtcHR5R3JpZFRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2VtcHR5RmlsdGVyZWRHcmlkJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGVtcHR5RmlsdGVyZWRHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBBIHRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgdGhlIHRlbXBsYXRlIHdoZW4gdGhlIGdyaWQgaXMgZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIGNvbnN0IGVtcHR5VGVtcGFsdGUgPSB0aGlzLmdyaWQuZW1wdHlHcmlkVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEVtcHR5R3JpZCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBlbXB0eUdyaWREZWZhdWx0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRMb2FkaW5nR3JpZCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nR3JpZERlZmF1bHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBwYXJlbnRWaXJ0RGlyOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZSwgeyByZWFkOiBJZ3hIZWFkU2VsZWN0b3JEaXJlY3RpdmUsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBoZWFkU2VsZWN0b3JzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8SWd4SGVhZFNlbGVjdG9yRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd1NlbGVjdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IElneFJvd1NlbGVjdG9yRGlyZWN0aXZlLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgcm93U2VsZWN0b3JzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8SWd4Um93U2VsZWN0b3JEaXJlY3RpdmU+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RHJhZ0dob3N0RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3ZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB2ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcjogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3ZlcnRpY2FsU2Nyb2xsSG9sZGVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB2ZXJ0aWNhbFNjcm9sbDogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NjcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHNjcjogRWxlbWVudFJlZjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRTZWxlY3RvckJhc2VUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBoZWFkZXJTZWxlY3RvckJhc2VUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZm9vdGVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHVibGljIGZvb3RlcjogRWxlbWVudFJlZjtcblxuICAgIHB1YmxpYyBnZXQgaGVhZGVyQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdy5oZWFkZXJDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXJTZWxlY3RvckNvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuaGVhZGVyU2VsZWN0b3JDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXJEcmFnQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdy5oZWFkZXJEcmFnQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGVhZGVyR3JvdXBDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93LmhlYWRlckdyb3VwQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVyaW5nUm93KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdy5maWx0ZXJSb3c7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB0aGVhZFJvdzogSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4R3JpZEdyb3VwQnlBcmVhQ29tcG9uZW50KVxuICAgIHB1YmxpYyBncm91cEJ5QXJlYTogSWd4R3JpZEdyb3VwQnlBcmVhQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0Ym9keScsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRib2R5OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdwaW5Db250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgcGluQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0Zm9vdCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRmb290OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hSb3dFZGl0aW5nT3ZlcmxheU91dGxldCcsIHsgcmVhZDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUsIHsgcmVhZDogSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgdG1wT3V0bGV0czogUXVlcnlMaXN0PGFueT4gPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkcmFnSW5kaWNhdG9ySWNvbkJhc2UnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZHJhZ0luZGljYXRvckljb25CYXNlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0VkaXRUZW1wbGF0ZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRDdXN0b21EaXJlY3RpdmVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdFRleHREaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFZGl0VGV4dERpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hSb3dBZGRUZXh0RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0FkZFRleHQ6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdEFjdGlvbnNEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgcm93IGV4cGFuZCBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hSb3dFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIHJvdyBjb2xsYXBzZSBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hSb3dDb2xsYXBzZWRJbmRpY2F0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93Q29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIGV4cGFuZCBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hIZWFkZXJFeHBhbmRJbmRpY2F0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgaGVhZGVyRXhwYW5kSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIGNvbGxhcHNlIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEhlYWRlckNvbGxhcHNlSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGhlYWRlckNvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgcm93IGV4cGFuZCBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hFeGNlbFN0eWxlSGVhZGVySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBleGNlbFN0eWxlSGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneERyYWdJbmRpY2F0b3JJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSlcbiAgICBwdWJsaWMgcm93RWRpdFRhYnNERUZBVUxUOiBRdWVyeUxpc3Q8SWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmU+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIHJvd0VkaXRUYWJzQ1VTVE9NOiBRdWVyeUxpc3Q8SWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmU+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdyb3dFZGl0aW5nT3ZlcmxheScsIHsgcmVhZDogSWd4VG9nZ2xlRGlyZWN0aXZlIH0pXG4gICAgcHVibGljIHJvd0VkaXRpbmdPdmVybGF5OiBJZ3hUb2dnbGVEaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gICAgcHVibGljIHRhYmluZGV4ID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyBob3N0Um9sZSA9ICdncmlkJztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4R3JpZFRvb2xiYXJDb21wb25lbnQpXG4gICAgcHVibGljIHRvb2xiYXI6IFF1ZXJ5TGlzdDxJZ3hHcmlkVG9vbGJhckNvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFBhZ2luYXRvckNvbXBvbmVudClcbiAgICBwcm90ZWN0ZWQgcGFnaW5hdGlvbkNvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hQYWdpbmF0b3JDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hGaWx0ZXJpbmdPdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgX291dGxldERpcmVjdGl2ZTogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRDb2xsYXBzZWRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0Q29sbGFwc2VkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFU0ZIZWFkZXJJY29uJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRFU0ZIZWFkZXJJY29uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdzdW1tYXJ5Um93JywgeyByZWFkOiBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50IH0pXG4gICAgcHJvdGVjdGVkIF9zdW1tYXJ5Um93TGlzdDogUXVlcnlMaXN0PElneFN1bW1hcnlSb3dDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncm93JylcbiAgICBwcml2YXRlIF9yb3dMaXN0OiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdwaW5uZWRSb3cnKVxuICAgIHByaXZhdGUgX3Bpbm5lZFJvd0xpc3Q6IFF1ZXJ5TGlzdDxJZ3hHcmlkUm93Q29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Um93RGlyZWN0aXZlLCB7IHJlYWQ6IElneFJvd0RpcmVjdGl2ZSB9KVxuICAgIHByaXZhdGUgX2RhdGFSb3dMaXN0OiBRdWVyeUxpc3Q8SWd4Um93RGlyZWN0aXZlPElneEdyaWRCYXNlRGlyZWN0aXZlPj47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSUdyaWRSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNvdXJjZVN0cmluZ3MoKTogSUdyaWRSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICBpZiAoIXRoaXMuX3Jlc291cmNlU3RyaW5ncykge1xuICAgICAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gQ3VycmVudFJlc291cmNlU3RyaW5ncy5HcmlkUmVzU3RyaW5ncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyaW5nIGxvZ2ljIG9mIHRoZSBgSWd4R3JpZENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBkZWZhdWx0IGlzIEFORC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFtmaWx0ZXJpbmdMb2dpY109XCJmaWx0ZXJpbmdcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJpbmdMb2dpYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5vcGVyYXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcmluZ0xvZ2ljKHZhbHVlOiBGaWx0ZXJpbmdMb2dpYykge1xuICAgICAgICB0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3IgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlcmluZyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgWyhmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpXT1cIm1vZGVsLmZpbHRlcmluZ0V4cHJlc3Npb25zXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFN1cHBvcnRzIHR3by13YXkgYmluZGluZy5cbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gKHZhbHVlIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmICghKHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V4cHJlc3Npb25zVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kLCB2YWwuZmlsdGVyaW5nT3BlcmFuZHNbaW5kZXhdLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gYXMgSUZpbHRlcmluZ0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB2YWwuZmlsdGVyaW5nT3BlcmFuZHNbaW5kZXhdID0gbmV3RXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUudHlwZSA9IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVR5cGUuUmVndWxhcjtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkodGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVmcmVzaEV4cHJlc3Npb25zKCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAqIHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGxvZ2ljO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICB2YWx1ZS50eXBlID0gRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZS5BZHZhbmNlZDtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1BpcGVUcmlnZ2VyKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZS5lbWl0KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpICYmXG4gICAgICAgICAgICAhdGhpcy5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSBmaWx0ZXJlZCBkYXRhIHRocm91Z2ggdGhlIHBpcGVzIGFuZCB0aGVuIGVtaXQgdGhlIGV2ZW50LlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5maWx0ZXJpbmdEb25lLmVtaXQodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGxvY2FsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgbm90IHNldCwgcmV0dXJucyBicm93c2VyJ3MgbGFuZ3VhZ2UuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9sb2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxlQ2hhbmdlLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdpbmdNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5nTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBhZ2luZ01vZGUodmFsOiBHcmlkUGFnaW5nTW9kZSkge1xuICAgICAgICB0aGlzLl9wYWdpbmdNb2RlID0gdmFsO1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmBcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBwYWdpbmcgZmVhdHVyZSBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCBzdGF0ZSBpcyBkaXNhYmxlZCAoZmFsc2UpLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+XG4gICAgICogIDxpZ3gtcGFnaW5hdG9yPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcGFnaW5nID0gdmFsdWU7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIGBwYWdlYCBwcm9wZXJ0eSBmb3JtIGBwYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIGN1cnJlbnQgcGFnZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+XG4gICAgICogIDxpZ3gtcGFnaW5hdG9yIFsocGFnZSldPVwibW9kZWwucGFnZVwiPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRvcj8ucGFnZSB8fCAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFnZSh2YWw6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UgPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIGBwZXJQYWdlYCBwcm9wZXJ0eSBmcm9tIGBwYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIG51bWJlciBvZiB2aXNpYmxlIGl0ZW1zIHBlciBwYWdlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCBpcyAxNS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPlxuICAgICAqICA8aWd4LXBhZ2luYXRvciBbKHBlclBhZ2UpXT1cIm1vZGVsLnBlclBhZ2VcIj48L2lneC1wYWdpbmF0b3I+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGVyUGFnZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0b3I/LnBlclBhZ2UgfHwgREVGQVVMVF9JVEVNU19QRVJfUEFHRTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBlclBhZ2UodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fcGVyUGFnZSA9IHZhbDtcbiAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wZXJQYWdlID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMC4xLjBcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaGlkaW5nIFVJIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgZGlzYWJsZWQgKGZhbHNlKS4gSW4gb3JkZXIgZm9yIHRoZSBVSSB0byB3b3JrLCB5b3UgbmVlZCB0byBlbmFibGUgdGhlIHRvb2xiYXIgYXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgYmVsb3cuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbkhpZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkhpZGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvbHVtbkhpZGluZyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jb2x1bW5IaWRpbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGlmIHRoZSByb3cgc2VsZWN0b3JzIGFyZSBoaWRkZW4uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqICBCeSBkZWZhdWx0IHJvdyBzZWxlY3RvcnMgYXJlIHNob3duXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGhpZGVSb3dTZWxlY3RvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRlUm93U2VsZWN0b3JzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGlkZVJvd1NlbGVjdG9ycyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9oaWRlUm93U2VsZWN0b3JzID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciByb3dzIGNhbiBiZSBtb3ZlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbcm93RHJhZ2dhYmxlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dEcmFnZ2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dEcmFnICYmIHRoaXMuaGFzVmlzaWJsZUNvbHVtbnM7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgc2V0IHJvd0RyYWdnYWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcm93RHJhZyA9IHZhbDtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcm93RHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBJRCB0aGF0IGlzIGJlaW5nIGRyYWdnZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSByb3cgSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhZ1Jvd0lEID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSByb3dzIGFyZSBlZGl0YWJsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyBzZXQgdG8gZmFsc2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RWRpdGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb3dFZGl0YWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hHcmlkU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yb3dFZGl0YWJsZSA9IHZhbDtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBoZWlnaHQodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hlaWdodCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoJylcbiAgICBwdWJsaWMgZ2V0IGhvc3RXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoIHx8IHRoaXMuX2hvc3RXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHdpZHRoIG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGdyaWRXaWR0aCA9IHRoaXMuZ3JpZC53aWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHdpZHRoKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLl93aWR0aCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiBsZXQgZ3JpZEhlYWRlcldpZHRoID0gdGhpcy5ncmlkLmhlYWRlcldpZHRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLndpZHRoLCAxMCkgLSAxNztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHJvdyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbcm93SGVpZ2h0XT1cIjEwMFwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd0hlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0hlaWdodCA/IHRoaXMuX3Jvd0hlaWdodCA6IHRoaXMuZGVmYXVsdFJvd0hlaWdodDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJvd0hlaWdodCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9yb3dIZWlnaHQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZGVmYXVsdCB3aWR0aCBvZiB0aGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtjb2x1bW5XaWR0aF09XCIxMDBcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5XaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uV2lkdGg7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY29sdW1uV2lkdGgodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jb2x1bW5XaWR0aCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNvbHVtbldpZHRoU2V0QnlVc2VyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldC9TZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbZW1wdHlHcmlkTWVzc2FnZV09XCInVGhlIGdyaWQgaXMgZW1wdHknXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZW1wdHlHcmlkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VtcHR5R3JpZE1lc3NhZ2UgPSB2YWx1ZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBlbXB0eUdyaWRNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUdyaWRNZXNzYWdlIHx8IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2VtcHR5R3JpZF9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBncmlkIGlzIGdvaW5nIHRvIHNob3cgYSBsb2FkaW5nIGluZGljYXRvci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2lzTG9hZGluZ109XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgaXNMb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0xvYWRpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0xvYWRpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVMb2FkaW5nU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjdXJyZW50IGRldGVjdGlvbiBjeWNsZSB0byBlbmQgYmVmb3JlIHRyaWdnZXJpbmcgYSBuZXcgb25lLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMb2FkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW5zIHNob3VsZCBiZSBhdXRvLWdlbmVyYXRlZCBvbmNlIGFnYWluIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZ3JpZFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgdG8gYmluZCB0aGUgZ3JpZCB0byByZW1vdGUgZGF0YSBhbmQgaGF2aW5nIGF1dG8tZ2VuZXJhdGVkIGNvbHVtbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKiBOb3RlIHRoYXQgYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgY29sdW1ucywgdGhpcyBwcm9wZXJ0eSB3b3VsZCBiZSBkaXNhYmxlZCB0byBhdm9pZCByZS1jcmVhdGluZ1xuICAgICAqIGNvbHVtbnMgZWFjaCB0aW1lIGEgbmV3IGRhdGEgaXMgYXNzaWduZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIHRoaXMuZ3JpZC5zaG91bGRHZW5lcmF0ZSA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNob3VsZEdlbmVyYXRlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzIGFuZCB0aGUgZ3JpZCBpcyBmaWx0ZXJlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZE1lc3NhZ2VdPVwiJ1RoZSBncmlkIGlzIGVtcHR5J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGVtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UgfHwgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZW1wdHlGaWx0ZXJlZEdyaWRfbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEwLjEuMFxuICAgICAqXG4gICAgICogR2V0cy9TZXRzIHRoZSB0aXRsZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGJ1aWx0LWluIGNvbHVtbiBoaWRpbmcgVUkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbY29sdW1uSGlkaW5nXT1cInRydWVcIiBjb2x1bW5IaWRpbmdUaXRsZT1cIkNvbHVtbiBIaWRpbmdcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5IaWRpbmdUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uSGlkaW5nVGl0bGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY29sdW1uSGlkaW5nVGl0bGUodjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbkhpZGluZ1RpdGxlID0gdjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbkhpZGluZ1RpdGxlSW50ZXJuYWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkhpZGluZ1RpdGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaW5pdGlhbCBwaW5uaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFsbG93cyB0byBhcHBseSBwaW5uaW5nIHRoZSBjb2x1bW5zIHRvIHRoZSBzdGFydCBvciB0aGUgZW5kLlxuICAgICAqIE5vdGUgdGhhdCBwaW5uaW5nIHRvIGJvdGggc2lkZXMgYXQgYSB0aW1lIGlzIG5vdCBhbGxvd2VkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbcGlubmluZ109XCJwaW5uaW5nQ29uZmlnXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGlubmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5pbmc7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgcGlubmluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMuX3Bpbm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9waW5uaW5nID0gdmFsdWU7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEwLjEuMFxuICAgICAqXG4gICAgICogR2V0cy9TZXRzIGlmIHRoZSBidWlsdC1pbiBjb2x1bW4gcGlubmluZyBVSSBzaG91bGQgYmUgc2hvd24gaW4gdGhlIHRvb2xiYXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2NvbHVtblBpbm5pbmddPVwiJ3RydWVcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5QaW5uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uUGlubmluZztcbiAgICB9XG4gICAgcHVibGljIHNldCBjb2x1bW5QaW5uaW5nKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblBpbm5pbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMC4xLjBcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGl0bGUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBVSSBvZiB0aGUgY29sdW1uIHBpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2NvbHVtblBpbm5pbmddPVwiJ3RydWVcIiBbY29sdW1uUGlubmluZ1RpdGxlXT1cIidDb2x1bW4gSGlkaW5nJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtblBpbm5pbmdUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uUGlubmluZ1RpdGxlO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGNvbHVtblBpbm5pbmdUaXRsZSh2OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uUGlubmluZ1RpdGxlID0gdjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtblBpbm5pbmdUaXRsZUludGVybmFsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5QaW5uaW5nVGl0bGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGlmIHRoZSBmaWx0ZXJpbmcgaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYWxsb3dGaWx0ZXJpbmddPVwidHJ1ZVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGFsbG93RmlsdGVyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsb3dGaWx0ZXJpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBhbGxvd0ZpbHRlcmluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5fYWxsb3dGaWx0ZXJpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGxvd0ZpbHRlcmluZyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLnJlZ2lzdGVyU1ZHSWNvbnMoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjR3JpZEhlYWRSb3coKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uID0gbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYWxsb3dBZHZhbmNlZEZpbHRlcmluZ109XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBhbGxvd0FkdmFuY2VkRmlsdGVyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsb3dBZHZhbmNlZEZpbHRlcmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFsbG93QWR2YW5jZWRGaWx0ZXJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93QWR2YW5jZWRGaWx0ZXJpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVnaXN0ZXJTVkdJY29ucygpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlciBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtmaWx0ZXJNb2RlXT1cIidxdWlja0ZpbHRlcidcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCdzIHNldCB0byBGaWx0ZXJNb2RlLnF1aWNrRmlsdGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlck1vZGUodmFsdWU6IEZpbHRlck1vZGUpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyTW9kZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1Jvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN1bW1hcnkgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgc3VtbWFyeVBvc2l0aW9uPVwidG9wXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgYm90dG9tLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdW1tYXJ5UG9zaXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzdW1tYXJ5UG9zaXRpb24odmFsdWU6IEdyaWRTdW1tYXJ5UG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeVBvc2l0aW9uID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3VtbWFyeSBjYWxjdWxhdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIHN1bW1hcnlDYWxjdWxhdGlvbk1vZGU9XCJyb290TGV2ZWxPbmx5XCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgcm9vdEFuZENoaWxkTGV2ZWxzIHdoaWNoIG1lYW5zIHRoZSBzdW1tYXJpZXMgYXJlIGNhbGN1bGF0ZWQgZm9yIHRoZSByb290IGxldmVsIGFuZCBlYWNoIGNoaWxkIGxldmVsLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyeUNhbGN1bGF0aW9uTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUodmFsdWU6IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX3N1bW1hcnlDYWxjdWxhdGlvbk1vZGUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5yZXNldFN1bW1hcnlIZWlnaHQoKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHN1bW1hcnkgcm93IGlzIHZpc2libGUgd2hlbiBncm91cEJ5L3BhcmVudCByb3cgaXMgY29sbGFwc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93U3VtbWFyeU9uQ29sbGFwc2VdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHNob3dTdW1tYXJ5T25Db2xsYXBzZSBpcyBzZXQgdG8gJ2ZhbHNlJyB3aGljaCBtZWFucyB0aGF0IHRoZSBzdW1tYXJ5IHJvdyBpcyBub3QgdmlzaWJsZVxuICAgICAqIHdoZW4gdGhlIGdyb3VwQnkvcGFyZW50IHJvdyBpcyBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNob3dTdW1tYXJ5T25Db2xsYXBzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dTdW1tYXJ5T25Db2xsYXBzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNob3dTdW1tYXJ5T25Db2xsYXBzZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9zaG93U3VtbWFyeU9uQ29sbGFwc2UgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBmaWx0ZXJpbmcgc3RyYXRlZ3kgb2YgdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtmaWx0ZXJTdHJhdGVneV09XCJmaWx0ZXJTdHJhdGVneVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZpbHRlclN0cmF0ZWd5KCk6IElGaWx0ZXJpbmdTdHJhdGVneSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJpbmdTdHJhdGVneTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlclN0cmF0ZWd5KGNsYXNzUmVmOiBJRmlsdGVyaW5nU3RyYXRlZ3kpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyaW5nU3RyYXRlZ3kgPSBjbGFzc1JlZjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHNvcnRpbmcgc3RyYXRlZ3kgb2YgdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzb3J0U3RyYXRlZ3ldPVwic29ydFN0cmF0ZWd5XCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc29ydFN0cmF0ZWd5KCk6IElHcmlkU29ydGluZ1N0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRpbmdTdHJhdGVneTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNvcnRTdHJhdGVneSh2YWx1ZTogSUdyaWRTb3J0aW5nU3RyYXRlZ3kpIHtcbiAgICAgICAgdGhpcy5fc29ydGluZ1N0cmF0ZWd5ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVwcmVzZW50cyB0aGUgc2VsZWN0ZWQgcm93cycgSURzIChwcmltYXJ5IGtleSBvciByb3dEYXRhKVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBwcmltYXJ5S2V5PVwiSURcIiByb3dTZWxlY3Rpb249XCJtdWx0aXBsZVwiIFtzZWxlY3RlZFJvd3NdPVwiWzAsIDEsIDJdXCI+PGlneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzZWxlY3RlZFJvd3Mocm93SURzOiBhbnlbXSkge1xuICAgICAgICB0aGlzLnNlbGVjdFJvd3Mocm93SURzIHx8IFtdLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkUm93cygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRSb3dzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnRzLmZpcnN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgYElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBoZWFkZXJHcm91cHNMaXN0ID0gdGhpcy5ncmlkLmhlYWRlckdyb3Vwc0xpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJHcm91cHNMaXN0KCk6IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgYElneEdyaWRIZWFkZXJDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgaGVhZGVycyA9IHRoaXMuZ3JpZC5oZWFkZXJDZWxsTGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckNlbGxMaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJHcm91cHNMaXN0Lm1hcChoZWFkZXJHcm91cCA9PiBoZWFkZXJHcm91cC5oZWFkZXIpLmZpbHRlcihoZWFkZXIgPT4gaGVhZGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIGBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmaWx0ZXJDZWxscyA9IHRoaXMuZ3JpZC5maWx0ZXJDZWxsTGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlckNlbGxMaXN0KCk6IElneEdyaWRGaWx0ZXJpbmdDZWxsQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJHcm91cHNMaXN0Lm1hcChncm91cCA9PiBncm91cC5maWx0ZXIpLmZpbHRlcihjZWxsID0+IGNlbGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdW1tYXJpZXNSb3dMaXN0KCkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcbiAgICAgICAgaWYgKCF0aGlzLl9zdW1tYXJ5Um93TGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdW1MaXN0ID0gdGhpcy5fc3VtbWFyeVJvd0xpc3QuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBudWxsKTtcbiAgICAgICAgcmVzLnJlc2V0KHN1bUxpc3QpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgSWd4R3JpZFJvd0NvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCByb3dMaXN0ID0gdGhpcy5ncmlkLnJvd0xpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dMaXN0KCkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcbiAgICAgICAgaWYgKCF0aGlzLl9yb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJMaXN0ID0gdGhpcy5fcm93TGlzdFxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gbnVsbClcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICAgIHJlcy5yZXNldChyTGlzdCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGN1cnJlbnRseSByZW5kZXJlZCBgSWd4R3JpZFJvd0NvbXBvbmVudGAncy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGRhdGFMaXN0ID0gdGhpcy5ncmlkLmRhdGFSb3dMaXN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YVJvd0xpc3QoKTogUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZT4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFF1ZXJ5TGlzdDxJZ3hSb3dEaXJlY3RpdmU8SWd4R3JpZEJhc2VEaXJlY3RpdmU+PigpO1xuICAgICAgICBpZiAoIXRoaXMuX2RhdGFSb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJMaXN0ID0gdGhpcy5fZGF0YVJvd0xpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gbnVsbCkuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgICAgICByZXMucmVzZXQockxpc3QpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRTZWxlY3RvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZT4ge1xuICAgICAgICBpZiAodGhpcy5oZWFkU2VsZWN0b3JzVGVtcGxhdGVzICYmIHRoaXMuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcy5maXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcy5maXJzdC50ZW1wbGF0ZVJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUGlubmluZ1RvU3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5pbmcuY29sdW1ucyAhPT0gQ29sdW1uUGlubmluZ1Bvc2l0aW9uLkVuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Jvd1Bpbm5pbmdUb1RvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlubmluZy5yb3dzICE9PSBSb3dQaW5uaW5nUG9zaXRpb24uQm90dG9tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd1NlbGVjdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JEaXJlY3RpdmU+IHtcbiAgICAgICAgaWYgKHRoaXMucm93U2VsZWN0b3JzVGVtcGxhdGVzICYmIHRoaXMucm93U2VsZWN0b3JzVGVtcGxhdGVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXMuZmlyc3QudGVtcGxhdGVSZWY7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dPdXRsZXREaXJlY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcmVudFJvd091dGxldERpcmVjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0Q3VzdG9tKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5yb3dFZGl0Q3VzdG9tRGlyZWN0aXZlcyAmJiB0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0Q3VzdG9tRGlyZWN0aXZlcy5maXJzdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RWRpdFRleHQoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRUZXh0RGlyZWN0aXZlcyAmJiB0aGlzLnJvd0VkaXRUZXh0RGlyZWN0aXZlcy5maXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdFRleHREaXJlY3RpdmVzLmZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0QWN0aW9ucygpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMucm93RWRpdEFjdGlvbnNEaXJlY3RpdmVzICYmIHRoaXMucm93RWRpdEFjdGlvbnNEaXJlY3RpdmVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXMuZmlyc3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRDb250YWluZXIoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRDdXN0b20gPyB0aGlzLnJvd0VkaXRDdXN0b20gOiB0aGlzLmRlZmF1bHRSb3dFZGl0VGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSByb3cgZHJhZyBpbmRpY2F0b3IgaWNvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgfHwgdGhpcy5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlcy5maXJzdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUodmFsOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMuX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZWRpdGFibGUpXG4gICAgICAgICAgICAubWFwKGMgPT4gYy52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgcmV0dXJuIGluZGV4Lmxlbmd0aCA/IGluZGV4WzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFzdEVkaXRhYmxlQ29sdW1uSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmVkaXRhYmxlKVxuICAgICAgICAgICAgLm1hcChjID0+IGMudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhID4gYiA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBpbmRleC5sZW5ndGggPyBpbmRleFswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBUT0RPOiBOYXYgc2VydmljZSBsb2dpYyBkb2Vzbid0IGhhbmRsZSAwIHJlc3VsdHMgZnJvbSB0aGlzIHF1ZXJ5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RWRpdFRhYnMoKTogUXVlcnlMaXN0PElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRUYWJzQ1VTVE9NLmxlbmd0aCA/IHRoaXMucm93RWRpdFRhYnNDVVNUT00gOiB0aGlzLnJvd0VkaXRUYWJzREVGQVVMVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGl2ZURlc2NlbmRhbnQoKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW0gPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcblxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW0gfHwgIU9iamVjdC5rZXlzKGFjdGl2ZUVsZW0pLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWN0aXZlRWxlbS5yb3cgPCAwID9cbiAgICAgICAgICAgIGAke3RoaXMuaWR9XyR7YWN0aXZlRWxlbS5yb3d9XyR7YWN0aXZlRWxlbS5tY2hDYWNoZS5sZXZlbH1fJHthY3RpdmVFbGVtLmNvbHVtbn1gIDpcbiAgICAgICAgICAgIGAke3RoaXMuaWR9XyR7YWN0aXZlRWxlbS5yb3d9XyR7YWN0aXZlRWxlbS5jb2x1bW59YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5jbGFzcycpXG4gICAgcHVibGljIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFt0aGlzLmdldENvbXBvbmVudERlbnNpdHlDbGFzcygnaWd4LWdyaWQnKV07XG4gICAgICAgIC8vIFRoZSBjdXN0b20gY2xhc3NlcyBzaG91bGQgYmUgYXQgdGhlIGVuZC5cbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuY2xhc3MpO1xuICAgICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiYW5uZXJDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuaXNUb3AgPyAnaWd4LWJhbm5lcl9fYm9yZGVyLXRvcCcgOiAnaWd4LWJhbm5lcl9fYm9yZGVyLWJvdHRvbSc7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmdldENvbXBvbmVudERlbnNpdHlDbGFzcygnaWd4LWJhbm5lcicpfSAke3Bvc2l0aW9ufWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzb3J0aW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTdXBwb3J0cyB0d28td2F5IGRhdGEgYmluZGluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFsoc29ydGluZ0V4cHJlc3Npb25zKV09XCJtb2RlbC5zb3J0aW5nRXhwcmVzc2lvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0aW5nRXhwcmVzc2lvbnMoKTogSVNvcnRpbmdFeHByZXNzaW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydGluZ0V4cHJlc3Npb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc29ydGluZ0V4cHJlc3Npb25zKHZhbHVlOiBJU29ydGluZ0V4cHJlc3Npb25bXSkge1xuICAgICAgICB0aGlzLl9zb3J0aW5nRXhwcmVzc2lvbnMgPSBjbG9uZUFycmF5KHZhbHVlKTtcbiAgICAgICAgdGhpcy5zb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UuZW1pdCh0aGlzLl9zb3J0aW5nRXhwcmVzc2lvbnMpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4TGV2ZWxIZWFkZXJEZXB0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPSB0aGlzLmhhc0NvbHVtbkxheW91dHMgP1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC5yZWR1Y2UoKGFjYywgY29sKSA9PiBNYXRoLm1heChhY2MsIGNvbC5yb3dTdGFydCksIDApIDpcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkxpc3QucmVkdWNlKChhY2MsIGNvbCkgPT4gTWF0aC5tYXgoYWNjLCBjb2wubGV2ZWwpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgaGlkZGVuIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBoaWRkZW5Db2wgPSB0aGlzLmdyaWQuaGlkZGVuQ29sdW1uc0NvdW50O1xuICAgICAqIGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoaWRkZW5Db2x1bW5zQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChjb2wpID0+IGNvbC5jb2x1bW5Hcm91cCA9PT0gZmFsc2UgJiYgY29sLmhpZGRlbiA9PT0gdHJ1ZSkubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBwaW5uZWQgY29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZENvbHVtbnNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlubmVkQ29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uTGF5b3V0KS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMC4xLjBcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQgaW5zaWRlIHRoZSB0b2dnbGUgYnV0dG9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBVc2VkIGZvciB0aGUgYnVpbHQtaW4gY29sdW1uIGhpZGluZyBVSSBvZiB0aGVgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbaGlkZGVuQ29sdW1uc1RleHRdPVwiJ0hpZGRlbiBDb2x1bW5zJ1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGhpZGRlbkNvbHVtbnNUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlkZGVuQ29sdW1uc1RleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBoaWRkZW5Db2x1bW5zVGV4dCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9oaWRkZW5Db2x1bW5zVGV4dCA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTAuMS4wXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHQgdG8gYmUgZGlzcGxheWVkIGluc2lkZSB0aGUgdG9nZ2xlIGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVXNlZCBmb3IgdGhlIGJ1aWx0LWluIGNvbHVtbiBwaW5uaW5nIFVJIG9mIHRoZWBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbcGlubmVkQ29sdW1uc1RleHRdPVwiJ1Bpbm5lZENvbHMgVGV4dFwiIFtkYXRhXT1cImRhdGFcIiBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInNTAwcHgnXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1uc1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRDb2x1bW5zVGV4dDtcbiAgICB9XG4gICAgcHVibGljIHNldCBwaW5uZWRDb2x1bW5zVGV4dCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zVGV4dCA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgZ3JpZCBoYXMgYmF0Y2ggZWRpdGluZyBlbmFibGVkLlxuICAgICAqIFdoZW4gYmF0Y2ggZWRpdGluZyBpcyBlbmFibGVkLCBjaGFuZ2VzIGFyZSBub3QgbWFkZSBkaXJlY3RseSB0byB0aGUgdW5kZXJseWluZyBkYXRhLlxuICAgICAqIEluc3RlYWQsIHRoZXkgYXJlIHN0b3JlZCBhcyB0cmFuc2FjdGlvbnMsIHdoaWNoIGNhbiBsYXRlciBiZSBjb21taXR0ZWQgdy8gdGhlIGBjb21taXRgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbYmF0Y2hFZGl0aW5nXT1cInRydWVcIiBbZGF0YV09XCJzb21lRGF0YVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGJhdGNoRWRpdGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JhdGNoRWRpdGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGJhdGNoRWRpdGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbCAhPT0gdGhpcy5fYmF0Y2hFZGl0aW5nKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdHJhbnNhY3Rpb25zO1xuICAgICAgICAgICAgdGhpcy5fYmF0Y2hFZGl0aW5nID0gdmFsO1xuICAgICAgICAgICAgdGhpcy5zd2l0Y2hUcmFuc2FjdGlvblNlcnZpY2UodmFsKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9UcmFuc2FjdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1uc1RleHRJbnRlcm5hbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZENvbHVtbnNUZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0cmFuc2FjdGlvbnMgc2VydmljZSBmb3IgdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmFuc2FjdGlvbnMoKTogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4ge1xuICAgICAgICBpZiAodGhpcy5fZGlUcmFuc2FjdGlvbnMgJiYgIXRoaXMuYmF0Y2hFZGl0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGlUcmFuc2FjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFJvd1N0YXRlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Um93U3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbmN5UG9zaXRpb25MZWZ0KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbmN5UG9zaXRpb25MZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdCh0aGlzLmxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3kpO1xuICAgICAgICBjb25zdCBmb3JtYXRQYXJ0cyA9IGZvcm1hdC5zcGxpdCgnLCcpO1xuICAgICAgICBjb25zdCBpID0gZm9ybWF0UGFydHMuaW5kZXhPZihmb3JtYXRQYXJ0cy5maW5kKGMgPT4gYy5pbmNsdWRlcygnwqQnKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgPSBpIDwgMTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTEuMC4wXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgdG9vbGJhciBpcyBzaG93bi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiID48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzaG93VG9vbGJhcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dUb29sYmFyO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHNob3dUb29sYmFyKG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Nob3dUb29sYmFyID0gbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMS4wLjBcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdG9vbGJhcidzIHRpdGxlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW3Rvb2xiYXJUaXRsZV09XCInTXkgR3JpZCdcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB0b29sYmFyVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rvb2xiYXJUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHRvb2xiYXJUaXRsZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3Rvb2xiYXJUaXRsZSA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBgZXhwb3J0RXhjZWxgIGlzIGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIGV4cG9ydGluZyB0byBNUyBFeGNlbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW2V4cG9ydEV4Y2VsXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBleHBvcnRFeGNlbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXhwb3J0RXhjZWwoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGV4cG9ydEV4Y2VsKG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2V4cG9ydEV4Y2VsID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGBleHBvcnRDc3ZgIGlzIGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBvcHRpb24gZm9yIGV4cG9ydGluZyB0byBDU1YgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbZXhwb3J0Q3N2XT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBleHBvcnRDc3YoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEV4cG9ydENzdigpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGV4cG9ydENzdihuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9leHBvcnRDc3YgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgYGV4cG9ydFRleHRgIGlzIGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGV4dHVhbCBjb250ZW50IGZvciB0aGUgbWFpbiBleHBvcnQgYnV0dG9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2V4cG9ydFRleHRdPVwiJ015IEV4cG9ydGVyJ1wiIFtleHBvcnRDc3ZdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cG9ydFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydFRleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBleHBvcnRUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0VGV4dCA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBgZXhwb3J0RXhjZWxUZXh0YCBpcyBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHR1YWwgY29udGVudCBmb3IgdGhlIE1TIEV4Y2VsIGV4cG9ydCBidXR0b24uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtleHBvcnRFeGNlbFRleHRdPVwiJ015IEV4Y2VsIEV4cG9ydGVyXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbZXhwb3J0VGV4dF09XCInTXkgRXhwb3J0ZXInXCIgW2V4cG9ydENzdl09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZXhwb3J0RXhjZWxUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBvcnRFeGNlbFRleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZXhwb3J0RXhjZWxUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0RXhjZWxUZXh0ID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGBleHBvcnRDc3ZUZXh0YCBpcyBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHR1YWwgY29udGVudCBmb3IgdGhlIENTViBleHBvcnQgYnV0dG9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtleHBvcnRDc3ZUZXh0XT1cIidNeSBDc3YgRXhwb3J0ZXJcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtleHBvcnRUZXh0XT1cIidNeSBFeHBvcnRlcidcIiBbZXhwb3J0RXhjZWxdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cG9ydENzdlRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydENzdlRleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZXhwb3J0Q3N2VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2V4cG9ydENzdlRleHQgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGNlbGwgc2VsZWN0aW9uIG1vZGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIGNlbGwgc2VsZWN0aW9uIG1vZGUgaXMgbXVsdGlwbGVcbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGVcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY2VsbFNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NlbGxTZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY2VsbFNlbGVjdGlvbihzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSkge1xuICAgICAgICB0aGlzLl9jZWxsU2VsZWN0aW9uTW9kZSA9IHNlbGVjdGlvbk1vZGU7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgcm93IHNlbGVjdGlvbiBtb2RlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHJvdyBzZWxlY3Rpb24gbW9kZSBpcyAnbm9uZSdcbiAgICAgKiBOb3RlIHRoYXQgaW4gSWd4R3JpZCBhbmQgSWd4SGllcmFyY2hpY2FsR3JpZCAnbXVsdGlwbGVDYXNjYWRlJyBiZWhhdmVzIGxpa2UgJ211bHRpcGxlJ1xuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dTZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93U2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGNvbHVtbiBzZWxlY3Rpb24gbW9kZVxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSByb3cgc2VsZWN0aW9uIG1vZGUgaXMgbm9uZVxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5TZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5TZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uU2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHBhZ2luZ1N0YXRlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3BhZ2luZ1N0YXRlID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvciAmJiAhdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzID0gdmFsdWUubWV0YWRhdGEuY291bnRSZWNvcmRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYWdpbmdTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZ1N0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJvd0VkaXRNZXNzYWdlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc25hY2tiYXJBY3Rpb25UZXh0ID0gdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfc25hY2tiYXJfYWRkcm93X2FjdGlvbnRleHQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWxjV2lkdGg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWxjSGVpZ2h0ID0gMDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0Zm9vdEhlaWdodDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHN1bW1hcmllc0hlaWdodDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVRyYW5zaXRpb25zID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBsYXN0U2VhcmNoSW5mbzogSVNlYXJjaEluZm8gPSB7XG4gICAgICAgIHNlYXJjaFRleHQ6ICcnLFxuICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgICAgZXhhY3RNYXRjaDogZmFsc2UsXG4gICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgIG1hdGNoSW5mb0NhY2hlOiBbXVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5XaWR0aFNldEJ5VXNlciA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGlubmVkUmVjb3JkczogYW55W107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpbm5lZFJlY29yZHM6IGFueVtdO1xuXG4gICAgcHVibGljIHJlbmRlcmVkJCA9IHRoaXMucmVuZGVyZWQuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVzaXplTm90aWZ5ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByb3dBZGRlZE5vdGlmaWVyID0gbmV3IFN1YmplY3Q8SVJvd0RhdGFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcm93RGVsZXRlZE5vdGlmaWVyID0gbmV3IFN1YmplY3Q8SVJvd0RhdGFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcGlwZVRyaWdnZXJOb3RpZmllciA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIF9maWx0ZXJlZFVucGlubmVkRGF0YTtcbiAgICBwdWJsaWMgX2Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVjaW1hbFBpcGU6IERlY2ltYWxQaXBlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGVQaXBlOiBEYXRlUGlwZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwZXJjZW50UGlwZTogUGVyY2VudFBpcGU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3RvdGFsUmVjb3JkcyA9IC0xO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbHVtbnNXaXRoTm9TZXRXaWR0aHMgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBpcGVUcmlnZ2VyID0gMDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJpbmdQaXBlVHJpZ2dlciA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3VtbWFyeVBpcGVUcmlnZ2VyID0gMDtcblxuICAgIHB1YmxpYyBFTVBUWV9EQVRBID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGVyUGFnZSA9IERFRkFVTFRfSVRFTVNfUEVSX1BBR0U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5nID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5nTW9kZSA9IEdyaWRQYWdpbmdNb2RlLkxvY2FsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3BhZ2luZ1N0YXRlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2hpZGVSb3dTZWxlY3RvcnMgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9yb3dEcmFnID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9waW5uZWRDb2x1bW5zOiBJZ3hDb2x1bW5Db21wb25lbnRbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3VucGlubmVkQ29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKEZpbHRlcmluZ0xvZ2ljLkFuZCk7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc29ydGluZ0V4cHJlc3Npb25zOiBBcnJheTxJU29ydGluZ0V4cHJlc3Npb24+ID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbWF4TGV2ZWxIZWFkZXJEZXB0aCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29sdW1uSGlkaW5nID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29sdW1uUGlubmluZyA9IGZhbHNlO1xuXG4gICAgcHJvdGVjdGVkIF9waW5uZWRSZWNvcmRJRHMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YTogYW55W107XG4gICAgcHJvdGVjdGVkIF9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YTogYW55W107XG4gICAgcHJvdGVjdGVkIF9maWx0ZXJlZFBpbm5lZERhdGE6IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfaGFzVmlzaWJsZUNvbHVtbnM7XG4gICAgcHJvdGVjdGVkIF9hbGxvd0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfYWxsb3dBZHZhbmNlZEZpbHRlcmluZyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZmlsdGVyTW9kZTogRmlsdGVyTW9kZSA9IEZpbHRlck1vZGUucXVpY2tGaWx0ZXI7XG5cblxuICAgIHByb3RlY3RlZCBfZGVmYXVsdFRhcmdldFJlY29yZE51bWJlciA9IDEwO1xuICAgIHByb3RlY3RlZCBfZXhwYW5zaW9uU3RhdGVzOiBNYXA8YW55LCBib29sZWFuPiA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdEV4cGFuZFN0YXRlID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9iYXNlRm9udFNpemU6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2hlYWRlckZlYXR1cmVzV2lkdGggPSBOYU47XG4gICAgcHJvdGVjdGVkIF9pbml0ID0gdHJ1ZTtcbiAgICBwcm90ZWN0ZWQgX2NkclJlcXVlc3RSZXBhaW50ID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF91c2VyT3V0bGV0RGlyZWN0aXZlOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuICAgIHByb3RlY3RlZCBfdHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvblNlcnZpY2U8VHJhbnNhY3Rpb24sIFN0YXRlPjtcbiAgICBwcm90ZWN0ZWQgX2JhdGNoRWRpdGluZyA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBwYWdpbmF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb25Db21wb25lbnRzPy5maXJzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2Nyb2xsU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsTmF0aXZlU2l6ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbHVtblBpbm5pbmdUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgX2NvbHVtbkhpZGluZ1RpdGxlOiBzdHJpbmc7XG5cbiAgICAvKiBUb29sYmFyIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi9cbiAgICBwcml2YXRlIF9zaG93VG9vbGJhciA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2V4cG9ydEV4Y2VsID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZXhwb3J0Q3N2ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfdG9vbGJhclRpdGxlOiBzdHJpbmcgPSBudWxsO1xuICAgIHByaXZhdGUgX2V4cG9ydFRleHQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9leHBvcnRFeGNlbFRleHQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9leHBvcnRDc3ZUZXh0OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcm93RWRpdGFibGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jdXJyZW50Um93U3RhdGU6IGFueTtcbiAgICBwcml2YXRlIF9maWx0ZXJlZFNvcnRlZERhdGEgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBfY3VzdG9tRHJhZ0luZGljYXRvckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwcml2YXRlIF9jZHJSZXF1ZXN0cyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncztcbiAgICBwcml2YXRlIF9lbXB0eUdyaWRNZXNzYWdlID0gbnVsbDtcbiAgICBwcml2YXRlIF9lbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UgPSBudWxsO1xuICAgIHByaXZhdGUgX2lzTG9hZGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xvY2FsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3ZlcmxheUlEcyA9IFtdO1xuICAgIHByaXZhdGUgX2ZpbHRlcmluZ1N0cmF0ZWd5OiBJRmlsdGVyaW5nU3RyYXRlZ3k7XG4gICAgcHJpdmF0ZSBfc29ydGluZ1N0cmF0ZWd5OiBJR3JpZFNvcnRpbmdTdHJhdGVneTtcbiAgICBwcml2YXRlIF9waW5uaW5nOiBJUGlubmluZ0NvbmZpZyA9IHsgY29sdW1uczogQ29sdW1uUGlubmluZ1Bvc2l0aW9uLlN0YXJ0IH07XG5cbiAgICBwcml2YXRlIF9ob3N0V2lkdGg7XG4gICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9hZHZhbmNlZEZpbHRlcmluZ1Bvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGUsXG4gICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuTWlkZGxlXG4gICAgfTtcblxuICAgIHByaXZhdGUgX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nUG9zaXRpb25TZXR0aW5ncyksXG4gICAgfTtcblxuICAgIHByaXZhdGUgY29sdW1uTGlzdERpZmZlcjtcbiAgICBwcml2YXRlIHJvd0xpc3REaWZmZXI7XG4gICAgcHJpdmF0ZSBfaGlkZGVuQ29sdW1uc1RleHQgPSAnJztcbiAgICBwcml2YXRlIF9waW5uZWRDb2x1bW5zVGV4dCA9ICcnO1xuICAgIHByaXZhdGUgX2hlaWdodDogc3RyaW5nIHwgbnVsbCA9ICcxMDAlJztcbiAgICBwcml2YXRlIF93aWR0aDogc3RyaW5nIHwgbnVsbCA9ICcxMDAlJztcbiAgICBwcml2YXRlIF9yb3dIZWlnaHQ7XG4gICAgcHJpdmF0ZSBfaG9yaXpvbnRhbEZvck9mczogQXJyYXk8SWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT4+ID0gW107XG4gICAgcHJpdmF0ZSBfbXVsdGlSb3dMYXlvdXRSb3dTaXplID0gMTtcbiAgICAvLyBDYWNoZXNcbiAgICBwcml2YXRlIF90b3RhbFdpZHRoID0gTmFOO1xuICAgIHByaXZhdGUgX3Bpbm5lZFZpc2libGUgPSBbXTtcbiAgICBwcml2YXRlIF91bnBpbm5lZFZpc2libGUgPSBbXTtcbiAgICBwcml2YXRlIF9waW5uZWRXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF91bnBpbm5lZFdpZHRoID0gTmFOO1xuICAgIHByaXZhdGUgX3Zpc2libGVDb2x1bW5zID0gW107XG4gICAgcHJpdmF0ZSBfY29sdW1uR3JvdXBzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfYXV0b0dlbmVyYXRlZENvbHMgPSBbXTtcbiAgICBwcml2YXRlIF9kYXRhVmlldyA9IFtdO1xuXG4gICAgcHJpdmF0ZSBfY29sdW1uV2lkdGg6IHN0cmluZztcblxuICAgIHByaXZhdGUgX3N1bW1hcnlQb3NpdGlvbjogR3JpZFN1bW1hcnlQb3NpdGlvbiA9IEdyaWRTdW1tYXJ5UG9zaXRpb24uYm90dG9tO1xuICAgIHByaXZhdGUgX3N1bW1hcnlDYWxjdWxhdGlvbk1vZGU6IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlID0gR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUucm9vdEFuZENoaWxkTGV2ZWxzO1xuICAgIHByaXZhdGUgX3Nob3dTdW1tYXJ5T25Db2xsYXBzZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NlbGxTZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlO1xuICAgIHByaXZhdGUgX3Jvd1NlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZTtcbiAgICBwcml2YXRlIF9zZWxlY3RSb3dPbkNsaWNrID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9jb2x1bW5TZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG5cbiAgICBwcml2YXRlIGxhc3RBZGRlZFJvd0luZGV4O1xuICAgIHByaXZhdGUgX2N1cnJlbmN5UG9zaXRpb25MZWZ0OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSByb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneSA9IG5ldyBSb3dFZGl0UG9zaXRpb25TdHJhdGVneSh7XG4gICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQsXG4gICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICBjbG9zZUFuaW1hdGlvbjogbnVsbFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSByb3dFZGl0U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG91dGxldDogdGhpcy5yb3dPdXRsZXREaXJlY3RpdmUsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3lcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfZGF0YUNsb25lU3RyYXRlZ3k6IElEYXRhQ2xvbmVTdHJhdGVneSA9IG5ldyBEZWZhdWx0RGF0YUNsb25lU3RyYXRlZ3koKTtcbiAgICBwcml2YXRlIHRyYW5zYWN0aW9uQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IERSQUdfU0NST0xMX0RFTFRBID0gMTA7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBpZDogc3RyaW5nO1xuICAgIGFic3RyYWN0IGRhdGE6IGFueVtdIHwgbnVsbDtcbiAgICBhYnN0cmFjdCBmaWx0ZXJlZERhdGE6IGFueVtdO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZmlsdGVyZWQgc29ydGVkIGRhdGEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmaWx0ZXJlZFNvcnRlZERhdGEgPSB0aGlzLmdyaWQxLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmVkU29ydGVkRGF0YSgpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0NoYW5nZXNDb3VudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNydWRTZXJ2aWNlLnJvdykge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZiA9IChvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNoYW5nZXMgPSAwO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiBpc09iamVjdChvYmpba2V5XSkgPyBjaGFuZ2VzICs9IGYob2JqW2tleV0pIDogY2hhbmdlcysrKTtcbiAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByb3dDaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZFZhbHVlKHRoaXMuY3J1ZFNlcnZpY2Uucm93LmlkLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiByb3dDaGFuZ2VzID8gZihyb3dDaGFuZ2VzKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFXaXRoQWRkZWRJblRyYW5zYWN0aW9uUm93cygpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2xvbmVBcnJheSh0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKCkpO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZENoYW5nZXModHJ1ZSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHQgPT4gdC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKVxuICAgICAgICAgICAgICAgIC5tYXAodCA9PiB0Lm5ld1ZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jcnVkU2VydmljZS5yb3cgJiYgdGhpcy5jcnVkU2VydmljZS5yb3cuZ2V0Q2xhc3NOYW1lKCkgPT09IElneEFkZFJvdy5uYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKHRoaXMuY3J1ZFNlcnZpY2Uucm93LmluZGV4LCAwLCB0aGlzLmNydWRTZXJ2aWNlLnJvdy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkID8gdGhpcy5kYXRhV2l0aEFkZGVkSW5UcmFuc2FjdGlvblJvd3MubGVuZ3RoIDogdGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSgpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGluZyAmJiAodGhpcy5oYXNaZXJvUmVzdWx0RmlsdGVyIHx8IHRoaXMuaGFzTm9EYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZ0dyaWRUZW1wbGF0ZSA/IHRoaXMubG9hZGluZ0dyaWRUZW1wbGF0ZSA6IHRoaXMubG9hZGluZ0dyaWREZWZhdWx0VGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNaZXJvUmVzdWx0RmlsdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUdyaWRUZW1wbGF0ZSA/IHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgOiB0aGlzLmVtcHR5RmlsdGVyZWRHcmlkVGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNOb0RhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtcHR5R3JpZFRlbXBsYXRlID8gdGhpcy5lbXB0eUdyaWRUZW1wbGF0ZSA6IHRoaXMuZW1wdHlHcmlkRGVmYXVsdFRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBoYXNaZXJvUmVzdWx0RmlsdGVyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGEgJiYgdGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgaGFzTm9EYXRhKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGF0YSB8fCB0aGlzLmRhdGFMZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3VsZE92ZXJsYXlMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgJiYgIXRoaXMuaGFzTm9EYXRhICYmICF0aGlzLmhhc1plcm9SZXN1bHRGaWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzTXVsdGlSb3dTZWxlY3Rpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlXG4gICAgICAgICAgICB8fCB0aGlzLnJvd1NlbGVjdGlvbiA9PT0gR3JpZFNlbGVjdGlvbk1vZGUubXVsdGlwbGVDYXNjYWRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Jvd1NlbGVjdGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGlvbiAhPT0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNDZWxsU2VsZWN0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbFNlbGVjdGlvbiAhPT0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uSW5EcmFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmNtcy5jb2x1bW47XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbFJlc2l6aW5nU2VydmljZTogSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZ3JpZEFQSTogR3JpZEJhc2VBUElTZXJ2aWNlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgR3JpZFR5cGU+LFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25GYWN0b3J5OiBJZ3hGbGF0VHJhbnNhY3Rpb25GYWN0b3J5LFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHVibGljIGRvY3VtZW50OiBhbnksXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJvdGVjdGVkIGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHB1YmxpYyBuYXZpZ2F0aW9uOiBJZ3hHcmlkTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBmaWx0ZXJpbmdTZXJ2aWNlOiBJZ3hGaWx0ZXJpbmdTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KElneE92ZXJsYXlTZXJ2aWNlKSBwcm90ZWN0ZWQgb3ZlcmxheVNlcnZpY2U6IElneE92ZXJsYXlTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgc3VtbWFyeVNlcnZpY2U6IElneEdyaWRTdW1tYXJ5U2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBwcm90ZWN0ZWQgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucyxcbiAgICAgICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgbG9jYWxlSWQ6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSWd4R3JpZFRyYW5zYWN0aW9uKSBwcm90ZWN0ZWQgX2RpVHJhbnNhY3Rpb25zPzogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4pIHtcbiAgICAgICAgc3VwZXIoX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5sb2NhbGUgfHwgdGhpcy5sb2NhbGVJZDtcbiAgICAgICAgdGhpcy5kYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSh0aGlzLmxvY2FsZSk7XG4gICAgICAgIHRoaXMuZGVjaW1hbFBpcGUgPSBuZXcgRGVjaW1hbFBpcGUodGhpcy5sb2NhbGUpO1xuICAgICAgICB0aGlzLmN1cnJlbmN5UGlwZSA9IG5ldyBDdXJyZW5jeVBpcGUodGhpcy5sb2NhbGUpO1xuICAgICAgICB0aGlzLnBlcmNlbnRQaXBlID0gbmV3IFBlcmNlbnRQaXBlKHRoaXMubG9jYWxlKTtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbkZhY3RvcnkuY3JlYXRlKFRSQU5TQUNUSU9OX1RZUEUuTm9uZSk7XG4gICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucy5jbG9uZVN0cmF0ZWd5ID0gdGhpcy5kYXRhQ2xvbmVTdHJhdGVneTtcbiAgICAgICAgdGhpcy5jZHIuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxuICAgIHB1YmxpYyBoaWRlQWN0aW9uU3RyaXAoKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uU3RyaXA/LmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJGZWF0dXJlc1dpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGV0YWlsUmVjb3JkKF9yZWMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNHcm91cEJ5UmVjb3JkKF9yZWMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzR2hvc3RSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5naG9zdFJlY29yZCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0FkZFJvd1JlY29yZChyZWNvcmQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkLmFkZFJvdyAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBSZXR1cm5zIHRoZSByb3cgaW5kZXggb2YgYSByb3cgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZ1bGwgdmlldyBkYXRhIGxpa2UgcGlubmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YVZpZXdJbmRleChyb3dJbmRleCwgcGlubmVkKSB7XG4gICAgICAgIGlmIChwaW5uZWQgJiYgIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3ApIHtcbiAgICAgICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggKyB0aGlzLnVucGlubmVkRGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKCFwaW5uZWQgJiYgdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCkge1xuICAgICAgICAgICAgcm93SW5kZXggPSByb3dJbmRleCArIHRoaXMucGlubmVkRGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNEZXRhaWxzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGdyaWQgdmlydHVhbGl6YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEluY2x1ZGVzIHRoZSBzdGFydCBpbmRleCBhbmQgaG93IG1hbnkgcmVjb3JkcyBhcmUgcmVuZGVyZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JpZFZpcnRTdGF0ZSA9IHRoaXMuZ3JpZDEudmlydHVhbGl6YXRpb25TdGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpcnR1YWxpemF0aW9uU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHZpcnR1YWxpemF0aW9uU3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZU92ZXJsYXlzKCkge1xuICAgICAgICB0aGlzLm92ZXJsYXlJRHMuZm9yRWFjaChvdmVybGF5SUQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQob3ZlcmxheUlEKTtcblxuICAgICAgICAgICAgaWYgKG92ZXJsYXk/LnZpc2libGUgJiYgIW92ZXJsYXkuY2xvc2VBbmltYXRpb25QbGF5ZXI/Lmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuaGlkZShvdmVybGF5SUQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVjb3JkIGlzIHBpbm5lZCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcm93SW5kZXggSW5kZXggb2YgdGhlIHJlY29yZCBpbiB0aGUgYGRhdGFWaWV3YCBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlY29yZFBpbm5lZEJ5Vmlld0luZGV4KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAodGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA8IHRoaXMucGlubmVkRGF0YVZpZXcubGVuZ3RoKSB8fFxuICAgICAgICAgICAgKCF0aGlzLmlzUm93UGlubmluZ1RvVG9wICYmIHJvd0luZGV4ID49IHRoaXMudW5waW5uZWREYXRhVmlldy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVjb3JkIGlzIHBpbm5lZCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcm93SW5kZXggSW5kZXggb2YgdGhlIHJlY29yZCBpbiB0aGUgYGZpbHRlcmVkU29ydGVkRGF0YWAgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNSZWNvcmRQaW5uZWRCeUluZGV4KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAodGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA8IHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YS5sZW5ndGgpIHx8XG4gICAgICAgICAgICAoIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgJiYgcm93SW5kZXggPj0gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzUmVjb3JkUGlubmVkKHJlYykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJbml0aWFsUGlubmVkSW5kZXgocmVjKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIFJldHVybnMgdGhlIHJlY29yZCBpbmRleCBpbiBvcmRlciBvZiBwaW5uaW5nIGJ5IHRoZSB1c2VyLiBEb2VzIG5vdCBjb25zaWRlciBzb3J0aW5nL2ZpbHRlcmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW5pdGlhbFBpbm5lZEluZGV4KHJlYykge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2lkKHJlYyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzUGlubmVkUmVjb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFJlY29yZHNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3J1ZFNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuY3J1ZFNlcnZpY2U7XG4gICAgfVxuXG4gICAgcHVibGljIF9zZXR1cFNlcnZpY2VzKCkge1xuICAgICAgICB0aGlzLmdyaWRBUEkuZ3JpZCA9IHRoaXM7XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZ3JpZCA9IHRoaXM7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5ncmlkID0gdGhpcztcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLmdyaWQgPSB0aGlzO1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZ3JpZCA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuZ3JpZCA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIF9zZXR1cExpc3RlbmVycygpIHtcbiAgICAgICAgY29uc3QgZGVzdHJ1Y3RvciA9IHRha2VVbnRpbDxhbnk+KHRoaXMuZGVzdHJveSQpO1xuICAgICAgICBmcm9tRXZlbnQodGhpcy5uYXRpdmVFbGVtZW50LCAnZm9jdXNvdXQnKS5waXBlKGZpbHRlcigoKSA9PiAhIXRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlKSwgZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5kcmFnTW9kZSAmJiB0aGlzLnBsYXRmb3JtLmlzSUUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3J1ZFNlcnZpY2UuY2VsbCAmJlxuICAgICAgICAgICAgICAgICEhdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUgJiZcbiAgICAgICAgICAgICAgICAoKGV2ZW50LnRhcmdldCA9PT0gdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA8IHRoaXMuZGF0YVZpZXcubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUucm93ID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgfHwgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy50Zm9vdC5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA9PT0gdGhpcy5kYXRhVmlldy5sZW5ndGgpKSAmJlxuICAgICAgICAgICAgICAgICEodGhpcy5yb3dFZGl0YWJsZSAmJiB0aGlzLmNydWRTZXJ2aWNlLnJvd0VkaXRpbmdCbG9ja2VkICYmIHRoaXMuY3J1ZFNlcnZpY2Uucm93SW5FZGl0TW9kZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZSA9IHt9IGFzIElBY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb3dBZGRlZE5vdGlmaWVyLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKGFyZ3MgPT4gdGhpcy5yZWZyZXNoR3JpZFN0YXRlKGFyZ3MpKTtcbiAgICAgICAgdGhpcy5yb3dEZWxldGVkTm90aWZpZXIucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoYXJncyA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmRlbGV0ZU9wZXJhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnNjcmliZVRvVHJhbnNhY3Rpb25zKCk7XG5cbiAgICAgICAgdGhpcy5yZXNpemVOb3RpZnkucGlwZShcbiAgICAgICAgICAgIGRlc3RydWN0b3IsXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpLFxuICAgICAgICAgICAgdGhyb3R0bGVUaW1lKDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0pXG4gICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyTm90aWZpZXIucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnBpcGVUcmlnZ2VyKyspO1xuICAgICAgICB0aGlzLmNvbHVtbk1vdmluZ0VuZC5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpKTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLm9wZW5pbmcucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPT09IGV2ZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBldmVudC5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmluaXRpYWxpemUodGhpcywgdGhpcy5vdmVybGF5U2VydmljZSwgZXZlbnQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5vcGVuZWQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3MgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKGV2ZW50LmlkKT8uc2V0dGluZ3M7XG5cbiAgICAgICAgICAgIC8vIGRvIG5vdCBoaWRlIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgb3ZlcmxheSBvbiBzY3JvbGxcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGV2ZW50LmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2V0QWRkQnV0dG9uRm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkbyBub3QgaGlkZSB0aGUgb3ZlcmxheSBpZiBpdCdzIGF0dGFjaGVkIHRvIGEgcm93XG4gICAgICAgICAgICBpZiAodGhpcy5yb3dFZGl0aW5nT3ZlcmxheT8ub3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG92ZXJsYXlTZXR0aW5ncz8ub3V0bGV0ID09PSB0aGlzLm91dGxldCAmJiB0aGlzLm92ZXJsYXlJRHMuaW5kZXhPZihldmVudC5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5SURzLnB1c2goZXZlbnQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNsb3NlZC5waXBlKGRlc3RydWN0b3IsIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kID0gdGhpcy5vdmVybGF5SURzLmluZGV4T2YoZXZlbnQuaWQpO1xuICAgICAgICAgICAgaWYgKGluZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlJRHMuc3BsaWNlKGluZCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGF0YUNoYW5naW5nLnBpcGUoZGVzdHJ1Y3RvciwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSkuc3Vic2NyaWJlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlY2FsY1NpemUgPSB0aGlzLmlzUGVyY2VudEhlaWdodCAmJlxuICAgICAgICAgICAgICAgICghdGhpcy5jYWxjSGVpZ2h0IHx8IHRoaXMuY2FsY0hlaWdodCA9PT0gdGhpcy5nZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID09PSB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogdGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcik7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVjYWxjU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuICAgICAgICAgICAgICAgICRldmVudC5jb250YWluZXJTaXplID0gdGhpcy5jYWxjSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUxvYWRpbmdTdGF0ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbGJhclZpc2liaWxpdHlDaGFuZ2VkLnBpcGUoZGVzdHJ1Y3RvciwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGNhbGxlZCB0byByZWNhbGMgYWxsIHdpZHRocyB0aGF0IG1heSBoYXZlIGNoYW5nZXMgYXMgYSByZXN1bHQgb2ZcbiAgICAgICAgICAgIC8vIHRoZSB2ZXJ0LiBzY3JvbGxiYXIgc2hvd2luZy9oaWRpbmdcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5jb250ZW50U2l6ZUNoYW5nZS5waXBlKGRlc3RydWN0b3IsIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRTaXplcyhmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub25EZW5zaXR5Q2hhbmdlZC5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5zdW1tYXJ5SGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBTZXJ2aWNlcygpO1xuICAgICAgICB0aGlzLl9zZXR1cExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnJvd0xpc3REaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZChbXSkuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmNvbHVtbkxpc3REaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZChbXSkuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmNhbGNXaWR0aCA9IHRoaXMud2lkdGggJiYgdGhpcy53aWR0aC5pbmRleE9mKCclJykgPT09IC0xID8gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIDogMDtcbiAgICAgICAgdGhpcy5zaG91bGRHZW5lcmF0ZSA9IHRoaXMuYXV0b0dlbmVyYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDb2x1bW5zQ2FjaGVzKCkge1xuICAgICAgICB0aGlzLmNvbHVtbkxpc3QuZm9yRWFjaChjb2x1bW4gPT4gY29sdW1uLnJlc2V0Q2FjaGVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlUm93SUQoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcHJpbWFyeUNvbHVtbiA9IHRoaXMuY29sdW1uTGlzdC5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IHRoaXMucHJpbWFyeUtleSk7XG4gICAgICAgIGNvbnN0IGlkVHlwZSA9IHRoaXMuZGF0YS5sZW5ndGggP1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlRGF0YVR5cGVzKHRoaXMuZGF0YVswXVt0aGlzLnByaW1hcnlLZXldKSA6IHByaW1hcnlDb2x1bW4gPyBwcmltYXJ5Q29sdW1uLmRhdGFUeXBlIDogJ3N0cmluZyc7XG4gICAgICAgIHJldHVybiBpZFR5cGUgPT09ICdzdHJpbmcnID8gdXVpZHY0KCkgOiBGQUtFX1JPV19JRC0tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRGb3JPZkNhY2hlKCkge1xuICAgICAgICBjb25zdCBmaXJzdFZpcnRSb3cgPSB0aGlzLmRhdGFSb3dMaXN0LmZpcnN0O1xuICAgICAgICBpZiAoZmlyc3RWaXJ0Um93KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2RyUmVxdWVzdHMpIHtcbiAgICAgICAgICAgICAgICBmaXJzdFZpcnRSb3cudmlydERpclJvdy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlyc3RWaXJ0Um93LnZpcnREaXJSb3cuYXNzdW1lTWFzdGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldEZpbHRlcmVkRGF0YShkYXRhLCBwaW5uZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiBwaW5uZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkUGlubmVkRGF0YSA9IGRhdGEgfHwgW107XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFVucGlubmVkID0gdGhpcy5fZmlsdGVyZWRVbnBpbm5lZERhdGEgfHwgW107XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSBbLi4uIHRoaXMuX2ZpbHRlcmVkUGlubmVkRGF0YSwgLi4uZmlsdGVyZWRVbnBpbm5lZF07XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5sZW5ndGggPiAwID8gZmlsdGVyZWREYXRhIDogdGhpcy5fZmlsdGVyZWRVbnBpbm5lZERhdGE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNQaW5uZWRSZWNvcmRzICYmICFwaW5uZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkVW5waW5uZWREYXRhID0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDb2x1bW5Db2xsZWN0aW9ucygpIHtcbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbHVtbnMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fcGlubmVkVmlzaWJsZS5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl91bnBpbm5lZFZpc2libGUubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q2FjaGVkV2lkdGhzKCkge1xuICAgICAgICB0aGlzLl91bnBpbm5lZFdpZHRoID0gTmFOO1xuICAgICAgICB0aGlzLl9waW5uZWRXaWR0aCA9IE5hTjtcbiAgICAgICAgdGhpcy5fdG90YWxXaWR0aCA9IE5hTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCA9IHRydWUpIHtcbiAgICAgICAgaWYgKHJlY2FsY0ZlYXR1cmVXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCA9IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0Rm9yT2ZDYWNoZSgpO1xuICAgICAgICB0aGlzLnJlc2V0Q29sdW1uc0NhY2hlcygpO1xuICAgICAgICB0aGlzLnJlc2V0Q29sdW1uQ29sbGVjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlZFdpZHRocygpO1xuICAgICAgICB0aGlzLmhhc1Zpc2libGVDb2x1bW5zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9jb2x1bW5Hcm91cHMgPSB0aGlzLmNvbHVtbkxpc3Quc29tZShjb2wgPT4gY29sLmNvbHVtbkdyb3VwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgdGhpcy50b29sYmFyLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSkpO1xuICAgICAgICB0aGlzLnNldFVwUGFnaW5hdG9yKCk7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkNvbXBvbmVudHMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0VXBQYWdpbmF0b3IoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmFjdGlvblN0cmlwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblN0cmlwLm1lbnVPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdXRsZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRhUmViaW5kaW5nKGV2ZW50OiBJRm9yT2ZEYXRhQ2hhbmdpbmdFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdpbmcuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGF0YVJlYm91bmQoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgc2V0VXBQYWdpbmF0b3IoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUNoYW5nZS5waXBlKHRha2VXaGlsZSgoKSA9PiAhIXRoaXMucGFnaW5hdG9yKSwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChwYWdlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQocGFnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdpbmdEb25lLnBpcGUodGFrZVdoaWxlKCgpID0+ICEhdGhpcy5wYWdpbmF0b3IpLCBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGFyZ3M6IElQYWdlRXZlbnRBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmdEb25lLmVtaXQoeyBwcmV2aW91czogYXJncy5wcmV2aW91cywgY3VycmVudDogYXJncy5jdXJyZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUbygwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wZXJQYWdlQ2hhbmdlLnBpcGUodGFrZVdoaWxlKCgpID0+ICEhdGhpcy5wYWdpbmF0b3IpLCBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHBlclBhZ2U6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXIodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVyUGFnZUNoYW5nZS5lbWl0KHBlclBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGaWx0ZXJlZFNvcnRlZERhdGEoZGF0YSwgcGlubmVkOiBib29sZWFuKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhIHx8IFtdO1xuICAgICAgICBpZiAodGhpcy5waW5uZWRSZWNvcmRzQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBpZiAocGlubmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhID0gZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLnBpbm5lZFJlY29yZHMgPSBkYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkRGF0YSA9IHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3BcbiAgICAgICAgICAgICAgICAgICAgPyBbLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YSwgLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhXVxuICAgICAgICAgICAgICAgICAgICA6IFsuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEsIC4uLiB0aGlzLl9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGFdO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlYXJjaCh0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhID0gZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkRGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZWFyY2godHJ1ZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVpbGREYXRhVmlldygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0SG9yaXpvbnRhbEZvck9mcygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudEZpbHRlciA9IChpdGVtOiBJZ3hSb3dEaXJlY3RpdmU8YW55PiB8IElneFN1bW1hcnlSb3dDb21wb25lbnQpID0+IHRoaXMuaXNEZWZpbmVkKGl0ZW0ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbEZvck9mcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RhdGFSb3dMaXN0LmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpLFxuICAgICAgICAgICAgLi4udGhpcy5fc3VtbWFyeVJvd0xpc3QuZmlsdGVyKGVsZW1lbnRGaWx0ZXIpLm1hcChpdGVtID0+IGl0ZW0udmlydERpclJvdylcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfc2V0dXBSb3dPYnNlcnZlcnMoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRGaWx0ZXIgPSAoaXRlbTogSWd4Um93RGlyZWN0aXZlPGFueT4gfCBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50KSA9PiB0aGlzLmlzRGVmaW5lZChpdGVtLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RGb3JPZnMgPSBwaXBlKG1hcCgoY29sbGVjdGlvbjogYW55W10pID0+IGNvbGxlY3Rpb24uZmlsdGVyKGVsZW1lbnRGaWx0ZXIpLm1hcChpdGVtID0+IGl0ZW0udmlydERpclJvdykpKTtcbiAgICAgICAgY29uc3Qgcm93TGlzdE9ic2VydmVyID0gZXh0cmFjdEZvck9mcyh0aGlzLl9kYXRhUm93TGlzdC5jaGFuZ2VzKTtcbiAgICAgICAgY29uc3Qgc3VtbWFyeVJvd09ic2VydmVyID0gZXh0cmFjdEZvck9mcyh0aGlzLl9zdW1tYXJ5Um93TGlzdC5jaGFuZ2VzKTtcbiAgICAgICAgcm93TGlzdE9ic2VydmVyLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNldEhvcml6b250YWxGb3JPZnMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1bW1hcnlSb3dPYnNlcnZlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsRm9yT2ZzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2V0SG9yaXpvbnRhbEZvck9mcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIF96b25lQmVnb25lTGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5nZXRTY3JvbGwoKS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnZlcnRpY2FsU2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyLmdldFNjcm9sbCgpLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaG9yaXpvbnRhbFNjcm9sbEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlc2l6ZU5vdGlmeS5uZXh0KCkpO1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2YWJsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNpemVOb3RpZnkubmV4dCgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdFBpbm5pbmcoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICAgICAgdGhpcy5faW5pdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5yZWF0dGFjaCgpO1xuICAgICAgICB0aGlzLl9zZXR1cFJvd09ic2VydmVycygpO1xuICAgICAgICB0aGlzLl96b25lQmVnb25lTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgY29uc3QgdmVydFNjckRDID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5kaXNwbGF5Q29udGFpbmVyO1xuICAgICAgICB2ZXJ0U2NyREMuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5wcmV2ZW50Q29udGFpbmVyU2Nyb2xsLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuX3Bpbm5lZFJvd0xpc3QuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUGlubmVkUm93c0NoYW5nZWQoY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXI/LmNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYyA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhW3RoaXMubGFzdEFkZGVkUm93SW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyhyZWMsIDApO1xuICAgICAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhci5jbG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBLZWVwIHRoZSBzdHJlYW0gb3BlbiBmb3IgZnV0dXJlIHN1YnNjcmliZXJzXG4gICAgICAgIHRoaXMucmVuZGVyZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGVyUGFnZSA9IHRoaXMuX3BlclBhZ2UgIT09IERFRkFVTFRfSVRFTVNfUEVSX1BBR0UgPyB0aGlzLl9wZXJQYWdlIDogdGhpcy5wYWdpbmF0b3IucGVyUGFnZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci50b3RhbFJlY29yZHMgPSB0aGlzLnRvdGFsUmVjb3JkcyA/IHRoaXMudG90YWxSZWNvcmRzIDogdGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzO1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLm92ZXJsYXlTZXR0aW5ncyA9IHsgb3V0bGV0OiB0aGlzLm91dGxldCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLnJlbmRlcmVkLm5leHQodHJ1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5vdGlmeUNoYW5nZXMocmVwYWludCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2RyUmVxdWVzdFJlcGFpbnQgPSByZXBhaW50O1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIHN1cGVyLm5nRG9DaGVjaygpO1xuICAgICAgICBpZiAodGhpcy5faW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NkclJlcXVlc3RSZXBhaW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Tm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlYXJjaCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jZHJSZXF1ZXN0cykge1xuICAgICAgICAgICAgdGhpcy5yZXNldE5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlcyAmJiB0aGlzLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlcy5maXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGVzLmZpcnN0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG1wT3V0bGV0cy5mb3JFYWNoKCh0bXBsT3V0bGV0KSA9PiB7XG4gICAgICAgICAgICB0bXBsT3V0bGV0LmNsZWFuQ2FjaGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25DaGFuZ2UkLm5leHQoKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkNoYW5nZSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuZGV0YWNoKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3ZlcmxheUlEcy5mb3JFYWNoKG92ZXJsYXlJRCA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5nZXRPdmVybGF5QnlJZChvdmVybGF5SUQpO1xuXG4gICAgICAgICAgICBpZiAob3ZlcmxheSAmJiAhb3ZlcmxheS5kZXRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuZGV0YWNoKG92ZXJsYXlJRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyPy5nZXRTY3JvbGwoKT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy52ZXJ0aWNhbFNjcm9sbEhhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXI/LmdldFNjcm9sbCgpPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhvcml6b250YWxTY3JvbGxIYW5kbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHZlcnRTY3JEQyA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXI/LmRpc3BsYXlDb250YWluZXI7XG4gICAgICAgICAgICB2ZXJ0U2NyREM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMucHJldmVudENvbnRhaW5lclNjcm9sbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHNwZWNpZmllZCBjb2x1bW4ncyB2aXNpYmlsaXR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS50b2dnbGVDb2x1bW5WaXNpYmlsaXR5KHtcbiAgICAgKiAgICAgICBjb2x1bW46IHRoaXMuZ3JpZDEuY29sdW1uc1swXSxcbiAgICAgKiAgICAgICBuZXdWYWx1ZTogdHJ1ZVxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVDb2x1bW5WaXNpYmlsaXR5KGFyZ3M6IElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZEV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBjb2wgPSBhcmdzLmNvbHVtbiA/IHRoaXMuY29sdW1uTGlzdC5maW5kKChjKSA9PiBjID09PSBhcmdzLmNvbHVtbikgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKCFjb2wpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb2wudG9nZ2xlVmlzaWJpbGl0eShhcmdzLm5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSBsaXN0IG9mIGtleS12YWx1ZSBwYWlycyBbcm93IElELCBleHBhbnNpb24gc3RhdGVdLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJbmNsdWRlcyBvbmx5IHN0YXRlcyB0aGF0IGRpZmZlciBmcm9tIHRoZSBkZWZhdWx0IG9uZS5cbiAgICAgKiBTdXBwb3J0cyB0d28td2F5IGJpbmRpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImRhdGFcIiBbKGV4cGFuc2lvblN0YXRlcyldPVwibW9kZWwuZXhwYW5zaW9uU3RhdGVzXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZXhwYW5zaW9uU3RhdGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5zaW9uU3RhdGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZXhwYW5zaW9uU3RhdGVzKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPih2YWx1ZSk7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzQ2hhbmdlLmVtaXQodGhpcy5fZXhwYW5zaW9uU3RhdGVzKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgYWxsIHJvd3MuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZXhwYW5kQWxsKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZEFsbCgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEV4cGFuZFN0YXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5leHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgYWxsIHJvd3MuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY29sbGFwc2VBbGwoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2VBbGwoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmV4cGFuZFJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kUm93KHJvd0lEOiBhbnkpIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJLnNldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJvd0lELCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNvbGxhcHNlUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xsYXBzZVJvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgZmFsc2UpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQudG9nZ2xlUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVSb3cocm93SUQ6IGFueSkge1xuICAgICAgICBjb25zdCByZWMgPSB0aGlzLmdyaWRBUEkuZ2V0X3JlY19ieV9pZChyb3dJRCk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJlYyk7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgIXN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldERlZmF1bHRFeHBhbmRTdGF0ZShfcmVjOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG5hdGl2ZUVsID0gdGhpcy5ncmlkLm5hdGl2ZUVsZW1lbnQuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBvdXRsZXQgdXNlZCB0byBhdHRhY2ggdGhlIGdyaWQncyBvdmVybGF5cyB0by5cbiAgICAgKlxuICAgICAqIEByZW1hcmtcbiAgICAgKiBJZiBzZXQsIHJldHVybnMgdGhlIG91dGxldCBkZWZpbmVkIG91dHNpZGUgdGhlIGdyaWQuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBncmlkJ3MgaW50ZXJuYWwgb3V0bGV0IGRpcmVjdGl2ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgb3V0bGV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3V0bGV0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBvdXRsZXQodmFsOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlKSB7XG4gICAgICAgIHRoaXMuX3VzZXJPdXRsZXREaXJlY3RpdmUgPSB2YWw7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCByb3dIZWlnaCA9IHRoaXMuZ3JpZC5kZWZhdWx0Um93SGVpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuZGlzcGxheURlbnNpdHkpIHtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29zeTpcbiAgICAgICAgICAgICAgICByZXR1cm4gNDA7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvbXBhY3Q6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gNTA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFN1bW1hcnlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMwO1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiAyNDtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDM2O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudGAncyBtaW5pbXVtIGFsbG93ZWQgd2lkdGguXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFVzZWQgaW50ZXJuYWxseSBmb3IgcmVzdHJpY3RpbmcgaGVhZGVyIGdyb3VwIGNvbXBvbmVudCB3aWR0aC5cbiAgICAgKiBUaGUgdmFsdWVzIGJlbG93IGRlcGVuZCBvbiB0aGUgaGVhZGVyIGNlbGwgZGVmYXVsdCByaWdodC9sZWZ0IHBhZGRpbmcgdmFsdWVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiAyNDtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQ4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgY29udGFpbmVyIGZvciB0aGUgcGlubmVkIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHBpbm5lZFdpZHRoID0gdGhpcy5ncmlkLmdldFBpbm5lZFdpZHRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkV2lkdGgoKSB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5fcGlubmVkV2lkdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGlubmVkV2lkdGggPSB0aGlzLmdldFBpbm5lZFdpZHRoKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHdpZHRoIG9mIHRoZSBjb250YWluZXIgZm9yIHRoZSB1bnBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB1bnBpbm5lZFdpZHRoID0gdGhpcy5ncmlkLmdldFVucGlubmVkV2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1bnBpbm5lZFdpZHRoKCkge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3VucGlubmVkV2lkdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bnBpbm5lZFdpZHRoID0gdGhpcy5nZXRVbnBpbm5lZFdpZHRoKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0hvcml6b250YWxTY3JvbGxIaWRkZW4oKSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLnVucGlubmVkV2lkdGggLSB0aGlzLnRvdGFsV2lkdGg7XG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoID09PSBudWxsIHx8IGRpZmYgPj0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIEdldHMgdGhlIGNvbWJpbmVkIHdpZHRoIG9mIHRoZSBjb2x1bW5zIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBlbmFibGVkIGdyaWQgZmVhdHVyZXMuIFRoZXkgYXJlIGZpeGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBmZWF0dXJlQ29sdW1uc1dpZHRoKGV4cGFuZGVyPzogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHRoaXMuX2hlYWRlckZlYXR1cmVzV2lkdGgpKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBwbGF0Zm9ybVV0aWwuaXNCcm93c2VyIGNoZWNrXG4gICAgICAgICAgICBjb25zdCByb3dTZWxlY3RBcmVhID0gdGhpcy5oZWFkZXJTZWxlY3RvckNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlclNlbGVjdG9yQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwO1xuICAgICAgICAgICAgY29uc3Qgcm93RHJhZ0FyZWEgPSB0aGlzLnJvd0RyYWdnYWJsZSAmJiB0aGlzLmhlYWRlckRyYWdDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJEcmFnQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBhYmxlQXJlYSA9IHRoaXMuaGVhZGVyR3JvdXBDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJHcm91cENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVyV2lkdGggPSBleHBhbmRlcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID8gZXhwYW5kZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoID0gcm93U2VsZWN0QXJlYSArIHJvd0RyYWdBcmVhICsgZ3JvdXBhYmxlQXJlYSArIGV4cGFuZGVyV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlckZlYXR1cmVzV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN1bW1hcmllc01hcmdpbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZUNvbHVtbnNXaWR0aCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGNvbHVtcyA9IHRoaXMuZ3JpZC5jb2x1bW5zQ29sbGVjdGlvbi5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnNDb2xsZWN0aW9uKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVkID8gdGhpcy5fY29sdW1ucyA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIHBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRDb2x1bW5zID0gdGhpcy5ncmlkLnBpbm5lZENvbHVtbnMuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgaWYgKHRoaXMuX3Bpbm5lZFZpc2libGUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkVmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9waW5uZWRWaXNpYmxlID0gdGhpcy5fcGlubmVkQ29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuaGlkZGVuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFZpc2libGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgcGlubmVkIGBJZ3hSb3dDb21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHBpbm5lZFJvdyA9IHRoaXMuZ3JpZC5waW5uZWRSb3dzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkUm93cygpOiBJZ3hHcmlkUm93Q29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkUm93TGlzdC50b0FycmF5KCkuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdW5waW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdW5waW5uZWRDb2x1bW5zID0gdGhpcy5ncmlkLnVucGlubmVkQ29sdW1ucy5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLl91bnBpbm5lZFZpc2libGUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRWaXNpYmxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VucGlubmVkVmlzaWJsZSA9IHRoaXMuX3VucGlubmVkQ29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gIWNvbC5oaWRkZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRWaXNpYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB3aWR0aGAgdG8gYmUgc2V0IG9uIGBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIZWFkZXJHcm91cFdpZHRoKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoID0gcGFyc2VGbG9hdChjb2x1bW4uY2FsY1dpZHRoKTtcbiAgICAgICAgY29uc3QgbWluV2lkdGggPSB0aGlzLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoO1xuXG4gICAgICAgIGlmIChjb2xXaWR0aCA8IG1pbldpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWluV2lkdGggKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xXaWR0aCArICdweCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYElneENvbHVtbkNvbXBvbmVudGAgYnkgZmllbGQgbmFtZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q29sID0gdGhpcy5ncmlkMS5nZXRDb2x1bW5CeU5hbWUoXCJJRFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb2x1bW5CeU5hbWUobmFtZTogc3RyaW5nKTogSWd4Q29sdW1uQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdC5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtbkJ5VmlzaWJsZUluZGV4KGluZGV4OiBudW1iZXIpOiBJZ3hDb2x1bW5Db21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kKChjb2wpID0+XG4gICAgICAgICAgICAhY29sLmNvbHVtbkdyb3VwICYmICFjb2wuY29sdW1uTGF5b3V0ICYmXG4gICAgICAgICAgICBjb2wudmlzaWJsZUluZGV4ID09PSBpbmRleFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdmlzaWJsZSBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ3JpZC52aXNpYmxlQ29sdW1ucy5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpc2libGVDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgaWYgKHRoaXMuX3Zpc2libGVDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGVDb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Zpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcihjID0+ICFjLmhpZGRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYFxuICAgICAqXG4gICAgICogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdG90YWxQYWdlcyA9IHRoaXMuZ3JpZC50b3RhbFBhZ2VzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxQYWdlcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0b3I/LnRvdGFsUGFnZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmBcbiAgICAgKlxuICAgICAqIEdldHMgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3QgcGFnZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGZpcnN0UGFnZSA9IHRoaXMuZ3JpZC5pc0ZpcnN0UGFnZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzRmlyc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0b3IuaXNMYXN0UGFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmBcbiAgICAgKlxuICAgICAqIEdvZXMgdG8gdGhlIG5leHQgcGFnZSwgaWYgdGhlIGdyaWQgaXMgbm90IGFscmVhZHkgYXQgdGhlIGxhc3QgcGFnZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEubmV4dFBhZ2UoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xuICAgIHB1YmxpYyBuZXh0UGFnZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0b3I/Lm5leHRQYWdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgXG4gICAgICpcbiAgICAgKiBHb2VzIHRvIHRoZSBwcmV2aW91cyBwYWdlLCBpZiB0aGUgZ3JpZCBpcyBub3QgYWxyZWFkeSBhdCB0aGUgZmlyc3QgcGFnZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEucHJldmlvdXNQYWdlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcbiAgICBwdWJsaWMgcHJldmlvdXNQYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhZ2luYXRvcj8ucHJldmlvdXNQYWdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE9ubHkgZnVuY3Rpb25zIHdoZW4gcGFnaW5nIGlzIGVuYWJsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdG90YWxSZWNvcmRzID0gdGhpcy5ncmlkLnRvdGFsUmVjb3JkcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdG90YWxSZWNvcmRzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3RhbFJlY29yZHMgPj0gMCA/IHRoaXMuX3RvdGFsUmVjb3JkcyA6IHRoaXMucGFnaW5nU3RhdGU/Lm1ldGFkYXRhLmNvdW50UmVjb3JkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHRvdGFsUmVjb3Jkcyh0b3RhbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0b3RhbCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci50b3RhbFJlY29yZHMgPSB0b3RhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3RvdGFsUmVjb3JkcyA9IHRvdGFsO1xuICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYFxuICAgICAqXG4gICAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBsYXN0UGFnZSA9IHRoaXMuZ3JpZC5pc0xhc3RQYWdlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yLmlzTGFzdFBhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdG90YWwgd2lkdGggb2YgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyaWRXaWR0aCA9IHRoaXMuZ3JpZC50b3RhbFdpZHRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3RvdGFsV2lkdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUYWtlIG9ubHkgdG9wIGxldmVsIGNvbHVtbnNcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wubGV2ZWwgPT09IDAgJiYgIWNvbC5waW5uZWQpO1xuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDA7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChpOyBpIDwgY29scy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSBwYXJzZUludChjb2xzW2ldLmNhbGNXaWR0aCwgMTApIHx8IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdG90YWxXaWR0aCA9IHRvdGFsV2lkdGg7XG4gICAgICAgIHJldHVybiB0b3RhbFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dSb3dTZWxlY3RvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUm93U2VsZWN0YWJsZSAmJiB0aGlzLmhhc1Zpc2libGVDb2x1bW5zICYmICF0aGlzLmhpZGVSb3dTZWxlY3RvcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd0FkZEJ1dHRvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdGFibGUgJiYgdGhpcy5kYXRhVmlldy5sZW5ndGggPT09IDAgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd0RyYWdJY29ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RHJhZ2dhYmxlICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPiB0aGlzLmhpZGRlbkNvbHVtbnNDb3VudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFjZXMgYSBjb2x1bW4gYmVmb3JlIG9yIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGNvbHVtbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQubW92ZUNvbHVtbihjb2x1bW4sIHRhcmdldCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG1vdmVDb2x1bW4oY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsIHRhcmdldDogSWd4Q29sdW1uQ29tcG9uZW50LCBwb3M6IERyb3BQb3NpdGlvbiA9IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQpIHtcbiAgICAgICAgLy8gTS5BLiBNYXkgMTF0aCwgMjAyMSAjOTUwOCBNYWtlIHRoZSBldmVudCBjYW5jZWxhYmxlXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUNvbHVtbk1vdmluZ0VuZEV2ZW50QXJncyA9IHsgc291cmNlOiBjb2x1bW4sIHRhcmdldCwgY2FuY2VsOiBmYWxzZSB9O1xuXG4gICAgICAgIHRoaXMuY29sdW1uTW92aW5nRW5kLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbiA9PT0gdGFyZ2V0IHx8IChjb2x1bW4ubGV2ZWwgIT09IHRhcmdldC5sZXZlbCkgfHxcbiAgICAgICAgICAgIChjb2x1bW4udG9wTGV2ZWxQYXJlbnQgIT09IHRhcmdldC50b3BMZXZlbFBhcmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW4ubGV2ZWwpIHtcbiAgICAgICAgICAgIHRoaXMuX21vdmVDaGlsZENvbHVtbnMoY29sdW1uLnBhcmVudCwgY29sdW1uLCB0YXJnZXQsIHBvcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29sdW1uUGluU3RhdGVDaGFuZ2VkO1xuICAgICAgICAvLyBwaW5uaW5nIGFuZCB1bnBpbm5pbmcgd2lsbCB3b3JrIGNvcnJlY3RseSBldmVuIHdpdGhvdXQgcGFzc2luZyBpbmRleFxuICAgICAgICAvLyBidXQgaXMgZWFzaWVyIHRvIGNhbGNsdWxhdGUgdGhlIGluZGV4IGhlcmUsIGFuZCBsYXRlciB1c2UgaXQgaW4gdGhlIHBpbm5pbmcgZXZlbnQgYXJnc1xuICAgICAgICBpZiAodGFyZ2V0LnBpbm5lZCAmJiAhY29sdW1uLnBpbm5lZCkge1xuICAgICAgICAgICAgY29uc3QgcGlubmVkSW5kZXggPSB0aGlzLl9waW5uZWRDb2x1bW5zLmluZGV4T2YodGFyZ2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcG9zID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0ID8gcGlubmVkSW5kZXggKyAxIDogcGlubmVkSW5kZXg7XG4gICAgICAgICAgICBjb2x1bW5QaW5TdGF0ZUNoYW5nZWQgPSBjb2x1bW4ucGluKGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGFyZ2V0LnBpbm5lZCAmJiBjb2x1bW4ucGlubmVkKSB7XG4gICAgICAgICAgICBjb25zdCB1bnBpbm5lZEluZGV4ID0gdGhpcy5fdW5waW5uZWRDb2x1bW5zLmluZGV4T2YodGFyZ2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcG9zID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0ID8gdW5waW5uZWRJbmRleCArIDEgOiB1bnBpbm5lZEluZGV4O1xuICAgICAgICAgICAgY29sdW1uUGluU3RhdGVDaGFuZ2VkID0gY29sdW1uLnVucGluKGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQucGlubmVkICYmIGNvbHVtbi5waW5uZWQgJiYgIWNvbHVtblBpblN0YXRlQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVvcmRlckNvbHVtbnMoY29sdW1uLCB0YXJnZXQsIHBvcywgdGhpcy5fcGlubmVkQ29sdW1ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldC5waW5uZWQgJiYgIWNvbHVtbi5waW5uZWQgJiYgIWNvbHVtblBpblN0YXRlQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVvcmRlckNvbHVtbnMoY29sdW1uLCB0YXJnZXQsIHBvcywgdGhpcy5fdW5waW5uZWRDb2x1bW5zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21vdmVDb2x1bW5zKGNvbHVtbiwgdGFyZ2V0LCBwb3MpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zUmVvcmRlcmVkKGNvbHVtbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgXG4gICAgICpcbiAgICAgKiBHb2VzIHRvIHRoZSBkZXNpcmVkIHBhZ2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnBhZ2luYXRlKDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWxcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xuICAgIHB1YmxpYyBwYWdpbmF0ZSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnBhZ2luYXRvcj8ucGFnaW5hdGUodmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBjaGFuZ2UgZGV0ZWN0aW9uIGZvciB0aGUgYElneEdyaWRDb21wb25lbnRgLlxuICAgICAqIENhbGxpbmcgbWFya0ZvckNoZWNrIGFsc28gdHJpZ2dlcnMgdGhlIGdyaWQgcGlwZXMgZXhwbGljaXRseSwgcmVzdWx0aW5nIGluIGFsbCB1cGRhdGVzIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKiBNYXkgZGVncmFkZSBwZXJmb3JtYW5jZSBpZiB1c2VkIHdoZW4gbm90IG5lZWRlZCwgb3IgaWYgbWlzdXNlZDpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gRE9OJ1RzOlxuICAgICAqIC8vIGRvbid0IGNhbGwgbWFya0ZvckNoZWNrIGZyb20gaW5zaWRlIGEgbG9vcFxuICAgICAqIC8vIGRvbid0IGNhbGwgbWFya0ZvckNoZWNrIHdoZW4gYSBwcmltaXRpdmUgaGFzIGNoYW5nZWRcbiAgICAgKiBncmlkLmRhdGEuZm9yRWFjaChyZWMgPT4ge1xuICAgICAqICByZWMgPSBuZXdWYWx1ZTtcbiAgICAgKiAgZ3JpZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIERPc1xuICAgICAqIC8vIGNhbGwgbWFya0ZvckNoZWNrIGFmdGVyIHVwZGF0aW5nIGEgbmVzdGVkIHByb3BlcnR5XG4gICAgICogZ3JpZC5kYXRhLmZvckVhY2gocmVjID0+IHtcbiAgICAgKiAgcmVjLm5lc3RlZFByb3AxLm5lc3RlZFByb3AyID0gbmV3VmFsdWU7XG4gICAgICogfSk7XG4gICAgICogZ3JpZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQubWFya0ZvckNoZWNrKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG1hcmtGb3JDaGVjaygpIHtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIGFkZHMgdGhlIGRhdGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgdGhlIGRhdGEgc291cmNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5hZGRSb3cocmVjb3JkKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRSb3coZGF0YTogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIGNvbW1pdCBwZW5kaW5nIHN0YXRlcyBwcmlvciB0byBhZGRpbmcgYSByb3dcbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KHRydWUpO1xuICAgICAgICB0aGlzLmdyaWRBUEkuYWRkUm93VG9EYXRhKGRhdGEpO1xuXG4gICAgICAgIHRoaXMucm93QWRkZWROb3RpZmllci5uZXh0KHsgZGF0YSB9KTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmVjb3JkIGJ5IHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBgcHJpbWFyeUtleWAgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIFRoZSBtZXRob2QgYWNjZXB0IHJvd1NlbGVjdG9yIGFzIGEgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgcm93SUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5kZWxldGVSb3coMCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZVJvdyhyb3dTZWxlY3RvcjogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMucHJpbWFyeUtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucHJpbWFyeUtleSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlUm93QnlJZChyb3dTZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBkZWxldGVSb3dCeUlkKHJvd0lkOiBhbnkpOiBhbnkge1xuICAgICAgICBjb25zdCBhcmdzID0ge1xuICAgICAgICAgICAgcm93SUQ6IHJvd0lkLFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZSxcbiAgICAgICAgICAgIHJvd0RhdGE6IHRoaXMuZ2V0Um93RGF0YShyb3dJZCksXG4gICAgICAgICAgICBvbGRWYWx1ZTogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJvd0RlbGV0ZS5lbWl0KGFyZ3MpO1xuICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuZ3JpZEFQSS5kZWxldGVSb3dCeUlkKHJvd0lkKTtcbiAgICAgICAgaWYgKHJlY29yZCAhPT0gbnVsbCAmJiByZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gIFRPRE86IHNob3VsZCB3ZSBlbWl0IHRoaXMgd2hlbiBjYXNjYWRlT25EZWxldGUgaXMgdHJ1ZSBmb3IgZWFjaCByb3c/IT8hXG4gICAgICAgICAgICB0aGlzLnJvd0RlbGV0ZWQuZW1pdCh7IGRhdGE6IHJlY29yZCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGBJZ3hHcmlkUm93Q29tcG9uZW50YCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSByZWNvcmQgYnkgcHJpbWFyeSBrZXkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoYXQgdGhlIGBwcmltYXJ5S2V5YCBwcm9wZXJ0eSBpcyBzZXQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkV2l0aFBLLnVwZGF0ZUNlbGwoJ1VwZGF0ZWQnLCAxLCAnUHJvZHVjdE5hbWUnKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSB3aGljaCBpcyB0byBiZSBzZXQuXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIGNvcnJlc3BvbmRzIHRvIHJvd0lELlxuICAgICAqIEBwYXJhbSBjb2x1bW4gY29ycmVzcG9uZHMgdG8gY29sdW1uIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVDZWxsKHZhbHVlOiBhbnksIHJvd1NlbGVjdG9yOiBhbnksIGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVmaW5lZCh0aGlzLnByaW1hcnlLZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpLmZpbmQoYyA9PiBjLmZpZWxkID09PSBjb2x1bW4pO1xuICAgICAgICAgICAgaWYgKGNvbCkge1xuICAgICAgICAgICAgICAgIC8vIFNpbXBsaWZ5XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IHRoaXMuZ3JpZEFQSS5nZXRSb3dEYXRhKHJvd1NlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2luZGV4X2luX2RhdGEocm93U2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIC8vIElmIHJvdyBwYXNzZWQgaXMgaW52YWxpZFxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0ge1xuICAgICAgICAgICAgICAgICAgICByb3dJRDogcm93U2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbklEOiBjb2wuaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gbmV3IElneENlbGwoaWQsIGluZGV4LCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSwgdmFsdWUsIHJvd0RhdGEsIHRoaXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS51cGRhdGVfY2VsbChjZWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGBcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIHJvdyBpcyBzcGVjaWZpZWQgYnlcbiAgICAgKiByb3dTZWxlY3RvciBwYXJhbWV0ZXIgYW5kIHRoZSBkYXRhIHNvdXJjZSByZWNvcmQgd2l0aCB0aGUgcGFzc2VkIHZhbHVlLlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYXBwbHkgcmVxdWVzdGVkIHVwZGF0ZSBvbmx5IGlmIHByaW1hcnkga2V5IGlzIHNwZWNpZmllZCBpbiB0aGUgZ3JpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLnVwZGF0ZVJvdyh7XG4gICAgICogICAgICAgUHJvZHVjdElEOiAxLCBQcm9kdWN0TmFtZTogJ1NwZWFybWludCcsIEluU3RvY2s6IHRydWUsIFVuaXRzSW5TdG9jazogMSwgT3JkZXJEYXRlOiBuZXcgRGF0ZSgnMjAwNS0wMy0yMScpXG4gICAgICogICB9LCAxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdmFsdWXigJNcbiAgICAgKiBAcGFyYW0gcm93U2VsZWN0b3IgY29ycmVzcG9uZCB0byByb3dJRFxuICAgICAqL1xuICAgIC8vIFRPRE86IHByZXZlbnQgZXZlbnQgaW52b2NhdGlvblxuICAgIHB1YmxpYyB1cGRhdGVSb3codmFsdWU6IGFueSwgcm93U2VsZWN0b3I6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0RlZmluZWQodGhpcy5wcmltYXJ5S2V5KSkge1xuICAgICAgICAgICAgY29uc3QgZWRpdGFibGVDZWxsID0gdGhpcy5jcnVkU2VydmljZS5jZWxsO1xuICAgICAgICAgICAgaWYgKGVkaXRhYmxlQ2VsbCAmJiBlZGl0YWJsZUNlbGwuaWQucm93SUQgPT09IHJvd1NlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRDZWxsRWRpdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgcm93ID0gbmV3IElneEVkaXRSb3cocm93U2VsZWN0b3IsIC0xLCB0aGlzLmdyaWRBUEkuZ2V0Um93RGF0YShyb3dTZWxlY3RvciksIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnVwZGF0ZV9yb3cocm93LCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IGZpeCBmb3IgIzU5MzQgYW5kIHByb2JhYmx5IGJyZWFrIGZvciAjNTc2M1xuICAgICAgICAgICAgLy8gY29uc2lkZXIgYWRkaW5nIG9mIHRoaXJkIG9wdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyIGluIHVwZGF0ZVJvdy5cbiAgICAgICAgICAgIC8vIElmIGRldmVsb3BlciBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSB3ZSBzaG91bGQgY2FsbCBub3RpZnlDaGFuZ2VzKHRydWUpLCBhbmRcbiAgICAgICAgICAgIC8vIHZpc2UtdmVyc2EgaWYgZGV2ZWxvcGVyIHNldCBpdCB0byBmYWxzZSB3ZSBzaG91bGQgY2FsbCBub3RpZnlDaGFuZ2VzKGZhbHNlKS5cbiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgc2hvdWxkIGRlZmF1bHQgdG8gZmFsc2VcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0YSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcm93IGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgdGhlIHByaW1hcnkga2V5IGlzIG5vdCBzcGVjaWZpZWQgdGhlIHJvdyBzZWxlY3RvciBtYXRjaCB0aGUgcm93IGRhdGEuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZGF0YSA9IGdyaWQuZ2V0Um93RGF0YSg5NDc0MSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIGNvcnJlc3BvbmQgdG8gcm93SURcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um93RGF0YShyb3dTZWxlY3RvcjogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5wcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gcm93U2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEodGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfaW5kZXhfaW5fZGF0YShyb3dTZWxlY3Rvcik7XG4gICAgICAgIHJldHVybiBpbmRleCA8IDAgPyB7fSA6IGRhdGFbaW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNvcnQgYSBzaW5nbGUgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNvcnQgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCdzIGBJZ3hDb2x1bW5Db21wb25lbnRgIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcnJheSBvZiBzb3J0aW5nIGV4cHJlc3Npb25zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5zb3J0KHsgZmllbGROYW1lOiBuYW1lLCBkaXI6IFNvcnRpbmdEaXJlY3Rpb24uQXNjLCBpZ25vcmVDYXNlOiBmYWxzZSB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc29ydChleHByZXNzaW9uOiBJU29ydGluZ0V4cHJlc3Npb24gfCBBcnJheTxJU29ydGluZ0V4cHJlc3Npb24+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNvcnRpbmdTdGF0ZSA9IGNsb25lQXJyYXkodGhpcy5zb3J0aW5nRXhwcmVzc2lvbnMpO1xuXG4gICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWFjaCBvZiBleHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVhY2guZGlyID09PSBTb3J0aW5nRGlyZWN0aW9uLk5vbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnJlbW92ZV9ncm91cGluZ19leHByZXNzaW9uKGVhY2guZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnByZXBhcmVfc29ydGluZ19leHByZXNzaW9uKFtzb3J0aW5nU3RhdGVdLCBlYWNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChleHByZXNzaW9uLmRpciA9PT0gU29ydGluZ0RpcmVjdGlvbi5Ob25lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnJlbW92ZV9ncm91cGluZ19leHByZXNzaW9uKGV4cHJlc3Npb24uZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5wcmVwYXJlX3NvcnRpbmdfZXhwcmVzc2lvbihbc29ydGluZ1N0YXRlXSwgZXhwcmVzc2lvbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElTb3J0aW5nRXZlbnRBcmdzID0geyBvd25lcjogdGhpcywgc29ydGluZ0V4cHJlc3Npb25zOiBzb3J0aW5nU3RhdGUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5zb3J0aW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnNvcnRfbXVsdGlwbGUoZXhwcmVzc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWRBUEkuc29ydChleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5zb3J0aW5nRG9uZS5lbWl0KGV4cHJlc3Npb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGEgc2luZ2xlIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGZpbHRlcih0ZXJtKSB7XG4gICAgICogICAgICB0aGlzLmdyaWQuZmlsdGVyKFwiUHJvZHVjdE5hbWVcIiwgdGVybSwgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihcImNvbnRhaW5zXCIpKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZVxuICAgICAqIEBwYXJhbSBpZ25vcmVDYXNlXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWU/OiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZT86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcihuYW1lLCB2YWx1ZSwgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSwgaWdub3JlQ2FzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyBhbGwgdGhlIGBJZ3hDb2x1bW5Db21wb25lbnRgIGluIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgd2l0aCB0aGUgc2FtZSBjb25kaXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmZpbHRlckdsb2JhbCgnc29tZScsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oJ2NvbnRhaW5zJykpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICAgKiBAcGFyYW0gaWdub3JlQ2FzZVxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJHbG9iYWwodmFsdWU6IGFueSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlPykge1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyR2xvYmFsKHZhbHVlLCBjb25kaXRpb24sIGlnbm9yZUNhc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc3VtbWFyaWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgYXBwbGllcyB5b3VyIGN1c3RvbVN1bW1hcnkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSB0aGUgY3VzdG9tU3VtbWFyeSwgdGhlbiB0aGUgZGVmYXVsdCBzdW1tYXJ5IGZvciB0aGUgY29sdW1uIGRhdGEgdHlwZSB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5lbmFibGVTdW1tYXJpZXMoW3sgZmllbGROYW1lOiAnUHJvZHVjdE5hbWUnIH0sIHsgZmllbGROYW1lOiAnSUQnIH1dKTtcbiAgICAgKiBgYGBcbiAgICAgKiBFbmFibGUgc3VtbWFyaWVzIGZvciB0aGUgbGlzdGVkIGNvbHVtbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5lbmFibGVTdW1tYXJpZXMoJ1Byb2R1Y3ROYW1lJyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJlc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5hYmxlU3VtbWFyaWVzKC4uLnJlc3QpIHtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkocmVzdFswXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlU3VtbWFyaWVzKHJlc3RbMF0sIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKHJlc3RbMF0sIHRydWUsIHJlc3RbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5kaXNhYmxlU3VtbWFyaWVzKCdQcm9kdWN0TmFtZScpO1xuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGlzYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBsaXN0ZWQgY29sdW1ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmRpc2FibGVTdW1tYXJpZXMoW3sgZmllbGROYW1lOiAnUHJvZHVjdE5hbWUnIH1dKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVN1bW1hcmllcyguLi5yZXN0KSB7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KHJlc3RbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlTXVsdGlwbGVTdW1tYXJpZXMocmVzdFswXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdW1tYXJpZXMocmVzdFswXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgbmFtZSBpcyBwcm92aWRlZCwgY2xlYXJzIHRoZSBmaWx0ZXJpbmcgc3RhdGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE90aGVyd2lzZSBjbGVhcnMgdGhlIGZpbHRlcmluZyBzdGF0ZSBvZiBhbGwgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jbGVhckZpbHRlcigpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIG5hbWUgaXMgcHJvdmlkZWQsIGNsZWFycyB0aGUgc29ydGluZyBzdGF0ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogb3RoZXJ3aXNlIGNsZWFycyB0aGUgc29ydGluZyBzdGF0ZSBvZiBhbGwgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyU29ydCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU29ydChuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgdGhpcy5zb3J0aW5nRXhwcmVzc2lvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZ3JpZEFQSS5nZXRfY29sdW1uX2J5X25hbWUobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWRBUEkuY2xlYXJfc29ydChuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoR3JpZFN0YXRlKF9hcmdzPykge1xuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogV2UgaGF2ZSByZXR1cm4gdmFsdWVzIGhlcmUuIE1vdmUgdGhlbSB0byBldmVudCBhcmdzID8/XG5cbiAgICAvKipcbiAgICAgKiBQaW5zIGEgY29sdW1uIGJ5IGZpZWxkIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnBpbkNvbHVtbihcIklEXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHVibGljIHBpbkNvbHVtbihjb2x1bW5OYW1lOiBzdHJpbmcgfCBJZ3hDb2x1bW5Db21wb25lbnQsIGluZGV4Pyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjb2wgPSBjb2x1bW5OYW1lIGluc3RhbmNlb2YgSWd4Q29sdW1uQ29tcG9uZW50ID8gY29sdW1uTmFtZSA6IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpO1xuICAgICAgICByZXR1cm4gY29sLnBpbihpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5waW5zIGEgY29sdW1uIGJ5IGZpZWxkIG5hbWUuIFJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucGluQ29sdW1uKFwiSURcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbk5hbWVcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKi9cbiAgICBwdWJsaWMgdW5waW5Db2x1bW4oY29sdW1uTmFtZTogc3RyaW5nIHwgSWd4Q29sdW1uQ29tcG9uZW50LCBpbmRleD8pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29sID0gY29sdW1uTmFtZSBpbnN0YW5jZW9mIElneENvbHVtbkNvbXBvbmVudCA/IGNvbHVtbk5hbWUgOiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICAgICAgcmV0dXJuIGNvbC51bnBpbihpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGluIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5waW5Sb3cocm93SUQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCBUaGUgcm93IGlkIC0gcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIHJvdyBpbiB0aGUgcGlubmVkIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIHBpblJvdyhyb3dJRDogYW55LCBpbmRleD86IG51bWJlciwgcm93PzogUm93VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fcGlubmVkUmVjb3JkSURzLmluZGV4T2Yocm93SUQpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJUGluUm93RXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgaW5zZXJ0QXRJbmRleDogaW5kZXgsXG4gICAgICAgICAgICBpc1Bpbm5lZDogdHJ1ZSxcbiAgICAgICAgICAgIHJvd0lELFxuICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJvd1Bpbm5pbmcuZW1pdChldmVudEFyZ3MpO1xuXG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gdHlwZW9mIGV2ZW50QXJncy5pbnNlcnRBdEluZGV4ID09PSAnbnVtYmVyJyA/IGV2ZW50QXJncy5pbnNlcnRBdEluZGV4IDogdGhpcy5fcGlubmVkUmVjb3JkSURzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fcGlubmVkUmVjb3JkSURzLnNwbGljZShpbnNlcnRJbmRleCwgMCwgcm93SUQpO1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5yb3dQaW5uZWQuZW1pdChldmVudEFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5waW4gdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnVucGluUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpblJvdyhyb3dJRDogYW55LCByb3c/OiBSb3dUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fcGlubmVkUmVjb3JkSURzLmluZGV4T2Yocm93SUQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJUGluUm93RXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgaXNQaW5uZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcm93SUQsXG4gICAgICAgICAgICByb3csXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucm93UGlubmluZy5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5yb3dQaW5uZWQuZW1pdChldmVudEFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwaW5uZWRSb3dIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHRoaXMucGluQ29udGFpbmVyID8gdGhpcy5waW5Db250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgOiAwO1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNQaW5uZWRSZWNvcmRzID8gY29udGFpbmVySGVpZ2h0IDogMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvdGFsSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxjSGVpZ2h0ID8gdGhpcy5jYWxjSGVpZ2h0ICsgdGhpcy5waW5uZWRSb3dIZWlnaHQgOiB0aGlzLmNhbGNIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjYWxjdWxhdGVzIGdyaWQgd2lkdGgvaGVpZ2h0IGRpbWVuc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNob3VsZCBiZSBydW4gd2hlbiBjaGFuZ2luZyBET00gZWxlbWVudHMgZGltZW50aW9ucyBtYW51YWxseSB0aGF0IGFmZmVjdCB0aGUgZ3JpZCdzIHNpemUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnJlZmxvdygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyByZWZsb3coKSB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFNpemVzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHN0cmluZyBpbiB0aGUgZ3JpZCBhbmQgc2Nyb2xscyB0byB0aGUgY2VsbCBpZiBpdCBpc24ndCB2aXNpYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGhvdyBtYW55IHRpbWVzIHRoZSBncmlkIGNvbnRhaW5zIHRoZSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmZpbmROZXh0KFwiZmluYW5jaWFsXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIG9wdGlvbmFsbHksIGlmIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICogQHBhcmFtIGV4YWN0TWF0Y2ggb3B0aW9uYWxseSwgaWYgdGhlIHRleHQgc2hvdWxkIG1hdGNoIHRoZSBlbnRpcmUgdmFsdWUgIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICovXG4gICAgcHVibGljIGZpbmROZXh0KHRleHQ6IHN0cmluZywgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sIGV4YWN0TWF0Y2g/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZCh0ZXh0LCAxLCBjYXNlU2Vuc2l0aXZlLCBleGFjdE1hdGNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgcHJldmlvdXMgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHN0cmluZyBpbiB0aGUgZ3JpZCBhbmQgc2Nyb2xscyB0byB0aGUgY2VsbCBpZiBpdCBpc24ndCB2aXNpYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGhvdyBtYW55IHRpbWVzIHRoZSBncmlkIGNvbnRhaW5zIHRoZSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmZpbmRQcmV2KFwiZmluYW5jaWFsXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIG9wdGlvbmFsbHksIGlmIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICogQHBhcmFtIGV4YWN0TWF0Y2ggb3B0aW9uYWxseSwgaWYgdGhlIHRleHQgc2hvdWxkIG1hdGNoIHRoZSBlbnRpcmUgdmFsdWUgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZFByZXYodGV4dDogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbiwgZXhhY3RNYXRjaD86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kKHRleHQsIC0xLCBjYXNlU2Vuc2l0aXZlLCBleGFjdE1hdGNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFwcGxpZXMgdGhlIGV4aXN0aW5nIHNlYXJjaC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBob3cgbWFueSB0aW1lcyB0aGUgZ3JpZCBjb250YWlucyB0aGUgbGFzdCBzZWFyY2guXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnJlZnJlc2hTZWFyY2goKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdXBkYXRlQWN0aXZlSW5mb1xuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoU2VhcmNoKHVwZGF0ZUFjdGl2ZUluZm8/OiBib29sZWFuLCBlbmRFZGl0ID0gdHJ1ZSk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZE1hdGNoQ2FjaGUoKTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZUFjdGl2ZUluZm8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJbmZvID0gSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuZ2V0KHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUuZm9yRWFjaCgobWF0Y2gsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmNvbHVtbiA9PT0gYWN0aXZlSW5mby5jb2x1bW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoLnJvdyA9PT0gYWN0aXZlSW5mby5yb3cgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoLmluZGV4ID09PSBhY3RpdmVJbmZvLmluZGV4ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTWFwcyhtYXRjaC5tZXRhZGF0YSwgYWN0aXZlSW5mby5tZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZCh0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUsXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoLFxuICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGVuZEVkaXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB0aGUgaGlnaGxpZ2h0cyBpbiB0aGUgY2VsbC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jbGVhclNlYXJjaCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclNlYXJjaCgpIHtcbiAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mbyA9IHtcbiAgICAgICAgICAgIHNlYXJjaFRleHQ6ICcnLFxuICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBleGFjdE1hdGNoOiBmYWxzZSxcbiAgICAgICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgICAgICBtYXRjaEluZm9DYWNoZTogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJvd0xpc3QuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICBpZiAocm93LmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgcm93LmNlbGxzLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYy5jbGVhckhpZ2hsaWdodCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIHNvcnRhYmxlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzb3J0YWJsZUdyaWQgPSB0aGlzLmdyaWQuaGFzU29ydGFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzU29ydGFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LnNvbWUoKGNvbCkgPT4gY29sLnNvcnRhYmxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIGVkaXRhYmxlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBlZGl0YWJsZUdyaWQgPSB0aGlzLmdyaWQuaGFzRWRpdGFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRWRpdGFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LnNvbWUoKGNvbCkgPT4gY29sLmVkaXRhYmxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIGZpbHRlcmFibGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGZpbHRlcmFibGVHcmlkID0gdGhpcy5ncmlkLmhhc0ZpbHRlcmFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRmlsdGVyYWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3Quc29tZSgoY29sKSA9PiBjb2wuZmlsdGVyYWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBzdW1tYXJpemVkIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzdW1tYXJpemVkR3JpZCA9IHRoaXMuZ3JpZC5oYXNTdW1tYXJpemVkQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1N1bW1hcml6ZWRDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdW1tYXJ5U2VydmljZS5oYXNTdW1tYXJpemVkQ29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm9vdFN1bW1hcmllc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1bW1hcnlDYWxjdWxhdGlvbk1vZGUgIT09IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlLmNoaWxkTGV2ZWxzT25seTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzVmlzaWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNWaXNpYmxlQ29sdW1ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0ID8gdGhpcy5jb2x1bW5MaXN0LnNvbWUoYyA9PiAhYy5oaWRkZW4pIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Zpc2libGVDb2x1bW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGFzVmlzaWJsZUNvbHVtbnModmFsdWUpIHtcbiAgICAgICAgdGhpcy5faGFzVmlzaWJsZUNvbHVtbnMgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBtb3ZlYWJsZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbW92YWJsZUdyaWQgPSB0aGlzLmdyaWQuaGFzTW92YWJsZUNvbHVtbnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNNb3ZhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdCAmJiB0aGlzLmNvbHVtbkxpc3Quc29tZSgoY29sKSA9PiBjb2wubW92YWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBjb2x1bW4gZ3JvdXBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JvdXBHcmlkID0gdGhpcy5ncmlkLmhhc0NvbHVtbkdyb3VwcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0NvbHVtbkdyb3VwcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkdyb3VwcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBjb2x1bW4gbGF5b3V0cyBmb3IgbXVsdGktcm93IGxheW91dCBkZWZpbml0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbGF5b3V0R3JpZCA9IHRoaXMuZ3JpZC5oYXNDb2x1bW5MYXlvdXRzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzQ29sdW1uTGF5b3V0cygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jb2x1bW5MaXN0LnNvbWUoY29sID0+IGNvbC5jb2x1bW5MYXlvdXQpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG11bHRpUm93TGF5b3V0Um93U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCByb3dCYXNlZEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUxlbmd0aCAqIHRoaXMucm93SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGlzUGVyY2VudFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53aWR0aCAmJiB0aGlzLndpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUGVyY2VudEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodCAmJiB0aGlzLl9oZWlnaHQuaW5kZXhPZignJScpICE9PSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBkZWZhdWx0VGFyZ2V0Qm9keUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBhbGxJdGVtcyA9IHRoaXMuZGF0YUxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZWRSb3dIZWlnaHQgKiBNYXRoLm1pbih0aGlzLl9kZWZhdWx0VGFyZ2V0UmVjb3JkTnVtYmVyLFxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IgPyBNYXRoLm1pbihhbGxJdGVtcywgdGhpcy5wYWdpbmF0b3IucGVyUGFnZSkgOiBhbGxJdGVtcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBUaGUgcm93SGVpZ2h0IGlucHV0IGlzIGJvdW5kIHRvIG1pbi1oZWlnaHQgY3NzIHByb3Agb2Ygcm93cyB0aGF0IGFkZHMgYSAxcHggYm9yZGVyIGluIGFsbCBjYXNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVuZGVyZWRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93SGVpZ2h0ICsgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgb3V0ZXJXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSA/IHRoaXMuY2FsY1dpZHRoICsgdGhpcy5zY3JvbGxTaXplIDogdGhpcy5jYWxjV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBHZXRzIHRoZSB2aXNpYmxlIGNvbnRlbnQgaGVpZ2h0IHRoYXQgaW5jbHVkZXMgaGVhZGVyICsgdGJvZHkgKyBmb290ZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldFZpc2libGVDb250ZW50SGVpZ2h0KCkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy50aGVhZFJvdy5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCArIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmhhc1N1bW1hcml6ZWRDb2x1bW5zKSB7XG4gICAgICAgICAgICBoZWlnaHQgKz0gdGhpcy50Zm9vdC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldFBvc3NpYmxlQ29sdW1uV2lkdGgoYmFzZVdpZHRoOiBudW1iZXIgPSBudWxsKSB7XG4gICAgICAgIGxldCBjb21wdXRlZFdpZHRoO1xuICAgICAgICBpZiAoYmFzZVdpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wdXRlZFdpZHRoID0gYmFzZVdpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcHV0ZWRXaWR0aCA9IHRoaXMuY2FsY1dpZHRoIHx8XG4gICAgICAgICAgICAgICAgcGFyc2VJbnQodGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcHV0ZWRXaWR0aCAtPSB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcblxuICAgICAgICBjb25zdCB2aXNpYmxlQ2hpbGRDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCk7XG5cblxuICAgICAgICAvLyBDb2x1bW4gbGF5b3V0cyByZWxhdGVkXG4gICAgICAgIGxldCB2aXNpYmxlQ29scyA9IFtdO1xuICAgICAgICBjb25zdCBjb2x1bW5CbG9ja3MgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjID0+IGMuY29sdW1uR3JvdXApO1xuICAgICAgICBjb25zdCBjb2xzUGVyQmxvY2sgPSBjb2x1bW5CbG9ja3MubWFwKGJsb2NrID0+IGJsb2NrLmdldEluaXRpYWxDaGlsZENvbHVtblNpemVzKGJsb2NrLmNoaWxkcmVuKSk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQmxvY2tzU2l6ZSA9IGNvbHNQZXJCbG9jay5yZWR1Y2UoKGFjYywgaXRlbSkgPT4gYWNjICsgaXRlbS5sZW5ndGgsIDApO1xuICAgICAgICBjb2xzUGVyQmxvY2suZm9yRWFjaChibG9ja0NvbHMgPT4gdmlzaWJsZUNvbHMgPSB2aXNpYmxlQ29scy5jb25jYXQoYmxvY2tDb2xzKSk7XG4gICAgICAgIC8vXG5cbiAgICAgICAgY29uc3QgY29sdW1uc1dpdGhTZXRXaWR0aHMgPSB0aGlzLmhhc0NvbHVtbkxheW91dHMgP1xuICAgICAgICAgICAgdmlzaWJsZUNvbHMuZmlsdGVyKGMgPT4gYy53aWR0aFNldEJ5VXNlcikgOlxuICAgICAgICAgICAgdmlzaWJsZUNoaWxkQ29sdW1ucy5maWx0ZXIoYyA9PiBjLndpZHRoU2V0QnlVc2VyKTtcblxuICAgICAgICBjb25zdCBjb2x1bW5zVG9TaXplID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIGNvbWJpbmVkQmxvY2tzU2l6ZSAtIGNvbHVtbnNXaXRoU2V0V2lkdGhzLmxlbmd0aCA6XG4gICAgICAgICAgICB2aXNpYmxlQ2hpbGRDb2x1bW5zLmxlbmd0aCAtIGNvbHVtbnNXaXRoU2V0V2lkdGhzLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgc3VtRXhpc3RpbmdXaWR0aHMgPSBjb2x1bW5zV2l0aFNldFdpZHRoc1xuICAgICAgICAgICAgLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbFdpZHRoID0gY3Vyci53aWR0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aFZhbHVlID0gcGFyc2VJbnQoY29sV2lkdGgsIDEwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyV2lkdGggPSBjb2xXaWR0aCAmJiB0eXBlb2YgY29sV2lkdGggPT09ICdzdHJpbmcnICYmIGNvbFdpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTEgP1xuICAgICAgICAgICAgICAgICAgICB3aWR0aFZhbHVlIC8gMTAwICogY29tcHV0ZWRXaWR0aCA6XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgKyBjdXJyV2lkdGg7XG4gICAgICAgICAgICB9LCAwKTtcblxuICAgICAgICAvLyBXaGVuIGFsbCBjb2x1bW5zIGFyZSBoaWRkZW4sIHJldHVybiAwcHggd2lkdGhcbiAgICAgICAgaWYgKCFzdW1FeGlzdGluZ1dpZHRocyAmJiAhY29sdW1uc1RvU2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuICcwcHgnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSBNYXRoLmZsb29yKCFOdW1iZXIuaXNGaW5pdGUoc3VtRXhpc3RpbmdXaWR0aHMpID9cbiAgICAgICAgICAgIE1hdGgubWF4KGNvbXB1dGVkV2lkdGggLyBjb2x1bW5zVG9TaXplLCBNSU5JTVVNX0NPTFVNTl9XSURUSCkgOlxuICAgICAgICAgICAgTWF0aC5tYXgoKGNvbXB1dGVkV2lkdGggLSBzdW1FeGlzdGluZ1dpZHRocykgLyBjb2x1bW5zVG9TaXplLCBNSU5JTVVNX0NPTFVNTl9XSURUSCkpO1xuXG4gICAgICAgIHJldHVybiBjb2x1bW5XaWR0aCArICdweCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVmVydGljYWxTY3JvbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNTY3JvbGxhYmxlID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lciA/IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuaXNTY3JvbGxhYmxlKCkgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuY2FsY1dpZHRoICYmIHRoaXMuZGF0YVZpZXcgJiYgdGhpcy5kYXRhVmlldy5sZW5ndGggPiAwICYmIGlzU2Nyb2xsYWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBjYWxjdWxhdGVkIHdpZHRoIG9mIHRoZSBwaW5uZWQgYXJlYS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHBpbm5lZFdpZHRoID0gdGhpcy5ncmlkLmdldFBpbm5lZFdpZHRoKCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHRha2VIaWRkZW4gSWYgd2Ugc2hvdWxkIHRha2UgaW50byBhY2NvdW50IHRoZSBoaWRkZW4gY29sdW1ucyBpbiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICovXG4gICAgcHVibGljIGdldFBpbm5lZFdpZHRoKHRha2VIaWRkZW4gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBmYyA9IHRha2VIaWRkZW4gPyB0aGlzLl9waW5uZWRDb2x1bW5zIDogdGhpcy5waW5uZWRDb2x1bW5zO1xuICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgZmMpIHtcbiAgICAgICAgICAgIGlmIChjb2wubGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdW0gKz0gcGFyc2VJbnQoY29sLmNhbGNXaWR0aCwgMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzUGlubmluZ1RvU3RhcnQpIHtcbiAgICAgICAgICAgIHN1bSArPSB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDb2x1bW5Hcm91cGVkKF9maWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBUT0RPOiBSRU1PVkVcbiAgICAgKi9cbiAgICBwdWJsaWMgb25IZWFkZXJTZWxlY3RvckNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyUm93U2VsZWN0aW9uKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RBbGxSb3dzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkU2VsZWN0b3JCYXNlQXJpYUxhYmVsKCkge1xuICAgICAgICBpZiAodGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSA/ICdEZXNlbGVjdCBhbGwgZmlsdGVyZWQnIDogJ1NlbGVjdCBhbGwgZmlsdGVyZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hcmVBbGxSb3dTZWxlY3RlZCgpID8gJ0Rlc2VsZWN0IGFsbCcgOiAnU2VsZWN0IGFsbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxSb3dzQ291bnRBZnRlckZpbHRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hbGxEYXRhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZCBwaW5uZWQgcm93IGRhdGEsIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAgICAgY29uc3QgcGlubmVkRGF0YVZpZXcgPSB0aGlzLmdyaWQucGlubmVkRGF0YVZpZXc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWREYXRhVmlldygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5lZFJlY29yZHMgPyB0aGlzLnBpbm5lZFJlY29yZHMgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZCB1bnBpbm5lZCByb3cgZGF0YSwgZGlzcGxheWVkIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogICAgICBjb25zdCBwaW5uZWREYXRhVmlldyA9IHRoaXMuZ3JpZC5waW5uZWREYXRhVmlldztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkRGF0YVZpZXcoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy51bnBpbm5lZFJlY29yZHMgPyB0aGlzLnVucGlubmVkUmVjb3JkcyA6IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuaWd4Rm9yT2YgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHRyYW5zZm9ybWVkIHBhZ2VkL2ZpbHRlcmVkL3NvcnRlZC9ncm91cGVkL3Bpbm5lZC91bnBpbm5lZCByb3cgZGF0YSwgZGlzcGxheWVkIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogICAgICBjb25zdCBkYXRhVmlldyA9IHRoaXMuZ3JpZC5kYXRhVmlldztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFWaWV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVZpZXc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgY2xpY2tpbmcgb3ZlciBhIHJvdyBzaG91bGQgc2VsZWN0L2Rlc2VsZWN0IGl0XG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIHRydWVcbiAgICAgKiBAcGFyYW0gZW5hYmxlZDogYm9vbGVhblxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzZWxlY3RSb3dPbkNsaWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0Um93T25DbGljaztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNlbGVjdFJvd09uQ2xpY2soZW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9zZWxlY3RSb3dPbkNsaWNrID0gZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3Qgc3BlY2lmaWVkIHJvd3MgYnkgSUQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc2VsZWN0Um93cyhbMSwyLDVdLCB0cnVlKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SURzXG4gICAgICogQHBhcmFtIGNsZWFyQ3VycmVudFNlbGVjdGlvbiBpZiB0cnVlIGNsZWFycyB0aGUgY3VycmVudCBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0Um93cyhyb3dJRHM6IGFueVtdLCBjbGVhckN1cnJlbnRTZWxlY3Rpb24/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RSb3dzV2l0aE5vRXZlbnQocm93SURzLCBjbGVhckN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCBzcGVjaWZpZWQgcm93cyBieSBJRC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5kZXNlbGVjdFJvd3MoWzEsMiw1XSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEc1xuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdFJvd3Mocm93SURzOiBhbnlbXSkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RSb3dzV2l0aE5vRXZlbnQocm93SURzKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0cyBhbGwgcm93c1xuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGlmIGZpbHRlcmluZyBpcyBpbiBwbGFjZSwgc2VsZWN0QWxsUm93cygpIGFuZCBkZXNlbGVjdEFsbFJvd3MoKSBzZWxlY3QvZGVzZWxlY3QgYWxsIGZpbHRlcmVkIHJvd3MuXG4gICAgICogSWYgeW91IHNldCB0aGUgcGFyYW1ldGVyIG9ubHlGaWx0ZXJEYXRhIHRvIGZhbHNlIHRoYXQgd2lsbCBzZWxlY3QgYWxsIHJvd3MgaW4gdGhlIGdyaWQgZXhlcHQgZGVsZXRlZCByb3dzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RBbGxSb3dzKCk7XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdEFsbFJvd3MoZmFsc2UpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvbmx5RmlsdGVyRGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxSb3dzKG9ubHlGaWx0ZXJEYXRhID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBkYXRhID0gb25seUZpbHRlckRhdGEgJiYgdGhpcy5maWx0ZXJlZERhdGEgPyB0aGlzLmZpbHRlcmVkRGF0YSA6IHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHJvd0lEcyA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRSb3dJRHMoZGF0YSkuZmlsdGVyKHJJRCA9PiAhdGhpcy5ncmlkQVBJLnJvd19kZWxldGVkX3RyYW5zYWN0aW9uKHJJRCkpO1xuICAgICAgICB0aGlzLnNlbGVjdFJvd3Mocm93SURzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdHMgYWxsIHJvd3NcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpZiBmaWx0ZXJpbmcgaXMgaW4gcGxhY2UsIHNlbGVjdEFsbFJvd3MoKSBhbmQgZGVzZWxlY3RBbGxSb3dzKCkgc2VsZWN0L2Rlc2VsZWN0IGFsbCBmaWx0ZXJlZCByb3dzLlxuICAgICAqIElmIHlvdSBzZXQgdGhlIHBhcmFtZXRlciBvbmx5RmlsdGVyRGF0YSB0byBmYWxzZSB0aGF0IHdpbGwgZGVzZWxlY3QgYWxsIHJvd3MgaW4gdGhlIGdyaWQgZXhlcHQgZGVsZXRlZCByb3dzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5kZXNlbGVjdEFsbFJvd3MoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb25seUZpbHRlckRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RBbGxSb3dzKG9ubHlGaWx0ZXJEYXRhID0gdHJ1ZSkge1xuICAgICAgICBpZiAob25seUZpbHRlckRhdGEgJiYgdGhpcy5maWx0ZXJlZERhdGEgJiYgdGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFJvd3ModGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFJvd0lEcyh0aGlzLmZpbHRlcmVkRGF0YSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyQWxsU2VsZWN0ZWRSb3dzKCk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyQ2VsbFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkcmFnU2Nyb2xsKGRlbHRhOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXIgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsID0gdGhpcy5oZWFkZXJDb250YWluZXIuZ2V0U2Nyb2xsKCk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5nZXRTY3JvbGwoKTtcbiAgICAgICAgY29uc3QgeyBsZWZ0LCB0b3AgfSA9IGRlbHRhO1xuXG4gICAgICAgIGhvcml6b250YWwuc2Nyb2xsTGVmdCArPSBsZWZ0ICogdGhpcy5EUkFHX1NDUk9MTF9ERUxUQTtcbiAgICAgICAgdmVydGljYWwuc2Nyb2xsVG9wICs9IHRvcCAqIHRoaXMuRFJBR19TQ1JPTExfREVMVEE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNEZWZpbmVkKGFyZzogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhcmcgIT09IHVuZGVmaW5lZCAmJiBhcmcgIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0UmFuZ2UoYXJnOiBHcmlkU2VsZWN0aW9uUmFuZ2UgfCBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGVmaW5lZChhcmcpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ2VsbFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgYXJnLmZvckVhY2gocmFuZ2UgPT4gdGhpcy5zZXRTZWxlY3Rpb24ocmFuZ2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sdW1uVG9WaXNpYmxlSW5kZXgoZmllbGQ6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSBmaWVsZCkudmlzaWJsZUluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGVjdGlvbihyYW5nZTogR3JpZFNlbGVjdGlvblJhbmdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHsgcm93OiByYW5nZS5yb3dTdGFydCwgY29sdW1uOiB0aGlzLmNvbHVtblRvVmlzaWJsZUluZGV4KHJhbmdlLmNvbHVtblN0YXJ0KSB9O1xuICAgICAgICBjb25zdCBlbmROb2RlID0geyByb3c6IHJhbmdlLnJvd0VuZCwgY29sdW1uOiB0aGlzLmNvbHVtblRvVmlzaWJsZUluZGV4KHJhbmdlLmNvbHVtbkVuZCkgfTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlLm5vZGUgPSBzdGFydE5vZGU7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RSYW5nZShlbmROb2RlLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFkZFJhbmdlTWV0YShlbmROb2RlLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmluaXRQb2ludGVyU3RhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZWxlY3RlZFJhbmdlcygpOiBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UucmFuZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY3VycmVudCBjZWxsIHNlbGVjdGlvbiBpbiB0aGUgZm9ybSBvZiBgW3sgY29sdW1uLmZpZWxkOiBjZWxsLnZhbHVlIH0sIC4uLl1gLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBgZm9ybWF0dGVyc2AgaXMgZW5hYmxlZCwgdGhlIGNlbGwgdmFsdWUgd2lsbCBiZSBmb3JtYXR0ZWQgYnkgaXRzIHJlc3BlY3RpdmUgY29sdW1uIGZvcm1hdHRlciAoaWYgYW55KS5cbiAgICAgKiBJZiBgaGVhZGVyc2AgaXMgZW5hYmxlZCwgaXQgd2lsbCB1c2UgdGhlIGNvbHVtbiBoZWFkZXIgKGlmIGFueSkgaW5zdGVhZCBvZiB0aGUgY29sdW1uIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZWxlY3RlZERhdGEoZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3REYXRhRnJvbVNlbGVjdGlvbihzb3VyY2UsIGZvcm1hdHRlcnMsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjdXJyZW50IHNlbGVjdGVkIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCBzZWxlY3RlZCBjb2x1bW5zXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuZ3JpZC5zZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICByZXR1cm4gZmllbGRzLm1hcChmaWVsZCA9PiB0aGlzLmdldENvbHVtbkJ5TmFtZShmaWVsZCkpLmZpbHRlcihmaWVsZCA9PiBmaWVsZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdENvbHVtbnMoWydJRCcsJ05hbWUnXSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbnNcbiAgICAgKiBAcGFyYW0gY2xlYXJDdXJyZW50U2VsZWN0aW9uIGlmIHRydWUgY2xlYXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RDb2x1bW5zKGNvbHVtbnM6IHN0cmluZ1tdIHwgSWd4Q29sdW1uQ29tcG9uZW50W10sIGNsZWFyQ3VycmVudFNlbGVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IGZpZWxkVG9TZWxlY3Q6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY29sdW1uc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QgPSBjb2x1bW5zIGFzIHN0cmluZ1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbHVtbnMgYXMgSWd4Q29sdW1uQ29tcG9uZW50W10pLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29sLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29sLmFsbENoaWxkcmVuLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKS5tYXAoYyA9PiBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb1NlbGVjdCA9IFsuLi5maWVsZFRvU2VsZWN0LCAuLi5jaGlsZHJlbl07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb1NlbGVjdC5wdXNoKGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Q29sdW1uc1dpdGhOb0V2ZW50KGZpZWxkVG9TZWxlY3QsIGNsZWFyQ3VycmVudFNlbGVjdGlvbik7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zIGJ5IGZpbGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0Q29sdW1ucyhbJ0lEJywnTmFtZSddKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uc1xuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdENvbHVtbnMoY29sdW1uczogc3RyaW5nW10gfCBJZ3hDb2x1bW5Db21wb25lbnRbXSkge1xuICAgICAgICBsZXQgZmllbGRUb0Rlc2VsZWN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNvbHVtbnNbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmaWVsZFRvRGVzZWxlY3QgPSBjb2x1bW5zIGFzIHN0cmluZ1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbHVtbnMgYXMgSWd4Q29sdW1uQ29tcG9uZW50W10pLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29sLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29sLmFsbENoaWxkcmVuLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKS5tYXAoYyA9PiBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb0Rlc2VsZWN0ID0gWy4uLmZpZWxkVG9EZXNlbGVjdCwgLi4uY2hpbGRyZW5dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9EZXNlbGVjdC5wdXNoKGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Q29sdW1uc1dpdGhOb0V2ZW50KGZpZWxkVG9EZXNlbGVjdCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0cyBhbGwgY29sdW1uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0QWxsQ29sdW1ucygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdEFsbENvbHVtbnMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIGFsbCBjb2x1bW5zXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxDb2x1bW5zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEFsbENvbHVtbnMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgY29sdW1ucyBzZWxlY3Rpb24gaW4gdGhlIGZvcm0gb2YgYFt7IGNvbHVtbi5maWVsZDogY2VsbC52YWx1ZSB9LCAuLi5dYC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgYGZvcm1hdHRlcnNgIGlzIGVuYWJsZWQsIHRoZSBjZWxsIHZhbHVlIHdpbGwgYmUgZm9ybWF0dGVkIGJ5IGl0cyByZXNwZWN0aXZlIGNvbHVtbiBmb3JtYXR0ZXIgKGlmIGFueSkuXG4gICAgICogSWYgYGhlYWRlcnNgIGlzIGVuYWJsZWQsIGl0IHdpbGwgdXNlIHRoZSBjb2x1bW4gaGVhZGVyIChpZiBhbnkpIGluc3RlYWQgb2YgdGhlIGNvbHVtbiBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb2x1bW5zRGF0YShmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YSA/IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhIDogdGhpcy5kYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YUZyb21Db2x1bW5zU2VsZWN0aW9uKHNvdXJjZSwgZm9ybWF0dGVycywgaGVhZGVycyk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgY29tYmluZVNlbGVjdGVkQ2VsbEFuZENvbHVtbkRhdGEoY29sdW1uRGF0YTogYW55W10sIGZvcm1hdHRlcnMgPSBmYWxzZSwgaGVhZGVycyA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YUZyb21TZWxlY3Rpb24oc291cmNlLCBmb3JtYXR0ZXJzLCBoZWFkZXJzLCBjb2x1bW5EYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2ZW50Q29udGFpbmVyU2Nyb2xsID0gKGV2dCkgPT4ge1xuICAgICAgICBpZiAoZXZ0LnRhcmdldC5zY3JvbGxUb3AgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuYWRkU2Nyb2xsVG9wKGV2dC50YXJnZXQuc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgIGV2dC50YXJnZXQuc2Nyb2xsVG9wID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZ0LnRhcmdldC5zY3JvbGxMZWZ0ICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckNvbnRhaW5lci5zY3JvbGxQb3NpdGlvbiArPSBldnQudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICBldnQudGFyZ2V0LnNjcm9sbExlZnQgPSAwO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weUhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5ncmlkQVBJLmdyaWQuc2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbkRhdGEgPSB0aGlzLmdldFNlbGVjdGVkQ29sdW1uc0RhdGEodGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICBsZXQgc2VsZWN0ZWREYXRhO1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NvcHknKSB7XG4gICAgICAgICAgICBzZWxlY3RlZERhdGEgPSB0aGlzLmdldFNlbGVjdGVkRGF0YSh0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGRhdGEgPSBbXTtcbiAgICAgICAgbGV0IHJlc3VsdDtcblxuICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0tleUMnICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xhc3NOYW1lID09PSAnaWd4LWdyaWQtdGhlYWRfX3dyYXBwZXInKSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgc2VsZWN0ZWREYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5jb21iaW5lU2VsZWN0ZWRDZWxsQW5kQ29sdW1uRGF0YShjb2x1bW5EYXRhLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YVswXSwgZGF0YVsxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gY29sdW1uRGF0YTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzSUUpIHtcbiAgICAgICAgICAgICAgICAod2luZG93IGFzIGFueSkuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCdUZXh0JywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChyZXN1bHQpLnRoZW4oKS5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmNsaXBib2FyZE9wdGlvbnMuZW5hYmxlZCB8fCB0aGlzLmNydWRTZXJ2aWNlLmNlbGxJbkVkaXRNb2RlIHx8ICghdGhpcy5wbGF0Zm9ybS5pc0lFICYmIGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuY29tYmluZVNlbGVjdGVkQ2VsbEFuZENvbHVtbkRhdGEoY29sdW1uRGF0YSwgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhWzBdLCBkYXRhWzFdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzSUUpIHtcbiAgICAgICAgICAgICAgICAod2luZG93IGFzIGFueSkuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCdUZXh0JywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhLCBrZXlzPykge1xuICAgICAgICBjb25zdCBldiA9IHsgZGF0YSwgY2FuY2VsOiBmYWxzZSB9IGFzIElHcmlkQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICAgIHRoaXMuZ3JpZENvcHkuZW1pdChldik7XG5cbiAgICAgICAgaWYgKGV2LmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBuZXcgQ2hhclNlcGFyYXRlZFZhbHVlRGF0YShldi5kYXRhLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuc2VwYXJhdG9yKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGtleXMgPyB0cmFuc2Zvcm1lci5wcmVwYXJlRGF0YShrZXlzKSA6IHRyYW5zZm9ybWVyLnByZXBhcmVEYXRhKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcocmVzdWx0LmluZGV4T2YoJ1xcbicpICsgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LnZhbHVlcyhkYXRhWzBdKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCAtMik7XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIC8qIE5lY2Vzc2FyeSBmb3IgdGhlIGhpZWFyYWNoaWNhbCBjYXNlIGJ1dCB3aWxsIHByb2JhYmx5IGhhdmUgdG9cbiAgICAgICAgICAgY2hhbmdlIGhvdyBnZXRTZWxlY3RlZERhdGEgaXMgcHJvcGFnYXRlZCBpbiB0aGUgaGllYXJhY2hpY2FsIGdyaWRcbiAgICAgICAgKi9cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93U25hY2tiYXJGb3IoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLmFkZFJvd1NuYWNrYmFyLmFjdGlvblRleHQgPSBpbmRleCA9PT0gLTEgPyAnJyA6IHRoaXMuc25hY2tiYXJBY3Rpb25UZXh0O1xuICAgICAgICB0aGlzLmxhc3RBZGRlZFJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXIub3BlbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byBhIHBvc2l0aW9uIGluIHRoZSBncmlkIGJhc2VkIG9uIHByb3ZpZGVkIGByb3dpbmRleGAgYW5kIGB2aXNpYmxlQ29sdW1uSW5kZXhgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbHNvIGNhbiBleGVjdXRlIGEgY3VzdG9tIGxvZ2ljIG92ZXIgdGhlIHRhcmdldCBlbGVtZW50LFxuICAgICAqIHRocm91Z2ggYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgeyB0YXJnZXRUeXBlOiBHcmlkS2V5ZG93blRhcmdldFR5cGUsIHRhcmdldDogT2JqZWN0IH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgdGhpcy5ncmlkLm5hdmlnYXRlVG8oMTAsIDMsIChhcmdzKSA9PiB7IGFyZ3MudGFyZ2V0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsgfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlVG8ocm93SW5kZXg6IG51bWJlciwgdmlzaWJsZUNvbEluZGV4ID0gLTEsIGNiOiAoYXJnczogYW55KSA9PiB2b2lkID0gbnVsbCkge1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gKHRoaXMgYXMgYW55KS50b3RhbEl0ZW1Db3VudCA/PyB0aGlzLmRhdGFWaWV3Lmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChyb3dJbmRleCA8IDAgfHwgcm93SW5kZXggPiB0b3RhbEl0ZW1zIHx8ICh2aXNpYmxlQ29sSW5kZXggIT09IC0xXG4gICAgICAgICAgICAmJiB0aGlzLmNvbHVtbkxpc3QubWFwKGNvbCA9PiBjb2wudmlzaWJsZUluZGV4KS5pbmRleE9mKHZpc2libGVDb2xJbmRleCkgPT09IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNsaWNlKHJvd0luZGV4LCByb3dJbmRleCArIDEpLmZpbmQocmVjID0+IHJlYy5leHByZXNzaW9uIHx8IHJlYy5jaGlsZEdyaWRzRGF0YSkpIHtcbiAgICAgICAgICAgIHZpc2libGVDb2xJbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZSB0YXJnZXQgcm93IGlzIHBpbm5lZCBubyBuZWVkIHRvIHNjcm9sbCBhcyB3ZWxsLlxuICAgICAgICBjb25zdCBzaG91bGRTY3JvbGxWZXJ0aWNhbGx5ID0gdGhpcy5uYXZpZ2F0aW9uLnNob3VsZFBlcmZvcm1WZXJ0aWNhbFNjcm9sbChyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgY29uc3Qgc2hvdWxkU2Nyb2xsSG9yaXpvbnRhbGx5ID0gdGhpcy5uYXZpZ2F0aW9uLnNob3VsZFBlcmZvcm1Ib3Jpem9udGFsU2Nyb2xsKHZpc2libGVDb2xJbmRleCwgcm93SW5kZXgpO1xuICAgICAgICBpZiAoc2hvdWxkU2Nyb2xsVmVydGljYWxseSkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnBlcmZvcm1WZXJ0aWNhbFNjcm9sbFRvQ2VsbChyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFNjcm9sbEhvcml6b250YWxseSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucGVyZm9ybUhvcml6b250YWxTY3JvbGxUb0NlbGwodmlzaWJsZUNvbEluZGV4LCAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hvdWxkU2Nyb2xsSG9yaXpvbnRhbGx5KSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucGVyZm9ybUhvcml6b250YWxTY3JvbGxUb0NlbGwodmlzaWJsZUNvbEluZGV4LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFNjcm9sbFZlcnRpY2FsbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnBlcmZvcm1WZXJ0aWNhbFNjcm9sbFRvQ2VsbChyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBJQ2VsbFBvc2l0aW9uYCB3aGljaCBkZWZpbmVzIHRoZSBuZXh0IGNlbGwsXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLCB0aGF0IG1hdGNoIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBZb3UgY2FuIHBhc3MgY2FsbGJhY2sgZnVuY3Rpb24gYXMgYSB0aGlyZCBwYXJhbWV0ZXIgb2YgYGdldFByZXZpb3VzQ2VsbGAgbWV0aG9kLlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBhY2NlcHRzIElneENvbHVtbkNvbXBvbmVudCBhcyBhIHBhcmFtXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IG5leHRFZGl0YWJsZUNlbGxQb3NpdGlvbiA9IHRoaXMuZ3JpZC5nZXROZXh0Q2VsbCgwLCAzLCAoY29sdW1uKSA9PiBjb2x1bW4uZWRpdGFibGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROZXh0Q2VsbChjdXJyUm93SW5kZXg6IG51bWJlciwgY3VyVmlzaWJsZUNvbEluZGV4OiBudW1iZXIsXG4gICAgICAgIGNhbGxiYWNrOiAoSWd4Q29sdW1uQ29tcG9uZW50KSA9PiBib29sZWFuID0gbnVsbCk6IElDZWxsUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5Hcm91cCAmJiBjb2wudmlzaWJsZUluZGV4ID49IDApO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkUG9zaXRpb24oY3VyclJvd0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbEluZGV4ZXMgPSBjYWxsYmFjayA/IGNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNhbGxiYWNrKGNvbCkpLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhIC0gYikgOlxuICAgICAgICAgICAgY29sdW1ucy5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBjb25zdCBuZXh0Q2VsbEluZGV4ID0gY29sSW5kZXhlcy5maW5kKGluZGV4ID0+IGluZGV4ID4gY3VyVmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2xpY2UoY3VyclJvd0luZGV4LCBjdXJyUm93SW5kZXggKyAxKVxuICAgICAgICAgICAgLmZpbmQocmVjID0+ICFyZWMuZXhwcmVzc2lvbiAmJiAhcmVjLnN1bW1hcmllcyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhICYmICFyZWMuZGV0YWlsc0RhdGEpICYmIG5leHRDZWxsSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBuZXh0Q2VsbEluZGV4IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29sSW5kZXhlcy5sZW5ndGggPT09IDAgfHwgdGhpcy5nZXROZXh0RGF0YVJvd0luZGV4KGN1cnJSb3dJbmRleCkgPT09IGN1cnJSb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY3VyVmlzaWJsZUNvbEluZGV4IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiB0aGlzLmdldE5leHREYXRhUm93SW5kZXgoY3VyclJvd0luZGV4KSwgdmlzaWJsZUNvbHVtbkluZGV4OiBjb2xJbmRleGVzWzBdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBJQ2VsbFBvc2l0aW9uYCB3aGljaCBkZWZpbmVzIHRoZSBwcmV2aW91cyBjZWxsLFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwb3NpdGlvbiwgdGhhdCBtYXRjaCBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogWW91IGNhbiBwYXNzIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGEgdGhpcmQgcGFyYW1ldGVyIG9mIGBnZXRQcmV2aW91c0NlbGxgIG1ldGhvZC5cbiAgICAgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gYWNjZXB0cyBJZ3hDb2x1bW5Db21wb25lbnQgYXMgYSBwYXJhbVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBwcmV2aW91c0VkaXRhYmxlQ2VsbFBvc2l0aW9uID0gdGhpcy5ncmlkLmdldFByZXZpb3VzQ2VsbCgwLCAzLCAoY29sdW1uKSA9PiBjb2x1bW4uZWRpdGFibGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQcmV2aW91c0NlbGwoY3VyclJvd0luZGV4OiBudW1iZXIsIGN1clZpc2libGVDb2xJbmRleDogbnVtYmVyLFxuICAgICAgICBjYWxsYmFjazogKElneENvbHVtbkNvbXBvbmVudCkgPT4gYm9vbGVhbiA9IG51bGwpOiBJQ2VsbFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLnZpc2libGVJbmRleCA+PSAwKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZFBvc2l0aW9uKGN1cnJSb3dJbmRleCwgY3VyVmlzaWJsZUNvbEluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xJbmRleGVzID0gY2FsbGJhY2sgPyBjb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjYWxsYmFjayhjb2wpKS5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYiAtIGEpIDpcbiAgICAgICAgICAgIGNvbHVtbnMubWFwKGVkaXRDb2wgPT4gZWRpdENvbC52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcbiAgICAgICAgY29uc3QgcHJldkNlbGxJbmRleCA9IGNvbEluZGV4ZXMuZmluZChpbmRleCA9PiBpbmRleCA8IGN1clZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNsaWNlKGN1cnJSb3dJbmRleCwgY3VyclJvd0luZGV4ICsgMSlcbiAgICAgICAgICAgIC5maW5kKHJlYyA9PiAhcmVjLmV4cHJlc3Npb24gJiYgIXJlYy5zdW1tYXJpZXMgJiYgIXJlYy5jaGlsZEdyaWRzRGF0YSAmJiAhcmVjLmRldGFpbHNEYXRhKSAmJiBwcmV2Q2VsbEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogcHJldkNlbGxJbmRleCB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbEluZGV4ZXMubGVuZ3RoID09PSAwIHx8IHRoaXMuZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyUm93SW5kZXgsIHRydWUpID09PSBjdXJyUm93SW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogdGhpcy5nZXROZXh0RGF0YVJvd0luZGV4KGN1cnJSb3dJbmRleCwgdHJ1ZSksIHZpc2libGVDb2x1bW5JbmRleDogY29sSW5kZXhlc1swXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBlbmRSb3dFZGl0VGFiU3RvcChjb21taXQgPSB0cnVlLCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGNhbmNlbGVkID0gdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGNvbW1pdCwgZXZlbnQpO1xuXG4gICAgICAgIGlmIChjYW5jZWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3RpdmVDZWxsID0gdGhpcy5ncmlkQVBJLmdyaWQubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICBpZiAoYWN0aXZlQ2VsbCAmJiBhY3RpdmVDZWxsLnJvdyAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhY2tDb2x1bW5DaGFuZ2VzKGluZGV4LCBjb2wpIHtcbiAgICAgICAgcmV0dXJuIGNvbC5maWVsZCArIGNvbC5fY2FsY1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFeHBhbmRlZEdyb3VwKF9ncm91cDogSUdyb3VwQnlSZWNvcmQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIFRPRE86IE1PVkUgdG8gQ1JVRFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuUm93T3ZlcmxheShpZCkge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZVJvd0VkaXRpbmdPdmVybGF5KGlkLCB0aGlzLnJvd0xpc3QubGVuZ3RoIDw9IE1JTl9ST1dfRURJVElOR19DT1VOVF9USFJFU0hPTEQpO1xuXG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkub3Blbih0aGlzLnJvd0VkaXRTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMucm93RWRpdGluZ1doZWVsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZVJvd0VkaXRpbmdPdmVybGF5KCkge1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLnJvd0VkaXRpbmdXaGVlbEhhbmRsZXIpO1xuICAgICAgICB0aGlzLnJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5LmlzVG9wSW5pdGlhbFBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jbG9zZSgpO1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlUm93RWRpdGluZ092ZXJsYXkoc2hvdykge1xuICAgICAgICBjb25zdCByb3dTdHlsZSA9IHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5zdHlsZTtcbiAgICAgICAgaWYgKHNob3cpIHtcbiAgICAgICAgICAgIHJvd1N0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheShyb3c6IElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPikge1xuICAgICAgICBpZiAocm93ICYmICF0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgY29uc3Qgcm93U3R5bGUgPSB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZTtcbiAgICAgICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgICAgICByb3dTdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmVSb3dFZGl0aW5nT3ZlcmxheShyb3cucm93SUQpO1xuICAgICAgICAgICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkucmVwb3NpdGlvbigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByb3dTdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FjaGVkVmlld0xvYWRlZChhcmdzOiBJQ2FjaGVkVmlld0xvYWRlZEV2ZW50QXJncykge1xuICAgICAgICBpZiAodGhpcy5oYXNIb3Jpem9udGFsU2Nyb2xsKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRtcGxJZCA9IGFyZ3MuY29udGV4dC50ZW1wbGF0ZUlELnR5cGU7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGFyZ3MuY29udGV4dC5pbmRleDtcbiAgICAgICAgICAgIGFyZ3Mudmlldy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRtcGxJZCA9PT0gJ2RhdGFSb3cnID8gdGhpcy5ncmlkQVBJLmdldF9yb3dfYnlfaW5kZXgoaW5kZXgpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5Um93ID0gdG1wbElkID09PSAnc3VtbWFyeVJvdycgPyB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmluZCgoc3IpID0+IHNyLmRhdGFSb3dJbmRleCA9PT0gaW5kZXgpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocm93ICYmIHJvdyBpbnN0YW5jZW9mIElneFJvd0RpcmVjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN0b3JlVmlydFN0YXRlKHJvdyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdW1tYXJ5Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3RvcmVWaXJ0U3RhdGUoc3VtbWFyeVJvdyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGRpYWxvZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlbkFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nKG92ZXJsYXlTZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncykge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IG92ZXJsYXlTZXR0aW5ncyA/IG92ZXJsYXlTZXR0aW5ncyA6IHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzO1xuICAgICAgICBpZiAoIXRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlTZXR0aW5ncy50YXJnZXQgPVxuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSkucm9vdEdyaWQgPyAodGhpcyBhcyBhbnkpLnJvb3RHcmlkLm5hdGl2ZUVsZW1lbnQgOiB0aGlzLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm91dGxldDtcblxuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmF0dGFjaChcbiAgICAgICAgICAgICAgICBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdG9yOiB0aGlzLnZpZXdSZWYuaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogdGhpcy5yZXNvbHZlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5zaG93KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGRpYWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcHBseUNoYW5nZXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2VBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyhhcHBseUNoYW5nZXM6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKSB7XG4gICAgICAgICAgICBjb25zdCBhZHZhbmNlZEZpbHRlcmluZ092ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nID0gYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5LmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudDtcblxuICAgICAgICAgICAgaWYgKGFwcGx5Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIGFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nLmFwcGx5Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2cuY2xvc2VEaWFsb2coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldEVtcHR5UmVjb3JkT2JqZWN0Rm9yKGluUm93OiBJZ3hSb3dEaXJlY3RpdmU8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4pIHtcbiAgICAgICAgY29uc3Qgcm93ID0geyAuLi5pblJvdz8ucm93RGF0YSB9O1xuICAgICAgICBPYmplY3Qua2V5cyhyb3cpLmZvckVhY2goa2V5ID0+IHJvd1trZXldID0gdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlUm93SUQoKTtcbiAgICAgICAgcm93W3RoaXMucHJpbWFyeUtleV0gPSBpZDtcbiAgICAgICAgcmV0dXJuIHsgcm93SUQ6IGlkLCBkYXRhOiByb3csIHJlY29yZFJlZjogcm93IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzSG9yaXpvbnRhbFNjcm9sbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG90YWxXaWR0aCAtIHRoaXMudW5waW5uZWRXaWR0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdW1tYXJ5Um93KHJvd0RhdGEpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJvd0RhdGEuc3VtbWFyaWVzICYmIChyb3dEYXRhLnN1bW1hcmllcyBpbnN0YW5jZW9mIE1hcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJpZ2dlclBpcGVzKCkge1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHJvd0VkaXRpbmdXaGVlbEhhbmRsZXIoZXZlbnQ6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc2Nyb2xsTmV4dCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxQcmV2KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldFVucGlubmVkSW5kZXhCeUlkKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVucGlubmVkUmVjb3Jkcy5maW5kSW5kZXgoeCA9PiB4W3RoaXMucHJpbWFyeUtleV0gPT09IGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5pc2hlcyB0aGUgcm93IHRyYW5zYWN0aW9ucyBvbiB0aGUgY3VycmVudCByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIGBjb21taXQgPT09IHRydWVgLCBwYXNzZXMgdGhlbSBmcm9tIHRoZSBwZW5kaW5nIHN0YXRlIHRvIHRoZSBkYXRhIChvciB0cmFuc2FjdGlvbiBzZXJ2aWNlKVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gaWd4QnV0dG9uIChjbGljayk9XCJncmlkLmVuZEVkaXQodHJ1ZSlcIj5Db21taXQgUm93PC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbW1pdFxuICAgICAqL1xuICAgIC8vIFRPRE86IEZhY2FkZSBmb3IgY3J1ZCBzZXJ2aWNlIHJlZmFjdG9yaW5nLiBUbyBiZSByZW1vdmVkXG4gICAgLy8gVE9ETzogZG8gbm90IHJlbW92ZSB0aGlzLCBhcyBpdCBpcyB1c2VkIGluIHJvd0VkaXRUZW1wbGF0ZSwgYnV0IG1hcmsgaXMgYXMgaW50ZXJuYWwgYW5kIGhpZGRlblxuICAgIHB1YmxpYyBlbmRFZGl0KGNvbW1pdCA9IHRydWUsIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGNvbW1pdCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVudGVycyBhZGQgbW9kZSBieSBzcGF3bmluZyB0aGUgVUkgdW5kZXIgdGhlIHNwZWNpZmllZCByb3cgYnkgcm93SUQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIG51bGwgaXMgcGFzc2VkIGFzIHJvd0lELCB0aGUgcm93IGFkZGluZyBVSSBpcyBzcGF3bmVkIGFzIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGRhdGEgdmlld1xuICAgICAqIEByZW1hcmtzXG4gICAgICogU3Bhd25pbmcgdGhlIFVJIHRvIGFkZCBhIGNoaWxkIGZvciBhIHJlY29yZCBvbmx5IHdvcmtzIGlmIHlvdSBwcm92aWRlIGEgcm93SURcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuYmVnaW5BZGRSb3dCeUlkKCdBTEZLSScpO1xuICAgICAqIHRoaXMuZ3JpZC5iZWdpbkFkZFJvd0J5SWQoJ0FMRktJJywgdHJ1ZSk7XG4gICAgICogdGhpcy5ncmlkLmJlZ2luQWRkUm93QnlJZChudWxsKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgLSBUaGUgcm93SUQgdG8gc3Bhd24gdGhlIGFkZCByb3cgVUkgZm9yLCBvciBudWxsIHRvIHNwYXduIGl0IGFzIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGRhdGEgdmlld1xuICAgICAqIEBwYXJhbSBhc0NoaWxkIC0gV2hldGhlciB0aGUgcmVjb3JkIHNob3VsZCBiZSBhZGRlZCBhcyBhIGNoaWxkLiBPbmx5IGFwcGxpY2FibGUgdG8gaWd4VHJlZUdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGJlZ2luQWRkUm93QnlJZChyb3dJRDogYW55LCBhc0NoaWxkPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBsZXQgaW5kZXggPSByb3dJRDtcbiAgICAgICAgaWYgKHJvd0lEID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChhc0NoaWxkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgcmVjb3JkIGNhbm5vdCBiZSBhZGRlZCBhcyBhIGNoaWxkIHRvIGFuIHVuc3BlY2lmaWVkIHJlY29yZC4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmaW5kIHRoZSBpbmRleCBvZiB0aGUgcmVjb3JkIHdpdGggdGhhdCBQS1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3JlY19pbmRleF9ieV9pZChyb3dJRCwgdGhpcy5kYXRhVmlldyk7XG4gICAgICAgICAgICByb3dJRCA9IGluZGV4O1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gcm93IHdpdGggdGhlIHNwZWNpZmllZCBJRCB3YXMgZm91bmQuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kYXRhVmlldy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYmVnaW5BZGRSb3dGb3JJbmRleChyb3dJRCwgYXNDaGlsZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGluZGV4IGlzIHZhbGlkIC0gd29uJ3Qgc3VwcG9ydCBhbnl0aGluZyBvdXRzaWRlIHRoZSBkYXRhIHZpZXdcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmRhdGFWaWV3Lmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGluZGV4IGlzIGluIHRoZSB2aWV3IHBvcnRcbiAgICAgICAgICAgIGlmICgoaW5kZXggPCB0aGlzLnZpcnR1YWxpemF0aW9uU3RhdGUuc3RhcnRJbmRleCB8fFxuICAgICAgICAgICAgICAgIGluZGV4ID49IHRoaXMudmlydHVhbGl6YXRpb25TdGF0ZS5zdGFydEluZGV4ICsgdGhpcy52aXJ0dWFsaXphdGlvblN0YXRlLmNodW5rU2l6ZSkgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5pc1JlY29yZFBpbm5lZEJ5Vmlld0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuY2h1bmtMb2FkXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGZpcnN0KCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luQWRkUm93Rm9ySW5kZXgocm93SUQsIGFzQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG8oaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJlZ2luQWRkUm93Rm9ySW5kZXgocm93SUQsIGFzQ2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgcm93IHdpdGggdGhlIHNwZWNpZmllZCBQSyBvciBpbmRleCBpcyBvdXRzaWRlIG9mIHRoZSBjdXJyZW50IGRhdGEgdmlldy4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVudGVycyBhZGQgbW9kZSBieSBzcGF3bmluZyB0aGUgVUkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQWNjZXB0ZWQgdmFsdWVzIGZvciBpbmRleCBhcmUgaW50ZWdlcnMgZnJvbSAwIHRvIHRoaXMuZ3JpZC5kYXRhVmlldy5sZW5ndGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuYmVnaW5BZGRSb3dCeUluZGV4KDApO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCB0byBzcGF3biB0aGUgVUkgYXQuIEFjY2VwdHMgaW50ZWdlcnMgZnJvbSAwIHRvIHRoaXMuZ3JpZC5kYXRhVmlldy5sZW5ndGhcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVnaW5BZGRSb3dCeUluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iZWdpbkFkZFJvd0J5SWQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYmVnaW5BZGRSb3dCeUlkKHRoaXMuZ3JpZEFQSS5nZXRfcmVjX2lkX2J5X2luZGV4KGluZGV4IC0gMSwgdGhpcy5kYXRhVmlldykpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBiZWdpbkFkZFJvd0ZvckluZGV4KGluZGV4OiBudW1iZXIsIGFzQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCByb3c6IElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPiA9IGluZGV4ID09IG51bGwgP1xuICAgICAgICAgICAgbnVsbCA6IHRoaXMucm93TGlzdC5maW5kKHIgPT4gci5pbmRleCA9PT0gaW5kZXgpO1xuICAgICAgICBpZiAocm93ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW50ZXJBZGRSb3dNb2RlKHJvdywgYXNDaGlsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIHJvdyB3aXRoIHRoZSBzcGVjaWZpZWQgUEsgb3IgaW5kZXggd2FzIGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN3aXRjaFRyYW5zYWN0aW9uU2VydmljZSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbkZhY3RvcnkuY3JlYXRlKFRSQU5TQUNUSU9OX1RZUEUuQmFzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2FjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9uRmFjdG9yeS5jcmVhdGUoVFJBTlNBQ1RJT05fVFlQRS5Ob25lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhQ2xvbmVTdHJhdGVneSkge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zLmNsb25lU3RyYXRlZ3kgPSB0aGlzLmRhdGFDbG9uZVN0cmF0ZWd5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN1YnNjcmliZVRvVHJhbnNhY3Rpb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uQ2hhbmdlJC5uZXh0KCk7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLm9uU3RhdGVVcGRhdGUucGlwZSh0YWtlVW50aWwobWVyZ2UodGhpcy5kZXN0cm95JCwgdGhpcy50cmFuc2FjdGlvbkNoYW5nZSQpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy50cmFuc2FjdGlvblN0YXR1c1VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25TdGF0dXNVcGRhdGUoZXZlbnQ6IFN0YXRlVXBkYXRlRXZlbnQpIHtcbiAgICAgICAgbGV0IGFjdGlvbnM6IEFjdGlvbjxUcmFuc2FjdGlvbj5bXSA9IFtdO1xuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlJFRE8pIHtcbiAgICAgICAgICAgIGFjdGlvbnMgPSBldmVudC5hY3Rpb25zID8gZXZlbnQuYWN0aW9ucy5maWx0ZXIoeCA9PiB4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUpIDogW107XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlVORE8pIHtcbiAgICAgICAgICAgIGFjdGlvbnMgPSBldmVudC5hY3Rpb25zID8gZXZlbnQuYWN0aW9ucy5maWx0ZXIoeCA9PiB4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BREQpIDogW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuaXNSb3dTZWxlY3RlZChhY3Rpb24udHJhbnNhY3Rpb24uaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdFJvdyhhY3Rpb24udHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIHdyaXRlVG9EYXRhKHJvd0luZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgbWVyZ2VPYmplY3RzKHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEoKVtyb3dJbmRleF0sIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3Jlc3RvcmVWaXJ0U3RhdGUocm93KSB7XG4gICAgICAgIC8vIGNoZWNrIHZpcnR1YWxpemF0aW9uIHN0YXRlIG9mIGRhdGEgcmVjb3JkIGFkZGVkIGZyb20gY2FjaGVcbiAgICAgICAgLy8gaW4gY2FzZSBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQgLSB1cGRhdGUgaXQuXG4gICAgICAgIGNvbnN0IHJvd0Zvck9mID0gcm93LnZpcnREaXJSb3c7XG4gICAgICAgIGNvbnN0IGdyaWRTY3JMZWZ0ID0gcm93Rm9yT2YuZ2V0U2Nyb2xsKCkuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgbGVmdCA9IC1wYXJzZUludChyb3dGb3JPZi5kYy5pbnN0YW5jZS5fdmlld0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCwgMTApO1xuICAgICAgICBjb25zdCBhY3R1YWxTY3JvbGxMZWZ0ID0gbGVmdCArIHJvd0Zvck9mLmdldENvbHVtblNjcm9sbExlZnQocm93Rm9yT2Yuc3RhdGUuc3RhcnRJbmRleCk7XG4gICAgICAgIGlmIChncmlkU2NyTGVmdCAhPT0gYWN0dWFsU2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgcm93Rm9yT2Yub25IU2Nyb2xsKGdyaWRTY3JMZWZ0KTtcbiAgICAgICAgICAgIHJvd0Zvck9mLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEV4cG9ydEV4Y2VsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwb3J0RXhjZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRFeHBvcnRDc3YoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBvcnRDc3Y7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoYW5nZVJvd0VkaXRpbmdPdmVybGF5U3RhdGVPblNjcm9sbChyb3c6IElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPikge1xuICAgICAgICBpZiAoIXRoaXMucm93RWRpdGFibGUgfHwgIXRoaXMucm93RWRpdGluZ092ZXJsYXkgfHwgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVSb3dFZGl0aW5nT3ZlcmxheShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheShyb3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGRhdGEgYW5kL29yIGlzTG9hZGluZyBpbnB1dCBjaGFuZ2VzIHNvIHRoYXQgdGhlIG92ZXJsYXkgY2FuIGJlXG4gICAgICogaGlkZGVuL3Nob3duIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHNob3VsZE92ZXJsYXlMb2FkaW5nXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGV2YWx1YXRlTG9hZGluZ1N0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRPdmVybGF5TG9hZGluZykge1xuICAgICAgICAgICAgLy8gYSBuZXcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd25cbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgIG91dGxldDogdGhpcy5sb2FkaW5nT3V0bGV0LFxuICAgICAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb250YWluZXJQb3NpdGlvblN0cmF0ZWd5KClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdPdmVybGF5Lm9wZW4ob3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ092ZXJsYXkuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIGdyaWQgd2lkdGggaS5lLiB0aGlzLmNhbGNXaWR0aFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkV2lkdGgoKSB7XG4gICAgICAgIGxldCB3aWR0aDtcblxuICAgICAgICBpZiAodGhpcy5pc1BlcmNlbnRXaWR0aCkge1xuICAgICAgICAgICAgLyogd2lkdGggaW4gJSovXG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyk7XG4gICAgICAgICAgICB3aWR0aCA9IGNvbXB1dGVkLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBwYXJzZUludChjb21wdXRlZCwgMTApIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpZHRoID0gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF3aWR0aCAmJiB0aGlzLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZiAodGhpcy53aWR0aCA9PT0gbnVsbCB8fCAhd2lkdGgpIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5nZXRDb2x1bW5XaWR0aFN1bSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSAmJiB0aGlzLndpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aWR0aCAtPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8IHdpZHRoID09PSBudWxsKSAmJiB3aWR0aCAhPT0gdGhpcy5jYWxjV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY1dpZHRoID0gd2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGVyaXZlUG9zc2libGVXaWR0aCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIGNvbHVtbnMgZGVmYXVsdFdpZHRoIHByb3BlcnR5XG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kZXJpdmVQb3NzaWJsZVdpZHRoKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29sdW1uV2lkdGhTZXRCeVVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbldpZHRoID0gdGhpcy53aWR0aCAhPT0gbnVsbCA/IHRoaXMuZ2V0UG9zc2libGVDb2x1bW5XaWR0aCgpIDogTUlOSU1VTV9DT0xVTU5fV0lEVEggKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cyAmJiBwYXJzZUludCh0aGlzLl9jb2x1bW5XaWR0aCwgMTApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uV2lkdGhDb21iaW5lZCA9IHBhcnNlSW50KHRoaXMuX2NvbHVtbldpZHRoLCAxMCkgKiAoY29sdW1uLmNvbEVuZCA/IGNvbHVtbi5jb2xFbmQgLSBjb2x1bW4uY29sU3RhcnQgOiAxKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gY29sdW1uV2lkdGhDb21iaW5lZCArICdweCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEQuSy4gTWFyY2ggMjl0aCwgMjAyMSAjOTE0NSBDb25zaWRlciBtaW4vbWF4IHdpZHRoIHdoZW4gc2V0dGluZyBkZWZhdWx0V2lkdGggcHJvcGVydHlcbiAgICAgICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gdGhpcy5nZXRFeHRyZW11bUJhc2VkQ29sV2lkdGgoY29sdW1uKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4ucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZWRXaWR0aHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEV4dHJlbXVtQmFzZWRDb2xXaWR0aChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuX2NvbHVtbldpZHRoO1xuICAgICAgICBpZiAod2lkdGggJiYgdHlwZW9mIHdpZHRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgd2lkdGggPSBTdHJpbmcod2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbldpZHRoID0gd2lkdGguaW5kZXhPZignJScpID09PSAtMSA/IGNvbHVtbi5taW5XaWR0aFB4IDogY29sdW1uLm1pbldpZHRoUGVyY2VudDtcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSB3aWR0aC5pbmRleE9mKCclJykgPT09IC0xID8gY29sdW1uLm1heFdpZHRoUHggOiBjb2x1bW4ubWF4V2lkdGhQZXJjZW50O1xuICAgICAgICBpZiAoY29sdW1uLmhpZGRlbikge1xuICAgICAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pbldpZHRoID4gcGFyc2VGbG9hdCh3aWR0aCkpIHtcbiAgICAgICAgICAgIHdpZHRoID0gU3RyaW5nKGNvbHVtbi5taW5XaWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAobWF4V2lkdGggPCBwYXJzZUZsb2F0KHdpZHRoKSkge1xuICAgICAgICAgICAgd2lkdGggPSBTdHJpbmcoY29sdW1uLm1heFdpZHRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIG5vIHB4IG9yICUgYXJlIGRlZmluZWQgaW4gbWF4V2lkdGgvbWluV2lkdGggY29uc2lkZXIgaXQgcHhcbiAgICAgICAgaWYgKHdpZHRoLmluZGV4T2YoJyUnKSA9PT0gLTEgJiYgd2lkdGguaW5kZXhPZigncHgnKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHdpZHRoICs9ICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNldE5vdGlmeUNoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RSZXBhaW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVPdXRsZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyT3V0bGV0RGlyZWN0aXZlID8gdGhpcy5fdXNlck91dGxldERpcmVjdGl2ZSA6IHRoaXMuX291dGxldERpcmVjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGNvbHVtbnMgaW4gdGhlIG1haW4gY29sdW1uTGlzdCBhbmQgX2NvbHVtbnMgY29sbGVjdGlvbnMuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tb3ZlQ29sdW1ucyhmcm9tOiBJZ3hDb2x1bW5Db21wb25lbnQsIHRvOiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvczogRHJvcFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhmcm9tLCB0bywgcG9zLCBsaXN0KTtcbiAgICAgICAgY29uc3QgbmV3TGlzdCA9IHRoaXMuX3Jlc2V0Q29sdW1uTGlzdChsaXN0KTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KG5ld0xpc3QpO1xuICAgICAgICB0aGlzLmNvbHVtbkxpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Jlc2V0Q29sdW1uTGlzdChsaXN0Pykge1xuICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgIGxpc3QgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdMaXN0ID0gW107XG4gICAgICAgIGxpc3QuZmlsdGVyKGMgPT4gYy5sZXZlbCA9PT0gMCkuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIG5ld0xpc3QucHVzaChwKTtcbiAgICAgICAgICAgIGlmIChwLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgbmV3TGlzdCA9IG5ld0xpc3QuY29uY2F0KHAuYWxsQ2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0xpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVvcmRlcnMgY29sdW1ucyBpbnNpZGUgdGhlIHBhc3NlZCBjb2x1bW4gY29sbGVjdGlvbi5cbiAgICAgKiBXaGVuIHJlb3JkZXJpbmcgY29sdW1uIGdyb3VwIGNvbGxlY3Rpb24sIHRoZSBjb2xsZWN0aW9uIGlzIG5vdCBmbGF0dGVuZWQuXG4gICAgICogSW4gYWxsIG90aGVyIGNhc2VzLCB0aGUgY29sdW1ucyBjb2xsZWN0aW9uIGlzIGZsYXR0ZW5lZCwgdGhpcyBpcyB3aHkgYWRpdHRpb25hbCBjYWxjdWxhdGlvbnMgb24gdGhlIGRyb3BJbmRleCBhcmUgZG9uZS5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Jlb3JkZXJDb2x1bW5zKGZyb206IElneENvbHVtbkNvbXBvbmVudCwgdG86IElneENvbHVtbkNvbXBvbmVudCwgcG9zaXRpb246IERyb3BQb3NpdGlvbiwgY29sdW1uQ29sbGVjdGlvbjogYW55W10sXG4gICAgICAgIGluR3JvdXAgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBmcm9tSW5kZXggPSBjb2x1bW5Db2xsZWN0aW9uLmluZGV4T2YoZnJvbSk7XG4gICAgICAgIGNvbnN0IGNoaWxkQ29sdW1uc0NvdW50ID0gaW5Hcm91cCA/IDEgOiBmcm9tLmFsbENoaWxkcmVuLmxlbmd0aCArIDE7XG4gICAgICAgIGNvbHVtbkNvbGxlY3Rpb24uc3BsaWNlKGZyb21JbmRleCwgY2hpbGRDb2x1bW5zQ291bnQpO1xuICAgICAgICBsZXQgZHJvcEluZGV4ID0gY29sdW1uQ29sbGVjdGlvbi5pbmRleE9mKHRvKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0KSB7XG4gICAgICAgICAgICBkcm9wSW5kZXgrKztcbiAgICAgICAgICAgIGlmICghaW5Hcm91cCAmJiB0by5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgIGRyb3BJbmRleCArPSB0by5hbGxDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1uQ29sbGVjdGlvbi5zcGxpY2UoZHJvcEluZGV4LCAwLCBmcm9tKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGNvbHVtbiBncm91cCBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbW92ZUNoaWxkQ29sdW1ucyhwYXJlbnQ6IElneENvbHVtbkNvbXBvbmVudCwgZnJvbTogSWd4Q29sdW1uQ29tcG9uZW50LCB0bzogSWd4Q29sdW1uQ29tcG9uZW50LCBwb3M6IERyb3BQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBwYXJlbnQuY2hpbGRyZW4udG9BcnJheSgpO1xuICAgICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhmcm9tLCB0bywgcG9zLCBidWZmZXIsIHRydWUpO1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucmVzZXQoYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0dXBDb2x1bW5zKCkge1xuICAgICAgICBpZiAodGhpcy5hdXRvR2VuZXJhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2dlbmVyYXRlQ29sdW1ucygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QsIChjb2w6IElneENvbHVtbkNvbXBvbmVudCkgPT4gdGhpcy5jb2x1bW5Jbml0LmVtaXQoY29sKSk7XG4gICAgICAgIHRoaXMuY29sdW1uTGlzdERpZmZlci5kaWZmKHRoaXMuY29sdW1uTGlzdCk7XG5cbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LmNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29sdW1uc0NoYW5nZWQoY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVsZXRlUm93RnJvbURhdGEocm93SUQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgYSByb3cgKGluZGV4ICE9PSAwKSBkZWxldGUgaXRcbiAgICAgICAgLy8gIGlmIHRoZXJlIGlzIGEgcm93IGluIEFERCBvciBVUERBVEUgc3RhdGUgY2hhbmdlIGl0J3Mgc3RhdGUgdG8gREVMRVRFXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0geyBpZDogcm93SUQsIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUsIG5ld1ZhbHVlOiBudWxsIH07XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuYWRkKHRyYW5zYWN0aW9uLCB0aGlzLmRhdGFbaW5kZXhdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZTogU3RhdGUgPSB0aGlzLnRyYW5zYWN0aW9ucy5nZXRTdGF0ZShyb3dJRCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5hZGQoeyBpZDogcm93SUQsIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUsIG5ld1ZhbHVlOiBudWxsIH0sIHN0YXRlICYmIHN0YXRlLnJlY29yZFJlZik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldERhdGFCYXNlZEJvZHlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRhdGEgfHwgKHRoaXMuZGF0YS5sZW5ndGggPCB0aGlzLl9kZWZhdWx0VGFyZ2V0UmVjb3JkTnVtYmVyKSA/XG4gICAgICAgICAgICAwIDogdGhpcy5kZWZhdWx0VGFyZ2V0Qm9keUhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvblBpbm5lZFJvd3NDaGFuZ2VkKGNoYW5nZTogUXVlcnlMaXN0PElneEdyaWRSb3dDb21wb25lbnQ+KSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLnJvd0xpc3REaWZmZXIuZGlmZihjaGFuZ2UpO1xuICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvbkNvbHVtbnNDaGFuZ2VkKGNoYW5nZTogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4pIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMuY29sdW1uTGlzdERpZmZlci5kaWZmKGNoYW5nZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0b0dlbmVyYXRlICYmIHRoaXMuY29sdW1uTGlzdC5sZW5ndGggPT09IDAgJiYgdGhpcy5fYXV0b0dlbmVyYXRlZENvbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gSW4gSXZ5IGlmIHRoZXJlIGFyZSBuZXN0ZWQgY29uZGl0aW9uYWwgdGVtcGxhdGVzIHRoZSBjb250ZW50IGNoaWxkcmVuIGFyZSByZS1ldmFsdWF0ZWRcbiAgICAgICAgICAgIC8vIGhlbmNlIGF1dG9nZW5lcmF0ZWQgY29sdW1ucyBhcmUgY2xlYXJlZCBhbmQgbmVlZCB0byBiZSByZXNldC5cbiAgICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC5yZXNldCh0aGlzLl9hdXRvR2VuZXJhdGVkQ29scyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGRpZmYuZm9yRWFjaEFkZGVkSXRlbSgocmVjb3JkOiBJdGVyYWJsZUNoYW5nZVJlY29yZDxJZ3hDb2x1bW5Db21wb25lbnQ+KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5Jbml0LmVtaXQocmVjb3JkLml0ZW0pO1xuICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkLml0ZW0ucGlubmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMucHVzaChyZWNvcmQuaXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zLnB1c2gocmVjb3JkLml0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmluaXRDb2x1bW5zKHRoaXMuY29sdW1uTGlzdCk7XG5cbiAgICAgICAgICAgIGRpZmYuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPElneENvbHVtbkNvbXBvbmVudCB8IElneENvbHVtbkdyb3VwQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ29sdW1uR3JvdXAgPSByZWNvcmQuaXRlbSBpbnN0YW5jZW9mIElneENvbHVtbkdyb3VwQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmICghaXNDb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBHcm91cGluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWRBUEkuY2xlYXJfZ3JvdXBieShyZWNvcmQuaXRlbS5maWVsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgRmlsdGVyaW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5jbGVhcl9maWx0ZXIocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIGZpbHRlciByb3dcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uLmZpZWxkID09PSByZWNvcmQuaXRlbS5maWVsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdSb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIFNvcnRpbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmNsZWFyX3NvcnQocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBjb2x1bW4gc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChbcmVjb3JkLml0ZW0uZmllbGRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuXG4gICAgICAgICAgICBpZiAoYWRkZWQgfHwgcmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYG9uQ29sdW1uc0NoYW5nZWRgIGNhbiBiZSBleGVjdXRlZCBtaWR3YXkgYSBjdXJyZW50IGRldGVjdENoYW5nZSBjeWNsZSBhbmQgbWFya0ZvckNoZWNrIHdpbGwgYmUgaWdub3JlZCB0aGVuLlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSB3aWxsIHdhaXQgZm9yIHRoZSBjdXJyZW50IGN5Y2xlIHRvIGVuZCBzbyB3ZSBjYW4gdHJpZ2dlciBhIG5ldyBvbmUgYW5kIG5nRG9DaGVjayB0byBmaXJlLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZUdyaWRTaXplcyhyZWNhbGNGZWF0dXJlV2lkdGggPSB0cnVlKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPOiAoUi5LLikgVGhpcyBsYXllcmVkIGxhc2FnbmUgc2hvdWxkIGJlIHJlZmFjdG9yZWRcbiAgICAgICAgICAgIEFTQVAuIFRoZSByZWFzb24gSSBoYXZlIHRvIHJlc2V0IHRoZSBjYWNoZXMgc28gbWFueSB0aW1lcyBpcyBiZWNhdXNlXG4gICAgICAgICAgICBhZnRlciB0ZWFjaCBgZGV0ZWN0Q2hhbmdlc2AgY2FsbCB0aGV5IGFyZSBmaWxsZWQgd2l0aCBpbnZhbGlkXG4gICAgICAgICAgICBzdGF0ZS4gT2YgY291cnNlIGFsbCBvZiB0aGlzIGhhcHBlbnMgbWlkd2F5IHRocm91Z2ggdGhlIGdyaWRcbiAgICAgICAgICAgIHNpemluZyBwcm9jZXNzIHdoaWNoIG9mIGNvdXJzZSwgdXNlcyB2YWx1ZXMgZnJvbSB0aGUgY2FjaGVzLCB0aHVzIHJlc3VsdGluZ1xuICAgICAgICAgICAgaW4gYSBicm9rZW4gbGF5b3V0LlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgY29uc3QgaGFzU2Nyb2xsID0gdGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRXaWR0aCgpO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkSGVpZ2h0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMucm93RWRpdGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVwb3NpdGlvblJvd0VkaXRpbmdPdmVybGF5KHRoaXMuY3J1ZFNlcnZpY2Uucm93SW5FZGl0TW9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdSb3cucmVzZXRDaGlwc0FyZWEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgLy8gaW4gY2FzZSBzY3JvbGxiYXIgaGFzIGFwcGVhcmVkIHJlY2FsYyB0byBzaXplIGNvcnJlY3RseS5cbiAgICAgICAgaWYgKGhhc1Njcm9sbCAhPT0gdGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRXaWR0aCgpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnpvbmUuaXNTdGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5V2lkdGhIb3N0QmluZGluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlXaWR0aEhvc3RCaW5kaW5nKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjR3JpZEhlYWRSb3coKSB7XG4gICAgICAgIGlmICh0aGlzLm1heExldmVsSGVhZGVyRGVwdGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2VGb250U2l6ZSA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpO1xuICAgICAgICAgICAgbGV0IG1pblNpemUgPSAodGhpcy5tYXhMZXZlbEhlYWRlckRlcHRoICsgMSkgKiB0aGlzLmRlZmF1bHRSb3dIZWlnaHQgLyB0aGlzLl9iYXNlRm9udFNpemU7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWxsb3dGaWx0ZXJpbmcgJiYgdGhpcy5fZmlsdGVyTW9kZSA9PT0gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcikge1xuICAgICAgICAgICAgICAgIG1pblNpemUgKz0gKEZJTFRFUl9ST1dfSEVJR0hUICsgMSkgLyB0aGlzLl9iYXNlRm9udFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQuc3R5bGUubWluSGVpZ2h0ID0gYCR7bWluU2l6ZX1yZW1gO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFNldHMgVEJPRFkgaGVpZ2h0IGkuZS4gdGhpcy5jYWxjSGVpZ2h0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZUdyaWRIZWlnaHQoKSB7XG4gICAgICAgIHRoaXMuY2FsY0dyaWRIZWFkUm93KCk7XG4gICAgICAgIHRoaXMuc3VtbWFyaWVzSGVpZ2h0ID0gMDtcbiAgICAgICAgaWYgKHRoaXMuaGFzU3VtbWFyaXplZENvbHVtbnMgJiYgdGhpcy5yb290U3VtbWFyaWVzRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJpZXNIZWlnaHQgPSB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNhbGNNYXhTdW1tYXJ5SGVpZ2h0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGNIZWlnaHQgPSB0aGlzLl9jYWxjdWxhdGVHcmlkQm9keUhlaWdodCgpO1xuICAgICAgICBpZiAodGhpcy5waW5uZWRSb3dIZWlnaHQgJiYgdGhpcy5jYWxjSGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmNhbGNIZWlnaHQgLT0gdGhpcy5waW5uZWRSb3dIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEdyb3VwQXJlYUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldENvbXB1dGVkSGVpZ2h0KGVsZW0pIHtcbiAgICAgICAgcmV0dXJuIGVsZW0ub2Zmc2V0SGVpZ2h0ID8gcGFyc2VGbG9hdCh0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JykpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRGb290ZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VtbWFyaWVzSGVpZ2h0IHx8IHRoaXMuZ2V0Q29tcHV0ZWRIZWlnaHQodGhpcy50Zm9vdC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRUaGVhZFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMudGhlYWRSb3cubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHJldHVybiAoIXRoaXMuYWxsb3dGaWx0ZXJpbmcgfHwgKHRoaXMuYWxsb3dGaWx0ZXJpbmcgJiYgdGhpcy5maWx0ZXJNb2RlICE9PSBGaWx0ZXJNb2RlLnF1aWNrRmlsdGVyKSkgP1xuICAgICAgICAgICAgaGVpZ2h0IC0gdGhpcy5nZXRGaWx0ZXJDZWxsSGVpZ2h0KCkgOlxuICAgICAgICAgICAgaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0VG9vbGJhckhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgdG9vbGJhckhlaWdodCA9IDA7XG4gICAgICAgIGlmICh0aGlzLnRvb2xiYXIuZmlyc3QpIHtcbiAgICAgICAgICAgIHRvb2xiYXJIZWlnaHQgPSB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMudG9vbGJhci5maXJzdC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9vbGJhckhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFBhZ2luZ0Zvb3RlckhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgcGFnaW5nSGVpZ2h0ID0gMDtcbiAgICAgICAgaWYgKHRoaXMuZm9vdGVyKSB7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMuZm9vdGVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgcGFnaW5nSGVpZ2h0ID0gdGhpcy5mb290ZXIubmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCA/XG4gICAgICAgICAgICAgICAgaGVpZ2h0IDogMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnaW5nSGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RmlsdGVyQ2VsbEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBoZWFkZXJHcm91cE5hdGl2ZUVsID0gKHRoaXMuaGVhZGVyR3JvdXBzTGlzdC5sZW5ndGggIT09IDApID9cbiAgICAgICAgICAgIHRoaXMuaGVhZGVyR3JvdXBzTGlzdFswXS5uYXRpdmVFbGVtZW50IDogbnVsbDtcbiAgICAgICAgY29uc3QgZmlsdGVyQ2VsbE5hdGl2ZUVsID0gKGhlYWRlckdyb3VwTmF0aXZlRWwpID9cbiAgICAgICAgICAgIGhlYWRlckdyb3VwTmF0aXZlRWwucXVlcnlTZWxlY3RvcignaWd4LWdyaWQtZmlsdGVyaW5nLWNlbGwnKSBhcyBIVE1MRWxlbWVudCA6IG51bGw7XG4gICAgICAgIHJldHVybiAoZmlsdGVyQ2VsbE5hdGl2ZUVsKSA/IGZpbHRlckNlbGxOYXRpdmVFbC5vZmZzZXRIZWlnaHQgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NhbGN1bGF0ZUdyaWRCb2R5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5faGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3R1YWxUaGVhZFJvdyA9IHRoaXMuZ2V0VGhlYWRSb3dIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgZm9vdGVySGVpZ2h0ID0gdGhpcy5nZXRGb290ZXJIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgdG9vbGJhckhlaWdodCA9IHRoaXMuZ2V0VG9vbGJhckhlaWdodCgpO1xuICAgICAgICBjb25zdCBwYWdpbmdIZWlnaHQgPSB0aGlzLmdldFBhZ2luZ0Zvb3RlckhlaWdodCgpO1xuICAgICAgICBjb25zdCBncm91cEFyZWFIZWlnaHQgPSB0aGlzLmdldEdyb3VwQXJlYUhlaWdodCgpO1xuICAgICAgICBjb25zdCBzY3JIZWlnaHQgPSB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMuc2NyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBjb25zdCByZW5kZXJlZEhlaWdodCA9IHRvb2xiYXJIZWlnaHQgKyBhY3R1YWxUaGVhZFJvdyArXG4gICAgICAgICAgICBmb290ZXJIZWlnaHQgKyBwYWdpbmdIZWlnaHQgKyBncm91cEFyZWFIZWlnaHQgK1xuICAgICAgICAgICAgc2NySGVpZ2h0O1xuXG4gICAgICAgIGxldCBncmlkSGVpZ2h0ID0gMDtcblxuICAgICAgICBpZiAodGhpcy5pc1BlcmNlbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0Jyk7XG4gICAgICAgICAgICBjb25zdCBhdXRvU2l6ZSA9IHRoaXMuX3Nob3VsZEF1dG9TaXplKHJlbmRlcmVkSGVpZ2h0KTtcbiAgICAgICAgICAgIGlmIChhdXRvU2l6ZSB8fCBjb21wdXRlZC5pbmRleE9mKCclJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRoaXMuZ2V0RGF0YUJhc2VkQm9keUhlaWdodCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBib2R5SGVpZ2h0ID4gMCA/IGJvZHlIZWlnaHQgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JpZEhlaWdodCA9IHBhcnNlRmxvYXQoY29tcHV0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ3JpZEhlaWdodCA9IHBhcnNlSW50KHRoaXMuX2hlaWdodCwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKGdyaWRIZWlnaHQgLSByZW5kZXJlZEhlaWdodCk7XG5cbiAgICAgICAgaWYgKE1hdGgucm91bmQoaGVpZ2h0KSA9PT0gMCB8fCBpc05hTihncmlkSGVpZ2h0KSkge1xuICAgICAgICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRoaXMuZGVmYXVsdFRhcmdldEJvZHlIZWlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gYm9keUhlaWdodCA+IDAgPyBib2R5SGVpZ2h0IDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja0NvbnRhaW5lclNpemVDaGFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IG9yaWdIZWlnaHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJldHVybiBvcmlnSGVpZ2h0ICE9PSBoZWlnaHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zaG91bGRBdXRvU2l6ZShyZW5kZXJlZEhlaWdodCkge1xuICAgICAgICB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgY29uc3QgcmVzID0gIXRoaXMubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50IHx8XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPT09IDAgfHxcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodCA9PT0gcmVuZGVyZWRIZWlnaHQgfHxcbiAgICAgICAgICAgIC8vIElmIGdyaWQgY2F1c2VzIHRoZSBwYXJlbnQgY29udGFpbmVyIHRvIGV4dGVuZCAoZm9yIGV4YW1wbGUgd2hlbiBjb250YWluZXIgaXMgZmxleClcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhbHdheXMgYXV0by1zaXplIHNpbmNlIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29udGFpbmVyIHdpbGwgY29udGludW91c2x5IGNoYW5nZSBhcyB0aGUgZ3JpZCByZW5kZXJzIGVsZW1lbnRzLlxuICAgICAgICAgICAgdGhpcy5jaGVja0NvbnRhaW5lclNpemVDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0cyBjYWxjdWxhdGVkIHdpZHRoIG9mIHRoZSB1bnBpbm5lZCBhcmVhXG4gICAgICogQHBhcmFtIHRha2VIaWRkZW4gSWYgd2Ugc2hvdWxkIHRha2UgaW50byBhY2NvdW50IHRoZSBoaWRkZW4gY29sdW1ucyBpbiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFVucGlubmVkV2lkdGgodGFrZUhpZGRlbiA9IGZhbHNlKSB7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuaXNQZXJjZW50V2lkdGggP1xuICAgICAgICAgICAgdGhpcy5jYWxjV2lkdGggOlxuICAgICAgICAgICAgcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIHx8IHBhcnNlSW50KHRoaXMuaG9zdFdpZHRoLCAxMCkgfHwgdGhpcy5jYWxjV2lkdGg7XG4gICAgICAgIGlmICh0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkgJiYgIXRoaXMuaXNQZXJjZW50V2lkdGgpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMuc2Nyb2xsU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNQaW5uaW5nVG9TdGFydCkge1xuICAgICAgICAgICAgd2lkdGggLT0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2lkdGggLSB0aGlzLmdldFBpbm5lZFdpZHRoKHRha2VIaWRkZW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3N1bW1hcmllcyhmaWVsZE5hbWU6IHN0cmluZywgaGFzU3VtbWFyeTogYm9vbGVhbiwgc3VtbWFyeU9wZXJhbmQ/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkQVBJLmdldF9jb2x1bW5fYnlfbmFtZShmaWVsZE5hbWUpO1xuICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICBjb2x1bW4uaGFzU3VtbWFyeSA9IGhhc1N1bW1hcnk7XG4gICAgICAgICAgICBpZiAoc3VtbWFyeU9wZXJhbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290U3VtbWFyaWVzRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnJldHJpZ2dlclJvb3RQaXBlKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbHVtbi5zdW1tYXJpZXMgPSBzdW1tYXJ5T3BlcmFuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX211bHRpcGxlU3VtbWFyaWVzKGV4cHJlc3Npb25zOiBJU3VtbWFyeUV4cHJlc3Npb25bXSwgaGFzU3VtbWFyeTogYm9vbGVhbikge1xuICAgICAgICBleHByZXNzaW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdW1tYXJpZXMoZWxlbWVudC5maWVsZE5hbWUsIGhhc1N1bW1hcnksIGVsZW1lbnQuY3VzdG9tU3VtbWFyeSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kaXNhYmxlTXVsdGlwbGVTdW1tYXJpZXMoZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgZXhwcmVzc2lvbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gY29sdW1uICYmIGNvbHVtbi5maWVsZE5hbWUgPyBjb2x1bW4uZmllbGROYW1lIDogY29sdW1uO1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKGNvbHVtbk5hbWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZXNvbHZlRGF0YVR5cGVzKHJlYykge1xuICAgICAgICBpZiAodHlwZW9mIHJlYyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWMgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWMgPT09ICdvYmplY3QnICYmIHJlYyBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gR3JpZENvbHVtbkRhdGFUeXBlLlN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGF1dG9nZW5lcmF0ZUNvbHVtbnMoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0X2RhdGEoKTtcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5nZW5lcmF0ZURhdGFGaWVsZHMoZGF0YSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcblxuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IGZhY3RvcnkuY3JlYXRlKHRoaXMudmlld1JlZi5pbmplY3Rvcik7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZmllbGQgPSBmaWVsZDtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5kYXRhVHlwZSA9IHRoaXMucmVzb2x2ZURhdGFUeXBlcyhkYXRhWzBdW2ZpZWxkXSk7XG4gICAgICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKHJlZi5pbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9hdXRvR2VuZXJhdGVkQ29scyA9IGNvbHVtbnM7XG5cbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KGNvbHVtbnMpO1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkR2VuZXJhdGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZURhdGFGaWVsZHMoZGF0YTogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhkYXRhICYmIGRhdGEubGVuZ3RoICE9PSAwID8gZGF0YVswXSA6IFtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRDb2x1bW5zKGNvbGxlY3Rpb246IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+LCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uR3JvdXBzID0gdGhpcy5jb2x1bW5MaXN0LnNvbWUoY29sID0+IGNvbC5jb2x1bW5Hcm91cCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIC8vIFNldCBvdmVyYWxsIHJvdyBsYXlvdXQgc2l6ZVxuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2wuY29sdW1uTGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dFNpemUgPSBjb2wuY2hpbGRyZW4gP1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLnJlZHVjZSgoYWNjLCB2YWwpID0+IE1hdGgubWF4KHZhbC5yb3dTdGFydCArIHZhbC5ncmlkUm93U3BhbiAtIDEsIGFjYyksIDEpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZSA9IE1hdGgubWF4KGxheW91dFNpemUsIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cyAmJiB0aGlzLmhhc0NvbHVtbkdyb3Vwcykge1xuICAgICAgICAgICAgLy8gaW52YWxpZCBjb25maWd1cmF0aW9uIC0gbXVsdGktcm93IGFuZCBjb2x1bW4gZ3JvdXBzXG4gICAgICAgICAgICAvLyByZW1vdmUgY29sdW1uIGdyb3Vwc1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTGF5b3V0Q29sdW1ucyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoKGNvbCkgPT4gY29sLmNvbHVtbkxheW91dCB8fCBjb2wuY29sdW1uTGF5b3V0Q2hpbGQpO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnJlc2V0KGNvbHVtbkxheW91dENvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPSBudWxsO1xuICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgY29sdW1uLmRlZmF1bHRXaWR0aCA9IHRoaXMuY29sdW1uV2lkdGhTZXRCeVVzZXIgPyB0aGlzLl9jb2x1bW5XaWR0aCA6IGNvbHVtbi5kZWZhdWx0V2lkdGggPyBjb2x1bW4uZGVmYXVsdFdpZHRoIDogJyc7XG5cbiAgICAgICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgICAgIGNiKGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVpbml0UGluU3RhdGVzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbHVtbi5wb3B1bGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVpbml0UGluU3RhdGVzKCkge1xuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0XG4gICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnBpbm5lZCkuc29ydCgoYSwgYikgPT4gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKGEpIC0gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKGIpKTtcbiAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zID0gdGhpcy5oYXNDb2x1bW5Hcm91cHMgPyB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChjKSA9PiAhYy5waW5uZWQpIDpcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoKGMpID0+ICFjLnBpbm5lZClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RGF0YUZyb21TZWxlY3Rpb24oc291cmNlOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UsIGNvbHVtbkRhdGE/OiBhbnlbXSk6IGFueVtdIHtcbiAgICAgICAgbGV0IGNvbHVtbnNBcnJheTogSWd4Q29sdW1uQ29tcG9uZW50W107XG4gICAgICAgIGxldCByZWNvcmQgPSB7fTtcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0YSA9IFtdO1xuICAgICAgICBsZXQga2V5cyA9IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25Db2xsZWN0aW9uID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBrZXlzQW5kRGF0YSA9IFtdO1xuICAgICAgICBjb25zdCBhY3RpdmVFbCA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaWd4LWhpZXJhcmNoaWNhbC1ncmlkJykge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5zaW9uUm93SW5kZXhlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5leHBhbnNpb25TdGF0ZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvblJvd0luZGV4ZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuc2lvblJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWRLZXkgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbnNpb25Sb3dJbmRleGVzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm93SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihyb3cuSUQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4ID0gTnVtYmVyKHJvdy5JRCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXggPSBOdW1iZXIocm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZEtleSA+IE51bWJlcihyb3dJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEtleS0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ29sbGVjdGlvbi5zZXQodXBkYXRlZEtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVFbCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBhbnNpb25Sb3dJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5zaW9uUm93SW5kZXhlcy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRWwucm93ID4gTnVtYmVyKHJvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVFbC5yb3ctLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9ICh0aGlzIGFzIGFueSkudG90YWxJdGVtQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3QgaXNSZW1vdGUgPSB0b3RhbEl0ZW1zICYmIHRvdGFsSXRlbXMgPiB0aGlzLmRhdGFWaWV3Lmxlbmd0aDtcbiAgICAgICAgbGV0IHNlbGVjdGlvbk1hcDtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpZ3gtaGllcmFyY2hpY2FsLWdyaWQnICYmIHNlbGVjdGlvbkNvbGxlY3Rpb24uc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcCA9IGlzUmVtb3RlID8gQXJyYXkuZnJvbShzZWxlY3Rpb25Db2xsZWN0aW9uKSA6XG4gICAgICAgICAgICAgICAgQXJyYXkuZnJvbShzZWxlY3Rpb25Db2xsZWN0aW9uKS5maWx0ZXIoKHR1cGxlKSA9PiB0dXBsZVswXSA8IHNvdXJjZS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0aW9uTWFwID0gaXNSZW1vdGUgPyBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb24pIDpcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb24pLmZpbHRlcigodHVwbGUpID0+IHR1cGxlWzBdIDwgc291cmNlLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jZWxsU2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5zaW5nbGUgJiYgYWN0aXZlRWwpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcC5wdXNoKFthY3RpdmVFbC5yb3csIG5ldyBTZXQ8bnVtYmVyPigpLmFkZChhY3RpdmVFbC5jb2x1bW4pXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jZWxsU2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lICYmIGFjdGl2ZUVsKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25NYXAucHVzaChbYWN0aXZlRWwucm93LCBuZXcgU2V0PG51bWJlcj4oKS5hZGQoYWN0aXZlRWwuY29sdW1uKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbkRhdGEpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRGF0YSA9IGNvbHVtbkRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgIGZvciAobGV0IFtyb3csIHNldF0gb2Ygc2VsZWN0aW9uTWFwKSB7XG4gICAgICAgICAgICByb3cgPSB0aGlzLnBhZ2luYXRvciAmJiAodGhpcy5wYWdpbmdNb2RlID09PSBHcmlkUGFnaW5nTW9kZS5Mb2NhbCAmJiBzb3VyY2UgPT09IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhKSA/XG4gICAgICAgICAgICAgICAgcm93ICsgKHRoaXMucGFnaW5hdG9yLnBlclBhZ2UgKiB0aGlzLnBhZ2luYXRvci5wYWdlKSA6IHJvdztcbiAgICAgICAgICAgIHJvdyA9IGlzUmVtb3RlID8gcm93IC0gdGhpcy52aXJ0dWFsaXphdGlvblN0YXRlLnN0YXJ0SW5kZXggOiByb3c7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZVtyb3ddIHx8IHNvdXJjZVtyb3ddLmRldGFpbHNEYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBBcnJheS5mcm9tKHNldCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVhY2ggb2YgdGVtcCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbnNBcnJheSA9IHRoaXMuZ2V0U2VsZWN0YWJsZUNvbHVtbnNBdChlYWNoKTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zQXJyYXkuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnMgPyBjb2wuaGVhZGVyIHx8IGNvbC5maWVsZCA6IGNvbC5maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSBzb3VyY2Vbcm93XS5naG9zdFJlY29yZCA/IHNvdXJjZVtyb3ddLnJlY29yZFJlZiA6IHNvdXJjZVtyb3ddO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXNvbHZlTmVzdGVkUGF0aChyb3dEYXRhLCBjb2wuZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBmb3JtYXR0ZXJzICYmIGNvbC5mb3JtYXR0ZXIgPyBjb2wuZm9ybWF0dGVyKHZhbHVlLCByb3dEYXRhKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY29yZFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gcmVjb3JkW2tleV0udG9TdHJpbmcoKS5jb25jYXQoJ3JlY29yZFJvdy0nICsgcm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlY29yZCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbkRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGNvbHVtbkRhdGFbMF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYzogYW55ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dOdW1iZXIgPSArYy5zcGxpdCgncmVjb3JkUm93LScpWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGMuc3BsaXQoJ3JlY29yZFJvdy0nKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZE9iaiA9IE9iamVjdC5hc3NpZ24oc2VsZWN0ZWREYXRhW3Jvd051bWJlcl0sIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGFbcm93TnVtYmVyXSA9IG1lcmdlZE9iajtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YS5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjb3JkID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGtleXNBbmREYXRhLnB1c2goc2VsZWN0ZWREYXRhKTtcbiAgICAgICAgICAgIGtleXNBbmREYXRhLnB1c2goa2V5cyk7XG4gICAgICAgICAgICByZXR1cm4ga2V5c0FuZERhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWREYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFNlbGVjdGFibGVDb2x1bW5zQXQoaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZUxheW91dENvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjb2wgPT4gY29sLmNvbHVtbkxheW91dClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS52aXNpYmxlSW5kZXggLSBiLnZpc2libGVJbmRleCk7XG4gICAgICAgICAgICBjb25zdCBjb2xMYXlvdXQgPSB2aXNpYmxlTGF5b3V0Q29sdW1uc1tpbmRleF07XG4gICAgICAgICAgICByZXR1cm4gY29sTGF5b3V0ID8gY29sTGF5b3V0LmNoaWxkcmVuLnRvQXJyYXkoKSA6IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5Hcm91cClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS52aXNpYmxlSW5kZXggLSBiLnZpc2libGVJbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gW3Zpc2libGVDb2x1bW5zW2luZGV4XV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZXh0cmFjdERhdGFGcm9tQ29sdW1uc1NlbGVjdGlvbihzb3VyY2U6IGFueVtdLCBmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSk6IGFueVtdIHtcbiAgICAgICAgbGV0IHJlY29yZCA9IHt9O1xuICAgICAgICBjb25zdCBzZWxlY3RlZERhdGEgPSBbXTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5zZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBzb3VyY2UpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBoZWFkZXJzID8gY29sLmhlYWRlciB8fCBjb2wuZmllbGQgOiBjb2wuZmllbGQ7XG4gICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBmb3JtYXR0ZXJzICYmIGNvbC5mb3JtYXR0ZXIgPyBjb2wuZm9ybWF0dGVyKGRhdGFbY29sLmZpZWxkXSwgZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgOiBkYXRhW2NvbC5maWVsZF07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlY29yZCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhLnB1c2gocmVjb3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY29yZCA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxlY3RlZERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpbml0UGlubmluZygpIHtcbiAgICAgICAgY29uc3QgcGlubmVkQ29sdW1ucyA9IFtdO1xuICAgICAgICBjb25zdCB1bnBpbm5lZENvbHVtbnMgPSBbXTtcblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRXaWR0aCgpO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgIC8vIFdoZW4gYSBjb2x1bW4gaXMgYSBncm91cCBvciBpcyBpbnNpZGUgYSBncm91cCwgcGluIGFsbCByZWxhdGVkLlxuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgIGlmIChjb2wucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgY29sLnBhcmVudC5waW5uZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgIGNvbC5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNoaWxkLnBpbm5lZCA9IHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgZXhjZWVkIHVucGlubmVkIGFyZWEgbWluIHdpZHRoIGFuZCBnZXQgcGlubmVkIGFuZCB1bnBpbm5lZCBjb2wgY29sbGVjdGlvbnMuXG4gICAgICAgIC8vIFdlIHRha2UgaW50byBhY2NvdW50IHRvcCBsZXZlbCBjb2x1bW5zICh0b3AgbGV2ZWwgZ3JvdXBzIGFuZCBub24gZ3JvdXBzKS5cbiAgICAgICAgLy8gSWYgdG9wIGxldmVsIGlzIHVucGlubmVkIHRoZSBwaW5uaW5nIGhhbmRsZXMgYWxsIGNoaWxkcmVuIHRvIGJlIHVucGlubmVkIGFzIHdlbGwuXG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuX2NvbHVtbnMpIHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4ucGlubmVkICYmICFjb2x1bW4ucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcGlubmVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi5waW5uZWQgJiYgY29sdW1uLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4udG9wTGV2ZWxQYXJlbnQucGlubmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5waW5uZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdW5waW5uZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVucGlubmVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBc3NpZ24gdGhlIGFwcGxpY2FibGUgY29sbGVjdGlvbnMuXG4gICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMgPSBwaW5uZWRDb2x1bW5zO1xuICAgICAgICB0aGlzLl91bnBpbm5lZENvbHVtbnMgPSB1bnBpbm5lZENvbHVtbnM7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2Nyb2xsVG8ocm93OiBhbnkgfCBudW1iZXIsIGNvbHVtbjogYW55IHwgbnVtYmVyLCBpbkNvbGxlY3Rpb24gPSB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSk6IHZvaWQge1xuICAgICAgICBsZXQgZGVsYXlTY3JvbGxpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IgJiYgdHlwZW9mIChyb3cpICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSBpbkNvbGxlY3Rpb24uaW5kZXhPZihyb3cpO1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGguZmxvb3Iocm93SW5kZXggLyB0aGlzLnBhZ2luYXRvci5wZXJQYWdlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yLnBhZ2UgIT09IHBhZ2UpIHtcbiAgICAgICAgICAgICAgICBkZWxheVNjcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZSA9IHBhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsYXlTY3JvbGxpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGF0YUNoYW5nZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiAocm93KSA9PT0gJ251bWJlcicgPyByb3cgOiB0aGlzLnVucGlubmVkRGF0YVZpZXcuaW5kZXhPZihyb3cpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICB0eXBlb2YgKHJvdykgPT09ICdudW1iZXInID8gcm93IDogdGhpcy51bnBpbm5lZERhdGFWaWV3LmluZGV4T2Yocm93KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjcm9sbFRvSG9yaXpvbnRhbGx5KGNvbHVtbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzY3JvbGxUb0hvcml6b250YWxseShjb2x1bW46IGFueSB8IG51bWJlcikge1xuICAgICAgICBsZXQgY29sdW1uSW5kZXggPSB0eXBlb2YgY29sdW1uID09PSAnbnVtYmVyJyA/IGNvbHVtbiA6IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbikudmlzaWJsZUluZGV4O1xuICAgICAgICBjb25zdCBzY3JvbGxSb3cgPSB0aGlzLnJvd0xpc3QuZmluZChyID0+IHIudmlydERpclJvdyk7XG4gICAgICAgIGNvbnN0IHZpcnREaXIgPSBzY3JvbGxSb3cgPyBzY3JvbGxSb3cudmlydERpclJvdyA6IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzUGlubmluZ1RvU3RhcnQgJiYgdGhpcy5waW5uZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID49IHRoaXMucGlubmVkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCAtPSB0aGlzLnBpbm5lZENvbHVtbnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHZpcnREaXIsIGNvbHVtbkluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHZpcnREaXIsIGNvbHVtbkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2Nyb2xsRGlyZWN0aXZlKGRpcmVjdGl2ZTogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT4sIGdvYWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGl2ZS5zY3JvbGxUbyhnb2FsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbHVtbldpZHRoU3VtKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBjb2xTdW0gPSAwO1xuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKHggPT4geC5jb2x1bW5MYXlvdXQpIDogdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoeCA9PiAheC5jb2x1bW5Hcm91cCk7XG4gICAgICAgIGNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgY29sU3VtICs9IHBhcnNlSW50KChpdGVtLmNhbGNXaWR0aCB8fCBpdGVtLmRlZmF1bHRXaWR0aCksIDEwKSB8fCBNSU5JTVVNX0NPTFVNTl9XSURUSDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY29sU3VtKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGNvbFN1bSArPSB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgcmV0dXJuIGNvbFN1bTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RpZnkgY2hhbmdlcywgcmVzZXQgY2FjaGUgYW5kIHBvcHVsYXRlVmlzaWJsZUluZGV4ZXMuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY29sdW1uc1Jlb3JkZXJlZChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbHRlcih4ID0+IHguY29sdW1uTGF5b3V0KS5mb3JFYWNoKHggPT4geC5wb3B1bGF0ZVZpc2libGVJbmRleGVzKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFmdGVyIHJlb3JkZXJpbmcgaXMgZG9uZSByZXNldCBjYWNoZWQgY29sdW1uIGNvbGxlY3Rpb25zLlxuICAgICAgICB0aGlzLnJlc2V0Q29sdW1uQ29sbGVjdGlvbnMoKTtcbiAgICAgICAgY29sdW1uLnJlc2V0Q2FjaGVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZERhdGFWaWV3KCkge1xuICAgICAgICB0aGlzLl9kYXRhVmlldyA9IHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgP1xuICAgICAgICAgICAgWy4uLnRoaXMucGlubmVkRGF0YVZpZXcsIC4uLnRoaXMudW5waW5uZWREYXRhVmlld10gOlxuICAgICAgICAgICAgWy4uLnRoaXMudW5waW5uZWREYXRhVmlldywgLi4udGhpcy5waW5uZWREYXRhVmlld107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXBwbHlXaWR0aEhvc3RCaW5kaW5nKCkge1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLl93aWR0aDtcbiAgICAgICAgaWYgKHdpZHRoID09PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudFdpZHRoID0gdGhpcy5jYWxjV2lkdGg7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFdpZHRoICs9IHRoaXMuc2Nyb2xsU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdpZHRoID0gY3VycmVudFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9ob3N0V2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2ZXJ0aWNhbFNjcm9sbEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5vblNjcm9sbChldmVudCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVRyYW5zaXRpb25zID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5jaHVua0xvYWQuZW1pdCh0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVJvd0VkaXRpbmdPdmVybGF5U3RhdGVPblNjcm9sbCh0aGlzLmNydWRTZXJ2aWNlLnJvd0luRWRpdE1vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNhYmxlVHJhbnNpdGlvbnMgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmhpZGVPdmVybGF5cygpO1xuICAgICAgICB0aGlzLmFjdGlvblN0cmlwPy5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGlvblN0cmlwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblN0cmlwLmNvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZ3M6IElHcmlkU2Nyb2xsRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiAndmVydGljYWwnLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBzY3JvbGxQb3NpdGlvbjogdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxQb3NpdGlvblxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdyaWRTY3JvbGwuZW1pdChhcmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhvcml6b250YWxTY3JvbGxIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBldmVudC50YXJnZXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIub25IU2Nyb2xsKHNjcm9sbExlZnQpO1xuICAgICAgICB0aGlzLl9ob3Jpem9udGFsRm9yT2ZzLmZvckVhY2godmZvciA9PiB2Zm9yLm9uSFNjcm9sbChzY3JvbGxMZWZ0KSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFZpcnREaXIuY2h1bmtMb2FkLmVtaXQodGhpcy5oZWFkZXJDb250YWluZXIuc3RhdGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaGlkZU92ZXJsYXlzKCk7XG4gICAgICAgIGNvbnN0IGFyZ3M6IElHcmlkU2Nyb2xsRXZlbnRBcmdzID0geyBkaXJlY3Rpb246ICdob3Jpem9udGFsJywgZXZlbnQsIHNjcm9sbFBvc2l0aW9uOiB0aGlzLmhlYWRlckNvbnRhaW5lci5zY3JvbGxQb3NpdGlvbiB9O1xuICAgICAgICB0aGlzLmdyaWRTY3JvbGwuZW1pdChhcmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4ID0gLTEsIGNiOiAoYXJnczogYW55KSA9PiB2b2lkID0gbnVsbCkge1xuICAgICAgICBpZiAoIWNiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvdyA9IHRoaXMuc3VtbWFyaWVzUm93TGlzdC5maWx0ZXIocyA9PiBzLmluZGV4ICE9PSAwKS5jb25jYXQodGhpcy5yb3dMaXN0LnRvQXJyYXkoKSkuZmluZChyID0+IHIuaW5kZXggPT09IHJvd0luZGV4KTtcbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgIGlmICgodGhpcyBhcyBhbnkpLnRvdGFsSXRlbUNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5kYXRhQ2hhbmdlZC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbHRlcihzID0+IHMuaW5kZXggIT09IDApLmNvbmNhdCh0aGlzLnJvd0xpc3QudG9BcnJheSgpKS5maW5kKHIgPT4gci5pbmRleCA9PT0gcm93SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYkFyZ3MgPSB0aGlzLmdldE5hdmlnYXRpb25Bcmd1bWVudHMocm93LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjYihjYkFyZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlld1tyb3dJbmRleF0uZGV0YWlsc0RhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uc2V0QWN0aXZlTm9kZSh7IHJvdzogcm93SW5kZXggfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkFyZ3VtZW50cyhyb3csIHZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGNiKGFyZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkFyZ3VtZW50cyhyb3csIHZpc2libGVDb2xJbmRleCkge1xuICAgICAgICBsZXQgdGFyZ2V0VHlwZTogR3JpZEtleWRvd25UYXJnZXRUeXBlOyBsZXQgdGFyZ2V0O1xuICAgICAgICBzd2l0Y2ggKHJvdy5uYXRpdmVFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSAnaWd4LWdyaWQtZ3JvdXBieS1yb3cnOlxuICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAnZ3JvdXBSb3cnO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHJvdztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lneC1ncmlkLXN1bW1hcnktcm93JzpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ3N1bW1hcnlDZWxsJztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB2aXNpYmxlQ29sSW5kZXggIT09IC0xID9cbiAgICAgICAgICAgICAgICAgICAgcm93LnN1bW1hcnlDZWxscy5maW5kKGMgPT4gYy52aXNpYmxlQ29sdW1uSW5kZXggPT09IHZpc2libGVDb2xJbmRleCkgOiByb3cuc3VtbWFyeUNlbGxzLmZpcnN0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaWd4LWNoaWxkLWdyaWQtcm93JzpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ2hpZXJhcmNoaWNhbFJvdyc7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcm93O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ2RhdGFDZWxsJztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB2aXNpYmxlQ29sSW5kZXggIT09IC0xID8gcm93LmNlbGxzLmZpbmQoYyA9PiBjLnZpc2libGVDb2x1bW5JbmRleCA9PT0gdmlzaWJsZUNvbEluZGV4KSA6IHJvdy5jZWxscy5maXJzdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB0YXJnZXRUeXBlLCB0YXJnZXQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5leHREYXRhUm93SW5kZXgoY3VycmVudFJvd0luZGV4LCBwcmV2aW91cyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSb3dJbmRleCA8IDAgfHwgKGN1cnJlbnRSb3dJbmRleCA9PT0gMCAmJiBwcmV2aW91cykgfHwgKGN1cnJlbnRSb3dJbmRleCA+PSB0aGlzLmRhdGFWaWV3Lmxlbmd0aCAtIDEgJiYgIXByZXZpb3VzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSb3dJbmRleDtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIG5leHQvcHJldiByZWNvcmQgdGhhdCBpcyBlZGl0YWJsZS5cbiAgICAgICAgY29uc3QgbmV4dFJvd0luZGV4ID0gcHJldmlvdXMgPyB0aGlzLmZpbmRQcmV2RWRpdGFibGVEYXRhUm93SW5kZXgoY3VycmVudFJvd0luZGV4KSA6XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3LmZpbmRJbmRleCgocmVjLCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICBpbmRleCA+IGN1cnJlbnRSb3dJbmRleCAmJiB0aGlzLmlzRWRpdGFibGVEYXRhUmVjb3JkQXRJbmRleChpbmRleCkpO1xuICAgICAgICByZXR1cm4gbmV4dFJvd0luZGV4ICE9PSAtMSA/IG5leHRSb3dJbmRleCA6IGN1cnJlbnRSb3dJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBlZGl0YWJsZSByb3cgaW5kZXggb3IgLTEgaWYgbm8gc3VjaCByb3cgaXMgZm91bmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY3VycmVudEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlZGl0YWJsZSByZWNvcmQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kUHJldkVkaXRhYmxlRGF0YVJvd0luZGV4KGN1cnJlbnRJbmRleCk6IG51bWJlciB7XG4gICAgICAgIGxldCBpID0gdGhpcy5kYXRhVmlldy5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgIGlmIChpIDwgY3VycmVudEluZGV4ICYmIHRoaXMuaXNFZGl0YWJsZURhdGFSZWNvcmRBdEluZGV4KGkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgcmVjb3JkIGF0IHRoZSBzcGVjaWZpZWQgZGF0YSB2aWV3IGluZGV4IGlzIGEgYW4gZWRpdGFibGUgZGF0YSByZWNvcmQuXG4gICAgICogSWYgcmVjb3JkIGlzIGdyb3VwIHJlYywgc3VtbWFyeSByZWMsIGNoaWxkIHJlYywgZ2hvc3QgcmVjLiBldGMuIGl0IGlzIG5vdCBlZGl0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhVmlld0luZGV4IFRoZSBpbmRleCBvZiB0aGF0IHJlY29yZCBpbiB0aGUgZGF0YSB2aWV3LlxuICAgICAqXG4gICAgICovXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIGl0IGludG8gQ1JVRFxuICAgIHByaXZhdGUgaXNFZGl0YWJsZURhdGFSZWNvcmRBdEluZGV4KGRhdGFWaWV3SW5kZXgpIHtcbiAgICAgICAgY29uc3QgcmVjID0gdGhpcy5kYXRhVmlld1tkYXRhVmlld0luZGV4XTtcbiAgICAgICAgcmV0dXJuICFyZWMuZXhwcmVzc2lvbiAmJiAhcmVjLnN1bW1hcmllcyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhICYmICFyZWMuZGV0YWlsc0RhdGEgJiZcbiAgICAgICAgICAgICF0aGlzLmlzR2hvc3RSZWNvcmRBdEluZGV4KGRhdGFWaWV3SW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIHJlY29yZCBhdCB0aGUgc3BlY2lmaWVkIGRhdGEgdmlldyBpbmRleCBpcyBhIGdob3N0LlxuICAgICAqIElmIHJlY29yZCBpcyBwaW5uZWQgYnV0IGlzIG5vdCBpbiBwaW5uZWQgYXJlYSB0aGVuIGl0IGlzIGEgZ2hvc3QgcmVjb3JkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFWaWV3SW5kZXggVGhlIGluZGV4IG9mIHRoYXQgcmVjb3JkIGluIHRoZSBkYXRhIHZpZXcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0dob3N0UmVjb3JkQXRJbmRleChkYXRhVmlld0luZGV4KSB7XG4gICAgICAgIGNvbnN0IGlzUGlubmVkID0gdGhpcy5pc1JlY29yZFBpbm5lZCh0aGlzLmRhdGFWaWV3W2RhdGFWaWV3SW5kZXhdKTtcbiAgICAgICAgY29uc3QgaXNJblBpbm5lZEFyZWEgPSB0aGlzLmlzUmVjb3JkUGlubmVkQnlWaWV3SW5kZXgoZGF0YVZpZXdJbmRleCk7XG4gICAgICAgIHJldHVybiBpc1Bpbm5lZCAmJiAhaXNJblBpbm5lZEFyZWE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkUG9zaXRpb24ocm93SW5kZXgsIGNvbEluZGV4KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmlsdGVyKHMgPT4gcy5pbmRleCAhPT0gMCkuY29uY2F0KHRoaXMucm93TGlzdC50b0FycmF5KCkpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLnZpc2libGVJbmRleCA+PSAwICYmICFjb2wuaGlkZGVuKS5sZW5ndGg7XG4gICAgICAgIGlmIChyb3dzIDwgMSB8fCBjb2xzIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3dJbmRleCA+IC0xICYmIHJvd0luZGV4IDwgdGhpcy5kYXRhVmlldy5sZW5ndGggJiZcbiAgICAgICAgICAgIGNvbEluZGV4ID4gLSAxICYmIGNvbEluZGV4IDw9IE1hdGgubWF4KC4uLnRoaXMudmlzaWJsZUNvbHVtbnMubWFwKGMgPT4gYy52aXNpYmxlSW5kZXgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZCh0ZXh0OiBzdHJpbmcsIGluY3JlbWVudDogbnVtYmVyLCBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbiwgZXhhY3RNYXRjaD86IGJvb2xlYW4sIHNjcm9sbD86IGJvb2xlYW4sIGVuZEVkaXQgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy5yb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmRFZGl0KSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCA9IGNhc2VTZW5zaXRpdmUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGV4YWN0TWF0Y2hSZXNvbHZlZCA9IGV4YWN0TWF0Y2ggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGxldCByZWJ1aWxkQ2FjaGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5zZWFyY2hUZXh0ICE9PSB0ZXh0IHx8XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUgIT09IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCB8fFxuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoICE9PSBleGFjdE1hdGNoUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8gPSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoVGV4dDogdGV4dCxcbiAgICAgICAgICAgICAgICBhY3RpdmVNYXRjaEluZGV4OiAwLFxuICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCxcbiAgICAgICAgICAgICAgICBleGFjdE1hdGNoOiBleGFjdE1hdGNoUmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgbWF0Y2hJbmZvQ2FjaGU6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZWJ1aWxkQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ICs9IGluY3JlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWJ1aWxkQ2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMucm93TGlzdC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocm93LmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5jZWxscy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmhpZ2hsaWdodFRleHQodGV4dCwgY2FzZVNlbnNpdGl2ZVJlc29sdmVkLCBleGFjdE1hdGNoUmVzb2x2ZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkTWF0Y2hDYWNoZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA+PSB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPSB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aCAtIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoSW5mbyA9IHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGVbdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4XTtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8gPSB7IC4uLnRoaXMubGFzdFNlYXJjaEluZm8gfTtcblxuICAgICAgICAgICAgaWYgKHNjcm9sbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvKG1hdGNoSW5mby5yb3csIG1hdGNoSW5mby5jb2x1bW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLnNldEFjdGl2ZUhpZ2hsaWdodCh0aGlzLmlkLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uOiBtYXRjaEluZm8uY29sdW1uLFxuICAgICAgICAgICAgICAgIHJvdzogbWF0Y2hJbmZvLnJvdyxcbiAgICAgICAgICAgICAgICBpbmRleDogbWF0Y2hJbmZvLmluZGV4LFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtYXRjaEluZm8ubWV0YWRhdGEsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5jbGVhckFjdGl2ZUhpZ2hsaWdodCh0aGlzLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYnVpbGRNYXRjaENhY2hlKCkge1xuICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlID0gW107XG5cbiAgICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZSA9IHRoaXMubGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZTtcbiAgICAgICAgY29uc3QgZXhhY3RNYXRjaCA9IHRoaXMubGFzdFNlYXJjaEluZm8uZXhhY3RNYXRjaDtcbiAgICAgICAgY29uc3Qgc2VhcmNoVGV4dCA9IGNhc2VTZW5zaXRpdmUgPyB0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQgOiB0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAgICBjb25zdCBjb2x1bW5JdGVtcyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5jb2x1bW5Hcm91cCkuc29ydCgoYzEsIGMyKSA9PiBjMS52aXNpYmxlSW5kZXggLSBjMi52aXNpYmxlSW5kZXgpO1xuICAgICAgICBkYXRhLmZvckVhY2goKGRhdGFSb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICAgICAgICBjb2x1bW5JdGVtcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlwZUFyZ3MgPSB0aGlzLmdldENvbHVtbkJ5TmFtZShjLmZpZWxkKS5waXBlQXJncztcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGMuZm9ybWF0dGVyID8gYy5mb3JtYXR0ZXIocmVzb2x2ZU5lc3RlZFBhdGgoZGF0YVJvdywgYy5maWVsZCksIGRhdGFSb3cpIDpcbiAgICAgICAgICAgICAgICAgICAgYy5kYXRhVHlwZSA9PT0gJ251bWJlcicgPyB0aGlzLmRlY2ltYWxQaXBlLnRyYW5zZm9ybShyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVBcmdzLmRpZ2l0c0luZm8sIHRoaXMubG9jYWxlKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmRhdGFUeXBlID09PSAnZGF0ZScgPyB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlQXJncy5mb3JtYXQsIHBpcGVBcmdzLnRpbWV6b25lLCB0aGlzLmxvY2FsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc29sdmVOZXN0ZWRQYXRoKGRhdGFSb3csIGMuZmllbGQpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIGMuc2VhcmNoYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VhcmNoVmFsdWUgPSBjYXNlU2Vuc2l0aXZlID8gU3RyaW5nKHZhbHVlKSA6IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhhY3RNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaFZhbHVlID09PSBzZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnNldCgncGlubmVkJywgdGhpcy5pc1JlY29yZFBpbm5lZEJ5SW5kZXgocm93SW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IGRhdGFSb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogYy5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VyZW5jZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hJbmRleCA9IHNlYXJjaFZhbHVlLmluZGV4T2Yoc2VhcmNoVGV4dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzZWFyY2hJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KCdwaW5uZWQnLCB0aGlzLmlzUmVjb3JkUGlubmVkQnlJbmRleChyb3dJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZGF0YVJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogb2NjdXJlbmNlSW5kZXgrKyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlLnN1YnN0cmluZyhzZWFyY2hJbmRleCArIHNlYXJjaFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmRleCA9IHNlYXJjaFZhbHVlLmluZGV4T2Yoc2VhcmNoVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogQWJvdXQgdG8gTW92ZSB0byBDUlVEXG4gICAgcHJpdmF0ZSBjb25maWd1cmVSb3dFZGl0aW5nT3ZlcmxheShyb3dJRDogYW55LCB1c2VPdXRlciA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBzZXR0aW5ncyA9IHRoaXMucm93RWRpdFNldHRpbmdzO1xuICAgICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5nZXRPdmVybGF5QnlJZCh0aGlzLnJvd0VkaXRpbmdPdmVybGF5Lm92ZXJsYXlJZCk7XG4gICAgICAgIGlmIChvdmVybGF5KSB7XG4gICAgICAgICAgICBzZXR0aW5ncyA9IG92ZXJsYXkuc2V0dGluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGluZ3Mub3V0bGV0ID0gdXNlT3V0ZXIgPyB0aGlzLnBhcmVudFJvd091dGxldERpcmVjdGl2ZSA6IHRoaXMucm93T3V0bGV0RGlyZWN0aXZlO1xuICAgICAgICB0aGlzLnJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5LnNldHRpbmdzLmNvbnRhaW5lciA9IHRoaXMudGJvZHkubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgcGlubmVkID0gdGhpcy5fcGlubmVkUmVjb3JkSURzLmluZGV4T2Yocm93SUQpICE9PSAtMTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Um93ID0gIXBpbm5lZCA/IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2tleShyb3dJRCkgOiB0aGlzLnBpbm5lZFJvd3MuZmluZCh4ID0+IHgucm93SUQgPT09IHJvd0lEKTtcbiAgICAgICAgaWYgKCF0YXJnZXRSb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy50YXJnZXQgPSB0YXJnZXRSb3cuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnRvZ2dsZVJvd0VkaXRpbmdPdmVybGF5KHRydWUpO1xuICAgIH1cbn1cbiJdfQ==
6517
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9ncmlkLWJhc2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZJLE9BQU8sRUFHSCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFFTCxlQUFlLEVBQ2YsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxRQUFRLEVBRVIsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxF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ZDtBQXVrQkQ7SUFGQyxZQUFZLEVBQUU7OERBSWQ7QUE4UkQ7SUFGQyxZQUFZLEVBQUU7eURBSWQ7QUFtQkQ7SUFGQyxZQUFZLEVBQUU7d0RBSWQ7QUFtQkQ7SUFGQyxZQUFZLEVBQUU7MkRBSWQ7QUF3bUZEO0lBRkMsWUFBWSxFQUFFOzREQUlkIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQsIERhdGVQaXBlLCBEZWNpbWFsUGlwZSwgZ2V0TG9jYWxlTnVtYmVyRm9ybWF0LCBOdW1iZXJGb3JtYXRTdHlsZSwgQ3VycmVuY3lQaXBlLCBQZXJjZW50UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgSXRlcmFibGVDaGFuZ2VSZWNvcmQsXG4gICAgSXRlcmFibGVEaWZmZXJzLFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIE9wdGlvbmFsLFxuICAgIERvQ2hlY2ssXG4gICAgRGlyZWN0aXZlLFxuICAgIExPQ0FMRV9JRCxcbiAgICBIb3N0TGlzdGVuZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyByZXNpemVPYnNlcnZhYmxlIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgJ2lnbml0ZXVpLXRyaWFsLXdhdGVybWFyayc7XG5pbXBvcnQgeyBTdWJqZWN0LCBwaXBlLCBmcm9tRXZlbnQsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBmaXJzdCwgZmlsdGVyLCB0aHJvdHRsZVRpbWUsIG1hcCwgc2hhcmVSZXBsYXksIHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lQXJyYXksIG1lcmdlT2JqZWN0cywgY29tcGFyZU1hcHMsIHJlc29sdmVOZXN0ZWRQYXRoLCBpc09iamVjdCwgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IEZpbHRlcmluZ0xvZ2ljLCBJRmlsdGVyaW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwQnlSZWNvcmQgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1yZWNvcmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElTb3J0aW5nRXhwcmVzc2lvbiwgU29ydGluZ0RpcmVjdGlvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9zb3J0aW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncywgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90ZXh0LWhpZ2hsaWdodC90ZXh0LWhpZ2hsaWdodC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgICBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LFxuICAgIEhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgVmVydGljYWxBbGlnbm1lbnQsXG4gICAgSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgT3ZlcmxheVNldHRpbmdzLFxuICAgIFBvc2l0aW9uU2V0dGluZ3MsXG4gICAgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSxcbiAgICBDb250YWluZXJQb3NpdGlvblN0cmF0ZWd5LFxuICAgIFN0YXRlVXBkYXRlRXZlbnQsXG4gICAgVHJhbnNhY3Rpb25FdmVudE9yaWdpbixcbiAgICBBY3Rpb24sXG59IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgR3JpZEJhc2VBUElTZXJ2aWNlIH0gZnJvbSAnLi9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJU3VtbWFyeUV4cHJlc3Npb24gfSBmcm9tICcuL3N1bW1hcmllcy9ncmlkLXN1bW1hcnknO1xuaW1wb3J0IHsgUm93RWRpdFBvc2l0aW9uU3RyYXRlZ3ksIElQaW5uaW5nQ29uZmlnIH0gZnJvbSAnLi9ncmlkLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hHcmlkVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vdG9vbGJhci9ncmlkLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IElneFJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vcm93LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBJZ3hUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gICAgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVUeXBlXG59IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nT3BlcmF0aW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uVHlwZSwgVHJhbnNhY3Rpb25TZXJ2aWNlLCBTdGF0ZSB9IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHtcbiAgICBJZ3hSb3dBZGRUZXh0RGlyZWN0aXZlLFxuICAgIElneFJvd0VkaXRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGV4dERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZVxufSBmcm9tICcuL2dyaWQucm93RWRpdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZE5hdmlnYXRpb25TZXJ2aWNlLCBJQWN0aXZlTm9kZSB9IGZyb20gJy4vZ3JpZC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSURpc3BsYXlEZW5zaXR5T3B0aW9ucywgRGlzcGxheURlbnNpdHlUb2tlbiwgRGlzcGxheURlbnNpdHlCYXNlLCBEaXNwbGF5RGVuc2l0eSB9IGZyb20gJy4uL2NvcmUvZGlzcGxheURlbnNpdHknO1xuaW1wb3J0IHsgSWd4RmlsdGVyaW5nU2VydmljZSB9IGZyb20gJy4vZmlsdGVyaW5nL2dyaWQtZmlsdGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLWNlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IFdhdGNoQ2hhbmdlcyB9IGZyb20gJy4vd2F0Y2gtY2hhbmdlcyc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlcnMvZ3JpZC1oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElHcmlkUmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL2dyaWQtcmVzb3VyY2VzJztcbmltcG9ydCB7IEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcbmltcG9ydCB7IElneEdyaWRTdW1tYXJ5U2VydmljZSB9IGZyb20gJy4vc3VtbWFyaWVzL2dyaWQtc3VtbWFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IElneFN1bW1hcnlSb3dDb21wb25lbnQgfSBmcm9tICcuL3N1bW1hcmllcy9zdW1tYXJ5LXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICBHcmlkU2VsZWN0aW9uUmFuZ2Vcbn0gZnJvbSAnLi9zZWxlY3Rpb24vc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4RWRpdFJvdywgSWd4Q2VsbCwgSWd4QWRkUm93IH0gZnJvbSAnLi9jb21tb24vY3J1ZC5zZXJ2aWNlJztcbmltcG9ydCB7IElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzLCBJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGVtcGxhdGUtb3V0bGV0L3RlbXBsYXRlX291dGxldC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4vZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2V4Y2VsLXN0eWxlLXNlYXJjaC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQgfSBmcm9tICcuL3Jlc2l6aW5nL3Jlc2l6ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENoYXJTZXBhcmF0ZWRWYWx1ZURhdGEgfSBmcm9tICcuLi9zZXJ2aWNlcy9jc3YvY2hhci1zZXBhcmF0ZWQtdmFsdWUtZGF0YSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UgfSBmcm9tICcuL3Jlc2l6aW5nL3Jlc2l6aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ1N0cmF0ZWd5IH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1zdHJhdGVneSc7XG5pbXBvcnQge1xuICAgIElneFJvd0V4cGFuZGVkSW5kaWNhdG9yRGlyZWN0aXZlLCBJZ3hSb3dDb2xsYXBzZWRJbmRpY2F0b3JEaXJlY3RpdmUsXG4gICAgSWd4SGVhZGVyRXhwYW5kSW5kaWNhdG9yRGlyZWN0aXZlLCBJZ3hIZWFkZXJDb2xsYXBzZUluZGljYXRvckRpcmVjdGl2ZSwgSWd4RXhjZWxTdHlsZUhlYWRlckljb25EaXJlY3RpdmVcbn0gZnJvbSAnLi9ncmlkL2dyaWQuZGlyZWN0aXZlcyc7XG5pbXBvcnQge1xuICAgIEdyaWRLZXlkb3duVGFyZ2V0VHlwZSxcbiAgICBHcmlkU2VsZWN0aW9uTW9kZSxcbiAgICBHcmlkU3VtbWFyeVBvc2l0aW9uLFxuICAgIEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlLFxuICAgIEZpbHRlck1vZGUsXG4gICAgQ29sdW1uUGlubmluZ1Bvc2l0aW9uLFxuICAgIFJvd1Bpbm5pbmdQb3NpdGlvbixcbiAgICBHcmlkUGFnaW5nTW9kZVxufSBmcm9tICcuL2NvbW1vbi9lbnVtcyc7XG5pbXBvcnQge1xuICAgIElHcmlkQ2VsbEV2ZW50QXJncyxcbiAgICBJUm93U2VsZWN0aW9uRXZlbnRBcmdzLFxuICAgIElQaW5Db2x1bW5FdmVudEFyZ3MsXG4gICAgSUdyaWRFZGl0RXZlbnRBcmdzLFxuICAgIElSb3dEYXRhRXZlbnRBcmdzLFxuICAgIElDb2x1bW5SZXNpemVFdmVudEFyZ3MsXG4gICAgSUNvbHVtbk1vdmluZ1N0YXJ0RXZlbnRBcmdzLFxuICAgIElDb2x1bW5Nb3ZpbmdFdmVudEFyZ3MsXG4gICAgSUNvbHVtbk1vdmluZ0VuZEV2ZW50QXJncyxcbiAgICBJR3JpZEtleWRvd25FdmVudEFyZ3MsXG4gICAgSVJvd0RyYWdTdGFydEV2ZW50QXJncyxcbiAgICBJUm93RHJhZ0VuZEV2ZW50QXJncyxcbiAgICBJR3JpZENsaXBib2FyZEV2ZW50LFxuICAgIElHcmlkVG9vbGJhckV4cG9ydEV2ZW50QXJncyxcbiAgICBJU2VhcmNoSW5mbyxcbiAgICBJQ2VsbFBvc2l0aW9uLFxuICAgIElSb3dUb2dnbGVFdmVudEFyZ3MsXG4gICAgSUNvbHVtblNlbGVjdGlvbkV2ZW50QXJncyxcbiAgICBJUGluUm93RXZlbnRBcmdzLFxuICAgIElHcmlkU2Nyb2xsRXZlbnRBcmdzLFxuICAgIElHcmlkRWRpdERvbmVFdmVudEFyZ3MsXG4gICAgSUFjdGl2ZU5vZGVDaGFuZ2VFdmVudEFyZ3MsXG4gICAgSVNvcnRpbmdFdmVudEFyZ3MsXG4gICAgSUZpbHRlcmluZ0V2ZW50QXJncyxcbiAgICBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MsXG4gICAgSUNvbHVtblZpc2liaWxpdHlDaGFuZ2luZ0V2ZW50QXJncyxcbiAgICBJUGluQ29sdW1uQ2FuY2VsbGFibGVFdmVudEFyZ3Ncbn0gZnJvbSAnLi9jb21tb24vZXZlbnRzJztcbmltcG9ydCB7IElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9maWx0ZXJpbmcvYWR2YW5jZWQtZmlsdGVyaW5nL2FkdmFuY2VkLWZpbHRlcmluZy1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IEdyaWRUeXBlIH0gZnJvbSAnLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJvcFBvc2l0aW9uIH0gZnJvbSAnLi9tb3ZpbmcvbW92aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4SGVhZFNlbGVjdG9yRGlyZWN0aXZlLCBJZ3hSb3dTZWxlY3RvckRpcmVjdGl2ZSB9IGZyb20gJy4vc2VsZWN0aW9uL3Jvdy1zZWxlY3RvcnMnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW5zL2NvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29sdW1uR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJR3JpZFNvcnRpbmdTdHJhdGVneSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9zb3J0aW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IElneFJvd0RyYWdHaG9zdERpcmVjdGl2ZSwgSWd4RHJhZ0luZGljYXRvckljb25EaXJlY3RpdmUgfSBmcm9tICcuL3Jvdy1kcmFnLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2dyaWQuZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hTbmFja2JhckNvbXBvbmVudCB9IGZyb20gJy4uL3NuYWNrYmFyL3NuYWNrYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IElneEFjdGlvblN0cmlwQ29tcG9uZW50IH0gZnJvbSAnLi4vYWN0aW9uLXN0cmlwL2FjdGlvbi1zdHJpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUm93VHlwZSB9IGZyb20gJy4vY29tbW9uL3Jvdy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4R3JpZFJvd0NvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC9ncmlkLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSVBhZ2VFdmVudEFyZ3MgfSBmcm9tICcuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLWludGVyZmFjZXMnO1xuaW1wb3J0IHsgSWd4UGFnaW5hdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vcGFnaW5hdG9yL3BhZ2luYXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudCB9IGZyb20gJy4vaGVhZGVycy9ncmlkLWhlYWRlci1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRHcm91cEJ5QXJlYUNvbXBvbmVudCB9IGZyb20gJy4vZ3JvdXBpbmcvZ3JpZC1ncm91cC1ieS1hcmVhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hGbGF0VHJhbnNhY3Rpb25GYWN0b3J5LCBUUkFOU0FDVElPTl9UWVBFIH0gZnJvbSAnLi4vc2VydmljZXMvdHJhbnNhY3Rpb24vdHJhbnNhY3Rpb24tZmFjdG9yeS5zZXJ2aWNlJztcbmltcG9ydCB7IERlZmF1bHREYXRhQ2xvbmVTdHJhdGVneSwgSURhdGFDbG9uZVN0cmF0ZWd5IH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtY2xvbmUtc3RyYXRlZ3knO1xuaW1wb3J0IHsgQ29sdW1uVHlwZSB9IGZyb20gJy4vY29tbW9uL2NvbHVtbi5pbnRlcmZhY2UnO1xuXG5sZXQgRkFLRV9ST1dfSUQgPSAtMTtcbmNvbnN0IERFRkFVTFRfSVRFTVNfUEVSX1BBR0UgPSAxNTtcbmNvbnN0IE1JTklNVU1fQ09MVU1OX1dJRFRIID0gMTM2O1xuY29uc3QgRklMVEVSX1JPV19IRUlHSFQgPSA1MDtcbi8vIEJ5IGRlZmF1bHQgcm93IGVkaXRpbmcgb3ZlcmxheSBvdXRsZXQgaXMgaW5zaWRlIGdyaWQgYm9keSBzbyB0aGF0IG92ZXJsYXkgaXMgaGlkZGVuIGJlbG93IGdyaWQgaGVhZGVyIHdoZW4gc2Nyb2xsaW5nLlxuLy8gSW4gY2FzZXMgd2hlbiBncmlkIGhhcyAxLTIgcm93cyB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UgaW4gZ3JpZCBib2R5IGFuZCByb3cgZWRpdGluZyBvdmVybGF5IHNob3VsZCBiZSBzaG93biBhYm92ZSBoZWFkZXIuXG4vLyBEZWZhdWx0IHJvdyBlZGl0aW5nIG92ZXJsYXkgaGVpZ2h0IGlzIGhpZ2hlciB0aGVuIHJvdyBoZWlnaHQgdGhhdCBpcyB3aHkgdGhlIGNhc2UgaXMgdmFsaWQgYWxzbyBmb3Igcm93IHdpdGggMiByb3dzLlxuLy8gTW9yZSBhY2N1cmF0ZSBjYWxjdWxhdGlvbiBpcyBub3QgcG9zc2libGUsIGNhdXNlIHJvdyBlZGl0aW5nIG92ZXJsYXkgaXMgc3RpbGwgbm90IHNob3duIGFuZCB3ZSBkb24ndCBrbm93IGl0cyBoZWlnaHQsXG4vLyBidXQgaW4gdGhlIHNhbWUgdGltZSB3ZSBuZWVkIHRvIHNldCByb3cgZWRpdGluZyBvdmVybGF5IG91dGxldCBiZWZvcmUgb3BlbmluZyB0aGUgb3ZlcmxheSBpdHNlbGYuXG5jb25zdCBNSU5fUk9XX0VESVRJTkdfQ09VTlRfVEhSRVNIT0xEID0gMjtcblxuZXhwb3J0IGNvbnN0IElneEdyaWRUcmFuc2FjdGlvbiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdJZ3hHcmlkVHJhbnNhY3Rpb24nKTtcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSWd4R3JpZEJhc2VEaXJlY3RpdmUgZXh0ZW5kcyBEaXNwbGF5RGVuc2l0eUJhc2UgaW1wbGVtZW50cyBHcmlkVHlwZSxcbiAgICBPbkluaXQsIERvQ2hlY2ssIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGRpc3BsYXkgdGltZSBmb3IgdGhlIHJvdyBhZGRpbmcgc25hY2tiYXIgbm90aWZpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIDYwMDBtcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzbmFja2JhckRpc3BsYXlUaW1lID0gNjAwMDtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB0aGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIFdoZW4gc2V0IHRvIHRydWUsIGl0IHdpbGwgb3ZlcnJpZGUgYWxsIGNvbHVtbnMgZGVjbGFyZWQgdGhyb3VnaCBjb2RlIG9yIGluIG1hcmt1cC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYXV0b0dlbmVyYXRlID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSBjdXN0b20gdGVtcGxhdGUgd2hlbiBlbXB0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWRdPVwiJ2lneC1ncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFtlbXB0eUdyaWRUZW1wbGF0ZV09XCJteVRlbXBsYXRlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBlbXB0eUdyaWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgYWRkaW5nIHJvdyBVSSB3aGVuIGdyaWQgaXMgZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbYWRkUm93RW1wdHlUZW1wbGF0ZV09XCJteVRlbXBsYXRlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhZGRSb3dFbXB0eVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIHRlbXBsYXRlIHdoZW4gbG9hZGluZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWRdPVwiJ2lneC1ncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFtsb2FkaW5nR3JpZFRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxvYWRpbmdHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgY29weSBiZWhhdmlvciBvZiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjbGlwYm9hcmRPcHRpb25zID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgY29weSBiZWhhdmlvclxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluY2x1ZGUgdGhlIGNvbHVtbnMgaGVhZGVycyBpbiB0aGUgY2xpcGJvYXJkIG91dHB1dC5cbiAgICAgICAgICovXG4gICAgICAgIGNvcHlIZWFkZXJzOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbHkgdGhlIGNvbHVtbnMgZm9ybWF0dGVycyAoaWYgYW55KSBvbiB0aGUgZGF0YSBpbiB0aGUgY2xpcGJvYXJkIG91dHB1dC5cbiAgICAgICAgICovXG4gICAgICAgIGNvcHlGb3JtYXR0ZXJzOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNlcGFyYXRvciB1c2VkIGZvciBmb3JtYXR0aW5nIHRoZSBjb3B5IG91dHB1dC4gRGVmYXVsdHMgdG8gYFxcdGAuXG4gICAgICAgICAqL1xuICAgICAgICBzZXBhcmF0b3I6ICdcXHQnXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUgb2YgdGhlIGNvbHVtbiBmb3Igd2hpY2ggZmlsdGVyaW5nIHdhcyBwZXJmb3JtZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgICAgIChmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UpPVwiZmlsdGVyaW5nRXhwclRyZWVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgYWR2YW5jZWQgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgIChhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSk9XCJhZHZhbmNlZEZpbHRlcmluZ0V4cHJUcmVlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBncmlkIGlzIHNjcm9sbGVkIGhvcml6b250YWxseS92ZXJ0aWNhbGx5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgICAgIChncmlkU2Nyb2xsKT1cIm9uU2Nyb2xsKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBncmlkU2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZFNjcm9sbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYCBjb21wb25lbnQgaW5zdGVhZFxuICAgICAqXG4gICAgICogRW1pdHRlZCBhZnRlciB0aGUgY3VycmVudCBwYWdlIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgb25QYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcikge1xuICAgICAqICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmAgY29tcG9uZW50IGluc3RlYWRcbiAgICAgKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBgcGVyUGFnZWAgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdyaWQgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHBlclBhZ2VDaGFuZ2UpPVwib25QZXJQYWdlQ2hhbmdlKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgb25QZXJQYWdlQ2hhbmdlKHBlclBhZ2U6IG51bWJlcikge1xuICAgICAqICAgdGhpcy5wZXJQYWdlID0gcGVyUGFnZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBlclBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjbGFzcyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4yLjAuIFdlIHN1Z2dlc3QgdXNpbmcgYHJvd0NsYXNzZXNgIHByb3BlcnR5IGluc3RlYWRcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3R5bGluZyBjbGFzc2VzIGFwcGxpZWQgdG8gYWxsIGV2ZW4gYElneEdyaWRSb3dDb21wb25lbnRgcyBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2V2ZW5Sb3dDU1NdPVwiJ2lneC1ncmlkLS1teS1ldmVuLWNsYXNzJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZXZlblJvd0NTUyA9ICdpZ3gtZ3JpZF9fdHItLWV2ZW4nO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4yLjAuIFdlIHN1Z2dlc3QgdXNpbmcgYHJvd0NsYXNzZXNgIHByb3BlcnR5IGluc3RlYWRcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3R5bGluZyBjbGFzc2VzIGFwcGxpZWQgdG8gYWxsIG9kZCBgSWd4R3JpZFJvd0NvbXBvbmVudGBzIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbZXZlblJvd0NTU109XCInaWd4LWdyaWQtLW15LW9kZC1jbGFzcydcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG9kZFJvd0NTUyA9ICdpZ3gtZ3JpZF9fdHItLW9kZCc7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgY29uZGl0aW9uYWwgY2xhc3Mgc2VsZWN0b3IgdG8gdGhlIGdyaWQncyByb3cgZWxlbWVudC5cbiAgICAgKiBBY2NlcHRzIGFuIG9iamVjdCBsaXRlcmFsLCBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyxcbiAgICAgKiB3aGVyZSB0aGUga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBDU1MgY2xhc3MgYW5kIHRoZSB2YWx1ZSBpc1xuICAgICAqIGVpdGhlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGJvb2xlYW4sIG9yIGJvb2xlYW4sIGxpa2Ugc286XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNhbGxiYWNrID0gKHJvdzogUm93VHlwZSkgPT4geyByZXR1cm4gcm93LnNlbGVjdGVkID4gNjsgfVxuICAgICAqIHJvd0NsYXNzZXMgPSB7ICdjbGFzc05hbWUnIDogdGhpcy5jYWxsYmFjayB9O1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtyb3dDbGFzc2VzXSA9IFwicm93Q2xhc3Nlc1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcm93Q2xhc3NlczogYW55O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBjb25kaXRpb25hbCBzdHlsZSBwcm9wZXJ0aWVzIG9uIHRoZSBncmlkIHJvdyBlbGVtZW50LlxuICAgICAqIEl0IGFjY2VwdHMgYW4gb2JqZWN0IGxpdGVyYWwgd2hlcmUgdGhlIGtleXMgYXJlXG4gICAgICogdGhlIHN0eWxlIHByb3BlcnRpZXMgYW5kIHRoZSB2YWx1ZSBpcyBhbiBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogc3R5bGVzID0ge1xuICAgICAqICBiYWNrZ3JvdW5kOiAneWVsbG93JyxcbiAgICAgKiAgY29sb3I6IChyb3c6IFJvd1R5cGUpID0+IHJvdy5zZWxlY3RlZCA6ICdyZWQnOiAnd2hpdGUnXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtyb3dTdHlsZXNdPVwic3R5bGVzXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3dTdHlsZXMgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwcmltYXJ5S2V5O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgdW5pcXVlIHZhbHVlcyBzdHJhdGVneSB1c2VkIGJ5IHRoZSBFeGNlbCBTdHlsZSBGaWx0ZXJpbmdcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHJvdmlkZXMgYSBjYWxsYmFjayBmb3IgbG9hZGluZyB1bmlxdWUgY29sdW1uIHZhbHVlcyBvbiBkZW1hbmQuXG4gICAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBwcm92aWRlZCwgdGhlIHVuaXF1ZSB2YWx1ZXMgaXQgZ2VuZXJhdGVzIHdpbGwgYmUgdXNlZCBieSB0aGUgRXhjZWwgU3R5bGUgRmlsdGVyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbZmlsdGVyTW9kZV09XCInZXhjZWxTdHlsZUZpbHRlcidcIiBbdW5pcXVlQ29sdW1uVmFsdWVzU3RyYXRlZ3ldPVwiY29sdW1uVmFsdWVzU3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHVuaXF1ZUNvbHVtblZhbHVlc1N0cmF0ZWd5OiAoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsXG4gICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgZG9uZTogKHZhbHVlczogYW55W10pID0+IHZvaWQpID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQsIHsgcmVhZDogSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBleGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50czogUXVlcnlMaXN0PElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50PjtcblxuICAgIHB1YmxpYyBnZXQgaGVhZGVyR3JvdXBzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdy5ncm91cHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkYXRhIGNsb25lIHN0cmF0ZWd5IG9mIHRoZSBncmlkIHdoZW4gaW4gZWRpdCBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbZGF0YUNsb25lU3RyYXRlZ3ldPVwiY3VzdG9tQ2xvbmVTdHJhdGVneVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRhdGFDbG9uZVN0cmF0ZWd5KCk6IElEYXRhQ2xvbmVTdHJhdGVneSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhQ2xvbmVTdHJhdGVneTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGRhdGFDbG9uZVN0cmF0ZWd5KHN0cmF0ZWd5OiBJRGF0YUNsb25lU3RyYXRlZ3kpIHtcbiAgICAgICAgaWYgKHN0cmF0ZWd5KSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhQ2xvbmVTdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zLmNsb25lU3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNlbGwgaXMgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKGNlbGxDbGljayk9XCJjZWxsQ2xpY2soJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY2VsbCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChzZWxlY3RlZCk9XCJvbkNlbGxTZWxlY3QoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENlbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiAgRW1pdHRlZCB3aGVuIGBJZ3hHcmlkUm93Q29tcG9uZW50YCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAocm93U2VsZWN0ZWQpPVwib25DZWxsQ2xpY2tDaGFuZ2UoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93U2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogIEVtaXR0ZWQgd2hlbiBgSWd4Q29sdW1uQ29tcG9uZW50YCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAoY29sdW1uU2VsZWN0ZWQpPVwiY29sdW1uU2VsZWN0ZWQoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uU2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgYElneENvbHVtbkNvbXBvbmVudGAgaXMgcGlubmVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBjb2x1bW4gbWF5IGJlIGNoYW5nZWQgdGhyb3VnaCB0aGUgYGluc2VydEF0SW5kZXhgIHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBjb2x1bW5QaW5uaW5nKGV2ZW50KSB7XG4gICAgICogICAgIGlmIChldmVudC5jb2x1bW4uZmllbGQgPT09IFwiTmFtZVwiKSB7XG4gICAgICogICAgICAgZXZlbnQuaW5zZXJ0QXRJbmRleCA9IDA7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblBpbiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBgSWd4Q29sdW1uQ29tcG9uZW50YCBpcyBwaW5uZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBpbmRleCB0aGF0IHRoZSBjb2x1bW4gaXMgaW5zZXJ0ZWQgYXQgbWF5IGJlIGNoYW5nZWQgdGhyb3VnaCB0aGUgYGluc2VydEF0SW5kZXhgIHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBjb2x1bW5QaW5uaW5nKGV2ZW50KSB7XG4gICAgICogICAgIGlmIChldmVudC5jb2x1bW4uZmllbGQgPT09IFwiTmFtZVwiKSB7XG4gICAgICogICAgICAgZXZlbnQuaW5zZXJ0QXRJbmRleCA9IDA7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblBpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpbkNvbHVtbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjZWxsIGVudGVycyBlZGl0IG1vZGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChjZWxsRWRpdEVudGVyKT1cImVkaXRTdGFydCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXRFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNlbGwgZXhpdHMgZWRpdCBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXRFeGl0KT1cImVkaXRFeGl0KCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdEV4aXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY2VsbCBoYXMgYmVlbiBlZGl0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEV2ZW50IGlzIGZpcmVkIGFmdGVyIGVkaXRpbmcgaXMgY29tcGxldGVkLCB3aGVuIHRoZSBjZWxsIGlzIGV4aXRpbmcgZWRpdCBtb2RlLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChjZWxsRWRpdCk9XCJlZGl0RG9uZSgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgY2VsbCBoYXMgYmVlbiBlZGl0ZWQgYW5kIGVkaXRpbmcgaGFzIGJlZW4gY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXREb25lKT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSByb3cgZW50ZXJzIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIuXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKHJvd0VkaXRFbnRlcik9XCJlZGl0U3RhcnQoJGV2ZW50KVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBleGl0aW5nIGVkaXQgbW9kZSBmb3IgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXR0ZWQgd2hlbiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiICYgYGVuZEVkaXQodHJ1ZSlgIGlzIGNhbGxlZC5cbiAgICAgKiBFbWl0dGVkIHdoZW4gY2hhbmdpbmcgcm93cyBkdXJpbmcgZWRpdCBtb2RlLCBzZWxlY3RpbmcgYW4gdW4tZWRpdGFibGUgY2VsbCBpbiB0aGUgZWRpdGVkIHJvdyxcbiAgICAgKiBwZXJmb3JtaW5nIHBhZ2luZyBvcGVyYXRpb24sIGNvbHVtbiByZXNpemluZywgcGlubmluZywgbW92aW5nIG9yIGhpdHRpbmcgYERvbmVgXG4gICAgICogYnV0dG9uIGluc2lkZSBvZiB0aGUgcm93RWRpdGluZ092ZXJsYXksIG9yIGhpdHRpbmcgdGhlIGBFbnRlcmAga2V5IHdoaWxlIGVkaXRpbmcgYSBjZWxsLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0KT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZXhpdGluZyBlZGl0IG1vZGUgZm9yIGEgcm93IGFuZCBlZGl0aW5nIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIgJiBgZW5kRWRpdCh0cnVlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyByb3dzIGR1cmluZyBlZGl0IG1vZGUsIHNlbGVjdGluZyBhbiB1bi1lZGl0YWJsZSBjZWxsIGluIHRoZSBlZGl0ZWQgcm93LFxuICAgICAqIHBlcmZvcm1pbmcgcGFnaW5nIG9wZXJhdGlvbiwgY29sdW1uIHJlc2l6aW5nLCBwaW5uaW5nLCBtb3Zpbmcgb3IgaGl0dGluZyBgRG9uZWBcbiAgICAgKiBidXR0b24gaW5zaWRlIG9mIHRoZSByb3dFZGl0aW5nT3ZlcmxheSwgb3IgaGl0dGluZyB0aGUgYEVudGVyYCBrZXkgd2hpbGUgZWRpdGluZyBhIGNlbGwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAocm93RWRpdERvbmUpPVwiZWRpdERvbmUoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcm93IGVkaXRpbmcgaXMgY2FuY2VsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXRzIHdoZW4gW3Jvd0VkaXRhYmxlXT1cInRydWVcIiAmIGBlbmRFZGl0KGZhbHNlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyBoaXR0aW5nIGBFc2NgIGtleSBkdXJpbmcgY2VsbCBlZGl0aW5nIGFuZCB3aGVuIGNsaWNrIG9uIHRoZSBgQ2FuY2VsYCBidXR0b25cbiAgICAgKiBpbiB0aGUgcm93IGVkaXRpbmcgb3ZlcmxheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0RXhpdCk9XCJlZGl0RXhpdCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbHVtbiBpcyBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgY29sdW1uIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbHVtbkluaXQpPVwiaW5pdENvbHVtbnMoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbkluaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElneENvbHVtbkNvbXBvbmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHNvcnRpbmcgZXhwcmVzc2lvbnMgYXJlIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gYElTb3J0aW5nRXZlbnRBcmdzYCBvYmplY3QuIGBzb3J0aW5nRXhwcmVzc2lvbnNgIGtleSBob2xkcyB0aGUgc29ydGluZyBleHByZXNzaW9ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKHNvcnRpbmcpPVwic29ydGluZygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc29ydGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHNvcnRpbmcgaXMgY29tcGxldGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3J0aW5nIGV4cHJlc3Npb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChzb3J0aW5nRG9uZSk9XCJzb3J0aW5nRG9uZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc29ydGluZ0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXhwcmVzc2lvbiB8IEFycmF5PElTb3J0aW5nRXhwcmVzc2lvbj4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgYXJlIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gYElGaWx0ZXJpbmdFdmVudEFyZ3NgIG9iamVjdC4gYGZpbHRlcmluZ0V4cHJlc3Npb25zYCBrZXkgaG9sZHMgdGhlIGZpbHRlcmluZyBleHByZXNzaW9ucyBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKGZpbHRlcmluZyk9XCJmaWx0ZXJpbmcoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCB0aHJvdWdoIHRoZSBVSS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUgb2YgdGhlIGNvbHVtbiBmb3Igd2hpY2ggZmlsdGVyaW5nIHdhcyBwZXJmb3JtZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChmaWx0ZXJpbmdEb25lKT1cImZpbHRlcmluZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZ0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmAgY29tcG9uZW50IGluc3RlYWRcbiAgICAgKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgcGFnaW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBhbiBvYmplY3QgY29uc2lzdGluZyBvZiB0aGUgcHJldmlvdXMgYW5kIG5leHQgcGFnZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChwYWdpbmdEb25lKT1cInBhZ2luZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBhZ2luZ0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElQYWdlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGFkZGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIGZvciB0aGUgbmV3IGBJZ3hHcmlkUm93Q29tcG9uZW50YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dBZGRlZCk9XCJyb3dBZGRlZCgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGRlbGV0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gYElSb3dEYXRhRXZlbnRBcmdzYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dEZWxldGVkKT1cInJvd0RlbGV0ZWQoJGV2ZW50KVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1taXRlZCB3aGVuIGRlbGV0aW5nIGEgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogUmV0dXJucyBhbiBgSUdyaWRFZGl0RXZlbnRBcmdzYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dEZWxldGUpPVwicm93RGVsZXRlKCRldmVudClcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtbWl0ZWQganVzdCBiZWZvcmUgdGhlIG5ld2x5IGFkZGVkIHJvdyBpcyBjb21taXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIFJldHVybnMgYW4gYElHcmlkRWRpdEV2ZW50QXJnc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAocm93QWRkKT1cInJvd0FkZCgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93QWRkID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGNvbHVtbiBpcyByZXNpemVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3QncyBvbGQgYW5kIG5ldyB3aWR0aC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbHVtblJlc2l6ZWQpPVwicmVzaXppbmcoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblJlc2l6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5SZXNpemVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjZWxsIGlzIHJpZ2h0IGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbGAgb2JqZWN0LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbnRleHRNZW51KT1cImNvbnRleHRNZW51KCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb250ZXh0TWVudSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY2VsbCBpcyBkb3VibGUgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChkb3VibGVDbGljayk9XCJkYmxDbGljaygkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZG91YmxlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2VsbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIGNvbHVtbiB2aXNpYmlsaXR5IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFyZ3M6IHsgY29sdW1uOiBhbnksIG5ld1ZhbHVlOiBib29sZWFuIH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiAoY29sdW1uVmlzaWJpbGl0eUNoYW5naW5nKT1cInZpc2liaWxpdHlDaGFuZ2luZygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uVmlzaWJpbGl0eUNoYW5naW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uVmlzaWJpbGl0eUNoYW5naW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBjb2x1bW4gdmlzaWJpbGl0eSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBcmdzOiB7IGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50LCBuZXdWYWx1ZTogYm9vbGVhbiB9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgKGNvbHVtblZpc2liaWxpdHlDaGFuZ2VkKT1cInZpc2liaWxpdHlDaGFuZ2VkKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtblZpc2liaWxpdHlDaGFuZ2VkRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNvbHVtbiBtb3Zpbmcgc3RhcnRzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBtb3ZlZCBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgKGNvbHVtbk1vdmluZ1N0YXJ0KT1cIm1vdmluZ1N0YXJ0KCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbk1vdmluZ1N0YXJ0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBkdXJpbmcgdGhlIGNvbHVtbiBtb3Zpbmcgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3RzLiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgKGNvbHVtbk1vdmluZyk9XCJtb3ZpbmcoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbk1vdmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbk1vdmluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjb2x1bW4gbW92aW5nIGVuZHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGBJZ3hDb2x1bW5Db21wb25lbnRgIG9iamVjdHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgKGNvbHVtbk1vdmluZ0VuZCk9XCJtb3ZpbmdFbmRzKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ga2V5ZG93biBpcyB0cmlnZ2VyZWQgb3ZlciBlbGVtZW50IGluc2lkZSBncmlkJ3MgYm9keS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBvbmx5IGlmIHRoZSBrZXkgY29tYmluYXRpb24gaXMgc3VwcG9ydGVkIGluIHRoZSBncmlkLlxuICAgICAqIFJldHVybiB0aGUgdGFyZ2V0IHR5cGUsIHRhcmdldCBvYmplY3QgYW5kIHRoZSBvcmlnaW5hbCBldmVudC4gVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgKGdyaWRLZXlkb3duKT1cImN1c3RvbUtleWRvd24oJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGdyaWRLZXlkb3duID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEtleWRvd25FdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gc3RhcnQgZHJhZ2dpbmcgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybiB0aGUgZHJhZ2dlZCByb3cuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RyYWdTdGFydEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBkcm9wcGluZyBhIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJuIHRoZSBkcm9wcGVkIHJvdy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RHJhZ0VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RyYWdFbmRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb3B5IG9wZXJhdGlvbiBpcyBleGVjdXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRmlyZWQgb25seSBpZiBjb3B5IGJlaGF2aW9yIGlzIGVuYWJsZWQgdGhyb3VnaCB0aGUgW2BjbGlwYm9hcmRPcHRpb25zYF17QGxpbmsgSWd4R3JpZEJhc2VEaXJlY3RpdmUjY2xpcGJvYXJkT3B0aW9uc30uXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGdyaWRDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENsaXBib2FyZEV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZXhwYW5zaW9uU3RhdGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNYXA8YW55LCBib29sZWFuPj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgZXhwYW5kZWQgc3RhdGUgb2YgYSByb3cgZ2V0cyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImVtcGxveWVlRGF0YVwiIChyb3dUb2dnbGUpPVwicm93VG9nZ2xlKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dUb2dnbGUgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dUb2dnbGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHBpbm5lZCBzdGF0ZSBvZiBhIHJvdyBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImVtcGxveWVlRGF0YVwiIChyb3dQaW5uaW5nKT1cInJvd1BpbigkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93UGlubmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcGlubmVkIHN0YXRlIG9mIGEgcm93IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZW1wbG95ZWVEYXRhXCIgKHJvd1Bpbm5lZCk9XCJyb3dQaW4oJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1Bpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtbWl0ZWQgd2hlbiB0aGUgYWN0aXZlIG5vZGUgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoYWN0aXZlTm9kZUNoYW5nZSk9XCJhY3RpdmVOb2RlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhY3RpdmVOb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJQWN0aXZlTm9kZUNoYW5nZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHNvcnRpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3J0aW5nIGV4cHJlc3Npb25zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoc29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlKT1cInNvcnRpbmdFeHByQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXhwcmVzc2lvbltdPigpO1xuXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYW4gZXhwb3J0IHByb2Nlc3MgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdG9vbGJhckV4cG9ydGluZyhldmVudDogSUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzKXtcbiAgICAgKiAgICAgY29uc3QgdG9vbGJhckV4cG9ydGluZyA9IGV2ZW50O1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdG9vbGJhckV4cG9ydGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzPigpO1xuXG4gICAgLyogRW5kIG9mIHRvb2xiYXIgcmVsYXRlZCBkZWZpbml0aW9ucyAqL1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIG1ha2luZyBhIHJhbmdlIHNlbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmFuZ2Ugc2VsZWN0aW9uIGNhbiBiZSBtYWRlIGVpdGhlciB0aHJvdWdoIGRyYWcgc2VsZWN0aW9uIG9yIHRocm91Z2gga2V5Ym9hcmQgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByYW5nZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkU2VsZWN0aW9uUmFuZ2U+KCk7XG5cbiAgICAvKiogRW1pdHRlZCBhZnRlciB0aGUgbmdBZnRlclZpZXdJbml0IGhvb2suIEF0IHRoaXMgcG9pbnQgdGhlIGdyaWQgZXhpc3RzIGluIHRoZSBET00gKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVuZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBsb2NhbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSB0aGUgZ3JpZCdzIGRhdGEgdmlldyBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YgYSBkYXRhIG9wZXJhdGlvbiwgcmViaW5kaW5nLCBldGMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChkYXRhQ2hhbmdpbmcpPSdoYW5kbGVEYXRhQ2hhbmdpbmdFdmVudCgpJz48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkYXRhQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGdyaWQncyBkYXRhIHZpZXcgaXMgY2hhbmdlZCBiZWNhdXNlIG9mIGEgZGF0YSBvcGVyYXRpb24sIHJlYmluZGluZywgZXRjLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZGF0YUNoYW5nZWQpPSdoYW5kbGVEYXRhQ2hhbmdlZEV2ZW50KCknPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRhdGFDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4U25hY2tiYXJDb21wb25lbnQpXG4gICAgcHVibGljIGFkZFJvd1NuYWNrYmFyOiBJZ3hTbmFja2JhckNvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkQ29sdW1uUmVzaXplckNvbXBvbmVudClcbiAgICBwdWJsaWMgcmVzaXplTGluZTogSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2xvYWRpbmdPdmVybGF5JywgeyByZWFkOiBJZ3hUb2dnbGVEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nT3ZlcmxheTogSWd4VG9nZ2xlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hMb2FkaW5nT3ZlcmxheU91dGxldCcsIHsgcmVhZDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGxvYWRpbmdPdXRsZXQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Q29sdW1uQ29tcG9uZW50LCB7IHJlYWQ6IElneENvbHVtbkNvbXBvbmVudCwgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgY29sdW1uTGlzdDogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4gPSBuZXcgUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4oKTtcblxuICAgIEBDb250ZW50Q2hpbGQoSWd4QWN0aW9uU3RyaXBDb21wb25lbnQpXG4gICAgcHVibGljIGFjdGlvblN0cmlwOiBJZ3hBY3Rpb25TdHJpcENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBleGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlOiBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQSB0ZW1wbGF0ZSByZWZlcmVuY2UgZm9yIHRoZSB0ZW1wbGF0ZSB3aGVuIHRoZSBmaWx0ZXJlZCBncmlkIGlzIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBlbXB0eVRlbXBhbHRlID0gdGhpcy5ncmlkLmVtcHR5R3JpZFRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2VtcHR5RmlsdGVyZWRHcmlkJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGVtcHR5RmlsdGVyZWRHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBBIHRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgdGhlIHRlbXBsYXRlIHdoZW4gdGhlIGdyaWQgaXMgZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIGNvbnN0IGVtcHR5VGVtcGFsdGUgPSB0aGlzLmdyaWQuZW1wdHlHcmlkVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEVtcHR5R3JpZCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBlbXB0eUdyaWREZWZhdWx0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRMb2FkaW5nR3JpZCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nR3JpZERlZmF1bHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBwYXJlbnRWaXJ0RGlyOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZSwgeyByZWFkOiBJZ3hIZWFkU2VsZWN0b3JEaXJlY3RpdmUsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBoZWFkU2VsZWN0b3JzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8SWd4SGVhZFNlbGVjdG9yRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd1NlbGVjdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IElneFJvd1NlbGVjdG9yRGlyZWN0aXZlLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgcm93U2VsZWN0b3JzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8SWd4Um93U2VsZWN0b3JEaXJlY3RpdmU+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RHJhZ0dob3N0RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3ZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB2ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcjogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3ZlcnRpY2FsU2Nyb2xsSG9sZGVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB2ZXJ0aWNhbFNjcm9sbDogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NjcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHNjcjogRWxlbWVudFJlZjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRTZWxlY3RvckJhc2VUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBoZWFkZXJTZWxlY3RvckJhc2VUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZm9vdGVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHVibGljIGZvb3RlcjogRWxlbWVudFJlZjtcblxuICAgIHB1YmxpYyBnZXQgaGVhZGVyQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdy5oZWFkZXJDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXJTZWxlY3RvckNvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuaGVhZGVyU2VsZWN0b3JDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXJEcmFnQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdy5oZWFkZXJEcmFnQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGVhZGVyR3JvdXBDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93LmhlYWRlckdyb3VwQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVyaW5nUm93KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdy5maWx0ZXJSb3c7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB0aGVhZFJvdzogSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4R3JpZEdyb3VwQnlBcmVhQ29tcG9uZW50KVxuICAgIHB1YmxpYyBncm91cEJ5QXJlYTogSWd4R3JpZEdyb3VwQnlBcmVhQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0Ym9keScsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRib2R5OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdwaW5Db250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgcGluQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0Zm9vdCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRmb290OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hSb3dFZGl0aW5nT3ZlcmxheU91dGxldCcsIHsgcmVhZDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUsIHsgcmVhZDogSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgdG1wT3V0bGV0czogUXVlcnlMaXN0PGFueT4gPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkcmFnSW5kaWNhdG9ySWNvbkJhc2UnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZHJhZ0luZGljYXRvckljb25CYXNlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0VkaXRUZW1wbGF0ZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRDdXN0b21EaXJlY3RpdmVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdFRleHREaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFZGl0VGV4dERpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hSb3dBZGRUZXh0RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0FkZFRleHQ6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdEFjdGlvbnNEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgcm93IGV4cGFuZCBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hSb3dFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIHJvdyBjb2xsYXBzZSBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hSb3dDb2xsYXBzZWRJbmRpY2F0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93Q29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIGV4cGFuZCBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hIZWFkZXJFeHBhbmRJbmRpY2F0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgaGVhZGVyRXhwYW5kSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIGNvbGxhcHNlIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEhlYWRlckNvbGxhcHNlSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGhlYWRlckNvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgcm93IGV4cGFuZCBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hFeGNlbFN0eWxlSGVhZGVySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBleGNlbFN0eWxlSGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneERyYWdJbmRpY2F0b3JJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSlcbiAgICBwdWJsaWMgcm93RWRpdFRhYnNERUZBVUxUOiBRdWVyeUxpc3Q8SWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmU+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIHJvd0VkaXRUYWJzQ1VTVE9NOiBRdWVyeUxpc3Q8SWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmU+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdyb3dFZGl0aW5nT3ZlcmxheScsIHsgcmVhZDogSWd4VG9nZ2xlRGlyZWN0aXZlIH0pXG4gICAgcHVibGljIHJvd0VkaXRpbmdPdmVybGF5OiBJZ3hUb2dnbGVEaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gICAgcHVibGljIHRhYmluZGV4ID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyBob3N0Um9sZSA9ICdncmlkJztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4R3JpZFRvb2xiYXJDb21wb25lbnQpXG4gICAgcHVibGljIHRvb2xiYXI6IFF1ZXJ5TGlzdDxJZ3hHcmlkVG9vbGJhckNvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFBhZ2luYXRvckNvbXBvbmVudClcbiAgICBwcm90ZWN0ZWQgcGFnaW5hdGlvbkNvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hQYWdpbmF0b3JDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hGaWx0ZXJpbmdPdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgX291dGxldERpcmVjdGl2ZTogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRDb2xsYXBzZWRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0Q29sbGFwc2VkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFU0ZIZWFkZXJJY29uJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRFU0ZIZWFkZXJJY29uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdzdW1tYXJ5Um93JywgeyByZWFkOiBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50IH0pXG4gICAgcHJvdGVjdGVkIF9zdW1tYXJ5Um93TGlzdDogUXVlcnlMaXN0PElneFN1bW1hcnlSb3dDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncm93JylcbiAgICBwcml2YXRlIF9yb3dMaXN0OiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdwaW5uZWRSb3cnKVxuICAgIHByaXZhdGUgX3Bpbm5lZFJvd0xpc3Q6IFF1ZXJ5TGlzdDxJZ3hHcmlkUm93Q29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Um93RGlyZWN0aXZlLCB7IHJlYWQ6IElneFJvd0RpcmVjdGl2ZSB9KVxuICAgIHByaXZhdGUgX2RhdGFSb3dMaXN0OiBRdWVyeUxpc3Q8SWd4Um93RGlyZWN0aXZlPElneEdyaWRCYXNlRGlyZWN0aXZlPj47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSUdyaWRSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNvdXJjZVN0cmluZ3MoKTogSUdyaWRSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICBpZiAoIXRoaXMuX3Jlc291cmNlU3RyaW5ncykge1xuICAgICAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gQ3VycmVudFJlc291cmNlU3RyaW5ncy5HcmlkUmVzU3RyaW5ncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyaW5nIGxvZ2ljIG9mIHRoZSBgSWd4R3JpZENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBkZWZhdWx0IGlzIEFORC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFtmaWx0ZXJpbmdMb2dpY109XCJmaWx0ZXJpbmdcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJpbmdMb2dpYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5vcGVyYXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcmluZ0xvZ2ljKHZhbHVlOiBGaWx0ZXJpbmdMb2dpYykge1xuICAgICAgICB0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3IgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlcmluZyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgWyhmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpXT1cIm1vZGVsLmZpbHRlcmluZ0V4cHJlc3Npb25zXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFN1cHBvcnRzIHR3by13YXkgYmluZGluZy5cbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gKHZhbHVlIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmICghKHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V4cHJlc3Npb25zVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kLCB2YWwuZmlsdGVyaW5nT3BlcmFuZHNbaW5kZXhdLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gYXMgSUZpbHRlcmluZ0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB2YWwuZmlsdGVyaW5nT3BlcmFuZHNbaW5kZXhdID0gbmV3RXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUudHlwZSA9IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVR5cGUuUmVndWxhcjtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkodGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVmcmVzaEV4cHJlc3Npb25zKCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAqIHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IGxvZ2ljO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICB2YWx1ZS50eXBlID0gRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZS5BZHZhbmNlZDtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1BpcGVUcmlnZ2VyKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZS5lbWl0KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpICYmXG4gICAgICAgICAgICAhdGhpcy5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSBmaWx0ZXJlZCBkYXRhIHRocm91Z2ggdGhlIHBpcGVzIGFuZCB0aGVuIGVtaXQgdGhlIGV2ZW50LlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5maWx0ZXJpbmdEb25lLmVtaXQodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGxvY2FsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgbm90IHNldCwgcmV0dXJucyBicm93c2VyJ3MgbGFuZ3VhZ2UuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9sb2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxlQ2hhbmdlLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdpbmdNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5nTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBhZ2luZ01vZGUodmFsOiBHcmlkUGFnaW5nTW9kZSkge1xuICAgICAgICB0aGlzLl9wYWdpbmdNb2RlID0gdmFsO1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmBcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBwYWdpbmcgZmVhdHVyZSBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCBzdGF0ZSBpcyBkaXNhYmxlZCAoZmFsc2UpLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+XG4gICAgICogIDxpZ3gtcGFnaW5hdG9yPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcGFnaW5nID0gdmFsdWU7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIGBwYWdlYCBwcm9wZXJ0eSBmb3JtIGBwYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIGN1cnJlbnQgcGFnZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+XG4gICAgICogIDxpZ3gtcGFnaW5hdG9yIFsocGFnZSldPVwibW9kZWwucGFnZVwiPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRvcj8ucGFnZSB8fCAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFnZSh2YWw6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UgPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIGBwZXJQYWdlYCBwcm9wZXJ0eSBmcm9tIGBwYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIG51bWJlciBvZiB2aXNpYmxlIGl0ZW1zIHBlciBwYWdlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCBpcyAxNS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPlxuICAgICAqICA8aWd4LXBhZ2luYXRvciBbKHBlclBhZ2UpXT1cIm1vZGVsLnBlclBhZ2VcIj48L2lneC1wYWdpbmF0b3I+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGVyUGFnZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0b3I/LnBlclBhZ2UgfHwgREVGQVVMVF9JVEVNU19QRVJfUEFHRTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBlclBhZ2UodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fcGVyUGFnZSA9IHZhbDtcbiAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wZXJQYWdlID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMC4xLjBcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaGlkaW5nIFVJIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgZGlzYWJsZWQgKGZhbHNlKS4gSW4gb3JkZXIgZm9yIHRoZSBVSSB0byB3b3JrLCB5b3UgbmVlZCB0byBlbmFibGUgdGhlIHRvb2xiYXIgYXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgYmVsb3cuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbkhpZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkhpZGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvbHVtbkhpZGluZyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jb2x1bW5IaWRpbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGlmIHRoZSByb3cgc2VsZWN0b3JzIGFyZSBoaWRkZW4uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqICBCeSBkZWZhdWx0IHJvdyBzZWxlY3RvcnMgYXJlIHNob3duXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGhpZGVSb3dTZWxlY3RvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRlUm93U2VsZWN0b3JzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGlkZVJvd1NlbGVjdG9ycyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9oaWRlUm93U2VsZWN0b3JzID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciByb3dzIGNhbiBiZSBtb3ZlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbcm93RHJhZ2dhYmxlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dEcmFnZ2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dEcmFnICYmIHRoaXMuaGFzVmlzaWJsZUNvbHVtbnM7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgc2V0IHJvd0RyYWdnYWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcm93RHJhZyA9IHZhbDtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcm93RHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBJRCB0aGF0IGlzIGJlaW5nIGRyYWdnZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSByb3cgSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhZ1Jvd0lEID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSByb3dzIGFyZSBlZGl0YWJsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyBzZXQgdG8gZmFsc2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtjb2x1bW5IaWRpbmddPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RWRpdGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb3dFZGl0YWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hHcmlkU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yb3dFZGl0YWJsZSA9IHZhbDtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBoZWlnaHQodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hlaWdodCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoJylcbiAgICBwdWJsaWMgZ2V0IGhvc3RXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoIHx8IHRoaXMuX2hvc3RXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHdpZHRoIG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGdyaWRXaWR0aCA9IHRoaXMuZ3JpZC53aWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHdpZHRoKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLl93aWR0aCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiBsZXQgZ3JpZEhlYWRlcldpZHRoID0gdGhpcy5ncmlkLmhlYWRlcldpZHRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLndpZHRoLCAxMCkgLSAxNztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHJvdyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbcm93SGVpZ2h0XT1cIjEwMFwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd0hlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0hlaWdodCA/IHRoaXMuX3Jvd0hlaWdodCA6IHRoaXMuZGVmYXVsdFJvd0hlaWdodDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJvd0hlaWdodCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9yb3dIZWlnaHQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZGVmYXVsdCB3aWR0aCBvZiB0aGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtjb2x1bW5XaWR0aF09XCIxMDBcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5XaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uV2lkdGg7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY29sdW1uV2lkdGgodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jb2x1bW5XaWR0aCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNvbHVtbldpZHRoU2V0QnlVc2VyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldC9TZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbZW1wdHlHcmlkTWVzc2FnZV09XCInVGhlIGdyaWQgaXMgZW1wdHknXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZW1wdHlHcmlkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VtcHR5R3JpZE1lc3NhZ2UgPSB2YWx1ZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBlbXB0eUdyaWRNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUdyaWRNZXNzYWdlIHx8IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2VtcHR5R3JpZF9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBncmlkIGlzIGdvaW5nIHRvIHNob3cgYSBsb2FkaW5nIGluZGljYXRvci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2lzTG9hZGluZ109XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgaXNMb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0xvYWRpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0xvYWRpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVMb2FkaW5nU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjdXJyZW50IGRldGVjdGlvbiBjeWNsZSB0byBlbmQgYmVmb3JlIHRyaWdnZXJpbmcgYSBuZXcgb25lLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMb2FkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW5zIHNob3VsZCBiZSBhdXRvLWdlbmVyYXRlZCBvbmNlIGFnYWluIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZ3JpZFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgdG8gYmluZCB0aGUgZ3JpZCB0byByZW1vdGUgZGF0YSBhbmQgaGF2aW5nIGF1dG8tZ2VuZXJhdGVkIGNvbHVtbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKiBOb3RlIHRoYXQgYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgY29sdW1ucywgdGhpcyBwcm9wZXJ0eSB3b3VsZCBiZSBkaXNhYmxlZCB0byBhdm9pZCByZS1jcmVhdGluZ1xuICAgICAqIGNvbHVtbnMgZWFjaCB0aW1lIGEgbmV3IGRhdGEgaXMgYXNzaWduZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIHRoaXMuZ3JpZC5zaG91bGRHZW5lcmF0ZSA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNob3VsZEdlbmVyYXRlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzIGFuZCB0aGUgZ3JpZCBpcyBmaWx0ZXJlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZE1lc3NhZ2VdPVwiJ1RoZSBncmlkIGlzIGVtcHR5J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGVtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UgfHwgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZW1wdHlGaWx0ZXJlZEdyaWRfbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEwLjEuMFxuICAgICAqXG4gICAgICogR2V0cy9TZXRzIHRoZSB0aXRsZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGJ1aWx0LWluIGNvbHVtbiBoaWRpbmcgVUkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbY29sdW1uSGlkaW5nXT1cInRydWVcIiBjb2x1bW5IaWRpbmdUaXRsZT1cIkNvbHVtbiBIaWRpbmdcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5IaWRpbmdUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uSGlkaW5nVGl0bGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY29sdW1uSGlkaW5nVGl0bGUodjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbkhpZGluZ1RpdGxlID0gdjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbkhpZGluZ1RpdGxlSW50ZXJuYWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkhpZGluZ1RpdGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaW5pdGlhbCBwaW5uaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFsbG93cyB0byBhcHBseSBwaW5uaW5nIHRoZSBjb2x1bW5zIHRvIHRoZSBzdGFydCBvciB0aGUgZW5kLlxuICAgICAqIE5vdGUgdGhhdCBwaW5uaW5nIHRvIGJvdGggc2lkZXMgYXQgYSB0aW1lIGlzIG5vdCBhbGxvd2VkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbcGlubmluZ109XCJwaW5uaW5nQ29uZmlnXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGlubmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5pbmc7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgcGlubmluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMuX3Bpbm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9waW5uaW5nID0gdmFsdWU7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEwLjEuMFxuICAgICAqXG4gICAgICogR2V0cy9TZXRzIGlmIHRoZSBidWlsdC1pbiBjb2x1bW4gcGlubmluZyBVSSBzaG91bGQgYmUgc2hvd24gaW4gdGhlIHRvb2xiYXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2NvbHVtblBpbm5pbmddPVwiJ3RydWVcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5QaW5uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uUGlubmluZztcbiAgICB9XG4gICAgcHVibGljIHNldCBjb2x1bW5QaW5uaW5nKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblBpbm5pbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMC4xLjBcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGl0bGUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBVSSBvZiB0aGUgY29sdW1uIHBpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2NvbHVtblBpbm5pbmddPVwiJ3RydWVcIiBbY29sdW1uUGlubmluZ1RpdGxlXT1cIidDb2x1bW4gSGlkaW5nJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtblBpbm5pbmdUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uUGlubmluZ1RpdGxlO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGNvbHVtblBpbm5pbmdUaXRsZSh2OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uUGlubmluZ1RpdGxlID0gdjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtblBpbm5pbmdUaXRsZUludGVybmFsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5QaW5uaW5nVGl0bGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGlmIHRoZSBmaWx0ZXJpbmcgaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYWxsb3dGaWx0ZXJpbmddPVwidHJ1ZVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGFsbG93RmlsdGVyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsb3dGaWx0ZXJpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBhbGxvd0ZpbHRlcmluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5fYWxsb3dGaWx0ZXJpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGxvd0ZpbHRlcmluZyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLnJlZ2lzdGVyU1ZHSWNvbnMoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjR3JpZEhlYWRSb3coKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uID0gbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYWxsb3dBZHZhbmNlZEZpbHRlcmluZ109XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBhbGxvd0FkdmFuY2VkRmlsdGVyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsb3dBZHZhbmNlZEZpbHRlcmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFsbG93QWR2YW5jZWRGaWx0ZXJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93QWR2YW5jZWRGaWx0ZXJpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVnaXN0ZXJTVkdJY29ucygpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlciBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtmaWx0ZXJNb2RlXT1cIidxdWlja0ZpbHRlcidcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCdzIHNldCB0byBGaWx0ZXJNb2RlLnF1aWNrRmlsdGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlck1vZGUodmFsdWU6IEZpbHRlck1vZGUpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyTW9kZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1Jvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN1bW1hcnkgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgc3VtbWFyeVBvc2l0aW9uPVwidG9wXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgYm90dG9tLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdW1tYXJ5UG9zaXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzdW1tYXJ5UG9zaXRpb24odmFsdWU6IEdyaWRTdW1tYXJ5UG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeVBvc2l0aW9uID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3VtbWFyeSBjYWxjdWxhdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIHN1bW1hcnlDYWxjdWxhdGlvbk1vZGU9XCJyb290TGV2ZWxPbmx5XCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgcm9vdEFuZENoaWxkTGV2ZWxzIHdoaWNoIG1lYW5zIHRoZSBzdW1tYXJpZXMgYXJlIGNhbGN1bGF0ZWQgZm9yIHRoZSByb290IGxldmVsIGFuZCBlYWNoIGNoaWxkIGxldmVsLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyeUNhbGN1bGF0aW9uTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUodmFsdWU6IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX3N1bW1hcnlDYWxjdWxhdGlvbk1vZGUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5yZXNldFN1bW1hcnlIZWlnaHQoKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHN1bW1hcnkgcm93IGlzIHZpc2libGUgd2hlbiBncm91cEJ5L3BhcmVudCByb3cgaXMgY29sbGFwc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93U3VtbWFyeU9uQ29sbGFwc2VdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHNob3dTdW1tYXJ5T25Db2xsYXBzZSBpcyBzZXQgdG8gJ2ZhbHNlJyB3aGljaCBtZWFucyB0aGF0IHRoZSBzdW1tYXJ5IHJvdyBpcyBub3QgdmlzaWJsZVxuICAgICAqIHdoZW4gdGhlIGdyb3VwQnkvcGFyZW50IHJvdyBpcyBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNob3dTdW1tYXJ5T25Db2xsYXBzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dTdW1tYXJ5T25Db2xsYXBzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNob3dTdW1tYXJ5T25Db2xsYXBzZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9zaG93U3VtbWFyeU9uQ29sbGFwc2UgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBmaWx0ZXJpbmcgc3RyYXRlZ3kgb2YgdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtmaWx0ZXJTdHJhdGVneV09XCJmaWx0ZXJTdHJhdGVneVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZpbHRlclN0cmF0ZWd5KCk6IElGaWx0ZXJpbmdTdHJhdGVneSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJpbmdTdHJhdGVneTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlclN0cmF0ZWd5KGNsYXNzUmVmOiBJRmlsdGVyaW5nU3RyYXRlZ3kpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyaW5nU3RyYXRlZ3kgPSBjbGFzc1JlZjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHNvcnRpbmcgc3RyYXRlZ3kgb2YgdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzb3J0U3RyYXRlZ3ldPVwic29ydFN0cmF0ZWd5XCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc29ydFN0cmF0ZWd5KCk6IElHcmlkU29ydGluZ1N0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRpbmdTdHJhdGVneTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNvcnRTdHJhdGVneSh2YWx1ZTogSUdyaWRTb3J0aW5nU3RyYXRlZ3kpIHtcbiAgICAgICAgdGhpcy5fc29ydGluZ1N0cmF0ZWd5ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVwcmVzZW50cyB0aGUgc2VsZWN0ZWQgcm93cycgSURzIChwcmltYXJ5IGtleSBvciByb3dEYXRhKVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBwcmltYXJ5S2V5PVwiSURcIiByb3dTZWxlY3Rpb249XCJtdWx0aXBsZVwiIFtzZWxlY3RlZFJvd3NdPVwiWzAsIDEsIDJdXCI+PGlneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzZWxlY3RlZFJvd3Mocm93SURzOiBhbnlbXSkge1xuICAgICAgICB0aGlzLnNlbGVjdFJvd3Mocm93SURzIHx8IFtdLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkUm93cygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRSb3dzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnRzLmZpcnN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgYElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBoZWFkZXJHcm91cHNMaXN0ID0gdGhpcy5ncmlkLmhlYWRlckdyb3Vwc0xpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJHcm91cHNMaXN0KCk6IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgYElneEdyaWRIZWFkZXJDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgaGVhZGVycyA9IHRoaXMuZ3JpZC5oZWFkZXJDZWxsTGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckNlbGxMaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJHcm91cHNMaXN0Lm1hcChoZWFkZXJHcm91cCA9PiBoZWFkZXJHcm91cC5oZWFkZXIpLmZpbHRlcihoZWFkZXIgPT4gaGVhZGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIGBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmaWx0ZXJDZWxscyA9IHRoaXMuZ3JpZC5maWx0ZXJDZWxsTGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlckNlbGxMaXN0KCk6IElneEdyaWRGaWx0ZXJpbmdDZWxsQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJHcm91cHNMaXN0Lm1hcChncm91cCA9PiBncm91cC5maWx0ZXIpLmZpbHRlcihjZWxsID0+IGNlbGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdW1tYXJpZXNSb3dMaXN0KCkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcbiAgICAgICAgaWYgKCF0aGlzLl9zdW1tYXJ5Um93TGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdW1MaXN0ID0gdGhpcy5fc3VtbWFyeVJvd0xpc3QuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBudWxsKTtcbiAgICAgICAgcmVzLnJlc2V0KHN1bUxpc3QpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgSWd4R3JpZFJvd0NvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCByb3dMaXN0ID0gdGhpcy5ncmlkLnJvd0xpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dMaXN0KCkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcbiAgICAgICAgaWYgKCF0aGlzLl9yb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJMaXN0ID0gdGhpcy5fcm93TGlzdFxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gbnVsbClcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICAgIHJlcy5yZXNldChyTGlzdCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGN1cnJlbnRseSByZW5kZXJlZCBgSWd4R3JpZFJvd0NvbXBvbmVudGAncy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGRhdGFMaXN0ID0gdGhpcy5ncmlkLmRhdGFSb3dMaXN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YVJvd0xpc3QoKTogUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZT4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFF1ZXJ5TGlzdDxJZ3hSb3dEaXJlY3RpdmU8SWd4R3JpZEJhc2VEaXJlY3RpdmU+PigpO1xuICAgICAgICBpZiAoIXRoaXMuX2RhdGFSb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJMaXN0ID0gdGhpcy5fZGF0YVJvd0xpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gbnVsbCkuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgICAgICByZXMucmVzZXQockxpc3QpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRTZWxlY3RvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZT4ge1xuICAgICAgICBpZiAodGhpcy5oZWFkU2VsZWN0b3JzVGVtcGxhdGVzICYmIHRoaXMuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcy5maXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcy5maXJzdC50ZW1wbGF0ZVJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUGlubmluZ1RvU3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5pbmcuY29sdW1ucyAhPT0gQ29sdW1uUGlubmluZ1Bvc2l0aW9uLkVuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Jvd1Bpbm5pbmdUb1RvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlubmluZy5yb3dzICE9PSBSb3dQaW5uaW5nUG9zaXRpb24uQm90dG9tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd1NlbGVjdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JEaXJlY3RpdmU+IHtcbiAgICAgICAgaWYgKHRoaXMucm93U2VsZWN0b3JzVGVtcGxhdGVzICYmIHRoaXMucm93U2VsZWN0b3JzVGVtcGxhdGVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXMuZmlyc3QudGVtcGxhdGVSZWY7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dPdXRsZXREaXJlY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcmVudFJvd091dGxldERpcmVjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0Q3VzdG9tKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5yb3dFZGl0Q3VzdG9tRGlyZWN0aXZlcyAmJiB0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0Q3VzdG9tRGlyZWN0aXZlcy5maXJzdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RWRpdFRleHQoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRUZXh0RGlyZWN0aXZlcyAmJiB0aGlzLnJvd0VkaXRUZXh0RGlyZWN0aXZlcy5maXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdFRleHREaXJlY3RpdmVzLmZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0QWN0aW9ucygpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMucm93RWRpdEFjdGlvbnNEaXJlY3RpdmVzICYmIHRoaXMucm93RWRpdEFjdGlvbnNEaXJlY3RpdmVzLmZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXMuZmlyc3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRDb250YWluZXIoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRDdXN0b20gPyB0aGlzLnJvd0VkaXRDdXN0b20gOiB0aGlzLmRlZmF1bHRSb3dFZGl0VGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSByb3cgZHJhZyBpbmRpY2F0b3IgaWNvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgfHwgdGhpcy5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlcy5maXJzdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUodmFsOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMuX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZWRpdGFibGUpXG4gICAgICAgICAgICAubWFwKGMgPT4gYy52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgcmV0dXJuIGluZGV4Lmxlbmd0aCA/IGluZGV4WzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFzdEVkaXRhYmxlQ29sdW1uSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmVkaXRhYmxlKVxuICAgICAgICAgICAgLm1hcChjID0+IGMudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhID4gYiA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBpbmRleC5sZW5ndGggPyBpbmRleFswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBUT0RPOiBOYXYgc2VydmljZSBsb2dpYyBkb2Vzbid0IGhhbmRsZSAwIHJlc3VsdHMgZnJvbSB0aGlzIHF1ZXJ5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RWRpdFRhYnMoKTogUXVlcnlMaXN0PElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRUYWJzQ1VTVE9NLmxlbmd0aCA/IHRoaXMucm93RWRpdFRhYnNDVVNUT00gOiB0aGlzLnJvd0VkaXRUYWJzREVGQVVMVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGl2ZURlc2NlbmRhbnQoKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW0gPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcblxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW0gfHwgIU9iamVjdC5rZXlzKGFjdGl2ZUVsZW0pLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWN0aXZlRWxlbS5yb3cgPCAwID9cbiAgICAgICAgICAgIGAke3RoaXMuaWR9XyR7YWN0aXZlRWxlbS5yb3d9XyR7YWN0aXZlRWxlbS5tY2hDYWNoZS5sZXZlbH1fJHthY3RpdmVFbGVtLmNvbHVtbn1gIDpcbiAgICAgICAgICAgIGAke3RoaXMuaWR9XyR7YWN0aXZlRWxlbS5yb3d9XyR7YWN0aXZlRWxlbS5jb2x1bW59YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5jbGFzcycpXG4gICAgcHVibGljIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFt0aGlzLmdldENvbXBvbmVudERlbnNpdHlDbGFzcygnaWd4LWdyaWQnKV07XG4gICAgICAgIC8vIFRoZSBjdXN0b20gY2xhc3NlcyBzaG91bGQgYmUgYXQgdGhlIGVuZC5cbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuY2xhc3MpO1xuICAgICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiYW5uZXJDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuaXNUb3AgPyAnaWd4LWJhbm5lcl9fYm9yZGVyLXRvcCcgOiAnaWd4LWJhbm5lcl9fYm9yZGVyLWJvdHRvbSc7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmdldENvbXBvbmVudERlbnNpdHlDbGFzcygnaWd4LWJhbm5lcicpfSAke3Bvc2l0aW9ufWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzb3J0aW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTdXBwb3J0cyB0d28td2F5IGRhdGEgYmluZGluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFsoc29ydGluZ0V4cHJlc3Npb25zKV09XCJtb2RlbC5zb3J0aW5nRXhwcmVzc2lvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0aW5nRXhwcmVzc2lvbnMoKTogSVNvcnRpbmdFeHByZXNzaW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydGluZ0V4cHJlc3Npb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc29ydGluZ0V4cHJlc3Npb25zKHZhbHVlOiBJU29ydGluZ0V4cHJlc3Npb25bXSkge1xuICAgICAgICB0aGlzLl9zb3J0aW5nRXhwcmVzc2lvbnMgPSBjbG9uZUFycmF5KHZhbHVlKTtcbiAgICAgICAgdGhpcy5zb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UuZW1pdCh0aGlzLl9zb3J0aW5nRXhwcmVzc2lvbnMpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4TGV2ZWxIZWFkZXJEZXB0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPSB0aGlzLmhhc0NvbHVtbkxheW91dHMgP1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC5yZWR1Y2UoKGFjYywgY29sKSA9PiBNYXRoLm1heChhY2MsIGNvbC5yb3dTdGFydCksIDApIDpcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkxpc3QucmVkdWNlKChhY2MsIGNvbCkgPT4gTWF0aC5tYXgoYWNjLCBjb2wubGV2ZWwpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgaGlkZGVuIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBoaWRkZW5Db2wgPSB0aGlzLmdyaWQuaGlkZGVuQ29sdW1uc0NvdW50O1xuICAgICAqIGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoaWRkZW5Db2x1bW5zQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChjb2wpID0+IGNvbC5jb2x1bW5Hcm91cCA9PT0gZmFsc2UgJiYgY29sLmhpZGRlbiA9PT0gdHJ1ZSkubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBwaW5uZWQgY29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZENvbHVtbnNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlubmVkQ29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uTGF5b3V0KS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMC4xLjBcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQgaW5zaWRlIHRoZSB0b2dnbGUgYnV0dG9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBVc2VkIGZvciB0aGUgYnVpbHQtaW4gY29sdW1uIGhpZGluZyBVSSBvZiB0aGVgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2NvbHVtbkhpZGluZ109XCJ0cnVlXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbaGlkZGVuQ29sdW1uc1RleHRdPVwiJ0hpZGRlbiBDb2x1bW5zJ1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGhpZGRlbkNvbHVtbnNUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlkZGVuQ29sdW1uc1RleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBoaWRkZW5Db2x1bW5zVGV4dCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9oaWRkZW5Db2x1bW5zVGV4dCA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTAuMS4wXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHQgdG8gYmUgZGlzcGxheWVkIGluc2lkZSB0aGUgdG9nZ2xlIGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVXNlZCBmb3IgdGhlIGJ1aWx0LWluIGNvbHVtbiBwaW5uaW5nIFVJIG9mIHRoZWBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbcGlubmVkQ29sdW1uc1RleHRdPVwiJ1Bpbm5lZENvbHMgVGV4dFwiIFtkYXRhXT1cImRhdGFcIiBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInNTAwcHgnXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1uc1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRDb2x1bW5zVGV4dDtcbiAgICB9XG4gICAgcHVibGljIHNldCBwaW5uZWRDb2x1bW5zVGV4dCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zVGV4dCA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgZ3JpZCBoYXMgYmF0Y2ggZWRpdGluZyBlbmFibGVkLlxuICAgICAqIFdoZW4gYmF0Y2ggZWRpdGluZyBpcyBlbmFibGVkLCBjaGFuZ2VzIGFyZSBub3QgbWFkZSBkaXJlY3RseSB0byB0aGUgdW5kZXJseWluZyBkYXRhLlxuICAgICAqIEluc3RlYWQsIHRoZXkgYXJlIHN0b3JlZCBhcyB0cmFuc2FjdGlvbnMsIHdoaWNoIGNhbiBsYXRlciBiZSBjb21taXR0ZWQgdy8gdGhlIGBjb21taXRgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbYmF0Y2hFZGl0aW5nXT1cInRydWVcIiBbZGF0YV09XCJzb21lRGF0YVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGJhdGNoRWRpdGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JhdGNoRWRpdGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGJhdGNoRWRpdGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbCAhPT0gdGhpcy5fYmF0Y2hFZGl0aW5nKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdHJhbnNhY3Rpb25zO1xuICAgICAgICAgICAgdGhpcy5fYmF0Y2hFZGl0aW5nID0gdmFsO1xuICAgICAgICAgICAgdGhpcy5zd2l0Y2hUcmFuc2FjdGlvblNlcnZpY2UodmFsKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9UcmFuc2FjdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1uc1RleHRJbnRlcm5hbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZENvbHVtbnNUZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0cmFuc2FjdGlvbnMgc2VydmljZSBmb3IgdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmFuc2FjdGlvbnMoKTogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4ge1xuICAgICAgICBpZiAodGhpcy5fZGlUcmFuc2FjdGlvbnMgJiYgIXRoaXMuYmF0Y2hFZGl0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGlUcmFuc2FjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFJvd1N0YXRlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Um93U3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbmN5UG9zaXRpb25MZWZ0KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbmN5UG9zaXRpb25MZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdCh0aGlzLmxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3kpO1xuICAgICAgICBjb25zdCBmb3JtYXRQYXJ0cyA9IGZvcm1hdC5zcGxpdCgnLCcpO1xuICAgICAgICBjb25zdCBpID0gZm9ybWF0UGFydHMuaW5kZXhPZihmb3JtYXRQYXJ0cy5maW5kKGMgPT4gYy5pbmNsdWRlcygnwqQnKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgPSBpIDwgMTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTEuMC4wXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgdG9vbGJhciBpcyBzaG93bi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiID48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzaG93VG9vbGJhcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dUb29sYmFyO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHNob3dUb29sYmFyKG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Nob3dUb29sYmFyID0gbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMS4wLjBcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdG9vbGJhcidzIHRpdGxlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW3Rvb2xiYXJUaXRsZV09XCInTXkgR3JpZCdcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB0b29sYmFyVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rvb2xiYXJUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHRvb2xiYXJUaXRsZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3Rvb2xiYXJUaXRsZSA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBgZXhwb3J0RXhjZWxgIGlzIGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIGV4cG9ydGluZyB0byBNUyBFeGNlbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW2V4cG9ydEV4Y2VsXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBleHBvcnRFeGNlbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXhwb3J0RXhjZWwoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGV4cG9ydEV4Y2VsKG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2V4cG9ydEV4Y2VsID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGBleHBvcnRDc3ZgIGlzIGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBvcHRpb24gZm9yIGV4cG9ydGluZyB0byBDU1YgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbZXhwb3J0Q3N2XT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBleHBvcnRDc3YoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEV4cG9ydENzdigpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGV4cG9ydENzdihuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9leHBvcnRDc3YgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgYGV4cG9ydFRleHRgIGlzIGRlcHJlY2F0ZWRcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdGV4dHVhbCBjb250ZW50IGZvciB0aGUgbWFpbiBleHBvcnQgYnV0dG9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93VG9vbGJhcl09XCJ0cnVlXCIgW2V4cG9ydFRleHRdPVwiJ015IEV4cG9ydGVyJ1wiIFtleHBvcnRDc3ZdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cG9ydFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydFRleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBleHBvcnRUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0VGV4dCA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBgZXhwb3J0RXhjZWxUZXh0YCBpcyBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHR1YWwgY29udGVudCBmb3IgdGhlIE1TIEV4Y2VsIGV4cG9ydCBidXR0b24uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtleHBvcnRFeGNlbFRleHRdPVwiJ015IEV4Y2VsIEV4cG9ydGVyXCIgW3Nob3dUb29sYmFyXT1cInRydWVcIiBbZXhwb3J0VGV4dF09XCInTXkgRXhwb3J0ZXInXCIgW2V4cG9ydENzdl09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZXhwb3J0RXhjZWxUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBvcnRFeGNlbFRleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZXhwb3J0RXhjZWxUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0RXhjZWxUZXh0ID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGBleHBvcnRDc3ZUZXh0YCBpcyBkZXByZWNhdGVkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRleHR1YWwgY29udGVudCBmb3IgdGhlIENTViBleHBvcnQgYnV0dG9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtleHBvcnRDc3ZUZXh0XT1cIidNeSBDc3YgRXhwb3J0ZXJcIiBbc2hvd1Rvb2xiYXJdPVwidHJ1ZVwiIFtleHBvcnRUZXh0XT1cIidNeSBFeHBvcnRlcidcIiBbZXhwb3J0RXhjZWxdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cG9ydENzdlRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydENzdlRleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZXhwb3J0Q3N2VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2V4cG9ydENzdlRleHQgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGNlbGwgc2VsZWN0aW9uIG1vZGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIGNlbGwgc2VsZWN0aW9uIG1vZGUgaXMgbXVsdGlwbGVcbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGVcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY2VsbFNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NlbGxTZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY2VsbFNlbGVjdGlvbihzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSkge1xuICAgICAgICB0aGlzLl9jZWxsU2VsZWN0aW9uTW9kZSA9IHNlbGVjdGlvbk1vZGU7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgcm93IHNlbGVjdGlvbiBtb2RlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHJvdyBzZWxlY3Rpb24gbW9kZSBpcyAnbm9uZSdcbiAgICAgKiBOb3RlIHRoYXQgaW4gSWd4R3JpZCBhbmQgSWd4SGllcmFyY2hpY2FsR3JpZCAnbXVsdGlwbGVDYXNjYWRlJyBiZWhhdmVzIGxpa2UgJ211bHRpcGxlJ1xuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dTZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93U2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGNvbHVtbiBzZWxlY3Rpb24gbW9kZVxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSByb3cgc2VsZWN0aW9uIG1vZGUgaXMgbm9uZVxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5TZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5TZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uU2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHBhZ2luZ1N0YXRlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3BhZ2luZ1N0YXRlID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvciAmJiAhdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzID0gdmFsdWUubWV0YWRhdGEuY291bnRSZWNvcmRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYWdpbmdTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZ1N0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJvd0VkaXRNZXNzYWdlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc25hY2tiYXJBY3Rpb25UZXh0ID0gdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfc25hY2tiYXJfYWRkcm93X2FjdGlvbnRleHQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWxjV2lkdGg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWxjSGVpZ2h0ID0gMDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0Zm9vdEhlaWdodDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHN1bW1hcmllc0hlaWdodDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVRyYW5zaXRpb25zID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBsYXN0U2VhcmNoSW5mbzogSVNlYXJjaEluZm8gPSB7XG4gICAgICAgIHNlYXJjaFRleHQ6ICcnLFxuICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgICAgZXhhY3RNYXRjaDogZmFsc2UsXG4gICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgIG1hdGNoSW5mb0NhY2hlOiBbXVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5XaWR0aFNldEJ5VXNlciA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGlubmVkUmVjb3JkczogYW55W107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpbm5lZFJlY29yZHM6IGFueVtdO1xuXG4gICAgcHVibGljIHJlbmRlcmVkJCA9IHRoaXMucmVuZGVyZWQuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVzaXplTm90aWZ5ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByb3dBZGRlZE5vdGlmaWVyID0gbmV3IFN1YmplY3Q8SVJvd0RhdGFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcm93RGVsZXRlZE5vdGlmaWVyID0gbmV3IFN1YmplY3Q8SVJvd0RhdGFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcGlwZVRyaWdnZXJOb3RpZmllciA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIF9maWx0ZXJlZFVucGlubmVkRGF0YTtcbiAgICBwdWJsaWMgX2Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVjaW1hbFBpcGU6IERlY2ltYWxQaXBlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGVQaXBlOiBEYXRlUGlwZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwZXJjZW50UGlwZTogUGVyY2VudFBpcGU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3RvdGFsUmVjb3JkcyA9IC0xO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbHVtbnNXaXRoTm9TZXRXaWR0aHMgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBpcGVUcmlnZ2VyID0gMDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJpbmdQaXBlVHJpZ2dlciA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3VtbWFyeVBpcGVUcmlnZ2VyID0gMDtcblxuICAgIHB1YmxpYyBFTVBUWV9EQVRBID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGVyUGFnZSA9IERFRkFVTFRfSVRFTVNfUEVSX1BBR0U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5nID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5nTW9kZSA9IEdyaWRQYWdpbmdNb2RlLkxvY2FsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3BhZ2luZ1N0YXRlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2hpZGVSb3dTZWxlY3RvcnMgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9yb3dEcmFnID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9waW5uZWRDb2x1bW5zOiBJZ3hDb2x1bW5Db21wb25lbnRbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3VucGlubmVkQ29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKEZpbHRlcmluZ0xvZ2ljLkFuZCk7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc29ydGluZ0V4cHJlc3Npb25zOiBBcnJheTxJU29ydGluZ0V4cHJlc3Npb24+ID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbWF4TGV2ZWxIZWFkZXJEZXB0aCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29sdW1uSGlkaW5nID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29sdW1uUGlubmluZyA9IGZhbHNlO1xuXG4gICAgcHJvdGVjdGVkIF9waW5uZWRSZWNvcmRJRHMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YTogYW55W107XG4gICAgcHJvdGVjdGVkIF9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YTogYW55W107XG4gICAgcHJvdGVjdGVkIF9maWx0ZXJlZFBpbm5lZERhdGE6IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfaGFzVmlzaWJsZUNvbHVtbnM7XG4gICAgcHJvdGVjdGVkIF9hbGxvd0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfYWxsb3dBZHZhbmNlZEZpbHRlcmluZyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZmlsdGVyTW9kZTogRmlsdGVyTW9kZSA9IEZpbHRlck1vZGUucXVpY2tGaWx0ZXI7XG5cblxuICAgIHByb3RlY3RlZCBfZGVmYXVsdFRhcmdldFJlY29yZE51bWJlciA9IDEwO1xuICAgIHByb3RlY3RlZCBfZXhwYW5zaW9uU3RhdGVzOiBNYXA8YW55LCBib29sZWFuPiA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdEV4cGFuZFN0YXRlID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9iYXNlRm9udFNpemU6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2hlYWRlckZlYXR1cmVzV2lkdGggPSBOYU47XG4gICAgcHJvdGVjdGVkIF9pbml0ID0gdHJ1ZTtcbiAgICBwcm90ZWN0ZWQgX2NkclJlcXVlc3RSZXBhaW50ID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF91c2VyT3V0bGV0RGlyZWN0aXZlOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuICAgIHByb3RlY3RlZCBfdHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvblNlcnZpY2U8VHJhbnNhY3Rpb24sIFN0YXRlPjtcbiAgICBwcm90ZWN0ZWQgX2JhdGNoRWRpdGluZyA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBwYWdpbmF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb25Db21wb25lbnRzPy5maXJzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2Nyb2xsU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsTmF0aXZlU2l6ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbHVtblBpbm5pbmdUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgX2NvbHVtbkhpZGluZ1RpdGxlOiBzdHJpbmc7XG5cbiAgICAvKiBUb29sYmFyIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi9cbiAgICBwcml2YXRlIF9zaG93VG9vbGJhciA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2V4cG9ydEV4Y2VsID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZXhwb3J0Q3N2ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfdG9vbGJhclRpdGxlOiBzdHJpbmcgPSBudWxsO1xuICAgIHByaXZhdGUgX2V4cG9ydFRleHQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9leHBvcnRFeGNlbFRleHQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9leHBvcnRDc3ZUZXh0OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcm93RWRpdGFibGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jdXJyZW50Um93U3RhdGU6IGFueTtcbiAgICBwcml2YXRlIF9maWx0ZXJlZFNvcnRlZERhdGEgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBfY3VzdG9tRHJhZ0luZGljYXRvckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwcml2YXRlIF9jZHJSZXF1ZXN0cyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncztcbiAgICBwcml2YXRlIF9lbXB0eUdyaWRNZXNzYWdlID0gbnVsbDtcbiAgICBwcml2YXRlIF9lbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UgPSBudWxsO1xuICAgIHByaXZhdGUgX2lzTG9hZGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xvY2FsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3ZlcmxheUlEcyA9IFtdO1xuICAgIHByaXZhdGUgX2ZpbHRlcmluZ1N0cmF0ZWd5OiBJRmlsdGVyaW5nU3RyYXRlZ3k7XG4gICAgcHJpdmF0ZSBfc29ydGluZ1N0cmF0ZWd5OiBJR3JpZFNvcnRpbmdTdHJhdGVneTtcbiAgICBwcml2YXRlIF9waW5uaW5nOiBJUGlubmluZ0NvbmZpZyA9IHsgY29sdW1uczogQ29sdW1uUGlubmluZ1Bvc2l0aW9uLlN0YXJ0IH07XG5cbiAgICBwcml2YXRlIF9ob3N0V2lkdGg7XG4gICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9hZHZhbmNlZEZpbHRlcmluZ1Bvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGUsXG4gICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuTWlkZGxlXG4gICAgfTtcblxuICAgIHByaXZhdGUgX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nUG9zaXRpb25TZXR0aW5ncyksXG4gICAgfTtcblxuICAgIHByaXZhdGUgY29sdW1uTGlzdERpZmZlcjtcbiAgICBwcml2YXRlIHJvd0xpc3REaWZmZXI7XG4gICAgcHJpdmF0ZSBfaGlkZGVuQ29sdW1uc1RleHQgPSAnJztcbiAgICBwcml2YXRlIF9waW5uZWRDb2x1bW5zVGV4dCA9ICcnO1xuICAgIHByaXZhdGUgX2hlaWdodDogc3RyaW5nIHwgbnVsbCA9ICcxMDAlJztcbiAgICBwcml2YXRlIF93aWR0aDogc3RyaW5nIHwgbnVsbCA9ICcxMDAlJztcbiAgICBwcml2YXRlIF9yb3dIZWlnaHQ7XG4gICAgcHJpdmF0ZSBfaG9yaXpvbnRhbEZvck9mczogQXJyYXk8SWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT4+ID0gW107XG4gICAgcHJpdmF0ZSBfbXVsdGlSb3dMYXlvdXRSb3dTaXplID0gMTtcbiAgICAvLyBDYWNoZXNcbiAgICBwcml2YXRlIF90b3RhbFdpZHRoID0gTmFOO1xuICAgIHByaXZhdGUgX3Bpbm5lZFZpc2libGUgPSBbXTtcbiAgICBwcml2YXRlIF91bnBpbm5lZFZpc2libGUgPSBbXTtcbiAgICBwcml2YXRlIF9waW5uZWRXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF91bnBpbm5lZFdpZHRoID0gTmFOO1xuICAgIHByaXZhdGUgX3Zpc2libGVDb2x1bW5zID0gW107XG4gICAgcHJpdmF0ZSBfY29sdW1uR3JvdXBzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfYXV0b0dlbmVyYXRlZENvbHMgPSBbXTtcbiAgICBwcml2YXRlIF9kYXRhVmlldyA9IFtdO1xuXG4gICAgcHJpdmF0ZSBfY29sdW1uV2lkdGg6IHN0cmluZztcblxuICAgIHByaXZhdGUgX3N1bW1hcnlQb3NpdGlvbjogR3JpZFN1bW1hcnlQb3NpdGlvbiA9IEdyaWRTdW1tYXJ5UG9zaXRpb24uYm90dG9tO1xuICAgIHByaXZhdGUgX3N1bW1hcnlDYWxjdWxhdGlvbk1vZGU6IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlID0gR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUucm9vdEFuZENoaWxkTGV2ZWxzO1xuICAgIHByaXZhdGUgX3Nob3dTdW1tYXJ5T25Db2xsYXBzZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NlbGxTZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlO1xuICAgIHByaXZhdGUgX3Jvd1NlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZTtcbiAgICBwcml2YXRlIF9zZWxlY3RSb3dPbkNsaWNrID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9jb2x1bW5TZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG5cbiAgICBwcml2YXRlIGxhc3RBZGRlZFJvd0luZGV4O1xuICAgIHByaXZhdGUgX2N1cnJlbmN5UG9zaXRpb25MZWZ0OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSByb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneSA9IG5ldyBSb3dFZGl0UG9zaXRpb25TdHJhdGVneSh7XG4gICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQsXG4gICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICBjbG9zZUFuaW1hdGlvbjogbnVsbFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSByb3dFZGl0U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG91dGxldDogdGhpcy5yb3dPdXRsZXREaXJlY3RpdmUsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3lcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfZGF0YUNsb25lU3RyYXRlZ3k6IElEYXRhQ2xvbmVTdHJhdGVneSA9IG5ldyBEZWZhdWx0RGF0YUNsb25lU3RyYXRlZ3koKTtcbiAgICBwcml2YXRlIHRyYW5zYWN0aW9uQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IERSQUdfU0NST0xMX0RFTFRBID0gMTA7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBpZDogc3RyaW5nO1xuICAgIGFic3RyYWN0IGRhdGE6IGFueVtdIHwgbnVsbDtcbiAgICBhYnN0cmFjdCBmaWx0ZXJlZERhdGE6IGFueVtdO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZmlsdGVyZWQgc29ydGVkIGRhdGEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmaWx0ZXJlZFNvcnRlZERhdGEgPSB0aGlzLmdyaWQxLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmVkU29ydGVkRGF0YSgpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0NoYW5nZXNDb3VudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNydWRTZXJ2aWNlLnJvdykge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZiA9IChvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNoYW5nZXMgPSAwO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiBpc09iamVjdChvYmpba2V5XSkgPyBjaGFuZ2VzICs9IGYob2JqW2tleV0pIDogY2hhbmdlcysrKTtcbiAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByb3dDaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZFZhbHVlKHRoaXMuY3J1ZFNlcnZpY2Uucm93LmlkLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiByb3dDaGFuZ2VzID8gZihyb3dDaGFuZ2VzKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFXaXRoQWRkZWRJblRyYW5zYWN0aW9uUm93cygpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2xvbmVBcnJheSh0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKCkpO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZENoYW5nZXModHJ1ZSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHQgPT4gdC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKVxuICAgICAgICAgICAgICAgIC5tYXAodCA9PiB0Lm5ld1ZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jcnVkU2VydmljZS5yb3cgJiYgdGhpcy5jcnVkU2VydmljZS5yb3cuZ2V0Q2xhc3NOYW1lKCkgPT09IElneEFkZFJvdy5uYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKHRoaXMuY3J1ZFNlcnZpY2Uucm93LmluZGV4LCAwLCB0aGlzLmNydWRTZXJ2aWNlLnJvdy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkID8gdGhpcy5kYXRhV2l0aEFkZGVkSW5UcmFuc2FjdGlvblJvd3MubGVuZ3RoIDogdGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSgpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGluZyAmJiAodGhpcy5oYXNaZXJvUmVzdWx0RmlsdGVyIHx8IHRoaXMuaGFzTm9EYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZ0dyaWRUZW1wbGF0ZSA/IHRoaXMubG9hZGluZ0dyaWRUZW1wbGF0ZSA6IHRoaXMubG9hZGluZ0dyaWREZWZhdWx0VGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNaZXJvUmVzdWx0RmlsdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUdyaWRUZW1wbGF0ZSA/IHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgOiB0aGlzLmVtcHR5RmlsdGVyZWRHcmlkVGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNOb0RhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtcHR5R3JpZFRlbXBsYXRlID8gdGhpcy5lbXB0eUdyaWRUZW1wbGF0ZSA6IHRoaXMuZW1wdHlHcmlkRGVmYXVsdFRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBoYXNaZXJvUmVzdWx0RmlsdGVyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGEgJiYgdGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgaGFzTm9EYXRhKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGF0YSB8fCB0aGlzLmRhdGFMZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3VsZE92ZXJsYXlMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgJiYgIXRoaXMuaGFzTm9EYXRhICYmICF0aGlzLmhhc1plcm9SZXN1bHRGaWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzTXVsdGlSb3dTZWxlY3Rpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlXG4gICAgICAgICAgICB8fCB0aGlzLnJvd1NlbGVjdGlvbiA9PT0gR3JpZFNlbGVjdGlvbk1vZGUubXVsdGlwbGVDYXNjYWRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Jvd1NlbGVjdGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGlvbiAhPT0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNDZWxsU2VsZWN0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbFNlbGVjdGlvbiAhPT0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uSW5EcmFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmNtcy5jb2x1bW47XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbFJlc2l6aW5nU2VydmljZTogSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZ3JpZEFQSTogR3JpZEJhc2VBUElTZXJ2aWNlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgR3JpZFR5cGU+LFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25GYWN0b3J5OiBJZ3hGbGF0VHJhbnNhY3Rpb25GYWN0b3J5LFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHVibGljIGRvY3VtZW50OiBhbnksXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJvdGVjdGVkIGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHB1YmxpYyBuYXZpZ2F0aW9uOiBJZ3hHcmlkTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBmaWx0ZXJpbmdTZXJ2aWNlOiBJZ3hGaWx0ZXJpbmdTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KElneE92ZXJsYXlTZXJ2aWNlKSBwcm90ZWN0ZWQgb3ZlcmxheVNlcnZpY2U6IElneE92ZXJsYXlTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgc3VtbWFyeVNlcnZpY2U6IElneEdyaWRTdW1tYXJ5U2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBwcm90ZWN0ZWQgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucyxcbiAgICAgICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgbG9jYWxlSWQ6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSWd4R3JpZFRyYW5zYWN0aW9uKSBwcm90ZWN0ZWQgX2RpVHJhbnNhY3Rpb25zPzogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4pIHtcbiAgICAgICAgc3VwZXIoX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5sb2NhbGUgfHwgdGhpcy5sb2NhbGVJZDtcbiAgICAgICAgdGhpcy5kYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSh0aGlzLmxvY2FsZSk7XG4gICAgICAgIHRoaXMuZGVjaW1hbFBpcGUgPSBuZXcgRGVjaW1hbFBpcGUodGhpcy5sb2NhbGUpO1xuICAgICAgICB0aGlzLmN1cnJlbmN5UGlwZSA9IG5ldyBDdXJyZW5jeVBpcGUodGhpcy5sb2NhbGUpO1xuICAgICAgICB0aGlzLnBlcmNlbnRQaXBlID0gbmV3IFBlcmNlbnRQaXBlKHRoaXMubG9jYWxlKTtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbkZhY3RvcnkuY3JlYXRlKFRSQU5TQUNUSU9OX1RZUEUuTm9uZSk7XG4gICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucy5jbG9uZVN0cmF0ZWd5ID0gdGhpcy5kYXRhQ2xvbmVTdHJhdGVneTtcbiAgICAgICAgdGhpcy5jZHIuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxuICAgIHB1YmxpYyBoaWRlQWN0aW9uU3RyaXAoKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uU3RyaXA/LmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJGZWF0dXJlc1dpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGV0YWlsUmVjb3JkKF9yZWMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNHcm91cEJ5UmVjb3JkKF9yZWMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzR2hvc3RSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5naG9zdFJlY29yZCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0FkZFJvd1JlY29yZChyZWNvcmQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkLmFkZFJvdyAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBSZXR1cm5zIHRoZSByb3cgaW5kZXggb2YgYSByb3cgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZ1bGwgdmlldyBkYXRhIGxpa2UgcGlubmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YVZpZXdJbmRleChyb3dJbmRleCwgcGlubmVkKSB7XG4gICAgICAgIGlmIChwaW5uZWQgJiYgIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3ApIHtcbiAgICAgICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggKyB0aGlzLnVucGlubmVkRGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKCFwaW5uZWQgJiYgdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCkge1xuICAgICAgICAgICAgcm93SW5kZXggPSByb3dJbmRleCArIHRoaXMucGlubmVkRGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNEZXRhaWxzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGdyaWQgdmlydHVhbGl6YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEluY2x1ZGVzIHRoZSBzdGFydCBpbmRleCBhbmQgaG93IG1hbnkgcmVjb3JkcyBhcmUgcmVuZGVyZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JpZFZpcnRTdGF0ZSA9IHRoaXMuZ3JpZDEudmlydHVhbGl6YXRpb25TdGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpcnR1YWxpemF0aW9uU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHZpcnR1YWxpemF0aW9uU3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZU92ZXJsYXlzKCkge1xuICAgICAgICB0aGlzLm92ZXJsYXlJRHMuZm9yRWFjaChvdmVybGF5SUQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQob3ZlcmxheUlEKTtcblxuICAgICAgICAgICAgaWYgKG92ZXJsYXk/LnZpc2libGUgJiYgIW92ZXJsYXkuY2xvc2VBbmltYXRpb25QbGF5ZXI/Lmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuaGlkZShvdmVybGF5SUQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVjb3JkIGlzIHBpbm5lZCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcm93SW5kZXggSW5kZXggb2YgdGhlIHJlY29yZCBpbiB0aGUgYGRhdGFWaWV3YCBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlY29yZFBpbm5lZEJ5Vmlld0luZGV4KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAodGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA8IHRoaXMucGlubmVkRGF0YVZpZXcubGVuZ3RoKSB8fFxuICAgICAgICAgICAgKCF0aGlzLmlzUm93UGlubmluZ1RvVG9wICYmIHJvd0luZGV4ID49IHRoaXMudW5waW5uZWREYXRhVmlldy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVjb3JkIGlzIHBpbm5lZCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcm93SW5kZXggSW5kZXggb2YgdGhlIHJlY29yZCBpbiB0aGUgYGZpbHRlcmVkU29ydGVkRGF0YWAgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNSZWNvcmRQaW5uZWRCeUluZGV4KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAodGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA8IHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YS5sZW5ndGgpIHx8XG4gICAgICAgICAgICAoIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgJiYgcm93SW5kZXggPj0gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzUmVjb3JkUGlubmVkKHJlYykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJbml0aWFsUGlubmVkSW5kZXgocmVjKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIFJldHVybnMgdGhlIHJlY29yZCBpbmRleCBpbiBvcmRlciBvZiBwaW5uaW5nIGJ5IHRoZSB1c2VyLiBEb2VzIG5vdCBjb25zaWRlciBzb3J0aW5nL2ZpbHRlcmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW5pdGlhbFBpbm5lZEluZGV4KHJlYykge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2lkKHJlYyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzUGlubmVkUmVjb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFJlY29yZHNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3J1ZFNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuY3J1ZFNlcnZpY2U7XG4gICAgfVxuXG4gICAgcHVibGljIF9zZXR1cFNlcnZpY2VzKCkge1xuICAgICAgICB0aGlzLmdyaWRBUEkuZ3JpZCA9IHRoaXM7XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZ3JpZCA9IHRoaXM7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5ncmlkID0gdGhpcztcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLmdyaWQgPSB0aGlzO1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZ3JpZCA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuZ3JpZCA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIF9zZXR1cExpc3RlbmVycygpIHtcbiAgICAgICAgY29uc3QgZGVzdHJ1Y3RvciA9IHRha2VVbnRpbDxhbnk+KHRoaXMuZGVzdHJveSQpO1xuICAgICAgICBmcm9tRXZlbnQodGhpcy5uYXRpdmVFbGVtZW50LCAnZm9jdXNvdXQnKS5waXBlKGZpbHRlcigoKSA9PiAhIXRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlKSwgZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5kcmFnTW9kZSAmJiB0aGlzLnBsYXRmb3JtLmlzSUUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3J1ZFNlcnZpY2UuY2VsbCAmJlxuICAgICAgICAgICAgICAgICEhdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUgJiZcbiAgICAgICAgICAgICAgICAoKGV2ZW50LnRhcmdldCA9PT0gdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA8IHRoaXMuZGF0YVZpZXcubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUucm93ID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgfHwgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy50Zm9vdC5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA9PT0gdGhpcy5kYXRhVmlldy5sZW5ndGgpKSAmJlxuICAgICAgICAgICAgICAgICEodGhpcy5yb3dFZGl0YWJsZSAmJiB0aGlzLmNydWRTZXJ2aWNlLnJvd0VkaXRpbmdCbG9ja2VkICYmIHRoaXMuY3J1ZFNlcnZpY2Uucm93SW5FZGl0TW9kZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZSA9IHt9IGFzIElBY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb3dBZGRlZE5vdGlmaWVyLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKGFyZ3MgPT4gdGhpcy5yZWZyZXNoR3JpZFN0YXRlKGFyZ3MpKTtcbiAgICAgICAgdGhpcy5yb3dEZWxldGVkTm90aWZpZXIucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoYXJncyA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmRlbGV0ZU9wZXJhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnNjcmliZVRvVHJhbnNhY3Rpb25zKCk7XG5cbiAgICAgICAgdGhpcy5yZXNpemVOb3RpZnkucGlwZShcbiAgICAgICAgICAgIGRlc3RydWN0b3IsXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpLFxuICAgICAgICAgICAgdGhyb3R0bGVUaW1lKDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0pXG4gICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyTm90aWZpZXIucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnBpcGVUcmlnZ2VyKyspO1xuICAgICAgICB0aGlzLmNvbHVtbk1vdmluZ0VuZC5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpKTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLm9wZW5pbmcucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPT09IGV2ZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBldmVudC5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmluaXRpYWxpemUodGhpcywgdGhpcy5vdmVybGF5U2VydmljZSwgZXZlbnQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5vcGVuZWQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3MgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKGV2ZW50LmlkKT8uc2V0dGluZ3M7XG5cbiAgICAgICAgICAgIC8vIGRvIG5vdCBoaWRlIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgb3ZlcmxheSBvbiBzY3JvbGxcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGV2ZW50LmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2V0QWRkQnV0dG9uRm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkbyBub3QgaGlkZSB0aGUgb3ZlcmxheSBpZiBpdCdzIGF0dGFjaGVkIHRvIGEgcm93XG4gICAgICAgICAgICBpZiAodGhpcy5yb3dFZGl0aW5nT3ZlcmxheT8ub3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG92ZXJsYXlTZXR0aW5ncz8ub3V0bGV0ID09PSB0aGlzLm91dGxldCAmJiB0aGlzLm92ZXJsYXlJRHMuaW5kZXhPZihldmVudC5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5SURzLnB1c2goZXZlbnQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNsb3NlZC5waXBlKGRlc3RydWN0b3IsIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kID0gdGhpcy5vdmVybGF5SURzLmluZGV4T2YoZXZlbnQuaWQpO1xuICAgICAgICAgICAgaWYgKGluZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlJRHMuc3BsaWNlKGluZCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGF0YUNoYW5naW5nLnBpcGUoZGVzdHJ1Y3RvciwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSkuc3Vic2NyaWJlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlY2FsY1NpemUgPSB0aGlzLmlzUGVyY2VudEhlaWdodCAmJlxuICAgICAgICAgICAgICAgICghdGhpcy5jYWxjSGVpZ2h0IHx8IHRoaXMuY2FsY0hlaWdodCA9PT0gdGhpcy5nZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID09PSB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogdGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcik7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVjYWxjU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuICAgICAgICAgICAgICAgICRldmVudC5jb250YWluZXJTaXplID0gdGhpcy5jYWxjSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUxvYWRpbmdTdGF0ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbGJhclZpc2liaWxpdHlDaGFuZ2VkLnBpcGUoZGVzdHJ1Y3RvciwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGNhbGxlZCB0byByZWNhbGMgYWxsIHdpZHRocyB0aGF0IG1heSBoYXZlIGNoYW5nZXMgYXMgYSByZXN1bHQgb2ZcbiAgICAgICAgICAgIC8vIHRoZSB2ZXJ0LiBzY3JvbGxiYXIgc2hvd2luZy9oaWRpbmdcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5jb250ZW50U2l6ZUNoYW5nZS5waXBlKGRlc3RydWN0b3IsIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRTaXplcyhmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub25EZW5zaXR5Q2hhbmdlZC5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5zdW1tYXJ5SGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBTZXJ2aWNlcygpO1xuICAgICAgICB0aGlzLl9zZXR1cExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnJvd0xpc3REaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZChbXSkuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBjb21wYXJlIGJhc2VkIG9uIGZpZWxkLCBub3Qgb24gb2JqZWN0IHJlZi5cbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0RGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQoW10pLmNyZWF0ZSgoaW5kZXgsIGNvbDogQ29sdW1uVHlwZSkgPT4gY29sLmZpZWxkKTtcbiAgICAgICAgdGhpcy5jYWxjV2lkdGggPSB0aGlzLndpZHRoICYmIHRoaXMud2lkdGguaW5kZXhPZignJScpID09PSAtMSA/IHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKSA6IDA7XG4gICAgICAgIHRoaXMuc2hvdWxkR2VuZXJhdGUgPSB0aGlzLmF1dG9HZW5lcmF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q29sdW1uc0NhY2hlcygpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LmZvckVhY2goY29sdW1uID0+IGNvbHVtbi5yZXNldENhY2hlcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVJvd0lEKCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlDb2x1bW4gPSB0aGlzLmNvbHVtbkxpc3QuZmluZChjb2wgPT4gY29sLmZpZWxkID09PSB0aGlzLnByaW1hcnlLZXkpO1xuICAgICAgICBjb25zdCBpZFR5cGUgPSB0aGlzLmRhdGEubGVuZ3RoID9cbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZURhdGFUeXBlcyh0aGlzLmRhdGFbMF1bdGhpcy5wcmltYXJ5S2V5XSkgOiBwcmltYXJ5Q29sdW1uID8gcHJpbWFyeUNvbHVtbi5kYXRhVHlwZSA6ICdzdHJpbmcnO1xuICAgICAgICByZXR1cm4gaWRUeXBlID09PSAnc3RyaW5nJyA/IHV1aWR2NCgpIDogRkFLRV9ST1dfSUQtLTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Rm9yT2ZDYWNoZSgpIHtcbiAgICAgICAgY29uc3QgZmlyc3RWaXJ0Um93ID0gdGhpcy5kYXRhUm93TGlzdC5maXJzdDtcbiAgICAgICAgaWYgKGZpcnN0VmlydFJvdykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NkclJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgZmlyc3RWaXJ0Um93LnZpcnREaXJSb3cuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpcnN0VmlydFJvdy52aXJ0RGlyUm93LmFzc3VtZU1hc3RlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGaWx0ZXJlZERhdGEoZGF0YSwgcGlubmVkOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Bpbm5lZFJlY29yZHMgJiYgcGlubmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFBpbm5lZERhdGEgPSBkYXRhIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRVbnBpbm5lZCA9IHRoaXMuX2ZpbHRlcmVkVW5waW5uZWREYXRhIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gWy4uLiB0aGlzLl9maWx0ZXJlZFBpbm5lZERhdGEsIC4uLmZpbHRlcmVkVW5waW5uZWRdO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEubGVuZ3RoID4gMCA/IGZpbHRlcmVkRGF0YSA6IHRoaXMuX2ZpbHRlcmVkVW5waW5uZWREYXRhO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAhcGlubmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFVucGlubmVkRGF0YSA9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q29sdW1uQ29sbGVjdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVDb2x1bW5zLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX3Bpbm5lZFZpc2libGUubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fdW5waW5uZWRWaXNpYmxlLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldENhY2hlZFdpZHRocygpIHtcbiAgICAgICAgdGhpcy5fdW5waW5uZWRXaWR0aCA9IE5hTjtcbiAgICAgICAgdGhpcy5fcGlubmVkV2lkdGggPSBOYU47XG4gICAgICAgIHRoaXMuX3RvdGFsV2lkdGggPSBOYU47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGggPSB0cnVlKSB7XG4gICAgICAgIGlmIChyZWNhbGNGZWF0dXJlV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlckZlYXR1cmVzV2lkdGggPSBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEZvck9mQ2FjaGUoKTtcbiAgICAgICAgdGhpcy5yZXNldENvbHVtbnNDYWNoZXMoKTtcbiAgICAgICAgdGhpcy5yZXNldENvbHVtbkNvbGxlY3Rpb25zKCk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZWRXaWR0aHMoKTtcbiAgICAgICAgdGhpcy5oYXNWaXNpYmxlQ29sdW1ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29sdW1uR3JvdXBzID0gdGhpcy5jb2x1bW5MaXN0LnNvbWUoY29sID0+IGNvbC5jb2x1bW5Hcm91cCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMudG9vbGJhci5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpKTtcbiAgICAgICAgdGhpcy5zZXRVcFBhZ2luYXRvcigpO1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25Db21wb25lbnRzLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFVwUGFnaW5hdG9yKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5hY3Rpb25TdHJpcCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25TdHJpcC5tZW51T3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMub3V0bGV0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGF0YVJlYmluZGluZyhldmVudDogSUZvck9mRGF0YUNoYW5naW5nRXZlbnRBcmdzKSB7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5naW5nLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGFSZWJvdW5kKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZWQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHNldFVwUGFnaW5hdG9yKCkge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VDaGFuZ2UucGlwZSh0YWtlV2hpbGUoKCkgPT4gISF0aGlzLnBhZ2luYXRvciksIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgocGFnZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHBhZ2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnaW5nRG9uZS5waXBlKHRha2VXaGlsZSgoKSA9PiAhIXRoaXMucGFnaW5hdG9yKSwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChhcmdzOiBJUGFnZUV2ZW50QXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXIodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5nRG9uZS5lbWl0KHsgcHJldmlvdXM6IGFyZ3MucHJldmlvdXMsIGN1cnJlbnQ6IGFyZ3MuY3VycmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG8oMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGVyUGFnZUNoYW5nZS5waXBlKHRha2VXaGlsZSgoKSA9PiAhIXRoaXMucGFnaW5hdG9yKSwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChwZXJQYWdlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlclBhZ2VDaGFuZ2UuZW1pdChwZXJQYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVyZWRTb3J0ZWREYXRhKGRhdGEsIHBpbm5lZDogYm9vbGVhbikge1xuICAgICAgICBkYXRhID0gZGF0YSB8fCBbXTtcbiAgICAgICAgaWYgKHRoaXMucGlubmVkUmVjb3Jkc0NvdW50ID4gMCkge1xuICAgICAgICAgICAgaWYgKHBpbm5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5waW5uZWRSZWNvcmRzID0gZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFNvcnRlZERhdGEgPSB0aGlzLmlzUm93UGlubmluZ1RvVG9wXG4gICAgICAgICAgICAgICAgICAgID8gWy4uLiB0aGlzLl9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGEsIC4uLiB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YV1cbiAgICAgICAgICAgICAgICAgICAgOiBbLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhLCAuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhXTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hTZWFyY2godHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFNvcnRlZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2VhcmNoKHRydWUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1aWxkRGF0YVZpZXcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldEhvcml6b250YWxGb3JPZnMoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRGaWx0ZXIgPSAoaXRlbTogSWd4Um93RGlyZWN0aXZlPGFueT4gfCBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50KSA9PiB0aGlzLmlzRGVmaW5lZChpdGVtLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgICAgIHRoaXMuX2hvcml6b250YWxGb3JPZnMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9kYXRhUm93TGlzdC5maWx0ZXIoZWxlbWVudEZpbHRlcikubWFwKGl0ZW0gPT4gaXRlbS52aXJ0RGlyUm93KSxcbiAgICAgICAgICAgIC4uLnRoaXMuX3N1bW1hcnlSb3dMaXN0LmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3NldHVwUm93T2JzZXJ2ZXJzKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50RmlsdGVyID0gKGl0ZW06IElneFJvd0RpcmVjdGl2ZTxhbnk+IHwgSWd4U3VtbWFyeVJvd0NvbXBvbmVudCkgPT4gdGhpcy5pc0RlZmluZWQoaXRlbS5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBleHRyYWN0Rm9yT2ZzID0gcGlwZShtYXAoKGNvbGxlY3Rpb246IGFueVtdKSA9PiBjb2xsZWN0aW9uLmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpKSk7XG4gICAgICAgIGNvbnN0IHJvd0xpc3RPYnNlcnZlciA9IGV4dHJhY3RGb3JPZnModGhpcy5fZGF0YVJvd0xpc3QuY2hhbmdlcyk7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlSb3dPYnNlcnZlciA9IGV4dHJhY3RGb3JPZnModGhpcy5fc3VtbWFyeVJvd0xpc3QuY2hhbmdlcyk7XG4gICAgICAgIHJvd0xpc3RPYnNlcnZlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsRm9yT2ZzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdW1tYXJ5Um93T2JzZXJ2ZXIucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0SG9yaXpvbnRhbEZvck9mcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNldEhvcml6b250YWxGb3JPZnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfem9uZUJlZ29uZUxpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsKCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy52ZXJ0aWNhbFNjcm9sbEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckNvbnRhaW5lci5nZXRTY3JvbGwoKS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhvcml6b250YWxTY3JvbGxIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNpemVOb3RpZnkubmV4dCgpKTtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmFibGUodGhpcy5uYXRpdmVFbGVtZW50KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVzaXplTm90aWZ5Lm5leHQoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmluaXRQaW5uaW5nKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFNpemVzKCk7XG4gICAgICAgIHRoaXMuX2luaXQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIucmVhdHRhY2goKTtcbiAgICAgICAgdGhpcy5fc2V0dXBSb3dPYnNlcnZlcnMoKTtcbiAgICAgICAgdGhpcy5fem9uZUJlZ29uZUxpc3RlbmVycygpO1xuXG4gICAgICAgIGNvbnN0IHZlcnRTY3JEQyA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGlzcGxheUNvbnRhaW5lcjtcbiAgICAgICAgdmVydFNjckRDLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMucHJldmVudENvbnRhaW5lclNjcm9sbC5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLl9waW5uZWRSb3dMaXN0LmNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogUXVlcnlMaXN0PElneEdyaWRSb3dDb21wb25lbnQ+KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblBpbm5lZFJvd3NDaGFuZ2VkKGNoYW5nZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZFJvd1NuYWNrYmFyPy5jbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWMgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YVt0aGlzLmxhc3RBZGRlZFJvd0luZGV4XTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8ocmVjLCAwKTtcbiAgICAgICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXIuY2xvc2UoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gS2VlcCB0aGUgc3RyZWFtIG9wZW4gZm9yIGZ1dHVyZSBzdWJzY3JpYmVyc1xuICAgICAgICB0aGlzLnJlbmRlcmVkJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBlclBhZ2UgPSB0aGlzLl9wZXJQYWdlICE9PSBERUZBVUxUX0lURU1TX1BFUl9QQUdFID8gdGhpcy5fcGVyUGFnZSA6IHRoaXMucGFnaW5hdG9yLnBlclBhZ2U7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzID0gdGhpcy50b3RhbFJlY29yZHMgPyB0aGlzLnRvdGFsUmVjb3JkcyA6IHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcztcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5vdmVybGF5U2V0dGluZ3MgPSB7IG91dGxldDogdGhpcy5vdXRsZXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5yZW5kZXJlZC5uZXh0KHRydWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBub3RpZnlDaGFuZ2VzKHJlcGFpbnQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9jZHJSZXF1ZXN0cyA9IHRydWU7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RSZXBhaW50ID0gcmVwYWludDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xuICAgICAgICBzdXBlci5uZ0RvQ2hlY2soKTtcbiAgICAgICAgaWYgKHRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jZHJSZXF1ZXN0UmVwYWludCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldE5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFNpemVzKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZWFyY2godHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY2RyUmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXROb3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldERyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZXMgJiYgdGhpcy5kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZXMuZmlyc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlcy5maXJzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRtcE91dGxldHMuZm9yRWFjaCgodG1wbE91dGxldCkgPT4ge1xuICAgICAgICAgICAgdG1wbE91dGxldC5jbGVhbkNhY2hlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uQ2hhbmdlJC5uZXh0KCk7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25DaGFuZ2UkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKSB7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm92ZXJsYXlJRHMuZm9yRWFjaChvdmVybGF5SUQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQob3ZlcmxheUlEKTtcblxuICAgICAgICAgICAgaWYgKG92ZXJsYXkgJiYgIW92ZXJsYXkuZGV0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmRldGFjaChvdmVybGF5SUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcj8uZ2V0U2Nyb2xsKCk/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudmVydGljYWxTY3JvbGxIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyPy5nZXRTY3JvbGwoKT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ob3Jpem9udGFsU2Nyb2xsSGFuZGxlcik7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0U2NyREMgPSB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyPy5kaXNwbGF5Q29udGFpbmVyO1xuICAgICAgICAgICAgdmVydFNjckRDPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnByZXZlbnRDb250YWluZXJTY3JvbGwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBzcGVjaWZpZWQgY29sdW1uJ3MgdmlzaWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEudG9nZ2xlQ29sdW1uVmlzaWJpbGl0eSh7XG4gICAgICogICAgICAgY29sdW1uOiB0aGlzLmdyaWQxLmNvbHVtbnNbMF0sXG4gICAgICogICAgICAgbmV3VmFsdWU6IHRydWVcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlQ29sdW1uVmlzaWJpbGl0eShhcmdzOiBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29sID0gYXJncy5jb2x1bW4gPyB0aGlzLmNvbHVtbkxpc3QuZmluZCgoYykgPT4gYyA9PT0gYXJncy5jb2x1bW4pIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmICghY29sKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29sLnRvZ2dsZVZpc2liaWxpdHkoYXJncy5uZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgbGlzdCBvZiBrZXktdmFsdWUgcGFpcnMgW3JvdyBJRCwgZXhwYW5zaW9uIHN0YXRlXS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSW5jbHVkZXMgb25seSBzdGF0ZXMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgZGVmYXVsdCBvbmUuXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJkYXRhXCIgWyhleHBhbnNpb25TdGF0ZXMpXT1cIm1vZGVsLmV4cGFuc2lvblN0YXRlc1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cGFuc2lvblN0YXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuc2lvblN0YXRlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGV4cGFuc2lvblN0YXRlcyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9leHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4odmFsdWUpO1xuICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlc0NoYW5nZS5lbWl0KHRoaXMuX2V4cGFuc2lvblN0YXRlcyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmRzIGFsbCByb3dzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmV4cGFuZEFsbCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBleHBhbmRBbGwoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzID0gbmV3IE1hcDxhbnksIGJvb2xlYW4+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGFwc2VzIGFsbCByb3dzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNvbGxhcHNlQWxsKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNvbGxhcHNlQWxsKCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5leHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmRzIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5leHBhbmRSb3cocm93SUQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCBUaGUgcm93IGlkIC0gcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZFJvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGFwc2VzIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jb2xsYXBzZVJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2VSb3cocm93SUQ6IGFueSkge1xuICAgICAgICB0aGlzLmdyaWRBUEkuc2V0X3Jvd19leHBhbnNpb25fc3RhdGUocm93SUQsIGZhbHNlKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnRvZ2dsZVJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlUm93KHJvd0lEOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcmVjID0gdGhpcy5ncmlkQVBJLmdldF9yZWNfYnlfaWQocm93SUQpO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyZWMpO1xuICAgICAgICB0aGlzLmdyaWRBUEkuc2V0X3Jvd19leHBhbnNpb25fc3RhdGUocm93SUQsICFzdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREZWZhdWx0RXhwYW5kU3RhdGUoX3JlYzogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmF0aXZlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBuYXRpdmVFbCA9IHRoaXMuZ3JpZC5uYXRpdmVFbGVtZW50LlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgb3V0bGV0IHVzZWQgdG8gYXR0YWNoIHRoZSBncmlkJ3Mgb3ZlcmxheXMgdG8uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrXG4gICAgICogSWYgc2V0LCByZXR1cm5zIHRoZSBvdXRsZXQgZGVmaW5lZCBvdXRzaWRlIHRoZSBncmlkLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgZ3JpZCdzIGludGVybmFsIG91dGxldCBkaXJlY3RpdmUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IG91dGxldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZU91dGxldCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgb3V0bGV0KHZhbDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSkge1xuICAgICAgICB0aGlzLl91c2VyT3V0bGV0RGlyZWN0aXZlID0gdmFsO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGVmYXVsdCByb3cgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgcm93SGVpZ2ggPSB0aGlzLmdyaWQuZGVmYXVsdFJvd0hlaWdodDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQwO1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiAzMjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDUwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRTdW1tYXJ5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5kaXNwbGF5RGVuc2l0eSkge1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb3N5OlxuICAgICAgICAgICAgICAgIHJldHVybiAzMDtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjQ7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAzNjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRgJ3MgbWluaW11bSBhbGxvd2VkIHdpZHRoLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBVc2VkIGludGVybmFsbHkgZm9yIHJlc3RyaWN0aW5nIGhlYWRlciBncm91cCBjb21wb25lbnQgd2lkdGguXG4gICAgICogVGhlIHZhbHVlcyBiZWxvdyBkZXBlbmQgb24gdGhlIGhlYWRlciBjZWxsIGRlZmF1bHQgcmlnaHQvbGVmdCBwYWRkaW5nIHZhbHVlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5kaXNwbGF5RGVuc2l0eSkge1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb3N5OlxuICAgICAgICAgICAgICAgIHJldHVybiAzMjtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjQ7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiA0ODtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgd2lkdGggb2YgdGhlIGNvbnRhaW5lciBmb3IgdGhlIHBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRXaWR0aCA9IHRoaXMuZ3JpZC5nZXRQaW5uZWRXaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFdpZHRoKCkge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3Bpbm5lZFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bpbm5lZFdpZHRoID0gdGhpcy5nZXRQaW5uZWRXaWR0aCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgY29udGFpbmVyIGZvciB0aGUgdW5waW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdW5waW5uZWRXaWR0aCA9IHRoaXMuZ3JpZC5nZXRVbnBpbm5lZFdpZHRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5waW5uZWRXaWR0aCgpIHtcbiAgICAgICAgaWYgKCFpc05hTih0aGlzLl91bnBpbm5lZFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VucGlubmVkV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdW5waW5uZWRXaWR0aCA9IHRoaXMuZ2V0VW5waW5uZWRXaWR0aCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNIb3Jpem9udGFsU2Nyb2xsSGlkZGVuKCkge1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy51bnBpbm5lZFdpZHRoIC0gdGhpcy50b3RhbFdpZHRoO1xuICAgICAgICByZXR1cm4gdGhpcy53aWR0aCA9PT0gbnVsbCB8fCBkaWZmID49IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBHZXRzIHRoZSBjb21iaW5lZCB3aWR0aCBvZiB0aGUgY29sdW1ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgZW5hYmxlZCBncmlkIGZlYXR1cmVzLiBUaGV5IGFyZSBmaXhlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmVhdHVyZUNvbHVtbnNXaWR0aChleHBhbmRlcj86IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTih0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogcGxhdGZvcm1VdGlsLmlzQnJvd3NlciBjaGVja1xuICAgICAgICAgICAgY29uc3Qgcm93U2VsZWN0QXJlYSA9IHRoaXMuaGVhZGVyU2VsZWN0b3JDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJTZWxlY3RvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIGNvbnN0IHJvd0RyYWdBcmVhID0gdGhpcy5yb3dEcmFnZ2FibGUgJiYgdGhpcy5oZWFkZXJEcmFnQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyRHJhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwYWJsZUFyZWEgPSB0aGlzLmhlYWRlckdyb3VwQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyR3JvdXBDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlcldpZHRoID0gZXhwYW5kZXI/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/IGV4cGFuZGVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwO1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCA9IHJvd1NlbGVjdEFyZWEgKyByb3dEcmFnQXJlYSArIGdyb3VwYWJsZUFyZWEgKyBleHBhbmRlcldpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdW1tYXJpZXNNYXJnaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBjb2x1bXMgPSB0aGlzLmdyaWQuY29sdW1uc0NvbGxlY3Rpb24uXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2x1bW5zQ29sbGVjdGlvbigpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJlZCA/IHRoaXMuX2NvbHVtbnMgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBwaW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmVkQ29sdW1ucyA9IHRoaXMuZ3JpZC5waW5uZWRDb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLl9waW5uZWRWaXNpYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGlubmVkVmlzaWJsZSA9IHRoaXMuX3Bpbm5lZENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmhpZGRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRWaXNpYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIHBpbm5lZCBgSWd4Um93Q29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRSb3cgPSB0aGlzLmdyaWQucGlubmVkUm93cztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFJvd3MoKTogSWd4R3JpZFJvd0NvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJvd0xpc3QudG9BcnJheSgpLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHVucGlubmVkIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHVucGlubmVkQ29sdW1ucyA9IHRoaXMuZ3JpZC51bnBpbm5lZENvbHVtbnMuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1bnBpbm5lZENvbHVtbnMoKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICBpZiAodGhpcy5fdW5waW5uZWRWaXNpYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VucGlubmVkVmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bnBpbm5lZFZpc2libGUgPSB0aGlzLl91bnBpbm5lZENvbHVtbnMuZmlsdGVyKChjb2wpID0+ICFjb2wuaGlkZGVuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VucGlubmVkVmlzaWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgd2lkdGhgIHRvIGJlIHNldCBvbiBgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50YC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SGVhZGVyR3JvdXBXaWR0aChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xXaWR0aCA9IHBhcnNlRmxvYXQoY29sdW1uLmNhbGNXaWR0aCk7XG4gICAgICAgIGNvbnN0IG1pbldpZHRoID0gdGhpcy5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDtcblxuICAgICAgICBpZiAoY29sV2lkdGggPCBtaW5XaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbldpZHRoICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sV2lkdGggKyAncHgnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBJZ3hDb2x1bW5Db21wb25lbnRgIGJ5IGZpZWxkIG5hbWUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUNvbCA9IHRoaXMuZ3JpZDEuZ2V0Q29sdW1uQnlOYW1lKFwiSURcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29sdW1uQnlOYW1lKG5hbWU6IHN0cmluZyk6IElneENvbHVtbkNvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3QuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb2x1bW5CeVZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogSWd4Q29sdW1uQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbHVtbnMuZmluZCgoY29sKSA9PlxuICAgICAgICAgICAgIWNvbC5jb2x1bW5Hcm91cCAmJiAhY29sLmNvbHVtbkxheW91dCAmJlxuICAgICAgICAgICAgY29sLnZpc2libGVJbmRleCA9PT0gaW5kZXhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZpc2libGUgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdyaWQudmlzaWJsZUNvbHVtbnMuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXNpYmxlQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLl92aXNpYmxlQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlQ29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoYyA9PiAhYy5oaWRkZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUNvbHVtbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmBcbiAgICAgKlxuICAgICAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHRvdGFsUGFnZXMgPSB0aGlzLmdyaWQudG90YWxQYWdlcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yPy50b3RhbFBhZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgXG4gICAgICpcbiAgICAgKiBHZXRzIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGZpcnN0IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmaXJzdFBhZ2UgPSB0aGlzLmdyaWQuaXNGaXJzdFBhZ2U7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yLmlzTGFzdFBhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgXG4gICAgICpcbiAgICAgKiBHb2VzIHRvIHRoZSBuZXh0IHBhZ2UsIGlmIHRoZSBncmlkIGlzIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLm5leHRQYWdlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcbiAgICBwdWJsaWMgbmV4dFBhZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFnaW5hdG9yPy5uZXh0UGFnZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYFxuICAgICAqXG4gICAgICogR29lcyB0byB0aGUgcHJldmlvdXMgcGFnZSwgaWYgdGhlIGdyaWQgaXMgbm90IGFscmVhZHkgYXQgdGhlIGZpcnN0IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnByZXZpb3VzUGFnZSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nXG4gICAgcHVibGljIHByZXZpb3VzUGFnZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0b3I/LnByZXZpb3VzUGFnZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPbmx5IGZ1bmN0aW9ucyB3aGVuIHBhZ2luZyBpcyBlbmFibGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHRvdGFsUmVjb3JkcyA9IHRoaXMuZ3JpZC50b3RhbFJlY29yZHM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHRvdGFsUmVjb3JkcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxSZWNvcmRzID49IDAgPyB0aGlzLl90b3RhbFJlY29yZHMgOiB0aGlzLnBhZ2luZ1N0YXRlPy5tZXRhZGF0YS5jb3VudFJlY29yZHM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB0b3RhbFJlY29yZHModG90YWw6IG51bWJlcikge1xuICAgICAgICBpZiAodG90YWwgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzID0gdG90YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90b3RhbFJlY29yZHMgPSB0b3RhbDtcbiAgICAgICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmBcbiAgICAgKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBwYWdlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbGFzdFBhZ2UgPSB0aGlzLmdyaWQuaXNMYXN0UGFnZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRvci5pc0xhc3RQYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRvdGFsIHdpZHRoIG9mIHRoZSBgSWd4R3JpZENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBncmlkV2lkdGggPSB0aGlzLmdyaWQudG90YWxXaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCFpc05hTih0aGlzLl90b3RhbFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGFrZSBvbmx5IHRvcCBsZXZlbCBjb2x1bW5zXG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmxldmVsID09PSAwICYmICFjb2wucGlubmVkKTtcbiAgICAgICAgbGV0IHRvdGFsV2lkdGggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoaTsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gcGFyc2VJbnQoY29sc1tpXS5jYWxjV2lkdGgsIDEwKSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RvdGFsV2lkdGggPSB0b3RhbFdpZHRoO1xuICAgICAgICByZXR1cm4gdG90YWxXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93Um93U2VsZWN0b3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1Jvd1NlbGVjdGFibGUgJiYgdGhpcy5oYXNWaXNpYmxlQ29sdW1ucyAmJiAhdGhpcy5oaWRlUm93U2VsZWN0b3JzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dBZGRCdXR0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRhYmxlICYmIHRoaXMuZGF0YVZpZXcubGVuZ3RoID09PSAwICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dEcmFnSWNvbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0RyYWdnYWJsZSAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gdGhpcy5oaWRkZW5Db2x1bW5zQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhY2VzIGEgY29sdW1uIGJlZm9yZSBvciBhZnRlciB0aGUgc3BlY2lmaWVkIHRhcmdldCBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLm1vdmVDb2x1bW4oY29sdW1uLCB0YXJnZXQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlQ29sdW1uKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50LCB0YXJnZXQ6IElneENvbHVtbkNvbXBvbmVudCwgcG9zOiBEcm9wUG9zaXRpb24gPSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0KSB7XG4gICAgICAgIC8vIE0uQS4gTWF5IDExdGgsIDIwMjEgIzk1MDggTWFrZSB0aGUgZXZlbnQgY2FuY2VsYWJsZVxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3MgPSB7IHNvdXJjZTogY29sdW1uLCB0YXJnZXQsIGNhbmNlbDogZmFsc2UgfTtcblxuICAgICAgICB0aGlzLmNvbHVtbk1vdmluZ0VuZC5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW4gPT09IHRhcmdldCB8fCAoY29sdW1uLmxldmVsICE9PSB0YXJnZXQubGV2ZWwpIHx8XG4gICAgICAgICAgICAoY29sdW1uLnRvcExldmVsUGFyZW50ICE9PSB0YXJnZXQudG9wTGV2ZWxQYXJlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uLmxldmVsKSB7XG4gICAgICAgICAgICB0aGlzLl9tb3ZlQ2hpbGRDb2x1bW5zKGNvbHVtbi5wYXJlbnQsIGNvbHVtbiwgdGFyZ2V0LCBwb3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbHVtblBpblN0YXRlQ2hhbmdlZDtcbiAgICAgICAgLy8gcGlubmluZyBhbmQgdW5waW5uaW5nIHdpbGwgd29yayBjb3JyZWN0bHkgZXZlbiB3aXRob3V0IHBhc3NpbmcgaW5kZXhcbiAgICAgICAgLy8gYnV0IGlzIGVhc2llciB0byBjYWxjbHVsYXRlIHRoZSBpbmRleCBoZXJlLCBhbmQgbGF0ZXIgdXNlIGl0IGluIHRoZSBwaW5uaW5nIGV2ZW50IGFyZ3NcbiAgICAgICAgaWYgKHRhcmdldC5waW5uZWQgJiYgIWNvbHVtbi5waW5uZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBpbm5lZEluZGV4ID0gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKHRhcmdldCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBvcyA9PT0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCA/IHBpbm5lZEluZGV4ICsgMSA6IHBpbm5lZEluZGV4O1xuICAgICAgICAgICAgY29sdW1uUGluU3RhdGVDaGFuZ2VkID0gY29sdW1uLnBpbihpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldC5waW5uZWQgJiYgY29sdW1uLnBpbm5lZCkge1xuICAgICAgICAgICAgY29uc3QgdW5waW5uZWRJbmRleCA9IHRoaXMuX3VucGlubmVkQ29sdW1ucy5pbmRleE9mKHRhcmdldCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBvcyA9PT0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCA/IHVucGlubmVkSW5kZXggKyAxIDogdW5waW5uZWRJbmRleDtcbiAgICAgICAgICAgIGNvbHVtblBpblN0YXRlQ2hhbmdlZCA9IGNvbHVtbi51bnBpbihpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0LnBpbm5lZCAmJiBjb2x1bW4ucGlubmVkICYmICFjb2x1bW5QaW5TdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlb3JkZXJDb2x1bW5zKGNvbHVtbiwgdGFyZ2V0LCBwb3MsIHRoaXMuX3Bpbm5lZENvbHVtbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0YXJnZXQucGlubmVkICYmICFjb2x1bW4ucGlubmVkICYmICFjb2x1bW5QaW5TdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlb3JkZXJDb2x1bW5zKGNvbHVtbiwgdGFyZ2V0LCBwb3MsIHRoaXMuX3VucGlubmVkQ29sdW1ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb3ZlQ29sdW1ucyhjb2x1bW4sIHRhcmdldCwgcG9zKTtcbiAgICAgICAgdGhpcy5fY29sdW1uc1Jlb3JkZXJlZChjb2x1bW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYFxuICAgICAqXG4gICAgICogR29lcyB0byB0aGUgZGVzaXJlZCBwYWdlIGluZGV4LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5wYWdpbmF0ZSgxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdmFsXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcbiAgICBwdWJsaWMgcGFnaW5hdGUodmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0b3I/LnBhZ2luYXRlKHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvbiBmb3IgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YC5cbiAgICAgKiBDYWxsaW5nIG1hcmtGb3JDaGVjayBhbHNvIHRyaWdnZXJzIHRoZSBncmlkIHBpcGVzIGV4cGxpY2l0bHksIHJlc3VsdGluZyBpbiBhbGwgdXBkYXRlcyBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogTWF5IGRlZ3JhZGUgcGVyZm9ybWFuY2UgaWYgdXNlZCB3aGVuIG5vdCBuZWVkZWQsIG9yIGlmIG1pc3VzZWQ6XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIERPTidUczpcbiAgICAgKiAvLyBkb24ndCBjYWxsIG1hcmtGb3JDaGVjayBmcm9tIGluc2lkZSBhIGxvb3BcbiAgICAgKiAvLyBkb24ndCBjYWxsIG1hcmtGb3JDaGVjayB3aGVuIGEgcHJpbWl0aXZlIGhhcyBjaGFuZ2VkXG4gICAgICogZ3JpZC5kYXRhLmZvckVhY2gocmVjID0+IHtcbiAgICAgKiAgcmVjID0gbmV3VmFsdWU7XG4gICAgICogIGdyaWQubWFya0ZvckNoZWNrKCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBET3NcbiAgICAgKiAvLyBjYWxsIG1hcmtGb3JDaGVjayBhZnRlciB1cGRhdGluZyBhIG5lc3RlZCBwcm9wZXJ0eVxuICAgICAqIGdyaWQuZGF0YS5mb3JFYWNoKHJlYyA9PiB7XG4gICAgICogIHJlYy5uZXN0ZWRQcm9wMS5uZXN0ZWRQcm9wMiA9IG5ld1ZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIGdyaWQubWFya0ZvckNoZWNrKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLm1hcmtGb3JDaGVjaygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXJrRm9yQ2hlY2soKSB7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYElneEdyaWRSb3dDb21wb25lbnRgIGFuZCBhZGRzIHRoZSBkYXRhIHJlY29yZCB0byB0aGUgZW5kIG9mIHRoZSBkYXRhIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEuYWRkUm93KHJlY29yZCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUm93KGRhdGE6IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBjb21taXQgcGVuZGluZyBzdGF0ZXMgcHJpb3IgdG8gYWRkaW5nIGEgcm93XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdCh0cnVlKTtcbiAgICAgICAgdGhpcy5ncmlkQVBJLmFkZFJvd1RvRGF0YShkYXRhKTtcblxuICAgICAgICB0aGlzLnJvd0FkZGVkTm90aWZpZXIubmV4dCh7IGRhdGEgfSk7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYElneEdyaWRSb3dDb21wb25lbnRgIGFuZCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHJlY29yZCBieSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhhdCB0aGUgYHByaW1hcnlLZXlgIHByb3BlcnR5IGlzIHNldC5cbiAgICAgKiBUaGUgbWV0aG9kIGFjY2VwdCByb3dTZWxlY3RvciBhcyBhIHBhcmFtZXRlciwgd2hpY2ggaXMgdGhlIHJvd0lELlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEuZGVsZXRlUm93KDApO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVSb3cocm93U2VsZWN0b3I6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzLnByaW1hcnlLZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnByaW1hcnlLZXkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVJvd0J5SWQocm93U2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZGVsZXRlUm93QnlJZChyb3dJZDogYW55KTogYW55IHtcbiAgICAgICAgY29uc3QgYXJncyA9IHtcbiAgICAgICAgICAgIHJvd0lEOiByb3dJZCxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2UsXG4gICAgICAgICAgICByb3dEYXRhOiB0aGlzLmdldFJvd0RhdGEocm93SWQpLFxuICAgICAgICAgICAgb2xkVmFsdWU6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yb3dEZWxldGUuZW1pdChhcmdzKTtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmdyaWRBUEkuZGVsZXRlUm93QnlJZChyb3dJZCk7XG4gICAgICAgIGlmIChyZWNvcmQgIT09IG51bGwgJiYgcmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vICBUT0RPOiBzaG91bGQgd2UgZW1pdCB0aGlzIHdoZW4gY2FzY2FkZU9uRGVsZXRlIGlzIHRydWUgZm9yIGVhY2ggcm93PyE/IVxuICAgICAgICAgICAgdGhpcy5yb3dEZWxldGVkLmVtaXQoeyBkYXRhOiByZWNvcmQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmVjb3JkIGJ5IHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBgcHJpbWFyeUtleWAgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZFdpdGhQSy51cGRhdGVDZWxsKCdVcGRhdGVkJywgMSwgJ1Byb2R1Y3ROYW1lJyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgd2hpY2ggaXMgdG8gYmUgc2V0LlxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBjb3JyZXNwb25kcyB0byByb3dJRC5cbiAgICAgKiBAcGFyYW0gY29sdW1uIGNvcnJlc3BvbmRzIHRvIGNvbHVtbiBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlQ2VsbCh2YWx1ZTogYW55LCByb3dTZWxlY3RvcjogYW55LCBjb2x1bW46IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0RlZmluZWQodGhpcy5wcmltYXJ5S2V5KSkge1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKS5maW5kKGMgPT4gYy5maWVsZCA9PT0gY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW1wbGlmeVxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0Um93RGF0YShyb3dTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19pbmRleF9pbl9kYXRhKHJvd1NlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAvLyBJZiByb3cgcGFzc2VkIGlzIGludmFsaWRcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm93SUQ6IHJvd1NlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5JRDogY29sLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXhcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IG5ldyBJZ3hDZWxsKGlkLCBpbmRleCwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0sIHZhbHVlLCByb3dEYXRhLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRBUEkudXBkYXRlX2NlbGwoY2VsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgYElneEdyaWRSb3dDb21wb25lbnRgXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSByb3cgaXMgc3BlY2lmaWVkIGJ5XG4gICAgICogcm93U2VsZWN0b3IgcGFyYW1ldGVyIGFuZCB0aGUgZGF0YSBzb3VyY2UgcmVjb3JkIHdpdGggdGhlIHBhc3NlZCB2YWx1ZS5cbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFwcGx5IHJlcXVlc3RlZCB1cGRhdGUgb25seSBpZiBwcmltYXJ5IGtleSBpcyBzcGVjaWZpZWQgaW4gdGhlIGdyaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC51cGRhdGVSb3coe1xuICAgICAqICAgICAgIFByb2R1Y3RJRDogMSwgUHJvZHVjdE5hbWU6ICdTcGVhcm1pbnQnLCBJblN0b2NrOiB0cnVlLCBVbml0c0luU3RvY2s6IDEsIE9yZGVyRGF0ZTogbmV3IERhdGUoJzIwMDUtMDMtMjEnKVxuICAgICAqICAgfSwgMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbHVl4oCTXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIGNvcnJlc3BvbmQgdG8gcm93SURcbiAgICAgKi9cbiAgICAvLyBUT0RPOiBwcmV2ZW50IGV2ZW50IGludm9jYXRpb25cbiAgICBwdWJsaWMgdXBkYXRlUm93KHZhbHVlOiBhbnksIHJvd1NlbGVjdG9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZWZpbmVkKHRoaXMucHJpbWFyeUtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlQ2VsbCA9IHRoaXMuY3J1ZFNlcnZpY2UuY2VsbDtcbiAgICAgICAgICAgIGlmIChlZGl0YWJsZUNlbGwgJiYgZWRpdGFibGVDZWxsLmlkLnJvd0lEID09PSByb3dTZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kQ2VsbEVkaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IG5ldyBJZ3hFZGl0Um93KHJvd1NlbGVjdG9yLCAtMSwgdGhpcy5ncmlkQVBJLmdldFJvd0RhdGEocm93U2VsZWN0b3IpLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS51cGRhdGVfcm93KHJvdywgdmFsdWUpO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBmaXggZm9yICM1OTM0IGFuZCBwcm9iYWJseSBicmVhayBmb3IgIzU3NjNcbiAgICAgICAgICAgIC8vIGNvbnNpZGVyIGFkZGluZyBvZiB0aGlyZCBvcHRpb25hbCBib29sZWFuIHBhcmFtZXRlciBpbiB1cGRhdGVSb3cuXG4gICAgICAgICAgICAvLyBJZiBkZXZlbG9wZXIgc2V0IHRoaXMgcGFyYW1ldGVyIHRvIHRydWUgd2Ugc2hvdWxkIGNhbGwgbm90aWZ5Q2hhbmdlcyh0cnVlKSwgYW5kXG4gICAgICAgICAgICAvLyB2aXNlLXZlcnNhIGlmIGRldmVsb3BlciBzZXQgaXQgdG8gZmFsc2Ugd2Ugc2hvdWxkIGNhbGwgbm90aWZ5Q2hhbmdlcyhmYWxzZSkuXG4gICAgICAgICAgICAvLyBUaGUgcGFyYW1ldGVyIHNob3VsZCBkZWZhdWx0IHRvIGZhbHNlXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGEgdGhhdCBpcyBjb250YWluZWQgaW4gdGhlIHJvdyBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHRoZSBwcmltYXJ5IGtleSBpcyBub3Qgc3BlY2lmaWVkIHRoZSByb3cgc2VsZWN0b3IgbWF0Y2ggdGhlIHJvdyBkYXRhLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGRhdGEgPSBncmlkLmdldFJvd0RhdGEoOTQ3NDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBjb3JyZXNwb25kIHRvIHJvd0lEXG4gICAgICovXG4gICAgcHVibGljIGdldFJvd0RhdGEocm93U2VsZWN0b3I6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMucHJpbWFyeUtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1NlbGVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKHRoaXMudHJhbnNhY3Rpb25zLmVuYWJsZWQpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2luZGV4X2luX2RhdGEocm93U2VsZWN0b3IpO1xuICAgICAgICByZXR1cm4gaW5kZXggPCAwID8ge30gOiBkYXRhW2luZGV4XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0IGEgc2luZ2xlIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTb3J0IHRoZSBgSWd4R3JpZENvbXBvbmVudGAncyBgSWd4Q29sdW1uQ29tcG9uZW50YCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJyYXkgb2Ygc29ydGluZyBleHByZXNzaW9ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc29ydCh7IGZpZWxkTmFtZTogbmFtZSwgZGlyOiBTb3J0aW5nRGlyZWN0aW9uLkFzYywgaWdub3JlQ2FzZTogZmFsc2UgfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNvcnQoZXhwcmVzc2lvbjogSVNvcnRpbmdFeHByZXNzaW9uIHwgQXJyYXk8SVNvcnRpbmdFeHByZXNzaW9uPik6IHZvaWQge1xuICAgICAgICBjb25zdCBzb3J0aW5nU3RhdGUgPSBjbG9uZUFycmF5KHRoaXMuc29ydGluZ0V4cHJlc3Npb25zKTtcblxuICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVhY2ggb2YgZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGlmIChlYWNoLmRpciA9PT0gU29ydGluZ0RpcmVjdGlvbi5Ob25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5yZW1vdmVfZ3JvdXBpbmdfZXhwcmVzc2lvbihlYWNoLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5wcmVwYXJlX3NvcnRpbmdfZXhwcmVzc2lvbihbc29ydGluZ1N0YXRlXSwgZWFjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5kaXIgPT09IFNvcnRpbmdEaXJlY3Rpb24uTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5yZW1vdmVfZ3JvdXBpbmdfZXhwcmVzc2lvbihleHByZXNzaW9uLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdyaWRBUEkucHJlcGFyZV9zb3J0aW5nX2V4cHJlc3Npb24oW3NvcnRpbmdTdGF0ZV0sIGV4cHJlc3Npb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJU29ydGluZ0V2ZW50QXJncyA9IHsgb3duZXI6IHRoaXMsIHNvcnRpbmdFeHByZXNzaW9uczogc29ydGluZ1N0YXRlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuc29ydGluZy5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5zb3J0X211bHRpcGxlKGV4cHJlc3Npb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnNvcnQoZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuc29ydGluZ0RvbmUuZW1pdChleHByZXNzaW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyBhIHNpbmdsZSBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBmaWx0ZXIodGVybSkge1xuICAgICAqICAgICAgdGhpcy5ncmlkLmZpbHRlcihcIlByb2R1Y3ROYW1lXCIsIHRlcm0sIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oXCJjb250YWluc1wiKSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWVcbiAgICAgKiBAcGFyYW0gaWdub3JlQ2FzZVxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXIobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlPzogSUZpbHRlcmluZ09wZXJhdGlvbiB8IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGlnbm9yZUNhc2U/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXIobmFtZSwgdmFsdWUsIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUsIGlnbm9yZUNhc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgYWxsIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBpbiB0aGUgYElneEdyaWRDb21wb25lbnRgIHdpdGggdGhlIHNhbWUgY29uZGl0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5maWx0ZXJHbG9iYWwoJ3NvbWUnLCBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKCdjb250YWlucycpKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uXG4gICAgICogQHBhcmFtIGlnbm9yZUNhc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyR2xvYmFsKHZhbHVlOiBhbnksIGNvbmRpdGlvbiwgaWdub3JlQ2FzZT8pIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlckdsb2JhbCh2YWx1ZSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHN1bW1hcmllcyBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4gYW5kIGFwcGxpZXMgeW91ciBjdXN0b21TdW1tYXJ5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiB5b3UgZG8gbm90IHByb3ZpZGUgdGhlIGN1c3RvbVN1bW1hcnksIHRoZW4gdGhlIGRlZmF1bHQgc3VtbWFyeSBmb3IgdGhlIGNvbHVtbiBkYXRhIHR5cGUgd2lsbCBiZSBhcHBsaWVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZW5hYmxlU3VtbWFyaWVzKFt7IGZpZWxkTmFtZTogJ1Byb2R1Y3ROYW1lJyB9LCB7IGZpZWxkTmFtZTogJ0lEJyB9XSk7XG4gICAgICogYGBgXG4gICAgICogRW5hYmxlIHN1bW1hcmllcyBmb3IgdGhlIGxpc3RlZCBjb2x1bW5zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZW5hYmxlU3VtbWFyaWVzKCdQcm9kdWN0TmFtZScpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByZXN0XG4gICAgICovXG4gICAgcHVibGljIGVuYWJsZVN1bW1hcmllcyguLi5yZXN0KSB7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KHJlc3RbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLl9tdWx0aXBsZVN1bW1hcmllcyhyZXN0WzBdLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3N1bW1hcmllcyhyZXN0WzBdLCB0cnVlLCByZXN0WzFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgc3VtbWFyaWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZGlzYWJsZVN1bW1hcmllcygnUHJvZHVjdE5hbWUnKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERpc2FibGUgc3VtbWFyaWVzIGZvciB0aGUgbGlzdGVkIGNvbHVtbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5kaXNhYmxlU3VtbWFyaWVzKFt7IGZpZWxkTmFtZTogJ1Byb2R1Y3ROYW1lJyB9XSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGRpc2FibGVTdW1tYXJpZXMoLi4ucmVzdCkge1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShyZXN0WzBdKSkge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZU11bHRpcGxlU3VtbWFyaWVzKHJlc3RbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKHJlc3RbMF0sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIG5hbWUgaXMgcHJvdmlkZWQsIGNsZWFycyB0aGUgZmlsdGVyaW5nIHN0YXRlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPdGhlcndpc2UgY2xlYXJzIHRoZSBmaWx0ZXJpbmcgc3RhdGUgb2YgYWxsIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY2xlYXJGaWx0ZXIoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckZpbHRlcihuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5jbGVhckZpbHRlcihuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhcnMgdGhlIHNvcnRpbmcgc3RhdGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIG90aGVyd2lzZSBjbGVhcnMgdGhlIHNvcnRpbmcgc3RhdGUgb2YgYWxsIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jbGVhclNvcnQoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclNvcnQobmFtZT86IHN0cmluZykge1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydGluZ0V4cHJlc3Npb25zID0gW107XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmdyaWRBUEkuZ2V0X2NvbHVtbl9ieV9uYW1lKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkQVBJLmNsZWFyX3NvcnQobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVmcmVzaEdyaWRTdGF0ZShfYXJncz8pIHtcbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KHRydWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFdlIGhhdmUgcmV0dXJuIHZhbHVlcyBoZXJlLiBNb3ZlIHRoZW0gdG8gZXZlbnQgYXJncyA/P1xuXG4gICAgLyoqXG4gICAgICogUGlucyBhIGNvbHVtbiBieSBmaWVsZCBuYW1lLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5waW5Db2x1bW4oXCJJRFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uTmFtZVxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqL1xuICAgIHB1YmxpYyBwaW5Db2x1bW4oY29sdW1uTmFtZTogc3RyaW5nIHwgSWd4Q29sdW1uQ29tcG9uZW50LCBpbmRleD8pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29sID0gY29sdW1uTmFtZSBpbnN0YW5jZW9mIElneENvbHVtbkNvbXBvbmVudCA/IGNvbHVtbk5hbWUgOiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICAgICAgcmV0dXJuIGNvbC5waW4oaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucGlucyBhIGNvbHVtbiBieSBmaWVsZCBuYW1lLiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnBpbkNvbHVtbihcIklEXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHVibGljIHVucGluQ29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZyB8IElneENvbHVtbkNvbXBvbmVudCwgaW5kZXg/KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbk5hbWUgaW5zdGFuY2VvZiBJZ3hDb2x1bW5Db21wb25lbnQgPyBjb2x1bW5OYW1lIDogdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gICAgICAgIHJldHVybiBjb2wudW5waW4oaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpbiB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucGluUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSByb3cgaW4gdGhlIHBpbm5lZCBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBwaW5Sb3cocm93SUQ6IGFueSwgaW5kZXg/OiBudW1iZXIsIHJvdz86IFJvd1R5cGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX3Bpbm5lZFJlY29yZElEcy5pbmRleE9mKHJvd0lEKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSVBpblJvd0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIGluc2VydEF0SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgaXNQaW5uZWQ6IHRydWUsXG4gICAgICAgICAgICByb3dJRCxcbiAgICAgICAgICAgIHJvdyxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yb3dQaW5uaW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcblxuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IHR5cGVvZiBldmVudEFyZ3MuaW5zZXJ0QXRJbmRleCA9PT0gJ251bWJlcicgPyBldmVudEFyZ3MuaW5zZXJ0QXRJbmRleCA6IHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHJvd0lEKTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMucm93UGlubmVkLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucGluIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC51bnBpblJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdW5waW5Sb3cocm93SUQ6IGFueSwgcm93PzogUm93VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3Bpbm5lZFJlY29yZElEcy5pbmRleE9mKHJvd0lEKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSVBpblJvd0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIGlzUGlubmVkOiBmYWxzZSxcbiAgICAgICAgICAgIHJvd0lELFxuICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJvd1Bpbm5pbmcuZW1pdChldmVudEFyZ3MpO1xuXG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICB0aGlzLl9waW5uZWRSZWNvcmRJRHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMucm93UGlubmVkLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGlubmVkUm93SGVpZ2h0KCkge1xuICAgICAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLnBpbkNvbnRhaW5lciA/IHRoaXMucGluQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IDogMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGlubmVkUmVjb3JkcyA/IGNvbnRhaW5lckhlaWdodCA6IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b3RhbEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY0hlaWdodCA/IHRoaXMuY2FsY0hlaWdodCArIHRoaXMucGlubmVkUm93SGVpZ2h0IDogdGhpcy5jYWxjSGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY2FsY3VsYXRlcyBncmlkIHdpZHRoL2hlaWdodCBkaW1lbnNpb25zLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTaG91bGQgYmUgcnVuIHdoZW4gY2hhbmdpbmcgRE9NIGVsZW1lbnRzIGRpbWVudGlvbnMgbWFudWFsbHkgdGhhdCBhZmZlY3QgdGhlIGdyaWQncyBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5yZWZsb3coKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVmbG93KCkge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRTaXplcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgYSBnaXZlbiBzdHJpbmcgaW4gdGhlIGdyaWQgYW5kIHNjcm9sbHMgdG8gdGhlIGNlbGwgaWYgaXQgaXNuJ3QgdmlzaWJsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBob3cgbWFueSB0aW1lcyB0aGUgZ3JpZCBjb250YWlucyB0aGUgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5maW5kTmV4dChcImZpbmFuY2lhbFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gY2FzZVNlbnNpdGl2ZSBvcHRpb25hbGx5LCBpZiB0aGUgc2VhcmNoIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZSAoZGVmYXVsdHMgdG8gZmFsc2UpLlxuICAgICAqIEBwYXJhbSBleGFjdE1hdGNoIG9wdGlvbmFsbHksIGlmIHRoZSB0ZXh0IHNob3VsZCBtYXRjaCB0aGUgZW50aXJlIHZhbHVlICAoZGVmYXVsdHMgdG8gZmFsc2UpLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kTmV4dCh0ZXh0OiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmQodGV4dCwgMSwgY2FzZVNlbnNpdGl2ZSwgZXhhY3RNYXRjaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIHByZXZpb3VzIG9jY3VycmVuY2Ugb2YgYSBnaXZlbiBzdHJpbmcgaW4gdGhlIGdyaWQgYW5kIHNjcm9sbHMgdG8gdGhlIGNlbGwgaWYgaXQgaXNuJ3QgdmlzaWJsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBob3cgbWFueSB0aW1lcyB0aGUgZ3JpZCBjb250YWlucyB0aGUgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5maW5kUHJldihcImZpbmFuY2lhbFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gY2FzZVNlbnNpdGl2ZSBvcHRpb25hbGx5LCBpZiB0aGUgc2VhcmNoIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZSAoZGVmYXVsdHMgdG8gZmFsc2UpLlxuICAgICAqIEBwYXJhbSBleGFjdE1hdGNoIG9wdGlvbmFsbHksIGlmIHRoZSB0ZXh0IHNob3VsZCBtYXRjaCB0aGUgZW50aXJlIHZhbHVlIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICovXG4gICAgcHVibGljIGZpbmRQcmV2KHRleHQ6IHN0cmluZywgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sIGV4YWN0TWF0Y2g/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZCh0ZXh0LCAtMSwgY2FzZVNlbnNpdGl2ZSwgZXhhY3RNYXRjaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhcHBsaWVzIHRoZSBleGlzdGluZyBzZWFyY2guXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGdyaWQgY29udGFpbnMgdGhlIGxhc3Qgc2VhcmNoLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5yZWZyZXNoU2VhcmNoKCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHVwZGF0ZUFjdGl2ZUluZm9cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVmcmVzaFNlYXJjaCh1cGRhdGVBY3RpdmVJbmZvPzogYm9vbGVhbiwgZW5kRWRpdCA9IHRydWUpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5zZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRNYXRjaENhY2hlKCk7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVBY3RpdmVJbmZvKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlSW5mbyA9IElneFRleHRIaWdobGlnaHREaXJlY3RpdmUuaGlnaGxpZ2h0R3JvdXBzTWFwLmdldCh0aGlzLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmZvckVhY2goKG1hdGNoLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5jb2x1bW4gPT09IGFjdGl2ZUluZm8uY29sdW1uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5yb3cgPT09IGFjdGl2ZUluZm8ucm93ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5pbmRleCA9PT0gYWN0aXZlSW5mby5pbmRleCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hcHMobWF0Y2gubWV0YWRhdGEsIGFjdGl2ZUluZm8ubWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmQodGhpcy5sYXN0U2VhcmNoSW5mby5zZWFyY2hUZXh0LFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5jYXNlU2Vuc2l0aXZlLFxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uZXhhY3RNYXRjaCxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbmRFZGl0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgdGhlIGhpZ2hsaWdodHMgaW4gdGhlIGNlbGwuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY2xlYXJTZWFyY2goKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJTZWFyY2goKSB7XG4gICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8gPSB7XG4gICAgICAgICAgICBzZWFyY2hUZXh0OiAnJyxcbiAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICAgICAgICAgICAgZXhhY3RNYXRjaDogZmFsc2UsXG4gICAgICAgICAgICBhY3RpdmVNYXRjaEluZGV4OiAwLFxuICAgICAgICAgICAgbWF0Y2hJbmZvQ2FjaGU6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yb3dMaXN0LmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgICAgaWYgKHJvdy5jZWxscykge1xuICAgICAgICAgICAgICAgIHJvdy5jZWxscy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBzb3J0YWJsZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc29ydGFibGVHcmlkID0gdGhpcy5ncmlkLmhhc1NvcnRhYmxlQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1NvcnRhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdC5zb21lKChjb2wpID0+IGNvbC5zb3J0YWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBlZGl0YWJsZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZWRpdGFibGVHcmlkID0gdGhpcy5ncmlkLmhhc0VkaXRhYmxlQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0VkaXRhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdC5zb21lKChjb2wpID0+IGNvbC5lZGl0YWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBmaWx0ZXJhYmxlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmaWx0ZXJhYmxlR3JpZCA9IHRoaXMuZ3JpZC5oYXNGaWx0ZXJhYmxlQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0ZpbHRlcmFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LnNvbWUoKGNvbCkgPT4gY29sLmZpbHRlcmFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgc3VtbWFyaXplZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc3VtbWFyaXplZEdyaWQgPSB0aGlzLmdyaWQuaGFzU3VtbWFyaXplZENvbHVtbnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNTdW1tYXJpemVkQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VtbWFyeVNlcnZpY2UuaGFzU3VtbWFyaXplZENvbHVtbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvb3RTdW1tYXJpZXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlICE9PSBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZS5jaGlsZExldmVsc09ubHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1Zpc2libGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5faGFzVmlzaWJsZUNvbHVtbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdCA/IHRoaXMuY29sdW1uTGlzdC5zb21lKGMgPT4gIWMuaGlkZGVuKSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNWaXNpYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhhc1Zpc2libGVDb2x1bW5zKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2hhc1Zpc2libGVDb2x1bW5zID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgbW92ZWFibGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG1vdmFibGVHcmlkID0gdGhpcy5ncmlkLmhhc01vdmFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzTW92YWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3QgJiYgdGhpcy5jb2x1bW5MaXN0LnNvbWUoKGNvbCkgPT4gY29sLm1vdmFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgY29sdW1uIGdyb3Vwcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyb3VwR3JpZCA9IHRoaXMuZ3JpZC5oYXNDb2x1bW5Hcm91cHM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNDb2x1bW5Hcm91cHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5Hcm91cHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgY29sdW1uIGxheW91dHMgZm9yIG11bHRpLXJvdyBsYXlvdXQgZGVmaW5pdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGxheW91dEdyaWQgPSB0aGlzLmdyaWQuaGFzQ29sdW1uTGF5b3V0cztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0NvbHVtbkxheW91dHMoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuY29sdW1uTGlzdC5zb21lKGNvbCA9PiBjb2wuY29sdW1uTGF5b3V0KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBtdWx0aVJvd0xheW91dFJvd1NpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tdWx0aVJvd0xheW91dFJvd1NpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgcm93QmFzZWRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFMZW5ndGggKiB0aGlzLnJvd0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBpc1BlcmNlbnRXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggJiYgdGhpcy53aWR0aC5pbmRleE9mKCclJykgIT09IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1BlcmNlbnRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQgJiYgdGhpcy5faGVpZ2h0LmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdFRhcmdldEJvZHlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgYWxsSXRlbXMgPSB0aGlzLmRhdGFMZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogTWF0aC5taW4odGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcixcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yID8gTWF0aC5taW4oYWxsSXRlbXMsIHRoaXMucGFnaW5hdG9yLnBlclBhZ2UpIDogYWxsSXRlbXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVGhlIHJvd0hlaWdodCBpbnB1dCBpcyBib3VuZCB0byBtaW4taGVpZ2h0IGNzcyBwcm9wIG9mIHJvd3MgdGhhdCBhZGRzIGEgMXB4IGJvcmRlciBpbiBhbGwgY2FzZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlbmRlcmVkUm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0hlaWdodCArIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG91dGVyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkgPyB0aGlzLmNhbGNXaWR0aCArIHRoaXMuc2Nyb2xsU2l6ZSA6IHRoaXMuY2FsY1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogR2V0cyB0aGUgdmlzaWJsZSBjb250ZW50IGhlaWdodCB0aGF0IGluY2x1ZGVzIGhlYWRlciArIHRib2R5ICsgZm9vdGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWaXNpYmxlQ29udGVudEhlaWdodCgpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMudGhlYWRSb3cubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgKyB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy5oYXNTdW1tYXJpemVkQ29sdW1ucykge1xuICAgICAgICAgICAgaGVpZ2h0ICs9IHRoaXMudGZvb3QubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQb3NzaWJsZUNvbHVtbldpZHRoKGJhc2VXaWR0aDogbnVtYmVyID0gbnVsbCkge1xuICAgICAgICBsZXQgY29tcHV0ZWRXaWR0aDtcbiAgICAgICAgaWYgKGJhc2VXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcHV0ZWRXaWR0aCA9IGJhc2VXaWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggPSB0aGlzLmNhbGNXaWR0aCB8fFxuICAgICAgICAgICAgICAgIHBhcnNlSW50KHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyksIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXB1dGVkV2lkdGggLT0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG5cbiAgICAgICAgY29uc3QgdmlzaWJsZUNoaWxkQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXApO1xuXG5cbiAgICAgICAgLy8gQ29sdW1uIGxheW91dHMgcmVsYXRlZFxuICAgICAgICBsZXQgdmlzaWJsZUNvbHMgPSBbXTtcbiAgICAgICAgY29uc3QgY29sdW1uQmxvY2tzID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgY29uc3QgY29sc1BlckJsb2NrID0gY29sdW1uQmxvY2tzLm1hcChibG9jayA9PiBibG9jay5nZXRJbml0aWFsQ2hpbGRDb2x1bW5TaXplcyhibG9jay5jaGlsZHJlbikpO1xuICAgICAgICBjb25zdCBjb21iaW5lZEJsb2Nrc1NpemUgPSBjb2xzUGVyQmxvY2sucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyArIGl0ZW0ubGVuZ3RoLCAwKTtcbiAgICAgICAgY29sc1BlckJsb2NrLmZvckVhY2goYmxvY2tDb2xzID0+IHZpc2libGVDb2xzID0gdmlzaWJsZUNvbHMuY29uY2F0KGJsb2NrQ29scykpO1xuICAgICAgICAvL1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbnNXaXRoU2V0V2lkdGhzID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIHZpc2libGVDb2xzLmZpbHRlcihjID0+IGMud2lkdGhTZXRCeVVzZXIpIDpcbiAgICAgICAgICAgIHZpc2libGVDaGlsZENvbHVtbnMuZmlsdGVyKGMgPT4gYy53aWR0aFNldEJ5VXNlcik7XG5cbiAgICAgICAgY29uc3QgY29sdW1uc1RvU2l6ZSA9IHRoaXMuaGFzQ29sdW1uTGF5b3V0cyA/XG4gICAgICAgICAgICBjb21iaW5lZEJsb2Nrc1NpemUgLSBjb2x1bW5zV2l0aFNldFdpZHRocy5sZW5ndGggOlxuICAgICAgICAgICAgdmlzaWJsZUNoaWxkQ29sdW1ucy5sZW5ndGggLSBjb2x1bW5zV2l0aFNldFdpZHRocy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHN1bUV4aXN0aW5nV2lkdGhzID0gY29sdW1uc1dpdGhTZXRXaWR0aHNcbiAgICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xXaWR0aCA9IGN1cnIud2lkdGg7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGhWYWx1ZSA9IHBhcnNlSW50KGNvbFdpZHRoLCAxMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycldpZHRoID0gY29sV2lkdGggJiYgdHlwZW9mIGNvbFdpZHRoID09PSAnc3RyaW5nJyAmJiBjb2xXaWR0aC5pbmRleE9mKCclJykgIT09IC0xID9cbiAgICAgICAgICAgICAgICAgICAgd2lkdGhWYWx1ZSAvIDEwMCAqIGNvbXB1dGVkV2lkdGggOlxuICAgICAgICAgICAgICAgICAgICB3aWR0aFZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgY3VycldpZHRoO1xuICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiBhbGwgY29sdW1ucyBhcmUgaGlkZGVuLCByZXR1cm4gMHB4IHdpZHRoXG4gICAgICAgIGlmICghc3VtRXhpc3RpbmdXaWR0aHMgJiYgIWNvbHVtbnNUb1NpemUpIHtcbiAgICAgICAgICAgIHJldHVybiAnMHB4JztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gTWF0aC5mbG9vcighTnVtYmVyLmlzRmluaXRlKHN1bUV4aXN0aW5nV2lkdGhzKSA/XG4gICAgICAgICAgICBNYXRoLm1heChjb21wdXRlZFdpZHRoIC8gY29sdW1uc1RvU2l6ZSwgTUlOSU1VTV9DT0xVTU5fV0lEVEgpIDpcbiAgICAgICAgICAgIE1hdGgubWF4KChjb21wdXRlZFdpZHRoIC0gc3VtRXhpc3RpbmdXaWR0aHMpIC8gY29sdW1uc1RvU2l6ZSwgTUlOSU1VTV9DT0xVTU5fV0lEVEgpKTtcblxuICAgICAgICByZXR1cm4gY29sdW1uV2lkdGggKyAncHgnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhc1ZlcnRpY2FsU2Nyb2xsKCkge1xuICAgICAgICBpZiAodGhpcy5faW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzU2Nyb2xsYWJsZSA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIgPyB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmlzU2Nyb2xsYWJsZSgpIDogZmFsc2U7XG4gICAgICAgIHJldHVybiAhISh0aGlzLmNhbGNXaWR0aCAmJiB0aGlzLmRhdGFWaWV3ICYmIHRoaXMuZGF0YVZpZXcubGVuZ3RoID4gMCAmJiBpc1Njcm9sbGFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgY2FsY3VsYXRlZCB3aWR0aCBvZiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRXaWR0aCA9IHRoaXMuZ3JpZC5nZXRQaW5uZWRXaWR0aCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0YWtlSGlkZGVuIElmIHdlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCB0aGUgaGlkZGVuIGNvbHVtbnMgaW4gdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQaW5uZWRXaWR0aCh0YWtlSGlkZGVuID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZmMgPSB0YWtlSGlkZGVuID8gdGhpcy5fcGlubmVkQ29sdW1ucyA6IHRoaXMucGlubmVkQ29sdW1ucztcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGZjKSB7XG4gICAgICAgICAgICBpZiAoY29sLmxldmVsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3VtICs9IHBhcnNlSW50KGNvbC5jYWxjV2lkdGgsIDEwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1Bpbm5pbmdUb1N0YXJ0KSB7XG4gICAgICAgICAgICBzdW0gKz0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzQ29sdW1uR3JvdXBlZChfZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVE9ETzogUkVNT1ZFXG4gICAgICovXG4gICAgcHVibGljIG9uSGVhZGVyU2VsZWN0b3JDbGljayhldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aVJvd1NlbGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFyZUFsbFJvd1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhclJvd1NlbGVjdGlvbihldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0QWxsUm93cyhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZFNlbGVjdG9yQmFzZUFyaWFMYWJlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFyZUFsbFJvd1NlbGVjdGVkKCkgPyAnRGVzZWxlY3QgYWxsIGZpbHRlcmVkJyA6ICdTZWxlY3QgYWxsIGZpbHRlcmVkJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSA/ICdEZXNlbGVjdCBhbGwnIDogJ1NlbGVjdCBhbGwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsUm93c0NvdW50QWZ0ZXJGaWx0ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYWxsRGF0YS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgdHJhbnNmb3JtZWQgcGFnZWQvZmlsdGVyZWQvc29ydGVkL2dyb3VwZWQgcGlubmVkIHJvdyBkYXRhLCBkaXNwbGF5ZWQgaW4gdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgICAgIGNvbnN0IHBpbm5lZERhdGFWaWV3ID0gdGhpcy5ncmlkLnBpbm5lZERhdGFWaWV3O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkRGF0YVZpZXcoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uZWRSZWNvcmRzID8gdGhpcy5waW5uZWRSZWNvcmRzIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjdXJyZW50bHkgdHJhbnNmb3JtZWQgcGFnZWQvZmlsdGVyZWQvc29ydGVkL2dyb3VwZWQgdW5waW5uZWQgcm93IGRhdGEsIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAgICAgY29uc3QgcGlubmVkRGF0YVZpZXcgPSB0aGlzLmdyaWQucGlubmVkRGF0YVZpZXc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1bnBpbm5lZERhdGFWaWV3KCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudW5waW5uZWRSZWNvcmRzID8gdGhpcy51bnBpbm5lZFJlY29yZHMgOiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmlneEZvck9mIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZC9waW5uZWQvdW5waW5uZWQgcm93IGRhdGEsIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAgICAgY29uc3QgZGF0YVZpZXcgPSB0aGlzLmdyaWQuZGF0YVZpZXc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhVmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFWaWV3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIGNsaWNraW5nIG92ZXIgYSByb3cgc2hvdWxkIHNlbGVjdC9kZXNlbGVjdCBpdFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byB0cnVlXG4gICAgICogQHBhcmFtIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc2VsZWN0Um93T25DbGljaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdFJvd09uQ2xpY2s7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzZWxlY3RSb3dPbkNsaWNrKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0Um93T25DbGljayA9IGVuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHNwZWNpZmllZCByb3dzIGJ5IElELlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdFJvd3MoWzEsMiw1XSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEc1xuICAgICAqIEBwYXJhbSBjbGVhckN1cnJlbnRTZWxlY3Rpb24gaWYgdHJ1ZSBjbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdFJvd3Mocm93SURzOiBhbnlbXSwgY2xlYXJDdXJyZW50U2VsZWN0aW9uPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEcywgY2xlYXJDdXJyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3Qgc3BlY2lmaWVkIHJvd3MgYnkgSUQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RSb3dzKFsxLDIsNV0pO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRHNcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RSb3dzKHJvd0lEczogYW55W10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEcyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgYWxsIHJvd3NcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpZiBmaWx0ZXJpbmcgaXMgaW4gcGxhY2UsIHNlbGVjdEFsbFJvd3MoKSBhbmQgZGVzZWxlY3RBbGxSb3dzKCkgc2VsZWN0L2Rlc2VsZWN0IGFsbCBmaWx0ZXJlZCByb3dzLlxuICAgICAqIElmIHlvdSBzZXQgdGhlIHBhcmFtZXRlciBvbmx5RmlsdGVyRGF0YSB0byBmYWxzZSB0aGF0IHdpbGwgc2VsZWN0IGFsbCByb3dzIGluIHRoZSBncmlkIGV4ZXB0IGRlbGV0ZWQgcm93cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc2VsZWN0QWxsUm93cygpO1xuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RBbGxSb3dzKGZhbHNlKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb25seUZpbHRlckRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsUm93cyhvbmx5RmlsdGVyRGF0YSA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG9ubHlGaWx0ZXJEYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhID8gdGhpcy5maWx0ZXJlZERhdGEgOiB0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKHRydWUpO1xuICAgICAgICBjb25zdCByb3dJRHMgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0Um93SURzKGRhdGEpLmZpbHRlcihySUQgPT4gIXRoaXMuZ3JpZEFQSS5yb3dfZGVsZXRlZF90cmFuc2FjdGlvbihySUQpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzKHJvd0lEcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3RzIGFsbCByb3dzXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaWYgZmlsdGVyaW5nIGlzIGluIHBsYWNlLCBzZWxlY3RBbGxSb3dzKCkgYW5kIGRlc2VsZWN0QWxsUm93cygpIHNlbGVjdC9kZXNlbGVjdCBhbGwgZmlsdGVyZWQgcm93cy5cbiAgICAgKiBJZiB5b3Ugc2V0IHRoZSBwYXJhbWV0ZXIgb25seUZpbHRlckRhdGEgdG8gZmFsc2UgdGhhdCB3aWxsIGRlc2VsZWN0IGFsbCByb3dzIGluIHRoZSBncmlkIGV4ZXB0IGRlbGV0ZWQgcm93cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxSb3dzKCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9ubHlGaWx0ZXJEYXRhXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0QWxsUm93cyhvbmx5RmlsdGVyRGF0YSA9IHRydWUpIHtcbiAgICAgICAgaWYgKG9ubHlGaWx0ZXJEYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RSb3dzKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRSb3dJRHModGhpcy5maWx0ZXJlZERhdGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckNlbGxTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhZ1Njcm9sbChkZWx0YTogeyBsZWZ0OiBudW1iZXI7IHRvcDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbCA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLmdldFNjcm9sbCgpO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsKCk7XG4gICAgICAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSBkZWx0YTtcblxuICAgICAgICBob3Jpem9udGFsLnNjcm9sbExlZnQgKz0gbGVmdCAqIHRoaXMuRFJBR19TQ1JPTExfREVMVEE7XG4gICAgICAgIHZlcnRpY2FsLnNjcm9sbFRvcCArPSB0b3AgKiB0aGlzLkRSQUdfU0NST0xMX0RFTFRBO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGVmaW5lZChhcmc6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gYXJnICE9PSB1bmRlZmluZWQgJiYgYXJnICE9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdFJhbmdlKGFyZzogR3JpZFNlbGVjdGlvblJhbmdlIHwgR3JpZFNlbGVjdGlvblJhbmdlW10gfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0RlZmluZWQoYXJnKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckNlbGxTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGFyZy5mb3JFYWNoKHJhbmdlID0+IHRoaXMuc2V0U2VsZWN0aW9uKHJhbmdlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihhcmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbHVtblRvVmlzaWJsZUluZGV4KGZpZWxkOiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnM7XG4gICAgICAgIGlmICh0eXBlb2YgZmllbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpc2libGVDb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5maWVsZCA9PT0gZmllbGQpLnZpc2libGVJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxlY3Rpb24ocmFuZ2U6IEdyaWRTZWxlY3Rpb25SYW5nZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydE5vZGUgPSB7IHJvdzogcmFuZ2Uucm93U3RhcnQsIGNvbHVtbjogdGhpcy5jb2x1bW5Ub1Zpc2libGVJbmRleChyYW5nZS5jb2x1bW5TdGFydCkgfTtcbiAgICAgICAgY29uc3QgZW5kTm9kZSA9IHsgcm93OiByYW5nZS5yb3dFbmQsIGNvbHVtbjogdGhpcy5jb2x1bW5Ub1Zpc2libGVJbmRleChyYW5nZS5jb2x1bW5FbmQpIH07XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnBvaW50ZXJTdGF0ZS5ub2RlID0gc3RhcnROb2RlO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0UmFuZ2UoZW5kTm9kZSwgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnBvaW50ZXJTdGF0ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hZGRSYW5nZU1ldGEoZW5kTm9kZSwgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnBvaW50ZXJTdGF0ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5pbml0UG9pbnRlclN0YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWRSYW5nZXMoKTogR3JpZFNlbGVjdGlvblJhbmdlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnJhbmdlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgY2VsbCBzZWxlY3Rpb24gaW4gdGhlIGZvcm0gb2YgYFt7IGNvbHVtbi5maWVsZDogY2VsbC52YWx1ZSB9LCAuLi5dYC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgYGZvcm1hdHRlcnNgIGlzIGVuYWJsZWQsIHRoZSBjZWxsIHZhbHVlIHdpbGwgYmUgZm9ybWF0dGVkIGJ5IGl0cyByZXNwZWN0aXZlIGNvbHVtbiBmb3JtYXR0ZXIgKGlmIGFueSkuXG4gICAgICogSWYgYGhlYWRlcnNgIGlzIGVuYWJsZWQsIGl0IHdpbGwgdXNlIHRoZSBjb2x1bW4gaGVhZGVyIChpZiBhbnkpIGluc3RlYWQgb2YgdGhlIGNvbHVtbiBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWREYXRhKGZvcm1hdHRlcnMgPSBmYWxzZSwgaGVhZGVycyA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YUZyb21TZWxlY3Rpb24oc291cmNlLCBmb3JtYXR0ZXJzLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBzZWxlY3RlZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggc2VsZWN0ZWQgY29sdW1uc1xuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSB0aGlzLmdyaWQuc2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5tYXAoZmllbGQgPT4gdGhpcy5nZXRDb2x1bW5CeU5hbWUoZmllbGQpKS5maWx0ZXIoZmllbGQgPT4gZmllbGQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBzcGVjaWZpZWQgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RDb2x1bW5zKFsnSUQnLCdOYW1lJ10sIHRydWUpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb2x1bW5zXG4gICAgICogQHBhcmFtIGNsZWFyQ3VycmVudFNlbGVjdGlvbiBpZiB0cnVlIGNsZWFycyB0aGUgY3VycmVudCBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0Q29sdW1ucyhjb2x1bW5zOiBzdHJpbmdbXSB8IElneENvbHVtbkNvbXBvbmVudFtdLCBjbGVhckN1cnJlbnRTZWxlY3Rpb24/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBmaWVsZFRvU2VsZWN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNvbHVtbnNbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmaWVsZFRvU2VsZWN0ID0gY29sdW1ucyBhcyBzdHJpbmdbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIChjb2x1bW5zIGFzIElneENvbHVtbkNvbXBvbmVudFtdKS5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbC5hbGxDaGlsZHJlbi5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCkubWFwKGMgPT4gYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QgPSBbLi4uZmllbGRUb1NlbGVjdCwgLi4uY2hpbGRyZW5dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QucHVzaChjb2wuZmllbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChmaWVsZFRvU2VsZWN0LCBjbGVhckN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCBzcGVjaWZpZWQgY29sdW1ucyBieSBmaWxlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5kZXNlbGVjdENvbHVtbnMoWydJRCcsJ05hbWUnXSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RDb2x1bW5zKGNvbHVtbnM6IHN0cmluZ1tdIHwgSWd4Q29sdW1uQ29tcG9uZW50W10pIHtcbiAgICAgICAgbGV0IGZpZWxkVG9EZXNlbGVjdDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiBjb2x1bW5zWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZmllbGRUb0Rlc2VsZWN0ID0gY29sdW1ucyBhcyBzdHJpbmdbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIChjb2x1bW5zIGFzIElneENvbHVtbkNvbXBvbmVudFtdKS5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbC5hbGxDaGlsZHJlbi5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCkubWFwKGMgPT4gYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9EZXNlbGVjdCA9IFsuLi5maWVsZFRvRGVzZWxlY3QsIC4uLmNoaWxkcmVuXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFRvRGVzZWxlY3QucHVzaChjb2wuZmllbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChmaWVsZFRvRGVzZWxlY3QpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdHMgYWxsIGNvbHVtbnNcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5kZXNlbGVjdEFsbENvbHVtbnMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RBbGxDb2x1bW5zKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJBbGxTZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0cyBhbGwgY29sdW1uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0QWxsQ29sdW1ucygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxDb2x1bW5zKCkge1xuICAgICAgICB0aGlzLnNlbGVjdENvbHVtbnModGhpcy5jb2x1bW5MaXN0LmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IGNvbHVtbnMgc2VsZWN0aW9uIGluIHRoZSBmb3JtIG9mIGBbeyBjb2x1bW4uZmllbGQ6IGNlbGwudmFsdWUgfSwgLi4uXWAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIGBmb3JtYXR0ZXJzYCBpcyBlbmFibGVkLCB0aGUgY2VsbCB2YWx1ZSB3aWxsIGJlIGZvcm1hdHRlZCBieSBpdHMgcmVzcGVjdGl2ZSBjb2x1bW4gZm9ybWF0dGVyIChpZiBhbnkpLlxuICAgICAqIElmIGBoZWFkZXJzYCBpcyBlbmFibGVkLCBpdCB3aWxsIHVzZSB0aGUgY29sdW1uIGhlYWRlciAoaWYgYW55KSBpbnN0ZWFkIG9mIHRoZSBjb2x1bW4gZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkQ29sdW1uc0RhdGEoZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGEgPyB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YSA6IHRoaXMuZGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFGcm9tQ29sdW1uc1NlbGVjdGlvbihzb3VyY2UsIGZvcm1hdHRlcnMsIGhlYWRlcnMpO1xuICAgIH1cblxuXG4gICAgcHVibGljIGNvbWJpbmVTZWxlY3RlZENlbGxBbmRDb2x1bW5EYXRhKGNvbHVtbkRhdGE6IGFueVtdLCBmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFGcm9tU2VsZWN0aW9uKHNvdXJjZSwgZm9ybWF0dGVycywgaGVhZGVycywgY29sdW1uRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmVudENvbnRhaW5lclNjcm9sbCA9IChldnQpID0+IHtcbiAgICAgICAgaWYgKGV2dC50YXJnZXQuc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmFkZFNjcm9sbFRvcChldnQudGFyZ2V0LnNjcm9sbFRvcCk7XG4gICAgICAgICAgICBldnQudGFyZ2V0LnNjcm9sbFRvcCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2dC50YXJnZXQuc2Nyb2xsTGVmdCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIuc2Nyb2xsUG9zaXRpb24gKz0gZXZ0LnRhcmdldC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgZXZ0LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvcHlIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuZ3JpZEFQSS5ncmlkLnNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICBjb25zdCBjb2x1bW5EYXRhID0gdGhpcy5nZXRTZWxlY3RlZENvbHVtbnNEYXRhKHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5Rm9ybWF0dGVycywgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjb3B5Jykge1xuICAgICAgICAgICAgc2VsZWN0ZWREYXRhID0gdGhpcy5nZXRTZWxlY3RlZERhdGEodGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBkYXRhID0gW107XG4gICAgICAgIGxldCByZXN1bHQ7XG5cbiAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdLZXlDJyAmJiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5jdXJyZW50VGFyZ2V0LmNsYXNzTmFtZSA9PT0gJ2lneC1ncmlkLXRoZWFkX193cmFwcGVyJykge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIHNlbGVjdGVkRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuY29tYmluZVNlbGVjdGVkQ2VsbEFuZENvbHVtbkRhdGEoY29sdW1uRGF0YSwgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGFbMF0sIGRhdGFbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGNvbHVtbkRhdGE7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0lFKSB7XG4gICAgICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpLmNsaXBib2FyZERhdGEuc2V0RGF0YSgnVGV4dCcsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQocmVzdWx0KS50aGVuKCkuY2F0Y2goZSA9PiBjb25zb2xlLmVycm9yKGUpKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5jbGlwYm9hcmRPcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5jcnVkU2VydmljZS5jZWxsSW5FZGl0TW9kZSB8fCAoIXRoaXMucGxhdGZvcm0uaXNJRSAmJiBldmVudC50eXBlID09PSAna2V5ZG93bicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmNvbWJpbmVTZWxlY3RlZENlbGxBbmRDb2x1bW5EYXRhKGNvbHVtbkRhdGEsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5Rm9ybWF0dGVycyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YVswXSwgZGF0YVsxXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxlY3RlZERhdGE7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0lFKSB7XG4gICAgICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpLmNsaXBib2FyZERhdGEuc2V0RGF0YSgnVGV4dCcsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnQuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCd0ZXh0L3BsYWluJywgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YSwga2V5cz8pIHtcbiAgICAgICAgY29uc3QgZXYgPSB7IGRhdGEsIGNhbmNlbDogZmFsc2UgfSBhcyBJR3JpZENsaXBib2FyZEV2ZW50O1xuICAgICAgICB0aGlzLmdyaWRDb3B5LmVtaXQoZXYpO1xuXG4gICAgICAgIGlmIChldi5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gbmV3IENoYXJTZXBhcmF0ZWRWYWx1ZURhdGEoZXYuZGF0YSwgdGhpcy5jbGlwYm9hcmRPcHRpb25zLnNlcGFyYXRvcik7XG4gICAgICAgIGxldCByZXN1bHQgPSBrZXlzID8gdHJhbnNmb3JtZXIucHJlcGFyZURhdGEoa2V5cykgOiB0cmFuc2Zvcm1lci5wcmVwYXJlRGF0YSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKHJlc3VsdC5pbmRleE9mKCdcXG4nKSArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMoZGF0YVswXSkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgLTIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAvKiBOZWNlc3NhcnkgZm9yIHRoZSBoaWVhcmFjaGljYWwgY2FzZSBidXQgd2lsbCBwcm9iYWJseSBoYXZlIHRvXG4gICAgICAgICAgIGNoYW5nZSBob3cgZ2V0U2VsZWN0ZWREYXRhIGlzIHByb3BhZ2F0ZWQgaW4gdGhlIGhpZWFyYWNoaWNhbCBncmlkXG4gICAgICAgICovXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvd1NuYWNrYmFyRm9yKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhci5hY3Rpb25UZXh0ID0gaW5kZXggPT09IC0xID8gJycgOiB0aGlzLnNuYWNrYmFyQWN0aW9uVGV4dDtcbiAgICAgICAgdGhpcy5sYXN0QWRkZWRSb3dJbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmFkZFJvd1NuYWNrYmFyLm9wZW4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gYSBwb3NpdGlvbiBpbiB0aGUgZ3JpZCBiYXNlZCBvbiBwcm92aWRlZCBgcm93aW5kZXhgIGFuZCBgdmlzaWJsZUNvbHVtbkluZGV4YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQWxzbyBjYW4gZXhlY3V0ZSBhIGN1c3RvbSBsb2dpYyBvdmVyIHRoZSB0YXJnZXQgZWxlbWVudCxcbiAgICAgKiB0aHJvdWdoIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHsgdGFyZ2V0VHlwZTogR3JpZEtleWRvd25UYXJnZXRUeXBlLCB0YXJnZXQ6IE9iamVjdCB9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIHRoaXMuZ3JpZC5uYXZpZ2F0ZVRvKDEwLCAzLCAoYXJncykgPT4geyBhcmdzLnRhcmdldC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7IH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBuYXZpZ2F0ZVRvKHJvd0luZGV4OiBudW1iZXIsIHZpc2libGVDb2xJbmRleCA9IC0xLCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9ICh0aGlzIGFzIGFueSkudG90YWxJdGVtQ291bnQgPz8gdGhpcy5kYXRhVmlldy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAocm93SW5kZXggPCAwIHx8IHJvd0luZGV4ID4gdG90YWxJdGVtcyB8fCAodmlzaWJsZUNvbEluZGV4ICE9PSAtMVxuICAgICAgICAgICAgJiYgdGhpcy5jb2x1bW5MaXN0Lm1hcChjb2wgPT4gY29sLnZpc2libGVJbmRleCkuaW5kZXhPZih2aXNpYmxlQ29sSW5kZXgpID09PSAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5zbGljZShyb3dJbmRleCwgcm93SW5kZXggKyAxKS5maW5kKHJlYyA9PiByZWMuZXhwcmVzc2lvbiB8fCByZWMuY2hpbGRHcmlkc0RhdGEpKSB7XG4gICAgICAgICAgICB2aXNpYmxlQ29sSW5kZXggPSAtMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IHJvdyBpcyBwaW5uZWQgbm8gbmVlZCB0byBzY3JvbGwgYXMgd2VsbC5cbiAgICAgICAgY29uc3Qgc2hvdWxkU2Nyb2xsVmVydGljYWxseSA9IHRoaXMubmF2aWdhdGlvbi5zaG91bGRQZXJmb3JtVmVydGljYWxTY3JvbGwocm93SW5kZXgsIHZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGNvbnN0IHNob3VsZFNjcm9sbEhvcml6b250YWxseSA9IHRoaXMubmF2aWdhdGlvbi5zaG91bGRQZXJmb3JtSG9yaXpvbnRhbFNjcm9sbCh2aXNpYmxlQ29sSW5kZXgsIHJvd0luZGV4KTtcbiAgICAgICAgaWYgKHNob3VsZFNjcm9sbFZlcnRpY2FsbHkpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtVmVydGljYWxTY3JvbGxUb0NlbGwocm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTY3JvbGxIb3Jpem9udGFsbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnBlcmZvcm1Ib3Jpem9udGFsU2Nyb2xsVG9DZWxsKHZpc2libGVDb2xJbmRleCwgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNob3VsZFNjcm9sbEhvcml6b250YWxseSkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnBlcmZvcm1Ib3Jpem9udGFsU2Nyb2xsVG9DZWxsKHZpc2libGVDb2xJbmRleCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTY3JvbGxWZXJ0aWNhbGx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtVmVydGljYWxTY3JvbGxUb0NlbGwocm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgSUNlbGxQb3NpdGlvbmAgd2hpY2ggZGVmaW5lcyB0aGUgbmV4dCBjZWxsLFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwb3NpdGlvbiwgdGhhdCBtYXRjaCBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogWW91IGNhbiBwYXNzIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGEgdGhpcmQgcGFyYW1ldGVyIG9mIGBnZXRQcmV2aW91c0NlbGxgIG1ldGhvZC5cbiAgICAgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gYWNjZXB0cyBJZ3hDb2x1bW5Db21wb25lbnQgYXMgYSBwYXJhbVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBuZXh0RWRpdGFibGVDZWxsUG9zaXRpb24gPSB0aGlzLmdyaWQuZ2V0TmV4dENlbGwoMCwgMywgKGNvbHVtbikgPT4gY29sdW1uLmVkaXRhYmxlKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmV4dENlbGwoY3VyclJvd0luZGV4OiBudW1iZXIsIGN1clZpc2libGVDb2xJbmRleDogbnVtYmVyLFxuICAgICAgICBjYWxsYmFjazogKElneENvbHVtbkNvbXBvbmVudCkgPT4gYm9vbGVhbiA9IG51bGwpOiBJQ2VsbFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLnZpc2libGVJbmRleCA+PSAwKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZFBvc2l0aW9uKGN1cnJSb3dJbmRleCwgY3VyVmlzaWJsZUNvbEluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xJbmRleGVzID0gY2FsbGJhY2sgPyBjb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjYWxsYmFjayhjb2wpKS5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYSAtIGIpIDpcbiAgICAgICAgICAgIGNvbHVtbnMubWFwKGVkaXRDb2wgPT4gZWRpdENvbC52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgY29uc3QgbmV4dENlbGxJbmRleCA9IGNvbEluZGV4ZXMuZmluZChpbmRleCA9PiBpbmRleCA+IGN1clZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNsaWNlKGN1cnJSb3dJbmRleCwgY3VyclJvd0luZGV4ICsgMSlcbiAgICAgICAgICAgIC5maW5kKHJlYyA9PiAhcmVjLmV4cHJlc3Npb24gJiYgIXJlYy5zdW1tYXJpZXMgJiYgIXJlYy5jaGlsZEdyaWRzRGF0YSAmJiAhcmVjLmRldGFpbHNEYXRhKSAmJiBuZXh0Q2VsbEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogbmV4dENlbGxJbmRleCB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbEluZGV4ZXMubGVuZ3RoID09PSAwIHx8IHRoaXMuZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyUm93SW5kZXgpID09PSBjdXJyUm93SW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogdGhpcy5nZXROZXh0RGF0YVJvd0luZGV4KGN1cnJSb3dJbmRleCksIHZpc2libGVDb2x1bW5JbmRleDogY29sSW5kZXhlc1swXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgSUNlbGxQb3NpdGlvbmAgd2hpY2ggZGVmaW5lcyB0aGUgcHJldmlvdXMgY2VsbCxcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24sIHRoYXQgbWF0Y2ggc3BlY2lmaWMgY3JpdGVyaWEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFlvdSBjYW4gcGFzcyBjYWxsYmFjayBmdW5jdGlvbiBhcyBhIHRoaXJkIHBhcmFtZXRlciBvZiBgZ2V0UHJldmlvdXNDZWxsYCBtZXRob2QuXG4gICAgICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFjY2VwdHMgSWd4Q29sdW1uQ29tcG9uZW50IGFzIGEgcGFyYW1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgY29uc3QgcHJldmlvdXNFZGl0YWJsZUNlbGxQb3NpdGlvbiA9IHRoaXMuZ3JpZC5nZXRQcmV2aW91c0NlbGwoMCwgMywgKGNvbHVtbikgPT4gY29sdW1uLmVkaXRhYmxlKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UHJldmlvdXNDZWxsKGN1cnJSb3dJbmRleDogbnVtYmVyLCBjdXJWaXNpYmxlQ29sSW5kZXg6IG51bWJlcixcbiAgICAgICAgY2FsbGJhY2s6IChJZ3hDb2x1bW5Db21wb25lbnQpID0+IGJvb2xlYW4gPSBudWxsKTogSUNlbGxQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkdyb3VwICYmIGNvbC52aXNpYmxlSW5kZXggPj0gMCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQb3NpdGlvbihjdXJyUm93SW5kZXgsIGN1clZpc2libGVDb2xJbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY3VyVmlzaWJsZUNvbEluZGV4IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sSW5kZXhlcyA9IGNhbGxiYWNrID8gY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY2FsbGJhY2soY29sKSkubWFwKGVkaXRDb2wgPT4gZWRpdENvbC52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGIgLSBhKSA6XG4gICAgICAgICAgICBjb2x1bW5zLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBiIC0gYSk7XG4gICAgICAgIGNvbnN0IHByZXZDZWxsSW5kZXggPSBjb2xJbmRleGVzLmZpbmQoaW5kZXggPT4gaW5kZXggPCBjdXJWaXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5zbGljZShjdXJyUm93SW5kZXgsIGN1cnJSb3dJbmRleCArIDEpXG4gICAgICAgICAgICAuZmluZChyZWMgPT4gIXJlYy5leHByZXNzaW9uICYmICFyZWMuc3VtbWFyaWVzICYmICFyZWMuY2hpbGRHcmlkc0RhdGEgJiYgIXJlYy5kZXRhaWxzRGF0YSkgJiYgcHJldkNlbGxJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IHByZXZDZWxsSW5kZXggfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb2xJbmRleGVzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmdldE5leHREYXRhUm93SW5kZXgoY3VyclJvd0luZGV4LCB0cnVlKSA9PT0gY3VyclJvd0luZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IHRoaXMuZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyUm93SW5kZXgsIHRydWUpLCB2aXNpYmxlQ29sdW1uSW5kZXg6IGNvbEluZGV4ZXNbMF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5kUm93RWRpdFRhYlN0b3AoY29tbWl0ID0gdHJ1ZSwgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICBjb25zdCBjYW5jZWxlZCA9IHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChjb21taXQsIGV2ZW50KTtcblxuICAgICAgICBpZiAoY2FuY2VsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWN0aXZlQ2VsbCA9IHRoaXMuZ3JpZEFQSS5ncmlkLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgaWYgKGFjdGl2ZUNlbGwgJiYgYWN0aXZlQ2VsbC5yb3cgIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQ29sdW1uQ2hhbmdlcyhpbmRleCwgY29sKSB7XG4gICAgICAgIHJldHVybiBjb2wuZmllbGQgKyBjb2wuX2NhbGNXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzRXhwYW5kZWRHcm91cChfZ3JvdXA6IElHcm91cEJ5UmVjb3JkKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBUT0RPOiBNT1ZFIHRvIENSVURcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlblJvd092ZXJsYXkoaWQpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmVSb3dFZGl0aW5nT3ZlcmxheShpZCwgdGhpcy5yb3dMaXN0Lmxlbmd0aCA8PSBNSU5fUk9XX0VESVRJTkdfQ09VTlRfVEhSRVNIT0xEKTtcblxuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5Lm9wZW4odGhpcy5yb3dFZGl0U2V0dGluZ3MpO1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLnJvd0VkaXRpbmdXaGVlbEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2VSb3dFZGl0aW5nT3ZlcmxheSgpIHtcbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5yb3dFZGl0aW5nV2hlZWxIYW5kbGVyKTtcbiAgICAgICAgdGhpcy5yb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneS5pc1RvcEluaXRpYWxQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LnBhcmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZVJvd0VkaXRpbmdPdmVybGF5KHNob3cpIHtcbiAgICAgICAgY29uc3Qgcm93U3R5bGUgPSB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQuc3R5bGU7XG4gICAgICAgIGlmIChzaG93KSB7XG4gICAgICAgICAgICByb3dTdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1N0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXBvc2l0aW9uUm93RWRpdGluZ092ZXJsYXkocm93OiBJZ3hSb3dEaXJlY3RpdmU8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4pIHtcbiAgICAgICAgaWYgKHJvdyAmJiAhdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd1N0eWxlID0gdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LnBhcmVudEVsZW1lbnQuc3R5bGU7XG4gICAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJlUm93RWRpdGluZ092ZXJsYXkocm93LnJvd0lEKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LnJlcG9zaXRpb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhY2hlZFZpZXdMb2FkZWQoYXJnczogSUNhY2hlZFZpZXdMb2FkZWRFdmVudEFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSG9yaXpvbnRhbFNjcm9sbCgpKSB7XG4gICAgICAgICAgICBjb25zdCB0bXBsSWQgPSBhcmdzLmNvbnRleHQudGVtcGxhdGVJRC50eXBlO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBhcmdzLmNvbnRleHQuaW5kZXg7XG4gICAgICAgICAgICBhcmdzLnZpZXcuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSB0bXBsSWQgPT09ICdkYXRhUm93JyA/IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2luZGV4KGluZGV4KSA6IG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeVJvdyA9IHRtcGxJZCA9PT0gJ3N1bW1hcnlSb3cnID8gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbmQoKHNyKSA9PiBzci5kYXRhUm93SW5kZXggPT09IGluZGV4KSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHJvdyAmJiByb3cgaW5zdGFuY2VvZiBJZ3hSb3dEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzdG9yZVZpcnRTdGF0ZShyb3cpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VtbWFyeVJvdykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN0b3JlVmlydFN0YXRlKHN1bW1hcnlSb3cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBkaWFsb2cuXG4gICAgICovXG4gICAgcHVibGljIG9wZW5BZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyhvdmVybGF5U2V0dGluZ3M/OiBPdmVybGF5U2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBvdmVybGF5U2V0dGluZ3MgPyBvdmVybGF5U2V0dGluZ3MgOiB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlTZXR0aW5ncztcbiAgICAgICAgaWYgKCF0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpLnJvb3RHcmlkID8gKHRoaXMgYXMgYW55KS5yb290R3JpZC5uYXRpdmVFbGVtZW50IDogdGhpcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdXRsZXQ7XG5cbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID0gdGhpcy5vdmVybGF5U2VydmljZS5hdHRhY2goXG4gICAgICAgICAgICAgICAgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3RvcjogdGhpcy52aWV3UmVmLmluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IHRoaXMucmVzb2x2ZXJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2Uuc2hvdyh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXBwbHlDaGFuZ2VzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlQWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2coYXBwbHlDaGFuZ2VzOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCkge1xuICAgICAgICAgICAgY29uc3QgYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5nZXRPdmVybGF5QnlJZCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgICAgICBjb25zdCBhZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyA9IGFkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheS5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQ7XG5cbiAgICAgICAgICAgIGlmIChhcHBseUNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBhZHZhbmNlZEZpbHRlcmluZ0RpYWxvZy5hcHBseUNoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRFbXB0eVJlY29yZE9iamVjdEZvcihpblJvdzogSWd4Um93RGlyZWN0aXZlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgR3JpZFR5cGU+KSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHsgLi4uaW5Sb3c/LnJvd0RhdGEgfTtcbiAgICAgICAgT2JqZWN0LmtleXMocm93KS5mb3JFYWNoKGtleSA9PiByb3dba2V5XSA9IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZW5lcmF0ZVJvd0lEKCk7XG4gICAgICAgIHJvd1t0aGlzLnByaW1hcnlLZXldID0gaWQ7XG4gICAgICAgIHJldHVybiB7IHJvd0lEOiBpZCwgZGF0YTogcm93LCByZWNvcmRSZWY6IHJvdyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhc0hvcml6b250YWxTY3JvbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvdGFsV2lkdGggLSB0aGlzLnVucGlubmVkV2lkdGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzU3VtbWFyeVJvdyhyb3dEYXRhKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiByb3dEYXRhLnN1bW1hcmllcyAmJiAocm93RGF0YS5zdW1tYXJpZXMgaW5zdGFuY2VvZiBNYXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHRyaWdnZXJQaXBlcygpIHtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByb3dFZGl0aW5nV2hlZWxIYW5kbGVyKGV2ZW50OiBXaGVlbEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbE5leHQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc2Nyb2xsUHJldigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRVbnBpbm5lZEluZGV4QnlJZChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy51bnBpbm5lZFJlY29yZHMuZmluZEluZGV4KHggPT4geFt0aGlzLnByaW1hcnlLZXldID09PSBpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluaXNoZXMgdGhlIHJvdyB0cmFuc2FjdGlvbnMgb24gdGhlIGN1cnJlbnQgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBgY29tbWl0ID09PSB0cnVlYCwgcGFzc2VzIHRoZW0gZnJvbSB0aGUgcGVuZGluZyBzdGF0ZSB0byB0aGUgZGF0YSAob3IgdHJhbnNhY3Rpb24gc2VydmljZSlcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8YnV0dG9uIGlneEJ1dHRvbiAoY2xpY2spPVwiZ3JpZC5lbmRFZGl0KHRydWUpXCI+Q29tbWl0IFJvdzwvYnV0dG9uPlxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb21taXRcbiAgICAgKi9cbiAgICAvLyBUT0RPOiBGYWNhZGUgZm9yIGNydWQgc2VydmljZSByZWZhY3RvcmluZy4gVG8gYmUgcmVtb3ZlZFxuICAgIC8vIFRPRE86IGRvIG5vdCByZW1vdmUgdGhpcywgYXMgaXQgaXMgdXNlZCBpbiByb3dFZGl0VGVtcGxhdGUsIGJ1dCBtYXJrIGlzIGFzIGludGVybmFsIGFuZCBoaWRkZW5cbiAgICBwdWJsaWMgZW5kRWRpdChjb21taXQgPSB0cnVlLCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChjb21taXQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbnRlcnMgYWRkIG1vZGUgYnkgc3Bhd25pbmcgdGhlIFVJIHVuZGVyIHRoZSBzcGVjaWZpZWQgcm93IGJ5IHJvd0lELlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBudWxsIGlzIHBhc3NlZCBhcyByb3dJRCwgdGhlIHJvdyBhZGRpbmcgVUkgaXMgc3Bhd25lZCBhcyB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBkYXRhIHZpZXdcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNwYXduaW5nIHRoZSBVSSB0byBhZGQgYSBjaGlsZCBmb3IgYSByZWNvcmQgb25seSB3b3JrcyBpZiB5b3UgcHJvdmlkZSBhIHJvd0lEXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmJlZ2luQWRkUm93QnlJZCgnQUxGS0knKTtcbiAgICAgKiB0aGlzLmdyaWQuYmVnaW5BZGRSb3dCeUlkKCdBTEZLSScsIHRydWUpO1xuICAgICAqIHRoaXMuZ3JpZC5iZWdpbkFkZFJvd0J5SWQobnVsbCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIC0gVGhlIHJvd0lEIHRvIHNwYXduIHRoZSBhZGQgcm93IFVJIGZvciwgb3IgbnVsbCB0byBzcGF3biBpdCBhcyB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBkYXRhIHZpZXdcbiAgICAgKiBAcGFyYW0gYXNDaGlsZCAtIFdoZXRoZXIgdGhlIHJlY29yZCBzaG91bGQgYmUgYWRkZWQgYXMgYSBjaGlsZC4gT25seSBhcHBsaWNhYmxlIHRvIGlneFRyZWVHcmlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBiZWdpbkFkZFJvd0J5SWQocm93SUQ6IGFueSwgYXNDaGlsZD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgbGV0IGluZGV4ID0gcm93SUQ7XG4gICAgICAgIGlmIChyb3dJRCA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoYXNDaGlsZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlIHJlY29yZCBjYW5ub3QgYmUgYWRkZWQgYXMgYSBjaGlsZCB0byBhbiB1bnNwZWNpZmllZCByZWNvcmQuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhlIHJlY29yZCB3aXRoIHRoYXQgUEtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5ncmlkQVBJLmdldF9yZWNfaW5kZXhfYnlfaWQocm93SUQsIHRoaXMuZGF0YVZpZXcpO1xuICAgICAgICAgICAgcm93SUQgPSBpbmRleDtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIHJvdyB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgd2FzIGZvdW5kLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZGF0YVZpZXcubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmJlZ2luQWRkUm93Rm9ySW5kZXgocm93SUQsIGFzQ2hpbGQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBpbmRleCBpcyB2YWxpZCAtIHdvbid0IHN1cHBvcnQgYW55dGhpbmcgb3V0c2lkZSB0aGUgZGF0YSB2aWV3XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5kYXRhVmlldy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBpbmRleCBpcyBpbiB0aGUgdmlldyBwb3J0XG4gICAgICAgICAgICBpZiAoKGluZGV4IDwgdGhpcy52aXJ0dWFsaXphdGlvblN0YXRlLnN0YXJ0SW5kZXggfHxcbiAgICAgICAgICAgICAgICBpbmRleCA+PSB0aGlzLnZpcnR1YWxpemF0aW9uU3RhdGUuc3RhcnRJbmRleCArIHRoaXMudmlydHVhbGl6YXRpb25TdGF0ZS5jaHVua1NpemUpICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuaXNSZWNvcmRQaW5uZWRCeVZpZXdJbmRleChpbmRleCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmNodW5rTG9hZFxuICAgICAgICAgICAgICAgICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbkFkZFJvd0ZvckluZGV4KHJvd0lELCBhc0NoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5iZWdpbkFkZFJvd0ZvckluZGV4KHJvd0lELCBhc0NoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlIHJvdyB3aXRoIHRoZSBzcGVjaWZpZWQgUEsgb3IgaW5kZXggaXMgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBkYXRhIHZpZXcuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBpbnRlcm5hbCBjb2x1bW4ncyBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVDb2x1bW5zKG5ld0NvbHVtbnM6IElneENvbHVtbkNvbXBvbmVudFtdKSB7XG4gICAgICAgIC8vIHVwZGF0ZSBpbnRlcm5hbCBjb2xsZWN0aW9ucyB0byByZXRhaW4gb3JkZXIuXG4gICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMgPSBuZXdDb2x1bW5zXG4gICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnBpbm5lZCkuc29ydCgoYSwgYikgPT4gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKGEpIC0gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKGIpKTtcbiAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zID0gbmV3Q29sdW1ucy5maWx0ZXIoKGMpID0+ICFjLnBpbm5lZCk7XG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5yZXNldChuZXdDb2x1bW5zKTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0Lm5vdGlmeU9uQ2hhbmdlcygpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbnRlcnMgYWRkIG1vZGUgYnkgc3Bhd25pbmcgdGhlIFVJIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFjY2VwdGVkIHZhbHVlcyBmb3IgaW5kZXggYXJlIGludGVnZXJzIGZyb20gMCB0byB0aGlzLmdyaWQuZGF0YVZpZXcubGVuZ3RoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmJlZ2luQWRkUm93QnlJbmRleCgwKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggdG8gc3Bhd24gdGhlIFVJIGF0LiBBY2NlcHRzIGludGVnZXJzIGZyb20gMCB0byB0aGlzLmdyaWQuZGF0YVZpZXcubGVuZ3RoXG4gICAgICovXG4gICAgcHVibGljIGJlZ2luQWRkUm93QnlJbmRleChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmVnaW5BZGRSb3dCeUlkKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJlZ2luQWRkUm93QnlJZCh0aGlzLmdyaWRBUEkuZ2V0X3JlY19pZF9ieV9pbmRleChpbmRleCAtIDEsIHRoaXMuZGF0YVZpZXcpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYmVnaW5BZGRSb3dGb3JJbmRleChpbmRleDogbnVtYmVyLCBhc0NoaWxkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgcm93OiBJZ3hSb3dEaXJlY3RpdmU8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4gPSBpbmRleCA9PSBudWxsID9cbiAgICAgICAgICAgIG51bGwgOiB0aGlzLnJvd0xpc3QuZmluZChyID0+IHIuaW5kZXggPT09IGluZGV4KTtcbiAgICAgICAgaWYgKHJvdyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVudGVyQWRkUm93TW9kZShyb3csIGFzQ2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdObyByb3cgd2l0aCB0aGUgc3BlY2lmaWVkIFBLIG9yIGluZGV4IHdhcyBmb3VuZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzd2l0Y2hUcmFuc2FjdGlvblNlcnZpY2UodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucyA9IHRoaXMudHJhbnNhY3Rpb25GYWN0b3J5LmNyZWF0ZShUUkFOU0FDVElPTl9UWVBFLkJhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbkZhY3RvcnkuY3JlYXRlKFRSQU5TQUNUSU9OX1RZUEUuTm9uZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YUNsb25lU3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucy5jbG9uZVN0cmF0ZWd5ID0gdGhpcy5kYXRhQ2xvbmVTdHJhdGVneTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzdWJzY3JpYmVUb1RyYW5zYWN0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkNoYW5nZSQubmV4dCgpO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5vblN0YXRlVXBkYXRlLnBpcGUodGFrZVVudGlsKG1lcmdlKHRoaXMuZGVzdHJveSQsIHRoaXMudHJhbnNhY3Rpb25DaGFuZ2UkKSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMudHJhbnNhY3Rpb25TdGF0dXNVcGRhdGUuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlKGV2ZW50OiBTdGF0ZVVwZGF0ZUV2ZW50KSB7XG4gICAgICAgIGxldCBhY3Rpb25zOiBBY3Rpb248VHJhbnNhY3Rpb24+W10gPSBbXTtcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gVHJhbnNhY3Rpb25FdmVudE9yaWdpbi5SRURPKSB7XG4gICAgICAgICAgICBhY3Rpb25zID0gZXZlbnQuYWN0aW9ucyA/IGV2ZW50LmFjdGlvbnMuZmlsdGVyKHggPT4geC50cmFuc2FjdGlvbi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuREVMRVRFKSA6IFtdO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gVHJhbnNhY3Rpb25FdmVudE9yaWdpbi5VTkRPKSB7XG4gICAgICAgICAgICBhY3Rpb25zID0gZXZlbnQuYWN0aW9ucyA/IGV2ZW50LmFjdGlvbnMuZmlsdGVyKHggPT4geC50cmFuc2FjdGlvbi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKSA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmlzUm93U2VsZWN0ZWQoYWN0aW9uLnRyYW5zYWN0aW9uLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RSb3coYWN0aW9uLnRyYW5zYWN0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCB3cml0ZVRvRGF0YShyb3dJbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIG1lcmdlT2JqZWN0cyh0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKClbcm93SW5kZXhdLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9yZXN0b3JlVmlydFN0YXRlKHJvdykge1xuICAgICAgICAvLyBjaGVjayB2aXJ0dWFsaXphdGlvbiBzdGF0ZSBvZiBkYXRhIHJlY29yZCBhZGRlZCBmcm9tIGNhY2hlXG4gICAgICAgIC8vIGluIGNhc2Ugc3RhdGUgaXMgbm8gbG9uZ2VyIHZhbGlkIC0gdXBkYXRlIGl0LlxuICAgICAgICBjb25zdCByb3dGb3JPZiA9IHJvdy52aXJ0RGlyUm93O1xuICAgICAgICBjb25zdCBncmlkU2NyTGVmdCA9IHJvd0Zvck9mLmdldFNjcm9sbCgpLnNjcm9sbExlZnQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSAtcGFyc2VJbnQocm93Rm9yT2YuZGMuaW5zdGFuY2UuX3ZpZXdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQsIDEwKTtcbiAgICAgICAgY29uc3QgYWN0dWFsU2Nyb2xsTGVmdCA9IGxlZnQgKyByb3dGb3JPZi5nZXRDb2x1bW5TY3JvbGxMZWZ0KHJvd0Zvck9mLnN0YXRlLnN0YXJ0SW5kZXgpO1xuICAgICAgICBpZiAoZ3JpZFNjckxlZnQgIT09IGFjdHVhbFNjcm9sbExlZnQpIHtcbiAgICAgICAgICAgIHJvd0Zvck9mLm9uSFNjcm9sbChncmlkU2NyTGVmdCk7XG4gICAgICAgICAgICByb3dGb3JPZi5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRFeHBvcnRFeGNlbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydEV4Y2VsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RXhwb3J0Q3N2KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwb3J0Q3N2O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGFuZ2VSb3dFZGl0aW5nT3ZlcmxheVN0YXRlT25TY3JvbGwocm93OiBJZ3hSb3dEaXJlY3RpdmU8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvd0VkaXRhYmxlIHx8ICF0aGlzLnJvd0VkaXRpbmdPdmVybGF5IHx8IHRoaXMucm93RWRpdGluZ092ZXJsYXkuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUm93RWRpdGluZ092ZXJsYXkoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBvc2l0aW9uUm93RWRpdGluZ092ZXJsYXkocm93KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3VsZCBiZSBjYWxsZWQgd2hlbiBkYXRhIGFuZC9vciBpc0xvYWRpbmcgaW5wdXQgY2hhbmdlcyBzbyB0aGF0IHRoZSBvdmVybGF5IGNhbiBiZVxuICAgICAqIGhpZGRlbi9zaG93biBiYXNlZCBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiBzaG91bGRPdmVybGF5TG9hZGluZ1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBldmFsdWF0ZUxvYWRpbmdTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkT3ZlcmxheUxvYWRpbmcpIHtcbiAgICAgICAgICAgIC8vIGEgbmV3IG92ZXJsYXkgc2hvdWxkIGJlIHNob3duXG4gICAgICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICBvdXRsZXQ6IHRoaXMubG9hZGluZ091dGxldCxcbiAgICAgICAgICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQ29udGFpbmVyUG9zaXRpb25TdHJhdGVneSgpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nT3ZlcmxheS5vcGVuKG92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdPdmVybGF5LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogU2V0cyBncmlkIHdpZHRoIGkuZS4gdGhpcy5jYWxjV2lkdGhcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlR3JpZFdpZHRoKCkge1xuICAgICAgICBsZXQgd2lkdGg7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNQZXJjZW50V2lkdGgpIHtcbiAgICAgICAgICAgIC8qIHdpZHRoIGluICUqL1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcy5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpO1xuICAgICAgICAgICAgd2lkdGggPSBjb21wdXRlZC5pbmRleE9mKCclJykgPT09IC0xID8gcGFyc2VJbnQoY29tcHV0ZWQsIDEwKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghd2lkdGggJiYgdGhpcy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWYgKHRoaXMud2lkdGggPT09IG51bGwgfHwgIXdpZHRoKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuZ2V0Q29sdW1uV2lkdGhTdW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkgJiYgdGhpcy53aWR0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2lkdGggLT0gdGhpcy5zY3JvbGxTaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoTnVtYmVyLmlzRmluaXRlKHdpZHRoKSB8fCB3aWR0aCA9PT0gbnVsbCkgJiYgd2lkdGggIT09IHRoaXMuY2FsY1dpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGNXaWR0aCA9IHdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Rlcml2ZVBvc3NpYmxlV2lkdGgoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogU2V0cyBjb2x1bW5zIGRlZmF1bHRXaWR0aCBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGVyaXZlUG9zc2libGVXaWR0aCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbldpZHRoU2V0QnlVc2VyKSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW5XaWR0aCA9IHRoaXMud2lkdGggIT09IG51bGwgPyB0aGlzLmdldFBvc3NpYmxlQ29sdW1uV2lkdGgoKSA6IE1JTklNVU1fQ09MVU1OX1dJRFRIICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbHVtbkxpc3QuZm9yRWFjaCgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMgJiYgcGFyc2VJbnQodGhpcy5fY29sdW1uV2lkdGgsIDEwKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbldpZHRoQ29tYmluZWQgPSBwYXJzZUludCh0aGlzLl9jb2x1bW5XaWR0aCwgMTApICogKGNvbHVtbi5jb2xFbmQgPyBjb2x1bW4uY29sRW5kIC0gY29sdW1uLmNvbFN0YXJ0IDogMSk7XG4gICAgICAgICAgICAgICAgY29sdW1uLmRlZmF1bHRXaWR0aCA9IGNvbHVtbldpZHRoQ29tYmluZWQgKyAncHgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBELksuIE1hcmNoIDI5dGgsIDIwMjEgIzkxNDUgQ29uc2lkZXIgbWluL21heCB3aWR0aCB3aGVuIHNldHRpbmcgZGVmYXVsdFdpZHRoIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgY29sdW1uLmRlZmF1bHRXaWR0aCA9IHRoaXMuZ2V0RXh0cmVtdW1CYXNlZENvbFdpZHRoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgY29sdW1uLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVkV2lkdGhzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRFeHRyZW11bUJhc2VkQ29sV2lkdGgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpOiBzdHJpbmcge1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLl9jb2x1bW5XaWR0aDtcbiAgICAgICAgaWYgKHdpZHRoICYmIHR5cGVvZiB3aWR0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHdpZHRoID0gU3RyaW5nKHdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHdpZHRoLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBjb2x1bW4ubWluV2lkdGhQeCA6IGNvbHVtbi5taW5XaWR0aFBlcmNlbnQ7XG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gd2lkdGguaW5kZXhPZignJScpID09PSAtMSA/IGNvbHVtbi5tYXhXaWR0aFB4IDogY29sdW1uLm1heFdpZHRoUGVyY2VudDtcbiAgICAgICAgaWYgKGNvbHVtbi5oaWRkZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB3aWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaW5XaWR0aCA+IHBhcnNlRmxvYXQod2lkdGgpKSB7XG4gICAgICAgICAgICB3aWR0aCA9IFN0cmluZyhjb2x1bW4ubWluV2lkdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKG1heFdpZHRoIDwgcGFyc2VGbG9hdCh3aWR0aCkpIHtcbiAgICAgICAgICAgIHdpZHRoID0gU3RyaW5nKGNvbHVtbi5tYXhXaWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBubyBweCBvciAlIGFyZSBkZWZpbmVkIGluIG1heFdpZHRoL21pbldpZHRoIGNvbnNpZGVyIGl0IHB4XG4gICAgICAgIGlmICh3aWR0aC5pbmRleE9mKCclJykgPT09IC0xICYmIHdpZHRoLmluZGV4T2YoJ3B4JykgPT09IC0xKSB7XG4gICAgICAgICAgICB3aWR0aCArPSAncHgnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzZXROb3RpZnlDaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLl9jZHJSZXF1ZXN0UmVwYWludCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jZHJSZXF1ZXN0cyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNvbHZlT3V0bGV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck91dGxldERpcmVjdGl2ZSA/IHRoaXMuX3VzZXJPdXRsZXREaXJlY3RpdmUgOiB0aGlzLl9vdXRsZXREaXJlY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVvcmRlciBjb2x1bW5zIGluIHRoZSBtYWluIGNvbHVtbkxpc3QgYW5kIF9jb2x1bW5zIGNvbGxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbW92ZUNvbHVtbnMoZnJvbTogSWd4Q29sdW1uQ29tcG9uZW50LCB0bzogSWd4Q29sdW1uQ29tcG9uZW50LCBwb3M6IERyb3BQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgdGhpcy5fcmVvcmRlckNvbHVtbnMoZnJvbSwgdG8sIHBvcywgbGlzdCk7XG4gICAgICAgIGNvbnN0IG5ld0xpc3QgPSB0aGlzLl9yZXNldENvbHVtbkxpc3QobGlzdCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucyhuZXdMaXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9yZXNldENvbHVtbkxpc3QobGlzdD8pIHtcbiAgICAgICAgaWYgKCFsaXN0KSB7XG4gICAgICAgICAgICBsaXN0ID0gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3TGlzdCA9IFtdO1xuICAgICAgICBsaXN0LmZpbHRlcihjID0+IGMubGV2ZWwgPT09IDApLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICBuZXdMaXN0LnB1c2gocCk7XG4gICAgICAgICAgICBpZiAocC5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgIG5ld0xpc3QgPSBuZXdMaXN0LmNvbmNhdChwLmFsbENoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdMaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXJzIGNvbHVtbnMgaW5zaWRlIHRoZSBwYXNzZWQgY29sdW1uIGNvbGxlY3Rpb24uXG4gICAgICogV2hlbiByZW9yZGVyaW5nIGNvbHVtbiBncm91cCBjb2xsZWN0aW9uLCB0aGUgY29sbGVjdGlvbiBpcyBub3QgZmxhdHRlbmVkLlxuICAgICAqIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIGNvbHVtbnMgY29sbGVjdGlvbiBpcyBmbGF0dGVuZWQsIHRoaXMgaXMgd2h5IGFkaXR0aW9uYWwgY2FsY3VsYXRpb25zIG9uIHRoZSBkcm9wSW5kZXggYXJlIGRvbmUuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9yZW9yZGVyQ29sdW1ucyhmcm9tOiBJZ3hDb2x1bW5Db21wb25lbnQsIHRvOiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvc2l0aW9uOiBEcm9wUG9zaXRpb24sIGNvbHVtbkNvbGxlY3Rpb246IGFueVtdLFxuICAgICAgICBpbkdyb3VwID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gY29sdW1uQ29sbGVjdGlvbi5pbmRleE9mKGZyb20pO1xuICAgICAgICBjb25zdCBjaGlsZENvbHVtbnNDb3VudCA9IGluR3JvdXAgPyAxIDogZnJvbS5hbGxDaGlsZHJlbi5sZW5ndGggKyAxO1xuICAgICAgICBjb2x1bW5Db2xsZWN0aW9uLnNwbGljZShmcm9tSW5kZXgsIGNoaWxkQ29sdW1uc0NvdW50KTtcbiAgICAgICAgbGV0IGRyb3BJbmRleCA9IGNvbHVtbkNvbGxlY3Rpb24uaW5kZXhPZih0byk7XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCkge1xuICAgICAgICAgICAgZHJvcEluZGV4Kys7XG4gICAgICAgICAgICBpZiAoIWluR3JvdXAgJiYgdG8uY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICBkcm9wSW5kZXggKz0gdG8uYWxsQ2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbHVtbkNvbGxlY3Rpb24uc3BsaWNlKGRyb3BJbmRleCwgMCwgZnJvbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVvcmRlciBjb2x1bW4gZ3JvdXAgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX21vdmVDaGlsZENvbHVtbnMocGFyZW50OiBJZ3hDb2x1bW5Db21wb25lbnQsIGZyb206IElneENvbHVtbkNvbXBvbmVudCwgdG86IElneENvbHVtbkNvbXBvbmVudCwgcG9zOiBEcm9wUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcGFyZW50LmNoaWxkcmVuLnRvQXJyYXkoKTtcbiAgICAgICAgdGhpcy5fcmVvcmRlckNvbHVtbnMoZnJvbSwgdG8sIHBvcywgYnVmZmVyLCB0cnVlKTtcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuLnJlc2V0KGJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNldHVwQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0dlbmVyYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdENvbHVtbnModGhpcy5jb2x1bW5MaXN0LCAoY29sOiBJZ3hDb2x1bW5Db21wb25lbnQpID0+IHRoaXMuY29sdW1uSW5pdC5lbWl0KGNvbCkpO1xuICAgICAgICB0aGlzLmNvbHVtbkxpc3REaWZmZXIuZGlmZih0aGlzLmNvbHVtbkxpc3QpO1xuXG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5jaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjaGFuZ2U6IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbHVtbnNDaGFuZ2VkKGNoYW5nZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGRlbGV0ZVJvd0Zyb21EYXRhKHJvd0lEOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgLy8gIGlmIHRoZXJlIGlzIGEgcm93IChpbmRleCAhPT0gMCkgZGVsZXRlIGl0XG4gICAgICAgIC8vICBpZiB0aGVyZSBpcyBhIHJvdyBpbiBBREQgb3IgVVBEQVRFIHN0YXRlIGNoYW5nZSBpdCdzIHN0YXRlIHRvIERFTEVURVxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiA9IHsgaWQ6IHJvd0lELCB0eXBlOiBUcmFuc2FjdGlvblR5cGUuREVMRVRFLCBuZXdWYWx1ZTogbnVsbCB9O1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLmFkZCh0cmFuc2FjdGlvbiwgdGhpcy5kYXRhW2luZGV4XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGU6IFN0YXRlID0gdGhpcy50cmFuc2FjdGlvbnMuZ2V0U3RhdGUocm93SUQpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuYWRkKHsgaWQ6IHJvd0lELCB0eXBlOiBUcmFuc2FjdGlvblR5cGUuREVMRVRFLCBuZXdWYWx1ZTogbnVsbCB9LCBzdGF0ZSAmJiBzdGF0ZS5yZWNvcmRSZWYpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kYXRhIHx8ICh0aGlzLmRhdGEubGVuZ3RoIDwgdGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcikgP1xuICAgICAgICAgICAgMCA6IHRoaXMuZGVmYXVsdFRhcmdldEJvZHlIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25QaW5uZWRSb3dzQ2hhbmdlZChjaGFuZ2U6IFF1ZXJ5TGlzdDxJZ3hHcmlkUm93Q29tcG9uZW50Pikge1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5yb3dMaXN0RGlmZmVyLmRpZmYoY2hhbmdlKTtcbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25Db2x1bW5zQ2hhbmdlZChjaGFuZ2U6IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+KSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLmNvbHVtbkxpc3REaWZmZXIuZGlmZihjaGFuZ2UpO1xuXG4gICAgICAgIGlmICh0aGlzLmF1dG9HZW5lcmF0ZSAmJiB0aGlzLmNvbHVtbkxpc3QubGVuZ3RoID09PSAwICYmIHRoaXMuX2F1dG9HZW5lcmF0ZWRDb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIEluIEl2eSBpZiB0aGVyZSBhcmUgbmVzdGVkIGNvbmRpdGlvbmFsIHRlbXBsYXRlcyB0aGUgY29udGVudCBjaGlsZHJlbiBhcmUgcmUtZXZhbHVhdGVkXG4gICAgICAgICAgICAvLyBoZW5jZSBhdXRvZ2VuZXJhdGVkIGNvbHVtbnMgYXJlIGNsZWFyZWQgYW5kIG5lZWQgdG8gYmUgcmVzZXQuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbkxpc3QucmVzZXQodGhpcy5fYXV0b0dlbmVyYXRlZENvbHMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICBsZXQgYWRkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCByZW1vdmVkID0gZmFsc2U7XG4gICAgICAgICAgICBkaWZmLmZvckVhY2hBZGRlZEl0ZW0oKHJlY29yZDogSXRlcmFibGVDaGFuZ2VSZWNvcmQ8SWd4Q29sdW1uQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uSW5pdC5lbWl0KHJlY29yZC5pdGVtKTtcbiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5pdGVtLnBpbm5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zLnB1c2gocmVjb3JkLml0ZW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucy5wdXNoKHJlY29yZC5pdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5pbml0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QpO1xuXG4gICAgICAgICAgICBkaWZmLmZvckVhY2hSZW1vdmVkSXRlbSgocmVjb3JkOiBJdGVyYWJsZUNoYW5nZVJlY29yZDxJZ3hDb2x1bW5Db21wb25lbnQgfCBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0NvbHVtbkdyb3VwID0gcmVjb3JkLml0ZW0gaW5zdGFuY2VvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgR3JvdXBpbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmNsZWFyX2dyb3VwYnkocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIEZpbHRlcmluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJfZmlsdGVyKHJlY29yZC5pdGVtLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBmaWx0ZXIgcm93XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbi5maWVsZCA9PT0gcmVjb3JkLml0ZW0uZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBTb3J0aW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5jbGVhcl9zb3J0KHJlY29yZC5pdGVtLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgY29sdW1uIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoW3JlY29yZC5pdGVtLmZpZWxkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcblxuICAgICAgICAgICAgaWYgKGFkZGVkIHx8IHJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGBvbkNvbHVtbnNDaGFuZ2VkYCBjYW4gYmUgZXhlY3V0ZWQgbWlkd2F5IGEgY3VycmVudCBkZXRlY3RDaGFuZ2UgY3ljbGUgYW5kIG1hcmtGb3JDaGVjayB3aWxsIGJlIGlnbm9yZWQgdGhlbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbCB3YWl0IGZvciB0aGUgY3VycmVudCBjeWNsZSB0byBlbmQgc28gd2UgY2FuIHRyaWdnZXIgYSBuZXcgb25lIGFuZCBuZ0RvQ2hlY2sgdG8gZmlyZS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkU2l6ZXMocmVjYWxjRmVhdHVyZVdpZHRoID0gdHJ1ZSkge1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETzogKFIuSy4pIFRoaXMgbGF5ZXJlZCBsYXNhZ25lIHNob3VsZCBiZSByZWZhY3RvcmVkXG4gICAgICAgICAgICBBU0FQLiBUaGUgcmVhc29uIEkgaGF2ZSB0byByZXNldCB0aGUgY2FjaGVzIHNvIG1hbnkgdGltZXMgaXMgYmVjYXVzZVxuICAgICAgICAgICAgYWZ0ZXIgdGVhY2ggYGRldGVjdENoYW5nZXNgIGNhbGwgdGhleSBhcmUgZmlsbGVkIHdpdGggaW52YWxpZFxuICAgICAgICAgICAgc3RhdGUuIE9mIGNvdXJzZSBhbGwgb2YgdGhpcyBoYXBwZW5zIG1pZHdheSB0aHJvdWdoIHRoZSBncmlkXG4gICAgICAgICAgICBzaXppbmcgcHJvY2VzcyB3aGljaCBvZiBjb3Vyc2UsIHVzZXMgdmFsdWVzIGZyb20gdGhlIGNhY2hlcywgdGh1cyByZXN1bHRpbmdcbiAgICAgICAgICAgIGluIGEgYnJva2VuIGxheW91dC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheSh0aGlzLmNydWRTZXJ2aWNlLnJvd0luRWRpdE1vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LnJlc2V0Q2hpcHNBcmVhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIC8vIGluIGNhc2Ugc2Nyb2xsYmFyIGhhcyBhcHBlYXJlZCByZWNhbGMgdG8gc2l6ZSBjb3JyZWN0bHkuXG4gICAgICAgIGlmIChoYXNTY3JvbGwgIT09IHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy56b25lLmlzU3RhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVdpZHRoSG9zdEJpbmRpbmcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5V2lkdGhIb3N0QmluZGluZygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY0dyaWRIZWFkUm93KCkge1xuICAgICAgICBpZiAodGhpcy5tYXhMZXZlbEhlYWRlckRlcHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9iYXNlRm9udFNpemUgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUodGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpKTtcbiAgICAgICAgICAgIGxldCBtaW5TaXplID0gKHRoaXMubWF4TGV2ZWxIZWFkZXJEZXB0aCArIDEpICogdGhpcy5kZWZhdWx0Um93SGVpZ2h0IC8gdGhpcy5fYmFzZUZvbnRTaXplO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FsbG93RmlsdGVyaW5nICYmIHRoaXMuX2ZpbHRlck1vZGUgPT09IEZpbHRlck1vZGUucXVpY2tGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBtaW5TaXplICs9IChGSUxURVJfUk9XX0hFSUdIVCArIDEpIC8gdGhpcy5fYmFzZUZvbnRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50aGVhZFJvdy5uYXRpdmVFbGVtZW50LnN0eWxlLm1pbkhlaWdodCA9IGAke21pblNpemV9cmVtYDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIFRCT0RZIGhlaWdodCBpLmUuIHRoaXMuY2FsY0hlaWdodFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkSGVpZ2h0KCkge1xuICAgICAgICB0aGlzLmNhbGNHcmlkSGVhZFJvdygpO1xuICAgICAgICB0aGlzLnN1bW1hcmllc0hlaWdodCA9IDA7XG4gICAgICAgIGlmICh0aGlzLmhhc1N1bW1hcml6ZWRDb2x1bW5zICYmIHRoaXMucm9vdFN1bW1hcmllc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyaWVzSGVpZ2h0ID0gdGhpcy5zdW1tYXJ5U2VydmljZS5jYWxjTWF4U3VtbWFyeUhlaWdodCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID0gdGhpcy5fY2FsY3VsYXRlR3JpZEJvZHlIZWlnaHQoKTtcbiAgICAgICAgaWYgKHRoaXMucGlubmVkUm93SGVpZ2h0ICYmIHRoaXMuY2FsY0hlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0IC09IHRoaXMucGlubmVkUm93SGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRHcm91cEFyZWFIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRDb21wdXRlZEhlaWdodChlbGVtKSB7XG4gICAgICAgIHJldHVybiBlbGVtLm9mZnNldEhlaWdodCA/IHBhcnNlRmxvYXQodGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpKSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9vdGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1bW1hcmllc0hlaWdodCB8fCB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMudGZvb3QubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0VGhlYWRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gKCF0aGlzLmFsbG93RmlsdGVyaW5nIHx8ICh0aGlzLmFsbG93RmlsdGVyaW5nICYmIHRoaXMuZmlsdGVyTW9kZSAhPT0gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcikpID9cbiAgICAgICAgICAgIGhlaWdodCAtIHRoaXMuZ2V0RmlsdGVyQ2VsbEhlaWdodCgpIDpcbiAgICAgICAgICAgIGhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFRvb2xiYXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHRvb2xiYXJIZWlnaHQgPSAwO1xuICAgICAgICBpZiAodGhpcy50b29sYmFyLmZpcnN0KSB7XG4gICAgICAgICAgICB0b29sYmFySGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRvb2xiYXIuZmlyc3QubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvb2xiYXJIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYWdpbmdGb290ZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHBhZ2luZ0hlaWdodCA9IDA7XG4gICAgICAgIGlmICh0aGlzLmZvb3Rlcikge1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLmZvb3Rlci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIHBhZ2luZ0hlaWdodCA9IHRoaXMuZm9vdGVyLm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgP1xuICAgICAgICAgICAgICAgIGhlaWdodCA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2luZ0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEZpbHRlckNlbGxIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaGVhZGVyR3JvdXBOYXRpdmVFbCA9ICh0aGlzLmhlYWRlckdyb3Vwc0xpc3QubGVuZ3RoICE9PSAwKSA/XG4gICAgICAgICAgICB0aGlzLmhlYWRlckdyb3Vwc0xpc3RbMF0ubmF0aXZlRWxlbWVudCA6IG51bGw7XG4gICAgICAgIGNvbnN0IGZpbHRlckNlbGxOYXRpdmVFbCA9IChoZWFkZXJHcm91cE5hdGl2ZUVsKSA/XG4gICAgICAgICAgICBoZWFkZXJHcm91cE5hdGl2ZUVsLnF1ZXJ5U2VsZWN0b3IoJ2lneC1ncmlkLWZpbHRlcmluZy1jZWxsJykgYXMgSFRNTEVsZW1lbnQgOiBudWxsO1xuICAgICAgICByZXR1cm4gKGZpbHRlckNlbGxOYXRpdmVFbCkgPyBmaWx0ZXJDZWxsTmF0aXZlRWwub2Zmc2V0SGVpZ2h0IDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jYWxjdWxhdGVHcmlkQm9keUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuX2hlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0dWFsVGhlYWRSb3cgPSB0aGlzLmdldFRoZWFkUm93SGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IGZvb3RlckhlaWdodCA9IHRoaXMuZ2V0Rm9vdGVySGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IHRvb2xiYXJIZWlnaHQgPSB0aGlzLmdldFRvb2xiYXJIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgcGFnaW5nSGVpZ2h0ID0gdGhpcy5nZXRQYWdpbmdGb290ZXJIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgZ3JvdXBBcmVhSGVpZ2h0ID0gdGhpcy5nZXRHcm91cEFyZWFIZWlnaHQoKTtcbiAgICAgICAgY29uc3Qgc2NySGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnNjci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWRIZWlnaHQgPSB0b29sYmFySGVpZ2h0ICsgYWN0dWFsVGhlYWRSb3cgK1xuICAgICAgICAgICAgZm9vdGVySGVpZ2h0ICsgcGFnaW5nSGVpZ2h0ICsgZ3JvdXBBcmVhSGVpZ2h0ICtcbiAgICAgICAgICAgIHNjckhlaWdodDtcblxuICAgICAgICBsZXQgZ3JpZEhlaWdodCA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNQZXJjZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpO1xuICAgICAgICAgICAgY29uc3QgYXV0b1NpemUgPSB0aGlzLl9zaG91bGRBdXRvU2l6ZShyZW5kZXJlZEhlaWdodCk7XG4gICAgICAgICAgICBpZiAoYXV0b1NpemUgfHwgY29tcHV0ZWQuaW5kZXhPZignJScpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlIZWlnaHQgPSB0aGlzLmdldERhdGFCYXNlZEJvZHlIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm9keUhlaWdodCA+IDAgPyBib2R5SGVpZ2h0IDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyaWRIZWlnaHQgPSBwYXJzZUZsb2F0KGNvbXB1dGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdyaWRIZWlnaHQgPSBwYXJzZUludCh0aGlzLl9oZWlnaHQsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmFicyhncmlkSGVpZ2h0IC0gcmVuZGVyZWRIZWlnaHQpO1xuXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKGhlaWdodCkgPT09IDAgfHwgaXNOYU4oZ3JpZEhlaWdodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHlIZWlnaHQgPSB0aGlzLmRlZmF1bHRUYXJnZXRCb2R5SGVpZ2h0O1xuICAgICAgICAgICAgcmV0dXJuIGJvZHlIZWlnaHQgPiAwID8gYm9keUhlaWdodCA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tDb250YWluZXJTaXplQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCBvcmlnSGVpZ2h0ID0gdGhpcy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICByZXR1cm4gb3JpZ0hlaWdodCAhPT0gaGVpZ2h0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfc2hvdWxkQXV0b1NpemUocmVuZGVyZWRIZWlnaHQpIHtcbiAgICAgICAgdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGNvbnN0IHJlcyA9ICF0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCB8fFxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xpZW50SGVpZ2h0ID09PSAwIHx8XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPT09IHJlbmRlcmVkSGVpZ2h0IHx8XG4gICAgICAgICAgICAvLyBJZiBncmlkIGNhdXNlcyB0aGUgcGFyZW50IGNvbnRhaW5lciB0byBleHRlbmQgKGZvciBleGFtcGxlIHdoZW4gY29udGFpbmVyIGlzIGZsZXgpXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGQgYWx3YXlzIGF1dG8tc2l6ZSBzaW5jZSB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbnRhaW5lciB3aWxsIGNvbnRpbnVvdXNseSBjaGFuZ2UgYXMgdGhlIGdyaWQgcmVuZGVycyBlbGVtZW50cy5cbiAgICAgICAgICAgIHRoaXMuY2hlY2tDb250YWluZXJTaXplQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldHMgY2FsY3VsYXRlZCB3aWR0aCBvZiB0aGUgdW5waW5uZWQgYXJlYVxuICAgICAqIEBwYXJhbSB0YWtlSGlkZGVuIElmIHdlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCB0aGUgaGlkZGVuIGNvbHVtbnMgaW4gdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRVbnBpbm5lZFdpZHRoKHRha2VIaWRkZW4gPSBmYWxzZSkge1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLmlzUGVyY2VudFdpZHRoID9cbiAgICAgICAgICAgIHRoaXMuY2FsY1dpZHRoIDpcbiAgICAgICAgICAgIHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKSB8fCBwYXJzZUludCh0aGlzLmhvc3RXaWR0aCwgMTApIHx8IHRoaXMuY2FsY1dpZHRoO1xuICAgICAgICBpZiAodGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpICYmICF0aGlzLmlzUGVyY2VudFdpZHRoKSB7XG4gICAgICAgICAgICB3aWR0aCAtPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUGlubmluZ1RvU3RhcnQpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMuZmVhdHVyZUNvbHVtbnNXaWR0aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdpZHRoIC0gdGhpcy5nZXRQaW5uZWRXaWR0aCh0YWtlSGlkZGVuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zdW1tYXJpZXMoZmllbGROYW1lOiBzdHJpbmcsIGhhc1N1bW1hcnk6IGJvb2xlYW4sIHN1bW1hcnlPcGVyYW5kPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZEFQSS5nZXRfY29sdW1uX2J5X25hbWUoZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgY29sdW1uLmhhc1N1bW1hcnkgPSBoYXNTdW1tYXJ5O1xuICAgICAgICAgICAgaWYgKHN1bW1hcnlPcGVyYW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdFN1bW1hcmllc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5yZXRyaWdnZXJSb290UGlwZSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4uc3VtbWFyaWVzID0gc3VtbWFyeU9wZXJhbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tdWx0aXBsZVN1bW1hcmllcyhleHByZXNzaW9uczogSVN1bW1hcnlFeHByZXNzaW9uW10sIGhhc1N1bW1hcnk6IGJvb2xlYW4pIHtcbiAgICAgICAgZXhwcmVzc2lvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKGVsZW1lbnQuZmllbGROYW1lLCBoYXNTdW1tYXJ5LCBlbGVtZW50LmN1c3RvbVN1bW1hcnkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZU11bHRpcGxlU3VtbWFyaWVzKGV4cHJlc3Npb25zKSB7XG4gICAgICAgIGV4cHJlc3Npb25zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGNvbHVtbiAmJiBjb2x1bW4uZmllbGROYW1lID8gY29sdW1uLmZpZWxkTmFtZSA6IGNvbHVtbjtcbiAgICAgICAgICAgIHRoaXMuX3N1bW1hcmllcyhjb2x1bW5OYW1lLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZURhdGFUeXBlcyhyZWMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gR3JpZENvbHVtbkRhdGFUeXBlLk51bWJlcjtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVjID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbjtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVjID09PSAnb2JqZWN0JyAmJiByZWMgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEdyaWRDb2x1bW5EYXRhVHlwZS5TdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhdXRvZ2VuZXJhdGVDb2x1bW5zKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ncmlkQVBJLmdldF9kYXRhKCk7XG4gICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KElneENvbHVtbkNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZ2VuZXJhdGVEYXRhRmllbGRzKGRhdGEpO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gW107XG5cbiAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSBmYWN0b3J5LmNyZWF0ZSh0aGlzLnZpZXdSZWYuaW5qZWN0b3IpO1xuICAgICAgICAgICAgcmVmLmluc3RhbmNlLmZpZWxkID0gZmllbGQ7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZGF0YVR5cGUgPSB0aGlzLnJlc29sdmVEYXRhVHlwZXMoZGF0YVswXVtmaWVsZF0pO1xuICAgICAgICAgICAgcmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaChyZWYuaW5zdGFuY2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fYXV0b0dlbmVyYXRlZENvbHMgPSBjb2x1bW5zO1xuXG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5yZXNldChjb2x1bW5zKTtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3VsZEdlbmVyYXRlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVEYXRhRmllbGRzKGRhdGE6IGFueVtdKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZGF0YSAmJiBkYXRhLmxlbmd0aCAhPT0gMCA/IGRhdGFbMF0gOiBbXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgICBwcm90ZWN0ZWQgX2dldFJlc29sdmVkRGF0YUluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgbmV3SW5kZXggPSBpbmRleDtcbiAgICAgICAgaWYgKChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5kYXRhVmlldy5sZW5ndGgpICYmIHRoaXMucGFnaW5nTW9kZSA9PT0gMSAmJiB0aGlzLnBhZ2luYXRvci5wYWdlICE9PSAwKSB7XG4gICAgICAgICAgICBuZXdJbmRleCA9IGluZGV4IC0gdGhpcy5wYWdpbmF0b3IucGVyUGFnZSAqIHRoaXMucGFnaW5hdG9yLnBhZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkQVBJLmdyaWQudmVydGljYWxTY3JvbGxDb250YWluZXIuaXNSZW1vdGUpIHtcbiAgICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXggLSB0aGlzLmdyaWRBUEkuZ3JpZC52aXJ0dWFsaXphdGlvblN0YXRlLnN0YXJ0SW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaW5pdENvbHVtbnMoY29sbGVjdGlvbjogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4sIGNiOiAoYXJnczogYW55KSA9PiB2b2lkID0gbnVsbCkge1xuICAgICAgICB0aGlzLl9jb2x1bW5Hcm91cHMgPSB0aGlzLmNvbHVtbkxpc3Quc29tZShjb2wgPT4gY29sLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgLy8gU2V0IG92ZXJhbGwgcm93IGxheW91dCBzaXplXG4gICAgICAgICAgICB0aGlzLmNvbHVtbkxpc3QuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5MYXlvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5b3V0U2l6ZSA9IGNvbC5jaGlsZHJlbiA/XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wuY2hpbGRyZW4ucmVkdWNlKChhY2MsIHZhbCkgPT4gTWF0aC5tYXgodmFsLnJvd1N0YXJ0ICsgdmFsLmdyaWRSb3dTcGFuIC0gMSwgYWNjKSwgMSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlSb3dMYXlvdXRSb3dTaXplID0gTWF0aC5tYXgobGF5b3V0U2l6ZSwgdGhpcy5fbXVsdGlSb3dMYXlvdXRSb3dTaXplKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzICYmIHRoaXMuaGFzQ29sdW1uR3JvdXBzKSB7XG4gICAgICAgICAgICAvLyBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gLSBtdWx0aS1yb3cgYW5kIGNvbHVtbiBncm91cHNcbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb2x1bW4gZ3JvdXBzXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5MYXlvdXRDb2x1bW5zID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcigoY29sKSA9PiBjb2wuY29sdW1uTGF5b3V0IHx8IGNvbC5jb2x1bW5MYXlvdXRDaGlsZCk7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbkxpc3QucmVzZXQoY29sdW1uTGF5b3V0Q29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgICAgICBjb2xsZWN0aW9uLmZvckVhY2goKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gdGhpcy5jb2x1bW5XaWR0aFNldEJ5VXNlciA/IHRoaXMuX2NvbHVtbldpZHRoIDogY29sdW1uLmRlZmF1bHRXaWR0aCA/IGNvbHVtbi5kZWZhdWx0V2lkdGggOiAnJztcblxuICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICAgY2IoY29sdW1uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZWluaXRQaW5TdGF0ZXMoKTtcblxuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLmZvckVhY2goKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29sdW1uLnBvcHVsYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWluaXRQaW5TdGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMgPSB0aGlzLmNvbHVtbkxpc3RcbiAgICAgICAgICAgIC5maWx0ZXIoKGMpID0+IGMucGlubmVkKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHRoaXMuX3Bpbm5lZENvbHVtbnMuaW5kZXhPZihhKSAtIHRoaXMuX3Bpbm5lZENvbHVtbnMuaW5kZXhPZihiKSk7XG4gICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucyA9IHRoaXMuaGFzQ29sdW1uR3JvdXBzID8gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcigoYykgPT4gIWMucGlubmVkKSA6XG4gICAgICAgICAgICB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChjKSA9PiAhYy5waW5uZWQpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucy5maW5kSW5kZXgoeCA9PiB4LmZpZWxkID09PSBhLmZpZWxkKSAtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucy5maW5kSW5kZXgoeCA9PiB4LmZpZWxkID09PSBiLmZpZWxkKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGV4dHJhY3REYXRhRnJvbVNlbGVjdGlvbihzb3VyY2U6IGFueVtdLCBmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSwgY29sdW1uRGF0YT86IGFueVtdKTogYW55W10ge1xuICAgICAgICBsZXQgY29sdW1uc0FycmF5OiBJZ3hDb2x1bW5Db21wb25lbnRbXTtcbiAgICAgICAgbGV0IHJlY29yZCA9IHt9O1xuICAgICAgICBsZXQgc2VsZWN0ZWREYXRhID0gW107XG4gICAgICAgIGxldCBrZXlzID0gW107XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbGxlY3Rpb24gPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGtleXNBbmREYXRhID0gW107XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpZ3gtaGllcmFyY2hpY2FsLWdyaWQnKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbnNpb25Sb3dJbmRleGVzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmV4cGFuc2lvblN0YXRlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5zaW9uUm93SW5kZXhlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb24uc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwYW5zaW9uUm93SW5kZXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb24uZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZEtleSA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvblJvd0luZGV4ZXMuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3dJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKHJvdy5JRCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXggPSBOdW1iZXIocm93LklEKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleCA9IE51bWJlcihyb3cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkS2V5ID4gTnVtYmVyKHJvd0luZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkS2V5LS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Db2xsZWN0aW9uLnNldCh1cGRhdGVkS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuc2lvblJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBleHBhbnNpb25Sb3dJbmRleGVzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFbC5yb3cgPiBOdW1iZXIocm93KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUVsLnJvdy0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gKHRoaXMgYXMgYW55KS50b3RhbEl0ZW1Db3VudCA/PyAwO1xuICAgICAgICBjb25zdCBpc1JlbW90ZSA9IHRvdGFsSXRlbXMgJiYgdG90YWxJdGVtcyA+IHRoaXMuZGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICBsZXQgc2VsZWN0aW9uTWFwO1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lneC1oaWVyYXJjaGljYWwtZ3JpZCcgJiYgc2VsZWN0aW9uQ29sbGVjdGlvbi5zaXplID4gMCkge1xuICAgICAgICAgICAgc2VsZWN0aW9uTWFwID0gaXNSZW1vdGUgPyBBcnJheS5mcm9tKHNlbGVjdGlvbkNvbGxlY3Rpb24pIDpcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHNlbGVjdGlvbkNvbGxlY3Rpb24pLmZpbHRlcigodHVwbGUpID0+IHR1cGxlWzBdIDwgc291cmNlLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25NYXAgPSBpc1JlbW90ZSA/IEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbikgOlxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbikuZmlsdGVyKCh0dXBsZSkgPT4gdHVwbGVbMF0gPCBzb3VyY2UubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNlbGxTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLnNpbmdsZSAmJiBhY3RpdmVFbCkge1xuICAgICAgICAgICAgc2VsZWN0aW9uTWFwLnB1c2goW2FjdGl2ZUVsLnJvdywgbmV3IFNldDxudW1iZXI+KCkuYWRkKGFjdGl2ZUVsLmNvbHVtbildKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNlbGxTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmUgJiYgYWN0aXZlRWwpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcC5wdXNoKFthY3RpdmVFbC5yb3csIG5ldyBTZXQ8bnVtYmVyPigpLmFkZChhY3RpdmVFbC5jb2x1bW4pXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uRGF0YSkge1xuICAgICAgICAgICAgc2VsZWN0ZWREYXRhID0gY29sdW1uRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgZm9yIChsZXQgW3Jvdywgc2V0XSBvZiBzZWxlY3Rpb25NYXApIHtcbiAgICAgICAgICAgIHJvdyA9IHRoaXMucGFnaW5hdG9yICYmICh0aGlzLnBhZ2luZ01vZGUgPT09IEdyaWRQYWdpbmdNb2RlLkxvY2FsICYmIHNvdXJjZSA9PT0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGEpID9cbiAgICAgICAgICAgICAgICByb3cgKyAodGhpcy5wYWdpbmF0b3IucGVyUGFnZSAqIHRoaXMucGFnaW5hdG9yLnBhZ2UpIDogcm93O1xuICAgICAgICAgICAgcm93ID0gaXNSZW1vdGUgPyByb3cgLSB0aGlzLnZpcnR1YWxpemF0aW9uU3RhdGUuc3RhcnRJbmRleCA6IHJvdztcbiAgICAgICAgICAgIGlmICghc291cmNlW3Jvd10gfHwgc291cmNlW3Jvd10uZGV0YWlsc0RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGVtcCA9IEFycmF5LmZyb20oc2V0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWFjaCBvZiB0ZW1wKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uc0FycmF5ID0gdGhpcy5nZXRTZWxlY3RhYmxlQ29sdW1uc0F0KGVhY2gpO1xuICAgICAgICAgICAgICAgIGNvbHVtbnNBcnJheS5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaGVhZGVycyA/IGNvbC5oZWFkZXIgfHwgY29sLmZpZWxkIDogY29sLmZpZWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IHNvdXJjZVtyb3ddLmdob3N0UmVjb3JkID8gc291cmNlW3Jvd10ucmVjb3JkUmVmIDogc291cmNlW3Jvd107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc29sdmVOZXN0ZWRQYXRoKHJvd0RhdGEsIGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IGZvcm1hdHRlcnMgJiYgY29sLmZvcm1hdHRlciA/IGNvbC5mb3JtYXR0ZXIodmFsdWUsIHJvd0RhdGEpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3JkW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSByZWNvcmRba2V5XS50b1N0cmluZygpLmNvbmNhdCgncmVjb3JkUm93LScgKyByb3cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gT2JqZWN0LmtleXMoY29sdW1uRGF0YVswXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjOiBhbnkgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd051bWJlciA9ICtjLnNwbGl0KCdyZWNvcmRSb3ctJylbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gYy5zcGxpdCgncmVjb3JkUm93LScpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkT2JqID0gT2JqZWN0LmFzc2lnbihzZWxlY3RlZERhdGFbcm93TnVtYmVyXSwgcmVjb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YVtyb3dOdW1iZXJdID0gbWVyZ2VkT2JqO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhLnB1c2gocmVjb3JkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNvcmQgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAga2V5c0FuZERhdGEucHVzaChzZWxlY3RlZERhdGEpO1xuICAgICAgICAgICAga2V5c0FuZERhdGEucHVzaChrZXlzKTtcbiAgICAgICAgICAgIHJldHVybiBrZXlzQW5kRGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZERhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0U2VsZWN0YWJsZUNvbHVtbnNBdChpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzKSB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlTGF5b3V0Q29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbCA9PiBjb2wuY29sdW1uTGF5b3V0KVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnZpc2libGVJbmRleCAtIGIudmlzaWJsZUluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbExheW91dCA9IHZpc2libGVMYXlvdXRDb2x1bW5zW2luZGV4XTtcbiAgICAgICAgICAgIHJldHVybiBjb2xMYXlvdXQgPyBjb2xMYXlvdXQuY2hpbGRyZW4udG9BcnJheSgpIDogW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkdyb3VwKVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnZpc2libGVJbmRleCAtIGIudmlzaWJsZUluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiBbdmlzaWJsZUNvbHVtbnNbaW5kZXhdXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RGF0YUZyb21Db2x1bW5zU2VsZWN0aW9uKHNvdXJjZTogYW55W10sIGZvcm1hdHRlcnMgPSBmYWxzZSwgaGVhZGVycyA9IGZhbHNlKTogYW55W10ge1xuICAgICAgICBsZXQgcmVjb3JkID0ge307XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRGF0YSA9IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBkYXRhIG9mIHNvdXJjZSkge1xuICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnMgPyBjb2wuaGVhZGVyIHx8IGNvbC5maWVsZCA6IGNvbC5maWVsZDtcbiAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IGZvcm1hdHRlcnMgJiYgY29sLmZvcm1hdHRlciA/IGNvbC5mb3JtYXR0ZXIoZGF0YVtjb2wuZmllbGRdLCBkYXRhKVxuICAgICAgICAgICAgICAgICAgICA6IGRhdGFbY29sLmZpZWxkXTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGEucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjb3JkID0ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRQaW5uaW5nKCkge1xuICAgICAgICBjb25zdCBwaW5uZWRDb2x1bW5zID0gW107XG4gICAgICAgIGNvbnN0IHVucGlubmVkQ29sdW1ucyA9IFtdO1xuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFdpZHRoKCk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgLy8gV2hlbiBhIGNvbHVtbiBpcyBhIGdyb3VwIG9yIGlzIGluc2lkZSBhIGdyb3VwLCBwaW4gYWxsIHJlbGF0ZWQuXG4gICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBjb2wucGFyZW50LnBpbm5lZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gY2hpbGQucGlubmVkID0gdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBleGNlZWQgdW5waW5uZWQgYXJlYSBtaW4gd2lkdGggYW5kIGdldCBwaW5uZWQgYW5kIHVucGlubmVkIGNvbCBjb2xsZWN0aW9ucy5cbiAgICAgICAgLy8gV2UgdGFrZSBpbnRvIGFjY291bnQgdG9wIGxldmVsIGNvbHVtbnMgKHRvcCBsZXZlbCBncm91cHMgYW5kIG5vbiBncm91cHMpLlxuICAgICAgICAvLyBJZiB0b3AgbGV2ZWwgaXMgdW5waW5uZWQgdGhlIHBpbm5pbmcgaGFuZGxlcyBhbGwgY2hpbGRyZW4gdG8gYmUgdW5waW5uZWQgYXMgd2VsbC5cbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5fY29sdW1ucykge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5waW5uZWQgJiYgIWNvbHVtbi5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBwaW5uZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnBpbm5lZCAmJiBjb2x1bW4ucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi50b3BMZXZlbFBhcmVudC5waW5uZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGlubmVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLnBpbm5lZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB1bnBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdW5waW5uZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFzc2lnbiB0aGUgYXBwbGljYWJsZSBjb2xsZWN0aW9ucy5cbiAgICAgICAgdGhpcy5fcGlubmVkQ29sdW1ucyA9IHBpbm5lZENvbHVtbnM7XG4gICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucyA9IHVucGlubmVkQ29sdW1ucztcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzY3JvbGxUbyhyb3c6IGFueSB8IG51bWJlciwgY29sdW1uOiBhbnkgfCBudW1iZXIsIGluQ29sbGVjdGlvbiA9IHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhKTogdm9pZCB7XG4gICAgICAgIGxldCBkZWxheVNjcm9sbGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvciAmJiB0eXBlb2YgKHJvdykgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjb25zdCByb3dJbmRleCA9IGluQ29sbGVjdGlvbi5pbmRleE9mKHJvdyk7XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gTWF0aC5mbG9vcihyb3dJbmRleCAvIHRoaXMucGFnaW5hdG9yLnBlclBhZ2UpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IucGFnZSAhPT0gcGFnZSkge1xuICAgICAgICAgICAgICAgIGRlbGF5U2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWxheVNjcm9sbGluZykge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5kYXRhQ2hhbmdlZC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIChyb3cpID09PSAnbnVtYmVyJyA/IHJvdyA6IHRoaXMudW5waW5uZWREYXRhVmlldy5pbmRleE9mKHJvdykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbERpcmVjdGl2ZSh0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLFxuICAgICAgICAgICAgICAgIHR5cGVvZiAocm93KSA9PT0gJ251bWJlcicgPyByb3cgOiB0aGlzLnVucGlubmVkRGF0YVZpZXcuaW5kZXhPZihyb3cpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Ib3Jpem9udGFsbHkoY29sdW1uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNjcm9sbFRvSG9yaXpvbnRhbGx5KGNvbHVtbjogYW55IHwgbnVtYmVyKSB7XG4gICAgICAgIGxldCBjb2x1bW5JbmRleCA9IHR5cGVvZiBjb2x1bW4gPT09ICdudW1iZXInID8gY29sdW1uIDogdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uKS52aXNpYmxlSW5kZXg7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJvdyA9IHRoaXMucm93TGlzdC5maW5kKHIgPT4gci52aXJ0RGlyUm93KTtcbiAgICAgICAgY29uc3QgdmlydERpciA9IHNjcm9sbFJvdyA/IHNjcm9sbFJvdy52aXJ0RGlyUm93IDogbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaXNQaW5uaW5nVG9TdGFydCAmJiB0aGlzLnBpbm5lZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPj0gdGhpcy5waW5uZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4IC09IHRoaXMucGlubmVkQ29sdW1ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodmlydERpciwgY29sdW1uSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodmlydERpciwgY29sdW1uSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzY3JvbGxEaXJlY3RpdmUoZGlyZWN0aXZlOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55PiwgZ29hbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGlyZWN0aXZlLnNjcm9sbFRvKGdvYWwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q29sdW1uV2lkdGhTdW0oKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGNvbFN1bSA9IDA7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmhhc0NvbHVtbkxheW91dHMgP1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoeCA9PiB4LmNvbHVtbkxheW91dCkgOiB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcih4ID0+ICF4LmNvbHVtbkdyb3VwKTtcbiAgICAgICAgY29scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb2xTdW0gKz0gcGFyc2VJbnQoKGl0ZW0uY2FsY1dpZHRoIHx8IGl0ZW0uZGVmYXVsdFdpZHRoKSwgMTApIHx8IE1JTklNVU1fQ09MVU1OX1dJRFRIO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFjb2xTdW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgY29sU3VtICs9IHRoaXMuZmVhdHVyZUNvbHVtbnNXaWR0aCgpO1xuICAgICAgICByZXR1cm4gY29sU3VtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGlmeSBjaGFuZ2VzLCByZXNldCBjYWNoZSBhbmQgcG9wdWxhdGVWaXNpYmxlSW5kZXhlcy5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jb2x1bW5zUmVvcmRlcmVkKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKHggPT4geC5jb2x1bW5MYXlvdXQpLmZvckVhY2goeCA9PiB4LnBvcHVsYXRlVmlzaWJsZUluZGV4ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWZ0ZXIgcmVvcmRlcmluZyBpcyBkb25lIHJlc2V0IGNhY2hlZCBjb2x1bW4gY29sbGVjdGlvbnMuXG4gICAgICAgIHRoaXMucmVzZXRDb2x1bW5Db2xsZWN0aW9ucygpO1xuICAgICAgICBjb2x1bW4ucmVzZXRDYWNoZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkRGF0YVZpZXcoKSB7XG4gICAgICAgIHRoaXMuX2RhdGFWaWV3ID0gdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCA/XG4gICAgICAgICAgICBbLi4udGhpcy5waW5uZWREYXRhVmlldywgLi4udGhpcy51bnBpbm5lZERhdGFWaWV3XSA6XG4gICAgICAgICAgICBbLi4udGhpcy51bnBpbm5lZERhdGFWaWV3LCAuLi50aGlzLnBpbm5lZERhdGFWaWV3XTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hcHBseVdpZHRoSG9zdEJpbmRpbmcoKSB7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuX3dpZHRoO1xuICAgICAgICBpZiAod2lkdGggPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50V2lkdGggPSB0aGlzLmNhbGNXaWR0aDtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGggKz0gdGhpcy5zY3JvbGxTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2lkdGggPSBjdXJyZW50V2lkdGggKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hvc3RXaWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZlcnRpY2FsU2Nyb2xsSGFuZGxlcihldmVudCkge1xuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLm9uU2Nyb2xsKGV2ZW50KTtcbiAgICAgICAgdGhpcy5kaXNhYmxlVHJhbnNpdGlvbnMgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmNodW5rTG9hZC5lbWl0KHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc3RhdGUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlUm93RWRpdGluZ092ZXJsYXlTdGF0ZU9uU2Nyb2xsKHRoaXMuY3J1ZFNlcnZpY2Uucm93SW5FZGl0TW9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpc2FibGVUcmFuc2l0aW9ucyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuaGlkZU92ZXJsYXlzKCk7XG4gICAgICAgIHRoaXMuYWN0aW9uU3RyaXA/LmhpZGUoKTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uU3RyaXApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uU3RyaXAuY29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJnczogSUdyaWRTY3JvbGxFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBkaXJlY3Rpb246ICd2ZXJ0aWNhbCcsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFBvc2l0aW9uXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ3JpZFNjcm9sbC5lbWl0KGFyZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaG9yaXpvbnRhbFNjcm9sbEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IGV2ZW50LnRhcmdldC5zY3JvbGxMZWZ0O1xuICAgICAgICB0aGlzLmhlYWRlckNvbnRhaW5lci5vbkhTY3JvbGwoc2Nyb2xsTGVmdCk7XG4gICAgICAgIHRoaXMuX2hvcml6b250YWxGb3JPZnMuZm9yRWFjaCh2Zm9yID0+IHZmb3Iub25IU2Nyb2xsKHNjcm9sbExlZnQpKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50VmlydERpci5jaHVua0xvYWQuZW1pdCh0aGlzLmhlYWRlckNvbnRhaW5lci5zdGF0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oaWRlT3ZlcmxheXMoKTtcbiAgICAgICAgY29uc3QgYXJnczogSUdyaWRTY3JvbGxFdmVudEFyZ3MgPSB7IGRpcmVjdGlvbjogJ2hvcml6b250YWwnLCBldmVudCwgc2Nyb2xsUG9zaXRpb246IHRoaXMuaGVhZGVyQ29udGFpbmVyLnNjcm9sbFBvc2l0aW9uIH07XG4gICAgICAgIHRoaXMuZ3JpZFNjcm9sbC5lbWl0KGFyZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXggPSAtMSwgY2I6IChhcmdzOiBhbnkpID0+IHZvaWQgPSBudWxsKSB7XG4gICAgICAgIGlmICghY2IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm93ID0gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbHRlcihzID0+IHMuaW5kZXggIT09IDApLmNvbmNhdCh0aGlzLnJvd0xpc3QudG9BcnJheSgpKS5maW5kKHIgPT4gci5pbmRleCA9PT0gcm93SW5kZXgpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSkudG90YWxJdGVtQ291bnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmRhdGFDaGFuZ2VkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICByb3cgPSB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmlsdGVyKHMgPT4gcy5pbmRleCAhPT0gMCkuY29uY2F0KHRoaXMucm93TGlzdC50b0FycmF5KCkpLmZpbmQociA9PiByLmluZGV4ID09PSByb3dJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiQXJncyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkFyZ3VtZW50cyhyb3csIHZpc2libGVDb2xJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNiKGNiQXJncyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3W3Jvd0luZGV4XS5kZXRhaWxzRGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5zZXRBY3RpdmVOb2RlKHsgcm93OiByb3dJbmRleCB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5nZXROYXZpZ2F0aW9uQXJndW1lbnRzKHJvdywgdmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgY2IoYXJncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROYXZpZ2F0aW9uQXJndW1lbnRzKHJvdywgdmlzaWJsZUNvbEluZGV4KSB7XG4gICAgICAgIGxldCB0YXJnZXRUeXBlOiBHcmlkS2V5ZG93blRhcmdldFR5cGU7IGxldCB0YXJnZXQ7XG4gICAgICAgIHN3aXRjaCAocm93Lm5hdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlICdpZ3gtZ3JpZC1ncm91cGJ5LXJvdyc6XG4gICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9ICdncm91cFJvdyc7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcm93O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaWd4LWdyaWQtc3VtbWFyeS1yb3cnOlxuICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAnc3VtbWFyeUNlbGwnO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHZpc2libGVDb2xJbmRleCAhPT0gLTEgP1xuICAgICAgICAgICAgICAgICAgICByb3cuc3VtbWFyeUNlbGxzLmZpbmQoYyA9PiBjLnZpc2libGVDb2x1bW5JbmRleCA9PT0gdmlzaWJsZUNvbEluZGV4KSA6IHJvdy5zdW1tYXJ5Q2VsbHMuZmlyc3Q7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpZ3gtY2hpbGQtZ3JpZC1yb3cnOlxuICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAnaGllcmFyY2hpY2FsUm93JztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSByb3c7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAnZGF0YUNlbGwnO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHZpc2libGVDb2xJbmRleCAhPT0gLTEgPyByb3cuY2VsbHMuZmluZChjID0+IGMudmlzaWJsZUNvbHVtbkluZGV4ID09PSB2aXNpYmxlQ29sSW5kZXgpIDogcm93LmNlbGxzLmZpcnN0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHRhcmdldFR5cGUsIHRhcmdldCB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyZW50Um93SW5kZXgsIHByZXZpb3VzID0gZmFsc2UpOiBudW1iZXIge1xuICAgICAgICBpZiAoY3VycmVudFJvd0luZGV4IDwgMCB8fCAoY3VycmVudFJvd0luZGV4ID09PSAwICYmIHByZXZpb3VzKSB8fCAoY3VycmVudFJvd0luZGV4ID49IHRoaXMuZGF0YVZpZXcubGVuZ3RoIC0gMSAmJiAhcHJldmlvdXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJvd0luZGV4O1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgbmV4dC9wcmV2IHJlY29yZCB0aGF0IGlzIGVkaXRhYmxlLlxuICAgICAgICBjb25zdCBuZXh0Um93SW5kZXggPSBwcmV2aW91cyA/IHRoaXMuZmluZFByZXZFZGl0YWJsZURhdGFSb3dJbmRleChjdXJyZW50Um93SW5kZXgpIDpcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuZmluZEluZGV4KChyZWMsIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgIGluZGV4ID4gY3VycmVudFJvd0luZGV4ICYmIHRoaXMuaXNFZGl0YWJsZURhdGFSZWNvcmRBdEluZGV4KGluZGV4KSk7XG4gICAgICAgIHJldHVybiBuZXh0Um93SW5kZXggIT09IC0xID8gbmV4dFJvd0luZGV4IDogY3VycmVudFJvd0luZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByZXZpb3VzIGVkaXRhYmxlIHJvdyBpbmRleCBvciAtMSBpZiBubyBzdWNoIHJvdyBpcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjdXJyZW50SW5kZXggVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGVkaXRhYmxlIHJlY29yZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRQcmV2RWRpdGFibGVEYXRhUm93SW5kZXgoY3VycmVudEluZGV4KTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLmRhdGFWaWV3Lmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgaWYgKGkgPCBjdXJyZW50SW5kZXggJiYgdGhpcy5pc0VkaXRhYmxlRGF0YVJlY29yZEF0SW5kZXgoaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSByZWNvcmQgYXQgdGhlIHNwZWNpZmllZCBkYXRhIHZpZXcgaW5kZXggaXMgYSBhbiBlZGl0YWJsZSBkYXRhIHJlY29yZC5cbiAgICAgKiBJZiByZWNvcmQgaXMgZ3JvdXAgcmVjLCBzdW1tYXJ5IHJlYywgY2hpbGQgcmVjLCBnaG9zdCByZWMuIGV0Yy4gaXQgaXMgbm90IGVkaXRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFWaWV3SW5kZXggVGhlIGluZGV4IG9mIHRoYXQgcmVjb3JkIGluIHRoZSBkYXRhIHZpZXcuXG4gICAgICpcbiAgICAgKi9cbiAgICAvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgaXQgaW50byBDUlVEXG4gICAgcHJpdmF0ZSBpc0VkaXRhYmxlRGF0YVJlY29yZEF0SW5kZXgoZGF0YVZpZXdJbmRleCkge1xuICAgICAgICBjb25zdCByZWMgPSB0aGlzLmRhdGFWaWV3W2RhdGFWaWV3SW5kZXhdO1xuICAgICAgICByZXR1cm4gIXJlYy5leHByZXNzaW9uICYmICFyZWMuc3VtbWFyaWVzICYmICFyZWMuY2hpbGRHcmlkc0RhdGEgJiYgIXJlYy5kZXRhaWxzRGF0YSAmJlxuICAgICAgICAgICAgIXRoaXMuaXNHaG9zdFJlY29yZEF0SW5kZXgoZGF0YVZpZXdJbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgcmVjb3JkIGF0IHRoZSBzcGVjaWZpZWQgZGF0YSB2aWV3IGluZGV4IGlzIGEgZ2hvc3QuXG4gICAgICogSWYgcmVjb3JkIGlzIHBpbm5lZCBidXQgaXMgbm90IGluIHBpbm5lZCBhcmVhIHRoZW4gaXQgaXMgYSBnaG9zdCByZWNvcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVZpZXdJbmRleCBUaGUgaW5kZXggb2YgdGhhdCByZWNvcmQgaW4gdGhlIGRhdGEgdmlldy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzR2hvc3RSZWNvcmRBdEluZGV4KGRhdGFWaWV3SW5kZXgpIHtcbiAgICAgICAgY29uc3QgaXNQaW5uZWQgPSB0aGlzLmlzUmVjb3JkUGlubmVkKHRoaXMuZGF0YVZpZXdbZGF0YVZpZXdJbmRleF0pO1xuICAgICAgICBjb25zdCBpc0luUGlubmVkQXJlYSA9IHRoaXMuaXNSZWNvcmRQaW5uZWRCeVZpZXdJbmRleChkYXRhVmlld0luZGV4KTtcbiAgICAgICAgcmV0dXJuIGlzUGlubmVkICYmICFpc0luUGlubmVkQXJlYTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWRQb3NpdGlvbihyb3dJbmRleCwgY29sSW5kZXgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuc3VtbWFyaWVzUm93TGlzdC5maWx0ZXIocyA9PiBzLmluZGV4ICE9PSAwKS5jb25jYXQodGhpcy5yb3dMaXN0LnRvQXJyYXkoKSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5Hcm91cCAmJiBjb2wudmlzaWJsZUluZGV4ID49IDAgJiYgIWNvbC5oaWRkZW4pLmxlbmd0aDtcbiAgICAgICAgaWYgKHJvd3MgPCAxIHx8IGNvbHMgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvd0luZGV4ID4gLTEgJiYgcm93SW5kZXggPCB0aGlzLmRhdGFWaWV3Lmxlbmd0aCAmJlxuICAgICAgICAgICAgY29sSW5kZXggPiAtIDEgJiYgY29sSW5kZXggPD0gTWF0aC5tYXgoLi4udGhpcy52aXNpYmxlQ29sdW1ucy5tYXAoYyA9PiBjLnZpc2libGVJbmRleCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kKHRleHQ6IHN0cmluZywgaW5jcmVtZW50OiBudW1iZXIsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbiwgc2Nyb2xsPzogYm9vbGVhbiwgZW5kRWRpdCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZEVkaXQpIHtcbiAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZVJlc29sdmVkID0gY2FzZVNlbnNpdGl2ZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgZXhhY3RNYXRjaFJlc29sdmVkID0gZXhhY3RNYXRjaCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgbGV0IHJlYnVpbGRDYWNoZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQgIT09IHRleHQgfHxcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZSAhPT0gY2FzZVNlbnNpdGl2ZVJlc29sdmVkIHx8XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2ggIT09IGV4YWN0TWF0Y2hSZXNvbHZlZCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mbyA9IHtcbiAgICAgICAgICAgICAgICBzZWFyY2hUZXh0OiB0ZXh0LFxuICAgICAgICAgICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogY2FzZVNlbnNpdGl2ZVJlc29sdmVkLFxuICAgICAgICAgICAgICAgIGV4YWN0TWF0Y2g6IGV4YWN0TWF0Y2hSZXNvbHZlZCxcbiAgICAgICAgICAgICAgICBtYXRjaEluZm9DYWNoZTogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJlYnVpbGRDYWNoZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggKz0gaW5jcmVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlYnVpbGRDYWNoZSkge1xuICAgICAgICAgICAgdGhpcy5yb3dMaXN0LmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyb3cuY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93LmNlbGxzLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuaGlnaGxpZ2h0VGV4dCh0ZXh0LCBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQsIGV4YWN0TWF0Y2hSZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRNYXRjaENhY2hlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID49IHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA9IHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hJbmZvID0gdGhpcy5sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZVt0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mbyA9IHsgLi4udGhpcy5sYXN0U2VhcmNoSW5mbyB9O1xuXG4gICAgICAgICAgICBpZiAoc2Nyb2xsICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8obWF0Y2hJbmZvLnJvdywgbWF0Y2hJbmZvLmNvbHVtbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUuc2V0QWN0aXZlSGlnaGxpZ2h0KHRoaXMuaWQsIHtcbiAgICAgICAgICAgICAgICBjb2x1bW46IG1hdGNoSW5mby5jb2x1bW4sXG4gICAgICAgICAgICAgICAgcm93OiBtYXRjaEluZm8ucm93LFxuICAgICAgICAgICAgICAgIGluZGV4OiBtYXRjaEluZm8uaW5kZXgsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1hdGNoSW5mby5tZXRhZGF0YSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLmNsZWFyQWN0aXZlSGlnaGxpZ2h0KHRoaXMuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUubGVuZ3RoO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVidWlsZE1hdGNoQ2FjaGUoKSB7XG4gICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUgPSBbXTtcblxuICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gdGhpcy5sYXN0U2VhcmNoSW5mby5jYXNlU2Vuc2l0aXZlO1xuICAgICAgICBjb25zdCBleGFjdE1hdGNoID0gdGhpcy5sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoO1xuICAgICAgICBjb25zdCBzZWFyY2hUZXh0ID0gY2FzZVNlbnNpdGl2ZSA/IHRoaXMubGFzdFNlYXJjaEluZm8uc2VhcmNoVGV4dCA6IHRoaXMubGFzdFNlYXJjaEluZm8uc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICAgIGNvbnN0IGNvbHVtbkl0ZW1zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoKGMpID0+ICFjLmNvbHVtbkdyb3VwKS5zb3J0KChjMSwgYzIpID0+IGMxLnZpc2libGVJbmRleCAtIGMyLnZpc2libGVJbmRleCk7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoZGF0YVJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbHVtbkl0ZW1zLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwaXBlQXJncyA9IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGMuZmllbGQpLnBpcGVBcmdzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYy5mb3JtYXR0ZXIgPyBjLmZvcm1hdHRlcihyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSwgZGF0YVJvdykgOlxuICAgICAgICAgICAgICAgICAgICBjLmRhdGFUeXBlID09PSAnbnVtYmVyJyA/IHRoaXMuZGVjaW1hbFBpcGUudHJhbnNmb3JtKHJlc29sdmVOZXN0ZWRQYXRoKGRhdGFSb3csIGMuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGlwZUFyZ3MuZGlnaXRzSW5mbywgdGhpcy5sb2NhbGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuZGF0YVR5cGUgPT09ICdkYXRlJyA/IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHJlc29sdmVOZXN0ZWRQYXRoKGRhdGFSb3csIGMuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVBcmdzLmZvcm1hdCwgcGlwZUFyZ3MudGltZXpvbmUsIHRoaXMubG9jYWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzb2x2ZU5lc3RlZFBhdGgoZGF0YVJvdywgYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgYy5zZWFyY2hhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hWYWx1ZSA9IGNhc2VTZW5zaXRpdmUgPyBTdHJpbmcodmFsdWUpIDogU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGFjdE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoVmFsdWUgPT09IHNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KCdwaW5uZWQnLCB0aGlzLmlzUmVjb3JkUGlubmVkQnlJbmRleChyb3dJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZGF0YVJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2NjdXJlbmNlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaEluZGV4ID0gc2VhcmNoVmFsdWUuaW5kZXhPZihzZWFyY2hUZXh0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlYXJjaEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5zZXQoJ3Bpbm5lZCcsIHRoaXMuaXNSZWNvcmRQaW5uZWRCeUluZGV4KHJvd0luZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBkYXRhUm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGMuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBvY2N1cmVuY2VJbmRleCsrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbHVlID0gc2VhcmNoVmFsdWUuc3Vic3RyaW5nKHNlYXJjaEluZGV4ICsgc2VhcmNoVGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZGV4ID0gc2VhcmNoVmFsdWUuaW5kZXhPZihzZWFyY2hUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBBYm91dCB0byBNb3ZlIHRvIENSVURcbiAgICBwcml2YXRlIGNvbmZpZ3VyZVJvd0VkaXRpbmdPdmVybGF5KHJvd0lEOiBhbnksIHVzZU91dGVyID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHNldHRpbmdzID0gdGhpcy5yb3dFZGl0U2V0dGluZ3M7XG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKHRoaXMucm93RWRpdGluZ092ZXJsYXkub3ZlcmxheUlkKTtcbiAgICAgICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgICAgICAgIHNldHRpbmdzID0gb3ZlcmxheS5zZXR0aW5ncztcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy5vdXRsZXQgPSB1c2VPdXRlciA/IHRoaXMucGFyZW50Um93T3V0bGV0RGlyZWN0aXZlIDogdGhpcy5yb3dPdXRsZXREaXJlY3RpdmU7XG4gICAgICAgIHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuc2V0dGluZ3MuY29udGFpbmVyID0gdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBwaW5uZWQgPSB0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihyb3dJRCkgIT09IC0xO1xuICAgICAgICBjb25zdCB0YXJnZXRSb3cgPSAhcGlubmVkID8gdGhpcy5ncmlkQVBJLmdldF9yb3dfYnlfa2V5KHJvd0lEKSA6IHRoaXMucGlubmVkUm93cy5maW5kKHggPT4geC5yb3dJRCA9PT0gcm93SUQpO1xuICAgICAgICBpZiAoIXRhcmdldFJvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldHRpbmdzLnRhcmdldCA9IHRhcmdldFJvdy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMudG9nZ2xlUm93RWRpdGluZ092ZXJsYXkodHJ1ZSk7XG4gICAgfVxufVxuIl19