@sbb-esta/lyne-elements-experimental 2.11.1 → 2.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/core/datetime/date-helper.js +142 -142
  2. package/core/timetable/access-leg-helper.js +49 -52
  3. package/core/timetable/timetable-helper.js +7 -8
  4. package/development/core/datetime/date-helper.js +10 -10
  5. package/development/core/timetable/access-leg-helper.js +12 -15
  6. package/development/core/timetable/timetable-helper.js +6 -7
  7. package/development/{differenceInMinutes-CHSyWiQs.js → differenceInMinutes-D5Nj8Stc.js} +3 -3
  8. package/development/{format-D0-yhzi4.js → format-BQfaa1ZT.js} +22 -26
  9. package/development/{isValid-Bo4R7iA7.js → isValid-DvieCZVi.js} +3 -3
  10. package/development/journey-summary/journey-summary.component.js +4 -5
  11. package/development/pearl-chain/pearl-chain.component.d.ts.map +1 -1
  12. package/development/pearl-chain/pearl-chain.component.js +28 -39
  13. package/development/pearl-chain-time/pearl-chain-time.component.js +5 -6
  14. package/development/pearl-chain-vertical/pearl-chain-vertical.component.js +1 -1
  15. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +1 -1
  16. package/development/seat-reservation/common/mapper/icon-mapper.js +1 -1
  17. package/development/seat-reservation/common/mapper/mapper.js +14 -16
  18. package/development/seat-reservation/common/mapper/seat-reservation-sample-data.js +1 -1
  19. package/development/seat-reservation/common/svgs.js +1 -1
  20. package/development/seat-reservation/common/translations/i18n.js +2 -3
  21. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +22 -33
  22. package/development/seat-reservation/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +6 -7
  23. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +16 -23
  24. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  25. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +2 -3
  26. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +7 -8
  27. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +7 -11
  28. package/development/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +2 -3
  29. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +4 -5
  30. package/development/timetable-duration/timetable-duration.component.js +1 -1
  31. package/development/timetable-row/timetable-row.component.js +58 -89
  32. package/differenceInMinutes-CP_C5onR.js +23 -0
  33. package/{format-Dg8rkk7h.js → format-lqeCzmzS.js} +438 -442
  34. package/isValid-Ceq2O0NQ.js +45 -0
  35. package/journey-summary/journey-summary.component.js +3 -4
  36. package/package.json +2 -2
  37. package/pearl-chain/pearl-chain.component.d.ts.map +1 -1
  38. package/pearl-chain/pearl-chain.component.js +78 -95
  39. package/pearl-chain-time/pearl-chain-time.component.js +44 -45
  40. package/seat-reservation/common/mapper/mapper.js +50 -54
  41. package/seat-reservation/common/translations/i18n.js +5 -6
  42. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +104 -115
  43. package/seat-reservation/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +40 -41
  44. package/seat-reservation/seat-reservation/seat-reservation.component.js +78 -87
  45. package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +15 -18
  46. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +58 -59
  47. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +71 -75
  48. package/seat-reservation/seat-reservation-navigation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +12 -13
  49. package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +23 -24
  50. package/timetable-row/timetable-row.component.js +207 -247
  51. package/differenceInMinutes-BMqUZdhj.js +0 -23
  52. package/isValid-DJ69OMZJ.js +0 -45
