@sbb-esta/lyne-elements-experimental 3.0.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +908 -567
- package/development/seat-reservation/common/mapper/icon-mapper.d.ts.map +1 -1
- package/development/seat-reservation/common/mapper/icon-mapper.js +1 -3
- package/development/seat-reservation/common/mapper/mapper.d.ts +4 -3
- package/development/seat-reservation/common/mapper/mapper.d.ts.map +1 -1
- package/development/seat-reservation/common/mapper/mapper.js +6 -4
- package/development/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts.map +1 -1
- package/development/seat-reservation/common/mapper/seat-reservation-sample-data.js +4989 -4
- package/development/seat-reservation/common/svgs.d.ts +0 -1
- package/development/seat-reservation/common/svgs.d.ts.map +1 -1
- package/development/seat-reservation/common/svgs.js +1 -3
- package/development/seat-reservation/common/translations/i18n.js +194 -194
- package/development/seat-reservation/common/types.d.ts +10 -0
- package/development/seat-reservation/common/types.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +38 -12
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +252 -122
- package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts +28 -13
- package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation.component.js +481 -262
- package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +17 -10
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +1 -6
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +36 -18
- package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts +3 -1
- package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +26 -4
- package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +86 -54
- package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.d.ts +1 -16
- package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +10 -164
- package/package.json +3 -3
- package/seat-reservation/common/mapper/icon-mapper.d.ts.map +1 -1
- package/seat-reservation/common/mapper/icon-mapper.js +0 -2
- package/seat-reservation/common/mapper/mapper.d.ts +4 -3
- package/seat-reservation/common/mapper/mapper.d.ts.map +1 -1
- package/seat-reservation/common/mapper/mapper.js +16 -14
- package/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts.map +1 -1
- package/seat-reservation/common/mapper/seat-reservation-sample-data.js +4988 -3
- package/seat-reservation/common/svgs.d.ts +0 -1
- package/seat-reservation/common/svgs.d.ts.map +1 -1
- package/seat-reservation/common/svgs.js +4 -11
- package/seat-reservation/common/translations/i18n.js +197 -197
- package/seat-reservation/common/types.d.ts +10 -0
- package/seat-reservation/common/types.d.ts.map +1 -1
- package/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +38 -12
- package/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
- package/seat-reservation/seat-reservation/seat-reservation-base-element.js +208 -134
- package/seat-reservation/seat-reservation/seat-reservation.component.d.ts +28 -13
- package/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
- package/seat-reservation/seat-reservation/seat-reservation.component.js +290 -298
- package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +22 -22
- package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.d.ts.map +1 -1
- package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +0 -5
- package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +37 -37
- package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts +3 -1
- package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -1
- package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +69 -58
- package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts.map +1 -1
- package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +28 -27
- package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.d.ts +1 -16
- package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.d.ts.map +1 -1
- package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +14 -101
|
@@ -17,7 +17,7 @@ var ScrollDirection;
|
|
|
17
17
|
ScrollDirection2["left"] = "left";
|
|
18
18
|
})(ScrollDirection || (ScrollDirection = {}));
|
|
19
19
|
let SeatReservationBaseElement = (() => {
|
|
20
|
-
var _seatReservation_accessor_storage, _hasNavigation_accessor_storage, _alignVertical_accessor_storage, _baseGridSize_accessor_storage, _height_accessor_storage,
|
|
20
|
+
var _seatReservation_accessor_storage, _hasNavigation_accessor_storage, _alignVertical_accessor_storage, _baseGridSize_accessor_storage, _height_accessor_storage, _maxSeatReservations_accessor_storage, _maxBicycleReservations_accessor_storage, _preventPlaceClick_accessor_storage, _preselectCoachIndex_accessor_storage, _selectedCoachIndex_accessor_storage, _focusedCoachIndex_accessor_storage, _hoveredScrollCoachIndex_accessor_storage, _a;
|
|
21
21
|
let _classSuper = LitElement;
|
|
22
22
|
let _seatReservation_decorators;
|
|
23
23
|
let _seatReservation_initializers = [];
|
|
@@ -34,18 +34,27 @@ let SeatReservationBaseElement = (() => {
|
|
|
34
34
|
let _height_decorators;
|
|
35
35
|
let _height_initializers = [];
|
|
36
36
|
let _height_extraInitializers = [];
|
|
37
|
-
let
|
|
38
|
-
let
|
|
39
|
-
let
|
|
37
|
+
let _maxSeatReservations_decorators;
|
|
38
|
+
let _maxSeatReservations_initializers = [];
|
|
39
|
+
let _maxSeatReservations_extraInitializers = [];
|
|
40
|
+
let _maxBicycleReservations_decorators;
|
|
41
|
+
let _maxBicycleReservations_initializers = [];
|
|
42
|
+
let _maxBicycleReservations_extraInitializers = [];
|
|
40
43
|
let _preventPlaceClick_decorators;
|
|
41
44
|
let _preventPlaceClick_initializers = [];
|
|
42
45
|
let _preventPlaceClick_extraInitializers = [];
|
|
46
|
+
let _preselectCoachIndex_decorators;
|
|
47
|
+
let _preselectCoachIndex_initializers = [];
|
|
48
|
+
let _preselectCoachIndex_extraInitializers = [];
|
|
43
49
|
let _selectedCoachIndex_decorators;
|
|
44
50
|
let _selectedCoachIndex_initializers = [];
|
|
45
51
|
let _selectedCoachIndex_extraInitializers = [];
|
|
46
52
|
let _focusedCoachIndex_decorators;
|
|
47
53
|
let _focusedCoachIndex_initializers = [];
|
|
48
54
|
let _focusedCoachIndex_extraInitializers = [];
|
|
55
|
+
let _hoveredScrollCoachIndex_decorators;
|
|
56
|
+
let _hoveredScrollCoachIndex_initializers = [];
|
|
57
|
+
let _hoveredScrollCoachIndex_extraInitializers = [];
|
|
49
58
|
return _a = class extends _classSuper {
|
|
50
59
|
constructor() {
|
|
51
60
|
super(...arguments);
|
|
@@ -54,33 +63,46 @@ let SeatReservationBaseElement = (() => {
|
|
|
54
63
|
__privateAdd(this, _alignVertical_accessor_storage);
|
|
55
64
|
__privateAdd(this, _baseGridSize_accessor_storage);
|
|
56
65
|
__privateAdd(this, _height_accessor_storage);
|
|
57
|
-
__privateAdd(this,
|
|
66
|
+
__privateAdd(this, _maxSeatReservations_accessor_storage);
|
|
67
|
+
__privateAdd(this, _maxBicycleReservations_accessor_storage);
|
|
58
68
|
__privateAdd(this, _preventPlaceClick_accessor_storage);
|
|
69
|
+
__privateAdd(this, _preselectCoachIndex_accessor_storage);
|
|
59
70
|
__privateAdd(this, _selectedCoachIndex_accessor_storage);
|
|
60
71
|
__privateAdd(this, _focusedCoachIndex_accessor_storage);
|
|
72
|
+
__privateAdd(this, _hoveredScrollCoachIndex_accessor_storage);
|
|
61
73
|
__privateSet(this, _seatReservation_accessor_storage, __runInitializers(this, _seatReservation_initializers, null));
|
|
62
74
|
__privateSet(this, _hasNavigation_accessor_storage, (__runInitializers(this, _seatReservation_extraInitializers), __runInitializers(this, _hasNavigation_initializers, true)));
|
|
63
75
|
__privateSet(this, _alignVertical_accessor_storage, (__runInitializers(this, _hasNavigation_extraInitializers), __runInitializers(this, _alignVertical_initializers, false)));
|
|
64
76
|
__privateSet(this, _baseGridSize_accessor_storage, (__runInitializers(this, _alignVertical_extraInitializers), __runInitializers(this, _baseGridSize_initializers, 16)));
|
|
65
77
|
__privateSet(this, _height_accessor_storage, (__runInitializers(this, _baseGridSize_extraInitializers), __runInitializers(this, _height_initializers, null)));
|
|
66
|
-
__privateSet(this,
|
|
67
|
-
__privateSet(this,
|
|
68
|
-
__privateSet(this,
|
|
78
|
+
__privateSet(this, _maxSeatReservations_accessor_storage, (__runInitializers(this, _height_extraInitializers), __runInitializers(this, _maxSeatReservations_initializers, -1)));
|
|
79
|
+
__privateSet(this, _maxBicycleReservations_accessor_storage, (__runInitializers(this, _maxSeatReservations_extraInitializers), __runInitializers(this, _maxBicycleReservations_initializers, -1)));
|
|
80
|
+
__privateSet(this, _preventPlaceClick_accessor_storage, (__runInitializers(this, _maxBicycleReservations_extraInitializers), __runInitializers(this, _preventPlaceClick_initializers, false)));
|
|
81
|
+
__privateSet(this, _preselectCoachIndex_accessor_storage, (__runInitializers(this, _preventPlaceClick_extraInitializers), __runInitializers(this, _preselectCoachIndex_initializers, -1)));
|
|
82
|
+
__privateSet(this, _selectedCoachIndex_accessor_storage, (__runInitializers(this, _preselectCoachIndex_extraInitializers), __runInitializers(this, _selectedCoachIndex_initializers, -1)));
|
|
69
83
|
__privateSet(this, _focusedCoachIndex_accessor_storage, (__runInitializers(this, _selectedCoachIndex_extraInitializers), __runInitializers(this, _focusedCoachIndex_initializers, -1)));
|
|
70
|
-
this
|
|
84
|
+
__privateSet(this, _hoveredScrollCoachIndex_accessor_storage, (__runInitializers(this, _focusedCoachIndex_extraInitializers), __runInitializers(this, _hoveredScrollCoachIndex_initializers, -1)));
|
|
85
|
+
this.coachBorderPadding = (__runInitializers(this, _hoveredScrollCoachIndex_extraInitializers), 6);
|
|
86
|
+
this.gapBetweenCoaches = 4;
|
|
71
87
|
this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
|
|
88
|
+
this.coachNavButtonDim = 0;
|
|
72
89
|
this.currScrollDirection = ScrollDirection.right;
|
|
73
90
|
this.maxCalcCoachsWidth = 0;
|
|
74
91
|
this.scrollCoachsAreaWidth = 0;
|
|
92
|
+
this.scrollNavigationAreaDim = 0;
|
|
75
93
|
this.triggerCoachPositionsCollection = [];
|
|
76
94
|
this.firstTabElement = null;
|
|
77
95
|
this.lastTabElement = null;
|
|
96
|
+
this.navigationScrollArea = null;
|
|
78
97
|
this.coachScrollArea = null;
|
|
79
98
|
this.currSelectedPlace = null;
|
|
80
99
|
this.currSelectedPlaceElementId = null;
|
|
81
100
|
this.currSelectedCoachIndex = -1;
|
|
82
101
|
this.preventCoachScrollByPlaceClick = false;
|
|
83
|
-
this.selectedSeatReservationPlaces =
|
|
102
|
+
this.selectedSeatReservationPlaces = {
|
|
103
|
+
seats: [],
|
|
104
|
+
bicycles: []
|
|
105
|
+
};
|
|
84
106
|
this.seatReservationWithoutNavigationHasFocus = false;
|
|
85
107
|
this.isCoachGridFocusable = false;
|
|
86
108
|
this.isAutoScrolling = false;
|
|
@@ -130,11 +152,18 @@ let SeatReservationBaseElement = (() => {
|
|
|
130
152
|
__privateSet(this, _height_accessor_storage, value);
|
|
131
153
|
}
|
|
132
154
|
/** Maximal number of possible clickable seats */
|
|
133
|
-
get
|
|
134
|
-
return __privateGet(this,
|
|
155
|
+
get maxSeatReservations() {
|
|
156
|
+
return __privateGet(this, _maxSeatReservations_accessor_storage);
|
|
157
|
+
}
|
|
158
|
+
set maxSeatReservations(value) {
|
|
159
|
+
__privateSet(this, _maxSeatReservations_accessor_storage, value);
|
|
160
|
+
}
|
|
161
|
+
/** Maximal number of possible clickable bicycle places */
|
|
162
|
+
get maxBicycleReservations() {
|
|
163
|
+
return __privateGet(this, _maxBicycleReservations_accessor_storage);
|
|
135
164
|
}
|
|
136
|
-
set
|
|
137
|
-
__privateSet(this,
|
|
165
|
+
set maxBicycleReservations(value) {
|
|
166
|
+
__privateSet(this, _maxBicycleReservations_accessor_storage, value);
|
|
138
167
|
}
|
|
139
168
|
/** Any click functionality is prevented */
|
|
140
169
|
get preventPlaceClick() {
|
|
@@ -143,6 +172,12 @@ let SeatReservationBaseElement = (() => {
|
|
|
143
172
|
set preventPlaceClick(value) {
|
|
144
173
|
__privateSet(this, _preventPlaceClick_accessor_storage, value);
|
|
145
174
|
}
|
|
175
|
+
get preselectCoachIndex() {
|
|
176
|
+
return __privateGet(this, _preselectCoachIndex_accessor_storage);
|
|
177
|
+
}
|
|
178
|
+
set preselectCoachIndex(value) {
|
|
179
|
+
__privateSet(this, _preselectCoachIndex_accessor_storage, value);
|
|
180
|
+
}
|
|
146
181
|
get selectedCoachIndex() {
|
|
147
182
|
return __privateGet(this, _selectedCoachIndex_accessor_storage);
|
|
148
183
|
}
|
|
@@ -155,6 +190,13 @@ let SeatReservationBaseElement = (() => {
|
|
|
155
190
|
set focusedCoachIndex(value) {
|
|
156
191
|
__privateSet(this, _focusedCoachIndex_accessor_storage, value);
|
|
157
192
|
}
|
|
193
|
+
//Sets the hover style when scrolling to a coach
|
|
194
|
+
get hoveredScrollCoachIndex() {
|
|
195
|
+
return __privateGet(this, _hoveredScrollCoachIndex_accessor_storage);
|
|
196
|
+
}
|
|
197
|
+
set hoveredScrollCoachIndex(value) {
|
|
198
|
+
__privateSet(this, _hoveredScrollCoachIndex_accessor_storage, value);
|
|
199
|
+
}
|
|
158
200
|
willUpdate(changedProperties) {
|
|
159
201
|
super.willUpdate(changedProperties);
|
|
160
202
|
if (changedProperties.has("seatReservation")) {
|
|
@@ -163,36 +205,56 @@ let SeatReservationBaseElement = (() => {
|
|
|
163
205
|
if (changedProperties.has("baseGridSize")) {
|
|
164
206
|
this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
|
|
165
207
|
this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
|
|
166
|
-
|
|
167
|
-
this._setVerticalAlignmentOffset();
|
|
168
|
-
}
|
|
208
|
+
this.initNavigationSelectionByScrollEvent();
|
|
169
209
|
}
|
|
170
210
|
if (changedProperties.has("height") && !!this.height) {
|
|
171
211
|
if (this.seatReservation.coachItems.length) {
|
|
172
212
|
this.baseGridSize = this.height / this.seatReservation.coachItems[0].dimension.h;
|
|
173
213
|
this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
|
|
174
214
|
this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
|
|
175
|
-
|
|
176
|
-
this._setVerticalAlignmentOffset();
|
|
177
|
-
}
|
|
215
|
+
this.initNavigationSelectionByScrollEvent();
|
|
178
216
|
}
|
|
179
217
|
}
|
|
180
218
|
if (changedProperties.has("alignVertical") && this.alignVertical) {
|
|
181
|
-
this.
|
|
219
|
+
this.initNavigationSelectionByScrollEvent();
|
|
220
|
+
}
|
|
221
|
+
if (changedProperties.has("preselectCoachIndex") && this.preselectCoachIndex) {
|
|
222
|
+
setTimeout(() => this.scrollToSelectedNavCoach(this.preselectCoachIndex), 1);
|
|
182
223
|
}
|
|
183
224
|
}
|
|
225
|
+
navigateByDirectionBtn(btnDirection) {
|
|
226
|
+
this.unfocusPlaceElement();
|
|
227
|
+
let navigateToCoachIndex = this.currSelectedCoachIndex;
|
|
228
|
+
if (btnDirection == "DIRECTION_LEFT" && navigateToCoachIndex > 0) {
|
|
229
|
+
navigateToCoachIndex = this.currSelectedCoachIndex != -1 ? this.currSelectedCoachIndex - 1 : 0;
|
|
230
|
+
} else if (btnDirection == "DIRECTION_RIGHT" && navigateToCoachIndex < this.seatReservation.coachItems.length - 1) {
|
|
231
|
+
navigateToCoachIndex = this.currSelectedCoachIndex != -1 ? this.currSelectedCoachIndex + 1 : 0;
|
|
232
|
+
}
|
|
233
|
+
this.scrollToSelectedNavCoach(navigateToCoachIndex);
|
|
234
|
+
}
|
|
184
235
|
/* Init scroll event handling for coach navigation */
|
|
185
236
|
initNavigationSelectionByScrollEvent() {
|
|
186
|
-
this.
|
|
187
|
-
|
|
188
|
-
|
|
237
|
+
if (this.seatReservation.coachItems.length > 0) {
|
|
238
|
+
const borderHeight = (this.seatReservation.coachItems[0].dimension.h + this.coachBorderOffset * 2) * this.baseGridSize;
|
|
239
|
+
this.style?.setProperty("--sbb-seat-reservation-coach-height", `${borderHeight}`);
|
|
240
|
+
}
|
|
241
|
+
this.firstTabElement = this.shadowRoot?.querySelector("#first-tab-element");
|
|
242
|
+
this.lastTabElement = this.shadowRoot?.querySelector("#last-tab-element");
|
|
243
|
+
this.coachScrollArea = this.shadowRoot?.querySelector("#sbb-sr__parent-area");
|
|
244
|
+
this.navigationScrollArea = this.shadowRoot?.querySelector("#sbb-sr-navigation");
|
|
245
|
+
if (this.navigationScrollArea) {
|
|
246
|
+
this.scrollNavigationAreaDim = this.alignVertical ? this.navigationScrollArea.getBoundingClientRect().height : this.navigationScrollArea.getBoundingClientRect().width;
|
|
247
|
+
const navCoacheList = this.navigationScrollArea.querySelector("ul > li");
|
|
248
|
+
const firstLiEleDimension = navCoacheList?.getBoundingClientRect();
|
|
249
|
+
this.coachNavButtonDim = this.alignVertical ? firstLiEleDimension?.height : firstLiEleDimension?.width;
|
|
250
|
+
}
|
|
189
251
|
if (this.coachScrollArea) {
|
|
190
252
|
let currCalcTriggerPos = 0;
|
|
191
|
-
this.scrollCoachsAreaWidth = this.coachScrollArea.getBoundingClientRect().width;
|
|
253
|
+
this.scrollCoachsAreaWidth = this.alignVertical ? this.coachScrollArea.getBoundingClientRect().height : this.coachScrollArea.getBoundingClientRect().width;
|
|
192
254
|
this.triggerCoachPositionsCollection = this.seatReservation.coachItems.map((coach) => {
|
|
193
255
|
const startPosX = currCalcTriggerPos;
|
|
194
256
|
const coachWidth = this.getCalculatedDimension(coach.dimension).w;
|
|
195
|
-
currCalcTriggerPos += coachWidth;
|
|
257
|
+
currCalcTriggerPos += coachWidth + this.gapBetweenCoaches;
|
|
196
258
|
return {
|
|
197
259
|
start: startPosX,
|
|
198
260
|
end: currCalcTriggerPos,
|
|
@@ -202,11 +264,17 @@ let SeatReservationBaseElement = (() => {
|
|
|
202
264
|
this.maxCalcCoachsWidth = currCalcTriggerPos;
|
|
203
265
|
this.coachScrollArea.addEventListener("scrollend", () => {
|
|
204
266
|
const findScrollCoachIndex = this.isAutoScrolling ? this.currSelectedCoachIndex : this._getCoachIndexByScrollTriggerPosition();
|
|
267
|
+
if (this.currSelectedCoachIndex === -1) {
|
|
268
|
+
this.currSelectedCoachIndex = findScrollCoachIndex;
|
|
269
|
+
}
|
|
205
270
|
if (this._isScrollableToSelectedCoach()) {
|
|
206
271
|
this.currSelectedCoachIndex = findScrollCoachIndex;
|
|
207
272
|
} else {
|
|
208
273
|
this.currSelectedCoachIndex = findScrollCoachIndex < this.currSelectedCoachIndex ? this.currSelectedCoachIndex : findScrollCoachIndex;
|
|
209
274
|
}
|
|
275
|
+
if (!this.isAutoScrolling) {
|
|
276
|
+
this._scrollToSelectedNavigationButton(findScrollCoachIndex);
|
|
277
|
+
}
|
|
210
278
|
this.preventCoachScrollByPlaceClick = false;
|
|
211
279
|
this.updateCurrentSelectedCoach();
|
|
212
280
|
if (!this.hasNavigation) {
|
|
@@ -214,9 +282,6 @@ let SeatReservationBaseElement = (() => {
|
|
|
214
282
|
this.isAutoScrolling = false;
|
|
215
283
|
}
|
|
216
284
|
});
|
|
217
|
-
if (this.alignVertical) {
|
|
218
|
-
this._setVerticalAlignmentOffset();
|
|
219
|
-
}
|
|
220
285
|
}
|
|
221
286
|
}
|
|
222
287
|
/**
|
|
@@ -308,14 +373,105 @@ let SeatReservationBaseElement = (() => {
|
|
|
308
373
|
const isSelectedCoachIndexScrollable = this.selectedCoachIndex !== -1 || this.currSelectedCoachIndex > 0;
|
|
309
374
|
if (isSelectedCoachIndexScrollable && this._isScrollableToSelectedCoach()) {
|
|
310
375
|
this.coachScrollArea.scrollTo({
|
|
311
|
-
top: 0,
|
|
312
|
-
left: scrollToCoachPosX,
|
|
376
|
+
top: this.alignVertical ? scrollToCoachPosX : 0,
|
|
377
|
+
left: this.alignVertical ? 0 : scrollToCoachPosX,
|
|
313
378
|
behavior: "smooth"
|
|
314
379
|
});
|
|
315
380
|
} else {
|
|
316
381
|
this.updateCurrentSelectedCoach();
|
|
317
382
|
}
|
|
383
|
+
this._scrollToSelectedNavigationButton(selectedNavCoachIndex);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
focusPlaceElement(place, coachIndex) {
|
|
387
|
+
this.unfocusPlaceElement();
|
|
388
|
+
if (place) {
|
|
389
|
+
this.currSelectedPlace = place;
|
|
390
|
+
if (coachIndex) {
|
|
391
|
+
this.currSelectedCoachIndex = coachIndex;
|
|
392
|
+
}
|
|
393
|
+
this._setCurrSelectedPlaceElementId(place);
|
|
394
|
+
const selectedPlaceElement = this._getPlaceHtmlElement();
|
|
395
|
+
if (selectedPlaceElement) {
|
|
396
|
+
selectedPlaceElement.setAttribute("keyfocus", "focus");
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
unfocusPlaceElement() {
|
|
401
|
+
const selectedPlaceElement = this._getPlaceHtmlElement();
|
|
402
|
+
if (selectedPlaceElement) {
|
|
403
|
+
selectedPlaceElement.setAttribute("keyfocus", "unfocus");
|
|
404
|
+
this._setCurrSelectedPlaceElementId(null);
|
|
405
|
+
this.currSelectedPlace = null;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
getCalculatedDimension(elementDimension, coachDimension, isOriginHeight, isStretchHeight) {
|
|
409
|
+
if (coachDimension && !isOriginHeight) {
|
|
410
|
+
elementDimension.h += this.coachBorderOffset * 2;
|
|
411
|
+
}
|
|
412
|
+
if (isStretchHeight) {
|
|
413
|
+
elementDimension.h += this.coachBorderOffset;
|
|
414
|
+
}
|
|
415
|
+
return {
|
|
416
|
+
w: this.baseGridSize * elementDimension.w,
|
|
417
|
+
h: this.baseGridSize * elementDimension.h
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
getCalculatedPosition(elementPosition, elementDimension, coachDimension, isOriginHeight) {
|
|
421
|
+
if (coachDimension && elementDimension) {
|
|
422
|
+
const endPosHeight = isOriginHeight ? coachDimension.h : coachDimension.h + this.coachBorderOffset;
|
|
423
|
+
if (elementPosition.y === 0) {
|
|
424
|
+
elementPosition.y -= this.coachBorderOffset;
|
|
425
|
+
} else if (elementPosition.y + elementDimension.h === endPosHeight) {
|
|
426
|
+
elementPosition.y += this.coachBorderOffset;
|
|
427
|
+
}
|
|
318
428
|
}
|
|
429
|
+
return {
|
|
430
|
+
x: this.baseGridSize * elementPosition.x,
|
|
431
|
+
y: this.baseGridSize * elementPosition.y,
|
|
432
|
+
z: elementPosition.z
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Counts all available seats together depending on the seat type
|
|
437
|
+
*
|
|
438
|
+
* @param coachIndex
|
|
439
|
+
* @returns An Object with count of free seats and free bicycle places
|
|
440
|
+
*/
|
|
441
|
+
getAvailableFreePlacesNumFromCoach(coachIndex) {
|
|
442
|
+
const accumulator = { seats: 0, bicycles: 0 };
|
|
443
|
+
const freePlaces = this.seatReservation.coachItems[coachIndex].places?.reduce((accumulator2, currPlace) => {
|
|
444
|
+
if (currPlace.state !== "FREE") {
|
|
445
|
+
return accumulator2;
|
|
446
|
+
}
|
|
447
|
+
if (currPlace.type === "SEAT") {
|
|
448
|
+
accumulator2.seats++;
|
|
449
|
+
} else {
|
|
450
|
+
accumulator2.bicycles++;
|
|
451
|
+
}
|
|
452
|
+
return accumulator2;
|
|
453
|
+
}, accumulator);
|
|
454
|
+
return freePlaces ? freePlaces : accumulator;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Performs an automatic main navigation scroll to the specified selectedNavCoachIndex.
|
|
458
|
+
* Calculates the central scroll offset of the nav coach to be selected.
|
|
459
|
+
* @param selectedNavCoachIndex
|
|
460
|
+
*/
|
|
461
|
+
_scrollToSelectedNavigationButton(selectedNavCoachIndex) {
|
|
462
|
+
setTimeout(() => {
|
|
463
|
+
this.hoveredScrollCoachIndex = selectedNavCoachIndex;
|
|
464
|
+
if (this.hasNavigation && this.navigationScrollArea) {
|
|
465
|
+
const navigationAreaCenteredPosX = this.scrollNavigationAreaDim / 2;
|
|
466
|
+
const scrollButtonOffsetX = selectedNavCoachIndex * this.coachNavButtonDim;
|
|
467
|
+
const scrollOffsetX = scrollButtonOffsetX - navigationAreaCenteredPosX + this.coachNavButtonDim;
|
|
468
|
+
this.navigationScrollArea.scrollTo({
|
|
469
|
+
top: this.alignVertical ? scrollOffsetX : 0,
|
|
470
|
+
left: this.alignVertical ? 0 : scrollOffsetX,
|
|
471
|
+
behavior: "smooth"
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
}, 10);
|
|
319
475
|
}
|
|
320
476
|
/**
|
|
321
477
|
* Sets the new ScrollDirection by the new given target coach index.
|
|
@@ -325,8 +481,8 @@ let SeatReservationBaseElement = (() => {
|
|
|
325
481
|
}
|
|
326
482
|
/**
|
|
327
483
|
* Returns the scroll start or end position X from the selected coach.
|
|
328
|
-
* In case the user is
|
|
329
|
-
* then we return the end position of the coach to get
|
|
484
|
+
* In case the user is currently navigating through places by keyboard and goes to previous coach,
|
|
485
|
+
* then we return the end position of the coach to get the closest scroll position of the next focus place.
|
|
330
486
|
* @returns number
|
|
331
487
|
*/
|
|
332
488
|
_getCoachScrollPositionX() {
|
|
@@ -351,8 +507,8 @@ let SeatReservationBaseElement = (() => {
|
|
|
351
507
|
* @returns boolean
|
|
352
508
|
*/
|
|
353
509
|
_isScrollableToSelectedCoach() {
|
|
354
|
-
const currScrollPosX = this.coachScrollArea.scrollLeft;
|
|
355
|
-
const coachScrollWindowWidth = this.coachScrollArea.getBoundingClientRect().width;
|
|
510
|
+
const currScrollPosX = this.alignVertical ? this.coachScrollArea.scrollTop : this.coachScrollArea.scrollLeft;
|
|
511
|
+
const coachScrollWindowWidth = this.alignVertical ? this.coachScrollArea.getBoundingClientRect().height : this.coachScrollArea.getBoundingClientRect().width;
|
|
356
512
|
const maxScrollWidthArea = this.maxCalcCoachsWidth - coachScrollWindowWidth;
|
|
357
513
|
const currCoachTrigger = this.triggerCoachPositionsCollection[this.currSelectedCoachIndex];
|
|
358
514
|
const isScrollPosSameToCurrCoachPos = currScrollPosX === this.triggerCoachPositionsCollection[this.currSelectedCoachIndex].start;
|
|
@@ -363,7 +519,8 @@ let SeatReservationBaseElement = (() => {
|
|
|
363
519
|
* @returns number
|
|
364
520
|
*/
|
|
365
521
|
_getCoachIndexByScrollTriggerPosition() {
|
|
366
|
-
const
|
|
522
|
+
const scrollPos = this.alignVertical ? this.coachScrollArea.scrollTop : this.coachScrollArea.scrollLeft;
|
|
523
|
+
const scrollOffsetX = scrollPos + this.scrollCoachsAreaWidth / 2;
|
|
367
524
|
return this.triggerCoachPositionsCollection.findIndex((coachTrigger) => scrollOffsetX >= coachTrigger.start && scrollOffsetX <= coachTrigger.end);
|
|
368
525
|
}
|
|
369
526
|
/**
|
|
@@ -374,7 +531,7 @@ let SeatReservationBaseElement = (() => {
|
|
|
374
531
|
let firstPlace = null;
|
|
375
532
|
const coach = this.seatReservation?.coachItems[this.currSelectedCoachIndex];
|
|
376
533
|
const firstCellId = "cell-" + this.currSelectedCoachIndex + "-0-0";
|
|
377
|
-
const placeNumber = this.shadowRoot?.querySelector("
|
|
534
|
+
const placeNumber = this.shadowRoot?.querySelector("#" + firstCellId)?.querySelector("sbb-seat-reservation-place-control")?.getAttribute("text") || null;
|
|
378
535
|
if (coach && placeNumber) {
|
|
379
536
|
firstPlace = coach.places?.find((place) => place.number === placeNumber) || null;
|
|
380
537
|
}
|
|
@@ -420,64 +577,13 @@ let SeatReservationBaseElement = (() => {
|
|
|
420
577
|
}
|
|
421
578
|
return closestPlace;
|
|
422
579
|
}
|
|
423
|
-
|
|
424
|
-
this.unfocusPlaceElement();
|
|
425
|
-
if (place) {
|
|
426
|
-
this.currSelectedPlace = place;
|
|
427
|
-
if (coachIndex) {
|
|
428
|
-
this.currSelectedCoachIndex = coachIndex;
|
|
429
|
-
}
|
|
430
|
-
this._setCurrSelectedPlaceElementId(place);
|
|
431
|
-
const selectedPlaceElement = this._getPlaceHtmlElement();
|
|
432
|
-
if (selectedPlaceElement) {
|
|
433
|
-
selectedPlaceElement.setAttribute("keyfocus", "focus");
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
unfocusPlaceElement() {
|
|
438
|
-
const selectedPlaceElement = this._getPlaceHtmlElement();
|
|
439
|
-
if (selectedPlaceElement) {
|
|
440
|
-
selectedPlaceElement.setAttribute("keyfocus", "unfocus");
|
|
441
|
-
this._setCurrSelectedPlaceElementId(null);
|
|
442
|
-
this.currSelectedPlace = null;
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
getCalculatedDimension(elementDimension, coachDimension, isOriginHeight, isStretchHeight) {
|
|
446
|
-
if (coachDimension && !isOriginHeight) {
|
|
447
|
-
elementDimension.h += this.coachBorderOffset * 2;
|
|
448
|
-
}
|
|
449
|
-
if (isStretchHeight) {
|
|
450
|
-
elementDimension.h += this.coachBorderOffset;
|
|
451
|
-
}
|
|
452
|
-
return {
|
|
453
|
-
w: this.baseGridSize * elementDimension.w,
|
|
454
|
-
h: this.baseGridSize * elementDimension.h
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
getCalculatedPosition(elementPosition, elementDimension, coachDimension, isOriginHeight) {
|
|
458
|
-
if (coachDimension && elementDimension) {
|
|
459
|
-
const endPosHeight = isOriginHeight ? coachDimension.h : coachDimension.h + this.coachBorderOffset;
|
|
460
|
-
if (elementPosition.y === 0) {
|
|
461
|
-
elementPosition.y -= this.coachBorderOffset;
|
|
462
|
-
} else if (elementPosition.y + elementDimension.h === endPosHeight) {
|
|
463
|
-
elementPosition.y += this.coachBorderOffset;
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
return {
|
|
467
|
-
x: this.baseGridSize * elementPosition.x,
|
|
468
|
-
y: this.baseGridSize * elementPosition.y,
|
|
469
|
-
z: elementPosition.z
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
// Handling for Tab navigation if an place is selected inside the coach.
|
|
580
|
+
// Handling for Tab navigation if a place is selected inside the coach.
|
|
473
581
|
// This controls the focused coach from the current selected coach.
|
|
474
582
|
_navigateCoachNavigationByKeyboard(tabDirection) {
|
|
475
583
|
const currFocusIndex = this.focusedCoachIndex === -1 ? this.currSelectedCoachIndex === -1 ? 0 : this.currSelectedCoachIndex : this.focusedCoachIndex;
|
|
476
584
|
const newFocusableIndex = tabDirection === "NEXT_TAB" ? this.getNextAvailableCoachIndex(currFocusIndex) : this.getPrevAvailableCoachIndex(currFocusIndex);
|
|
477
585
|
if (currFocusIndex === newFocusableIndex) {
|
|
478
586
|
this.unfocusPlaceElement();
|
|
479
|
-
this.selectedCoachIndex = -1;
|
|
480
|
-
this.currSelectedCoachIndex = -1;
|
|
481
587
|
this.seatReservationWithoutNavigationHasFocus = false;
|
|
482
588
|
if (tabDirection === "NEXT_TAB")
|
|
483
589
|
this.lastTabElement.focus();
|
|
@@ -492,6 +598,7 @@ let SeatReservationBaseElement = (() => {
|
|
|
492
598
|
if (placeInCoachHasFocus) {
|
|
493
599
|
this.focusedCoachIndex = currFocusIndex;
|
|
494
600
|
this.unfocusPlaceElement();
|
|
601
|
+
return;
|
|
495
602
|
} else {
|
|
496
603
|
this.focusedCoachIndex = newFocusableIndex;
|
|
497
604
|
}
|
|
@@ -507,6 +614,7 @@ let SeatReservationBaseElement = (() => {
|
|
|
507
614
|
this._setFocusToSelectedCoachGrid();
|
|
508
615
|
}
|
|
509
616
|
}
|
|
617
|
+
this._scrollToSelectedNavigationButton(newFocusableIndex);
|
|
510
618
|
} else {
|
|
511
619
|
this.scrollToSelectedNavCoach(newFocusableIndex);
|
|
512
620
|
}
|
|
@@ -538,16 +646,10 @@ let SeatReservationBaseElement = (() => {
|
|
|
538
646
|
return startIndex > 0 ? startIndex - 1 : startIndex;
|
|
539
647
|
}
|
|
540
648
|
updateSelectedSeatReservationPlaces(placeSelection) {
|
|
541
|
-
if (placeSelection.
|
|
542
|
-
|
|
543
|
-
if (seatReservationSelection) {
|
|
544
|
-
this.selectedSeatReservationPlaces.push(seatReservationSelection);
|
|
545
|
-
}
|
|
649
|
+
if (placeSelection.placeType === "SEAT") {
|
|
650
|
+
this.selectedSeatReservationPlaces.seats = this._updateSelectedSeatReservationPlaces(this.selectedSeatReservationPlaces.seats, this.maxSeatReservations, placeSelection);
|
|
546
651
|
} else {
|
|
547
|
-
this.selectedSeatReservationPlaces = this.selectedSeatReservationPlaces.
|
|
548
|
-
}
|
|
549
|
-
if (this.maxReservations && this.selectedSeatReservationPlaces.length > this.maxReservations) {
|
|
550
|
-
this._resetAllPlaceSelections(placeSelection);
|
|
652
|
+
this.selectedSeatReservationPlaces.bicycles = this._updateSelectedSeatReservationPlaces(this.selectedSeatReservationPlaces.bicycles, this.maxBicycleReservations, placeSelection);
|
|
551
653
|
}
|
|
552
654
|
this.dispatchEvent(new CustomEvent("selectedplaces", {
|
|
553
655
|
bubbles: true,
|
|
@@ -555,6 +657,24 @@ let SeatReservationBaseElement = (() => {
|
|
|
555
657
|
detail: this.selectedSeatReservationPlaces
|
|
556
658
|
}));
|
|
557
659
|
}
|
|
660
|
+
_updateSelectedSeatReservationPlaces(selectedSeatReservationPlaces, maxReservations, placeSelection) {
|
|
661
|
+
if (placeSelection.state === "SELECTED") {
|
|
662
|
+
const seatReservationSelection = this._getSeatReservationPlaceSelection(placeSelection);
|
|
663
|
+
if (seatReservationSelection) {
|
|
664
|
+
selectedSeatReservationPlaces.push(seatReservationSelection);
|
|
665
|
+
}
|
|
666
|
+
} else {
|
|
667
|
+
selectedSeatReservationPlaces = selectedSeatReservationPlaces.filter((_selectedPlace) => _selectedPlace.id !== placeSelection.id);
|
|
668
|
+
}
|
|
669
|
+
if (maxReservations > -1 && selectedSeatReservationPlaces.length > maxReservations) {
|
|
670
|
+
if (maxReservations === 0) {
|
|
671
|
+
selectedSeatReservationPlaces = this._resetAllPlaceSelections(selectedSeatReservationPlaces);
|
|
672
|
+
} else {
|
|
673
|
+
selectedSeatReservationPlaces = this._resetAllPlaceSelections(selectedSeatReservationPlaces, placeSelection);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
return selectedSeatReservationPlaces;
|
|
677
|
+
}
|
|
558
678
|
updateCurrentSelectedPlaceInCoach(placeSelection) {
|
|
559
679
|
const coachIndex = placeSelection.coachIndex;
|
|
560
680
|
const place = this.seatReservation.coachItems[coachIndex].places?.find((place2) => place2.number == placeSelection.number);
|
|
@@ -588,27 +708,34 @@ let SeatReservationBaseElement = (() => {
|
|
|
588
708
|
coach.places?.filter((place) => place.state === "SELECTED")?.forEach((place) => {
|
|
589
709
|
const preselectedPlaceSelection = mapPlaceInfosToPlaceSelection(place, coachIndex);
|
|
590
710
|
const seatReservationPlaceSelection = this._getSeatReservationPlaceSelection(preselectedPlaceSelection);
|
|
591
|
-
if (seatReservationPlaceSelection)
|
|
592
|
-
|
|
711
|
+
if (seatReservationPlaceSelection) {
|
|
712
|
+
if (seatReservationPlaceSelection.placeType === "SEAT") {
|
|
713
|
+
this.selectedSeatReservationPlaces.seats.push(seatReservationPlaceSelection);
|
|
714
|
+
} else {
|
|
715
|
+
this.selectedSeatReservationPlaces.bicycles.push(seatReservationPlaceSelection);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
593
718
|
});
|
|
594
719
|
});
|
|
595
720
|
}
|
|
596
721
|
/**
|
|
597
722
|
* All selected places will be reset or the currentSelectedPlace was given, then we reset all except currentSelectedPlace
|
|
723
|
+
* @param reservationPlaceSelections
|
|
598
724
|
* @param currSelectedPlace
|
|
599
725
|
*/
|
|
600
|
-
_resetAllPlaceSelections(currSelectedPlace) {
|
|
601
|
-
for (const placeSelection of
|
|
726
|
+
_resetAllPlaceSelections(reservationPlaceSelections, currSelectedPlace) {
|
|
727
|
+
for (const placeSelection of reservationPlaceSelections) {
|
|
602
728
|
if (!currSelectedPlace || currSelectedPlace.id !== placeSelection.id) {
|
|
603
729
|
const placeElement = this.shadowRoot?.getElementById(placeSelection.id);
|
|
604
730
|
placeElement.setAttribute("state", "FREE");
|
|
605
731
|
}
|
|
606
732
|
}
|
|
607
733
|
if (currSelectedPlace) {
|
|
608
|
-
|
|
734
|
+
reservationPlaceSelections = reservationPlaceSelections.filter((_selectedPlace) => _selectedPlace.id === currSelectedPlace.id);
|
|
609
735
|
} else {
|
|
610
|
-
|
|
736
|
+
reservationPlaceSelections = [];
|
|
611
737
|
}
|
|
738
|
+
return reservationPlaceSelections;
|
|
612
739
|
}
|
|
613
740
|
_getSeatReservationPlaceSelection(currSelectedPlace) {
|
|
614
741
|
const coach = this.seatReservation.coachItems[currSelectedPlace.coachIndex];
|
|
@@ -619,7 +746,8 @@ let SeatReservationBaseElement = (() => {
|
|
|
619
746
|
if (!this.seatReservation.coachItems[coachIndex])
|
|
620
747
|
return null;
|
|
621
748
|
const coach = this.seatReservation.coachItems[coachIndex];
|
|
622
|
-
|
|
749
|
+
const coachNumberOfFreePlaces = this.getAvailableFreePlacesNumFromCoach(coachIndex);
|
|
750
|
+
return mapCoachInfosToCoachSelection(coachIndex, coach, coachNumberOfFreePlaces);
|
|
623
751
|
}
|
|
624
752
|
_setCurrSelectedPlaceElementId(place) {
|
|
625
753
|
if (place) {
|
|
@@ -630,7 +758,7 @@ let SeatReservationBaseElement = (() => {
|
|
|
630
758
|
}
|
|
631
759
|
/**
|
|
632
760
|
* Returns the current selected place HTML element by given placeNumber and coachIndex.
|
|
633
|
-
* If both
|
|
761
|
+
* If both doesn't exist, we try to return the place HTML element by the _currentSelectedPlaceElementId
|
|
634
762
|
* @param placeNumber optional as string
|
|
635
763
|
* @param coachIndex optional as string
|
|
636
764
|
* @returns HTMLElement or null
|
|
@@ -640,27 +768,20 @@ let SeatReservationBaseElement = (() => {
|
|
|
640
768
|
const coachPlaceNumberId = placeNumber ? "seat-reservation__place-button-" + currCoachIndex + "-" + placeNumber : this.currSelectedPlaceElementId;
|
|
641
769
|
return coachPlaceNumberId ? this.shadowRoot?.getElementById(coachPlaceNumberId) || null : null;
|
|
642
770
|
}
|
|
643
|
-
|
|
644
|
-
_setVerticalAlignmentOffset() {
|
|
645
|
-
setTimeout(() => {
|
|
646
|
-
const seatReservationWrapperElement = this.shadowRoot?.querySelector(".sbb-sr__wrapper");
|
|
647
|
-
if (seatReservationWrapperElement) {
|
|
648
|
-
const seatReservationVerticalOffset = seatReservationWrapperElement.getBoundingClientRect().width;
|
|
649
|
-
this.style?.setProperty("--sbb-seat-reservation-vertical-offset", `${seatReservationVerticalOffset}px`);
|
|
650
|
-
}
|
|
651
|
-
});
|
|
652
|
-
}
|
|
653
|
-
}, _seatReservation_accessor_storage = new WeakMap(), _hasNavigation_accessor_storage = new WeakMap(), _alignVertical_accessor_storage = new WeakMap(), _baseGridSize_accessor_storage = new WeakMap(), _height_accessor_storage = new WeakMap(), _maxReservations_accessor_storage = new WeakMap(), _preventPlaceClick_accessor_storage = new WeakMap(), _selectedCoachIndex_accessor_storage = new WeakMap(), _focusedCoachIndex_accessor_storage = new WeakMap(), (() => {
|
|
771
|
+
}, _seatReservation_accessor_storage = new WeakMap(), _hasNavigation_accessor_storage = new WeakMap(), _alignVertical_accessor_storage = new WeakMap(), _baseGridSize_accessor_storage = new WeakMap(), _height_accessor_storage = new WeakMap(), _maxSeatReservations_accessor_storage = new WeakMap(), _maxBicycleReservations_accessor_storage = new WeakMap(), _preventPlaceClick_accessor_storage = new WeakMap(), _preselectCoachIndex_accessor_storage = new WeakMap(), _selectedCoachIndex_accessor_storage = new WeakMap(), _focusedCoachIndex_accessor_storage = new WeakMap(), _hoveredScrollCoachIndex_accessor_storage = new WeakMap(), (() => {
|
|
654
772
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
655
773
|
_seatReservation_decorators = [property({ attribute: "seat-reservation", type: Object })];
|
|
656
774
|
_hasNavigation_decorators = [forceType(), property({ attribute: "has-navigation", type: Boolean })];
|
|
657
775
|
_alignVertical_decorators = [forceType(), property({ attribute: "align-vertical", type: Boolean })];
|
|
658
776
|
_baseGridSize_decorators = [forceType(), property({ attribute: "base-grid-size", type: Number })];
|
|
659
777
|
_height_decorators = [forceType(), property({ attribute: "height", type: Number })];
|
|
660
|
-
|
|
778
|
+
_maxSeatReservations_decorators = [forceType(), property({ attribute: "max-seat-reservations", type: Number })];
|
|
779
|
+
_maxBicycleReservations_decorators = [forceType(), property({ attribute: "max-bicycle-reservations", type: Number })];
|
|
661
780
|
_preventPlaceClick_decorators = [forceType(), property({ attribute: "prevent-place-click", type: Boolean })];
|
|
781
|
+
_preselectCoachIndex_decorators = [forceType(), property({ attribute: "preselect-coach-index", type: Number })];
|
|
662
782
|
_selectedCoachIndex_decorators = [state()];
|
|
663
783
|
_focusedCoachIndex_decorators = [state()];
|
|
784
|
+
_hoveredScrollCoachIndex_decorators = [state()];
|
|
664
785
|
__esDecorate(_a, null, _seatReservation_decorators, { kind: "accessor", name: "seatReservation", static: false, private: false, access: { has: (obj) => "seatReservation" in obj, get: (obj) => obj.seatReservation, set: (obj, value) => {
|
|
665
786
|
obj.seatReservation = value;
|
|
666
787
|
} }, metadata: _metadata }, _seatReservation_initializers, _seatReservation_extraInitializers);
|
|
@@ -676,18 +797,27 @@ let SeatReservationBaseElement = (() => {
|
|
|
676
797
|
__esDecorate(_a, null, _height_decorators, { kind: "accessor", name: "height", static: false, private: false, access: { has: (obj) => "height" in obj, get: (obj) => obj.height, set: (obj, value) => {
|
|
677
798
|
obj.height = value;
|
|
678
799
|
} }, metadata: _metadata }, _height_initializers, _height_extraInitializers);
|
|
679
|
-
__esDecorate(_a, null,
|
|
680
|
-
obj.
|
|
681
|
-
} }, metadata: _metadata },
|
|
800
|
+
__esDecorate(_a, null, _maxSeatReservations_decorators, { kind: "accessor", name: "maxSeatReservations", static: false, private: false, access: { has: (obj) => "maxSeatReservations" in obj, get: (obj) => obj.maxSeatReservations, set: (obj, value) => {
|
|
801
|
+
obj.maxSeatReservations = value;
|
|
802
|
+
} }, metadata: _metadata }, _maxSeatReservations_initializers, _maxSeatReservations_extraInitializers);
|
|
803
|
+
__esDecorate(_a, null, _maxBicycleReservations_decorators, { kind: "accessor", name: "maxBicycleReservations", static: false, private: false, access: { has: (obj) => "maxBicycleReservations" in obj, get: (obj) => obj.maxBicycleReservations, set: (obj, value) => {
|
|
804
|
+
obj.maxBicycleReservations = value;
|
|
805
|
+
} }, metadata: _metadata }, _maxBicycleReservations_initializers, _maxBicycleReservations_extraInitializers);
|
|
682
806
|
__esDecorate(_a, null, _preventPlaceClick_decorators, { kind: "accessor", name: "preventPlaceClick", static: false, private: false, access: { has: (obj) => "preventPlaceClick" in obj, get: (obj) => obj.preventPlaceClick, set: (obj, value) => {
|
|
683
807
|
obj.preventPlaceClick = value;
|
|
684
808
|
} }, metadata: _metadata }, _preventPlaceClick_initializers, _preventPlaceClick_extraInitializers);
|
|
809
|
+
__esDecorate(_a, null, _preselectCoachIndex_decorators, { kind: "accessor", name: "preselectCoachIndex", static: false, private: false, access: { has: (obj) => "preselectCoachIndex" in obj, get: (obj) => obj.preselectCoachIndex, set: (obj, value) => {
|
|
810
|
+
obj.preselectCoachIndex = value;
|
|
811
|
+
} }, metadata: _metadata }, _preselectCoachIndex_initializers, _preselectCoachIndex_extraInitializers);
|
|
685
812
|
__esDecorate(_a, null, _selectedCoachIndex_decorators, { kind: "accessor", name: "selectedCoachIndex", static: false, private: false, access: { has: (obj) => "selectedCoachIndex" in obj, get: (obj) => obj.selectedCoachIndex, set: (obj, value) => {
|
|
686
813
|
obj.selectedCoachIndex = value;
|
|
687
814
|
} }, metadata: _metadata }, _selectedCoachIndex_initializers, _selectedCoachIndex_extraInitializers);
|
|
688
815
|
__esDecorate(_a, null, _focusedCoachIndex_decorators, { kind: "accessor", name: "focusedCoachIndex", static: false, private: false, access: { has: (obj) => "focusedCoachIndex" in obj, get: (obj) => obj.focusedCoachIndex, set: (obj, value) => {
|
|
689
816
|
obj.focusedCoachIndex = value;
|
|
690
817
|
} }, metadata: _metadata }, _focusedCoachIndex_initializers, _focusedCoachIndex_extraInitializers);
|
|
818
|
+
__esDecorate(_a, null, _hoveredScrollCoachIndex_decorators, { kind: "accessor", name: "hoveredScrollCoachIndex", static: false, private: false, access: { has: (obj) => "hoveredScrollCoachIndex" in obj, get: (obj) => obj.hoveredScrollCoachIndex, set: (obj, value) => {
|
|
819
|
+
obj.hoveredScrollCoachIndex = value;
|
|
820
|
+
} }, metadata: _metadata }, _hoveredScrollCoachIndex_initializers, _hoveredScrollCoachIndex_extraInitializers);
|
|
691
821
|
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
692
822
|
})(), _a.events = {
|
|
693
823
|
selectedplaces: "selectedplaces",
|
|
@@ -697,4 +827,4 @@ let SeatReservationBaseElement = (() => {
|
|
|
697
827
|
export {
|
|
698
828
|
SeatReservationBaseElement
|
|
699
829
|
};
|
|
700
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgdHlwZSBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvbW1vbi9tYXBwZXIuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb2FjaEl0ZW0sXG4gIEVsZW1lbnREaW1lbnNpb24sXG4gIEVsZW1lbnRQb3NpdGlvbixcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb24sXG4gIFNlYXRSZXNlcnZhdGlvbkNvYWNoU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wuY29tcG9uZW50LmpzJztcbmltcG9ydCB0eXBlIHsgU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tc2NvcGVkL3NlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLmNvbXBvbmVudC5qcyc7XG5cbmVudW0gU2Nyb2xsRGlyZWN0aW9uIHtcbiAgcmlnaHQgPSAncmlnaHQnLFxuICBsZWZ0ID0gJ2xlZnQnLFxufVxuXG5pbnRlcmZhY2UgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQge1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudERldGFpbHMgPSBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdO1xuXG5leHBvcnQgY2xhc3MgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgc2VsZWN0ZWRwbGFjZXM6ICdzZWxlY3RlZHBsYWNlcycsXG4gICAgc2VsZWN0ZWRjb2FjaDogJ3NlbGVjdGVkY29hY2gnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgYWxsIGNvYWNoZXMgYW5kIHBsYWNlcyAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdzZWF0LXJlc2VydmF0aW9uJywgdHlwZTogT2JqZWN0IH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiA9IG51bGwhO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBuYXZpZ2F0aW9uIGNhbiBiZSB0b2dnbGVkIGJ5IHRoaXMgcHJvcGVydHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hhcy1uYXZpZ2F0aW9uJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGFzTmF2aWdhdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEgaXMgYWxpZ25lZCB2ZXJ0aWNhbGx5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhbGlnbi12ZXJ0aWNhbCcsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGFsaWduVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSdzIGJhc2UgZ3JpZCBzaXplICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdiYXNlLWdyaWQtc2l6ZScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYmFzZUdyaWRTaXplOiBudW1iZXIgPSAxNjtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSdzIHdpZHRoICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoZWlnaHQnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGhlaWdodDogbnVtYmVyID0gbnVsbCE7XG5cbiAgLyoqIE1heGltYWwgbnVtYmVyIG9mIHBvc3NpYmxlIGNsaWNrYWJsZSBzZWF0cyAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbWF4LXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIgPSBudWxsITtcblxuICAvKiogQW55IGNsaWNrIGZ1bmN0aW9uYWxpdHkgaXMgcHJldmVudGVkICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdwcmV2ZW50LXBsYWNlLWNsaWNrJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJldmVudFBsYWNlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3Igc2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGZvY3VzZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICBwcm90ZWN0ZWQgY29hY2hCb3JkZXJQYWRkaW5nID0gNjtcbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgcHJvdGVjdGVkIGN1cnJTY3JvbGxEaXJlY3Rpb246IFNjcm9sbERpcmVjdGlvbiA9IFNjcm9sbERpcmVjdGlvbi5yaWdodDtcbiAgcHJvdGVjdGVkIG1heENhbGNDb2FjaHNXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbENvYWNoc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb246IENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50W10gPSBbXTtcbiAgcHJvdGVjdGVkIGZpcnN0VGFiRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGxhc3RUYWJFbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgY29hY2hTY3JvbGxBcmVhOiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkUGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgcHJvdGVjdGVkIHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10gPSBbXTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBrZXlib2FyZE5hdmlnYXRpb25FdmVudHMgPSB7XG4gICAgQXJyb3dMZWZ0OiAnQXJyb3dMZWZ0JyxcbiAgICBBcnJvd1JpZ2h0OiAnQXJyb3dSaWdodCcsXG4gICAgQXJyb3dVcDogJ0Fycm93VXAnLFxuICAgIEFycm93RG93bjogJ0Fycm93RG93bicsXG4gICAgVGFiOiAnVGFiJyxcbiAgICBFbnRlcjogJ0VudGVyJyxcbiAgfSBhcyBjb25zdDtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NlYXRSZXNlcnZhdGlvbicpKSB7XG4gICAgICB0aGlzLl9pbml0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdiYXNlR3JpZFNpemUnKSkge1xuICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemUnLCBgJHt0aGlzLmJhc2VHcmlkU2l6ZX1weGApO1xuXG4gICAgICBpZiAodGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICAgIHRoaXMuX3NldFZlcnRpY2FsQWxpZ25tZW50T2Zmc2V0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICBpZiAodGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICAgICAgdGhpcy5fc2V0VmVydGljYWxBbGlnbm1lbnRPZmZzZXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2FsaWduVmVydGljYWwnKSAmJiB0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgIHRoaXMuX3NldFZlcnRpY2FsQWxpZ25tZW50T2Zmc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgLyogSW5pdCBzY3JvbGwgZXZlbnQgaGFuZGxpbmcgZm9yIGNvYWNoIG5hdmlnYXRpb24gKi9cbiAgcHJvdGVjdGVkIGluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpcnN0VGFiRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoJ2ZpcnN0LXRhYi1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5sYXN0VGFiRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoJ2xhc3QtdGFiLWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoJ3NiYi1zcl9fcGFyZW50LWFyZWEnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICh0aGlzLmNvYWNoU2Nyb2xsQXJlYSkge1xuICAgICAgbGV0IGN1cnJDYWxjVHJpZ2dlclBvcyA9IDA7XG4gICAgICB0aGlzLnNjcm9sbENvYWNoc0FyZWFXaWR0aCA9IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBQcmVjYWxjdWxhdGUgdHJpZ2dlciBzY3JvbGwgcG9zaXRpb24gYXJyYXkgZGVwZW5kcyBmcm9tIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24gPSB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2gpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3NYID0gY3VyckNhbGNUcmlnZ2VyUG9zO1xuICAgICAgICBjb25zdCBjb2FjaFdpZHRoID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoLmRpbWVuc2lvbikudztcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9IGNvYWNoV2lkdGg7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhcnQ6IHN0YXJ0UG9zWCxcbiAgICAgICAgICBlbmQ6IGN1cnJDYWxjVHJpZ2dlclBvcyxcbiAgICAgICAgICB3aWR0aDogY29hY2hXaWR0aCxcbiAgICAgICAgfSBhcyBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgbWF4aW11bSBjYWxjdWxhdGVkIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLm1heENhbGNDb2FjaHNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcblxuICAgICAgLy8gQXQgdGhlIGVuZCBvZiBhIHNjcm9sbCBFdmVudHMgdG8gYSBjb2FjaCwgdGhlIHJlYWNoZWQgd2Fnb24gaXMgbWFya2VkIGFzIHNlbGVjdGVkXG4gICAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGxlbmQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbmRTY3JvbGxDb2FjaEluZGV4ID0gdGhpcy5pc0F1dG9TY3JvbGxpbmdcbiAgICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgIDogdGhpcy5fZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLl9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKSkge1xuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgICAgICBmaW5kU2Nyb2xsQ29hY2hJbmRleCA8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICA6IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICAgICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRHVyaW5nIGluaXRpYWxpemF0aW9uLCB3ZSBjaGVjayB2ZXJ0aWNhbCBhbGlnbm1lbnQgbW9kZS4gSW4gVmVydGljYWwgbW9kZSB3ZSBoYXZlIHRvIHNldCB0aGUgdmVydGljYWwgb2Zmc2V0IG1hbnVhbCBmb3IgdGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSxcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugcm90YXRlIHRoZSBlbnRpcmUgY29tcG9uZW50IGJ5IDkwIGRlZ3JlZXMgYW5kIHRyYW5zZm9ybSB0aGUgb3JpZ2luIHBvaW50IHRvIHRvcCBsZWZ0LlxuICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICB0aGlzLl9zZXRWZXJ0aWNhbEFsaWdubWVudE9mZnNldCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0cyAocHJvcGVydHkgc2V0dGluZyAtPiBoYXNOYXZpZ2F0aW9uKSBhbmQgYSB0YWJsZSBjb2FjaCBnZXRzIHRoZSBmb2N1cyxcbiAgICogdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaCBtdXN0IGJlIGF1dG9tYXRpY2FsbHkgcHJlc2VsZWN0ZWQgdG8gY29udHJvbCB0aGUgcGxhY2UgbmF2aWdhdGlvbiB2aWEga2V5Ym9hcmRcbiAgICpcbiAgICogQHBhcmFtIGZvY3VzQ29hY2hJbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNUYWJsZUNvYWNoQW5kUHJlc2VsZWN0UGxhY2UoZm9jdXNDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyAmJiAhdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZm9jdXNDb2FjaEluZGV4ID09PSAwXG4gICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KC0xKVxuICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChmb2N1c0NvYWNoSW5kZXgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzYXRpb24gb2YgS2V5Ym9hcmQgZXZlbnQgaGFuZGxpbmcgdG8gbmF2aWdhdGlvbiBiZXR3ZWVuIGVhY2ggcGxhY2VzIGluc2lkZSBhIHNlbGVjdGVkIGNvYWNoIGJ5IHVzaW5nIFthcnJvd10ga2V5cy5cbiAgICogV2l0aCB0aGUgW1RBQl0ga2V5IHRoZSB1c2VyIG5hdmlnYXRpb24gZ29lcyB0byB0aGUgbmV4dCBjb2FjaCBuYXZpZ2F0aW9uIGVsZW1lbnQgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2UgaXMgYXV0b21hdGljYWxseSByZXNldC5cbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcblxuICAgIC8vIElmIGFueSBwbGFjZSBpcyBzZWxlY3RlZCBhbmQgVEFCIEtleSBjb21iaW5hdGlvbiBpc3QgcHJlc3NlZCxcbiAgICAvLyB0aGVuIHdlIGhhbmRsZSB0aGUgbmV4dCBvciBwcmV2aW91cyBjb2FjaCBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IDkpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdORVhUX1RBQicpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgdGhlIGFycm93IGtleSBpcyBwcmVzc2VkXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgJiYgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgc3dpdGNoIChwcmVzc2VkS2V5KSB7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRMZWZ0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZExlZnRLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkUmlnaHRLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFJpZ2h0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXA6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFVwS2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFVwS2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkRG93bktleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkRG93bktleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHBsYWNlIGluc2lkZSB0aGUgY29hY2ggaWYgbmF2aWdhdGVkIHZpYSBrZXlib2FyZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBjb2FjaCBncmlkIGlzIHNlbGVjdGVkIChuZWNlc3NhcnkgZm9yIFNjcmVlblJlYWRlcilcbiAgICovXG4gIHByb3RlY3RlZCBwcmVzZWxlY3RQbGFjZUluQ29hY2goKTogdm9pZCB7XG4gICAgY29uc3QgY2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24oKTtcbiAgICAvL0lmIGNsb3Nlc3RQbGFjZSBleGlzdCwgd2UgaGF2ZSB0byB1bmZvY3VzIHByZXZpb3VzZSBmb2N1c2VkIHBsYWNlXG4gICAgaWYgKGNsb3Nlc3RQbGFjZSkge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgLy8gT25seSB3aGVuIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCBhbmQgY29hY2hlcyBhcmUgc2Nyb2xsZWQgYnkgYXV0byBzY3JvbGxpbmcsXG4gICAgLy8gdGhlbiB3ZSBjYW4gc2V0IHRoZSBmb2N1cyBvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoLlxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICBpZiAoY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoY2xvc2VzdFBsYWNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHByZXNlbGVjdGlvbiBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgbm9ybWFsIGNsaWNraW5nIG9yIHZpYSBzY3JlZW5yZWFkZXIgdmlhIHRhYixcbiAgICAvLyB3ZSBvbmx5IGZvY3VzIHRoZSB0YWJsZSB3aXRob3V0IGRpcmVjdGx5IGZvY3VzaW5nIHRoZSBwbGFjZS5cbiAgICBlbHNlIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gc2V0IHRoZSBjdXJyU2VsZWN0ZWRQbGFjZSBoZXJlIGZvciBmdXJ0aGVyIGNvcnJlY3QgZnVuY3Rpb25pbmcgbmF2aWdhdGlvbiB2aWEgdGFiLlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IGNsb3Nlc3RQbGFjZTtcbiAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2goc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICBsZWZ0OiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgU2Nyb2xsRGlyZWN0aW9uIGJ5IHRoZSBuZXcgZ2l2ZW4gdGFyZ2V0IGNvYWNoIGluZGV4LlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA/IFNjcm9sbERpcmVjdGlvbi5yaWdodFxuICAgICAgICA6IFNjcm9sbERpcmVjdGlvbi5sZWZ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNjcm9sbCBzdGFydCBvciBlbmQgcG9zaXRpb24gWCBmcm9tIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogSW4gY2FzZSB0aGUgdXNlciBpcyBjdXJyZXRubHkgbmF2aWdhdGUgdGhyb3VnaHQgcGxhY2VzIGJ5IGtleWJvYXJkIGFuZCBnb2VzIHRvIHByZXZpb3VzIGNvYWNoLFxuICAgKiB0aGVuIHdlIHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb2FjaCB0byBnZXQgY2xvc3Rlc3QgbmV4dCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIG5leHQgZm9jdXMgcGxhY2UuXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2FjaFRyaWdnZXJQb2ludCA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb24gPVxuICAgICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJlxuICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgY29hY2hUcmlnZ2VyUG9pbnQud2lkdGggPiB0aGlzLnNjcm9sbENvYWNoc0FyZWFXaWR0aDtcbiAgICByZXR1cm4gaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvblxuICAgICAgPyBjb2FjaFRyaWdnZXJQb2ludC5lbmQgLSB0aGlzLnNjcm9sbENvYWNoc0FyZWFXaWR0aFxuICAgICAgOiBjb2FjaFRyaWdnZXJQb2ludC5zdGFydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmb2N1cyBvbiB0aGUgSFRNTCB0YWJsZSAoZ3JpZCkgY2FwdGlvbiBlbGVtZW50IHNvIHRoYXQgdGhlIGhlYWRpbmcgaXMgcmVhZCBvdXQgd2hlbiB1c2luZyBhIFNjcmVlblJlYWRlci5cbiAgICovXG4gIHByaXZhdGUgX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpOiB2b2lkIHtcbiAgICAvLyBXaGVuIHRoZSB1c2VyIHBlcmZvcm1zIGFuIGFjdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGNvYWNoIG5hdmlnYXRpb24sIHRoZW4gdGhlIG5hdmlnYXRlZCB0YWJsZSBpcyBmb2N1c2FibGUuXG4gICAgaWYgKHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUpIHtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJyNzYmItc3ItY29hY2gtY2FwdGlvbi0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgKSBhcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDtcbiAgICAgIGlmIChjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgY29hY2hUYWJsZUNhcHRpb25FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGxlZCBwb3NpdGlvbiBjYW4gYmUgdXNlZCB0byBzY3JvbGwgdG8gdGhlIHNlbGVjdGVkIHdhZ29uXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIHByaXZhdGUgX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyU2Nyb2xsUG9zWCA9IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgY29hY2hTY3JvbGxXaW5kb3dXaWR0aCA9IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IG1heFNjcm9sbFdpZHRoQXJlYSA9IHRoaXMubWF4Q2FsY0NvYWNoc1dpZHRoIC0gY29hY2hTY3JvbGxXaW5kb3dXaWR0aDtcbiAgICBjb25zdCBjdXJyQ29hY2hUcmlnZ2VyID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3MgPVxuICAgICAgY3VyclNjcm9sbFBvc1ggPT09IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnN0YXJ0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIChjdXJyU2Nyb2xsUG9zWCA8IG1heFNjcm9sbFdpZHRoQXJlYSB8fCBjdXJyU2Nyb2xsUG9zWCA+IGN1cnJDb2FjaFRyaWdnZXIuc3RhcnQpICYmXG4gICAgICAhaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvYWNoIGluZGV4IHdoaWNoIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBzY3JvbGwgYXJlYVxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0ICsgdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGggLyAyO1xuICAgIHJldHVybiB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24uZmluZEluZGV4KFxuICAgICAgKGNvYWNoVHJpZ2dlcikgPT4gc2Nyb2xsT2Zmc2V0WCA+PSBjb2FjaFRyaWdnZXIuc3RhcnQgJiYgc2Nyb2xsT2Zmc2V0WCA8PSBjb2FjaFRyaWdnZXIuZW5kLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaXJzdCBwbGFjZSBvZiBjdXJyZW50IHNlbGVjdGVkIGNvYWNoIGJ5IHRhYmxlIGNlbGwgY29vcmRpbmF0ZSAwLTAgaWQuXG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldEZpcnN0UGxhY2VJblNlbGVjZWRDb2FjaCgpOiBQbGFjZSB8IG51bGwge1xuICAgIGxldCBmaXJzdFBsYWNlOiBQbGFjZSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBmaXJzdENlbGxJZCA9ICdjZWxsLScgKyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAnLTAtMCc7XG4gICAgY29uc3QgcGxhY2VOdW1iZXIgPVxuICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxTYmJTZWF0UmVzZXJ2YXRpb25TY29wZWRFbGVtZW50PihcIltjZWxsLWlkPSdcIiArIGZpcnN0Q2VsbElkICsgXCInXVwiKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBnZXQgdGhlIGNvcnJlY3QgY2xvc2VzdCBwbGFjZSBvZiBjdXJyZW50IHByZXNzZWQga2V5IGFuZCB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSxcbiAgICogd2UgaGF2ZSB0byBpbnZlc3RpZ2F0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBwbGFjZSB0byBmaW5kIHRoZSBjbG9zZXN0IHBsYWNlIG9mIHRoZSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHBhcmFtIHByZXNzZWRLZXlcbiAgICogQHJldHVybnMgUGxhY2Ugb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleT86IHN0cmluZyk6IFBsYWNlIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGxldCBjbG9zZXN0UGxhY2UgPSBudWxsO1xuICAgIGlmIChjb2FjaC5wbGFjZXMpIHtcbiAgICAgIC8vIElmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZSB1c2UgaW5pdGlhbCB0aGUgbGVmdC10b3AgcGxhY2Ugb24gdGhlIGNvYWNoXG4gICAgICBpZiAoIXRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpcnN0UGxhY2VJblNlbGVjZWRDb2FjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsYWNlIG9mIGNvYWNoLnBsYWNlcykge1xuICAgICAgICAgICAgLy8gSWYga2V5IHByZXNzZWQsIHRoZW4gd2UgdHJ5IHRvIGZpbmQgdGhlIHBsYWNlIG9mIHRoZSBjdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb25cbiAgICAgICAgICAgIGlmICghcHJlc3NlZEtleSkge1xuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIGNvYWNoIGJ5IHkgY29vcmRpbmF0ZS4gQ3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uIGlzIFJJR0hUKVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5wb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBMRUZUXG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5wb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHBsYWNlLm51bWJlciAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ubnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgLy9LZXkgW1JpZ2h0XSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHgtYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbRG93bl0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB5LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggKyAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA+IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueSA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi55KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtMZWZ0XSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHgtYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgKyAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA8IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtVcF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB5LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueCAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55IDwgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ucG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueSA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi55KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbG9zZXN0UGxhY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9jdXNQbGFjZUVsZW1lbnQocGxhY2U6IFBsYWNlIHwgbnVsbCwgY29hY2hJbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgIGlmIChwbGFjZSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuICAgICAgaWYgKGNvYWNoSW5kZXgpIHtcbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gY29hY2hJbmRleDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgICBzZWxlY3RlZFBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJywgJ2ZvY3VzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHVuZm9jdXNQbGFjZUVsZW1lbnQoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICBzZWxlY3RlZFBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJywgJ3VuZm9jdXMnKTtcbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKG51bGwpO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhbGN1bGF0ZWREaW1lbnNpb24oXG4gICAgZWxlbWVudERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNPcmlnaW5IZWlnaHQ/OiBib29sZWFuLFxuICAgIGlzU3RyZXRjaEhlaWdodD86IGJvb2xlYW4sXG4gICk6IEVsZW1lbnREaW1lbnNpb24ge1xuICAgIGlmIChjb2FjaERpbWVuc2lvbiAmJiAhaXNPcmlnaW5IZWlnaHQpIHtcbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJldGNoSGVpZ2h0KSB7XG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdzogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncsXG4gICAgICBoOiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICBlbGVtZW50UG9zaXRpb246IEVsZW1lbnRQb3NpdGlvbixcbiAgICBlbGVtZW50RGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNPcmlnaW5IZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50UG9zaXRpb24ge1xuICAgIGlmIChjb2FjaERpbWVuc2lvbiAmJiBlbGVtZW50RGltZW5zaW9uKSB7XG4gICAgICBjb25zdCBlbmRQb3NIZWlnaHQgPSBpc09yaWdpbkhlaWdodFxuICAgICAgICA/IGNvYWNoRGltZW5zaW9uLmhcbiAgICAgICAgOiBjb2FjaERpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIC8vSWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgY29hY2gsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIFkgY29vcmRpbmF0ZSB3aXRoIHRoZSBhZGRpdGlvbmFsIGJvcmRlciBwYWRkaW5nXG4gICAgICBpZiAoZWxlbWVudFBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgLT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFBvc2l0aW9uLnkgKyBlbGVtZW50RGltZW5zaW9uLmggPT09IGVuZFBvc0hlaWdodCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnRQb3NpdGlvbi54LFxuICAgICAgeTogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueSxcbiAgICAgIHo6IGVsZW1lbnRQb3NpdGlvbi56LFxuICAgIH07XG4gIH1cblxuICAvLyBIYW5kbGluZyBmb3IgVGFiIG5hdmlnYXRpb24gaWYgYW4gcGxhY2UgaXMgc2VsZWN0ZWQgaW5zaWRlIHRoZSBjb2FjaC5cbiAgLy8gVGhpcyBjb250cm9scyB0aGUgZm9jdXNlZCBjb2FjaCBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoLlxuICBwcml2YXRlIF9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQodGFiRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyRm9jdXNJbmRleCA9XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09PSAtMVxuICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA6IHRoaXMuZm9jdXNlZENvYWNoSW5kZXg7XG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICAvLyBJZiB0aGUgY3VyckZvY3VzSW5kZXggZXF1YWxzIHRoZSBuZXdGb2N1c2FibGVJbmRleCB0aGVuIHdlIGhhdmUgcmVhY2hlZCB0aGUgZmlyc3Qgb3IgbGFzdCB0YWJhYmxlIG5hdmlnYXRpb24gY29hY2ggRWxlbWVudCBhbmQgd2UgaGF2ZSB0byB0aGUgc2V0IHRoZSBmb2N1cyBtYW51YWwgdG8gdGhlIGZpcnN0VGFiRWxlbWVudCBvciBsYXN0VGFiRWxlbWVudC5cbiAgICBpZiAoY3VyckZvY3VzSW5kZXggPT09IG5ld0ZvY3VzYWJsZUluZGV4KSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IGZhbHNlO1xuXG4gICAgICBpZiAodGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInKSB0aGlzLmxhc3RUYWJFbGVtZW50LmZvY3VzKCk7XG4gICAgICBlbHNlIHRoaXMuZmlyc3RUYWJFbGVtZW50LmZvY3VzKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyRm9jdXNJbmRleDtcbiAgICAgICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgc2V0cyB0aGUgZm9jdXMgb24gdGhlIG5ldyBuYXZpZ2F0aW9uIGNvYWNoXG4gICAgICBlbHNlIGlmIChuZXdGb2N1c2FibGVJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgICAgLy8gSWYgYW55IHBsYWNlIHdhcyBmb2N1c2VkIGluIGNvYWNoLCBzbyB3ZSBzZXQgZm9jdXNlZCBhZ2FpblxuICAgICAgICBpZiAocGxhY2VJbkNvYWNoSGFzRm9jdXMpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vIHBsYWNlIHdhcyBzZWxlY3RlZCwgdGhlbiB3ZSBzZWxlY3QgdGhlIGNvYWNoIGdyaWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgbm8gbmF2aWdhdGlvbiBleGlzdCwgd2Ugc2Nyb2xsIGRpcmVjdGx5IHRvIHRoZSBuZXh0IHRhYmFibGUgY29hY2hcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJldmVudFBsYWNlQ2xpY2spIHtcbiAgICAgIGNvbnN0IGZpbmRDbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbihwcmVzc2VkS2V5KTtcbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLmxlbmd0aCAtIDEgPyBzdGFydEluZGV4ICsgMSA6IHN0YXJ0SW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoY3VycmVudEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudEluZGV4ID8/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICByZXR1cm4gc3RhcnRJbmRleCA+IDAgPyBzdGFydEluZGV4IC0gMSA6IHN0YXJ0SW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMocGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gQWRkIHNlbGVjdGVkIHBsYWNlIHRvIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzXG4gICAgaWYgKHBsYWNlU2VsZWN0aW9uLnN0YXRlID09PSAnU0VMRUNURUQnKSB7XG4gICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihwbGFjZVNlbGVjdGlvbik7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkICE9PSBwbGFjZVNlbGVjdGlvbi5pZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAodGhpcy5tYXhSZXNlcnZhdGlvbnMgJiYgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5sZW5ndGggPiB0aGlzLm1heFJlc2VydmF0aW9ucykge1xuICAgICAgdGhpcy5fcmVzZXRBbGxQbGFjZVNlbGVjdGlvbnMocGxhY2VTZWxlY3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudERldGFpbHM+fVxuICAgICAqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBQbGFjZSBhcnJheSB3aXRoIGFsbCBzZWxlY3RlZCBwbGFjZXMuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzRXZlbnREZXRhaWxzPignc2VsZWN0ZWRwbGFjZXMnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBjb2FjaEluZGV4ID0gcGxhY2VTZWxlY3Rpb24uY29hY2hJbmRleDtcbiAgICBjb25zdCBwbGFjZSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbY29hY2hJbmRleF0ucGxhY2VzPy5maW5kKFxuICAgICAgKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT0gcGxhY2VTZWxlY3Rpb24ubnVtYmVyLFxuICAgICk7XG5cbiAgICBpZiAoIXBsYWNlKSByZXR1cm47XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gY29hY2hJbmRleDtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIGNvbnN0IGNvYWNoU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24odGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgIGlmIChjb2FjaFNlbGVjdGlvbikge1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvbkNvYWNoU2VsZWN0aW9uPignc2VsZWN0ZWRjb2FjaCcsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogY29hY2hTZWxlY3Rpb24sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubWFwKChjb2FjaDogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICA/LmZpbHRlcigocGxhY2UpID0+IHBsYWNlLnN0YXRlID09PSAnU0VMRUNURUQnKVxuICAgICAgICA/LmZvckVhY2goKHBsYWNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24gPSBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiB8IG51bGwgPVxuICAgICAgICAgICAgdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsIHNlbGVjdGVkIHBsYWNlcyB3aWxsIGJlIHJlc2V0IG9yIHRoZSBjdXJyZW50U2VsZWN0ZWRQbGFjZSB3YXMgZ2l2ZW4sIHRoZW4gd2UgcmVzZXQgYWxsIGV4Y2VwdCBjdXJyZW50U2VsZWN0ZWRQbGFjZVxuICAgKiBAcGFyYW0gY3VyclNlbGVjdGVkUGxhY2VcbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKGN1cnJTZWxlY3RlZFBsYWNlPzogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICAvL0ZpbmQgYWxsIHBsYWNlcyB0byBiZSBuZWVkZWQgdW5zZWxlY3RcbiAgICBmb3IgKGNvbnN0IHBsYWNlU2VsZWN0aW9uIG9mIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMpIHtcbiAgICAgIGlmICghY3VyclNlbGVjdGVkUGxhY2UgfHwgY3VyclNlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQocGxhY2VTZWxlY3Rpb24uaWQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBwbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdGF0ZScsICdGUkVFJyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcGxhY2VzIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgaWYgKGN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzID0gdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgPT09IGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZVNlbGVjdGlvbixcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleF07XG4gICAgY29uc3QgcGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IGN1cnJTZWxlY3RlZFBsYWNlLm51bWJlcik7XG5cbiAgICByZXR1cm4gcGxhY2VcbiAgICAgID8gbWFwUGxhY2VBbmRDb2FjaFRvU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocGxhY2UsIGNvYWNoLCBjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4KVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24oXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBTZWF0UmVzZXJ2YXRpb25Db2FjaFNlbGVjdGlvbiB8IG51bGwge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1tjb2FjaEluZGV4XSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbY29hY2hJbmRleF07XG4gICAgcmV0dXJuIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uKGNvYWNoSW5kZXgsIGNvYWNoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPVxuICAgICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAnLScgKyBwbGFjZS5udW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBnaXZlbiBwbGFjZU51bWJlciBhbmQgY29hY2hJbmRleC5cbiAgICogSWYgYm90aCBkb2VzbnQgZXhpc3QsIHdlIHRyeSB0byByZXR1cm4gdGhlIHBsYWNlIEhUTUwgZWxlbWVudCBieSB0aGUgX2N1cnJlbnRTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAqIEBwYXJhbSBwbGFjZU51bWJlciBvcHRpb25hbCBhcyBzdHJpbmdcbiAgICogQHBhcmFtIGNvYWNoSW5kZXggb3B0aW9uYWwgYXMgc3RyaW5nXG4gICAqIEByZXR1cm5zIEhUTUxFbGVtZW50IG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldFBsYWNlSHRtbEVsZW1lbnQocGxhY2VOdW1iZXI/OiBzdHJpbmcsIGNvYWNoSW5kZXg/OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGN1cnJDb2FjaEluZGV4ID0gY29hY2hJbmRleCA/IGNvYWNoSW5kZXggOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgY29uc3QgY29hY2hQbGFjZU51bWJlcklkID0gcGxhY2VOdW1iZXJcbiAgICAgID8gJ3NlYXQtcmVzZXJ2YXRpb25fX3BsYWNlLWJ1dHRvbi0nICsgY3VyckNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkO1xuICAgIHJldHVybiBjb2FjaFBsYWNlTnVtYmVySWQgPyB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKGNvYWNoUGxhY2VOdW1iZXJJZCkgfHwgbnVsbCA6IG51bGw7XG4gIH1cblxuICAvL1NldCB0aGUgdmVydGljYWwgb2Zmc2V0XG4gIHByaXZhdGUgX3NldFZlcnRpY2FsQWxpZ25tZW50T2Zmc2V0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uV3JhcHBlckVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcuc2JiLXNyX193cmFwcGVyJyxcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uV3JhcHBlckVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uVmVydGljYWxPZmZzZXQgPVxuICAgICAgICAgIHNlYXRSZXNlcnZhdGlvbldyYXBwZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi12ZXJ0aWNhbC1vZmZzZXQnLFxuICAgICAgICAgIGAke3NlYXRSZXNlcnZhdGlvblZlcnRpY2FsT2Zmc2V0fXB4YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlNjcm9sbERpcmVjdGlvbiIsInBsYWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBdUJBLElBQUs7QUFBQSxDQUFMLFNBQUtBLGtCQUFlO0FBQ2xCQSxtQkFBQSxPQUFBLElBQUE7QUFDQUEsbUJBQUEsTUFBQSxJQUFBO0FBQ0YsR0FISyxvQkFBQSxrQkFBZSxDQUFBLEVBQUE7SUFhUCw4QkFBMEIsTUFBQTs7b0JBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBbkMsU0FBQSxtQkFBbUMsWUFBVTtBQUFBOztBQVF4RDtBQUtBO0FBS0E7QUFLQTtBQUtBO0FBS0E7QUFLQTtBQUVTO0FBQ0E7QUFqQ08seUJBQUEsbUNBQUEsa0JBQUEsTUFBQSwrQkFBbUMsSUFBSztBQUt4Qyx5QkFBQSxrQ0FBQSxrQkFBQSxNQUFBLGtDQUFBLEdBQUEsa0JBQUEsTUFBQSw2QkFBeUIsSUFBSTtBQUs3Qix5QkFBQSxrQ0FBQSxrQkFBQSxNQUFBLGdDQUFBLEdBQUEsa0JBQUEsTUFBQSw2QkFBeUIsS0FBSztBQUs5Qix5QkFBQSxpQ0FBQSxrQkFBQSxNQUFBLGdDQUFBLEdBQUEsa0JBQUEsTUFBQSw0QkFBdUIsRUFBRTtBQUt6Qix5QkFBQSwyQkFBQSxrQkFBQSxNQUFBLCtCQUFBLEdBQUEsa0JBQUEsTUFBQSxzQkFBaUIsSUFBSztBQUt0Qix5QkFBQSxvQ0FBQSxrQkFBQSxNQUFB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
|
|
830
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgdHlwZSBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvbW1vbi9tYXBwZXIuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb2FjaEl0ZW0sXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50UG9zaXRpb24sXG4gIFBsYWNlLFxuICBQbGFjZVNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25Db2FjaFNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvbW1vbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC5qcyc7XG5cbmVudW0gU2Nyb2xsRGlyZWN0aW9uIHtcbiAgcmlnaHQgPSAncmlnaHQnLFxuICBsZWZ0ID0gJ2xlZnQnLFxufVxuXG5pbnRlcmZhY2UgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQge1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudERldGFpbHMgPSB7XG4gIHNlYXRzOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdO1xuICBiaWN5Y2xlczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGV2ZW50cyA9IHtcbiAgICBzZWxlY3RlZHBsYWNlczogJ3NlbGVjdGVkcGxhY2VzJyxcbiAgICBzZWxlY3RlZGNvYWNoOiAnc2VsZWN0ZWRjb2FjaCcsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIG9iamVjdCB3aGljaCBjb250YWlucyBhbGwgY29hY2hlcyBhbmQgcGxhY2VzICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3NlYXQtcmVzZXJ2YXRpb24nLCB0eXBlOiBPYmplY3QgfSlcbiAgcHVibGljIGFjY2Vzc29yIHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uID0gbnVsbCE7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIG5hdmlnYXRpb24gY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGFzLW5hdmlnYXRpb24nLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoYXNOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBpcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FsaWduLXZlcnRpY2FsJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWxpZ25WZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3MgYmFzZSBncmlkIHNpemUgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Jhc2UtZ3JpZC1zaXplJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBiYXNlR3JpZFNpemU6IG51bWJlciA9IDE2O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3Mgd2lkdGggKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGVpZ2h0OiBudW1iZXIgPSBudWxsITtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIHNlYXRzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFNlYXRSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgYmljeWNsZSBwbGFjZXMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1iaWN5Y2xlLXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4QmljeWNsZVJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXNlbGVjdC1jb2FjaC1pbmRleCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJlc2VsZWN0Q29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIHNlbGVjdGVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBmb2N1c2VkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIC8vU2V0cyB0aGUgaG92ZXIgc3R5bGUgd2hlbiBzY3JvbGxpbmcgdG8gYSBjb2FjaFxuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgaG92ZXJlZFNjcm9sbENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIERlc2NyaWJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyBpbiBwaXhlbHNcbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hlcyA9IDQ7XG4gIC8vIFRoZSBjYWxjdWxhdGVkIGNvYWNoQm9yZGVyT2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNvYWNoIGJvcmRlciBncmFwaGljLFxuICAvLyBidXQgYWxzbyB0byBwb3NpdGlvbiBvdGhlciBncmFwaGljcyB0aGF0IGFyZSBhbGlnbmVkIGRpcmVjdGx5IHRvIHRoZSBjb2FjaCBib3JkZXIuXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIC8vIERlc2NyaWJlcyB0aGUgZml4IHdpZHRoIG9mIGNvYWNoIG5hdmlnYXRpb24gYnV0dG9uXG4gIHByb3RlY3RlZCBjb2FjaE5hdkJ1dHRvbkRpbTogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIGN1cnJTY3JvbGxEaXJlY3Rpb246IFNjcm9sbERpcmVjdGlvbiA9IFNjcm9sbERpcmVjdGlvbi5yaWdodDtcbiAgcHJvdGVjdGVkIG1heENhbGNDb2FjaHNXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbENvYWNoc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgZmlyc3RUYWJFbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgbGFzdFRhYkVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBuYXZpZ2F0aW9uU2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGNvYWNoU2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIHByb3RlY3RlZCBwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlc0V2ZW50RGV0YWlscyA9IHtcbiAgICBzZWF0czogW10sXG4gICAgYmljeWNsZXM6IFtdLFxuICB9O1xuICBwcm90ZWN0ZWQgc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNLZXlib2FyZE5hdmlnYXRpb24gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cyA9IHtcbiAgICBBcnJvd0xlZnQ6ICdBcnJvd0xlZnQnLFxuICAgIEFycm93UmlnaHQ6ICdBcnJvd1JpZ2h0JyxcbiAgICBBcnJvd1VwOiAnQXJyb3dVcCcsXG4gICAgQXJyb3dEb3duOiAnQXJyb3dEb3duJyxcbiAgICBUYWI6ICdUYWInLFxuICAgIEVudGVyOiAnRW50ZXInLFxuICB9IGFzIGNvbnN0O1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2VhdFJlc2VydmF0aW9uJykpIHtcbiAgICAgIHRoaXMuX2luaXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyB0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2FsaWduVmVydGljYWwnKSAmJiB0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncHJlc2VsZWN0Q29hY2hJbmRleCcpICYmIHRoaXMucHJlc2VsZWN0Q29hY2hJbmRleCkge1xuICAgICAgLy8gc2V0VGltZW91dCBpcyBuZWNjZXNzYXJ5IGJlY2F1c2Ugd2l0aG91dCwgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCkgd291bGQgZmFpbCB3aXRoIE5QRSBiZWNhdXNlXG4gICAgICAvLyB0aGUgY29hY2hTY3JvbGxBcmVhIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2godGhpcy5wcmVzZWxlY3RDb2FjaEluZGV4KSwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBsZXQgbmF2aWdhdGVUb0NvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgaWYgKGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX0xFRlQnICYmIG5hdmlnYXRlVG9Db2FjaEluZGV4ID4gMCkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggLSAxIDogMDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnICYmXG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA8IHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAxIDogMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuYXZpZ2F0ZVRvQ29hY2hJbmRleCk7XG4gIH1cblxuICAvKiBJbml0IHNjcm9sbCBldmVudCBoYW5kbGluZyBmb3IgY29hY2ggbmF2aWdhdGlvbiAqL1xuICBwcm90ZWN0ZWQgaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJvcmRlckhlaWdodCA9XG4gICAgICAgICh0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDIpICpcbiAgICAgICAgdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1jb2FjaC1oZWlnaHQnLCBgJHtib3JkZXJIZWlnaHR9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5maXJzdFRhYkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoJyNmaXJzdC10YWItZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMubGFzdFRhYkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoJyNsYXN0LXRhYi1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoJyNzYmItc3JfX3BhcmVudC1hcmVhJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcignI3NiYi1zci1uYXZpZ2F0aW9uJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSkge1xuICAgICAgdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIDogdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gSW5pdCB0aGUgY29hY2hOYXZCdXR0b25EaW0gZGltZW5zaW9uLCB3aGljaCBpcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHNjcm9sbCBuYXZpZ2F0aW9uIGxhdGVyXG4gICAgICBjb25zdCBuYXZDb2FjaGVMaXN0ID0gdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5xdWVyeVNlbGVjdG9yKCd1bCA+IGxpJykgYXMgSFRNTFVMaXN0RWxlbWVudDtcbiAgICAgIGNvbnN0IGZpcnN0TGlFbGVEaW1lbnNpb24gPSBuYXZDb2FjaGVMaXN0Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuY29hY2hOYXZCdXR0b25EaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyBmaXJzdExpRWxlRGltZW5zaW9uPy5oZWlnaHRcbiAgICAgICAgOiBmaXJzdExpRWxlRGltZW5zaW9uPy53aWR0aDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2FjaFNjcm9sbEFyZWEpIHtcbiAgICAgIGxldCBjdXJyQ2FsY1RyaWdnZXJQb3MgPSAwO1xuICAgICAgdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gUHJlY2FsY3VsYXRlIHRyaWdnZXIgc2Nyb2xsIHBvc2l0aW9uIGFycmF5IGRlcGVuZHMgb24gY29hY2ggd2lkdGhcbiAgICAgIHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbiA9IHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubWFwKChjb2FjaCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydFBvc1ggPSBjdXJyQ2FsY1RyaWdnZXJQb3M7XG4gICAgICAgIGNvbnN0IGNvYWNoV2lkdGggPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oY29hY2guZGltZW5zaW9uKS53O1xuXG4gICAgICAgIC8vIENhbGN1bGF0aW9uIG9mIHRoZSBlbmQgc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb24gb2YgYSBjb2FjaCwgaW5jbHVkaW5nIHRoZSBnYXAgYmV0d2VlbiB0aGUgY29hY2hlc1xuICAgICAgICBjdXJyQ2FsY1RyaWdnZXJQb3MgKz0gY29hY2hXaWR0aCArIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXM7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRQb3NYLFxuICAgICAgICAgIGVuZDogY3VyckNhbGNUcmlnZ2VyUG9zLFxuICAgICAgICAgIHdpZHRoOiBjb2FjaFdpZHRoLFxuICAgICAgICB9IGFzIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBtYXhpbXVtIGNhbGN1bGF0ZWQgY29hY2ggd2lkdGhcbiAgICAgIHRoaXMubWF4Q2FsY0NvYWNoc1dpZHRoID0gY3VyckNhbGNUcmlnZ2VyUG9zO1xuXG4gICAgICAvLyBBdCB0aGUgZW5kIG9mIGEgc2Nyb2xsIEV2ZW50cyB0byBhIGNvYWNoLCB0aGUgcmVhY2hlZCB3YWdvbiBpcyBtYXJrZWQgYXMgc2VsZWN0ZWRcbiAgICAgIHRoaXMuY29hY2hTY3JvbGxBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbGVuZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgZmluZFNjcm9sbENvYWNoSW5kZXggPSB0aGlzLmlzQXV0b1Njcm9sbGluZ1xuICAgICAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgOiB0aGlzLl9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTtcblxuICAgICAgICAvLyBJbiBjYXNlIHRoZSB1c2VyIHVzZXMgdGhlIHNjcm9sbGJhciB3aXRob3V0IGludGVyYWN0aW5nIHdpdGggdGhlIHNlYXQgcmVzZXJ2YXRpb24sXG4gICAgICAgIC8vIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaW5kZXggaXMgLTEsIGFuZCB3ZSBoYXZlIHRvIHNldCB0aGlzIHZhbHVlIHdpdGggZmluZFNjcm9sbENvYWNoSW5kZXguXG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgOiBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHtcbiAgICAgICAgICAvL1doZW4gdXNlciBpcyBzY3JvbGxpbmcgdmlhIHNjcm9sbGJhciwgaXQgYXV0b21hdGljYWxseSBzY3JvbGxzIHRvIHRoZSBmb2N1c2VkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihmaW5kU2Nyb2xsQ29hY2hJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgICAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0cyAocHJvcGVydHkgc2V0dGluZyAtPiBoYXNOYXZpZ2F0aW9uKSBhbmQgYSB0YWJsZSBjb2FjaCBnZXRzIHRoZSBmb2N1cyxcbiAgICogdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaCBtdXN0IGJlIGF1dG9tYXRpY2FsbHkgcHJlc2VsZWN0ZWQgdG8gY29udHJvbCB0aGUgcGxhY2UgbmF2aWdhdGlvbiB2aWEga2V5Ym9hcmRcbiAgICpcbiAgICogQHBhcmFtIGZvY3VzQ29hY2hJbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNUYWJsZUNvYWNoQW5kUHJlc2VsZWN0UGxhY2UoZm9jdXNDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyAmJiAhdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZm9jdXNDb2FjaEluZGV4ID09PSAwXG4gICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KC0xKVxuICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChmb2N1c0NvYWNoSW5kZXgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzYXRpb24gb2YgS2V5Ym9hcmQgZXZlbnQgaGFuZGxpbmcgdG8gbmF2aWdhdGlvbiBiZXR3ZWVuIGVhY2ggcGxhY2VzIGluc2lkZSBhIHNlbGVjdGVkIGNvYWNoIGJ5IHVzaW5nIFthcnJvd10ga2V5cy5cbiAgICogV2l0aCB0aGUgW1RBQl0ga2V5IHRoZSB1c2VyIG5hdmlnYXRpb24gZ29lcyB0byB0aGUgbmV4dCBjb2FjaCBuYXZpZ2F0aW9uIGVsZW1lbnQgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2UgaXMgYXV0b21hdGljYWxseSByZXNldC5cbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcblxuICAgIC8vIElmIGFueSBwbGFjZSBpcyBzZWxlY3RlZCBhbmQgVEFCIEtleSBjb21iaW5hdGlvbiBpc3QgcHJlc3NlZCxcbiAgICAvLyB0aGVuIHdlIGhhbmRsZSB0aGUgbmV4dCBvciBwcmV2aW91cyBjb2FjaCBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IDkpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdORVhUX1RBQicpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgdGhlIGFycm93IGtleSBpcyBwcmVzc2VkXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgJiYgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgc3dpdGNoIChwcmVzc2VkS2V5KSB7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRMZWZ0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZExlZnRLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkUmlnaHRLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFJpZ2h0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXA6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFVwS2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFVwS2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkRG93bktleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkRG93bktleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHBsYWNlIGluc2lkZSB0aGUgY29hY2ggaWYgbmF2aWdhdGVkIHZpYSBrZXlib2FyZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBjb2FjaCBncmlkIGlzIHNlbGVjdGVkIChuZWNlc3NhcnkgZm9yIFNjcmVlblJlYWRlcilcbiAgICovXG4gIHByb3RlY3RlZCBwcmVzZWxlY3RQbGFjZUluQ29hY2goKTogdm9pZCB7XG4gICAgY29uc3QgY2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24oKTtcbiAgICAvL0lmIGNsb3Nlc3RQbGFjZSBleGlzdCwgd2UgaGF2ZSB0byB1bmZvY3VzIHByZXZpb3VzZSBmb2N1c2VkIHBsYWNlXG4gICAgaWYgKGNsb3Nlc3RQbGFjZSkge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgLy8gT25seSB3aGVuIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCBhbmQgY29hY2hlcyBhcmUgc2Nyb2xsZWQgYnkgYXV0byBzY3JvbGxpbmcsXG4gICAgLy8gdGhlbiB3ZSBjYW4gc2V0IHRoZSBmb2N1cyBvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoLlxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICBpZiAoY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoY2xvc2VzdFBsYWNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHByZXNlbGVjdGlvbiBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgbm9ybWFsIGNsaWNraW5nIG9yIHZpYSBzY3JlZW5yZWFkZXIgdmlhIHRhYixcbiAgICAvLyB3ZSBvbmx5IGZvY3VzIHRoZSB0YWJsZSB3aXRob3V0IGRpcmVjdGx5IGZvY3VzaW5nIHRoZSBwbGFjZS5cbiAgICBlbHNlIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gc2V0IHRoZSBjdXJyU2VsZWN0ZWRQbGFjZSBoZXJlIGZvciBmdXJ0aGVyIGNvcnJlY3QgZnVuY3Rpb25pbmcgbmF2aWdhdGlvbiB2aWEgdGFiLlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IGNsb3Nlc3RQbGFjZTtcbiAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2goc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsVG9Db2FjaFBvc1ggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBzZWxlY3RlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmb2N1c1BsYWNlRWxlbWVudChwbGFjZTogUGxhY2UgfCBudWxsLCBjb2FjaEluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgICBpZiAoY29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBjb2FjaEluZGV4O1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAnZm9jdXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5mb2N1c1BsYWNlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAndW5mb2N1cycpO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQobnVsbCk7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICBlbGVtZW50RGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICAgaXNTdHJldGNoSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudERpbWVuc2lvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmICFpc09yaWdpbkhlaWdodCkge1xuICAgICAgLy8gU2luY2UgdGhlIGhlaWdodCBvZiB0aGUgY29hY2ggaGFzIGJlZW4gdmlzdWFsbHkgZXhwYW5kZWQgdG8gbWFpbnRhaW4gYSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIGFuZCB0aGUgcGxhY2VzLFxuICAgICAgLy8gc29tZSBncmFwaGljcyBtdXN0IGFsc28gYmUgYWRhcHRlZCB0byB0aGUgaGVpZ2h0LCB3aGljaCBlbmQgd2l0aCB0aGUgYm9yZGVycyBvZiB0aGUgY2hvYWNoXG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDI7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyZXRjaEhlaWdodCkge1xuICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgZ3JhcGhpY3MgYXJlIGFzc2lnbmVkIGRpcmVjdGx5IGF0IHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoLFxuICAgICAgLy8gdGhlc2UgZ3JhcGhpY3MgbXVzdCBiZSBleHBhbmRlZCBpbiBoZWlnaHQgYnkgYSBjb2FjaEJvcmRlck9mZnNldCBpbiBvcmRlciB0byByZWFjaCB0aGVpciBvcmlnaW5hbCB2aXN1YWwgcG9zaXRpb25cbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB3OiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24udyxcbiAgICAgIGg6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudERpbWVuc2lvbi5oLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKFxuICAgIGVsZW1lbnRQb3NpdGlvbjogRWxlbWVudFBvc2l0aW9uLFxuICAgIGVsZW1lbnREaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICk6IEVsZW1lbnRQb3NpdGlvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmIGVsZW1lbnREaW1lbnNpb24pIHtcbiAgICAgIGNvbnN0IGVuZFBvc0hlaWdodCA9IGlzT3JpZ2luSGVpZ2h0XG4gICAgICAgID8gY29hY2hEaW1lbnNpb24uaFxuICAgICAgICA6IGNvYWNoRGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgY29hY2gsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIFkgY29vcmRpbmF0ZSB3aXRoIHRoZSBhZGRpdGlvbmFsIGJvcmRlciBwYWRkaW5nXG4gICAgICBpZiAoZWxlbWVudFBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgLT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFBvc2l0aW9uLnkgKyBlbGVtZW50RGltZW5zaW9uLmggPT09IGVuZFBvc0hlaWdodCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnRQb3NpdGlvbi54LFxuICAgICAgeTogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueSxcbiAgICAgIHo6IGVsZW1lbnRQb3NpdGlvbi56LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBhdmFpbGFibGUgc2VhdHMgdG9nZXRoZXIgZGVwZW5kaW5nIG9uIHRoZSBzZWF0IHR5cGVcbiAgICpcbiAgICogQHBhcmFtIGNvYWNoSW5kZXhcbiAgICogQHJldHVybnMgQW4gT2JqZWN0IHdpdGggY291bnQgb2YgZnJlZSBzZWF0cyBhbmQgZnJlZSBiaWN5Y2xlIHBsYWNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2hJbmRleDogbnVtYmVyKTogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMge1xuICAgIGNvbnN0IGFjY3VtdWxhdG9yOiBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHsgc2VhdHM6IDAsIGJpY3ljbGVzOiAwIH07XG4gICAgY29uc3QgZnJlZVBsYWNlcyA9IHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbY29hY2hJbmRleF0ucGxhY2VzPy5yZWR1Y2UoXG4gICAgICAoYWNjdW11bGF0b3IsIGN1cnJQbGFjZTogUGxhY2UpID0+IHtcbiAgICAgICAgaWYgKGN1cnJQbGFjZS5zdGF0ZSAhPT0gJ0ZSRUUnKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvdW50IHVwIGRlcGVuZGluZyBvbiBzZWF0IHR5cGVcbiAgICAgICAgaWYgKGN1cnJQbGFjZS50eXBlID09PSAnU0VBVCcpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvci5zZWF0cysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjY3VtdWxhdG9yLmJpY3ljbGVzKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgfSxcbiAgICAgIGFjY3VtdWxhdG9yLFxuICAgICk7XG4gICAgcmV0dXJuIGZyZWVQbGFjZXMgPyBmcmVlUGxhY2VzIDogYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gYXV0b21hdGljIG1haW4gbmF2aWdhdGlvbiBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBzZWxlY3RlZE5hdkNvYWNoSW5kZXguXG4gICAqIENhbGN1bGF0ZXMgdGhlIGNlbnRyYWwgc2Nyb2xsIG9mZnNldCBvZiB0aGUgbmF2IGNvYWNoIHRvIGJlIHNlbGVjdGVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWROYXZDb2FjaEluZGV4XG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vVGltZSBkZWxheSB0byBub3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgZXhlY3V0aW5nIGNhbGxpbmcgc2Nyb2xsVG8gZnVuY3Rpb25zIChjb2FjaGVzIHNjcm9sbGluZylcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIFNldHMgdGhlIGhvdmVyIGluZGV4IHN0eWxlIGZvciB0aGUgdGFyZ2V0IHNjcm9sbCBjb2FjaFxuICAgICAgdGhpcy5ob3ZlcmVkU2Nyb2xsQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcblxuICAgICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYID0gdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSAvIDI7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJ1dHRvbk9mZnNldFggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXggKiB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXRYID1cbiAgICAgICAgICBzY3JvbGxCdXR0b25PZmZzZXRYIC0gbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggKyB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuXG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsT2Zmc2V0WCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbE9mZnNldFgsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV3IFNjcm9sbERpcmVjdGlvbiBieSB0aGUgbmV3IGdpdmVuIHRhcmdldCBjb2FjaCBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPVxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgPyBTY3JvbGxEaXJlY3Rpb24ucmlnaHRcbiAgICAgICAgOiBTY3JvbGxEaXJlY3Rpb24ubGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY3JvbGwgc3RhcnQgb3IgZW5kIHBvc2l0aW9uIFggZnJvbSB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIEluIGNhc2UgdGhlIHVzZXIgaXMgY3VycmVudGx5IG5hdmlnYXRpbmcgdGhyb3VnaCBwbGFjZXMgYnkga2V5Ym9hcmQgYW5kIGdvZXMgdG8gcHJldmlvdXMgY29hY2gsXG4gICAqIHRoZW4gd2UgcmV0dXJuIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGNvYWNoIHRvIGdldCB0aGUgY2xvc2VzdCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIG5leHQgZm9jdXMgcGxhY2UuXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2FjaFRyaWdnZXJQb2ludCA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuXG4gICAgY29uc3QgaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvbiA9XG4gICAgICB0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmXG4gICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICBjb2FjaFRyaWdnZXJQb2ludC53aWR0aCA+IHRoaXMuc2Nyb2xsQ29hY2hzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGhcbiAgICAgIDogY29hY2hUcmlnZ2VyUG9pbnQuc3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZm9jdXMgb24gdGhlIEhUTUwgdGFibGUgKGdyaWQpIGNhcHRpb24gZWxlbWVudCBzbyB0aGF0IHRoZSBoZWFkaW5nIGlzIHJlYWQgb3V0IHdoZW4gdXNpbmcgYSBTY3JlZW5SZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBjb2FjaCBuYXZpZ2F0aW9uLCB0aGVuIHRoZSBuYXZpZ2F0ZWQgdGFibGUgaXMgZm9jdXNhYmxlLlxuICAgIGlmICh0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgY29hY2hTY3JvbGxXaW5kb3dXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWF4U2Nyb2xsV2lkdGhBcmVhID0gdGhpcy5tYXhDYWxjQ29hY2hzV2lkdGggLSBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoO1xuICAgIGNvbnN0IGN1cnJDb2FjaFRyaWdnZXIgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvcyA9XG4gICAgICBjdXJyU2Nyb2xsUG9zWCA9PT0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uc3RhcnQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgKGN1cnJTY3JvbGxQb3NYIDwgbWF4U2Nyb2xsV2lkdGhBcmVhIHx8IGN1cnJTY3JvbGxQb3NYID4gY3VyckNvYWNoVHJpZ2dlci5zdGFydCkgJiZcbiAgICAgICFpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29hY2ggaW5kZXggd2hpY2ggaXMgY3VycmVudGx5IHZpc2libGUgaW4gdGhlIHNjcm9sbCBhcmVhXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3Qgc2Nyb2xsUG9zID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvcFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPSBzY3JvbGxQb3MgKyB0aGlzLnNjcm9sbENvYWNoc0FyZWFXaWR0aCAvIDI7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbi5maW5kSW5kZXgoXG4gICAgICAoY29hY2hUcmlnZ2VyKSA9PiBzY3JvbGxPZmZzZXRYID49IGNvYWNoVHJpZ2dlci5zdGFydCAmJiBzY3JvbGxPZmZzZXRYIDw9IGNvYWNoVHJpZ2dlci5lbmQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpcnN0IHBsYWNlIG9mIGN1cnJlbnQgc2VsZWN0ZWQgY29hY2ggYnkgdGFibGUgY2VsbCBjb29yZGluYXRlIDAtMCBpZC5cbiAgICogQHJldHVybnMgUGxhY2Ugb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Rmlyc3RQbGFjZUluU2VsZWNlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGZpcnN0Q2VsbElkID0gJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCArICctMC0wJztcbiAgICBjb25zdCBwbGFjZU51bWJlciA9XG4gICAgICB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgICAgPy5xdWVyeVNlbGVjdG9yPEhUTUxUYWJsZUNlbGxFbGVtZW50PignIycgKyBmaXJzdENlbGxJZClcbiAgICAgICAgPy5xdWVyeVNlbGVjdG9yPFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQ+KCdzYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sJylcbiAgICAgICAgPy5nZXRBdHRyaWJ1dGUoJ3RleHQnKSB8fCBudWxsO1xuXG4gICAgaWYgKGNvYWNoICYmIHBsYWNlTnVtYmVyKSB7XG4gICAgICBmaXJzdFBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBwbGFjZU51bWJlcikgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpcnN0UGxhY2U7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBsZXQgY2xvc2VzdFBsYWNlID0gbnVsbDtcbiAgICBpZiAoY29hY2gucGxhY2VzKSB7XG4gICAgICAvLyBJZiBubyBwbGFjZSBzZXQsIHRoZW4gd2UgdXNlIGluaXRpYWwgdGhlIGxlZnQtdG9wIHBsYWNlIG9uIHRoZSBjb2FjaFxuICAgICAgaWYgKCF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGaXJzdFBsYWNlSW5TZWxlY2VkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaC5wbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIGxlZnQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBSSUdIVClcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ucG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgTEVGVFxuICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ucG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChwbGFjZS5udW1iZXIgIT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/Lm51bWJlcikge1xuICAgICAgICAgICAgICAgIC8vS2V5IFtSaWdodF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID4gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0Rvd25dIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24gJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi54ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbTGVmdF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbVXBdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnggLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA8IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/LnBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdFBsYWNlO1xuICB9XG5cbiAgLy8gSGFuZGxpbmcgZm9yIFRhYiBuYXZpZ2F0aW9uIGlmIGEgcGxhY2UgaXMgc2VsZWN0ZWQgaW5zaWRlIHRoZSBjb2FjaC5cbiAgLy8gVGhpcyBjb250cm9scyB0aGUgZm9jdXNlZCBjb2FjaCBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoLlxuICBwcml2YXRlIF9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQodGFiRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyRm9jdXNJbmRleCA9XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09PSAtMVxuICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA6IHRoaXMuZm9jdXNlZENvYWNoSW5kZXg7XG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICAvLyBJZiB0aGUgY3VyckZvY3VzSW5kZXggZXF1YWxzIHRoZSBuZXdGb2N1c2FibGVJbmRleCB0aGVuIHdlIGhhdmUgcmVhY2hlZCB0aGUgZmlyc3Qgb3IgbGFzdCB0YWJhYmxlIG5hdmlnYXRpb24gY29hY2ggRWxlbWVudCBhbmQgd2UgaGF2ZSB0byB0aGUgc2V0IHRoZSBmb2N1cyBtYW51YWwgdG8gdGhlIGZpcnN0VGFiRWxlbWVudCBvciBsYXN0VGFiRWxlbWVudC5cbiAgICBpZiAoY3VyckZvY3VzSW5kZXggPT09IG5ld0ZvY3VzYWJsZUluZGV4KSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IGZhbHNlO1xuXG4gICAgICBpZiAodGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInKSB0aGlzLmxhc3RUYWJFbGVtZW50LmZvY3VzKCk7XG4gICAgICBlbHNlIHRoaXMuZmlyc3RUYWJFbGVtZW50LmZvY3VzKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyRm9jdXNJbmRleDtcbiAgICAgICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgc2V0cyB0aGUgZm9jdXMgb24gdGhlIG5ldyBuYXZpZ2F0aW9uIGNvYWNoXG4gICAgICBlbHNlIGlmIChuZXdGb2N1c2FibGVJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgICAgLy8gSWYgYW55IHBsYWNlIHdhcyBmb2N1c2VkIGluIGNvYWNoLCBzbyB3ZSBzZXQgZm9jdXNlZCBhZ2FpblxuICAgICAgICBpZiAocGxhY2VJbkNvYWNoSGFzRm9jdXMpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vIHBsYWNlIHdhcyBzZWxlY3RlZCwgdGhlbiB3ZSBzZWxlY3QgdGhlIGNvYWNoIGdyaWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQnkgVGFiIE5hdmlnYXRpb24sIHBlcmZvcm0gYXV0b21hdGljIHNjcm9sbGluZyB0byB0aGUgZm9jdXNlZCB3YWdvblxuICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24obmV3Rm9jdXNhYmxlSW5kZXgpO1xuICAgIH1cbiAgICAvLyBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0LCB3ZSBzY3JvbGwgZGlyZWN0bHkgdG8gdGhlIG5leHQgdGFiYWJsZSBjb2FjaFxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmV3Rm9jdXNhYmxlSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLmZvY3VzZWRDb2FjaEluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcmV2ZW50UGxhY2VDbGljaykge1xuICAgICAgY29uc3QgZmluZENsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXkpO1xuICAgICAgaWYgKGZpbmRDbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudChmaW5kQ2xvc2VzdFBsYWNlKTtcbiAgICAgIH1cbiAgICAgIC8vIE5vIGNsb3Nlc3QgcGxhY2UgZm91bmQgYnkga2V5IG5hdmlnYXRpb25cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCB8fFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdCB8fFxuICAgICAgICAgICh0aGlzLmFsaWduVmVydGljYWwgJiZcbiAgICAgICAgICAgIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwIHx8XG4gICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bikpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IHByZXNzZWQga2V5IHRvIGdldCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXhcbiAgICAgICAgICBjb25zdCBuZXdTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodFxuICAgICAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoKVxuICAgICAgICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoKTtcblxuICAgICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld1NlbGVjdGVkQ29hY2hJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VycmVudEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudEluZGV4ID8/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICByZXR1cm4gc3RhcnRJbmRleCA8IHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubGVuZ3RoIC0gMSA/IHN0YXJ0SW5kZXggKyAxIDogc3RhcnRJbmRleDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyZW50SW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50SW5kZXggPz8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIHJldHVybiBzdGFydEluZGV4ID4gMCA/IHN0YXJ0SW5kZXggLSAxIDogc3RhcnRJbmRleDtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24ucGxhY2VUeXBlID09PSAnU0VBVCcpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMgPSB0aGlzLl91cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5zZWF0cyxcbiAgICAgICAgdGhpcy5tYXhTZWF0UmVzZXJ2YXRpb25zLFxuICAgICAgICBwbGFjZVNlbGVjdGlvbixcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuYmljeWNsZXMgPSB0aGlzLl91cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcyxcbiAgICAgICAgdGhpcy5tYXhCaWN5Y2xlUmVzZXJ2YXRpb25zLFxuICAgICAgICBwbGFjZVNlbGVjdGlvbixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQEB0eXBlIHtDdXN0b21FdmVudDxTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlc0V2ZW50RGV0YWlscz59XG4gICAgICogRW1pdHMgd2hlbiBhIHBsYWNlIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIFBsYWNlIGFycmF5IHdpdGggYWxsIHNlbGVjdGVkIHBsYWNlcy5cbiAgICAgKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudERldGFpbHM+KCdzZWxlY3RlZHBsYWNlcycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhcbiAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSxcbiAgICBtYXhSZXNlcnZhdGlvbnM6IG51bWJlcixcbiAgICBwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vIEFkZCBzZWxlY3RlZCBwbGFjZSB0byBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGlmIChwbGFjZVNlbGVjdGlvbi5zdGF0ZSA9PT0gJ1NFTEVDVEVEJykge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocGxhY2VTZWxlY3Rpb24pO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbikge1xuICAgICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSBzZWxlY3RlZCBwbGFjZSBmcm9tIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzXG4gICAgZWxzZSB7XG4gICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoZWNrcyB3aGV0aGVyIG1heFJlc2VydmF0aW9uIGlzIGFjdGl2YXRlZCBhbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGVkIHBsYWNlcyBpcyByZWFjaGVkXG4gICAgaWYgKG1heFJlc2VydmF0aW9ucyA+IC0xICYmIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmxlbmd0aCA+IG1heFJlc2VydmF0aW9ucykge1xuICAgICAgaWYgKG1heFJlc2VydmF0aW9ucyA9PT0gMCkge1xuICAgICAgICAvLyBpZiBtYXhSZXNlcnZhdGlvbiBpcyAwKG5vdCBhbGxvd2VkIHRvIHNlbGVjdCBhbnkgcGxhY2Ugb2YgZ2l2ZW4gdHlwZSksIHJlc2V0cyBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSByZXNldHMgYWxsIHBsYWNlcyBleGNlcHQgZ2l2ZW4gb25lXG4gICAgICAgIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzID0gdGhpcy5fcmVzZXRBbGxQbGFjZVNlbGVjdGlvbnMoXG4gICAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBjb2FjaEluZGV4ID0gcGxhY2VTZWxlY3Rpb24uY29hY2hJbmRleDtcbiAgICBjb25zdCBwbGFjZSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbY29hY2hJbmRleF0ucGxhY2VzPy5maW5kKFxuICAgICAgKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT0gcGxhY2VTZWxlY3Rpb24ubnVtYmVyLFxuICAgICk7XG5cbiAgICBpZiAoIXBsYWNlKSByZXR1cm47XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gY29hY2hJbmRleDtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIGNvbnN0IGNvYWNoU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24odGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgIGlmIChjb2FjaFNlbGVjdGlvbikge1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uQ29hY2hTZWxlY3Rpb24+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvbkNvYWNoU2VsZWN0aW9uPignc2VsZWN0ZWRjb2FjaCcsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogY29hY2hTZWxlY3Rpb24sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubWFwKChjb2FjaDogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICA/LmZpbHRlcigocGxhY2UpID0+IHBsYWNlLnN0YXRlID09PSAnU0VMRUNURUQnKVxuICAgICAgICA/LmZvckVhY2goKHBsYWNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24gPSBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiB8IG51bGwgPVxuICAgICAgICAgICAgdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ucGxhY2VUeXBlID09PSAnU0VBVCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5zZWF0cy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuYmljeWNsZXMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQWxsIHNlbGVjdGVkIHBsYWNlcyB3aWxsIGJlIHJlc2V0IG9yIHRoZSBjdXJyZW50U2VsZWN0ZWRQbGFjZSB3YXMgZ2l2ZW4sIHRoZW4gd2UgcmVzZXQgYWxsIGV4Y2VwdCBjdXJyZW50U2VsZWN0ZWRQbGFjZVxuICAgKiBAcGFyYW0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnNcbiAgICogQHBhcmFtIGN1cnJTZWxlY3RlZFBsYWNlXG4gICAqL1xuICBwcml2YXRlIF9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSxcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZT86IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvL0ZpbmQgYWxsIHBsYWNlcyB0byBiZSBuZWVkZWQgdW5zZWxlY3RcbiAgICBmb3IgKGNvbnN0IHBsYWNlU2VsZWN0aW9uIG9mIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zKSB7XG4gICAgICBpZiAoIWN1cnJTZWxlY3RlZFBsYWNlIHx8IGN1cnJTZWxlY3RlZFBsYWNlLmlkICE9PSBwbGFjZVNlbGVjdGlvbi5pZCkge1xuICAgICAgICBjb25zdCBwbGFjZUVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKHBsYWNlU2VsZWN0aW9uLmlkKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgcGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3RhdGUnLCAnRlJFRScpO1xuICAgICAgfVxuICAgIH1cbiAgICAvL1JlbW92ZXMgYWxsIHNlbGVjdGVkIHBsYWNlcyBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgIGlmIChjdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMgPSByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgPT09IGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgY3VyclNlbGVjdGVkUGxhY2U6IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1tjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4XTtcbiAgICBjb25zdCBwbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gY3VyclNlbGVjdGVkUGxhY2UubnVtYmVyKTtcblxuICAgIHJldHVybiBwbGFjZVxuICAgICAgPyBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihwbGFjZSwgY29hY2gsIGN1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXgpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25Db2FjaFNlbGVjdGlvbihcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFNlYXRSZXNlcnZhdGlvbkNvYWNoU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1tjb2FjaEluZGV4XTtcbiAgICBjb25zdCBjb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaEluZGV4KTtcbiAgICByZXR1cm4gbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24oY29hY2hJbmRleCwgY29hY2gsIGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPVxuICAgICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAnLScgKyBwbGFjZS5udW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBnaXZlbiBwbGFjZU51bWJlciBhbmQgY29hY2hJbmRleC5cbiAgICogSWYgYm90aCBkb2Vzbid0IGV4aXN0LCB3ZSB0cnkgdG8gcmV0dXJuIHRoZSBwbGFjZSBIVE1MIGVsZW1lbnQgYnkgdGhlIF9jdXJyZW50U2VsZWN0ZWRQbGFjZUVsZW1lbnRJZFxuICAgKiBAcGFyYW0gcGxhY2VOdW1iZXIgb3B0aW9uYWwgYXMgc3RyaW5nXG4gICAqIEBwYXJhbSBjb2FjaEluZGV4IG9wdGlvbmFsIGFzIHN0cmluZ1xuICAgKiBAcmV0dXJucyBIVE1MRWxlbWVudCBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRQbGFjZUh0bWxFbGVtZW50KHBsYWNlTnVtYmVyPzogc3RyaW5nLCBjb2FjaEluZGV4PzogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBjdXJyQ29hY2hJbmRleCA9IGNvYWNoSW5kZXggPyBjb2FjaEluZGV4IDogdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIGNvbnN0IGNvYWNoUGxhY2VOdW1iZXJJZCA9IHBsYWNlTnVtYmVyXG4gICAgICA/ICdzZWF0LXJlc2VydmF0aW9uX19wbGFjZS1idXR0b24tJyArIGN1cnJDb2FjaEluZGV4ICsgJy0nICsgcGxhY2VOdW1iZXJcbiAgICAgIDogdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZDtcbiAgICByZXR1cm4gY29hY2hQbGFjZU51bWJlcklkID8gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChjb2FjaFBsYWNlTnVtYmVySWQpIHx8IG51bGwgOiBudWxsO1xuICB9XG59XG4iXSwibmFtZXMiOlsiU2Nyb2xsRGlyZWN0aW9uIiwiYWNjdW11bGF0b3IiLCJwbGFjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQXVCQSxJQUFLO0FBQUEsQ0FBTCxTQUFLQSxrQkFBZTtBQUNsQkEsbUJBQUEsT0FBQSxJQUFBO0FBQ0FBLG1CQUFBLE1BQUEsSUFBQTtBQUNGLEdBSEss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
|