@annalib/anna-core 20.2.22 → 20.2.25
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 → esm2020}/annalib-anna-core.mjs +4 -4
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +14 -14
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +13 -13
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +11 -11
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +43 -43
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +14 -14
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -22
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +13 -13
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +22 -22
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +14 -14
- package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +47 -0
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +273 -273
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +46 -46
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +39 -39
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +21 -21
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-sort.model.mjs +6 -6
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +29 -29
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +39 -39
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +27 -27
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +22 -22
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +55 -55
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +26 -26
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +17 -17
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +208 -208
- package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +1272 -0
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +151 -151
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +135 -135
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +53 -53
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +65 -65
- package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-sort.service.mjs +178 -178
- package/esm2020/lib/anna-core.module.mjs +237 -0
- package/{esm2022 → esm2020}/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +160 -160
- package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +371 -0
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +252 -252
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +185 -185
- package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +314 -0
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +298 -298
- package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +865 -0
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +64 -64
- package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +352 -0
- package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +204 -0
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +1 -1
- package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +180 -0
- package/{esm2022 → esm2020}/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +1 -1
- package/{esm2022 → esm2020}/public-api.mjs +57 -57
- package/fesm2015/annalib-anna-core.mjs +6131 -0
- package/fesm2015/annalib-anna-core.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/annalib-anna-core.mjs +5999 -5984
- package/fesm2020/annalib-anna-core.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.d.ts +5 -5
- package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +17 -17
- package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -11
- package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +12 -12
- package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +45 -45
- package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -34
- package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +16 -16
- package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +10 -10
- package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +16 -16
- package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +97 -97
- package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +128 -128
- package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +11 -11
- package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +25 -25
- package/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +8 -8
- package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -7
- package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +28 -28
- package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +154 -154
- package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +27 -27
- package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -21
- package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +8 -8
- package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +9 -9
- package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +18 -18
- package/lib/anna-core.module.d.ts +45 -45
- package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +45 -45
- package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +70 -70
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +60 -60
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.d.ts +53 -53
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +65 -65
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +83 -83
- package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +175 -175
- package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +17 -17
- package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -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 +89 -89
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -1
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -45
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -1
- package/package.json +11 -5
- package/public-api.d.ts +42 -42
- package/src/lib/anna-common-scss/_icons.scss +1 -1
- package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -47
- package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -1272
- package/esm2022/lib/anna-core.module.mjs +0 -226
- package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -371
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +0 -312
- package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -863
- 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-virtual-table/anna-virtual-table.directive.mjs +0 -180
- package/fesm2022/annalib-anna-core.mjs.map +0 -1
|
@@ -0,0 +1,1272 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
// Third party import statements
|
|
3
|
+
import { min, max, map, sortBy, uniq, cloneDeep, isEqual } from 'lodash-es';
|
|
4
|
+
import dayjs from 'dayjs';
|
|
5
|
+
import CustomParseFormat from 'dayjs/plugin/customParseFormat';
|
|
6
|
+
import minMax from 'dayjs/plugin/minMax';
|
|
7
|
+
import isBetween from 'dayjs/plugin/isBetween';
|
|
8
|
+
import { SortTypeEnum } from '../models/anna-sort.model';
|
|
9
|
+
// User defined import statements
|
|
10
|
+
import { AnnaDateTimeFormatService } from './anna-date-time-format.service';
|
|
11
|
+
import { AnnaSortService } from './anna-sort.service';
|
|
12
|
+
import { TooltipModel } from '../models/anna-tooltip.model';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "./anna-date-time-format.service";
|
|
15
|
+
import * as i2 from "./anna-sort.service";
|
|
16
|
+
export class AnnaFilterService {
|
|
17
|
+
constructor(dateTimeFormatService, annaSortService) {
|
|
18
|
+
this.dateTimeFormatService = dateTimeFormatService;
|
|
19
|
+
this.annaSortService = annaSortService;
|
|
20
|
+
this.tooltipMap = new Map();
|
|
21
|
+
this.tooltipSelectedMap = new Map();
|
|
22
|
+
this.appliedFiltersArray = [];
|
|
23
|
+
this.sliderCurrencySet = new Set([
|
|
24
|
+
'booked',
|
|
25
|
+
'cpp',
|
|
26
|
+
'cpm',
|
|
27
|
+
'rcvPreempt',
|
|
28
|
+
'osPreempt',
|
|
29
|
+
'postedAdu',
|
|
30
|
+
'scheduledAdu',
|
|
31
|
+
'audienceDeficit',
|
|
32
|
+
'Rate',
|
|
33
|
+
'userADUs',
|
|
34
|
+
'buyerChanges',
|
|
35
|
+
'userChanges',
|
|
36
|
+
'userMG',
|
|
37
|
+
'udValue',
|
|
38
|
+
'odValue',
|
|
39
|
+
]);
|
|
40
|
+
this.isFilterSortActive = {};
|
|
41
|
+
this.resetFilterSortActiveStatus = true;
|
|
42
|
+
this.percentTranslateFunction = (data) => {
|
|
43
|
+
if (Math.abs(data) >= 1000) {
|
|
44
|
+
let isNegVal = data < 0;
|
|
45
|
+
const val = (Math.abs(data) / 1000).toFixed(1) + 'k%';
|
|
46
|
+
return isNegVal ? '-' + val : val;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
let isNegVal = data < 0;
|
|
50
|
+
let isWholeNum = parseInt(data.toString()) == data;
|
|
51
|
+
let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
|
|
52
|
+
return isNegVal ? '-' + val + '%' : val + '%';
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
this.currencyTranslateFunction = (data) => {
|
|
56
|
+
if (Math.abs(data) >= 1000) {
|
|
57
|
+
let isNegVal = data < 0;
|
|
58
|
+
const val = '$' + (Math.abs(data) / 1000).toFixed(1) + 'k';
|
|
59
|
+
return isNegVal ? '-' + val : val;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
let isNegVal = data < 0;
|
|
63
|
+
let isWholeNum = parseInt(data.toString()) == data;
|
|
64
|
+
let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
|
|
65
|
+
return isNegVal ? '-$' + val : '$' + val;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
this.normalTranslateFunction = (data) => {
|
|
69
|
+
if (data >= 1000) {
|
|
70
|
+
const val = (data / 1000).toFixed(1) + 'k';
|
|
71
|
+
return val;
|
|
72
|
+
}
|
|
73
|
+
else if (data != Math.floor(data)) {
|
|
74
|
+
return data.toFixed(1).toString();
|
|
75
|
+
}
|
|
76
|
+
return data.toString();
|
|
77
|
+
};
|
|
78
|
+
dayjs.extend(minMax);
|
|
79
|
+
dayjs.extend(isBetween);
|
|
80
|
+
dayjs.extend(CustomParseFormat);
|
|
81
|
+
const sliderArr = [
|
|
82
|
+
'rcvPreempt',
|
|
83
|
+
'osPreempt',
|
|
84
|
+
'rcvUnderDly',
|
|
85
|
+
'postedAudPercent',
|
|
86
|
+
'booked',
|
|
87
|
+
'spots',
|
|
88
|
+
'grp',
|
|
89
|
+
'cpp',
|
|
90
|
+
'imps',
|
|
91
|
+
'cpm',
|
|
92
|
+
'osUnderDly',
|
|
93
|
+
'totalWeeks',
|
|
94
|
+
'WeekNumber',
|
|
95
|
+
'Rate',
|
|
96
|
+
'OrderedRatingsOrImpressions',
|
|
97
|
+
'PostedRatingsOrImpressions',
|
|
98
|
+
,
|
|
99
|
+
'postedAudPercent',
|
|
100
|
+
'postedAdu',
|
|
101
|
+
'scheduledAdu',
|
|
102
|
+
'audienceDeficit',
|
|
103
|
+
'offeredMGs',
|
|
104
|
+
'outstandingPE',
|
|
105
|
+
'offeredADUs',
|
|
106
|
+
'udDeficitValue',
|
|
107
|
+
'bookedValue',
|
|
108
|
+
'bookedSpots',
|
|
109
|
+
'userChanges',
|
|
110
|
+
'UDGrp',
|
|
111
|
+
'UDImps',
|
|
112
|
+
'ODGrp',
|
|
113
|
+
'ODImps',
|
|
114
|
+
'udImpsPercent',
|
|
115
|
+
'udGrpPercent',
|
|
116
|
+
'odImpsPercent',
|
|
117
|
+
'odGrpPercent',
|
|
118
|
+
'userADUs',
|
|
119
|
+
'buyerChanges',
|
|
120
|
+
'userChanges',
|
|
121
|
+
'userMG',
|
|
122
|
+
'WeeklyAUR',
|
|
123
|
+
'WeeklyAURatingOrImpressions',
|
|
124
|
+
'MGsValue',
|
|
125
|
+
'ADUsValue',
|
|
126
|
+
'UserCreditedValue',
|
|
127
|
+
'UserUnresolvedValue',
|
|
128
|
+
'BuyerAddedValue',
|
|
129
|
+
'BuyerDeletedValue',
|
|
130
|
+
'BuyerChangesValue',
|
|
131
|
+
'UserChangesValue',
|
|
132
|
+
'BookedGRPOrIMPS',
|
|
133
|
+
'BookedCPPOrCPM',
|
|
134
|
+
'BookedValue',
|
|
135
|
+
'BookedSpots',
|
|
136
|
+
'BookedRate',
|
|
137
|
+
'averageRate',
|
|
138
|
+
'projectedIMPS',
|
|
139
|
+
'projectedRTG',
|
|
140
|
+
'desiredCPM',
|
|
141
|
+
'desiredCPP',
|
|
142
|
+
'inventoryFillPercentageSameWeek',
|
|
143
|
+
'inventoryFillPercentageFinal',
|
|
144
|
+
'inventoryFillPercentageTillDate',
|
|
145
|
+
'dollarRateImpact',
|
|
146
|
+
'dollarIMPSImpact',
|
|
147
|
+
'IMPSImpact',
|
|
148
|
+
'dollarRTGImpact',
|
|
149
|
+
'RTGImpact',
|
|
150
|
+
'BookedRTG',
|
|
151
|
+
'BookedIMPS',
|
|
152
|
+
'AURTG',
|
|
153
|
+
'AURTG',
|
|
154
|
+
'PostedRating',
|
|
155
|
+
'PostedImpressions',
|
|
156
|
+
'NormalizedOrderedRating',
|
|
157
|
+
'NormalizedOrderedImpressions',
|
|
158
|
+
'NormalizedPostedRating',
|
|
159
|
+
'NormalizedPostedImpressions',
|
|
160
|
+
'BookedGRP',
|
|
161
|
+
'BookedIMPSRevTab',
|
|
162
|
+
'BookedCPP',
|
|
163
|
+
'BookedCPM',
|
|
164
|
+
'AUIMPS',
|
|
165
|
+
'bookedAmountValue',
|
|
166
|
+
'equivalizedBookedAmountValue',
|
|
167
|
+
'IMPS',
|
|
168
|
+
'udValue',
|
|
169
|
+
'odValue',
|
|
170
|
+
'ViolatedBookedValue',
|
|
171
|
+
'ViolatedBookedEURValue',
|
|
172
|
+
'ViolatingBookedEURValue',
|
|
173
|
+
'ViolatingBookedValue',
|
|
174
|
+
'Rebate',
|
|
175
|
+
'OtherAvailableSpotsTableWeeklyAUR',
|
|
176
|
+
'parentRowAnnaEstimatesRtg',
|
|
177
|
+
'parentRowPostedRtg',
|
|
178
|
+
'parentRowRollingAverageRtg',
|
|
179
|
+
'parentRowStationEstimatesRtg',
|
|
180
|
+
'parentRowAnnaEstimatesImps',
|
|
181
|
+
'parentRowPostedImps',
|
|
182
|
+
'parentRowRollingAverageImps',
|
|
183
|
+
'parentRowStationEstimatesImps',
|
|
184
|
+
'parentRowAnnaEstimatesShare',
|
|
185
|
+
'parentRowPostedShare',
|
|
186
|
+
'parentRowRollingAverageShare',
|
|
187
|
+
'parentRowAnnaEstimatesPutPer',
|
|
188
|
+
'parentRowPostedPutPer',
|
|
189
|
+
'parentRowRollingAveragePutPer',
|
|
190
|
+
'parentRowAnnaEstimatesPut',
|
|
191
|
+
'parentRowPostedPut',
|
|
192
|
+
'parentRowRollingAveragePut',
|
|
193
|
+
'ProjectedImpressions',
|
|
194
|
+
'ProjectedRtg',
|
|
195
|
+
];
|
|
196
|
+
const calendarArr = [
|
|
197
|
+
'period',
|
|
198
|
+
'AirDate',
|
|
199
|
+
'flightStartDate',
|
|
200
|
+
'flightEndDate',
|
|
201
|
+
'date',
|
|
202
|
+
'startDate',
|
|
203
|
+
'endDate',
|
|
204
|
+
'revisionStartDate',
|
|
205
|
+
'GeneratedOn',
|
|
206
|
+
'Week',
|
|
207
|
+
'timeoutDate',
|
|
208
|
+
'ViolatingSpotDate',
|
|
209
|
+
'ViolatedSpotDate',
|
|
210
|
+
];
|
|
211
|
+
const timeArr = [
|
|
212
|
+
'StartTimeForFilter',
|
|
213
|
+
'EndTimeForFilter',
|
|
214
|
+
'time',
|
|
215
|
+
'startTimeForFilter',
|
|
216
|
+
'endTimeForFilter',
|
|
217
|
+
'start_time_for_filter',
|
|
218
|
+
'end_time_for_filter',
|
|
219
|
+
'startEndTimeMulti',
|
|
220
|
+
'startEndTime',
|
|
221
|
+
'timeoutTime',
|
|
222
|
+
'OtherAvailableSpotsTableStartTime',
|
|
223
|
+
'OtherAvailableSpotsTableEndTime',
|
|
224
|
+
];
|
|
225
|
+
this.sliderSet = new Set(sliderArr);
|
|
226
|
+
this.calendarSet = new Set(calendarArr);
|
|
227
|
+
this.timeSet = new Set(timeArr);
|
|
228
|
+
}
|
|
229
|
+
returnMaxAndMinValue(data, key, isMin) {
|
|
230
|
+
data = data.filter((obj) => !['', '-', null].includes(obj[key]));
|
|
231
|
+
const values = data.map((x) => x[key]);
|
|
232
|
+
let valueToReturn = isMin ? min(values) : max(values);
|
|
233
|
+
return valueToReturn;
|
|
234
|
+
}
|
|
235
|
+
returnMinAndMaxDate(data, key) {
|
|
236
|
+
data = data.filter((obj) => !['', '-', null].includes(obj[key]));
|
|
237
|
+
let DateArr = data.map((obj) => dayjs(obj[key]));
|
|
238
|
+
let minDate = dayjs.min(DateArr);
|
|
239
|
+
let maxDate = dayjs.max(DateArr);
|
|
240
|
+
return [minDate, maxDate];
|
|
241
|
+
}
|
|
242
|
+
isTooltipActive(header, sortMap) {
|
|
243
|
+
let set = new Set(this.appliedFiltersArray);
|
|
244
|
+
let isSortMapForHeader0Active = sortMap.has(header[0]) && sortMap.get(header[0]) != SortTypeEnum.DEFAULT;
|
|
245
|
+
let isSortMapForHeader1Active = sortMap.has(header[1]) && sortMap.get(header[1]) != SortTypeEnum.DEFAULT;
|
|
246
|
+
if (header.length == 1) {
|
|
247
|
+
return (sortMap.size > 0 && isSortMapForHeader0Active) || set.has(header[0]);
|
|
248
|
+
}
|
|
249
|
+
return ((sortMap.size > 0 && sortMap.has(header[0]) && isSortMapForHeader0Active) ||
|
|
250
|
+
(sortMap.size > 0 && sortMap.has(header[1]) && isSortMapForHeader1Active) ||
|
|
251
|
+
set.has(header[0]) ||
|
|
252
|
+
set.has(header[1]));
|
|
253
|
+
}
|
|
254
|
+
clearColumnFilter() {
|
|
255
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
256
|
+
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
257
|
+
let appliedFilterSet = new Set(this.appliedFiltersArray);
|
|
258
|
+
appliedFilterSet.delete(this.selectedRadio);
|
|
259
|
+
this.appliedFiltersArray = [...appliedFilterSet];
|
|
260
|
+
}
|
|
261
|
+
if (this.annaSortService.columnSortState.has(this.selectedRadio)) {
|
|
262
|
+
this.annaSortService.columnSortState.delete(this.selectedRadio);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
setOptionValues(minValue, maxValue) {
|
|
266
|
+
return {
|
|
267
|
+
floor: minValue,
|
|
268
|
+
ceil: maxValue,
|
|
269
|
+
disabled: true,
|
|
270
|
+
translate: this.normalTranslateFunction,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
findUniqueDatesWithData(data) {
|
|
274
|
+
let uniqueDates = uniq(data.map((u) => u['date']));
|
|
275
|
+
let uniqueDatesInNgbDateFormat = [];
|
|
276
|
+
uniqueDates.forEach((date) => {
|
|
277
|
+
uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(dayjs(date, 'MM/DD/YY').format('MM/DD/YYYY')));
|
|
278
|
+
});
|
|
279
|
+
return uniqueDatesInNgbDateFormat;
|
|
280
|
+
}
|
|
281
|
+
reOrderAppliedFiltersArray(isHierarchialUserFiltered, date) {
|
|
282
|
+
let isFiltered = true;
|
|
283
|
+
isFiltered = this.checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date);
|
|
284
|
+
this.removeOrChangeLatestFilterIndex(isFiltered);
|
|
285
|
+
}
|
|
286
|
+
checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date) {
|
|
287
|
+
if (this.selectedRadio == 'user' && !this.tooltipMap.has('user')) {
|
|
288
|
+
isFiltered = cloneDeep(isHierarchialUserFiltered);
|
|
289
|
+
}
|
|
290
|
+
else if (this.selectedRadio == 'StartTimeForFilter' ||
|
|
291
|
+
this.selectedRadio == 'EndTimeForFilter' ||
|
|
292
|
+
this.selectedRadio == 'startTimeForFilter' ||
|
|
293
|
+
this.selectedRadio == 'endTimeForFilter' ||
|
|
294
|
+
this.selectedRadio == 'time' ||
|
|
295
|
+
this.selectedRadio == 'timeoutTime' ||
|
|
296
|
+
this.selectedRadio == 'OtherAvailableSpotsTableStartTime' ||
|
|
297
|
+
this.selectedRadio == 'OtherAvailableSpotsTableEndTime' ||
|
|
298
|
+
this.selectedRadio == 'start_time_for_filter' ||
|
|
299
|
+
this.selectedRadio == 'end_time_for_filter' ||
|
|
300
|
+
this.selectedRadio == 'startEndTimeMulti') {
|
|
301
|
+
isFiltered =
|
|
302
|
+
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
|
|
303
|
+
!this.includeZeroTime ||
|
|
304
|
+
!this.includeMultiTime;
|
|
305
|
+
}
|
|
306
|
+
else if (this.selectedRadio == 'startEndTime' || this.selectedRadio == 'TimeBand') {
|
|
307
|
+
isFiltered =
|
|
308
|
+
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
|
|
309
|
+
!this.includeZeroTime ||
|
|
310
|
+
!this.includeMultiTime;
|
|
311
|
+
}
|
|
312
|
+
else if (this.sliderSet.has(this.selectedRadio)) {
|
|
313
|
+
isFiltered =
|
|
314
|
+
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.sliderData);
|
|
315
|
+
if (this.selectedRadio == 'postedAdu' && this.subRadioButton == 'notRequired') {
|
|
316
|
+
isFiltered = true;
|
|
317
|
+
}
|
|
318
|
+
if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
319
|
+
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else if (this.selectedRadio == 'startDate' ||
|
|
323
|
+
this.selectedRadio == 'endDate' ||
|
|
324
|
+
this.selectedRadio == 'period' ||
|
|
325
|
+
this.selectedRadio == 'AirDate' ||
|
|
326
|
+
this.selectedRadio == 'timeoutDate' ||
|
|
327
|
+
this.selectedRadio === 'flightStartDate' ||
|
|
328
|
+
this.selectedRadio === 'flightEndDate' ||
|
|
329
|
+
this.selectedRadio == 'date' ||
|
|
330
|
+
this.selectedRadio == 'revisionStartDate' ||
|
|
331
|
+
this.selectedRadio == 'GeneratedOn' ||
|
|
332
|
+
this.selectedRadio == 'Week') {
|
|
333
|
+
isFiltered =
|
|
334
|
+
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.flightDateRange);
|
|
335
|
+
if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
336
|
+
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
let totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
|
|
341
|
+
let selectedOptionsCount = this.tooltipMap
|
|
342
|
+
.get(this.selectedRadio)
|
|
343
|
+
.filter((x) => !x.isHidden && x.isSelected).length;
|
|
344
|
+
isFiltered = selectedOptionsCount > 0 && selectedOptionsCount != totalOptionsCount ? true : false;
|
|
345
|
+
}
|
|
346
|
+
return isFiltered;
|
|
347
|
+
}
|
|
348
|
+
removeOrChangeLatestFilterIndex(isFiltered) {
|
|
349
|
+
let set = new Set(this.appliedFiltersArray);
|
|
350
|
+
if (isFiltered && !set.has(this.selectedRadio)) {
|
|
351
|
+
set.add(this.selectedRadio);
|
|
352
|
+
}
|
|
353
|
+
else if (isFiltered && set.has(this.selectedRadio)) {
|
|
354
|
+
set.delete(this.selectedRadio);
|
|
355
|
+
set.add(this.selectedRadio);
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
set.delete(this.selectedRadio);
|
|
359
|
+
}
|
|
360
|
+
this.appliedFiltersArray = [...set];
|
|
361
|
+
}
|
|
362
|
+
checkIfSortingIsAppliedThenSortTheData(originalData) {
|
|
363
|
+
if (!this.annaSortService?.columnSortState)
|
|
364
|
+
return originalData;
|
|
365
|
+
for (let [key, value] of this.annaSortService.columnSortState.entries()) {
|
|
366
|
+
if (value == 'ASC') {
|
|
367
|
+
originalData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(true, originalData, key));
|
|
368
|
+
}
|
|
369
|
+
else if (value == 'DESC') {
|
|
370
|
+
originalData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(false, originalData, key));
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return originalData;
|
|
374
|
+
}
|
|
375
|
+
filterData(originalData, keyToSkip, isLurCsrPage = false) {
|
|
376
|
+
let filteredData = [...originalData];
|
|
377
|
+
if (!isLurCsrPage) {
|
|
378
|
+
filteredData = this.checkIfSortingIsAppliedThenSortTheData(originalData);
|
|
379
|
+
}
|
|
380
|
+
this.tooltipSelectedMap.forEach((value, key) => {
|
|
381
|
+
if (key != keyToSkip && originalData.length > 0 && Object.keys(originalData[0]).includes(key)) {
|
|
382
|
+
if (this.sliderSet.has(key)) {
|
|
383
|
+
filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
|
|
384
|
+
}
|
|
385
|
+
else if (key === 'startDate' ||
|
|
386
|
+
key === 'endDate' ||
|
|
387
|
+
key === 'AirDate' ||
|
|
388
|
+
key === 'timeoutDate' ||
|
|
389
|
+
key === 'flightStartDate' ||
|
|
390
|
+
key === 'flightEndDate' ||
|
|
391
|
+
key == 'date' ||
|
|
392
|
+
key == 'Date' ||
|
|
393
|
+
key == 'revisionStartDate' ||
|
|
394
|
+
key == 'GeneratedOn' ||
|
|
395
|
+
key === 'Week' ||
|
|
396
|
+
key === 'ViolatedSpotDate' ||
|
|
397
|
+
key === 'ViolatingSpotDate') {
|
|
398
|
+
filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
|
|
399
|
+
}
|
|
400
|
+
else if (key === 'period') {
|
|
401
|
+
filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
|
|
402
|
+
}
|
|
403
|
+
else if (key === 'StartTimeForFilter' ||
|
|
404
|
+
key === 'EndTimeForFilter' ||
|
|
405
|
+
key == 'timeoutTime' ||
|
|
406
|
+
key === 'startTimeForFilter' ||
|
|
407
|
+
key === 'endTimeForFilter' ||
|
|
408
|
+
key === 'OtherAvailableSpotsTableStartTime' ||
|
|
409
|
+
key == 'OtherAvailableSpotsTableEndTime' ||
|
|
410
|
+
key === 'start_time_for_filter' ||
|
|
411
|
+
key === 'end_time_for_filter' ||
|
|
412
|
+
key == 'time') {
|
|
413
|
+
filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
|
|
414
|
+
}
|
|
415
|
+
else if (key === 'startEndTimeMulti' || key == 'startEndTime' || key === 'TimeBand') {
|
|
416
|
+
filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
|
|
417
|
+
}
|
|
418
|
+
else if (value.length > 0) {
|
|
419
|
+
filteredData = filteredData.filter((u) => value.includes(u[key]));
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
return filteredData;
|
|
424
|
+
}
|
|
425
|
+
returnOrdersInTheRange(order, range, key) {
|
|
426
|
+
let isDateBetweenTheSelectedRange = dayjs(order[key]).isBetween(range.minSelectedDate, range.maxSelectedDate);
|
|
427
|
+
let isDateSameAsTheMinSelectedDate = dayjs(order[key]).isSame(range.minSelectedDate);
|
|
428
|
+
let isDateSameAsTheMaxSelectedDate = dayjs(order[key]).isSame(range.maxSelectedDate);
|
|
429
|
+
return isDateBetweenTheSelectedRange || isDateSameAsTheMinSelectedDate || isDateSameAsTheMaxSelectedDate;
|
|
430
|
+
}
|
|
431
|
+
returnDataForTimeRange(obj, selectedData) {
|
|
432
|
+
let format = 'HH:mm:ss';
|
|
433
|
+
let selectedStartDate = dayjs(selectedData.startTime, format);
|
|
434
|
+
let selectedEndDate = dayjs(selectedData.endTime, format);
|
|
435
|
+
let startTime = dayjs(obj.startTime, format);
|
|
436
|
+
let endTime = dayjs(obj.endTime, format);
|
|
437
|
+
let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedStartDate);
|
|
438
|
+
let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedStartDate, selectedEndDate);
|
|
439
|
+
let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedEndDate);
|
|
440
|
+
let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedStartDate, selectedEndDate);
|
|
441
|
+
return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
442
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
|
|
443
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
444
|
+
(isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
|
|
445
|
+
}
|
|
446
|
+
returnDataForFromAndToTimeRange(obj, selectedData, key) {
|
|
447
|
+
let format = 'MM/DD/YYYY HH:mm:ss';
|
|
448
|
+
let selectedFromTime = dayjs('01/01/2001 ' + selectedData.fromTime, format);
|
|
449
|
+
let selectedToTime = dayjs('01/01/2001 ' + selectedData.toTime, format);
|
|
450
|
+
let objTime = obj[key];
|
|
451
|
+
if (['', '-', null].includes(objTime)) {
|
|
452
|
+
return false;
|
|
453
|
+
}
|
|
454
|
+
if (selectedData.includeMulti && obj[key] == '<multi>') {
|
|
455
|
+
return true;
|
|
456
|
+
}
|
|
457
|
+
if (!selectedData.includeMulti && obj[key] == '<multi>') {
|
|
458
|
+
return false;
|
|
459
|
+
}
|
|
460
|
+
if (selectedData.includeZero && obj[key] == '0') {
|
|
461
|
+
return true;
|
|
462
|
+
}
|
|
463
|
+
if (!selectedData.includeZero && obj[key] == '0') {
|
|
464
|
+
return false;
|
|
465
|
+
}
|
|
466
|
+
if (!selectedData.includeTimeRange) {
|
|
467
|
+
return false;
|
|
468
|
+
}
|
|
469
|
+
let dayjsTime = dayjs('01/01/2001 ' + objTime, format);
|
|
470
|
+
let isObjTimeSameAsSelectedFromTime = dayjsTime.isSame(selectedFromTime);
|
|
471
|
+
let isObjTimeSameAsSelectedToTime = dayjsTime.isSame(selectedToTime);
|
|
472
|
+
let isObjTimeBetweenSelectedFromTimeAndToTime = dayjsTime.isBetween(selectedFromTime, selectedToTime);
|
|
473
|
+
return (isObjTimeSameAsSelectedFromTime ||
|
|
474
|
+
isObjTimeSameAsSelectedToTime ||
|
|
475
|
+
isObjTimeBetweenSelectedFromTimeAndToTime);
|
|
476
|
+
}
|
|
477
|
+
returnDataForStartAndEndTimeRange(obj, selectedData, key) {
|
|
478
|
+
let format = 'MM/DD/YYYY HH:mm:ss';
|
|
479
|
+
let selectedFromTime = dayjs('01/01/2001 ' + selectedData.fromTime, format);
|
|
480
|
+
let selectedToTime = dayjs('01/01/2001 ' + selectedData.toTime, format);
|
|
481
|
+
if (selectedData.includeMulti && obj[key][0] == '<multi>') {
|
|
482
|
+
return true;
|
|
483
|
+
}
|
|
484
|
+
if (!selectedData.includeMulti && obj[key][0] == '<multi>') {
|
|
485
|
+
return false;
|
|
486
|
+
}
|
|
487
|
+
if (selectedData.includeZero && obj[key][0] == '0') {
|
|
488
|
+
return true;
|
|
489
|
+
}
|
|
490
|
+
if (!selectedData.includeZero && obj[key][0] == '0') {
|
|
491
|
+
return false;
|
|
492
|
+
}
|
|
493
|
+
if (!selectedData.includeTimeRange) {
|
|
494
|
+
return false;
|
|
495
|
+
}
|
|
496
|
+
let startTime = dayjs('01/01/2001 ' + obj[key][1], format);
|
|
497
|
+
let endTime = dayjs('01/01/2001 ' + obj[key][2], format);
|
|
498
|
+
let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedFromTime);
|
|
499
|
+
let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedFromTime, selectedToTime);
|
|
500
|
+
let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedToTime);
|
|
501
|
+
let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedFromTime, selectedToTime);
|
|
502
|
+
return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
503
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
|
|
504
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
505
|
+
(isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
|
|
506
|
+
}
|
|
507
|
+
getDataInTheDateRange(obj, value, key) {
|
|
508
|
+
let parsingFormat;
|
|
509
|
+
if (key === 'period') {
|
|
510
|
+
parsingFormat = 'YYYY-MM-DD';
|
|
511
|
+
let dayjsStartDate = dayjs(obj.startDate);
|
|
512
|
+
let dayjsEndDate = dayjs(obj.endDate);
|
|
513
|
+
let startDateIsBetweenSelDate = dayjsStartDate.isBetween(value.fromDate, value.toDate);
|
|
514
|
+
let endDateIsBetweenSelDate = dayjsEndDate.isBetween(value.fromDate, value.toDate);
|
|
515
|
+
let startDateIsSameAsSelStartDate = value.fromDate.isSame(dayjsStartDate);
|
|
516
|
+
let endDateIsSameAsSelEndDate = value.toDate.isSame(dayjsEndDate);
|
|
517
|
+
return ((startDateIsBetweenSelDate || startDateIsSameAsSelStartDate) &&
|
|
518
|
+
(endDateIsBetweenSelDate || endDateIsSameAsSelEndDate));
|
|
519
|
+
}
|
|
520
|
+
else if (key === 'AirDate' ||
|
|
521
|
+
key === 'flightStartDate' ||
|
|
522
|
+
key === 'flightEndDate' ||
|
|
523
|
+
key === 'Week' ||
|
|
524
|
+
key === 'timeoutDate') {
|
|
525
|
+
parsingFormat = 'MM/DD/YYYY';
|
|
526
|
+
let dateIsBetweenSelDate = dayjs(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
|
|
527
|
+
let dateIsSameAsSelStartDate = dayjs(obj[key], parsingFormat).isSame(value.minSelectedDate);
|
|
528
|
+
let dateIsSameAsSelEndDate = dayjs(obj[key], parsingFormat).isSame(value.maxSelectedDate);
|
|
529
|
+
return dateIsBetweenSelDate || dateIsSameAsSelStartDate || dateIsSameAsSelEndDate;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
initializeTimeFilterData(clonedData, key = 'startEndTime') {
|
|
533
|
+
let startTimeArr = map(clonedData, 'startTime');
|
|
534
|
+
let endTimeArr = map(clonedData, 'endTime');
|
|
535
|
+
startTimeArr.sort((a, b) => {
|
|
536
|
+
return this.dateTimeFormatService.sortByTimeAscending(a, b);
|
|
537
|
+
});
|
|
538
|
+
endTimeArr.sort((a, b) => {
|
|
539
|
+
return this.dateTimeFormatService.sortByTimeDescending(a, b);
|
|
540
|
+
});
|
|
541
|
+
let initialStartEndTime = {
|
|
542
|
+
startTime: startTimeArr[0],
|
|
543
|
+
endTime: endTimeArr[0],
|
|
544
|
+
};
|
|
545
|
+
this.initialValueMap.set(key, initialStartEndTime);
|
|
546
|
+
}
|
|
547
|
+
returnColumnFilterStatus(data, headerName) {
|
|
548
|
+
if (headerName == 'startEndTime') {
|
|
549
|
+
let time = data.map((u) => u[headerName][0]);
|
|
550
|
+
let uniqTime = uniq(time);
|
|
551
|
+
return uniqTime.length == 0;
|
|
552
|
+
}
|
|
553
|
+
return uniq(data.map((u) => u[headerName])).length > 1 ? false : true;
|
|
554
|
+
}
|
|
555
|
+
getFilterOptionsData(data, clonedData, key) {
|
|
556
|
+
let appliedFilterSet = new Set(this.appliedFiltersArray);
|
|
557
|
+
key = key ? key : this.selectedRadio;
|
|
558
|
+
if (appliedFilterSet.has(key)) {
|
|
559
|
+
return this.filterData(clonedData, key);
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
return data;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
reOrderAppliedFiltersState(clonedData, value) {
|
|
566
|
+
let isFiltered = true;
|
|
567
|
+
isFiltered = this.checkIfFilterIsApplied(clonedData, value);
|
|
568
|
+
this.removeOrChangeLatestFilterIndex(isFiltered);
|
|
569
|
+
return isFiltered;
|
|
570
|
+
}
|
|
571
|
+
checkIfFilterIsApplied(clonedData, value) {
|
|
572
|
+
let initialValueOfColumn = sortBy(clonedData.map((item) => item[this.selectedRadio]));
|
|
573
|
+
let currentValueOfColumn = sortBy(this.applyFilter(clonedData, value).map((item) => item[this.selectedRadio]));
|
|
574
|
+
return !isEqual(initialValueOfColumn, currentValueOfColumn);
|
|
575
|
+
}
|
|
576
|
+
applyFilter(data, value) {
|
|
577
|
+
let filteredData = data;
|
|
578
|
+
let key = this.selectedRadio;
|
|
579
|
+
if (this.sliderSet.has(key)) {
|
|
580
|
+
filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
|
|
581
|
+
}
|
|
582
|
+
else if (key === 'startDate' ||
|
|
583
|
+
key === 'endDate' ||
|
|
584
|
+
key === 'AirDate' ||
|
|
585
|
+
key === 'timeoutDate' ||
|
|
586
|
+
key === 'flightStartDate' ||
|
|
587
|
+
key === 'flightEndDate' ||
|
|
588
|
+
key == 'date' ||
|
|
589
|
+
key == 'Date' ||
|
|
590
|
+
key == 'revisionStartDate' ||
|
|
591
|
+
key == 'GeneratedOn' ||
|
|
592
|
+
key === 'Week' ||
|
|
593
|
+
key === 'ViolatedSpotDate' ||
|
|
594
|
+
key === 'ViolatingSpotDate') {
|
|
595
|
+
filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
|
|
596
|
+
}
|
|
597
|
+
else if (key === 'period') {
|
|
598
|
+
filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
|
|
599
|
+
}
|
|
600
|
+
else if (key === 'StartTimeForFilter' ||
|
|
601
|
+
key === 'EndTimeForFilter' ||
|
|
602
|
+
key == 'timeoutTime' ||
|
|
603
|
+
key === 'startTimeForFilter' ||
|
|
604
|
+
key === 'endTimeForFilter' ||
|
|
605
|
+
key === 'start_time_for_filter' ||
|
|
606
|
+
key === 'end_time_for_filter' ||
|
|
607
|
+
key == 'time' ||
|
|
608
|
+
key == 'OtherAvailableSpotsTableStartTime' ||
|
|
609
|
+
key == 'OtherAvailableSpotsTableEndTime') {
|
|
610
|
+
filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
|
|
611
|
+
}
|
|
612
|
+
else if (key === 'startEndTimeMulti' || key == 'startEndTime' || key === 'TimeBand') {
|
|
613
|
+
filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
|
|
614
|
+
}
|
|
615
|
+
else if (value.length > 0) {
|
|
616
|
+
filteredData = filteredData.filter((u) => value.includes(u[key]));
|
|
617
|
+
}
|
|
618
|
+
return filteredData;
|
|
619
|
+
}
|
|
620
|
+
isObjectInTheRange(obj, value, key) {
|
|
621
|
+
let objVal = obj[key];
|
|
622
|
+
let dayjsDate = dayjs(objVal);
|
|
623
|
+
if (typeof value.fromDate === 'string' && typeof value.toDate === 'string') {
|
|
624
|
+
value.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.fromDate, 'DD/MM/YYYY')));
|
|
625
|
+
value.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.toDate, 'DD/MM/YYYY')));
|
|
626
|
+
}
|
|
627
|
+
let isDateSameAsStartOfTheRange = value.fromDate.isSame(objVal);
|
|
628
|
+
let isDateSameAsEndOfTheRange = value.toDate.isSame(objVal);
|
|
629
|
+
let isDateBetweenTheStartAndEndOfRange = dayjsDate.isBetween(value.fromDate, value.toDate);
|
|
630
|
+
return isDateSameAsStartOfTheRange || isDateSameAsEndOfTheRange || isDateBetweenTheStartAndEndOfRange;
|
|
631
|
+
}
|
|
632
|
+
updateStateOfTheCurrentFilterTab(sortMap) {
|
|
633
|
+
let activeKey = this.selectedRadio;
|
|
634
|
+
let keyArr = [];
|
|
635
|
+
Object.keys(this.isFilterSortActive).forEach((key) => {
|
|
636
|
+
if (key.includes(activeKey)) {
|
|
637
|
+
keyArr = key.split(',');
|
|
638
|
+
this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
|
|
639
|
+
}
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
updateStateOfAllTheKeys(sortMap) {
|
|
643
|
+
Object.keys(this.isFilterSortActive).forEach((key) => {
|
|
644
|
+
let keyArr = key.split(',');
|
|
645
|
+
this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
incrementHour(value) {
|
|
649
|
+
if (value == '') {
|
|
650
|
+
value = 1;
|
|
651
|
+
}
|
|
652
|
+
else if (parseInt(value) < 12) {
|
|
653
|
+
value = parseInt(value) + 1;
|
|
654
|
+
}
|
|
655
|
+
else {
|
|
656
|
+
value = 1;
|
|
657
|
+
}
|
|
658
|
+
return value;
|
|
659
|
+
}
|
|
660
|
+
decrementHour(value) {
|
|
661
|
+
if (value == '') {
|
|
662
|
+
value = 12;
|
|
663
|
+
}
|
|
664
|
+
else if (parseInt(value) > 1) {
|
|
665
|
+
value = parseInt(value) - 1;
|
|
666
|
+
}
|
|
667
|
+
else {
|
|
668
|
+
value = 12;
|
|
669
|
+
}
|
|
670
|
+
return value;
|
|
671
|
+
}
|
|
672
|
+
incrementMinute(value) {
|
|
673
|
+
// increment to nearest proper interval(15,30,45)
|
|
674
|
+
let min = parseInt(value);
|
|
675
|
+
if (min <= 14) {
|
|
676
|
+
value = '15';
|
|
677
|
+
}
|
|
678
|
+
else if (min >= 15 && min <= 29) {
|
|
679
|
+
value = '30';
|
|
680
|
+
}
|
|
681
|
+
else if (min >= 30 && min <= 44) {
|
|
682
|
+
value = '45';
|
|
683
|
+
}
|
|
684
|
+
else if (min >= 45) {
|
|
685
|
+
value = '00';
|
|
686
|
+
}
|
|
687
|
+
return value;
|
|
688
|
+
}
|
|
689
|
+
decrementMinute(value) {
|
|
690
|
+
let min = parseInt(value);
|
|
691
|
+
if (min > 0 && min <= 15) {
|
|
692
|
+
value = '00';
|
|
693
|
+
}
|
|
694
|
+
else if (min >= 16 && min <= 30) {
|
|
695
|
+
value = '15';
|
|
696
|
+
}
|
|
697
|
+
else if (min >= 31 && min <= 45) {
|
|
698
|
+
value = '30';
|
|
699
|
+
}
|
|
700
|
+
else if (min > 45 || min == 0) {
|
|
701
|
+
value = '45';
|
|
702
|
+
}
|
|
703
|
+
return value;
|
|
704
|
+
}
|
|
705
|
+
//========================================Checkbox method=============================================================//
|
|
706
|
+
disableActiveFilterClearButton() {
|
|
707
|
+
let selectedFilterSet = new Set(this.appliedFiltersArray);
|
|
708
|
+
let currentColumnSortFilter = this.getColumnSortStateForSelectedRadio();
|
|
709
|
+
let isSortPresent = this.annaSortService.columnSortState &&
|
|
710
|
+
this.annaSortService.columnSortState.size > 0 &&
|
|
711
|
+
currentColumnSortFilter != SortTypeEnum.DEFAULT;
|
|
712
|
+
return !(selectedFilterSet.has(this.selectedRadio) || isSortPresent);
|
|
713
|
+
}
|
|
714
|
+
getColumnSortStateForSelectedRadio() {
|
|
715
|
+
let currentColumnSortFilter = this.annaSortService.columnSortState &&
|
|
716
|
+
this.annaSortService.columnSortState.has(this.selectedRadio) &&
|
|
717
|
+
this.annaSortService.columnSortState.get(this.selectedRadio);
|
|
718
|
+
currentColumnSortFilter = currentColumnSortFilter ? currentColumnSortFilter : SortTypeEnum.DEFAULT;
|
|
719
|
+
return currentColumnSortFilter;
|
|
720
|
+
}
|
|
721
|
+
createListForCheckboxFilter(header, optionData) {
|
|
722
|
+
let tooltipOptions = this.getTooltipModelFromOptionData(optionData, header);
|
|
723
|
+
this.selectUnselectListCheckbox(tooltipOptions, header);
|
|
724
|
+
this.formatNullOptionToSpecifiedString(tooltipOptions, '-');
|
|
725
|
+
return tooltipOptions;
|
|
726
|
+
}
|
|
727
|
+
getTooltipModelFromOptionData(optionData, header) {
|
|
728
|
+
let uniqOptionData = uniq(optionData.map((item) => item[header]));
|
|
729
|
+
return uniqOptionData.map((item, index) => new TooltipModel(item, index + 1));
|
|
730
|
+
}
|
|
731
|
+
selectUnselectListCheckbox(tooltipOptions, header) {
|
|
732
|
+
if (this.tooltipSelectedMap.has(header)) {
|
|
733
|
+
let selectedValueSet = new Set(this.tooltipSelectedMap.get(header));
|
|
734
|
+
tooltipOptions.forEach((item) => (item.isSelected = selectedValueSet.has(item.value) ? true : false));
|
|
735
|
+
}
|
|
736
|
+
else {
|
|
737
|
+
tooltipOptions.forEach((item) => (item.isSelected = true));
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
formatNullOptionToSpecifiedString(tooltipOptions, formattedString) {
|
|
741
|
+
let index = tooltipOptions.findIndex((item) => item.value == null);
|
|
742
|
+
if (index != -1) {
|
|
743
|
+
tooltipOptions[index].label = formattedString;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
getClonedTooltipAndTooltipOption(tooltipOptions, sortByString) {
|
|
747
|
+
let [selectedItems, unselectedItems] = this.getSelectedAndUnselectedItems(tooltipOptions);
|
|
748
|
+
let sortedSelectedItems = sortBy(selectedItems, sortByString);
|
|
749
|
+
let sortedUnselectedItems = sortBy(unselectedItems, sortByString);
|
|
750
|
+
let clonedTooltipOptions = [...sortedSelectedItems, ...sortedUnselectedItems];
|
|
751
|
+
let updatedTooltipOptions = cloneDeep(clonedTooltipOptions);
|
|
752
|
+
return [clonedTooltipOptions, updatedTooltipOptions, selectedItems, unselectedItems];
|
|
753
|
+
}
|
|
754
|
+
getHeightOfCheckboxTooltipFilter(dataLength, margin) {
|
|
755
|
+
return dataLength > 6 ? 200 : 26.03 * dataLength + margin * dataLength + margin;
|
|
756
|
+
}
|
|
757
|
+
unCheckAllCheckbox(tooltipOptions, clonedTooltipOptions) {
|
|
758
|
+
tooltipOptions.forEach((item) => {
|
|
759
|
+
item.isSelected = false;
|
|
760
|
+
let index = clonedTooltipOptions.findIndex((opt) => opt.id == item.id);
|
|
761
|
+
clonedTooltipOptions[index].isSelected = false;
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
selectAllCheckbox(tooltipOptions, clonedTooltipOptions) {
|
|
765
|
+
tooltipOptions.forEach((item) => {
|
|
766
|
+
item.isSelected = true;
|
|
767
|
+
let index = clonedTooltipOptions.findIndex((opt) => opt.id == item.id);
|
|
768
|
+
clonedTooltipOptions[index].isSelected = true;
|
|
769
|
+
});
|
|
770
|
+
}
|
|
771
|
+
selectUnselectCheckbox(data, clonedTooltipOptions) {
|
|
772
|
+
data.isSelected = !data.isSelected;
|
|
773
|
+
let index = clonedTooltipOptions.findIndex((item) => item.id == data.id);
|
|
774
|
+
clonedTooltipOptions[index].isSelected = data.isSelected;
|
|
775
|
+
}
|
|
776
|
+
getSelectedAndUnselectedItems(tooltipOptions) {
|
|
777
|
+
let selectedItems = tooltipOptions.filter((item) => item.isSelected);
|
|
778
|
+
let unselectedItems = tooltipOptions.filter((item) => !item.isSelected);
|
|
779
|
+
return [selectedItems, unselectedItems];
|
|
780
|
+
}
|
|
781
|
+
getCheckboxPreviousSelectedValue(clonedTableData) {
|
|
782
|
+
let previousSelectedValue = [];
|
|
783
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
784
|
+
previousSelectedValue = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
785
|
+
if (!this.initialValueMap.has(this.selectedRadio)) {
|
|
786
|
+
let initialValue = sortBy(uniq(clonedTableData.map((item) => item[this.selectedRadio])));
|
|
787
|
+
this.initialValueMap.set(this.selectedRadio, initialValue);
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
else if (this.initialValueMap.has(this.selectedRadio)) {
|
|
791
|
+
previousSelectedValue = this.initialValueMap.get(this.selectedRadio);
|
|
792
|
+
}
|
|
793
|
+
else {
|
|
794
|
+
previousSelectedValue = sortBy(uniq(clonedTableData.map((item) => item[this.selectedRadio])));
|
|
795
|
+
this.initialValueMap.set(this.selectedRadio, previousSelectedValue);
|
|
796
|
+
}
|
|
797
|
+
return previousSelectedValue;
|
|
798
|
+
}
|
|
799
|
+
getCheckboxCurrentSelectedValue(searchedString, tooltipOptions) {
|
|
800
|
+
let currentSelectedValue = [];
|
|
801
|
+
if (tooltipOptions) {
|
|
802
|
+
currentSelectedValue = sortBy(tooltipOptions.filter((item) => item.isSelected).map((item) => item.value));
|
|
803
|
+
if (!searchedString &&
|
|
804
|
+
currentSelectedValue.length == tooltipOptions.length &&
|
|
805
|
+
this.initialValueMap.has(this.selectedRadio)) {
|
|
806
|
+
currentSelectedValue = this.initialValueMap.get(this.selectedRadio);
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
let blankIndex = currentSelectedValue.findIndex((item) => item == null);
|
|
810
|
+
if (blankIndex != -1) {
|
|
811
|
+
currentSelectedValue = sortBy(currentSelectedValue);
|
|
812
|
+
}
|
|
813
|
+
return currentSelectedValue;
|
|
814
|
+
}
|
|
815
|
+
checkIfSortingChanged(tempSortOrder) {
|
|
816
|
+
let currentColumnSortFilter = this.getColumnSortStateForSelectedRadio();
|
|
817
|
+
let isSortChanged = tempSortOrder != null && tempSortOrder != currentColumnSortFilter;
|
|
818
|
+
return isSortChanged;
|
|
819
|
+
}
|
|
820
|
+
getFilteredOptionAsBoldString(str, clonedTooltipOptions) {
|
|
821
|
+
let tooltipOptions = cloneDeep(clonedTooltipOptions.filter((item) => item.label.toString().toLowerCase().includes(str.toLowerCase())));
|
|
822
|
+
tooltipOptions.forEach((element) => {
|
|
823
|
+
element.label = this.boldString(element.label, str);
|
|
824
|
+
});
|
|
825
|
+
return tooltipOptions;
|
|
826
|
+
}
|
|
827
|
+
boldString(str, find) {
|
|
828
|
+
let indexes = this.getIndicesOf(find, str, false);
|
|
829
|
+
indexes.forEach((item, index) => {
|
|
830
|
+
let startIndex = item + index * 7; //Multiplying by 7 as there are 7char: <b></b>
|
|
831
|
+
let endIndex = startIndex + find.length;
|
|
832
|
+
let strToBeReplaced = str.substring(startIndex, endIndex);
|
|
833
|
+
str = str.replace(strToBeReplaced, '<b>' + strToBeReplaced + '</b>');
|
|
834
|
+
});
|
|
835
|
+
return str;
|
|
836
|
+
}
|
|
837
|
+
getIndicesOf(searchStr, str, caseSensitive) {
|
|
838
|
+
var searchStrLen = searchStr.length;
|
|
839
|
+
if (searchStrLen == 0) {
|
|
840
|
+
return [];
|
|
841
|
+
}
|
|
842
|
+
var startIndex = 0, index, indices = [];
|
|
843
|
+
if (!caseSensitive) {
|
|
844
|
+
str = str.toLowerCase();
|
|
845
|
+
searchStr = searchStr.toLowerCase();
|
|
846
|
+
}
|
|
847
|
+
while ((index = str.indexOf(searchStr, startIndex)) > -1) {
|
|
848
|
+
indices.push(index);
|
|
849
|
+
startIndex = index + searchStrLen;
|
|
850
|
+
}
|
|
851
|
+
return indices;
|
|
852
|
+
}
|
|
853
|
+
disableAllBtnsWhenThereAreNoFilteredResults() {
|
|
854
|
+
// [selectedCheckboxOptionsCount, disableCheckboxApply, disableClearAll, disableSelectAll];
|
|
855
|
+
return [0, true, true, true];
|
|
856
|
+
}
|
|
857
|
+
//============================================================Calendar filter===========================================================//
|
|
858
|
+
createRangeForTheDateFilter(optionData) {
|
|
859
|
+
let minMaxDate;
|
|
860
|
+
//When you want to use startDate and endDate combined as single column then use Period.
|
|
861
|
+
if (this.selectedRadio == 'period' ||
|
|
862
|
+
this.selectedRadio == 'buyerFlightDates' ||
|
|
863
|
+
this.selectedRadio == 'trafficFlightDates') {
|
|
864
|
+
minMaxDate = this.createStartEndDateRange(optionData);
|
|
865
|
+
}
|
|
866
|
+
else {
|
|
867
|
+
minMaxDate = this.returnMinAndMaxDate(optionData, this.selectedRadio);
|
|
868
|
+
}
|
|
869
|
+
return minMaxDate;
|
|
870
|
+
}
|
|
871
|
+
createStartEndDateRange(optionData) {
|
|
872
|
+
let minStartDate = this.returnMinAndMaxDate(optionData, 'startDate');
|
|
873
|
+
let maxEndDate = this.returnMinAndMaxDate(optionData, 'endDate');
|
|
874
|
+
return [minStartDate[0], maxEndDate[1]];
|
|
875
|
+
}
|
|
876
|
+
getMinAndMaxDateRangeForCalendar(minMaxDate, parsingFormat) {
|
|
877
|
+
let calendarMinEnabledDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
|
|
878
|
+
let calendarMaxEnabledDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
|
|
879
|
+
return [calendarMinEnabledDate, calendarMaxEnabledDate];
|
|
880
|
+
}
|
|
881
|
+
getSelectedDateForCalendar(minMaxDate, parsingFormat, minDate, maxDate) {
|
|
882
|
+
let selectedMinDate;
|
|
883
|
+
let selectedMaxDate;
|
|
884
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
885
|
+
let selectedDateObj = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
886
|
+
if (selectedDateObj.fromDate.isAfter(minMaxDate[0])) {
|
|
887
|
+
selectedMinDate = this.dateTimeFormatService.convertToNgbDate(selectedDateObj.fromDate, parsingFormat);
|
|
888
|
+
}
|
|
889
|
+
else {
|
|
890
|
+
selectedMinDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
|
|
891
|
+
}
|
|
892
|
+
if (selectedDateObj.toDate.isAfter(minMaxDate[1])) {
|
|
893
|
+
selectedMaxDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
|
|
894
|
+
}
|
|
895
|
+
else {
|
|
896
|
+
selectedMaxDate = this.dateTimeFormatService.convertToNgbDate(selectedDateObj.toDate, parsingFormat);
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
else {
|
|
900
|
+
selectedMinDate = cloneDeep(minDate);
|
|
901
|
+
selectedMaxDate = cloneDeep(maxDate);
|
|
902
|
+
}
|
|
903
|
+
return [selectedMinDate, selectedMaxDate];
|
|
904
|
+
}
|
|
905
|
+
getPreviousSelectedDatesForCalendar(optionData) {
|
|
906
|
+
let previousSelectedDate = { fromDate: null, toDate: null };
|
|
907
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
908
|
+
previousSelectedDate = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
909
|
+
if (!this.initialValueMap.has(this.selectedRadio)) {
|
|
910
|
+
this.setInitialValueMapForDateFilter(optionData);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
else if (this.initialValueMap.has(this.selectedRadio)) {
|
|
914
|
+
previousSelectedDate = this.initialValueMap.get(this.selectedRadio);
|
|
915
|
+
}
|
|
916
|
+
else {
|
|
917
|
+
this.setInitialValueMapForDateFilter(optionData);
|
|
918
|
+
previousSelectedDate = this.initialValueMap.get(this.selectedRadio);
|
|
919
|
+
}
|
|
920
|
+
return previousSelectedDate;
|
|
921
|
+
}
|
|
922
|
+
setInitialValueMapForDateFilter(optionData) {
|
|
923
|
+
let minMaxDate = this.createRangeForTheDateFilter(optionData);
|
|
924
|
+
let selectedDate = { fromDate: minMaxDate[0], toDate: minMaxDate[1] };
|
|
925
|
+
this.initialValueMap.set(this.selectedRadio, selectedDate);
|
|
926
|
+
}
|
|
927
|
+
getCurrentSelectedDatesForCalendar(currentSelectedDate, minDate, maxDate) {
|
|
928
|
+
let fromDate = {
|
|
929
|
+
year: currentSelectedDate.fromDate.year,
|
|
930
|
+
month: currentSelectedDate.fromDate.month,
|
|
931
|
+
day: currentSelectedDate.fromDate.day,
|
|
932
|
+
};
|
|
933
|
+
let toDate = {
|
|
934
|
+
year: currentSelectedDate.toDate.year,
|
|
935
|
+
month: currentSelectedDate.toDate.month,
|
|
936
|
+
day: currentSelectedDate.toDate.day,
|
|
937
|
+
};
|
|
938
|
+
if (isEqual(minDate, fromDate) && isEqual(maxDate, toDate) && this.initialValueMap.has(this.selectedRadio)) {
|
|
939
|
+
currentSelectedDate = this.initialValueMap.get(this.selectedRadio);
|
|
940
|
+
}
|
|
941
|
+
else {
|
|
942
|
+
currentSelectedDate.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(currentSelectedDate.fromDate));
|
|
943
|
+
currentSelectedDate.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(currentSelectedDate.toDate));
|
|
944
|
+
}
|
|
945
|
+
return currentSelectedDate;
|
|
946
|
+
}
|
|
947
|
+
//==================================================================SLIDER===========================================================//
|
|
948
|
+
getSliderTranslateFuncVal(header, currencySet) {
|
|
949
|
+
let translateFunc;
|
|
950
|
+
if (currencySet.has(header)) {
|
|
951
|
+
translateFunc = 'currency';
|
|
952
|
+
}
|
|
953
|
+
else if (header == 'postedAudPercent' || header == 'parentRowShares' || header == 'parentRowPutPercent') {
|
|
954
|
+
translateFunc = 'percent';
|
|
955
|
+
}
|
|
956
|
+
else {
|
|
957
|
+
translateFunc = 'normal';
|
|
958
|
+
}
|
|
959
|
+
return translateFunc;
|
|
960
|
+
}
|
|
961
|
+
getSliderOptions(optionsData, translateFunc, header) {
|
|
962
|
+
let minValue = this.returnMaxAndMinValue(optionsData, header, true);
|
|
963
|
+
let maxValue = this.returnMaxAndMinValue(optionsData, header, false);
|
|
964
|
+
let obj = this.setOptionValues(minValue, maxValue);
|
|
965
|
+
if (translateFunc === 'normal') {
|
|
966
|
+
obj.translate = this.normalTranslateFunction;
|
|
967
|
+
}
|
|
968
|
+
else if (translateFunc === 'percent') {
|
|
969
|
+
obj.translate = this.percentTranslateFunction;
|
|
970
|
+
}
|
|
971
|
+
else if (translateFunc === 'currency') {
|
|
972
|
+
obj.translate = this.currencyTranslateFunction;
|
|
973
|
+
}
|
|
974
|
+
return obj;
|
|
975
|
+
}
|
|
976
|
+
setSelectedRangeForSlider(header, options) {
|
|
977
|
+
let sliderMinValue;
|
|
978
|
+
let sliderMaxValue;
|
|
979
|
+
if (this.tooltipSelectedMap.has(header)) {
|
|
980
|
+
let selectedObj = this.tooltipSelectedMap.get(header);
|
|
981
|
+
sliderMinValue = selectedObj.min < options.floor ? options.floor : selectedObj.min;
|
|
982
|
+
sliderMaxValue = selectedObj.max < options.ceil ? selectedObj.max : options.ceil;
|
|
983
|
+
}
|
|
984
|
+
else {
|
|
985
|
+
sliderMinValue = options.floor;
|
|
986
|
+
sliderMaxValue = options.ceil;
|
|
987
|
+
}
|
|
988
|
+
return [sliderMinValue, sliderMaxValue];
|
|
989
|
+
}
|
|
990
|
+
isValueInRange(options, val) {
|
|
991
|
+
return options.floor <= val && val <= options.ceil;
|
|
992
|
+
}
|
|
993
|
+
getPreviousSelectedValueForSlider(clonedData) {
|
|
994
|
+
let previousSliderData = { min: '', max: '' };
|
|
995
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
996
|
+
previousSliderData = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
997
|
+
if (!this.initialValueMap.has(this.selectedRadio)) {
|
|
998
|
+
this.setInitialValueMapForSliderFilter(clonedData);
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
else if (this.initialValueMap.has(this.selectedRadio)) {
|
|
1002
|
+
previousSliderData = this.initialValueMap.get(this.selectedRadio);
|
|
1003
|
+
}
|
|
1004
|
+
else {
|
|
1005
|
+
this.setInitialValueMapForSliderFilter(clonedData);
|
|
1006
|
+
previousSliderData = this.initialValueMap.get(this.selectedRadio);
|
|
1007
|
+
}
|
|
1008
|
+
return previousSliderData;
|
|
1009
|
+
}
|
|
1010
|
+
setInitialValueMapForSliderFilter(clonedData) {
|
|
1011
|
+
let minValue = this.returnMaxAndMinValue(clonedData, this.selectedRadio, true);
|
|
1012
|
+
let maxValue = this.returnMaxAndMinValue(clonedData, this.selectedRadio, false);
|
|
1013
|
+
let sliderData = { min: minValue, max: maxValue };
|
|
1014
|
+
this.initialValueMap.set(this.selectedRadio, sliderData);
|
|
1015
|
+
}
|
|
1016
|
+
getCurrentSelectedValueForSlider(minEnteredVal, maxEnteredVal, options) {
|
|
1017
|
+
let currentSliderData = { min: null, max: null };
|
|
1018
|
+
currentSliderData.max = maxEnteredVal;
|
|
1019
|
+
currentSliderData.min = minEnteredVal;
|
|
1020
|
+
if (currentSliderData.min == options.floor &&
|
|
1021
|
+
currentSliderData.max == options.ceil &&
|
|
1022
|
+
this.initialValueMap.has(this.selectedRadio)) {
|
|
1023
|
+
currentSliderData = this.initialValueMap.get(this.selectedRadio);
|
|
1024
|
+
}
|
|
1025
|
+
return currentSliderData;
|
|
1026
|
+
}
|
|
1027
|
+
//==============================================================TIME====================================================================//
|
|
1028
|
+
getSelectedTimeRange(header, clonedData) {
|
|
1029
|
+
let selectedFromTime;
|
|
1030
|
+
let selectedToTime;
|
|
1031
|
+
if (this.tooltipSelectedMap.has(header)) {
|
|
1032
|
+
selectedFromTime = this.tooltipSelectedMap.get(header).fromTime;
|
|
1033
|
+
selectedToTime = this.tooltipSelectedMap.get(header).toTime;
|
|
1034
|
+
}
|
|
1035
|
+
else {
|
|
1036
|
+
this.setInitialValueMapForTimeFilter(clonedData, header);
|
|
1037
|
+
selectedFromTime = this.initialValueMap.get(header).fromTime;
|
|
1038
|
+
selectedToTime = this.initialValueMap.get(header).toTime;
|
|
1039
|
+
}
|
|
1040
|
+
if (selectedFromTime != undefined || selectedToTime != undefined) {
|
|
1041
|
+
selectedFromTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedFromTime, true);
|
|
1042
|
+
selectedToTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedToTime, true);
|
|
1043
|
+
}
|
|
1044
|
+
else {
|
|
1045
|
+
selectedFromTime = ['-', '-', '-'];
|
|
1046
|
+
selectedToTime = ['-', '-', '-'];
|
|
1047
|
+
}
|
|
1048
|
+
return [selectedFromTime, selectedToTime];
|
|
1049
|
+
}
|
|
1050
|
+
setInitialValueMapForTimeFilter(clonedData, key) {
|
|
1051
|
+
if (key == 'startEndTime' || key == 'TimeBand') {
|
|
1052
|
+
this.setInitialValueForStartAndEndTimeRange(clonedData, key);
|
|
1053
|
+
}
|
|
1054
|
+
else {
|
|
1055
|
+
this.setInitialValueForStartOrEndTimeRange(clonedData, key);
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
//use for filter where we have start and end time range in one filter
|
|
1059
|
+
//startEndTime: ["6 - 7A", "06: 00 : 00" , "07:00:00"]
|
|
1060
|
+
setInitialValueForStartAndEndTimeRange(clonedData, key) {
|
|
1061
|
+
let includeMulti = clonedData.findIndex((obj) => obj[key][0] == '<multi>') != -1;
|
|
1062
|
+
let includeZero = clonedData.findIndex((obj) => obj[key][0] == '0') != -1;
|
|
1063
|
+
let includeTimeRange = clonedData.findIndex((obj) => obj[key][0] != '0' && obj[key][0] != '<multi>') != -1;
|
|
1064
|
+
let filteredStartTime = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj['startTime']));
|
|
1065
|
+
let filteredEndTime = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj['endTime']));
|
|
1066
|
+
let startTimeArr = map(filteredStartTime, 'startTime');
|
|
1067
|
+
let endTimeArr = map(filteredEndTime, 'endTime');
|
|
1068
|
+
startTimeArr.sort((a, b) => {
|
|
1069
|
+
return this.dateTimeFormatService.sortByTimeAscending(a, b);
|
|
1070
|
+
});
|
|
1071
|
+
endTimeArr.sort((a, b) => {
|
|
1072
|
+
return this.dateTimeFormatService.sortByTimeDescending(a, b);
|
|
1073
|
+
});
|
|
1074
|
+
let obj = {
|
|
1075
|
+
fromTime: startTimeArr[0],
|
|
1076
|
+
toTime: endTimeArr[0],
|
|
1077
|
+
includeMulti: includeMulti,
|
|
1078
|
+
includeZero: includeZero,
|
|
1079
|
+
includeTimeRange: includeTimeRange,
|
|
1080
|
+
};
|
|
1081
|
+
this.initialValueMap.set(key, obj);
|
|
1082
|
+
}
|
|
1083
|
+
//use for the filters where we have different filter for start and end time
|
|
1084
|
+
//startTime: "06:00:00"
|
|
1085
|
+
setInitialValueForStartOrEndTimeRange(clonedData, key) {
|
|
1086
|
+
let includeMulti = clonedData.findIndex((obj) => obj[key] == '<multi>') != -1;
|
|
1087
|
+
let includeZero = clonedData.findIndex((obj) => obj[key] == '0') != -1;
|
|
1088
|
+
let includeTimeRange = clonedData.findIndex((obj) => obj[key] != '0' && obj[key] != '<multi>') != -1;
|
|
1089
|
+
let data = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj[key]));
|
|
1090
|
+
let timeArr = map(data, key);
|
|
1091
|
+
timeArr.sort((a, b) => {
|
|
1092
|
+
return this.dateTimeFormatService.sortByTimeAscending(a, b);
|
|
1093
|
+
});
|
|
1094
|
+
let obj = {
|
|
1095
|
+
fromTime: timeArr[0],
|
|
1096
|
+
toTime: timeArr[timeArr.length - 1],
|
|
1097
|
+
includeMulti: includeMulti,
|
|
1098
|
+
includeZero: includeZero,
|
|
1099
|
+
includeTimeRange: includeTimeRange,
|
|
1100
|
+
};
|
|
1101
|
+
this.initialValueMap.set(key, obj);
|
|
1102
|
+
}
|
|
1103
|
+
selectUnselectTimeFilterCheckbox(key, optionsData) {
|
|
1104
|
+
let showMultiTimeCheckbox = false;
|
|
1105
|
+
let showZeroTimeCheckbox = false;
|
|
1106
|
+
let showEnterTimeCheckbox = false;
|
|
1107
|
+
let multiTimeCheckboxChecked = false;
|
|
1108
|
+
let zeroTimeCheckboxChecked = false;
|
|
1109
|
+
let enterTimeCheckboxChecked = false;
|
|
1110
|
+
let selectedTimeObj;
|
|
1111
|
+
if (this.tooltipSelectedMap.has(key)) {
|
|
1112
|
+
selectedTimeObj = this.tooltipSelectedMap.get(key);
|
|
1113
|
+
}
|
|
1114
|
+
else {
|
|
1115
|
+
selectedTimeObj = this.initialValueMap.get(key);
|
|
1116
|
+
}
|
|
1117
|
+
let timeArr;
|
|
1118
|
+
if (key == 'startEndTime' || key == 'TimeBand') {
|
|
1119
|
+
timeArr = optionsData.map((item) => item[key][0]);
|
|
1120
|
+
}
|
|
1121
|
+
else {
|
|
1122
|
+
timeArr = optionsData.map((item) => item[key]);
|
|
1123
|
+
}
|
|
1124
|
+
if (timeArr.findIndex((val) => val == '0') != -1) {
|
|
1125
|
+
showZeroTimeCheckbox = true;
|
|
1126
|
+
zeroTimeCheckboxChecked = selectedTimeObj.includeZero;
|
|
1127
|
+
}
|
|
1128
|
+
if (timeArr.findIndex((val) => val == '<multi>') != -1) {
|
|
1129
|
+
showMultiTimeCheckbox = true;
|
|
1130
|
+
multiTimeCheckboxChecked = selectedTimeObj.includeMulti;
|
|
1131
|
+
}
|
|
1132
|
+
if (showZeroTimeCheckbox || showMultiTimeCheckbox) {
|
|
1133
|
+
showEnterTimeCheckbox = true;
|
|
1134
|
+
}
|
|
1135
|
+
if (timeArr.findIndex((val) => val != '<multi>' && val != '0') != -1) {
|
|
1136
|
+
enterTimeCheckboxChecked = selectedTimeObj?.includeTimeRange;
|
|
1137
|
+
}
|
|
1138
|
+
return {
|
|
1139
|
+
showMultiTimeCheckbox: showMultiTimeCheckbox,
|
|
1140
|
+
showZeroTimeCheckbox: showZeroTimeCheckbox,
|
|
1141
|
+
showEnterTimeCheckbox: showEnterTimeCheckbox,
|
|
1142
|
+
multiTimeCheckboxChecked: multiTimeCheckboxChecked,
|
|
1143
|
+
zeroTimeCheckboxChecked: zeroTimeCheckboxChecked,
|
|
1144
|
+
enterTimeCheckboxChecked: enterTimeCheckboxChecked,
|
|
1145
|
+
};
|
|
1146
|
+
}
|
|
1147
|
+
checkIfStartTimeIsAfterEndTime(startTime, endTime) {
|
|
1148
|
+
let timeFormat = 'HH:mm:ss';
|
|
1149
|
+
let startTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(startTime[0] + ':' + startTime[1] + ' ' + startTime[2], true);
|
|
1150
|
+
let startTime24HrFormat = startTime24HrFormatArr[0] + ':' + startTime24HrFormatArr[1] + ':00';
|
|
1151
|
+
let endTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(endTime[0] + ':' + endTime[1] + ' ' + endTime[2], true);
|
|
1152
|
+
let endTime24HrFormat = endTime24HrFormatArr[0] + ':' + endTime24HrFormatArr[1] + ':00';
|
|
1153
|
+
return dayjs(startTime24HrFormat, timeFormat).isAfter(dayjs(endTime24HrFormat, timeFormat));
|
|
1154
|
+
}
|
|
1155
|
+
getPreviousSelectedTimeFilter() {
|
|
1156
|
+
let previousSelectedTimeFilter;
|
|
1157
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
1158
|
+
previousSelectedTimeFilter = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
1159
|
+
}
|
|
1160
|
+
else if (this.initialValueMap.has(this.selectedRadio)) {
|
|
1161
|
+
previousSelectedTimeFilter = this.initialValueMap.get(this.selectedRadio);
|
|
1162
|
+
}
|
|
1163
|
+
return previousSelectedTimeFilter;
|
|
1164
|
+
}
|
|
1165
|
+
getCurrentSelectedTimeFilter(startTime, endTime, includeMulti, includeZero, includeTimeRange) {
|
|
1166
|
+
let currentSelectedTimeFilter;
|
|
1167
|
+
let fromTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(startTime[0] + ':' + startTime[1] + ' ' + startTime[2], true);
|
|
1168
|
+
let fromTime24HrFormat = fromTime24HrFormatArr[0] + ':' + fromTime24HrFormatArr[1] + ':00';
|
|
1169
|
+
let toTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(endTime[0] + ':' + endTime[1] + ' ' + endTime[2], true);
|
|
1170
|
+
let toTime24HrFormat = toTime24HrFormatArr[0] + ':' + toTime24HrFormatArr[1] + ':00';
|
|
1171
|
+
currentSelectedTimeFilter = {
|
|
1172
|
+
fromTime: fromTime24HrFormat,
|
|
1173
|
+
toTime: toTime24HrFormat,
|
|
1174
|
+
includeMulti: includeMulti,
|
|
1175
|
+
includeZero: includeZero,
|
|
1176
|
+
includeTimeRange: includeTimeRange,
|
|
1177
|
+
};
|
|
1178
|
+
return currentSelectedTimeFilter;
|
|
1179
|
+
}
|
|
1180
|
+
incrementHourInput(arr) {
|
|
1181
|
+
if (arr[0] == '') {
|
|
1182
|
+
arr[0] = 1;
|
|
1183
|
+
}
|
|
1184
|
+
else if (parseInt(arr[0]) < 12) {
|
|
1185
|
+
arr[0] = parseInt(arr[0]) + 1;
|
|
1186
|
+
}
|
|
1187
|
+
else {
|
|
1188
|
+
arr[0] = 1;
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
decrementHourInput(arr) {
|
|
1192
|
+
if (arr[0] == '') {
|
|
1193
|
+
arr[0] = 12;
|
|
1194
|
+
}
|
|
1195
|
+
else if (parseInt(arr[0]) > 1) {
|
|
1196
|
+
arr[0] = parseInt(arr[0]) - 1;
|
|
1197
|
+
}
|
|
1198
|
+
else {
|
|
1199
|
+
arr[0] = 12;
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
incrementMinuteInput(arr) {
|
|
1203
|
+
// increment to nearest proper interval(15,30,45)
|
|
1204
|
+
let min = parseInt(arr[1]);
|
|
1205
|
+
if (min <= 14) {
|
|
1206
|
+
arr[1] = '15';
|
|
1207
|
+
}
|
|
1208
|
+
else if (min >= 15 && min <= 29) {
|
|
1209
|
+
arr[1] = '30';
|
|
1210
|
+
}
|
|
1211
|
+
else if (min >= 30 && min <= 44) {
|
|
1212
|
+
arr[1] = '45';
|
|
1213
|
+
}
|
|
1214
|
+
else if (min >= 45) {
|
|
1215
|
+
arr[1] = '00';
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
decrementMinuteInput(arr) {
|
|
1219
|
+
let min = parseInt(arr[1]);
|
|
1220
|
+
if (min > 0 && min <= 15) {
|
|
1221
|
+
arr[1] = '00';
|
|
1222
|
+
}
|
|
1223
|
+
else if (min >= 16 && min <= 30) {
|
|
1224
|
+
arr[1] = '15';
|
|
1225
|
+
}
|
|
1226
|
+
else if (min >= 31 && min <= 45) {
|
|
1227
|
+
arr[1] = '30';
|
|
1228
|
+
}
|
|
1229
|
+
else if (min > 45 || min == 0) {
|
|
1230
|
+
arr[1] = '45';
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
incrementOrDecrementHour(increment, time) {
|
|
1234
|
+
if (increment) {
|
|
1235
|
+
this.incrementHourInput(time);
|
|
1236
|
+
}
|
|
1237
|
+
else {
|
|
1238
|
+
this.decrementHourInput(time);
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
incrementOrDecrementMin(increment, time) {
|
|
1242
|
+
if (increment) {
|
|
1243
|
+
this.incrementMinuteInput(time);
|
|
1244
|
+
}
|
|
1245
|
+
else {
|
|
1246
|
+
this.decrementMinuteInput(time);
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
isHourValueInvalid(hr) {
|
|
1250
|
+
return hr.length == 0 || !+hr || 1 > parseInt(hr) || parseInt(hr) > 12 || hr.includes('.');
|
|
1251
|
+
}
|
|
1252
|
+
isMinuteValueInvalid(min) {
|
|
1253
|
+
return (min.length != 2 || (!+min && min != '00') || 0 > parseInt(min) || parseInt(min) > 59 || min.includes('.'));
|
|
1254
|
+
}
|
|
1255
|
+
//=============================================================SORT======================================================================//
|
|
1256
|
+
updateSortMap(tempSortOrder, tableData, isLurAndCsrComponent) {
|
|
1257
|
+
this.annaSortService.columnSortState = new Map();
|
|
1258
|
+
this.annaSortService.columnSortState.set(this.selectedRadio, tempSortOrder);
|
|
1259
|
+
let sortedTableData = this.annaSortService.applySorting(this.selectedRadio, tempSortOrder, tableData, isLurAndCsrComponent);
|
|
1260
|
+
return sortedTableData;
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
AnnaFilterService.bufferSize = 20;
|
|
1264
|
+
AnnaFilterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }, { token: i2.AnnaSortService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1265
|
+
AnnaFilterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AnnaFilterService, providedIn: 'root' });
|
|
1266
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AnnaFilterService, decorators: [{
|
|
1267
|
+
type: Injectable,
|
|
1268
|
+
args: [{
|
|
1269
|
+
providedIn: 'root',
|
|
1270
|
+
}]
|
|
1271
|
+
}], ctorParameters: function () { return [{ type: i1.AnnaDateTimeFormatService }, { type: i2.AnnaSortService }]; } });
|
|
1272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLE1BQU0sTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQVksWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFbkUsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFLNUQsTUFBTSxPQUFPLGlCQUFpQjtJQTBDMUIsWUFDWSxxQkFBZ0QsRUFDaEQsZUFBZ0M7UUFEaEMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUEyQjtRQUNoRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUEzQzVDLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFjL0Isd0JBQW1CLEdBQWEsRUFBRSxDQUFDO1FBSW5DLHNCQUFp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TyxDQUNILEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQzVHLENBQUM7SUFDTixDQUFDO0lBRUQsMklBQTJJO0lBQzNJLGFBQWEsQ0FBQyxhQUF1QixFQUFFLFNBQWdCLEVBQUUsb0JBQTZCO1FBQ2xGLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDNUUsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQ25ELElBQUksQ0FBQyxhQUFhLEVBQ2xCLGFBQWEsRUFDYixTQUFTLEVBQ1Qsb0JBQW9CLENBQ3ZCLENBQUM7UUFDRixPQUFPLGVBQWUsQ0FBQztJQUMzQixDQUFDOztBQTM1Q2EsNEJBQVUsR0FBRyxFQUFFLENBQUM7K0dBdENyQixpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZkLE1BQU07NEZBRVQsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyLXNsaWRlci9uZ3gtc2xpZGVyJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLy8gVGhpcmQgcGFydHkgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgbWluLCBtYXgsIG1hcCwgc29ydEJ5LCB1bmlxLCBjbG9uZURlZXAsIGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgQ3VzdG9tUGFyc2VGb3JtYXQgZnJvbSAnZGF5anMvcGx1Z2luL2N1c3RvbVBhcnNlRm9ybWF0JztcclxuaW1wb3J0IG1pbk1heCBmcm9tICdkYXlqcy9wbHVnaW4vbWluTWF4JztcclxuaW1wb3J0IGlzQmV0d2VlbiBmcm9tICdkYXlqcy9wbHVnaW4vaXNCZXR3ZWVuJztcclxuaW1wb3J0IHsgU29ydFR5cGUsIFNvcnRUeXBlRW51bSB9IGZyb20gJy4uL21vZGVscy9hbm5hLXNvcnQubW9kZWwnO1xyXG5cclxuLy8gVXNlciBkZWZpbmVkIGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsIE5nYkRhdGVUeXBlIH0gZnJvbSAnLi9hbm5hLWRhdGUtdGltZS1mb3JtYXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEFubmFTb3J0U2VydmljZSB9IGZyb20gJy4vYW5uYS1zb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb29sdGlwTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvYW5uYS10b29sdGlwLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFubmFGaWx0ZXJTZXJ2aWNlIHtcclxuICAgIHRvb2x0aXBNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICB0b29sdGlwU2VsZWN0ZWRNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICBpbml0aWFsVmFsdWVNYXA6IE1hcDxzdHJpbmcsIGFueT47XHJcbiAgICB0cmFuc2xhdGVGdW5jOiBzdHJpbmc7XHJcbiAgICBzZWxlY3RlZFJhZGlvOiBzdHJpbmc7XHJcbiAgICBzdWJSYWRpb0J1dHRvbjogc3RyaW5nO1xyXG5cclxuICAgIGNhbGVuZGFyU2V0OiBTZXQ8c3RyaW5nPjtcclxuICAgIHNsaWRlclNldDogU2V0PHN0cmluZz47XHJcbiAgICB0aW1lU2V0OiBTZXQ8c3RyaW5nPjtcclxuXHJcbiAgICBpbmNsdWRlTXVsdGlUaW1lOiBib29sZWFuO1xyXG4gICAgaW5jbHVkZVplcm9UaW1lOiBib29sZWFuO1xyXG4gICAgaW5jbHVkZVRpbWVSYW5nZTogYm9vbGVhbjtcclxuXHJcbiAgICBhcHBsaWVkRmlsdGVyc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZmxpZ2h0RGF0ZVJhbmdlOiB7IG1pblNlbGVjdGVkRGF0ZTogYW55OyBtYXhTZWxlY3RlZERhdGU6IGFueSB9O1xyXG4gICAgc2xpZGVyRGF0YTogeyBtaW46IGFueTsgbWF4OiBhbnkgfTtcclxuICAgIG5neFNsaWRlck9iajogT3B0aW9ucztcclxuICAgIHNsaWRlckN1cnJlbmN5U2V0ID0gbmV3IFNldChbXHJcbiAgICAgICAgJ2Jvb2tlZCcsXHJcbiAgICAgICAgJ2NwcCcsXHJcbiAgICAgICAgJ2NwbScsXHJcbiAgICAgICAgJ3JjdlByZWVtcHQnLFxyXG4gICAgICAgICdvc1ByZWVtcHQnLFxyXG4gICAgICAgICdwb3N0ZWRBZHUnLFxyXG4gICAgICAgICdzY2hlZHVsZWRBZHUnLFxyXG4gICAgICAgICdhdWRpZW5jZURlZmljaXQnLFxyXG4gICAgICAgICdSYXRlJyxcclxuICAgICAgICAndXNlckFEVXMnLFxyXG4gICAgICAgICdidXllckNoYW5nZXMnLFxyXG4gICAgICAgICd1c2VyQ2hhbmdlcycsXHJcbiAgICAgICAgJ3VzZXJNRycsXHJcbiAgICAgICAgJ3VkVmFsdWUnLFxyXG4gICAgICAgICdvZFZhbHVlJyxcclxuICAgIF0pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgYnVmZmVyU2l6ZSA9IDIwO1xyXG4gICAgaXNGaWx0ZXJTb3J0QWN0aXZlOiBhbnkgPSB7fTtcclxuICAgIHJlc2V0RmlsdGVyU29ydEFjdGl2ZVN0YXR1czogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBkYXRlVGltZUZvcm1hdFNlcnZpY2U6IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBhbm5hU29ydFNlcnZpY2U6IEFubmFTb3J0U2VydmljZSxcclxuICAgICkge1xyXG4gICAgICAgIGRheWpzLmV4dGVuZChtaW5NYXgpO1xyXG4gICAgICAgIGRheWpzLmV4dGVuZChpc0JldHdlZW4pO1xyXG4gICAgICAgIGRheWpzLmV4dGVuZChDdXN0b21QYXJzZUZvcm1hdCk7XHJcbiAgICAgICAgY29uc3Qgc2xpZGVyQXJyID0gW1xyXG4gICAgICAgICAgICAncmN2UHJlZW1wdCcsXHJcbiAgICAgICAgICAgICdvc1ByZWVtcHQnLFxyXG4gICAgICAgICAgICAncmN2VW5kZXJEbHknLFxyXG4gICAgICAgICAgICAncG9zdGVkQXVkUGVyY2VudCcsXHJcbiAgICAgICAgICAgICdib29rZWQnLFxyXG4gICAgICAgICAgICAnc3BvdHMnLFxyXG4gICAgICAgICAgICAnZ3JwJyxcclxuICAgICAgICAgICAgJ2NwcCcsXHJcbiAgICAgICAgICAgICdpbXBzJyxcclxuICAgICAgICAgICAgJ2NwbScsXHJcbiAgICAgICAgICAgICdvc1VuZGVyRGx5JyxcclxuICAgICAgICAgICAgJ3RvdGFsV2Vla3MnLFxyXG4gICAgICAgICAgICAnV2Vla051bWJlcicsXHJcbiAgICAgICAgICAgICdSYXRlJyxcclxuICAgICAgICAgICAgJ09yZGVyZWRSYXRpbmdzT3JJbXByZXNzaW9ucycsXHJcbiAgICAgICAgICAgICdQb3N0ZWRSYXRpbmdzT3JJbXByZXNzaW9ucycsXHJcbiAgICAgICAgICAgICxcclxuICAgICAgICAgICAgJ3Bvc3RlZEF1ZFBlcmNlbnQnLFxyXG4gICAgICAgICAgICAncG9zdGVkQWR1JyxcclxuICAgICAgICAgICAgJ3NjaGVkdWxlZEFkdScsXHJcbiAgICAgICAgICAgICdhdWRpZW5jZURlZmljaXQnLFxyXG4gICAgICAgICAgICAnb2ZmZXJlZE1HcycsXHJcbiAgICAgICAgICAgICdvdXRzdGFuZGluZ1BFJyxcclxuICAgICAgICAgICAgJ29mZmVyZWRBRFVzJyxcclxuICAgICAgICAgICAgJ3VkRGVmaWNpdFZhbHVlJyxcclxuICAgICAgICAgICAgJ2Jvb2tlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ2Jvb2tlZFNwb3RzJyxcclxuICAgICAgICAgICAgJ3VzZXJDaGFuZ2VzJyxcclxuICAgICAgICAgICAgJ1VER3JwJyxcclxuICAgICAgICAgICAgJ1VESW1wcycsXHJcbiAgICAgICAgICAgICdPREdycCcsXHJcbiAgICAgICAgICAgICdPREltcHMnLFxyXG4gICAgICAgICAgICAndWRJbXBzUGVyY2VudCcsXHJcbiAgICAgICAgICAgICd1ZEdycFBlcmNlbnQnLFxyXG4gICAgICAgICAgICAnb2RJbXBzUGVyY2VudCcsXHJcbiAgICAgICAgICAgICdvZEdycFBlcmNlbnQnLFxyXG4gICAgICAgICAgICAndXNlckFEVXMnLFxyXG4gICAgICAgICAgICAnYnV5ZXJDaGFuZ2VzJyxcclxuICAgICAgICAgICAgJ3VzZXJDaGFuZ2VzJyxcclxuICAgICAgICAgICAgJ3VzZXJNRycsXHJcbiAgICAgICAgICAgICdXZWVrbHlBVVInLFxyXG4gICAgICAgICAgICAnV2Vla2x5QVVSYXRpbmdPckltcHJlc3Npb25zJyxcclxuICAgICAgICAgICAgJ01Hc1ZhbHVlJyxcclxuICAgICAgICAgICAgJ0FEVXNWYWx1ZScsXHJcbiAgICAgICAgICAgICdVc2VyQ3JlZGl0ZWRWYWx1ZScsXHJcbiAgICAgICAgICAgICdVc2VyVW5yZXNvbHZlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ0J1eWVyQWRkZWRWYWx1ZScsXHJcbiAgICAgICAgICAgICdCdXllckRlbGV0ZWRWYWx1ZScsXHJcbiAgICAgICAgICAgICdCdXllckNoYW5nZXNWYWx1ZScsXHJcbiAgICAgICAgICAgICdVc2VyQ2hhbmdlc1ZhbHVlJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZEdSUE9ySU1QUycsXHJcbiAgICAgICAgICAgICdCb29rZWRDUFBPckNQTScsXHJcbiAgICAgICAgICAgICdCb29rZWRWYWx1ZScsXHJcbiAgICAgICAgICAgICdCb29rZWRTcG90cycsXHJcbiAgICAgICAgICAgICdCb29rZWRSYXRlJyxcclxuICAgICAgICAgICAgJ2F2ZXJhZ2VSYXRlJyxcclxuICAgICAgICAgICAgJ3Byb2plY3RlZElNUFMnLFxyXG4gICAgICAgICAgICAncHJvamVjdGVkUlRHJyxcclxuICAgICAgICAgICAgJ2Rlc2lyZWRDUE0nLFxyXG4gICAgICAgICAgICAnZGVzaXJlZENQUCcsXHJcbiAgICAgICAgICAgICdpbnZlbnRvcnlGaWxsUGVyY2VudGFnZVNhbWVXZWVrJyxcclxuICAgICAgICAgICAgJ2ludmVudG9yeUZpbGxQZXJjZW50YWdlRmluYWwnLFxyXG4gICAgICAgICAgICAnaW52ZW50b3J5RmlsbFBlcmNlbnRhZ2VUaWxsRGF0ZScsXHJcbiAgICAgICAgICAgICdkb2xsYXJSYXRlSW1wYWN0JyxcclxuICAgICAgICAgICAgJ2RvbGxhcklNUFNJbXBhY3QnLFxyXG4gICAgICAgICAgICAnSU1QU0ltcGFjdCcsXHJcbiAgICAgICAgICAgICdkb2xsYXJSVEdJbXBhY3QnLFxyXG4gICAgICAgICAgICAnUlRHSW1wYWN0JyxcclxuICAgICAgICAgICAgJ0Jvb2tlZFJURycsXHJcbiAgICAgICAgICAgICdCb29rZWRJTVBTJyxcclxuICAgICAgICAgICAgJ0FVUlRHJyxcclxuICAgICAgICAgICAgJ0FVUlRHJyxcclxuICAgICAgICAgICAgJ1Bvc3RlZFJhdGluZycsXHJcbiAgICAgICAgICAgICdQb3N0ZWRJbXByZXNzaW9ucycsXHJcbiAgICAgICAgICAgICdOb3JtYWxpemVkT3JkZXJlZFJhdGluZycsXHJcbiAgICAgICAgICAgICdOb3JtYWxpemVkT3JkZXJlZEltcHJlc3Npb25zJyxcclxuICAgICAgICAgICAgJ05vcm1hbGl6ZWRQb3N0ZWRSYXRpbmcnLFxyXG4gICAgICAgICAgICAnTm9ybWFsaXplZFBvc3RlZEltcHJlc3Npb25zJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZEdSUCcsXHJcbiAgICAgICAgICAgICdCb29rZWRJTVBTUmV2VGFiJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZENQUCcsXHJcbiAgICAgICAgICAgICdCb29rZWRDUE0nLFxyXG4gICAgICAgICAgICAnQVVJTVBTJyxcclxuICAgICAgICAgICAgJ2Jvb2tlZEFtb3VudFZhbHVlJyxcclxuICAgICAgICAgICAgJ2VxdWl2YWxpemVkQm9va2VkQW1vdW50VmFsdWUnLFxyXG4gICAgICAgICAgICAnSU1QUycsXHJcbiAgICAgICAgICAgICd1ZFZhbHVlJyxcclxuICAgICAgICAgICAgJ29kVmFsdWUnLFxyXG4gICAgICAgICAgICAnVmlvbGF0ZWRCb29rZWRWYWx1ZScsXHJcbiAgICAgICAgICAgICdWaW9sYXRlZEJvb2tlZEVVUlZhbHVlJyxcclxuICAgICAgICAgICAgJ1Zpb2xhdGluZ0Jvb2tlZEVVUlZhbHVlJyxcclxuICAgICAgICAgICAgJ1Zpb2xhdGluZ0Jvb2tlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ1JlYmF0ZScsXHJcbiAgICAgICAgICAgICdPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVXZWVrbHlBVVInLFxyXG4gICAgICAgICAgICAncGFyZW50Um93QW5uYUVzdGltYXRlc1J0ZycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dQb3N0ZWRSdGcnLFxyXG4gICAgICAgICAgICAncGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VSdGcnLFxyXG4gICAgICAgICAgICAncGFyZW50Um93U3RhdGlvbkVzdGltYXRlc1J0ZycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzSW1wcycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dQb3N0ZWRJbXBzJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1JvbGxpbmdBdmVyYWdlSW1wcycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dTdGF0aW9uRXN0aW1hdGVzSW1wcycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzU2hhcmUnLFxyXG4gICAgICAgICAgICAncGFyZW50Um93UG9zdGVkU2hhcmUnLFxyXG4gICAgICAgICAgICAncGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VTaGFyZScsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUHV0UGVyJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1Bvc3RlZFB1dFBlcicsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVB1dFBlcicsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUHV0JyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1Bvc3RlZFB1dCcsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVB1dCcsXHJcbiAgICAgICAgICAgICdQcm9qZWN0ZWRJbXByZXNzaW9ucycsXHJcbiAgICAgICAgICAgICdQcm9qZWN0ZWRSdGcnLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgY2FsZW5kYXJBcnIgPSBbXHJcbiAgICAgICAgICAgICdwZXJpb2QnLFxyXG4gICAgICAgICAgICAnQWlyRGF0ZScsXHJcbiAgICAgICAgICAgICdmbGlnaHRTdGFydERhdGUnLFxyXG4gICAgICAgICAgICAnZmxpZ2h0RW5kRGF0ZScsXHJcbiAgICAgICAgICAgICdkYXRlJyxcclxuICAgICAgICAgICAgJ3N0YXJ0RGF0ZScsXHJcbiAgICAgICAgICAgICdlbmREYXRlJyxcclxuICAgICAgICAgICAgJ3JldmlzaW9uU3RhcnREYXRlJyxcclxuICAgICAgICAgICAgJ0dlbmVyYXRlZE9uJyxcclxuICAgICAgICAgICAgJ1dlZWsnLFxyXG4gICAgICAgICAgICAndGltZW91dERhdGUnLFxyXG4gICAgICAgICAgICAnVmlvbGF0aW5nU3BvdERhdGUnLFxyXG4gICAgICAgICAgICAnVmlvbGF0ZWRTcG90RGF0ZScsXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCB0aW1lQXJyID0gW1xyXG4gICAgICAgICAgICAnU3RhcnRUaW1lRm9yRmlsdGVyJyxcclxuICAgICAgICAgICAgJ0VuZFRpbWVGb3JGaWx0ZXInLFxyXG4gICAgICAgICAgICAndGltZScsXHJcbiAgICAgICAgICAgICdzdGFydFRpbWVGb3JGaWx0ZXInLFxyXG4gICAgICAgICAgICAnZW5kVGltZUZvckZpbHRlcicsXHJcbiAgICAgICAgICAgICdzdGFydF90aW1lX2Zvcl9maWx0ZXInLFxyXG4gICAgICAgICAgICAnZW5kX3RpbWVfZm9yX2ZpbHRlcicsXHJcbiAgICAgICAgICAgICdzdGFydEVuZFRpbWVNdWx0aScsXHJcbiAgICAgICAgICAgICdzdGFydEVuZFRpbWUnLFxyXG4gICAgICAgICAgICAndGltZW91dFRpbWUnLFxyXG4gICAgICAgICAgICAnT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lJyxcclxuICAgICAgICAgICAgJ090aGVyQXZhaWxhYmxlU3BvdHNUYWJsZUVuZFRpbWUnLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy5zbGlkZXJTZXQgPSBuZXcgU2V0KHNsaWRlckFycik7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclNldCA9IG5ldyBTZXQoY2FsZW5kYXJBcnIpO1xyXG4gICAgICAgIHRoaXMudGltZVNldCA9IG5ldyBTZXQodGltZUFycik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuTWF4QW5kTWluVmFsdWUoZGF0YTogYW55W10sIGtleTogc3RyaW5nLCBpc01pbjogYm9vbGVhbikge1xyXG4gICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhWycnLCAnLScsIG51bGxdLmluY2x1ZGVzKG9ialtrZXldKSk7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gZGF0YS5tYXAoKHgpID0+IHhba2V5XSk7XHJcbiAgICAgICAgbGV0IHZhbHVlVG9SZXR1cm4gPSBpc01pbiA/IG1pbih2YWx1ZXMpIDogbWF4KHZhbHVlcyk7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlVG9SZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuTWluQW5kTWF4RGF0ZShkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoKG9iaikgPT4gIVsnJywgJy0nLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgICAgIGxldCBEYXRlQXJyID0gZGF0YS5tYXAoKG9iaikgPT4gZGF5anMob2JqW2tleV0pKTtcclxuICAgICAgICBsZXQgbWluRGF0ZSA9IGRheWpzLm1pbihEYXRlQXJyKTtcclxuICAgICAgICBsZXQgbWF4RGF0ZSA9IGRheWpzLm1heChEYXRlQXJyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFttaW5EYXRlLCBtYXhEYXRlXTtcclxuICAgIH1cclxuXHJcbiAgICBpc1Rvb2x0aXBBY3RpdmUoaGVhZGVyOiBzdHJpbmdbXSwgc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICAgICAgbGV0IGlzU29ydE1hcEZvckhlYWRlcjBBY3RpdmUgPSBzb3J0TWFwLmhhcyhoZWFkZXJbMF0pICYmIHNvcnRNYXAuZ2V0KGhlYWRlclswXSkgIT0gU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcbiAgICAgICAgbGV0IGlzU29ydE1hcEZvckhlYWRlcjFBY3RpdmUgPSBzb3J0TWFwLmhhcyhoZWFkZXJbMV0pICYmIHNvcnRNYXAuZ2V0KGhlYWRlclsxXSkgIT0gU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcblxyXG4gICAgICAgIGlmIChoZWFkZXIubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChzb3J0TWFwLnNpemUgPiAwICYmIGlzU29ydE1hcEZvckhlYWRlcjBBY3RpdmUpIHx8IHNldC5oYXMoaGVhZGVyWzBdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIChzb3J0TWFwLnNpemUgPiAwICYmIHNvcnRNYXAuaGFzKGhlYWRlclswXSkgJiYgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSkgfHxcclxuICAgICAgICAgICAgKHNvcnRNYXAuc2l6ZSA+IDAgJiYgc29ydE1hcC5oYXMoaGVhZGVyWzFdKSAmJiBpc1NvcnRNYXBGb3JIZWFkZXIxQWN0aXZlKSB8fFxyXG4gICAgICAgICAgICBzZXQuaGFzKGhlYWRlclswXSkgfHxcclxuICAgICAgICAgICAgc2V0LmhhcyhoZWFkZXJbMV0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckNvbHVtbkZpbHRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIGxldCBhcHBsaWVkRmlsdGVyU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgICAgICAgICAgYXBwbGllZEZpbHRlclNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5ID0gWy4uLmFwcGxpZWRGaWx0ZXJTZXRdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZmxvb3I6IG1pblZhbHVlLFxyXG4gICAgICAgICAgICBjZWlsOiBtYXhWYWx1ZSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZTogdGhpcy5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhkYXRhKSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSAoTWF0aC5hYnMoZGF0YSkgLyAxMDAwKS50b0ZpeGVkKDEpICsgJ2slJztcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmVnVmFsID8gJy0nICsgdmFsIDogdmFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICAgICAgICBsZXQgaXNXaG9sZU51bSA9IHBhcnNlSW50KGRhdGEudG9TdHJpbmcoKSkgPT0gZGF0YTtcclxuICAgICAgICAgICAgbGV0IHZhbCA9IGlzV2hvbGVOdW0gPyBNYXRoLmFicyhkYXRhKS50b1N0cmluZygpIDogTWF0aC5hYnMoZGF0YSkudG9GaXhlZCgxKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmVnVmFsID8gJy0nICsgdmFsICsgJyUnIDogdmFsICsgJyUnO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY3VycmVuY3lUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhkYXRhKSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSAnJCcgKyAoTWF0aC5hYnMoZGF0YSkgLyAxMDAwKS50b0ZpeGVkKDEpICsgJ2snO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNOZWdWYWwgPyAnLScgKyB2YWwgOiB2YWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgICAgIGxldCBpc1dob2xlTnVtID0gcGFyc2VJbnQoZGF0YS50b1N0cmluZygpKSA9PSBkYXRhO1xyXG4gICAgICAgICAgICBsZXQgdmFsID0gaXNXaG9sZU51bSA/IE1hdGguYWJzKGRhdGEpLnRvU3RyaW5nKCkgOiBNYXRoLmFicyhkYXRhKS50b0ZpeGVkKDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNOZWdWYWwgPyAnLSQnICsgdmFsIDogJyQnICsgdmFsO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgbm9ybWFsVHJhbnNsYXRlRnVuY3Rpb24gPSAoZGF0YTogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICAgICAgICBpZiAoZGF0YSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IChkYXRhIC8gMTAwMCkudG9GaXhlZCgxKSArICdrJztcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgIT0gTWF0aC5mbG9vcihkYXRhKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS50b0ZpeGVkKDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZpbmRVbmlxdWVEYXRlc1dpdGhEYXRhKGRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHVuaXF1ZURhdGVzID0gdW5pcShkYXRhLm1hcCgodSkgPT4gdVsnZGF0ZSddKSk7XHJcbiAgICAgICAgbGV0IHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0OiBOZ2JEYXRlVHlwZVtdID0gW107XHJcbiAgICAgICAgdW5pcXVlRGF0ZXMuZm9yRWFjaCgoZGF0ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0LnB1c2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlU3RhbmRhcmRGb3JtYXQoZGF5anMoZGF0ZSwgJ01NL0REL1lZJykuZm9ybWF0KCdNTS9ERC9ZWVlZJykpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdDtcclxuICAgIH1cclxuXHJcbiAgICByZU9yZGVyQXBwbGllZEZpbHRlcnNBcnJheShpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkOiBib29sZWFuLCBkYXRlPzogYW55KSB7XHJcbiAgICAgICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZEYXRhSXNGaWx0ZXJlZChpc0ZpbHRlcmVkLCBpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkLCBkYXRlKTtcclxuICAgICAgICB0aGlzLnJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQ6IGJvb2xlYW4sIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09ICd1c2VyJyAmJiAhdGhpcy50b29sdGlwTWFwLmhhcygndXNlcicpKSB7XHJcbiAgICAgICAgICAgIGlzRmlsdGVyZWQgPSBjbG9uZURlZXAoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdTdGFydFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnRW5kVGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdzdGFydFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnZW5kVGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICd0aW1lJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3RpbWVvdXRUaW1lJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ090aGVyQXZhaWxhYmxlU3BvdHNUYWJsZVN0YXJ0VGltZScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVFbmRUaW1lJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3N0YXJ0X3RpbWVfZm9yX2ZpbHRlcicgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdlbmRfdGltZV9mb3JfZmlsdGVyJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3N0YXJ0RW5kVGltZU11bHRpJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSB8fFxyXG4gICAgICAgICAgICAgICAgIXRoaXMuaW5jbHVkZVplcm9UaW1lIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlTXVsdGlUaW1lO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09ICdzdGFydEVuZFRpbWUnIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnVGltZUJhbmQnKSB7XHJcbiAgICAgICAgICAgIGlzRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNsaWRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSAmJiAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5zbGlkZXJEYXRhKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAncG9zdGVkQWR1JyAmJiB0aGlzLnN1YlJhZGlvQnV0dG9uID09ICdub3RSZXF1aXJlZCcpIHtcclxuICAgICAgICAgICAgICAgIGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3N0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdlbmREYXRlJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3BlcmlvZCcgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdBaXJEYXRlJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3RpbWVvdXREYXRlJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09ICdmbGlnaHRTdGFydERhdGUnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gJ2ZsaWdodEVuZERhdGUnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnZGF0ZScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdyZXZpc2lvblN0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdHZW5lcmF0ZWRPbicgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdXZWVrJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSAmJiAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5mbGlnaHREYXRlUmFuZ2UpO1xyXG4gICAgICAgICAgICBpZiAoIWlzRmlsdGVyZWQgJiYgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRvdGFsT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbikubGVuZ3RoO1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXBcclxuICAgICAgICAgICAgICAgIC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKVxyXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbiAmJiB4LmlzU2VsZWN0ZWQpLmxlbmd0aDtcclxuICAgICAgICAgICAgaXNGaWx0ZXJlZCA9IHNlbGVjdGVkT3B0aW9uc0NvdW50ID4gMCAmJiBzZWxlY3RlZE9wdGlvbnNDb3VudCAhPSB0b3RhbE9wdGlvbnNDb3VudCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRmlsdGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgbGV0IHNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuXHJcbiAgICAgICAgaWYgKGlzRmlsdGVyZWQgJiYgIXNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBzZXQuYWRkKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZpbHRlcmVkICYmIHNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSA9IFsuLi5zZXRdO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTb3J0aW5nSXNBcHBsaWVkVGhlblNvcnRUaGVEYXRhKG9yaWdpbmFsRGF0YTogYW55W10pIHtcclxuICAgICAgICBpZiAoIXRoaXMuYW5uYVNvcnRTZXJ2aWNlPy5jb2x1bW5Tb3J0U3RhdGUpIHJldHVybiBvcmlnaW5hbERhdGE7XHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlID09ICdBU0MnKSB7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGEgPSBjbG9uZURlZXAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydERhdGFGb3JDb21wb25lbnRPdGhlclRoYW5MdXJBbmRDc3JQYWdlKHRydWUsIG9yaWdpbmFsRGF0YSwga2V5KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gJ0RFU0MnKSB7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGEgPSBjbG9uZURlZXAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydERhdGFGb3JDb21wb25lbnRPdGhlclRoYW5MdXJBbmRDc3JQYWdlKGZhbHNlLCBvcmlnaW5hbERhdGEsIGtleSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvcmlnaW5hbERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyRGF0YShvcmlnaW5hbERhdGE6IGFueVtdLCBrZXlUb1NraXA6IHN0cmluZywgaXNMdXJDc3JQYWdlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgZmlsdGVyZWREYXRhID0gWy4uLm9yaWdpbmFsRGF0YV07XHJcbiAgICAgICAgaWYgKCFpc0x1ckNzclBhZ2UpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gdGhpcy5jaGVja0lmU29ydGluZ0lzQXBwbGllZFRoZW5Tb3J0VGhlRGF0YShvcmlnaW5hbERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgIT0ga2V5VG9Ta2lwICYmIG9yaWdpbmFsRGF0YS5sZW5ndGggPiAwICYmIE9iamVjdC5rZXlzKG9yaWdpbmFsRGF0YVswXSkuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnc3RhcnREYXRlJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ2VuZERhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnQWlyRGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICd0aW1lb3V0RGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdmbGlnaHRTdGFydERhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnZmxpZ2h0RW5kRGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ2RhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICdEYXRlJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PSAncmV2aXNpb25TdGFydERhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICdHZW5lcmF0ZWRPbicgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdXZWVrJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ1Zpb2xhdGVkU3BvdERhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnVmlvbGF0aW5nU3BvdERhdGUnXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuaXNPYmplY3RJblRoZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdwZXJpb2QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmdldERhdGFJblRoZURhdGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnU3RhcnRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ0VuZFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICd0aW1lb3V0VGltZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdzdGFydFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnZW5kVGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVTdGFydFRpbWUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICdPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVFbmRUaW1lJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ3N0YXJ0X3RpbWVfZm9yX2ZpbHRlcicgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdlbmRfdGltZV9mb3JfZmlsdGVyJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PSAndGltZSdcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdGFydEVuZFRpbWVNdWx0aScgfHwga2V5ID09ICdzdGFydEVuZFRpbWUnIHx8IGtleSA9PT0gJ1RpbWVCYW5kJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXR1cm5EYXRhRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigodSkgPT4gdmFsdWUuaW5jbHVkZXModVtrZXldKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybk9yZGVyc0luVGhlUmFuZ2Uob3JkZXI6IGFueSwgcmFuZ2U6IGFueSwga2V5OiBhbnkpIHtcclxuICAgICAgICBsZXQgaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgPSBkYXlqcyhvcmRlcltrZXldKS5pc0JldHdlZW4ocmFuZ2UubWluU2VsZWN0ZWREYXRlLCByYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIGxldCBpc0RhdGVTYW1lQXNUaGVNaW5TZWxlY3RlZERhdGUgPSBkYXlqcyhvcmRlcltrZXldKS5pc1NhbWUocmFuZ2UubWluU2VsZWN0ZWREYXRlKTtcclxuICAgICAgICBsZXQgaXNEYXRlU2FtZUFzVGhlTWF4U2VsZWN0ZWREYXRlID0gZGF5anMob3JkZXJba2V5XSkuaXNTYW1lKHJhbmdlLm1heFNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIGlzRGF0ZUJldHdlZW5UaGVTZWxlY3RlZFJhbmdlIHx8IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSB8fCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuRGF0YUZvclRpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQgZm9ybWF0ID0gJ0hIOm1tOnNzJztcclxuICAgICAgICBsZXQgc2VsZWN0ZWRTdGFydERhdGUgPSBkYXlqcyhzZWxlY3RlZERhdGEuc3RhcnRUaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEVuZERhdGUgPSBkYXlqcyhzZWxlY3RlZERhdGEuZW5kVGltZSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gZGF5anMob2JqLnN0YXJ0VGltZSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgZW5kVGltZSA9IGRheWpzKG9iai5lbmRUaW1lLCBmb3JtYXQpO1xyXG5cclxuICAgICAgICBsZXQgaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSA9IHN0YXJ0VGltZS5pc1NhbWUoc2VsZWN0ZWRTdGFydERhdGUpO1xyXG4gICAgICAgIGxldCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICAgICAgbGV0IGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSA9IGVuZFRpbWUuaXNTYW1lKHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICAgICAgbGV0IGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IGVuZFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkU3RhcnREYXRlLCBzZWxlY3RlZEVuZERhdGUpO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgICAgIGxldCBmb3JtYXQgPSAnTU0vREQvWVlZWSBISDptbTpzcyc7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRnJvbVRpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgc2VsZWN0ZWREYXRhLmZyb21UaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFRvVGltZSA9IGRheWpzKCcwMS8wMS8yMDAxICcgKyBzZWxlY3RlZERhdGEudG9UaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBvYmpUaW1lID0gb2JqW2tleV07XHJcblxyXG4gICAgICAgIGlmIChbJycsICctJywgbnVsbF0uaW5jbHVkZXMob2JqVGltZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XSA9PSAnPG11bHRpPicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XSA9PSAnPG11bHRpPicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldID09ICcwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT0gJzAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVRpbWVSYW5nZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZGF5anNUaW1lID0gZGF5anMoJzAxLzAxLzIwMDEgJyArIG9ialRpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgICAgIGxldCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZEZyb21UaW1lID0gZGF5anNUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgICAgICBsZXQgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRUb1RpbWUgPSBkYXlqc1RpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcclxuICAgICAgICBsZXQgaXNPYmpUaW1lQmV0d2VlblNlbGVjdGVkRnJvbVRpbWVBbmRUb1RpbWUgPSBkYXlqc1RpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRGcm9tVGltZSB8fFxyXG4gICAgICAgICAgICBpc09ialRpbWVTYW1lQXNTZWxlY3RlZFRvVGltZSB8fFxyXG4gICAgICAgICAgICBpc09ialRpbWVCZXR3ZWVuU2VsZWN0ZWRGcm9tVGltZUFuZFRvVGltZVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgZm9ybWF0ID0gJ01NL0REL1lZWVkgSEg6bW06c3MnO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEZyb21UaW1lID0gZGF5anMoJzAxLzAxLzIwMDEgJyArIHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRUb1RpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgc2VsZWN0ZWREYXRhLnRvVGltZSwgZm9ybWF0KTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkRGF0YS5pbmNsdWRlTXVsdGkgJiYgb2JqW2tleV1bMF0gPT0gJzxtdWx0aT4nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldWzBdID09ICc8bXVsdGk+Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldWzBdID09ICcwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldWzBdID09ICcwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgb2JqW2tleV1bMV0sIGZvcm1hdCk7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgb2JqW2tleV1bMl0sIGZvcm1hdCk7XHJcblxyXG4gICAgICAgIGxldCBpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lID0gc3RhcnRUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgICAgICBsZXQgaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBzdGFydFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuICAgICAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgICAgIGxldCBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBlbmRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iajogYW55LCB2YWx1ZTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgICAgIGxldCBwYXJzaW5nRm9ybWF0OiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgcGFyc2luZ0Zvcm1hdCA9ICdZWVlZLU1NLUREJztcclxuXHJcbiAgICAgICAgICAgIGxldCBkYXlqc1N0YXJ0RGF0ZSA9IGRheWpzKG9iai5zdGFydERhdGUpO1xyXG4gICAgICAgICAgICBsZXQgZGF5anNFbmREYXRlID0gZGF5anMob2JqLmVuZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXJ0RGF0ZUlzQmV0d2VlblNlbERhdGUgPSBkYXlqc1N0YXJ0RGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XHJcbiAgICAgICAgICAgIGxldCBlbmREYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzRW5kRGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnREYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSB2YWx1ZS5mcm9tRGF0ZS5pc1NhbWUoZGF5anNTdGFydERhdGUpO1xyXG4gICAgICAgICAgICBsZXQgZW5kRGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUoZGF5anNFbmREYXRlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAoc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBzdGFydERhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSkgJiZcclxuICAgICAgICAgICAgICAgIChlbmREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBlbmREYXRlSXNTYW1lQXNTZWxFbmREYXRlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIGtleSA9PT0gJ0FpckRhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ2ZsaWdodFN0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnZmxpZ2h0RW5kRGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnV2VlaycgfHxcclxuICAgICAgICAgICAga2V5ID09PSAndGltZW91dERhdGUnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHBhcnNpbmdGb3JtYXQgPSAnTU0vREQvWVlZWSc7XHJcbiAgICAgICAgICAgIGxldCBkYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzKG9ialtrZXldLCBwYXJzaW5nRm9ybWF0KS5pc0JldHdlZW4oXHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5taW5TZWxlY3RlZERhdGUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5tYXhTZWxlY3RlZERhdGUsXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IGRheWpzKG9ialtrZXldLCBwYXJzaW5nRm9ybWF0KS5pc1NhbWUodmFsdWUubWF4U2VsZWN0ZWREYXRlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBkYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBkYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgfHwgZGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRpYWxpemVUaW1lRmlsdGVyRGF0YShjbG9uZWREYXRhOiBhbnlbXSwga2V5ID0gJ3N0YXJ0RW5kVGltZScpIHtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lQXJyID0gbWFwKGNsb25lZERhdGEsICdzdGFydFRpbWUnKTtcclxuICAgICAgICBsZXQgZW5kVGltZUFyciA9IG1hcChjbG9uZWREYXRhLCAnZW5kVGltZScpO1xyXG5cclxuICAgICAgICBzdGFydFRpbWVBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVBc2NlbmRpbmcoYSwgYik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGVuZFRpbWVBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgaW5pdGlhbFN0YXJ0RW5kVGltZSA9IHtcclxuICAgICAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIGVuZFRpbWU6IGVuZFRpbWVBcnJbMF0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBpbml0aWFsU3RhcnRFbmRUaW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5Db2x1bW5GaWx0ZXJTdGF0dXMoZGF0YTogYW55W10sIGhlYWRlck5hbWU6IHN0cmluZyB8IG51bWJlcikge1xyXG4gICAgICAgIGlmIChoZWFkZXJOYW1lID09ICdzdGFydEVuZFRpbWUnKSB7XHJcbiAgICAgICAgICAgIGxldCB0aW1lID0gZGF0YS5tYXAoKHUpID0+IHVbaGVhZGVyTmFtZV1bMF0pO1xyXG4gICAgICAgICAgICBsZXQgdW5pcVRpbWUgPSB1bmlxKHRpbWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gdW5pcVRpbWUubGVuZ3RoID09IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdW5pcShkYXRhLm1hcCgodSkgPT4gdVtoZWFkZXJOYW1lXSkpLmxlbmd0aCA+IDEgPyBmYWxzZSA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyT3B0aW9uc0RhdGEoZGF0YTogYW55W10sIGNsb25lZERhdGE6IGFueVtdLCBrZXk/OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgYXBwbGllZEZpbHRlclNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgICAgICBrZXkgPSBrZXkgPyBrZXkgOiB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgICAgaWYgKGFwcGxpZWRGaWx0ZXJTZXQuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyRGF0YShjbG9uZWREYXRhLCBrZXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZU9yZGVyQXBwbGllZEZpbHRlcnNTdGF0ZShjbG9uZWREYXRhOiBhbnlbXSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGxldCBpc0ZpbHRlcmVkID0gdHJ1ZTtcclxuICAgICAgICBpc0ZpbHRlcmVkID0gdGhpcy5jaGVja0lmRmlsdGVySXNBcHBsaWVkKGNsb25lZERhdGEsIHZhbHVlKTtcclxuICAgICAgICB0aGlzLnJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZCk7XHJcbiAgICAgICAgcmV0dXJuIGlzRmlsdGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZkZpbHRlcklzQXBwbGllZChjbG9uZWREYXRhOiBhbnlbXSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGxldCBpbml0aWFsVmFsdWVPZkNvbHVtbiA9IHNvcnRCeShjbG9uZWREYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVt0aGlzLnNlbGVjdGVkUmFkaW9dKSk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRWYWx1ZU9mQ29sdW1uID0gc29ydEJ5KHRoaXMuYXBwbHlGaWx0ZXIoY2xvbmVkRGF0YSwgdmFsdWUpLm1hcCgoaXRlbSkgPT4gaXRlbVt0aGlzLnNlbGVjdGVkUmFkaW9dKSk7XHJcbiAgICAgICAgcmV0dXJuICFpc0VxdWFsKGluaXRpYWxWYWx1ZU9mQ29sdW1uLCBjdXJyZW50VmFsdWVPZkNvbHVtbik7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlGaWx0ZXIoZGF0YTogYW55W10sIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBsZXQgZmlsdGVyZWREYXRhID0gZGF0YTtcclxuICAgICAgICBsZXQga2V5ID0gdGhpcy5zZWxlY3RlZFJhZGlvO1xyXG4gICAgICAgIGlmICh0aGlzLnNsaWRlclNldC5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IG9ialtrZXldID49IHZhbHVlLm1pbiAmJiBvYmpba2V5XSA8PSB2YWx1ZS5tYXgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIGtleSA9PT0gJ3N0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnZW5kRGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnQWlyRGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAndGltZW91dERhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ2ZsaWdodFN0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnZmxpZ2h0RW5kRGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09ICdkYXRlJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gJ0RhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSAncmV2aXNpb25TdGFydERhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSAnR2VuZXJhdGVkT24nIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ1dlZWsnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ1Zpb2xhdGVkU3BvdERhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ1Zpb2xhdGluZ1Nwb3REYXRlJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuaXNPYmplY3RJblRoZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIGtleSA9PT0gJ1N0YXJ0VGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnRW5kVGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAga2V5ID09ICd0aW1lb3V0VGltZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnc3RhcnRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdlbmRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdzdGFydF90aW1lX2Zvcl9maWx0ZXInIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ2VuZF90aW1lX2Zvcl9maWx0ZXInIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSAndGltZScgfHxcclxuICAgICAgICAgICAga2V5ID09ICdPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVTdGFydFRpbWUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSAnT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlRW5kVGltZSdcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdGFydEVuZFRpbWVNdWx0aScgfHwga2V5ID09ICdzdGFydEVuZFRpbWUnIHx8IGtleSA9PT0gJ1RpbWVCYW5kJykge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKCh1KSA9PiB2YWx1ZS5pbmNsdWRlcyh1W2tleV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBpc09iamVjdEluVGhlUmFuZ2Uob2JqOiBhbnksIHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IG9ialZhbCA9IG9ialtrZXldO1xyXG4gICAgICAgIGxldCBkYXlqc0RhdGUgPSBkYXlqcyhvYmpWYWwpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZnJvbURhdGUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS50b0RhdGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHZhbHVlLmZyb21EYXRlID0gZGF5anMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUodmFsdWUuZnJvbURhdGUsICdERC9NTS9ZWVlZJyksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB2YWx1ZS50b0RhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZSh2YWx1ZS50b0RhdGUsICdERC9NTS9ZWVlZJyksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaXNEYXRlU2FtZUFzU3RhcnRPZlRoZVJhbmdlID0gdmFsdWUuZnJvbURhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICAgICAgbGV0IGlzRGF0ZVNhbWVBc0VuZE9mVGhlUmFuZ2UgPSB2YWx1ZS50b0RhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICAgICAgbGV0IGlzRGF0ZUJldHdlZW5UaGVTdGFydEFuZEVuZE9mUmFuZ2UgPSBkYXlqc0RhdGUuaXNCZXR3ZWVuKHZhbHVlLmZyb21EYXRlLCB2YWx1ZS50b0RhdGUpO1xyXG4gICAgICAgIHJldHVybiBpc0RhdGVTYW1lQXNTdGFydE9mVGhlUmFuZ2UgfHwgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSB8fCBpc0RhdGVCZXR3ZWVuVGhlU3RhcnRBbmRFbmRPZlJhbmdlO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVN0YXRlT2ZUaGVDdXJyZW50RmlsdGVyVGFiKHNvcnRNYXA6IE1hcDxzdHJpbmcsIFNvcnRUeXBlPikge1xyXG4gICAgICAgIGxldCBhY3RpdmVLZXkgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgICAgbGV0IGtleUFycjogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoYWN0aXZlS2V5KSkge1xyXG4gICAgICAgICAgICAgICAga2V5QXJyID0ga2V5LnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZVtrZXldID0gdGhpcy5pc1Rvb2x0aXBBY3RpdmUoa2V5QXJyLCBzb3J0TWFwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVN0YXRlT2ZBbGxUaGVLZXlzKHNvcnRNYXA6IE1hcDxzdHJpbmcsIFNvcnRUeXBlPikge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgbGV0IGtleUFyciA9IGtleS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICB0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZVtrZXldID0gdGhpcy5pc1Rvb2x0aXBBY3RpdmUoa2V5QXJyLCBzb3J0TWFwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRIb3VyKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT0gJycpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQodmFsdWUpIDwgMTIpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSkgKyAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudEhvdXIodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PSAnJykge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IDEyO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQodmFsdWUpID4gMSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKSAtIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAxMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE1pbnV0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgLy8gaW5jcmVtZW50IHRvIG5lYXJlc3QgcHJvcGVyIGludGVydmFsKDE1LDMwLDQ1KVxyXG4gICAgICAgIGxldCBtaW4gPSBwYXJzZUludCh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKG1pbiA8PSAxNCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9ICcxNSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMTUgJiYgbWluIDw9IDI5KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJzMwJztcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAzMCAmJiBtaW4gPD0gNDQpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnNDUnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDQ1KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJzAwJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudE1pbnV0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KHZhbHVlKTtcclxuICAgICAgICBpZiAobWluID4gMCAmJiBtaW4gPD0gMTUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnMDAnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDE2ICYmIG1pbiA8PSAzMCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9ICcxNSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMzEgJiYgbWluIDw9IDQ1KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJzMwJztcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+IDQ1IHx8IG1pbiA9PSAwKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJzQ1JztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PUNoZWNrYm94IG1ldGhvZD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vL1xyXG5cclxuICAgIGRpc2FibGVBY3RpdmVGaWx0ZXJDbGVhckJ1dHRvbigpIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA9IHRoaXMuZ2V0Q29sdW1uU29ydFN0YXRlRm9yU2VsZWN0ZWRSYWRpbygpO1xyXG4gICAgICAgIGxldCBpc1NvcnRQcmVzZW50ID1cclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zaXplID4gMCAmJlxyXG4gICAgICAgICAgICBjdXJyZW50Q29sdW1uU29ydEZpbHRlciAhPSBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuXHJcbiAgICAgICAgcmV0dXJuICEoc2VsZWN0ZWRGaWx0ZXJTZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykgfHwgaXNTb3J0UHJlc2VudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29sdW1uU29ydFN0YXRlRm9yU2VsZWN0ZWRSYWRpbygpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA9XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykgJiZcclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gY3VycmVudENvbHVtblNvcnRGaWx0ZXIgPyBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA6IFNvcnRUeXBlRW51bS5ERUZBVUxUO1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50Q29sdW1uU29ydEZpbHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVMaXN0Rm9yQ2hlY2tib3hGaWx0ZXIoaGVhZGVyOiBzdHJpbmcsIG9wdGlvbkRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHRvb2x0aXBPcHRpb25zID0gdGhpcy5nZXRUb29sdGlwTW9kZWxGcm9tT3B0aW9uRGF0YShvcHRpb25EYXRhLCBoZWFkZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdFVuc2VsZWN0TGlzdENoZWNrYm94KHRvb2x0aXBPcHRpb25zLCBoZWFkZXIpO1xyXG4gICAgICAgIHRoaXMuZm9ybWF0TnVsbE9wdGlvblRvU3BlY2lmaWVkU3RyaW5nKHRvb2x0aXBPcHRpb25zLCAnLScpO1xyXG5cclxuICAgICAgICByZXR1cm4gdG9vbHRpcE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG9vbHRpcE1vZGVsRnJvbU9wdGlvbkRhdGEob3B0aW9uRGF0YTogYW55W10sIGhlYWRlcjogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHVuaXFPcHRpb25EYXRhID0gdW5pcShvcHRpb25EYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVtoZWFkZXJdKSk7XHJcbiAgICAgICAgcmV0dXJuIHVuaXFPcHRpb25EYXRhLm1hcCgoaXRlbSwgaW5kZXgpID0+IG5ldyBUb29sdGlwTW9kZWwoaXRlbSwgaW5kZXggKyAxKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VW5zZWxlY3RMaXN0Q2hlY2tib3godG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBoZWFkZXI6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRWYWx1ZVNldCA9IG5ldyBTZXQodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGhlYWRlcikpO1xyXG4gICAgICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5pc1NlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZVNldC5oYXMoaXRlbS52YWx1ZSkgPyB0cnVlIDogZmFsc2UpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5pc1NlbGVjdGVkID0gdHJ1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3JtYXROdWxsT3B0aW9uVG9TcGVjaWZpZWRTdHJpbmcodG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBmb3JtYXR0ZWRTdHJpbmc6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRvb2x0aXBPcHRpb25zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PSBudWxsKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHRvb2x0aXBPcHRpb25zW2luZGV4XS5sYWJlbCA9IGZvcm1hdHRlZFN0cmluZztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2xvbmVkVG9vbHRpcEFuZFRvb2x0aXBPcHRpb24odG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBzb3J0QnlTdHJpbmc6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBbc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEl0ZW1zXSA9IHRoaXMuZ2V0U2VsZWN0ZWRBbmRVbnNlbGVjdGVkSXRlbXModG9vbHRpcE9wdGlvbnMpO1xyXG4gICAgICAgIGxldCBzb3J0ZWRTZWxlY3RlZEl0ZW1zID0gc29ydEJ5KHNlbGVjdGVkSXRlbXMsIHNvcnRCeVN0cmluZyk7XHJcbiAgICAgICAgbGV0IHNvcnRlZFVuc2VsZWN0ZWRJdGVtcyA9IHNvcnRCeSh1bnNlbGVjdGVkSXRlbXMsIHNvcnRCeVN0cmluZyk7XHJcblxyXG4gICAgICAgIGxldCBjbG9uZWRUb29sdGlwT3B0aW9ucyA9IFsuLi5zb3J0ZWRTZWxlY3RlZEl0ZW1zLCAuLi5zb3J0ZWRVbnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgICAgIGxldCB1cGRhdGVkVG9vbHRpcE9wdGlvbnMgPSBjbG9uZURlZXAoY2xvbmVkVG9vbHRpcE9wdGlvbnMpO1xyXG5cclxuICAgICAgICByZXR1cm4gW2Nsb25lZFRvb2x0aXBPcHRpb25zLCB1cGRhdGVkVG9vbHRpcE9wdGlvbnMsIHNlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRJdGVtc107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SGVpZ2h0T2ZDaGVja2JveFRvb2x0aXBGaWx0ZXIoZGF0YUxlbmd0aDogbnVtYmVyLCBtYXJnaW46IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBkYXRhTGVuZ3RoID4gNiA/IDIwMCA6IDI2LjAzICogZGF0YUxlbmd0aCArIG1hcmdpbiAqIGRhdGFMZW5ndGggKyBtYXJnaW47XHJcbiAgICB9XHJcblxyXG4gICAgdW5DaGVja0FsbENoZWNrYm94KHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSwgY2xvbmVkVG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChvcHQpID0+IG9wdC5pZCA9PSBpdGVtLmlkKTtcclxuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnNbaW5kZXhdLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RBbGxDaGVja2JveCh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChvcHQpID0+IG9wdC5pZCA9PSBpdGVtLmlkKTtcclxuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnNbaW5kZXhdLmlzU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFVuc2VsZWN0Q2hlY2tib3goZGF0YTogVG9vbHRpcE1vZGVsLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBkYXRhLmlzU2VsZWN0ZWQgPSAhZGF0YS5pc1NlbGVjdGVkO1xyXG4gICAgICAgIGxldCBpbmRleCA9IGNsb25lZFRvb2x0aXBPcHRpb25zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PSBkYXRhLmlkKTtcclxuICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9uc1tpbmRleF0uaXNTZWxlY3RlZCA9IGRhdGEuaXNTZWxlY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RlZEFuZFVuc2VsZWN0ZWRJdGVtcyh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRJdGVtcyA9IHRvb2x0aXBPcHRpb25zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5pc1NlbGVjdGVkKTtcclxuICAgICAgICBsZXQgdW5zZWxlY3RlZEl0ZW1zID0gdG9vbHRpcE9wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc1NlbGVjdGVkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFtzZWxlY3RlZEl0ZW1zLCB1bnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENoZWNrYm94UHJldmlvdXNTZWxlY3RlZFZhbHVlKGNsb25lZFRhYmxlRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTZWxlY3RlZFZhbHVlID0gW107XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsVmFsdWUgPSBzb3J0QnkodW5pcShjbG9uZWRUYWJsZURhdGEubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBpbml0aWFsVmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSBzb3J0QnkodW5pcShjbG9uZWRUYWJsZURhdGEubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENoZWNrYm94Q3VycmVudFNlbGVjdGVkVmFsdWUoc2VhcmNoZWRTdHJpbmc6IHN0cmluZywgdG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gW107XHJcblxyXG4gICAgICAgIGlmICh0b29sdGlwT3B0aW9ucykge1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IHNvcnRCeSh0b29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaXNTZWxlY3RlZCkubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAhc2VhcmNoZWRTdHJpbmcgJiZcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlLmxlbmd0aCA9PSB0b29sdGlwT3B0aW9ucy5sZW5ndGggJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGJsYW5rSW5kZXggPSBjdXJyZW50U2VsZWN0ZWRWYWx1ZS5maW5kSW5kZXgoKGl0ZW06IHN0cmluZykgPT4gaXRlbSA9PSBudWxsKTtcclxuICAgICAgICBpZiAoYmxhbmtJbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IHNvcnRCeShjdXJyZW50U2VsZWN0ZWRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY3VycmVudFNlbGVjdGVkVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZlNvcnRpbmdDaGFuZ2VkKHRlbXBTb3J0T3JkZXI6IFNvcnRUeXBlKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gdGhpcy5nZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk7XHJcblxyXG4gICAgICAgIGxldCBpc1NvcnRDaGFuZ2VkID0gdGVtcFNvcnRPcmRlciAhPSBudWxsICYmIHRlbXBTb3J0T3JkZXIgIT0gY3VycmVudENvbHVtblNvcnRGaWx0ZXI7XHJcbiAgICAgICAgcmV0dXJuIGlzU29ydENoYW5nZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyZWRPcHRpb25Bc0JvbGRTdHJpbmcoc3RyOiBzdHJpbmcsIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIGxldCB0b29sdGlwT3B0aW9ucyA9IGNsb25lRGVlcChcclxuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmxhYmVsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzdHIudG9Mb3dlckNhc2UoKSkpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmxhYmVsID0gdGhpcy5ib2xkU3RyaW5nKGVsZW1lbnQubGFiZWwsIHN0cik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b29sdGlwT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBib2xkU3RyaW5nKHN0cjogc3RyaW5nLCBmaW5kOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgaW5kZXhlcyA9IHRoaXMuZ2V0SW5kaWNlc09mKGZpbmQsIHN0ciwgZmFsc2UpO1xyXG5cclxuICAgICAgICBpbmRleGVzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gaXRlbSArIGluZGV4ICogNzsgLy9NdWx0aXBseWluZyBieSA3IGFzIHRoZXJlIGFyZSA3Y2hhcjogPGI+PC9iPlxyXG4gICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgZmluZC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGxldCBzdHJUb0JlUmVwbGFjZWQgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcclxuICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2Uoc3RyVG9CZVJlcGxhY2VkLCAnPGI+JyArIHN0clRvQmVSZXBsYWNlZCArICc8L2I+Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbmRpY2VzT2Yoc2VhcmNoU3RyOiBzdHJpbmcsIHN0cjogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIHNlYXJjaFN0ckxlbiA9IHNlYXJjaFN0ci5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHNlYXJjaFN0ckxlbiA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAwLFxyXG4gICAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgICAgaW5kaWNlcyA9IFtdO1xyXG4gICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xyXG4gICAgICAgICAgICBzdHIgPSBzdHIudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgc2VhcmNoU3RyID0gc2VhcmNoU3RyLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlICgoaW5kZXggPSBzdHIuaW5kZXhPZihzZWFyY2hTdHIsIHN0YXJ0SW5kZXgpKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGluZGljZXMucHVzaChpbmRleCk7XHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleCArIHNlYXJjaFN0ckxlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZUFsbEJ0bnNXaGVuVGhlcmVBcmVOb0ZpbHRlcmVkUmVzdWx0cygpOiBbbnVtYmVyLCBib29sZWFuLCBib29sZWFuLCBib29sZWFuXSB7XHJcbiAgICAgICAgLy8gW3NlbGVjdGVkQ2hlY2tib3hPcHRpb25zQ291bnQsIGRpc2FibGVDaGVja2JveEFwcGx5LCBkaXNhYmxlQ2xlYXJBbGwsIGRpc2FibGVTZWxlY3RBbGxdO1xyXG4gICAgICAgIHJldHVybiBbMCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV07XHJcbiAgICB9XHJcblxyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1DYWxlbmRhciBmaWx0ZXI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcbiAgICBjcmVhdGVSYW5nZUZvclRoZURhdGVGaWx0ZXIob3B0aW9uRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgbWluTWF4RGF0ZTtcclxuICAgICAgICAvL1doZW4geW91IHdhbnQgdG8gdXNlIHN0YXJ0RGF0ZSBhbmQgZW5kRGF0ZSBjb21iaW5lZCBhcyBzaW5nbGUgY29sdW1uIHRoZW4gdXNlIFBlcmlvZC5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAncGVyaW9kJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ2J1eWVyRmxpZ2h0RGF0ZXMnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAndHJhZmZpY0ZsaWdodERhdGVzJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gdGhpcy5jcmVhdGVTdGFydEVuZERhdGVSYW5nZShvcHRpb25EYXRhKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKG9wdGlvbkRhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWluTWF4RGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVTdGFydEVuZERhdGVSYW5nZShvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5TdGFydERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUob3B0aW9uRGF0YSwgJ3N0YXJ0RGF0ZScpO1xyXG4gICAgICAgIGxldCBtYXhFbmREYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKG9wdGlvbkRhdGEsICdlbmREYXRlJyk7XHJcbiAgICAgICAgcmV0dXJuIFttaW5TdGFydERhdGVbMF0sIG1heEVuZERhdGVbMV1dO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1pbkFuZE1heERhdGVSYW5nZUZvckNhbGVuZGFyKG1pbk1heERhdGU6IGFueVtdLCBwYXJzaW5nRm9ybWF0OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY2FsZW5kYXJNaW5FbmFibGVkRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVswXSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgbGV0IGNhbGVuZGFyTWF4RW5hYmxlZERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgIHJldHVybiBbY2FsZW5kYXJNaW5FbmFibGVkRGF0ZSwgY2FsZW5kYXJNYXhFbmFibGVkRGF0ZV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0ZWREYXRlRm9yQ2FsZW5kYXIobWluTWF4RGF0ZTogYW55W10sIHBhcnNpbmdGb3JtYXQ6IHN0cmluZywgbWluRGF0ZTogTmdiRGF0ZVR5cGUsIG1heERhdGU6IE5nYkRhdGVUeXBlKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkTWluRGF0ZTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRNYXhEYXRlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZU9iaiA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0ZU9iai5mcm9tRGF0ZS5pc0FmdGVyKG1pbk1heERhdGVbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1pbkRhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHNlbGVjdGVkRGF0ZU9iai5mcm9tRGF0ZSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1pbkRhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMF0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlT2JqLnRvRGF0ZS5pc0FmdGVyKG1pbk1heERhdGVbMV0pKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRNYXhEYXRlID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShzZWxlY3RlZERhdGVPYmoudG9EYXRlLCBwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkTWluRGF0ZSA9IGNsb25lRGVlcChtaW5EYXRlKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRNYXhEYXRlID0gY2xvbmVEZWVwKG1heERhdGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFtzZWxlY3RlZE1pbkRhdGUsIHNlbGVjdGVkTWF4RGF0ZV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJldmlvdXNTZWxlY3RlZERhdGVzRm9yQ2FsZW5kYXIob3B0aW9uRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTZWxlY3RlZERhdGU6IHsgZnJvbURhdGU6IGFueTsgdG9EYXRlOiBhbnkgfSA9IHsgZnJvbURhdGU6IG51bGwsIHRvRGF0ZTogbnVsbCB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZERhdGUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yRGF0ZUZpbHRlcihvcHRpb25EYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZERhdGUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvckRhdGVGaWx0ZXIob3B0aW9uRGF0YSk7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWREYXRlID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFZhbHVlTWFwRm9yRGF0ZUZpbHRlcihvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5NYXhEYXRlID0gdGhpcy5jcmVhdGVSYW5nZUZvclRoZURhdGVGaWx0ZXIob3B0aW9uRGF0YSk7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZERhdGUgPSB7IGZyb21EYXRlOiBtaW5NYXhEYXRlWzBdLCB0b0RhdGU6IG1pbk1heERhdGVbMV0gfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBzZWxlY3RlZERhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRTZWxlY3RlZERhdGVzRm9yQ2FsZW5kYXIoY3VycmVudFNlbGVjdGVkRGF0ZTogYW55LCBtaW5EYXRlOiBOZ2JEYXRlVHlwZSwgbWF4RGF0ZTogTmdiRGF0ZVR5cGUpIHtcclxuICAgICAgICBsZXQgZnJvbURhdGUgPSB7XHJcbiAgICAgICAgICAgIHllYXI6IGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUueWVhcixcclxuICAgICAgICAgICAgbW9udGg6IGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUubW9udGgsXHJcbiAgICAgICAgICAgIGRheTogY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZS5kYXksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgdG9EYXRlID0ge1xyXG4gICAgICAgICAgICB5ZWFyOiBjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZS55ZWFyLFxyXG4gICAgICAgICAgICBtb250aDogY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUubW9udGgsXHJcbiAgICAgICAgICAgIGRheTogY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUuZGF5LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChpc0VxdWFsKG1pbkRhdGUsIGZyb21EYXRlKSAmJiBpc0VxdWFsKG1heERhdGUsIHRvRGF0ZSkgJiYgdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkRGF0ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlID0gZGF5anMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0ZWREYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09U0xJREVSPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vL1xyXG5cclxuICAgIGdldFNsaWRlclRyYW5zbGF0ZUZ1bmNWYWwoaGVhZGVyOiBzdHJpbmcsIGN1cnJlbmN5U2V0OiBTZXQ8c3RyaW5nPikge1xyXG4gICAgICAgIGxldCB0cmFuc2xhdGVGdW5jO1xyXG5cclxuICAgICAgICBpZiAoY3VycmVuY3lTZXQuaGFzKGhlYWRlcikpIHtcclxuICAgICAgICAgICAgdHJhbnNsYXRlRnVuYyA9ICdjdXJyZW5jeSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIgPT0gJ3Bvc3RlZEF1ZFBlcmNlbnQnIHx8IGhlYWRlciA9PSAncGFyZW50Um93U2hhcmVzJyB8fCBoZWFkZXIgPT0gJ3BhcmVudFJvd1B1dFBlcmNlbnQnKSB7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZUZ1bmMgPSAncGVyY2VudCc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHJhbnNsYXRlRnVuYyA9ICdub3JtYWwnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUZ1bmM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2xpZGVyT3B0aW9ucyhvcHRpb25zRGF0YTogYW55W10sIHRyYW5zbGF0ZUZ1bmM6IHN0cmluZywgaGVhZGVyOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgbWluVmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKG9wdGlvbnNEYXRhLCBoZWFkZXIsIHRydWUpO1xyXG4gICAgICAgIGxldCBtYXhWYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUob3B0aW9uc0RhdGEsIGhlYWRlciwgZmFsc2UpO1xyXG5cclxuICAgICAgICBsZXQgb2JqID0gdGhpcy5zZXRPcHRpb25WYWx1ZXMobWluVmFsdWUsIG1heFZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09ICdub3JtYWwnKSB7XHJcbiAgICAgICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLm5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlRnVuYyA9PT0gJ3BlcmNlbnQnKSB7XHJcbiAgICAgICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLnBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09ICdjdXJyZW5jeScpIHtcclxuICAgICAgICAgICAgb2JqLnRyYW5zbGF0ZSA9IHRoaXMuY3VycmVuY3lUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0ZWRSYW5nZUZvclNsaWRlcihoZWFkZXI6IHN0cmluZywgb3B0aW9uczogT3B0aW9ucykge1xyXG4gICAgICAgIGxldCBzbGlkZXJNaW5WYWx1ZTtcclxuICAgICAgICBsZXQgc2xpZGVyTWF4VmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRPYmogPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKTtcclxuICAgICAgICAgICAgc2xpZGVyTWluVmFsdWUgPSBzZWxlY3RlZE9iai5taW4gPCBvcHRpb25zLmZsb29yID8gb3B0aW9ucy5mbG9vciA6IHNlbGVjdGVkT2JqLm1pbjtcclxuICAgICAgICAgICAgc2xpZGVyTWF4VmFsdWUgPSBzZWxlY3RlZE9iai5tYXggPCBvcHRpb25zLmNlaWwgPyBzZWxlY3RlZE9iai5tYXggOiBvcHRpb25zLmNlaWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2xpZGVyTWluVmFsdWUgPSBvcHRpb25zLmZsb29yO1xyXG4gICAgICAgICAgICBzbGlkZXJNYXhWYWx1ZSA9IG9wdGlvbnMuY2VpbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbc2xpZGVyTWluVmFsdWUsIHNsaWRlck1heFZhbHVlXTtcclxuICAgIH1cclxuXHJcbiAgICBpc1ZhbHVlSW5SYW5nZShvcHRpb25zOiBPcHRpb25zLCB2YWw6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBvcHRpb25zLmZsb29yIDw9IHZhbCAmJiB2YWwgPD0gb3B0aW9ucy5jZWlsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2VsZWN0ZWRWYWx1ZUZvclNsaWRlcihjbG9uZWREYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBwcmV2aW91c1NsaWRlckRhdGE6IHsgbWluOiBhbnk7IG1heDogYW55IH0gPSB7IG1pbjogJycsIG1heDogJycgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2xpZGVyRGF0YSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBGb3JTbGlkZXJGaWx0ZXIoY2xvbmVkRGF0YSk7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2xpZGVyRGF0YSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzU2xpZGVyRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsVmFsdWVNYXBGb3JTbGlkZXJGaWx0ZXIoY2xvbmVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgbWluVmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKGNsb25lZERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbywgdHJ1ZSk7XHJcbiAgICAgICAgbGV0IG1heFZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShjbG9uZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIGZhbHNlKTtcclxuICAgICAgICBsZXQgc2xpZGVyRGF0YSA9IHsgbWluOiBtaW5WYWx1ZSwgbWF4OiBtYXhWYWx1ZSB9O1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHNsaWRlckRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRTZWxlY3RlZFZhbHVlRm9yU2xpZGVyKG1pbkVudGVyZWRWYWw6IG51bWJlciwgbWF4RW50ZXJlZFZhbDogbnVtYmVyLCBvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRTbGlkZXJEYXRhOiB7IG1pbjogYW55OyBtYXg6IGFueSB9ID0geyBtaW46IG51bGwsIG1heDogbnVsbCB9O1xyXG4gICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1heCA9IG1heEVudGVyZWRWYWw7XHJcbiAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWluID0gbWluRW50ZXJlZFZhbDtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5taW4gPT0gb3B0aW9ucy5mbG9vciAmJlxyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5tYXggPT0gb3B0aW9ucy5jZWlsICYmXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY3VycmVudFNsaWRlckRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVRJTUU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcbiAgICBnZXRTZWxlY3RlZFRpbWVSYW5nZShoZWFkZXI6IHN0cmluZywgY2xvbmVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZTogYW55W107XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkVG9UaW1lOiBhbnlbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKS5mcm9tVGltZTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKS50b1RpbWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBGb3JUaW1lRmlsdGVyKGNsb25lZERhdGEsIGhlYWRlcik7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQoaGVhZGVyKS5mcm9tVGltZTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQoaGVhZGVyKS50b1RpbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWRGcm9tVGltZSAhPSB1bmRlZmluZWQgfHwgc2VsZWN0ZWRUb1RpbWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmZvcm1hdFRvVHdlbHZlSHJzKHNlbGVjdGVkRnJvbVRpbWUsIHRydWUpO1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuZm9ybWF0VG9Ud2VsdmVIcnMoc2VsZWN0ZWRUb1RpbWUsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSBbJy0nLCAnLScsICctJ107XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVG9UaW1lID0gWyctJywgJy0nLCAnLSddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFtzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZV07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFZhbHVlTWFwRm9yVGltZUZpbHRlcihjbG9uZWREYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoa2V5ID09ICdzdGFydEVuZFRpbWUnIHx8IGtleSA9PSAnVGltZUJhbmQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YSwga2V5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZUZvclN0YXJ0T3JFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YSwga2V5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy91c2UgZm9yIGZpbHRlciB3aGVyZSB3ZSBoYXZlIHN0YXJ0IGFuZCBlbmQgdGltZSByYW5nZSBpbiBvbmUgZmlsdGVyXHJcbiAgICAvL3N0YXJ0RW5kVGltZTogW1wiNiAtIDdBXCIsIFwiMDY6IDAwIDogMDBcIiAsIFwiMDc6MDA6MDBcIl1cclxuICAgIHNldEluaXRpYWxWYWx1ZUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKGNsb25lZERhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBpbmNsdWRlTXVsdGkgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XVswXSA9PSAnPG11bHRpPicpICE9IC0xO1xyXG4gICAgICAgIGxldCBpbmNsdWRlWmVybyA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldWzBdID09ICcwJykgIT0gLTE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVUaW1lUmFuZ2UgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XVswXSAhPSAnMCcgJiYgb2JqW2tleV1bMF0gIT0gJzxtdWx0aT4nKSAhPSAtMTtcclxuXHJcbiAgICAgICAgbGV0IGZpbHRlcmVkU3RhcnRUaW1lID0gY2xvbmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gIVsnJywgJy0nLCBudWxsLCAnMCcsICc8bXVsdGk+J10uaW5jbHVkZXMob2JqWydzdGFydFRpbWUnXSkpO1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZEVuZFRpbWUgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhWycnLCAnLScsIG51bGwsICcwJywgJzxtdWx0aT4nXS5pbmNsdWRlcyhvYmpbJ2VuZFRpbWUnXSkpO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnRUaW1lQXJyID0gbWFwKGZpbHRlcmVkU3RhcnRUaW1lLCAnc3RhcnRUaW1lJyk7XHJcbiAgICAgICAgbGV0IGVuZFRpbWVBcnIgPSBtYXAoZmlsdGVyZWRFbmRUaW1lLCAnZW5kVGltZScpO1xyXG5cclxuICAgICAgICBzdGFydFRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZW5kVGltZUFyci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lRGVzY2VuZGluZyhhLCBiKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgZnJvbVRpbWU6IHN0YXJ0VGltZUFyclswXSxcclxuICAgICAgICAgICAgdG9UaW1lOiBlbmRUaW1lQXJyWzBdLFxyXG4gICAgICAgICAgICBpbmNsdWRlTXVsdGk6IGluY2x1ZGVNdWx0aSxcclxuICAgICAgICAgICAgaW5jbHVkZVplcm86IGluY2x1ZGVaZXJvLFxyXG4gICAgICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBpbmNsdWRlVGltZVJhbmdlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLy91c2UgZm9yIHRoZSBmaWx0ZXJzIHdoZXJlIHdlIGhhdmUgZGlmZmVyZW50IGZpbHRlciBmb3Igc3RhcnQgYW5kIGVuZCB0aW1lXHJcbiAgICAvL3N0YXJ0VGltZTogXCIwNjowMDowMFwiXHJcbiAgICBzZXRJbml0aWFsVmFsdWVGb3JTdGFydE9yRW5kVGltZVJhbmdlKGNsb25lZERhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBpbmNsdWRlTXVsdGkgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XSA9PSAnPG11bHRpPicpICE9IC0xO1xyXG4gICAgICAgIGxldCBpbmNsdWRlWmVybyA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldID09ICcwJykgIT0gLTE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVUaW1lUmFuZ2UgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XSAhPSAnMCcgJiYgb2JqW2tleV0gIT0gJzxtdWx0aT4nKSAhPSAtMTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhWycnLCAnLScsIG51bGwsICcwJywgJzxtdWx0aT4nXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG5cclxuICAgICAgICBsZXQgdGltZUFyciA9IG1hcChkYXRhLCBrZXkpO1xyXG4gICAgICAgIHRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgZnJvbVRpbWU6IHRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIHRvVGltZTogdGltZUFyclt0aW1lQXJyLmxlbmd0aCAtIDFdLFxyXG4gICAgICAgICAgICBpbmNsdWRlTXVsdGk6IGluY2x1ZGVNdWx0aSxcclxuICAgICAgICAgICAgaW5jbHVkZVplcm86IGluY2x1ZGVaZXJvLFxyXG4gICAgICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBpbmNsdWRlVGltZVJhbmdlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VW5zZWxlY3RUaW1lRmlsdGVyQ2hlY2tib3goa2V5OiBzdHJpbmcsIG9wdGlvbnNEYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBzaG93TXVsdGlUaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2hvd1plcm9UaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2hvd0VudGVyVGltZUNoZWNrYm94ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB6ZXJvVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBlbnRlclRpbWVDaGVja2JveENoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkVGltZU9iajtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVGltZU9iaiA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChrZXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVGltZU9iaiA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldChrZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpbWVBcnI6IHN0cmluZ1tdO1xyXG4gICAgICAgIGlmIChrZXkgPT0gJ3N0YXJ0RW5kVGltZScgfHwga2V5ID09ICdUaW1lQmFuZCcpIHtcclxuICAgICAgICAgICAgdGltZUFyciA9IG9wdGlvbnNEYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVtrZXldWzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aW1lQXJyID0gb3B0aW9uc0RhdGEubWFwKChpdGVtKSA9PiBpdGVtW2tleV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVBcnIuZmluZEluZGV4KCh2YWwpID0+IHZhbCA9PSAnMCcpICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHNob3daZXJvVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICAgICAgemVyb1RpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZFRpbWVPYmouaW5jbHVkZVplcm87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZUFyci5maW5kSW5kZXgoKHZhbCkgPT4gdmFsID09ICc8bXVsdGk+JykgIT0gLTEpIHtcclxuICAgICAgICAgICAgc2hvd011bHRpVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICAgICAgbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkID0gc2VsZWN0ZWRUaW1lT2JqLmluY2x1ZGVNdWx0aTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG93WmVyb1RpbWVDaGVja2JveCB8fCBzaG93TXVsdGlUaW1lQ2hlY2tib3gpIHtcclxuICAgICAgICAgICAgc2hvd0VudGVyVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lQXJyLmZpbmRJbmRleCgodmFsKSA9PiB2YWwgIT0gJzxtdWx0aT4nICYmIHZhbCAhPSAnMCcpICE9IC0xKSB7XHJcbiAgICAgICAgICAgIGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkVGltZU9iaj8uaW5jbHVkZVRpbWVSYW5nZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNob3dNdWx0aVRpbWVDaGVja2JveDogc2hvd011bHRpVGltZUNoZWNrYm94LFxyXG4gICAgICAgICAgICBzaG93WmVyb1RpbWVDaGVja2JveDogc2hvd1plcm9UaW1lQ2hlY2tib3gsXHJcbiAgICAgICAgICAgIHNob3dFbnRlclRpbWVDaGVja2JveDogc2hvd0VudGVyVGltZUNoZWNrYm94LFxyXG4gICAgICAgICAgICBtdWx0aVRpbWVDaGVja2JveENoZWNrZWQ6IG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCxcclxuICAgICAgICAgICAgemVyb1RpbWVDaGVja2JveENoZWNrZWQ6IHplcm9UaW1lQ2hlY2tib3hDaGVja2VkLFxyXG4gICAgICAgICAgICBlbnRlclRpbWVDaGVja2JveENoZWNrZWQ6IGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTdGFydFRpbWVJc0FmdGVyRW5kVGltZShzdGFydFRpbWU6IHN0cmluZ1tdLCBlbmRUaW1lOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGxldCB0aW1lRm9ybWF0ID0gJ0hIOm1tOnNzJztcclxuXHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBzdGFydFRpbWVbMF0gKyAnOicgKyBzdGFydFRpbWVbMV0gKyAnICcgKyBzdGFydFRpbWVbMl0sXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lMjRIckZvcm1hdCA9IHN0YXJ0VGltZTI0SHJGb3JtYXRBcnJbMF0gKyAnOicgKyBzdGFydFRpbWUyNEhyRm9ybWF0QXJyWzFdICsgJzowMCc7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcclxuICAgICAgICAgICAgZW5kVGltZVswXSArICc6JyArIGVuZFRpbWVbMV0gKyAnICcgKyBlbmRUaW1lWzJdLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUyNEhyRm9ybWF0ID0gZW5kVGltZTI0SHJGb3JtYXRBcnJbMF0gKyAnOicgKyBlbmRUaW1lMjRIckZvcm1hdEFyclsxXSArICc6MDAnO1xyXG4gICAgICAgIHJldHVybiBkYXlqcyhzdGFydFRpbWUyNEhyRm9ybWF0LCB0aW1lRm9ybWF0KS5pc0FmdGVyKGRheWpzKGVuZFRpbWUyNEhyRm9ybWF0LCB0aW1lRm9ybWF0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIoKSB7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkVGltZUZpbHRlcihcclxuICAgICAgICBzdGFydFRpbWU6IHN0cmluZ1tdLFxyXG4gICAgICAgIGVuZFRpbWU6IHN0cmluZ1tdLFxyXG4gICAgICAgIGluY2x1ZGVNdWx0aTogYm9vbGVhbixcclxuICAgICAgICBpbmNsdWRlWmVybzogYm9vbGVhbixcclxuICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFuLFxyXG4gICAgKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcblxyXG4gICAgICAgIGxldCBmcm9tVGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBzdGFydFRpbWVbMF0gKyAnOicgKyBzdGFydFRpbWVbMV0gKyAnICcgKyBzdGFydFRpbWVbMl0sXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgZnJvbVRpbWUyNEhyRm9ybWF0ID0gZnJvbVRpbWUyNEhyRm9ybWF0QXJyWzBdICsgJzonICsgZnJvbVRpbWUyNEhyRm9ybWF0QXJyWzFdICsgJzowMCc7XHJcblxyXG4gICAgICAgIGxldCB0b1RpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcclxuICAgICAgICAgICAgZW5kVGltZVswXSArICc6JyArIGVuZFRpbWVbMV0gKyAnICcgKyBlbmRUaW1lWzJdLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHRvVGltZTI0SHJGb3JtYXQgPSB0b1RpbWUyNEhyRm9ybWF0QXJyWzBdICsgJzonICsgdG9UaW1lMjRIckZvcm1hdEFyclsxXSArICc6MDAnO1xyXG5cclxuICAgICAgICBjdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogZnJvbVRpbWUyNEhyRm9ybWF0LFxyXG4gICAgICAgICAgICB0b1RpbWU6IHRvVGltZTI0SHJGb3JtYXQsXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxyXG4gICAgICAgICAgICBpbmNsdWRlWmVybzogaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50SG91cklucHV0KGFycjogYW55W10pIHtcclxuICAgICAgICBpZiAoYXJyWzBdID09ICcnKSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludChhcnJbMF0pIDwgMTIpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gcGFyc2VJbnQoYXJyWzBdKSArIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVjcmVtZW50SG91cklucHV0KGFycjogYW55W10pIHtcclxuICAgICAgICBpZiAoYXJyWzBdID09ICcnKSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IDEyO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQoYXJyWzBdKSA+IDEpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gcGFyc2VJbnQoYXJyWzBdKSAtIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE1pbnV0ZUlucHV0KGFycjogYW55W10pIHtcclxuICAgICAgICAvLyBpbmNyZW1lbnQgdG8gbmVhcmVzdCBwcm9wZXIgaW50ZXJ2YWwoMTUsMzAsNDUpXHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KGFyclsxXSk7XHJcbiAgICAgICAgaWYgKG1pbiA8PSAxNCkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSAnMTUnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDE1ICYmIG1pbiA8PSAyOSkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSAnMzAnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDMwICYmIG1pbiA8PSA0NCkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSAnNDUnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDQ1KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICcwMCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudE1pbnV0ZUlucHV0KGFycjogYW55KSB7XHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KGFyclsxXSk7XHJcbiAgICAgICAgaWYgKG1pbiA+IDAgJiYgbWluIDw9IDE1KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICcwMCc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMTYgJiYgbWluIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICcxNSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMzEgJiYgbWluIDw9IDQ1KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICczMCc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPiA0NSB8fCBtaW4gPT0gMCkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSAnNDUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRPckRlY3JlbWVudEhvdXIoaW5jcmVtZW50OiBib29sZWFuLCB0aW1lOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGlmIChpbmNyZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRIb3VySW5wdXQodGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRIb3VySW5wdXQodGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE9yRGVjcmVtZW50TWluKGluY3JlbWVudDogYm9vbGVhbiwgdGltZTogc3RyaW5nW10pIHtcclxuICAgICAgICBpZiAoaW5jcmVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50TWludXRlSW5wdXQodGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRNaW51dGVJbnB1dCh0aW1lKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNIb3VyVmFsdWVJbnZhbGlkKGhyOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaHIubGVuZ3RoID09IDAgfHwgIStociB8fCAxID4gcGFyc2VJbnQoaHIpIHx8IHBhcnNlSW50KGhyKSA+IDEyIHx8IGhyLmluY2x1ZGVzKCcuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNNaW51dGVWYWx1ZUludmFsaWQobWluOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBtaW4ubGVuZ3RoICE9IDIgfHwgKCErbWluICYmIG1pbiAhPSAnMDAnKSB8fCAwID4gcGFyc2VJbnQobWluKSB8fCBwYXJzZUludChtaW4pID4gNTkgfHwgbWluLmluY2x1ZGVzKCcuJylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVNPUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuICAgIHVwZGF0ZVNvcnRNYXAodGVtcFNvcnRPcmRlcjogU29ydFR5cGUsIHRhYmxlRGF0YTogYW55W10sIGlzTHVyQW5kQ3NyQ29tcG9uZW50OiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCB0ZW1wU29ydE9yZGVyKTtcclxuICAgICAgICBsZXQgc29ydGVkVGFibGVEYXRhID0gdGhpcy5hbm5hU29ydFNlcnZpY2UuYXBwbHlTb3J0aW5nKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8sXHJcbiAgICAgICAgICAgIHRlbXBTb3J0T3JkZXIsXHJcbiAgICAgICAgICAgIHRhYmxlRGF0YSxcclxuICAgICAgICAgICAgaXNMdXJBbmRDc3JDb21wb25lbnQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gc29ydGVkVGFibGVEYXRhO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|