@@ -159,14 +159,13 @@ let SeatReservationBaseElement = (() => {
159
159
  __privateSet(this, _focusedCoachIndex_accessor_storage, value);
160
160
  }
161
161
  willUpdate(changedProperties) {
162
- var _a2, _b;
163
162
  super.willUpdate(changedProperties);
164
163
  if (changedProperties.has("seatReservation")) {
165
164
  this._initSeatReservationPlaceSelection();
166
165
  }
167
166
  if (changedProperties.has("baseGridSize")) {
168
167
  this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
169
- (_a2 = this.style) == null ? void 0 : _a2.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
168
+ this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
170
169
  if (this.alignVertical) {
171
170
  this._setVerticalAlignmentOffset();
172
171
  }
@@ -175,7 +174,7 @@ let SeatReservationBaseElement = (() => {
175
174
  if (this.seatReservation.coachItems.length) {
176
175
  this.baseGridSize = this.height / this.seatReservation.coachItems[0].dimension.h;
177
176
  this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
178
- (_b = this.style) == null ? void 0 : _b.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
177
+ this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
179
178
  if (this.alignVertical) {
180
179
  this._setVerticalAlignmentOffset();
181
180
  }
@@ -187,10 +186,9 @@ let SeatReservationBaseElement = (() => {
187
186
  }
188
187
  /* Init scroll event handling for coach navigation */
189
188
  initNavigationSelectionByScrollEvent() {
190
- var _a2, _b, _c;
191
- this.firstTabElement = (_a2 = this.shadowRoot) == null ? void 0 : _a2.getElementById("first-tab-element");
192
- this.lastTabElement = (_b = this.shadowRoot) == null ? void 0 : _b.getElementById("last-tab-element");
193
- this.coachScrollArea = (_c = this.shadowRoot) == null ? void 0 : _c.getElementById("sbb-sr__parent-area");
189
+ this.firstTabElement = this.shadowRoot?.getElementById("first-tab-element");
190
+ this.lastTabElement = this.shadowRoot?.getElementById("last-tab-element");
191
+ this.coachScrollArea = this.shadowRoot?.getElementById("sbb-sr__parent-area");
194
192
  if (this.coachScrollArea) {
195
193
  let currCalcTriggerPos = 0;
196
194
  this.scrollCoachsAreaWidth = this.coachScrollArea.getBoundingClientRect().width;
@@ -343,10 +341,9 @@ let SeatReservationBaseElement = (() => {
343
341
  * Sets the focus on the HTML table (grid) caption element so that the heading is read out when using a ScreenReader.
344
342
  */
345
343
  _setFocusToSelectedCoachGrid() {
346
- var _a2;
347
344
  if (this.isCoachGridFocusable) {
348
345
  this.isCoachGridFocusable = false;
349
- const coachTableCaptionElement = (_a2 = this.shadowRoot) == null ? void 0 : _a2.querySelector("#sbb-sr-coach-caption-" + this.currSelectedCoachIndex);
346
+ const coachTableCaptionElement = this.shadowRoot?.querySelector("#sbb-sr-coach-caption-" + this.currSelectedCoachIndex);
350
347
  if (coachTableCaptionElement) {
351
348
  coachTableCaptionElement.focus();
352
349
  }
@@ -377,13 +374,12 @@ let SeatReservationBaseElement = (() => {
377
374
  * @returns Place or null
378
375
  */
379
376
  _getFirstPlaceInSelecedCoach() {
380
- var _a2, _b, _c, _d, _e;
381
377
  let firstPlace = null;
382
- const coach = (_a2 = this.seatReservation) == null ? void 0 : _a2.coachItems[this.currSelectedCoachIndex];
378
+ const coach = this.seatReservation?.coachItems[this.currSelectedCoachIndex];
383
379
  const firstCellId = "cell-" + this.currSelectedCoachIndex + "-0-0";
384
- const placeNumber = ((_d = (_c = (_b = this.shadowRoot) == null ? void 0 : _b.querySelector("[cell-id='" + firstCellId + "']")) == null ? void 0 : _c.querySelector("sbb-seat-reservation-place-control")) == null ? void 0 : _d.getAttribute("text")) || null;
380
+ const placeNumber = this.shadowRoot?.querySelector("[cell-id='" + firstCellId + "']")?.querySelector("sbb-seat-reservation-place-control")?.getAttribute("text") || null;
385
381
  if (coach && placeNumber) {
386
- firstPlace = ((_e = coach.places) == null ? void 0 : _e.find((place) => place.number === placeNumber)) || null;
382
+ firstPlace = coach.places?.find((place) => place.number === placeNumber) || null;
387
383
  }
388
384
  return firstPlace;
389
385
  }
@@ -394,8 +390,7 @@ let SeatReservationBaseElement = (() => {
394
390
  * @returns Place or null
395
391
  */
396
392
  _getClosestPlaceByKeyDirection(pressedKey) {
397
- var _a2, _b, _c, _d, _e;
398
- const coach = (_a2 = this.seatReservation) == null ? void 0 : _a2.coachItems[this.currSelectedCoachIndex];
393
+ const coach = this.seatReservation?.coachItems[this.currSelectedCoachIndex];
399
394
  let closestPlace = null;
400
395
  if (coach.places) {
401
396
  if (!this.currSelectedPlaceElementId) {
@@ -404,20 +399,20 @@ let SeatReservationBaseElement = (() => {
404
399
  if (this.currSelectedPlace) {
405
400
  for (const place of coach.places) {
406
401
  if (!pressedKey) {
407
- if (this.currScrollDirection === ScrollDirection.right && place.position.y === ((_b = this.currSelectedPlace) == null ? void 0 : _b.position.y) && (!closestPlace || place.position.x < closestPlace.position.x)) {
402
+ if (this.currScrollDirection === ScrollDirection.right && place.position.y === this.currSelectedPlace?.position.y && (!closestPlace || place.position.x < closestPlace.position.x)) {
408
403
  closestPlace = place;
409
- } else if (this.currScrollDirection === ScrollDirection.left && place.position.y === ((_c = this.currSelectedPlace) == null ? void 0 : _c.position.y) && (!closestPlace || place.position.x > closestPlace.position.x)) {
404
+ } else if (this.currScrollDirection === ScrollDirection.left && place.position.y === this.currSelectedPlace?.position.y && (!closestPlace || place.position.x > closestPlace.position.x)) {
410
405
  closestPlace = place;
411
406
  }
412
407
  } else {
413
- if (place.number !== ((_d = this.currSelectedPlace) == null ? void 0 : _d.number)) {
408
+ if (place.number !== this.currSelectedPlace?.number) {
414
409
  if (pressedKey === this.keyboardNavigationEvents.ArrowRight && (place.position.y === this.currSelectedPlace.position.y || place.position.y === this.currSelectedPlace.position.y - 1) && place.position.x > this.currSelectedPlace.position.x && (!closestPlace || place.position.x < closestPlace.position.x)) {
415
410
  closestPlace = place;
416
411
  } else if (pressedKey === this.keyboardNavigationEvents.ArrowDown && (place.position.x === this.currSelectedPlace.position.x || place.position.x === this.currSelectedPlace.position.x + 1) && place.position.y > this.currSelectedPlace.position.y && (!closestPlace || place.position.y < closestPlace.position.y)) {
417
412
  closestPlace = place;
418
413
  } else if (pressedKey === this.keyboardNavigationEvents.ArrowLeft && (place.position.y === this.currSelectedPlace.position.y || place.position.y === this.currSelectedPlace.position.y + 1) && place.position.x < this.currSelectedPlace.position.x && (!closestPlace || place.position.x > closestPlace.position.x)) {
419
414
  closestPlace = place;
420
- } else if (pressedKey === this.keyboardNavigationEvents.ArrowUp && (place.position.x === this.currSelectedPlace.position.x || place.position.x === this.currSelectedPlace.position.x - 1) && place.position.y < ((_e = this.currSelectedPlace) == null ? void 0 : _e.position.y) && (!closestPlace || place.position.y > closestPlace.position.y)) {
415
+ } else if (pressedKey === this.keyboardNavigationEvents.ArrowUp && (place.position.x === this.currSelectedPlace.position.x || place.position.x === this.currSelectedPlace.position.x - 1) && place.position.y < this.currSelectedPlace?.position.y && (!closestPlace || place.position.y > closestPlace.position.y)) {
421
416
  closestPlace = place;
422
417
  }
423
418
  }
@@ -560,9 +555,8 @@ let SeatReservationBaseElement = (() => {
560
555
  this.selectedPlaces.emit(this.selectedSeatReservationPlaces);
561
556
  }
562
557
  updateCurrentSelectedPlaceInCoach(placeSelection) {
563
- var _a2;
564
558
  const coachIndex = placeSelection.coachIndex;
565
- const place = (_a2 = this.seatReservation.coachItems[coachIndex].places) == null ? void 0 : _a2.find((place2) => place2.number == placeSelection.number);
559
+ const place = this.seatReservation.coachItems[coachIndex].places?.find((place2) => place2.number == placeSelection.number);
566
560
  if (!place)
567
561
  return;
568
562
  this.currSelectedCoachIndex = coachIndex;
@@ -586,8 +580,7 @@ let SeatReservationBaseElement = (() => {
586
580
  */
587
581
  _initSeatReservationPlaceSelection() {
588
582
  this.seatReservation.coachItems.map((coach, coachIndex) => {
589
- var _a2, _b;
590
- (_b = (_a2 = coach.places) == null ? void 0 : _a2.filter((place) => place.state === "SELECTED")) == null ? void 0 : _b.forEach((place) => {
583
+ coach.places?.filter((place) => place.state === "SELECTED")?.forEach((place) => {
591
584
  const preselectedPlaceSelection = mapPlaceInfosToPlaceSelection(place, coachIndex);
592
585
  const seatReservationPlaceSelection = this._getSeatReservationPlaceSelection(preselectedPlaceSelection);
593
586
  if (seatReservationPlaceSelection)
@@ -600,10 +593,9 @@ let SeatReservationBaseElement = (() => {
600
593
  * @param currSelectedPlace
601
594
  */
602
595
  _resetAllPlaceSelections(currSelectedPlace) {
603
- var _a2;
604
596
  for (const placeSelection of this.selectedSeatReservationPlaces) {
605
597
  if (!currSelectedPlace || currSelectedPlace.id !== placeSelection.id) {
606
- const placeElement = (_a2 = this.shadowRoot) == null ? void 0 : _a2.getElementById(placeSelection.id);
598
+ const placeElement = this.shadowRoot?.getElementById(placeSelection.id);
607
599
  placeElement.setAttribute("state", "FREE");
608
600
  }
609
601
  }
@@ -614,9 +606,8 @@ let SeatReservationBaseElement = (() => {
614
606
  }
615
607
  }
616
608
  _getSeatReservationPlaceSelection(currSelectedPlace) {
617
- var _a2;
618
609
  const coach = this.seatReservation.coachItems[currSelectedPlace.coachIndex];
619
- const place = (_a2 = coach.places) == null ? void 0 : _a2.find((place2) => place2.number === currSelectedPlace.number);
610
+ const place = coach.places?.find((place2) => place2.number === currSelectedPlace.number);
620
611
  return place ? mapPlaceAndCoachToSeatReservationPlaceSelection(place, coach, currSelectedPlace.coachIndex) : null;
621
612
  }
622
613
  _getSeatReservationCoachSelection(coachIndex) {
@@ -640,19 +631,17 @@ let SeatReservationBaseElement = (() => {
640
631
  * @returns HTMLElement or null
641
632
  */
642
633
  _getPlaceHtmlElement(placeNumber, coachIndex) {
643
- var _a2;
644
634
  const currCoachIndex = coachIndex ? coachIndex : this.currSelectedCoachIndex;
645
635
  const coachPlaceNumberId = placeNumber ? "seat-reservation__place-button-" + currCoachIndex + "-" + placeNumber : this.currSelectedPlaceElementId;
646
- return coachPlaceNumberId ? ((_a2 = this.shadowRoot) == null ? void 0 : _a2.getElementById(coachPlaceNumberId)) || null : null;
636
+ return coachPlaceNumberId ? this.shadowRoot?.getElementById(coachPlaceNumberId) || null : null;
647
637
  }
648
638
  //Set the vertical offset
649
639
  _setVerticalAlignmentOffset() {
650
640
  setTimeout(() => {
651
- var _a2, _b;
652
- const seatReservationWrapperElement = (_a2 = this.shadowRoot) == null ? void 0 : _a2.querySelector(".sbb-sr__wrapper");
641
+ const seatReservationWrapperElement = this.shadowRoot?.querySelector(".sbb-sr__wrapper");
653
642
  if (seatReservationWrapperElement) {
654
643
  const seatReservationVerticalOffset = seatReservationWrapperElement.getBoundingClientRect().width;
655
- (_b = this.style) == null ? void 0 : _b.setProperty("--sbb-seat-reservation-vertical-offset", `${seatReservationVerticalOffset}px`);
644
+ this.style?.setProperty("--sbb-seat-reservation-vertical-offset", `${seatReservationVerticalOffset}px`);
656
645
  }
657
646
  });
658
647
  }
@@ -703,4 +692,4 @@ let SeatReservationBaseElement = (() => {
703
692
  export {
704
693
  SeatReservationBaseElement
705
694
  };
706
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9ldmVudGluZy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCB0eXBlIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHtcbiAgbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24sXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvYWNoSXRlbSxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgRWxlbWVudFBvc2l0aW9uLFxuICBQbGFjZSxcbiAgUGxhY2VTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxufSBmcm9tICcuLi9jb21tb24uanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFNiYlNlYXRSZXNlcnZhdGlvblNjb3BlZEVsZW1lbnQgfSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24tc2NvcGVkL3NlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLmNvbXBvbmVudC5qcyc7XG5cbmVudW0gU2Nyb2xsRGlyZWN0aW9uIHtcbiAgcmlnaHQgPSAncmlnaHQnLFxuICBsZWZ0ID0gJ2xlZnQnLFxufVxuXG5pbnRlcmZhY2UgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQge1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudERldGFpbHMgPSBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdO1xuXG5leHBvcnQgY2xhc3MgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgc2VsZWN0ZWRQbGFjZXM6ICdzZWxlY3RlZFBsYWNlcycsXG4gICAgc2VsZWN0ZWRDb2FjaDogJ3NlbGVjdGVkQ29hY2gnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgYWxsIGNvYWNoZXMgYW5kIHBsYWNlcyAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdzZWF0LXJlc2VydmF0aW9uJywgdHlwZTogT2JqZWN0IH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiA9IG51bGwhO1xuXG4gIC8qKiBUaGUgc2VhdCByZXN2ZXJ2YXRpb24gbmF2aWdhdGlvbiBjYW4gYmUgdG9nZ2xlZCBieSB0aGlzIHByb3BlcnR5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoYXMtbmF2aWdhdGlvbicsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGhhc05hdmlnYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhIGlzIGFsaWduZWQgdmVydGljYWxseSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYWxpZ24tdmVydGljYWwnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhbGlnblZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyBiYXNlIGdyaWQgc2l6ZSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYmFzZS1ncmlkLXNpemUnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGJhc2VHcmlkU2l6ZTogbnVtYmVyID0gMTY7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyB3aWR0aCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGVpZ2h0JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoZWlnaHQ6IG51bWJlciA9IG51bGwhO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgc2VhdHMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFJlc2VydmF0aW9uczogbnVtYmVyID0gbnVsbCE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIHNlbGVjdGVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBmb2N1c2VkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgdXNlci4gKi9cbiAgcHJvdGVjdGVkIHNlbGVjdGVkUGxhY2VzOiBFdmVudEVtaXR0ZXI8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudERldGFpbHM+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyKHRoaXMsIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50LmV2ZW50cy5zZWxlY3RlZFBsYWNlcyk7XG5cbiAgLyoqIEVtaXRzIHdoZW4gYSBjb2FjaCB3YXMgc2VsZWN0ZWQgYnkgdXNlci4gKi9cbiAgcHJvdGVjdGVkIHNlbGVjdGVkQ29hY2g6IEV2ZW50RW1pdHRlcjxTZWF0UmVzZXJ2YXRpb25Db2FjaFNlbGVjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyKFxuICAgIHRoaXMsXG4gICAgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQuZXZlbnRzLnNlbGVjdGVkQ29hY2gsXG4gICk7XG5cbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIHByb3RlY3RlZCBjdXJyU2Nyb2xsRGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24gPSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQ7XG4gIHByb3RlY3RlZCBtYXhDYWxjQ29hY2hzV2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxDb2FjaHNBcmVhV2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCB0cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uOiBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludFtdID0gW107XG4gIHByb3RlY3RlZCBmaXJzdFRhYkVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBsYXN0VGFiRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGNvYWNoU2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIHByb3RlY3RlZCBwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdID0gW107XG4gIHByb3RlY3RlZCBzZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0NvYWNoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0tleWJvYXJkTmF2aWdhdGlvbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzZWF0UmVzZXJ2YXRpb24nKSkge1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnYmFzZUdyaWRTaXplJykpIHtcbiAgICAgIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICB0aGlzLl9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBoZWlnaHQgaXMgdXNlZCwgdGhlIGJhc2VHcmlkU2l6ZSBtdXN0IGJlIHJlY2FsY3VsYXRlZFxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2hlaWdodCcpICYmICEhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmJhc2VHcmlkU2l6ZSA9IHRoaXMuaGVpZ2h0IC8gdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaDtcbiAgICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgIHRoaXMuX3NldFZlcnRpY2FsQWxpZ25tZW50T2Zmc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykgJiYgdGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICB0aGlzLl9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qIEluaXQgc2Nyb2xsIGV2ZW50IGhhbmRsaW5nIGZvciBjb2FjaCBuYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBpbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5maXJzdFRhYkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKCdmaXJzdC10YWItZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMubGFzdFRhYkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKCdsYXN0LXRhYi1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKCdzYmItc3JfX3BhcmVudC1hcmVhJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGhpcy5jb2FjaFNjcm9sbEFyZWEpIHtcbiAgICAgIGxldCBjdXJyQ2FsY1RyaWdnZXJQb3MgPSAwO1xuICAgICAgdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGggPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gUHJlY2FsY3VsYXRlIHRyaWdnZXIgc2Nyb2xsIHBvc2l0aW9uIGFycmF5IGRlcGVuZHMgZnJvbSBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtcy5tYXAoKGNvYWNoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zWCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcbiAgICAgICAgY29uc3QgY29hY2hXaWR0aCA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihjb2FjaC5kaW1lbnNpb24pLnc7XG4gICAgICAgIGN1cnJDYWxjVHJpZ2dlclBvcyArPSBjb2FjaFdpZHRoO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFBvc1gsXG4gICAgICAgICAgZW5kOiBjdXJyQ2FsY1RyaWdnZXJQb3MsXG4gICAgICAgICAgd2lkdGg6IGNvYWNoV2lkdGgsXG4gICAgICAgIH0gYXMgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IG1heGltdW0gY2FsY3VsYXRlZCBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy5tYXhDYWxjQ29hY2hzV2lkdGggPSBjdXJyQ2FsY1RyaWdnZXJQb3M7XG5cbiAgICAgIC8vIEF0IHRoZSBlbmQgb2YgYSBzY3JvbGwgRXZlbnRzIHRvIGEgY29hY2gsIHRoZSByZWFjaGVkIHdhZ29uIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsZW5kJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBmaW5kU2Nyb2xsQ29hY2hJbmRleCA9IHRoaXMuaXNBdXRvU2Nyb2xsaW5nXG4gICAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA6IHRoaXMuX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgOiBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICAgICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIER1cmluZyBpbml0aWFsaXphdGlvbiB3ZSBjaGVjayB2ZXJ0aWNhbCBhbGlnbm1lbnQgbW9kZS4gSW4gVmVydGljYWwgbW9kZSB3ZSBoYXZlIHRvIHNldCB0aGUgdmVydGljYWwgb2Zmc2V0IG1hbnVhbCBmb3IgdGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSxcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugcm90YXRlIHRoZSBlbnRpcmUgY29tcG9uZW50IGJ5IDkwIGRlZ3JlZXMgYW5kIHRyYW5zZm9ybSB0aGUgb3JpZ2luIHBvaW50IHRvIHRvcCBsZWZ0LlxuICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICB0aGlzLl9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0cyAocHJvcGVydHkgc2V0dGluZyAtPiBoYXNOYXZpZ2F0aW9uKSBhbmQgYSB0YWJsZSBjb2FjaCBnZXRzIHRoZSBmb2N1cyxcbiAgICogdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaCBtdXN0IGJlIGF1dG9tYXRpY2FsbHkgcHJlc2VsZWN0ZWQgdG8gY29udHJvbCB0aGUgcGxhY2UgbmF2aWdhdGlvbiB2aWEga2V5Ym9hcmRcbiAgICpcbiAgICogQHBhcmFtIGZvY3VzQ29hY2hJbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNUYWJsZUNvYWNoQW5kUHJlc2VsZWN0UGxhY2UoZm9jdXNDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyAmJiAhdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZm9jdXNDb2FjaEluZGV4ID09PSAwXG4gICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KC0xKVxuICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChmb2N1c0NvYWNoSW5kZXgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzYXRpb24gb2YgS2V5Ym9hcmQgZXZlbnQgaGFuZGxpbmcgdG8gbmF2aWdhdGlvbiBiZXR3ZWVuIGVhY2ggcGxhY2VzIGluc2lkZSBhIHNlbGVjdGVkIGNvYWNoIGJ5IHVzaW5nIFthcnJvd10ga2V5cy5cbiAgICogV2l0aCB0aGUgW1RBQl0ga2V5IHRoZSB1c2VyIG5hdmlnYXRpb24gZ29lcyB0byB0aGUgbmV4dCBjb2FjaCBuYXZpZ2F0aW9uIGVsZW1lbnQgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2UgaXMgYXV0b21hdGljYWxseSByZXNldC5cbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcblxuICAgIC8vIElmIGFueSBwbGFjZSBpcyBzZWxlY3RlZCBhbmQgVEFCIEtleSBjb21iaW5hdGlvbiBpc3QgcHJlc3NlZCxcbiAgICAvLyB0aGVuIHdlIGhhbmRsZSB0aGUgbmV4dCBvciBwcmV2aW91cyBjb2FjaCBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IDkpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdORVhUX1RBQicpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSBjaG9hY2ggaXMgc2VsZWN0ZWQgYW5kIHRoZSBhcnJvdyBrZXkgaXMgcHJlc3NlZFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIGNvbnN0IGNsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKCk7XG4gICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91c2UgZm9jdXNlZCBwbGFjZVxuICAgIGlmIChjbG9zZXN0UGxhY2UpIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgd2hlbiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIHVzZWQgYW5kIGNvYWNoZXMgYXJlIHNjcm9sbGVkIGJ5IGF1dG8gc2Nyb2xsaW5nLFxuICAgIC8vIHRoZW4gd2UgY2FuIHNldCB0aGUgZm9jdXMgb24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaC5cbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJiB0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgaWYgKGNsb3Nlc3RQbGFjZSkge1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEluIGNhc2VzIHdoZXJlIHRoZSBwcmVzZWxlY3Rpb24gZnVuY3Rpb24gaXMgdHJpZ2dlcmVkIGJ5IG5vcm1hbCBjbGlja2luZyBvciB2aWEgc2NyZWVucmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgY3VyclNlbGVjdGVkUGxhY2UgaGVyZSBmb3IgZnVydGhlciBjb3JyZWN0IGZ1bmN0aW9uaW5nIG5hdmlnYXRpb24gdmlhIHRhYi5cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBjbG9zZXN0UGxhY2U7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpO1xuXG4gICAgICBjb25zdCBzY3JvbGxUb0NvYWNoUG9zWCA9IHRoaXMuX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk7XG4gICAgICBjb25zdCBpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgfHwgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gMDtcblxuICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGFsbG93cyBzY3JvbGxpbmcgdG8gdGhlIG5leHQgd2Fnb24gb3Igbm90XG4gICAgICBpZiAoaXNTZWxlY3RlZENvYWNoSW5kZXhTY3JvbGxhYmxlICYmIHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICAgIHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgbGVmdDogc2Nyb2xsVG9Db2FjaFBvc1gsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV3IFNjcm9sbERpcmVjdGlvbiBieSB0aGUgbmV3IGdpdmVuIHRhcmdldCBjb2FjaCBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPVxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgPyBTY3JvbGxEaXJlY3Rpb24ucmlnaHRcbiAgICAgICAgOiBTY3JvbGxEaXJlY3Rpb24ubGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY3JvbGwgc3RhcnQgb3IgZW5kIHBvc2l0aW9uIFggZnJvbSB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIEluIGNhc2UgdGhlIHVzZXIgaXMgY3VycmV0bmx5IG5hdmlnYXRlIHRocm91Z2h0IHBsYWNlcyBieSBrZXlib2FyZCBhbmQgZ29lcyB0byBwcmV2aW91cyBjb2FjaCxcbiAgICogdGhlbiB3ZSByZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgY29hY2ggdG8gZ2V0IGNsb3N0ZXN0IG5leHQgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGZvY3VzIHBsYWNlLlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29hY2hUcmlnZ2VyUG9pbnQgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uID1cbiAgICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiZcbiAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgIGNvYWNoVHJpZ2dlclBvaW50LndpZHRoID4gdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGg7XG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGhcbiAgICAgIDogY29hY2hUcmlnZ2VyUG9pbnQuc3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZm9jdXMgb24gdGhlIEhUTUwgdGFibGUgKGdyaWQpIGNhcHRpb24gZWxlbWVudCBzbyB0aGF0IHRoZSBoZWFkaW5nIGlzIHJlYWQgb3V0IHdoZW4gdXNpbmcgYSBTY3JlZW5SZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBjb2FjaCBuYXZpZ2F0aW9uLCB0aGVuIHRoZSBuYXZpZ2F0ZWQgdGFibGUgaXMgZm9jdXNhYmxlLlxuICAgIGlmICh0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IGNvYWNoU2Nyb2xsV2luZG93V2lkdGggPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtYXhTY3JvbGxXaWR0aEFyZWEgPSB0aGlzLm1heENhbGNDb2FjaHNXaWR0aCAtIGNvYWNoU2Nyb2xsV2luZG93V2lkdGg7XG4gICAgY29uc3QgY3VyckNvYWNoVHJpZ2dlciA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zID1cbiAgICAgIGN1cnJTY3JvbGxQb3NYID09PSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5zdGFydDtcblxuICAgIHJldHVybiAoXG4gICAgICAoY3VyclNjcm9sbFBvc1ggPCBtYXhTY3JvbGxXaWR0aEFyZWEgfHwgY3VyclNjcm9sbFBvc1ggPiBjdXJyQ29hY2hUcmlnZ2VyLnN0YXJ0KSAmJlxuICAgICAgIWlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2FjaCBpbmRleCB3aGljaCBpcyBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgc2Nyb2xsIGFyZWFcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTogbnVtYmVyIHtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdCArIHRoaXMuc2Nyb2xsQ29hY2hzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY2VkQ29hY2goKTogUGxhY2UgfCBudWxsIHtcbiAgICBsZXQgZmlyc3RQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uPy5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPSAnY2VsbC0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudD4oXCJbY2VsbC1pZD0nXCIgKyBmaXJzdENlbGxJZCArIFwiJ11cIilcbiAgICAgICAgPy5xdWVyeVNlbGVjdG9yPFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQ+KCdzYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sJylcbiAgICAgICAgPy5nZXRBdHRyaWJ1dGUoJ3RleHQnKSB8fCBudWxsO1xuXG4gICAgaWYgKGNvYWNoICYmIHBsYWNlTnVtYmVyKSB7XG4gICAgICBmaXJzdFBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBwbGFjZU51bWJlcikgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpcnN0UGxhY2U7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBsZXQgY2xvc2VzdFBsYWNlID0gbnVsbDtcbiAgICBpZiAoY29hY2gucGxhY2VzKSB7XG4gICAgICAvL0lmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZW4gdXNlIGluaXRpYWwgdGhlIGxlZnQtdG9wIHBsYWNlIG9uIHRoZSBjb2FjaFxuICAgICAgaWYgKCF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGaXJzdFBsYWNlSW5TZWxlY2VkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaC5wbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIGxlZnQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBSSUdIVClcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ucG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgTEVGVFxuICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ucG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChwbGFjZS5udW1iZXIgIT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/Lm51bWJlcikge1xuICAgICAgICAgICAgICAgIC8vS2V5IFtSaWdodF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID4gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0Rvd25dIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24gJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi54ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbTGVmdF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbVXBdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA8IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/LnBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdFBsYWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZvY3VzUGxhY2VFbGVtZW50KHBsYWNlOiBQbGFjZSB8IG51bGwsIGNvYWNoSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcbiAgICAgIGlmIChjb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICdmb2N1cycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1bmZvY3VzUGxhY2VFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICd1bmZvY3VzJyk7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChudWxsKTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgIGVsZW1lbnREaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgICBpc1N0cmV0Y2hIZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50RGltZW5zaW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgIWlzT3JpZ2luSGVpZ2h0KSB7XG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDI7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyZXRjaEhlaWdodCkge1xuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudERpbWVuc2lvbi53LFxuICAgICAgaDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLmgsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvL0lmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGNvYWNoLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBZIGNvb3JkaW5hdGUgd2l0aCB0aGUgYWRkaXRpb25hbCBib3JkZXIgcGFkZGluZ1xuICAgICAgaWYgKGVsZW1lbnRQb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnRQb3NpdGlvbi55ICsgZWxlbWVudERpbWVuc2lvbi5oID09PSBlbmRQb3NIZWlnaHQpIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCxcbiAgICAgIHk6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnksXG4gICAgICB6OiBlbGVtZW50UG9zaXRpb24ueixcbiAgICB9O1xuICB9XG5cbiAgLy8gSGFuZGxpbmcgZm9yIFRhYiBuYXZpZ2F0aW9uIGlmIGFuIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuICAgIC8vIENoZWNrIG5leHQgb3IgcHJldiB0YWIgaXMgcHJlc3NlZCwgdGhlbiB3ZSBuZWVkIHRvIGZpbmQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4IHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIGZvY3VzXG4gICAgY29uc3QgbmV3Rm9jdXNhYmxlSW5kZXg6IG51bWJlciA9XG4gICAgICB0YWJEaXJlY3Rpb24gPT09ICdORVhUX1RBQidcbiAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJGb2N1c0luZGV4KVxuICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpO1xuXG4gICAgLy8gSWYgdGhlIGN1cnJGb2N1c0luZGV4IGVxdWFscyB0aGUgbmV3Rm9jdXNhYmxlSW5kZXggdGhlbiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGZpcnN0IG9yIGxhc3QgdGFiYWJsZSBuYXZpZ2F0aW9uIGNvYWNoIEVsZW1lbnQgYW5kIHdlIGhhdmUgdG8gdGhlIHNldCB0aGUgZm9jdXMgbWFudWFsIHRvIHRoZSBmaXJzdFRhYkVsZW1lbnQgb3IgbGFzdFRhYkVsZW1lbnQuXG4gICAgaWYgKGN1cnJGb2N1c0luZGV4ID09PSBuZXdGb2N1c2FibGVJbmRleCkge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcblxuICAgICAgaWYgKHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJykgdGhpcy5sYXN0VGFiRWxlbWVudC5mb2N1cygpO1xuICAgICAgZWxzZSB0aGlzLmZpcnN0VGFiRWxlbWVudC5mb2N1cygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBjb25zdCBwbGFjZUluQ29hY2hIYXNGb2N1cyA9IHNlbGVjdGVkUGxhY2VFbGVtZW50XG4gICAgICAgID8gc2VsZWN0ZWRQbGFjZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdrZXlmb2N1cycpID09PSAnZm9jdXMnXG4gICAgICAgIDogZmFsc2U7XG5cbiAgICAgIC8vIElmIHdlIHRhYiBiYWNrIChQUkVWX1RBQikgYW5kIHRoZSBmb2N1cyBpcyBjdXJyZW50bHkgb24gcGxhY2UsXG4gICAgICAvLyB3ZSByZW1vdmUgdGhlIHNlbGVjdGVkIHN0YXRlIGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBuYXZpZ2F0aW9uIGNvYWNoIGFuZCBvbmx5IHNldCB0aGUgZm9jdXMgc3RhdHVzIHRvIGl0XG4gICAgICBpZiAodGFiRGlyZWN0aW9uID09PSAnUFJFVl9UQUInICYmIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID09PSBjdXJyRm9jdXNJbmRleCkge1xuICAgICAgICBpZiAocGxhY2VJbkNvYWNoSGFzRm9jdXMpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyckZvY3VzSW5kZXg7XG4gICAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIC8vIElmIGFueSBwbGFjZSB3YXMgZm9jdXNlZCBpbiBjb2FjaCwgc28gd2Ugc2V0IGZvY3VzZWQgYWdhaW5cbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyBwbGFjZSB3YXMgc2VsZWN0ZWQsIHRoZW4gd2Ugc2VsZWN0IHRoZSBjb2FjaCBncmlkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG4gICAgICBpZiAoZmluZENsb3Nlc3RQbGFjZSkge1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGZpbmRDbG9zZXN0UGxhY2UpO1xuICAgICAgfVxuICAgICAgLy8gTm8gY2xvc2VzdCBwbGFjZSBmb3VuZCBieSBrZXkgbmF2aWdhdGlvblxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0IHx8XG4gICAgICAgICAgKHRoaXMuYWxpZ25WZXJ0aWNhbCAmJlxuICAgICAgICAgICAgKHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgfHxcbiAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgdGhlIGN1cnJlbnQgcHJlc3NlZCBrZXkgdG8gZ2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBjb2FjaCBpbmRleFxuICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleCgpXG4gICAgICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleCgpO1xuXG4gICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmV3U2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyZW50SW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50SW5kZXggPz8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIHJldHVybiBzdGFydEluZGV4IDwgdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtcy5sZW5ndGggLSAxID8gc3RhcnRJbmRleCArIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIC8vIEFkZCBzZWxlY3RlZCBwbGFjZSB0byBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGlmIChwbGFjZVNlbGVjdGlvbi5zdGF0ZSA9PT0gJ1NFTEVDVEVEJykge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocGxhY2VTZWxlY3Rpb24pO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnB1c2goc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVtb3ZlIHNlbGVjdGVkIHBsYWNlIGZyb20gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoZWNrcyB3aGV0aGVyIG1heFJlc2VydmF0aW9uIGlzIGFjdGl2YXRlZCBhbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGVkIHBsYWNlcyBpcyByZWFjaGVkXG4gICAgaWYgKHRoaXMubWF4UmVzZXJ2YXRpb25zICYmIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gdGhpcy5tYXhSZXNlcnZhdGlvbnMpIHtcbiAgICAgIHRoaXMuX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKHBsYWNlU2VsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0cyB0aGUgc2VhdCByZXNlcnZhdGlvbiBwbGFjZSBzZWxlY3Rpb25cbiAgICB0aGlzLnNlbGVjdGVkUGxhY2VzLmVtaXQodGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkUGxhY2VJbkNvYWNoKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGNvYWNoSW5kZXggPSBwbGFjZVNlbGVjdGlvbi5jb2FjaEluZGV4O1xuICAgIGNvbnN0IHBsYWNlID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1tjb2FjaEluZGV4XS5wbGFjZXM/LmZpbmQoXG4gICAgICAocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PSBwbGFjZVNlbGVjdGlvbi5udW1iZXIsXG4gICAgKTtcblxuICAgIGlmICghcGxhY2UpIHJldHVybjtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBjb2FjaEluZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9PSB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgIH1cblxuICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25Db2FjaFNlbGVjdGlvbih0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCk7XG4gICAgaWYgKGNvYWNoU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29hY2guZW1pdChjb2FjaFNlbGVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemF0aW9uIG9mIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIEFycmF5IGJhc2VkIG9uIHRoZSB0cmFuc2ZlcnJlZCBwbGFjZXNcbiAgICogdGhhdCBoYXZlIHRoZSBzdGF0ZSBTRUxFQ1RFRCB3aXRoaW4gdGhlIHNlYXRSZXNlcnZhdGlvbiBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgX2luaXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2g6IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb2FjaC5wbGFjZXNcbiAgICAgICAgPy5maWx0ZXIoKHBsYWNlKSA9PiBwbGFjZS5zdGF0ZSA9PT0gJ1NFTEVDVEVEJylcbiAgICAgICAgPy5mb3JFYWNoKChwbGFjZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uID0gbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbjogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsID1cbiAgICAgICAgICAgIHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb24pO1xuICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBzZWxlY3RlZCBwbGFjZXMgd2lsbCBiZSByZXNldCBvciB0aGUgY3VycmVudFNlbGVjdGVkUGxhY2Ugd2FzIGdpdmVuLCB0aGVuIHdlIHJlc2V0IGFsbCBleGNlcHQgY3VycmVudFNlbGVjdGVkUGxhY2VcbiAgICogQHBhcmFtIGN1cnJTZWxlY3RlZFBsYWNlXG4gICAqL1xuICBwcml2YXRlIF9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhjdXJyU2VsZWN0ZWRQbGFjZT86IFBsYWNlU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgLy9GaW5kIGFsbCBwbGFjZXMgdG8gYmUgbmVlZGVkIHVuc2VsZWN0XG4gICAgZm9yIChjb25zdCBwbGFjZVNlbGVjdGlvbiBvZiB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKSB7XG4gICAgICBpZiAoIWN1cnJTZWxlY3RlZFBsYWNlIHx8IGN1cnJTZWxlY3RlZFBsYWNlLmlkICE9PSBwbGFjZVNlbGVjdGlvbi5pZCkge1xuICAgICAgICBjb25zdCBwbGFjZUVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKHBsYWNlU2VsZWN0aW9uLmlkKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgcGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3RhdGUnLCAnRlJFRScpO1xuICAgICAgfVxuICAgIH1cbiAgICAvL1JlbW92ZXMgYWxsIHNlbGVjdGVkIHBsYWNlcyBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgIGlmIChjdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zW2N1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXhdO1xuICAgIGNvbnN0IHBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5udW1iZXIpO1xuXG4gICAgcmV0dXJuIHBsYWNlXG4gICAgICA/IG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHBsYWNlLCBjb2FjaCwgY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvbkNvYWNoU2VsZWN0aW9uKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogU2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbY29hY2hJbmRleF0pIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdO1xuICAgIHJldHVybiBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbihjb2FjaEluZGV4LCBjb2FjaCk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID1cbiAgICAgICAgJ3NlYXQtcmVzZXJ2YXRpb25fX3BsYWNlLWJ1dHRvbi0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0nICsgcGxhY2UubnVtYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSBIVE1MIGVsZW1lbnQgYnkgZ2l2ZW4gcGxhY2VOdW1iZXIgYW5kIGNvYWNoSW5kZXguXG4gICAqIElmIGJvdGggZG9lc250IGV4aXN0LCB3ZSB0cnkgdG8gcmV0dXJuIHRoZSBwbGFjZSBIVE1MIGVsZW1lbnQgYnkgdGhlIF9jdXJyZW50U2VsZWN0ZWRQbGFjZUVsZW1lbnRJZFxuICAgKiBAcGFyYW0gcGxhY2VOdW1iZXIgb3B0aW9uYWwgYXMgc3RyaW5nXG4gICAqIEBwYXJhbSBjb2FjaEluZGV4IG9wdGlvbmFsIGFzIHN0cmluZ1xuICAgKiBAcmV0dXJucyBIVE1MRWxlbWVudCBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRQbGFjZUh0bWxFbGVtZW50KHBsYWNlTnVtYmVyPzogc3RyaW5nLCBjb2FjaEluZGV4PzogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBjdXJyQ29hY2hJbmRleCA9IGNvYWNoSW5kZXggPyBjb2FjaEluZGV4IDogdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIGNvbnN0IGNvYWNoUGxhY2VOdW1iZXJJZCA9IHBsYWNlTnVtYmVyXG4gICAgICA/ICdzZWF0LXJlc2VydmF0aW9uX19wbGFjZS1idXR0b24tJyArIGN1cnJDb2FjaEluZGV4ICsgJy0nICsgcGxhY2VOdW1iZXJcbiAgICAgIDogdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZDtcbiAgICByZXR1cm4gY29hY2hQbGFjZU51bWJlcklkID8gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChjb2FjaFBsYWNlTnVtYmVySWQpIHx8IG51bGwgOiBudWxsO1xuICB9XG5cbiAgLy9TZXQgdGhlIHZlcnRpY2FsIG9mZnNldFxuICBwcml2YXRlIF9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbldyYXBwZXJFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLnNiYi1zcl9fd3JhcHBlcicsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvbldyYXBwZXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvblZlcnRpY2FsT2Zmc2V0ID1cbiAgICAgICAgICBzZWF0UmVzZXJ2YXRpb25XcmFwcGVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tdmVydGljYWwtb2Zmc2V0JyxcbiAgICAgICAgICBgJHtzZWF0UmVzZXJ2YXRpb25WZXJ0aWNhbE9mZnNldH1weGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTY3JvbGxEaXJlY3Rpb24iLCJTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCIsIl9hIiwicGxhY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLElBQUs7QUFBQSxDQUFMLFNBQUtBLGtCQUFlO0FBQ2xCQSxtQkFBQSxPQUFBLElBQUE7QUFDQUEsbUJBQUEsTUFBQSxJQUFBO0FBQ0YsR0FISyxvQkFBQSxrQkFHSixDQUFBLEVBQUE7SUFVWSw4QkFBMEIsTUFBQTs7b0JBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBbkMsU0FBQSxtQkFBbUMsWUFBVTtBQUFBOztBQVF4RDtBQUtBO0FBS0E7QUFLQTtBQUtBO0FBS0E7QUFLQTtBQUVTO0FBQ0E7QUFqQ08seUJBQUEsbUNBQUEsa0JBQUEsTUFBQSwrQkFBbUMsSUFBSztBQUt4Qyx5QkFBQSxrQ0FBQSxrQkFBQSxNQUFBLGtDQUFBLEdBQUEsa0JBQUEsTUFBQSw2QkFBeUIsSUFBSTtBQUs3Qix5QkFBQSxrQ0FBQSxrQkFBQSxNQUFBLGdDQUFBLEdBQUEsa0JBQUEsTUFBQSw2QkFBeUIsS0FBSztBQUs5Qix5QkFBQSxpQ0FBQSxrQkFBQSxNQUFBLGdDQUFBLEdBQUEsa0JBQUEsTUFBQSw0QkFBdUIsRUFBRTtBQUt6Qix5QkFBQSwyQkFBQSxrQkFBQSxNQUFBLCtCQUFBLEdBQUEsa0JBQUEsTUFBQSxzQkFBaUIsSUFBSztBQUt0Qix5QkFBQSxvQ0FBQSxrQkFBQSxNQUFBLHlCQUFBLEdBQUEsa0JBQUEsTUFBQSwrQkFBMEIsSUFBSztBQUsvQix5QkFBQSxzQ0FBQSxrQkFBQSxNQUFBLGtDQUFB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
695
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9ldmVudGluZy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCB0eXBlIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHtcbiAgbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24sXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvYWNoSXRlbSxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgRWxlbWVudFBvc2l0aW9uLFxuICBQbGFjZSxcbiAgUGxhY2VTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxufSBmcm9tICcuLi9jb21tb24uanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFNiYlNlYXRSZXNlcnZhdGlvblNjb3BlZEVsZW1lbnQgfSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24tc2NvcGVkL3NlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLmNvbXBvbmVudC5qcyc7XG5cbmVudW0gU2Nyb2xsRGlyZWN0aW9uIHtcbiAgcmlnaHQgPSAncmlnaHQnLFxuICBsZWZ0ID0gJ2xlZnQnLFxufVxuXG5pbnRlcmZhY2UgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQge1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudERldGFpbHMgPSBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdO1xuXG5leHBvcnQgY2xhc3MgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgc2VsZWN0ZWRQbGFjZXM6ICdzZWxlY3RlZFBsYWNlcycsXG4gICAgc2VsZWN0ZWRDb2FjaDogJ3NlbGVjdGVkQ29hY2gnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgYWxsIGNvYWNoZXMgYW5kIHBsYWNlcyAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdzZWF0LXJlc2VydmF0aW9uJywgdHlwZTogT2JqZWN0IH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiA9IG51bGwhO1xuXG4gIC8qKiBUaGUgc2VhdCByZXN2ZXJ2YXRpb24gbmF2aWdhdGlvbiBjYW4gYmUgdG9nZ2xlZCBieSB0aGlzIHByb3BlcnR5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoYXMtbmF2aWdhdGlvbicsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGhhc05hdmlnYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhIGlzIGFsaWduZWQgdmVydGljYWxseSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYWxpZ24tdmVydGljYWwnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhbGlnblZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyBiYXNlIGdyaWQgc2l6ZSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYmFzZS1ncmlkLXNpemUnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGJhc2VHcmlkU2l6ZTogbnVtYmVyID0gMTY7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyB3aWR0aCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGVpZ2h0JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoZWlnaHQ6IG51bWJlciA9IG51bGwhO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgc2VhdHMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFJlc2VydmF0aW9uczogbnVtYmVyID0gbnVsbCE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIHNlbGVjdGVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBmb2N1c2VkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgdXNlci4gKi9cbiAgcHJvdGVjdGVkIHNlbGVjdGVkUGxhY2VzOiBFdmVudEVtaXR0ZXI8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudERldGFpbHM+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyKHRoaXMsIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50LmV2ZW50cy5zZWxlY3RlZFBsYWNlcyk7XG5cbiAgLyoqIEVtaXRzIHdoZW4gYSBjb2FjaCB3YXMgc2VsZWN0ZWQgYnkgdXNlci4gKi9cbiAgcHJvdGVjdGVkIHNlbGVjdGVkQ29hY2g6IEV2ZW50RW1pdHRlcjxTZWF0UmVzZXJ2YXRpb25Db2FjaFNlbGVjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyKFxuICAgIHRoaXMsXG4gICAgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQuZXZlbnRzLnNlbGVjdGVkQ29hY2gsXG4gICk7XG5cbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIHByb3RlY3RlZCBjdXJyU2Nyb2xsRGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24gPSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQ7XG4gIHByb3RlY3RlZCBtYXhDYWxjQ29hY2hzV2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxDb2FjaHNBcmVhV2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCB0cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uOiBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludFtdID0gW107XG4gIHByb3RlY3RlZCBmaXJzdFRhYkVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBsYXN0VGFiRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGNvYWNoU2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIHByb3RlY3RlZCBwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdID0gW107XG4gIHByb3RlY3RlZCBzZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0NvYWNoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0tleWJvYXJkTmF2aWdhdGlvbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzZWF0UmVzZXJ2YXRpb24nKSkge1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnYmFzZUdyaWRTaXplJykpIHtcbiAgICAgIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICB0aGlzLl9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBoZWlnaHQgaXMgdXNlZCwgdGhlIGJhc2VHcmlkU2l6ZSBtdXN0IGJlIHJlY2FsY3VsYXRlZFxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2hlaWdodCcpICYmICEhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmJhc2VHcmlkU2l6ZSA9IHRoaXMuaGVpZ2h0IC8gdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaDtcbiAgICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgIHRoaXMuX3NldFZlcnRpY2FsQWxpZ25tZW50T2Zmc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykgJiYgdGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICB0aGlzLl9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qIEluaXQgc2Nyb2xsIGV2ZW50IGhhbmRsaW5nIGZvciBjb2FjaCBuYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBpbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5maXJzdFRhYkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKCdmaXJzdC10YWItZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMubGFzdFRhYkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKCdsYXN0LXRhYi1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKCdzYmItc3JfX3BhcmVudC1hcmVhJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGhpcy5jb2FjaFNjcm9sbEFyZWEpIHtcbiAgICAgIGxldCBjdXJyQ2FsY1RyaWdnZXJQb3MgPSAwO1xuICAgICAgdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGggPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gUHJlY2FsY3VsYXRlIHRyaWdnZXIgc2Nyb2xsIHBvc2l0aW9uIGFycmF5IGRlcGVuZHMgZnJvbSBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtcy5tYXAoKGNvYWNoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zWCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcbiAgICAgICAgY29uc3QgY29hY2hXaWR0aCA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihjb2FjaC5kaW1lbnNpb24pLnc7XG4gICAgICAgIGN1cnJDYWxjVHJpZ2dlclBvcyArPSBjb2FjaFdpZHRoO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFBvc1gsXG4gICAgICAgICAgZW5kOiBjdXJyQ2FsY1RyaWdnZXJQb3MsXG4gICAgICAgICAgd2lkdGg6IGNvYWNoV2lkdGgsXG4gICAgICAgIH0gYXMgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IG1heGltdW0gY2FsY3VsYXRlZCBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy5tYXhDYWxjQ29hY2hzV2lkdGggPSBjdXJyQ2FsY1RyaWdnZXJQb3M7XG5cbiAgICAgIC8vIEF0IHRoZSBlbmQgb2YgYSBzY3JvbGwgRXZlbnRzIHRvIGEgY29hY2gsIHRoZSByZWFjaGVkIHdhZ29uIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsZW5kJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBmaW5kU2Nyb2xsQ29hY2hJbmRleCA9IHRoaXMuaXNBdXRvU2Nyb2xsaW5nXG4gICAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA6IHRoaXMuX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgOiBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICAgICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIER1cmluZyBpbml0aWFsaXphdGlvbiB3ZSBjaGVjayB2ZXJ0aWNhbCBhbGlnbm1lbnQgbW9kZS4gSW4gVmVydGljYWwgbW9kZSB3ZSBoYXZlIHRvIHNldCB0aGUgdmVydGljYWwgb2Zmc2V0IG1hbnVhbCBmb3IgdGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSxcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugcm90YXRlIHRoZSBlbnRpcmUgY29tcG9uZW50IGJ5IDkwIGRlZ3JlZXMgYW5kIHRyYW5zZm9ybSB0aGUgb3JpZ2luIHBvaW50IHRvIHRvcCBsZWZ0LlxuICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICB0aGlzLl9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0cyAocHJvcGVydHkgc2V0dGluZyAtPiBoYXNOYXZpZ2F0aW9uKSBhbmQgYSB0YWJsZSBjb2FjaCBnZXRzIHRoZSBmb2N1cyxcbiAgICogdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaCBtdXN0IGJlIGF1dG9tYXRpY2FsbHkgcHJlc2VsZWN0ZWQgdG8gY29udHJvbCB0aGUgcGxhY2UgbmF2aWdhdGlvbiB2aWEga2V5Ym9hcmRcbiAgICpcbiAgICogQHBhcmFtIGZvY3VzQ29hY2hJbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNUYWJsZUNvYWNoQW5kUHJlc2VsZWN0UGxhY2UoZm9jdXNDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyAmJiAhdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZm9jdXNDb2FjaEluZGV4ID09PSAwXG4gICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KC0xKVxuICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChmb2N1c0NvYWNoSW5kZXgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzYXRpb24gb2YgS2V5Ym9hcmQgZXZlbnQgaGFuZGxpbmcgdG8gbmF2aWdhdGlvbiBiZXR3ZWVuIGVhY2ggcGxhY2VzIGluc2lkZSBhIHNlbGVjdGVkIGNvYWNoIGJ5IHVzaW5nIFthcnJvd10ga2V5cy5cbiAgICogV2l0aCB0aGUgW1RBQl0ga2V5IHRoZSB1c2VyIG5hdmlnYXRpb24gZ29lcyB0byB0aGUgbmV4dCBjb2FjaCBuYXZpZ2F0aW9uIGVsZW1lbnQgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2UgaXMgYXV0b21hdGljYWxseSByZXNldC5cbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcblxuICAgIC8vIElmIGFueSBwbGFjZSBpcyBzZWxlY3RlZCBhbmQgVEFCIEtleSBjb21iaW5hdGlvbiBpc3QgcHJlc3NlZCxcbiAgICAvLyB0aGVuIHdlIGhhbmRsZSB0aGUgbmV4dCBvciBwcmV2aW91cyBjb2FjaCBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IDkpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdORVhUX1RBQicpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSBjaG9hY2ggaXMgc2VsZWN0ZWQgYW5kIHRoZSBhcnJvdyBrZXkgaXMgcHJlc3NlZFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIGNvbnN0IGNsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKCk7XG4gICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91c2UgZm9jdXNlZCBwbGFjZVxuICAgIGlmIChjbG9zZXN0UGxhY2UpIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgd2hlbiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIHVzZWQgYW5kIGNvYWNoZXMgYXJlIHNjcm9sbGVkIGJ5IGF1dG8gc2Nyb2xsaW5nLFxuICAgIC8vIHRoZW4gd2UgY2FuIHNldCB0aGUgZm9jdXMgb24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaC5cbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJiB0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgaWYgKGNsb3Nlc3RQbGFjZSkge1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEluIGNhc2VzIHdoZXJlIHRoZSBwcmVzZWxlY3Rpb24gZnVuY3Rpb24gaXMgdHJpZ2dlcmVkIGJ5IG5vcm1hbCBjbGlja2luZyBvciB2aWEgc2NyZWVucmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgY3VyclNlbGVjdGVkUGxhY2UgaGVyZSBmb3IgZnVydGhlciBjb3JyZWN0IGZ1bmN0aW9uaW5nIG5hdmlnYXRpb24gdmlhIHRhYi5cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBjbG9zZXN0UGxhY2U7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpO1xuXG4gICAgICBjb25zdCBzY3JvbGxUb0NvYWNoUG9zWCA9IHRoaXMuX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk7XG4gICAgICBjb25zdCBpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgfHwgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gMDtcblxuICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGFsbG93cyBzY3JvbGxpbmcgdG8gdGhlIG5leHQgd2Fnb24gb3Igbm90XG4gICAgICBpZiAoaXNTZWxlY3RlZENvYWNoSW5kZXhTY3JvbGxhYmxlICYmIHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICAgIHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgbGVmdDogc2Nyb2xsVG9Db2FjaFBvc1gsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV3IFNjcm9sbERpcmVjdGlvbiBieSB0aGUgbmV3IGdpdmVuIHRhcmdldCBjb2FjaCBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPVxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgPyBTY3JvbGxEaXJlY3Rpb24ucmlnaHRcbiAgICAgICAgOiBTY3JvbGxEaXJlY3Rpb24ubGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY3JvbGwgc3RhcnQgb3IgZW5kIHBvc2l0aW9uIFggZnJvbSB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIEluIGNhc2UgdGhlIHVzZXIgaXMgY3VycmV0bmx5IG5hdmlnYXRlIHRocm91Z2h0IHBsYWNlcyBieSBrZXlib2FyZCBhbmQgZ29lcyB0byBwcmV2aW91cyBjb2FjaCxcbiAgICogdGhlbiB3ZSByZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgY29hY2ggdG8gZ2V0IGNsb3N0ZXN0IG5leHQgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGZvY3VzIHBsYWNlLlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29hY2hUcmlnZ2VyUG9pbnQgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uID1cbiAgICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiZcbiAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgIGNvYWNoVHJpZ2dlclBvaW50LndpZHRoID4gdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGg7XG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGhcbiAgICAgIDogY29hY2hUcmlnZ2VyUG9pbnQuc3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZm9jdXMgb24gdGhlIEhUTUwgdGFibGUgKGdyaWQpIGNhcHRpb24gZWxlbWVudCBzbyB0aGF0IHRoZSBoZWFkaW5nIGlzIHJlYWQgb3V0IHdoZW4gdXNpbmcgYSBTY3JlZW5SZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBjb2FjaCBuYXZpZ2F0aW9uLCB0aGVuIHRoZSBuYXZpZ2F0ZWQgdGFibGUgaXMgZm9jdXNhYmxlLlxuICAgIGlmICh0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IGNvYWNoU2Nyb2xsV2luZG93V2lkdGggPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtYXhTY3JvbGxXaWR0aEFyZWEgPSB0aGlzLm1heENhbGNDb2FjaHNXaWR0aCAtIGNvYWNoU2Nyb2xsV2luZG93V2lkdGg7XG4gICAgY29uc3QgY3VyckNvYWNoVHJpZ2dlciA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zID1cbiAgICAgIGN1cnJTY3JvbGxQb3NYID09PSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5zdGFydDtcblxuICAgIHJldHVybiAoXG4gICAgICAoY3VyclNjcm9sbFBvc1ggPCBtYXhTY3JvbGxXaWR0aEFyZWEgfHwgY3VyclNjcm9sbFBvc1ggPiBjdXJyQ29hY2hUcmlnZ2VyLnN0YXJ0KSAmJlxuICAgICAgIWlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2FjaCBpbmRleCB3aGljaCBpcyBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgc2Nyb2xsIGFyZWFcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTogbnVtYmVyIHtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdCArIHRoaXMuc2Nyb2xsQ29hY2hzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY2VkQ29hY2goKTogUGxhY2UgfCBudWxsIHtcbiAgICBsZXQgZmlyc3RQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uPy5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPSAnY2VsbC0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudD4oXCJbY2VsbC1pZD0nXCIgKyBmaXJzdENlbGxJZCArIFwiJ11cIilcbiAgICAgICAgPy5xdWVyeVNlbGVjdG9yPFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQ+KCdzYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sJylcbiAgICAgICAgPy5nZXRBdHRyaWJ1dGUoJ3RleHQnKSB8fCBudWxsO1xuXG4gICAgaWYgKGNvYWNoICYmIHBsYWNlTnVtYmVyKSB7XG4gICAgICBmaXJzdFBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBwbGFjZU51bWJlcikgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpcnN0UGxhY2U7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBsZXQgY2xvc2VzdFBsYWNlID0gbnVsbDtcbiAgICBpZiAoY29hY2gucGxhY2VzKSB7XG4gICAgICAvL0lmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZW4gdXNlIGluaXRpYWwgdGhlIGxlZnQtdG9wIHBsYWNlIG9uIHRoZSBjb2FjaFxuICAgICAgaWYgKCF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGaXJzdFBsYWNlSW5TZWxlY2VkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaC5wbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIGxlZnQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBSSUdIVClcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ucG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgTEVGVFxuICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ucG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChwbGFjZS5udW1iZXIgIT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/Lm51bWJlcikge1xuICAgICAgICAgICAgICAgIC8vS2V5IFtSaWdodF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID4gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0Rvd25dIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24gJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi54ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbTGVmdF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbVXBdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA8IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/LnBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdFBsYWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZvY3VzUGxhY2VFbGVtZW50KHBsYWNlOiBQbGFjZSB8IG51bGwsIGNvYWNoSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcbiAgICAgIGlmIChjb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICdmb2N1cycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1bmZvY3VzUGxhY2VFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICd1bmZvY3VzJyk7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChudWxsKTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgIGVsZW1lbnREaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgICBpc1N0cmV0Y2hIZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50RGltZW5zaW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgIWlzT3JpZ2luSGVpZ2h0KSB7XG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDI7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyZXRjaEhlaWdodCkge1xuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudERpbWVuc2lvbi53LFxuICAgICAgaDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLmgsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvL0lmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGNvYWNoLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBZIGNvb3JkaW5hdGUgd2l0aCB0aGUgYWRkaXRpb25hbCBib3JkZXIgcGFkZGluZ1xuICAgICAgaWYgKGVsZW1lbnRQb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnRQb3NpdGlvbi55ICsgZWxlbWVudERpbWVuc2lvbi5oID09PSBlbmRQb3NIZWlnaHQpIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCxcbiAgICAgIHk6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnksXG4gICAgICB6OiBlbGVtZW50UG9zaXRpb24ueixcbiAgICB9O1xuICB9XG5cbiAgLy8gSGFuZGxpbmcgZm9yIFRhYiBuYXZpZ2F0aW9uIGlmIGFuIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuICAgIC8vIENoZWNrIG5leHQgb3IgcHJldiB0YWIgaXMgcHJlc3NlZCwgdGhlbiB3ZSBuZWVkIHRvIGZpbmQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4IHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIGZvY3VzXG4gICAgY29uc3QgbmV3Rm9jdXNhYmxlSW5kZXg6IG51bWJlciA9XG4gICAgICB0YWJEaXJlY3Rpb24gPT09ICdORVhUX1RBQidcbiAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJGb2N1c0luZGV4KVxuICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpO1xuXG4gICAgLy8gSWYgdGhlIGN1cnJGb2N1c0luZGV4IGVxdWFscyB0aGUgbmV3Rm9jdXNhYmxlSW5kZXggdGhlbiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGZpcnN0IG9yIGxhc3QgdGFiYWJsZSBuYXZpZ2F0aW9uIGNvYWNoIEVsZW1lbnQgYW5kIHdlIGhhdmUgdG8gdGhlIHNldCB0aGUgZm9jdXMgbWFudWFsIHRvIHRoZSBmaXJzdFRhYkVsZW1lbnQgb3IgbGFzdFRhYkVsZW1lbnQuXG4gICAgaWYgKGN1cnJGb2N1c0luZGV4ID09PSBuZXdGb2N1c2FibGVJbmRleCkge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcblxuICAgICAgaWYgKHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJykgdGhpcy5sYXN0VGFiRWxlbWVudC5mb2N1cygpO1xuICAgICAgZWxzZSB0aGlzLmZpcnN0VGFiRWxlbWVudC5mb2N1cygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBjb25zdCBwbGFjZUluQ29hY2hIYXNGb2N1cyA9IHNlbGVjdGVkUGxhY2VFbGVtZW50XG4gICAgICAgID8gc2VsZWN0ZWRQbGFjZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdrZXlmb2N1cycpID09PSAnZm9jdXMnXG4gICAgICAgIDogZmFsc2U7XG5cbiAgICAgIC8vIElmIHdlIHRhYiBiYWNrIChQUkVWX1RBQikgYW5kIHRoZSBmb2N1cyBpcyBjdXJyZW50bHkgb24gcGxhY2UsXG4gICAgICAvLyB3ZSByZW1vdmUgdGhlIHNlbGVjdGVkIHN0YXRlIGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBuYXZpZ2F0aW9uIGNvYWNoIGFuZCBvbmx5IHNldCB0aGUgZm9jdXMgc3RhdHVzIHRvIGl0XG4gICAgICBpZiAodGFiRGlyZWN0aW9uID09PSAnUFJFVl9UQUInICYmIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID09PSBjdXJyRm9jdXNJbmRleCkge1xuICAgICAgICBpZiAocGxhY2VJbkNvYWNoSGFzRm9jdXMpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyckZvY3VzSW5kZXg7XG4gICAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIC8vIElmIGFueSBwbGFjZSB3YXMgZm9jdXNlZCBpbiBjb2FjaCwgc28gd2Ugc2V0IGZvY3VzZWQgYWdhaW5cbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyBwbGFjZSB3YXMgc2VsZWN0ZWQsIHRoZW4gd2Ugc2VsZWN0IHRoZSBjb2FjaCBncmlkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG4gICAgICBpZiAoZmluZENsb3Nlc3RQbGFjZSkge1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGZpbmRDbG9zZXN0UGxhY2UpO1xuICAgICAgfVxuICAgICAgLy8gTm8gY2xvc2VzdCBwbGFjZSBmb3VuZCBieSBrZXkgbmF2aWdhdGlvblxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0IHx8XG4gICAgICAgICAgKHRoaXMuYWxpZ25WZXJ0aWNhbCAmJlxuICAgICAgICAgICAgKHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgfHxcbiAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgdGhlIGN1cnJlbnQgcHJlc3NlZCBrZXkgdG8gZ2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBjb2FjaCBpbmRleFxuICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleCgpXG4gICAgICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleCgpO1xuXG4gICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmV3U2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyZW50SW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50SW5kZXggPz8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIHJldHVybiBzdGFydEluZGV4IDwgdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtcy5sZW5ndGggLSAxID8gc3RhcnRJbmRleCArIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIC8vIEFkZCBzZWxlY3RlZCBwbGFjZSB0byBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGlmIChwbGFjZVNlbGVjdGlvbi5zdGF0ZSA9PT0gJ1NFTEVDVEVEJykge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocGxhY2VTZWxlY3Rpb24pO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnB1c2goc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVtb3ZlIHNlbGVjdGVkIHBsYWNlIGZyb20gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoZWNrcyB3aGV0aGVyIG1heFJlc2VydmF0aW9uIGlzIGFjdGl2YXRlZCBhbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGVkIHBsYWNlcyBpcyByZWFjaGVkXG4gICAgaWYgKHRoaXMubWF4UmVzZXJ2YXRpb25zICYmIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gdGhpcy5tYXhSZXNlcnZhdGlvbnMpIHtcbiAgICAgIHRoaXMuX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKHBsYWNlU2VsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0cyB0aGUgc2VhdCByZXNlcnZhdGlvbiBwbGFjZSBzZWxlY3Rpb25cbiAgICB0aGlzLnNlbGVjdGVkUGxhY2VzLmVtaXQodGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkUGxhY2VJbkNvYWNoKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGNvYWNoSW5kZXggPSBwbGFjZVNlbGVjdGlvbi5jb2FjaEluZGV4O1xuICAgIGNvbnN0IHBsYWNlID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1tjb2FjaEluZGV4XS5wbGFjZXM/LmZpbmQoXG4gICAgICAocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PSBwbGFjZVNlbGVjdGlvbi5udW1iZXIsXG4gICAgKTtcblxuICAgIGlmICghcGxhY2UpIHJldHVybjtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBjb2FjaEluZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9PSB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgIH1cblxuICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25Db2FjaFNlbGVjdGlvbih0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCk7XG4gICAgaWYgKGNvYWNoU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29hY2guZW1pdChjb2FjaFNlbGVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemF0aW9uIG9mIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIEFycmF5IGJhc2VkIG9uIHRoZSB0cmFuc2ZlcnJlZCBwbGFjZXNcbiAgICogdGhhdCBoYXZlIHRoZSBzdGF0ZSBTRUxFQ1RFRCB3aXRoaW4gdGhlIHNlYXRSZXNlcnZhdGlvbiBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgX2luaXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2g6IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb2FjaC5wbGFjZXNcbiAgICAgICAgPy5maWx0ZXIoKHBsYWNlKSA9PiBwbGFjZS5zdGF0ZSA9PT0gJ1NFTEVDVEVEJylcbiAgICAgICAgPy5mb3JFYWNoKChwbGFjZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uID0gbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbjogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsID1cbiAgICAgICAgICAgIHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb24pO1xuICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBzZWxlY3RlZCBwbGFjZXMgd2lsbCBiZSByZXNldCBvciB0aGUgY3VycmVudFNlbGVjdGVkUGxhY2Ugd2FzIGdpdmVuLCB0aGVuIHdlIHJlc2V0IGFsbCBleGNlcHQgY3VycmVudFNlbGVjdGVkUGxhY2VcbiAgICogQHBhcmFtIGN1cnJTZWxlY3RlZFBsYWNlXG4gICAqL1xuICBwcml2YXRlIF9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhjdXJyU2VsZWN0ZWRQbGFjZT86IFBsYWNlU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgLy9GaW5kIGFsbCBwbGFjZXMgdG8gYmUgbmVlZGVkIHVuc2VsZWN0XG4gICAgZm9yIChjb25zdCBwbGFjZVNlbGVjdGlvbiBvZiB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKSB7XG4gICAgICBpZiAoIWN1cnJTZWxlY3RlZFBsYWNlIHx8IGN1cnJTZWxlY3RlZFBsYWNlLmlkICE9PSBwbGFjZVNlbGVjdGlvbi5pZCkge1xuICAgICAgICBjb25zdCBwbGFjZUVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKHBsYWNlU2VsZWN0aW9uLmlkKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgcGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3RhdGUnLCAnRlJFRScpO1xuICAgICAgfVxuICAgIH1cbiAgICAvL1JlbW92ZXMgYWxsIHNlbGVjdGVkIHBsYWNlcyBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgIGlmIChjdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zW2N1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXhdO1xuICAgIGNvbnN0IHBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5udW1iZXIpO1xuXG4gICAgcmV0dXJuIHBsYWNlXG4gICAgICA/IG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHBsYWNlLCBjb2FjaCwgY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvbkNvYWNoU2VsZWN0aW9uKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogU2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbY29hY2hJbmRleF0pIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdO1xuICAgIHJldHVybiBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbihjb2FjaEluZGV4LCBjb2FjaCk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID1cbiAgICAgICAgJ3NlYXQtcmVzZXJ2YXRpb25fX3BsYWNlLWJ1dHRvbi0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0nICsgcGxhY2UubnVtYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSBIVE1MIGVsZW1lbnQgYnkgZ2l2ZW4gcGxhY2VOdW1iZXIgYW5kIGNvYWNoSW5kZXguXG4gICAqIElmIGJvdGggZG9lc250IGV4aXN0LCB3ZSB0cnkgdG8gcmV0dXJuIHRoZSBwbGFjZSBIVE1MIGVsZW1lbnQgYnkgdGhlIF9jdXJyZW50U2VsZWN0ZWRQbGFjZUVsZW1lbnRJZFxuICAgKiBAcGFyYW0gcGxhY2VOdW1iZXIgb3B0aW9uYWwgYXMgc3RyaW5nXG4gICAqIEBwYXJhbSBjb2FjaEluZGV4IG9wdGlvbmFsIGFzIHN0cmluZ1xuICAgKiBAcmV0dXJucyBIVE1MRWxlbWVudCBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRQbGFjZUh0bWxFbGVtZW50KHBsYWNlTnVtYmVyPzogc3RyaW5nLCBjb2FjaEluZGV4PzogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBjdXJyQ29hY2hJbmRleCA9IGNvYWNoSW5kZXggPyBjb2FjaEluZGV4IDogdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIGNvbnN0IGNvYWNoUGxhY2VOdW1iZXJJZCA9IHBsYWNlTnVtYmVyXG4gICAgICA/ICdzZWF0LXJlc2VydmF0aW9uX19wbGFjZS1idXR0b24tJyArIGN1cnJDb2FjaEluZGV4ICsgJy0nICsgcGxhY2VOdW1iZXJcbiAgICAgIDogdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZDtcbiAgICByZXR1cm4gY29hY2hQbGFjZU51bWJlcklkID8gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChjb2FjaFBsYWNlTnVtYmVySWQpIHx8IG51bGwgOiBudWxsO1xuICB9XG5cbiAgLy9TZXQgdGhlIHZlcnRpY2FsIG9mZnNldFxuICBwcml2YXRlIF9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbldyYXBwZXJFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLnNiYi1zcl9fd3JhcHBlcicsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvbldyYXBwZXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvblZlcnRpY2FsT2Zmc2V0ID1cbiAgICAgICAgICBzZWF0UmVzZXJ2YXRpb25XcmFwcGVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tdmVydGljYWwtb2Zmc2V0JyxcbiAgICAgICAgICBgJHtzZWF0UmVzZXJ2YXRpb25WZXJ0aWNhbE9mZnNldH1weGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTY3JvbGxEaXJlY3Rpb24iLCJTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCIsInBsYWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQXlCQSxJQUFLO0FBQUEsQ0FBTCxTQUFLQSxrQkFBZTtBQUNsQkEsbUJBQUEsT0FBQSxJQUFBO0FBQ0FBLG1CQUFBLE1BQUEsSUFBQTtBQUNGLEdBSEssb0JBQUEsa0JBQWUsQ0FBQSxFQUFBO0lBYVAsOEJBQTBCLE1BQUE7O29CQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQW5DLFNBQUEsbUJBQW1DLFlBQVU7QUFBQTs7QUFReEQ7QUFLQTtBQUtBO0FBS0E7QUFLQTtBQUtBO0FBS0E7QUFFUztBQUNBO0FBakNPLHlCQUFBLG1DQUFBLGtCQUFBLE1BQUEsK0JBQW1DLElBQUs7QUFLeEMseUJBQUEsa0NBQUEsa0JBQUEsTUFBQSxrQ0FBQSxHQUFBLGtCQUFBLE1BQUEsNkJBQXlCLElBQUk7QUFLN0IseUJBQUEsa0NBQUEsa0JBQUEsTUFBQSxnQ0FBQSxHQUFBLGtCQUFBLE1BQUEsNkJBQXlCLEtBQUs7QUFLOUIseUJBQUEsaUNBQUEsa0JBQUEsTUFBQSxnQ0FBQSxHQUFBLGtCQUFBLE1BQUEsNEJBQXVCLEVBQUU7QUFLekIseUJBQUEsMkJBQUEsa0JBQUEsTUFBQSwrQkFBQSxHQUFBLGtCQUFBLE1BQUEsc0JBQWlCLElBQUs7QUFLdEIseUJBQUEsb0NBQUEsa0JBQUEsTUFBQSx5QkFBQSxHQUFBLGtCQUFBLE1BQUEsK0JBQTBCLElBQUs7QUFLL0IseUJBQUEsc0NBQUEsa0JBQUEsTUFBQSxrQ0FBQSxHQUFB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
@@ -125,22 +125,21 @@ let SbbSeatReservationScopedElement = (() => {
125
125
  __privateSet(this, _scopedClasses_accessor_storage, value);
126
126
  }
127
127
  willUpdate(_changedProperties) {
128
- var _a2, _b, _c, _d, _e;
129
128
  super.willUpdate(_changedProperties);
130
129
  if (_changedProperties.has("width")) {
131
- (_a2 = this.style) == null ? void 0 : _a2.setProperty("--sbb-seat-reservation-scoped-width", `${this.width}`);
130
+ this.style?.setProperty("--sbb-seat-reservation-scoped-width", `${this.width}`);
132
131
  }
133
132
  if (_changedProperties.has("height")) {
134
- (_b = this.style) == null ? void 0 : _b.setProperty("--sbb-seat-reservation-scoped-height", `${this.height}`);
133
+ this.style?.setProperty("--sbb-seat-reservation-scoped-height", `${this.height}`);
135
134
  }
136
135
  if (_changedProperties.has("insetBlockStart")) {
137
- (_c = this.style) == null ? void 0 : _c.setProperty("--sbb-seat-reservation-scoped-inset-block-start", `${this.insetBlockStart}`);
136
+ this.style?.setProperty("--sbb-seat-reservation-scoped-inset-block-start", `${this.insetBlockStart}`);
138
137
  }
139
138
  if (_changedProperties.has("insetInlineStart")) {
140
- (_d = this.style) == null ? void 0 : _d.setProperty("--sbb-seat-reservation-scoped-inset-inline-start", `${this.insetInlineStart}`);
139
+ this.style?.setProperty("--sbb-seat-reservation-scoped-inset-inline-start", `${this.insetInlineStart}`);
141
140
  }
142
141
  if (_changedProperties.has("zIndex")) {
143
- (_e = this.style) == null ? void 0 : _e.setProperty("--sbb-seat-reservation-scoped-z-index", `${this.zIndex}`);
142
+ this.style?.setProperty("--sbb-seat-reservation-scoped-z-index", `${this.zIndex}`);
144
143
  }
145
144
  }
146
145
  render() {
@@ -193,4 +192,4 @@ let SbbSeatReservationScopedElement = (() => {
193
192
  export {
194
193
  SbbSeatReservationScopedElement
195
194
  };
196
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1zY29wZWQuY29tcG9uZW50LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC9zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHR5cGUgQ1NTUmVzdWx0R3JvdXAsIHR5cGUgUHJvcGVydHlWYWx1ZXMsIHR5cGUgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQuc2Nzcz9saXQmaW5saW5lJztcblxuLyoqXG4gKiBXcmFwcGVyIGNsYXNzIGZvciBzY29wZWQgZWxlbWVudHMgd2l0aCBzaW1pbGFyIHByb3BlcnRpZXMgdG8gc2V0LlxuICovXG5leHBvcnRcbkBjdXN0b21FbGVtZW50KCdzYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQnKVxuY2xhc3MgU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcblxuICAvKiogSW5zZXQgYmxvY2sgc3RhcnQgaW4gcGl4ZWxzICh3aXRob3V0IHVuaXQpICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdpbnNldC1ibG9jay1zdGFydCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGluc2V0QmxvY2tTdGFydDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIEluc2V0IGlubGluZSBzdGFydCBpbiBwaXhlbHMgKHdpdGhvdXQgdW5pdCkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2luc2V0LWlubGluZS1zdGFydCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGluc2V0SW5saW5lU3RhcnQ6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBXaWR0aCBvZiB0aGUgc2NvcGVkIGVsZW1lbnQgaW4gcGl4ZWxzICh3aXRob3V0IHVuaXQpICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd3aWR0aCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIHdpZHRoOiBzdHJpbmcgPSAnJztcblxuICAvKiogSGVpZ2h0IG9mIHRoZSBzY29wZWQgZWxlbWVudCBpbiBwaXhlbHMgKHdpdGhvdXQgdW5pdCkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGhlaWdodDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIFotaW5kZXggb2YgdGhlIHNjb3BlZCBlbGVtZW50ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd6LWluZGV4JyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgekluZGV4OiBzdHJpbmcgPSAnJztcblxuICAvKiogQ2VsbCBpZCBvZiB0aGUgc2NvcGVkIGVsZW1lbnQsIGlmIGl0IGlzIHVzZWQgaW4gYSB0YWJsZSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnY2VsbC1pZCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGNlbGxJZDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIFNjb3BlZCBjbGFzc2VzIGZvciB0aGUgc2NvcGVkIGVsZW1lbnQgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3Njb3BlZC1jbGFzc2VzJyB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2NvcGVkQ2xhc3Nlczogc3RyaW5nID0gJyc7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcyk6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoX2NoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd3aWR0aCcpKSB7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtd2lkdGgnLCBgJHt0aGlzLndpZHRofWApO1xuICAgIH1cblxuICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdoZWlnaHQnKSkge1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLWhlaWdodCcsIGAke3RoaXMuaGVpZ2h0fWApO1xuICAgIH1cblxuICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdpbnNldEJsb2NrU3RhcnQnKSkge1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC1pbnNldC1ibG9jay1zdGFydCcsXG4gICAgICAgIGAke3RoaXMuaW5zZXRCbG9ja1N0YXJ0fWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdpbnNldElubGluZVN0YXJ0JykpIHtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtaW5zZXQtaW5saW5lLXN0YXJ0JyxcbiAgICAgICAgYCR7dGhpcy5pbnNldElubGluZVN0YXJ0fWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd6SW5kZXgnKSkge1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLXotaW5kZXgnLCBgJHt0aGlzLnpJbmRleH1gKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuY2VsbElkKSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiJHt0aGlzLnNjb3BlZENsYXNzZXN9XCI+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvZGl2PmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodG1sYDx0ZCBpZD1cIiR7dGhpcy5jZWxsSWR9XCIgY2xhc3M9XCIke3RoaXMuc2NvcGVkQ2xhc3Nlc31cIj5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC90ZD5gO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkJzogU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIl9hIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBWU0sbUNBQStCLE1BQUE7OzBCQURwQyxjQUFjLDZCQUE2QixDQUFDOzs7O29CQUNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQVIsRUFBQSxtQkFBUSxZQUFVO0FBQUE7O0FBTXRELDREQUFBLGtCQUFBLE1B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
195
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1zY29wZWQuY29tcG9uZW50LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC9zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHR5cGUgQ1NTUmVzdWx0R3JvdXAsIHR5cGUgUHJvcGVydHlWYWx1ZXMsIHR5cGUgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQuc2Nzcz9saXQmaW5saW5lJztcblxuLyoqXG4gKiBXcmFwcGVyIGNsYXNzIGZvciBzY29wZWQgZWxlbWVudHMgd2l0aCBzaW1pbGFyIHByb3BlcnRpZXMgdG8gc2V0LlxuICovXG5leHBvcnRcbkBjdXN0b21FbGVtZW50KCdzYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQnKVxuY2xhc3MgU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcblxuICAvKiogSW5zZXQgYmxvY2sgc3RhcnQgaW4gcGl4ZWxzICh3aXRob3V0IHVuaXQpICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdpbnNldC1ibG9jay1zdGFydCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGluc2V0QmxvY2tTdGFydDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIEluc2V0IGlubGluZSBzdGFydCBpbiBwaXhlbHMgKHdpdGhvdXQgdW5pdCkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2luc2V0LWlubGluZS1zdGFydCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGluc2V0SW5saW5lU3RhcnQ6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBXaWR0aCBvZiB0aGUgc2NvcGVkIGVsZW1lbnQgaW4gcGl4ZWxzICh3aXRob3V0IHVuaXQpICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd3aWR0aCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIHdpZHRoOiBzdHJpbmcgPSAnJztcblxuICAvKiogSGVpZ2h0IG9mIHRoZSBzY29wZWQgZWxlbWVudCBpbiBwaXhlbHMgKHdpdGhvdXQgdW5pdCkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGhlaWdodDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIFotaW5kZXggb2YgdGhlIHNjb3BlZCBlbGVtZW50ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd6LWluZGV4JyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgekluZGV4OiBzdHJpbmcgPSAnJztcblxuICAvKiogQ2VsbCBpZCBvZiB0aGUgc2NvcGVkIGVsZW1lbnQsIGlmIGl0IGlzIHVzZWQgaW4gYSB0YWJsZSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnY2VsbC1pZCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGNlbGxJZDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIFNjb3BlZCBjbGFzc2VzIGZvciB0aGUgc2NvcGVkIGVsZW1lbnQgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3Njb3BlZC1jbGFzc2VzJyB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2NvcGVkQ2xhc3Nlczogc3RyaW5nID0gJyc7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcyk6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoX2NoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd3aWR0aCcpKSB7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtd2lkdGgnLCBgJHt0aGlzLndpZHRofWApO1xuICAgIH1cblxuICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdoZWlnaHQnKSkge1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLWhlaWdodCcsIGAke3RoaXMuaGVpZ2h0fWApO1xuICAgIH1cblxuICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdpbnNldEJsb2NrU3RhcnQnKSkge1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC1pbnNldC1ibG9jay1zdGFydCcsXG4gICAgICAgIGAke3RoaXMuaW5zZXRCbG9ja1N0YXJ0fWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdpbnNldElubGluZVN0YXJ0JykpIHtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtaW5zZXQtaW5saW5lLXN0YXJ0JyxcbiAgICAgICAgYCR7dGhpcy5pbnNldElubGluZVN0YXJ0fWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd6SW5kZXgnKSkge1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLXotaW5kZXgnLCBgJHt0aGlzLnpJbmRleH1gKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuY2VsbElkKSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiJHt0aGlzLnNjb3BlZENsYXNzZXN9XCI+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvZGl2PmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodG1sYDx0ZCBpZD1cIiR7dGhpcy5jZWxsSWR9XCIgY2xhc3M9XCIke3RoaXMuc2NvcGVkQ2xhc3Nlc31cIj5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC90ZD5gO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkJzogU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFZTSxtQ0FBK0IsTUFBQTs7MEJBRHBDLGNBQWMsNkJBQTZCLENBQUM7Ozs7b0JBQ0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBUixFQUFBLG1CQUFRLFlBQVU7QUFBQTs7QUFNdEQsNERBQUEsa0JBQUEsTUFBQSwr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