@sbb-esta/lyne-elements-experimental-dev 5.0.0-next.2-dev.1778105104 → 5.0.0-next.2-dev.1778136155

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.
@@ -1 +1 @@
1
- {"version":3,"file":"seat-reservation-base-element.d.ts","sourceRoot":"","sources":["../../../../../src/elements-experimental/seat-reservation/seat-reservation/seat-reservation-base-element.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seat-reservation-base-element.d.ts","sourceRoot":"","sources":["../../../../../src/elements-experimental/seat-reservation/seat-reservation/seat-reservation-base-element.ts"],"names":[],"mappings":"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"}
@@ -553,7 +553,7 @@ var SeatReservationBaseElement = (() => {
553
553
  if (changedProperties.has("height") && !!this.height) {
554
554
  const seatReservationLayer = this.seatReservations[this.currSelectedDeckIndex] || null;
555
555
  if (seatReservationLayer?.coachItems.length) {
556
- this.baseGridSize = Math.round(this.height / seatReservationLayer.coachItems[0].dimension.h);
556
+ this.baseGridSize = this.height / seatReservationLayer.coachItems[0].dimension.h;
557
557
  this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
558
558
  this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
559
559
  this._initPrepareSeatReservationData();
@@ -799,8 +799,8 @@ var SeatReservationBaseElement = (() => {
799
799
  if (coachDimension && !isOriginHeight) elementDimension.h += this.coachBorderOffset * 2;
800
800
  if (isStretchHeight) elementDimension.h += this.coachBorderOffset;
801
801
  return {
802
- w: this.baseGridSize * elementDimension.w,
803
- h: this.baseGridSize * elementDimension.h
802
+ w: Math.round(this.baseGridSize * elementDimension.w),
803
+ h: Math.round(this.baseGridSize * elementDimension.h)
804
804
  };
805
805
  }
806
806
  getCalculatedPosition(elementPosition, elementDimension, coachDimension, isOriginHeight) {
@@ -810,8 +810,8 @@ var SeatReservationBaseElement = (() => {
810
810
  else if (elementPosition.y + elementDimension.h === endPosHeight) elementPosition.y += this.coachBorderOffset;
811
811
  }
812
812
  return {
813
- x: this.baseGridSize * elementPosition.x,
814
- y: this.baseGridSize * elementPosition.y,
813
+ x: Math.round(this.baseGridSize * elementPosition.x),
814
+ y: Math.round(this.baseGridSize * elementPosition.y),
815
815
  z: elementPosition.z
816
816
  };
817
817
  }
@@ -1368,10 +1368,10 @@ var SeatReservationBaseElement = (() => {
1368
1368
  if (element.position.y === 0) pos.y -= this.coachBorderOffset;
1369
1369
  if (coachDimension.h === element.position.y + element.dimension.h) dim.h += this.coachBorderOffset * 2;
1370
1370
  }
1371
- dim.w *= this.baseGridSize;
1372
- dim.h *= this.baseGridSize;
1373
- pos.x *= this.baseGridSize;
1374
- pos.y *= this.baseGridSize;
1371
+ dim.w = Math.round(dim.w * this.baseGridSize);
1372
+ dim.h = Math.round(dim.h * this.baseGridSize);
1373
+ pos.x = Math.round(pos.x * this.baseGridSize);
1374
+ pos.y = Math.round(pos.y * this.baseGridSize);
1375
1375
  return {
1376
1376
  icon: element.icon && element.icon.endsWith("DRIVER_AREA") ? element.icon?.concat("_", this.seatReservations[this.currSelectedDeckIndex].vehicleType) : element.icon,
1377
1377
  rotation: calcRotation,
@@ -1456,4 +1456,4 @@ var SeatReservationBaseElement = (() => {
1456
1456
  //#endregion
1457
1457
  export { SeatReservationBaseElement };
1458
1458
 
1459
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZm9yY2VUeXBlLFxuICBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQsXG4gIFNiYkVsZW1lbnQsXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBJY29uVG9TdmcsXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50TW91bnRpbmcsXG4gIEVsZW1lbnRQb3NpdGlvbixcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBQbGFjZVRyYXZlbENsYXNzLFxuICBTZWF0UmVzZXJ2YXRpb24sXG4gIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcyxcbiAgVHJhdmVsRGlyZWN0aW9uLFxufSBmcm9tICcuLi9jb21tb24vdHlwZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQudHMnO1xuXG5lbnVtIFNjcm9sbERpcmVjdGlvbiB7XG4gIHJpZ2h0ID0gJ3JpZ2h0JyxcbiAgbGVmdCA9ICdsZWZ0Jyxcbn1cblxuaW50ZXJmYWNlIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50IHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTZWF0cmVzZXJ2YXRpb25TdHJ1Y3R1cmUge1xuICBkZWNrczogU2VhdHJlc2VydmF0aW9uRGVja1tdO1xufVxuXG5pbnRlcmZhY2UgU2VhdHJlc2VydmF0aW9uRGVjayB7XG4gIGRlY2tJbmRleDogbnVtYmVyO1xuICBkZWNrQ29hY2hlczogQ29hY2hTdHJ1Y3R1cmVbXTtcbn1cblxuaW50ZXJmYWNlIENvYWNoU3RydWN0dXJlIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGFyZWFFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgc2VydmljZUVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBvdGhlckVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBib3JkZXJNaWRkbGVFbGVtZW50OiBCYXNlRWxlbWVudDtcbiAgaGFzT3ZlcmhhbmdpbmdFbGVtZW50czogYm9vbGVhbjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgU2JiRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogRGlzcGxheXMgYW4gYXJyb3cgc2hvd2luZyB3aGF0IGRpcmVjdGlvbiBkb2VzIHRyYWluIGRyaXZlKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndHJhdmVsLWRpcmVjdGlvbicsIHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgdHJhdmVsRGlyZWN0aW9uOiBUcmF2ZWxEaXJlY3Rpb24gPSAnTk9ORSc7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIG5hdmlnYXRpb24gY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGFzLW5hdmlnYXRpb24nLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoYXNOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBpcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FsaWduLXZlcnRpY2FsJywgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSwgdXNlRGVmYXVsdDogdHJ1ZSB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWxpZ25WZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3MgYmFzZSBncmlkIHNpemUgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Jhc2UtZ3JpZC1zaXplJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBiYXNlR3JpZFNpemU6IG51bWJlciA9IDE2O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3Mgd2lkdGggKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGVpZ2h0OiBudW1iZXIgPSBudWxsITtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIHNlYXRzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFNlYXRSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgYmljeWNsZSBwbGFjZXMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1iaWN5Y2xlLXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4QmljeWNsZVJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXNlbGVjdC1jb2FjaC1pbmRleCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJlc2VsZWN0Q29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIHRpdGxlIGluZm9ybWF0aW9uIGF0IHBsYWNlLWNvbnRyb2xzLCBuYXZpZ2F0aW9uLWNvYWNoZXMgYW5kIG5hdmlnYXRpb24tc2VydmljZXMgY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2hvdy10aXRsZS1pbmZvJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2hvd1RpdGxlSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBzZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9jdXNlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgaG92ZXJlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIERlc2NyaWJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyBpbiBwaXhlbHNcbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hlcyA9IDQ7XG4gIC8vIFRoZSBjYWxjdWxhdGVkIGNvYWNoQm9yZGVyT2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNvYWNoIGJvcmRlciBncmFwaGljLFxuICAvLyBidXQgYWxzbyB0byBwb3NpdGlvbiBvdGhlciBncmFwaGljcyB0aGF0IGFyZSBhbGlnbmVkIGRpcmVjdGx5IHRvIHRoZSBjb2FjaCBib3JkZXIuXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgZGVja3MgYnkgbXVsdGlwbGUgZGVjayB2aXN1YWxpemF0aW9uXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9IDQ4O1xuICAvLyBEZXNjcmliZXMgdGhlIGZpeCB3aWR0aCBvZiBjb2FjaCBuYXZpZ2F0aW9uIGJ1dHRvblxuICBwcm90ZWN0ZWQgY29hY2hOYXZCdXR0b25EaW06IG51bWJlciA9IDA7XG4gIC8vIERlc2NyaWJlcyB0aGUgY2FsY3VsYXRlZCBkaW1lbnNpb24gZm9yIHRoZSBhcmVhIGljb25zLCB3aGljaCBpcyB1c2VkIHRvIHNldCB0aGUgbWF4IHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgaWNvbnNcbiAgcHJvdGVjdGVkIGdsb2JhbEFyZWFJY29uRGltOiBFbGVtZW50RGltZW5zaW9uID0geyB3OiAyLCBoOiAyIH07XG4gIC8vICNUSU1PLTQ1ODU4XG4gIC8vIERlc2NyaWJlcyB0aGUgcGFkZGluZyBmb3IgdGhlIGljb24gd2l0aGluIHRoZSBhcmVhIGFzIGEgcGVyY2VudGFnZSBzaXplIG9mIHRoZSBhcmVhIHNlbGYuIDgwJSAoMC44IHBlcmNlbnQpIGNvcnJlc3BvbmRzXG4gIC8vIHRvIGEgZ29vZCBvcHRpY2FsIHNpemUgYW5kIGNyZWF0ZXMgYSBnb29kIHBhZGRpbmcgZnJvbSB0aGUgYXJlYSB0aSBpY29uXG4gIHByb3RlY3RlZCBnbG9iYWxBcmVhSWNvblBhZGRpbmc6IG51bWJlciA9IDAuODtcbiAgcHJvdGVjdGVkIGNvYWNoSXRlbURldGFpbHNFbGVtZW50czogQ29hY2hJdGVtRGV0YWlsc1tdID0gW107XG4gIHByb3RlY3RlZCBjdXJyU2Nyb2xsRGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24gPSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQ7XG4gIHByb3RlY3RlZCBtYXhDYWxjQ29hY2hlc1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkRGVja0luZGV4OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMgPSB7XG4gICAgc2VhdHM6IFtdLFxuICAgIGJpY3ljbGVzOiBbXSxcbiAgfTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNNdWx0aXBsZURlY2tzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZTogU2VhdHJlc2VydmF0aW9uU3RydWN0dXJlID0ge1xuICAgIGRlY2tzOiBbXSxcbiAgfTtcblxuICAvLyBBcmVhIGljb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBmaXhlZCBkdXJpbmcgcm90YXRpb24gd2hlbiB2ZXJ0aWNhbCBtb2RlIGlzIHNlbGVjdGVkXG4gIHByb3RlY3RlZCBub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucyA9IFsnRU5UUllfRVhJVCddO1xuXG4gIC8vIEdyYXBoaWNzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCB3aXRoIGFuIGFyZWFcbiAgcHJvdGVjdGVkIG5vdEFyZWFFbGVtZW50cyA9IFtcbiAgICAnRFJJVkVSX0FSRUEnLFxuICAgICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0hJR0gnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX01JRERMRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfTE9XJyxcbiAgICAnQ09NUEFSVE1FTlRfV0FMTCcsXG4gIF07XG5cbiAgLy8gR3JhcGhpY3MgdGhhdCBzaG91bGQgbm90IGJlIHJlbmRlcmVkIHdpdGggYW4gYXJlYVxuICBwcm90ZWN0ZWQgbWlkZGxlQm9yZGVyRG9ja2luZ0VsZW1lbnRzID0gW1xuICAgICdEUklWRVJfQVJFQScsXG4gICAgJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICdDT0FDSF9QQVNTQUdFJyxcbiAgICAnQ09BQ0hfV0FMTF9OT19QQVNTQUdFJyxcbiAgXTtcblxuICBwcml2YXRlIF9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICBwcml2YXRlIF9zY3JvbGxUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGFzdFN0YXJ0U2Nyb2xsUG9zID0gLTE7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gQWRkIGJsdXIgZXZlbnQgbGlzdGVuZXIgb24gdGhlIGVudGlyZSBjb21wb25lbnQgdG8gZGV0ZWN0IHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBjb21wb25lbnRcbiAgICAvLyBieSB1c2luZyB0YWIgbmF2aWdhdGlvbiBvciBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQuIEluIHRoaXMgY2FzZSwgd2UgY2FuIHJlc2V0IHRoZSBzZWxlY3RlZCBjb2FjaCBhbmQgcGxhY2UuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gdGhpcy5fb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2VhdFJlc2VydmF0aW9ucycpKSB7XG4gICAgICB0aGlzLmhhc011bHRpcGxlRGVja3MgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lmxlbmd0aCA+IDE7XG5cbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gTWF0aC5yb3VuZChcbiAgICAgICAgICB0aGlzLmhlaWdodCAvIHNlYXRSZXNlcnZhdGlvbkxheWVyLmNvYWNoSXRlbXNbMF0uZGltZW5zaW9uLmgsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemUnLCBgJHt0aGlzLmJhc2VHcmlkU2l6ZX1weGApO1xuXG4gICAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2FsaWduVmVydGljYWwnKSkge1xuICAgICAgdGhpcy5faW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ByZXNlbGVjdENvYWNoSW5kZXgnKSkge1xuICAgICAgLy8gc2V0VGltZW91dCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aXRob3V0LCBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKSB3b3VsZCBmYWlsIHdpdGggTlBFIGJlY2F1c2VcbiAgICAgIC8vIHRoZSBjb2FjaFNjcm9sbEFyZWEgaXMgbm90IHlldCBpbml0aWFsaXplZFxuICAgICAgdGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaCh0aGlzLnByZXNlbGVjdENvYWNoSW5kZXgpLCAxKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbmF2aWdhdGVCeURpcmVjdGlvbkJ0bihidG5EaXJlY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgIGxldCBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA9IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICBpZiAoYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fTEVGVCcgJiYgbmF2aWdhdGVUb0NvYWNoSW5kZXggPiAwKSB7XG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA9XG4gICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPSAtMSA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAtIDEgOiAwO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgJiZcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4IDxcbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XT8uY29hY2hJdGVtcy5sZW5ndGggLSAxXG4gICAgKSB7XG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA9XG4gICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPSAtMSA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCArIDEgOiAwO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5hdmlnYXRlVG9Db2FjaEluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRhIGNhbiBiZSBwcmVwYXJlZCBvbmNlIGZvciB0aGUgZW50aXJlIGNvbXBvbmVudFxuICAgKiBpbiBvcmRlciB0byBhdm9pZCByZWN1cnJpbmcgaXRlcmF0aW9uIHByb2Nlc3NlcyBpbiByZW5kZXJpbmcuXG4gICAqL1xuICBwcml2YXRlIF9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5fZGV0ZXJtaW5lQmFzZUZvbnRTaXplKCk7XG5cbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZURlY2tzKSB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZGVja3MsIHdlIG5lZWQgdG8gY2hlY2tcbiAgICAgIC8vIHdoZXRoZXIgZW1wdHkgY29hY2hlcyBuZWVkIHRvIGJlIGFkZGVkIG9uIGRpZmZlcmVudCBkZWNrIGxldmVsc1xuICAgICAgdGhpcy5faW5pdEVtcHR5Q29hY2hEZWNrT2Zmc2V0cygpO1xuICAgIH1cblxuICAgIHRoaXMuX3ByZXBhcmVDb2FjaEl0ZW1EZXRhaWxzRGF0YSgpO1xuICAgIHRoaXMuX3ByZXBhcmVTZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmVJbmZvcm1hdGlvbigpO1xuICAgIHRoaXMuX3ByZXBhcmVPcHRpbWl6ZUFyZWFJY29uRGltZW5zaW9uQnlNZWRpYW4oKTtcbiAgfVxuXG4gIC8qKiBJbml0IHNjcm9sbCBldmVudCBoYW5kbGluZyBmb3IgY29hY2ggbmF2aWdhdGlvbiAqL1xuICBwcm90ZWN0ZWQgaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29hY2hTY3JvbGxBcmVhID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgJyNzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYScsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgJyNzYmItc3JfX25hdmlnYXRpb24tbGlzdC1jb2FjaGVzJyxcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgPyB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdXG4gICAgICA6IG51bGw7XG4gICAgaWYgKHNlYXRSZXNlcnZhdGlvbkRlY2sgJiYgc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENhbGN1bGF0ZXMgdGhlIGFic29sdXRlIGhlaWdodCBvZiBvbmUgY29hY2ggaW5jbHVkaW5nIGJvcmRlciBwYWRkaW5nXG4gICAgICBjb25zdCBjb2FjaEhlaWdodFdpdGhCb3JkZXJQYWRkaW5nID1cbiAgICAgICAgc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oICogdGhpcy5iYXNlR3JpZFNpemUgKyB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZztcblxuICAgICAgLy8gQ2FsY3VsYXRlIGVhY2ggZ2FwIGJldHdlZW4gbXVsdGlwbGUgY29hY2ggdGhlIGRlY2tzLlxuICAgICAgLy8gTm8gZ2FwIGV4aXN0IGlmIGp1c3Qgb25lIGNvYWNoIGRlY2sgZXhpc3QuXG4gICAgICBjb25zdCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9ICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMSkgKiB0aGlzLmdhcEJldHdlZW5Db2FjaERlY2tzO1xuXG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eShcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0JyxcbiAgICAgICAgYCR7Y29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyAqIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggKyBnYXBCZXR3ZWVuQ29hY2hEZWNrc31gLFxuICAgICAgKTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWRlY2tzJywgYCR7dGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSkge1xuICAgICAgdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIDogdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gSW5pdCB0aGUgY29hY2hOYXZCdXR0b25EaW0gZGltZW5zaW9uLCB3aGljaCBpcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHNjcm9sbCBuYXZpZ2F0aW9uIGxhdGVyXG4gICAgICBjb25zdCBuYXZDb2FjaGVzTGlzdCA9IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEucXVlcnlTZWxlY3RvcigndWwgPiBsaScpIGFzIEhUTUxVTGlzdEVsZW1lbnQ7XG4gICAgICBpZiAobmF2Q29hY2hlc0xpc3QpIHtcbiAgICAgICAgY29uc3QgZmlyc3RMaUVsZURpbWVuc2lvbiA9IG5hdkNvYWNoZXNMaXN0Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5jb2FjaE5hdkJ1dHRvbkRpbSA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgID8gZmlyc3RMaUVsZURpbWVuc2lvbi5oZWlnaHRcbiAgICAgICAgICA6IGZpcnN0TGlFbGVEaW1lbnNpb24ud2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29hY2hTY3JvbGxBcmVhICYmIHNlYXRSZXNlcnZhdGlvbkRlY2spIHtcbiAgICAgIC8vIEluaXQgdGhlIHN0YXJ0IG9mZnNldCBmb3IgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBjb2FjaCBzY3JvbGwgdHJpZ2dlciBwb3NpdGlvbnNcbiAgICAgIGxldCBjdXJyQ2FsY1RyaWdnZXJQb3MgPSAwO1xuICAgICAgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIFByZWNhbGN1bGF0ZSB0cmlnZ2VyIHNjcm9sbCBwb3NpdGlvbiBhcnJheSBkZXBlbmRzIG9uIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24gPSBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXMubWFwKChfLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjb2FjaFN0cnVjdHVyZSA9XG4gICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUuZGVja3NbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmRlY2tDb2FjaGVzW2luZGV4XTtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3NYID0gY3VyckNhbGNUcmlnZ2VyUG9zO1xuXG4gICAgICAgIC8vIENhbGN1bGF0aW9uIG9mIHRoZSBlbmQgc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb24gb2YgYSBjb2FjaCwgaW5jbHVkaW5nIHRoZSBnYXAgYmV0d2VlbiB0aGUgY29hY2hlc1xuICAgICAgICAvLyBUaGUgZ2FwIGlzIG1heWJlIGFkanVzdGVkIGlmIG92ZXJoYW5naW5nIHBsYWNlcyBvciBncmFwaGljcyBleGlzdFxuICAgICAgICBjdXJyQ2FsY1RyaWdnZXJQb3MgKz1cbiAgICAgICAgICBjb2FjaFN0cnVjdHVyZS53aWR0aCArXG4gICAgICAgICAgKCFjb2FjaFN0cnVjdHVyZS5oYXNPdmVyaGFuZ2luZ0VsZW1lbnRzXG4gICAgICAgICAgICA/IHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXNcbiAgICAgICAgICAgIDogMiAqIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhcnQ6IHN0YXJ0UG9zWCxcbiAgICAgICAgICBlbmQ6IGN1cnJDYWxjVHJpZ2dlclBvcyxcbiAgICAgICAgICB3aWR0aDogY29hY2hTdHJ1Y3R1cmUud2lkdGgsXG4gICAgICAgIH0gYXMgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IG1heGltdW0gY2FsY3VsYXRlZCBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy5tYXhDYWxjQ29hY2hlc1dpZHRoID0gY3VyckNhbGNUcmlnZ2VyUG9zIC0gdGhpcy5nYXBCZXR3ZWVuQ29hY2hlcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIGV2ZW50IGhhbmRsZXIgbWFuYWdlZCB0aGUgZW5kIG9mIHNjcm9sbGluZyBpbnNpZGUgdGhlIGNvYWNoIHNjcm9sbCBhcmVhLlxuICAgKiBUaW1lb3V0IGV2ZW50IGhhbmRsaW5nIHRvIGNoZWNrIGlmIHRoZSBzY3JvbGxpbmcgaGFzIGJlZW4gY29tcGxldGVkLlxuICAgKiBJdCBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBTYWZhcmkgYnJvd3NlciBkb2VzIG5vdCBoYW5kbGUgc2Nyb2xsZW5kIGV2ZW50LFxuICAgKiBhbmQgd2UgdGhlcmVmb3JlIGltaXRhdGUgdGhpcyBldmVudCAtPiBzY3JvbGxlbmQuXG4gICAqL1xuICBAZXZlbnRPcHRpb25zKHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICBwcm90ZWN0ZWQgY29hY2hBcmVhU2Nyb2xsZW5kKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zY3JvbGxUaW1lb3V0KSB7XG4gICAgICAvLyBGaXJzdCwgd2UgY2xlYXJlZCB0aGUgcmVnaXN0ZXJlZCB0aW1lb3V0LCBhcyB0aGUgc2Nyb2xsaW5nIGlzIHN0aWxsIHJ1bm5pbmdcbiAgICAgIC8vIGFuZCB0aHVzIHdlIHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IGZ1bmN0aW9uXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fc2Nyb2xsVGltZW91dCk7XG4gICAgfVxuICAgIC8vIElmIG5vIGZ1cnRoZXIgc2Nyb2xsIGV2ZW50IGlzIGZpcmVkLCB0aGUgbmV4dCB0aW1lb3V0IGNhbiBleGVjdXRlIHRoZSBpbm5lciBmdW5jdGlvbiBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQgd2l0aG91dCBjbGVhcmluZ1xuICAgIHRoaXMuX3Njcm9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50KCksIDE1MCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgbm8gbmF2aWdhdGlvbiBleGlzdHMgKHByb3BlcnR5IHNldHRpbmcgLT4gaGFzTmF2aWdhdGlvbikgYW5kIGEgdGFibGUgY29hY2ggZ2V0cyB0aGUgZm9jdXMsXG4gICAqIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgY29hY2ggbXVzdCBiZSBhdXRvbWF0aWNhbGx5IHByZXNlbGVjdGVkIHRvIGNvbnRyb2wgdGhlIHBsYWNlIG5hdmlnYXRpb24gdmlhIGtleWJvYXJkXG4gICAqXG4gICAqIEBwYXJhbSBmb2N1c0NvYWNoSW5kZXhcbiAgICovXG4gIHByb3RlY3RlZCBvbkZvY3VzVGFibGVDb2FjaEFuZFByZXNlbGVjdFBsYWNlKGZvY3VzQ29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgJiYgIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgIGZvY3VzQ29hY2hJbmRleCA9PT0gMFxuICAgICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleCgtMSlcbiAgICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoZm9jdXNDb2FjaEluZGV4KTtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdpbGwgYmUgdHJpZ2dlcmVkIGJ5IGZvY3VzIG5hdmlnYXRpb24gZGlyZWN0aW9uICovXG4gIHByb3RlY3RlZCBvbkZvY3VzTmF2RGlyZWN0aW9uQnV0dG9uKCk6IHZvaWQge1xuICAgIC8vIElmIGFueSBuYXZpZ2F0aW9uIGRpcmVjdGlvbiBidXR0b24gKHJpZ2h0fGxlZnQpIGdldCB0aGUgZm9jdXMsIHNvIHdlIGhhdmUgbWFudWFsIHJlc2V0IHRoZSBwcmV2aW91cyBmb2N1c0NvYWNoSW5kZXguXG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICB9XG5cbiAgLyoqIFRBQiBLZXkgRXZlbnQgaGFuZGxpbmcgZm9yIENvYWNoIE5hdmlnYXRpb24gKi9cbiAgcHJvdGVjdGVkIG9uS2V5TmF2aWdhdGlvbk5hdkNvYWNoQnV0dG9uKFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50LFxuICAgIGN1cnJOYXZDb2FjaEJ1dHRvbkluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLlRhYikge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ25hdmlnYXRpb24nLCBjdXJyTmF2Q29hY2hCdXR0b25JbmRleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQnkgdXNpbmcgYW55IG90aGVyIGtleSAobm8gVEFCKSBpbnNpZGUgdGhlIE5hdmlnYXRpb24gYXJlYSwgc28gd2UgY2FuIGhhbmRsZSB0aGlzIGJ5IHVzaW5nIHRoZSBsb2dpYyBmcm9tIGtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmdcbiAgICBpZiAoaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgdGhpcy5rZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKiogR2VuZXJhbCBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciB0YWIgbmF2aWdhdGlvbiBpbnNpZGUgdGhlIGNvYWNoIG5hdmlnYXRpb24gYXJlYSBhbmQgdGhlIHNlYXRtYXAgYXJlYSAqL1xuICBwcml2YXRlIF9oYW5kbGVUYWJLZXlOYXZpZ2F0aW9uKFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50LFxuICAgIGV2ZW50QXJlYTogc3RyaW5nLFxuICAgIGN1cnJUYWJJbmRleD86IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcbiAgICBjb25zdCBwcmVzc2VkU2hpZnRUYWIgPSBldmVudC5zaGlmdEtleTtcblxuICAgIGlmIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIGNvYWNoIG5hdmlnYXRpb24gYXJlYS5cbiAgICAgIC8vIEZwciBjb2FjaCBuYXZpZ2F0aW9uIHdlIGp1c3QgY29udHJvbCB0aGUgZm9jdXMgaW5kZXggdG8gdmlzdWFsaXplIGZvY3VzIHN0eWxlIGZvciBuYXYgY29hY2ggYnV0dG9uXG4gICAgICBpZiAoZXZlbnRBcmVhID09ICduYXZpZ2F0aW9uJykge1xuICAgICAgICBpZiAoY3VyclRhYkluZGV4ID09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICAgICAgICAhcHJlc3NlZFNoaWZ0VGFiIHx8XG4gICAgICAgICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1tjdXJyVGFiSW5kZXhdLmlzRHJpdmVyQXJlYSB8fFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PSAtMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXNzZWRTaGlmdFRhYiAmJiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgICAvL0lmIHRoZSBGb3IgYmFjayB0YWJiaW5nLCB3ZSBqdW1wXG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyclRhYkluZGV4ITtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKGN1cnJUYWJJbmRleCEpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIFRBQiBrZXkgZXZlbnQgbmF2aWdhdGlvbiBmb3Igc2VhdG1hcCBhcmVhXG4gICAgICBlbHNlIGlmIChldmVudEFyZWEgPT0gJ3NlYXRtYXAnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChwcmVzc2VkU2hpZnRUYWIpIHtcbiAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQoJ1BSRVZfVEFCJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdORVhUX1RBQicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2F0aW9uIG9mIEtleWJvYXJkIFNlYXRtYXAgZXZlbnQgaGFuZGxpbmcgdG8gbmF2aWdhdGlvbiBiZXR3ZWVuIGVhY2ggcGxhY2VzIGluc2lkZSBhIHNlbGVjdGVkIGNvYWNoIGJ5IHVzaW5nIFthcnJvd10ga2V5cy5cbiAgICogV2l0aCB0aGUgW1RBQl0ga2V5IHRoZSB1c2VyIG5hdmlnYXRpb24gZ29lcyB0byB0aGUgbmV4dCBjb2FjaCBuYXZpZ2F0aW9uIGVsZW1lbnQgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2UgaXMgYXV0b21hdGljYWxseSByZXNldC5cbiAgICovXG4gIHByb3RlY3RlZCBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaXNUYWJOZXh0ID0gZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWI7XG4gICAgY29uc3QgaXNUYWJQcmV2ID0gZXZlbnQuc2hpZnRLZXkgJiYgaXNUYWJOZXh0O1xuXG4gICAgLy8gSWYgbm8gbmF2aWdhdGlvbiBleGlzdCBhbmQgdGhlIGZpcnN0IG9yIGxhc3QgY29hY2ggaXMgc2VsZWN0ZWQsIHRoZSB0aGUgdXNlIHRyaWVzIHRvIGxlYXZlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCBieSB1c2luZyB0YWIsXG4gICAgLy8gc28gd2UgY2FuIHJldHVybiBoZXJlIGFuZCBhbGxvdyB0aGUgbmF0aXZlIGZvY3VzIHRvIGxlYXZlIHRoZSBjb21wb25lbnQuXG4gICAgaWYgKFxuICAgICAgKCF0aGlzLmhhc05hdmlnYXRpb24gJiYgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAwICYmIGlzVGFiUHJldikgfHxcbiAgICAgICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLmxlbmd0aCAtIDEgJiYgaXNUYWJOZXh0KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICAvLyBDaGVjayBhbnkga2V5Ym9hcmQgZXZlbnQgd2FzIHRyaWdnZXJlZCBpbnNpZGUgdGhlIHNlYXQgcmVzZXJ2YXRpb24gY29tcG9uZW50LFxuICAgIC8vIHNvIHdlIGNhbiBzYXkgdGhlIG5hdGl2ZSBicm93c2VyIGZvY3VzIGxpZXMgb24gdGhlIGNvbXBvbmVudFxuICAgIGlmICghdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyAmJiAoaXNUYWJOZXh0IHx8IGlzVGFiUHJldikpIHtcbiAgICAgIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIGFueSBwbGFjZSBpcyBzZWxlY3RlZCBhbmQgVEFCIEtleSBjb21iaW5hdGlvbiBpc3QgcHJlc3NlZCxcbiAgICAvLyB0aGVuIHdlIGhhbmRsZSB0aGUgbmV4dCBvciBwcmV2aW91cyBjb2FjaCBzZWxlY3Rpb25cbiAgICBpZiAoaXNUYWJOZXh0KSB7XG4gICAgICB0aGlzLl9oYW5kbGVUYWJLZXlOYXZpZ2F0aW9uKGV2ZW50LCAnc2VhdG1hcCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFycm93IEtleWJvYXJkIG5hdmlnYXRpb24gdG8gY29udHJvbCBwbGFjZXMgaW5zaWRlIHRoZSBzZWF0bWFwXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgJiYgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgc3dpdGNoIChwcmVzc2VkS2V5KSB7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRMZWZ0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZExlZnRLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkUmlnaHRLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFJpZ2h0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXA6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFVwS2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFVwS2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkRG93bktleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkRG93bktleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHBsYWNlIGluc2lkZSB0aGUgY29hY2ggaWYgbmF2aWdhdGVkIHZpYSBrZXlib2FyZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBjb2FjaCBncmlkIGlzIHNlbGVjdGVkIChuZWNlc3NhcnkgZm9yIFNjcmVlblJlYWRlcilcbiAgICovXG4gIHByb3RlY3RlZCBwcmVzZWxlY3RQbGFjZUluQ29hY2goKTogdm9pZCB7XG4gICAgLy8gTm8gcHJlc2VsZWN0IHBsYWNlIGJ5IG1hbnVhbCBzZWF0bWFwIHNjcm9sbGluZ1xuICAgIGlmICghdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBObyBhdXRvIHBsYWNlIHByZXNlbGVjdGlvbiBieSBydW5uaW5nIHRoZSBwcmVzZWxlY3QgY29hY2ggaW5kZXhcbiAgICBpZiAodGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIERyaXZlckFyZWEgb3IgRW1wdHkgY29hY2ggKG5vIHBsYWNlcyksIG5vIHBsYWNlIGlzIHNlbGVjdGFibGUsIHNvIHdlIHJldHVybiBkaXJlY3RseVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0gJiZcbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uaXNEcml2ZXJBcmVhXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHdoZW4ga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyB1c2VkIGFuZCBjb2FjaGVzIGFyZSBzY3JvbGxlZCBieSBhdXRvIHNjcm9sbGluZyxcbiAgICAvLyB0aGVuIHdlIGNhbiBzZXQgdGhlIGZvY3VzIG9uIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgY29hY2guXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiYgdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHtcbiAgICAgIGNvbnN0IGNsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKCk7XG4gICAgICAvL0lmIGNsb3Nlc3RQbGFjZSBleGlzdCwgd2UgaGF2ZSB0byB1bmZvY3VzIHByZXZpb3VzIGZvY3VzZWQgcGxhY2VcbiAgICAgIGlmIChjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoY2xvc2VzdFBsYWNlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgYSBjb2FjaCB3YXMgc2VsZWN0ZWQgd2l0aCBubyBwbGFjZXMsIHRoZW4gd2UgaGF2ZSB0byBmb2N1cyB0aGUgY29hY2hHcmlkXG4gICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcHJlc2VsZWN0aW9uIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCBieSBub3JtYWwgY2xpY2tpbmcgb3IgdmlhIHNjcmVlbiByZWFkZXIgdmlhIHRhYixcbiAgICAvLyB3ZSBvbmx5IGZvY3VzIHRoZSB0YWJsZSB3aXRob3V0IGRpcmVjdGx5IGZvY3VzaW5nIHRoZSBwbGFjZS5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuXG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2goc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9pc1ZhbGlkQ29hY2hJbmRleChzZWxlY3RlZE5hdkNvYWNoSW5kZXgpICYmXG4gICAgICBzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICkge1xuICAgICAgdGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSB0aGlzLl9nZXRFeGlzdGluZ0NvYWNoRGVja0luZGV4KCk7XG4gICAgICB0aGlzLl9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTtcblxuICAgICAgY29uc3Qgc2Nyb2xsVG9Db2FjaFBvc1ggPSB0aGlzLl9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpO1xuICAgICAgY29uc3QgaXNTZWxlY3RlZENvYWNoSW5kZXhTY3JvbGxhYmxlID1cbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggIT09IC0xIHx8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IDA7XG5cbiAgICAgIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiBhbGxvd3Mgc2Nyb2xsaW5nIHRvIHRoZSBuZXh0IHdhZ29uIG9yIG5vdFxuICAgICAgaWYgKGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSAmJiB0aGlzLl9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKSkge1xuICAgICAgICB0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgICAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiB0aGlzLmFsaWduVmVydGljYWwgPyBzY3JvbGxUb0NvYWNoUG9zWCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbFRvQ29hY2hQb3NYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIHNlbGVjdGVkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZvY3VzUGxhY2VFbGVtZW50KHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICdmb2N1cycpO1xuXG4gICAgICAgIC8vVHJ5IHRvIHNjcm9sbCBmb2N1c2VkIHBsYWNlIGludG8gdGhlIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXgsXG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1bmZvY3VzUGxhY2VFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICd1bmZvY3VzJyk7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChudWxsKTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgIGVsZW1lbnREaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgICBpc1N0cmV0Y2hIZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50RGltZW5zaW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgIWlzT3JpZ2luSGVpZ2h0KSB7XG4gICAgICAvLyBTaW5jZSB0aGUgaGVpZ2h0IG9mIHRoZSBjb2FjaCBoYXMgYmVlbiB2aXN1YWxseSBleHBhbmRlZCB0byBtYWludGFpbiBhIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMsXG4gICAgICAvLyBzb21lIGdyYXBoaWNzIG11c3QgYWxzbyBiZSBhZGFwdGVkIHRvIHRoZSBoZWlnaHQsIHdoaWNoIGVuZCB3aXRoIHRoZSBib3JkZXJzIG9mIHRoZSBjb2FjaFxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmV0Y2hIZWlnaHQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGdyYXBoaWNzIGFyZSBhc3NpZ25lZCBkaXJlY3RseSBhdCB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCxcbiAgICAgIC8vIHRoZXNlIGdyYXBoaWNzIG11c3QgYmUgZXhwYW5kZWQgaW4gaGVpZ2h0IGJ5IGEgY29hY2hCb3JkZXJPZmZzZXQgaW4gb3JkZXIgdG8gcmVhY2ggdGhlaXIgb3JpZ2luYWwgdmlzdWFsIHBvc2l0aW9uXG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdzogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncsXG4gICAgICBoOiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICBlbGVtZW50UG9zaXRpb246IEVsZW1lbnRQb3NpdGlvbixcbiAgICBlbGVtZW50RGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNPcmlnaW5IZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50UG9zaXRpb24ge1xuICAgIGlmIChjb2FjaERpbWVuc2lvbiAmJiBlbGVtZW50RGltZW5zaW9uKSB7XG4gICAgICBjb25zdCBlbmRQb3NIZWlnaHQgPSBpc09yaWdpbkhlaWdodFxuICAgICAgICA/IGNvYWNoRGltZW5zaW9uLmhcbiAgICAgICAgOiBjb2FjaERpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIC8vIElmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGNvYWNoLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBZIGNvb3JkaW5hdGUgd2l0aCB0aGUgYWRkaXRpb25hbCBib3JkZXIgcGFkZGluZ1xuICAgICAgaWYgKGVsZW1lbnRQb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnRQb3NpdGlvbi55ICsgZWxlbWVudERpbWVuc2lvbi5oID09PSBlbmRQb3NIZWlnaHQpIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCxcbiAgICAgIHk6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnksXG4gICAgICB6OiBlbGVtZW50UG9zaXRpb24ueixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGRldGVjdHMgaWYgYSAoZ3JhcGhpY2FsKSBlbGVtZW50IGlzIG9uIHRoZSBib3JkZXIgd2l0aCBpdHMgcG9zaXRpb24gKHVwcGVyIG9yIGxvd2VyIGJvcmRlcikuXG4gICAqIEBwYXJhbSBiYXNlRWxlbWVudFxuICAgKiBAcGFyYW0gY29hY2hEaW1lbnNpb25cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzRWxlbWVudERpcmVjdGx5T25Cb3JkZXIoXG4gICAgYmFzZUVsZW1lbnQ6IEJhc2VFbGVtZW50LFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYmFzZUVsZW1lbnQucG9zaXRpb24ueSA9PT0gMCB8fFxuICAgICAgYmFzZUVsZW1lbnQucG9zaXRpb24ueSArIGJhc2VFbGVtZW50LmRpbWVuc2lvbi5oID09PSBjb2FjaERpbWVuc2lvbi5oXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudHMgYWxsIGF2YWlsYWJsZSBzZWF0cyB0b2dldGhlciBkZXBlbmRpbmcgb24gdGhlIHNlYXQgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2VzXG4gICAqIEByZXR1cm5zIEFuIE9iamVjdCB3aXRoIGNvdW50IG9mIGZyZWUgc2VhdHMgYW5kIGZyZWUgYmljeWNsZSBwbGFjZXNcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKFxuICAgIHBsYWNlczogUGxhY2VbXSB8IHVuZGVmaW5lZCxcbiAgKTogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMge1xuICAgIGNvbnN0IGFjY3VtdWxhdG9yOiBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHsgc2VhdHM6IDAsIGJpY3ljbGVzOiAwIH07XG4gICAgY29uc3QgZnJlZVBsYWNlcyA9IHBsYWNlcz8ucmVkdWNlKChhY2N1bXVsYXRvciwgY3VyclBsYWNlOiBQbGFjZSkgPT4ge1xuICAgICAgaWYgKGN1cnJQbGFjZS5zdGF0ZSAhPT0gJ0ZSRUUnKSB7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH1cbiAgICAgIC8vIENvdW50IHVwIGRlcGVuZGluZyBvbiBzZWF0IHR5cGVcbiAgICAgIGlmIChjdXJyUGxhY2UudHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgIGFjY3VtdWxhdG9yLnNlYXRzKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2N1bXVsYXRvci5iaWN5Y2xlcysrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH0sIGFjY3VtdWxhdG9yKTtcbiAgICByZXR1cm4gZnJlZVBsYWNlcyA/IGZyZWVQbGFjZXMgOiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdCB0aGUgZW5kIG9mIGEgc2Nyb2xsIEV2ZW50IGZyb20gdGhlIGNvYWNoIHNjcm9sbGFibGUgYXJlYSxcbiAgICogdGhlIHJlYWNoZWQgY29hY2ggaXMgbWFya2VkIGFzIHNlbGVjdGVkXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaW5kU2Nyb2xsQ29hY2hJbmRleCA9IHRoaXMuaXNBdXRvU2Nyb2xsaW5nXG4gICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgOiB0aGlzLl9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTtcblxuICAgIC8vIFRJTU8tNDM3MDVcbiAgICAvLyBJZiBhIHBsYWNlIHdhcyBzZWxlY3RlZCBieSBtb3VzZSBjbGljayAocHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrKSBiZWZvcmUgdHJpZ2dlcmluZyB0aGlzIHNjcm9sbGVuZCBtZXRob2QsXG4gICAgLy8gdGhlbiB0aGlzIHNjcm9sbGluZyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBtZXRob2QgX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydCwgYW5kIGl0IGlzIG9ubHkgYSBwbGFjZSBhZGp1c3RtZW50IHNjcm9sbCAoc2Nyb2xsSW50b1ZpZXcpLFxuICAgIC8vIHdoZXJlIGEgbGVzcyB2aXNpYmxlIHBsYWNlIGhhcyBiZWVuIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LiBJbiBjYXNlIG9mIGEgcGxhY2UgYWRqdXN0bWVudCBieSBjbGljaywgd2UgY2FuIHJldHVybiBoZXJlLlxuICAgIGlmICh0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykge1xuICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZW5kc2Nyb2xsaW5nIGlzIGp1c3QgYSBwbGFjZSBhZGp1c3RtZW50IHNjcm9sbGluZyAocGxhY2UgaGFzIDIgZ3JpZCBzaXplIHVuaXRzKVxuICAgICAgY29uc3QgaXNDb2FjaFNjcm9sbGluZyA9XG4gICAgICAgIE1hdGguYWJzKHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyAtIHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQpID5cbiAgICAgICAgdGhpcy5iYXNlR3JpZFNpemUgKiAyO1xuICAgICAgaWYgKGlzQ29hY2hTY3JvbGxpbmcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuXG4gICAgLy8gQWZ0ZXIgY29hY2ggc2Nyb2xsZW5kIGV2ZW50IHdlIGNhbiByZXNldCB0aGUgaG92ZXJlZCBjb2FjaCBpbmRleFxuICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSAtMTtcblxuICAgIC8vIEluIGNhc2UgdGhlIHVzZXIgdXNlcyB0aGUgc2Nyb2xsYmFyIHdpdGhvdXQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VhdCByZXNlcnZhdGlvbixcbiAgICAvLyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGluZGV4IGlzIC0xLCBhbmQgd2UgaGF2ZSB0byBzZXQgdGhpcyB2YWx1ZSB3aXRoIGZpbmRTY3JvbGxDb2FjaEluZGV4LlxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmaW5kU2Nyb2xsQ29hY2hJbmRleCA8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgOiBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICAvL1doZW4gdXNlciBpcyBzY3JvbGxpbmcgdmlhIHNjcm9sbGJhciwgaXQgYXV0b21hdGljYWxseSBzY3JvbGxzIHRvIHRoZSBmb2N1c2VkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKGZpbmRTY3JvbGxDb2FjaEluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG5cbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFuIGF1dG9tYXRpYyBtYWluIG5hdmlnYXRpb24gc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgc2VsZWN0ZWROYXZDb2FjaEluZGV4LlxuICAgKiBDYWxjdWxhdGVzIHRoZSBjZW50cmFsIHNjcm9sbCBvZmZzZXQgb2YgdGhlIG5hdiBjb2FjaCB0byBiZSBzZWxlY3RlZC5cbiAgICogQHBhcmFtIHNlbGVjdGVkTmF2Q29hY2hJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvL1RpbWUgZGVsYXkgdG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIGV4ZWN1dGluZyBjYWxsaW5nIHNjcm9sbFRvIGZ1bmN0aW9ucyAoY29hY2hlcyBzY3JvbGxpbmcpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggPSB0aGlzLnNjcm9sbE5hdmlnYXRpb25BcmVhRGltIC8gMjtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQnV0dG9uT2Zmc2V0WCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleCAqIHRoaXMuY29hY2hOYXZCdXR0b25EaW07XG4gICAgICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPVxuICAgICAgICAgIHNjcm9sbEJ1dHRvbk9mZnNldFggLSBuYXZpZ2F0aW9uQXJlYUNlbnRlcmVkUG9zWCArIHRoaXMuY29hY2hOYXZCdXR0b25EaW07XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsT2Zmc2V0WCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbE9mZnNldFgsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV3IFNjcm9sbERpcmVjdGlvbiBieSB0aGUgbmV3IGdpdmVuIHRhcmdldCBjb2FjaCBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPVxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgPyBTY3JvbGxEaXJlY3Rpb24ucmlnaHRcbiAgICAgICAgOiBTY3JvbGxEaXJlY3Rpb24ubGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY3JvbGwgc3RhcnQgb3IgZW5kIHBvc2l0aW9uIFggZnJvbSB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIEluIGNhc2UgdGhlIHVzZXIgaXMgY3VycmVudGx5IG5hdmlnYXRpbmcgdGhyb3VnaCBwbGFjZXMgYnkga2V5Ym9hcmQgYW5kIGdvZXMgdG8gcHJldmlvdXMgY29hY2gsXG4gICAqIHRoZW4gd2UgcmV0dXJuIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGNvYWNoIHRvIGdldCB0aGUgY2xvc2VzdCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIG5leHQgZm9jdXMgcGxhY2UuXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2FjaFRyaWdnZXJQb2ludCA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb24gPVxuICAgICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJlxuICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgY29hY2hUcmlnZ2VyUG9pbnQud2lkdGggPiB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGg7XG5cbiAgICByZXR1cm4gaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvblxuICAgICAgPyBjb2FjaFRyaWdnZXJQb2ludC5lbmQgLSB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGhcbiAgICAgIDogY29hY2hUcmlnZ2VyUG9pbnQuc3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZm9jdXMgb24gdGhlIEhUTUwgdGFibGUgKGdyaWQpIGNhcHRpb24gZWxlbWVudCBzbyB0aGF0IHRoZSBoZWFkaW5nIGlzIHJlYWQgb3V0IHdoZW4gdXNpbmcgYSBTY3JlZW5SZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBjb2FjaCBuYXZpZ2F0aW9uLCB0aGVuIHRoZSBuYXZpZ2F0ZWQgdGFibGUgaXMgZm9jdXNhYmxlLlxuICAgIGlmICh0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlICYmIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJyNzYmItc3ItY29hY2gtY2FwdGlvbi0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgKSBhcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDtcbiAgICAgIGlmIChjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgY29hY2hUYWJsZUNhcHRpb25FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGxlZCBwb3NpdGlvbiBjYW4gYmUgdXNlZCB0byBzY3JvbGwgdG8gdGhlIHNlbGVjdGVkIHdhZ29uXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIHByaXZhdGUgX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyU2Nyb2xsUG9zWCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtYXhTY3JvbGxXaWR0aEFyZWEgPSB0aGlzLm1heENhbGNDb2FjaGVzV2lkdGggLSBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoO1xuICAgIGNvbnN0IGN1cnJDb2FjaFRyaWdnZXIgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvcyA9XG4gICAgICBjdXJyU2Nyb2xsUG9zWCA9PT0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uc3RhcnQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgKGN1cnJTY3JvbGxQb3NYIDwgbWF4U2Nyb2xsV2lkdGhBcmVhIHx8IGN1cnJTY3JvbGxQb3NYID4gY3VyckNvYWNoVHJpZ2dlci5zdGFydCkgJiZcbiAgICAgICFpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29hY2ggaW5kZXggd2hpY2ggaXMgY3VycmVudGx5IHZpc2libGUgaW4gdGhlIHNjcm9sbCBhcmVhXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3Qgc2Nyb2xsUG9zID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvcFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPSBzY3JvbGxQb3MgKyB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGggLyAyO1xuICAgIHJldHVybiB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24uZmluZEluZGV4KFxuICAgICAgKGNvYWNoVHJpZ2dlcikgPT4gc2Nyb2xsT2Zmc2V0WCA+PSBjb2FjaFRyaWdnZXIuc3RhcnQgJiYgc2Nyb2xsT2Zmc2V0WCA8PSBjb2FjaFRyaWdnZXIuZW5kLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaXJzdCBwbGFjZSBvZiBjdXJyZW50IHNlbGVjdGVkIGNvYWNoIGJ5IHRhYmxlIGNlbGwgY29vcmRpbmF0ZSAwLTAgaWQuXG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTogUGxhY2UgfCBudWxsIHtcbiAgICBsZXQgZmlyc3RQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjb2FjaCA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBmaXJzdENlbGxJZCA9XG4gICAgICAnY2VsbC0nICsgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAnLScgKyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAnLTAtMCc7XG4gICAgY29uc3QgcGxhY2VOdW1iZXIgPVxuICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxIVE1MVGFibGVDZWxsRWxlbWVudD4oJyMnICsgZmlyc3RDZWxsSWQpXG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50Pignc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbCcpXG4gICAgICAgID8uZ2V0QXR0cmlidXRlKCd0ZXh0JykgfHwgbnVsbDtcblxuICAgIGlmIChjb2FjaCAmJiBwbGFjZU51bWJlcikge1xuICAgICAgZmlyc3RQbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gcGxhY2VOdW1iZXIpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaXJzdFBsYWNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3dpdGNoZWRDb2FjaERlY2tJbmRleEJ5S2V5TmF2aWdhdGlvbihcbiAgICBwcmVzc2VkS2V5OiBzdHJpbmcsXG4gICAgY29hY2g6IENvYWNoSXRlbSxcbiAgKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuY3VyclNlbGVjdGVkUGxhY2UgfHxcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy9DSEVDSyBERUNLIFNXSVRDSCBET1dOXG4gICAgaWYgKFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgKyAyID09PSBjb2FjaC5kaW1lbnNpb24uaCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMTtcbiAgICB9XG4gICAgLy9DSEVDSyBERUNLIFNXSVRDSCBVUFxuICAgIGVsc2UgaWYgKFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ID09PSAwICYmXG4gICAgICAhIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCAtIDFdXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBnZXQgdGhlIGNvcnJlY3QgY2xvc2VzdCBwbGFjZSBvZiBjdXJyZW50IHByZXNzZWQga2V5IGFuZCB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSxcbiAgICogd2UgaGF2ZSB0byBpbnZlc3RpZ2F0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBwbGFjZSB0byBmaW5kIHRoZSBjbG9zZXN0IHBsYWNlIG9mIHRoZSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHBhcmFtIHByZXNzZWRLZXlcbiAgICogQHJldHVybnMgUGxhY2Ugb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleT86IHN0cmluZyk6IFBsYWNlIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgbGV0IGNsb3Nlc3RQbGFjZSA9IG51bGw7XG4gICAgbGV0IGNvYWNoUGxhY2VzID0gY29hY2gucGxhY2VzO1xuICAgIGxldCBzd2l0Y2hlZENvYWNoRGVja0luZGV4ID0gbnVsbDtcblxuICAgIGlmIChjb2FjaFBsYWNlcykge1xuICAgICAgLy8gSWYgbm8gcGxhY2Ugc2V0LCB0aGVuIHdlIHVzZSBpbml0aWFsIHRoZSBsZWZ0LXRvcCBwbGFjZSBvbiB0aGUgY29hY2hcbiAgICAgIGlmICghdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Rmlyc3RQbGFjZUluU2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgICAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uID0geyAuLi50aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uIH07XG5cbiAgICAgICAgICBpZiAocHJlc3NlZEtleSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyB1c2VkIHRvIHN3aXRjaCB0byBhbm90aGVyIGNvYWNoIGRlY2sgKFVwIC0+IERvd24gfCBEb3duIC0+IFVwKS5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgdGFrZSB0aGUgY29hY2ggcGxhY2VzIHdlIGhhdmUgdG8gY2hlY2tlZCBmcm9tIHRoZSB0YXJnZXQgZGVjayBub3cuXG4gICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4ID0gdGhpcy5fZ2V0U3dpdGNoZWRDb2FjaERlY2tJbmRleEJ5S2V5TmF2aWdhdGlvbihcbiAgICAgICAgICAgICAgcHJlc3NlZEtleSxcbiAgICAgICAgICAgICAgY29hY2gsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQXNzaWduIGNoZWNrIHBsYWNlcyBmcm9tIHRoZSB0YXJnZXQgc3dpdGNoIGRlY2tcbiAgICAgICAgICAgICAgY29hY2hQbGFjZXMgPVxuICAgICAgICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tzd2l0Y2hlZENvYWNoRGVja0luZGV4XS5jb2FjaEl0ZW1zW1xuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgICAgICAgXS5wbGFjZXMgfHwgW107XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gdXBkYXRlIHkgY29vcmRpbmF0ZVxuICAgICAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgPVxuICAgICAgICAgICAgICAgIHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA/IGNvYWNoLmRpbWVuc2lvbi5oIDogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaFBsYWNlcykge1xuICAgICAgICAgICAgLy8gSWYgbm8ga2V5IHByZXNzZWQsIHRoZW4gd2UgdHJ5IHRvIGZpbmQgdGhlIHBsYWNlIG9mIHRoZSBjdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb25cbiAgICAgICAgICAgIGlmICghcHJlc3NlZEtleSkge1xuICAgICAgICAgICAgICAvLyBGaW5kIHBsYWNlIGZyb20gdGhlIGxlZnQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBSSUdIVFxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vRmluZCBwbGFjZSBmcm9tIHRoZSByaWdodCBzaWRlIG9mIGNvYWNoIGJ5IHkgY29vcmRpbmF0ZS4gQ3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uIGlzIExFRlRcbiAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChwbGFjZS5udW1iZXIgIT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/Lm51bWJlcikge1xuICAgICAgICAgICAgICAgIC8vS2V5IFtSaWdodF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0Rvd25dIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24gJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPiBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbTGVmdF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbVXBdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA8IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueSA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi55KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYSBwbGFjZSBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgY2hhbmdpbmcgc3dpdGNoIGNvYWNoLFxuICAgICAgICAgIC8vIHdlIGNhbiB1cGRhdGUgdGhlIGN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsICYmIGNsb3Nlc3RQbGFjZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSBzd2l0Y2hlZENvYWNoRGVja0luZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdFBsYWNlO1xuICB9XG5cbiAgLy8gSGFuZGxpbmcgZm9yIFRhYiBuYXZpZ2F0aW9uIGlmIGEgcGxhY2UgaXMgc2VsZWN0ZWQgaW5zaWRlIHRoZSBjb2FjaC5cbiAgLy8gVGhpcyBjb250cm9scyB0aGUgZm9jdXNlZCBjb2FjaCBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoLlxuICBwcml2YXRlIF9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQodGFiRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyRm9jdXNJbmRleCA9XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09PSAtMVxuICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA6IHRoaXMuZm9jdXNlZENvYWNoSW5kZXg7XG5cbiAgICAvLyBDaGVjayBuZXh0IG9yIHByZXYgdGFiIGlzIHByZXNzZWQsIHRoZW4gd2UgbmVlZCB0byBmaW5kIHRoZSBuZXh0IGF2YWlsYWJsZSBjb2FjaCBpbmRleCB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBmb2N1c1xuICAgIGNvbnN0IG5ld0ZvY3VzYWJsZUluZGV4OiBudW1iZXIgPVxuICAgICAgdGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInXG4gICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleClcbiAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJGb2N1c0luZGV4KTtcblxuICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgY29uc3QgcGxhY2VJbkNvYWNoSGFzRm9jdXMgPSBzZWxlY3RlZFBsYWNlRWxlbWVudFxuICAgICAgICA/IHNlbGVjdGVkUGxhY2VFbGVtZW50LmdldEF0dHJpYnV0ZSgna2V5Zm9jdXMnKSA9PT0gJ2ZvY3VzJ1xuICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAvLyBJZiB3ZSB0YWIgYmFjayAoUFJFVl9UQUIpIGFuZCB0aGUgZm9jdXMgaXMgY3VycmVudGx5IG9uIHBsYWNlLFxuICAgICAgLy8gd2UgcmVtb3ZlIHRoZSBzZWxlY3RlZCBzdGF0ZSBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbmF2aWdhdGlvbiBjb2FjaCBhbmQgb25seSBzZXQgdGhlIGZvY3VzIHN0YXR1cyB0byBpdFxuICAgICAgaWYgKHRhYkRpcmVjdGlvbiA9PT0gJ1BSRVZfVEFCJyAmJiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9PT0gY3VyckZvY3VzSW5kZXgpIHtcbiAgICAgICAgLy8gSWYgd2UgVEFCIGJhY2sgYW5kIGhhdmUgYSBzZWxlY3RlZCBwbGFjZXMgaW5zaWRlIHRoZSBjdXJyZW50IGNvYWNoLCB0aGVuIHdlIG1vdmUgb3V0IGZyb20gdGhlIHNlYXRtYXAgYW5kIHNldCB0aGUgZm9jdXMgdG8gdGhlIGN1cnJlbnQgc2VsZWN0ZWQgY29hY2hcbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzIHx8IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyckZvY3VzSW5kZXg7XG4gICAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gdGhlIGZpcnN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIgYmFjaywgd2UgaGF2ZSB0byBzZXQgdGhlIG5hdGl2ZSBmb2N1cyBvbiB0aGUgZmlyc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgICAgLy8gVG8gZG8gdGhpcywgd2UgaGF2ZSB0byByZW1vdmUgdGhlIGZvY3VzZWRJbmRleCBmcm9tIHRoZSBmaXJzdCBjb2FjaCBhbmQgc2V0IGl0IGFnYWluIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgICAgZWxzZSBpZiAoY3VyckZvY3VzSW5kZXggPT09IDApIHtcbiAgICAgICAgICAvLyBSZWZvY3VzIHRoZSBmaXJzdCBjb2FjaFxuICAgICAgICAgIHRoaXMuX3JlZm9jdXNDdXJyZW50Rm9jdXNlZE5hdkNvYWNoKGN1cnJGb2N1c0luZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgc2V0cyB0aGUgZm9jdXMgb24gdGhlIG5ldyBuYXZpZ2F0aW9uIGNvYWNoXG4gICAgICBlbHNlIGlmIChuZXdGb2N1c2FibGVJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gdGhlIGxhc3QgY29hY2ggaXMgc2VsZWN0ZWQgYW5kIHdlIFRBQiwgd2UgaGF2ZSB0byBzZXQgdGhlIG5hdGl2ZSBmb2N1cyBvbiB0aGUgbGFzdCBjb2FjaCBpbiB0aGUgbmF2aWdhdGlvbiB0byBnZXQgYmFjayB0byB0aGUgbm9ybWFsIHRhYiBuYXZpZ2F0aW9uLlxuICAgICAgLy8gVG8gZG8gdGhpcywgd2UgaGF2ZSAgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgdGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInICYmXG4gICAgICAgIG5ld0ZvY3VzYWJsZUluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxXG4gICAgICApIHtcbiAgICAgICAgLy8gUmVmb2N1cyB0aGUgbGFzdCBjb2FjaFxuICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIC8vIElmIGFueSBwbGFjZSB3YXMgZm9jdXNlZCBpbiBjb2FjaCwgc28gd2Ugc2V0IGZvY3VzZWQgYWdhaW5cbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyBwbGFjZSB3YXMgc2VsZWN0ZWQsIHRoZW4gd2Ugc2VsZWN0IHRoZSBjb2FjaCBncmlkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJ5IFRhYiBOYXZpZ2F0aW9uLCBwZXJmb3JtIGF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIGZvY3VzZWQgd2Fnb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gICAgLy8gSWYgbm8gbmF2aWdhdGlvbiBleGlzdCwgd2Ugc2Nyb2xsIGRpcmVjdGx5IHRvIHRoZSBuZXh0IHRhYmFibGUgY29hY2hcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWZvY3VzZWQgdGhlIGN1cnJlbnQgZm9jdXNlZCAodmlzdWFsKSBuYXYgY29hY2ggdG8gZ2V0IHRoZSBuYXRpdmUgZm9jdXMgYmFjayB0byB0aGUgbmF2aWdhdGlvblxuICBwcml2YXRlIF9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChmb2N1c0luZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGZvY3VzSW5kZXgpLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJldmVudFBsYWNlQ2xpY2spIHtcbiAgICAgIGNvbnN0IGZpbmRDbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbihwcmVzc2VkS2V5KTtcblxuICAgICAgaWYgKGZpbmRDbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudChmaW5kQ2xvc2VzdFBsYWNlKTtcbiAgICAgIH1cbiAgICAgIC8vIE5vIGNsb3Nlc3QgcGxhY2UgZm91bmQgYnkga2V5IG5hdmlnYXRpb25cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCB8fFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdCB8fFxuICAgICAgICAgICh0aGlzLmFsaWduVmVydGljYWwgJiZcbiAgICAgICAgICAgIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwIHx8XG4gICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bikpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IHByZXNzZWQga2V5IHRvIGdldCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXhcbiAgICAgICAgICBjb25zdCBuZXdTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodFxuICAgICAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoKVxuICAgICAgICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoKTtcblxuICAgICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld1NlbGVjdGVkQ29hY2hJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VycmVudEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudEluZGV4ID8/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICByZXR1cm4gc3RhcnRJbmRleCA8IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtcy5sZW5ndGggLSAxXG4gICAgICA/IHN0YXJ0SW5kZXggKyAxXG4gICAgICA6IHN0YXJ0SW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoY3VycmVudEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudEluZGV4ID8/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICByZXR1cm4gc3RhcnRJbmRleCA+IDAgPyBzdGFydEluZGV4IC0gMSA6IHN0YXJ0SW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMocGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2VUeXBlUHJvcCA9IHBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnID8gJ3NlYXRzJyA6ICdiaWN5Y2xlcyc7XG4gICAgY29uc3QgbWF4UmVzZXJ2YXRpb25zID1cbiAgICAgIHBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnID8gdGhpcy5tYXhTZWF0UmVzZXJ2YXRpb25zIDogdGhpcy5tYXhCaWN5Y2xlUmVzZXJ2YXRpb25zO1xuICAgIGNvbnN0IGN1cnJTZWxlY3RlZFBsYWNlcyA9IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNbcGxhY2VUeXBlUHJvcF07XG5cbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdID0gdGhpcy5fdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgICBjdXJyU2VsZWN0ZWRQbGFjZXMsXG4gICAgICBtYXhSZXNlcnZhdGlvbnMsXG4gICAgICBwbGFjZVNlbGVjdGlvbixcbiAgICApO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtDdXN0b21FdmVudDxTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcz59XG4gICAgICogRW1pdHMgd2hlbiBhIHBsYWNlIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIFBsYWNlIGFycmF5IHdpdGggYWxsIHNlbGVjdGVkIHBsYWNlcy5cbiAgICAgKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+KCdzZWxlY3RlZHBsYWNlcycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhcbiAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSxcbiAgICBtYXhSZXNlcnZhdGlvbnM6IG51bWJlcixcbiAgICBwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vIEFkZCBzZWxlY3RlZCBwbGFjZSB0byBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGlmIChwbGFjZVNlbGVjdGlvbi5zdGF0ZSA9PT0gJ1NFTEVDVEVEJykge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgICAgIHNlbGVjdGVkUGxhY2VEZWNrSW5kZXgsXG4gICAgICApO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbikge1xuICAgICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSBzZWxlY3RlZCBwbGFjZSBmcm9tIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzXG4gICAgZWxzZSB7XG4gICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBDaGVja3Mgd2hldGhlciBtYXhSZXNlcnZhdGlvbiBpcyBhY3RpdmF0ZWQgYW5kIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RlZCBwbGFjZXMgaXMgcmVhY2hlZFxuICAgIGlmIChtYXhSZXNlcnZhdGlvbnMgPiAtMSAmJiBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5sZW5ndGggPiBtYXhSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uID0gbWF4UmVzZXJ2YXRpb25zID4gMCA/IHBsYWNlU2VsZWN0aW9uIDogdW5kZWZpbmVkO1xuXG4gICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHRoaXMuX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKFxuICAgICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyxcbiAgICAgICAgcmVzZXRXaXRoUGxhY2VTZWxlY3Rpb24sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkUGxhY2VJbkNvYWNoKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlRGVja0luZGV4ID0gdGhpcy5fZ2V0RGVja0luZGV4QnlQbGFjZUlkKHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICBjb25zdCBjb2FjaEluZGV4ID0gcGxhY2VTZWxlY3Rpb24uY29hY2hJbmRleDtcblxuICAgIGlmIChwbGFjZURlY2tJbmRleCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBsYWNlID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3BsYWNlRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdLnBsYWNlcz8uZmluZChcbiAgICAgIChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09IHBsYWNlU2VsZWN0aW9uLm51bWJlcixcbiAgICApO1xuXG4gICAgaWYgKCFwbGFjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gcGxhY2VEZWNrSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gY29hY2hJbmRleDtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG5cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9PSB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgIH1cblxuICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcblxuICAgIC8vIFRpbWUgZGVsYXkgdG8gd2FpdCBmb3Igc3RhdHVzIHVwZGF0ZSBwcm9jZXNzIGF0IGNsaWNrZWQgcGxhY2VcbiAgICBjb25zdCBkZWxheVNjcm9sbEluVmlld3BvcnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgICBjbGVhclRpbWVvdXQoZGVsYXlTY3JvbGxJblZpZXdwb3J0KTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpOiB2b2lkIHtcbiAgICAvL09ubHkgaWYgdGhlIHNlbGVjdGVkQ29hY2hJbmRleCBoYXMgY2hhbmdlZCwgYW4gdXBkYXRlIG5lZWRzIHRvIGJlIGNhcnJpZWQgb3V0XG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PSB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgZm9jdXNpbmRleCBoYXMgYmVlbiBzZXQgKCE9IC0xKSwgaXQgY2FuIGJlIHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCBzZWxlY3RlZENvYWNoSW5kZXhcbiAgICBpZiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCAhPSAtMSkge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG5cbiAgICBjb25zdCBjb2FjaFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2godGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgIGlmIChjb2FjaFNlbGVjdGlvbikge1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaD59XG4gICAgICAgKiBFbWl0cyB3aGVuIGEgY29hY2ggd2FzIHNlbGVjdGVkIGFuZCByZXR1cm5zIGEgQ29hY2hTZWxlY3Rpb25cbiAgICAgICAqL1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaD4oJ3NlbGVjdGVkY29hY2gnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IGNvYWNoU2VsZWN0aW9uLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBsYWNlRWxlbWVudElkKFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlTnVtYmVyOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgICdzZWF0LXJlc2VydmF0aW9uX19wbGFjZS1idXR0b24tJyArIGNvYWNoRGVja0luZGV4ICsgJy0nICsgY29hY2hJbmRleCArICctJyArIHBsYWNlTnVtYmVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBjb2FjaCBsYXlvdXRzIHdpdGggZGlmZmVyZW50IGRlY2tzLFxuICAgKiBpdCBpcyBuZWNlc3NhcnkgdG8gZXh0ZW5kIHRoZSBvZmZzZXQgd2l0aCBlbXB0eSBjb2FjaGVzXG4gICAqIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHN0YWJsZSB2ZWhpY2xlIGxheW91dC5cbiAgICpcbiAgICogICAgICAgICAgICAgW29vb10tW29vb10tW29vb11cbiAgICogW29vb10tW29vb10tW29vb10tW29vb10tW29vb11cbiAgICovXG4gIHByaXZhdGUgX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTogdm9pZCB7XG4gICAgLy8gUHJlZmlsbCBvZmZzZXQgY291bnRlcnMgd2l0aCAwIHN0YXJ0IGluZGV4XG4gICAgY29uc3QgY29hY2hPZmZzZXRJbmRleENvdW50ZXIgPSBBcnJheSh0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMSkuZmlsbCgwKTtcbiAgICAvLyBUYWtlcyB0aGUgbG93ZXIgZGVjayB3aGljaCBjb250YWlucyB0aGUgbWF4IG51bWJlcnMgb2YgY29hY2hlc1xuICAgIGNvbnN0IGxvd2VyRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV07XG5cbiAgICBsb3dlckRlY2suY29hY2hJdGVtcy5mb3JFYWNoKChsb3dlckNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVja0NvYWNoSXRlbSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zW2NvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldXTtcbiAgICAgICAgaWYgKGxvd2VyQ29hY2hJdGVtLmlkICE9IGRlY2tDb2FjaEl0ZW0/LmlkKSB7XG4gICAgICAgICAgLy8gQWRkIEVtcHR5IG9mZnNldCBjb2FjaCB0byBzcGVjaWZpZWQgaW5kZXggcG9zaXRpb25cbiAgICAgICAgICBjb25zdCBlbXB0eU9mZnNldENvYWNoID0ge1xuICAgICAgICAgICAgLi4ubG93ZXJDb2FjaEl0ZW0sXG4gICAgICAgICAgICBwbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb3BlcnR5SWRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHJhdmVsQ2xhc3M6IFtdLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2ldLmNvYWNoSXRlbXMuc3BsaWNlKFxuICAgICAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0sXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZW1wdHlPZmZzZXRDb2FjaCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0rKztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXphdGlvbiBvZiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiBBcnJheSBiYXNlZCBvbiB0aGUgdHJhbnNmZXJyZWQgcGxhY2VzXG4gICAqIHRoYXQgaGF2ZSB0aGUgc3RhdGUgU0VMRUNURUQgd2l0aGluIHRoZSBzZWF0UmVzZXJ2YXRpb24gb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIF9pbml0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgcGxhY2Ugc2VsZWN0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzID0gW107XG5cbiAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/LmZvckVhY2goKHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleDogbnVtYmVyKSA9PlxuICAgICAgc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubWFwKChjb2FjaDogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29hY2gucGxhY2VzXG4gICAgICAgICAgPy5maWx0ZXIoKHBsYWNlKSA9PiBwbGFjZS5zdGF0ZSA9PT0gJ1NFTEVDVEVEJylcbiAgICAgICAgICA/LmZvckVhY2goKHBsYWNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCwgcGxhY2UubnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uID0gbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgICAgICBwbGFjZUlkLFxuICAgICAgICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoSW5kZXgsXG4gICAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbjogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsID1cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbiwgY29hY2hEZWNrSW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5zZWF0cy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzLnB1c2goc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBzZWxlY3RlZCBwbGFjZXMgd2lsbCBiZSByZXNldCBvciB0aGUgY3VycmVudFNlbGVjdGVkUGxhY2Ugd2FzIGdpdmVuLCB0aGVuIHdlIHJlc2V0IGFsbCBleGNlcHQgY3VycmVudFNlbGVjdGVkUGxhY2VcbiAgICogQHBhcmFtIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zXG4gICAqIEBwYXJhbSBjdXJyU2VsZWN0ZWRQbGFjZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzZXRBbGxQbGFjZVNlbGVjdGlvbnMoXG4gICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgY3VyclNlbGVjdGVkUGxhY2U/OiBQbGFjZVNlbGVjdGlvbixcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSB7XG4gICAgLy9GaW5kIGFsbCBwbGFjZXMgdG8gYmUgbmVlZGVkIHVuc2VsZWN0XG4gICAgZm9yIChjb25zdCBwbGFjZVNlbGVjdGlvbiBvZiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucykge1xuICAgICAgaWYgKCFjdXJyU2VsZWN0ZWRQbGFjZSB8fCBjdXJyU2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQpIHtcbiAgICAgICAgY29uc3QgcGxhY2VFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChwbGFjZVNlbGVjdGlvbi5pZCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChwbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgICBwbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdGF0ZScsICdGUkVFJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy9SZW1vdmVzIGFsbCBzZWxlY3RlZCBwbGFjZXMgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICBpZiAoY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gW107XG4gICAgfVxuICAgIHJldHVybiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZVNlbGVjdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyIHwgbnVsbCxcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoY29hY2hEZWNrSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2NvYWNoRGVja0luZGV4XS5jb2FjaEl0ZW1zW2N1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXhdO1xuICAgIGNvbnN0IHBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5udW1iZXIpO1xuXG4gICAgcmV0dXJuIHBsYWNlXG4gICAgICA/IG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmRlY2tJbmRleCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4LFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCB8IG51bGwge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XTtcbiAgICBjb25zdCBjb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaC5wbGFjZXMpO1xuICAgIHJldHVybiBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbihjb2FjaEluZGV4LCBjb2FjaCwgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2U6IFBsYWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPSBwbGFjZVxuICAgICAgPyB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJhdGlvbiBvZiB0aGUgdXNlZCBkb2N1bWVudHMgZm9udC1zaXplIHdoaWNoIG5lZWRzXG4gICAqIHRvIGJlIGRldGVybWluZWQgaW4gb3JkZXIgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSBDU1MgdmFsdWVzIHdpdGggcmVtXG4gICAqICovXG4gIHByaXZhdGUgX2RldGVybWluZUJhc2VGb250U2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAoIWlzU2VydmVyKSB7XG4gICAgICBjb25zdCBiYXNlRm9udFNpemUgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5mb250U2l6ZSwgMTApO1xuICAgICAgLy9jYWxjdWxhdGUgcmVtIG9mIDFweFxuICAgICAgY29uc3Qgb25lUGl4ZWxJblJlbSA9IDEgLyBiYXNlRm9udFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtJywgYCR7b25lUGl4ZWxJblJlbSArICdyZW0nfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBkYXRhIGZvciBkaXNwbGF5aW5nIG5hdmlnYXRpb24gYXJlYS5cbiAgICogQ2FsY3VsYXRlcyB0aGUgdmFsdWVzIHdoaWNoIGFyZSBub3QgZ29pbmcgdG8gY2hhbmdlIGR1cmluZyB1c2Ugb2YgYSBjb21wb25lbnQ6XG4gICAqICAgIC0gY29hY2ggaWRcbiAgICogICAgLSBsaXN0IG9mIHNlcnZpY2UgaWNvbnNcbiAgICogICAgLSBjbGFzcyAoZmlyc3QsIHNlY29uZCwgYW55KVxuICAgKiAgICAtIHdoZXRoZXIgdGhlcmUgaXMgYSBkcml2ZXIgYXJlYSBsZWZ0IG9yIHJpZ2h0XG4gICAqICovXG4gIHByaXZhdGUgX3ByZXBhcmVDb2FjaEl0ZW1EZXRhaWxzRGF0YSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCBsb3dlckRlY2s6IENvYWNoSXRlbVtdID1cbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxXS5jb2FjaEl0ZW1zO1xuXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cyA9IFtdO1xuXG4gICAgICBsb3dlckRlY2suZm9yRWFjaCgoY29hY2gsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYXZlbENsYXNzZXM6IFBsYWNlVHJhdmVsQ2xhc3NbXSA9IFtdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUlkczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGxhY2VzOiBQbGFjZVtdID0gW107XG5cbiAgICAgICAgLy8gQ29sbGVjdCBhbGwgaW1wb3J0YW50IG5hdmlnYXRpb24gZGF0YSB0byBiZSByZW5kZXJlZFxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgICAgICAubWFwKChzcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHNyLmNvYWNoSXRlbXNbaW5kZXhdO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZvckVhY2goKGNvYWNoOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRyYXZlbENsYXNzZXMucHVzaCguLi5jb2FjaC50cmF2ZWxDbGFzcyk7XG4gICAgICAgICAgICBwcm9wZXJ0eUlkcy5wdXNoKC4uLihjb2FjaC5wcm9wZXJ0eUlkcyA/IGNvYWNoLnByb3BlcnR5SWRzIDogW10pKTtcbiAgICAgICAgICAgIHBsYWNlcy5wdXNoKC4uLihjb2FjaC5wbGFjZXMgPyBjb2FjaC5wbGFjZXMgOiBbXSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLnB1c2goe1xuICAgICAgICAgIGlkOiBjb2FjaC5pZCxcbiAgICAgICAgICB0cmF2ZWxDbGFzczogdGhpcy5fcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzKSxcbiAgICAgICAgICBwcm9wZXJ0eUlkczogdGhpcy5fcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24ocHJvcGVydHlJZHMpLFxuICAgICAgICAgIGlzRHJpdmVyQXJlYTogY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzLmxlbmd0aCA9PT0gMCA6IHRydWUsXG4gICAgICAgICAgaXNMb2NvbW90aXZlOiB0aGlzLl9pc0xvY29tb3RpdmUoY29hY2gpLFxuICAgICAgICAgIGRyaXZlckFyZWFTaWRlOiB0aGlzLl9wcmVwYXJlRHJpdmVyQXJlYVNpZGVOYXZpZ2F0aW9uKGNvYWNoKSxcbiAgICAgICAgICBmcmVlUGxhY2VzOiB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2gocGxhY2VzKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyAjVElNTy00NTg1OFxuICAvLyBGaW5kcyB0aGUgb3B0aW1hbCBpY29uIHNpemUgYmFzZWQgb24gYWxsIHNlcnZpY2VFbGVtZW50cyBhbmQgdGhlaXIgZGltZW5zaW9uLlxuICAvLyBUaGlzIHNldHMgdGhlIGdsb2JhbEFyZWFJY29uRGltIGFuZCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBlbGVtZW50cy5cbiAgLy8gVGhpcyBnaXZlcyB1cyBhIG1heGltdW0gdW5pZm9ybSBpY29uIHNpemUgd2l0aGluIHRoZSBhcmVhIGVsZW1lbnRzXG4gIHByaXZhdGUgX3ByZXBhcmVPcHRpbWl6ZUFyZWFJY29uRGltZW5zaW9uQnlNZWRpYW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgYWxsU2VydmljZURpbWVuc2lvbnM6IEVsZW1lbnREaW1lbnNpb25bXSA9IFtdO1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmZvckVhY2goKGRlY2spID0+XG4gICAgICAgIGRlY2suY29hY2hJdGVtcy5mb3JFYWNoKChjb2FjaCkgPT5cbiAgICAgICAgICBjb2FjaC5zZXJ2aWNlRWxlbWVudHM/LmZvckVhY2goKGljb24pID0+IGFsbFNlcnZpY2VEaW1lbnNpb25zLnB1c2goaWNvbi5kaW1lbnNpb24pKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChhbGxTZXJ2aWNlRGltZW5zaW9ucy5sZW5ndGgpIHtcbiAgICAgICAgYWxsU2VydmljZURpbWVuc2lvbnMuc29ydChcbiAgICAgICAgICAoZGltMTogRWxlbWVudERpbWVuc2lvbiB8IHVuZGVmaW5lZCwgZGltMjogRWxlbWVudERpbWVuc2lvbiB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGRpbTEgJiYgZGltMikge1xuICAgICAgICAgICAgICBjb25zdCBtYXhEaW0xID0gZGltMS53ICsgZGltMS5oO1xuICAgICAgICAgICAgICBjb25zdCBtYXhEaW0yID0gZGltMi53ICsgZGltMi5oO1xuICAgICAgICAgICAgICBpZiAobWF4RGltMSA+IG1heERpbTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhEaW0xIDwgbWF4RGltMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBiZXN0IGljb24gc2l6ZSBieSBtZWRpYW5cbiAgICAgICAgY29uc3QgbWVkaWFuSWNvblNpemUgPSBhbGxTZXJ2aWNlRGltZW5zaW9uc1tNYXRoLmZsb29yKGFsbFNlcnZpY2VEaW1lbnNpb25zLmxlbmd0aCAvIDIpXSE7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBkZXRlcm1pbmVkIG1lZGlhbiBpY29uIHNpemUgYXMgZ2xvYmFsIGNhbGN1bGF0ZWQgYXJlYSBpY29uIGRpbWVuc2lvblxuICAgICAgICB0aGlzLmdsb2JhbEFyZWFJY29uRGltID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKG1lZGlhbkljb25TaXplKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZpbmQgdGhlIG1heGltdW0gY29hY2ggaGVpZ2h0IGZyb20gYWxsIGRlY2tzXG4gICAgICAgIGNvbnN0IG1heENvYWNoSGVpZ2h0ID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICAgICAgLmZsYXRNYXAoKGRlY2spID0+IGRlY2suY29hY2hJdGVtcy5tYXAoKGNvYWNoKSA9PiBjb2FjaC5kaW1lbnNpb24uaCkpXG4gICAgICAgICAgLnJlZHVjZSgobWF4LCBoZWlnaHQpID0+IE1hdGgubWF4KG1heCwgaGVpZ2h0KSwgMCk7XG5cbiAgICAgICAgLy9jYWxjdWxhdGUgMjAlIG9mIG1heGltdW0gaGVpZ2h0IGFzIGljb24gZGltZW5zaW9uXG4gICAgICAgIGNvbnN0IGljb25EaW1lbnNpb24gPSBNYXRoLmZsb29yKG1heENvYWNoSGVpZ2h0ICogMC4yKTtcbiAgICAgICAgdGhpcy5nbG9iYWxBcmVhSWNvbkRpbSA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbih7XG4gICAgICAgICAgdzogaWNvbkRpbWVuc2lvbixcbiAgICAgICAgICBoOiBpY29uRGltZW5zaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlVHJhdmVsQ2xhc3NOYXZpZ2F0aW9uKHRyYXZlbENsYXNzZXM6IFBsYWNlVHJhdmVsQ2xhc3NbXSk6IFBsYWNlVHJhdmVsQ2xhc3Mge1xuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ0ZJUlNUJykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gJ0ZJUlNUJztcbiAgICB9XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignU0VDT05EJykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gJ1NFQ09ORCc7XG4gICAgfVxuICAgIHJldHVybiAnQU5ZX0NMQVNTJztcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2FjaERyaXZlckFyZWFzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgKGdyYXBoaWNhbEVsZW1lbnRzKSA9PiBncmFwaGljYWxFbGVtZW50cy5pY29uID09PSAnRFJJVkVSX0FSRUEnLFxuICAgICk7XG5cbiAgICBpZiAoY29hY2hEcml2ZXJBcmVhcyAmJiBjb2FjaERyaXZlckFyZWFzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNraW5nIHRoZSBkcml2ZXIgYXJlYSBwb3NpdGlvbiB3aGV0aGVyIGl0IGlzIHByZXNlbnQgb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBpbiBhIGNvYWNoXG4gICAgICBjb25zdCBoYXNMZWZ0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPT09IDApIHx8IGZhbHNlO1xuICAgICAgY29uc3QgaGFzUmlnaHREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA+IDApIHx8IGZhbHNlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAhIWhhc0xlZnREcml2ZXJBcmVhLFxuICAgICAgICByaWdodDogISFoYXNSaWdodERyaXZlckFyZWEsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24gPSAocHJvcGVydHlJZHM6IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuICAgIGlmICghcHJvcGVydHlJZHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzaHJ1bmtQcm9wZXJ0eUlkcyA9IHByb3BlcnR5SWRzXG4gICAgICA/Lm1hcChmdW5jdGlvbiAocHJvcGVydHlJZDogc3RyaW5nKToge1xuICAgICAgICBwSWQ6IHN0cmluZztcbiAgICAgICAgc3ZnTmFtZTogc3RyaW5nO1xuICAgICAgfSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGVtcG9yYXJ5IG9iamVjdCBtYXBwaW5nIHByb3BlcnR5IGlkIHRvIGl0J3Mgc3ZnTmFtZSBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIGl0IHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgaWNvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwSWQ6IHByb3BlcnR5SWQsXG4gICAgICAgICAgc3ZnTmFtZTogbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lID8gbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lIDogJycsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLy9maWx0ZXIgb3V0IG9iamVjdHMgc2VydmljZSBpY29ucyB3aGljaCBhcmUgbm90IGluIEFMTE9XRURfU0VSVklDRV9JQ09OU1xuICAgICAgLmZpbHRlcigocHJvcGVydHlUb1N2ZykgPT4gQUxMT1dFRF9TRVJWSUNFX0lDT05TLmluZGV4T2YocHJvcGVydHlUb1N2Zy5zdmdOYW1lKSAhPT0gLTEpXG4gICAgICAvL21ha2UgaXQgZGlzdGluY3QgYnkgc3ZnTmFtZVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHZhbHVlLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgICBzZWxmLm1hcCgocHJvcFN2ZykgPT4gcHJvcFN2Zy5zdmdOYW1lKS5pbmRleE9mKHZhbHVlLnN2Z05hbWUpID09PSBpbmRleCxcbiAgICAgIClcbiAgICAgIC8vIGdvIGJhY2sgdG8gcHJvcGVydHlJZCBzdHJpbmcgZnJvbSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICAubWFwKChwcm9wZXJ0eVRvU3ZnKSA9PiBwcm9wZXJ0eVRvU3ZnLnBJZClcbiAgICAgIC8vIHRha2UgZmlyc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmcm9tIEJhY2tlbmQsIG90aGVyd2lzZSB0aGUgbGF5b3V0IGNvdWxkIGJlIGRlc3Ryb3llZFxuICAgICAgLnNsaWNlKDAsIE1BWF9TRVJWSUNFX1BST1BFUlRJRVMpO1xuICAgIHJldHVybiBzaHJ1bmtQcm9wZXJ0eUlkcyA/IHNocnVua1Byb3BlcnR5SWRzIDogW107XG4gIH07XG5cbiAgLy8gSW5pdGlhbGx5IGNhbGN1bGF0ZXMgYWxsIHRoZSBuZWNlc3NhcnkgcG9zaXRpb25zIGFuZCBkaW1lbnNpb25zIG9mIGFsbCBjb2FjaCBlbGVtZW50cywgYXJlYSBlbGVtZW50cywgc2VydmljZSBlbGVtZW50c1xuICBwcml2YXRlIF9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUgPSB7XG4gICAgICAgIGRlY2tzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25EZWNrOiBTZWF0cmVzZXJ2YXRpb25EZWNrID0ge1xuICAgICAgICAgIGRlY2tJbmRleDogaW5kZXgsXG4gICAgICAgICAgZGVja0NvYWNoZXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtcz8uZm9yRWFjaCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZEFyZWFFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlKSA9PiBlLmljb24gJiYgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGUuaWNvbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhbGxFbGVtZW5ldHMgPVxuICAgICAgICAgICAgZmlsdGVyZWRBcmVhRWxlbWVudHNcbiAgICAgICAgICAgICAgPy5jb25jYXQoY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cyB8fCBbXSlcbiAgICAgICAgICAgICAgLmNvbmNhdChjb2FjaEl0ZW0ucGxhY2VzIHx8IFtdKSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzID0gdGhpcy5faXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICAgICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24udyxcbiAgICAgICAgICAgIGFsbEVsZW1lbmV0cyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGFyZWFFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHNcbiAgICAgICAgICAgID8uZmlsdGVyKFxuICAgICAgICAgICAgICAoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgdHJ1ZSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG90aGVyRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzXG4gICAgICAgICAgICA/LmZpbHRlcigoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+XG4gICAgICAgICAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgZmFsc2UpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlRWxlbWVudHMgPSBjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzPy5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgIHRoaXMuX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoZWxlLCBjb2FjaEl0ZW0uZGltZW5zaW9uLCBmYWxzZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJNaWRkbGVFbGVtZW50ID0gdGhpcy5fZ2V0Q2FsY3VsYXRlZE1pZGRsZUJvcmRlckVsZW1lbnQoY29hY2hJdGVtKTtcbiAgICAgICAgICBjb25zdCBjYWxjQ29hY2hEaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oeyAuLi5jb2FjaEl0ZW0uZGltZW5zaW9uIH0pO1xuICAgICAgICAgIC8vIENvbGxlY3QgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3Igc2luZ2xlIGNvYWNoXG4gICAgICAgICAgY29uc3QgY29hY2hTdHVyY3R1cmU6IENvYWNoU3RydWN0dXJlID0ge1xuICAgICAgICAgICAgd2lkdGg6IGNhbGNDb2FjaERpbWVuc2lvbi53LFxuICAgICAgICAgICAgaGVpZ2h0OiBjYWxjQ29hY2hEaW1lbnNpb24uaCxcbiAgICAgICAgICAgIG90aGVyRWxlbWVudHM6IG90aGVyRWxlbWVudHMgfHwgW10sXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHNlcnZpY2VFbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGFyZWFFbGVtZW50czogYXJlYUVsZW1lbnRzIHx8IFtdLFxuICAgICAgICAgICAgYm9yZGVyTWlkZGxlRWxlbWVudDogYm9yZGVyTWlkZGxlRWxlbWVudCxcbiAgICAgICAgICAgIGhhc092ZXJoYW5naW5nRWxlbWVudHM6IGhhc092ZXJoYW5naW5nRWxlbWVudHMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suZGVja0NvYWNoZXMucHVzaChjb2FjaFN0dXJjdHVyZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzLnB1c2goc2VhdFJlc2VydmF0aW9uRGVjayk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCBwb3NpdGlvbiBhbmQgZGltZW5zaW9uIG9mIHRoZSBtaWRkbGUgYm9yZGVyLlxuICAgKiBUbyBjYWxjdWxhdGUgdGhlIHN0YXJ0ICsgZW5kIGNvb3JkaW5hdGUgYW5kIHRoZSBkaW1lbnNpb24gb2YgdGhlIG1pZGRsZSBib3JkZXIgY29hY2ggZ3JhcGhpYyxcbiAgICogdGhlIGV4aXN0aW5nIGRvY2tpbmcgY29hY2ggZ3JhcGhpY3MgYXJlIGFuYWx5c2VkIGFuZCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgcG9zaXRpb24gYW5kIGRpZW1lbnNpb24gaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm5zIEJhc2VFbGVtZW50XG4gICAqL1xuICBwcml2YXRlIF9nZXRDYWxjdWxhdGVkTWlkZGxlQm9yZGVyRWxlbWVudChjb2FjaDogQ29hY2hJdGVtKTogQmFzZUVsZW1lbnQge1xuICAgIGNvbnN0IGJvcmRlckhlaWdodCA9IChjb2FjaC5kaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyKSAqIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgIC8vIERlZmF1bHQgLSB3aXRob3V0IGZpbmRpbmcgZG9ja2luZyBib3JkZXIgZWxlbWVudHMsIHRoZSBtaWRkbGUgYm9yZGVyIGdvZXMgZnJvbSAwIHBvc2l0aW9uIHVudGlsIGNvYWNoIHdpZHRoIGVuZFxuICAgIGxldCBzdGFydEJvcmRlck9mZnNldFggPSAwO1xuICAgIGxldCBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53O1xuXG4gICAgaWYgKGNvYWNoLmdyYXBoaWNFbGVtZW50cykge1xuICAgICAgLy8gRG9ja2luZ0VsZW1lbnRlIGRlZmluZXMgdGhlIGVsZW1lbnRzIHdoZXJlIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIHJlYWxseSBzdGFydHMgYW5kIGVuZHNcbiAgICAgIGNvbnN0IGRvY2tpbmdFbGVtZW50cyA9IHRoaXMuX2dldEZpcnN0TGFzdERvY2tpbmdFbGVtZW50cyhjb2FjaC5ncmFwaGljRWxlbWVudHMpO1xuXG4gICAgICAvLyBUd28gZG9ja2luZyBjb2FjaCBlbGVtZW50cyBleGlzdCAobm9ybWFsIGNhc2UgLSBzdGFydCBhbmQgZW5kIGRvY2tpbmcgZWxlbWVudClcbiAgICAgIGlmIChkb2NraW5nRWxlbWVudHM/Lmxlbmd0aCA9PSAyKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0RG9ja2luZ0VsZW1lbnQgPSBkb2NraW5nRWxlbWVudHNbMF07XG4gICAgICAgIGNvbnN0IGxhc3REb2NraW5nRWxlbWVudCA9IGRvY2tpbmdFbGVtZW50c1sxXTtcbiAgICAgICAgY29uc3QgZW5kQm9yZGVyT2Zmc2V0WCA9XG4gICAgICAgICAgZmlyc3REb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09IDBcbiAgICAgICAgICAgID8gbGFzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53XG4gICAgICAgICAgICA6IGZpcnN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG5cbiAgICAgICAgc3RhcnRCb3JkZXJPZmZzZXRYID1cbiAgICAgICAgICBmaXJzdERvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggPT0gMFxuICAgICAgICAgICAgPyBmaXJzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53XG4gICAgICAgICAgICA6IGxhc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcblxuICAgICAgICBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53IC0gZW5kQm9yZGVyT2Zmc2V0WCAtIHN0YXJ0Qm9yZGVyT2Zmc2V0WDtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgb25lIGRvY2tpbmcgYm9yZGVyIGNvYWNoIGVsZW1lbnRzIGV4aXN0IChzdGFydCBvciBlbmQgZG9ja2luZyBlbGVtZW50KVxuICAgICAgZWxzZSBpZiAoZG9ja2luZ0VsZW1lbnRzPy5sZW5ndGggPT0gMSkge1xuICAgICAgICBjb25zdCBkb2NraW5nRWxlbWVudCA9IGRvY2tpbmdFbGVtZW50c1swXTtcblxuICAgICAgICAvLyBNaWRkbGVCb3JkZXIgc3RhcnRzIGZyb20gbGVmdCBkb2NraW5nIGVsZW1lbnQgdW50aWwgY29hY2ggZW5kXG4gICAgICAgIGlmIChkb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09PSAwKSB7XG4gICAgICAgICAgc3RhcnRCb3JkZXJPZmZzZXRYID0gZG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG4gICAgICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udyAtIGRvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuICAgICAgICB9XG4gICAgICAgIC8vIE1pZGRsZUJvcmRlciBzdGFydHMgZnJvbSBwb3NpdGlvbiB4IDAgdW50aWwgZG9ja2luZyBlbGVtZW50IG9uIHRoZSByaWdodCBjb2FjaCBzaWRlXG4gICAgICAgIGVsc2UgaWYgKGRvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggIT09IDApIHtcbiAgICAgICAgICBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53IC0gZG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5T2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgKiAtMTtcblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogeyB4OiBzdGFydEJvcmRlck9mZnNldFggKiB0aGlzLmJhc2VHcmlkU2l6ZSwgeTogeU9mZnNldCwgejogMCB9LFxuICAgICAgZGltZW5zaW9uOiB7IHc6IGJvcmRlcldpZHRoICogdGhpcy5iYXNlR3JpZFNpemUsIGg6IGJvcmRlckhlaWdodCB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBncmFwaGljYWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RhcnQgYW5kIGVuZCBib3JkZXIgZWxlbWVudHMgb2YgdGhlIGNvYWNoLlxuICAgKiBAcmV0dXJucyBCYXNlRWxlbWVudFtdXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdExhc3REb2NraW5nRWxlbWVudHMoZ3JhcGhpY0VsZW1lbnRzOiBCYXNlRWxlbWVudFtdKTogQmFzZUVsZW1lbnRbXSB7XG4gICAgLy8gR2V0IGFsbCByZWxldmFudCBkb2NraW5nIGVsZW1lbnRzIGFuZCBzb3J0cyB0aGVtIGFnYWluIGFjY29yZGluZyB0byB0aGVpciB4IHBvc2l0aW9uIGNvb3JkaW5hdGVzLFxuICAgIC8vIHRodXMgdGhlIHN0YXJ0IGFuZCBlbmQgZG9ja2luZyBlbGVtZW50cyB3b3VsZCBiZSBkZWZpbmVkXG4gICAgY29uc3QgZmlsdGVyZWREb2NraW5nRWxlbWVudHMgPSAoXG4gICAgICBncmFwaGljRWxlbWVudHMuZmlsdGVyKChlbGUpID0+IHRoaXMubWlkZGxlQm9yZGVyRG9ja2luZ0VsZW1lbnRzLmluY2x1ZGVzKGVsZS5pY29uISkpIHx8IFtdXG4gICAgKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBwb3NBID0gYS5wb3NpdGlvbi54O1xuICAgICAgY29uc3QgcG9zQiA9IGIucG9zaXRpb24ueDtcbiAgICAgIGlmIChwb3NBID4gcG9zQikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGlmIChwb3NBIDwgcG9zQikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJlZERvY2tpbmdFbGVtZW50cy5maWx0ZXIoXG4gICAgICAoXywgaW5kZXgpID0+IGluZGV4ID09IDAgfHwgaW5kZXggPT0gZmlsdGVyZWREb2NraW5nRWxlbWVudHMubGVuZ3RoIC0gMSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb25zIGFuZCBkaW1lbnNpb25zIG9mIGdyYXBoaWNhbCwgc2VydmljZSBhbmQgYXJlYSBlbGVtZW50c1xuICAgKiBAcmV0dXJucyBCYXNlRWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2FsY3VsYXRlZERpbWVuc2lvblBvc2l0aW9uRWxlbWVudChcbiAgICBlbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc0NhbGNBcmVhRWxlbWVudDogYm9vbGVhbixcbiAgKTogQmFzZUVsZW1lbnQge1xuICAgIGNvbnN0IGRpbSA9IHsgLi4uZWxlbWVudC5kaW1lbnNpb24gfTtcbiAgICBjb25zdCBwb3MgPSB7IC4uLmVsZW1lbnQucG9zaXRpb24gfTtcbiAgICBjb25zdCByb3RhdGlvbiA9IGVsZW1lbnQucm90YXRpb24gfHwgMDtcbiAgICBjb25zdCBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID1cbiAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmNvbmNhdCh0aGlzLm5vdEZpeGVkUm90YXRhYmxlQXJlYUljb25zKS5pbmRleE9mKGVsZW1lbnQuaWNvbiEpID09PSAtMTtcbiAgICBjb25zdCBjYWxjUm90YXRpb24gPVxuICAgICAgdGhpcy5hbGlnblZlcnRpY2FsICYmIGlzTm90Rml4ZWRSb3RhdGlvbkdyYXBoaWNhbEVsZW1lbnQgPyByb3RhdGlvbiAtIDkwIDogcm90YXRpb247XG4gICAgbGV0IGFyZWFNb3VudGluZzogRWxlbWVudE1vdW50aW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYW5kIGRpbWVuc2lvbiBmb3IgQXJlYUVsZW1lbnRzXG4gICAgaWYgKGlzQ2FsY0FyZWFFbGVtZW50KSB7XG4gICAgICBjb25zdCBpc05vdFRhYmxlR3JhcGhpYyA9IGVsZW1lbnQuaWNvbj8uaW5kZXhPZignVEFCTEUnKSA9PT0gLTE7XG4gICAgICBjb25zdCBhcmVhUHJvcGVydHkgPSBlbGVtZW50Lmljb24gJiYgaXNOb3RUYWJsZUdyYXBoaWMgPyBlbGVtZW50Lmljb24gOiBudWxsO1xuICAgICAgY29uc3Qgc3RyZXRjaEhlaWdodCA9XG4gICAgICAgIHRoaXMuaXNFbGVtZW50RGlyZWN0bHlPbkJvcmRlcihlbGVtZW50LCBjb2FjaERpbWVuc2lvbikgJiYgYXJlYVByb3BlcnR5ICE9PSAnRU5UUllfRVhJVCc7XG5cbiAgICAgIGlmIChlbGVtZW50LnBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgYXJlYU1vdW50aW5nID0gJ3VwcGVyLWJvcmRlcic7XG4gICAgICAgIHBvcy55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC8gMztcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5wb3NpdGlvbi55ICsgZWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaCkge1xuICAgICAgICBhcmVhTW91bnRpbmcgPSAnbG93ZXItYm9yZGVyJztcbiAgICAgICAgaWYgKCFzdHJldGNoSGVpZ2h0KSB7XG4gICAgICAgICAgcG9zLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAtIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLyAzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJldGNoSGVpZ2h0KSB7XG4gICAgICAgIGRpbS5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC8gMztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBkaW1lbnNpb24gZm9yIGFsbCBvdGhlciBncmFwaGljYWwgZWxlbWVudHNcbiAgICBlbHNlIHtcbiAgICAgIGlmIChlbGVtZW50LnBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgcG9zLnkgLT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvYWNoRGltZW5zaW9uLmggPT09IGVsZW1lbnQucG9zaXRpb24ueSArIGVsZW1lbnQuZGltZW5zaW9uLmgpIHtcbiAgICAgICAgZGltLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGltLncgKj0gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgZGltLmggKj0gdGhpcy5iYXNlR3JpZFNpemU7XG5cbiAgICBwb3MueCAqPSB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICBwb3MueSAqPSB0aGlzLmJhc2VHcmlkU2l6ZTtcblxuICAgIGNvbnN0IGljb24gPVxuICAgICAgZWxlbWVudC5pY29uICYmIGVsZW1lbnQuaWNvbi5lbmRzV2l0aCgnRFJJVkVSX0FSRUEnKVxuICAgICAgICA/IGVsZW1lbnQuaWNvbj8uY29uY2F0KCdfJywgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS52ZWhpY2xlVHlwZSlcbiAgICAgICAgOiBlbGVtZW50Lmljb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWNvbjogaWNvbixcbiAgICAgIHJvdGF0aW9uOiBjYWxjUm90YXRpb24sXG4gICAgICBkaW1lbnNpb246IGRpbSxcbiAgICAgIHBvc2l0aW9uOiBwb3MsXG4gICAgICBtb3VudGluZzogYXJlYU1vdW50aW5nLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSBIVE1MIGVsZW1lbnQgYnkgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEByZXR1cm5zIEhUTUxFbGVtZW50IG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldFBsYWNlSHRtbEVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZFxuICAgICAgPyB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHx8IG51bGxcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleHRyYWN0ZWQgY29hY2ggZGVjayBpbmRleCBmcm9tIHBsYWNlIGlkXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RGVja0luZGV4QnlQbGFjZUlkKHBsYWNlSWQ6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGRlY2tJbmRleCA9IHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5xdWVyeVNlbGVjdG9yKCcjJyArIHBsYWNlSWQpXG4gICAgICA/LmdldEF0dHJpYnV0ZSgnZGF0YS1kZWNrLWluZGV4Jyk7XG4gICAgaWYgKGRlY2tJbmRleCAmJiAhaXNOYU4oK2RlY2tJbmRleCkpIHtcbiAgICAgIHJldHVybiArZGVja0luZGV4O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWRDb2FjaEluZGV4KGNvYWNoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb2FjaEluZGV4ID49IDAgJiZcbiAgICAgIGNvYWNoSW5kZXggPD0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxXS5jb2FjaEl0ZW1zLmxlbmd0aFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBleGlzdGluZyBjb2FjaCBkZWNrIGluZGV4IGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5lY2Vzc2FyeSB0byBnZXQgYW4gYXZhaWxhYmxlIGNvYWNoIGRlY2sgaW5kZXggZHVyaW5nIGtleWJvYXJkIG5hdmlnYXRpb24sIHdoaWNoIGNhbiB2YXJ5IGJldHdlZW4gY29hY2hlcyB3aXRoIGRpZmZlcmVudCBkZWNrcy5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgY29hY2ggd2l0aCB0d28gZGVja3MgdG8gYSBjb2FjaCB3aXRoIG9uZSBkZWNrLlxuICAgKlxuICAgKiAgICAgICBbb29vXS1bb29vXS1bb29vXVxuICAgKiBbb29vXS1bb29vXS1bb29vXS1bb29vXS1bb29vXVxuICAgKlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldEV4aXN0aW5nQ29hY2hEZWNrSW5kZXgoKTogbnVtYmVyIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XVxuICAgICAgICAucGxhY2VzICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleDtcbiAgICB9XG5cbiAgICAvLyBGaW5kIG5leHQgcG9zc2libGUgY29hY2ggZGVjayBpbmRleCB3aGVyZSBwbGFjZXMgZXhpc3RcbiAgICBjb25zdCBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnMuZmluZEluZGV4KFxuICAgICAgKHNlYXRSZXNlcnZhdGlvbikgPT5cbiAgICAgICAgc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5wbGFjZXMgIT09IHVuZGVmaW5lZCxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA+PSBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXhcbiAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgIDogbmV4dEF2YWlsYWJsZURlY2tDb2FjaEluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGEgc2VsZWN0ZWQgcGxhY2UgaXMgc2xpZ2h0bHkgaGlkZGVuIGJ5IHRoZSBvdmVyZmxvdyBzY3JvbGwgY29udGVudCBhbmQgaXMgc3RpbGwgY2xpY2tlZCxcbiAgICogdGhlIG1ldGhvZCB0cmllcyB0byBzY3JvbGwgdGhlIHNlbGVjdGVkIHBsYWNlIGludG8gdGhlIG5lYXJlc3Qgdmlld3BvcnQsIHNvIHRoYXQgaXQgaXMgY29tcGxldGVseSB2aXNpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2VJZFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5nZXRFbGVtZW50QnlJZChwbGFjZUlkKVxuICAgICAgPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JywgaW5saW5lOiAnbmVhcmVzdCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogY2hlY2tzIGlmIGFueSBwbGFjZXMgb3IgZ3JhcGhpY2FsIGVsZW1lbnRzIChlLmcuIHRvaWxldCBhcmVhLCBldGMuKSBhcmUgb3ZlcmhhbmdpbmcgdGhlIGNvYWNoIGJvcmRlcnNcbiAgICogQHBhcmFtIGNvYWNoSXRlbVdpZHRoXG4gICAqIEBwYXJhbSBlbGVtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBfaXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICBjb2FjaEl0ZW1XaWR0aDogbnVtYmVyLFxuICAgIGVsZW1lbnRzOiAoUGxhY2UgfCBCYXNlRWxlbWVudClbXSB8IHVuZGVmaW5lZCxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVsZW1lbnRzPy5zb21lKFxuICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICBlbGVtZW50LnBvc2l0aW9uLnggPT09IDAgfHwgZWxlbWVudC5wb3NpdGlvbi54ICsgZWxlbWVudC5kaW1lbnNpb24udyA+PSBjb2FjaEl0ZW1XaWR0aCxcbiAgICAgICkgPz8gZmFsc2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGNvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlckFyZWFzIGZvciBvbmUgY29hY2hcbiAgICogQHBhcmFtIGNvYWNoSXRlbVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfaXNMb2NvbW90aXZlKGNvYWNoSXRlbTogQ29hY2hJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSXRlbT8uZ3JhcGhpY0VsZW1lbnRzPy5maW5kKFxuICAgICAgICAoZWxlbWVudDogQmFzZUVsZW1lbnQpID0+IGVsZW1lbnQuaWNvbiA9PT0gJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICAgKSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyBjYWxsZWQgd2hlbiB0aGUgU2VhdFJlc2VydmF0aW9uIGxvc2VzIGZvY3VzLCB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgdXNlciB0YWJzIG91dCBvciBjbGlja3Mgc29tZXdoZXJlIGVsc2UuXG4gICAqIFRoZW4gd2UgcmVzZXQgdGhlIGZvY3VzZWQgZWxlbWVudHMuXG4gICAqL1xuICBwcml2YXRlIF9vbkxlYXZlU2VhdFJlc2VydmF0aW9uQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICB9XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBaUNBLElBQUs7Q0FBTCxTQUFLLGlCQUFlO0FBQ2xCLGlCQUFBLFdBQUE7QUFDQSxpQkFBQSxVQUFBO0dBRkcsb0JBQUEsa0JBQWUsRUFBQSxFQUFBO0FBOEJwQixJQUFNLHlCQUF5QjtBQUMvQixJQUFNLHdCQUFrQztDQUN0QztDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNEO0lBRVksb0NBQTBCO21CQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Y0FBbkMsbUNBQW1DLFlBQVU7OzttQ0FPdkQsU0FBUztJQUFFLFdBQVc7SUFBcUIsTUFBTTtJQUFPLENBQUMsQ0FBQTtrQ0FJekQsU0FBUztJQUFFLFdBQVc7SUFBb0IsTUFBTTtJQUFRLENBQUMsQ0FBQTtnQ0FJekQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQWtCLE1BQU07SUFBUyxDQUFDLENBQUE7Z0NBSXhELFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUFrQixNQUFNO0lBQVMsU0FBUztJQUFNLFlBQVk7SUFBTSxDQUFDLENBQUE7K0JBSXpGLFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUFrQixNQUFNO0lBQVEsQ0FBQyxDQUFBO3lCQUl2RCxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBVSxNQUFNO0lBQVEsQ0FBQyxDQUFBO3NDQUkvQyxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBeUIsTUFB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
1459
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZm9yY2VUeXBlLFxuICBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQsXG4gIFNiYkVsZW1lbnQsXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBJY29uVG9TdmcsXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50TW91bnRpbmcsXG4gIEVsZW1lbnRQb3NpdGlvbixcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBQbGFjZVRyYXZlbENsYXNzLFxuICBTZWF0UmVzZXJ2YXRpb24sXG4gIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcyxcbiAgVHJhdmVsRGlyZWN0aW9uLFxufSBmcm9tICcuLi9jb21tb24vdHlwZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQudHMnO1xuXG5lbnVtIFNjcm9sbERpcmVjdGlvbiB7XG4gIHJpZ2h0ID0gJ3JpZ2h0JyxcbiAgbGVmdCA9ICdsZWZ0Jyxcbn1cblxuaW50ZXJmYWNlIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50IHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTZWF0cmVzZXJ2YXRpb25TdHJ1Y3R1cmUge1xuICBkZWNrczogU2VhdHJlc2VydmF0aW9uRGVja1tdO1xufVxuXG5pbnRlcmZhY2UgU2VhdHJlc2VydmF0aW9uRGVjayB7XG4gIGRlY2tJbmRleDogbnVtYmVyO1xuICBkZWNrQ29hY2hlczogQ29hY2hTdHJ1Y3R1cmVbXTtcbn1cblxuaW50ZXJmYWNlIENvYWNoU3RydWN0dXJlIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGFyZWFFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgc2VydmljZUVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBvdGhlckVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBib3JkZXJNaWRkbGVFbGVtZW50OiBCYXNlRWxlbWVudDtcbiAgaGFzT3ZlcmhhbmdpbmdFbGVtZW50czogYm9vbGVhbjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgU2JiRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogRGlzcGxheXMgYW4gYXJyb3cgc2hvd2luZyB3aGF0IGRpcmVjdGlvbiBkb2VzIHRyYWluIGRyaXZlKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndHJhdmVsLWRpcmVjdGlvbicsIHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgdHJhdmVsRGlyZWN0aW9uOiBUcmF2ZWxEaXJlY3Rpb24gPSAnTk9ORSc7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIG5hdmlnYXRpb24gY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGFzLW5hdmlnYXRpb24nLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoYXNOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBpcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FsaWduLXZlcnRpY2FsJywgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSwgdXNlRGVmYXVsdDogdHJ1ZSB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWxpZ25WZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3MgYmFzZSBncmlkIHNpemUgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Jhc2UtZ3JpZC1zaXplJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBiYXNlR3JpZFNpemU6IG51bWJlciA9IDE2O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3Mgd2lkdGggKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGVpZ2h0OiBudW1iZXIgPSBudWxsITtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIHNlYXRzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFNlYXRSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgYmljeWNsZSBwbGFjZXMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1iaWN5Y2xlLXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4QmljeWNsZVJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXNlbGVjdC1jb2FjaC1pbmRleCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJlc2VsZWN0Q29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIHRpdGxlIGluZm9ybWF0aW9uIGF0IHBsYWNlLWNvbnRyb2xzLCBuYXZpZ2F0aW9uLWNvYWNoZXMgYW5kIG5hdmlnYXRpb24tc2VydmljZXMgY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2hvdy10aXRsZS1pbmZvJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2hvd1RpdGxlSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBzZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9jdXNlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgaG92ZXJlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIERlc2NyaWJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyBpbiBwaXhlbHNcbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hlcyA9IDQ7XG4gIC8vIFRoZSBjYWxjdWxhdGVkIGNvYWNoQm9yZGVyT2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNvYWNoIGJvcmRlciBncmFwaGljLFxuICAvLyBidXQgYWxzbyB0byBwb3NpdGlvbiBvdGhlciBncmFwaGljcyB0aGF0IGFyZSBhbGlnbmVkIGRpcmVjdGx5IHRvIHRoZSBjb2FjaCBib3JkZXIuXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgZGVja3MgYnkgbXVsdGlwbGUgZGVjayB2aXN1YWxpemF0aW9uXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9IDQ4O1xuICAvLyBEZXNjcmliZXMgdGhlIGZpeCB3aWR0aCBvZiBjb2FjaCBuYXZpZ2F0aW9uIGJ1dHRvblxuICBwcm90ZWN0ZWQgY29hY2hOYXZCdXR0b25EaW06IG51bWJlciA9IDA7XG4gIC8vIERlc2NyaWJlcyB0aGUgY2FsY3VsYXRlZCBkaW1lbnNpb24gZm9yIHRoZSBhcmVhIGljb25zLCB3aGljaCBpcyB1c2VkIHRvIHNldCB0aGUgbWF4IHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgaWNvbnNcbiAgcHJvdGVjdGVkIGdsb2JhbEFyZWFJY29uRGltOiBFbGVtZW50RGltZW5zaW9uID0geyB3OiAyLCBoOiAyIH07XG4gIC8vICNUSU1PLTQ1ODU4XG4gIC8vIERlc2NyaWJlcyB0aGUgcGFkZGluZyBmb3IgdGhlIGljb24gd2l0aGluIHRoZSBhcmVhIGFzIGEgcGVyY2VudGFnZSBzaXplIG9mIHRoZSBhcmVhIHNlbGYuIDgwJSAoMC44IHBlcmNlbnQpIGNvcnJlc3BvbmRzXG4gIC8vIHRvIGEgZ29vZCBvcHRpY2FsIHNpemUgYW5kIGNyZWF0ZXMgYSBnb29kIHBhZGRpbmcgZnJvbSB0aGUgYXJlYSB0aSBpY29uXG4gIHByb3RlY3RlZCBnbG9iYWxBcmVhSWNvblBhZGRpbmc6IG51bWJlciA9IDAuODtcbiAgcHJvdGVjdGVkIGNvYWNoSXRlbURldGFpbHNFbGVtZW50czogQ29hY2hJdGVtRGV0YWlsc1tdID0gW107XG4gIHByb3RlY3RlZCBjdXJyU2Nyb2xsRGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24gPSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQ7XG4gIHByb3RlY3RlZCBtYXhDYWxjQ29hY2hlc1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkRGVja0luZGV4OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMgPSB7XG4gICAgc2VhdHM6IFtdLFxuICAgIGJpY3ljbGVzOiBbXSxcbiAgfTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNNdWx0aXBsZURlY2tzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZTogU2VhdHJlc2VydmF0aW9uU3RydWN0dXJlID0ge1xuICAgIGRlY2tzOiBbXSxcbiAgfTtcblxuICAvLyBBcmVhIGljb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBmaXhlZCBkdXJpbmcgcm90YXRpb24gd2hlbiB2ZXJ0aWNhbCBtb2RlIGlzIHNlbGVjdGVkXG4gIHByb3RlY3RlZCBub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucyA9IFsnRU5UUllfRVhJVCddO1xuXG4gIC8vIEdyYXBoaWNzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCB3aXRoIGFuIGFyZWFcbiAgcHJvdGVjdGVkIG5vdEFyZWFFbGVtZW50cyA9IFtcbiAgICAnRFJJVkVSX0FSRUEnLFxuICAgICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0hJR0gnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX01JRERMRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfTE9XJyxcbiAgICAnQ09NUEFSVE1FTlRfV0FMTCcsXG4gIF07XG5cbiAgLy8gR3JhcGhpY3MgdGhhdCBzaG91bGQgbm90IGJlIHJlbmRlcmVkIHdpdGggYW4gYXJlYVxuICBwcm90ZWN0ZWQgbWlkZGxlQm9yZGVyRG9ja2luZ0VsZW1lbnRzID0gW1xuICAgICdEUklWRVJfQVJFQScsXG4gICAgJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICdDT0FDSF9QQVNTQUdFJyxcbiAgICAnQ09BQ0hfV0FMTF9OT19QQVNTQUdFJyxcbiAgXTtcblxuICBwcml2YXRlIF9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICBwcml2YXRlIF9zY3JvbGxUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGFzdFN0YXJ0U2Nyb2xsUG9zID0gLTE7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gQWRkIGJsdXIgZXZlbnQgbGlzdGVuZXIgb24gdGhlIGVudGlyZSBjb21wb25lbnQgdG8gZGV0ZWN0IHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBjb21wb25lbnRcbiAgICAvLyBieSB1c2luZyB0YWIgbmF2aWdhdGlvbiBvciBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQuIEluIHRoaXMgY2FzZSwgd2UgY2FuIHJlc2V0IHRoZSBzZWxlY3RlZCBjb2FjaCBhbmQgcGxhY2UuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gdGhpcy5fb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2VhdFJlc2VydmF0aW9ucycpKSB7XG4gICAgICB0aGlzLmhhc011bHRpcGxlRGVja3MgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lmxlbmd0aCA+IDE7XG5cbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykpIHtcbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdwcmVzZWxlY3RDb2FjaEluZGV4JykpIHtcbiAgICAgIC8vIHNldFRpbWVvdXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2l0aG91dCwgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCkgd291bGQgZmFpbCB3aXRoIE5QRSBiZWNhdXNlXG4gICAgICAvLyB0aGUgY29hY2hTY3JvbGxBcmVhIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2godGhpcy5wcmVzZWxlY3RDb2FjaEluZGV4KSwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBsZXQgbmF2aWdhdGVUb0NvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgaWYgKGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX0xFRlQnICYmIG5hdmlnYXRlVG9Db2FjaEluZGV4ID4gMCkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggLSAxIDogMDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnICYmXG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA8XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0/LmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAxIDogMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuYXZpZ2F0ZVRvQ29hY2hJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRGF0YSBjYW4gYmUgcHJlcGFyZWQgb25jZSBmb3IgdGhlIGVudGlyZSBjb21wb25lbnRcbiAgICogaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJyaW5nIGl0ZXJhdGlvbiBwcm9jZXNzZXMgaW4gcmVuZGVyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX2RldGVybWluZUJhc2VGb250U2l6ZSgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlY2tzLCB3ZSBuZWVkIHRvIGNoZWNrXG4gICAgICAvLyB3aGV0aGVyIGVtcHR5IGNvYWNoZXMgbmVlZCB0byBiZSBhZGRlZCBvbiBkaWZmZXJlbnQgZGVjayBsZXZlbHNcbiAgICAgIHRoaXMuX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTtcbiAgICB0aGlzLl9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTtcbiAgICB0aGlzLl9wcmVwYXJlT3B0aW1pemVBcmVhSWNvbkRpbWVuc2lvbkJ5TWVkaWFuKCk7XG4gIH1cblxuICAvKiogSW5pdCBzY3JvbGwgZXZlbnQgaGFuZGxpbmcgZm9yIGNvYWNoIG5hdmlnYXRpb24gKi9cbiAgcHJvdGVjdGVkIGluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlcycsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgID8gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XVxuICAgICAgOiBudWxsO1xuICAgIGlmIChzZWF0UmVzZXJ2YXRpb25EZWNrICYmIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBoZWlnaHQgb2Ygb25lIGNvYWNoIGluY2x1ZGluZyBib3JkZXIgcGFkZGluZ1xuICAgICAgY29uc3QgY29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyA9XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaCAqIHRoaXMuYmFzZUdyaWRTaXplICsgdGhpcy5jb2FjaEJvcmRlclBhZGRpbmc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBlYWNoIGdhcCBiZXR3ZWVuIG11bHRpcGxlIGNvYWNoIHRoZSBkZWNrcy5cbiAgICAgIC8vIE5vIGdhcCBleGlzdCBpZiBqdXN0IG9uZSBjb2FjaCBkZWNrIGV4aXN0LlxuICAgICAgY29uc3QgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSAodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hEZWNrcztcblxuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCcsXG4gICAgICAgIGAke2NvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgKiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoICsgZ2FwQmV0d2VlbkNvYWNoRGVja3N9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1kZWNrcycsIGAke3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgIHRoaXMuc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIEluaXQgdGhlIGNvYWNoTmF2QnV0dG9uRGltIGRpbWVuc2lvbiwgd2hpY2ggaXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBzY3JvbGwgbmF2aWdhdGlvbiBsYXRlclxuICAgICAgY29uc3QgbmF2Q29hY2hlc0xpc3QgPSB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnF1ZXJ5U2VsZWN0b3IoJ3VsID4gbGknKSBhcyBIVE1MVUxpc3RFbGVtZW50O1xuICAgICAgaWYgKG5hdkNvYWNoZXNMaXN0KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0TGlFbGVEaW1lbnNpb24gPSBuYXZDb2FjaGVzTGlzdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29hY2hOYXZCdXR0b25EaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICA/IGZpcnN0TGlFbGVEaW1lbnNpb24uaGVpZ2h0XG4gICAgICAgICAgOiBmaXJzdExpRWxlRGltZW5zaW9uLndpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvYWNoU2Nyb2xsQXJlYSAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrKSB7XG4gICAgICAvLyBJbml0IHRoZSBzdGFydCBvZmZzZXQgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgY29hY2ggc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb25zXG4gICAgICBsZXQgY3VyckNhbGNUcmlnZ2VyUG9zID0gMDtcbiAgICAgIHRoaXMuc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBQcmVjYWxjdWxhdGUgdHJpZ2dlciBzY3JvbGwgcG9zaXRpb24gYXJyYXkgZGVwZW5kcyBvbiBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5kZWNrQ29hY2hlc1tpbmRleF07XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zWCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcblxuICAgICAgICAvLyBDYWxjdWxhdGlvbiBvZiB0aGUgZW5kIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uIG9mIGEgY29hY2gsIGluY2x1ZGluZyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXNcbiAgICAgICAgLy8gVGhlIGdhcCBpcyBtYXliZSBhZGp1c3RlZCBpZiBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY3MgZXhpc3RcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9XG4gICAgICAgICAgY29hY2hTdHJ1Y3R1cmUud2lkdGggK1xuICAgICAgICAgICghY29hY2hTdHJ1Y3R1cmUuaGFzT3ZlcmhhbmdpbmdFbGVtZW50c1xuICAgICAgICAgICAgPyB0aGlzLmdhcEJldHdlZW5Db2FjaGVzXG4gICAgICAgICAgICA6IDIgKiB0aGlzLmdhcEJldHdlZW5Db2FjaGVzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFBvc1gsXG4gICAgICAgICAgZW5kOiBjdXJyQ2FsY1RyaWdnZXJQb3MsXG4gICAgICAgICAgd2lkdGg6IGNvYWNoU3RydWN0dXJlLndpZHRoLFxuICAgICAgICB9IGFzIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBtYXhpbXVtIGNhbGN1bGF0ZWQgY29hY2ggd2lkdGhcbiAgICAgIHRoaXMubWF4Q2FsY0NvYWNoZXNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcyAtIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBldmVudCBoYW5kbGVyIG1hbmFnZWQgdGhlIGVuZCBvZiBzY3JvbGxpbmcgaW5zaWRlIHRoZSBjb2FjaCBzY3JvbGwgYXJlYS5cbiAgICogVGltZW91dCBldmVudCBoYW5kbGluZyB0byBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAgICogSXQgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgU2FmYXJpIGJyb3dzZXIgZG9lcyBub3QgaGFuZGxlIHNjcm9sbGVuZCBldmVudCxcbiAgICogYW5kIHdlIHRoZXJlZm9yZSBpbWl0YXRlIHRoaXMgZXZlbnQgLT4gc2Nyb2xsZW5kLlxuICAgKi9cbiAgQGV2ZW50T3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSlcbiAgcHJvdGVjdGVkIGNvYWNoQXJlYVNjcm9sbGVuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsVGltZW91dCkge1xuICAgICAgLy8gRmlyc3QsIHdlIGNsZWFyZWQgdGhlIHJlZ2lzdGVyZWQgdGltZW91dCwgYXMgdGhlIHNjcm9sbGluZyBpcyBzdGlsbCBydW5uaW5nXG4gICAgICAvLyBhbmQgdGh1cyB3ZSBwcmV2ZW50IHRoZSBleGVjdXRpb24gb2YgdGhlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCBmdW5jdGlvblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBJZiBubyBmdXJ0aGVyIHNjcm9sbCBldmVudCBpcyBmaXJlZCwgdGhlIG5leHQgdGltZW91dCBjYW4gZXhlY3V0ZSB0aGUgaW5uZXIgZnVuY3Rpb24gX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IHdpdGhvdXQgY2xlYXJpbmdcbiAgICB0aGlzLl9zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpLCAxNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIG5vIG5hdmlnYXRpb24gZXhpc3RzIChwcm9wZXJ0eSBzZXR0aW5nIC0+IGhhc05hdmlnYXRpb24pIGFuZCBhIHRhYmxlIGNvYWNoIGdldHMgdGhlIGZvY3VzLFxuICAgKiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoIG11c3QgYmUgYXV0b21hdGljYWxseSBwcmVzZWxlY3RlZCB0byBjb250cm9sIHRoZSBwbGFjZSBuYXZpZ2F0aW9uIHZpYSBrZXlib2FyZFxuICAgKlxuICAgKiBAcGFyYW0gZm9jdXNDb2FjaEluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShmb2N1c0NvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzICYmICF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmb2N1c0NvYWNoSW5kZXggPT09IDBcbiAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoLTEpXG4gICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGZvY3VzQ29hY2hJbmRleCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaWxsIGJlIHRyaWdnZXJlZCBieSBmb2N1cyBuYXZpZ2F0aW9uIGRpcmVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpOiB2b2lkIHtcbiAgICAvLyBJZiBhbnkgbmF2aWdhdGlvbiBkaXJlY3Rpb24gYnV0dG9uIChyaWdodHxsZWZ0KSBnZXQgdGhlIGZvY3VzLCBzbyB3ZSBoYXZlIG1hbnVhbCByZXNldCB0aGUgcHJldmlvdXMgZm9jdXNDb2FjaEluZGV4LlxuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgfVxuXG4gIC8qKiBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciBDb2FjaCBOYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBvbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBjdXJyTmF2Q29hY2hCdXR0b25JbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nXG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdlbmVyYWwgVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgdGFiIG5hdmlnYXRpb24gaW5zaWRlIHRoZSBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEgYW5kIHRoZSBzZWF0bWFwIGFyZWEgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiS2V5TmF2aWdhdGlvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBldmVudEFyZWE6IHN0cmluZyxcbiAgICBjdXJyVGFiSW5kZXg/OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgcHJlc3NlZFNoaWZ0VGFiID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEuXG4gICAgICAvLyBGcHIgY29hY2ggbmF2aWdhdGlvbiB3ZSBqdXN0IGNvbnRyb2wgdGhlIGZvY3VzIGluZGV4IHRvIHZpc3VhbGl6ZSBmb2N1cyBzdHlsZSBmb3IgbmF2IGNvYWNoIGJ1dHRvblxuICAgICAgaWYgKGV2ZW50QXJlYSA9PSAnbmF2aWdhdGlvbicpIHtcbiAgICAgICAgaWYgKGN1cnJUYWJJbmRleCA9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSB8fFxuICAgICAgICAgICAgIXByZXNzZWRTaGlmdFRhYiB8fFxuICAgICAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbY3VyclRhYkluZGV4XS5pc0RyaXZlckFyZWEgfHxcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXg7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmVzc2VkU2hpZnRUYWIgJiYgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgICAgLy9JZiB0aGUgRm9yIGJhY2sgdGFiYmluZywgd2UganVtcFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleCE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihjdXJyVGFiSW5kZXghKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIHNlYXRtYXAgYXJlYVxuICAgICAgZWxzZSBpZiAoZXZlbnRBcmVhID09ICdzZWF0bWFwJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAocHJlc3NlZFNoaWZ0VGFiKSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnTkVYVF9UQUInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNhdGlvbiBvZiBLZXlib2FyZCBTZWF0bWFwIGV2ZW50IGhhbmRsaW5nIHRvIG5hdmlnYXRpb24gYmV0d2VlbiBlYWNoIHBsYWNlcyBpbnNpZGUgYSBzZWxlY3RlZCBjb2FjaCBieSB1c2luZyBbYXJyb3ddIGtleXMuXG4gICAqIFdpdGggdGhlIFtUQUJdIGtleSB0aGUgdXNlciBuYXZpZ2F0aW9uIGdvZXMgdG8gdGhlIG5leHQgY29hY2ggbmF2aWdhdGlvbiBlbGVtZW50IGFuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQuXG4gICAqL1xuICBwcm90ZWN0ZWQga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlzVGFiTmV4dCA9IGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiO1xuICAgIGNvbnN0IGlzVGFiUHJldiA9IGV2ZW50LnNoaWZ0S2V5ICYmIGlzVGFiTmV4dDtcblxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QgYW5kIHRoZSBmaXJzdCBvciBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkLCB0aGUgdGhlIHVzZSB0cmllcyB0byBsZWF2ZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQgYnkgdXNpbmcgdGFiLFxuICAgIC8vIHNvIHdlIGNhbiByZXR1cm4gaGVyZSBhbmQgYWxsb3cgdGhlIG5hdGl2ZSBmb2N1cyB0byBsZWF2ZSB0aGUgY29tcG9uZW50LlxuICAgIGlmIChcbiAgICAgICghdGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gMCAmJiBpc1RhYlByZXYpIHx8XG4gICAgICAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxICYmIGlzVGFiTmV4dClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiYgKGlzVGFiTmV4dCB8fCBpc1RhYlByZXYpKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKGlzVGFiTmV4dCkge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ3NlYXRtYXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcnJvdyBLZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGNvbnRyb2wgcGxhY2VzIGluc2lkZSB0aGUgc2VhdG1hcFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIC8vIE5vIHByZXNlbGVjdCBwbGFjZSBieSBtYW51YWwgc2VhdG1hcCBzY3JvbGxpbmdcbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm8gYXV0byBwbGFjZSBwcmVzZWxlY3Rpb24gYnkgcnVubmluZyB0aGUgcHJlc2VsZWN0IGNvYWNoIGluZGV4XG4gICAgaWYgKHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBEcml2ZXJBcmVhIG9yIEVtcHR5IGNvYWNoIChubyBwbGFjZXMpLCBubyBwbGFjZSBpcyBzZWxlY3RhYmxlLCBzbyB3ZSByZXR1cm4gZGlyZWN0bHlcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdICYmXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLmlzRHJpdmVyQXJlYVxuICAgICkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSB3aGVuIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCBhbmQgY29hY2hlcyBhcmUgc2Nyb2xsZWQgYnkgYXV0byBzY3JvbGxpbmcsXG4gICAgLy8gdGhlbiB3ZSBjYW4gc2V0IHRoZSBmb2N1cyBvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoLlxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICBjb25zdCBjbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbigpO1xuICAgICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91cyBmb2N1c2VkIHBsYWNlXG4gICAgICBpZiAoY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIGEgY29hY2ggd2FzIHNlbGVjdGVkIHdpdGggbm8gcGxhY2VzLCB0aGVuIHdlIGhhdmUgdG8gZm9jdXMgdGhlIGNvYWNoR3JpZFxuICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHByZXNlbGVjdGlvbiBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgbm9ybWFsIGNsaWNraW5nIG9yIHZpYSBzY3JlZW4gcmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcblxuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5faXNWYWxpZENvYWNoSW5kZXgoc2VsZWN0ZWROYXZDb2FjaEluZGV4KSAmJlxuICAgICAgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICApIHtcbiAgICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gdGhpcy5fZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpO1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsVG9Db2FjaFBvc1ggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBzZWxlY3RlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmb2N1c1BsYWNlRWxlbWVudChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAnZm9jdXMnKTtcblxuICAgICAgICAvL1RyeSB0byBzY3JvbGwgZm9jdXNlZCBwbGFjZSBpbnRvIHRoZSB2aWV3cG9ydFxuICAgICAgICBjb25zdCBkZWxheVNjcm9sbEluVmlld3BvcnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5mb2N1c1BsYWNlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAndW5mb2N1cycpO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQobnVsbCk7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICBlbGVtZW50RGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICAgaXNTdHJldGNoSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudERpbWVuc2lvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmICFpc09yaWdpbkhlaWdodCkge1xuICAgICAgLy8gU2luY2UgdGhlIGhlaWdodCBvZiB0aGUgY29hY2ggaGFzIGJlZW4gdmlzdWFsbHkgZXhwYW5kZWQgdG8gbWFpbnRhaW4gYSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIGFuZCB0aGUgcGxhY2VzLFxuICAgICAgLy8gc29tZSBncmFwaGljcyBtdXN0IGFsc28gYmUgYWRhcHRlZCB0byB0aGUgaGVpZ2h0LCB3aGljaCBlbmQgd2l0aCB0aGUgYm9yZGVycyBvZiB0aGUgY29hY2hcbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJldGNoSGVpZ2h0KSB7XG4gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBncmFwaGljcyBhcmUgYXNzaWduZWQgZGlyZWN0bHkgYXQgdGhlIGJvcmRlciBvZiB0aGUgY29hY2gsXG4gICAgICAvLyB0aGVzZSBncmFwaGljcyBtdXN0IGJlIGV4cGFuZGVkIGluIGhlaWdodCBieSBhIGNvYWNoQm9yZGVyT2Zmc2V0IGluIG9yZGVyIHRvIHJlYWNoIHRoZWlyIG9yaWdpbmFsIHZpc3VhbCBwb3NpdGlvblxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncpLFxuICAgICAgaDogTWF0aC5yb3VuZCh0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBjb2FjaCwgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgWSBjb29yZGluYXRlIHdpdGggdGhlIGFkZGl0aW9uYWwgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGlmIChlbGVtZW50UG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50UG9zaXRpb24ueSArIGVsZW1lbnREaW1lbnNpb24uaCA9PT0gZW5kUG9zSGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCksXG4gICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnkpLFxuICAgICAgejogZWxlbWVudFBvc2l0aW9uLnosXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXRlY3RzIGlmIGEgKGdyYXBoaWNhbCkgZWxlbWVudCBpcyBvbiB0aGUgYm9yZGVyIHdpdGggaXRzIHBvc2l0aW9uICh1cHBlciBvciBsb3dlciBib3JkZXIpLlxuICAgKiBAcGFyYW0gYmFzZUVsZW1lbnRcbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKFxuICAgIGJhc2VFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgPT09IDAgfHxcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgKyBiYXNlRWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBhdmFpbGFibGUgc2VhdHMgdG9nZXRoZXIgZGVwZW5kaW5nIG9uIHRoZSBzZWF0IHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHBsYWNlc1xuICAgKiBAcmV0dXJucyBBbiBPYmplY3Qgd2l0aCBjb3VudCBvZiBmcmVlIHNlYXRzIGFuZCBmcmVlIGJpY3ljbGUgcGxhY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChcbiAgICBwbGFjZXM6IFBsYWNlW10gfCB1bmRlZmluZWQsXG4gICk6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzIHtcbiAgICBjb25zdCBhY2N1bXVsYXRvcjogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB7IHNlYXRzOiAwLCBiaWN5Y2xlczogMCB9O1xuICAgIGNvbnN0IGZyZWVQbGFjZXMgPSBwbGFjZXM/LnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJQbGFjZTogUGxhY2UpID0+IHtcbiAgICAgIGlmIChjdXJyUGxhY2Uuc3RhdGUgIT09ICdGUkVFJykge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG4gICAgICAvLyBDb3VudCB1cCBkZXBlbmRpbmcgb24gc2VhdCB0eXBlXG4gICAgICBpZiAoY3VyclBsYWNlLnR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICBhY2N1bXVsYXRvci5zZWF0cysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjdW11bGF0b3IuYmljeWNsZXMrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCBhY2N1bXVsYXRvcik7XG4gICAgcmV0dXJuIGZyZWVQbGFjZXMgPyBmcmVlUGxhY2VzIDogYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQXQgdGhlIGVuZCBvZiBhIHNjcm9sbCBFdmVudCBmcm9tIHRoZSBjb2FjaCBzY3JvbGxhYmxlIGFyZWEsXG4gICAqIHRoZSByZWFjaGVkIGNvYWNoIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFNjcm9sbENvYWNoSW5kZXggPSB0aGlzLmlzQXV0b1Njcm9sbGluZ1xuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgIDogdGhpcy5fZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk7XG5cbiAgICAvLyBUSU1PLTQzNzA1XG4gICAgLy8gSWYgYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgbW91c2UgY2xpY2sgKHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykgYmVmb3JlIHRyaWdnZXJpbmcgdGhpcyBzY3JvbGxlbmQgbWV0aG9kLFxuICAgIC8vIHRoZW4gdGhpcyBzY3JvbGxpbmcgd2FzIHRyaWdnZXJlZCBieSB0aGUgbWV0aG9kIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQsIGFuZCBpdCBpcyBvbmx5IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGwgKHNjcm9sbEludG9WaWV3KSxcbiAgICAvLyB3aGVyZSBhIGxlc3MgdmlzaWJsZSBwbGFjZSBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC4gSW4gY2FzZSBvZiBhIHBsYWNlIGFkanVzdG1lbnQgYnkgY2xpY2ssIHdlIGNhbiByZXR1cm4gaGVyZS5cbiAgICBpZiAodGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVuZHNjcm9sbGluZyBpcyBqdXN0IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGxpbmcgKHBsYWNlIGhhcyAyIGdyaWQgc2l6ZSB1bml0cylcbiAgICAgIGNvbnN0IGlzQ29hY2hTY3JvbGxpbmcgPVxuICAgICAgICBNYXRoLmFicyh0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgLSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0KSA+XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplICogMjtcbiAgICAgIGlmIChpc0NvYWNoU2Nyb2xsaW5nKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcblxuICAgIC8vIEFmdGVyIGNvYWNoIHNjcm9sbGVuZCBldmVudCB3ZSBjYW4gcmVzZXQgdGhlIGhvdmVyZWQgY29hY2ggaW5kZXhcbiAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gLTE7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSB1c2VyIHVzZXMgdGhlIHNjcm9sbGJhciB3aXRob3V0IGludGVyYWN0aW5nIHdpdGggdGhlIHNlYXQgcmVzZXJ2YXRpb24sXG4gICAgLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbmRleCBpcyAtMSwgYW5kIHdlIGhhdmUgdG8gc2V0IHRoaXMgdmFsdWUgd2l0aCBmaW5kU2Nyb2xsQ29hY2hJbmRleC5cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgIDogZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgLy9XaGVuIHVzZXIgaXMgc2Nyb2xsaW5nIHZpYSBzY3JvbGxiYXIsIGl0IGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0byB0aGUgZm9jdXNlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihmaW5kU2Nyb2xsQ29hY2hJbmRleCk7XG4gICAgfVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhbiBhdXRvbWF0aWMgbWFpbiBuYXZpZ2F0aW9uIHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIHNlbGVjdGVkTmF2Q29hY2hJbmRleC5cbiAgICogQ2FsY3VsYXRlcyB0aGUgY2VudHJhbCBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBuYXYgY29hY2ggdG8gYmUgc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE5hdkNvYWNoSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy9UaW1lIGRlbGF5IHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBleGVjdXRpbmcgY2FsbGluZyBzY3JvbGxUbyBmdW5jdGlvbnMgKGNvYWNoZXMgc2Nyb2xsaW5nKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYID0gdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSAvIDI7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJ1dHRvbk9mZnNldFggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXggKiB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXRYID1cbiAgICAgICAgICBzY3JvbGxCdXR0b25PZmZzZXRYIC0gbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggKyB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbE9mZnNldFggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxPZmZzZXRYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5ldyBTY3JvbGxEaXJlY3Rpb24gYnkgdGhlIG5ldyBnaXZlbiB0YXJnZXQgY29hY2ggaW5kZXguXG4gICAqL1xuICBwcml2YXRlIF9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID1cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgID8gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0XG4gICAgICAgIDogU2Nyb2xsRGlyZWN0aW9uLmxlZnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Nyb2xsIHN0YXJ0IG9yIGVuZCBwb3NpdGlvbiBYIGZyb20gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBJbiBjYXNlIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBuYXZpZ2F0aW5nIHRocm91Z2ggcGxhY2VzIGJ5IGtleWJvYXJkIGFuZCBnb2VzIHRvIHByZXZpb3VzIGNvYWNoLFxuICAgKiB0aGVuIHdlIHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb2FjaCB0byBnZXQgdGhlIGNsb3Nlc3Qgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGZvY3VzIHBsYWNlLlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29hY2hUcmlnZ2VyUG9pbnQgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uID1cbiAgICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiZcbiAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgIGNvYWNoVHJpZ2dlclBvaW50LndpZHRoID4gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoXG4gICAgICA6IGNvYWNoVHJpZ2dlclBvaW50LnN0YXJ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBIVE1MIHRhYmxlIChncmlkKSBjYXB0aW9uIGVsZW1lbnQgc28gdGhhdCB0aGUgaGVhZGluZyBpcyByZWFkIG91dCB3aGVuIHVzaW5nIGEgU2NyZWVuUmVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk6IHZvaWQge1xuICAgIC8vIFdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYW4gYWN0aW9uIHRoYXQgYWZmZWN0cyB0aGUgY29hY2ggbmF2aWdhdGlvbiwgdGhlbiB0aGUgbmF2aWdhdGVkIHRhYmxlIGlzIGZvY3VzYWJsZS5cbiAgICBpZiAodGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSAmJiB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgY29hY2hTY3JvbGxXaW5kb3dXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWF4U2Nyb2xsV2lkdGhBcmVhID0gdGhpcy5tYXhDYWxjQ29hY2hlc1dpZHRoIC0gY29hY2hTY3JvbGxXaW5kb3dXaWR0aDtcbiAgICBjb25zdCBjdXJyQ29hY2hUcmlnZ2VyID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3MgPVxuICAgICAgY3VyclNjcm9sbFBvc1ggPT09IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnN0YXJ0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIChjdXJyU2Nyb2xsUG9zWCA8IG1heFNjcm9sbFdpZHRoQXJlYSB8fCBjdXJyU2Nyb2xsUG9zWCA+IGN1cnJDb2FjaFRyaWdnZXIuc3RhcnQpICYmXG4gICAgICAhaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvYWNoIGluZGV4IHdoaWNoIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBzY3JvbGwgYXJlYVxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcm9sbFBvcyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gc2Nyb2xsUG9zICsgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPVxuICAgICAgJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgJy0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcjJyArIGZpcnN0Q2VsbElkKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgcHJlc3NlZEtleTogc3RyaW5nLFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggRE9XTlxuICAgIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMiA9PT0gY29hY2guZGltZW5zaW9uLmggJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDE7XG4gICAgfVxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggVVBcbiAgICBlbHNlIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSA9PT0gMCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGxldCBjbG9zZXN0UGxhY2UgPSBudWxsO1xuICAgIGxldCBjb2FjaFBsYWNlcyA9IGNvYWNoLnBsYWNlcztcbiAgICBsZXQgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IG51bGw7XG5cbiAgICBpZiAoY29hY2hQbGFjZXMpIHtcbiAgICAgIC8vIElmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZSB1c2UgaW5pdGlhbCB0aGUgbGVmdC10b3AgcGxhY2Ugb24gdGhlIGNvYWNoXG4gICAgICBpZiAoIXRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbiA9IHsgLi4udGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbiB9O1xuXG4gICAgICAgICAgaWYgKHByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciBjb2FjaCBkZWNrIChVcCAtPiBEb3duIHwgRG93biAtPiBVcCkuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHRha2UgdGhlIGNvYWNoIHBsYWNlcyB3ZSBoYXZlIHRvIGNoZWNrZWQgZnJvbSB0aGUgdGFyZ2V0IGRlY2sgbm93LlxuICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IHRoaXMuX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgICAgICAgICAgIHByZXNzZWRLZXksXG4gICAgICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIEFzc2lnbiBjaGVjayBwbGFjZXMgZnJvbSB0aGUgdGFyZ2V0IHN3aXRjaCBkZWNrXG4gICAgICAgICAgICAgIGNvYWNoUGxhY2VzID1cbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbc3dpdGNoZWRDb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICAgIF0ucGxhY2VzIHx8IFtdO1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHVwZGF0ZSB5IGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ID1cbiAgICAgICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPyBjb2FjaC5kaW1lbnNpb24uaCA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2hQbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCBwbGFjZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgUklHSFRcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBMRUZUXG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocGxhY2UubnVtYmVyICE9PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5udW1iZXIpIHtcbiAgICAgICAgICAgICAgICAvL0tleSBbUmlnaHRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtEb3duXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0xlZnRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW1VwXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgcGxhY2UgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGNoYW5naW5nIHN3aXRjaCBjb2FjaCxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXBkYXRlIHRoZSBjdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCAmJiBjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gc3dpdGNoZWRDb2FjaERlY2tJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3RQbGFjZTtcbiAgfVxuXG4gIC8vIEhhbmRsaW5nIGZvciBUYWIgbmF2aWdhdGlvbiBpZiBhIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIC8vIElmIHdlIFRBQiBiYWNrIGFuZCBoYXZlIGEgc2VsZWN0ZWQgcGxhY2VzIGluc2lkZSB0aGUgY3VycmVudCBjb2FjaCwgdGhlbiB3ZSBtb3ZlIG91dCBmcm9tIHRoZSBzZWF0bWFwIGFuZCBzZXQgdGhlIGZvY3VzIHRvIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cyB8fCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJGb2N1c0luZGV4O1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBmaXJzdCBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgd2UgVEFCIGJhY2ssIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGZpcnN0IGNvYWNoIGluIHRoZSBuYXZpZ2F0aW9uIHRvIGdldCBiYWNrIHRvIHRoZSBub3JtYWwgdGFiIG5hdmlnYXRpb24uXG4gICAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgIGVsc2UgaWYgKGN1cnJGb2N1c0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gUmVmb2N1cyB0aGUgZmlyc3QgY29hY2hcbiAgICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZSBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIsIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGxhc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgIHRvIHJlbW92ZSB0aGUgZm9jdXNlZEluZGV4IGZyb20gdGhlIGZpcnN0IGNvYWNoIGFuZCBzZXQgaXQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJyAmJlxuICAgICAgICBuZXdGb2N1c2FibGVJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlZm9jdXMgdGhlIGxhc3QgY29hY2hcbiAgICAgICAgdGhpcy5fcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goY3VyckZvY3VzSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICAvLyBJZiBhbnkgcGxhY2Ugd2FzIGZvY3VzZWQgaW4gY29hY2gsIHNvIHdlIHNldCBmb2N1c2VkIGFnYWluXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gcGxhY2Ugd2FzIHNlbGVjdGVkLCB0aGVuIHdlIHNlbGVjdCB0aGUgY29hY2ggZ3JpZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCeSBUYWIgTmF2aWdhdGlvbiwgcGVyZm9ybSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBmb2N1c2VkIHdhZ29uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVmb2N1c2VkIHRoZSBjdXJyZW50IGZvY3VzZWQgKHZpc3VhbCkgbmF2IGNvYWNoIHRvIGdldCB0aGUgbmF0aXZlIGZvY3VzIGJhY2sgdG8gdGhlIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBfcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goZm9jdXNJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBmb2N1c0luZGV4KSwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+fVxuICAgICAqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBQbGFjZSBhcnJheSB3aXRoIGFsbCBzZWxlY3RlZCBwbGFjZXMuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzPignc2VsZWN0ZWRwbGFjZXMnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFjZSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1twbGFjZURlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XS5wbGFjZXM/LmZpbmQoXG4gICAgICAocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PSBwbGFjZVNlbGVjdGlvbi5udW1iZXIsXG4gICAgKTtcblxuICAgIGlmICghcGxhY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHBsYWNlRGVja0luZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAvLyBUaW1lIGRlbGF5IHRvIHdhaXQgZm9yIHN0YXR1cyB1cGRhdGUgcHJvY2VzcyBhdCBjbGlja2VkIHBsYWNlXG4gICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTogdm9pZCB7XG4gICAgLy9Pbmx5IGlmIHRoZSBzZWxlY3RlZENvYWNoSW5kZXggaGFzIGNoYW5nZWQsIGFuIHVwZGF0ZSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICBpZiAoY29hY2hTZWxlY3Rpb24pIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+KCdzZWxlY3RlZGNvYWNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBjb2FjaFNlbGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQbGFjZUVsZW1lbnRJZChcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZU51bWJlcjogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyBjb2FjaERlY2tJbmRleCArICctJyArIGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIGNhc2Ugb2YgY29hY2ggbGF5b3V0cyB3aXRoIGRpZmZlcmVudCBkZWNrcyxcbiAgICogaXQgaXMgbmVjZXNzYXJ5IHRvIGV4dGVuZCB0aGUgb2Zmc2V0IHdpdGggZW1wdHkgY29hY2hlc1xuICAgKiBpbiBvcmRlciB0byBjcmVhdGUgYSBzdGFibGUgdmVoaWNsZSBsYXlvdXQuXG4gICAqXG4gICAqICAgICAgICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqL1xuICBwcml2YXRlIF9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk6IHZvaWQge1xuICAgIC8vIFByZWZpbGwgb2Zmc2V0IGNvdW50ZXJzIHdpdGggMCBzdGFydCBpbmRleFxuICAgIGNvbnN0IGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyID0gQXJyYXkodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpLmZpbGwoMCk7XG4gICAgLy8gVGFrZXMgdGhlIGxvd2VyIGRlY2sgd2hpY2ggY29udGFpbnMgdGhlIG1heCBudW1iZXJzIG9mIGNvYWNoZXNcbiAgICBjb25zdCBsb3dlckRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdO1xuXG4gICAgbG93ZXJEZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgobG93ZXJDb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY2tDb2FjaEl0ZW0gPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbaV0uY29hY2hJdGVtc1tjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXV07XG4gICAgICAgIGlmIChsb3dlckNvYWNoSXRlbS5pZCAhPSBkZWNrQ29hY2hJdGVtPy5pZCkge1xuICAgICAgICAgIC8vIEFkZCBFbXB0eSBvZmZzZXQgY29hY2ggdG8gc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgZW1wdHlPZmZzZXRDb2FjaCA9IHtcbiAgICAgICAgICAgIC4uLmxvd2VyQ29hY2hJdGVtLFxuICAgICAgICAgICAgcGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9wZXJ0eUlkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY0VsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRyYXZlbENsYXNzOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zLnNwbGljZShcbiAgICAgICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVtcHR5T2Zmc2V0Q29hY2gsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldKys7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IHBsYWNlIHNlbGVjdGlvbnNcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnNlYXRzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcyA9IFtdO1xuXG4gICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT5cbiAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2g6IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICAgID8uZmlsdGVyKChwbGFjZSkgPT4gcGxhY2Uuc3RhdGUgPT09ICdTRUxFQ1RFRCcpXG4gICAgICAgICAgPy5mb3JFYWNoKChwbGFjZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBwcmVzZWxlY3RlZFBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbiA9IG1hcFBsYWNlSW5mb3NUb1BsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICAgICAgcGxhY2VJZCxcbiAgICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb246IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCA9XG4gICAgICAgICAgICAgIHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb24sIGNvYWNoRGVja0luZGV4KTtcblxuICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgc2VsZWN0ZWQgcGxhY2VzIHdpbGwgYmUgcmVzZXQgb3IgdGhlIGN1cnJlbnRTZWxlY3RlZFBsYWNlIHdhcyBnaXZlbiwgdGhlbiB3ZSByZXNldCBhbGwgZXhjZXB0IGN1cnJlbnRTZWxlY3RlZFBsYWNlXG4gICAqIEBwYXJhbSByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uc1xuICAgKiBAcGFyYW0gY3VyclNlbGVjdGVkUGxhY2VcbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKFxuICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdLFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlPzogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vRmluZCBhbGwgcGxhY2VzIHRvIGJlIG5lZWRlZCB1bnNlbGVjdFxuICAgIGZvciAoY29uc3QgcGxhY2VTZWxlY3Rpb24gb2YgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMpIHtcbiAgICAgIGlmICghY3VyclNlbGVjdGVkUGxhY2UgfHwgY3VyclNlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQocGxhY2VTZWxlY3Rpb24uaWQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAocGxhY2VFbGVtZW50KSB7XG4gICAgICAgICAgcGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3RhdGUnLCAnRlJFRScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcGxhY2VzIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgaWYgKGN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCA9PT0gY3VyclNlbGVjdGVkUGxhY2UuaWQsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2VTZWxlY3Rpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlciB8IG51bGwsXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgaWYgKGNvYWNoRGVja0luZGV4ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tjb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4XTtcbiAgICBjb25zdCBwbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gY3VyclNlbGVjdGVkUGxhY2UubnVtYmVyKTtcblxuICAgIHJldHVybiBwbGFjZVxuICAgICAgPyBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICBjb2FjaCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5kZWNrSW5kZXgsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleCxcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaChcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2ggfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF07XG4gICAgY29uc3QgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2gucGxhY2VzKTtcbiAgICByZXR1cm4gbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24oY29hY2hJbmRleCwgY29hY2gsIGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID0gcGxhY2VcbiAgICAgID8gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCxcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyYXRpb24gb2YgdGhlIHVzZWQgZG9jdW1lbnRzIGZvbnQtc2l6ZSB3aGljaCBuZWVkc1xuICAgKiB0byBiZSBkZXRlcm1pbmVkIGluIG9yZGVyIHRvIGNvcnJlY3RseSBjYWxjdWxhdGUgQ1NTIHZhbHVlcyB3aXRoIHJlbVxuICAgKiAqL1xuICBwcml2YXRlIF9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTogdm9pZCB7XG4gICAgaWYgKCFpc1NlcnZlcikge1xuICAgICAgY29uc3QgYmFzZUZvbnRTaXplID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZm9udFNpemUsIDEwKTtcbiAgICAgIC8vY2FsY3VsYXRlIHJlbSBvZiAxcHhcbiAgICAgIGNvbnN0IG9uZVBpeGVsSW5SZW0gPSAxIC8gYmFzZUZvbnRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tb25lLXB4LXJlbScsIGAke29uZVBpeGVsSW5SZW0gKyAncmVtJ31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgZGF0YSBmb3IgZGlzcGxheWluZyBuYXZpZ2F0aW9uIGFyZWEuXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyB3aGljaCBhcmUgbm90IGdvaW5nIHRvIGNoYW5nZSBkdXJpbmcgdXNlIG9mIGEgY29tcG9uZW50OlxuICAgKiAgICAtIGNvYWNoIGlkXG4gICAqICAgIC0gbGlzdCBvZiBzZXJ2aWNlIGljb25zXG4gICAqICAgIC0gY2xhc3MgKGZpcnN0LCBzZWNvbmQsIGFueSlcbiAgICogICAgLSB3aGV0aGVyIHRoZXJlIGlzIGEgZHJpdmVyIGFyZWEgbGVmdCBvciByaWdodFxuICAgKiAqL1xuICBwcml2YXRlIF9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgbG93ZXJEZWNrOiBDb2FjaEl0ZW1bXSA9XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0uY29hY2hJdGVtcztcblxuICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMgPSBbXTtcblxuICAgICAgbG93ZXJEZWNrLmZvckVhY2goKGNvYWNoLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHBsYWNlczogUGxhY2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIENvbGxlY3QgYWxsIGltcG9ydGFudCBuYXZpZ2F0aW9uIGRhdGEgdG8gYmUgcmVuZGVyZWRcbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICAgICAgLm1hcCgoc3IpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzci5jb2FjaEl0ZW1zW2luZGV4XTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb3JFYWNoKChjb2FjaDogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgICAgICB0cmF2ZWxDbGFzc2VzLnB1c2goLi4uY29hY2gudHJhdmVsQ2xhc3MpO1xuICAgICAgICAgICAgcHJvcGVydHlJZHMucHVzaCguLi4oY29hY2gucHJvcGVydHlJZHMgPyBjb2FjaC5wcm9wZXJ0eUlkcyA6IFtdKSk7XG4gICAgICAgICAgICBwbGFjZXMucHVzaCguLi4oY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzIDogW10pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICBpZDogY29hY2guaWQsXG4gICAgICAgICAgdHJhdmVsQ2xhc3M6IHRoaXMuX3ByZXBhcmVUcmF2ZWxDbGFzc05hdmlnYXRpb24odHJhdmVsQ2xhc3NlcyksXG4gICAgICAgICAgcHJvcGVydHlJZHM6IHRoaXMuX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uKHByb3BlcnR5SWRzKSxcbiAgICAgICAgICBpc0RyaXZlckFyZWE6IGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcy5sZW5ndGggPT09IDAgOiB0cnVlLFxuICAgICAgICAgIGlzTG9jb21vdGl2ZTogdGhpcy5faXNMb2NvbW90aXZlKGNvYWNoKSxcbiAgICAgICAgICBkcml2ZXJBcmVhU2lkZTogdGhpcy5fcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihjb2FjaCksXG4gICAgICAgICAgZnJlZVBsYWNlczogdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKHBsYWNlcyksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gI1RJTU8tNDU4NThcbiAgLy8gRmluZHMgdGhlIG9wdGltYWwgaWNvbiBzaXplIGJhc2VkIG9uIGFsbCBzZXJ2aWNlRWxlbWVudHMgYW5kIHRoZWlyIGRpbWVuc2lvbi5cbiAgLy8gVGhpcyBzZXRzIHRoZSBnbG9iYWxBcmVhSWNvbkRpbSBhbmQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEgZWxlbWVudHMuXG4gIC8vIFRoaXMgZ2l2ZXMgdXMgYSBtYXhpbXVtIHVuaWZvcm0gaWNvbiBzaXplIHdpdGhpbiB0aGUgYXJlYSBlbGVtZW50c1xuICBwcml2YXRlIF9wcmVwYXJlT3B0aW1pemVBcmVhSWNvbkRpbWVuc2lvbkJ5TWVkaWFuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IGFsbFNlcnZpY2VEaW1lbnNpb25zOiBFbGVtZW50RGltZW5zaW9uW10gPSBbXTtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5mb3JFYWNoKChkZWNrKSA9PlxuICAgICAgICBkZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgoY29hY2gpID0+XG4gICAgICAgICAgY29hY2guc2VydmljZUVsZW1lbnRzPy5mb3JFYWNoKChpY29uKSA9PiBhbGxTZXJ2aWNlRGltZW5zaW9ucy5wdXNoKGljb24uZGltZW5zaW9uKSksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICBpZiAoYWxsU2VydmljZURpbWVuc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgIGFsbFNlcnZpY2VEaW1lbnNpb25zLnNvcnQoXG4gICAgICAgICAgKGRpbTE6IEVsZW1lbnREaW1lbnNpb24gfCB1bmRlZmluZWQsIGRpbTI6IEVsZW1lbnREaW1lbnNpb24gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChkaW0xICYmIGRpbTIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF4RGltMSA9IGRpbTEudyArIGRpbTEuaDtcbiAgICAgICAgICAgICAgY29uc3QgbWF4RGltMiA9IGRpbTIudyArIGRpbTIuaDtcbiAgICAgICAgICAgICAgaWYgKG1heERpbTEgPiBtYXhEaW0yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4RGltMSA8IG1heERpbTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgYmVzdCBpY29uIHNpemUgYnkgbWVkaWFuXG4gICAgICAgIGNvbnN0IG1lZGlhbkljb25TaXplID0gYWxsU2VydmljZURpbWVuc2lvbnNbTWF0aC5mbG9vcihhbGxTZXJ2aWNlRGltZW5zaW9ucy5sZW5ndGggLyAyKV0hO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZGV0ZXJtaW5lZCBtZWRpYW4gaWNvbiBzaXplIGFzIGdsb2JhbCBjYWxjdWxhdGVkIGFyZWEgaWNvbiBkaW1lbnNpb25cbiAgICAgICAgdGhpcy5nbG9iYWxBcmVhSWNvbkRpbSA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihtZWRpYW5JY29uU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBmaW5kIHRoZSBtYXhpbXVtIGNvYWNoIGhlaWdodCBmcm9tIGFsbCBkZWNrc1xuICAgICAgICBjb25zdCBtYXhDb2FjaEhlaWdodCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgICAgIC5mbGF0TWFwKChkZWNrKSA9PiBkZWNrLmNvYWNoSXRlbXMubWFwKChjb2FjaCkgPT4gY29hY2guZGltZW5zaW9uLmgpKVxuICAgICAgICAgIC5yZWR1Y2UoKG1heCwgaGVpZ2h0KSA9PiBNYXRoLm1heChtYXgsIGhlaWdodCksIDApO1xuXG4gICAgICAgIC8vY2FsY3VsYXRlIDIwJSBvZiBtYXhpbXVtIGhlaWdodCBhcyBpY29uIGRpbWVuc2lvblxuICAgICAgICBjb25zdCBpY29uRGltZW5zaW9uID0gTWF0aC5mbG9vcihtYXhDb2FjaEhlaWdodCAqIDAuMik7XG4gICAgICAgIHRoaXMuZ2xvYmFsQXJlYUljb25EaW0gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oe1xuICAgICAgICAgIHc6IGljb25EaW1lbnNpb24sXG4gICAgICAgICAgaDogaWNvbkRpbWVuc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10pOiBQbGFjZVRyYXZlbENsYXNzIHtcbiAgICBpZiAodHJhdmVsQ2xhc3Nlcy5pbmRleE9mKCdGSVJTVCcpICE9PSAtMSkge1xuICAgICAgcmV0dXJuICdGSVJTVCc7XG4gICAgfVxuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ1NFQ09ORCcpICE9PSAtMSkge1xuICAgICAgcmV0dXJuICdTRUNPTkQnO1xuICAgIH1cbiAgICByZXR1cm4gJ0FOWV9DTEFTUyc7XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlRHJpdmVyQXJlYVNpZGVOYXZpZ2F0aW9uKFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29hY2hEcml2ZXJBcmVhcyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgIChncmFwaGljYWxFbGVtZW50cykgPT4gZ3JhcGhpY2FsRWxlbWVudHMuaWNvbiA9PT0gJ0RSSVZFUl9BUkVBJyxcbiAgICApO1xuXG4gICAgaWYgKGNvYWNoRHJpdmVyQXJlYXMgJiYgY29hY2hEcml2ZXJBcmVhcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDaGVja2luZyB0aGUgZHJpdmVyIGFyZWEgcG9zaXRpb24gd2hldGhlciBpdCBpcyBwcmVzZW50IG9uIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgaW4gYSBjb2FjaFxuICAgICAgY29uc3QgaGFzTGVmdERyaXZlckFyZWEgPVxuICAgICAgICBjb2FjaERyaXZlckFyZWFzLmZpbmQoKGRyaXZlckFyZWFFbGVtZW50KSA9PiBkcml2ZXJBcmVhRWxlbWVudC5wb3NpdGlvbi54ID09PSAwKSB8fCBmYWxzZTtcbiAgICAgIGNvbnN0IGhhc1JpZ2h0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPiAwKSB8fCBmYWxzZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogISFoYXNMZWZ0RHJpdmVyQXJlYSxcbiAgICAgICAgcmlnaHQ6ICEhaGFzUmlnaHREcml2ZXJBcmVhLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uID0gKHByb3BlcnR5SWRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IHtcbiAgICBpZiAoIXByb3BlcnR5SWRzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc2hydW5rUHJvcGVydHlJZHMgPSBwcm9wZXJ0eUlkc1xuICAgICAgPy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5SWQ6IHN0cmluZyk6IHtcbiAgICAgICAgcElkOiBzdHJpbmc7XG4gICAgICAgIHN2Z05hbWU6IHN0cmluZztcbiAgICAgIH0ge1xuICAgICAgICAvLyBwcmVwYXJlIHRlbXBvcmFyeSBvYmplY3QgbWFwcGluZyBwcm9wZXJ0eSBpZCB0byBpdCdzIHN2Z05hbWUgc28gdGhhdCB3ZSBjYW4gY29tcGFyZSBpdCB0byB0aGUgbGlzdCBvZiBhbGxvd2VkIGljb25zXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcElkOiBwcm9wZXJ0eUlkLFxuICAgICAgICAgIHN2Z05hbWU6IG1hcEljb25Ub1N2Z1twcm9wZXJ0eUlkXT8uc3ZnTmFtZSA/IG1hcEljb25Ub1N2Z1twcm9wZXJ0eUlkXT8uc3ZnTmFtZSA6ICcnLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC8vZmlsdGVyIG91dCBvYmplY3RzIHNlcnZpY2UgaWNvbnMgd2hpY2ggYXJlIG5vdCBpbiBBTExPV0VEX1NFUlZJQ0VfSUNPTlNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5VG9TdmcpID0+IEFMTE9XRURfU0VSVklDRV9JQ09OUy5pbmRleE9mKHByb3BlcnR5VG9Tdmcuc3ZnTmFtZSkgIT09IC0xKVxuICAgICAgLy9tYWtlIGl0IGRpc3RpbmN0IGJ5IHN2Z05hbWVcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgICAgc2VsZi5tYXAoKHByb3BTdmcpID0+IHByb3BTdmcuc3ZnTmFtZSkuaW5kZXhPZih2YWx1ZS5zdmdOYW1lKSA9PT0gaW5kZXgsXG4gICAgICApXG4gICAgICAvLyBnbyBiYWNrIHRvIHByb3BlcnR5SWQgc3RyaW5nIGZyb20gdGVtcG9yYXJ5IG9iamVjdFxuICAgICAgLm1hcCgocHJvcGVydHlUb1N2ZykgPT4gcHJvcGVydHlUb1N2Zy5wSWQpXG4gICAgICAvLyB0YWtlIGZpcnN0IE1BWF9TRVJWSUNFX1BST1BFUlRJRVMgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgZnJvbSBCYWNrZW5kLCBvdGhlcndpc2UgdGhlIGxheW91dCBjb3VsZCBiZSBkZXN0cm95ZWRcbiAgICAgIC5zbGljZSgwLCBNQVhfU0VSVklDRV9QUk9QRVJUSUVTKTtcbiAgICByZXR1cm4gc2hydW5rUHJvcGVydHlJZHMgPyBzaHJ1bmtQcm9wZXJ0eUlkcyA6IFtdO1xuICB9O1xuXG4gIC8vIEluaXRpYWxseSBjYWxjdWxhdGVzIGFsbCB0aGUgbmVjZXNzYXJ5IHBvc2l0aW9ucyBhbmQgZGltZW5zaW9ucyBvZiBhbGwgY29hY2ggZWxlbWVudHMsIGFyZWEgZWxlbWVudHMsIHNlcnZpY2UgZWxlbWVudHNcbiAgcHJpdmF0ZSBfcHJlcGFyZVNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZUluZm9ybWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlID0ge1xuICAgICAgICBkZWNrczogW10sXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnMuZm9yRWFjaCgoc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uRGVjazogU2VhdHJlc2VydmF0aW9uRGVjayA9IHtcbiAgICAgICAgICBkZWNrSW5kZXg6IGluZGV4LFxuICAgICAgICAgIGRlY2tDb2FjaGVzOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXM/LmZvckVhY2goKGNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWRBcmVhRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAgICAgICAoZSkgPT4gZS5pY29uICYmICF0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhlLmljb24pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgYWxsRWxlbWVuZXRzID1cbiAgICAgICAgICAgIGZpbHRlcmVkQXJlYUVsZW1lbnRzXG4gICAgICAgICAgICAgID8uY29uY2F0KGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMgfHwgW10pXG4gICAgICAgICAgICAgIC5jb25jYXQoY29hY2hJdGVtLnBsYWNlcyB8fCBbXSkgfHwgW107XG4gICAgICAgICAgY29uc3QgaGFzT3ZlcmhhbmdpbmdFbGVtZW50cyA9IHRoaXMuX2lzT3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQoXG4gICAgICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLncsXG4gICAgICAgICAgICBhbGxFbGVtZW5ldHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhcmVhRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzXG4gICAgICAgICAgICA/LmZpbHRlcihcbiAgICAgICAgICAgICAgKGdyYXBoaWNhbEVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICF0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhncmFwaGljYWxFbGVtZW50Lmljb24hKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0Q2FsY3VsYXRlZERpbWVuc2lvblBvc2l0aW9uRWxlbWVudChlbGUsIGNvYWNoSXRlbS5kaW1lbnNpb24sIHRydWUpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBvdGhlckVsZW1lbnRzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50c1xuICAgICAgICAgICAgPy5maWx0ZXIoKGdyYXBoaWNhbEVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PlxuICAgICAgICAgICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhncmFwaGljYWxFbGVtZW50Lmljb24hKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0Q2FsY3VsYXRlZERpbWVuc2lvblBvc2l0aW9uRWxlbWVudChlbGUsIGNvYWNoSXRlbS5kaW1lbnNpb24sIGZhbHNlKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc2VydmljZUVsZW1lbnRzID0gY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cz8ubWFwKChlbGUpID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgZmFsc2UpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgYm9yZGVyTWlkZGxlRWxlbWVudCA9IHRoaXMuX2dldENhbGN1bGF0ZWRNaWRkbGVCb3JkZXJFbGVtZW50KGNvYWNoSXRlbSk7XG4gICAgICAgICAgY29uc3QgY2FsY0NvYWNoRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHsgLi4uY29hY2hJdGVtLmRpbWVuc2lvbiB9KTtcbiAgICAgICAgICAvLyBDb2xsZWN0IGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHNpbmdsZSBjb2FjaFxuICAgICAgICAgIGNvbnN0IGNvYWNoU3R1cmN0dXJlOiBDb2FjaFN0cnVjdHVyZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBjYWxjQ29hY2hEaW1lbnNpb24udyxcbiAgICAgICAgICAgIGhlaWdodDogY2FsY0NvYWNoRGltZW5zaW9uLmgsXG4gICAgICAgICAgICBvdGhlckVsZW1lbnRzOiBvdGhlckVsZW1lbnRzIHx8IFtdLFxuICAgICAgICAgICAgc2VydmljZUVsZW1lbnRzOiBzZXJ2aWNlRWxlbWVudHMgfHwgW10sXG4gICAgICAgICAgICBhcmVhRWxlbWVudHM6IGFyZWFFbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGJvcmRlck1pZGRsZUVsZW1lbnQ6IGJvcmRlck1pZGRsZUVsZW1lbnQsXG4gICAgICAgICAgICBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzOiBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZWF0UmVzZXJ2YXRpb25EZWNrLmRlY2tDb2FjaGVzLnB1c2goY29hY2hTdHVyY3R1cmUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrcy5wdXNoKHNlYXRSZXNlcnZhdGlvbkRlY2spO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb24gYW5kIGRpbWVuc2lvbiBvZiB0aGUgbWlkZGxlIGJvcmRlci5cbiAgICogVG8gY2FsY3VsYXRlIHRoZSBzdGFydCArIGVuZCBjb29yZGluYXRlIGFuZCB0aGUgZGltZW5zaW9uIG9mIHRoZSBtaWRkbGUgYm9yZGVyIGNvYWNoIGdyYXBoaWMsXG4gICAqIHRoZSBleGlzdGluZyBkb2NraW5nIGNvYWNoIGdyYXBoaWNzIGFyZSBhbmFseXNlZCBhbmQgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkIHBvc2l0aW9uIGFuZCBkaWVtZW5zaW9uIGluZm9ybWF0aW9uLlxuICAgKiBAcmV0dXJucyBCYXNlRWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2FsY3VsYXRlZE1pZGRsZUJvcmRlckVsZW1lbnQoY29hY2g6IENvYWNoSXRlbSk6IEJhc2VFbGVtZW50IHtcbiAgICBjb25zdCBib3JkZXJIZWlnaHQgPSAoY29hY2guZGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMikgKiB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAvLyBEZWZhdWx0IC0gd2l0aG91dCBmaW5kaW5nIGRvY2tpbmcgYm9yZGVyIGVsZW1lbnRzLCB0aGUgbWlkZGxlIGJvcmRlciBnb2VzIGZyb20gMCBwb3NpdGlvbiB1bnRpbCBjb2FjaCB3aWR0aCBlbmRcbiAgICBsZXQgc3RhcnRCb3JkZXJPZmZzZXRYID0gMDtcbiAgICBsZXQgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udztcblxuICAgIGlmIChjb2FjaC5ncmFwaGljRWxlbWVudHMpIHtcbiAgICAgIC8vIERvY2tpbmdFbGVtZW50ZSBkZWZpbmVzIHRoZSBlbGVtZW50cyB3aGVyZSB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCByZWFsbHkgc3RhcnRzIGFuZCBlbmRzXG4gICAgICBjb25zdCBkb2NraW5nRWxlbWVudHMgPSB0aGlzLl9nZXRGaXJzdExhc3REb2NraW5nRWxlbWVudHMoY29hY2guZ3JhcGhpY0VsZW1lbnRzKTtcblxuICAgICAgLy8gVHdvIGRvY2tpbmcgY29hY2ggZWxlbWVudHMgZXhpc3QgKG5vcm1hbCBjYXNlIC0gc3RhcnQgYW5kIGVuZCBkb2NraW5nIGVsZW1lbnQpXG4gICAgICBpZiAoZG9ja2luZ0VsZW1lbnRzPy5sZW5ndGggPT0gMikge1xuICAgICAgICBjb25zdCBmaXJzdERvY2tpbmdFbGVtZW50ID0gZG9ja2luZ0VsZW1lbnRzWzBdO1xuICAgICAgICBjb25zdCBsYXN0RG9ja2luZ0VsZW1lbnQgPSBkb2NraW5nRWxlbWVudHNbMV07XG4gICAgICAgIGNvbnN0IGVuZEJvcmRlck9mZnNldFggPVxuICAgICAgICAgIGZpcnN0RG9ja2luZ0VsZW1lbnQucG9zaXRpb24ueCA9PSAwXG4gICAgICAgICAgICA/IGxhc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24ud1xuICAgICAgICAgICAgOiBmaXJzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuXG4gICAgICAgIHN0YXJ0Qm9yZGVyT2Zmc2V0WCA9XG4gICAgICAgICAgZmlyc3REb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09IDBcbiAgICAgICAgICAgID8gZmlyc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24ud1xuICAgICAgICAgICAgOiBsYXN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG5cbiAgICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udyAtIGVuZEJvcmRlck9mZnNldFggLSBzdGFydEJvcmRlck9mZnNldFg7XG4gICAgICB9XG4gICAgICAvLyBPbmx5IG9uZSBkb2NraW5nIGJvcmRlciBjb2FjaCBlbGVtZW50cyBleGlzdCAoc3RhcnQgb3IgZW5kIGRvY2tpbmcgZWxlbWVudClcbiAgICAgIGVsc2UgaWYgKGRvY2tpbmdFbGVtZW50cz8ubGVuZ3RoID09IDEpIHtcbiAgICAgICAgY29uc3QgZG9ja2luZ0VsZW1lbnQgPSBkb2NraW5nRWxlbWVudHNbMF07XG5cbiAgICAgICAgLy8gTWlkZGxlQm9yZGVyIHN0YXJ0cyBmcm9tIGxlZnQgZG9ja2luZyBlbGVtZW50IHVudGlsIGNvYWNoIGVuZFxuICAgICAgICBpZiAoZG9ja2luZ0VsZW1lbnQucG9zaXRpb24ueCA9PT0gMCkge1xuICAgICAgICAgIHN0YXJ0Qm9yZGVyT2Zmc2V0WCA9IGRvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuICAgICAgICAgIGJvcmRlcldpZHRoID0gY29hY2guZGltZW5zaW9uLncgLSBkb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcbiAgICAgICAgfVxuICAgICAgICAvLyBNaWRkbGVCb3JkZXIgc3RhcnRzIGZyb20gcG9zaXRpb24geCAwIHVudGlsIGRvY2tpbmcgZWxlbWVudCBvbiB0aGUgcmlnaHQgY29hY2ggc2lkZVxuICAgICAgICBlbHNlIGlmIChkb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ICE9PSAwKSB7XG4gICAgICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udyAtIGRvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeU9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nICogLTE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IHsgeDogc3RhcnRCb3JkZXJPZmZzZXRYICogdGhpcy5iYXNlR3JpZFNpemUsIHk6IHlPZmZzZXQsIHo6IDAgfSxcbiAgICAgIGRpbWVuc2lvbjogeyB3OiBib3JkZXJXaWR0aCAqIHRoaXMuYmFzZUdyaWRTaXplLCBoOiBib3JkZXJIZWlnaHQgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ3JhcGhpY2FsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgYm9yZGVyIGVsZW1lbnRzIG9mIHRoZSBjb2FjaC5cbiAgICogQHJldHVybnMgQmFzZUVsZW1lbnRbXVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Rmlyc3RMYXN0RG9ja2luZ0VsZW1lbnRzKGdyYXBoaWNFbGVtZW50czogQmFzZUVsZW1lbnRbXSk6IEJhc2VFbGVtZW50W10ge1xuICAgIC8vIEdldCBhbGwgcmVsZXZhbnQgZG9ja2luZyBlbGVtZW50cyBhbmQgc29ydHMgdGhlbSBhZ2FpbiBhY2NvcmRpbmcgdG8gdGhlaXIgeCBwb3NpdGlvbiBjb29yZGluYXRlcyxcbiAgICAvLyB0aHVzIHRoZSBzdGFydCBhbmQgZW5kIGRvY2tpbmcgZWxlbWVudHMgd291bGQgYmUgZGVmaW5lZFxuICAgIGNvbnN0IGZpbHRlcmVkRG9ja2luZ0VsZW1lbnRzID0gKFxuICAgICAgZ3JhcGhpY0VsZW1lbnRzLmZpbHRlcigoZWxlKSA9PiB0aGlzLm1pZGRsZUJvcmRlckRvY2tpbmdFbGVtZW50cy5pbmNsdWRlcyhlbGUuaWNvbiEpKSB8fCBbXVxuICAgICkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgcG9zQSA9IGEucG9zaXRpb24ueDtcbiAgICAgIGNvbnN0IHBvc0IgPSBiLnBvc2l0aW9uLng7XG4gICAgICBpZiAocG9zQSA+IHBvc0IpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBpZiAocG9zQSA8IHBvc0IpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWREb2NraW5nRWxlbWVudHMuZmlsdGVyKFxuICAgICAgKF8sIGluZGV4KSA9PiBpbmRleCA9PSAwIHx8IGluZGV4ID09IGZpbHRlcmVkRG9ja2luZ0VsZW1lbnRzLmxlbmd0aCAtIDEsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9ucyBhbmQgZGltZW5zaW9ucyBvZiBncmFwaGljYWwsIHNlcnZpY2UgYW5kIGFyZWEgZWxlbWVudHNcbiAgICogQHJldHVybnMgQmFzZUVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoXG4gICAgZWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNDYWxjQXJlYUVsZW1lbnQ6IGJvb2xlYW4sXG4gICk6IEJhc2VFbGVtZW50IHtcbiAgICBjb25zdCBkaW0gPSB7IC4uLmVsZW1lbnQuZGltZW5zaW9uIH07XG4gICAgY29uc3QgcG9zID0geyAuLi5lbGVtZW50LnBvc2l0aW9uIH07XG4gICAgY29uc3Qgcm90YXRpb24gPSBlbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgY29uc3QgaXNOb3RGaXhlZFJvdGF0aW9uR3JhcGhpY2FsRWxlbWVudCA9XG4gICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5jb25jYXQodGhpcy5ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucykuaW5kZXhPZihlbGVtZW50Lmljb24hKSA9PT0gLTE7XG4gICAgY29uc3QgY2FsY1JvdGF0aW9uID1cbiAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCAmJiBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID8gcm90YXRpb24gLSA5MCA6IHJvdGF0aW9uO1xuICAgIGxldCBhcmVhTW91bnRpbmc6IEVsZW1lbnRNb3VudGluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBkaW1lbnNpb24gZm9yIEFyZWFFbGVtZW50c1xuICAgIGlmIChpc0NhbGNBcmVhRWxlbWVudCkge1xuICAgICAgY29uc3QgaXNOb3RUYWJsZUdyYXBoaWMgPSBlbGVtZW50Lmljb24/LmluZGV4T2YoJ1RBQkxFJykgPT09IC0xO1xuICAgICAgY29uc3QgYXJlYVByb3BlcnR5ID0gZWxlbWVudC5pY29uICYmIGlzTm90VGFibGVHcmFwaGljID8gZWxlbWVudC5pY29uIDogbnVsbDtcbiAgICAgIGNvbnN0IHN0cmV0Y2hIZWlnaHQgPVxuICAgICAgICB0aGlzLmlzRWxlbWVudERpcmVjdGx5T25Cb3JkZXIoZWxlbWVudCwgY29hY2hEaW1lbnNpb24pICYmIGFyZWFQcm9wZXJ0eSAhPT0gJ0VOVFJZX0VYSVQnO1xuXG4gICAgICBpZiAoZWxlbWVudC5wb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGFyZWFNb3VudGluZyA9ICd1cHBlci1ib3JkZXInO1xuICAgICAgICBwb3MueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAvIDM7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQucG9zaXRpb24ueSArIGVsZW1lbnQuZGltZW5zaW9uLmggPT09IGNvYWNoRGltZW5zaW9uLmgpIHtcbiAgICAgICAgYXJlYU1vdW50aW5nID0gJ2xvd2VyLWJvcmRlcic7XG4gICAgICAgIGlmICghc3RyZXRjaEhlaWdodCkge1xuICAgICAgICAgIHBvcy55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC8gMztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZXRjaEhlaWdodCkge1xuICAgICAgICBkaW0uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAvIDM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBhbmQgZGltZW5zaW9uIGZvciBhbGwgb3RoZXIgZ3JhcGhpY2FsIGVsZW1lbnRzXG4gICAgZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudC5wb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIHBvcy55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2FjaERpbWVuc2lvbi5oID09PSBlbGVtZW50LnBvc2l0aW9uLnkgKyBlbGVtZW50LmRpbWVuc2lvbi5oKSB7XG4gICAgICAgIGRpbS5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRpbS53ID0gTWF0aC5yb3VuZChkaW0udyAqIHRoaXMuYmFzZUdyaWRTaXplKTtcbiAgICBkaW0uaCA9IE1hdGgucm91bmQoZGltLmggKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG5cbiAgICBwb3MueCA9IE1hdGgucm91bmQocG9zLnggKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG4gICAgcG9zLnkgPSBNYXRoLnJvdW5kKHBvcy55ICogdGhpcy5iYXNlR3JpZFNpemUpO1xuXG4gICAgY29uc3QgaWNvbiA9XG4gICAgICBlbGVtZW50Lmljb24gJiYgZWxlbWVudC5pY29uLmVuZHNXaXRoKCdEUklWRVJfQVJFQScpXG4gICAgICAgID8gZWxlbWVudC5pY29uPy5jb25jYXQoJ18nLCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLnZlaGljbGVUeXBlKVxuICAgICAgICA6IGVsZW1lbnQuaWNvbjtcblxuICAgIHJldHVybiB7XG4gICAgICBpY29uOiBpY29uLFxuICAgICAgcm90YXRpb246IGNhbGNSb3RhdGlvbixcbiAgICAgIGRpbWVuc2lvbjogZGltLFxuICAgICAgcG9zaXRpb246IHBvcyxcbiAgICAgIG1vdW50aW5nOiBhcmVhTW91bnRpbmcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHJldHVybnMgSFRNTEVsZW1lbnQgb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UGxhY2VIdG1sRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAgICA/IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkgfHwgbnVsbFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2FjaCBkZWNrIGluZGV4IGZyb20gcGxhY2UgaWRcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VJZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgZGVja0luZGV4ID0gdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3IoJyMnICsgcGxhY2VJZClcbiAgICAgID8uZ2V0QXR0cmlidXRlKCdkYXRhLWRlY2staW5kZXgnKTtcbiAgICBpZiAoZGVja0luZGV4ICYmICFpc05hTigrZGVja0luZGV4KSkge1xuICAgICAgcmV0dXJuICtkZWNrSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNWYWxpZENvYWNoSW5kZXgoY29hY2hJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSW5kZXggPj0gMCAmJlxuICAgICAgY29hY2hJbmRleCA8PSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4aXN0aW5nIGNvYWNoIGRlY2sgaW5kZXggZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogVGhpcyBtZXRob2QgaXMgbmVjZXNzYXJ5IHRvIGdldCBhbiBhdmFpbGFibGUgY29hY2ggZGVjayBpbmRleCBkdXJpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hpY2ggY2FuIHZhcnkgYmV0d2VlbiBjb2FjaGVzIHdpdGggZGlmZmVyZW50IGRlY2tzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSBjb2FjaCB3aXRoIHR3byBkZWNrcyB0byBhIGNvYWNoIHdpdGggb25lIGRlY2suXG4gICAqXG4gICAqICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdXG4gICAgICAgIC5wbGFjZXMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4O1xuICAgIH1cblxuICAgIC8vIEZpbmQgbmV4dCBwb3NzaWJsZSBjb2FjaCBkZWNrIGluZGV4IHdoZXJlIHBsYWNlcyBleGlzdFxuICAgIGNvbnN0IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleCA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAoc2VhdFJlc2VydmF0aW9uKSA9PlxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnBsYWNlcyAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID49IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleFxuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgOiBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSWYgYSBzZWxlY3RlZCBwbGFjZSBpcyBzbGlnaHRseSBoaWRkZW4gYnkgdGhlIG92ZXJmbG93IHNjcm9sbCBjb250ZW50IGFuZCBpcyBzdGlsbCBjbGlja2VkLFxuICAgKiB0aGUgbWV0aG9kIHRyaWVzIHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgcGxhY2UgaW50byB0aGUgbmVhcmVzdCB2aWV3cG9ydCwgc28gdGhhdCBpdCBpcyBjb21wbGV0ZWx5IHZpc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZUlkXG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LmdldEVsZW1lbnRCeUlkKHBsYWNlSWQpXG4gICAgICA/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICduZWFyZXN0JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgYW55IHBsYWNlcyBvciBncmFwaGljYWwgZWxlbWVudHMgKGUuZy4gdG9pbGV0IGFyZWEsIGV0Yy4pIGFyZSBvdmVyaGFuZ2luZyB0aGUgY29hY2ggYm9yZGVyc1xuICAgKiBAcGFyYW0gY29hY2hJdGVtV2lkdGhcbiAgICogQHBhcmFtIGVsZW1lbnRzXG4gICAqL1xuICBwcml2YXRlIF9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgIGNvYWNoSXRlbVdpZHRoOiBudW1iZXIsXG4gICAgZWxlbWVudHM6IChQbGFjZSB8IEJhc2VFbGVtZW50KVtdIHwgdW5kZWZpbmVkLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudHM/LnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgIGVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCB8fCBlbGVtZW50LnBvc2l0aW9uLnggKyBlbGVtZW50LmRpbWVuc2lvbi53ID49IGNvYWNoSXRlbVdpZHRoLFxuICAgICAgKSA/PyBmYWxzZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyQXJlYXMgZm9yIG9uZSBjb2FjaFxuICAgKiBAcGFyYW0gY29hY2hJdGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pc0xvY29tb3RpdmUoY29hY2hJdGVtOiBDb2FjaEl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29hY2hJdGVtPy5ncmFwaGljRWxlbWVudHM/LmZpbmQoXG4gICAgICAgIChlbGVtZW50OiBCYXNlRWxlbWVudCkgPT4gZWxlbWVudC5pY29uID09PSAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgICApICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIGNhbGxlZCB3aGVuIHRoZSBTZWF0UmVzZXJ2YXRpb24gbG9zZXMgZm9jdXMsIHdoYXQgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHRhYnMgb3V0IG9yIGNsaWNrcyBzb21ld2hlcmUgZWxzZS5cbiAgICogVGhlbiB3ZSByZXNldCB0aGUgZm9jdXNlZCBlbGVtZW50cy5cbiAgICovXG4gIHByaXZhdGUgX29uTGVhdmVTZWF0UmVzZXJ2YXRpb25Db21wb25lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFpQ0EsSUFBSztDQUFMLFNBQUssaUJBQWU7QUFDbEIsaUJBQUEsV0FBQTtBQUNBLGlCQUFBLFVBQUE7R0FGRyxvQkFBQSxrQkFBZSxFQUFBLEVBQUE7QUE4QnBCLElBQU0seUJBQXlCO0FBQy9CLElBQU0sd0JBQWtDO0NBQ3RDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0Q7SUFFWSxvQ0FBMEI7bUJBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQUFuQyxtQ0FBbUMsWUFBVTs7O21DQU92RCxTQUFTO0lBQUUsV0FBVztJQUFxQixNQUFNO0lBQU8sQ0FBQyxDQUFBO2tDQUl6RCxTQUFTO0lBQUUsV0FBVztJQUFvQixNQUFNO0lBQVEsQ0FBQyxDQUFBO2dDQUl6RCxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBa0IsTUFBTTtJQUFTLENBQUMsQ0FBQTtnQ0FJeEQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQWtCLE1BQU07SUFBUyxTQUFTO0lBQU0sWUFBWTtJQUFNLENBQUMsQ0FBQTsrQkFJekYsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQWtCLE1BQU07SUFBUSxDQUFDLENBQUE7eUJBSXZELFdB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
@@ -1 +1 @@
1
- {"version":3,"file":"seat-reservation.component.d.ts","sourceRoot":"","sources":["../../../../../src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.component.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAqB1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAGhF;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,0BAA0B;IACvE,gBAAgC,WAAW,EAAE,MAAM,CAA0B;IAC7E,OAAuB,mBAAmB,EAAE,cAAc,EAAE,CAQ1D;IACF,OAAuB,MAAM,EAAE,cAAc,CAI3C;IAEF,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,oBAAoB,CAAC,CAAiB;cAE3B,UAAU,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;cAgBzD,YAAY,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;cAS3D,MAAM,IAAI,cAAc,GAAG,IAAI;IAKlD,OAAO,CAAC,uCAAuC;IAwC/C,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,8BAA8B;IA0CtC,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,iBAAiB;IAwCzB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,mBAAmB;IAmC3B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAiChC,OAAO,CAAC,qBAAqB;IAmC7B,OAAO,CAAC,wBAAwB;IA8DhC,OAAO,CAAC,yBAAyB;IAwBjC,OAAO,CAAC,wBAAwB;IAyDhC,OAAO,CAAC,2BAA2B;IAmCnC;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,gBAAgB;IAUxB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAWhB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,yBAAyB;IAuCjC,OAAO,CAAC,8BAA8B;CA2BvC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAE7B,sBAAsB,EAAE,yBAAyB,CAAC;KACnD;CACF"}
1
+ {"version":3,"file":"seat-reservation.component.d.ts","sourceRoot":"","sources":["../../../../../src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.component.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAqB1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAGhF;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,0BAA0B;IACvE,gBAAgC,WAAW,EAAE,MAAM,CAA0B;IAC7E,OAAuB,mBAAmB,EAAE,cAAc,EAAE,CAQ1D;IACF,OAAuB,MAAM,EAAE,cAAc,CAI3C;IAEF,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,oBAAoB,CAAC,CAAiB;cAE3B,UAAU,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;cAgBzD,YAAY,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;cAS3D,MAAM,IAAI,cAAc,GAAG,IAAI;IAKlD,OAAO,CAAC,uCAAuC;IAwC/C,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,8BAA8B;IA0CtC,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,iBAAiB;IAwCzB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,mBAAmB;IAoC3B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAiChC,OAAO,CAAC,qBAAqB;IAmC7B,OAAO,CAAC,wBAAwB;IA8DhC,OAAO,CAAC,yBAAyB;IAwBjC,OAAO,CAAC,wBAAwB;IAyDhC,OAAO,CAAC,2BAA2B;IAmCnC;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,gBAAgB;IAUxB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAWhB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,yBAAyB;IAuCjC,OAAO,CAAC,8BAA8B;CA2BvC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAE7B,sBAAsB,EAAE,yBAAyB,CAAC;KACnD;CACF"}
@@ -1,2 +1,2 @@
1
- import { t as SbbSeatReservationElement } from "../../seat-reservation.component-B2nJ13F1.js";
1
+ import { t as SbbSeatReservationElement } from "../../seat-reservation.component-B-n0sIL5.js";
2
2
  export { SbbSeatReservationElement };
@@ -189,12 +189,12 @@ var SbbSeatReservationElement = class extends SeatReservationBaseElement {
189
189
  });
190
190
  }
191
191
  _renderCoachElement(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
192
- const calculatedCoachDimension = this.getCalculatedDimension(coachItem.dimension);
192
+ const currCoachStructure = this.seatReservationStructure.decks[coachDeckIndex].deckCoaches[coachIndex];
193
193
  const descriptionTableCoachWithServices = this._getDescriptionTableCoach(coachItem);
194
194
  return html`<sbb-seat-reservation-scoped
195
195
  style=${styleMap({
196
- "--sbb-seat-reservation-scoped-width": calculatedCoachDimension.w,
197
- "--sbb-seat-reservation-scoped-height": calculatedCoachDimension.h
196
+ "--sbb-seat-reservation-scoped-width": currCoachStructure.width,
197
+ "--sbb-seat-reservation-scoped-height": currCoachStructure.height
198
198
  })}
199
199
  >
200
200
  ${this._getRenderedCoachBorders(coachItem, coachDeckIndex, coachIndex)}
@@ -469,4 +469,4 @@ var SbbSeatReservationElement = class extends SeatReservationBaseElement {
469
469
  //#endregion
470
470
  export { SbbSeatReservationElement as t };
471
471
 
472
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQtQjJuSjEzRjEuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24uY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5AdXNlICcuLi9jb21tb24vc3R5bGVzL3NlYXQtcmVzZXJ2YXRpb24tbWl4aW5zJyBhcyBzYmItc3ItbWl4aW5zO1xuQHVzZSAnLi4vY29tbW9uL3N0eWxlcy9zZWF0LXJlc2VydmF0aW9uLWZ1bmN0aW9ucycgYXMgc2JiLXNyLWZ1bmN0aW9ucztcblxuLy8gTWF4aW11bSByZXNwb25zaXZlIG5hdmlnYXRpb24gd2lkdGgsIGNvbnNpc3RzIG9mIHRoZSBtYXhpbXVtIG5hdmlnYXRpb24gZXh0ZW50IG1pbnVzIDJ4IG5hdiBkaXJlY3Rpb24gYnV0dG9ucyA5NnB4IGFuZCA4cHggcGFkZGluZy5cbiRtYXgtY29hY2gtbmF2aWdhdGlvbi13aWR0aDogY2FsYyg5NjBweCAtIDk2cHggLSA4cHgpO1xuJHNjcm9sbGJhci1oZWlnaHQ6IDE2cHg7XG5cbjpob3N0IHtcbiAgLy8gTm90ZTogVGhlIHVzZSBvZiBweCBpcyBpbnRlbnRpb25hbCBoZXJlLCBiZWNhdXNlIG1hbnkgd2lkdGhzL2hlaWdodHMsIHJvdGF0aW9ucywgc2NhbGVzLCBldGMuIGRlcGVuZHMgb24gdGhpcy5cbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemU6IDE2cHg7XG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0OiAwO1xuICAtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWRlY2tzOiAxO1xuXG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgOjpwYXJ0KGNvYWNoLWZsb29yKSB7XG4gICAgZmlsbDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMik7XG5cbiAgICAvLyBJbiBIaWdoIENvbnRyYXN0IE1vZGUgd2Ugc2V0IGZsb29yIGNvbG9yIHRvIHRyYW5zcGFyZW50XG4gICAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgICAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8vIHJvdGF0ZXMgdGhlIERPTS1wYXJ0IFwiY29hY2gtZmxvb3JcIiBieSAxODAgZGVncmVlcyBpZiB0aGUgaG9zdCBpcyBpbiBSVEwgbW9kZS5cbkBpbmNsdWRlIHNiYi1zci1taXhpbnMucm90YXRlLWRvbS1wYXJ0KGNvYWNoLWZsb29yKTtcblxuW3BvcG92ZXJdOndoZXJlKHNiYi1wb3BvdmVyKSB7XG4gIEBpbmNsdWRlIHNiYi5wb3BvdmVyLXJlc2V0O1xuXG4gIC5zYmItc3ItcG9wb3ZlciB7XG4gICAgbWFyZ2luLWJsb2NrOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBTVEFSVCAtIFZlcnRpY2FsIG1vZGVcbjpob3N0KFthbGlnbi12ZXJ0aWNhbF0pIHtcbiAgJGNvYWNoLW5hdmlnYXRpb24tcGFkZGluZzogNTtcbiAgJGNvYWNoLXNjcm9sbGJhci13aWR0aDogMjQ7XG4gICRjb2FjaC1ncmlkLXdpZHRoOiBjYWxjKHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCkgKyAkY29hY2gtc2Nyb2xsYmFyLXdpZHRoKTtcblxuICAuc2JiLXNyX19jb21wb25lbnQge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjIpO1xuICAgIGhlaWdodDogaW5oZXJpdDtcblxuICAgIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogc21hbGwpIHtcbiAgICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNTQpO1xuICAgIH1cblxuICAgIG5hdi5zYmItc3ItbmF2aWdhdGlvbixcbiAgICB1bC5zYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgbmF2LnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgICAgIHBhZGRpbmc6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KSAwO1xuXG4gICAgICAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMSk7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcm90YXRlOiA5MGRlZztcblxuICAgICAgICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oLTEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVsLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICAgICAgICBtYXgtd2lkdGg6IGluaXRpYWw7XG5cbiAgICAgICAgLy8gUGFkZGluZyBuZWVkcyB0byB2aXN1YWwgZm9jdXMtdmlzaWJsZSBzdHlsZSBmb3IgbmF2IGJ1dHRvbiBpbnNpZGUgb3ZlcmZsb3cgY29udGVudCxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZvY3VzLXZpc2libGUgc3R5bGUgaXMgY3V0dGVkLlxuICAgICAgICBwYWRkaW5nOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtbmF2aWdhdGlvbi1wYWRkaW5nKTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbiBzY3JvbGw7XG5cbiAgICAgICAgLy8gaW4gdmVydGljYWwgbW9kZSwgdGhlIGxpIG11c3QgYmUgZmxleGVkOyBvdGhlcndpc2UgaXQgd291bGQgY2FsY3VsYXRlIHRoZSB3cm9uZyBoZWlnaHRcbiAgICAgICAgLy8gZHVlIHRvIHVzZXJhZ2VudCBzdHlsZSBzZXQgdG8gXCJsaXN0LWl0ZW1cIiBmb3IgZGlzcGxheVxuICAgICAgICBsaSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBMQUJFTE1VTFRJUExFIERFQ0tTIC0gTEFCRUxTXG4gIC5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAuc2JiLXNyX193cmFwcGVyLWRlY2stbGFiZWxzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtZ3JpZC13aWR0aCk7XG4gICAgICBoZWlnaHQ6IGluaXRpYWw7XG5cbiAgICAgIGIge1xuICAgICAgICBpbmxpbmUtc2l6ZTogY2FsYyg1MCUgLSBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNikpO1xuICAgICAgICBibG9jay1zaXplOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KTtcbiAgICAgICAgcm90YXRlOiBpbml0aWFsO1xuICAgICAgICB3cml0aW5nLW1vZGU6IGluaXRpYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVkVSVElDQUwgTU9ERSAtIFNFQVRNQVAgU0NST0xMIEFSRUFcbiAgLnNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oJGNvYWNoLWdyaWQtd2lkdGgpO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuIHNjcm9sbDtcblxuICAgIC5zYmItc3JfX3BhcmVudCB7XG4gICAgICByb3RhdGU6IDkwZGVnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBUUkFWRUwtRElSRUNUSU9OXG4gIC5zYmItc3ItdHJhdmVsLWRpcmVjdGlvbi13cmFwcGVyIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0odmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0KSk7XG4gICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBFTkQgLSBWZXJ0aWNhbCBtb2RlXG5cbi5zYmItc3ItbmF2aWdhdGlvbiB7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMyk7XG59XG5cbi5zYmItc3ItbmF2aWdhdGlvbiAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDIpO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuLnNiYi1zcl9fY29tcG9uZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiBjYWxjKHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDY0KSAtICRzY3JvbGxiYXItaGVpZ2h0KTtcbn1cblxuLy8gVFJBVkVMIERJUkVDVElPTlxuLnNiYi1zci10cmF2ZWwtZGlyZWN0aW9uLXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sdW1uLWdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIG1hcmdpbi1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCkgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tc2JiLXRleHQtZm9udC1zaXplLXMpO1xuXG4gIC5zYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWFycm93IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cbn1cblxuLy8gTkFWSUdBVElPTiBORVdcbi5zYmItc3ItbmF2aWdhdGlvbi13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nLWlubGluZTogMTZweDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgcGFkZGluZzogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNikgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNSkgMDtcbiAgbWF4LXdpZHRoOiAkbWF4LWNvYWNoLW5hdmlnYXRpb24td2lkdGg7XG5cbiAgLy8gU2V0IHNiYiBzY3JvbGxiYXIgdHJhbnNwYXJlbnQgYnkgZGVmYXVsdFxuICAtLXNiYi1zY3JvbGxiYXItY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIG92ZXJmbG93OiBzY3JvbGwgaGlkZGVuO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLSBTZWF0IFJlc2VydmF0aW9uIE1haW4gTmF2aWdhdGlvbiAtIEVORCAtLS0tLS0tLS0tLS0tLS0tXG5cbi8vIC0tLS0tLS0tLS0tLS0gU2VhdCBSZXNlcnZhdGlvbiBDb2FjaGVzIC0gU1RBUlQgLS0tLS0tLS0tLS0tLS0tLS1cbi5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgLnNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVscyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgaGVpZ2h0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSh2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQpKTtcbiAgICB3cml0aW5nLW1vZGU6IHZlcnRpY2FsLWxyO1xuXG4gICAgYiB7XG4gICAgICBoZWlnaHQ6IGNhbGMoNTAlIC0gc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpKTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICBtYXJnaW4tYmxvY2stZW5kOiAxNnB4O1xuICAgICAgcm90YXRlOiAxODBkZWc7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBsaW5lLWhlaWdodDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjApO1xuICAgIH1cbiAgfVxufVxuXG4uc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEge1xuICBvdmVyZmxvdzogc2Nyb2xsIGhpZGRlbjtcbiAgcGFkZGluZy1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCkgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpO1xuXG4gIC5zYmItc3JfX3BhcmVudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxufVxuXG4uc2JiLXNyX19saXN0LWRlY2tzIHtcbiAgQGluY2x1ZGUgc2JiLmxpc3QtcmVzZXQ7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLnNiYi1zcl9fbGlzdC1kZWNrcy0tZ2FwIHtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0OCk7XG59XG5cbi5zYmItc3JfX2xpc3QtaXRlbS1kZWNrIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uc2JiLXNyX19saXN0LWNvYWNoZXMge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQpO1xufVxuXG4vLyBJZiB0aGVyZSBhcmUgb3ZlcmhhbmdpbmcgZWxlbWVudHMgd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgZ2FwIGJldHdlZW4gY29hY2hlc1xuLnNiYi1zcl9fbGlzdC1kZWNrczpoYXMoLnNiYi1zci1jb2FjaC1oYXMtb3ZlcmhhbmdpbmctZWxlbWVudHMpIC5zYmItc3JfX2xpc3QtY29hY2hlcyB7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCk7XG59XG5cbi5zYmItc3JfX2l0ZW0tY29hY2gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5zYmItc3ItY29hY2gtd3JhcHBlcl9fdGFibGUge1xuICBvdXRsaW5lOiAwO1xufVxuIiwiaW1wb3J0IHsgU2JiU2Vjb25kYXJ5QnV0dG9uRWxlbWVudCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2J1dHRvbi5wdXJlLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgU2JiRWxlbWVudFR5cGUsXG4gIHNjcmVlblJlYWRlck9ubHlTdHlsZXMsXG4gIHNjcm9sbGJhclN0eWxlcyxcbn0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS5qcyc7XG5pbXBvcnQgeyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlLmpzJztcbmltcG9ydCB7IFNiYlBvcG92ZXJFbGVtZW50IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvcG9wb3Zlci5wdXJlLmpzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAsIFByb3BlcnR5VmFsdWVzLCBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBodG1sLCBpc1NlcnZlciwgbm90aGluZywgdW5zYWZlQ1NTIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBzdHlsZU1hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3N0eWxlLW1hcC5qcyc7XG5cbmltcG9ydCB7IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24gfSBmcm9tICcuLi9jb21tb24vdHJhbnNsYXRpb25zLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgQmFzZUVsZW1lbnQsXG4gIENvYWNoSXRlbSxcbiAgQ29hY2hJdGVtRGV0YWlscyxcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb24sXG59IGZyb20gJy4uL2NvbW1vbi90eXBlcy50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tYXJlYS9zZWF0LXJlc2VydmF0aW9uLWFyZWEuY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvbkdyYXBoaWNFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljL3NlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uTmF2aWdhdGlvbkNvYWNoRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaC9zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2guY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25TY29wZWRFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQvc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQuY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgfSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzJztcbmltcG9ydCBzdHlsZSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24uc2Nzcz9pbmxpbmUnO1xuXG4vKipcbiAqIE1haW4gY29tcG9uZW50IGZvciB0aGUgc2VhdCByZXNlcnZhdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJTZWF0UmVzZXJ2YXRpb25FbGVtZW50IGV4dGVuZHMgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXNlYXQtcmVzZXJ2YXRpb24nO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGVsZW1lbnREZXBlbmRlbmNpZXM6IFNiYkVsZW1lbnRUeXBlW10gPSBbXG4gICAgU2JiU2Vjb25kYXJ5QnV0dG9uRWxlbWVudCxcbiAgICBTYmJQb3BvdmVyRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25HcmFwaGljRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50LFxuICAgIFNiYlNlYXRSZXNlcnZhdGlvbk5hdmlnYXRpb25Db2FjaEVsZW1lbnQsXG4gICAgU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudCxcbiAgXTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW1xuICAgIHNjcm9sbGJhclN0eWxlcyxcbiAgICBzY3JlZW5SZWFkZXJPbmx5U3R5bGVzLFxuICAgIHVuc2FmZUNTUyhzdHlsZSksXG4gIF07XG5cbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9jb2FjaGVzSHRtbFRlbXBsYXRlPzogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdoYXNOYXZpZ2F0aW9uJykpIHtcbiAgICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBmaXJzdCB1cGRhdGUgaXMgY29tcGxldGUgdG8gaW5pdCBkaWZmZXJlbnQgSFRNTCBlbGVtZW50IGRpbWVuc2lvbnNcbiAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICB0aGlzLl9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpO1xuICAgIHJldHVybiB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlID0gaHRtbGBcbiAgICAgICR7dGhpcy5fcmVuZGVyVHJhdmVsRGlyZWN0aW9uKCl9XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX19jb21wb25lbnRcIj5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uKCl9XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNiYi1zcl9fd3JhcHBlci1jb2FjaC1kZWNrc1wiXG4gICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLmtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmcoZXZ0KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItZGVjay1sYWJlbHNcIj4ke3RoaXMuX3JlbmRlckRlY2tMYWJlbHMoKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBAc2Nyb2xsPSR7KCkgPT4gdGhpcy5jb2FjaEFyZWFTY3JvbGxlbmQoKX1cbiAgICAgICAgICAgIGlkPVwic2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWFcIlxuICAgICAgICAgICAgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYSBzYmItc2Nyb2xsYmFyXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJzYmItc3JfX3BhcmVudC1hcmVhXCIgY2xhc3M9XCJzYmItc3JfX3BhcmVudFwiPlxuICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgJ3NiYi1zcl9fbGlzdC1kZWNrcyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAnc2JiLXNyX19saXN0LWRlY2tzLS1nYXAnOiB0aGlzLmhhc011bHRpcGxlRGVja3MsXG4gICAgICAgICAgICAgICAgfSl9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICR7dGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5tYXAoXG4gICAgICAgICAgICAgICAgICAoc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sIGNvYWNoRGVja0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPGxpIGNsYXNzPVwic2JiLXNyX19saXN0LWl0ZW0tZGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInNiYi1zcl9fbGlzdC1jb2FjaGVzXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLl9yZW5kZXJDb2FjaGVzKHNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+YDtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJEZWNrTGFiZWxzKCk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5tYXAoKHNlYXRSZXNlcnZhdGlvbikgPT4ge1xuICAgICAgY29uc3QgZGVja0Rlc2NyaXB0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaExldmVsLFxuICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBodG1sYDxiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7ZGVja0Rlc2NyaXB0aW9ufTwvYj5gO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uIHx8ICF0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBidG5OYXZpZ2F0aW9uRGlyZWN0aW9uSWQgPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnXG4gICAgICAgID8gJ3NiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb24tLXJpZ2h0J1xuICAgICAgICA6ICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1sZWZ0JztcbiAgICBjb25zdCBidG5JY29uID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyA/ICdjaGV2cm9uLXNtYWxsLXJpZ2h0LXNtYWxsJyA6ICdjaGV2cm9uLXNtYWxsLWxlZnQtc21hbGwnO1xuICAgIGNvbnN0IGJ0bkFyaWFEZXNjcmlwdGlvbiA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCdcbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdTRUFUX1JFU0VSVkFUSU9OX0VORCcsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogZ2V0STE4blNlYXRSZXNlcnZhdGlvbignU0VBVF9SRVNFUlZBVElPTl9CRUdJTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpO1xuICAgIGxldCBidG5EaXNhYmxlZCA9IHRydWU7XG5cbiAgICBpZiAoYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fTEVGVCcgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPiAwKSB7XG4gICAgICBidG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4IDwgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgYnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvblwiPlxuICAgICAgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICAgIEBjbGljaz1cIiR7KCkgPT4gdGhpcy5uYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbil9XCJcbiAgICAgICAgQGZvY3VzPVwiJHsoKSA9PiB0aGlzLm9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKX1cIlxuICAgICAgICBpZD1cIiR7YnRuTmF2aWdhdGlvbkRpcmVjdGlvbklkfVwiXG4gICAgICAgIGNsYXNzPVwic2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICBpY29uLW5hbWU9XCIke2J0bkljb259XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2J0bkFyaWFEZXNjcmlwdGlvbn1cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgLmRpc2FibGVkSW50ZXJhY3RpdmU9XCIke2J0bkRpc2FibGVkIHx8IG5vdGhpbmd9XCJcbiAgICAgICAgLmRpc2FibGVkPVwiJHtidG5EaXNhYmxlZCB8fCBub3RoaW5nfVwiXG4gICAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyVHJhdmVsRGlyZWN0aW9uKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnRyYXZlbERpcmVjdGlvbiB8fCB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ05PTkUnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBsYWJlbFRleHQgPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgJ1NFQVRfUkVTRVJWQVRJT05fVFJBVkVMX0RJUkVDVElPTicsXG4gICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICk7XG5cbiAgICBjb25zdCBhcnJvd0RpcmVjdGlvbiA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ1JJR0hUJ1xuICAgICAgICA/ICdkb3duJ1xuICAgICAgICA6ICd1cCdcbiAgICAgIDogdGhpcy50cmF2ZWxEaXJlY3Rpb24gPT09ICdSSUdIVCdcbiAgICAgICAgPyAncmlnaHQnXG4gICAgICAgIDogJ2xlZnQnO1xuXG4gICAgY29uc3QgaWNvbk5hbWUgPSBgYXJyb3ctJHthcnJvd0RpcmVjdGlvbn0tc21hbGxgO1xuXG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1zci10cmF2ZWwtZGlyZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWFycm93XCI+XG4gICAgICAgIDxzYmItaWNvbiBzbG90PVwiaWNvblwiIG5hbWU9XCIke2ljb25OYW1lfVwiPjwvc2JiLWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWxhYmVsXCI+JHtsYWJlbFRleHR9PC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlck5hdmlnYXRpb24oKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoaXNTZXJ2ZXIgfHwgIXRoaXMuaGFzTmF2aWdhdGlvbiB8fCAhdGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uLXdyYXBwZXJcIj5cbiAgICAgIDxuYXYgaWQ9XCJzYmItc3ItbmF2aWdhdGlvblwiIGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25cIj5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbignRElSRUNUSU9OX0xFRlQnKX1cbiAgICAgICAgPHVsXG4gICAgICAgICAgaWQ9XCJzYmItc3JfX25hdmlnYXRpb24tbGlzdC1jb2FjaGVzXCJcbiAgICAgICAgICBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMgc2JiLXNjcm9sbGJhclwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIiR7Z2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgICAgICdTRUFUX1JFU0VSVkFUSU9OX05BVklHQVRJT04nLFxuICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgICApfVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3RoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLm1hcChcbiAgICAgICAgICAgIChjb2FjaEl0ZW1EZXRhaWxzOiBDb2FjaEl0ZW1EZXRhaWxzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBodG1sYDxsaT5cbiAgICAgICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaFxuICAgICAgICAgICAgICAgICAgQHNlbGVjdGNvYWNoPSR7KGV2ZW50OiBDdXN0b21FdmVudDxudW1iZXI+KSA9PiB0aGlzLl9vblNlbGVjdE5hdkNvYWNoKGV2ZW50KX1cbiAgICAgICAgICAgICAgICAgIEBmb2N1c2NvYWNoPSR7KCkgPT4gdGhpcy5fb25Gb2N1c05hdkNvYWNoKCl9XG4gICAgICAgICAgICAgICAgICBAa2V5dXA9JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLm9uS2V5TmF2aWdhdGlvbk5hdkNvYWNoQnV0dG9uKGV2dCwgaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgaW5kZXg9XCIke2luZGV4fVwiXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0ZWQ9JHt0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgICAuZm9jdXNlZD0ke3RoaXMuZm9jdXNlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgLmhvdmVyZWQ9JHt0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAgIC5uYXRpdmVGb2N1c0FjdGl2ZT0ke3RoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXN9XG4gICAgICAgICAgICAgICAgICAuY29hY2hJdGVtRGV0YWlscz1cIiR7Y29hY2hJdGVtRGV0YWlsc31cIlxuICAgICAgICAgICAgICAgICAgP3ZlcnRpY2FsPVwiJHt0aGlzLmFsaWduVmVydGljYWx9XCJcbiAgICAgICAgICAgICAgICAgID9zaG93VGl0bGVJbmZvPVwiJHt0aGlzLnNob3dUaXRsZUluZm99XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9zYmItc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoPlxuICAgICAgICAgICAgICA8L2xpPmA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICl9XG4gICAgICAgIDwvdWw+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oJ0RJUkVDVElPTl9SSUdIVCcpfVxuICAgICAgPC9uYXY+XG4gICAgPC9kaXY+YDtcbiAgfVxuICAvKipcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQHBhcmFtIHNlYXRSZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gY29hY2hEZWNrSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3JlbmRlckNvYWNoZXMoXG4gICAgc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoZXM6IENvYWNoSXRlbVtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXMpKTtcblxuICAgIGlmICghY29hY2hlcyB8fCBpc1NlcnZlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb2FjaGVzLm1hcCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0sIGNvYWNoSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxsaSBjbGFzcz1cInNiYi1zcl9faXRlbS1jb2FjaFwiPlxuICAgICAgICAgICR7dGhpcy5fcmVuZGVyQ29hY2hFbGVtZW50KFxuICAgICAgICAgICAgY29hY2hJdGVtLFxuICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICl9XG4gICAgICAgIDwvbGk+XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyQ29hY2hFbGVtZW50KFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihjb2FjaEl0ZW0uZGltZW5zaW9uKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvblRhYmxlQ29hY2hXaXRoU2VydmljZXMgPSB0aGlzLl9nZXREZXNjcmlwdGlvblRhYmxlQ29hY2goY29hY2hJdGVtKTtcblxuICAgIHJldHVybiBodG1sYDxzYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWRcbiAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtd2lkdGgnOiBjYWxjdWxhdGVkQ29hY2hEaW1lbnNpb24udyxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLWhlaWdodCc6IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbi5oLFxuICAgICAgfSl9XG4gICAgPlxuICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZENvYWNoQm9yZGVycyhjb2FjaEl0ZW0sIGNvYWNoRGVja0luZGV4LCBjb2FjaEluZGV4KX1cbiAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRDb2FjaEVsZW1lbnRzKGNvYWNoRGVja0luZGV4LCBjb2FjaEluZGV4KX1cbiAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRBcmVhRWxlbWVudHMoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgpfVxuICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZFNlcnZpY2VFbGVtZW50cyhjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCl9XG5cbiAgICAgIDx0YWJsZVxuICAgICAgICBAZm9jdXM9JHsoKSA9PiB0aGlzLm9uRm9jdXNUYWJsZUNvYWNoQW5kUHJlc2VsZWN0UGxhY2UoY29hY2hJbmRleCl9XG4gICAgICAgIGlkPVwic2JiLXNyLWNvYWNoLSR7Y29hY2hJbmRleH1cIlxuICAgICAgICBjbGFzcz1cInNiYi1zci1jb2FjaC13cmFwcGVyX190YWJsZVwiXG4gICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJzYmItc3ItY29hY2gtY2FwdGlvbi0ke2NvYWNoSW5kZXh9XCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICA+XG4gICAgICAgIDxjYXB0aW9uIGlkPVwic2JiLXNyLWNvYWNoLWNhcHRpb24tJHtjb2FjaEluZGV4fVwiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4ke2Rlc2NyaXB0aW9uVGFibGVDb2FjaFdpdGhTZXJ2aWNlc308L3NwYW4+XG4gICAgICAgIDwvY2FwdGlvbj5cbiAgICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZFJvd1BsYWNlcyhjb2FjaEl0ZW0sIGNvYWNoSW5kZXgsIGNvYWNoRGVja0luZGV4LCBwbGFjZUNvYWNoRGVja0luZGV4KX1cbiAgICAgIDwvdGFibGU+XG4gICAgPC9zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQ+YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBib3JkZXIgZ3JhcGhpYyAoQ09BQ0hfQk9SREVSX01JRERMRSkgb2YgYSBjb2FjaCB3aXRoIGNhbGN1bGF0ZWQgYm9yZGVyIGdhcCBhbmQgY29hY2ggd2lkdGgsXG4gICAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb2FjaCBpcyB3aXRoIGEgZHJpdmVyIGFyZWEgb3Igd2l0aG91dC5cbiAgICovXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkQ29hY2hCb3JkZXJzKFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICAgIGRlY2tDb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmICghY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY3VyckNvYWNoU3RydWN0dXJlID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW2RlY2tDb2FjaEluZGV4XS5kZWNrQ29hY2hlc1tjb2FjaEluZGV4XTtcbiAgICBjb25zdCBjb2FjaEJvcmRlckVsZW1lbnQgPSBjdXJyQ29hY2hTdHJ1Y3R1cmUuYm9yZGVyTWlkZGxlRWxlbWVudDtcbiAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzID0gY3VyckNvYWNoU3RydWN0dXJlLmhhc092ZXJoYW5naW5nRWxlbWVudHM7XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgJ3NiYi1zci1jb2FjaC1oYXMtb3ZlcmhhbmdpbmctZWxlbWVudHMnOiBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzIHx8IGZhbHNlLFxuICAgICAgICB9KX1cIlxuICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogY29hY2hCb3JkZXJFbGVtZW50LmRpbWVuc2lvbi53LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogY29hY2hCb3JkZXJFbGVtZW50LmRpbWVuc2lvbi5oLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wJzogY29hY2hCb3JkZXJFbGVtZW50LnBvc2l0aW9uLnksXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogY29hY2hCb3JkZXJFbGVtZW50LnBvc2l0aW9uLngsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgIH0pfVxuICAgICAgICBuYW1lPVwiQ09BQ0hfQk9SREVSX01JRERMRVwiXG4gICAgICAgID9zdHJldGNoPSR7dHJ1ZX1cbiAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZFJvd1BsYWNlcyhcbiAgICBjb2FjaDogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghY29hY2gucGxhY2VzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gUHJlcGFyZSByb3dzIHdpdGggdGhlIHBsYWNlcyB0byByZW5kZXIgYSB0YWJsZVxuICAgIGNvbnN0IHRhYmxlUm93UGxhY2VzOiBSZWNvcmQ8bnVtYmVyLCBQbGFjZVtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2gucGxhY2VzKSB7XG4gICAgICBpZiAoIXRhYmxlUm93UGxhY2VzW3BsYWNlLnBvc2l0aW9uLnldKSB7XG4gICAgICAgIHRhYmxlUm93UGxhY2VzW3BsYWNlLnBvc2l0aW9uLnldID0gW3BsYWNlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhYmxlUm93UGxhY2VzW3BsYWNlLnBvc2l0aW9uLnldLnB1c2gocGxhY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRhYmxlUm93UGxhY2VzKVxuICAgICAgLm1hcCgocm93UGxhY2VzOiBQbGFjZVtdLCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICA8dHIgaWQ9XCJyb3ctJHtjb2FjaEluZGV4fS0ke3Jvd1BsYWNlc1swXS5wb3NpdGlvbi55fVwiIGRhdGEtcm93LWluZGV4PSR7aW5kZXh9PlxuICAgICAgICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZENvbHVtblBsYWNlcyhcbiAgICAgICAgICAgICAgcm93UGxhY2VzLFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICAgICAgICAgcGxhY2VDb2FjaERlY2tJbmRleCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgYDtcbiAgICAgIH0pXG4gICAgICAuZmxhdE1hcCgocm93VGVtcGxhdGUpID0+IHJvd1RlbXBsYXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkQ29sdW1uUGxhY2VzKFxuICAgIHBsYWNlczogUGxhY2VbXSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgZGVja0luZGV4OiBudW1iZXIsXG4gICAgcGxhY2VDb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIC8vU29ydHMgZWFjaCBwbGFjZSBieSBpdHMgYXNjZW5kaW5nIHggY29vcmRpbmF0ZVxuICAgIHBsYWNlcy5zb3J0KFxuICAgICAgKHBsYWNlQTogUGxhY2UsIHBsYWNlQjogUGxhY2UpID0+IE51bWJlcihwbGFjZUEucG9zaXRpb24ueCkgLSBOdW1iZXIocGxhY2VCLnBvc2l0aW9uLngpLFxuICAgICk7XG5cbiAgICAvLyBGb3IgcmVuZGVyaW5nIHRoZSBwbGFjZXMgd2l0aGluIGEgdGQgZWxlbWVudCwgaGVyZSB3ZSB1c2UgcmVwZWF0IGRpcmVjdGl2ZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIGZvciByZXVzaW5nIGVsZW1lbnRzICh0cmFjayBieSBpZCkuXG4gICAgY29uc3QgdHJhY2tQbGFjZUlkID0gY29hY2hJbmRleCArICctJyArIHBsYWNlQ29hY2hEZWNrSW5kZXg7XG4gICAgcmV0dXJuIGh0bWxgJHtyZXBlYXQoXG4gICAgICBwbGFjZXMsXG4gICAgICAocGxhY2UpID0+IHRyYWNrUGxhY2VJZCArICctJyArIHBsYWNlLm51bWJlcixcbiAgICAgIChwbGFjZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihwbGFjZS5kaW1lbnNpb24pO1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihwbGFjZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHJvdGF0aW9uID0gcGxhY2Uucm90YXRpb24gfHwgMDtcbiAgICAgICAgY29uc3QgdGV4dFJvdGF0aW9uID0gdGhpcy5hbGlnblZlcnRpY2FsID8gLTkwIDogMDtcbiAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoZGVja0luZGV4LCBjb2FjaEluZGV4LCBwbGFjZS5udW1iZXIpO1xuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGlkPVwiY2VsbC0ke2RlY2tJbmRleH0tJHtjb2FjaEluZGV4fS0ke3BsYWNlLnBvc2l0aW9uLnl9LSR7aW5kZXh9XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JhcGhpY2FsLWVsZW1lbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sXG4gICAgICAgICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdGV4dC1zY2FsZS12YWx1ZSc6IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXRvcCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi55LFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtbGVmdCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi54LFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtcm90YXRpb24nOiByb3RhdGlvbixcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXRleHQtcm90YXRpb24nOiB0ZXh0Um90YXRpb24sXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBAc2VsZWN0cGxhY2U9JHsoc2VsZWN0UGxhY2VFdmVudDogQ3VzdG9tRXZlbnQ8UGxhY2VTZWxlY3Rpb24+KSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX29uU2VsZWN0UGxhY2Uoc2VsZWN0UGxhY2VFdmVudCl9XG4gICAgICAgICAgICAgIGV4cG9ydHBhcnRzPVwic2JiLXNyLXBsYWNlLXBhcnRcIlxuICAgICAgICAgICAgICBpZD0ke3BsYWNlSWR9XG4gICAgICAgICAgICAgIGNsYXNzPVwic2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sXCJcbiAgICAgICAgICAgICAgdGV4dD0ke3BsYWNlLm51bWJlcn1cbiAgICAgICAgICAgICAgdHlwZT0ke3BsYWNlLnR5cGV9XG4gICAgICAgICAgICAgIHN0YXRlPSR7cGxhY2Uuc3RhdGV9XG4gICAgICAgICAgICAgIHRyYXZlbC1kaXJlY3Rpb249JHt0aGlzLnRyYXZlbERpcmVjdGlvbn1cbiAgICAgICAgICAgICAgY29hY2gtaW5kZXg9JHtjb2FjaEluZGV4fVxuICAgICAgICAgICAgICBkZWNrLWluZGV4PSR7cGxhY2VDb2FjaERlY2tJbmRleH1cbiAgICAgICAgICAgICAgZGF0YS1kZWNrLWluZGV4PSR7ZGVja0luZGV4fVxuICAgICAgICAgICAgICAucHJvcGVydHlJZHM9JHtwbGFjZS5wcm9wZXJ0eUlkc31cbiAgICAgICAgICAgICAgLnByZXZlbnRDbGljaz0ke3RoaXMucHJldmVudFBsYWNlQ2xpY2t9XG4gICAgICAgICAgICAgID9zaG93VGl0bGVJbmZvPVwiJHt0aGlzLnNob3dUaXRsZUluZm99XCJcbiAgICAgICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2w+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgYDtcbiAgICAgIH0sXG4gICAgKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRDb2FjaEVsZW1lbnRzKFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgY29uc3QgY3VyckNvYWNoU3RydWN0dXJlID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW2NvYWNoRGVja0luZGV4XS5kZWNrQ29hY2hlc1tjb2FjaEluZGV4XTtcblxuICAgIHJldHVybiBjdXJyQ29hY2hTdHJ1Y3R1cmUub3RoZXJFbGVtZW50cy5tYXAoKGdyYXBoaWNFbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gaHRtbGAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGdyYXBoaWNFbGVtZW50LmRpbWVuc2lvbi53LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogZ3JhcGhpY0VsZW1lbnQuZGltZW5zaW9uLmgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiBncmFwaGljRWxlbWVudC5wb3NpdGlvbi55LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGdyYXBoaWNFbGVtZW50LnBvc2l0aW9uLngsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IGdyYXBoaWNFbGVtZW50LnJvdGF0aW9uLFxuICAgICAgICB9KX1cbiAgICAgICAgbmFtZT0ke2dyYXBoaWNFbGVtZW50Lmljb24gPz8gbm90aGluZ31cbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgP3N0cmV0Y2g9JHt0cnVlfVxuICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5gO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRBcmVhRWxlbWVudHMoXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBjb25zdCBjdXJyQ29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUuZGVja3NbY29hY2hEZWNrSW5kZXhdLmRlY2tDb2FjaGVzW2NvYWNoSW5kZXhdO1xuXG4gICAgcmV0dXJuIGN1cnJDb2FjaFN0cnVjdHVyZS5hcmVhRWxlbWVudHMubWFwKChncmFwaGljRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgdHJpZ2dlcklkID0gYHBvcG92ZXItdHJpZ2dlci0ke2NvYWNoRGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7Z3JhcGhpY0VsZW1lbnQucG9zaXRpb24ueH0tJHtncmFwaGljRWxlbWVudC5wb3NpdGlvbi55fWA7XG4gICAgICBjb25zdCBpc05vdFRhYmxlR3JhcGhpYyA9IGdyYXBoaWNFbGVtZW50Lmljb24/LmluZGV4T2YoJ1RBQkxFJykgPT09IC0xO1xuICAgICAgY29uc3QgYXJlYVByb3BlcnR5ID0gZ3JhcGhpY0VsZW1lbnQuaWNvbiAmJiBpc05vdFRhYmxlR3JhcGhpYyA/IGdyYXBoaWNFbGVtZW50Lmljb24gOiBudWxsO1xuICAgICAgY29uc3QgYXJpYUxhYmVsRm9yQXJlYSA9IGdyYXBoaWNFbGVtZW50Lmljb25cbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKGdyYXBoaWNFbGVtZW50Lmljb24sIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogbm90aGluZztcblxuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhXG4gICAgICAgICAgaWQ9XCIke3RyaWdnZXJJZH1cIlxuICAgICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgICAnc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS0tY3Vyc29yLXBvaW50ZXInOiBhcmVhUHJvcGVydHkgIT09IG51bGwsXG4gICAgICAgICAgfSl9XCJcbiAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtd2lkdGgnOiBncmFwaGljRWxlbWVudC5kaW1lbnNpb24udyxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtaGVpZ2h0JzogZ3JhcGhpY0VsZW1lbnQuZGltZW5zaW9uLmgsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLXRvcCc6IGdyYXBoaWNFbGVtZW50LnBvc2l0aW9uLnksXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLWxlZnQnOiBncmFwaGljRWxlbWVudC5wb3NpdGlvbi54LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS16LWluZGV4JzogZ3JhcGhpY0VsZW1lbnQucG9zaXRpb24ueixcbiAgICAgICAgICB9KX1cbiAgICAgICAgICBtb3VudGluZz0ke2dyYXBoaWNFbGVtZW50Lm1vdW50aW5nID8/IG5vdGhpbmd9XG4gICAgICAgICAgYmFja2dyb3VuZD1cImRhcmtcIlxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAke2FyZWFQcm9wZXJ0eVxuICAgICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1tYXgtd2lkdGgnOiB0aGlzLmdsb2JhbEFyZWFJY29uRGltLncsXG4gICAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LWhlaWdodCc6IHRoaXMuZ2xvYmFsQXJlYUljb25EaW0uaCxcbiAgICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGdyYXBoaWNFbGVtZW50LmRpbWVuc2lvbi53LFxuICAgICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGdyYXBoaWNFbGVtZW50LmRpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogZ3JhcGhpY0VsZW1lbnQucm90YXRpb24sXG4gICAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcGFkZGluZy1wZXJjZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICBhcmVhUHJvcGVydHkgIT09ICdFTlRSWV9FWElUJyA/IHRoaXMuZ2xvYmFsQXJlYUljb25QYWRkaW5nIDogMSxcbiAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgbmFtZT0ke2FyZWFQcm9wZXJ0eX1cbiAgICAgICAgICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLXNyLWdyYXBoaWNfX2RpbWVuc2lvbi0tc3F1YXJlLWRpbVwiXG4gICAgICAgICAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWE+XG4gICAgICAgICR7YXJlYVByb3BlcnR5ID8gdGhpcy5fcG9wb3Zlcih0cmlnZ2VySWQsIGFyaWFMYWJlbEZvckFyZWEpIDogbm90aGluZ31cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZFNlcnZpY2VFbGVtZW50cyhcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGNvbnN0IGN1cnJDb2FjaFN0cnVjdHVyZSA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrc1tjb2FjaERlY2tJbmRleF0uZGVja0NvYWNoZXNbY29hY2hJbmRleF07XG5cbiAgICByZXR1cm4gY3VyckNvYWNoU3RydWN0dXJlLnNlcnZpY2VFbGVtZW50cy5tYXAoKHNlcnZpY2VFbGVtZW50OiBCYXNlRWxlbWVudCkgPT4ge1xuICAgICAgLy9nZW5lcmF0ZSB1bmlxdWUgaW5kZXggbnVtYmVyIGZvciB0aGUgdHJpZ2dlciBlbGVtZW50XG4gICAgICBjb25zdCB0cmlnZ2VySWQgPSBgcG9wb3Zlci10cmlnZ2VyLSR7Y29hY2hEZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbi54fS0ke3NlcnZpY2VFbGVtZW50LnBvc2l0aW9uLnl9YDtcbiAgICAgIGNvbnN0IHRpdGxlRGVzY3JpcHRpb24gPSBzZXJ2aWNlRWxlbWVudC5pY29uXG4gICAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihzZXJ2aWNlRWxlbWVudC5pY29uLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICAgIGlkPVwiJHt0cmlnZ2VySWR9XCJcbiAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBzZXJ2aWNlRWxlbWVudC5kaW1lbnNpb24udyxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0Jzogc2VydmljZUVsZW1lbnQuZGltZW5zaW9uLmgsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXRvcCc6IHNlcnZpY2VFbGVtZW50LnBvc2l0aW9uLnksXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQnOiBzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbi54LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogc2VydmljZUVsZW1lbnQucm90YXRpb24sXG4gICAgICAgICAgfSl9XG4gICAgICAgICAgY2xhc3M9XCJzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgbmFtZT0ke3NlcnZpY2VFbGVtZW50Lmljb24gPz8gbm90aGluZ31cbiAgICAgICAgICByb2xlPVwiaW1nXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPlxuICAgICAgICAke3RoaXMuX3BvcG92ZXIodHJpZ2dlcklkLCB0aXRsZURlc2NyaXB0aW9uKX1cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFuYWdlcyB0aGUgc2VsZWN0ZWQgcGxhY2UgZXZlbnQgdHJpZ2dlcmVkIGZyb20gdGhlIHBsYWNlXG4gICAqIEVhY2ggc2VsZWN0aW9uIGVtaXRzIGFuIGFycmF5IG9mIGFsbCBzZWxlY3RlZCBwbGFjZXNcbiAgICogQHBhcmFtIHNlbGVjdFBsYWNlRXZlbnRcbiAgICovXG4gIHByaXZhdGUgX29uU2VsZWN0UGxhY2Uoc2VsZWN0UGxhY2VFdmVudDogQ3VzdG9tRXZlbnQ8UGxhY2VTZWxlY3Rpb24+KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRQbGFjZSA9IHNlbGVjdFBsYWNlRXZlbnQuZGV0YWlsO1xuICAgIC8vIFdlIGhhdmUgdG8gc2V0IHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayB0byB0cnVlLCB0byBwcmV2ZW50IGF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIG5ldyBmb2N1c2VkIHBsYWNlXG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSB0cnVlO1xuICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcmV2ZW50UGxhY2VDbGljaykge1xuICAgICAgLy8gQWRkIHBsYWNlIHRvIHBsYWNlIGNvbGxlY3Rpb25cbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoc2VsZWN0ZWRQbGFjZSk7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChzZWxlY3RlZFBsYWNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9vblNlbGVjdE5hdkNvYWNoKGV2ZW50OiBDdXN0b21FdmVudDxudW1iZXI+KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWROYXZDb2FjaEluZGV4ID0gZXZlbnQuZGV0YWlsO1xuXG4gICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IHRydWU7XG5cbiAgICBpZiAoc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSBudWxsICYmIHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleCk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5hdkNvYWNoSW5kZXggPT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG5cbiAgICAvL2Nsb3NlIGFsbCBvcGVuZWQgcG9wb3ZlcnNcbiAgICB0aGlzLl9jbG9zZVBvcG92ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uRm9jdXNOYXZDb2FjaCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrKSB7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpO1xuICAgIH1cblxuICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBvcG92ZXIgZm9yIGV4dHJhIHNlcnZpY2UgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHRyaWdnZXJJZFxuICAgKiBAcGFyYW0gcG9wb3ZlckNvbnRlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX3BvcG92ZXIoXG4gICAgdHJpZ2dlcklkOiBzdHJpbmcsXG4gICAgcG9wb3ZlckNvbnRlbnQ6IHN0cmluZyB8IG51bGwgfCB0eXBlb2Ygbm90aGluZyxcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNiYi1wb3BvdmVyIHRyaWdnZXI9XCIke3RyaWdnZXJJZH1cIiBob3Zlci10cmlnZ2VyPVwiXCI+XG4gICAgICAgIDxwIGNsYXNzPVwic2JiLXRleHQtcyBzYmItc3ItcG9wb3ZlclwiPiR7cG9wb3ZlckNvbnRlbnR9PC9wPlxuICAgICAgPC9zYmItcG9wb3Zlcj5cbiAgICBgO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXIgdG8gY2xvc2UgYWxsIG9wZW5lZCBwb3BvdmVycyAobm9ybWFsbHkgb25seSBvbmUgaXMgb3BlbmVkIGF0IGEgdGltZSlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2Nsb3NlUG9wb3ZlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgID8ucXVlcnlTZWxlY3RvckFsbDxTYmJQb3BvdmVyRWxlbWVudD4oJ3NiYi1wb3BvdmVyOnN0YXRlKHN0YXRlLW9wZW5lZCknKVxuICAgICAgLmZvckVhY2goKHBvcG92ZXIpID0+IHBvcG92ZXIuY2xvc2UoKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXREZXNjcmlwdGlvblRhYmxlQ29hY2goY29hY2hJdGVtOiBDb2FjaEl0ZW0pOiBzdHJpbmcge1xuICAgIC8vc2hvdyBkaWZmZXJlbnQgdGFibGUgY2FwdGlvbiBmb3Igc2NyZWVucmVhZGVyIGlmIGl0IGlzIGEgbG9jb21vdGl2ZVxuICAgIGlmIChjb2FjaEl0ZW0udHlwZSA9PT0gJ0xPQ09NT1RJVkVfQ09BQ0gnKSB7XG4gICAgICByZXR1cm4gZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfTE9DT01PVElWRScsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpO1xuICAgIH1cblxuICAgIGlmICghY29hY2hJdGVtLnBsYWNlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfQkxPQ0tFRF9UQUJMRV9DQVBUSU9OJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCwgW1xuICAgICAgICBjb2FjaEl0ZW0uaWQsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBsZXQgdGFibGVDb2FjaERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29uc3QgYXJlYURlc2NyaXB0aW9ucyA9IHRoaXMuX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHMhKTtcbiAgICBjb25zdCBzZXJ2aWNlRGVzY3JpcHRpb25zID0gdGhpcy5fZ2V0VGl0bGVEZXNjcmlwdGlvbkxpc3RTdHJpbmcoY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cyEpO1xuXG4gICAgdGFibGVDb2FjaERlc2NyaXB0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfVEFCTEVfQ0FQVElPTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsIFtcbiAgICAgIGNvYWNoSXRlbS5pZCxcbiAgICBdKTtcblxuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICAvLyBFeHBhbmRzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHNlYXRzIGFuZCBiaWN5Y2xlIHNwYWNlcyBhcyBpbmZvXG4gICAgICBjb25zdCBmcmVlUGxhY2VzID0gdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKGNvYWNoSXRlbS5wbGFjZXMpO1xuICAgICAgY29uc3QgZnJlZVBsYWNlc1R4dCA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgICdDT0FDSF9BVkFJTEFCTEVfTlVNQkVSX09GX1BMQUNFUycsXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICAgIFtmcmVlUGxhY2VzLnNlYXRzLCBmcmVlUGxhY2VzLmJpY3ljbGVzXSxcbiAgICAgICk7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gPSB0YWJsZUNvYWNoRGVzY3JpcHRpb24uY29uY2F0KCcuICcpLmNvbmNhdChmcmVlUGxhY2VzVHh0KS5jb25jYXQoJy4gJyk7XG4gICAgfVxuXG4gICAgaWYgKCEhYXJlYURlc2NyaXB0aW9ucyB8fCAhIXNlcnZpY2VEZXNjcmlwdGlvbnMpIHtcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiArPVxuICAgICAgICAnLiAnICsgZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfQVZBSUxBQkxFX1NFUlZJQ0VTJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCkgKyAnOiAnO1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uICs9IHNlcnZpY2VEZXNjcmlwdGlvbnMgKyAnLCAnICsgYXJlYURlc2NyaXB0aW9ucyArICcuJztcbiAgICB9XG4gICAgcmV0dXJuIHRhYmxlQ29hY2hEZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGRlc2NyaXB0aW9uc0VsZW1lbnRzOiBCYXNlRWxlbWVudFtdKTogc3RyaW5nIHtcbiAgICBjb25zdCB1bmlxdWVEZXNjcmlwdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICByZXR1cm4gZGVzY3JpcHRpb25zRWxlbWVudHNcbiAgICAgID8ubWFwKChkZXNjcmlwdGlvbkVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgaWNvbiA9IGRlc2NyaXB0aW9uRWxlbWVudC5pY29uO1xuICAgICAgICBpZiAoIWljb24pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0ID0gdW5pcXVlRGVzY3JpcHRpb25zLmluZGV4T2YoaWNvbikgPiAtMTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5pY29uISxcbiAgICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpc1ZhbGlkRGVzY3JpcHRpb24gPVxuICAgICAgICAgIHRoaXMubm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMuaW5kZXhPZihpY29uKSA9PT0gLTEgJiZcbiAgICAgICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmRleE9mKGljb24pID09PSAtMTtcblxuICAgICAgICBpZiAoIWRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0KSB7XG4gICAgICAgICAgdW5pcXVlRGVzY3JpcHRpb25zLnB1c2goZGVzY3JpcHRpb25FbGVtZW50Lmljb24hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISF0cmFuc2xhdGlvbiAmJiAhZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QgJiYgaXNWYWxpZERlc2NyaXB0aW9uID8gdHJhbnNsYXRpb24gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGRlc2NyaXB0aW9uKSA9PiAhIWRlc2NyaXB0aW9uKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1zZWF0LXJlc2VydmF0aW9uJzogU2JiU2VhdFJlc2VydmF0aW9uRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDb0NBLElBQWEsNEJBQWIsY0FBK0MsMkJBQTBCO0NBQXpFLGNBQUE7O0FBaUJVLE9BQUEsWUFBWSxJQUFJLHNCQUFzQixLQUFLOzs7QUFoQm5CLE9BQUEsY0FBc0I7OztBQUMvQixPQUFBLHNCQUF3QztHQUM3RDtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNEOzs7QUFDc0IsT0FBQSxTQUF5QjtHQUM5QztHQUNBO0dBQ0EsVUFBVSx5QkFBQTtHQUNYOztDQUtrQixXQUFXLG1CQUF1QztBQUNuRSxRQUFNLFdBQVcsa0JBQWtCO0FBRW5DLE1BQUksa0JBQWtCLElBQUksZ0JBQWdCLENBQ3hDLEtBQUksS0FBSyxjQUNQLE1BQUssWUFDRCxpQkFBaUIsUUFBUSxDQUMxQixTQUFTLFVBQVUsTUFBTSxnQkFBZ0IsV0FBVyxDQUFDO01BRXhELE1BQUssWUFDRCxpQkFBaUIsUUFBUSxDQUMxQixTQUFTLFVBQVUsTUFBTSxhQUFhLFlBQVksSUFBSSxDQUFDOztDQUs3QyxhQUFhLG1CQUF1QztBQUNyRSxRQUFNLGFBQWEsa0JBQWtCO0FBR3JDLE9BQUssZUFBZSxXQUFVO0FBQzVCLFFBQUssc0NBQXNDO0lBQzNDOztDQUdlLFNBQU07QUFDdkIsT0FBSyx5Q0FBeUM7QUFDOUMsU0FBTyxLQUFLLHdCQUF3Qjs7Q0FHOUIsMENBQXVDO0FBQzdDLE9BQUssdUJBQXVCLElBQUk7UUFDNUIsS0FBSyx3QkFBd0IsQ0FBQTs7VUFFM0IsS0FBSyxtQkFBbUIsQ0FBQTs7O3NCQUdaLFFBQXVCLEtBQUssNkJBQTZCLElBQUksQ0FBQTs7cURBRTlCLEtBQUssbUJBQW1CLENBQUE7OzRCQUVqRCxLQUFLLG9CQUFvQixDQUFBOzs7Ozs7O3lCQU81QixTQUFTO0dBQ2hCLHNCQUFzQjtHQUN0QiwyQkFBMkIsS0FBSztHQUNqQyxDQUFDLENBQUE7O2tCQUVBLEtBQUssa0JBQWtCLEtBQ3RCLGlCQUFrQyxtQkFBMEI7QUFDM0QsVUFBTyxJQUFJOzswQkFFTCxLQUFLLGVBQWUsaUJBQWlCLGVBQWUsQ0FBQTs7O0lBSTdELENBQUE7Ozs7Ozs7O0NBU1Asb0JBQWlCO0FBQ3ZCLE1BQUksQ0FBQyxLQUFLLGlCQUNSLFFBQU87QUFHVCxTQUFPLEtBQUssaUJBQWlCLEtBQUssb0JBQW1CO0FBS25ELFVBQU8sSUFBSSx5QkFKYSx1QkFDdEIsZ0JBQWdCLGdCQUNoQixLQUFLLFVBQVUsUUFFbUIsQ0FBZTtJQUNuRDs7Q0FHSSwrQkFBK0IsY0FBb0I7QUFDekQsTUFBSSxDQUFDLEtBQUssaUJBQWlCLENBQUMsS0FBSyxpQkFDL0IsUUFBTztFQUVULE1BQU0sMkJBQ0osZ0JBQWdCLG9CQUNaLHVEQUNBO0VBQ04sTUFBTSxVQUNKLGdCQUFnQixvQkFBb0IsOEJBQThCO0VBQ3BFLE1BQU0scUJBQ0osZ0JBQWdCLG9CQUNaLHVCQUF1Qix3QkFBd0IsS0FBSyxVQUFVLFFBQVEsR0FDdEUsdUJBQXVCLDBCQUEwQixLQUFLLFVBQVUsUUFBUTtFQUM5RSxJQUFJLGNBQWM7QUFFbEIsTUFBSSxnQkFBZ0Isb0JBQW9CLEtBQUsscUJBQXFCLEVBQ2hFLGVBQWM7V0FFZCxnQkFBZ0IscUJBQ2hCLEtBQUsscUJBQXFCLEtBQUsseUJBQXlCLFNBQVMsRUFFakUsZUFBYztBQUdoQixTQUFPLElBQUk7O3dCQUVTLEtBQUssdUJBQXVCLGFBQWEsQ0FBQTt3QkFDekMsS0FBSywyQkFBMkIsQ0FBQTtjQUMxQyx5QkFBd0I7OztxQkFHakIsUUFBTzs7c0JBRU4sbUJBQWtCOztnQ0FFUixlQUFlLFFBQU87cUJBQ2pDLGVBQWUsUUFBTzs7OztDQUtqQyx5QkFBc0I7QUFDNUIsTUFBSSxDQUFDLEtBQUssbUJBQW1CLEtBQUssb0JBQW9CLE9BQ3BELFFBQU87RUFHVCxNQUFNLFlBQVksdUJBQ2hCLHFDQUNBLEtBQUssVUFBVSxRQUNoQjtBQVlELFNBQU8sSUFBSTs7c0NBRXVCLFNBWlgsS0FBSyxnQkFDeEIsS0FBSyxvQkFBb0IsVUFDdkIsU0FDQSxPQUNGLEtBQUssb0JBQW9CLFVBQ3ZCLFVBQ0EsT0FFa0MsUUFJRTs7cURBRU8sVUFBUzs7O0NBSXBELG9CQUFpQjtBQUN2QixNQUFJLFlBQVksQ0FBQyxLQUFLLGlCQUFpQixDQUFDLEtBQUssaUJBQzNDLFFBQU87QUFFVCxTQUFPLElBQUk7O1VBRUwsS0FBSywrQkFBK0IsaUJBQWlCLENBQUE7Ozs7d0JBSXZDLHVCQUNaLCtCQUNBLEtBQUssVUFBVSxRQUNoQixDQUFBOztZQUVDLEtBQUsseUJBQXlCLEtBQzdCLGtCQUFvQyxVQUFpQjtBQUNwRCxVQUFPLElBQUk7O2tDQUVTLFVBQStCLEtBQUssa0JBQWtCLE1BQU0sQ0FBQTtzQ0FDeEQsS0FBSyxrQkFBa0IsQ0FBQTs0QkFDakMsUUFBdUIsS0FBSyw4QkFBOEIsS0FBSyxNQUFNLENBQUE7MkJBQ3RFLE1BQUs7OEJBQ0YsS0FBSyx1QkFBdUIsTUFBQTs2QkFDN0IsS0FBSyxzQkFBc0IsTUFBQTs2QkFDM0IsS0FBSyxzQkFBc0IsTUFBQTt1Q0FDakIsS0FBSyw4QkFBQTt1Q0FDTCxpQkFBZ0I7K0JBQ3hCLEtBQUssY0FBYTtvQ0FDYixLQUFLLGNBQWE7Ozs7SUFLM0MsQ0FBQTs7VUFFRCxLQUFLLCtCQUErQixrQkFBa0IsQ0FBQTs7Ozs7Ozs7OztDQVV0RCxlQUNOLGlCQUNBLGdCQUFzQjtFQUV0QixNQUFNLFVBQXVCLEtBQUssTUFBTSxLQUFLLFVBQVUsaUJBQWlCLFdBQVcsQ0FBQztBQUVwRixNQUFJLENBQUMsV0FBVyxTQUNkLFFBQU87QUFFVCxTQUFPLFFBQVEsS0FBSyxXQUFzQixlQUFzQjtBQUM5RCxVQUFPLElBQUk7O1lBRUwsS0FBSyxvQkFDTCxXQUNBLFlBQ0EsZ0JBQ0EsZ0JBQWdCLGVBQ2pCLENBQUE7OztJQUdMOztDQUdJLG9CQUNOLFdBQ0EsWUFDQSxnQkFDQSxxQkFBMkI7RUFFM0IsTUFBTSwyQkFBMkIsS0FBSyx1QkFBdUIsVUFBVSxVQUFVO0VBQ2pGLE1BQU0sb0NBQW9DLEtBQUssMEJBQTBCLFVBQVU7QUFFbkYsU0FBTyxJQUFJO2NBQ0QsU0FBUztHQUNmLHVDQUF1Qyx5QkFBeUI7R0FDaEUsd0NBQXdDLHlCQUF5QjtHQUNsRSxDQUFDLENBQUE7O1FBRUEsS0FBSyx5QkFBeUIsV0FBVyxnQkFBZ0IsV0FBVyxDQUFBO1FBQ3BFLEtBQUssMEJBQTBCLGdCQUFnQixXQUFXLENBQUE7UUFDMUQsS0FBSyx5QkFBeUIsZ0JBQWdCLFdBQVcsQ0FBQTtRQUN6RCxLQUFLLDRCQUE0QixnQkFBZ0IsV0FBVyxDQUFBOzs7dUJBRzdDLEtBQUssbUNBQW1DLFdBQVcsQ0FBQTsyQkFDL0MsV0FBVTs7aURBRVksV0FBVTs7OzRDQUdmLFdBQVU7aURBQ0wsa0NBQWlDOztVQUV4RSxLQUFLLHNCQUFzQixXQUFXLFlBQVksZ0JBQWdCLG9CQUFvQixDQUFBOzs7Ozs7OztDQVN0Rix5QkFDTixXQUNBLGdCQUNBLFlBQWtCO0FBRWxCLE1BQUksQ0FBQyxVQUFVLGdCQUNiLFFBQU87RUFHVCxNQUFNLHFCQUNKLEtBQUsseUJBQXlCLE1BQU0sZ0JBQWdCLFlBQVk7RUFDbEUsTUFBTSxxQkFBcUIsbUJBQW1CO0VBQzlDLE1BQU0seUJBQXlCLG1CQUFtQjtBQUVsRCxTQUFPLElBQUk7O2lCQUVFLFNBQVMsRUFDaEIseUNBQXlDLDBCQUEwQixPQUNwRSxDQUFDLENBQUE7Z0JBQ00sU0FBUztHQUNmLHdDQUF3QyxtQkFBbUIsVUFBVTtHQUNyRSx5Q0FBeUMsbUJBQW1CLFVBQVU7R0FDdEUsc0NBQXNDLG1CQUFtQixTQUFTO0dBQ2xFLHVDQUF1QyxtQkFBbUIsU0FBUztHQUNuRSwyQ0FBMkM7R0FDNUMsQ0FBQyxDQUFBOzttQkFFUyxLQUFBOzs7OztDQU1ULHNCQUNOLE9BQ0EsWUFDQSxnQkFDQSxxQkFBMkI7QUFFM0IsTUFBSSxDQUFDLE1BQU0sT0FDVCxRQUFPO0VBR1QsTUFBTSxpQkFBMEMsRUFBRTtBQUNsRCxPQUFLLE1BQU0sU0FBUyxNQUFNLE9BQ3hCLEtBQUksQ0FBQyxlQUFlLE1BQU0sU0FBUyxHQUNqQyxnQkFBZSxNQUFNLFNBQVMsS0FBSyxDQUFDLE1BQU07TUFFMUMsZ0JBQWUsTUFBTSxTQUFTLEdBQUcsS0FBSyxNQUFNO0FBSWhELFNBQU8sT0FBTyxPQUFPLGVBQWUsQ0FDakMsS0FBSyxXQUFvQixVQUFTO0FBQ2pDLFVBQU8sSUFBSTt3QkFDSyxXQUFVLEdBQUksVUFBVSxHQUFHLFNBQVMsRUFBQyxtQkFBb0IsTUFBSztjQUN4RSxLQUFLLHlCQUNMLFdBQ0EsWUFDQSxnQkFDQSxvQkFDRCxDQUFBOzs7SUFHTCxDQUNELFNBQVMsZ0JBQWdCLFlBQVk7O0NBR2xDLHlCQUNOLFFBQ0EsWUFDQSxXQUNBLHFCQUEyQjtBQUczQixTQUFPLE1BQ0osUUFBZSxXQUFrQixPQUFPLE9BQU8sU0FBUyxFQUFFLEdBQUcsT0FBTyxPQUFPLFNBQVMsRUFBRSxDQUN4RjtFQUdELE1BQU0sZUFBZSxhQUFhLE1BQU07QUFDeEMsU0FBTyxJQUFJLEdBQUcsT0FDWixTQUNDLFVBQVUsZUFBZSxNQUFNLE1BQU0sU0FDckMsT0FBTyxVQUFTO0dBQ2YsTUFBTSxzQkFBc0IsS0FBSyx1QkFBdUIsTUFBTSxVQUFVO0dBQ3hFLE1BQU0scUJBQXFCLEtBQUssc0JBQXNCLE1BQU0sU0FBUztHQUNyRSxNQUFNLFdBQVcsTUFBTSxZQUFZO0dBQ25DLE1BQU0sZUFBZSxLQUFLLGdCQUFnQixNQUFNO0dBQ2hELE1BQU0sVUFBVSxLQUFLLGtCQUFrQixXQUFXLFlBQVksTUFBTSxPQUFPO0FBQzNFLFVBQU8sSUFBSTs7dUJBRUksVUFBUyxHQUFJLFdBQVUsR0FBSSxNQUFNLFNBQVMsRUFBQyxHQUFJLE1BQUs7Ozs7c0JBSXJELFNBQVM7SUFDZix5REFBeUQsS0FBSyxJQUM1RCxvQkFBb0IsR0FDcEIsb0JBQW9CLEVBQ3JCO0lBQ0QsOENBQThDLG9CQUFvQjtJQUNsRSwrQ0FBK0Msb0JBQW9CO0lBQ25FLDRDQUE0QyxtQkFBbUI7SUFDL0QsNkNBQTZDLG1CQUFtQjtJQUNoRSxpREFBaUQ7SUFDakQsc0RBQXNEO0lBQ3ZELENBQUMsQ0FBQTs4QkFDYyxxQkFDZCxLQUFLLGVBQWUsaUJBQWlCLENBQUE7O21CQUVsQyxRQUFBOztxQkFFRSxNQUFNLE9BQUE7cUJBQ04sTUFBTSxLQUFBO3NCQUNMLE1BQU0sTUFBQTtpQ0FDSyxLQUFLLGdCQUFBOzRCQUNWLFdBQUE7MkJBQ0Qsb0JBQUE7Z0NBQ0ssVUFBQTs2QkFDSCxNQUFNLFlBQUE7OEJBQ0wsS0FBSyxrQkFBQTtnQ0FDSCxLQUFLLGNBQWE7Ozs7SUFLN0M7O0NBR0ssMEJBQ04sZ0JBQ0EsWUFBa0I7QUFLbEIsU0FGRSxLQUFLLHlCQUF5QixNQUFNLGdCQUFnQixZQUFZLFlBRXhDLGNBQWMsS0FBSyxtQkFBa0I7QUFDN0QsVUFBTyxJQUFJO2dCQUNELFNBQVM7SUFDZix3Q0FBd0MsZUFBZSxVQUFVO0lBQ2pFLHlDQUF5QyxlQUFlLFVBQVU7SUFDbEUsc0NBQXNDLGVBQWUsU0FBUztJQUM5RCx1Q0FBdUMsZUFBZSxTQUFTO0lBQy9ELDJDQUEyQztJQUMzQywyQ0FBMkMsZUFBZTtJQUMzRCxDQUFDLENBQUE7ZUFDSyxlQUFlLFFBQVEsUUFBQTs7bUJBRW5CLEtBQUE7O0lBRWI7O0NBR0kseUJBQ04sZ0JBQ0EsWUFBa0I7QUFLbEIsU0FGRSxLQUFLLHlCQUF5QixNQUFNLGdCQUFnQixZQUFZLFlBRXhDLGFBQWEsS0FBSyxtQkFBa0I7R0FDNUQsTUFBTSxZQUFZLG1CQUFtQixlQUFjLEdBQUksV0FBVSxHQUFJLGVBQWUsU0FBUyxFQUFDLEdBQUksZUFBZSxTQUFTO0dBQzFILE1BQU0sb0JBQW9CLGVBQWUsTUFBTSxRQUFRLFFBQVEsS0FBSztHQUNwRSxNQUFNLGVBQWUsZUFBZSxRQUFRLG9CQUFvQixlQUFlLE9BQU87R0FDdEYsTUFBTSxtQkFBbUIsZUFBZSxPQUNwQyx1QkFBdUIsZUFBZSxNQUFNLEtBQUssVUFBVSxRQUFRLEdBQ25FO0FBRUosVUFBTyxJQUFJOztnQkFFRCxVQUFTO21CQUNOLFNBQVMsRUFDaEIsNkNBQTZDLGlCQUFpQixNQUMvRCxDQUFDLENBQUE7a0JBQ00sU0FBUztJQUNmLHFDQUFxQyxlQUFlLFVBQVU7SUFDOUQsc0NBQXNDLGVBQWUsVUFBVTtJQUMvRCxtQ0FBbUMsZUFBZSxTQUFTO0lBQzNELG9DQUFvQyxlQUFlLFNBQVM7SUFDNUQsdUNBQXVDLGVBQWUsU0FBUztJQUNoRSxDQUFDLENBQUE7cUJBQ1MsZUFBZSxZQUFZLFFBQUE7Ozs7WUFJcEMsZUFDRSxJQUFJOzswQkFFUSxTQUFTO0lBQ2YsNENBQTRDLEtBQUssa0JBQWtCO0lBQ25FLDZDQUE2QyxLQUFLLGtCQUFrQjtJQUNwRSx3Q0FBd0MsZUFBZSxVQUFVO0lBQ2pFLHlDQUF5QyxlQUFlLFVBQVU7SUFDbEUsMkNBQTJDLGVBQWU7SUFDMUQsa0RBQ0UsaUJBQWlCLGVBQWUsS0FBSyx3QkFBd0I7SUFDaEUsQ0FBQyxDQUFBO3lCQUNLLGFBQUE7Ozs7O2tCQU1YLFFBQUE7O1VBRUosZUFBZSxLQUFLLFNBQVMsV0FBVyxpQkFBaUIsR0FBRyxRQUFBOztJQUVoRTs7Q0FHSSw0QkFDTixnQkFDQSxZQUFrQjtBQUtsQixTQUZFLEtBQUsseUJBQXlCLE1BQU0sZ0JBQWdCLFlBQVksWUFFeEMsZ0JBQWdCLEtBQUssbUJBQStCO0dBRTVFLE1BQU0sWUFBWSxtQkFBbUIsZUFBYyxHQUFJLFdBQVUsR0FBSSxlQUFlLFNBQVMsRUFBQyxHQUFJLGVBQWUsU0FBUztHQUMxSCxNQUFNLG1CQUFtQixlQUFlLE9BQ3BDLHVCQUF1QixlQUFlLE1BQU0sS0FBSyxVQUFVLFFBQVEsR0FDbkU7QUFFSixVQUFPLElBQUk7O2dCQUVELFVBQVM7a0JBQ1AsU0FBUztJQUNmLHdDQUF3QyxlQUFlLFVBQVU7SUFDakUseUNBQXlDLGVBQWUsVUFBVTtJQUNsRSxzQ0FBc0MsZUFBZSxTQUFTO0lBQzlELHVDQUF1QyxlQUFlLFNBQVM7SUFDL0QsMkNBQTJDO0lBQzNDLDJDQUEyQyxlQUFlO0lBQzNELENBQUMsQ0FBQTs7aUJBRUssZUFBZSxRQUFRLFFBQUE7Ozs7VUFJOUIsS0FBSyxTQUFTLFdBQVcsaUJBQWlCLENBQUE7O0lBRTlDOzs7Ozs7O0NBUUksZUFBZSxrQkFBNkM7RUFDbEUsTUFBTSxnQkFBZ0IsaUJBQWlCO0FBRXZDLE9BQUssaUNBQWlDO0FBQ3RDLE9BQUssdUJBQXVCO0FBQzVCLE9BQUssb0JBQW9CO0FBR3pCLE1BQUksQ0FBQyxLQUFLLDhCQUNSLE1BQUssZ0NBQWdDO0FBR3ZDLE1BQUksQ0FBQyxLQUFLLG1CQUFtQjtBQUUzQixRQUFLLG9DQUFvQyxjQUFjO0FBQ3ZELFFBQUssa0NBQWtDLGNBQWM7OztDQUlqRCxrQkFBa0IsT0FBMEI7RUFDbEQsTUFBTSx3QkFBd0IsTUFBTTtBQUVwQyxPQUFLLHVCQUF1QjtBQUM1QixPQUFLLGlDQUFpQztBQUN0QyxPQUFLLGdDQUFnQztBQUVyQyxNQUFJLDBCQUEwQixRQUFRLDBCQUEwQixLQUFLLHdCQUF3QjtBQUMzRixRQUFLLHFCQUFxQjtBQUMxQixRQUFLLHlCQUF5QixzQkFBc0I7YUFDM0MsMEJBQTBCLEtBQUssd0JBQXdCO0FBQ2hFLFFBQUssNEJBQTRCO0FBQ2pDLFFBQUssdUJBQXVCOztBQUk5QixPQUFLLGVBQWU7O0NBR2QsbUJBQWdCO0FBQ3RCLE1BQUksQ0FBQyxLQUFLLCtCQUNSLE1BQUssdUJBQXVCO01BRTVCLE1BQUssa0JBQWtCLEtBQUssa0JBQWtCO0FBR2hELE9BQUssa0JBQWtCOzs7Ozs7OztDQVNqQixTQUNOLFdBQ0EsZ0JBQThDO0FBRTlDLFNBQU8sSUFBSTs4QkFDZSxVQUFTOytDQUNRLGVBQWM7Ozs7Ozs7O0NBU25ELGdCQUFhO0FBQ25CLE9BQUssWUFDRCxpQkFBb0MsNkRBQWtDLENBQ3ZFLFNBQVMsWUFBWSxRQUFRLE9BQU8sQ0FBQzs7Q0FHbEMsMEJBQTBCLFdBQW9CO0FBRXBELE1BQUksVUFBVSxTQUFTLG1CQUNyQixRQUFPLHVCQUF1QixvQkFBb0IsS0FBSyxVQUFVLFFBQVE7QUFHM0UsTUFBSSxDQUFDLFVBQVUsUUFBUSxPQUNyQixRQUFPLHVCQUF1QiwrQkFBK0IsS0FBSyxVQUFVLFNBQVMsQ0FDbkYsVUFBVSxHQUNYLENBQUM7RUFHSixJQUFJO0VBQ0osTUFBTSxtQkFBbUIsS0FBSywrQkFBK0IsVUFBVSxnQkFBaUI7RUFDeEYsTUFBTSxzQkFBc0IsS0FBSywrQkFBK0IsVUFBVSxnQkFBaUI7QUFFM0YsMEJBQXdCLHVCQUF1Qix1QkFBdUIsS0FBSyxVQUFVLFNBQVMsQ0FDNUYsVUFBVSxHQUNYLENBQUM7QUFFRixNQUFJLENBQUMsS0FBSyxlQUFlO0dBRXZCLE1BQU0sYUFBYSxLQUFLLG1DQUFtQyxVQUFVLE9BQU87R0FDNUUsTUFBTSxnQkFBZ0IsdUJBQ3BCLG9DQUNBLEtBQUssVUFBVSxTQUNmLENBQUMsV0FBVyxPQUFPLFdBQVcsU0FBUyxDQUN4QztBQUNELDJCQUF3QixzQkFBc0IsT0FBTyxLQUFLLENBQUMsT0FBTyxjQUFjLENBQUMsT0FBTyxLQUFLOztBQUcvRixNQUFJLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLHFCQUFxQjtBQUMvQyw0QkFDRSxPQUFPLHVCQUF1Qiw0QkFBNEIsS0FBSyxVQUFVLFFBQVEsR0FBRztBQUN0Riw0QkFBeUIsc0JBQXNCLE9BQU8sbUJBQW1COztBQUUzRSxTQUFPOztDQUdELCtCQUErQixzQkFBbUM7RUFDeEUsTUFBTSxxQkFBK0IsRUFBRTtBQUV2QyxTQUFPLHNCQUNILEtBQUssdUJBQXNCO0dBQzNCLE1BQU0sT0FBTyxtQkFBbUI7QUFDaEMsT0FBSSxDQUFDLEtBQ0gsUUFBTztHQUdULE1BQU0sMEJBQTBCLG1CQUFtQixRQUFRLEtBQUssR0FBRztHQUNuRSxNQUFNLGNBQWMsdUJBQ2xCLG1CQUFtQixNQUNuQixLQUFLLFVBQVUsUUFDaEI7R0FDRCxNQUFNLHFCQUNKLEtBQUssMkJBQTJCLFFBQVEsS0FBSyxLQUFLLE1BQ2xELEtBQUssZ0JBQWdCLFFBQVEsS0FBSyxLQUFLO0FBRXpDLE9BQUksQ0FBQyx3QkFDSCxvQkFBbUIsS0FBSyxtQkFBbUIsS0FBTTtBQUVuRCxVQUFPLENBQUMsQ0FBQyxlQUFlLENBQUMsMkJBQTJCLHFCQUFxQixjQUFjO0lBQ3ZGLENBQ0QsUUFBUSxnQkFBZ0IsQ0FBQyxDQUFDLFlBQVksQ0FDdEMsS0FBSyxLQUFLIn0=
472
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQtQi1uMHNJTDUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24uY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5AdXNlICcuLi9jb21tb24vc3R5bGVzL3NlYXQtcmVzZXJ2YXRpb24tbWl4aW5zJyBhcyBzYmItc3ItbWl4aW5zO1xuQHVzZSAnLi4vY29tbW9uL3N0eWxlcy9zZWF0LXJlc2VydmF0aW9uLWZ1bmN0aW9ucycgYXMgc2JiLXNyLWZ1bmN0aW9ucztcblxuLy8gTWF4aW11bSByZXNwb25zaXZlIG5hdmlnYXRpb24gd2lkdGgsIGNvbnNpc3RzIG9mIHRoZSBtYXhpbXVtIG5hdmlnYXRpb24gZXh0ZW50IG1pbnVzIDJ4IG5hdiBkaXJlY3Rpb24gYnV0dG9ucyA5NnB4IGFuZCA4cHggcGFkZGluZy5cbiRtYXgtY29hY2gtbmF2aWdhdGlvbi13aWR0aDogY2FsYyg5NjBweCAtIDk2cHggLSA4cHgpO1xuJHNjcm9sbGJhci1oZWlnaHQ6IDE2cHg7XG5cbjpob3N0IHtcbiAgLy8gTm90ZTogVGhlIHVzZSBvZiBweCBpcyBpbnRlbnRpb25hbCBoZXJlLCBiZWNhdXNlIG1hbnkgd2lkdGhzL2hlaWdodHMsIHJvdGF0aW9ucywgc2NhbGVzLCBldGMuIGRlcGVuZHMgb24gdGhpcy5cbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemU6IDE2cHg7XG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0OiAwO1xuICAtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWRlY2tzOiAxO1xuXG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgOjpwYXJ0KGNvYWNoLWZsb29yKSB7XG4gICAgZmlsbDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMik7XG5cbiAgICAvLyBJbiBIaWdoIENvbnRyYXN0IE1vZGUgd2Ugc2V0IGZsb29yIGNvbG9yIHRvIHRyYW5zcGFyZW50XG4gICAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgICAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8vIHJvdGF0ZXMgdGhlIERPTS1wYXJ0IFwiY29hY2gtZmxvb3JcIiBieSAxODAgZGVncmVlcyBpZiB0aGUgaG9zdCBpcyBpbiBSVEwgbW9kZS5cbkBpbmNsdWRlIHNiYi1zci1taXhpbnMucm90YXRlLWRvbS1wYXJ0KGNvYWNoLWZsb29yKTtcblxuW3BvcG92ZXJdOndoZXJlKHNiYi1wb3BvdmVyKSB7XG4gIEBpbmNsdWRlIHNiYi5wb3BvdmVyLXJlc2V0O1xuXG4gIC5zYmItc3ItcG9wb3ZlciB7XG4gICAgbWFyZ2luLWJsb2NrOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBTVEFSVCAtIFZlcnRpY2FsIG1vZGVcbjpob3N0KFthbGlnbi12ZXJ0aWNhbF0pIHtcbiAgJGNvYWNoLW5hdmlnYXRpb24tcGFkZGluZzogNTtcbiAgJGNvYWNoLXNjcm9sbGJhci13aWR0aDogMjQ7XG4gICRjb2FjaC1ncmlkLXdpZHRoOiBjYWxjKHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCkgKyAkY29hY2gtc2Nyb2xsYmFyLXdpZHRoKTtcblxuICAuc2JiLXNyX19jb21wb25lbnQge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjIpO1xuICAgIGhlaWdodDogaW5oZXJpdDtcblxuICAgIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogc21hbGwpIHtcbiAgICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNTQpO1xuICAgIH1cblxuICAgIG5hdi5zYmItc3ItbmF2aWdhdGlvbixcbiAgICB1bC5zYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgbmF2LnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgICAgIHBhZGRpbmc6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KSAwO1xuXG4gICAgICAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMSk7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcm90YXRlOiA5MGRlZztcblxuICAgICAgICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oLTEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVsLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICAgICAgICBtYXgtd2lkdGg6IGluaXRpYWw7XG5cbiAgICAgICAgLy8gUGFkZGluZyBuZWVkcyB0byB2aXN1YWwgZm9jdXMtdmlzaWJsZSBzdHlsZSBmb3IgbmF2IGJ1dHRvbiBpbnNpZGUgb3ZlcmZsb3cgY29udGVudCxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZvY3VzLXZpc2libGUgc3R5bGUgaXMgY3V0dGVkLlxuICAgICAgICBwYWRkaW5nOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtbmF2aWdhdGlvbi1wYWRkaW5nKTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbiBzY3JvbGw7XG5cbiAgICAgICAgLy8gaW4gdmVydGljYWwgbW9kZSwgdGhlIGxpIG11c3QgYmUgZmxleGVkOyBvdGhlcndpc2UgaXQgd291bGQgY2FsY3VsYXRlIHRoZSB3cm9uZyBoZWlnaHRcbiAgICAgICAgLy8gZHVlIHRvIHVzZXJhZ2VudCBzdHlsZSBzZXQgdG8gXCJsaXN0LWl0ZW1cIiBmb3IgZGlzcGxheVxuICAgICAgICBsaSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBMQUJFTE1VTFRJUExFIERFQ0tTIC0gTEFCRUxTXG4gIC5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAuc2JiLXNyX193cmFwcGVyLWRlY2stbGFiZWxzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtZ3JpZC13aWR0aCk7XG4gICAgICBoZWlnaHQ6IGluaXRpYWw7XG5cbiAgICAgIGIge1xuICAgICAgICBpbmxpbmUtc2l6ZTogY2FsYyg1MCUgLSBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNikpO1xuICAgICAgICBibG9jay1zaXplOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KTtcbiAgICAgICAgcm90YXRlOiBpbml0aWFsO1xuICAgICAgICB3cml0aW5nLW1vZGU6IGluaXRpYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVkVSVElDQUwgTU9ERSAtIFNFQVRNQVAgU0NST0xMIEFSRUFcbiAgLnNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oJGNvYWNoLWdyaWQtd2lkdGgpO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuIHNjcm9sbDtcblxuICAgIC5zYmItc3JfX3BhcmVudCB7XG4gICAgICByb3RhdGU6IDkwZGVnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBUUkFWRUwtRElSRUNUSU9OXG4gIC5zYmItc3ItdHJhdmVsLWRpcmVjdGlvbi13cmFwcGVyIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0odmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0KSk7XG4gICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBFTkQgLSBWZXJ0aWNhbCBtb2RlXG5cbi5zYmItc3ItbmF2aWdhdGlvbiB7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMyk7XG59XG5cbi5zYmItc3ItbmF2aWdhdGlvbiAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDIpO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuLnNiYi1zcl9fY29tcG9uZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiBjYWxjKHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDY0KSAtICRzY3JvbGxiYXItaGVpZ2h0KTtcbn1cblxuLy8gVFJBVkVMIERJUkVDVElPTlxuLnNiYi1zci10cmF2ZWwtZGlyZWN0aW9uLXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sdW1uLWdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIG1hcmdpbi1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCkgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tc2JiLXRleHQtZm9udC1zaXplLXMpO1xuXG4gIC5zYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWFycm93IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cbn1cblxuLy8gTkFWSUdBVElPTiBORVdcbi5zYmItc3ItbmF2aWdhdGlvbi13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nLWlubGluZTogMTZweDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgcGFkZGluZzogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNikgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNSkgMDtcbiAgbWF4LXdpZHRoOiAkbWF4LWNvYWNoLW5hdmlnYXRpb24td2lkdGg7XG5cbiAgLy8gU2V0IHNiYiBzY3JvbGxiYXIgdHJhbnNwYXJlbnQgYnkgZGVmYXVsdFxuICAtLXNiYi1zY3JvbGxiYXItY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIG92ZXJmbG93OiBzY3JvbGwgaGlkZGVuO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLSBTZWF0IFJlc2VydmF0aW9uIE1haW4gTmF2aWdhdGlvbiAtIEVORCAtLS0tLS0tLS0tLS0tLS0tXG5cbi8vIC0tLS0tLS0tLS0tLS0gU2VhdCBSZXNlcnZhdGlvbiBDb2FjaGVzIC0gU1RBUlQgLS0tLS0tLS0tLS0tLS0tLS1cbi5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgLnNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVscyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgaGVpZ2h0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSh2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQpKTtcbiAgICB3cml0aW5nLW1vZGU6IHZlcnRpY2FsLWxyO1xuXG4gICAgYiB7XG4gICAgICBoZWlnaHQ6IGNhbGMoNTAlIC0gc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpKTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICBtYXJnaW4tYmxvY2stZW5kOiAxNnB4O1xuICAgICAgcm90YXRlOiAxODBkZWc7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBsaW5lLWhlaWdodDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjApO1xuICAgIH1cbiAgfVxufVxuXG4uc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEge1xuICBvdmVyZmxvdzogc2Nyb2xsIGhpZGRlbjtcbiAgcGFkZGluZy1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCkgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpO1xuXG4gIC5zYmItc3JfX3BhcmVudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxufVxuXG4uc2JiLXNyX19saXN0LWRlY2tzIHtcbiAgQGluY2x1ZGUgc2JiLmxpc3QtcmVzZXQ7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLnNiYi1zcl9fbGlzdC1kZWNrcy0tZ2FwIHtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0OCk7XG59XG5cbi5zYmItc3JfX2xpc3QtaXRlbS1kZWNrIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uc2JiLXNyX19saXN0LWNvYWNoZXMge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQpO1xufVxuXG4vLyBJZiB0aGVyZSBhcmUgb3ZlcmhhbmdpbmcgZWxlbWVudHMgd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgZ2FwIGJldHdlZW4gY29hY2hlc1xuLnNiYi1zcl9fbGlzdC1kZWNrczpoYXMoLnNiYi1zci1jb2FjaC1oYXMtb3ZlcmhhbmdpbmctZWxlbWVudHMpIC5zYmItc3JfX2xpc3QtY29hY2hlcyB7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCk7XG59XG5cbi5zYmItc3JfX2l0ZW0tY29hY2gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5zYmItc3ItY29hY2gtd3JhcHBlcl9fdGFibGUge1xuICBvdXRsaW5lOiAwO1xufVxuIiwiaW1wb3J0IHsgU2JiU2Vjb25kYXJ5QnV0dG9uRWxlbWVudCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2J1dHRvbi5wdXJlLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgU2JiRWxlbWVudFR5cGUsXG4gIHNjcmVlblJlYWRlck9ubHlTdHlsZXMsXG4gIHNjcm9sbGJhclN0eWxlcyxcbn0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS5qcyc7XG5pbXBvcnQgeyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlLmpzJztcbmltcG9ydCB7IFNiYlBvcG92ZXJFbGVtZW50IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvcG9wb3Zlci5wdXJlLmpzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAsIFByb3BlcnR5VmFsdWVzLCBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBodG1sLCBpc1NlcnZlciwgbm90aGluZywgdW5zYWZlQ1NTIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBzdHlsZU1hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3N0eWxlLW1hcC5qcyc7XG5cbmltcG9ydCB7IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24gfSBmcm9tICcuLi9jb21tb24vdHJhbnNsYXRpb25zLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgQmFzZUVsZW1lbnQsXG4gIENvYWNoSXRlbSxcbiAgQ29hY2hJdGVtRGV0YWlscyxcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb24sXG59IGZyb20gJy4uL2NvbW1vbi90eXBlcy50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tYXJlYS9zZWF0LXJlc2VydmF0aW9uLWFyZWEuY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvbkdyYXBoaWNFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljL3NlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uTmF2aWdhdGlvbkNvYWNoRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaC9zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2guY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25TY29wZWRFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQvc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQuY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgfSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzJztcbmltcG9ydCBzdHlsZSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24uc2Nzcz9pbmxpbmUnO1xuXG4vKipcbiAqIE1haW4gY29tcG9uZW50IGZvciB0aGUgc2VhdCByZXNlcnZhdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJTZWF0UmVzZXJ2YXRpb25FbGVtZW50IGV4dGVuZHMgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXNlYXQtcmVzZXJ2YXRpb24nO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGVsZW1lbnREZXBlbmRlbmNpZXM6IFNiYkVsZW1lbnRUeXBlW10gPSBbXG4gICAgU2JiU2Vjb25kYXJ5QnV0dG9uRWxlbWVudCxcbiAgICBTYmJQb3BvdmVyRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25HcmFwaGljRWxlbWVudCxcbiAgICBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50LFxuICAgIFNiYlNlYXRSZXNlcnZhdGlvbk5hdmlnYXRpb25Db2FjaEVsZW1lbnQsXG4gICAgU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudCxcbiAgXTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW1xuICAgIHNjcm9sbGJhclN0eWxlcyxcbiAgICBzY3JlZW5SZWFkZXJPbmx5U3R5bGVzLFxuICAgIHVuc2FmZUNTUyhzdHlsZSksXG4gIF07XG5cbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9jb2FjaGVzSHRtbFRlbXBsYXRlPzogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdoYXNOYXZpZ2F0aW9uJykpIHtcbiAgICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBmaXJzdCB1cGRhdGUgaXMgY29tcGxldGUgdG8gaW5pdCBkaWZmZXJlbnQgSFRNTCBlbGVtZW50IGRpbWVuc2lvbnNcbiAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICB0aGlzLl9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpO1xuICAgIHJldHVybiB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlID0gaHRtbGBcbiAgICAgICR7dGhpcy5fcmVuZGVyVHJhdmVsRGlyZWN0aW9uKCl9XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX19jb21wb25lbnRcIj5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uKCl9XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNiYi1zcl9fd3JhcHBlci1jb2FjaC1kZWNrc1wiXG4gICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLmtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmcoZXZ0KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItZGVjay1sYWJlbHNcIj4ke3RoaXMuX3JlbmRlckRlY2tMYWJlbHMoKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBAc2Nyb2xsPSR7KCkgPT4gdGhpcy5jb2FjaEFyZWFTY3JvbGxlbmQoKX1cbiAgICAgICAgICAgIGlkPVwic2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWFcIlxuICAgICAgICAgICAgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYSBzYmItc2Nyb2xsYmFyXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJzYmItc3JfX3BhcmVudC1hcmVhXCIgY2xhc3M9XCJzYmItc3JfX3BhcmVudFwiPlxuICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgJ3NiYi1zcl9fbGlzdC1kZWNrcyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAnc2JiLXNyX19saXN0LWRlY2tzLS1nYXAnOiB0aGlzLmhhc011bHRpcGxlRGVja3MsXG4gICAgICAgICAgICAgICAgfSl9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICR7dGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5tYXAoXG4gICAgICAgICAgICAgICAgICAoc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sIGNvYWNoRGVja0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPGxpIGNsYXNzPVwic2JiLXNyX19saXN0LWl0ZW0tZGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInNiYi1zcl9fbGlzdC1jb2FjaGVzXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLl9yZW5kZXJDb2FjaGVzKHNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+YDtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJEZWNrTGFiZWxzKCk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5tYXAoKHNlYXRSZXNlcnZhdGlvbikgPT4ge1xuICAgICAgY29uc3QgZGVja0Rlc2NyaXB0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaExldmVsLFxuICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBodG1sYDxiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7ZGVja0Rlc2NyaXB0aW9ufTwvYj5gO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uIHx8ICF0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBidG5OYXZpZ2F0aW9uRGlyZWN0aW9uSWQgPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnXG4gICAgICAgID8gJ3NiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb24tLXJpZ2h0J1xuICAgICAgICA6ICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1sZWZ0JztcbiAgICBjb25zdCBidG5JY29uID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyA/ICdjaGV2cm9uLXNtYWxsLXJpZ2h0LXNtYWxsJyA6ICdjaGV2cm9uLXNtYWxsLWxlZnQtc21hbGwnO1xuICAgIGNvbnN0IGJ0bkFyaWFEZXNjcmlwdGlvbiA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCdcbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdTRUFUX1JFU0VSVkFUSU9OX0VORCcsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogZ2V0STE4blNlYXRSZXNlcnZhdGlvbignU0VBVF9SRVNFUlZBVElPTl9CRUdJTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpO1xuICAgIGxldCBidG5EaXNhYmxlZCA9IHRydWU7XG5cbiAgICBpZiAoYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fTEVGVCcgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPiAwKSB7XG4gICAgICBidG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4IDwgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgYnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvblwiPlxuICAgICAgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICAgIEBjbGljaz1cIiR7KCkgPT4gdGhpcy5uYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbil9XCJcbiAgICAgICAgQGZvY3VzPVwiJHsoKSA9PiB0aGlzLm9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKX1cIlxuICAgICAgICBpZD1cIiR7YnRuTmF2aWdhdGlvbkRpcmVjdGlvbklkfVwiXG4gICAgICAgIGNsYXNzPVwic2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICBpY29uLW5hbWU9XCIke2J0bkljb259XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2J0bkFyaWFEZXNjcmlwdGlvbn1cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgLmRpc2FibGVkSW50ZXJhY3RpdmU9XCIke2J0bkRpc2FibGVkIHx8IG5vdGhpbmd9XCJcbiAgICAgICAgLmRpc2FibGVkPVwiJHtidG5EaXNhYmxlZCB8fCBub3RoaW5nfVwiXG4gICAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyVHJhdmVsRGlyZWN0aW9uKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnRyYXZlbERpcmVjdGlvbiB8fCB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ05PTkUnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBsYWJlbFRleHQgPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgJ1NFQVRfUkVTRVJWQVRJT05fVFJBVkVMX0RJUkVDVElPTicsXG4gICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICk7XG5cbiAgICBjb25zdCBhcnJvd0RpcmVjdGlvbiA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ1JJR0hUJ1xuICAgICAgICA/ICdkb3duJ1xuICAgICAgICA6ICd1cCdcbiAgICAgIDogdGhpcy50cmF2ZWxEaXJlY3Rpb24gPT09ICdSSUdIVCdcbiAgICAgICAgPyAncmlnaHQnXG4gICAgICAgIDogJ2xlZnQnO1xuXG4gICAgY29uc3QgaWNvbk5hbWUgPSBgYXJyb3ctJHthcnJvd0RpcmVjdGlvbn0tc21hbGxgO1xuXG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1zci10cmF2ZWwtZGlyZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWFycm93XCI+XG4gICAgICAgIDxzYmItaWNvbiBzbG90PVwiaWNvblwiIG5hbWU9XCIke2ljb25OYW1lfVwiPjwvc2JiLWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWxhYmVsXCI+JHtsYWJlbFRleHR9PC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlck5hdmlnYXRpb24oKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoaXNTZXJ2ZXIgfHwgIXRoaXMuaGFzTmF2aWdhdGlvbiB8fCAhdGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uLXdyYXBwZXJcIj5cbiAgICAgIDxuYXYgaWQ9XCJzYmItc3ItbmF2aWdhdGlvblwiIGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25cIj5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbignRElSRUNUSU9OX0xFRlQnKX1cbiAgICAgICAgPHVsXG4gICAgICAgICAgaWQ9XCJzYmItc3JfX25hdmlnYXRpb24tbGlzdC1jb2FjaGVzXCJcbiAgICAgICAgICBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMgc2JiLXNjcm9sbGJhclwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIiR7Z2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgICAgICdTRUFUX1JFU0VSVkFUSU9OX05BVklHQVRJT04nLFxuICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgICApfVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3RoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLm1hcChcbiAgICAgICAgICAgIChjb2FjaEl0ZW1EZXRhaWxzOiBDb2FjaEl0ZW1EZXRhaWxzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBodG1sYDxsaT5cbiAgICAgICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaFxuICAgICAgICAgICAgICAgICAgQHNlbGVjdGNvYWNoPSR7KGV2ZW50OiBDdXN0b21FdmVudDxudW1iZXI+KSA9PiB0aGlzLl9vblNlbGVjdE5hdkNvYWNoKGV2ZW50KX1cbiAgICAgICAgICAgICAgICAgIEBmb2N1c2NvYWNoPSR7KCkgPT4gdGhpcy5fb25Gb2N1c05hdkNvYWNoKCl9XG4gICAgICAgICAgICAgICAgICBAa2V5dXA9JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLm9uS2V5TmF2aWdhdGlvbk5hdkNvYWNoQnV0dG9uKGV2dCwgaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgaW5kZXg9XCIke2luZGV4fVwiXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0ZWQ9JHt0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgICAuZm9jdXNlZD0ke3RoaXMuZm9jdXNlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgLmhvdmVyZWQ9JHt0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAgIC5uYXRpdmVGb2N1c0FjdGl2ZT0ke3RoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXN9XG4gICAgICAgICAgICAgICAgICAuY29hY2hJdGVtRGV0YWlscz1cIiR7Y29hY2hJdGVtRGV0YWlsc31cIlxuICAgICAgICAgICAgICAgICAgP3ZlcnRpY2FsPVwiJHt0aGlzLmFsaWduVmVydGljYWx9XCJcbiAgICAgICAgICAgICAgICAgID9zaG93VGl0bGVJbmZvPVwiJHt0aGlzLnNob3dUaXRsZUluZm99XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9zYmItc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoPlxuICAgICAgICAgICAgICA8L2xpPmA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICl9XG4gICAgICAgIDwvdWw+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oJ0RJUkVDVElPTl9SSUdIVCcpfVxuICAgICAgPC9uYXY+XG4gICAgPC9kaXY+YDtcbiAgfVxuICAvKipcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQHBhcmFtIHNlYXRSZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gY29hY2hEZWNrSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3JlbmRlckNvYWNoZXMoXG4gICAgc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoZXM6IENvYWNoSXRlbVtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXMpKTtcblxuICAgIGlmICghY29hY2hlcyB8fCBpc1NlcnZlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb2FjaGVzLm1hcCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0sIGNvYWNoSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxsaSBjbGFzcz1cInNiYi1zcl9faXRlbS1jb2FjaFwiPlxuICAgICAgICAgICR7dGhpcy5fcmVuZGVyQ29hY2hFbGVtZW50KFxuICAgICAgICAgICAgY29hY2hJdGVtLFxuICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICl9XG4gICAgICAgIDwvbGk+XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyQ29hY2hFbGVtZW50KFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGN1cnJDb2FjaFN0cnVjdHVyZSA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrc1tjb2FjaERlY2tJbmRleF0uZGVja0NvYWNoZXNbY29hY2hJbmRleF07XG4gICAgY29uc3QgZGVzY3JpcHRpb25UYWJsZUNvYWNoV2l0aFNlcnZpY2VzID0gdGhpcy5fZ2V0RGVzY3JpcHRpb25UYWJsZUNvYWNoKGNvYWNoSXRlbSk7XG5cbiAgICByZXR1cm4gaHRtbGA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkXG4gICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLXdpZHRoJzogY3VyckNvYWNoU3RydWN0dXJlLndpZHRoLFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtaGVpZ2h0JzogY3VyckNvYWNoU3RydWN0dXJlLmhlaWdodCxcbiAgICAgIH0pfVxuICAgID5cbiAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRDb2FjaEJvcmRlcnMoY29hY2hJdGVtLCBjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29hY2hFbGVtZW50cyhjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkQXJlYUVsZW1lbnRzKGNvYWNoRGVja0luZGV4LCBjb2FjaEluZGV4KX1cbiAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRTZXJ2aWNlRWxlbWVudHMoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgpfVxuXG4gICAgICA8dGFibGVcbiAgICAgICAgQGZvY3VzPSR7KCkgPT4gdGhpcy5vbkZvY3VzVGFibGVDb2FjaEFuZFByZXNlbGVjdFBsYWNlKGNvYWNoSW5kZXgpfVxuICAgICAgICBpZD1cInNiYi1zci1jb2FjaC0ke2NvYWNoSW5kZXh9XCJcbiAgICAgICAgY2xhc3M9XCJzYmItc3ItY29hY2gtd3JhcHBlcl9fdGFibGVcIlxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwic2JiLXNyLWNvYWNoLWNhcHRpb24tJHtjb2FjaEluZGV4fVwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgPlxuICAgICAgICA8Y2FwdGlvbiBpZD1cInNiYi1zci1jb2FjaC1jYXB0aW9uLSR7Y29hY2hJbmRleH1cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+JHtkZXNjcmlwdGlvblRhYmxlQ29hY2hXaXRoU2VydmljZXN9PC9zcGFuPlxuICAgICAgICA8L2NhcHRpb24+XG4gICAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRSb3dQbGFjZXMoY29hY2hJdGVtLCBjb2FjaEluZGV4LCBjb2FjaERlY2tJbmRleCwgcGxhY2VDb2FjaERlY2tJbmRleCl9XG4gICAgICA8L3RhYmxlPlxuICAgIDwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkPmA7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgYm9yZGVyIGdyYXBoaWMgKENPQUNIX0JPUkRFUl9NSURETEUpIG9mIGEgY29hY2ggd2l0aCBjYWxjdWxhdGVkIGJvcmRlciBnYXAgYW5kIGNvYWNoIHdpZHRoLFxuICAgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29hY2ggaXMgd2l0aCBhIGRyaXZlciBhcmVhIG9yIHdpdGhvdXQuXG4gICAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJlZENvYWNoQm9yZGVycyhcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgICBkZWNrQ29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoIWNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJDb2FjaFN0cnVjdHVyZSA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrc1tkZWNrQ29hY2hJbmRleF0uZGVja0NvYWNoZXNbY29hY2hJbmRleF07XG4gICAgY29uc3QgY29hY2hCb3JkZXJFbGVtZW50ID0gY3VyckNvYWNoU3RydWN0dXJlLmJvcmRlck1pZGRsZUVsZW1lbnQ7XG4gICAgY29uc3QgaGFzT3ZlcmhhbmdpbmdFbGVtZW50cyA9IGN1cnJDb2FjaFN0cnVjdHVyZS5oYXNPdmVyaGFuZ2luZ0VsZW1lbnRzO1xuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICdzYmItc3ItY29hY2gtaGFzLW92ZXJoYW5naW5nLWVsZW1lbnRzJzogaGFzT3ZlcmhhbmdpbmdFbGVtZW50cyB8fCBmYWxzZSxcbiAgICAgICAgfSl9XCJcbiAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGNvYWNoQm9yZGVyRWxlbWVudC5kaW1lbnNpb24udyxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGNvYWNoQm9yZGVyRWxlbWVudC5kaW1lbnNpb24uaCxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXRvcCc6IGNvYWNoQm9yZGVyRWxlbWVudC5wb3NpdGlvbi55LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGNvYWNoQm9yZGVyRWxlbWVudC5wb3NpdGlvbi54LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICB9KX1cbiAgICAgICAgbmFtZT1cIkNPQUNIX0JPUkRFUl9NSURETEVcIlxuICAgICAgICA/c3RyZXRjaD0ke3RydWV9XG4gICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRSb3dQbGFjZXMoXG4gICAgY29hY2g6IENvYWNoSXRlbSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZUNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIWNvYWNoLnBsYWNlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFByZXBhcmUgcm93cyB3aXRoIHRoZSBwbGFjZXMgdG8gcmVuZGVyIGEgdGFibGVcbiAgICBjb25zdCB0YWJsZVJvd1BsYWNlczogUmVjb3JkPG51bWJlciwgUGxhY2VbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHBsYWNlIG9mIGNvYWNoLnBsYWNlcykge1xuICAgICAgaWYgKCF0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XSkge1xuICAgICAgICB0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XSA9IFtwbGFjZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XS5wdXNoKHBsYWNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0YWJsZVJvd1BsYWNlcylcbiAgICAgIC5tYXAoKHJvd1BsYWNlczogUGxhY2VbXSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRyIGlkPVwicm93LSR7Y29hY2hJbmRleH0tJHtyb3dQbGFjZXNbMF0ucG9zaXRpb24ueX1cIiBkYXRhLXJvdy1pbmRleD0ke2luZGV4fT5cbiAgICAgICAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRDb2x1bW5QbGFjZXMoXG4gICAgICAgICAgICAgIHJvd1BsYWNlcyxcbiAgICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgICAgY29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICAgIHBsYWNlQ29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIGA7XG4gICAgICB9KVxuICAgICAgLmZsYXRNYXAoKHJvd1RlbXBsYXRlKSA9PiByb3dUZW1wbGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZENvbHVtblBsYWNlcyhcbiAgICBwbGFjZXM6IFBsYWNlW10sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGRlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICAvL1NvcnRzIGVhY2ggcGxhY2UgYnkgaXRzIGFzY2VuZGluZyB4IGNvb3JkaW5hdGVcbiAgICBwbGFjZXMuc29ydChcbiAgICAgIChwbGFjZUE6IFBsYWNlLCBwbGFjZUI6IFBsYWNlKSA9PiBOdW1iZXIocGxhY2VBLnBvc2l0aW9uLngpIC0gTnVtYmVyKHBsYWNlQi5wb3NpdGlvbi54KSxcbiAgICApO1xuXG4gICAgLy8gRm9yIHJlbmRlcmluZyB0aGUgcGxhY2VzIHdpdGhpbiBhIHRkIGVsZW1lbnQsIGhlcmUgd2UgdXNlIHJlcGVhdCBkaXJlY3RpdmUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBmb3IgcmV1c2luZyBlbGVtZW50cyAodHJhY2sgYnkgaWQpLlxuICAgIGNvbnN0IHRyYWNrUGxhY2VJZCA9IGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZUNvYWNoRGVja0luZGV4O1xuICAgIHJldHVybiBodG1sYCR7cmVwZWF0KFxuICAgICAgcGxhY2VzLFxuICAgICAgKHBsYWNlKSA9PiB0cmFja1BsYWNlSWQgKyAnLScgKyBwbGFjZS5udW1iZXIsXG4gICAgICAocGxhY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24ocGxhY2UuZGltZW5zaW9uKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZFBvc2l0aW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkUG9zaXRpb24ocGxhY2UucG9zaXRpb24pO1xuICAgICAgICBjb25zdCByb3RhdGlvbiA9IHBsYWNlLnJvdGF0aW9uIHx8IDA7XG4gICAgICAgIGNvbnN0IHRleHRSb3RhdGlvbiA9IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IC05MCA6IDA7XG4gICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKGRlY2tJbmRleCwgY29hY2hJbmRleCwgcGxhY2UubnVtYmVyKTtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBpZD1cImNlbGwtJHtkZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtwbGFjZS5wb3NpdGlvbi55fS0ke2luZGV4fVwiXG4gICAgICAgICAgICBjbGFzcz1cImdyYXBoaWNhbC1lbGVtZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbFxuICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXRleHQtc2NhbGUtdmFsdWUnOiBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtd2lkdGgnOiBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1oZWlnaHQnOiBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10b3AnOiBjYWxjdWxhdGVkUG9zaXRpb24ueSxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLWxlZnQnOiBjYWxjdWxhdGVkUG9zaXRpb24ueCxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXJvdGF0aW9uJzogcm90YXRpb24sXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10ZXh0LXJvdGF0aW9uJzogdGV4dFJvdGF0aW9uLFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgQHNlbGVjdHBsYWNlPSR7KHNlbGVjdFBsYWNlRXZlbnQ6IEN1c3RvbUV2ZW50PFBsYWNlU2VsZWN0aW9uPikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9vblNlbGVjdFBsYWNlKHNlbGVjdFBsYWNlRXZlbnQpfVxuICAgICAgICAgICAgICBleHBvcnRwYXJ0cz1cInNiYi1zci1wbGFjZS1wYXJ0XCJcbiAgICAgICAgICAgICAgaWQ9JHtwbGFjZUlkfVxuICAgICAgICAgICAgICBjbGFzcz1cInNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbFwiXG4gICAgICAgICAgICAgIHRleHQ9JHtwbGFjZS5udW1iZXJ9XG4gICAgICAgICAgICAgIHR5cGU9JHtwbGFjZS50eXBlfVxuICAgICAgICAgICAgICBzdGF0ZT0ke3BsYWNlLnN0YXRlfVxuICAgICAgICAgICAgICB0cmF2ZWwtZGlyZWN0aW9uPSR7dGhpcy50cmF2ZWxEaXJlY3Rpb259XG4gICAgICAgICAgICAgIGNvYWNoLWluZGV4PSR7Y29hY2hJbmRleH1cbiAgICAgICAgICAgICAgZGVjay1pbmRleD0ke3BsYWNlQ29hY2hEZWNrSW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtZGVjay1pbmRleD0ke2RlY2tJbmRleH1cbiAgICAgICAgICAgICAgLnByb3BlcnR5SWRzPSR7cGxhY2UucHJvcGVydHlJZHN9XG4gICAgICAgICAgICAgIC5wcmV2ZW50Q2xpY2s9JHt0aGlzLnByZXZlbnRQbGFjZUNsaWNrfVxuICAgICAgICAgICAgICA/c2hvd1RpdGxlSW5mbz1cIiR7dGhpcy5zaG93VGl0bGVJbmZvfVwiXG4gICAgICAgICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIGA7XG4gICAgICB9LFxuICAgICl9YDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkQ29hY2hFbGVtZW50cyhcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGNvbnN0IGN1cnJDb2FjaFN0cnVjdHVyZSA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrc1tjb2FjaERlY2tJbmRleF0uZGVja0NvYWNoZXNbY29hY2hJbmRleF07XG5cbiAgICByZXR1cm4gY3VyckNvYWNoU3RydWN0dXJlLm90aGVyRWxlbWVudHMubWFwKChncmFwaGljRWxlbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIGh0bWxgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBncmFwaGljRWxlbWVudC5kaW1lbnNpb24udyxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGdyYXBoaWNFbGVtZW50LmRpbWVuc2lvbi5oLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wJzogZ3JhcGhpY0VsZW1lbnQucG9zaXRpb24ueSxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQnOiBncmFwaGljRWxlbWVudC5wb3NpdGlvbi54LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcm90YXRpb24nOiBncmFwaGljRWxlbWVudC5yb3RhdGlvbixcbiAgICAgICAgfSl9XG4gICAgICAgIG5hbWU9JHtncmFwaGljRWxlbWVudC5pY29uID8/IG5vdGhpbmd9XG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID9zdHJldGNoPSR7dHJ1ZX1cbiAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+YDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkQXJlYUVsZW1lbnRzKFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgY29uc3QgY3VyckNvYWNoU3RydWN0dXJlID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW2NvYWNoRGVja0luZGV4XS5kZWNrQ29hY2hlc1tjb2FjaEluZGV4XTtcblxuICAgIHJldHVybiBjdXJyQ29hY2hTdHJ1Y3R1cmUuYXJlYUVsZW1lbnRzLm1hcCgoZ3JhcGhpY0VsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHRyaWdnZXJJZCA9IGBwb3BvdmVyLXRyaWdnZXItJHtjb2FjaERlY2tJbmRleH0tJHtjb2FjaEluZGV4fS0ke2dyYXBoaWNFbGVtZW50LnBvc2l0aW9uLnh9LSR7Z3JhcGhpY0VsZW1lbnQucG9zaXRpb24ueX1gO1xuICAgICAgY29uc3QgaXNOb3RUYWJsZUdyYXBoaWMgPSBncmFwaGljRWxlbWVudC5pY29uPy5pbmRleE9mKCdUQUJMRScpID09PSAtMTtcbiAgICAgIGNvbnN0IGFyZWFQcm9wZXJ0eSA9IGdyYXBoaWNFbGVtZW50Lmljb24gJiYgaXNOb3RUYWJsZUdyYXBoaWMgPyBncmFwaGljRWxlbWVudC5pY29uIDogbnVsbDtcbiAgICAgIGNvbnN0IGFyaWFMYWJlbEZvckFyZWEgPSBncmFwaGljRWxlbWVudC5pY29uXG4gICAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihncmFwaGljRWxlbWVudC5pY29uLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KVxuICAgICAgICA6IG5vdGhpbmc7XG5cbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYVxuICAgICAgICAgIGlkPVwiJHt0cmlnZ2VySWR9XCJcbiAgICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgJ3NiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtLWN1cnNvci1wb2ludGVyJzogYXJlYVByb3BlcnR5ICE9PSBudWxsLFxuICAgICAgICAgIH0pfVwiXG4gICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLXdpZHRoJzogZ3JhcGhpY0VsZW1lbnQuZGltZW5zaW9uLncsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLWhlaWdodCc6IGdyYXBoaWNFbGVtZW50LmRpbWVuc2lvbi5oLFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS10b3AnOiBncmFwaGljRWxlbWVudC5wb3NpdGlvbi55LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS1sZWZ0JzogZ3JhcGhpY0VsZW1lbnQucG9zaXRpb24ueCxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtei1pbmRleCc6IGdyYXBoaWNFbGVtZW50LnBvc2l0aW9uLnosXG4gICAgICAgICAgfSl9XG4gICAgICAgICAgbW91bnRpbmc9JHtncmFwaGljRWxlbWVudC5tb3VudGluZyA/PyBub3RoaW5nfVxuICAgICAgICAgIGJhY2tncm91bmQ9XCJkYXJrXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgJHthcmVhUHJvcGVydHlcbiAgICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LXdpZHRoJzogdGhpcy5nbG9iYWxBcmVhSWNvbkRpbS53LFxuICAgICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLW1heC1oZWlnaHQnOiB0aGlzLmdsb2JhbEFyZWFJY29uRGltLmgsXG4gICAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBncmFwaGljRWxlbWVudC5kaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBncmFwaGljRWxlbWVudC5kaW1lbnNpb24uaCxcbiAgICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IGdyYXBoaWNFbGVtZW50LnJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXBhZGRpbmctcGVyY2VudCc6XG4gICAgICAgICAgICAgICAgICAgICAgYXJlYVByb3BlcnR5ICE9PSAnRU5UUllfRVhJVCcgPyB0aGlzLmdsb2JhbEFyZWFJY29uUGFkZGluZyA6IDEsXG4gICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgIG5hbWU9JHthcmVhUHJvcGVydHl9XG4gICAgICAgICAgICAgICAgICByb2xlPVwiaW1nXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi1zci1ncmFwaGljX19kaW1lbnNpb24tLXNxdWFyZS1kaW1cIlxuICAgICAgICAgICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+XG4gICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgPC9zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhPlxuICAgICAgICAke2FyZWFQcm9wZXJ0eSA/IHRoaXMuX3BvcG92ZXIodHJpZ2dlcklkLCBhcmlhTGFiZWxGb3JBcmVhKSA6IG5vdGhpbmd9XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRTZXJ2aWNlRWxlbWVudHMoXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBjb25zdCBjdXJyQ29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUuZGVja3NbY29hY2hEZWNrSW5kZXhdLmRlY2tDb2FjaGVzW2NvYWNoSW5kZXhdO1xuXG4gICAgcmV0dXJuIGN1cnJDb2FjaFN0cnVjdHVyZS5zZXJ2aWNlRWxlbWVudHMubWFwKChzZXJ2aWNlRWxlbWVudDogQmFzZUVsZW1lbnQpID0+IHtcbiAgICAgIC8vZ2VuZXJhdGUgdW5pcXVlIGluZGV4IG51bWJlciBmb3IgdGhlIHRyaWdnZXIgZWxlbWVudFxuICAgICAgY29uc3QgdHJpZ2dlcklkID0gYHBvcG92ZXItdHJpZ2dlci0ke2NvYWNoRGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7c2VydmljZUVsZW1lbnQucG9zaXRpb24ueH0tJHtzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbi55fWA7XG4gICAgICBjb25zdCB0aXRsZURlc2NyaXB0aW9uID0gc2VydmljZUVsZW1lbnQuaWNvblxuICAgICAgICA/IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oc2VydmljZUVsZW1lbnQuaWNvbiwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudClcbiAgICAgICAgOiBudWxsO1xuXG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgICBpZD1cIiR7dHJpZ2dlcklkfVwiXG4gICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogc2VydmljZUVsZW1lbnQuZGltZW5zaW9uLncsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IHNlcnZpY2VFbGVtZW50LmRpbWVuc2lvbi5oLFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiBzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbi55LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0Jzogc2VydmljZUVsZW1lbnQucG9zaXRpb24ueCxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IHNlcnZpY2VFbGVtZW50LnJvdGF0aW9uLFxuICAgICAgICAgIH0pfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy0tY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIG5hbWU9JHtzZXJ2aWNlRWxlbWVudC5pY29uID8/IG5vdGhpbmd9XG4gICAgICAgICAgcm9sZT1cImltZ1wiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgJHt0aGlzLl9wb3BvdmVyKHRyaWdnZXJJZCwgdGl0bGVEZXNjcmlwdGlvbil9XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmFnZXMgdGhlIHNlbGVjdGVkIHBsYWNlIGV2ZW50IHRyaWdnZXJlZCBmcm9tIHRoZSBwbGFjZVxuICAgKiBFYWNoIHNlbGVjdGlvbiBlbWl0cyBhbiBhcnJheSBvZiBhbGwgc2VsZWN0ZWQgcGxhY2VzXG4gICAqIEBwYXJhbSBzZWxlY3RQbGFjZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIF9vblNlbGVjdFBsYWNlKHNlbGVjdFBsYWNlRXZlbnQ6IEN1c3RvbUV2ZW50PFBsYWNlU2VsZWN0aW9uPik6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2UgPSBzZWxlY3RQbGFjZUV2ZW50LmRldGFpbDtcbiAgICAvLyBXZSBoYXZlIHRvIHNldCBwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgdG8gdHJ1ZSwgdG8gcHJldmVudCBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBuZXcgZm9jdXNlZCBwbGFjZVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIC8vIENoZWNrIGFueSBrZXlib2FyZCBldmVudCB3YXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQsXG4gICAgLy8gc28gd2UgY2FuIHNheSB0aGUgbmF0aXZlIGJyb3dzZXIgZm9jdXMgbGllcyBvbiB0aGUgY29tcG9uZW50XG4gICAgaWYgKCF0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJldmVudFBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIEFkZCBwbGFjZSB0byBwbGFjZSBjb2xsZWN0aW9uXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHNlbGVjdGVkUGxhY2UpO1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRQbGFjZUluQ29hY2goc2VsZWN0ZWRQbGFjZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25TZWxlY3ROYXZDb2FjaChldmVudDogQ3VzdG9tRXZlbnQ8bnVtYmVyPik6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkTmF2Q29hY2hJbmRleCA9IGV2ZW50LmRldGFpbDtcblxuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSB0cnVlO1xuXG4gICAgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gbnVsbCAmJiBzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROYXZDb2FjaEluZGV4ID09PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfVxuXG4gICAgLy9jbG9zZSBhbGwgb3BlbmVkIHBvcG92ZXJzXG4gICAgdGhpcy5fY2xvc2VQb3BvdmVyKCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkZvY3VzTmF2Q29hY2goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykge1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwb3BvdmVyIGZvciBleHRyYSBzZXJ2aWNlIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB0cmlnZ2VySWRcbiAgICogQHBhcmFtIHBvcG92ZXJDb250ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9wb3BvdmVyKFxuICAgIHRyaWdnZXJJZDogc3RyaW5nLFxuICAgIHBvcG92ZXJDb250ZW50OiBzdHJpbmcgfCBudWxsIHwgdHlwZW9mIG5vdGhpbmcsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItcG9wb3ZlciB0cmlnZ2VyPVwiJHt0cmlnZ2VySWR9XCIgaG92ZXItdHJpZ2dlcj1cIlwiPlxuICAgICAgICA8cCBjbGFzcz1cInNiYi10ZXh0LXMgc2JiLXNyLXBvcG92ZXJcIj4ke3BvcG92ZXJDb250ZW50fTwvcD5cbiAgICAgIDwvc2JiLXBvcG92ZXI+XG4gICAgYDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyIHRvIGNsb3NlIGFsbCBvcGVuZWQgcG9wb3ZlcnMgKG5vcm1hbGx5IG9ubHkgb25lIGlzIG9wZW5lZCBhdCBhIHRpbWUpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9jbG9zZVBvcG92ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGw8U2JiUG9wb3ZlckVsZW1lbnQ+KCdzYmItcG9wb3ZlcjpzdGF0ZShzdGF0ZS1vcGVuZWQpJylcbiAgICAgIC5mb3JFYWNoKChwb3BvdmVyKSA9PiBwb3BvdmVyLmNsb3NlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGVzY3JpcHRpb25UYWJsZUNvYWNoKGNvYWNoSXRlbTogQ29hY2hJdGVtKTogc3RyaW5nIHtcbiAgICAvL3Nob3cgZGlmZmVyZW50IHRhYmxlIGNhcHRpb24gZm9yIHNjcmVlbnJlYWRlciBpZiBpdCBpcyBhIGxvY29tb3RpdmVcbiAgICBpZiAoY29hY2hJdGVtLnR5cGUgPT09ICdMT0NPTU9USVZFX0NPQUNIJykge1xuICAgICAgcmV0dXJuIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0xPQ09NT1RJVkUnLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIWNvYWNoSXRlbS5wbGFjZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0JMT0NLRURfVEFCTEVfQ0FQVElPTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsIFtcbiAgICAgICAgY29hY2hJdGVtLmlkLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgbGV0IHRhYmxlQ29hY2hEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbnN0IGFyZWFEZXNjcmlwdGlvbnMgPSB0aGlzLl9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzISk7XG4gICAgY29uc3Qgc2VydmljZURlc2NyaXB0aW9ucyA9IHRoaXMuX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMhKTtcblxuICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX1RBQkxFX0NBUFRJT04nLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LCBbXG4gICAgICBjb2FjaEl0ZW0uaWQsXG4gICAgXSk7XG5cbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgLy8gRXhwYW5kcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBzZWF0cyBhbmQgYmljeWNsZSBzcGFjZXMgYXMgaW5mb1xuICAgICAgY29uc3QgZnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaEl0ZW0ucGxhY2VzKTtcbiAgICAgIGNvbnN0IGZyZWVQbGFjZXNUeHQgPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAnQ09BQ0hfQVZBSUxBQkxFX05VTUJFUl9PRl9QTEFDRVMnLFxuICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICBbZnJlZVBsYWNlcy5zZWF0cywgZnJlZVBsYWNlcy5iaWN5Y2xlc10sXG4gICAgICApO1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uID0gdGFibGVDb2FjaERlc2NyaXB0aW9uLmNvbmNhdCgnLiAnKS5jb25jYXQoZnJlZVBsYWNlc1R4dCkuY29uY2F0KCcuICcpO1xuICAgIH1cblxuICAgIGlmICghIWFyZWFEZXNjcmlwdGlvbnMgfHwgISFzZXJ2aWNlRGVzY3JpcHRpb25zKSB7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gKz1cbiAgICAgICAgJy4gJyArIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0FWQUlMQUJMRV9TRVJWSUNFUycsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpICsgJzogJztcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiArPSBzZXJ2aWNlRGVzY3JpcHRpb25zICsgJywgJyArIGFyZWFEZXNjcmlwdGlvbnMgKyAnLic7XG4gICAgfVxuICAgIHJldHVybiB0YWJsZUNvYWNoRGVzY3JpcHRpb247XG4gIH1cblxuICBwcml2YXRlIF9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhkZXNjcmlwdGlvbnNFbGVtZW50czogQmFzZUVsZW1lbnRbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgdW5pcXVlRGVzY3JpcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uc0VsZW1lbnRzXG4gICAgICA/Lm1hcCgoZGVzY3JpcHRpb25FbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGljb24gPSBkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbjtcbiAgICAgICAgaWYgKCFpY29uKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCA9IHVuaXF1ZURlc2NyaXB0aW9ucy5pbmRleE9mKGljb24pID4gLTE7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbiEsXG4gICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZERlc2NyaXB0aW9uID1cbiAgICAgICAgICB0aGlzLm5vdEZpeGVkUm90YXRhYmxlQXJlYUljb25zLmluZGV4T2YoaWNvbikgPT09IC0xICYmXG4gICAgICAgICAgdGhpcy5ub3RBcmVhRWxlbWVudHMuaW5kZXhPZihpY29uKSA9PT0gLTE7XG5cbiAgICAgICAgaWYgKCFkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCkge1xuICAgICAgICAgIHVuaXF1ZURlc2NyaXB0aW9ucy5wdXNoKGRlc2NyaXB0aW9uRWxlbWVudC5pY29uISk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEhdHJhbnNsYXRpb24gJiYgIWRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0ICYmIGlzVmFsaWREZXNjcmlwdGlvbiA/IHRyYW5zbGF0aW9uIDogbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChkZXNjcmlwdGlvbikgPT4gISFkZXNjcmlwdGlvbilcbiAgICAgIC5qb2luKCcsICcpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItc2VhdC1yZXNlcnZhdGlvbic6IFNiYlNlYXRSZXNlcnZhdGlvbkVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ29DQSxJQUFhLDRCQUFiLGNBQStDLDJCQUEwQjtDQUF6RSxjQUFBOztBQWlCVSxPQUFBLFlBQVksSUFBSSxzQkFBc0IsS0FBSzs7O0FBaEJuQixPQUFBLGNBQXNCOzs7QUFDL0IsT0FBQSxzQkFBd0M7R0FDN0Q7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDRDs7O0FBQ3NCLE9BQUEsU0FBeUI7R0FDOUM7R0FDQTtHQUNBLFVBQVUseUJBQUE7R0FDWDs7Q0FLa0IsV0FBVyxtQkFBdUM7QUFDbkUsUUFBTSxXQUFXLGtCQUFrQjtBQUVuQyxNQUFJLGtCQUFrQixJQUFJLGdCQUFnQixDQUN4QyxLQUFJLEtBQUssY0FDUCxNQUFLLFlBQ0QsaUJBQWlCLFFBQVEsQ0FDMUIsU0FBUyxVQUFVLE1BQU0sZ0JBQWdCLFdBQVcsQ0FBQztNQUV4RCxNQUFLLFlBQ0QsaUJBQWlCLFFBQVEsQ0FDMUIsU0FBUyxVQUFVLE1BQU0sYUFBYSxZQUFZLElBQUksQ0FBQzs7Q0FLN0MsYUFBYSxtQkFBdUM7QUFDckUsUUFBTSxhQUFhLGtCQUFrQjtBQUdyQyxPQUFLLGVBQWUsV0FBVTtBQUM1QixRQUFLLHNDQUFzQztJQUMzQzs7Q0FHZSxTQUFNO0FBQ3ZCLE9BQUsseUNBQXlDO0FBQzlDLFNBQU8sS0FBSyx3QkFBd0I7O0NBRzlCLDBDQUF1QztBQUM3QyxPQUFLLHVCQUF1QixJQUFJO1FBQzVCLEtBQUssd0JBQXdCLENBQUE7O1VBRTNCLEtBQUssbUJBQW1C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
@@ -9,7 +9,7 @@ import { t as SbbSeatReservationNavigationServicesElement } from "./seat-reserva
9
9
  import { t as SbbSeatReservationPlaceControlElement } from "./seat-reservation-place-control.component-BfuOGZYq.js";
10
10
  import { t as SbbSeatReservationScopedElement } from "./seat-reservation-scoped.component-D-Mvw-Q3.js";
11
11
  import { SeatReservationBaseElement } from "./seat-reservation/seat-reservation/seat-reservation-base-element.js";
12
- import { t as SbbSeatReservationElement } from "./seat-reservation.component-B2nJ13F1.js";
12
+ import { t as SbbSeatReservationElement } from "./seat-reservation.component-B-n0sIL5.js";
13
13
  import "./seat-reservation.pure.js";
14
14
  //#region src/elements-experimental/seat-reservation.ts
15
15
  /** @entrypoint */
@@ -10,5 +10,5 @@ import { t as SbbSeatReservationNavigationServicesElement } from "./seat-reserva
10
10
  import { t as SbbSeatReservationPlaceControlElement } from "./seat-reservation-place-control.component-BfuOGZYq.js";
11
11
  import { t as SbbSeatReservationScopedElement } from "./seat-reservation-scoped.component-D-Mvw-Q3.js";
12
12
  import { SeatReservationBaseElement } from "./seat-reservation/seat-reservation/seat-reservation-base-element.js";
13
- import { t as SbbSeatReservationElement } from "./seat-reservation.component-B2nJ13F1.js";
13
+ import { t as SbbSeatReservationElement } from "./seat-reservation.component-B-n0sIL5.js";
14
14
  export { SbbSeatReservationAreaElement, SbbSeatReservationElement, SbbSeatReservationGraphicElement, SbbSeatReservationNavigationCoachElement, SbbSeatReservationNavigationServicesElement, SbbSeatReservationPlaceControlElement, SbbSeatReservationScopedElement, SeatReservationBaseElement, getI18nSeatReservation, mapCoachInfosToCoachSelection, mapIconToSvg, mapPlaceAndCoachToSeatReservationPlaceSelection, mapPlaceInfosToPlaceSelection, mapRawDataToSeatReservation, svgs };
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@sbb-esta/lyne-elements-experimental-dev",
3
- "version": "5.0.0-next.2-dev.1778105104",
3
+ "version": "5.0.0-next.2-dev.1778136155",
4
4
  "description": "Lyne Design System",
5
5
  "keywords": [
6
6
  "design system",
7
7
  "web components",
8
8
  "lit",
9
9
  "storybook",
10
- "https://github.com/sbb-design-systems/lyne-components/commit/04aa23f2d878d9c44bb26d80461f19a28d5b7501"
10
+ "https://github.com/sbb-design-systems/lyne-components/commit/268efc25506e3e2edd863f2705e9b4fad0ab85db"
11
11
  ],
12
12
  "type": "module",
13
13
  "exports": {
@@ -398,7 +398,7 @@ var ne = 3, re = [
398
398
  willUpdate(e) {
399
399
  if (super.willUpdate(e), e.has("seatReservations") && (this.hasMultipleDecks = this.seatReservations?.length > 1, this._initPrepareSeatReservationData(), this._initSeatReservationPlaceSelection(), this.initNavigationSelectionByScrollEvent()), e.has("baseGridSize") && (this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize, this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`), this._initPrepareSeatReservationData(), this.initNavigationSelectionByScrollEvent()), e.has("height") && this.height) {
400
400
  let e = this.seatReservations[this.currSelectedDeckIndex] || null;
401
- e?.coachItems.length && (this.baseGridSize = Math.round(this.height / e.coachItems[0].dimension.h), this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize, this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`), this._initPrepareSeatReservationData(), this.initNavigationSelectionByScrollEvent());
401
+ e?.coachItems.length && (this.baseGridSize = this.height / e.coachItems[0].dimension.h, this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize, this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`), this._initPrepareSeatReservationData(), this.initNavigationSelectionByScrollEvent());
402
402
  }
403
403
  e.has("alignVertical") && (this._initPrepareSeatReservationData(), this.initNavigationSelectionByScrollEvent()), e.has("preselectCoachIndex") && (this._isRunningInitPreselectCoachIndex = !0, setTimeout(() => this.scrollToSelectedNavCoach(this.preselectCoachIndex), 1));
404
404
  }
@@ -539,8 +539,8 @@ var ne = 3, re = [
539
539
  }
540
540
  getCalculatedDimension(e, t, n, r) {
541
541
  return t && !n && (e.h += this.coachBorderOffset * 2), r && (e.h += this.coachBorderOffset), {
542
- w: this.baseGridSize * e.w,
543
- h: this.baseGridSize * e.h
542
+ w: Math.round(this.baseGridSize * e.w),
543
+ h: Math.round(this.baseGridSize * e.h)
544
544
  };
545
545
  }
546
546
  getCalculatedPosition(e, t, n, r) {
@@ -549,8 +549,8 @@ var ne = 3, re = [
549
549
  e.y === 0 ? e.y -= this.coachBorderOffset : e.y + t.h === i && (e.y += this.coachBorderOffset);
550
550
  }
551
551
  return {
552
- x: this.baseGridSize * e.x,
553
- y: this.baseGridSize * e.y,
552
+ x: Math.round(this.baseGridSize * e.x),
553
+ y: Math.round(this.baseGridSize * e.y),
554
554
  z: e.z
555
555
  };
556
556
  }
@@ -867,7 +867,7 @@ var ne = 3, re = [
867
867
  let n = e.icon?.indexOf("TABLE") === -1, a = e.icon && n ? e.icon : null, o = this.isElementDirectlyOnBorder(e, t) && a !== "ENTRY_EXIT";
868
868
  e.position.y === 0 ? (c = "upper-border", i.y -= this.coachBorderOffset - this.coachBorderOffset / 3) : e.position.y + e.dimension.h === t.h && (c = "lower-border", o || (i.y += this.coachBorderOffset - this.coachBorderOffset / 3)), o && (r.h += this.coachBorderOffset - this.coachBorderOffset / 3);
869
869
  } else e.position.y === 0 && (i.y -= this.coachBorderOffset), t.h === e.position.y + e.dimension.h && (r.h += this.coachBorderOffset * 2);
870
- return r.w *= this.baseGridSize, r.h *= this.baseGridSize, i.x *= this.baseGridSize, i.y *= this.baseGridSize, {
870
+ return r.w = Math.round(r.w * this.baseGridSize), r.h = Math.round(r.h * this.baseGridSize), i.x = Math.round(i.x * this.baseGridSize), i.y = Math.round(i.y * this.baseGridSize), {
871
871
  icon: e.icon && e.icon.endsWith("DRIVER_AREA") ? e.icon?.concat("_", this.seatReservations[this.currSelectedDeckIndex].vehicleType) : e.icon,
872
872
  rotation: s,
873
873
  dimension: r,
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../seat-reservation.component-CB2IWgM9.js";
1
+ import { t as e } from "../../seat-reservation.component-RNI6_X71.js";
2
2
  export { e as SbbSeatReservationElement };
@@ -155,11 +155,11 @@ var y = ":host{--sbb-seat-reservation-grid-size: 16px;--sbb-seat-reservation-hei
155
155
  `);
156
156
  }
157
157
  _renderCoachElement(e, t, n, r) {
158
- let i = this.getCalculatedDimension(e.dimension), o = this._getDescriptionTableCoach(e);
158
+ let i = this.seatReservationStructure.decks[n].deckCoaches[t], o = this._getDescriptionTableCoach(e);
159
159
  return a`<sbb-seat-reservation-scoped
160
160
  style=${l({
161
- "--sbb-seat-reservation-scoped-width": i.w,
162
- "--sbb-seat-reservation-scoped-height": i.h
161
+ "--sbb-seat-reservation-scoped-width": i.width,
162
+ "--sbb-seat-reservation-scoped-height": i.height
163
163
  })}
164
164
  >
165
165
  ${this._getRenderedCoachBorders(e, n, t)}
@@ -9,7 +9,7 @@ import { t as u } from "./seat-reservation-navigation-services.component-CfAQa7p
9
9
  import { t as d } from "./seat-reservation-place-control.component-DrzEDW8Z.js";
10
10
  import { t as f } from "./seat-reservation-scoped.component-BohQUGVW.js";
11
11
  import { SeatReservationBaseElement as p } from "./seat-reservation/seat-reservation/seat-reservation-base-element.js";
12
- import { t as m } from "./seat-reservation.component-CB2IWgM9.js";
12
+ import { t as m } from "./seat-reservation.component-RNI6_X71.js";
13
13
  import "./seat-reservation.pure.js";
14
14
  m.define(), s.define(), c.define(), l.define(), u.define(), d.define(), f.define();
15
15
  //#endregion
@@ -10,5 +10,5 @@ import { t as u } from "./seat-reservation-navigation-services.component-CfAQa7p
10
10
  import { t as d } from "./seat-reservation-place-control.component-DrzEDW8Z.js";
11
11
  import { t as f } from "./seat-reservation-scoped.component-BohQUGVW.js";
12
12
  import { SeatReservationBaseElement as p } from "./seat-reservation/seat-reservation/seat-reservation-base-element.js";
13
- import { t as m } from "./seat-reservation.component-CB2IWgM9.js";
13
+ import { t as m } from "./seat-reservation.component-RNI6_X71.js";
14
14
  export { s as SbbSeatReservationAreaElement, m as SbbSeatReservationElement, c as SbbSeatReservationGraphicElement, l as SbbSeatReservationNavigationCoachElement, u as SbbSeatReservationNavigationServicesElement, d as SbbSeatReservationPlaceControlElement, f as SbbSeatReservationScopedElement, p as SeatReservationBaseElement, o as getI18nSeatReservation, r as mapCoachInfosToCoachSelection, i as mapIconToSvg, t as mapPlaceAndCoachToSeatReservationPlaceSelection, n as mapPlaceInfosToPlaceSelection, e as mapRawDataToSeatReservation, a as svgs };