@annalib/anna-core 20.2.73 → 20.2.75
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/esm2022/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +5 -7
- package/esm2022/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +4 -6
- package/esm2022/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +16 -13
- package/esm2022/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +5 -7
- package/esm2022/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +1 -1
- package/esm2022/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +4 -6
- package/esm2022/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +5 -7
- package/esm2022/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +5 -7
- package/esm2022/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +27 -34
- package/esm2022/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +5 -5
- package/esm2022/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +17 -15
- package/esm2022/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
- package/esm2022/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +1 -1
- package/esm2022/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +2 -2
- package/esm2022/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +3 -3
- package/esm2022/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +3 -4
- package/esm2022/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +17 -19
- package/esm2022/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +2 -1
- package/esm2022/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +102 -81
- package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +381 -376
- package/esm2022/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +29 -31
- package/esm2022/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +1 -1
- package/esm2022/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +21 -15
- package/esm2022/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +6 -7
- package/esm2022/lib/anna-core-shared-lib/services/anna-sort.service.mjs +41 -43
- package/esm2022/lib/anna-core.module.mjs +28 -47
- package/esm2022/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +19 -19
- package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +76 -88
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +40 -36
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +14 -13
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +23 -23
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +31 -34
- package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +108 -101
- package/esm2022/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +13 -9
- package/esm2022/public-api.mjs +27 -30
- package/fesm2022/annalib-anna-core.mjs +2842 -3565
- package/fesm2022/annalib-anna-core.mjs.map +1 -1
- package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +2 -5
- package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +2 -5
- package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +4 -6
- package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +2 -5
- package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +2 -5
- package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +2 -5
- package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +2 -5
- package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +1 -1
- package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +3 -3
- package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +3 -3
- package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +1 -1
- package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +1 -1
- package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +0 -1
- package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +3 -1
- package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +4 -4
- package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +2 -2
- package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +0 -1
- package/lib/anna-core.module.d.ts +12 -15
- package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +1 -1
- package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +2 -2
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +4 -4
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.d.ts +3 -3
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +4 -4
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +4 -4
- package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +9 -9
- package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +2 -2
- package/package.json +1 -1
- package/public-api.d.ts +14 -17
- package/src/lib/anna-common-scss/_filters.scss +12 -0
- package/src/lib/anna-common-scss/_show-hide-total-row.scss +1 -1
- package/esm2022/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -352
- package/esm2022/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +0 -204
- package/esm2022/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +0 -2
- package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -180
- package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +0 -2
- package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +0 -141
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +0 -89
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +0 -1
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +0 -45
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +0 -1
- package/src/lib/anna-common-scss/_drag-and-drop.scss +0 -22
|
@@ -1,15 +1,16 @@
|
|
|
1
|
+
// Angular import statements
|
|
1
2
|
import { Injectable } from "@angular/core";
|
|
2
|
-
// Third party import statements
|
|
3
|
-
import { min, max, map, sortBy, uniq, cloneDeep, isEqual } from "lodash-es";
|
|
4
3
|
import dayjs from "dayjs";
|
|
5
4
|
import CustomParseFormat from "dayjs/plugin/customParseFormat";
|
|
6
|
-
import minMax from "dayjs/plugin/minMax";
|
|
7
5
|
import isBetween from "dayjs/plugin/isBetween";
|
|
6
|
+
import minMax from "dayjs/plugin/minMax";
|
|
7
|
+
// Third party import statements
|
|
8
|
+
import { cloneDeep, isEqual, map, max, min, sortBy, uniq } from "lodash-es";
|
|
8
9
|
import { SortTypeEnum } from "../models/anna-sort.model";
|
|
10
|
+
import { TooltipModel } from "../models/anna-tooltip.model";
|
|
9
11
|
// User defined import statements
|
|
10
12
|
import { AnnaDateTimeFormatService } from "./anna-date-time-format.service";
|
|
11
13
|
import { AnnaSortService } from "./anna-sort.service";
|
|
12
|
-
import { TooltipModel } from "../models/anna-tooltip.model";
|
|
13
14
|
import * as i0 from "@angular/core";
|
|
14
15
|
import * as i1 from "./anna-date-time-format.service";
|
|
15
16
|
import * as i2 from "./anna-sort.service";
|
|
@@ -42,36 +43,32 @@ export class AnnaFilterService {
|
|
|
42
43
|
this.resetFilterSortActiveStatus = true;
|
|
43
44
|
this.percentTranslateFunction = (data) => {
|
|
44
45
|
if (Math.abs(data) >= 1000) {
|
|
45
|
-
|
|
46
|
-
const val = (Math.abs(data) / 1000).toFixed(1)
|
|
47
|
-
return isNegVal ?
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
let isNegVal = data < 0;
|
|
51
|
-
let isWholeNum = parseInt(data.toString()) == data;
|
|
52
|
-
let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
|
|
53
|
-
return isNegVal ? "-" + val + "%" : val + "%";
|
|
46
|
+
const isNegVal = data < 0;
|
|
47
|
+
const val = `${(Math.abs(data) / 1000).toFixed(1)}k%`;
|
|
48
|
+
return isNegVal ? `-${val}` : val;
|
|
54
49
|
}
|
|
50
|
+
const isNegVal = data < 0;
|
|
51
|
+
const isWholeNum = parseInt(data.toString(), 10) === data;
|
|
52
|
+
const val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
|
|
53
|
+
return isNegVal ? `-${val}%` : `${val}%`;
|
|
55
54
|
};
|
|
56
55
|
this.currencyTranslateFunction = (data) => {
|
|
57
56
|
if (Math.abs(data) >= 1000) {
|
|
58
|
-
|
|
59
|
-
const val =
|
|
60
|
-
return isNegVal ?
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
let isNegVal = data < 0;
|
|
64
|
-
let isWholeNum = parseInt(data.toString()) == data;
|
|
65
|
-
let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
|
|
66
|
-
return isNegVal ? "-$" + val : "$" + val;
|
|
57
|
+
const isNegVal = data < 0;
|
|
58
|
+
const val = `$${(Math.abs(data) / 1000).toFixed(1)}k`;
|
|
59
|
+
return isNegVal ? `-${val}` : val;
|
|
67
60
|
}
|
|
61
|
+
const isNegVal = data < 0;
|
|
62
|
+
const isWholeNum = parseInt(data.toString(), 10) === data;
|
|
63
|
+
const val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
|
|
64
|
+
return isNegVal ? `-$${val}` : `$${val}`;
|
|
68
65
|
};
|
|
69
66
|
this.normalTranslateFunction = (data) => {
|
|
70
67
|
if (data >= 1000) {
|
|
71
|
-
const val = (data / 1000).toFixed(1)
|
|
68
|
+
const val = `${(data / 1000).toFixed(1)}k`;
|
|
72
69
|
return val;
|
|
73
70
|
}
|
|
74
|
-
else if (data
|
|
71
|
+
else if (data !== Math.floor(data)) {
|
|
75
72
|
return data.toFixed(1).toString();
|
|
76
73
|
}
|
|
77
74
|
return data.toString();
|
|
@@ -102,7 +99,6 @@ export class AnnaFilterService {
|
|
|
102
99
|
"Rate",
|
|
103
100
|
"OrderedRatingsOrImpressions",
|
|
104
101
|
"PostedRatingsOrImpressions",
|
|
105
|
-
,
|
|
106
102
|
"postedAudPercent",
|
|
107
103
|
"postedAdu",
|
|
108
104
|
"scheduledAdu",
|
|
@@ -238,23 +234,23 @@ export class AnnaFilterService {
|
|
|
238
234
|
this.timeSet = new Set(timeArr);
|
|
239
235
|
}
|
|
240
236
|
returnMaxAndMinValue(data, key, isMin) {
|
|
241
|
-
|
|
242
|
-
const values =
|
|
243
|
-
|
|
237
|
+
const filteredData = data.filter((obj) => !["", "-", null].includes(obj[key]));
|
|
238
|
+
const values = filteredData.map((x) => x[key]);
|
|
239
|
+
const valueToReturn = isMin ? min(values) : max(values);
|
|
244
240
|
return valueToReturn;
|
|
245
241
|
}
|
|
246
242
|
returnMinAndMaxDate(data, key) {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
243
|
+
const filteredData = data.filter((obj) => !["", "-", null].includes(obj[key]));
|
|
244
|
+
const DateArr = filteredData.map((obj) => dayjs(obj[key]));
|
|
245
|
+
const minDate = dayjs.min(DateArr);
|
|
246
|
+
const maxDate = dayjs.max(DateArr);
|
|
251
247
|
return [minDate, maxDate];
|
|
252
248
|
}
|
|
253
249
|
isTooltipActive(header, sortMap) {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
if (header.length
|
|
250
|
+
const set = new Set(this.appliedFiltersArray);
|
|
251
|
+
const isSortMapForHeader0Active = sortMap.has(header[0]) && sortMap.get(header[0]) !== SortTypeEnum.DEFAULT;
|
|
252
|
+
const isSortMapForHeader1Active = sortMap.has(header[1]) && sortMap.get(header[1]) !== SortTypeEnum.DEFAULT;
|
|
253
|
+
if (header.length === 1) {
|
|
258
254
|
return (sortMap.size > 0 && isSortMapForHeader0Active) || set.has(header[0]);
|
|
259
255
|
}
|
|
260
256
|
return ((sortMap.size > 0 && sortMap.has(header[0]) && isSortMapForHeader0Active) ||
|
|
@@ -265,7 +261,7 @@ export class AnnaFilterService {
|
|
|
265
261
|
clearColumnFilter() {
|
|
266
262
|
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
267
263
|
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
268
|
-
|
|
264
|
+
const appliedFilterSet = new Set(this.appliedFiltersArray);
|
|
269
265
|
appliedFilterSet.delete(this.selectedRadio);
|
|
270
266
|
this.appliedFiltersArray = [...appliedFilterSet];
|
|
271
267
|
}
|
|
@@ -282,8 +278,8 @@ export class AnnaFilterService {
|
|
|
282
278
|
};
|
|
283
279
|
}
|
|
284
280
|
findUniqueDatesWithData(data) {
|
|
285
|
-
|
|
286
|
-
|
|
281
|
+
const uniqueDates = uniq(data.map((u) => u.date));
|
|
282
|
+
const uniqueDatesInNgbDateFormat = [];
|
|
287
283
|
uniqueDates.forEach((date) => {
|
|
288
284
|
uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(dayjs(date, "MM/DD/YY").format("MM/DD/YYYY")));
|
|
289
285
|
});
|
|
@@ -295,69 +291,70 @@ export class AnnaFilterService {
|
|
|
295
291
|
this.removeOrChangeLatestFilterIndex(isFiltered);
|
|
296
292
|
}
|
|
297
293
|
checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date) {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
this.selectedRadio
|
|
304
|
-
this.selectedRadio
|
|
305
|
-
this.selectedRadio
|
|
306
|
-
this.selectedRadio
|
|
307
|
-
this.selectedRadio
|
|
308
|
-
this.selectedRadio
|
|
309
|
-
this.selectedRadio
|
|
310
|
-
this.selectedRadio
|
|
311
|
-
this.selectedRadio
|
|
312
|
-
|
|
294
|
+
let isDataFiltered = isFiltered;
|
|
295
|
+
if (this.selectedRadio === "user" && !this.tooltipMap.has("user")) {
|
|
296
|
+
isDataFiltered = cloneDeep(isHierarchialUserFiltered);
|
|
297
|
+
}
|
|
298
|
+
else if (this.selectedRadio === "StartTimeForFilter" ||
|
|
299
|
+
this.selectedRadio === "EndTimeForFilter" ||
|
|
300
|
+
this.selectedRadio === "startTimeForFilter" ||
|
|
301
|
+
this.selectedRadio === "endTimeForFilter" ||
|
|
302
|
+
this.selectedRadio === "time" ||
|
|
303
|
+
this.selectedRadio === "timeoutTime" ||
|
|
304
|
+
this.selectedRadio === "OtherAvailableSpotsTableStartTime" ||
|
|
305
|
+
this.selectedRadio === "OtherAvailableSpotsTableEndTime" ||
|
|
306
|
+
this.selectedRadio === "start_time_for_filter" ||
|
|
307
|
+
this.selectedRadio === "end_time_for_filter" ||
|
|
308
|
+
this.selectedRadio === "startEndTimeMulti") {
|
|
309
|
+
isDataFiltered =
|
|
313
310
|
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
|
|
314
311
|
!this.includeZeroTime ||
|
|
315
312
|
!this.includeMultiTime;
|
|
316
313
|
}
|
|
317
|
-
else if (this.selectedRadio
|
|
318
|
-
|
|
314
|
+
else if (this.selectedRadio === "startEndTime" || this.selectedRadio === "TimeBand") {
|
|
315
|
+
isDataFiltered =
|
|
319
316
|
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
|
|
320
317
|
!this.includeZeroTime ||
|
|
321
318
|
!this.includeMultiTime;
|
|
322
319
|
}
|
|
323
320
|
else if (this.sliderSet.has(this.selectedRadio)) {
|
|
324
|
-
|
|
321
|
+
isDataFiltered =
|
|
325
322
|
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.sliderData);
|
|
326
|
-
if (this.selectedRadio
|
|
327
|
-
|
|
323
|
+
if (this.selectedRadio === "postedAdu" && this.subRadioButton === "notRequired") {
|
|
324
|
+
isDataFiltered = true;
|
|
328
325
|
}
|
|
329
|
-
if (!
|
|
326
|
+
if (!isDataFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
330
327
|
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
331
328
|
}
|
|
332
329
|
}
|
|
333
|
-
else if (this.selectedRadio
|
|
334
|
-
this.selectedRadio
|
|
335
|
-
this.selectedRadio
|
|
336
|
-
this.selectedRadio
|
|
337
|
-
this.selectedRadio
|
|
330
|
+
else if (this.selectedRadio === "startDate" ||
|
|
331
|
+
this.selectedRadio === "endDate" ||
|
|
332
|
+
this.selectedRadio === "period" ||
|
|
333
|
+
this.selectedRadio === "AirDate" ||
|
|
334
|
+
this.selectedRadio === "timeoutDate" ||
|
|
338
335
|
this.selectedRadio === "flightStartDate" ||
|
|
339
336
|
this.selectedRadio === "flightEndDate" ||
|
|
340
|
-
this.selectedRadio
|
|
341
|
-
this.selectedRadio
|
|
342
|
-
this.selectedRadio
|
|
343
|
-
this.selectedRadio
|
|
344
|
-
|
|
337
|
+
this.selectedRadio === "date" ||
|
|
338
|
+
this.selectedRadio === "revisionStartDate" ||
|
|
339
|
+
this.selectedRadio === "GeneratedOn" ||
|
|
340
|
+
this.selectedRadio === "Week") {
|
|
341
|
+
isDataFiltered =
|
|
345
342
|
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.flightDateRange);
|
|
346
|
-
if (!
|
|
343
|
+
if (!isDataFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
347
344
|
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
348
345
|
}
|
|
349
346
|
}
|
|
350
347
|
else {
|
|
351
|
-
|
|
352
|
-
|
|
348
|
+
const totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
|
|
349
|
+
const selectedOptionsCount = this.tooltipMap
|
|
353
350
|
.get(this.selectedRadio)
|
|
354
351
|
.filter((x) => !x.isHidden && x.isSelected).length;
|
|
355
|
-
|
|
352
|
+
isDataFiltered = selectedOptionsCount > 0 && selectedOptionsCount !== totalOptionsCount;
|
|
356
353
|
}
|
|
357
|
-
return
|
|
354
|
+
return isDataFiltered;
|
|
358
355
|
}
|
|
359
356
|
removeOrChangeLatestFilterIndex(isFiltered) {
|
|
360
|
-
|
|
357
|
+
const set = new Set(this.appliedFiltersArray);
|
|
361
358
|
if (isFiltered && !set.has(this.selectedRadio)) {
|
|
362
359
|
set.add(this.selectedRadio);
|
|
363
360
|
}
|
|
@@ -371,17 +368,18 @@ export class AnnaFilterService {
|
|
|
371
368
|
this.appliedFiltersArray = [...set];
|
|
372
369
|
}
|
|
373
370
|
checkIfSortingIsAppliedThenSortTheData(originalData) {
|
|
371
|
+
let sortedData = originalData;
|
|
374
372
|
if (!this.annaSortService?.columnSortState)
|
|
375
|
-
return
|
|
376
|
-
|
|
377
|
-
if (value
|
|
378
|
-
|
|
373
|
+
return sortedData;
|
|
374
|
+
this.annaSortService.columnSortState.forEach((value, key) => {
|
|
375
|
+
if (value === "ASC") {
|
|
376
|
+
sortedData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(true, originalData, key));
|
|
379
377
|
}
|
|
380
|
-
else if (value
|
|
381
|
-
|
|
378
|
+
else if (value === "DESC") {
|
|
379
|
+
sortedData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(false, originalData, key));
|
|
382
380
|
}
|
|
383
|
-
}
|
|
384
|
-
return
|
|
381
|
+
});
|
|
382
|
+
return sortedData;
|
|
385
383
|
}
|
|
386
384
|
filterData(originalData, keyToSkip, isLurCsrPage = false) {
|
|
387
385
|
let filteredData = [...originalData];
|
|
@@ -389,20 +387,22 @@ export class AnnaFilterService {
|
|
|
389
387
|
filteredData = this.checkIfSortingIsAppliedThenSortTheData(originalData);
|
|
390
388
|
}
|
|
391
389
|
this.tooltipSelectedMap.forEach((value, key) => {
|
|
392
|
-
if (key
|
|
390
|
+
if (key !== keyToSkip && originalData.length > 0 && Object.keys(originalData[0]).includes(key)) {
|
|
393
391
|
if (this.sliderSet.has(key)) {
|
|
394
392
|
filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
|
|
395
393
|
}
|
|
396
394
|
else if (key === "startDate" ||
|
|
397
395
|
key === "endDate" ||
|
|
396
|
+
key === "StartDate" ||
|
|
397
|
+
key === "EndDate" ||
|
|
398
398
|
key === "AirDate" ||
|
|
399
399
|
key === "timeoutDate" ||
|
|
400
400
|
key === "flightStartDate" ||
|
|
401
401
|
key === "flightEndDate" ||
|
|
402
|
-
key
|
|
403
|
-
key
|
|
404
|
-
key
|
|
405
|
-
key
|
|
402
|
+
key === "date" ||
|
|
403
|
+
key === "Date" ||
|
|
404
|
+
key === "revisionStartDate" ||
|
|
405
|
+
key === "GeneratedOn" ||
|
|
406
406
|
key === "Week" ||
|
|
407
407
|
key === "ViolatedSpotDate" ||
|
|
408
408
|
key === "ViolatingSpotDate") {
|
|
@@ -413,17 +413,17 @@ export class AnnaFilterService {
|
|
|
413
413
|
}
|
|
414
414
|
else if (key === "StartTimeForFilter" ||
|
|
415
415
|
key === "EndTimeForFilter" ||
|
|
416
|
-
key
|
|
416
|
+
key === "timeoutTime" ||
|
|
417
417
|
key === "startTimeForFilter" ||
|
|
418
418
|
key === "endTimeForFilter" ||
|
|
419
419
|
key === "OtherAvailableSpotsTableStartTime" ||
|
|
420
|
-
key
|
|
420
|
+
key === "OtherAvailableSpotsTableEndTime" ||
|
|
421
421
|
key === "start_time_for_filter" ||
|
|
422
422
|
key === "end_time_for_filter" ||
|
|
423
|
-
key
|
|
423
|
+
key === "time") {
|
|
424
424
|
filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
|
|
425
425
|
}
|
|
426
|
-
else if (key === "startEndTimeMulti" || key
|
|
426
|
+
else if (key === "startEndTimeMulti" || key === "startEndTime" || key === "TimeBand") {
|
|
427
427
|
filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
|
|
428
428
|
}
|
|
429
429
|
else if (value.length > 0) {
|
|
@@ -434,97 +434,104 @@ export class AnnaFilterService {
|
|
|
434
434
|
return filteredData;
|
|
435
435
|
}
|
|
436
436
|
returnOrdersInTheRange(order, range, key) {
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
437
|
+
const isDateBetweenTheSelectedRange = dayjs(order[key]).isBetween(range.minSelectedDate, range.maxSelectedDate);
|
|
438
|
+
const isDateSameAsTheMinSelectedDate = dayjs(order[key]).isSame(range.minSelectedDate);
|
|
439
|
+
const isDateSameAsTheMaxSelectedDate = dayjs(order[key]).isSame(range.maxSelectedDate);
|
|
440
440
|
return isDateBetweenTheSelectedRange || isDateSameAsTheMinSelectedDate || isDateSameAsTheMaxSelectedDate;
|
|
441
441
|
}
|
|
442
442
|
returnDataForTimeRange(obj, selectedData) {
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
443
|
+
const format = "HH:mm:ss";
|
|
444
|
+
const selectedStartDate = dayjs(selectedData.startTime, format);
|
|
445
|
+
const selectedEndDate = dayjs(selectedData.endTime, format);
|
|
446
|
+
const startTime = dayjs(obj.startTime, format);
|
|
447
|
+
const endTime = dayjs(obj.endTime, format);
|
|
448
|
+
const isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedStartDate);
|
|
449
|
+
const isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedStartDate, selectedEndDate);
|
|
450
|
+
const isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedEndDate);
|
|
451
|
+
const isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedStartDate, selectedEndDate);
|
|
452
452
|
return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
453
453
|
(isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
|
|
454
454
|
(isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
455
455
|
(isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
|
|
456
456
|
}
|
|
457
457
|
returnDataForFromAndToTimeRange(obj, selectedData, key) {
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
458
|
+
const format = "MM/DD/YYYY HH:mm:ss";
|
|
459
|
+
const selectedFromTime = dayjs(`01/01/2001 ${selectedData.fromTime}`, format);
|
|
460
|
+
const selectedToTime = dayjs(`01/01/2001 ${selectedData.toTime}`, format);
|
|
461
|
+
const objTime = obj[key];
|
|
462
462
|
if (["", "-", null].includes(objTime)) {
|
|
463
463
|
return false;
|
|
464
464
|
}
|
|
465
|
-
if (selectedData.includeMulti && obj[key]
|
|
465
|
+
if (selectedData.includeMulti && obj[key] === "<multi>") {
|
|
466
466
|
return true;
|
|
467
467
|
}
|
|
468
|
-
if (!selectedData.includeMulti && obj[key]
|
|
468
|
+
if (!selectedData.includeMulti && obj[key] === "<multi>") {
|
|
469
469
|
return false;
|
|
470
470
|
}
|
|
471
|
-
if (selectedData.includeZero && obj[key]
|
|
471
|
+
if (selectedData.includeZero && obj[key] === "0") {
|
|
472
472
|
return true;
|
|
473
473
|
}
|
|
474
|
-
if (!selectedData.includeZero && obj[key]
|
|
474
|
+
if (!selectedData.includeZero && obj[key] === "0") {
|
|
475
475
|
return false;
|
|
476
476
|
}
|
|
477
477
|
if (!selectedData.includeTimeRange) {
|
|
478
478
|
return false;
|
|
479
479
|
}
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
480
|
+
const dayjsTime = dayjs(`01/01/2001 ${objTime}`, format);
|
|
481
|
+
const isObjTimeSameAsSelectedFromTime = dayjsTime.isSame(selectedFromTime);
|
|
482
|
+
const isObjTimeSameAsSelectedToTime = dayjsTime.isSame(selectedToTime);
|
|
483
|
+
const isObjTimeBetweenSelectedFromTimeAndToTime = dayjsTime.isBetween(selectedFromTime, selectedToTime);
|
|
484
484
|
return (isObjTimeSameAsSelectedFromTime ||
|
|
485
485
|
isObjTimeSameAsSelectedToTime ||
|
|
486
486
|
isObjTimeBetweenSelectedFromTimeAndToTime);
|
|
487
487
|
}
|
|
488
488
|
returnDataForStartAndEndTimeRange(obj, selectedData, key) {
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
if (selectedData.includeMulti && obj[key][0]
|
|
489
|
+
const format = "MM/DD/YYYY HH:mm:ss";
|
|
490
|
+
const selectedFromTime = dayjs(`01/01/2001 ${selectedData.fromTime}`, format);
|
|
491
|
+
const selectedToTime = dayjs(`01/01/2001 ${selectedData.toTime}`, format);
|
|
492
|
+
if (selectedData.includeMulti && obj[key][0] === "<multi>") {
|
|
493
493
|
return true;
|
|
494
494
|
}
|
|
495
|
-
if (!selectedData.includeMulti && obj[key][0]
|
|
495
|
+
if (!selectedData.includeMulti && obj[key][0] === "<multi>") {
|
|
496
496
|
return false;
|
|
497
497
|
}
|
|
498
|
-
if (selectedData.includeZero && obj[key][0]
|
|
498
|
+
if (selectedData.includeZero && obj[key][0] === "0") {
|
|
499
499
|
return true;
|
|
500
500
|
}
|
|
501
|
-
if (!selectedData.includeZero && obj[key][0]
|
|
501
|
+
if (!selectedData.includeZero && obj[key][0] === "0") {
|
|
502
502
|
return false;
|
|
503
503
|
}
|
|
504
504
|
if (!selectedData.includeTimeRange) {
|
|
505
505
|
return false;
|
|
506
506
|
}
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
507
|
+
const startTime = dayjs(`01/01/2001 ${obj[key][1]}`, format);
|
|
508
|
+
const endTime = dayjs(`01/01/2001 ${obj[key][2]}`, format);
|
|
509
|
+
const isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedFromTime);
|
|
510
|
+
const isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedFromTime, selectedToTime);
|
|
511
|
+
const isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedToTime);
|
|
512
|
+
const isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedFromTime, selectedToTime);
|
|
513
|
+
// previous condition to apply timband filtter
|
|
514
|
+
// return (
|
|
515
|
+
// (isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
516
|
+
// (isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
|
|
517
|
+
// (isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
518
|
+
// (isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime)
|
|
519
|
+
// );
|
|
520
|
+
return (isStartTimeSameAsSelectedStartTime ||
|
|
521
|
+
isStartTimeBetweenSelectedStartAndEndTime ||
|
|
522
|
+
isEndTimeSameAsSelectedEndTime ||
|
|
523
|
+
isEndTimeBetweenSelectedStartAndEndTime);
|
|
517
524
|
}
|
|
518
525
|
getDataInTheDateRange(obj, value, key) {
|
|
519
526
|
let parsingFormat;
|
|
520
527
|
if (key === "period") {
|
|
521
528
|
parsingFormat = "YYYY-MM-DD";
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
529
|
+
const dayjsStartDate = dayjs(obj.startDate);
|
|
530
|
+
const dayjsEndDate = dayjs(obj.endDate);
|
|
531
|
+
const startDateIsBetweenSelDate = dayjsStartDate.isBetween(value.fromDate, value.toDate);
|
|
532
|
+
const endDateIsBetweenSelDate = dayjsEndDate.isBetween(value.fromDate, value.toDate);
|
|
533
|
+
const startDateIsSameAsSelStartDate = value.fromDate.isSame(dayjsStartDate);
|
|
534
|
+
const endDateIsSameAsSelEndDate = value.toDate.isSame(dayjsEndDate);
|
|
528
535
|
return ((startDateIsBetweenSelDate || startDateIsSameAsSelStartDate) &&
|
|
529
536
|
(endDateIsBetweenSelDate || endDateIsSameAsSelEndDate));
|
|
530
537
|
}
|
|
@@ -534,44 +541,39 @@ export class AnnaFilterService {
|
|
|
534
541
|
key === "Week" ||
|
|
535
542
|
key === "timeoutDate") {
|
|
536
543
|
parsingFormat = "MM/DD/YYYY";
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
544
|
+
const dateIsBetweenSelDate = dayjs(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
|
|
545
|
+
const dateIsSameAsSelStartDate = dayjs(obj[key], parsingFormat).isSame(value.minSelectedDate);
|
|
546
|
+
const dateIsSameAsSelEndDate = dayjs(obj[key], parsingFormat).isSame(value.maxSelectedDate);
|
|
540
547
|
return dateIsBetweenSelDate || dateIsSameAsSelStartDate || dateIsSameAsSelEndDate;
|
|
541
548
|
}
|
|
549
|
+
return false;
|
|
542
550
|
}
|
|
543
551
|
initializeTimeFilterData(clonedData, key = "startEndTime") {
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
startTimeArr.sort((a, b) =>
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
endTimeArr.sort((a, b) => {
|
|
550
|
-
return this.dateTimeFormatService.sortByTimeDescending(a, b);
|
|
551
|
-
});
|
|
552
|
-
let initialStartEndTime = {
|
|
552
|
+
const startTimeArr = map(clonedData, "startTime");
|
|
553
|
+
const endTimeArr = map(clonedData, "endTime");
|
|
554
|
+
startTimeArr.sort((a, b) => this.dateTimeFormatService.sortByTimeAscending(a, b));
|
|
555
|
+
endTimeArr.sort((a, b) => this.dateTimeFormatService.sortByTimeDescending(a, b));
|
|
556
|
+
const initialStartEndTime = {
|
|
553
557
|
startTime: startTimeArr[0],
|
|
554
558
|
endTime: endTimeArr[0],
|
|
555
559
|
};
|
|
556
560
|
this.initialValueMap.set(key, initialStartEndTime);
|
|
557
561
|
}
|
|
558
562
|
returnColumnFilterStatus(data, headerName) {
|
|
559
|
-
if (headerName
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
return uniqTime.length
|
|
563
|
+
if (headerName === "startEndTime") {
|
|
564
|
+
const time = data.map((u) => u[headerName][0]);
|
|
565
|
+
const uniqTime = uniq(time);
|
|
566
|
+
return uniqTime.length === 0;
|
|
563
567
|
}
|
|
564
|
-
return uniq(data.map((u) => u[headerName])).length > 1
|
|
568
|
+
return !(uniq(data.map((u) => u[headerName])).length > 1);
|
|
565
569
|
}
|
|
566
570
|
getFilterOptionsData(data, clonedData, key) {
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
if (appliedFilterSet.has(
|
|
570
|
-
return this.filterData(clonedData,
|
|
571
|
-
}
|
|
572
|
-
else {
|
|
573
|
-
return data;
|
|
571
|
+
const appliedFilterSet = new Set(this.appliedFiltersArray);
|
|
572
|
+
const keyToCheck = key || this.selectedRadio;
|
|
573
|
+
if (appliedFilterSet.has(keyToCheck)) {
|
|
574
|
+
return this.filterData(clonedData, keyToCheck);
|
|
574
575
|
}
|
|
576
|
+
return data;
|
|
575
577
|
}
|
|
576
578
|
reOrderAppliedFiltersState(clonedData, value) {
|
|
577
579
|
let isFiltered = true;
|
|
@@ -580,26 +582,28 @@ export class AnnaFilterService {
|
|
|
580
582
|
return isFiltered;
|
|
581
583
|
}
|
|
582
584
|
checkIfFilterIsApplied(clonedData, value) {
|
|
583
|
-
|
|
584
|
-
|
|
585
|
+
const initialValueOfColumn = sortBy(clonedData.map((item) => item[this.selectedRadio]));
|
|
586
|
+
const currentValueOfColumn = sortBy(this.applyFilter(clonedData, value).map((item) => item[this.selectedRadio]));
|
|
585
587
|
return !isEqual(initialValueOfColumn, currentValueOfColumn);
|
|
586
588
|
}
|
|
587
589
|
applyFilter(data, value) {
|
|
588
590
|
let filteredData = data;
|
|
589
|
-
|
|
591
|
+
const key = this.selectedRadio;
|
|
590
592
|
if (this.sliderSet.has(key)) {
|
|
591
593
|
filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
|
|
592
594
|
}
|
|
593
595
|
else if (key === "startDate" ||
|
|
594
596
|
key === "endDate" ||
|
|
597
|
+
key === "StartDate" ||
|
|
598
|
+
key === "EndDate" ||
|
|
595
599
|
key === "AirDate" ||
|
|
596
600
|
key === "timeoutDate" ||
|
|
597
601
|
key === "flightStartDate" ||
|
|
598
602
|
key === "flightEndDate" ||
|
|
599
|
-
key
|
|
600
|
-
key
|
|
601
|
-
key
|
|
602
|
-
key
|
|
603
|
+
key === "date" ||
|
|
604
|
+
key === "Date" ||
|
|
605
|
+
key === "revisionStartDate" ||
|
|
606
|
+
key === "GeneratedOn" ||
|
|
603
607
|
key === "Week" ||
|
|
604
608
|
key === "ViolatedSpotDate" ||
|
|
605
609
|
key === "ViolatingSpotDate") {
|
|
@@ -610,17 +614,17 @@ export class AnnaFilterService {
|
|
|
610
614
|
}
|
|
611
615
|
else if (key === "StartTimeForFilter" ||
|
|
612
616
|
key === "EndTimeForFilter" ||
|
|
613
|
-
key
|
|
617
|
+
key === "timeoutTime" ||
|
|
614
618
|
key === "startTimeForFilter" ||
|
|
615
619
|
key === "endTimeForFilter" ||
|
|
616
620
|
key === "start_time_for_filter" ||
|
|
617
621
|
key === "end_time_for_filter" ||
|
|
618
|
-
key
|
|
619
|
-
key
|
|
620
|
-
key
|
|
622
|
+
key === "time" ||
|
|
623
|
+
key === "OtherAvailableSpotsTableStartTime" ||
|
|
624
|
+
key === "OtherAvailableSpotsTableEndTime") {
|
|
621
625
|
filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
|
|
622
626
|
}
|
|
623
|
-
else if (key === "startEndTimeMulti" || key
|
|
627
|
+
else if (key === "startEndTimeMulti" || key === "startEndTime" || key === "TimeBand") {
|
|
624
628
|
filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
|
|
625
629
|
}
|
|
626
630
|
else if (value.length > 0) {
|
|
@@ -629,19 +633,19 @@ export class AnnaFilterService {
|
|
|
629
633
|
return filteredData;
|
|
630
634
|
}
|
|
631
635
|
isObjectInTheRange(obj, value, key) {
|
|
632
|
-
|
|
633
|
-
|
|
636
|
+
const objVal = obj[key];
|
|
637
|
+
const dayjsDate = dayjs(objVal);
|
|
634
638
|
if (typeof value.fromDate === "string" && typeof value.toDate === "string") {
|
|
635
639
|
value.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.fromDate, "DD/MM/YYYY")));
|
|
636
640
|
value.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.toDate, "DD/MM/YYYY")));
|
|
637
641
|
}
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
642
|
+
const isDateSameAsStartOfTheRange = value.fromDate.isSame(objVal);
|
|
643
|
+
const isDateSameAsEndOfTheRange = value.toDate.isSame(objVal);
|
|
644
|
+
const isDateBetweenTheStartAndEndOfRange = dayjsDate.isBetween(value.fromDate, value.toDate);
|
|
641
645
|
return isDateSameAsStartOfTheRange || isDateSameAsEndOfTheRange || isDateBetweenTheStartAndEndOfRange;
|
|
642
646
|
}
|
|
643
647
|
updateStateOfTheCurrentFilterTab(sortMap) {
|
|
644
|
-
|
|
648
|
+
const activeKey = this.selectedRadio;
|
|
645
649
|
let keyArr = [];
|
|
646
650
|
Object.keys(this.isFilterSortActive).forEach((key) => {
|
|
647
651
|
if (key.includes(activeKey)) {
|
|
@@ -652,114 +656,112 @@ export class AnnaFilterService {
|
|
|
652
656
|
}
|
|
653
657
|
updateStateOfAllTheKeys(sortMap) {
|
|
654
658
|
Object.keys(this.isFilterSortActive).forEach((key) => {
|
|
655
|
-
|
|
659
|
+
const keyArr = key.split(",");
|
|
656
660
|
this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
|
|
657
661
|
});
|
|
658
662
|
}
|
|
659
663
|
incrementHour(value) {
|
|
660
|
-
if (value
|
|
661
|
-
|
|
664
|
+
if (value === "") {
|
|
665
|
+
return 1;
|
|
662
666
|
}
|
|
663
|
-
else if (parseInt(value) < 12) {
|
|
664
|
-
|
|
665
|
-
}
|
|
666
|
-
else {
|
|
667
|
-
value = 1;
|
|
667
|
+
else if (parseInt(value, 10) < 12) {
|
|
668
|
+
return parseInt(value, 10) + 1;
|
|
668
669
|
}
|
|
669
|
-
return
|
|
670
|
+
return 1;
|
|
670
671
|
}
|
|
671
672
|
decrementHour(value) {
|
|
672
|
-
if (value
|
|
673
|
-
|
|
674
|
-
}
|
|
675
|
-
else if (parseInt(value) > 1) {
|
|
676
|
-
value = parseInt(value) - 1;
|
|
673
|
+
if (value === "") {
|
|
674
|
+
return 12;
|
|
677
675
|
}
|
|
678
|
-
else {
|
|
679
|
-
value
|
|
676
|
+
else if (parseInt(value, 10) > 1) {
|
|
677
|
+
return parseInt(value, 10) - 1;
|
|
680
678
|
}
|
|
681
|
-
return
|
|
679
|
+
return 12;
|
|
682
680
|
}
|
|
683
681
|
incrementMinute(value) {
|
|
684
682
|
// increment to nearest proper interval(15,30,45)
|
|
685
|
-
|
|
686
|
-
if (
|
|
687
|
-
|
|
683
|
+
const minute = parseInt(value, 10);
|
|
684
|
+
if (minute <= 14) {
|
|
685
|
+
return "15";
|
|
688
686
|
}
|
|
689
|
-
else if (
|
|
690
|
-
|
|
687
|
+
else if (minute >= 15 && minute <= 29) {
|
|
688
|
+
return "30";
|
|
691
689
|
}
|
|
692
|
-
else if (
|
|
693
|
-
|
|
690
|
+
else if (minute >= 30 && minute <= 44) {
|
|
691
|
+
return "45";
|
|
694
692
|
}
|
|
695
|
-
else if (
|
|
696
|
-
|
|
693
|
+
else if (minute >= 45) {
|
|
694
|
+
return "00";
|
|
697
695
|
}
|
|
698
696
|
return value;
|
|
699
697
|
}
|
|
700
698
|
decrementMinute(value) {
|
|
701
|
-
|
|
702
|
-
if (
|
|
703
|
-
|
|
699
|
+
const minute = parseInt(value, 10);
|
|
700
|
+
if (minute > 0 && minute <= 15) {
|
|
701
|
+
return "00";
|
|
704
702
|
}
|
|
705
|
-
else if (
|
|
706
|
-
|
|
703
|
+
else if (minute >= 16 && minute <= 30) {
|
|
704
|
+
return "15";
|
|
707
705
|
}
|
|
708
|
-
else if (
|
|
709
|
-
|
|
706
|
+
else if (minute >= 31 && minute <= 45) {
|
|
707
|
+
return "30";
|
|
710
708
|
}
|
|
711
|
-
else if (
|
|
712
|
-
|
|
709
|
+
else if (minute > 45 || minute === 0) {
|
|
710
|
+
return "45";
|
|
713
711
|
}
|
|
714
712
|
return value;
|
|
715
713
|
}
|
|
716
|
-
|
|
714
|
+
// ========================================Checkbox method====================================================//
|
|
717
715
|
disableActiveFilterClearButton() {
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
716
|
+
const selectedFilterSet = new Set(this.appliedFiltersArray);
|
|
717
|
+
const currentColumnSortFilter = this.getColumnSortStateForSelectedRadio();
|
|
718
|
+
const isSortPresent = this.annaSortService.columnSortState &&
|
|
721
719
|
this.annaSortService.columnSortState.size > 0 &&
|
|
722
|
-
currentColumnSortFilter
|
|
720
|
+
currentColumnSortFilter !== SortTypeEnum.DEFAULT;
|
|
723
721
|
return !(selectedFilterSet.has(this.selectedRadio) || isSortPresent);
|
|
724
722
|
}
|
|
725
723
|
getColumnSortStateForSelectedRadio() {
|
|
726
724
|
let currentColumnSortFilter = this.annaSortService.columnSortState &&
|
|
727
725
|
this.annaSortService.columnSortState.has(this.selectedRadio) &&
|
|
728
726
|
this.annaSortService.columnSortState.get(this.selectedRadio);
|
|
729
|
-
currentColumnSortFilter = currentColumnSortFilter
|
|
727
|
+
currentColumnSortFilter = currentColumnSortFilter || SortTypeEnum.DEFAULT;
|
|
730
728
|
return currentColumnSortFilter;
|
|
731
729
|
}
|
|
732
730
|
createListForCheckboxFilter(header, optionData) {
|
|
733
|
-
|
|
731
|
+
const tooltipOptions = this.getTooltipModelFromOptionData(optionData, header);
|
|
734
732
|
this.selectUnselectListCheckbox(tooltipOptions, header);
|
|
735
733
|
this.formatNullOptionToSpecifiedString(tooltipOptions, "-");
|
|
736
734
|
return tooltipOptions;
|
|
737
735
|
}
|
|
738
736
|
getTooltipModelFromOptionData(optionData, header) {
|
|
739
|
-
|
|
737
|
+
const uniqOptionData = uniq(optionData.map((item) => item[header]));
|
|
740
738
|
return uniqOptionData.map((item, index) => new TooltipModel(item, index + 1));
|
|
741
739
|
}
|
|
742
740
|
selectUnselectListCheckbox(tooltipOptions, header) {
|
|
743
741
|
if (this.tooltipSelectedMap.has(header)) {
|
|
744
|
-
|
|
745
|
-
tooltipOptions.forEach((item) =>
|
|
742
|
+
const selectedValueSet = new Set(this.tooltipSelectedMap.get(header));
|
|
743
|
+
tooltipOptions.forEach((item) => {
|
|
744
|
+
item.isSelected = selectedValueSet.has(item.value);
|
|
745
|
+
});
|
|
746
746
|
}
|
|
747
747
|
else {
|
|
748
|
-
tooltipOptions.forEach((item) =>
|
|
748
|
+
tooltipOptions.forEach((item) => {
|
|
749
|
+
item.isSelected = true;
|
|
750
|
+
});
|
|
749
751
|
}
|
|
750
752
|
}
|
|
751
753
|
formatNullOptionToSpecifiedString(tooltipOptions, formattedString) {
|
|
752
|
-
|
|
753
|
-
if (index
|
|
754
|
+
const index = tooltipOptions.findIndex((item) => item.value == null);
|
|
755
|
+
if (index !== -1) {
|
|
754
756
|
tooltipOptions[index].label = formattedString;
|
|
755
757
|
}
|
|
756
758
|
}
|
|
757
759
|
getClonedTooltipAndTooltipOption(tooltipOptions, sortByString) {
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
760
|
+
const [selectedItems, unselectedItems] = this.getSelectedAndUnselectedItems(tooltipOptions);
|
|
761
|
+
const sortedSelectedItems = sortBy(selectedItems, sortByString);
|
|
762
|
+
const sortedUnselectedItems = sortBy(unselectedItems, sortByString);
|
|
763
|
+
const clonedTooltipOptions = [...sortedSelectedItems, ...sortedUnselectedItems];
|
|
764
|
+
const updatedTooltipOptions = cloneDeep(clonedTooltipOptions);
|
|
763
765
|
return [clonedTooltipOptions, updatedTooltipOptions, selectedItems, unselectedItems];
|
|
764
766
|
}
|
|
765
767
|
getHeightOfCheckboxTooltipFilter(dataLength, margin) {
|
|
@@ -768,25 +770,25 @@ export class AnnaFilterService {
|
|
|
768
770
|
unCheckAllCheckbox(tooltipOptions, clonedTooltipOptions) {
|
|
769
771
|
tooltipOptions.forEach((item) => {
|
|
770
772
|
item.isSelected = false;
|
|
771
|
-
|
|
773
|
+
const index = clonedTooltipOptions.findIndex((opt) => opt.id === item.id);
|
|
772
774
|
clonedTooltipOptions[index].isSelected = false;
|
|
773
775
|
});
|
|
774
776
|
}
|
|
775
777
|
selectAllCheckbox(tooltipOptions, clonedTooltipOptions) {
|
|
776
778
|
tooltipOptions.forEach((item) => {
|
|
777
779
|
item.isSelected = true;
|
|
778
|
-
|
|
780
|
+
const index = clonedTooltipOptions.findIndex((opt) => opt.id === item.id);
|
|
779
781
|
clonedTooltipOptions[index].isSelected = true;
|
|
780
782
|
});
|
|
781
783
|
}
|
|
782
784
|
selectUnselectCheckbox(data, clonedTooltipOptions) {
|
|
783
785
|
data.isSelected = !data.isSelected;
|
|
784
|
-
|
|
786
|
+
const index = clonedTooltipOptions.findIndex((item) => item.id === data.id);
|
|
785
787
|
clonedTooltipOptions[index].isSelected = data.isSelected;
|
|
786
788
|
}
|
|
787
789
|
getSelectedAndUnselectedItems(tooltipOptions) {
|
|
788
|
-
|
|
789
|
-
|
|
790
|
+
const selectedItems = tooltipOptions.filter((item) => item.isSelected);
|
|
791
|
+
const unselectedItems = tooltipOptions.filter((item) => !item.isSelected);
|
|
790
792
|
return [selectedItems, unselectedItems];
|
|
791
793
|
}
|
|
792
794
|
getCheckboxPreviousSelectedValue(clonedTableData) {
|
|
@@ -794,7 +796,7 @@ export class AnnaFilterService {
|
|
|
794
796
|
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
795
797
|
previousSelectedValue = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
796
798
|
if (!this.initialValueMap.has(this.selectedRadio)) {
|
|
797
|
-
|
|
799
|
+
const initialValue = sortBy(uniq(clonedTableData.map((item) => item[this.selectedRadio])));
|
|
798
800
|
this.initialValueMap.set(this.selectedRadio, initialValue);
|
|
799
801
|
}
|
|
800
802
|
}
|
|
@@ -812,50 +814,55 @@ export class AnnaFilterService {
|
|
|
812
814
|
if (tooltipOptions) {
|
|
813
815
|
currentSelectedValue = sortBy(tooltipOptions.filter((item) => item.isSelected).map((item) => item.value));
|
|
814
816
|
if (!searchedString &&
|
|
815
|
-
currentSelectedValue.length
|
|
817
|
+
currentSelectedValue.length === tooltipOptions.length &&
|
|
816
818
|
this.initialValueMap.has(this.selectedRadio)) {
|
|
817
819
|
currentSelectedValue = this.initialValueMap.get(this.selectedRadio);
|
|
818
820
|
}
|
|
819
821
|
}
|
|
820
|
-
|
|
821
|
-
if (blankIndex
|
|
822
|
+
const blankIndex = currentSelectedValue.findIndex((item) => item == null);
|
|
823
|
+
if (blankIndex !== -1) {
|
|
822
824
|
currentSelectedValue = sortBy(currentSelectedValue);
|
|
823
825
|
}
|
|
824
826
|
return currentSelectedValue;
|
|
825
827
|
}
|
|
826
828
|
checkIfSortingChanged(tempSortOrder) {
|
|
827
|
-
|
|
828
|
-
|
|
829
|
+
const currentColumnSortFilter = this.getColumnSortStateForSelectedRadio();
|
|
830
|
+
const isSortChanged = tempSortOrder != null && tempSortOrder !== currentColumnSortFilter;
|
|
829
831
|
return isSortChanged;
|
|
830
832
|
}
|
|
831
833
|
getFilteredOptionAsBoldString(str, clonedTooltipOptions) {
|
|
832
|
-
|
|
834
|
+
const tooltipOptions = cloneDeep(clonedTooltipOptions.filter((item) => item.label.toString().toLowerCase().includes(str.toLowerCase())));
|
|
833
835
|
tooltipOptions.forEach((element) => {
|
|
834
836
|
element.label = this.boldString(element.label, str);
|
|
835
837
|
});
|
|
836
838
|
return tooltipOptions;
|
|
837
839
|
}
|
|
838
840
|
boldString(str, find) {
|
|
839
|
-
let
|
|
841
|
+
let updatedString = str;
|
|
842
|
+
const indexes = this.getIndicesOf(find, updatedString, false);
|
|
840
843
|
indexes.forEach((item, index) => {
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
844
|
+
const startIndex = item + index * 7; // Multiplying by 7 as there are 7char: <b></b>
|
|
845
|
+
const endIndex = startIndex + find.length;
|
|
846
|
+
const strToBeReplaced = updatedString.substring(startIndex, endIndex);
|
|
847
|
+
updatedString = updatedString.replace(strToBeReplaced, `<b>${strToBeReplaced}</b>`);
|
|
845
848
|
});
|
|
846
|
-
return
|
|
849
|
+
return updatedString;
|
|
847
850
|
}
|
|
848
851
|
getIndicesOf(searchStr, str, caseSensitive) {
|
|
849
|
-
|
|
850
|
-
if (searchStrLen
|
|
852
|
+
const searchStrLen = searchStr.length;
|
|
853
|
+
if (searchStrLen === 0) {
|
|
851
854
|
return [];
|
|
852
855
|
}
|
|
853
|
-
|
|
856
|
+
let startIndex = 0;
|
|
857
|
+
let index;
|
|
858
|
+
const indices = [];
|
|
859
|
+
let updatedStr = str;
|
|
860
|
+
let updatedSearchStr = searchStr;
|
|
854
861
|
if (!caseSensitive) {
|
|
855
|
-
|
|
856
|
-
|
|
862
|
+
updatedStr = str.toLowerCase();
|
|
863
|
+
updatedSearchStr = searchStr.toLowerCase();
|
|
857
864
|
}
|
|
858
|
-
while ((index =
|
|
865
|
+
while ((index = updatedStr.indexOf(updatedSearchStr, startIndex)) > -1) {
|
|
859
866
|
indices.push(index);
|
|
860
867
|
startIndex = index + searchStrLen;
|
|
861
868
|
}
|
|
@@ -865,13 +872,13 @@ export class AnnaFilterService {
|
|
|
865
872
|
// [selectedCheckboxOptionsCount, disableCheckboxApply, disableClearAll, disableSelectAll];
|
|
866
873
|
return [0, true, true, true];
|
|
867
874
|
}
|
|
868
|
-
|
|
875
|
+
// ========================================Calendar filter===============================================//
|
|
869
876
|
createRangeForTheDateFilter(optionData) {
|
|
870
877
|
let minMaxDate;
|
|
871
|
-
//When you want to use startDate and endDate combined as single column then use Period.
|
|
872
|
-
if (this.selectedRadio
|
|
873
|
-
this.selectedRadio
|
|
874
|
-
this.selectedRadio
|
|
878
|
+
// When you want to use startDate and endDate combined as single column then use Period.
|
|
879
|
+
if (this.selectedRadio === "period" ||
|
|
880
|
+
this.selectedRadio === "buyerFlightDates" ||
|
|
881
|
+
this.selectedRadio === "trafficFlightDates") {
|
|
875
882
|
minMaxDate = this.createStartEndDateRange(optionData);
|
|
876
883
|
}
|
|
877
884
|
else {
|
|
@@ -880,20 +887,20 @@ export class AnnaFilterService {
|
|
|
880
887
|
return minMaxDate;
|
|
881
888
|
}
|
|
882
889
|
createStartEndDateRange(optionData) {
|
|
883
|
-
|
|
884
|
-
|
|
890
|
+
const minStartDate = this.returnMinAndMaxDate(optionData, "startDate");
|
|
891
|
+
const maxEndDate = this.returnMinAndMaxDate(optionData, "endDate");
|
|
885
892
|
return [minStartDate[0], maxEndDate[1]];
|
|
886
893
|
}
|
|
887
894
|
getMinAndMaxDateRangeForCalendar(minMaxDate, parsingFormat) {
|
|
888
|
-
|
|
889
|
-
|
|
895
|
+
const calendarMinEnabledDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
|
|
896
|
+
const calendarMaxEnabledDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
|
|
890
897
|
return [calendarMinEnabledDate, calendarMaxEnabledDate];
|
|
891
898
|
}
|
|
892
899
|
getSelectedDateForCalendar(minMaxDate, parsingFormat, minDate, maxDate) {
|
|
893
900
|
let selectedMinDate;
|
|
894
901
|
let selectedMaxDate;
|
|
895
902
|
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
896
|
-
|
|
903
|
+
const selectedDateObj = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
897
904
|
if (selectedDateObj.fromDate.isAfter(minMaxDate[0])) {
|
|
898
905
|
selectedMinDate = this.dateTimeFormatService.convertToNgbDate(selectedDateObj.fromDate, parsingFormat);
|
|
899
906
|
}
|
|
@@ -931,37 +938,38 @@ export class AnnaFilterService {
|
|
|
931
938
|
return previousSelectedDate;
|
|
932
939
|
}
|
|
933
940
|
setInitialValueMapForDateFilter(optionData) {
|
|
934
|
-
|
|
935
|
-
|
|
941
|
+
const minMaxDate = this.createRangeForTheDateFilter(optionData);
|
|
942
|
+
const selectedDate = { fromDate: minMaxDate[0], toDate: minMaxDate[1] };
|
|
936
943
|
this.initialValueMap.set(this.selectedRadio, selectedDate);
|
|
937
944
|
}
|
|
938
945
|
getCurrentSelectedDatesForCalendar(currentSelectedDate, minDate, maxDate) {
|
|
939
|
-
let
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
946
|
+
let currentSelectedDateToBeUpdated = currentSelectedDate;
|
|
947
|
+
const fromDate = {
|
|
948
|
+
year: currentSelectedDateToBeUpdated.fromDate.year,
|
|
949
|
+
month: currentSelectedDateToBeUpdated.fromDate.month,
|
|
950
|
+
day: currentSelectedDateToBeUpdated.fromDate.day,
|
|
943
951
|
};
|
|
944
|
-
|
|
945
|
-
year:
|
|
946
|
-
month:
|
|
947
|
-
day:
|
|
952
|
+
const toDate = {
|
|
953
|
+
year: currentSelectedDateToBeUpdated.toDate.year,
|
|
954
|
+
month: currentSelectedDateToBeUpdated.toDate.month,
|
|
955
|
+
day: currentSelectedDateToBeUpdated.toDate.day,
|
|
948
956
|
};
|
|
949
957
|
if (isEqual(minDate, fromDate) && isEqual(maxDate, toDate) && this.initialValueMap.has(this.selectedRadio)) {
|
|
950
|
-
|
|
958
|
+
currentSelectedDateToBeUpdated = this.initialValueMap.get(this.selectedRadio);
|
|
951
959
|
}
|
|
952
960
|
else {
|
|
953
|
-
|
|
954
|
-
|
|
961
|
+
currentSelectedDateToBeUpdated.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(currentSelectedDateToBeUpdated.fromDate));
|
|
962
|
+
currentSelectedDateToBeUpdated.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(currentSelectedDateToBeUpdated.toDate));
|
|
955
963
|
}
|
|
956
|
-
return
|
|
964
|
+
return currentSelectedDateToBeUpdated;
|
|
957
965
|
}
|
|
958
|
-
|
|
966
|
+
// ====================================SLIDER===================================//
|
|
959
967
|
getSliderTranslateFuncVal(header, currencySet) {
|
|
960
968
|
let translateFunc;
|
|
961
969
|
if (currencySet.has(header)) {
|
|
962
970
|
translateFunc = "currency";
|
|
963
971
|
}
|
|
964
|
-
else if (header
|
|
972
|
+
else if (header === "postedAudPercent" || header === "parentRowShares" || header === "parentRowPutPercent") {
|
|
965
973
|
translateFunc = "percent";
|
|
966
974
|
}
|
|
967
975
|
else {
|
|
@@ -970,9 +978,9 @@ export class AnnaFilterService {
|
|
|
970
978
|
return translateFunc;
|
|
971
979
|
}
|
|
972
980
|
getSliderOptions(optionsData, translateFunc, header) {
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
981
|
+
const minValue = this.returnMaxAndMinValue(optionsData, header, true);
|
|
982
|
+
const maxValue = this.returnMaxAndMinValue(optionsData, header, false);
|
|
983
|
+
const obj = this.setOptionValues(minValue, maxValue);
|
|
976
984
|
if (translateFunc === "normal") {
|
|
977
985
|
obj.translate = this.normalTranslateFunction;
|
|
978
986
|
}
|
|
@@ -988,7 +996,7 @@ export class AnnaFilterService {
|
|
|
988
996
|
let sliderMinValue;
|
|
989
997
|
let sliderMaxValue;
|
|
990
998
|
if (this.tooltipSelectedMap.has(header)) {
|
|
991
|
-
|
|
999
|
+
const selectedObj = this.tooltipSelectedMap.get(header);
|
|
992
1000
|
sliderMinValue = selectedObj.min < options.floor ? options.floor : selectedObj.min;
|
|
993
1001
|
sliderMaxValue = selectedObj.max < options.ceil ? selectedObj.max : options.ceil;
|
|
994
1002
|
}
|
|
@@ -1019,23 +1027,23 @@ export class AnnaFilterService {
|
|
|
1019
1027
|
return previousSliderData;
|
|
1020
1028
|
}
|
|
1021
1029
|
setInitialValueMapForSliderFilter(clonedData) {
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1030
|
+
const minValue = this.returnMaxAndMinValue(clonedData, this.selectedRadio, true);
|
|
1031
|
+
const maxValue = this.returnMaxAndMinValue(clonedData, this.selectedRadio, false);
|
|
1032
|
+
const sliderData = { min: minValue, max: maxValue };
|
|
1025
1033
|
this.initialValueMap.set(this.selectedRadio, sliderData);
|
|
1026
1034
|
}
|
|
1027
1035
|
getCurrentSelectedValueForSlider(minEnteredVal, maxEnteredVal, options) {
|
|
1028
1036
|
let currentSliderData = { min: null, max: null };
|
|
1029
1037
|
currentSliderData.max = maxEnteredVal;
|
|
1030
1038
|
currentSliderData.min = minEnteredVal;
|
|
1031
|
-
if (currentSliderData.min
|
|
1032
|
-
currentSliderData.max
|
|
1039
|
+
if (currentSliderData.min === options.floor &&
|
|
1040
|
+
currentSliderData.max === options.ceil &&
|
|
1033
1041
|
this.initialValueMap.has(this.selectedRadio)) {
|
|
1034
1042
|
currentSliderData = this.initialValueMap.get(this.selectedRadio);
|
|
1035
1043
|
}
|
|
1036
1044
|
return currentSliderData;
|
|
1037
1045
|
}
|
|
1038
|
-
|
|
1046
|
+
// =================================================TIME=========================================================//
|
|
1039
1047
|
getSelectedTimeRange(header, clonedData) {
|
|
1040
1048
|
let selectedFromTime;
|
|
1041
1049
|
let selectedToTime;
|
|
@@ -1048,7 +1056,7 @@ export class AnnaFilterService {
|
|
|
1048
1056
|
selectedFromTime = this.initialValueMap.get(header).fromTime;
|
|
1049
1057
|
selectedToTime = this.initialValueMap.get(header).toTime;
|
|
1050
1058
|
}
|
|
1051
|
-
if (selectedFromTime
|
|
1059
|
+
if (selectedFromTime !== undefined || selectedToTime !== undefined) {
|
|
1052
1060
|
selectedFromTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedFromTime, true);
|
|
1053
1061
|
selectedToTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedToTime, true);
|
|
1054
1062
|
}
|
|
@@ -1059,55 +1067,49 @@ export class AnnaFilterService {
|
|
|
1059
1067
|
return [selectedFromTime, selectedToTime];
|
|
1060
1068
|
}
|
|
1061
1069
|
setInitialValueMapForTimeFilter(clonedData, key) {
|
|
1062
|
-
if (key
|
|
1070
|
+
if (key === "startEndTime" || key === "TimeBand") {
|
|
1063
1071
|
this.setInitialValueForStartAndEndTimeRange(clonedData, key);
|
|
1064
1072
|
}
|
|
1065
1073
|
else {
|
|
1066
1074
|
this.setInitialValueForStartOrEndTimeRange(clonedData, key);
|
|
1067
1075
|
}
|
|
1068
1076
|
}
|
|
1069
|
-
//use for filter where we have start and end time range in one filter
|
|
1070
|
-
//startEndTime: ["6 - 7A", "06: 00 : 00" , "07:00:00"]
|
|
1077
|
+
// use for filter where we have start and end time range in one filter
|
|
1078
|
+
// startEndTime: ["6 - 7A", "06: 00 : 00" , "07:00:00"]
|
|
1071
1079
|
setInitialValueForStartAndEndTimeRange(clonedData, key) {
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
startTimeArr.sort((a, b) =>
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
endTimeArr.sort((a, b) => {
|
|
1083
|
-
return this.dateTimeFormatService.sortByTimeDescending(a, b);
|
|
1084
|
-
});
|
|
1085
|
-
let obj = {
|
|
1080
|
+
const includeMulti = clonedData.findIndex((obj) => obj[key][0] === "<multi>") !== -1;
|
|
1081
|
+
const includeZero = clonedData.findIndex((obj) => obj[key][0] === "0") !== -1;
|
|
1082
|
+
const includeTimeRange = clonedData.findIndex((obj) => obj[key][0] !== "0" && obj[key][0] !== "<multi>") !== -1;
|
|
1083
|
+
const filteredStartTime = clonedData.filter((obj) => !["", "-", null, "0", "<multi>"].includes(obj.startTime));
|
|
1084
|
+
const filteredEndTime = clonedData.filter((obj) => !["", "-", null, "0", "<multi>"].includes(obj.endTime));
|
|
1085
|
+
const startTimeArr = map(filteredStartTime, "startTime");
|
|
1086
|
+
const endTimeArr = map(filteredEndTime, "endTime");
|
|
1087
|
+
startTimeArr.sort((a, b) => this.dateTimeFormatService.sortByTimeAscending(a, b));
|
|
1088
|
+
endTimeArr.sort((a, b) => this.dateTimeFormatService.sortByTimeDescending(a, b));
|
|
1089
|
+
const obj = {
|
|
1086
1090
|
fromTime: startTimeArr[0],
|
|
1087
1091
|
toTime: endTimeArr[0],
|
|
1088
|
-
includeMulti
|
|
1089
|
-
includeZero
|
|
1090
|
-
includeTimeRange
|
|
1092
|
+
includeMulti,
|
|
1093
|
+
includeZero,
|
|
1094
|
+
includeTimeRange,
|
|
1091
1095
|
};
|
|
1092
1096
|
this.initialValueMap.set(key, obj);
|
|
1093
1097
|
}
|
|
1094
|
-
//use for the filters where we have different filter for start and end time
|
|
1095
|
-
//startTime: "06:00:00"
|
|
1098
|
+
// use for the filters where we have different filter for start and end time
|
|
1099
|
+
// startTime: "06:00:00"
|
|
1096
1100
|
setInitialValueForStartOrEndTimeRange(clonedData, key) {
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
timeArr.sort((a, b) =>
|
|
1103
|
-
|
|
1104
|
-
});
|
|
1105
|
-
let obj = {
|
|
1101
|
+
const includeMulti = clonedData.findIndex((obj) => obj[key] === "<multi>") !== -1;
|
|
1102
|
+
const includeZero = clonedData.findIndex((obj) => obj[key] === "0") !== -1;
|
|
1103
|
+
const includeTimeRange = clonedData.findIndex((obj) => obj[key] !== "0" && obj[key] !== "<multi>") !== -1;
|
|
1104
|
+
const data = clonedData.filter((obj) => !["", "-", null, "0", "<multi>"].includes(obj[key]));
|
|
1105
|
+
const timeArr = map(data, key);
|
|
1106
|
+
timeArr.sort((a, b) => this.dateTimeFormatService.sortByTimeAscending(a, b));
|
|
1107
|
+
const obj = {
|
|
1106
1108
|
fromTime: timeArr[0],
|
|
1107
1109
|
toTime: timeArr[timeArr.length - 1],
|
|
1108
|
-
includeMulti
|
|
1109
|
-
includeZero
|
|
1110
|
-
includeTimeRange
|
|
1110
|
+
includeMulti,
|
|
1111
|
+
includeZero,
|
|
1112
|
+
includeTimeRange,
|
|
1111
1113
|
};
|
|
1112
1114
|
this.initialValueMap.set(key, obj);
|
|
1113
1115
|
}
|
|
@@ -1126,41 +1128,41 @@ export class AnnaFilterService {
|
|
|
1126
1128
|
selectedTimeObj = this.initialValueMap.get(key);
|
|
1127
1129
|
}
|
|
1128
1130
|
let timeArr;
|
|
1129
|
-
if (key
|
|
1131
|
+
if (key === "startEndTime" || key === "TimeBand") {
|
|
1130
1132
|
timeArr = optionsData.map((item) => item[key][0]);
|
|
1131
1133
|
}
|
|
1132
1134
|
else {
|
|
1133
1135
|
timeArr = optionsData.map((item) => item[key]);
|
|
1134
1136
|
}
|
|
1135
|
-
if (timeArr.findIndex((val) => val
|
|
1137
|
+
if (timeArr.findIndex((val) => val === "0") !== -1) {
|
|
1136
1138
|
showZeroTimeCheckbox = true;
|
|
1137
1139
|
zeroTimeCheckboxChecked = selectedTimeObj.includeZero;
|
|
1138
1140
|
}
|
|
1139
|
-
if (timeArr.findIndex((val) => val
|
|
1141
|
+
if (timeArr.findIndex((val) => val === "<multi>") !== -1) {
|
|
1140
1142
|
showMultiTimeCheckbox = true;
|
|
1141
1143
|
multiTimeCheckboxChecked = selectedTimeObj.includeMulti;
|
|
1142
1144
|
}
|
|
1143
1145
|
if (showZeroTimeCheckbox || showMultiTimeCheckbox) {
|
|
1144
1146
|
showEnterTimeCheckbox = true;
|
|
1145
1147
|
}
|
|
1146
|
-
if (timeArr.findIndex((val) => val
|
|
1148
|
+
if (timeArr.findIndex((val) => val !== "<multi>" && val !== "0") !== -1) {
|
|
1147
1149
|
enterTimeCheckboxChecked = selectedTimeObj?.includeTimeRange;
|
|
1148
1150
|
}
|
|
1149
1151
|
return {
|
|
1150
|
-
showMultiTimeCheckbox
|
|
1151
|
-
showZeroTimeCheckbox
|
|
1152
|
-
showEnterTimeCheckbox
|
|
1153
|
-
multiTimeCheckboxChecked
|
|
1154
|
-
zeroTimeCheckboxChecked
|
|
1155
|
-
enterTimeCheckboxChecked
|
|
1152
|
+
showMultiTimeCheckbox,
|
|
1153
|
+
showZeroTimeCheckbox,
|
|
1154
|
+
showEnterTimeCheckbox,
|
|
1155
|
+
multiTimeCheckboxChecked,
|
|
1156
|
+
zeroTimeCheckboxChecked,
|
|
1157
|
+
enterTimeCheckboxChecked,
|
|
1156
1158
|
};
|
|
1157
1159
|
}
|
|
1158
1160
|
checkIfStartTimeIsAfterEndTime(startTime, endTime) {
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1161
|
+
const timeFormat = "HH:mm:ss";
|
|
1162
|
+
const startTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(`${startTime[0]}:${startTime[1]} ${startTime[2]}`, true);
|
|
1163
|
+
const startTime24HrFormat = `${startTime24HrFormatArr[0]}:${startTime24HrFormatArr[1]}:00`;
|
|
1164
|
+
const endTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(`${endTime[0]}:${endTime[1]} ${endTime[2]}`, true);
|
|
1165
|
+
const endTime24HrFormat = `${endTime24HrFormatArr[0]}:${endTime24HrFormatArr[1]}:00`;
|
|
1164
1166
|
return dayjs(startTime24HrFormat, timeFormat).isAfter(dayjs(endTime24HrFormat, timeFormat));
|
|
1165
1167
|
}
|
|
1166
1168
|
getPreviousSelectedTimeFilter() {
|
|
@@ -1174,37 +1176,36 @@ export class AnnaFilterService {
|
|
|
1174
1176
|
return previousSelectedTimeFilter;
|
|
1175
1177
|
}
|
|
1176
1178
|
getCurrentSelectedTimeFilter(startTime, endTime, includeMulti, includeZero, includeTimeRange) {
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
currentSelectedTimeFilter = {
|
|
1179
|
+
const fromTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(`${startTime[0]}:${startTime[1]} ${startTime[2]}`, true);
|
|
1180
|
+
const fromTime24HrFormat = `${fromTime24HrFormatArr[0]}:${fromTime24HrFormatArr[1]}:00`;
|
|
1181
|
+
const toTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(`${endTime[0]}:${endTime[1]} ${endTime[2]}`, true);
|
|
1182
|
+
const toTime24HrFormat = `${toTime24HrFormatArr[0]}:${toTime24HrFormatArr[1]}:00`;
|
|
1183
|
+
const currentSelectedTimeFilter = {
|
|
1183
1184
|
fromTime: fromTime24HrFormat,
|
|
1184
1185
|
toTime: toTime24HrFormat,
|
|
1185
|
-
includeMulti
|
|
1186
|
-
includeZero
|
|
1187
|
-
includeTimeRange
|
|
1186
|
+
includeMulti,
|
|
1187
|
+
includeZero,
|
|
1188
|
+
includeTimeRange,
|
|
1188
1189
|
};
|
|
1189
1190
|
return currentSelectedTimeFilter;
|
|
1190
1191
|
}
|
|
1191
1192
|
incrementHourInput(arr) {
|
|
1192
|
-
if (arr[0]
|
|
1193
|
+
if (arr[0] === "") {
|
|
1193
1194
|
arr[0] = 1;
|
|
1194
1195
|
}
|
|
1195
|
-
else if (parseInt(arr[0]) < 12) {
|
|
1196
|
-
arr[0] = parseInt(arr[0]) + 1;
|
|
1196
|
+
else if (parseInt(arr[0], 10) < 12) {
|
|
1197
|
+
arr[0] = parseInt(arr[0], 10) + 1;
|
|
1197
1198
|
}
|
|
1198
1199
|
else {
|
|
1199
1200
|
arr[0] = 1;
|
|
1200
1201
|
}
|
|
1201
1202
|
}
|
|
1202
1203
|
decrementHourInput(arr) {
|
|
1203
|
-
if (arr[0]
|
|
1204
|
+
if (arr[0] === "") {
|
|
1204
1205
|
arr[0] = 12;
|
|
1205
1206
|
}
|
|
1206
|
-
else if (parseInt(arr[0]) > 1) {
|
|
1207
|
-
arr[0] = parseInt(arr[0]) - 1;
|
|
1207
|
+
else if (parseInt(arr[0], 10) > 1) {
|
|
1208
|
+
arr[0] = parseInt(arr[0], 10) - 1;
|
|
1208
1209
|
}
|
|
1209
1210
|
else {
|
|
1210
1211
|
arr[0] = 12;
|
|
@@ -1212,32 +1213,32 @@ export class AnnaFilterService {
|
|
|
1212
1213
|
}
|
|
1213
1214
|
incrementMinuteInput(arr) {
|
|
1214
1215
|
// increment to nearest proper interval(15,30,45)
|
|
1215
|
-
|
|
1216
|
-
if (
|
|
1216
|
+
const minute = parseInt(arr[1], 10);
|
|
1217
|
+
if (minute <= 14) {
|
|
1217
1218
|
arr[1] = "15";
|
|
1218
1219
|
}
|
|
1219
|
-
else if (
|
|
1220
|
+
else if (minute >= 15 && minute <= 29) {
|
|
1220
1221
|
arr[1] = "30";
|
|
1221
1222
|
}
|
|
1222
|
-
else if (
|
|
1223
|
+
else if (minute >= 30 && minute <= 44) {
|
|
1223
1224
|
arr[1] = "45";
|
|
1224
1225
|
}
|
|
1225
|
-
else if (
|
|
1226
|
+
else if (minute >= 45) {
|
|
1226
1227
|
arr[1] = "00";
|
|
1227
1228
|
}
|
|
1228
1229
|
}
|
|
1229
1230
|
decrementMinuteInput(arr) {
|
|
1230
|
-
|
|
1231
|
-
if (
|
|
1231
|
+
const minute = parseInt(arr[1], 10);
|
|
1232
|
+
if (minute > 0 && minute <= 15) {
|
|
1232
1233
|
arr[1] = "00";
|
|
1233
1234
|
}
|
|
1234
|
-
else if (
|
|
1235
|
+
else if (minute >= 16 && minute <= 30) {
|
|
1235
1236
|
arr[1] = "15";
|
|
1236
1237
|
}
|
|
1237
|
-
else if (
|
|
1238
|
+
else if (minute >= 31 && minute <= 45) {
|
|
1238
1239
|
arr[1] = "30";
|
|
1239
1240
|
}
|
|
1240
|
-
else if (
|
|
1241
|
+
else if (minute > 45 || minute === 0) {
|
|
1241
1242
|
arr[1] = "45";
|
|
1242
1243
|
}
|
|
1243
1244
|
}
|
|
@@ -1258,16 +1259,20 @@ export class AnnaFilterService {
|
|
|
1258
1259
|
}
|
|
1259
1260
|
}
|
|
1260
1261
|
isHourValueInvalid(hr) {
|
|
1261
|
-
return hr.length
|
|
1262
|
+
return hr.length === 0 || !+hr || parseInt(hr, 10) < 1 || parseInt(hr, 10) > 12 || hr.includes(".");
|
|
1262
1263
|
}
|
|
1263
|
-
isMinuteValueInvalid(
|
|
1264
|
-
return (
|
|
1264
|
+
isMinuteValueInvalid(minute) {
|
|
1265
|
+
return (minute.length !== 2 ||
|
|
1266
|
+
(!+minute && minute !== "00") ||
|
|
1267
|
+
parseInt(minute, 10) < 0 ||
|
|
1268
|
+
parseInt(minute, 10) > 59 ||
|
|
1269
|
+
minute.includes("."));
|
|
1265
1270
|
}
|
|
1266
|
-
|
|
1271
|
+
// ===========================================SORT=========================================================//
|
|
1267
1272
|
updateSortMap(tempSortOrder, tableData, isLurAndCsrComponent) {
|
|
1268
1273
|
this.annaSortService.columnSortState = new Map();
|
|
1269
1274
|
this.annaSortService.columnSortState.set(this.selectedRadio, tempSortOrder);
|
|
1270
|
-
|
|
1275
|
+
const sortedTableData = this.annaSortService.applySorting(this.selectedRadio, tempSortOrder, tableData, isLurAndCsrComponent);
|
|
1271
1276
|
return sortedTableData;
|
|
1272
1277
|
}
|
|
1273
1278
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }, { token: i2.AnnaSortService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
@@ -1279,4 +1284,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1279
1284
|
providedIn: "root",
|
|
1280
1285
|
}]
|
|
1281
1286
|
}], ctorParameters: function () { return [{ type: i1.AnnaDateTimeFormatService }, { type: i2.AnnaSortService }]; } });
|
|
1282
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLE1BQU0sTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQVksWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFbkUsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFLNUQsTUFBTSxPQUFPLGlCQUFpQjthQXNDWixlQUFVLEdBQUcsRUFBRSxBQUFMLENBQU07SUFJOUIsWUFDWSxxQkFBZ0QsRUFDaEQsZUFBZ0M7UUFEaEMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUEyQjtRQUNoRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUEzQzVDLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFjL0Isd0JB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QUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELG9CQUFvQixDQUFDLEdBQVc7UUFDNUIsT0FBTyxDQUNILEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQzVHLENBQUM7SUFDTixDQUFDO0lBRUQsMklBQTJJO0lBQzNJLGFBQWEsQ0FBQyxhQUF1QixFQUFFLFNBQWdCLEVBQUUsb0JBQTZCO1FBQ2xGLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDNUUsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQ25ELElBQUksQ0FBQyxhQUFhLEVBQ2xCLGFBQWEsRUFDYixTQUFTLEVBQ1Qsb0JBQW9CLENBQ3ZCLENBQUM7UUFDRixPQUFPLGVBQWUsQ0FBQztJQUMzQixDQUFDOytHQTM4Q1EsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGZCxNQUFNOzs0RkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSBcIkBhbmd1bGFyLXNsaWRlci9uZ3gtc2xpZGVyXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gVGhpcmQgcGFydHkgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgbWluLCBtYXgsIG1hcCwgc29ydEJ5LCB1bmlxLCBjbG9uZURlZXAsIGlzRXF1YWwgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcclxuaW1wb3J0IEN1c3RvbVBhcnNlRm9ybWF0IGZyb20gXCJkYXlqcy9wbHVnaW4vY3VzdG9tUGFyc2VGb3JtYXRcIjtcclxuaW1wb3J0IG1pbk1heCBmcm9tIFwiZGF5anMvcGx1Z2luL21pbk1heFwiO1xyXG5pbXBvcnQgaXNCZXR3ZWVuIGZyb20gXCJkYXlqcy9wbHVnaW4vaXNCZXR3ZWVuXCI7XHJcbmltcG9ydCB7IFNvcnRUeXBlLCBTb3J0VHlwZUVudW0gfSBmcm9tIFwiLi4vbW9kZWxzL2FubmEtc29ydC5tb2RlbFwiO1xyXG5cclxuLy8gVXNlciBkZWZpbmVkIGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsIE5nYkRhdGVUeXBlIH0gZnJvbSBcIi4vYW5uYS1kYXRlLXRpbWUtZm9ybWF0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQW5uYVNvcnRTZXJ2aWNlIH0gZnJvbSBcIi4vYW5uYS1zb3J0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVG9vbHRpcE1vZGVsIH0gZnJvbSBcIi4uL21vZGVscy9hbm5hLXRvb2x0aXAubW9kZWxcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46IFwicm9vdFwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5uYUZpbHRlclNlcnZpY2Uge1xyXG4gICAgdG9vbHRpcE1hcCA9IG5ldyBNYXAoKTtcclxuICAgIHRvb2x0aXBTZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTtcclxuICAgIGluaXRpYWxWYWx1ZU1hcDogTWFwPHN0cmluZywgYW55PjtcclxuICAgIHRyYW5zbGF0ZUZ1bmM6IHN0cmluZztcclxuICAgIHNlbGVjdGVkUmFkaW86IHN0cmluZztcclxuICAgIHN1YlJhZGlvQnV0dG9uOiBzdHJpbmc7XHJcblxyXG4gICAgY2FsZW5kYXJTZXQ6IFNldDxzdHJpbmc+O1xyXG4gICAgc2xpZGVyU2V0OiBTZXQ8c3RyaW5nPjtcclxuICAgIHRpbWVTZXQ6IFNldDxzdHJpbmc+O1xyXG5cclxuICAgIGluY2x1ZGVNdWx0aVRpbWU6IGJvb2xlYW47XHJcbiAgICBpbmNsdWRlWmVyb1RpbWU6IGJvb2xlYW47XHJcbiAgICBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFuO1xyXG5cclxuICAgIGFwcGxpZWRGaWx0ZXJzQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgICBmbGlnaHREYXRlUmFuZ2U6IHsgbWluU2VsZWN0ZWREYXRlOiBhbnk7IG1heFNlbGVjdGVkRGF0ZTogYW55IH07XHJcbiAgICBzbGlkZXJEYXRhOiB7IG1pbjogYW55OyBtYXg6IGFueSB9O1xyXG4gICAgbmd4U2xpZGVyT2JqOiBPcHRpb25zO1xyXG4gICAgc2xpZGVyQ3VycmVuY3lTZXQgPSBuZXcgU2V0KFtcclxuICAgICAgICBcImJvb2tlZFwiLFxyXG4gICAgICAgIFwiY3BwXCIsXHJcbiAgICAgICAgXCJjcG1cIixcclxuICAgICAgICBcInJjdlByZWVtcHRcIixcclxuICAgICAgICBcIm9zUHJlZW1wdFwiLFxyXG4gICAgICAgIFwicG9zdGVkQWR1XCIsXHJcbiAgICAgICAgXCJzY2hlZHVsZWRBZHVcIixcclxuICAgICAgICBcImF1ZGllbmNlRGVmaWNpdFwiLFxyXG4gICAgICAgIFwiUmF0ZVwiLFxyXG4gICAgICAgIFwidXNlckFEVXNcIixcclxuICAgICAgICBcImJ1eWVyQ2hhbmdlc1wiLFxyXG4gICAgICAgIFwidXNlckNoYW5nZXNcIixcclxuICAgICAgICBcInVzZXJNR1wiLFxyXG4gICAgICAgIFwidWRWYWx1ZVwiLFxyXG4gICAgICAgIFwib2RWYWx1ZVwiLFxyXG4gICAgXSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBidWZmZXJTaXplID0gMjA7XHJcbiAgICBpc0ZpbHRlclNvcnRBY3RpdmU6IGFueSA9IHt9O1xyXG4gICAgcmVzZXRGaWx0ZXJTb3J0QWN0aXZlU3RhdHVzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGRhdGVUaW1lRm9ybWF0U2VydmljZTogQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGFubmFTb3J0U2VydmljZTogQW5uYVNvcnRTZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKG1pbk1heCk7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKGlzQmV0d2Vlbik7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKEN1c3RvbVBhcnNlRm9ybWF0KTtcclxuICAgICAgICBjb25zdCBzbGlkZXJBcnIgPSBbXHJcbiAgICAgICAgICAgIFwicmN2UHJlZW1wdFwiLFxyXG4gICAgICAgICAgICBcIm9zUHJlZW1wdFwiLFxyXG4gICAgICAgICAgICBcInJjdlVuZGVyRGx5XCIsXHJcbiAgICAgICAgICAgIFwicG9zdGVkQXVkUGVyY2VudFwiLFxyXG4gICAgICAgICAgICBcImJvb2tlZFwiLFxyXG4gICAgICAgICAgICBcInNwb3RzXCIsXHJcbiAgICAgICAgICAgIFwiZ3JwXCIsXHJcbiAgICAgICAgICAgIFwiYXZlcmFnZVJhdGVUaGlzWWVhclwiLFxyXG4gICAgICAgICAgICBcImF2ZXJhZ2VSYXRlTGFzdFllYXJcIixcclxuICAgICAgICAgICAgXCJhdmVyYWdlQ1BQXCIsXHJcbiAgICAgICAgICAgIFwiYXZlcmFnZUNQTVwiLFxyXG4gICAgICAgICAgICBcIklNUFNEaWZmXCIsXHJcbiAgICAgICAgICAgIFwiUlRHRGlmZlwiLFxyXG4gICAgICAgICAgICBcImNwcFwiLFxyXG4gICAgICAgICAgICBcImltcHNcIixcclxuICAgICAgICAgICAgXCJjcG1cIixcclxuICAgICAgICAgICAgXCJvc1VuZGVyRGx5XCIsXHJcbiAgICAgICAgICAgIFwidG90YWxXZWVrc1wiLFxyXG4gICAgICAgICAgICBcIldlZWtOdW1iZXJcIixcclxuICAgICAgICAgICAgXCJSYXRlXCIsXHJcbiAgICAgICAgICAgIFwiT3JkZXJlZFJhdGluZ3NPckltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiUG9zdGVkUmF0aW5nc09ySW1wcmVzc2lvbnNcIixcclxuICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICBcInBvc3RlZEF1ZFBlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJwb3N0ZWRBZHVcIixcclxuICAgICAgICAgICAgXCJzY2hlZHVsZWRBZHVcIixcclxuICAgICAgICAgICAgXCJhdWRpZW5jZURlZmljaXRcIixcclxuICAgICAgICAgICAgXCJvZmZlcmVkTUdzXCIsXHJcbiAgICAgICAgICAgIFwib3V0c3RhbmRpbmdQRVwiLFxyXG4gICAgICAgICAgICBcIm9mZmVyZWRBRFVzXCIsXHJcbiAgICAgICAgICAgIFwidWREZWZpY2l0VmFsdWVcIixcclxuICAgICAgICAgICAgXCJib29rZWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcImJvb2tlZFNwb3RzXCIsXHJcbiAgICAgICAgICAgIFwidXNlckNoYW5nZXNcIixcclxuICAgICAgICAgICAgXCJVREdycFwiLFxyXG4gICAgICAgICAgICBcIlVESW1wc1wiLFxyXG4gICAgICAgICAgICBcIk9ER3JwXCIsXHJcbiAgICAgICAgICAgIFwiT0RJbXBzXCIsXHJcbiAgICAgICAgICAgIFwidWRJbXBzUGVyY2VudFwiLFxyXG4gICAgICAgICAgICBcInVkR3JwUGVyY2VudFwiLFxyXG4gICAgICAgICAgICBcIm9kSW1wc1BlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJvZEdycFBlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJ1c2VyQURVc1wiLFxyXG4gICAgICAgICAgICBcImJ1eWVyQ2hhbmdlc1wiLFxyXG4gICAgICAgICAgICBcInVzZXJDaGFuZ2VzXCIsXHJcbiAgICAgICAgICAgIFwidXNlck1HXCIsXHJcbiAgICAgICAgICAgIFwiV2Vla2x5QVVSXCIsXHJcbiAgICAgICAgICAgIFwiV2Vla2x5QVVSYXRpbmdPckltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiTUdzVmFsdWVcIixcclxuICAgICAgICAgICAgXCJBRFVzVmFsdWVcIixcclxuICAgICAgICAgICAgXCJVc2VyQ3JlZGl0ZWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlVzZXJVbnJlc29sdmVkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJCdXllckFkZGVkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJCdXllckRlbGV0ZWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIkJ1eWVyQ2hhbmdlc1ZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiVXNlckNoYW5nZXNWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZEdSUE9ySU1QU1wiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZENQUE9yQ1BNXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJCb29rZWRTcG90c1wiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZFJhdGVcIixcclxuICAgICAgICAgICAgXCJhdmVyYWdlUmF0ZVwiLFxyXG4gICAgICAgICAgICBcInByb2plY3RlZElNUFNcIixcclxuICAgICAgICAgICAgXCJwcm9qZWN0ZWRSVEdcIixcclxuICAgICAgICAgICAgXCJkZXNpcmVkQ1BNXCIsXHJcbiAgICAgICAgICAgIFwiZGVzaXJlZENQUFwiLFxyXG4gICAgICAgICAgICBcImludmVudG9yeUZpbGxQZXJjZW50YWdlU2FtZVdlZWtcIixcclxuICAgICAgICAgICAgXCJpbnZlbnRvcnlGaWxsUGVyY2VudGFnZUZpbmFsXCIsXHJcbiAgICAgICAgICAgIFwiaW52ZW50b3J5RmlsbFBlcmNlbnRhZ2VUaWxsRGF0ZVwiLFxyXG4gICAgICAgICAgICBcImRvbGxhclJhdGVJbXBhY3RcIixcclxuICAgICAgICAgICAgXCJkb2xsYXJJTVBTSW1wYWN0XCIsXHJcbiAgICAgICAgICAgIFwiSU1QU0ltcGFjdFwiLFxyXG4gICAgICAgICAgICBcImRvbGxhclJUR0ltcGFjdFwiLFxyXG4gICAgICAgICAgICBcIlJUR0ltcGFjdFwiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZFJUR1wiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZElNUFNcIixcclxuICAgICAgICAgICAgXCJBVVJUR1wiLFxyXG4gICAgICAgICAgICBcIkFVUlRHXCIsXHJcbiAgICAgICAgICAgIFwiUG9zdGVkUmF0aW5nXCIsXHJcbiAgICAgICAgICAgIFwiUG9zdGVkSW1wcmVzc2lvbnNcIixcclxuICAgICAgICAgICAgXCJOb3JtYWxpemVkT3JkZXJlZFJhdGluZ1wiLFxyXG4gICAgICAgICAgICBcIk5vcm1hbGl6ZWRPcmRlcmVkSW1wcmVzc2lvbnNcIixcclxuICAgICAgICAgICAgXCJOb3JtYWxpemVkUG9zdGVkUmF0aW5nXCIsXHJcbiAgICAgICAgICAgIFwiTm9ybWFsaXplZFBvc3RlZEltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkR1JQXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkSU1QU1JldlRhYlwiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZENQUFwiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZENQTVwiLFxyXG4gICAgICAgICAgICBcIkFVSU1QU1wiLFxyXG4gICAgICAgICAgICBcImJvb2tlZEFtb3VudFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiZXF1aXZhbGl6ZWRCb29rZWRBbW91bnRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIklNUFNcIixcclxuICAgICAgICAgICAgXCJ1ZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwib2RWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlZpb2xhdGVkQm9va2VkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJWaW9sYXRlZEJvb2tlZEVVUlZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiVmlvbGF0aW5nQm9va2VkRVVSVmFsdWVcIixcclxuICAgICAgICAgICAgXCJWaW9sYXRpbmdCb29rZWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlJlYmF0ZVwiLFxyXG4gICAgICAgICAgICBcIk90aGVyQXZhaWxhYmxlU3BvdHNUYWJsZVdlZWtseUFVUlwiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd0FubmFFc3RpbWF0ZXNSdGdcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dQb3N0ZWRSdGdcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVJ0Z1wiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1N0YXRpb25Fc3RpbWF0ZXNSdGdcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dBbm5hRXN0aW1hdGVzSW1wc1wiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1Bvc3RlZEltcHNcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZUltcHNcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dTdGF0aW9uRXN0aW1hdGVzSW1wc1wiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd0FubmFFc3RpbWF0ZXNTaGFyZVwiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1Bvc3RlZFNoYXJlXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VTaGFyZVwiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd0FubmFFc3RpbWF0ZXNQdXRQZXJcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dQb3N0ZWRQdXRQZXJcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVB1dFBlclwiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd0FubmFFc3RpbWF0ZXNQdXRcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dQb3N0ZWRQdXRcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVB1dFwiLFxyXG4gICAgICAgICAgICBcIlByb2plY3RlZEltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiUHJvamVjdGVkUnRnXCIsXHJcbiAgICAgICAgICAgIFwicHJvamVjdGVkQ1BNXCIsXHJcbiAgICAgICAgICAgIFwicHJvamVjdGVkQ1BQXCIsXHJcbiAgICAgICAgICAgIFwiYm9va2VkRXFDcG1WYWx1ZVwiLFxyXG4gICAgICAgICAgICBcImJvb2tlZEVxQ3BwVmFsdWVcIixcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyQXJyID0gW1xyXG4gICAgICAgICAgICBcInBlcmlvZFwiLFxyXG4gICAgICAgICAgICBcIkFpckRhdGVcIixcclxuICAgICAgICAgICAgXCJmbGlnaHRTdGFydERhdGVcIixcclxuICAgICAgICAgICAgXCJmbGlnaHRFbmREYXRlXCIsXHJcbiAgICAgICAgICAgIFwiZGF0ZVwiLFxyXG4gICAgICAgICAgICBcInN0YXJ0RGF0ZVwiLFxyXG4gICAgICAgICAgICBcImVuZERhdGVcIixcclxuICAgICAgICAgICAgXCJyZXZpc2lvblN0YXJ0RGF0ZVwiLFxyXG4gICAgICAgICAgICBcIkdlbmVyYXRlZE9uXCIsXHJcbiAgICAgICAgICAgIFwiV2Vla1wiLFxyXG4gICAgICAgICAgICBcInRpbWVvdXREYXRlXCIsXHJcbiAgICAgICAgICAgIFwiVmlvbGF0aW5nU3BvdERhdGVcIixcclxuICAgICAgICAgICAgXCJWaW9sYXRlZFNwb3REYXRlXCIsXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCB0aW1lQXJyID0gW1xyXG4gICAgICAgICAgICBcIlN0YXJ0VGltZUZvckZpbHRlclwiLFxyXG4gICAgICAgICAgICBcIkVuZFRpbWVGb3JGaWx0ZXJcIixcclxuICAgICAgICAgICAgXCJ0aW1lXCIsXHJcbiAgICAgICAgICAgIFwic3RhcnRUaW1lRm9yRmlsdGVyXCIsXHJcbiAgICAgICAgICAgIFwiZW5kVGltZUZvckZpbHRlclwiLFxyXG4gICAgICAgICAgICBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiLFxyXG4gICAgICAgICAgICBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIixcclxuICAgICAgICAgICAgXCJzdGFydEVuZFRpbWVNdWx0aVwiLFxyXG4gICAgICAgICAgICBcInN0YXJ0RW5kVGltZVwiLFxyXG4gICAgICAgICAgICBcInRpbWVvdXRUaW1lXCIsXHJcbiAgICAgICAgICAgIFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lXCIsXHJcbiAgICAgICAgICAgIFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlRW5kVGltZVwiLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy5zbGlkZXJTZXQgPSBuZXcgU2V0KHNsaWRlckFycik7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclNldCA9IG5ldyBTZXQoY2FsZW5kYXJBcnIpO1xyXG4gICAgICAgIHRoaXMudGltZVNldCA9IG5ldyBTZXQodGltZUFycik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuTWF4QW5kTWluVmFsdWUoZGF0YTogYW55W10sIGtleTogc3RyaW5nLCBpc01pbjogYm9vbGVhbikge1xyXG4gICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGRhdGEubWFwKCh4KSA9PiB4W2tleV0pO1xyXG4gICAgICAgIGxldCB2YWx1ZVRvUmV0dXJuID0gaXNNaW4gPyBtaW4odmFsdWVzKSA6IG1heCh2YWx1ZXMpO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZVRvUmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybk1pbkFuZE1heERhdGUoZGF0YTogYW55W10sIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKChvYmopID0+ICFbXCJcIiwgXCItXCIsIG51bGxdLmluY2x1ZGVzKG9ialtrZXldKSk7XHJcbiAgICAgICAgbGV0IERhdGVBcnIgPSBkYXRhLm1hcCgob2JqKSA9PiBkYXlqcyhvYmpba2V5XSkpO1xyXG4gICAgICAgIGxldCBtaW5EYXRlID0gZGF5anMubWluKERhdGVBcnIpO1xyXG4gICAgICAgIGxldCBtYXhEYXRlID0gZGF5anMubWF4KERhdGVBcnIpO1xyXG5cclxuICAgICAgICByZXR1cm4gW21pbkRhdGUsIG1heERhdGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGlzVG9vbHRpcEFjdGl2ZShoZWFkZXI6IHN0cmluZ1tdLCBzb3J0TWFwOiBNYXA8c3RyaW5nLCBTb3J0VHlwZT4pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgICAgICBsZXQgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclswXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzBdKSAhPSBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuICAgICAgICBsZXQgaXNTb3J0TWFwRm9ySGVhZGVyMUFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclsxXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzFdKSAhPSBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuXHJcbiAgICAgICAgaWYgKGhlYWRlci5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHNvcnRNYXAuc2l6ZSA+IDAgJiYgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSkgfHwgc2V0LmhhcyhoZWFkZXJbMF0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgKHNvcnRNYXAuc2l6ZSA+IDAgJiYgc29ydE1hcC5oYXMoaGVhZGVyWzBdKSAmJiBpc1NvcnRNYXBGb3JIZWFkZXIwQWN0aXZlKSB8fFxyXG4gICAgICAgICAgICAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmhhcyhoZWFkZXJbMV0pICYmIGlzU29ydE1hcEZvckhlYWRlcjFBY3RpdmUpIHx8XHJcbiAgICAgICAgICAgIHNldC5oYXMoaGVhZGVyWzBdKSB8fFxyXG4gICAgICAgICAgICBzZXQuaGFzKGhlYWRlclsxXSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyQ29sdW1uRmlsdGVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVyU2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkgPSBbLi4uYXBwbGllZEZpbHRlclNldF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0T3B0aW9uVmFsdWVzKG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBmbG9vcjogbWluVmFsdWUsXHJcbiAgICAgICAgICAgIGNlaWw6IG1heFZhbHVlLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgdHJhbnNsYXRlOiB0aGlzLm5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcGVyY2VudFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKGRhdGEpID49IDEwMDApIHtcclxuICAgICAgICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IChNYXRoLmFicyhkYXRhKSAvIDEwMDApLnRvRml4ZWQoMSkgKyBcImslXCI7XHJcbiAgICAgICAgICAgIHJldHVybiBpc05lZ1ZhbCA/IFwiLVwiICsgdmFsIDogdmFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICAgICAgICBsZXQgaXNXaG9sZU51bSA9IHBhcnNlSW50KGRhdGEudG9TdHJpbmcoKSkgPT0gZGF0YTtcclxuICAgICAgICAgICAgbGV0IHZhbCA9IGlzV2hvbGVOdW0gPyBNYXRoLmFicyhkYXRhKS50b1N0cmluZygpIDogTWF0aC5hYnMoZGF0YSkudG9GaXhlZCgxKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmVnVmFsID8gXCItXCIgKyB2YWwgKyBcIiVcIiA6IHZhbCArIFwiJVwiO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY3VycmVuY3lUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhkYXRhKSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSBcIiRcIiArIChNYXRoLmFicyhkYXRhKSAvIDEwMDApLnRvRml4ZWQoMSkgKyBcImtcIjtcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmVnVmFsID8gXCItXCIgKyB2YWwgOiB2YWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgICAgIGxldCBpc1dob2xlTnVtID0gcGFyc2VJbnQoZGF0YS50b1N0cmluZygpKSA9PSBkYXRhO1xyXG4gICAgICAgICAgICBsZXQgdmFsID0gaXNXaG9sZU51bSA/IE1hdGguYWJzKGRhdGEpLnRvU3RyaW5nKCkgOiBNYXRoLmFicyhkYXRhKS50b0ZpeGVkKDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNOZWdWYWwgPyBcIi0kXCIgKyB2YWwgOiBcIiRcIiArIHZhbDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIG5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEgPj0gMTAwMCkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSAoZGF0YSAvIDEwMDApLnRvRml4ZWQoMSkgKyBcImtcIjtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgIT0gTWF0aC5mbG9vcihkYXRhKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS50b0ZpeGVkKDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZpbmRVbmlxdWVEYXRlc1dpdGhEYXRhKGRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHVuaXF1ZURhdGVzID0gdW5pcShkYXRhLm1hcCgodSkgPT4gdVtcImRhdGVcIl0pKTtcclxuICAgICAgICBsZXQgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ6IE5nYkRhdGVUeXBlW10gPSBbXTtcclxuICAgICAgICB1bmlxdWVEYXRlcy5mb3JFYWNoKChkYXRlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQucHVzaChcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGVTdGFuZGFyZEZvcm1hdChkYXlqcyhkYXRlLCBcIk1NL0REL1lZXCIpLmZvcm1hdChcIk1NL0REL1lZWVlcIikpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdDtcclxuICAgIH1cclxuXHJcbiAgICByZU9yZGVyQXBwbGllZEZpbHRlcnNBcnJheShpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkOiBib29sZWFuLCBkYXRlPzogYW55KSB7XHJcbiAgICAgICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZEYXRhSXNGaWx0ZXJlZChpc0ZpbHRlcmVkLCBpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkLCBkYXRlKTtcclxuICAgICAgICB0aGlzLnJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQ6IGJvb2xlYW4sIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09IFwidXNlclwiICYmICF0aGlzLnRvb2x0aXBNYXAuaGFzKFwidXNlclwiKSkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID0gY2xvbmVEZWVwKGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIkVuZFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJlbmRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwidGltZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInRpbWVvdXRUaW1lXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlRW5kVGltZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydEVuZFRpbWVNdWx0aVwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlzRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydEVuZFRpbWVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgICAgIGlzRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNsaWRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSAmJiAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5zbGlkZXJEYXRhKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInBvc3RlZEFkdVwiICYmIHRoaXMuc3ViUmFkaW9CdXR0b24gPT0gXCJub3RSZXF1aXJlZFwiKSB7XHJcbiAgICAgICAgICAgICAgICBpc0ZpbHRlcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWlzRmlsdGVyZWQgJiYgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwic3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiZW5kRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInBlcmlvZFwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIkFpckRhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJ0aW1lb3V0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImRhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJyZXZpc2lvblN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIkdlbmVyYXRlZE9uXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiV2Vla1wiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlzRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApICYmICFpc0VxdWFsKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLmZsaWdodERhdGVSYW5nZSk7XHJcbiAgICAgICAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgdG90YWxPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnNDb3VudCA9IHRoaXMudG9vbHRpcE1hcFxyXG4gICAgICAgICAgICAgICAgLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuICYmIHguaXNTZWxlY3RlZCkubGVuZ3RoO1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID0gc2VsZWN0ZWRPcHRpb25zQ291bnQgPiAwICYmIHNlbGVjdGVkT3B0aW9uc0NvdW50ICE9IHRvdGFsT3B0aW9uc0NvdW50ID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVPckNoYW5nZUxhdGVzdEZpbHRlckluZGV4KGlzRmlsdGVyZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgc2V0ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG5cclxuICAgICAgICBpZiAoaXNGaWx0ZXJlZCAmJiAhc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlzRmlsdGVyZWQgJiYgc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgc2V0LmFkZCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5ID0gWy4uLnNldF07XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWRUaGVuU29ydFRoZURhdGEob3JpZ2luYWxEYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGlmICghdGhpcy5hbm5hU29ydFNlcnZpY2U/LmNvbHVtblNvcnRTdGF0ZSkgcmV0dXJuIG9yaWdpbmFsRGF0YTtcclxuICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gXCJBU0NcIikge1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxEYXRhID0gY2xvbmVEZWVwKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnREYXRhRm9yQ29tcG9uZW50T3RoZXJUaGFuTHVyQW5kQ3NyUGFnZSh0cnVlLCBvcmlnaW5hbERhdGEsIGtleSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IFwiREVTQ1wiKSB7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGEgPSBjbG9uZURlZXAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydERhdGFGb3JDb21wb25lbnRPdGhlclRoYW5MdXJBbmRDc3JQYWdlKGZhbHNlLCBvcmlnaW5hbERhdGEsIGtleSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvcmlnaW5hbERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyRGF0YShvcmlnaW5hbERhdGE6IGFueVtdLCBrZXlUb1NraXA6IHN0cmluZywgaXNMdXJDc3JQYWdlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgZmlsdGVyZWREYXRhID0gWy4uLm9yaWdpbmFsRGF0YV07XHJcbiAgICAgICAgaWYgKCFpc0x1ckNzclBhZ2UpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gdGhpcy5jaGVja0lmU29ydGluZ0lzQXBwbGllZFRoZW5Tb3J0VGhlRGF0YShvcmlnaW5hbERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgIT0ga2V5VG9Ta2lwICYmIG9yaWdpbmFsRGF0YS5sZW5ndGggPiAwICYmIE9iamVjdC5rZXlzKG9yaWdpbmFsRGF0YVswXSkuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcInN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcImVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJBaXJEYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwidGltZW91dERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJmbGlnaHRFbmREYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gXCJkYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gXCJEYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gXCJyZXZpc2lvblN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09IFwiR2VuZXJhdGVkT25cIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJXZWVrXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiVmlvbGF0ZWRTcG90RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcIlZpb2xhdGluZ1Nwb3REYXRlXCJcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5pc09iamVjdEluVGhlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJwZXJpb2RcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5nZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJFbmRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gXCJ0aW1lb3V0VGltZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcInN0YXJ0VGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcImVuZFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVTdGFydFRpbWVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PSBcIk90aGVyQXZhaWxhYmxlU3BvdHNUYWJsZUVuZFRpbWVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJzdGFydF90aW1lX2Zvcl9maWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gXCJ0aW1lXCJcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3RhcnRFbmRUaW1lTXVsdGlcIiB8fCBrZXkgPT0gXCJzdGFydEVuZFRpbWVcIiB8fCBrZXkgPT09IFwiVGltZUJhbmRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXR1cm5EYXRhRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigodSkgPT4gdmFsdWUuaW5jbHVkZXModVtrZXldKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybk9yZGVyc0luVGhlUmFuZ2Uob3JkZXI6IGFueSwgcmFuZ2U6IGFueSwga2V5OiBhbnkpIHtcclxuICAgICAgICBsZXQgaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgPSBkYXlqcyhvcmRlcltrZXldKS5pc0JldHdlZW4ocmFuZ2UubWluU2VsZWN0ZWREYXRlLCByYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIGxldCBpc0RhdGVTYW1lQXNUaGVNaW5TZWxlY3RlZERhdGUgPSBkYXlqcyhvcmRlcltrZXldKS5pc1NhbWUocmFuZ2UubWluU2VsZWN0ZWREYXRlKTtcclxuICAgICAgICBsZXQgaXNEYXRlU2FtZUFzVGhlTWF4U2VsZWN0ZWREYXRlID0gZGF5anMob3JkZXJba2V5XSkuaXNTYW1lKHJhbmdlLm1heFNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIGlzRGF0ZUJldHdlZW5UaGVTZWxlY3RlZFJhbmdlIHx8IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSB8fCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuRGF0YUZvclRpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQgZm9ybWF0ID0gXCJISDptbTpzc1wiO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFN0YXJ0RGF0ZSA9IGRheWpzKHNlbGVjdGVkRGF0YS5zdGFydFRpbWUsIGZvcm1hdCk7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRW5kRGF0ZSA9IGRheWpzKHNlbGVjdGVkRGF0YS5lbmRUaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBkYXlqcyhvYmouc3RhcnRUaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBlbmRUaW1lID0gZGF5anMob2JqLmVuZFRpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgICAgIGxldCBpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lID0gc3RhcnRUaW1lLmlzU2FtZShzZWxlY3RlZFN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgbGV0IGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gc3RhcnRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZFN0YXJ0RGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcclxuICAgICAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRFbmREYXRlKTtcclxuICAgICAgICBsZXQgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gZW5kVGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuRGF0YUZvckZyb21BbmRUb1RpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnksIGtleTogYW55KSB7XHJcbiAgICAgICAgbGV0IGZvcm1hdCA9IFwiTU0vREQvWVlZWSBISDptbTpzc1wiO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEZyb21UaW1lID0gZGF5anMoXCIwMS8wMS8yMDAxIFwiICsgc2VsZWN0ZWREYXRhLmZyb21UaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFRvVGltZSA9IGRheWpzKFwiMDEvMDEvMjAwMSBcIiArIHNlbGVjdGVkRGF0YS50b1RpbWUsIGZvcm1hdCk7XHJcbiAgICAgICAgbGV0IG9ialRpbWUgPSBvYmpba2V5XTtcclxuXHJcbiAgICAgICAgaWYgKFtcIlwiLCBcIi1cIiwgbnVsbF0uaW5jbHVkZXMob2JqVGltZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XSA9PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XSA9PSBcIjBcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkYXlqc1RpbWUgPSBkYXlqcyhcIjAxLzAxLzIwMDEgXCIgKyBvYmpUaW1lLCBmb3JtYXQpO1xyXG5cclxuICAgICAgICBsZXQgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRGcm9tVGltZSA9IGRheWpzVGltZS5pc1NhbWUoc2VsZWN0ZWRGcm9tVGltZSk7XHJcbiAgICAgICAgbGV0IGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkVG9UaW1lID0gZGF5anNUaW1lLmlzU2FtZShzZWxlY3RlZFRvVGltZSk7XHJcbiAgICAgICAgbGV0IGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lID0gZGF5anNUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkRnJvbVRpbWUgfHxcclxuICAgICAgICAgICAgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRUb1RpbWUgfHxcclxuICAgICAgICAgICAgaXNPYmpUaW1lQmV0d2VlblNlbGVjdGVkRnJvbVRpbWVBbmRUb1RpbWVcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnksIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGZvcm1hdCA9IFwiTU0vREQvWVlZWSBISDptbTpzc1wiO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEZyb21UaW1lID0gZGF5anMoXCIwMS8wMS8yMDAxIFwiICsgc2VsZWN0ZWREYXRhLmZyb21UaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFRvVGltZSA9IGRheWpzKFwiMDEvMDEvMjAwMSBcIiArIHNlbGVjdGVkRGF0YS50b1RpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldWzBdID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldWzBdID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV1bMF0gPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XVswXSA9PSBcIjBcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBkYXlqcyhcIjAxLzAxLzIwMDEgXCIgKyBvYmpba2V5XVsxXSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgZW5kVGltZSA9IGRheWpzKFwiMDEvMDEvMjAwMSBcIiArIG9ialtrZXldWzJdLCBmb3JtYXQpO1xyXG5cclxuICAgICAgICBsZXQgaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSA9IHN0YXJ0VGltZS5pc1NhbWUoc2VsZWN0ZWRGcm9tVGltZSk7XHJcbiAgICAgICAgbGV0IGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gc3RhcnRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcbiAgICAgICAgbGV0IGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSA9IGVuZFRpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcclxuICAgICAgICBsZXQgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gZW5kVGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERhdGFJblRoZURhdGVSYW5nZShvYmo6IGFueSwgdmFsdWU6IGFueSwga2V5OiBhbnkpIHtcclxuICAgICAgICBsZXQgcGFyc2luZ0Zvcm1hdDogc3RyaW5nO1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgICAgICAgcGFyc2luZ0Zvcm1hdCA9IFwiWVlZWS1NTS1ERFwiO1xyXG5cclxuICAgICAgICAgICAgbGV0IGRheWpzU3RhcnREYXRlID0gZGF5anMob2JqLnN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgIGxldCBkYXlqc0VuZERhdGUgPSBkYXlqcyhvYmouZW5kRGF0ZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzU3RhcnREYXRlLmlzQmV0d2Vlbih2YWx1ZS5mcm9tRGF0ZSwgdmFsdWUudG9EYXRlKTtcclxuICAgICAgICAgICAgbGV0IGVuZERhdGVJc0JldHdlZW5TZWxEYXRlID0gZGF5anNFbmREYXRlLmlzQmV0d2Vlbih2YWx1ZS5mcm9tRGF0ZSwgdmFsdWUudG9EYXRlKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzdGFydERhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSA9IHZhbHVlLmZyb21EYXRlLmlzU2FtZShkYXlqc1N0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgIGxldCBlbmREYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gdmFsdWUudG9EYXRlLmlzU2FtZShkYXlqc0VuZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIChzdGFydERhdGVJc0JldHdlZW5TZWxEYXRlIHx8IHN0YXJ0RGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlKSAmJlxyXG4gICAgICAgICAgICAgICAgKGVuZERhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGVuZERhdGVJc1NhbWVBc1NlbEVuZERhdGUpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAga2V5ID09PSBcIkFpckRhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImZsaWdodEVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiV2Vla1wiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lb3V0RGF0ZVwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHBhcnNpbmdGb3JtYXQgPSBcIk1NL0REL1lZWVlcIjtcclxuICAgICAgICAgICAgbGV0IGRhdGVJc0JldHdlZW5TZWxEYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzQmV0d2VlbihcclxuICAgICAgICAgICAgICAgIHZhbHVlLm1pblNlbGVjdGVkRGF0ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlLm1heFNlbGVjdGVkRGF0ZSxcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBkYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSBkYXlqcyhvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNTYW1lKHZhbHVlLm1pblNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgICAgIGxldCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5tYXhTZWxlY3RlZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGRhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSB8fCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZVRpbWVGaWx0ZXJEYXRhKGNsb25lZERhdGE6IGFueVtdLCBrZXkgPSBcInN0YXJ0RW5kVGltZVwiKSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZUFyciA9IG1hcChjbG9uZWREYXRhLCBcInN0YXJ0VGltZVwiKTtcclxuICAgICAgICBsZXQgZW5kVGltZUFyciA9IG1hcChjbG9uZWREYXRhLCBcImVuZFRpbWVcIik7XHJcblxyXG4gICAgICAgIHN0YXJ0VGltZUFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZW5kVGltZUFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZURlc2NlbmRpbmcoYSwgYik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBpbml0aWFsU3RhcnRFbmRUaW1lID0ge1xyXG4gICAgICAgICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZUFyclswXSxcclxuICAgICAgICAgICAgZW5kVGltZTogZW5kVGltZUFyclswXSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIGluaXRpYWxTdGFydEVuZFRpbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkNvbHVtbkZpbHRlclN0YXR1cyhkYXRhOiBhbnlbXSwgaGVhZGVyTmFtZTogc3RyaW5nIHwgbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGhlYWRlck5hbWUgPT0gXCJzdGFydEVuZFRpbWVcIikge1xyXG4gICAgICAgICAgICBsZXQgdGltZSA9IGRhdGEubWFwKCh1KSA9PiB1W2hlYWRlck5hbWVdWzBdKTtcclxuICAgICAgICAgICAgbGV0IHVuaXFUaW1lID0gdW5pcSh0aW1lKTtcclxuICAgICAgICAgICAgcmV0dXJuIHVuaXFUaW1lLmxlbmd0aCA9PSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHVuaXEoZGF0YS5tYXAoKHUpID0+IHVbaGVhZGVyTmFtZV0pKS5sZW5ndGggPiAxID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbHRlck9wdGlvbnNEYXRhKGRhdGE6IGFueVtdLCBjbG9uZWREYXRhOiBhbnlbXSwga2V5Pzogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICAgICAga2V5ID0ga2V5ID8ga2V5IDogdGhpcy5zZWxlY3RlZFJhZGlvO1xyXG4gICAgICAgIGlmIChhcHBsaWVkRmlsdGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlckRhdGEoY2xvbmVkRGF0YSwga2V5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVPcmRlckFwcGxpZWRGaWx0ZXJzU3RhdGUoY2xvbmVkRGF0YTogYW55W10sIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBsZXQgaXNGaWx0ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgaXNGaWx0ZXJlZCA9IHRoaXMuY2hlY2tJZkZpbHRlcklzQXBwbGllZChjbG9uZWREYXRhLCB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVPckNoYW5nZUxhdGVzdEZpbHRlckluZGV4KGlzRmlsdGVyZWQpO1xyXG4gICAgICAgIHJldHVybiBpc0ZpbHRlcmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZGaWx0ZXJJc0FwcGxpZWQoY2xvbmVkRGF0YTogYW55W10sIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBsZXQgaW5pdGlhbFZhbHVlT2ZDb2x1bW4gPSBzb3J0QnkoY2xvbmVkRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpO1xyXG4gICAgICAgIGxldCBjdXJyZW50VmFsdWVPZkNvbHVtbiA9IHNvcnRCeSh0aGlzLmFwcGx5RmlsdGVyKGNsb25lZERhdGEsIHZhbHVlKS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpO1xyXG4gICAgICAgIHJldHVybiAhaXNFcXVhbChpbml0aWFsVmFsdWVPZkNvbHVtbiwgY3VycmVudFZhbHVlT2ZDb2x1bW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5RmlsdGVyKGRhdGE6IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IGZpbHRlcmVkRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgbGV0IGtleSA9IHRoaXMuc2VsZWN0ZWRSYWRpbztcclxuICAgICAgICBpZiAodGhpcy5zbGlkZXJTZXQuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICBrZXkgPT09IFwic3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiQWlyRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lb3V0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSBcImRhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gXCJEYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09IFwicmV2aXNpb25TdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gXCJHZW5lcmF0ZWRPblwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJXZWVrXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIlZpb2xhdGVkU3BvdERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiVmlvbGF0aW5nU3BvdERhdGVcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuaXNPYmplY3RJblRoZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInBlcmlvZFwiKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5nZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAga2V5ID09PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJFbmRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAga2V5ID09IFwidGltZW91dFRpbWVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwic3RhcnRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImVuZFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gXCJ0aW1lXCIgfHxcclxuICAgICAgICAgICAga2V5ID09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lXCIgfHxcclxuICAgICAgICAgICAga2V5ID09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlRW5kVGltZVwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0YXJ0RW5kVGltZU11bHRpXCIgfHwga2V5ID09IFwic3RhcnRFbmRUaW1lXCIgfHwga2V5ID09PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigodSkgPT4gdmFsdWUuaW5jbHVkZXModVtrZXldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgaXNPYmplY3RJblRoZVJhbmdlKG9iajogYW55LCB2YWx1ZTogYW55LCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBvYmpWYWwgPSBvYmpba2V5XTtcclxuICAgICAgICBsZXQgZGF5anNEYXRlID0gZGF5anMob2JqVmFsKTtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZyb21EYXRlID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZS50b0RhdGUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgdmFsdWUuZnJvbURhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZSh2YWx1ZS5mcm9tRGF0ZSwgXCJERC9NTS9ZWVlZXCIpLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdmFsdWUudG9EYXRlID0gZGF5anMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUodmFsdWUudG9EYXRlLCBcIkREL01NL1lZWVlcIiksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaXNEYXRlU2FtZUFzU3RhcnRPZlRoZVJhbmdlID0gdmFsdWUuZnJvbURhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICAgICAgbGV0IGlzRGF0ZVNhbWVBc0VuZE9mVGhlUmFuZ2UgPSB2YWx1ZS50b0RhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICAgICAgbGV0IGlzRGF0ZUJldHdlZW5UaGVTdGFydEFuZEVuZE9mUmFuZ2UgPSBkYXlqc0RhdGUuaXNCZXR3ZWVuKHZhbHVlLmZyb21EYXRlLCB2YWx1ZS50b0RhdGUpO1xyXG4gICAgICAgIHJldHVybiBpc0RhdGVTYW1lQXNTdGFydE9mVGhlUmFuZ2UgfHwgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSB8fCBpc0RhdGVCZXR3ZWVuVGhlU3RhcnRBbmRFbmRPZlJhbmdlO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVN0YXRlT2ZUaGVDdXJyZW50RmlsdGVyVGFiKHNvcnRNYXA6IE1hcDxzdHJpbmcsIFNvcnRUeXBlPikge1xyXG4gICAgICAgIGxldCBhY3RpdmVLZXkgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgICAgbGV0IGtleUFycjogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoYWN0aXZlS2V5KSkge1xyXG4gICAgICAgICAgICAgICAga2V5QXJyID0ga2V5LnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlW2tleV0gPSB0aGlzLmlzVG9vbHRpcEFjdGl2ZShrZXlBcnIsIHNvcnRNYXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU3RhdGVPZkFsbFRoZUtleXMoc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5pc0ZpbHRlclNvcnRBY3RpdmUpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQga2V5QXJyID0ga2V5LnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgdGhpcy5pc0ZpbHRlclNvcnRBY3RpdmVba2V5XSA9IHRoaXMuaXNUb29sdGlwQWN0aXZlKGtleUFyciwgc29ydE1hcCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50SG91cih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQodmFsdWUpIDwgMTIpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSkgKyAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudEhvdXIodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gMTI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludCh2YWx1ZSkgPiAxKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpIC0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IDEyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50TWludXRlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICAvLyBpbmNyZW1lbnQgdG8gbmVhcmVzdCBwcm9wZXIgaW50ZXJ2YWwoMTUsMzAsNDUpXHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KHZhbHVlKTtcclxuICAgICAgICBpZiAobWluIDw9IDE0KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gXCIxNVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDE1ICYmIG1pbiA8PSAyOSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IFwiMzBcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAzMCAmJiBtaW4gPD0gNDQpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBcIjQ1XCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gNDUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBcIjAwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBkZWNyZW1lbnRNaW51dGUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGxldCBtaW4gPSBwYXJzZUludCh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKG1pbiA+IDAgJiYgbWluIDw9IDE1KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gXCIwMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDE2ICYmIG1pbiA8PSAzMCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IFwiMTVcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAzMSAmJiBtaW4gPD0gNDUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBcIjMwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPiA0NSB8fCBtaW4gPT0gMCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IFwiNDVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PUNoZWNrYm94IG1ldGhvZD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vL1xyXG5cclxuICAgIGRpc2FibGVBY3RpdmVGaWx0ZXJDbGVhckJ1dHRvbigpIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA9IHRoaXMuZ2V0Q29sdW1uU29ydFN0YXRlRm9yU2VsZWN0ZWRSYWRpbygpO1xyXG4gICAgICAgIGxldCBpc1NvcnRQcmVzZW50ID1cclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zaXplID4gMCAmJlxyXG4gICAgICAgICAgICBjdXJyZW50Q29sdW1uU29ydEZpbHRlciAhPSBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuXHJcbiAgICAgICAgcmV0dXJuICEoc2VsZWN0ZWRGaWx0ZXJTZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykgfHwgaXNTb3J0UHJlc2VudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29sdW1uU29ydFN0YXRlRm9yU2VsZWN0ZWRSYWRpbygpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA9XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykgJiZcclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gY3VycmVudENvbHVtblNvcnRGaWx0ZXIgPyBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA6IFNvcnRUeXBlRW51bS5ERUZBVUxUO1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50Q29sdW1uU29ydEZpbHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVMaXN0Rm9yQ2hlY2tib3hGaWx0ZXIoaGVhZGVyOiBzdHJpbmcsIG9wdGlvbkRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHRvb2x0aXBPcHRpb25zID0gdGhpcy5nZXRUb29sdGlwTW9kZWxGcm9tT3B0aW9uRGF0YShvcHRpb25EYXRhLCBoZWFkZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdFVuc2VsZWN0TGlzdENoZWNrYm94KHRvb2x0aXBPcHRpb25zLCBoZWFkZXIpO1xyXG4gICAgICAgIHRoaXMuZm9ybWF0TnVsbE9wdGlvblRvU3BlY2lmaWVkU3RyaW5nKHRvb2x0aXBPcHRpb25zLCBcIi1cIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0b29sdGlwT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXRUb29sdGlwTW9kZWxGcm9tT3B0aW9uRGF0YShvcHRpb25EYXRhOiBhbnlbXSwgaGVhZGVyOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgdW5pcU9wdGlvbkRhdGEgPSB1bmlxKG9wdGlvbkRhdGEubWFwKChpdGVtKSA9PiBpdGVtW2hlYWRlcl0pKTtcclxuICAgICAgICByZXR1cm4gdW5pcU9wdGlvbkRhdGEubWFwKChpdGVtLCBpbmRleCkgPT4gbmV3IFRvb2x0aXBNb2RlbChpdGVtLCBpbmRleCArIDEpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RVbnNlbGVjdExpc3RDaGVja2JveCh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGhlYWRlcjogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFZhbHVlU2V0ID0gbmV3IFNldCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKSk7XHJcbiAgICAgICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmlzU2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlU2V0LmhhcyhpdGVtLnZhbHVlKSA/IHRydWUgOiBmYWxzZSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmlzU2VsZWN0ZWQgPSB0cnVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvcm1hdE51bGxPcHRpb25Ub1NwZWNpZmllZFN0cmluZyh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGZvcm1hdHRlZFN0cmluZzogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLnZhbHVlID09IG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHtcclxuICAgICAgICAgICAgdG9vbHRpcE9wdGlvbnNbaW5kZXhdLmxhYmVsID0gZm9ybWF0dGVkU3RyaW5nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRDbG9uZWRUb29sdGlwQW5kVG9vbHRpcE9wdGlvbih0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIHNvcnRCeVN0cmluZzogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IFtzZWxlY3RlZEl0ZW1zLCB1bnNlbGVjdGVkSXRlbXNdID0gdGhpcy5nZXRTZWxlY3RlZEFuZFVuc2VsZWN0ZWRJdGVtcyh0b29sdGlwT3B0aW9ucyk7XHJcbiAgICAgICAgbGV0IHNvcnRlZFNlbGVjdGVkSXRlbXMgPSBzb3J0Qnkoc2VsZWN0ZWRJdGVtcywgc29ydEJ5U3RyaW5nKTtcclxuICAgICAgICBsZXQgc29ydGVkVW5zZWxlY3RlZEl0ZW1zID0gc29ydEJ5KHVuc2VsZWN0ZWRJdGVtcywgc29ydEJ5U3RyaW5nKTtcclxuXHJcbiAgICAgICAgbGV0IGNsb25lZFRvb2x0aXBPcHRpb25zID0gWy4uLnNvcnRlZFNlbGVjdGVkSXRlbXMsIC4uLnNvcnRlZFVuc2VsZWN0ZWRJdGVtc107XHJcbiAgICAgICAgbGV0IHVwZGF0ZWRUb29sdGlwT3B0aW9ucyA9IGNsb25lRGVlcChjbG9uZWRUb29sdGlwT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHJldHVybiBbY2xvbmVkVG9vbHRpcE9wdGlvbnMsIHVwZGF0ZWRUb29sdGlwT3B0aW9ucywgc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEl0ZW1zXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRIZWlnaHRPZkNoZWNrYm94VG9vbHRpcEZpbHRlcihkYXRhTGVuZ3RoOiBudW1iZXIsIG1hcmdpbjogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFMZW5ndGggPiA2ID8gMjAwIDogMjYuMDMgKiBkYXRhTGVuZ3RoICsgbWFyZ2luICogZGF0YUxlbmd0aCArIG1hcmdpbjtcclxuICAgIH1cclxuXHJcbiAgICB1bkNoZWNrQWxsQ2hlY2tib3godG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBjbG9uZWRUb29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKG9wdCkgPT4gb3B0LmlkID09IGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9uc1tpbmRleF0uaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdEFsbENoZWNrYm94KHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSwgY2xvbmVkVG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBjbG9uZWRUb29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKG9wdCkgPT4gb3B0LmlkID09IGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9uc1tpbmRleF0uaXNTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VW5zZWxlY3RDaGVja2JveChkYXRhOiBUb29sdGlwTW9kZWwsIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIGRhdGEuaXNTZWxlY3RlZCA9ICFkYXRhLmlzU2VsZWN0ZWQ7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09IGRhdGEuaWQpO1xyXG4gICAgICAgIGNsb25lZFRvb2x0aXBPcHRpb25zW2luZGV4XS5pc1NlbGVjdGVkID0gZGF0YS5pc1NlbGVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNlbGVjdGVkQW5kVW5zZWxlY3RlZEl0ZW1zKHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEl0ZW1zID0gdG9vbHRpcE9wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzU2VsZWN0ZWQpO1xyXG4gICAgICAgIGxldCB1bnNlbGVjdGVkSXRlbXMgPSB0b29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzU2VsZWN0ZWQpO1xyXG5cclxuICAgICAgICByZXR1cm4gW3NlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRJdGVtc107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2hlY2tib3hQcmV2aW91c1NlbGVjdGVkVmFsdWUoY2xvbmVkVGFibGVEYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluaXRpYWxWYWx1ZSA9IHNvcnRCeSh1bmlxKGNsb25lZFRhYmxlRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIGluaXRpYWxWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IHNvcnRCeSh1bmlxKGNsb25lZFRhYmxlRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KHRoaXMuc2VsZWN0ZWRSYWRpbywgcHJldmlvdXNTZWxlY3RlZFZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1NlbGVjdGVkVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2hlY2tib3hDdXJyZW50U2VsZWN0ZWRWYWx1ZShzZWFyY2hlZFN0cmluZzogc3RyaW5nLCB0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBsZXQgY3VycmVudFNlbGVjdGVkVmFsdWUgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRvb2x0aXBPcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gc29ydEJ5KHRvb2x0aXBPcHRpb25zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5pc1NlbGVjdGVkKS5tYXAoKGl0ZW0pID0+IGl0ZW0udmFsdWUpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICFzZWFyY2hlZFN0cmluZyAmJlxyXG4gICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUubGVuZ3RoID09IHRvb2x0aXBPcHRpb25zLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbylcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgYmxhbmtJbmRleCA9IGN1cnJlbnRTZWxlY3RlZFZhbHVlLmZpbmRJbmRleCgoaXRlbTogc3RyaW5nKSA9PiBpdGVtID09IG51bGwpO1xyXG4gICAgICAgIGlmIChibGFua0luZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gc29ydEJ5KGN1cnJlbnRTZWxlY3RlZFZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0ZWRWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lmU29ydGluZ0NoYW5nZWQodGVtcFNvcnRPcmRlcjogU29ydFR5cGUpIHtcclxuICAgICAgICBsZXQgY3VycmVudENvbHVtblNvcnRGaWx0ZXIgPSB0aGlzLmdldENvbHVtblNvcnRTdGF0ZUZvclNlbGVjdGVkUmFkaW8oKTtcclxuXHJcbiAgICAgICAgbGV0IGlzU29ydENoYW5nZWQgPSB0ZW1wU29ydE9yZGVyICE9IG51bGwgJiYgdGVtcFNvcnRPcmRlciAhPSBjdXJyZW50Q29sdW1uU29ydEZpbHRlcjtcclxuICAgICAgICByZXR1cm4gaXNTb3J0Q2hhbmdlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJlZE9wdGlvbkFzQm9sZFN0cmluZyhzdHI6IHN0cmluZywgY2xvbmVkVG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgbGV0IHRvb2x0aXBPcHRpb25zID0gY2xvbmVEZWVwKFxyXG4gICAgICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubGFiZWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHN0ci50b0xvd2VyQ2FzZSgpKSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQubGFiZWwgPSB0aGlzLmJvbGRTdHJpbmcoZWxlbWVudC5sYWJlbCwgc3RyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvb2x0aXBPcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGJvbGRTdHJpbmcoc3RyOiBzdHJpbmcsIGZpbmQ6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBpbmRleGVzID0gdGhpcy5nZXRJbmRpY2VzT2YoZmluZCwgc3RyLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGluZGV4ZXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBpdGVtICsgaW5kZXggKiA3OyAvL011bHRpcGx5aW5nIGJ5IDcgYXMgdGhlcmUgYXJlIDdjaGFyOiA8Yj48L2I+XHJcbiAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBmaW5kLmxlbmd0aDtcclxuICAgICAgICAgICAgbGV0IHN0clRvQmVSZXBsYWNlZCA9IHN0ci5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xyXG4gICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShzdHJUb0JlUmVwbGFjZWQsIFwiPGI+XCIgKyBzdHJUb0JlUmVwbGFjZWQgKyBcIjwvYj5cIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbmRpY2VzT2Yoc2VhcmNoU3RyOiBzdHJpbmcsIHN0cjogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIHNlYXJjaFN0ckxlbiA9IHNlYXJjaFN0ci5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHNlYXJjaFN0ckxlbiA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAwLFxyXG4gICAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgICAgaW5kaWNlcyA9IFtdO1xyXG4gICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xyXG4gICAgICAgICAgICBzdHIgPSBzdHIudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgc2VhcmNoU3RyID0gc2VhcmNoU3RyLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlICgoaW5kZXggPSBzdHIuaW5kZXhPZihzZWFyY2hTdHIsIHN0YXJ0SW5kZXgpKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGluZGljZXMucHVzaChpbmRleCk7XHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleCArIHNlYXJjaFN0ckxlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZUFsbEJ0bnNXaGVuVGhlcmVBcmVOb0ZpbHRlcmVkUmVzdWx0cygpOiBbbnVtYmVyLCBib29sZWFuLCBib29sZWFuLCBib29sZWFuXSB7XHJcbiAgICAgICAgLy8gW3NlbGVjdGVkQ2hlY2tib3hPcHRpb25zQ291bnQsIGRpc2FibGVDaGVja2JveEFwcGx5LCBkaXNhYmxlQ2xlYXJBbGwsIGRpc2FibGVTZWxlY3RBbGxdO1xyXG4gICAgICAgIHJldHVybiBbMCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV07XHJcbiAgICB9XHJcblxyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1DYWxlbmRhciBmaWx0ZXI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcbiAgICBjcmVhdGVSYW5nZUZvclRoZURhdGVGaWx0ZXIob3B0aW9uRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgbWluTWF4RGF0ZTtcclxuICAgICAgICAvL1doZW4geW91IHdhbnQgdG8gdXNlIHN0YXJ0RGF0ZSBhbmQgZW5kRGF0ZSBjb21iaW5lZCBhcyBzaW5nbGUgY29sdW1uIHRoZW4gdXNlIFBlcmlvZC5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInBlcmlvZFwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImJ1eWVyRmxpZ2h0RGF0ZXNcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJ0cmFmZmljRmxpZ2h0RGF0ZXNcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gdGhpcy5jcmVhdGVTdGFydEVuZERhdGVSYW5nZShvcHRpb25EYXRhKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKG9wdGlvbkRhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWluTWF4RGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVTdGFydEVuZERhdGVSYW5nZShvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5TdGFydERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUob3B0aW9uRGF0YSwgXCJzdGFydERhdGVcIik7XHJcbiAgICAgICAgbGV0IG1heEVuZERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUob3B0aW9uRGF0YSwgXCJlbmREYXRlXCIpO1xyXG4gICAgICAgIHJldHVybiBbbWluU3RhcnREYXRlWzBdLCBtYXhFbmREYXRlWzFdXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNaW5BbmRNYXhEYXRlUmFuZ2VGb3JDYWxlbmRhcihtaW5NYXhEYXRlOiBhbnlbXSwgcGFyc2luZ0Zvcm1hdDogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGNhbGVuZGFyTWluRW5hYmxlZERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMF0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgIGxldCBjYWxlbmRhck1heEVuYWJsZWREYXRlID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShtaW5NYXhEYXRlWzFdLCBwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICByZXR1cm4gW2NhbGVuZGFyTWluRW5hYmxlZERhdGUsIGNhbGVuZGFyTWF4RW5hYmxlZERhdGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNlbGVjdGVkRGF0ZUZvckNhbGVuZGFyKG1pbk1heERhdGU6IGFueVtdLCBwYXJzaW5nRm9ybWF0OiBzdHJpbmcsIG1pbkRhdGU6IE5nYkRhdGVUeXBlLCBtYXhEYXRlOiBOZ2JEYXRlVHlwZSkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZE1pbkRhdGU7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkTWF4RGF0ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZERhdGVPYmogPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGVPYmouZnJvbURhdGUuaXNBZnRlcihtaW5NYXhEYXRlWzBdKSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRNaW5EYXRlID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShzZWxlY3RlZERhdGVPYmouZnJvbURhdGUsIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRNaW5EYXRlID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShtaW5NYXhEYXRlWzBdLCBwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0ZU9iai50b0RhdGUuaXNBZnRlcihtaW5NYXhEYXRlWzFdKSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRNYXhEYXRlID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShtaW5NYXhEYXRlWzFdLCBwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWF4RGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUoc2VsZWN0ZWREYXRlT2JqLnRvRGF0ZSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWxlY3RlZE1pbkRhdGUgPSBjbG9uZURlZXAobWluRGF0ZSk7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkTWF4RGF0ZSA9IGNsb25lRGVlcChtYXhEYXRlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbc2VsZWN0ZWRNaW5EYXRlLCBzZWxlY3RlZE1heERhdGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2VsZWN0ZWREYXRlc0ZvckNhbGVuZGFyKG9wdGlvbkRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzU2VsZWN0ZWREYXRlOiB7IGZyb21EYXRlOiBhbnk7IHRvRGF0ZTogYW55IH0gPSB7IGZyb21EYXRlOiBudWxsLCB0b0RhdGU6IG51bGwgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWREYXRlID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvckRhdGVGaWx0ZXIob3B0aW9uRGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWREYXRlID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBGb3JEYXRlRmlsdGVyKG9wdGlvbkRhdGEpO1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRGF0ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzU2VsZWN0ZWREYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxWYWx1ZU1hcEZvckRhdGVGaWx0ZXIob3B0aW9uRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgbWluTWF4RGF0ZSA9IHRoaXMuY3JlYXRlUmFuZ2VGb3JUaGVEYXRlRmlsdGVyKG9wdGlvbkRhdGEpO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWREYXRlID0geyBmcm9tRGF0ZTogbWluTWF4RGF0ZVswXSwgdG9EYXRlOiBtaW5NYXhEYXRlWzFdIH07XHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KHRoaXMuc2VsZWN0ZWRSYWRpbywgc2VsZWN0ZWREYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDdXJyZW50U2VsZWN0ZWREYXRlc0ZvckNhbGVuZGFyKGN1cnJlbnRTZWxlY3RlZERhdGU6IGFueSwgbWluRGF0ZTogTmdiRGF0ZVR5cGUsIG1heERhdGU6IE5nYkRhdGVUeXBlKSB7XHJcbiAgICAgICAgbGV0IGZyb21EYXRlID0ge1xyXG4gICAgICAgICAgICB5ZWFyOiBjdXJyZW50U2VsZWN0ZWREYXRlLmZyb21EYXRlLnllYXIsXHJcbiAgICAgICAgICAgIG1vbnRoOiBjdXJyZW50U2VsZWN0ZWREYXRlLmZyb21EYXRlLm1vbnRoLFxyXG4gICAgICAgICAgICBkYXk6IGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUuZGF5LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbGV0IHRvRGF0ZSA9IHtcclxuICAgICAgICAgICAgeWVhcjogY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUueWVhcixcclxuICAgICAgICAgICAgbW9udGg6IGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlLm1vbnRoLFxyXG4gICAgICAgICAgICBkYXk6IGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlLmRheSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoaXNFcXVhbChtaW5EYXRlLCBmcm9tRGF0ZSkgJiYgaXNFcXVhbChtYXhEYXRlLCB0b0RhdGUpICYmIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWREYXRlLmZyb21EYXRlID0gZGF5anMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZSA9IGRheWpzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudChjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY3VycmVudFNlbGVjdGVkRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVNMSURFUj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuXHJcbiAgICBnZXRTbGlkZXJUcmFuc2xhdGVGdW5jVmFsKGhlYWRlcjogc3RyaW5nLCBjdXJyZW5jeVNldDogU2V0PHN0cmluZz4pIHtcclxuICAgICAgICBsZXQgdHJhbnNsYXRlRnVuYztcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbmN5U2V0LmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZUZ1bmMgPSBcImN1cnJlbmN5XCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIgPT0gXCJwb3N0ZWRBdWRQZXJjZW50XCIgfHwgaGVhZGVyID09IFwicGFyZW50Um93U2hhcmVzXCIgfHwgaGVhZGVyID09IFwicGFyZW50Um93UHV0UGVyY2VudFwiKSB7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZUZ1bmMgPSBcInBlcmNlbnRcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVGdW5jID0gXCJub3JtYWxcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVGdW5jO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNsaWRlck9wdGlvbnMob3B0aW9uc0RhdGE6IGFueVtdLCB0cmFuc2xhdGVGdW5jOiBzdHJpbmcsIGhlYWRlcjogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IG1pblZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShvcHRpb25zRGF0YSwgaGVhZGVyLCB0cnVlKTtcclxuICAgICAgICBsZXQgbWF4VmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKG9wdGlvbnNEYXRhLCBoZWFkZXIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgbGV0IG9iaiA9IHRoaXMuc2V0T3B0aW9uVmFsdWVzKG1pblZhbHVlLCBtYXhWYWx1ZSk7XHJcblxyXG4gICAgICAgIGlmICh0cmFuc2xhdGVGdW5jID09PSBcIm5vcm1hbFwiKSB7XHJcbiAgICAgICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLm5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlRnVuYyA9PT0gXCJwZXJjZW50XCIpIHtcclxuICAgICAgICAgICAgb2JqLnRyYW5zbGF0ZSA9IHRoaXMucGVyY2VudFRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlRnVuYyA9PT0gXCJjdXJyZW5jeVwiKSB7XHJcbiAgICAgICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLmN1cnJlbmN5VHJhbnNsYXRlRnVuY3Rpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGVkUmFuZ2VGb3JTbGlkZXIoaGVhZGVyOiBzdHJpbmcsIG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICAgICAgICBsZXQgc2xpZGVyTWluVmFsdWU7XHJcbiAgICAgICAgbGV0IHNsaWRlck1heFZhbHVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGhlYWRlcikpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkT2JqID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGhlYWRlcik7XHJcbiAgICAgICAgICAgIHNsaWRlck1pblZhbHVlID0gc2VsZWN0ZWRPYmoubWluIDwgb3B0aW9ucy5mbG9vciA/IG9wdGlvbnMuZmxvb3IgOiBzZWxlY3RlZE9iai5taW47XHJcbiAgICAgICAgICAgIHNsaWRlck1heFZhbHVlID0gc2VsZWN0ZWRPYmoubWF4IDwgb3B0aW9ucy5jZWlsID8gc2VsZWN0ZWRPYmoubWF4IDogb3B0aW9ucy5jZWlsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNsaWRlck1pblZhbHVlID0gb3B0aW9ucy5mbG9vcjtcclxuICAgICAgICAgICAgc2xpZGVyTWF4VmFsdWUgPSBvcHRpb25zLmNlaWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW3NsaWRlck1pblZhbHVlLCBzbGlkZXJNYXhWYWx1ZV07XHJcbiAgICB9XHJcblxyXG4gICAgaXNWYWx1ZUluUmFuZ2Uob3B0aW9uczogT3B0aW9ucywgdmFsOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gb3B0aW9ucy5mbG9vciA8PSB2YWwgJiYgdmFsIDw9IG9wdGlvbnMuY2VpbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmV2aW91c1NlbGVjdGVkVmFsdWVGb3JTbGlkZXIoY2xvbmVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTbGlkZXJEYXRhOiB7IG1pbjogYW55OyBtYXg6IGFueSB9ID0geyBtaW46IFwiXCIsIG1heDogXCJcIiB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yU2xpZGVyRmlsdGVyKGNsb25lZERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NsaWRlckRhdGEgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhKTtcclxuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTbGlkZXJEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5WYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoY2xvbmVkRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvLCB0cnVlKTtcclxuICAgICAgICBsZXQgbWF4VmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKGNsb25lZERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbywgZmFsc2UpO1xyXG4gICAgICAgIGxldCBzbGlkZXJEYXRhID0geyBtaW46IG1pblZhbHVlLCBtYXg6IG1heFZhbHVlIH07XHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KHRoaXMuc2VsZWN0ZWRSYWRpbywgc2xpZGVyRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkVmFsdWVGb3JTbGlkZXIobWluRW50ZXJlZFZhbDogbnVtYmVyLCBtYXhFbnRlcmVkVmFsOiBudW1iZXIsIG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICAgICAgICBsZXQgY3VycmVudFNsaWRlckRhdGE6IHsgbWluOiBhbnk7IG1heDogYW55IH0gPSB7IG1pbjogbnVsbCwgbWF4OiBudWxsIH07XHJcbiAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWF4ID0gbWF4RW50ZXJlZFZhbDtcclxuICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5taW4gPSBtaW5FbnRlcmVkVmFsO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1pbiA9PSBvcHRpb25zLmZsb29yICYmXHJcbiAgICAgICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1heCA9PSBvcHRpb25zLmNlaWwgJiZcclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2xpZGVyRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09VElNRT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuICAgIGdldFNlbGVjdGVkVGltZVJhbmdlKGhlYWRlcjogc3RyaW5nLCBjbG9uZWREYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEZyb21UaW1lOiBhbnlbXTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRUb1RpbWU6IGFueVtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGhlYWRlcikpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpLmZyb21UaW1lO1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpLnRvVGltZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclRpbWVGaWx0ZXIoY2xvbmVkRGF0YSwgaGVhZGVyKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldChoZWFkZXIpLmZyb21UaW1lO1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldChoZWFkZXIpLnRvVGltZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZEZyb21UaW1lICE9IHVuZGVmaW5lZCB8fCBzZWxlY3RlZFRvVGltZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuZm9ybWF0VG9Ud2VsdmVIcnMoc2VsZWN0ZWRGcm9tVGltZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVG9UaW1lID0gQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5mb3JtYXRUb1R3ZWx2ZUhycyhzZWxlY3RlZFRvVGltZSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IFtcIi1cIiwgXCItXCIsIFwiLVwiXTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSBbXCItXCIsIFwiLVwiLCBcIi1cIl07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW3NlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsVmFsdWVNYXBGb3JUaW1lRmlsdGVyKGNsb25lZERhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChrZXkgPT0gXCJzdGFydEVuZFRpbWVcIiB8fCBrZXkgPT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YSwga2V5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZUZvclN0YXJ0T3JFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YSwga2V5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy91c2UgZm9yIGZpbHRlciB3aGVyZSB3ZSBoYXZlIHN0YXJ0IGFuZCBlbmQgdGltZSByYW5nZSBpbiBvbmUgZmlsdGVyXHJcbiAgICAvL3N0YXJ0RW5kVGltZTogW1wiNiAtIDdBXCIsIFwiMDY6IDAwIDogMDBcIiAsIFwiMDc6MDA6MDBcIl1cclxuICAgIHNldEluaXRpYWxWYWx1ZUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKGNsb25lZERhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBpbmNsdWRlTXVsdGkgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XVswXSA9PSBcIjxtdWx0aT5cIikgIT0gLTE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVaZXJvID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV1bMF0gPT0gXCIwXCIpICE9IC0xO1xyXG4gICAgICAgIGxldCBpbmNsdWRlVGltZVJhbmdlID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV1bMF0gIT0gXCIwXCIgJiYgb2JqW2tleV1bMF0gIT0gXCI8bXVsdGk+XCIpICE9IC0xO1xyXG5cclxuICAgICAgICBsZXQgZmlsdGVyZWRTdGFydFRpbWUgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsLCBcIjBcIiwgXCI8bXVsdGk+XCJdLmluY2x1ZGVzKG9ialtcInN0YXJ0VGltZVwiXSkpO1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZEVuZFRpbWUgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsLCBcIjBcIiwgXCI8bXVsdGk+XCJdLmluY2x1ZGVzKG9ialtcImVuZFRpbWVcIl0pKTtcclxuXHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZUFyciA9IG1hcChmaWx0ZXJlZFN0YXJ0VGltZSwgXCJzdGFydFRpbWVcIik7XHJcbiAgICAgICAgbGV0IGVuZFRpbWVBcnIgPSBtYXAoZmlsdGVyZWRFbmRUaW1lLCBcImVuZFRpbWVcIik7XHJcblxyXG4gICAgICAgIHN0YXJ0VGltZUFyci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBlbmRUaW1lQXJyLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogc3RhcnRUaW1lQXJyWzBdLFxyXG4gICAgICAgICAgICB0b1RpbWU6IGVuZFRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxyXG4gICAgICAgICAgICBpbmNsdWRlWmVybzogaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICAvL3VzZSBmb3IgdGhlIGZpbHRlcnMgd2hlcmUgd2UgaGF2ZSBkaWZmZXJlbnQgZmlsdGVyIGZvciBzdGFydCBhbmQgZW5kIHRpbWVcclxuICAgIC8vc3RhcnRUaW1lOiBcIjA2OjAwOjAwXCJcclxuICAgIHNldEluaXRpYWxWYWx1ZUZvclN0YXJ0T3JFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YTogYW55W10sIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVNdWx0aSA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldID09IFwiPG11bHRpPlwiKSAhPSAtMTtcclxuICAgICAgICBsZXQgaW5jbHVkZVplcm8gPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XSA9PSBcIjBcIikgIT0gLTE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVUaW1lUmFuZ2UgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XSAhPSBcIjBcIiAmJiBvYmpba2V5XSAhPSBcIjxtdWx0aT5cIikgIT0gLTE7XHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gY2xvbmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gIVtcIlwiLCBcIi1cIiwgbnVsbCwgXCIwXCIsIFwiPG11bHRpPlwiXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG5cclxuICAgICAgICBsZXQgdGltZUFyciA9IG1hcChkYXRhLCBrZXkpO1xyXG4gICAgICAgIHRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgZnJvbVRpbWU6IHRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIHRvVGltZTogdGltZUFyclt0aW1lQXJyLmxlbmd0aCAtIDFdLFxyXG4gICAgICAgICAgICBpbmNsdWRlTXVsdGk6IGluY2x1ZGVNdWx0aSxcclxuICAgICAgICAgICAgaW5jbHVkZVplcm86IGluY2x1ZGVaZXJvLFxyXG4gICAgICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBpbmNsdWRlVGltZVJhbmdlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VW5zZWxlY3RUaW1lRmlsdGVyQ2hlY2tib3goa2V5OiBzdHJpbmcsIG9wdGlvbnNEYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBzaG93TXVsdGlUaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2hvd1plcm9UaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2hvd0VudGVyVGltZUNoZWNrYm94ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB6ZXJvVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBlbnRlclRpbWVDaGVja2JveENoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkVGltZU9iajtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVGltZU9iaiA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChrZXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVGltZU9iaiA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldChrZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpbWVBcnI6IHN0cmluZ1tdO1xyXG4gICAgICAgIGlmIChrZXkgPT0gXCJzdGFydEVuZFRpbWVcIiB8fCBrZXkgPT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgICAgIHRpbWVBcnIgPSBvcHRpb25zRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1ba2V5XVswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGltZUFyciA9IG9wdGlvbnNEYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVtrZXldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lQXJyLmZpbmRJbmRleCgodmFsKSA9PiB2YWwgPT0gXCIwXCIpICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHNob3daZXJvVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICAgICAgemVyb1RpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZFRpbWVPYmouaW5jbHVkZVplcm87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZUFyci5maW5kSW5kZXgoKHZhbCkgPT4gdmFsID09IFwiPG11bHRpPlwiKSAhPSAtMSkge1xyXG4gICAgICAgICAgICBzaG93TXVsdGlUaW1lQ2hlY2tib3ggPSB0cnVlO1xyXG4gICAgICAgICAgICBtdWx0aVRpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZFRpbWVPYmouaW5jbHVkZU11bHRpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3daZXJvVGltZUNoZWNrYm94IHx8IHNob3dNdWx0aVRpbWVDaGVja2JveCkge1xyXG4gICAgICAgICAgICBzaG93RW50ZXJUaW1lQ2hlY2tib3ggPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVBcnIuZmluZEluZGV4KCh2YWwpID0+IHZhbCAhPSBcIjxtdWx0aT5cIiAmJiB2YWwgIT0gXCIwXCIpICE9IC0xKSB7XHJcbiAgICAgICAgICAgIGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkVGltZU9iaj8uaW5jbHVkZVRpbWVSYW5nZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNob3dNdWx0aVRpbWVDaGVja2JveDogc2hvd011bHRpVGltZUNoZWNrYm94LFxyXG4gICAgICAgICAgICBzaG93WmVyb1RpbWVDaGVja2JveDogc2hvd1plcm9UaW1lQ2hlY2tib3gsXHJcbiAgICAgICAgICAgIHNob3dFbnRlclRpbWVDaGVja2JveDogc2hvd0VudGVyVGltZUNoZWNrYm94LFxyXG4gICAgICAgICAgICBtdWx0aVRpbWVDaGVja2JveENoZWNrZWQ6IG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCxcclxuICAgICAgICAgICAgemVyb1RpbWVDaGVja2JveENoZWNrZWQ6IHplcm9UaW1lQ2hlY2tib3hDaGVja2VkLFxyXG4gICAgICAgICAgICBlbnRlclRpbWVDaGVja2JveENoZWNrZWQ6IGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTdGFydFRpbWVJc0FmdGVyRW5kVGltZShzdGFydFRpbWU6IHN0cmluZ1tdLCBlbmRUaW1lOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGxldCB0aW1lRm9ybWF0ID0gXCJISDptbTpzc1wiO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnRUaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXHJcbiAgICAgICAgICAgIHN0YXJ0VGltZVswXSArIFwiOlwiICsgc3RhcnRUaW1lWzFdICsgXCIgXCIgKyBzdGFydFRpbWVbMl0sXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lMjRIckZvcm1hdCA9IHN0YXJ0VGltZTI0SHJGb3JtYXRBcnJbMF0gKyBcIjpcIiArIHN0YXJ0VGltZTI0SHJGb3JtYXRBcnJbMV0gKyBcIjowMFwiO1xyXG4gICAgICAgIGxldCBlbmRUaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXHJcbiAgICAgICAgICAgIGVuZFRpbWVbMF0gKyBcIjpcIiArIGVuZFRpbWVbMV0gKyBcIiBcIiArIGVuZFRpbWVbMl0sXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgZW5kVGltZTI0SHJGb3JtYXQgPSBlbmRUaW1lMjRIckZvcm1hdEFyclswXSArIFwiOlwiICsgZW5kVGltZTI0SHJGb3JtYXRBcnJbMV0gKyBcIjowMFwiO1xyXG4gICAgICAgIHJldHVybiBkYXlqcyhzdGFydFRpbWUyNEhyRm9ybWF0LCB0aW1lRm9ybWF0KS5pc0FmdGVyKGRheWpzKGVuZFRpbWUyNEhyRm9ybWF0LCB0aW1lRm9ybWF0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIoKSB7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkVGltZUZpbHRlcihcclxuICAgICAgICBzdGFydFRpbWU6IHN0cmluZ1tdLFxyXG4gICAgICAgIGVuZFRpbWU6IHN0cmluZ1tdLFxyXG4gICAgICAgIGluY2x1ZGVNdWx0aTogYm9vbGVhbixcclxuICAgICAgICBpbmNsdWRlWmVybzogYm9vbGVhbixcclxuICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFuLFxyXG4gICAgKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcblxyXG4gICAgICAgIGxldCBmcm9tVGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBzdGFydFRpbWVbMF0gKyBcIjpcIiArIHN0YXJ0VGltZVsxXSArIFwiIFwiICsgc3RhcnRUaW1lWzJdLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IGZyb21UaW1lMjRIckZvcm1hdCA9IGZyb21UaW1lMjRIckZvcm1hdEFyclswXSArIFwiOlwiICsgZnJvbVRpbWUyNEhyRm9ybWF0QXJyWzFdICsgXCI6MDBcIjtcclxuXHJcbiAgICAgICAgbGV0IHRvVGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBlbmRUaW1lWzBdICsgXCI6XCIgKyBlbmRUaW1lWzFdICsgXCIgXCIgKyBlbmRUaW1lWzJdLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHRvVGltZTI0SHJGb3JtYXQgPSB0b1RpbWUyNEhyRm9ybWF0QXJyWzBdICsgXCI6XCIgKyB0b1RpbWUyNEhyRm9ybWF0QXJyWzFdICsgXCI6MDBcIjtcclxuXHJcbiAgICAgICAgY3VycmVudFNlbGVjdGVkVGltZUZpbHRlciA9IHtcclxuICAgICAgICAgICAgZnJvbVRpbWU6IGZyb21UaW1lMjRIckZvcm1hdCxcclxuICAgICAgICAgICAgdG9UaW1lOiB0b1RpbWUyNEhyRm9ybWF0LFxyXG4gICAgICAgICAgICBpbmNsdWRlTXVsdGk6IGluY2x1ZGVNdWx0aSxcclxuICAgICAgICAgICAgaW5jbHVkZVplcm86IGluY2x1ZGVaZXJvLFxyXG4gICAgICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBpbmNsdWRlVGltZVJhbmdlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudEhvdXJJbnB1dChhcnI6IGFueVtdKSB7XHJcbiAgICAgICAgaWYgKGFyclswXSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludChhcnJbMF0pIDwgMTIpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gcGFyc2VJbnQoYXJyWzBdKSArIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVjcmVtZW50SG91cklucHV0KGFycjogYW55W10pIHtcclxuICAgICAgICBpZiAoYXJyWzBdID09IFwiXCIpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludChhcnJbMF0pID4gMSkge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSBwYXJzZUludChhcnJbMF0pIC0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSAxMjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50TWludXRlSW5wdXQoYXJyOiBhbnlbXSkge1xyXG4gICAgICAgIC8vIGluY3JlbWVudCB0byBuZWFyZXN0IHByb3BlciBpbnRlcnZhbCgxNSwzMCw0NSlcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQoYXJyWzFdKTtcclxuICAgICAgICBpZiAobWluIDw9IDE0KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9IFwiMTVcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAxNSAmJiBtaW4gPD0gMjkpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCIzMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDMwICYmIG1pbiA8PSA0NCkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjQ1XCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gNDUpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCIwMFwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWNyZW1lbnRNaW51dGVJbnB1dChhcnI6IGFueSkge1xyXG4gICAgICAgIGxldCBtaW4gPSBwYXJzZUludChhcnJbMV0pO1xyXG4gICAgICAgIGlmIChtaW4gPiAwICYmIG1pbiA8PSAxNSkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjAwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMTYgJiYgbWluIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9IFwiMTVcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAzMSAmJiBtaW4gPD0gNDUpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCIzMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gNDUgfHwgbWluID09IDApIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCI0NVwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRPckRlY3JlbWVudEhvdXIoaW5jcmVtZW50OiBib29sZWFuLCB0aW1lOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGlmIChpbmNyZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRIb3VySW5wdXQodGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRIb3VySW5wdXQodGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE9yRGVjcmVtZW50TWluKGluY3JlbWVudDogYm9vbGVhbiwgdGltZTogc3RyaW5nW10pIHtcclxuICAgICAgICBpZiAoaW5jcmVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50TWludXRlSW5wdXQodGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRNaW51dGVJbnB1dCh0aW1lKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNIb3VyVmFsdWVJbnZhbGlkKGhyOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaHIubGVuZ3RoID09IDAgfHwgIStociB8fCAxID4gcGFyc2VJbnQoaHIpIHx8IHBhcnNlSW50KGhyKSA+IDEyIHx8IGhyLmluY2x1ZGVzKFwiLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBpc01pbnV0ZVZhbHVlSW52YWxpZChtaW46IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIG1pbi5sZW5ndGggIT0gMiB8fCAoISttaW4gJiYgbWluICE9IFwiMDBcIikgfHwgMCA+IHBhcnNlSW50KG1pbikgfHwgcGFyc2VJbnQobWluKSA+IDU5IHx8IG1pbi5pbmNsdWRlcyhcIi5cIilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVNPUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuICAgIHVwZGF0ZVNvcnRNYXAodGVtcFNvcnRPcmRlcjogU29ydFR5cGUsIHRhYmxlRGF0YTogYW55W10sIGlzTHVyQW5kQ3NyQ29tcG9uZW50OiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCB0ZW1wU29ydE9yZGVyKTtcclxuICAgICAgICBsZXQgc29ydGVkVGFibGVEYXRhID0gdGhpcy5hbm5hU29ydFNlcnZpY2UuYXBwbHlTb3J0aW5nKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8sXHJcbiAgICAgICAgICAgIHRlbXBTb3J0T3JkZXIsXHJcbiAgICAgICAgICAgIHRhYmxlRGF0YSxcclxuICAgICAgICAgICAgaXNMdXJBbmRDc3JDb21wb25lbnQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gc29ydGVkVGFibGVEYXRhO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
1287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEJBQTRCO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8saUJBQWlCLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0QsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxNQUFNLE1BQU0scUJBQXFCLENBQUM7QUFDekMsZ0NBQWdDO0FBQ2hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUUsT0FBTyxFQUFZLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxpQ0FBaUM7QUFDakMsT0FBTyxFQUFFLHlCQUF5QixFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFDekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBS3RELE1BQU0sT0FBTyxpQkFBaUI7YUFzQ1osZUFBVSxHQUFHLEVBQUUsQUFBTCxDQUFNO0lBSTlCLFlBQ1kscUJBQWdELEVBQ2hELGVBQWdDO1FBRGhDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBMkI7UUFDaEQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBM0M1QyxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN2Qix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxD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LENBQUMsR0FBRyxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRTtZQUN6QixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUN2QixDQUFDO0lBQ04sQ0FBQztJQUVELDZHQUE2RztJQUM3RyxhQUFhLENBQUMsYUFBdUIsRUFBRSxTQUFnQixFQUFFLG9CQUE2QjtRQUNsRixJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUNyRCxJQUFJLENBQUMsYUFBYSxFQUNsQixhQUFhLEVBQ2IsU0FBUyxFQUNULG9CQUFvQixDQUN2QixDQUFDO1FBQ0YsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQzsrR0F4OUNRLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmQsTUFBTTs7NEZBRVQsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tIFwiQGFuZ3VsYXItc2xpZGVyL25neC1zbGlkZXJcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUGFyc2VGb3JtYXQgZnJvbSBcImRheWpzL3BsdWdpbi9jdXN0b21QYXJzZUZvcm1hdFwiO1xyXG5pbXBvcnQgaXNCZXR3ZWVuIGZyb20gXCJkYXlqcy9wbHVnaW4vaXNCZXR3ZWVuXCI7XHJcbmltcG9ydCBtaW5NYXggZnJvbSBcImRheWpzL3BsdWdpbi9taW5NYXhcIjtcclxuLy8gVGhpcmQgcGFydHkgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgY2xvbmVEZWVwLCBpc0VxdWFsLCBtYXAsIG1heCwgbWluLCBzb3J0QnksIHVuaXEgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcblxyXG5pbXBvcnQgeyBTb3J0VHlwZSwgU29ydFR5cGVFbnVtIH0gZnJvbSBcIi4uL21vZGVscy9hbm5hLXNvcnQubW9kZWxcIjtcclxuaW1wb3J0IHsgVG9vbHRpcE1vZGVsIH0gZnJvbSBcIi4uL21vZGVscy9hbm5hLXRvb2x0aXAubW9kZWxcIjtcclxuLy8gVXNlciBkZWZpbmVkIGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsIE5nYkRhdGVUeXBlIH0gZnJvbSBcIi4vYW5uYS1kYXRlLXRpbWUtZm9ybWF0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQW5uYVNvcnRTZXJ2aWNlIH0gZnJvbSBcIi4vYW5uYS1zb3J0LnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46IFwicm9vdFwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5uYUZpbHRlclNlcnZpY2Uge1xyXG4gICAgdG9vbHRpcE1hcCA9IG5ldyBNYXAoKTtcclxuICAgIHRvb2x0aXBTZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTtcclxuICAgIGluaXRpYWxWYWx1ZU1hcDogTWFwPHN0cmluZywgYW55PjtcclxuICAgIHRyYW5zbGF0ZUZ1bmM6IHN0cmluZztcclxuICAgIHNlbGVjdGVkUmFkaW86IHN0cmluZztcclxuICAgIHN1YlJhZGlvQnV0dG9uOiBzdHJpbmc7XHJcblxyXG4gICAgY2FsZW5kYXJTZXQ6IFNldDxzdHJpbmc+O1xyXG4gICAgc2xpZGVyU2V0OiBTZXQ8c3RyaW5nPjtcclxuICAgIHRpbWVTZXQ6IFNldDxzdHJpbmc+O1xyXG5cclxuICAgIGluY2x1ZGVNdWx0aVRpbWU6IGJvb2xlYW47XHJcbiAgICBpbmNsdWRlWmVyb1RpbWU6IGJvb2xlYW47XHJcbiAgICBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFuO1xyXG5cclxuICAgIGFwcGxpZWRGaWx0ZXJzQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgICBmbGlnaHREYXRlUmFuZ2U6IHsgbWluU2VsZWN0ZWREYXRlOiBhbnk7IG1heFNlbGVjdGVkRGF0ZTogYW55IH07XHJcbiAgICBzbGlkZXJEYXRhOiB7IG1pbjogYW55OyBtYXg6IGFueSB9O1xyXG4gICAgbmd4U2xpZGVyT2JqOiBPcHRpb25zO1xyXG4gICAgc2xpZGVyQ3VycmVuY3lTZXQgPSBuZXcgU2V0KFtcclxuICAgICAgICBcImJvb2tlZFwiLFxyXG4gICAgICAgIFwiY3BwXCIsXHJcbiAgICAgICAgXCJjcG1cIixcclxuICAgICAgICBcInJjdlByZWVtcHRcIixcclxuICAgICAgICBcIm9zUHJlZW1wdFwiLFxyXG4gICAgICAgIFwicG9zdGVkQWR1XCIsXHJcbiAgICAgICAgXCJzY2hlZHVsZWRBZHVcIixcclxuICAgICAgICBcImF1ZGllbmNlRGVmaWNpdFwiLFxyXG4gICAgICAgIFwiUmF0ZVwiLFxyXG4gICAgICAgIFwidXNlckFEVXNcIixcclxuICAgICAgICBcImJ1eWVyQ2hhbmdlc1wiLFxyXG4gICAgICAgIFwidXNlckNoYW5nZXNcIixcclxuICAgICAgICBcInVzZXJNR1wiLFxyXG4gICAgICAgIFwidWRWYWx1ZVwiLFxyXG4gICAgICAgIFwib2RWYWx1ZVwiLFxyXG4gICAgXSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBidWZmZXJTaXplID0gMjA7XHJcbiAgICBpc0ZpbHRlclNvcnRBY3RpdmU6IGFueSA9IHt9O1xyXG4gICAgcmVzZXRGaWx0ZXJTb3J0QWN0aXZlU3RhdHVzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGRhdGVUaW1lRm9ybWF0U2VydmljZTogQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGFubmFTb3J0U2VydmljZTogQW5uYVNvcnRTZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKG1pbk1heCk7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKGlzQmV0d2Vlbik7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKEN1c3RvbVBhcnNlRm9ybWF0KTtcclxuICAgICAgICBjb25zdCBzbGlkZXJBcnIgPSBbXHJcbiAgICAgICAgICAgIFwicmN2UHJlZW1wdFwiLFxyXG4gICAgICAgICAgICBcIm9zUHJlZW1wdFwiLFxyXG4gICAgICAgICAgICBcInJjdlVuZGVyRGx5XCIsXHJcbiAgICAgICAgICAgIFwicG9zdGVkQXVkUGVyY2VudFwiLFxyXG4gICAgICAgICAgICBcImJvb2tlZFwiLFxyXG4gICAgICAgICAgICBcInNwb3RzXCIsXHJcbiAgICAgICAgICAgIFwiZ3JwXCIsXHJcbiAgICAgICAgICAgIFwiYXZlcmFnZVJhdGVUaGlzWWVhclwiLFxyXG4gICAgICAgICAgICBcImF2ZXJhZ2VSYXRlTGFzdFllYXJcIixcclxuICAgICAgICAgICAgXCJhdmVyYWdlQ1BQXCIsXHJcbiAgICAgICAgICAgIFwiYXZlcmFnZUNQTVwiLFxyXG4gICAgICAgICAgICBcIklNUFNEaWZmXCIsXHJcbiAgICAgICAgICAgIFwiUlRHRGlmZlwiLFxyXG4gICAgICAgICAgICBcImNwcFwiLFxyXG4gICAgICAgICAgICBcImltcHNcIixcclxuICAgICAgICAgICAgXCJjcG1cIixcclxuICAgICAgICAgICAgXCJvc1VuZGVyRGx5XCIsXHJcbiAgICAgICAgICAgIFwidG90YWxXZWVrc1wiLFxyXG4gICAgICAgICAgICBcIldlZWtOdW1iZXJcIixcclxuICAgICAgICAgICAgXCJSYXRlXCIsXHJcbiAgICAgICAgICAgIFwiT3JkZXJlZFJhdGluZ3NPckltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiUG9zdGVkUmF0aW5nc09ySW1wcmVzc2lvbnNcIixcclxuICAgICAgICAgICAgXCJwb3N0ZWRBdWRQZXJjZW50XCIsXHJcbiAgICAgICAgICAgIFwicG9zdGVkQWR1XCIsXHJcbiAgICAgICAgICAgIFwic2NoZWR1bGVkQWR1XCIsXHJcbiAgICAgICAgICAgIFwiYXVkaWVuY2VEZWZpY2l0XCIsXHJcbiAgICAgICAgICAgIFwib2ZmZXJlZE1Hc1wiLFxyXG4gICAgICAgICAgICBcIm91dHN0YW5kaW5nUEVcIixcclxuICAgICAgICAgICAgXCJvZmZlcmVkQURVc1wiLFxyXG4gICAgICAgICAgICBcInVkRGVmaWNpdFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiYm9va2VkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJib29rZWRTcG90c1wiLFxyXG4gICAgICAgICAgICBcInVzZXJDaGFuZ2VzXCIsXHJcbiAgICAgICAgICAgIFwiVURHcnBcIixcclxuICAgICAgICAgICAgXCJVREltcHNcIixcclxuICAgICAgICAgICAgXCJPREdycFwiLFxyXG4gICAgICAgICAgICBcIk9ESW1wc1wiLFxyXG4gICAgICAgICAgICBcInVkSW1wc1BlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJ1ZEdycFBlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJvZEltcHNQZXJjZW50XCIsXHJcbiAgICAgICAgICAgIFwib2RHcnBQZXJjZW50XCIsXHJcbiAgICAgICAgICAgIFwidXNlckFEVXNcIixcclxuICAgICAgICAgICAgXCJidXllckNoYW5nZXNcIixcclxuICAgICAgICAgICAgXCJ1c2VyQ2hhbmdlc1wiLFxyXG4gICAgICAgICAgICBcInVzZXJNR1wiLFxyXG4gICAgICAgICAgICBcIldlZWtseUFVUlwiLFxyXG4gICAgICAgICAgICBcIldlZWtseUFVUmF0aW5nT3JJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcIk1Hc1ZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiQURVc1ZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiVXNlckNyZWRpdGVkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJVc2VyVW5yZXNvbHZlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiQnV5ZXJBZGRlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiQnV5ZXJEZWxldGVkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJCdXllckNoYW5nZXNWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlVzZXJDaGFuZ2VzVmFsdWVcIixcclxuICAgICAgICAgICAgXCJCb29rZWRHUlBPcklNUFNcIixcclxuICAgICAgICAgICAgXCJCb29rZWRDUFBPckNQTVwiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkU3BvdHNcIixcclxuICAgICAgICAgICAgXCJCb29rZWRSYXRlXCIsXHJcbiAgICAgICAgICAgIFwiYXZlcmFnZVJhdGVcIixcclxuICAgICAgICAgICAgXCJwcm9qZWN0ZWRJTVBTXCIsXHJcbiAgICAgICAgICAgIFwicHJvamVjdGVkUlRHXCIsXHJcbiAgICAgICAgICAgIFwiZGVzaXJlZENQTVwiLFxyXG4gICAgICAgICAgICBcImRlc2lyZWRDUFBcIixcclxuICAgICAgICAgICAgXCJpbnZlbnRvcnlGaWxsUGVyY2VudGFnZVNhbWVXZWVrXCIsXHJcbiAgICAgICAgICAgIFwiaW52ZW50b3J5RmlsbFBlcmNlbnRhZ2VGaW5hbFwiLFxyXG4gICAgICAgICAgICBcImludmVudG9yeUZpbGxQZXJjZW50YWdlVGlsbERhdGVcIixcclxuICAgICAgICAgICAgXCJkb2xsYXJSYXRlSW1wYWN0XCIsXHJcbiAgICAgICAgICAgIFwiZG9sbGFySU1QU0ltcGFjdFwiLFxyXG4gICAgICAgICAgICBcIklNUFNJbXBhY3RcIixcclxuICAgICAgICAgICAgXCJkb2xsYXJSVEdJbXBhY3RcIixcclxuICAgICAgICAgICAgXCJSVEdJbXBhY3RcIixcclxuICAgICAgICAgICAgXCJCb29rZWRSVEdcIixcclxuICAgICAgICAgICAgXCJCb29rZWRJTVBTXCIsXHJcbiAgICAgICAgICAgIFwiQVVSVEdcIixcclxuICAgICAgICAgICAgXCJBVVJUR1wiLFxyXG4gICAgICAgICAgICBcIlBvc3RlZFJhdGluZ1wiLFxyXG4gICAgICAgICAgICBcIlBvc3RlZEltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiTm9ybWFsaXplZE9yZGVyZWRSYXRpbmdcIixcclxuICAgICAgICAgICAgXCJOb3JtYWxpemVkT3JkZXJlZEltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiTm9ybWFsaXplZFBvc3RlZFJhdGluZ1wiLFxyXG4gICAgICAgICAgICBcIk5vcm1hbGl6ZWRQb3N0ZWRJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZEdSUFwiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZElNUFNSZXZUYWJcIixcclxuICAgICAgICAgICAgXCJCb29rZWRDUFBcIixcclxuICAgICAgICAgICAgXCJCb29rZWRDUE1cIixcclxuICAgICAgICAgICAgXCJBVUlNUFNcIixcclxuICAgICAgICAgICAgXCJib29rZWRBbW91bnRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcImVxdWl2YWxpemVkQm9va2VkQW1vdW50VmFsdWVcIixcclxuICAgICAgICAgICAgXCJJTVBTXCIsXHJcbiAgICAgICAgICAgIFwidWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIm9kVmFsdWVcIixcclxuICAgICAgICAgICAgXCJWaW9sYXRlZEJvb2tlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiVmlvbGF0ZWRCb29rZWRFVVJWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlZpb2xhdGluZ0Jvb2tlZEVVUlZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiVmlvbGF0aW5nQm9va2VkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJSZWJhdGVcIixcclxuICAgICAgICAgICAgXCJPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVXZWVrbHlBVVJcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUnRnXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93UG9zdGVkUnRnXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VSdGdcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dTdGF0aW9uRXN0aW1hdGVzUnRnXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93QW5uYUVzdGltYXRlc0ltcHNcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dQb3N0ZWRJbXBzXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VJbXBzXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93U3RhdGlvbkVzdGltYXRlc0ltcHNcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dBbm5hRXN0aW1hdGVzU2hhcmVcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dQb3N0ZWRTaGFyZVwiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1JvbGxpbmdBdmVyYWdlU2hhcmVcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUHV0UGVyXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93UG9zdGVkUHV0UGVyXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VQdXRQZXJcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUHV0XCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93UG9zdGVkUHV0XCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VQdXRcIixcclxuICAgICAgICAgICAgXCJQcm9qZWN0ZWRJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcIlByb2plY3RlZFJ0Z1wiLFxyXG4gICAgICAgICAgICBcInByb2plY3RlZENQTVwiLFxyXG4gICAgICAgICAgICBcInByb2plY3RlZENQUFwiLFxyXG4gICAgICAgICAgICBcImJvb2tlZEVxQ3BtVmFsdWVcIixcclxuICAgICAgICAgICAgXCJib29rZWRFcUNwcFZhbHVlXCIsXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCBjYWxlbmRhckFyciA9IFtcclxuICAgICAgICAgICAgXCJwZXJpb2RcIixcclxuICAgICAgICAgICAgXCJBaXJEYXRlXCIsXHJcbiAgICAgICAgICAgIFwiZmxpZ2h0U3RhcnREYXRlXCIsXHJcbiAgICAgICAgICAgIFwiZmxpZ2h0RW5kRGF0ZVwiLFxyXG4gICAgICAgICAgICBcImRhdGVcIixcclxuICAgICAgICAgICAgXCJzdGFydERhdGVcIixcclxuICAgICAgICAgICAgXCJlbmREYXRlXCIsXHJcbiAgICAgICAgICAgIFwicmV2aXNpb25TdGFydERhdGVcIixcclxuICAgICAgICAgICAgXCJHZW5lcmF0ZWRPblwiLFxyXG4gICAgICAgICAgICBcIldlZWtcIixcclxuICAgICAgICAgICAgXCJ0aW1lb3V0RGF0ZVwiLFxyXG4gICAgICAgICAgICBcIlZpb2xhdGluZ1Nwb3REYXRlXCIsXHJcbiAgICAgICAgICAgIFwiVmlvbGF0ZWRTcG90RGF0ZVwiLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgdGltZUFyciA9IFtcclxuICAgICAgICAgICAgXCJTdGFydFRpbWVGb3JGaWx0ZXJcIixcclxuICAgICAgICAgICAgXCJFbmRUaW1lRm9yRmlsdGVyXCIsXHJcbiAgICAgICAgICAgIFwidGltZVwiLFxyXG4gICAgICAgICAgICBcInN0YXJ0VGltZUZvckZpbHRlclwiLFxyXG4gICAgICAgICAgICBcImVuZFRpbWVGb3JGaWx0ZXJcIixcclxuICAgICAgICAgICAgXCJzdGFydF90aW1lX2Zvcl9maWx0ZXJcIixcclxuICAgICAgICAgICAgXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIsXHJcbiAgICAgICAgICAgIFwic3RhcnRFbmRUaW1lTXVsdGlcIixcclxuICAgICAgICAgICAgXCJzdGFydEVuZFRpbWVcIixcclxuICAgICAgICAgICAgXCJ0aW1lb3V0VGltZVwiLFxyXG4gICAgICAgICAgICBcIk90aGVyQXZhaWxhYmxlU3BvdHNUYWJsZVN0YXJ0VGltZVwiLFxyXG4gICAgICAgICAgICBcIk90aGVyQXZhaWxhYmxlU3BvdHNUYWJsZUVuZFRpbWVcIixcclxuICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMuc2xpZGVyU2V0ID0gbmV3IFNldChzbGlkZXJBcnIpO1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXQgPSBuZXcgU2V0KGNhbGVuZGFyQXJyKTtcclxuICAgICAgICB0aGlzLnRpbWVTZXQgPSBuZXcgU2V0KHRpbWVBcnIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybk1heEFuZE1pblZhbHVlKGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZywgaXNNaW46IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGZpbHRlcmVkRGF0YS5tYXAoKHgpID0+IHhba2V5XSk7XHJcbiAgICAgICAgY29uc3QgdmFsdWVUb1JldHVybiA9IGlzTWluID8gbWluKHZhbHVlcykgOiBtYXgodmFsdWVzKTtcclxuICAgICAgICByZXR1cm4gdmFsdWVUb1JldHVybjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5NaW5BbmRNYXhEYXRlKGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGRhdGEuZmlsdGVyKChvYmopID0+ICFbXCJcIiwgXCItXCIsIG51bGxdLmluY2x1ZGVzKG9ialtrZXldKSk7XHJcbiAgICAgICAgY29uc3QgRGF0ZUFyciA9IGZpbHRlcmVkRGF0YS5tYXAoKG9iaikgPT4gZGF5anMob2JqW2tleV0pKTtcclxuICAgICAgICBjb25zdCBtaW5EYXRlID0gZGF5anMubWluKERhdGVBcnIpO1xyXG4gICAgICAgIGNvbnN0IG1heERhdGUgPSBkYXlqcy5tYXgoRGF0ZUFycik7XHJcblxyXG4gICAgICAgIHJldHVybiBbbWluRGF0ZSwgbWF4RGF0ZV07XHJcbiAgICB9XHJcblxyXG4gICAgaXNUb29sdGlwQWN0aXZlKGhlYWRlcjogc3RyaW5nW10sIHNvcnRNYXA6IE1hcDxzdHJpbmcsIFNvcnRUeXBlPik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICAgICAgY29uc3QgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclswXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzBdKSAhPT0gU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcbiAgICAgICAgY29uc3QgaXNTb3J0TWFwRm9ySGVhZGVyMUFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclsxXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzFdKSAhPT0gU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcblxyXG4gICAgICAgIGlmIChoZWFkZXIubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoc29ydE1hcC5zaXplID4gMCAmJiBpc1NvcnRNYXBGb3JIZWFkZXIwQWN0aXZlKSB8fCBzZXQuaGFzKGhlYWRlclswXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmhhcyhoZWFkZXJbMF0pICYmIGlzU29ydE1hcEZvckhlYWRlcjBBY3RpdmUpIHx8XHJcbiAgICAgICAgICAgIChzb3J0TWFwLnNpemUgPiAwICYmIHNvcnRNYXAuaGFzKGhlYWRlclsxXSkgJiYgaXNTb3J0TWFwRm9ySGVhZGVyMUFjdGl2ZSkgfHxcclxuICAgICAgICAgICAgc2V0LmhhcyhoZWFkZXJbMF0pIHx8XHJcbiAgICAgICAgICAgIHNldC5oYXMoaGVhZGVyWzFdKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJDb2x1bW5GaWx0ZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICBjb25zdCBhcHBsaWVkRmlsdGVyU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgICAgICAgICAgYXBwbGllZEZpbHRlclNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5ID0gWy4uLmFwcGxpZWRGaWx0ZXJTZXRdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZmxvb3I6IG1pblZhbHVlLFxyXG4gICAgICAgICAgICBjZWlsOiBtYXhWYWx1ZSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZTogdGhpcy5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhkYXRhKSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGAkeyhNYXRoLmFicyhkYXRhKSAvIDEwMDApLnRvRml4ZWQoMSl9ayVgO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNOZWdWYWwgPyBgLSR7dmFsfWAgOiB2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgY29uc3QgaXNXaG9sZU51bSA9IHBhcnNlSW50KGRhdGEudG9TdHJpbmcoKSwgMTApID09PSBkYXRhO1xyXG4gICAgICAgIGNvbnN0IHZhbCA9IGlzV2hvbGVOdW0gPyBNYXRoLmFicyhkYXRhKS50b1N0cmluZygpIDogTWF0aC5hYnMoZGF0YSkudG9GaXhlZCgxKTtcclxuICAgICAgICByZXR1cm4gaXNOZWdWYWwgPyBgLSR7dmFsfSVgIDogYCR7dmFsfSVgO1xyXG4gICAgfTtcclxuXHJcbiAgICBjdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKGRhdGEpID49IDEwMDApIHtcclxuICAgICAgICAgICAgY29uc3QgaXNOZWdWYWwgPSBkYXRhIDwgMDtcclxuICAgICAgICAgICAgY29uc3QgdmFsID0gYCQkeyhNYXRoLmFicyhkYXRhKSAvIDEwMDApLnRvRml4ZWQoMSl9a2A7XHJcbiAgICAgICAgICAgIHJldHVybiBpc05lZ1ZhbCA/IGAtJHt2YWx9YCA6IHZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXNOZWdWYWwgPSBkYXRhIDwgMDtcclxuICAgICAgICBjb25zdCBpc1dob2xlTnVtID0gcGFyc2VJbnQoZGF0YS50b1N0cmluZygpLCAxMCkgPT09IGRhdGE7XHJcbiAgICAgICAgY29uc3QgdmFsID0gaXNXaG9sZU51bSA/IE1hdGguYWJzKGRhdGEpLnRvU3RyaW5nKCkgOiBNYXRoLmFicyhkYXRhKS50b0ZpeGVkKDEpO1xyXG4gICAgICAgIHJldHVybiBpc05lZ1ZhbCA/IGAtJCR7dmFsfWAgOiBgJCR7dmFsfWA7XHJcbiAgICB9O1xyXG5cclxuICAgIG5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEgPj0gMTAwMCkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSBgJHsoZGF0YSAvIDEwMDApLnRvRml4ZWQoMSl9a2A7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhICE9PSBNYXRoLmZsb29yKGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnRvRml4ZWQoMSkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcclxuICAgIH07XHJcblxyXG4gICAgZmluZFVuaXF1ZURhdGVzV2l0aERhdGEoZGF0YTogYW55W10pIHtcclxuICAgICAgICBjb25zdCB1bmlxdWVEYXRlcyA9IHVuaXEoZGF0YS5tYXAoKHUpID0+IHUuZGF0ZSkpO1xyXG4gICAgICAgIGNvbnN0IHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0OiBOZ2JEYXRlVHlwZVtdID0gW107XHJcbiAgICAgICAgdW5pcXVlRGF0ZXMuZm9yRWFjaCgoZGF0ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0LnB1c2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlU3RhbmRhcmRGb3JtYXQoZGF5anMoZGF0ZSwgXCJNTS9ERC9ZWVwiKS5mb3JtYXQoXCJNTS9ERC9ZWVlZXCIpKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVPcmRlckFwcGxpZWRGaWx0ZXJzQXJyYXkoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZDogYm9vbGVhbiwgZGF0ZT86IGFueSkge1xyXG4gICAgICAgIGxldCBpc0ZpbHRlcmVkID0gdHJ1ZTtcclxuICAgICAgICBpc0ZpbHRlcmVkID0gdGhpcy5jaGVja0lmRGF0YUlzRmlsdGVyZWQoaXNGaWx0ZXJlZCwgaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZCwgZGF0ZSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVPckNoYW5nZUxhdGVzdEZpbHRlckluZGV4KGlzRmlsdGVyZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZEYXRhSXNGaWx0ZXJlZChpc0ZpbHRlcmVkOiBib29sZWFuLCBpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkOiBib29sZWFuLCBkYXRlPzogYW55KSB7XHJcbiAgICAgICAgbGV0IGlzRGF0YUZpbHRlcmVkID0gaXNGaWx0ZXJlZDtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInVzZXJcIiAmJiAhdGhpcy50b29sdGlwTWFwLmhhcyhcInVzZXJcIikpIHtcclxuICAgICAgICAgICAgaXNEYXRhRmlsdGVyZWQgPSBjbG9uZURlZXAoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJFbmRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInN0YXJ0VGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJlbmRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInRpbWVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwidGltZW91dFRpbWVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIk90aGVyQXZhaWxhYmxlU3BvdHNUYWJsZUVuZFRpbWVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwic3RhcnRFbmRUaW1lTXVsdGlcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpc0RhdGFGaWx0ZXJlZCA9XHJcbiAgICAgICAgICAgICAgICAhaXNFcXVhbChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICkgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLmluY2x1ZGVaZXJvVGltZSB8fFxyXG4gICAgICAgICAgICAgICAgIXRoaXMuaW5jbHVkZU11bHRpVGltZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJzdGFydEVuZFRpbWVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiVGltZUJhbmRcIikge1xyXG4gICAgICAgICAgICBpc0RhdGFGaWx0ZXJlZCA9XHJcbiAgICAgICAgICAgICAgICAhaXNFcXVhbChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICkgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLmluY2x1ZGVaZXJvVGltZSB8fFxyXG4gICAgICAgICAgICAgICAgIXRoaXMuaW5jbHVkZU11bHRpVGltZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2xpZGVyU2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIGlzRGF0YUZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSAmJiAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5zbGlkZXJEYXRhKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJwb3N0ZWRBZHVcIiAmJiB0aGlzLnN1YlJhZGlvQnV0dG9uID09PSBcIm5vdFJlcXVpcmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIGlzRGF0YUZpbHRlcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWlzRGF0YUZpbHRlcmVkICYmIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJzdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZW5kRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJwZXJpb2RcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiQWlyRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJ0aW1lb3V0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJkYXRlXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInJldmlzaW9uU3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIkdlbmVyYXRlZE9uXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIldlZWtcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpc0RhdGFGaWx0ZXJlZCA9XHJcbiAgICAgICAgICAgICAgICAhaXNFcXVhbChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICkgJiYgIWlzRXF1YWwodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMuZmxpZ2h0RGF0ZVJhbmdlKTtcclxuICAgICAgICAgICAgaWYgKCFpc0RhdGFGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0b3RhbE9wdGlvbnNDb3VudCA9IHRoaXMudG9vbHRpcE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKS5maWx0ZXIoKHg6IGFueSkgPT4gIXguaXNIaWRkZW4pLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXBcclxuICAgICAgICAgICAgICAgIC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKVxyXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbiAmJiB4LmlzU2VsZWN0ZWQpLmxlbmd0aDtcclxuICAgICAgICAgICAgaXNEYXRhRmlsdGVyZWQgPSBzZWxlY3RlZE9wdGlvbnNDb3VudCA+IDAgJiYgc2VsZWN0ZWRPcHRpb25zQ291bnQgIT09IHRvdGFsT3B0aW9uc0NvdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXNEYXRhRmlsdGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG5cclxuICAgICAgICBpZiAoaXNGaWx0ZXJlZCAmJiAhc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlzRmlsdGVyZWQgJiYgc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgc2V0LmFkZCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5ID0gWy4uLnNldF07XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWRUaGVuU29ydFRoZURhdGEob3JpZ2luYWxEYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBzb3J0ZWREYXRhID0gb3JpZ2luYWxEYXRhO1xyXG4gICAgICAgIGlmICghdGhpcy5hbm5hU29ydFNlcnZpY2U/LmNvbHVtblNvcnRTdGF0ZSkgcmV0dXJuIHNvcnRlZERhdGE7XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBcIkFTQ1wiKSB7XHJcbiAgICAgICAgICAgICAgICBzb3J0ZWREYXRhID0gY2xvbmVEZWVwKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnREYXRhRm9yQ29tcG9uZW50T3RoZXJUaGFuTHVyQW5kQ3NyUGFnZSh0cnVlLCBvcmlnaW5hbERhdGEsIGtleSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBcIkRFU0NcIikge1xyXG4gICAgICAgICAgICAgICAgc29ydGVkRGF0YSA9IGNsb25lRGVlcChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UoZmFsc2UsIG9yaWdpbmFsRGF0YSwga2V5KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNvcnRlZERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyRGF0YShvcmlnaW5hbERhdGE6IGFueVtdLCBrZXlUb1NraXA6IHN0cmluZywgaXNMdXJDc3JQYWdlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgZmlsdGVyZWREYXRhID0gWy4uLm9yaWdpbmFsRGF0YV07XHJcbiAgICAgICAgaWYgKCFpc0x1ckNzclBhZ2UpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gdGhpcy5jaGVja0lmU29ydGluZ0lzQXBwbGllZFRoZW5Tb3J0VGhlRGF0YShvcmlnaW5hbERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgIT09IGtleVRvU2tpcCAmJiBvcmlnaW5hbERhdGEubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhvcmlnaW5hbERhdGFbMF0pLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlclNldC5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gb2JqW2tleV0gPj0gdmFsdWUubWluICYmIG9ialtrZXldIDw9IHZhbHVlLm1heCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJzdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJlbmREYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiU3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiRW5kRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcIkFpckRhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lb3V0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcImZsaWdodEVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJkYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcInJldmlzaW9uU3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiR2VuZXJhdGVkT25cIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJXZWVrXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiVmlvbGF0ZWRTcG90RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcIlZpb2xhdGluZ1Nwb3REYXRlXCJcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5pc09iamVjdEluVGhlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJwZXJpb2RcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5nZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJFbmRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwidGltZW91dFRpbWVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJzdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJlbmRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlRW5kVGltZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lXCJcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3RhcnRFbmRUaW1lTXVsdGlcIiB8fCBrZXkgPT09IFwic3RhcnRFbmRUaW1lXCIgfHwga2V5ID09PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSksXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKHUpID0+IHZhbHVlLmluY2x1ZGVzKHVba2V5XSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5PcmRlcnNJblRoZVJhbmdlKG9yZGVyOiBhbnksIHJhbmdlOiBhbnksIGtleTogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgPSBkYXlqcyhvcmRlcltrZXldKS5pc0JldHdlZW4ocmFuZ2UubWluU2VsZWN0ZWREYXRlLCByYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIGNvbnN0IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSA9IGRheWpzKG9yZGVyW2tleV0pLmlzU2FtZShyYW5nZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIGNvbnN0IGlzRGF0ZVNhbWVBc1RoZU1heFNlbGVjdGVkRGF0ZSA9IGRheWpzKG9yZGVyW2tleV0pLmlzU2FtZShyYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIHJldHVybiBpc0RhdGVCZXR3ZWVuVGhlU2VsZWN0ZWRSYW5nZSB8fCBpc0RhdGVTYW1lQXNUaGVNaW5TZWxlY3RlZERhdGUgfHwgaXNEYXRlU2FtZUFzVGhlTWF4U2VsZWN0ZWREYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkRhdGFGb3JUaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55KSB7XHJcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gXCJISDptbTpzc1wiO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU3RhcnREYXRlID0gZGF5anMoc2VsZWN0ZWREYXRhLnN0YXJ0VGltZSwgZm9ybWF0KTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEVuZERhdGUgPSBkYXlqcyhzZWxlY3RlZERhdGEuZW5kVGltZSwgZm9ybWF0KTtcclxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBkYXlqcyhvYmouc3RhcnRUaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBkYXlqcyhvYmouZW5kVGltZSwgZm9ybWF0KTtcclxuXHJcbiAgICAgICAgY29uc3QgaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSA9IHN0YXJ0VGltZS5pc1NhbWUoc2VsZWN0ZWRTdGFydERhdGUpO1xyXG4gICAgICAgIGNvbnN0IGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gc3RhcnRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZFN0YXJ0RGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcclxuICAgICAgICBjb25zdCBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUgPSBlbmRUaW1lLmlzU2FtZShzZWxlY3RlZEVuZERhdGUpO1xyXG4gICAgICAgIGNvbnN0IGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IGVuZFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkU3RhcnREYXRlLCBzZWxlY3RlZEVuZERhdGUpO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IFwiTU0vREQvWVlZWSBISDptbTpzc1wiO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRnJvbVRpbWUgPSBkYXlqcyhgMDEvMDEvMjAwMSAke3NlbGVjdGVkRGF0YS5mcm9tVGltZX1gLCBmb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9UaW1lID0gZGF5anMoYDAxLzAxLzIwMDEgJHtzZWxlY3RlZERhdGEudG9UaW1lfWAsIGZvcm1hdCk7XHJcbiAgICAgICAgY29uc3Qgb2JqVGltZSA9IG9ialtrZXldO1xyXG5cclxuICAgICAgICBpZiAoW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpUaW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT09IFwiMFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XSA9PT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRheWpzVGltZSA9IGRheWpzKGAwMS8wMS8yMDAxICR7b2JqVGltZX1gLCBmb3JtYXQpO1xyXG5cclxuICAgICAgICBjb25zdCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZEZyb21UaW1lID0gZGF5anNUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgICAgICBjb25zdCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZFRvVGltZSA9IGRheWpzVGltZS5pc1NhbWUoc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgICAgIGNvbnN0IGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lID0gZGF5anNUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkRnJvbVRpbWUgfHxcclxuICAgICAgICAgICAgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRUb1RpbWUgfHxcclxuICAgICAgICAgICAgaXNPYmpUaW1lQmV0d2VlblNlbGVjdGVkRnJvbVRpbWVBbmRUb1RpbWVcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnksIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gXCJNTS9ERC9ZWVlZIEhIOm1tOnNzXCI7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRGcm9tVGltZSA9IGRheWpzKGAwMS8wMS8yMDAxICR7c2VsZWN0ZWREYXRhLmZyb21UaW1lfWAsIGZvcm1hdCk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb1RpbWUgPSBkYXlqcyhgMDEvMDEvMjAwMSAke3NlbGVjdGVkRGF0YS50b1RpbWV9YCwgZm9ybWF0KTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkRGF0YS5pbmNsdWRlTXVsdGkgJiYgb2JqW2tleV1bMF0gPT09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldWzBdID09PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldWzBdID09PSBcIjBcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldWzBdID09PSBcIjBcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGRheWpzKGAwMS8wMS8yMDAxICR7b2JqW2tleV1bMV19YCwgZm9ybWF0KTtcclxuICAgICAgICBjb25zdCBlbmRUaW1lID0gZGF5anMoYDAxLzAxLzIwMDEgJHtvYmpba2V5XVsyXX1gLCBmb3JtYXQpO1xyXG5cclxuICAgICAgICBjb25zdCBpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lID0gc3RhcnRUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgICAgICBjb25zdCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgICAgIGNvbnN0IGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSA9IGVuZFRpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcclxuICAgICAgICBjb25zdCBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBlbmRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcblxyXG4gICAgICAgIC8vIHByZXZpb3VzIGNvbmRpdGlvbiB0byBhcHBseSB0aW1iYW5kIGZpbHR0ZXJcclxuICAgICAgICAvLyByZXR1cm4gKFxyXG4gICAgICAgIC8vICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAgIC8vICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgLy8gICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAvLyAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSlcclxuICAgICAgICAvLyApO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lIHx8XHJcbiAgICAgICAgICAgIGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lIHx8XHJcbiAgICAgICAgICAgIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSB8fFxyXG4gICAgICAgICAgICBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWVcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERhdGFJblRoZURhdGVSYW5nZShvYmo6IGFueSwgdmFsdWU6IGFueSwga2V5OiBhbnkpIHtcclxuICAgICAgICBsZXQgcGFyc2luZ0Zvcm1hdDogc3RyaW5nO1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgICAgICAgcGFyc2luZ0Zvcm1hdCA9IFwiWVlZWS1NTS1ERFwiO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF5anNTdGFydERhdGUgPSBkYXlqcyhvYmouc3RhcnREYXRlKTtcclxuICAgICAgICAgICAgY29uc3QgZGF5anNFbmREYXRlID0gZGF5anMob2JqLmVuZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzU3RhcnREYXRlLmlzQmV0d2Vlbih2YWx1ZS5mcm9tRGF0ZSwgdmFsdWUudG9EYXRlKTtcclxuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZUlzQmV0d2VlblNlbERhdGUgPSBkYXlqc0VuZERhdGUuaXNCZXR3ZWVuKHZhbHVlLmZyb21EYXRlLCB2YWx1ZS50b0RhdGUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSB2YWx1ZS5mcm9tRGF0ZS5pc1NhbWUoZGF5anNTdGFydERhdGUpO1xyXG4gICAgICAgICAgICBjb25zdCBlbmREYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gdmFsdWUudG9EYXRlLmlzU2FtZShkYXlqc0VuZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIChzdGFydERhdGVJc0JldHdlZW5TZWxEYXRlIHx8IHN0YXJ0RGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlKSAmJlxyXG4gICAgICAgICAgICAgICAgKGVuZERhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGVuZERhdGVJc1NhbWVBc1NlbEVuZERhdGUpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAga2V5ID09PSBcIkFpckRhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImZsaWdodEVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiV2Vla1wiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lb3V0RGF0ZVwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHBhcnNpbmdGb3JtYXQgPSBcIk1NL0REL1lZWVlcIjtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUlzQmV0d2VlblNlbERhdGUgPSBkYXlqcyhvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNCZXR3ZWVuKFxyXG4gICAgICAgICAgICAgICAgdmFsdWUubWluU2VsZWN0ZWREYXRlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWUubWF4U2VsZWN0ZWREYXRlLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5tYXhTZWxlY3RlZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGRhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSB8fCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0aWFsaXplVGltZUZpbHRlckRhdGEoY2xvbmVkRGF0YTogYW55W10sIGtleSA9IFwic3RhcnRFbmRUaW1lXCIpIHtcclxuICAgICAgICBjb25zdCBzdGFydFRpbWVBcnIgPSBtYXAoY2xvbmVkRGF0YSwgXCJzdGFydFRpbWVcIik7XHJcbiAgICAgICAgY29uc3QgZW5kVGltZUFyciA9IG1hcChjbG9uZWREYXRhLCBcImVuZFRpbWVcIik7XHJcblxyXG4gICAgICAgIHN0YXJ0VGltZUFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKSk7XHJcblxyXG4gICAgICAgIGVuZFRpbWVBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFN0YXJ0RW5kVGltZSA9IHtcclxuICAgICAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIGVuZFRpbWU6IGVuZFRpbWVBcnJbMF0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBpbml0aWFsU3RhcnRFbmRUaW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5Db2x1bW5GaWx0ZXJTdGF0dXMoZGF0YTogYW55W10sIGhlYWRlck5hbWU6IHN0cmluZyB8IG51bWJlcikge1xyXG4gICAgICAgIGlmIChoZWFkZXJOYW1lID09PSBcInN0YXJ0RW5kVGltZVwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBkYXRhLm1hcCgodSkgPT4gdVtoZWFkZXJOYW1lXVswXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHVuaXFUaW1lID0gdW5pcSh0aW1lKTtcclxuICAgICAgICAgICAgcmV0dXJuIHVuaXFUaW1lLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAhKHVuaXEoZGF0YS5tYXAoKHUpID0+IHVbaGVhZGVyTmFtZV0pKS5sZW5ndGggPiAxKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJPcHRpb25zRGF0YShkYXRhOiBhbnlbXSwgY2xvbmVkRGF0YTogYW55W10sIGtleT86IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGFwcGxpZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICAgICAgY29uc3Qga2V5VG9DaGVjayA9IGtleSB8fCB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgICAgaWYgKGFwcGxpZWRGaWx0ZXJTZXQuaGFzKGtleVRvQ2hlY2spKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlckRhdGEoY2xvbmVkRGF0YSwga2V5VG9DaGVjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHJlT3JkZXJBcHBsaWVkRmlsdGVyc1N0YXRlKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZGaWx0ZXJJc0FwcGxpZWQoY2xvbmVkRGF0YSwgdmFsdWUpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkKTtcclxuICAgICAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lmRmlsdGVySXNBcHBsaWVkKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlT2ZDb2x1bW4gPSBzb3J0QnkoY2xvbmVkRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZU9mQ29sdW1uID0gc29ydEJ5KFxyXG4gICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKGNsb25lZERhdGEsIHZhbHVlKS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gIWlzRXF1YWwoaW5pdGlhbFZhbHVlT2ZDb2x1bW4sIGN1cnJlbnRWYWx1ZU9mQ29sdW1uKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUZpbHRlcihkYXRhOiBhbnlbXSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZERhdGEgPSBkYXRhO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc2VsZWN0ZWRSYWRpbztcclxuICAgICAgICBpZiAodGhpcy5zbGlkZXJTZXQuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICBrZXkgPT09IFwic3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiU3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIkVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiQWlyRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lb3V0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJkYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIkRhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwicmV2aXNpb25TdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiR2VuZXJhdGVkT25cIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiV2Vla1wiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJWaW9sYXRlZFNwb3REYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIlZpb2xhdGluZ1Nwb3REYXRlXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmlzT2JqZWN0SW5UaGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJwZXJpb2RcIikge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiRW5kVGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lb3V0VGltZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJzdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiZW5kVGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJzdGFydF90aW1lX2Zvcl9maWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiZW5kX3RpbWVfZm9yX2ZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIk90aGVyQXZhaWxhYmxlU3BvdHNUYWJsZVN0YXJ0VGltZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVFbmRUaW1lXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3RhcnRFbmRUaW1lTXVsdGlcIiB8fCBrZXkgPT09IFwic3RhcnRFbmRUaW1lXCIgfHwga2V5ID09PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigodSkgPT4gdmFsdWUuaW5jbHVkZXModVtrZXldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgaXNPYmplY3RJblRoZVJhbmdlKG9iajogYW55LCB2YWx1ZTogYW55LCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IG9ialZhbCA9IG9ialtrZXldO1xyXG4gICAgICAgIGNvbnN0IGRheWpzRGF0ZSA9IGRheWpzKG9ialZhbCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mcm9tRGF0ZSA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUudG9EYXRlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIHZhbHVlLmZyb21EYXRlID0gZGF5anMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUodmFsdWUuZnJvbURhdGUsIFwiREQvTU0vWVlZWVwiKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHZhbHVlLnRvRGF0ZSA9IGRheWpzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHZhbHVlLnRvRGF0ZSwgXCJERC9NTS9ZWVlZXCIpLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXNEYXRlU2FtZUFzU3RhcnRPZlRoZVJhbmdlID0gdmFsdWUuZnJvbURhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICAgICAgY29uc3QgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUob2JqVmFsKTtcclxuICAgICAgICBjb25zdCBpc0RhdGVCZXR3ZWVuVGhlU3RhcnRBbmRFbmRPZlJhbmdlID0gZGF5anNEYXRlLmlzQmV0d2Vlbih2YWx1ZS5mcm9tRGF0ZSwgdmFsdWUudG9EYXRlKTtcclxuICAgICAgICByZXR1cm4gaXNEYXRlU2FtZUFzU3RhcnRPZlRoZVJhbmdlIHx8IGlzRGF0ZVNhbWVBc0VuZE9mVGhlUmFuZ2UgfHwgaXNEYXRlQmV0d2VlblRoZVN0YXJ0QW5kRW5kT2ZSYW5nZTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVTdGF0ZU9mVGhlQ3VycmVudEZpbHRlclRhYihzb3J0TWFwOiBNYXA8c3RyaW5nLCBTb3J0VHlwZT4pIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVLZXkgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgICAgbGV0IGtleUFycjogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoYWN0aXZlS2V5KSkge1xyXG4gICAgICAgICAgICAgICAga2V5QXJyID0ga2V5LnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlW2tleV0gPSB0aGlzLmlzVG9vbHRpcEFjdGl2ZShrZXlBcnIsIHNvcnRNYXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU3RhdGVPZkFsbFRoZUtleXMoc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5pc0ZpbHRlclNvcnRBY3RpdmUpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBrZXlBcnIgPSBrZXkuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZVtrZXldID0gdGhpcy5pc1Rvb2x0aXBBY3RpdmUoa2V5QXJyLCBzb3J0TWFwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRIb3VyKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludCh2YWx1ZSwgMTApIDwgMTIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCkgKyAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcblxyXG4gICAgZGVjcmVtZW50SG91cih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxMjtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KHZhbHVlLCAxMCkgPiAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDEyO1xyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE1pbnV0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgLy8gaW5jcmVtZW50IHRvIG5lYXJlc3QgcHJvcGVyIGludGVydmFsKDE1LDMwLDQ1KVxyXG4gICAgICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XHJcbiAgICAgICAgaWYgKG1pbnV0ZSA8PSAxNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCIxNVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID49IDE1ICYmIG1pbnV0ZSA8PSAyOSkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCIzMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID49IDMwICYmIG1pbnV0ZSA8PSA0NCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCI0NVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID49IDQ1KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIjAwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBkZWNyZW1lbnRNaW51dGUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XHJcbiAgICAgICAgaWYgKG1pbnV0ZSA+IDAgJiYgbWludXRlIDw9IDE1KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIjAwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPj0gMTYgJiYgbWludXRlIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIjE1XCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPj0gMzEgJiYgbWludXRlIDw9IDQ1KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIjMwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPiA0NSB8fCBtaW51dGUgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiNDVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1DaGVja2JveCBtZXRob2Q9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuXHJcbiAgICBkaXNhYmxlQWN0aXZlRmlsdGVyQ2xlYXJCdXR0b24oKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gdGhpcy5nZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk7XHJcbiAgICAgICAgY29uc3QgaXNTb3J0UHJlc2VudCA9XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuc2l6ZSA+IDAgJiZcclxuICAgICAgICAgICAgY3VycmVudENvbHVtblNvcnRGaWx0ZXIgIT09IFNvcnRUeXBlRW51bS5ERUZBVUxUO1xyXG5cclxuICAgICAgICByZXR1cm4gIShzZWxlY3RlZEZpbHRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSB8fCBpc1NvcnRQcmVzZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID1cclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSAmJlxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgY3VycmVudENvbHVtblNvcnRGaWx0ZXIgPSBjdXJyZW50Q29sdW1uU29ydEZpbHRlciB8fCBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuICAgICAgICByZXR1cm4gY3VycmVudENvbHVtblNvcnRGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlTGlzdEZvckNoZWNrYm94RmlsdGVyKGhlYWRlcjogc3RyaW5nLCBvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGNvbnN0IHRvb2x0aXBPcHRpb25zID0gdGhpcy5nZXRUb29sdGlwTW9kZWxGcm9tT3B0aW9uRGF0YShvcHRpb25EYXRhLCBoZWFkZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdFVuc2VsZWN0TGlzdENoZWNrYm94KHRvb2x0aXBPcHRpb25zLCBoZWFkZXIpO1xyXG4gICAgICAgIHRoaXMuZm9ybWF0TnVsbE9wdGlvblRvU3BlY2lmaWVkU3RyaW5nKHRvb2x0aXBPcHRpb25zLCBcIi1cIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0b29sdGlwT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXRUb29sdGlwTW9kZWxGcm9tT3B0aW9uRGF0YShvcHRpb25EYXRhOiBhbnlbXSwgaGVhZGVyOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB1bmlxT3B0aW9uRGF0YSA9IHVuaXEob3B0aW9uRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1baGVhZGVyXSkpO1xyXG4gICAgICAgIHJldHVybiB1bmlxT3B0aW9uRGF0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiBuZXcgVG9vbHRpcE1vZGVsKGl0ZW0sIGluZGV4ICsgMSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFVuc2VsZWN0TGlzdENoZWNrYm94KHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSwgaGVhZGVyOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGhlYWRlcikpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZVNldCA9IG5ldyBTZXQodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGhlYWRlcikpO1xyXG4gICAgICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlU2V0LmhhcyhpdGVtLnZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvcm1hdE51bGxPcHRpb25Ub1NwZWNpZmllZFN0cmluZyh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGZvcm1hdHRlZFN0cmluZzogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0b29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT0gbnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgdG9vbHRpcE9wdGlvbnNbaW5kZXhdLmxhYmVsID0gZm9ybWF0dGVkU3RyaW5nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRDbG9uZWRUb29sdGlwQW5kVG9vbHRpcE9wdGlvbih0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIHNvcnRCeVN0cmluZzogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgW3NlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRJdGVtc10gPSB0aGlzLmdldFNlbGVjdGVkQW5kVW5zZWxlY3RlZEl0ZW1zKHRvb2x0aXBPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBzb3J0ZWRTZWxlY3RlZEl0ZW1zID0gc29ydEJ5KHNlbGVjdGVkSXRlbXMsIHNvcnRCeVN0cmluZyk7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkVW5zZWxlY3RlZEl0ZW1zID0gc29ydEJ5KHVuc2VsZWN0ZWRJdGVtcywgc29ydEJ5U3RyaW5nKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2xvbmVkVG9vbHRpcE9wdGlvbnMgPSBbLi4uc29ydGVkU2VsZWN0ZWRJdGVtcywgLi4uc29ydGVkVW5zZWxlY3RlZEl0ZW1zXTtcclxuICAgICAgICBjb25zdCB1cGRhdGVkVG9vbHRpcE9wdGlvbnMgPSBjbG9uZURlZXAoY2xvbmVkVG9vbHRpcE9wdGlvbnMpO1xyXG5cclxuICAgICAgICByZXR1cm4gW2Nsb25lZFRvb2x0aXBPcHRpb25zLCB1cGRhdGVkVG9vbHRpcE9wdGlvbnMsIHNlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRJdGVtc107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SGVpZ2h0T2ZDaGVja2JveFRvb2x0aXBGaWx0ZXIoZGF0YUxlbmd0aDogbnVtYmVyLCBtYXJnaW46IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBkYXRhTGVuZ3RoID4gNiA/IDIwMCA6IDI2LjAzICogZGF0YUxlbmd0aCArIG1hcmdpbiAqIGRhdGFMZW5ndGggKyBtYXJnaW47XHJcbiAgICB9XHJcblxyXG4gICAgdW5DaGVja0FsbENoZWNrYm94KHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSwgY2xvbmVkVG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjbG9uZWRUb29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKG9wdCkgPT4gb3B0LmlkID09PSBpdGVtLmlkKTtcclxuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnNbaW5kZXhdLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RBbGxDaGVja2JveCh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjbG9uZWRUb29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKG9wdCkgPT4gb3B0LmlkID09PSBpdGVtLmlkKTtcclxuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnNbaW5kZXhdLmlzU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFVuc2VsZWN0Q2hlY2tib3goZGF0YTogVG9vbHRpcE1vZGVsLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBkYXRhLmlzU2VsZWN0ZWQgPSAhZGF0YS5pc1NlbGVjdGVkO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkYXRhLmlkKTtcclxuICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9uc1tpbmRleF0uaXNTZWxlY3RlZCA9IGRhdGEuaXNTZWxlY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RlZEFuZFVuc2VsZWN0ZWRJdGVtcyh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdG9vbHRpcE9wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzU2VsZWN0ZWQpO1xyXG4gICAgICAgIGNvbnN0IHVuc2VsZWN0ZWRJdGVtcyA9IHRvb2x0aXBPcHRpb25zLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNTZWxlY3RlZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBbc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEl0ZW1zXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGVja2JveFByZXZpb3VzU2VsZWN0ZWRWYWx1ZShjbG9uZWRUYWJsZURhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFZhbHVlID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBzb3J0QnkodW5pcShjbG9uZWRUYWJsZURhdGEubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBpbml0aWFsVmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSBzb3J0QnkodW5pcShjbG9uZWRUYWJsZURhdGEubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENoZWNrYm94Q3VycmVudFNlbGVjdGVkVmFsdWUoc2VhcmNoZWRTdHJpbmc6IHN0cmluZywgdG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gW107XHJcblxyXG4gICAgICAgIGlmICh0b29sdGlwT3B0aW9ucykge1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IHNvcnRCeSh0b29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaXNTZWxlY3RlZCkubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAhc2VhcmNoZWRTdHJpbmcgJiZcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlLmxlbmd0aCA9PT0gdG9vbHRpcE9wdGlvbnMubGVuZ3RoICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJsYW5rSW5kZXggPSBjdXJyZW50U2VsZWN0ZWRWYWx1ZS5maW5kSW5kZXgoKGl0ZW06IHN0cmluZykgPT4gaXRlbSA9PSBudWxsKTtcclxuICAgICAgICBpZiAoYmxhbmtJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUgPSBzb3J0QnkoY3VycmVudFNlbGVjdGVkVmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RlZFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTb3J0aW5nQ2hhbmdlZCh0ZW1wU29ydE9yZGVyOiBTb3J0VHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gdGhpcy5nZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGlzU29ydENoYW5nZWQgPSB0ZW1wU29ydE9yZGVyICE9IG51bGwgJiYgdGVtcFNvcnRPcmRlciAhPT0gY3VycmVudENvbHVtblNvcnRGaWx0ZXI7XHJcbiAgICAgICAgcmV0dXJuIGlzU29ydENoYW5nZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyZWRPcHRpb25Bc0JvbGRTdHJpbmcoc3RyOiBzdHJpbmcsIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIGNvbnN0IHRvb2x0aXBPcHRpb25zID0gY2xvbmVEZWVwKFxyXG4gICAgICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubGFiZWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHN0ci50b0xvd2VyQ2FzZSgpKSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQubGFiZWwgPSB0aGlzLmJvbGRTdHJpbmcoZWxlbWVudC5sYWJlbCwgc3RyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvb2x0aXBPcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGJvbGRTdHJpbmcoc3RyOiBzdHJpbmcsIGZpbmQ6IHN0cmluZykge1xyXG4gICAgICAgIGxldCB1cGRhdGVkU3RyaW5nID0gc3RyO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLmdldEluZGljZXNPZihmaW5kLCB1cGRhdGVkU3RyaW5nLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGluZGV4ZXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGl0ZW0gKyBpbmRleCAqIDc7IC8vIE11bHRpcGx5aW5nIGJ5IDcgYXMgdGhlcmUgYXJlIDdjaGFyOiA8Yj48L2I+XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIGZpbmQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBzdHJUb0JlUmVwbGFjZWQgPSB1cGRhdGVkU3RyaW5nLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCk7XHJcbiAgICAgICAgICAgIHVwZGF0ZWRTdHJpbmcgPSB1cGRhdGVkU3RyaW5nLnJlcGxhY2Uoc3RyVG9CZVJlcGxhY2VkLCBgPGI+JHtzdHJUb0JlUmVwbGFjZWR9PC9iPmApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB1cGRhdGVkU3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEluZGljZXNPZihzZWFyY2hTdHI6IHN0cmluZywgc3RyOiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU6IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zdCBzZWFyY2hTdHJMZW4gPSBzZWFyY2hTdHIubGVuZ3RoO1xyXG4gICAgICAgIGlmIChzZWFyY2hTdHJMZW4gPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IDA7XHJcbiAgICAgICAgbGV0IGluZGV4O1xyXG4gICAgICAgIGNvbnN0IGluZGljZXMgPSBbXTtcclxuICAgICAgICBsZXQgdXBkYXRlZFN0ciA9IHN0cjtcclxuICAgICAgICBsZXQgdXBkYXRlZFNlYXJjaFN0ciA9IHNlYXJjaFN0cjtcclxuICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHtcclxuICAgICAgICAgICAgdXBkYXRlZFN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICB1cGRhdGVkU2VhcmNoU3RyID0gc2VhcmNoU3RyLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAoKGluZGV4ID0gdXBkYXRlZFN0ci5pbmRleE9mKHVwZGF0ZWRTZWFyY2hTdHIsIHN0YXJ0SW5kZXgpKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGluZGljZXMucHVzaChpbmRleCk7XHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleCArIHNlYXJjaFN0ckxlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZUFsbEJ0bnNXaGVuVGhlcmVBcmVOb0ZpbHRlcmVkUmVzdWx0cygpOiBbbnVtYmVyLCBib29sZWFuLCBib29sZWFuLCBib29sZWFuXSB7XHJcbiAgICAgICAgLy8gW3NlbGVjdGVkQ2hlY2tib3hPcHRpb25zQ291bnQsIGRpc2FibGVDaGVja2JveEFwcGx5LCBkaXNhYmxlQ2xlYXJBbGwsIGRpc2FibGVTZWxlY3RBbGxdO1xyXG4gICAgICAgIHJldHVybiBbMCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PUNhbGVuZGFyIGZpbHRlcj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuICAgIGNyZWF0ZVJhbmdlRm9yVGhlRGF0ZUZpbHRlcihvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5NYXhEYXRlO1xyXG4gICAgICAgIC8vIFdoZW4geW91IHdhbnQgdG8gdXNlIHN0YXJ0RGF0ZSBhbmQgZW5kRGF0ZSBjb21iaW5lZCBhcyBzaW5nbGUgY29sdW1uIHRoZW4gdXNlIFBlcmlvZC5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJwZXJpb2RcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiYnV5ZXJGbGlnaHREYXRlc1wiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJ0cmFmZmljRmxpZ2h0RGF0ZXNcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gdGhpcy5jcmVhdGVTdGFydEVuZERhdGVSYW5nZShvcHRpb25EYXRhKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKG9wdGlvbkRhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWluTWF4RGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVTdGFydEVuZERhdGVSYW5nZShvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGNvbnN0IG1pblN0YXJ0RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShvcHRpb25EYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgICBjb25zdCBtYXhFbmREYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKG9wdGlvbkRhdGEsIFwiZW5kRGF0ZVwiKTtcclxuICAgICAgICByZXR1cm4gW21pblN0YXJ0RGF0ZVswXSwgbWF4RW5kRGF0ZVsxXV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TWluQW5kTWF4RGF0ZVJhbmdlRm9yQ2FsZW5kYXIobWluTWF4RGF0ZTogYW55W10sIHBhcnNpbmdGb3JtYXQ6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyTWluRW5hYmxlZERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMF0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyTWF4RW5hYmxlZERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgIHJldHVybiBbY2FsZW5kYXJNaW5FbmFibGVkRGF0ZSwgY2FsZW5kYXJNYXhFbmFibGVkRGF0ZV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0ZWREYXRlRm9yQ2FsZW5kYXIobWluTWF4RGF0ZTogYW55W10sIHBhcnNpbmdGb3JtYXQ6IHN0cmluZywgbWluRGF0ZTogTmdiRGF0ZVR5cGUsIG1heERhdGU6IE5nYkRhdGVUeXBlKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkTWluRGF0ZTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRNYXhEYXRlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlT2JqID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlT2JqLmZyb21EYXRlLmlzQWZ0ZXIobWluTWF4RGF0ZVswXSkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWluRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUoc2VsZWN0ZWREYXRlT2JqLmZyb21EYXRlLCBwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWluRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVswXSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGVPYmoudG9EYXRlLmlzQWZ0ZXIobWluTWF4RGF0ZVsxXSkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWF4RGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVsxXSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHNlbGVjdGVkRGF0ZU9iai50b0RhdGUsIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRNaW5EYXRlID0gY2xvbmVEZWVwKG1pbkRhdGUpO1xyXG4gICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSBjbG9uZURlZXAobWF4RGF0ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW3NlbGVjdGVkTWluRGF0ZSwgc2VsZWN0ZWRNYXhEYXRlXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmV2aW91c1NlbGVjdGVkRGF0ZXNGb3JDYWxlbmRhcihvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBwcmV2aW91c1NlbGVjdGVkRGF0ZTogeyBmcm9tRGF0ZTogYW55OyB0b0RhdGU6IGFueSB9ID0geyBmcm9tRGF0ZTogbnVsbCwgdG9EYXRlOiBudWxsIH07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRGF0ZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBGb3JEYXRlRmlsdGVyKG9wdGlvbkRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRGF0ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yRGF0ZUZpbHRlcihvcHRpb25EYXRhKTtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZERhdGUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1NlbGVjdGVkRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsVmFsdWVNYXBGb3JEYXRlRmlsdGVyKG9wdGlvbkRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgY29uc3QgbWluTWF4RGF0ZSA9IHRoaXMuY3JlYXRlUmFuZ2VGb3JUaGVEYXRlRmlsdGVyKG9wdGlvbkRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZERhdGUgPSB7IGZyb21EYXRlOiBtaW5NYXhEYXRlWzBdLCB0b0RhdGU6IG1pbk1heERhdGVbMV0gfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBzZWxlY3RlZERhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRTZWxlY3RlZERhdGVzRm9yQ2FsZW5kYXIoY3VycmVudFNlbGVjdGVkRGF0ZTogYW55LCBtaW5EYXRlOiBOZ2JEYXRlVHlwZSwgbWF4RGF0ZTogTmdiRGF0ZVR5cGUpIHtcclxuICAgICAgICBsZXQgY3VycmVudFNlbGVjdGVkRGF0ZVRvQmVVcGRhdGVkID0gY3VycmVudFNlbGVjdGVkRGF0ZTtcclxuICAgICAgICBjb25zdCBmcm9tRGF0ZSA9IHtcclxuICAgICAgICAgICAgeWVhcjogY3VycmVudFNlbGVjdGVkRGF0ZVRvQmVVcGRhdGVkLmZyb21EYXRlLnllYXIsXHJcbiAgICAgICAgICAgIG1vbnRoOiBjdXJyZW50U2VsZWN0ZWREYXRlVG9CZVVwZGF0ZWQuZnJvbURhdGUubW9udGgsXHJcbiAgICAgICAgICAgIGRheTogY3VycmVudFNlbGVjdGVkRGF0ZVRvQmVVcGRhdGVkLmZyb21EYXRlLmRheSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHRvRGF0ZSA9IHtcclxuICAgICAgICAgICAgeWVhcjogY3VycmVudFNlbGVjdGVkRGF0ZVRvQmVVcGRhdGVkLnRvRGF0ZS55ZWFyLFxyXG4gICAgICAgICAgICBtb250aDogY3VycmVudFNlbGVjdGVkRGF0ZVRvQmVVcGRhdGVkLnRvRGF0ZS5tb250aCxcclxuICAgICAgICAgICAgZGF5OiBjdXJyZW50U2VsZWN0ZWREYXRlVG9CZVVwZGF0ZWQudG9EYXRlLmRheSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoaXNFcXVhbChtaW5EYXRlLCBmcm9tRGF0ZSkgJiYgaXNFcXVhbChtYXhEYXRlLCB0b0RhdGUpICYmIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGVUb0JlVXBkYXRlZCA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGVUb0JlVXBkYXRlZC5mcm9tRGF0ZSA9IGRheWpzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudChjdXJyZW50U2VsZWN0ZWREYXRlVG9CZVVwZGF0ZWQuZnJvbURhdGUpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWREYXRlVG9CZVVwZGF0ZWQudG9EYXRlID0gZGF5anMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KGN1cnJlbnRTZWxlY3RlZERhdGVUb0JlVXBkYXRlZC50b0RhdGUpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RlZERhdGVUb0JlVXBkYXRlZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1TTElERVI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcblxyXG4gICAgZ2V0U2xpZGVyVHJhbnNsYXRlRnVuY1ZhbChoZWFkZXI6IHN0cmluZywgY3VycmVuY3lTZXQ6IFNldDxzdHJpbmc+KSB7XHJcbiAgICAgICAgbGV0IHRyYW5zbGF0ZUZ1bmM7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW5jeVNldC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVGdW5jID0gXCJjdXJyZW5jeVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyID09PSBcInBvc3RlZEF1ZFBlcmNlbnRcIiB8fCBoZWFkZXIgPT09IFwicGFyZW50Um93U2hhcmVzXCIgfHwgaGVhZGVyID09PSBcInBhcmVudFJvd1B1dFBlcmNlbnRcIikge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVGdW5jID0gXCJwZXJjZW50XCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHJhbnNsYXRlRnVuYyA9IFwibm9ybWFsXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlRnVuYztcclxuICAgIH1cclxuXHJcbiAgICBnZXRTbGlkZXJPcHRpb25zKG9wdGlvbnNEYXRhOiBhbnlbXSwgdHJhbnNsYXRlRnVuYzogc3RyaW5nLCBoZWFkZXI6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IG1pblZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShvcHRpb25zRGF0YSwgaGVhZGVyLCB0cnVlKTtcclxuICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUob3B0aW9uc0RhdGEsIGhlYWRlciwgZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvYmogPSB0aGlzLnNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZSwgbWF4VmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAodHJhbnNsYXRlRnVuYyA9PT0gXCJub3JtYWxcIikge1xyXG4gICAgICAgICAgICBvYmoudHJhbnNsYXRlID0gdGhpcy5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09IFwicGVyY2VudFwiKSB7XHJcbiAgICAgICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLnBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09IFwiY3VycmVuY3lcIikge1xyXG4gICAgICAgICAgICBvYmoudHJhbnNsYXRlID0gdGhpcy5jdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFJhbmdlRm9yU2xpZGVyKGhlYWRlcjogc3RyaW5nLCBvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IHNsaWRlck1pblZhbHVlO1xyXG4gICAgICAgIGxldCBzbGlkZXJNYXhWYWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT2JqID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGhlYWRlcik7XHJcbiAgICAgICAgICAgIHNsaWRlck1pblZhbHVlID0gc2VsZWN0ZWRPYmoubWluIDwgb3B0aW9ucy5mbG9vciA/IG9wdGlvbnMuZmxvb3IgOiBzZWxlY3RlZE9iai5taW47XHJcbiAgICAgICAgICAgIHNsaWRlck1heFZhbHVlID0gc2VsZWN0ZWRPYmoubWF4IDwgb3B0aW9ucy5jZWlsID8gc2VsZWN0ZWRPYmoubWF4IDogb3B0aW9ucy5jZWlsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNsaWRlck1pblZhbHVlID0gb3B0aW9ucy5mbG9vcjtcclxuICAgICAgICAgICAgc2xpZGVyTWF4VmFsdWUgPSBvcHRpb25zLmNlaWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW3NsaWRlck1pblZhbHVlLCBzbGlkZXJNYXhWYWx1ZV07XHJcbiAgICB9XHJcblxyXG4gICAgaXNWYWx1ZUluUmFuZ2Uob3B0aW9uczogT3B0aW9ucywgdmFsOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gb3B0aW9ucy5mbG9vciA8PSB2YWwgJiYgdmFsIDw9IG9wdGlvbnMuY2VpbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmV2aW91c1NlbGVjdGVkVmFsdWVGb3JTbGlkZXIoY2xvbmVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTbGlkZXJEYXRhOiB7IG1pbjogYW55OyBtYXg6IGFueSB9ID0geyBtaW46IFwiXCIsIG1heDogXCJcIiB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yU2xpZGVyRmlsdGVyKGNsb25lZERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NsaWRlckRhdGEgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhKTtcclxuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTbGlkZXJEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGNvbnN0IG1pblZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShjbG9uZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIHRydWUpO1xyXG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShjbG9uZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIGZhbHNlKTtcclxuICAgICAgICBjb25zdCBzbGlkZXJEYXRhID0geyBtaW46IG1pblZhbHVlLCBtYXg6IG1heFZhbHVlIH07XHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KHRoaXMuc2VsZWN0ZWRSYWRpbywgc2xpZGVyRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkVmFsdWVGb3JTbGlkZXIobWluRW50ZXJlZFZhbDogbnVtYmVyLCBtYXhFbnRlcmVkVmFsOiBudW1iZXIsIG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICAgICAgICBsZXQgY3VycmVudFNsaWRlckRhdGE6IHsgbWluOiBhbnk7IG1heDogYW55IH0gPSB7IG1pbjogbnVsbCwgbWF4OiBudWxsIH07XHJcbiAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWF4ID0gbWF4RW50ZXJlZFZhbDtcclxuICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5taW4gPSBtaW5FbnRlcmVkVmFsO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1pbiA9PT0gb3B0aW9ucy5mbG9vciAmJlxyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5tYXggPT09IG9wdGlvbnMuY2VpbCAmJlxyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTbGlkZXJEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1USU1FPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuICAgIGdldFNlbGVjdGVkVGltZVJhbmdlKGhlYWRlcjogc3RyaW5nLCBjbG9uZWREYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEZyb21UaW1lOiBhbnlbXTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRUb1RpbWU6IGFueVtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGhlYWRlcikpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpLmZyb21UaW1lO1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpLnRvVGltZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclRpbWVGaWx0ZXIoY2xvbmVkRGF0YSwgaGVhZGVyKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldChoZWFkZXIpLmZyb21UaW1lO1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldChoZWFkZXIpLnRvVGltZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZEZyb21UaW1lICE9PSB1bmRlZmluZWQgfHwgc2VsZWN0ZWRUb1RpbWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZEZyb21UaW1lID0gQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5mb3JtYXRUb1R3ZWx2ZUhycyhzZWxlY3RlZEZyb21UaW1lLCB0cnVlKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmZvcm1hdFRvVHdlbHZlSHJzKHNlbGVjdGVkVG9UaW1lLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWxlY3RlZEZyb21UaW1lID0gW1wiLVwiLCBcIi1cIiwgXCItXCJdO1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IFtcIi1cIiwgXCItXCIsIFwiLVwiXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxWYWx1ZU1hcEZvclRpbWVGaWx0ZXIoY2xvbmVkRGF0YTogYW55W10sIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJzdGFydEVuZFRpbWVcIiB8fCBrZXkgPT09IFwiVGltZUJhbmRcIikge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKGNsb25lZERhdGEsIGtleSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVGb3JTdGFydE9yRW5kVGltZVJhbmdlKGNsb25lZERhdGEsIGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHVzZSBmb3IgZmlsdGVyIHdoZXJlIHdlIGhhdmUgc3RhcnQgYW5kIGVuZCB0aW1lIHJhbmdlIGluIG9uZSBmaWx0ZXJcclxuICAgIC8vIHN0YXJ0RW5kVGltZTogW1wiNiAtIDdBXCIsIFwiMDY6IDAwIDogMDBcIiAsIFwiMDc6MDA6MDBcIl1cclxuICAgIHNldEluaXRpYWxWYWx1ZUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKGNsb25lZERhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGluY2x1ZGVNdWx0aSA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldWzBdID09PSBcIjxtdWx0aT5cIikgIT09IC0xO1xyXG4gICAgICAgIGNvbnN0IGluY2x1ZGVaZXJvID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV1bMF0gPT09IFwiMFwiKSAhPT0gLTE7XHJcbiAgICAgICAgY29uc3QgaW5jbHVkZVRpbWVSYW5nZSA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldWzBdICE9PSBcIjBcIiAmJiBvYmpba2V5XVswXSAhPT0gXCI8bXVsdGk+XCIpICE9PSAtMTtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsdGVyZWRTdGFydFRpbWUgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsLCBcIjBcIiwgXCI8bXVsdGk+XCJdLmluY2x1ZGVzKG9iai5zdGFydFRpbWUpKTtcclxuICAgICAgICBjb25zdCBmaWx0ZXJlZEVuZFRpbWUgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsLCBcIjBcIiwgXCI8bXVsdGk+XCJdLmluY2x1ZGVzKG9iai5lbmRUaW1lKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZUFyciA9IG1hcChmaWx0ZXJlZFN0YXJ0VGltZSwgXCJzdGFydFRpbWVcIik7XHJcbiAgICAgICAgY29uc3QgZW5kVGltZUFyciA9IG1hcChmaWx0ZXJlZEVuZFRpbWUsIFwiZW5kVGltZVwiKTtcclxuXHJcbiAgICAgICAgc3RhcnRUaW1lQXJyLnNvcnQoKGEsIGIpID0+IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVBc2NlbmRpbmcoYSwgYikpO1xyXG5cclxuICAgICAgICBlbmRUaW1lQXJyLnNvcnQoKGEsIGIpID0+IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2JqID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogc3RhcnRUaW1lQXJyWzBdLFxyXG4gICAgICAgICAgICB0b1RpbWU6IGVuZFRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aSxcclxuICAgICAgICAgICAgaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB1c2UgZm9yIHRoZSBmaWx0ZXJzIHdoZXJlIHdlIGhhdmUgZGlmZmVyZW50IGZpbHRlciBmb3Igc3RhcnQgYW5kIGVuZCB0aW1lXHJcbiAgICAvLyBzdGFydFRpbWU6IFwiMDY6MDA6MDBcIlxyXG4gICAgc2V0SW5pdGlhbFZhbHVlRm9yU3RhcnRPckVuZFRpbWVSYW5nZShjbG9uZWREYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBpbmNsdWRlTXVsdGkgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XSA9PT0gXCI8bXVsdGk+XCIpICE9PSAtMTtcclxuICAgICAgICBjb25zdCBpbmNsdWRlWmVybyA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldID09PSBcIjBcIikgIT09IC0xO1xyXG4gICAgICAgIGNvbnN0IGluY2x1ZGVUaW1lUmFuZ2UgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XSAhPT0gXCIwXCIgJiYgb2JqW2tleV0gIT09IFwiPG11bHRpPlwiKSAhPT0gLTE7XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsLCBcIjBcIiwgXCI8bXVsdGk+XCJdLmluY2x1ZGVzKG9ialtrZXldKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRpbWVBcnIgPSBtYXAoZGF0YSwga2V5KTtcclxuICAgICAgICB0aW1lQXJyLnNvcnQoKGEsIGIpID0+IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVBc2NlbmRpbmcoYSwgYikpO1xyXG5cclxuICAgICAgICBjb25zdCBvYmogPSB7XHJcbiAgICAgICAgICAgIGZyb21UaW1lOiB0aW1lQXJyWzBdLFxyXG4gICAgICAgICAgICB0b1RpbWU6IHRpbWVBcnJbdGltZUFyci5sZW5ndGggLSAxXSxcclxuICAgICAgICAgICAgaW5jbHVkZU11bHRpLFxyXG4gICAgICAgICAgICBpbmNsdWRlWmVybyxcclxuICAgICAgICAgICAgaW5jbHVkZVRpbWVSYW5nZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBvYmopO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFVuc2VsZWN0VGltZUZpbHRlckNoZWNrYm94KGtleTogc3RyaW5nLCBvcHRpb25zRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgc2hvd011bHRpVGltZUNoZWNrYm94ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHNob3daZXJvVGltZUNoZWNrYm94ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHNob3dFbnRlclRpbWVDaGVja2JveCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBtdWx0aVRpbWVDaGVja2JveENoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgemVyb1RpbWVDaGVja2JveENoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgZW50ZXJUaW1lQ2hlY2tib3hDaGVja2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZFRpbWVPYmo7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRpbWVPYmogPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoa2V5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRpbWVPYmogPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQoa2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0aW1lQXJyOiBzdHJpbmdbXTtcclxuICAgICAgICBpZiAoa2V5ID09PSBcInN0YXJ0RW5kVGltZVwiIHx8IGtleSA9PT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgICAgIHRpbWVBcnIgPSBvcHRpb25zRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1ba2V5XVswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGltZUFyciA9IG9wdGlvbnNEYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVtrZXldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lQXJyLmZpbmRJbmRleCgodmFsKSA9PiB2YWwgPT09IFwiMFwiKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgc2hvd1plcm9UaW1lQ2hlY2tib3ggPSB0cnVlO1xyXG4gICAgICAgICAgICB6ZXJvVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkVGltZU9iai5pbmNsdWRlWmVybztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lQXJyLmZpbmRJbmRleCgodmFsKSA9PiB2YWwgPT09IFwiPG11bHRpPlwiKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgc2hvd011bHRpVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICAgICAgbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkID0gc2VsZWN0ZWRUaW1lT2JqLmluY2x1ZGVNdWx0aTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG93WmVyb1RpbWVDaGVja2JveCB8fCBzaG93TXVsdGlUaW1lQ2hlY2tib3gpIHtcclxuICAgICAgICAgICAgc2hvd0VudGVyVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lQXJyLmZpbmRJbmRleCgodmFsKSA9PiB2YWwgIT09IFwiPG11bHRpPlwiICYmIHZhbCAhPT0gXCIwXCIpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBlbnRlclRpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZFRpbWVPYmo/LmluY2x1ZGVUaW1lUmFuZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzaG93TXVsdGlUaW1lQ2hlY2tib3gsXHJcbiAgICAgICAgICAgIHNob3daZXJvVGltZUNoZWNrYm94LFxyXG4gICAgICAgICAgICBzaG93RW50ZXJUaW1lQ2hlY2tib3gsXHJcbiAgICAgICAgICAgIG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCxcclxuICAgICAgICAgICAgemVyb1RpbWVDaGVja2JveENoZWNrZWQsXHJcbiAgICAgICAgICAgIGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTdGFydFRpbWVJc0FmdGVyRW5kVGltZShzdGFydFRpbWU6IHN0cmluZ1tdLCBlbmRUaW1lOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGNvbnN0IHRpbWVGb3JtYXQgPSBcIkhIOm1tOnNzXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBgJHtzdGFydFRpbWVbMF19OiR7c3RhcnRUaW1lWzFdfSAke3N0YXJ0VGltZVsyXX1gLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lMjRIckZvcm1hdCA9IGAke3N0YXJ0VGltZTI0SHJGb3JtYXRBcnJbMF19OiR7c3RhcnRUaW1lMjRIckZvcm1hdEFyclsxXX06MDBgO1xyXG4gICAgICAgIGNvbnN0IGVuZFRpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcclxuICAgICAgICAgICAgYCR7ZW5kVGltZVswXX06JHtlbmRUaW1lWzFdfSAke2VuZFRpbWVbMl19YCxcclxuICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGVuZFRpbWUyNEhyRm9ybWF0ID0gYCR7ZW5kVGltZTI0SHJGb3JtYXRBcnJbMF19OiR7ZW5kVGltZTI0SHJGb3JtYXRBcnJbMV19OjAwYDtcclxuICAgICAgICByZXR1cm4gZGF5anMoc3RhcnRUaW1lMjRIckZvcm1hdCwgdGltZUZvcm1hdCkuaXNBZnRlcihkYXlqcyhlbmRUaW1lMjRIckZvcm1hdCwgdGltZUZvcm1hdCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyKCkge1xyXG4gICAgICAgIGxldCBwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlcjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlciA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXIoXHJcbiAgICAgICAgc3RhcnRUaW1lOiBzdHJpbmdbXSxcclxuICAgICAgICBlbmRUaW1lOiBzdHJpbmdbXSxcclxuICAgICAgICBpbmNsdWRlTXVsdGk6IGJvb2xlYW4sXHJcbiAgICAgICAgaW5jbHVkZVplcm86IGJvb2xlYW4sXHJcbiAgICAgICAgaW5jbHVkZVRpbWVSYW5nZTogYm9vbGVhbixcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGZyb21UaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXHJcbiAgICAgICAgICAgIGAke3N0YXJ0VGltZVswXX06JHtzdGFydFRpbWVbMV19ICR7c3RhcnRUaW1lWzJdfWAsXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBmcm9tVGltZTI0SHJGb3JtYXQgPSBgJHtmcm9tVGltZTI0SHJGb3JtYXRBcnJbMF19OiR7ZnJvbVRpbWUyNEhyRm9ybWF0QXJyWzFdfTowMGA7XHJcblxyXG4gICAgICAgIGNvbnN0IHRvVGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBgJHtlbmRUaW1lWzBdfToke2VuZFRpbWVbMV19ICR7ZW5kVGltZVsyXX1gLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgdG9UaW1lMjRIckZvcm1hdCA9IGAke3RvVGltZTI0SHJGb3JtYXRBcnJbMF19OiR7dG9UaW1lMjRIckZvcm1hdEFyclsxXX06MDBgO1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogZnJvbVRpbWUyNEhyRm9ybWF0LFxyXG4gICAgICAgICAgICB0b1RpbWU6IHRvVGltZTI0SHJGb3JtYXQsXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aSxcclxuICAgICAgICAgICAgaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50SG91cklucHV0KGFycjogYW55W10pIHtcclxuICAgICAgICBpZiAoYXJyWzBdID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludChhcnJbMF0sIDEwKSA8IDEyKSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IHBhcnNlSW50KGFyclswXSwgMTApICsgMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSAxO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWNyZW1lbnRIb3VySW5wdXQoYXJyOiBhbnlbXSkge1xyXG4gICAgICAgIGlmIChhcnJbMF0gPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludChhcnJbMF0sIDEwKSA+IDEpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gcGFyc2VJbnQoYXJyWzBdLCAxMCkgLSAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IDEyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRNaW51dGVJbnB1dChhcnI6IGFueVtdKSB7XHJcbiAgICAgICAgLy8gaW5jcmVtZW50IHRvIG5lYXJlc3QgcHJvcGVyIGludGVydmFsKDE1LDMwLDQ1KVxyXG4gICAgICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KGFyclsxXSwgMTApO1xyXG4gICAgICAgIGlmIChtaW51dGUgPD0gMTQpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCIxNVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID49IDE1ICYmIG1pbnV0ZSA8PSAyOSkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjMwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPj0gMzAgJiYgbWludXRlIDw9IDQ0KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9IFwiNDVcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+PSA0NSkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjAwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudE1pbnV0ZUlucHV0KGFycjogYW55KSB7XHJcbiAgICAgICAgY29uc3QgbWludXRlID0gcGFyc2VJbnQoYXJyWzFdLCAxMCk7XHJcbiAgICAgICAgaWYgKG1pbnV0ZSA+IDAgJiYgbWludXRlIDw9IDE1KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9IFwiMDBcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+PSAxNiAmJiBtaW51dGUgPD0gMzApIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCIxNVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID49IDMxICYmIG1pbnV0ZSA8PSA0NSkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjMwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPiA0NSB8fCBtaW51dGUgPT09IDApIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCI0NVwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRPckRlY3JlbWVudEhvdXIoaW5jcmVtZW50OiBib29sZWFuLCB0aW1lOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGlmIChpbmNyZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRIb3VySW5wdXQodGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRIb3VySW5wdXQodGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE9yRGVjcmVtZW50TWluKGluY3JlbWVudDogYm9vbGVhbiwgdGltZTogc3RyaW5nW10pIHtcclxuICAgICAgICBpZiAoaW5jcmVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50TWludXRlSW5wdXQodGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRNaW51dGVJbnB1dCh0aW1lKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNIb3VyVmFsdWVJbnZhbGlkKGhyOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaHIubGVuZ3RoID09PSAwIHx8ICEraHIgfHwgcGFyc2VJbnQoaHIsIDEwKSA8IDEgfHwgcGFyc2VJbnQoaHIsIDEwKSA+IDEyIHx8IGhyLmluY2x1ZGVzKFwiLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBpc01pbnV0ZVZhbHVlSW52YWxpZChtaW51dGU6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIG1pbnV0ZS5sZW5ndGggIT09IDIgfHxcclxuICAgICAgICAgICAgKCErbWludXRlICYmIG1pbnV0ZSAhPT0gXCIwMFwiKSB8fFxyXG4gICAgICAgICAgICBwYXJzZUludChtaW51dGUsIDEwKSA8IDAgfHxcclxuICAgICAgICAgICAgcGFyc2VJbnQobWludXRlLCAxMCkgPiA1OSB8fFxyXG4gICAgICAgICAgICBtaW51dGUuaW5jbHVkZXMoXCIuXCIpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09U09SVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcbiAgICB1cGRhdGVTb3J0TWFwKHRlbXBTb3J0T3JkZXI6IFNvcnRUeXBlLCB0YWJsZURhdGE6IGFueVtdLCBpc0x1ckFuZENzckNvbXBvbmVudDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuc2V0KHRoaXMuc2VsZWN0ZWRSYWRpbywgdGVtcFNvcnRPcmRlcik7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkVGFibGVEYXRhID0gdGhpcy5hbm5hU29ydFNlcnZpY2UuYXBwbHlTb3J0aW5nKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8sXHJcbiAgICAgICAgICAgIHRlbXBTb3J0T3JkZXIsXHJcbiAgICAgICAgICAgIHRhYmxlRGF0YSxcclxuICAgICAgICAgICAgaXNMdXJBbmRDc3JDb21wb25lbnQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gc29ydGVkVGFibGVEYXRhO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|