@coreui/angular-pro 5.2.20 → 5.2.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/calendar/calendar/calendar.component.mjs +312 -410
- package/esm2022/lib/calendar/calendar-month/calendar-class-month.pipe.mjs +3 -2
- package/esm2022/lib/calendar/calendar-month/calendar-class-row.pipe.mjs +2 -4
- package/esm2022/lib/calendar/calendar-month/calendar-day.directive.mjs +2 -2
- package/esm2022/lib/calendar/calendar-month/calendar-month.component.mjs +182 -262
- package/esm2022/lib/calendar/calendar-month/calendar-row.directive.mjs +33 -31
- package/esm2022/lib/calendar/calendar-navigation/calendar-navigation.component.mjs +41 -13
- package/esm2022/lib/calendar/calendar.service.mjs +13 -10
- package/esm2022/lib/calendar/calendar.utils.mjs +19 -12
- package/esm2022/lib/date-picker/date-picker.component.mjs +23 -26
- package/esm2022/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +193 -295
- package/fesm2022/coreui-angular-pro.mjs +803 -1044
- package/fesm2022/coreui-angular-pro.mjs.map +1 -1
- package/lib/calendar/calendar/calendar.component.d.ts +60 -80
- package/lib/calendar/calendar-month/calendar-class-row.pipe.d.ts +2 -1
- package/lib/calendar/calendar-month/calendar-month.component.d.ts +33 -59
- package/lib/calendar/calendar-month/calendar-row.directive.d.ts +1 -1
- package/lib/calendar/calendar-navigation/calendar-navigation.component.d.ts +16 -6
- package/lib/calendar/calendar.service.d.ts +11 -3
- package/lib/calendar/calendar.utils.d.ts +4 -3
- package/lib/date-picker/date-picker.component.d.ts +9 -10
- package/lib/date-range-picker/date-range-picker/date-range-picker.component.d.ts +65 -94
- package/package.json +2 -2
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { booleanAttribute, ChangeDetectionStrategy, Component, computed,
|
|
2
|
-
import {
|
|
1
|
+
import { booleanAttribute, ChangeDetectionStrategy, Component, computed, contentChildren, DestroyRef, effect, forwardRef, HostBinding, HostListener, inject, input, Input, model, numberAttribute, output, signal, viewChild } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
|
3
3
|
import { formatDate, NgClass, NgTemplateOutlet } from '@angular/common';
|
|
4
4
|
import { FormControl, FormGroup, NG_VALUE_ACCESSOR, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
5
|
+
import { BreakpointObserver } from '@angular/cdk/layout';
|
|
5
6
|
import { ButtonDirective } from '../../button';
|
|
6
|
-
import { dateTransform, getLocalDateFromString, isDateDisabled, isValidDate } from '../../calendar/calendar.utils';
|
|
7
|
+
import { dateTransform, equalDates, getLocalDateFromString, isDateDisabled, isValidDate } from '../../calendar/calendar.utils';
|
|
7
8
|
import { CalendarComponent } from '../../calendar';
|
|
8
9
|
import { DropdownComponent, DropdownMenuDirective, DropdownToggleDirective } from '../../dropdown';
|
|
9
10
|
import { FormControlDirective, InputGroupComponent, InputGroupTextDirective } from '../../form';
|
|
@@ -11,8 +12,7 @@ import { TemplateIdDirective } from '../../shared';
|
|
|
11
12
|
import { TimePickerComponent } from '../../time-picker';
|
|
12
13
|
import { CustomRangeKeyPipe } from './custom-range-key.pipe';
|
|
13
14
|
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@angular/
|
|
15
|
-
import * as i2 from "@angular/forms";
|
|
15
|
+
import * as i1 from "@angular/forms";
|
|
16
16
|
/** Must be a valid date string */
|
|
17
17
|
// todo: validation
|
|
18
18
|
// export function invalidDateStringValidator(locale: string): ValidatorFn {
|
|
@@ -29,198 +29,259 @@ import * as i2 from "@angular/forms";
|
|
|
29
29
|
// };
|
|
30
30
|
// }
|
|
31
31
|
export class DateRangePickerComponent {
|
|
32
|
-
constructor(
|
|
33
|
-
this
|
|
32
|
+
constructor() {
|
|
33
|
+
this.#breakpointObserver = inject(BreakpointObserver);
|
|
34
|
+
this.#destroyRef = inject(DestroyRef);
|
|
34
35
|
/**
|
|
35
36
|
* Set the format of day name.
|
|
36
37
|
* @default 'numeric'
|
|
37
38
|
* @type DayFormatType
|
|
38
39
|
*/
|
|
39
|
-
this.dayFormat = 'numeric';
|
|
40
|
+
this.dayFormat = input('numeric');
|
|
40
41
|
/**
|
|
41
42
|
* The number of calendars that render on desktop devices.
|
|
42
43
|
* @type number
|
|
43
44
|
* @default 2
|
|
44
45
|
*/
|
|
45
|
-
this.calendars = 2;
|
|
46
|
+
this.calendars = input(2, { transform: numberAttribute });
|
|
46
47
|
/**
|
|
47
48
|
* Toggle visibility or set the content of the cleaner button.
|
|
48
49
|
* @type boolean
|
|
49
50
|
* @default true
|
|
50
51
|
*/
|
|
51
|
-
this.cleaner = true;
|
|
52
|
+
this.cleaner = input(true, { transform: booleanAttribute });
|
|
52
53
|
/**
|
|
53
54
|
* Determine if the dropdown should be closed after value setting.
|
|
54
55
|
* @type boolean
|
|
55
56
|
* @default false
|
|
56
57
|
*/
|
|
57
|
-
this.closeOnSelect = false;
|
|
58
|
+
this.closeOnSelect = input(false, { transform: booleanAttribute });
|
|
59
|
+
/**
|
|
60
|
+
* Set date format.
|
|
61
|
+
* We use Angular formatDate() function, see:
|
|
62
|
+
* - https://angular.io/api/common/formatDate
|
|
63
|
+
* - https://angular.io/api/common/DatePipe#pre-defined-format-options
|
|
64
|
+
*/
|
|
65
|
+
this.format = input();
|
|
58
66
|
/**
|
|
59
67
|
* Toggle visibility or set the content of the input indicator.
|
|
60
68
|
* @type boolean
|
|
61
69
|
* @default true
|
|
62
70
|
*/
|
|
63
|
-
this.indicator = true;
|
|
64
|
-
|
|
71
|
+
this.indicator = input(true);
|
|
72
|
+
/**
|
|
73
|
+
* Custom function to format the selected date into a string according to a custom format.
|
|
74
|
+
* @since v5.0.0
|
|
75
|
+
*/
|
|
76
|
+
this.inputDateFormat = input();
|
|
77
|
+
/**
|
|
78
|
+
* Custom function to parse the input value into a valid Date object.
|
|
79
|
+
* @since v5.0.0
|
|
80
|
+
*/
|
|
81
|
+
this.inputDateParse = input();
|
|
82
|
+
/**
|
|
83
|
+
* Toggle the readonly state for the component.
|
|
84
|
+
* @type boolean
|
|
85
|
+
* @default false
|
|
86
|
+
*/
|
|
87
|
+
this.inputReadOnlyInput = input(false, { transform: booleanAttribute, alias: 'inputReadOnly' });
|
|
88
|
+
this.inputReadOnly = computed(() => {
|
|
89
|
+
return this.inputReadOnlyInput() || typeof this.format() === 'string';
|
|
90
|
+
});
|
|
65
91
|
/**
|
|
66
92
|
* Reorder year-month navigation, and render year first.
|
|
67
93
|
* @type boolean
|
|
68
94
|
* @default false
|
|
69
95
|
*/
|
|
70
|
-
this.navYearFirst = false;
|
|
96
|
+
this.navYearFirst = input(false, { transform: booleanAttribute });
|
|
71
97
|
/**
|
|
72
98
|
* Specifies short hints that are visible in start date and end date inputs.
|
|
73
99
|
* type string
|
|
74
100
|
*/
|
|
75
|
-
this.placeholder = ['Start date', 'End date'];
|
|
101
|
+
this.placeholder = input(['Start date', 'End date']);
|
|
102
|
+
/**
|
|
103
|
+
* Predefined date ranges the user can select from.
|
|
104
|
+
* @type ICalendarRanges
|
|
105
|
+
*/
|
|
106
|
+
this.ranges = input();
|
|
76
107
|
/**
|
|
77
108
|
* Sets the color context of the cancel button to one of CoreUI’s themed colors.
|
|
78
109
|
* @type 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | string
|
|
79
110
|
* @default 'secondary'
|
|
80
111
|
*/
|
|
81
|
-
this.rangesButtonsColor = 'secondary';
|
|
112
|
+
this.rangesButtonsColor = input('secondary');
|
|
82
113
|
/**
|
|
83
114
|
* Size the ranges button small or large.
|
|
84
115
|
* @type 'sm' | 'lg' | ''
|
|
85
116
|
*/
|
|
86
|
-
this.rangesButtonsSize = '';
|
|
117
|
+
this.rangesButtonsSize = input('');
|
|
87
118
|
/**
|
|
88
119
|
* Set the ranges button variant to an outlined button or a ghost button.
|
|
89
120
|
* @type 'outline' | 'ghost' | undefined
|
|
90
121
|
*/
|
|
91
|
-
this.rangesButtonsVariant = 'ghost';
|
|
122
|
+
this.rangesButtonsVariant = input('ghost');
|
|
92
123
|
/**
|
|
93
124
|
* Default icon or character that separates two dates.
|
|
94
125
|
* @type boolean
|
|
95
126
|
* @default true
|
|
96
127
|
*/
|
|
97
|
-
this.separator = true;
|
|
98
|
-
|
|
128
|
+
this.separator = input(true, { transform: booleanAttribute });
|
|
129
|
+
/**
|
|
130
|
+
* Size the component small or large.
|
|
131
|
+
* @type 'sm' | 'lg' | undefined
|
|
132
|
+
* @default undefined
|
|
133
|
+
*/
|
|
134
|
+
this.size = input();
|
|
135
|
+
/**
|
|
136
|
+
* Provide an additional time selection by adding select boxes to choose time.
|
|
137
|
+
* @type boolean
|
|
138
|
+
* @default false
|
|
139
|
+
*/
|
|
140
|
+
this.timepickerInput = input(false, { transform: booleanAttribute, alias: 'timepicker' });
|
|
99
141
|
/**
|
|
100
142
|
* Toggle visual validation feedback.
|
|
101
143
|
* @type boolean | undefined
|
|
102
144
|
* @default undefined
|
|
103
145
|
*/
|
|
104
|
-
this.valid =
|
|
146
|
+
this.valid = input();
|
|
105
147
|
/**
|
|
106
148
|
* Toggle the visibility of the dropdown date-picker component.
|
|
107
149
|
* @type boolean
|
|
108
150
|
* @default false
|
|
109
151
|
*/
|
|
110
|
-
this.
|
|
111
|
-
this.
|
|
152
|
+
this.visibleInput = input(false, { transform: booleanAttribute });
|
|
153
|
+
this.visibleInputEffect = effect(() => {
|
|
154
|
+
this.visible.set(this.visibleInput());
|
|
155
|
+
}, { allowSignalWrites: true });
|
|
156
|
+
this.visible = signal(false);
|
|
157
|
+
this.startDateModel = model(null, {
|
|
112
158
|
alias: 'startDate'
|
|
113
159
|
});
|
|
114
160
|
this.dateModelEffect = effect(() => {
|
|
115
161
|
this.dateRangeGroup.patchValue({ startDateInput: this.startDateValue(), endDateInput: this.endDateValue() });
|
|
116
|
-
|
|
117
|
-
|
|
162
|
+
const startDate = this.startDate();
|
|
163
|
+
const endDate = this.endDate();
|
|
164
|
+
this.value = this.range() ? { startDate: startDate, endDate: endDate } : startDate;
|
|
165
|
+
this.startDateModel.set(startDate);
|
|
166
|
+
this.endDateModel.set(endDate);
|
|
167
|
+
}, { allowSignalWrites: true });
|
|
118
168
|
this.startDate = computed(() => {
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
return prevDate;
|
|
125
|
-
});
|
|
126
|
-
this.#startDate = null;
|
|
127
|
-
this.endDateModel = model(undefined, {
|
|
169
|
+
const startDate = this.startDateModel();
|
|
170
|
+
return startDate ? new Date(startDate) : null;
|
|
171
|
+
}, { equal: equalDates });
|
|
172
|
+
this.startDateChange = toObservable(this.startDate);
|
|
173
|
+
this.endDateModel = model(null, {
|
|
128
174
|
alias: 'endDate'
|
|
129
175
|
});
|
|
130
|
-
this.endDateChange = outputToObservable(this.endDateModel);
|
|
131
176
|
this.endDate = computed(() => {
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
return prevDate;
|
|
138
|
-
});
|
|
139
|
-
this.#endDate = null;
|
|
177
|
+
const endDate = this.endDateModel();
|
|
178
|
+
return endDate ? new Date(endDate) : null;
|
|
179
|
+
}, { equal: equalDates });
|
|
180
|
+
this.endDateChange = toObservable(this.endDate);
|
|
140
181
|
this.calendarDate = new Date();
|
|
141
|
-
this.disabledDates = [];
|
|
182
|
+
this.disabledDates = input([]);
|
|
142
183
|
/**
|
|
143
184
|
* Set first day of week.
|
|
144
|
-
* @type
|
|
185
|
+
* @type DaysOfWeek
|
|
145
186
|
* @default 1 (Monday)
|
|
146
187
|
*/
|
|
147
|
-
this.firstDayOfWeek = 1;
|
|
188
|
+
this.firstDayOfWeek = input(1);
|
|
148
189
|
this.locale = input('default');
|
|
149
|
-
this.maxDate = null;
|
|
150
|
-
this.minDate = null;
|
|
190
|
+
this.maxDate = input(null);
|
|
191
|
+
this.minDate = input(null);
|
|
151
192
|
/**
|
|
152
193
|
* Show calendar navigation.
|
|
153
194
|
* @type boolean
|
|
154
195
|
* @default true
|
|
155
196
|
*/
|
|
156
|
-
this.navigation = true;
|
|
197
|
+
this.navigation = input(true, { transform: booleanAttribute });
|
|
157
198
|
/**
|
|
158
199
|
* Allow range selection.
|
|
159
200
|
* @type boolean
|
|
160
|
-
* @default
|
|
201
|
+
* @default true
|
|
161
202
|
*/
|
|
162
|
-
this.
|
|
163
|
-
this
|
|
203
|
+
this.rangeInput = input(true, { transform: booleanAttribute, alias: 'range' });
|
|
204
|
+
this.range = computed(() => {
|
|
205
|
+
return this.rangeInput();
|
|
206
|
+
});
|
|
207
|
+
this.dateFilter = input();
|
|
208
|
+
this.disabledInput = input(false, { transform: booleanAttribute, alias: 'disabled' });
|
|
209
|
+
this.disabledEffect = effect(() => {
|
|
210
|
+
this.disabled() ? this.dateRangeGroup.disable() : this.dateRangeGroup.enable();
|
|
211
|
+
});
|
|
212
|
+
this.disabled = computed(() => {
|
|
213
|
+
return this.#disabled() || this.disabledInput();
|
|
214
|
+
});
|
|
215
|
+
this.#disabled = signal(false);
|
|
164
216
|
this._value = {};
|
|
165
217
|
/**
|
|
166
218
|
* Set length or format of day name.
|
|
167
219
|
* @type WeekdayFormatType
|
|
168
220
|
* @default 'short'
|
|
169
221
|
*/
|
|
170
|
-
this.weekdayFormat = 'short';
|
|
222
|
+
this.weekdayFormat = input('short');
|
|
171
223
|
/**
|
|
172
224
|
* Optional popper Options object
|
|
173
225
|
* @type Partial<Options>
|
|
174
226
|
*/
|
|
175
|
-
this.popperjsOptions = {
|
|
176
|
-
strategy: 'absolute'
|
|
177
|
-
};
|
|
227
|
+
this.popperjsOptions = input({ strategy: 'absolute' }, { alias: 'popperOptions' });
|
|
178
228
|
/**
|
|
179
229
|
* Set whether days in adjacent months shown before or after the current month are selectable. This only applies if the `showAdjacentDays` option is set to true.
|
|
180
230
|
* @type boolean
|
|
181
231
|
* @default false
|
|
182
232
|
* @since 4.4.10
|
|
183
233
|
*/
|
|
184
|
-
this.selectAdjacentDays = false;
|
|
234
|
+
this.selectAdjacentDays = input(false, { transform: booleanAttribute });
|
|
185
235
|
/**
|
|
186
236
|
* Set whether to display dates in adjacent months (non-selectable) at the start and end of the current month.
|
|
187
237
|
* @type boolean
|
|
188
238
|
* @default true
|
|
189
239
|
* @since 4.4.10
|
|
190
240
|
*/
|
|
191
|
-
this.showAdjacentDays = true;
|
|
241
|
+
this.showAdjacentDays = input(true, { transform: booleanAttribute });
|
|
192
242
|
/**
|
|
193
243
|
* Specify the type of date selection as day, week, month, or year.
|
|
194
244
|
* @type 'day' | 'week' | 'month' | 'year'
|
|
195
245
|
* @default 'day'
|
|
196
246
|
* @since 5.0.0
|
|
197
247
|
*/
|
|
198
|
-
this.selectionType = 'day';
|
|
248
|
+
this.selectionType = input('day');
|
|
199
249
|
/**
|
|
200
250
|
* Set whether to display week numbers in the calendar.
|
|
201
251
|
* @type boolean
|
|
202
252
|
* @default false
|
|
203
253
|
* @since 5.0.0
|
|
204
254
|
*/
|
|
205
|
-
this.showWeekNumber = false;
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
255
|
+
this.showWeekNumber = input(false, { transform: booleanAttribute });
|
|
256
|
+
/**
|
|
257
|
+
* Label displayed over week numbers in the calendar.
|
|
258
|
+
* @type string
|
|
259
|
+
* @default undefined
|
|
260
|
+
* @since 5.0.0
|
|
261
|
+
*/
|
|
262
|
+
this.weekNumbersLabel = input();
|
|
263
|
+
this.valueChange = output();
|
|
264
|
+
this.calendarCellHover = output();
|
|
265
|
+
this.calendarDateChange = output();
|
|
266
|
+
this.startDateElementRef = viewChild('startDateElementRef');
|
|
267
|
+
this.endDateElementRef = viewChild('endDateElementRef');
|
|
268
|
+
this.contentTemplates = contentChildren(TemplateIdDirective, { descendants: true });
|
|
269
|
+
this.templates = computed(() => {
|
|
270
|
+
return this.contentTemplates().reduce((acc, child) => {
|
|
271
|
+
acc[child.id] = child.templateRef;
|
|
272
|
+
return acc;
|
|
273
|
+
}, {});
|
|
274
|
+
});
|
|
210
275
|
this.dateChangeSubscriptions = [];
|
|
211
276
|
this.isMobile = true;
|
|
212
277
|
this.showRanges = false;
|
|
213
278
|
this.startDateValue = computed(() => {
|
|
214
279
|
const locale = this.locale() ?? 'default';
|
|
215
|
-
|
|
216
|
-
this.#startDate = this.startDate();
|
|
217
|
-
return dateFormatted;
|
|
280
|
+
return this.formatDate(this.startDate());
|
|
218
281
|
});
|
|
219
282
|
this.endDateValue = computed(() => {
|
|
220
283
|
const locale = this.locale() ?? 'default';
|
|
221
|
-
|
|
222
|
-
this.#endDate = this.endDate();
|
|
223
|
-
return dateFormatted;
|
|
284
|
+
return this.formatDate(this.endDate());
|
|
224
285
|
});
|
|
225
286
|
// todo: validation
|
|
226
287
|
// startDateInput = new FormControl({ value: this.startDateValue, disabled: this.disabled }, [
|
|
@@ -236,9 +297,11 @@ export class DateRangePickerComponent {
|
|
|
236
297
|
// // invalidDateStringValidator(this.locale)
|
|
237
298
|
// ]);
|
|
238
299
|
this.dateRangeGroup = new FormGroup({
|
|
239
|
-
startDateInput: new FormControl({ value: '', disabled: this.disabled }, [Validators.required]),
|
|
240
|
-
endDateInput: new FormControl({ value: '', disabled: this.disabled }, [Validators.required])
|
|
300
|
+
startDateInput: new FormControl({ value: '', disabled: this.disabled() }, [Validators.required]),
|
|
301
|
+
endDateInput: new FormControl({ value: '', disabled: this.disabled() }, [Validators.required])
|
|
241
302
|
});
|
|
303
|
+
this.inputStartHoverValue = signal(null);
|
|
304
|
+
this.inputEndHoverValue = signal(null);
|
|
242
305
|
this.#breakpoints = {
|
|
243
306
|
OneCalendarRanges: '(min-width: 480px)',
|
|
244
307
|
TwoCalendars: '(max-width: 650px)',
|
|
@@ -259,52 +322,23 @@ export class DateRangePickerComponent {
|
|
|
259
322
|
/* empty */
|
|
260
323
|
};
|
|
261
324
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
* @type boolean
|
|
265
|
-
* @default false
|
|
266
|
-
*/
|
|
267
|
-
set inputReadOnly(value) {
|
|
268
|
-
this.#inputReadOnly = value;
|
|
269
|
-
}
|
|
270
|
-
get inputReadOnly() {
|
|
271
|
-
return this.#inputReadOnly || typeof this.format === 'string';
|
|
272
|
-
}
|
|
273
|
-
#inputReadOnly;
|
|
274
|
-
/**
|
|
275
|
-
* Provide an additional time selection by adding select boxes to choose time.
|
|
276
|
-
* @type boolean
|
|
277
|
-
* @default false
|
|
278
|
-
*/
|
|
279
|
-
set timepicker(value) {
|
|
280
|
-
this.#timepicker = value;
|
|
281
|
-
}
|
|
325
|
+
#breakpointObserver;
|
|
326
|
+
#destroyRef;
|
|
282
327
|
get timepicker() {
|
|
283
328
|
return false;
|
|
284
|
-
// return this
|
|
285
|
-
}
|
|
286
|
-
#timepicker;
|
|
287
|
-
#startDate;
|
|
288
|
-
#endDate;
|
|
289
|
-
set disabled(value) {
|
|
290
|
-
this.#disabled = value;
|
|
291
|
-
this.#disabled ? this.dateRangeGroup.disable() : this.dateRangeGroup.enable();
|
|
292
|
-
}
|
|
293
|
-
get disabled() {
|
|
294
|
-
return this.#disabled;
|
|
329
|
+
// return this.timepickerInput();
|
|
295
330
|
}
|
|
296
331
|
#disabled;
|
|
297
332
|
set value(value) {
|
|
298
|
-
const newValue = this.range ? { ...value } : value;
|
|
333
|
+
const newValue = this.range() ? { ...value } : value;
|
|
299
334
|
if (JSON.stringify(this._value) !== JSON.stringify(newValue)) {
|
|
300
335
|
this._value = newValue;
|
|
301
336
|
this.onChange(newValue);
|
|
302
337
|
this.onTouched();
|
|
303
|
-
this.valueChange.emit(this.
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
this.visible = !hasValue;
|
|
338
|
+
this.valueChange.emit(this._value);
|
|
339
|
+
if (this.closeOnSelect() && this.visible()) {
|
|
340
|
+
const hasValue = this.range() ? !!(this._value.startDate && this._value.endDate) : !!this._value;
|
|
341
|
+
this.visible.set(!hasValue);
|
|
308
342
|
}
|
|
309
343
|
}
|
|
310
344
|
}
|
|
@@ -338,49 +372,44 @@ export class DateRangePickerComponent {
|
|
|
338
372
|
this.onTouched();
|
|
339
373
|
}
|
|
340
374
|
get startDatePlaceholder() {
|
|
341
|
-
|
|
375
|
+
const placeholder = this.placeholder();
|
|
376
|
+
return Array.isArray(placeholder) ? placeholder[0] : placeholder;
|
|
342
377
|
}
|
|
343
378
|
get endDatePlaceholder() {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
set inputStartHoverValue(value) {
|
|
347
|
-
this._inputStartHoverValue = value;
|
|
348
|
-
}
|
|
349
|
-
get inputStartHoverValue() {
|
|
350
|
-
return this._inputStartHoverValue;
|
|
351
|
-
}
|
|
352
|
-
set inputEndHoverValue(value) {
|
|
353
|
-
this._inputEndHoverValue = value;
|
|
354
|
-
}
|
|
355
|
-
get inputEndHoverValue() {
|
|
356
|
-
return this._inputEndHoverValue;
|
|
379
|
+
const placeholder = this.placeholder();
|
|
380
|
+
return Array.isArray(placeholder) ? placeholder[1] : placeholder;
|
|
357
381
|
}
|
|
358
382
|
get datePickerClasses() {
|
|
359
383
|
return {
|
|
360
384
|
'date-picker': true,
|
|
361
|
-
[`date-picker-${this.size}`]: this.size,
|
|
362
|
-
disabled: this.disabled,
|
|
363
|
-
'is-valid': this.valid === true,
|
|
364
|
-
'is-invalid': this.valid === false
|
|
385
|
+
[`date-picker-${this.size()}`]: this.size(),
|
|
386
|
+
disabled: this.disabled(),
|
|
387
|
+
'is-valid': this.valid() === true,
|
|
388
|
+
'is-invalid': this.valid() === false
|
|
365
389
|
};
|
|
366
390
|
}
|
|
367
391
|
formatDate(date) {
|
|
392
|
+
const format = this.format();
|
|
393
|
+
const inputDateFormat = this.inputDateFormat();
|
|
394
|
+
const locale = this.locale();
|
|
368
395
|
return !date || !isValidDate(date)
|
|
369
396
|
? ''
|
|
370
|
-
: typeof
|
|
371
|
-
?
|
|
372
|
-
: !!
|
|
373
|
-
? formatDate(date,
|
|
397
|
+
: typeof inputDateFormat === 'function'
|
|
398
|
+
? inputDateFormat(date)
|
|
399
|
+
: !!format && !!locale && locale !== 'default'
|
|
400
|
+
? formatDate(date, format, locale)
|
|
374
401
|
: this.timepicker
|
|
375
|
-
? date.toLocaleString(
|
|
376
|
-
: date.toLocaleDateString(
|
|
402
|
+
? date.toLocaleString(locale)
|
|
403
|
+
: date.toLocaleDateString(locale);
|
|
377
404
|
}
|
|
378
405
|
#breakpoints;
|
|
379
406
|
ngOnInit() {
|
|
380
|
-
|
|
407
|
+
const ranges = this.ranges();
|
|
408
|
+
this.customRanges = ranges ? Object.entries(ranges) : [];
|
|
381
409
|
const breakpoints = this.#breakpoints;
|
|
382
|
-
this
|
|
410
|
+
this.#breakpointObserver
|
|
383
411
|
.observe([breakpoints.OneCalendarRanges, breakpoints.TwoCalendars, breakpoints.TwoCalendarsRanges])
|
|
412
|
+
.pipe(takeUntilDestroyed(this.#destroyRef))
|
|
384
413
|
.subscribe((result) => {
|
|
385
414
|
if (result.matches) {
|
|
386
415
|
this.isMobile =
|
|
@@ -394,33 +423,8 @@ export class DateRangePickerComponent {
|
|
|
394
423
|
this.subscribeDateChange();
|
|
395
424
|
}
|
|
396
425
|
ngOnDestroy() {
|
|
397
|
-
this.layoutChanges?.unsubscribe();
|
|
398
426
|
this.subscribeDateChange(false);
|
|
399
427
|
}
|
|
400
|
-
ngAfterViewInit() {
|
|
401
|
-
setTimeout(() => {
|
|
402
|
-
this.contentTemplates.forEach((child) => {
|
|
403
|
-
this.templates[child.id] = child.templateRef;
|
|
404
|
-
});
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
ngOnChanges(changes) {
|
|
408
|
-
if (changes['date']) {
|
|
409
|
-
// for date-picker component
|
|
410
|
-
const date = this.convertValueToDate(changes['date']?.currentValue) ?? null;
|
|
411
|
-
this.handleStartDateChange(date);
|
|
412
|
-
this.calendarDate = date ?? this.calendarDate;
|
|
413
|
-
}
|
|
414
|
-
if (changes['startDate']) {
|
|
415
|
-
const date = this.convertValueToDate(changes['startDate']?.currentValue) ?? null;
|
|
416
|
-
this.handleStartDateChange(date);
|
|
417
|
-
this.calendarDate = date ?? this.calendarDate;
|
|
418
|
-
}
|
|
419
|
-
if (changes['endDate']) {
|
|
420
|
-
const date = this.convertValueToDate(changes['endDate']?.currentValue) ?? null;
|
|
421
|
-
this.handleEndDateChange(date);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
428
|
convertValueToDate(value) {
|
|
425
429
|
if (!value) {
|
|
426
430
|
return null;
|
|
@@ -431,8 +435,9 @@ export class DateRangePickerComponent {
|
|
|
431
435
|
return new Date(value);
|
|
432
436
|
}
|
|
433
437
|
inputParse(date) {
|
|
434
|
-
|
|
435
|
-
|
|
438
|
+
const inputDateParse = this.inputDateParse();
|
|
439
|
+
if (typeof inputDateParse === 'function') {
|
|
440
|
+
const parsedDate = inputDateParse(date);
|
|
436
441
|
if (isValidDate(parsedDate)) {
|
|
437
442
|
return parsedDate;
|
|
438
443
|
}
|
|
@@ -450,15 +455,15 @@ export class DateRangePickerComponent {
|
|
|
450
455
|
handleCalendarCellHover($event) {
|
|
451
456
|
this.calendarCellHover.emit($event);
|
|
452
457
|
if (!this.startDate()) {
|
|
453
|
-
this.setInputValue(this.startDateElementRef, $event);
|
|
454
|
-
this.inputStartHoverValue
|
|
455
|
-
this.setInputValue(this.endDateElementRef, null);
|
|
456
|
-
this.inputEndHoverValue
|
|
458
|
+
this.setInputValue(this.startDateElementRef(), $event);
|
|
459
|
+
this.inputStartHoverValue.set($event);
|
|
460
|
+
this.setInputValue(this.endDateElementRef(), null);
|
|
461
|
+
this.inputEndHoverValue.set(null);
|
|
457
462
|
return;
|
|
458
463
|
}
|
|
459
464
|
if (!this.endDate()) {
|
|
460
|
-
this.setInputValue(this.endDateElementRef, $event);
|
|
461
|
-
this.inputEndHoverValue
|
|
465
|
+
this.setInputValue(this.endDateElementRef(), $event);
|
|
466
|
+
this.inputEndHoverValue.set($event);
|
|
462
467
|
return;
|
|
463
468
|
}
|
|
464
469
|
}
|
|
@@ -469,21 +474,16 @@ export class DateRangePickerComponent {
|
|
|
469
474
|
}
|
|
470
475
|
handleStartDateChange(date) {
|
|
471
476
|
this.startDateModel.set(date ?? null);
|
|
472
|
-
this.
|
|
473
|
-
this.inputStartHoverValue = null;
|
|
474
|
-
this.value = this.range ? { startDate: this.startDate(), endDate: this.endDate() } : this.startDate();
|
|
477
|
+
this.inputStartHoverValue.set(null);
|
|
475
478
|
}
|
|
476
479
|
handleEndDateChange(date) {
|
|
477
|
-
if (!this.range) {
|
|
480
|
+
if (!this.range()) {
|
|
478
481
|
return;
|
|
479
482
|
}
|
|
480
483
|
this.endDateModel.set(date ?? null);
|
|
481
|
-
this.
|
|
482
|
-
this.inputEndHoverValue = null;
|
|
483
|
-
this.value = this.range ? { startDate: this.startDate(), endDate: this.endDate() } : this.startDate();
|
|
484
|
+
this.inputEndHoverValue.set(null);
|
|
484
485
|
}
|
|
485
486
|
handleClear($event) {
|
|
486
|
-
// this.calendarComponent.clearDates();
|
|
487
487
|
this.handleStartDateChange(null);
|
|
488
488
|
this.handleEndDateChange(null);
|
|
489
489
|
}
|
|
@@ -491,14 +491,13 @@ export class DateRangePickerComponent {
|
|
|
491
491
|
const inputValue = $event.target.value;
|
|
492
492
|
const date = this.inputParse(inputValue);
|
|
493
493
|
if (!date) {
|
|
494
|
-
// this.calendarComponent.clearDates();
|
|
495
494
|
this.handleStartDateChange(null);
|
|
496
495
|
this.handleEndDateChange(null);
|
|
497
496
|
return;
|
|
498
497
|
}
|
|
499
498
|
if (date instanceof Date && date.getTime()) {
|
|
500
|
-
|
|
501
|
-
if (!(this.forbiddenDate(date) || (
|
|
499
|
+
const endDate = this.endDate();
|
|
500
|
+
if (!(this.forbiddenDate(date) || (endDate && endDate < date))) {
|
|
502
501
|
this.calendarDate = date;
|
|
503
502
|
this.handleStartDateChange(date);
|
|
504
503
|
}
|
|
@@ -513,8 +512,8 @@ export class DateRangePickerComponent {
|
|
|
513
512
|
return;
|
|
514
513
|
}
|
|
515
514
|
if (date instanceof Date && date.getTime()) {
|
|
516
|
-
|
|
517
|
-
if (!(this.forbiddenDate(date) || (
|
|
515
|
+
const startDate = this.startDate();
|
|
516
|
+
if (!(this.forbiddenDate(date) || (startDate && startDate > date))) {
|
|
518
517
|
this.calendarDate = date;
|
|
519
518
|
this.handleEndDateChange(date);
|
|
520
519
|
}
|
|
@@ -525,8 +524,9 @@ export class DateRangePickerComponent {
|
|
|
525
524
|
this.handleEndDateChange(this.endDate() ?? null);
|
|
526
525
|
}
|
|
527
526
|
forbiddenDate(date) {
|
|
528
|
-
|
|
529
|
-
|
|
527
|
+
const dateFilter = this.dateFilter();
|
|
528
|
+
return (isDateDisabled(date, this.minDate(), this.maxDate(), this.disabledDates()) ||
|
|
529
|
+
(dateFilter ? !dateFilter(date) : false));
|
|
530
530
|
}
|
|
531
531
|
registerOnChange(fn) {
|
|
532
532
|
this.onChange = fn;
|
|
@@ -535,31 +535,31 @@ export class DateRangePickerComponent {
|
|
|
535
535
|
this.onTouched = fn;
|
|
536
536
|
}
|
|
537
537
|
setDisabledState(isDisabled) {
|
|
538
|
-
this.
|
|
538
|
+
this.#disabled.set(isDisabled);
|
|
539
539
|
}
|
|
540
540
|
writeValue(value) {
|
|
541
541
|
if (!!value) {
|
|
542
|
-
this.handleStartDateChange(this.range ? value.startDate : value);
|
|
543
|
-
this.handleEndDateChange(this.range ? value.endDate : null);
|
|
542
|
+
this.handleStartDateChange(this.range() ? value.startDate : value);
|
|
543
|
+
this.handleEndDateChange(this.range() ? value.endDate : null);
|
|
544
544
|
}
|
|
545
545
|
}
|
|
546
546
|
handleStartTimeChange(time) {
|
|
547
547
|
this.startDateModel.set(time ?? this.startDate());
|
|
548
548
|
}
|
|
549
549
|
handleEndTimeChange(time) {
|
|
550
|
-
if (!this.range) {
|
|
550
|
+
if (!this.range()) {
|
|
551
551
|
return;
|
|
552
552
|
}
|
|
553
553
|
this.endDateModel.set(time ?? this.endDate());
|
|
554
554
|
}
|
|
555
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: DateRangePickerComponent, deps: [
|
|
556
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: DateRangePickerComponent, isStandalone: true, selector: "c-date-range-picker", inputs: { dayFormat: { classPropertyName: "dayFormat", publicName: "dayFormat", isSignal:
|
|
555
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
556
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: DateRangePickerComponent, isStandalone: true, selector: "c-date-range-picker", inputs: { dayFormat: { classPropertyName: "dayFormat", publicName: "dayFormat", isSignal: true, isRequired: false, transformFunction: null }, calendars: { classPropertyName: "calendars", publicName: "calendars", isSignal: true, isRequired: false, transformFunction: null }, cleaner: { classPropertyName: "cleaner", publicName: "cleaner", isSignal: true, isRequired: false, transformFunction: null }, closeOnSelect: { classPropertyName: "closeOnSelect", publicName: "closeOnSelect", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, indicator: { classPropertyName: "indicator", publicName: "indicator", isSignal: true, isRequired: false, transformFunction: null }, inputDateFormat: { classPropertyName: "inputDateFormat", publicName: "inputDateFormat", isSignal: true, isRequired: false, transformFunction: null }, inputDateParse: { classPropertyName: "inputDateParse", publicName: "inputDateParse", isSignal: true, isRequired: false, transformFunction: null }, inputReadOnlyInput: { classPropertyName: "inputReadOnlyInput", publicName: "inputReadOnly", isSignal: true, isRequired: false, transformFunction: null }, navYearFirst: { classPropertyName: "navYearFirst", publicName: "navYearFirst", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ranges: { classPropertyName: "ranges", publicName: "ranges", isSignal: true, isRequired: false, transformFunction: null }, rangesButtonsColor: { classPropertyName: "rangesButtonsColor", publicName: "rangesButtonsColor", isSignal: true, isRequired: false, transformFunction: null }, rangesButtonsSize: { classPropertyName: "rangesButtonsSize", publicName: "rangesButtonsSize", isSignal: true, isRequired: false, transformFunction: null }, rangesButtonsVariant: { classPropertyName: "rangesButtonsVariant", publicName: "rangesButtonsVariant", isSignal: true, isRequired: false, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, timepickerInput: { classPropertyName: "timepickerInput", publicName: "timepicker", isSignal: true, isRequired: false, transformFunction: null }, valid: { classPropertyName: "valid", publicName: "valid", isSignal: true, isRequired: false, transformFunction: null }, visibleInput: { classPropertyName: "visibleInput", publicName: "visibleInput", isSignal: true, isRequired: false, transformFunction: null }, startDateModel: { classPropertyName: "startDateModel", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDateModel: { classPropertyName: "endDateModel", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, calendarDate: { classPropertyName: "calendarDate", publicName: "calendarDate", isSignal: false, isRequired: false, transformFunction: dateTransform }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, navigation: { classPropertyName: "navigation", publicName: "navigation", isSignal: true, isRequired: false, transformFunction: null }, rangeInput: { classPropertyName: "rangeInput", publicName: "range", isSignal: true, isRequired: false, transformFunction: null }, dateFilter: { classPropertyName: "dateFilter", publicName: "dateFilter", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null }, weekdayFormat: { classPropertyName: "weekdayFormat", publicName: "weekdayFormat", isSignal: true, isRequired: false, transformFunction: null }, popperjsOptions: { classPropertyName: "popperjsOptions", publicName: "popperOptions", isSignal: true, isRequired: false, transformFunction: null }, selectAdjacentDays: { classPropertyName: "selectAdjacentDays", publicName: "selectAdjacentDays", isSignal: true, isRequired: false, transformFunction: null }, showAdjacentDays: { classPropertyName: "showAdjacentDays", publicName: "showAdjacentDays", isSignal: true, isRequired: false, transformFunction: null }, selectionType: { classPropertyName: "selectionType", publicName: "selectionType", isSignal: true, isRequired: false, transformFunction: null }, showWeekNumber: { classPropertyName: "showWeekNumber", publicName: "showWeekNumber", isSignal: true, isRequired: false, transformFunction: null }, weekNumbersLabel: { classPropertyName: "weekNumbersLabel", publicName: "weekNumbersLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startDateModel: "startDateChange", endDateModel: "endDateChange", valueChange: "valueChange", calendarCellHover: "calendarCellHover", calendarDateChange: "calendarDateChange" }, host: { listeners: { "focusout": "onBlur()" }, properties: { "class": "this.datePickerClasses" } }, providers: [
|
|
557
557
|
{
|
|
558
558
|
provide: NG_VALUE_ACCESSOR,
|
|
559
559
|
useExisting: forwardRef(() => DateRangePickerComponent),
|
|
560
560
|
multi: true
|
|
561
561
|
}
|
|
562
|
-
], queries: [{ propertyName: "contentTemplates", predicate: TemplateIdDirective, descendants: true }], viewQueries: [{ propertyName: "startDateElementRef", first: true, predicate: ["startDateElementRef"], descendants: true }, { propertyName: "endDateElementRef", first: true, predicate: ["endDateElementRef"], descendants: true }], exportAs: ["cDateRangePicker"],
|
|
562
|
+
], queries: [{ propertyName: "contentTemplates", predicate: TemplateIdDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "startDateElementRef", first: true, predicate: ["startDateElementRef"], descendants: true, isSignal: true }, { propertyName: "endDateElementRef", first: true, predicate: ["endDateElementRef"], descendants: true, isSignal: true }], exportAs: ["cDateRangePicker"], ngImport: i0, template: "<fieldset [formGroup]=\"dateRangeGroup\">\n <c-dropdown #dropdown=\"cDropdown\" [(visible)]=\"visible\" [autoClose]=\"'outside'\" [ngClass]=\"datePickerClasses\"\n [popperOptions]=\"popperjsOptions()\" class=\"date-picker picker\">\n <div [caret]=\"false\"\n [disabled]=\"disabled() ?? dropdown.visible\"\n cDropdownToggle\n class=\"date-picker-input-group\"\n >\n <input #startDateElementRef\n (change)=\"handleStartDateInputChange($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [ngClass]=\"{hover: !!inputStartHoverValue()}\"\n [placeholder]=\"startDatePlaceholder\"\n [readonly]=\"inputReadOnly() ?? null\"\n [valid]=\"range() ? undefined : valid()\"\n cFormControl\n class=\"date-picker-input\"\n formControlName=\"startDateInput\"\n pattern=\"[1-9]*\"\n >\n @if (range() && separator()) {\n <div class=\"date-picker-separator\"></div>\n }\n @if (range()) {\n <input #endDateElementRef\n (change)=\"handleEndDateInputChange($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [ngClass]=\"{hover: !!inputEndHoverValue()}\"\n [placeholder]=\"endDatePlaceholder\"\n [readonly]=\"inputReadOnly() ?? null\"\n [valid]=\"valid() ?? undefined\"\n cFormControl\n class=\"date-picker-input\"\n formControlName=\"endDateInput\"\n pattern=\"[1-9]*\"\n >\n }\n @if (indicator()) {\n <div class=\"date-picker-indicator\"></div>\n }\n @if (cleaner() && startDateElementRef.value && !disabled()) {\n <div (click)=\"!disabled() && handleClear($event)\" class=\"date-picker-cleaner\" role=\"button\"></div>\n }\n </div>\n <div cDropdownMenu class=\"date-picker-dropdown py-0\">\n <div class=\"date-picker-body\">\n @if (!showRanges) {\n @if (ranges() && customRanges.length > 0) {\n <div class=\"date-picker-ranges\">\n @for (customRange of customRanges; track customRange) {\n <button (click)=\"setCustomRange(customRange)\"\n [color]=\"rangesButtonsColor()\"\n [size]=\"rangesButtonsSize()\"\n [variant]=\"rangesButtonsVariant()\"\n cButton>\n {{ customRange | customRangeKey }}\n </button>\n }\n </div>\n }\n }\n <c-calendar\n (calendarCellHover)=\"handleCalendarCellHover($event)\"\n (calendarDateChange)=\"handleCalendarDateChange($event)\"\n (endDateChange)=\"handleEndDateChange($event)\"\n (startDateChange)=\"handleStartDateChange($event)\"\n [calendarDate]=\"calendarDate\"\n [calendars]=\"isMobile ? 1 : calendars()\"\n [dateFilter]=\"dateFilter()\"\n [dayFormat]=\"dayFormat()\"\n [disabledDates]=\"disabledDates()\"\n [endDate]=\"endDate()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [locale]=\"locale()\"\n [maxDate]=\"maxDate()\"\n [minDate]=\"minDate()\"\n [navYearFirst]=\"navYearFirst()\"\n [navigation]=\"navigation()\"\n [range]=\"range()\"\n [selectAdjacentDays]=\"selectAdjacentDays()\"\n [selectionType]=\"selectionType()\"\n [showAdjacentDays]=\"showAdjacentDays()\"\n [showWeekNumber]=\"showWeekNumber()\"\n [startDate]=\"startDate()\"\n [weekNumbersLabel]=\"weekNumbersLabel()\"\n [weekdayFormat]=\"weekdayFormat()\"\n class=\"date-picker-calendars\"\n />\n @if (false && timepicker) {\n <div class=\"date-picker-timepickers\">\n <!-- todo-->\n <c-time-picker\n variant=\"select\"\n [locale]=\"locale()\"\n [disabled]=\"!startDate()\"\n [time]=\"startDate() ?? undefined\"\n (timeChange)=\"handleStartTimeChange($event)\"\n />\n @if (range()) {\n <c-time-picker\n variant=\"select\"\n [locale]=\"locale()\"\n [disabled]=\"!endDate()\"\n [time]=\"endDate() ?? undefined\"\n (timeChange)=\"handleEndTimeChange($event)\"\n />\n }\n </div>\n }\n </div>\n @let footer = templates()?.['datePickerFooter'];\n @if (footer) {\n <div class=\"date-picker-footer\">\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: dropdown}\" />\n </div>\n }\n </div>\n <ng-content />\n </c-dropdown>\n</fieldset>\n", styles: [".form-control.date-picker-input:focus{box-shadow:0 0}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CalendarComponent, selector: "c-calendar", inputs: ["calendarDate", "calendars", "dayFormat", "disabledDates", "startDate", "endDate", "firstDayOfWeek", "locale", "maxDate", "minDate", "navigation", "navYearFirst", "range", "view", "weekdayFormat", "dateFilter", "selectAdjacentDays", "showAdjacentDays", "selectionType", "showWeekNumber", "weekNumbersLabel", "ariaNextMonthLabel", "ariaNextYearLabel", "ariaPrevMonthLabel", "ariaPrevYearLabel"], outputs: ["calendarDateChange", "endDateChange", "startDateChange", "viewChange", "calendarCellHover"], exportAs: ["cCalendar"] }, { kind: "component", type: TimePickerComponent, selector: "c-time-picker", inputs: ["cleaner", "dateTimeFormatOptions", "disabled", "filterHours", "filterMinutes", "filterSeconds", "indicator", "inputReadOnly", "locale", "placeholder", "seconds", "size", "time", "variant", "valid", "visible"], outputs: ["timeChange"], exportAs: ["cTimePicker"] }, { kind: "directive", type: ButtonDirective, selector: "[cButton]", inputs: ["active", "color", "disabled", "shape", "size", "type", "variant"], exportAs: ["cButton"] }, { kind: "component", type: DropdownComponent, selector: "c-dropdown", inputs: ["alignment", "autoClose", "direction", "placement", "popper", "popperOptions", "variant", "visible"], outputs: ["visibleChange"], exportAs: ["cDropdown"] }, { kind: "directive", type: DropdownToggleDirective, selector: "[cDropdownToggle]", inputs: ["dropdownComponent", "disabled", "caret", "split"], exportAs: ["cDropdownToggle"] }, { kind: "directive", type: DropdownMenuDirective, selector: "[cDropdownMenu]", inputs: ["alignment", "visible"], exportAs: ["cDropdownMenu"] }, { kind: "directive", type: FormControlDirective, selector: "input[cFormControl], textarea[cFormControl]", inputs: ["sizing", "valid", "type", "plaintext"] }, { kind: "pipe", type: CustomRangeKeyPipe, name: "customRangeKey" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
563
563
|
}
|
|
564
564
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: DateRangePickerComponent, decorators: [{
|
|
565
565
|
type: Component,
|
|
@@ -583,114 +583,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
|
|
|
583
583
|
useExisting: forwardRef(() => DateRangePickerComponent),
|
|
584
584
|
multi: true
|
|
585
585
|
}
|
|
586
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<fieldset [formGroup]=\"dateRangeGroup\">\n <c-dropdown #dropdown=\"cDropdown\" [(visible)]=\"visible\" [autoClose]=\"'outside'\" [ngClass]=\"datePickerClasses\"\n [popperOptions]=\"popperjsOptions\" class=\"date-picker picker\">\n <div [caret]=\"false\"\n [disabled]=\"disabled ?? dropdown.visible\"\n cDropdownToggle\n class=\"date-picker-input-group\"\n >\n <input #startDateElementRef\n (change)=\"handleStartDateInputChange($event)\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n [ngClass]=\"{hover: !!inputStartHoverValue}\"\n [placeholder]=\"startDatePlaceholder\"\n [readonly]=\"inputReadOnly ?? null\"\n [valid]=\"range ? undefined : valid\"\n cFormControl\n class=\"date-picker-input\"\n formControlName=\"startDateInput\"\n pattern=\"[1-9]*\"\n >\n @if (range && separator
|
|
587
|
-
}],
|
|
588
|
-
type: Input
|
|
589
|
-
}], calendars: [{
|
|
590
|
-
type: Input,
|
|
591
|
-
args: [{ transform: numberAttribute }]
|
|
592
|
-
}], cleaner: [{
|
|
593
|
-
type: Input,
|
|
594
|
-
args: [{ transform: booleanAttribute }]
|
|
595
|
-
}], closeOnSelect: [{
|
|
596
|
-
type: Input,
|
|
597
|
-
args: [{ transform: booleanAttribute }]
|
|
598
|
-
}], format: [{
|
|
599
|
-
type: Input
|
|
600
|
-
}], indicator: [{
|
|
601
|
-
type: Input,
|
|
602
|
-
args: [{ transform: booleanAttribute }]
|
|
603
|
-
}], inputDateFormat: [{
|
|
604
|
-
type: Input
|
|
605
|
-
}], inputDateParse: [{
|
|
606
|
-
type: Input
|
|
607
|
-
}], inputReadOnly: [{
|
|
608
|
-
type: Input,
|
|
609
|
-
args: [{ transform: booleanAttribute }]
|
|
610
|
-
}], navYearFirst: [{
|
|
611
|
-
type: Input,
|
|
612
|
-
args: [{ transform: booleanAttribute }]
|
|
613
|
-
}], placeholder: [{
|
|
614
|
-
type: Input
|
|
615
|
-
}], ranges: [{
|
|
616
|
-
type: Input
|
|
617
|
-
}], rangesButtonsColor: [{
|
|
618
|
-
type: Input
|
|
619
|
-
}], rangesButtonsSize: [{
|
|
620
|
-
type: Input
|
|
621
|
-
}], rangesButtonsVariant: [{
|
|
622
|
-
type: Input
|
|
623
|
-
}], separator: [{
|
|
624
|
-
type: Input,
|
|
625
|
-
args: [{ transform: booleanAttribute }]
|
|
626
|
-
}], size: [{
|
|
627
|
-
type: Input
|
|
628
|
-
}], timepicker: [{
|
|
629
|
-
type: Input,
|
|
630
|
-
args: [{ transform: booleanAttribute }]
|
|
631
|
-
}], valid: [{
|
|
632
|
-
type: Input
|
|
633
|
-
}], visible: [{
|
|
634
|
-
type: Input,
|
|
635
|
-
args: [{ transform: booleanAttribute }]
|
|
636
|
-
}], calendarDate: [{
|
|
586
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<fieldset [formGroup]=\"dateRangeGroup\">\n <c-dropdown #dropdown=\"cDropdown\" [(visible)]=\"visible\" [autoClose]=\"'outside'\" [ngClass]=\"datePickerClasses\"\n [popperOptions]=\"popperjsOptions()\" class=\"date-picker picker\">\n <div [caret]=\"false\"\n [disabled]=\"disabled() ?? dropdown.visible\"\n cDropdownToggle\n class=\"date-picker-input-group\"\n >\n <input #startDateElementRef\n (change)=\"handleStartDateInputChange($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [ngClass]=\"{hover: !!inputStartHoverValue()}\"\n [placeholder]=\"startDatePlaceholder\"\n [readonly]=\"inputReadOnly() ?? null\"\n [valid]=\"range() ? undefined : valid()\"\n cFormControl\n class=\"date-picker-input\"\n formControlName=\"startDateInput\"\n pattern=\"[1-9]*\"\n >\n @if (range() && separator()) {\n <div class=\"date-picker-separator\"></div>\n }\n @if (range()) {\n <input #endDateElementRef\n (change)=\"handleEndDateInputChange($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [ngClass]=\"{hover: !!inputEndHoverValue()}\"\n [placeholder]=\"endDatePlaceholder\"\n [readonly]=\"inputReadOnly() ?? null\"\n [valid]=\"valid() ?? undefined\"\n cFormControl\n class=\"date-picker-input\"\n formControlName=\"endDateInput\"\n pattern=\"[1-9]*\"\n >\n }\n @if (indicator()) {\n <div class=\"date-picker-indicator\"></div>\n }\n @if (cleaner() && startDateElementRef.value && !disabled()) {\n <div (click)=\"!disabled() && handleClear($event)\" class=\"date-picker-cleaner\" role=\"button\"></div>\n }\n </div>\n <div cDropdownMenu class=\"date-picker-dropdown py-0\">\n <div class=\"date-picker-body\">\n @if (!showRanges) {\n @if (ranges() && customRanges.length > 0) {\n <div class=\"date-picker-ranges\">\n @for (customRange of customRanges; track customRange) {\n <button (click)=\"setCustomRange(customRange)\"\n [color]=\"rangesButtonsColor()\"\n [size]=\"rangesButtonsSize()\"\n [variant]=\"rangesButtonsVariant()\"\n cButton>\n {{ customRange | customRangeKey }}\n </button>\n }\n </div>\n }\n }\n <c-calendar\n (calendarCellHover)=\"handleCalendarCellHover($event)\"\n (calendarDateChange)=\"handleCalendarDateChange($event)\"\n (endDateChange)=\"handleEndDateChange($event)\"\n (startDateChange)=\"handleStartDateChange($event)\"\n [calendarDate]=\"calendarDate\"\n [calendars]=\"isMobile ? 1 : calendars()\"\n [dateFilter]=\"dateFilter()\"\n [dayFormat]=\"dayFormat()\"\n [disabledDates]=\"disabledDates()\"\n [endDate]=\"endDate()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [locale]=\"locale()\"\n [maxDate]=\"maxDate()\"\n [minDate]=\"minDate()\"\n [navYearFirst]=\"navYearFirst()\"\n [navigation]=\"navigation()\"\n [range]=\"range()\"\n [selectAdjacentDays]=\"selectAdjacentDays()\"\n [selectionType]=\"selectionType()\"\n [showAdjacentDays]=\"showAdjacentDays()\"\n [showWeekNumber]=\"showWeekNumber()\"\n [startDate]=\"startDate()\"\n [weekNumbersLabel]=\"weekNumbersLabel()\"\n [weekdayFormat]=\"weekdayFormat()\"\n class=\"date-picker-calendars\"\n />\n @if (false && timepicker) {\n <div class=\"date-picker-timepickers\">\n <!-- todo-->\n <c-time-picker\n variant=\"select\"\n [locale]=\"locale()\"\n [disabled]=\"!startDate()\"\n [time]=\"startDate() ?? undefined\"\n (timeChange)=\"handleStartTimeChange($event)\"\n />\n @if (range()) {\n <c-time-picker\n variant=\"select\"\n [locale]=\"locale()\"\n [disabled]=\"!endDate()\"\n [time]=\"endDate() ?? undefined\"\n (timeChange)=\"handleEndTimeChange($event)\"\n />\n }\n </div>\n }\n </div>\n @let footer = templates()?.['datePickerFooter'];\n @if (footer) {\n <div class=\"date-picker-footer\">\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: dropdown}\" />\n </div>\n }\n </div>\n <ng-content />\n </c-dropdown>\n</fieldset>\n", styles: [".form-control.date-picker-input:focus{box-shadow:0 0}\n"] }]
|
|
587
|
+
}], propDecorators: { calendarDate: [{
|
|
637
588
|
type: Input,
|
|
638
589
|
args: [{ transform: dateTransform }]
|
|
639
|
-
}], disabledDates: [{
|
|
640
|
-
type: Input
|
|
641
|
-
}], firstDayOfWeek: [{
|
|
642
|
-
type: Input,
|
|
643
|
-
args: [{ transform: numberAttribute }]
|
|
644
|
-
}], maxDate: [{
|
|
645
|
-
type: Input
|
|
646
|
-
}], minDate: [{
|
|
647
|
-
type: Input
|
|
648
|
-
}], navigation: [{
|
|
649
|
-
type: Input,
|
|
650
|
-
args: [{ transform: booleanAttribute }]
|
|
651
|
-
}], range: [{
|
|
652
|
-
type: Input,
|
|
653
|
-
args: [{ transform: booleanAttribute }]
|
|
654
|
-
}], dateFilter: [{
|
|
655
|
-
type: Input
|
|
656
|
-
}], disabled: [{
|
|
657
|
-
type: Input,
|
|
658
|
-
args: [{ transform: booleanAttribute }]
|
|
659
590
|
}], value: [{
|
|
660
591
|
type: Input
|
|
661
|
-
}], weekdayFormat: [{
|
|
662
|
-
type: Input
|
|
663
|
-
}], popperjsOptions: [{
|
|
664
|
-
type: Input,
|
|
665
|
-
args: ['popperOptions']
|
|
666
|
-
}], selectAdjacentDays: [{
|
|
667
|
-
type: Input,
|
|
668
|
-
args: [{ transform: booleanAttribute }]
|
|
669
|
-
}], showAdjacentDays: [{
|
|
670
|
-
type: Input,
|
|
671
|
-
args: [{ transform: booleanAttribute }]
|
|
672
|
-
}], selectionType: [{
|
|
673
|
-
type: Input
|
|
674
|
-
}], showWeekNumber: [{
|
|
675
|
-
type: Input,
|
|
676
|
-
args: [{ transform: booleanAttribute }]
|
|
677
|
-
}], weekNumbersLabel: [{
|
|
678
|
-
type: Input
|
|
679
|
-
}], valueChange: [{
|
|
680
|
-
type: Output
|
|
681
|
-
}], calendarCellHover: [{
|
|
682
|
-
type: Output
|
|
683
|
-
}], calendarDateChange: [{
|
|
684
|
-
type: Output
|
|
685
|
-
}], startDateElementRef: [{
|
|
686
|
-
type: ViewChild,
|
|
687
|
-
args: ['startDateElementRef']
|
|
688
|
-
}], endDateElementRef: [{
|
|
689
|
-
type: ViewChild,
|
|
690
|
-
args: ['endDateElementRef']
|
|
691
|
-
}], contentTemplates: [{
|
|
692
|
-
type: ContentChildren,
|
|
693
|
-
args: [TemplateIdDirective, { descendants: true }]
|
|
694
592
|
}], onBlur: [{
|
|
695
593
|
type: HostListener,
|
|
696
594
|
args: ['focusout']
|
|
@@ -698,4 +596,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
|
|
|
698
596
|
type: HostBinding,
|
|
699
597
|
args: ['class']
|
|
700
598
|
}] } });
|
|
701
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLE1BQU0sRUFFTixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLEtBQUssRUFDTCxLQUFLLEVBRUwsZUFBZSxFQUlmLE1BQU0sRUFHTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBRUwsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBTXhCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFbkgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7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QWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQUcrQixnQkFBZ0I7c0JBQTVFLGVBQWU7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQTRCakMsTUFBTTtzQkFBL0IsWUFBWTt1QkFBQyxVQUFVO2dCQXVFcEIsaUJBQWlCO3NCQURwQixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5wdXQsXG4gIElucHV0LFxuICBtb2RlbCxcbiAgTW9kZWxTaWduYWwsXG4gIG51bWJlckF0dHJpYnV0ZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG91dHB1dFRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGZvcm1hdERhdGUsIE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5cbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2J1dHRvbic7XG5pbXBvcnQgeyBkYXRlVHJhbnNmb3JtLCBnZXRMb2NhbERhdGVGcm9tU3RyaW5nLCBpc0RhdGVEaXNhYmxlZCwgaXNWYWxpZERhdGUgfSBmcm9tICcuLi8uLi9jYWxlbmRhci9jYWxlbmRhci51dGlscyc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyVHlwZSwgRGF5Rm9ybWF0VHlwZSwgV2Vla2RheUZvcm1hdFR5cGUgfSBmcm9tICcuLi8uLi9jYWxlbmRhci9jYWxlbmRhci5zZXJ2aWNlJztcbmltcG9ydCB7IENhbGVuZGFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY2FsZW5kYXInO1xuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSAnLi4vLi4vY29yZXVpLnR5cGVzJztcbmltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBEcm9wZG93bk1lbnVEaXJlY3RpdmUsIERyb3Bkb3duVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZHJvcGRvd24nO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2xEaXJlY3RpdmUsIElucHV0R3JvdXBDb21wb25lbnQsIElucHV0R3JvdXBUZXh0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZm9ybSc7XG5pbXBvcnQgeyBUZW1wbGF0ZUlkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IFRpbWVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi90aW1lLXBpY2tlcic7XG5pbXBvcnQgeyBDdXN0b21SYW5nZUtleVBpcGUgfSBmcm9tICcuL2N1c3RvbS1yYW5nZS1rZXkucGlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNhbGVuZGFyUmFuZ2VzIHtcbiAgW2tleTogc3RyaW5nXTogRGF0ZVtdO1xufVxuXG5leHBvcnQgdHlwZSBUQ3VzdG9tUmFuZ2UgPSBbc3RyaW5nLCBEYXRlW11dO1xuXG4vKiogTXVzdCBiZSBhIHZhbGlkIGRhdGUgc3RyaW5nICovXG4vLyB0b2RvOiB2YWxpZGF0aW9uXG4vLyBleHBvcnQgZnVuY3Rpb24gaW52YWxpZERhdGVTdHJpbmdWYWxpZGF0b3IobG9jYWxlOiBzdHJpbmcpOiBWYWxpZGF0b3JGbiB7XG4vLyAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuLy8gICAgIC8vIGNvbnN0IHZhbGlkRGF0ZSA9ICFpc05hTihEYXRlLnBhcnNlKGNvbnRyb2wudmFsdWUpKTtcbi8vICAgICBzdHJpbmdUb0RhdGVDb252ZXJ0KGNvbnRyb2wudmFsdWUsIGxvY2FsZSk7XG4vLyAgICAgY29uc3QgZGF0ZVNoaW0gPSBjdnREYXRlKGNvbnRyb2wudmFsdWUsIGxvY2FsZSk7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIC8vIGNvbnRyb2wuc2V0VmFsdWUobmV3IERhdGUoZGF0ZVNoaW0ueWVhciwgZGF0ZVNoaW0ubW9udGgsIGRhdGVTaGltLmRheSkpXG4vLyAgICAgY29uc29sZS5sb2coJ2RhdGVTaGltJywgZGF0ZVNoaW0sIGxvY2FsZSk7XG4vLyAgICAgY29uc3QgdmFsaWREYXRlID0gaXNWYWxpZERhdGUoY29udHJvbC52YWx1ZSk7XG4vLyAgICAgY29uc29sZS5sb2coJ2ludmFsaWREYXRlU3RyaW5nVmFsaWRhdG9yJywgY29udHJvbCwgY29udHJvbC52YWx1ZSwgdmFsaWREYXRlKTtcbi8vICAgICByZXR1cm4gdmFsaWREYXRlID8geyBpbnZhbGlkRGF0ZVN0cmluZ1ZhbGlkYXRvcjogeyB2YWx1ZTogY29udHJvbC52YWx1ZSB9IH0gOiBudWxsO1xuLy8gICB9O1xuLy8gfVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLWRhdGUtcmFuZ2UtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdjRGF0ZVJhbmdlUGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nQ2xhc3MsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIENhbGVuZGFyQ29tcG9uZW50LFxuICAgIFRpbWVQaWNrZXJDb21wb25lbnQsXG4gICAgQnV0dG9uRGlyZWN0aXZlLFxuICAgIERyb3Bkb3duQ29tcG9uZW50LFxuICAgIERyb3Bkb3duVG9nZ2xlRGlyZWN0aXZlLFxuICAgIERyb3Bkb3duTWVudURpcmVjdGl2ZSxcbiAgICBJbnB1dEdyb3VwQ29tcG9uZW50LFxuICAgIEZvcm1Db250cm9sRGlyZWN0aXZlLFxuICAgIElucHV0R3JvdXBUZXh0RGlyZWN0aXZlLFxuICAgIEN1c3RvbVJhbmdlS2V5UGlwZVxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyKSB7fVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZvcm1hdCBvZiBkYXkgbmFtZS5cbiAgICogQGRlZmF1bHQgJ251bWVyaWMnXG4gICAqIEB0eXBlIERheUZvcm1hdFR5cGVcbiAgICovXG4gIEBJbnB1dCgpIGRheUZvcm1hdDogRGF5Rm9ybWF0VHlwZSA9ICdudW1lcmljJztcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjYWxlbmRhcnMgdGhhdCByZW5kZXIgb24gZGVza3RvcCBkZXZpY2VzLlxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlZmF1bHQgMlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgY2FsZW5kYXJzOiBudW1iZXIgPSAyO1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgdmlzaWJpbGl0eSBvciBzZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGNsZWFuZXIgYnV0dG9uLlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbGVhbmVyID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHRoZSBkcm9wZG93biBzaG91bGQgYmUgY2xvc2VkIGFmdGVyIHZhbHVlIHNldHRpbmcuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbG9zZU9uU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldCBkYXRlIGZvcm1hdC5cbiAgICogV2UgdXNlIEFuZ3VsYXIgZm9ybWF0RGF0ZSgpIGZ1bmN0aW9uLCBzZWU6XG4gICAqIC0gaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24vZm9ybWF0RGF0ZVxuICAgKiAtIGh0dHBzOi8vYW5ndWxhci5pby9hcGkvY29tbW9uL0RhdGVQaXBlI3ByZS1kZWZpbmVkLWZvcm1hdC1vcHRpb25zXG4gICAqL1xuICBASW5wdXQoKVxuICBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB2aXNpYmlsaXR5IG9yIHNldCB0aGUgY29udGVudCBvZiB0aGUgaW5wdXQgaW5kaWNhdG9yLlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBpbmRpY2F0b3I6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSBzZWxlY3RlZCBkYXRlIGludG8gYSBzdHJpbmcgYWNjb3JkaW5nIHRvIGEgY3VzdG9tIGZvcm1hdC5cbiAgICogQHNpbmNlIHY1LjAuMFxuICAgKi9cbiAgQElucHV0KCkgaW5wdXREYXRlRm9ybWF0PzogKGRhdGU6IERhdGUpID0+IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIGZ1bmN0aW9uIHRvIHBhcnNlIHRoZSBpbnB1dCB2YWx1ZSBpbnRvIGEgdmFsaWQgRGF0ZSBvYmplY3QuXG4gICAqIEBzaW5jZSB2NS4wLjBcbiAgICovXG4gIEBJbnB1dCgpIGlucHV0RGF0ZVBhcnNlPzogKGRhdGU6IHN0cmluZyB8IERhdGUpID0+IERhdGU7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgcmVhZG9ubHkgc3RhdGUgZm9yIHRoZSBjb21wb25lbnQuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzZXQgaW5wdXRSZWFkT25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuI2lucHV0UmVhZE9ubHkgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBpbnB1dFJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNpbnB1dFJlYWRPbmx5IHx8IHR5cGVvZiB0aGlzLmZvcm1hdCA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICAjaW5wdXRSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZW9yZGVyIHllYXItbW9udGggbmF2aWdhdGlvbiwgYW5kIHJlbmRlciB5ZWFyIGZpcnN0LlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbmF2WWVhckZpcnN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBzaG9ydCBoaW50cyB0aGF0IGFyZSB2aXNpYmxlIGluIHN0YXJ0IGRhdGUgYW5kIGVuZCBkYXRlIGlucHV0cy5cbiAgICogdHlwZSBzdHJpbmdcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCBzdHJpbmdbXSA9IFsnU3RhcnQgZGF0ZScsICdFbmQgZGF0ZSddO1xuXG4gIC8qKlxuICAgKiBQcmVkZWZpbmVkIGRhdGUgcmFuZ2VzIHRoZSB1c2VyIGNhbiBzZWxlY3QgZnJvbS5cbiAgICogQHR5cGUgSUNhbGVuZGFyUmFuZ2VzXG4gICAqL1xuICBASW5wdXQoKSByYW5nZXM/OiBJQ2FsZW5kYXJSYW5nZXM7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbG9yIGNvbnRleHQgb2YgdGhlIGNhbmNlbCBidXR0b24gdG8gb25lIG9mIENvcmVVSeKAmXMgdGhlbWVkIGNvbG9ycy5cbiAgICogQHR5cGUgJ3ByaW1hcnknIHwgJ3NlY29uZGFyeScgfCAnc3VjY2VzcycgfCAnZGFuZ2VyJyB8ICd3YXJuaW5nJyB8ICdpbmZvJyB8ICdkYXJrJyB8ICdsaWdodCcgfCBzdHJpbmdcbiAgICogQGRlZmF1bHQgJ3NlY29uZGFyeSdcbiAgICovXG4gIEBJbnB1dCgpIHJhbmdlc0J1dHRvbnNDb2xvcjogQ29sb3JzID0gJ3NlY29uZGFyeSc7XG5cbiAgLyoqXG4gICAqIFNpemUgdGhlIHJhbmdlcyBidXR0b24gc21hbGwgb3IgbGFyZ2UuXG4gICAqIEB0eXBlICdzbScgfCAnbGcnIHwgJydcbiAgICovXG4gIEBJbnB1dCgpIHJhbmdlc0J1dHRvbnNTaXplOiAnc20nIHwgJ2xnJyB8ICcnID0gJyc7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcmFuZ2VzIGJ1dHRvbiB2YXJpYW50IHRvIGFuIG91dGxpbmVkIGJ1dHRvbiBvciBhIGdob3N0IGJ1dHRvbi5cbiAgICogQHR5cGUgJ291dGxpbmUnIHwgJ2dob3N0JyB8IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCkgcmFuZ2VzQnV0dG9uc1ZhcmlhbnQ/OiAnb3V0bGluZScgfCAnZ2hvc3QnID0gJ2dob3N0JztcblxuICAvKipcbiAgICogRGVmYXVsdCBpY29uIG9yIGNoYXJhY3RlciB0aGF0IHNlcGFyYXRlcyB0d28gZGF0ZXMuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNlcGFyYXRvciA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNpemUgdGhlIGNvbXBvbmVudCBzbWFsbCBvciBsYXJnZS5cbiAgICogQHR5cGUgJ3NtJyB8ICdsZycgfCB1bmRlZmluZWRcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSBzaXplPzogJ3NtJyB8ICdsZyc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYWRkaXRpb25hbCB0aW1lIHNlbGVjdGlvbiBieSBhZGRpbmcgc2VsZWN0IGJveGVzIHRvIGNob29zZSB0aW1lLlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgc2V0IHRpbWVwaWNrZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiN0aW1lcGlja2VyID0gdmFsdWU7XG4gIH1cblxuICBnZXQgdGltZXBpY2tlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gcmV0dXJuIHRoaXMuI3RpbWVwaWNrZXI7XG4gIH1cblxuICAjdGltZXBpY2tlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgdmlzdWFsIHZhbGlkYXRpb24gZmVlZGJhY2suXG4gICAqIEB0eXBlIGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSB2YWxpZD86IGJvb2xlYW4gPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZHJvcGRvd24gZGF0ZS1waWNrZXIgY29tcG9uZW50LlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgdmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZU1vZGVsOiBNb2RlbFNpZ25hbDxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4gPSBtb2RlbDxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7XG4gICAgYWxpYXM6ICdzdGFydERhdGUnXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGRhdGVNb2RlbEVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgdGhpcy5kYXRlUmFuZ2VHcm91cC5wYXRjaFZhbHVlKHsgc3RhcnREYXRlSW5wdXQ6IHRoaXMuc3RhcnREYXRlVmFsdWUoKSwgZW5kRGF0ZUlucHV0OiB0aGlzLmVuZERhdGVWYWx1ZSgpIH0pO1xuICB9KTtcblxuICByZWFkb25seSBzdGFydERhdGVDaGFuZ2UgPSBvdXRwdXRUb09ic2VydmFibGUodGhpcy5zdGFydERhdGVNb2RlbCk7XG5cbiAgcmVhZG9ubHkgc3RhcnREYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHByZXZEYXRlID0gdGhpcy4jc3RhcnREYXRlID8gbmV3IERhdGUoPERhdGU+dGhpcy4jc3RhcnREYXRlKSA6IG51bGw7XG4gICAgY29uc3QgY3VyckRhdGUgPSB0aGlzLnN0YXJ0RGF0ZU1vZGVsKCkgPyBuZXcgRGF0ZSg8RGF0ZT50aGlzLnN0YXJ0RGF0ZU1vZGVsKCkpIDogbnVsbDtcbiAgICBpZiAocHJldkRhdGU/LmdldFRpbWUoKSAhPT0gY3VyckRhdGU/LmdldFRpbWUoKSkge1xuICAgICAgcmV0dXJuIGN1cnJEYXRlO1xuICAgIH1cbiAgICByZXR1cm4gcHJldkRhdGU7XG4gIH0pO1xuXG4gICNzdGFydERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgcmVhZG9ubHkgZW5kRGF0ZU1vZGVsOiBNb2RlbFNpZ25hbDxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4gPSBtb2RlbDxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7XG4gICAgYWxpYXM6ICdlbmREYXRlJ1xuICB9KTtcblxuICByZWFkb25seSBlbmREYXRlQ2hhbmdlID0gb3V0cHV0VG9PYnNlcnZhYmxlKHRoaXMuZW5kRGF0ZU1vZGVsKTtcblxuICByZWFkb25seSBlbmREYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHByZXZEYXRlID0gdGhpcy4jZW5kRGF0ZSA/IG5ldyBEYXRlKDxEYXRlPnRoaXMuI2VuZERhdGUpIDogbnVsbDtcbiAgICBjb25zdCBjdXJyRGF0ZSA9IHRoaXMuZW5kRGF0ZU1vZGVsKCkgPyBuZXcgRGF0ZSg8RGF0ZT50aGlzLmVuZERhdGVNb2RlbCgpKSA6IG51bGw7XG4gICAgaWYgKHByZXZEYXRlPy5nZXRUaW1lKCkgIT09IGN1cnJEYXRlPy5nZXRUaW1lKCkpIHtcbiAgICAgIHJldHVybiBjdXJyRGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHByZXZEYXRlO1xuICB9KTtcblxuICAjZW5kRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogZGF0ZVRyYW5zZm9ybSB9KSBjYWxlbmRhckRhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICBASW5wdXQoKSBkaXNhYmxlZERhdGVzOiAoRGF0ZVtdIHwgRGF0ZSlbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTZXQgZmlyc3QgZGF5IG9mIHdlZWsuXG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVmYXVsdCAxIChNb25kYXkpXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBmaXJzdERheU9mV2VlazogbnVtYmVyID0gMTtcblxuICByZWFkb25seSBsb2NhbGUgPSBpbnB1dCgnZGVmYXVsdCcpO1xuXG4gIEBJbnB1dCgpIG1heERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbWluRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTaG93IGNhbGVuZGFyIG5hdmlnYXRpb24uXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG5hdmlnYXRpb24gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBBbGxvdyByYW5nZSBzZWxlY3Rpb24uXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByYW5nZSA9IHRydWU7XG5cbiAgQElucHV0KCkgZGF0ZUZpbHRlcj86IERhdGVGaWx0ZXJUeXBlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiNkaXNhYmxlZCA9IHZhbHVlO1xuICAgIHRoaXMuI2Rpc2FibGVkID8gdGhpcy5kYXRlUmFuZ2VHcm91cC5kaXNhYmxlKCkgOiB0aGlzLmRhdGVSYW5nZUdyb3VwLmVuYWJsZSgpO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNkaXNhYmxlZDtcbiAgfVxuXG4gICNkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLnJhbmdlID8geyAuLi52YWx1ZSB9IDogdmFsdWU7XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMuX3ZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgdGhpcy5vbkNoYW5nZShuZXdWYWx1ZSk7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgICAgLy8gdGhpcy5kYXRlUmFuZ2VHcm91cC5zZXRWYWx1ZSh7IHN0YXJ0RGF0ZUlucHV0OiB0aGlzLnN0YXJ0RGF0ZVZhbHVlKCksIGVuZERhdGVJbnB1dDogdGhpcy5lbmREYXRlVmFsdWUoKSB9KTtcbiAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QpIHtcbiAgICAgICAgY29uc3QgaGFzVmFsdWUgPSB0aGlzLnJhbmdlID8gISEodGhpcy52YWx1ZS5zdGFydERhdGUgJiYgdGhpcy52YWx1ZS5lbmREYXRlKSA6ICEhdGhpcy52YWx1ZTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gIWhhc1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF92YWx1ZTogYW55ID0ge307XG5cbiAgLyoqXG4gICAqIFNldCBsZW5ndGggb3IgZm9ybWF0IG9mIGRheSBuYW1lLlxuICAgKiBAdHlwZSBXZWVrZGF5Rm9ybWF0VHlwZVxuICAgKiBAZGVmYXVsdCAnc2hvcnQnXG4gICAqL1xuICBASW5wdXQoKSB3ZWVrZGF5Rm9ybWF0OiBXZWVrZGF5Rm9ybWF0VHlwZSA9ICdzaG9ydCc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHBvcHBlciBPcHRpb25zIG9iamVjdFxuICAgKiBAdHlwZSBQYXJ0aWFsPE9wdGlvbnM+XG4gICAqL1xuICBASW5wdXQoJ3BvcHBlck9wdGlvbnMnKSBwb3BwZXJqc09wdGlvbnM6IFBhcnRpYWw8T3B0aW9ucz4gPSB7XG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbiAgfTtcblxuICAvKipcbiAgICogU2V0IHdoZXRoZXIgZGF5cyBpbiBhZGphY2VudCBtb250aHMgc2hvd24gYmVmb3JlIG9yIGFmdGVyIHRoZSBjdXJyZW50IG1vbnRoIGFyZSBzZWxlY3RhYmxlLiBUaGlzIG9ubHkgYXBwbGllcyBpZiB0aGUgYHNob3dBZGphY2VudERheXNgIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAc2luY2UgNC40LjEwXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2VsZWN0QWRqYWNlbnREYXlzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIHRvIGRpc3BsYXkgZGF0ZXMgaW4gYWRqYWNlbnQgbW9udGhzIChub24tc2VsZWN0YWJsZSkgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGN1cnJlbnQgbW9udGguXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAc2luY2UgNC40LjEwXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FkamFjZW50RGF5czogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHR5cGUgb2YgZGF0ZSBzZWxlY3Rpb24gYXMgZGF5LCB3ZWVrLCBtb250aCwgb3IgeWVhci5cbiAgICogQHR5cGUgJ2RheScgfCAnd2VlaycgfCAnbW9udGgnIHwgJ3llYXInXG4gICAqIEBkZWZhdWx0ICdkYXknXG4gICAqIEBzaW5jZSA1LjAuMFxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0aW9uVHlwZTogJ2RheScgfCAnd2VlaycgfCAnbW9udGgnIHwgJ3llYXInID0gJ2RheSc7XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIHRvIGRpc3BsYXkgd2VlayBudW1iZXJzIGluIHRoZSBjYWxlbmRhci5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAc2luY2UgNS4wLjBcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93V2Vla051bWJlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBMYWJlbCBkaXNwbGF5ZWQgb3ZlciB3ZWVrIG51bWJlcnMgaW4gdGhlIGNhbGVuZGFyLlxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqIEBzaW5jZSA1LjAuMFxuICAgKi9cbiAgQElucHV0KCkgd2Vla051bWJlcnNMYWJlbD86IHN0cmluZztcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBEYXRlW10gfCB1bmRlZmluZWQ+KCk7XG5cbiAgQE91dHB1dCgpIGNhbGVuZGFyQ2VsbEhvdmVyOiBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIGNhbGVuZGFyRGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPERhdGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICAvLyBAT3V0cHV0KCkgZW5kRGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XG4gIC8vIEBPdXRwdXQoKSBzdGFydERhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xuICAvLyByZWFkb25seSBlbmREYXRlQ2hhbmdlID0gb3V0cHV0PERhdGUgfCBudWxsPigpO1xuICAvLyByZWFkb25seSBzdGFydERhdGVDaGFuZ2UgPSBvdXRwdXQ8RGF0ZSB8IG51bGw+KCk7XG5cbiAgLy8gQFZpZXdDaGlsZChDYWxlbmRhckNvbXBvbmVudCkgY2FsZW5kYXJDb21wb25lbnQhOiBDYWxlbmRhckNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnc3RhcnREYXRlRWxlbWVudFJlZicpIHN0YXJ0RGF0ZUVsZW1lbnRSZWYhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdlbmREYXRlRWxlbWVudFJlZicpIGVuZERhdGVFbGVtZW50UmVmITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICB0ZW1wbGF0ZXM6IGFueSA9IHt9O1xuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlSWREaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgY29udGVudFRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZUlkRGlyZWN0aXZlPjtcblxuICBwcm90ZWN0ZWQgZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgcHJvdGVjdGVkIHN1YnNjcmliZURhdGVDaGFuZ2Uoc3Vic2NyaWJlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmIChzdWJzY3JpYmUpIHtcbiAgICAgIC8vIHRvZG9cbiAgICAgIC8vIHRoaXMuZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIC8vICAgdGhpcy5zdGFydERhdGVDaGFuZ2Uuc3Vic2NyaWJlKChuZXh0KSA9PiB7XG4gICAgICAvLyAgICAgLy8gY29uc29sZS5sb2coJ3N0YXJ0RGF0ZUNoYW5nZScsIG5leHQpO1xuICAgICAgLy8gICAgIC8vIHRoaXMuc3RhcnREYXRlID0gbmV4dDtcbiAgICAgIC8vICAgICAvLyB0aGlzLm9uQ2hhbmdlKG5leHQpO1xuICAgICAgLy8gICB9KVxuICAgICAgLy8gKTtcbiAgICAgIC8vIHRoaXMuZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIC8vICAgdGhpcy5lbmREYXRlQ2hhbmdlLnN1YnNjcmliZSgobmV4dCkgPT4ge1xuICAgICAgLy8gICAgIC8vIGNvbnNvbGUubG9nKCdlbmREYXRlQ2hhbmdlJywgbmV4dCk7XG4gICAgICAvLyAgICAgLy8gdGhpcy5lbmREYXRlID0gbmV4dDtcbiAgICAgIC8vICAgICAvLyB0aGlzLm9uQ2hhbmdlKG5leHQpO1xuICAgICAgLy8gICB9KVxuICAgICAgLy8gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kYXRlQ2hhbmdlU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3Vzb3V0Jykgb25CbHVyKCkge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBwdWJsaWMgaXNNb2JpbGUgPSB0cnVlO1xuICBwdWJsaWMgY3VzdG9tUmFuZ2VzITogVEN1c3RvbVJhbmdlW107XG4gIHB1YmxpYyBzaG93UmFuZ2VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgc3RhcnREYXRlVmFsdWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5sb2NhbGUoKSA/PyAnZGVmYXVsdCc7XG4gICAgY29uc3QgZGF0ZUZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLnN0YXJ0RGF0ZSgpKTtcbiAgICB0aGlzLiNzdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZSgpO1xuICAgIHJldHVybiBkYXRlRm9ybWF0dGVkO1xuICB9KTtcblxuICBlbmREYXRlVmFsdWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5sb2NhbGUoKSA/PyAnZGVmYXVsdCc7XG4gICAgY29uc3QgZGF0ZUZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLmVuZERhdGUoKSk7XG4gICAgdGhpcy4jZW5kRGF0ZSA9IHRoaXMuZW5kRGF0ZSgpO1xuICAgIHJldHVybiBkYXRlRm9ybWF0dGVkO1xuICB9KTtcblxuICBwdWJsaWMgZ2V0IHN0YXJ0RGF0ZVBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5wbGFjZWhvbGRlcikgPyB0aGlzLnBsYWNlaG9sZGVyWzBdIDogdGhpcy5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW5kRGF0ZVBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5wbGFjZWhvbGRlcikgPyB0aGlzLnBsYWNlaG9sZGVyWzFdIDogdGhpcy5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIHByaXZhdGUgbGF5b3V0Q2hhbmdlcyE6IFN1YnNjcmlwdGlvbjtcblxuICAvLyB0b2RvOiB2YWxpZGF0aW9uXG4gIC8vIHN0YXJ0RGF0ZUlucHV0ID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMuc3RhcnREYXRlVmFsdWUsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkIH0sIFtcbiAgLy8gICBWYWxpZGF0b3JzLnJlcXVpcmVkXG4gIC8vICAgLy8gVmFsaWRhdG9ycy5taW5MZW5ndGgoOCksXG4gIC8vICAgLy8gVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTApLFxuICAvLyAgIC8vIGludmFsaWREYXRlU3RyaW5nVmFsaWRhdG9yKHRoaXMubG9jYWxlKVxuICAvLyBdKTtcbiAgLy8gZW5kRGF0ZUlucHV0ID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMuZW5kRGF0ZVZhbHVlLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCBbXG4gIC8vICAgVmFsaWRhdG9ycy5yZXF1aXJlZFxuICAvLyAgIC8vIFZhbGlkYXRvcnMubWluTGVuZ3RoKDgpLFxuICAvLyAgIC8vIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwKSxcbiAgLy8gICAvLyBpbnZhbGlkRGF0ZVN0cmluZ1ZhbGlkYXRvcih0aGlzLmxvY2FsZSlcbiAgLy8gXSk7XG4gIGRhdGVSYW5nZUdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGFydERhdGVJbnB1dDogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgIGVuZERhdGVJbnB1dDogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXG4gIH0pO1xuXG4gIHNldCBpbnB1dFN0YXJ0SG92ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHRoaXMuX2lucHV0U3RhcnRIb3ZlclZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgaW5wdXRTdGFydEhvdmVyVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0U3RhcnRIb3ZlclZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5wdXRTdGFydEhvdmVyVmFsdWUhOiBEYXRlIHwgbnVsbDtcblxuICBzZXQgaW5wdXRFbmRIb3ZlclZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy5faW5wdXRFbmRIb3ZlclZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgaW5wdXRFbmRIb3ZlclZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dEVuZEhvdmVyVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9pbnB1dEVuZEhvdmVyVmFsdWUhOiBEYXRlIHwgbnVsbDtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGRhdGVQaWNrZXJDbGFzc2VzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnZGF0ZS1waWNrZXInOiB0cnVlLFxuICAgICAgW2BkYXRlLXBpY2tlci0ke3RoaXMuc2l6ZX1gXTogdGhpcy5zaXplLFxuICAgICAgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQsXG4gICAgICAnaXMtdmFsaWQnOiB0aGlzLnZhbGlkID09PSB0cnVlLFxuICAgICAgJ2lzLWludmFsaWQnOiB0aGlzLnZhbGlkID09PSBmYWxzZVxuICAgIH07XG4gIH1cblxuICBmb3JtYXREYXRlKGRhdGU6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICFkYXRlIHx8ICFpc1ZhbGlkRGF0ZShkYXRlKVxuICAgICAgPyAnJ1xuICAgICAgOiB0eXBlb2YgdGhpcy5pbnB1dERhdGVGb3JtYXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB0aGlzLmlucHV0RGF0ZUZvcm1hdChkYXRlKVxuICAgICAgICA6ICEhdGhpcy5mb3JtYXQgJiYgISF0aGlzLmxvY2FsZSgpICYmIHRoaXMubG9jYWxlKCkgIT09ICdkZWZhdWx0J1xuICAgICAgICAgID8gZm9ybWF0RGF0ZShkYXRlLCB0aGlzLmZvcm1hdCwgdGhpcy5sb2NhbGUoKSlcbiAgICAgICAgICA6IHRoaXMudGltZXBpY2tlclxuICAgICAgICAgICAgPyBkYXRlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlKCkpXG4gICAgICAgICAgICA6IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlKCkpO1xuICB9XG5cbiAgcmVhZG9ubHkgI2JyZWFrcG9pbnRzID0ge1xuICAgIE9uZUNhbGVuZGFyUmFuZ2VzOiAnKG1pbi13aWR0aDogNDgwcHgpJyxcbiAgICBUd29DYWxlbmRhcnM6ICcobWF4LXdpZHRoOiA2NTBweCknLFxuICAgIFR3b0NhbGVuZGFyc1JhbmdlczogJyhtYXgtd2lkdGg6IDgxMHB4KSdcbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1c3RvbVJhbmdlcyA9IHRoaXMucmFuZ2VzID8gT2JqZWN0LmVudHJpZXModGhpcy5yYW5nZXMpIDogW107XG5cbiAgICBjb25zdCBicmVha3BvaW50cyA9IHRoaXMuI2JyZWFrcG9pbnRzO1xuXG4gICAgdGhpcy5sYXlvdXRDaGFuZ2VzID0gdGhpcy5icmVha3BvaW50T2JzZXJ2ZXJcbiAgICAgIC5vYnNlcnZlKFticmVha3BvaW50cy5PbmVDYWxlbmRhclJhbmdlcywgYnJlYWtwb2ludHMuVHdvQ2FsZW5kYXJzLCBicmVha3BvaW50cy5Ud29DYWxlbmRhcnNSYW5nZXNdKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQubWF0Y2hlcykge1xuICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPVxuICAgICAgICAgICAgKHRoaXMuY3VzdG9tUmFuZ2VzPy5sZW5ndGggPiAwICYmIHJlc3VsdC5icmVha3BvaW50c1ticmVha3BvaW50cy5Ud29DYWxlbmRhcnNSYW5nZXNdKSB8fFxuICAgICAgICAgICAgcmVzdWx0LmJyZWFrcG9pbnRzW2JyZWFrcG9pbnRzLlR3b0NhbGVuZGFyc107XG4gICAgICAgICAgaWYgKHRoaXMuY3VzdG9tUmFuZ2VzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dSYW5nZXMgPSAhcmVzdWx0LmJyZWFrcG9pbnRzW2JyZWFrcG9pbnRzLk9uZUNhbGVuZGFyUmFuZ2VzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zdWJzY3JpYmVEYXRlQ2hhbmdlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmxheW91dENoYW5nZXM/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVEYXRlQ2hhbmdlKGZhbHNlKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29udGVudFRlbXBsYXRlcy5mb3JFYWNoKChjaGlsZDogVGVtcGxhdGVJZERpcmVjdGl2ZSkgPT4ge1xuICAgICAgICB0aGlzLnRlbXBsYXRlc1tjaGlsZC5pZF0gPSBjaGlsZC50ZW1wbGF0ZVJlZjtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkYXRlJ10pIHtcbiAgICAgIC8vIGZvciBkYXRlLXBpY2tlciBjb21wb25lbnRcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmNvbnZlcnRWYWx1ZVRvRGF0ZShjaGFuZ2VzWydkYXRlJ10/LmN1cnJlbnRWYWx1ZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlU3RhcnREYXRlQ2hhbmdlKGRhdGUpO1xuICAgICAgdGhpcy5jYWxlbmRhckRhdGUgPSBkYXRlID8/IHRoaXMuY2FsZW5kYXJEYXRlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snc3RhcnREYXRlJ10pIHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmNvbnZlcnRWYWx1ZVRvRGF0ZShjaGFuZ2VzWydzdGFydERhdGUnXT8uY3VycmVudFZhbHVlKSA/PyBudWxsO1xuICAgICAgdGhpcy5oYW5kbGVTdGFydERhdGVDaGFuZ2UoZGF0ZSk7XG4gICAgICB0aGlzLmNhbGVuZGFyRGF0ZSA9IGRhdGUgPz8gdGhpcy5jYWxlbmRhckRhdGU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydlbmREYXRlJ10pIHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmNvbnZlcnRWYWx1ZVRvRGF0ZShjaGFuZ2VzWydlbmREYXRlJ10/LmN1cnJlbnRWYWx1ZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShkYXRlKTtcbiAgICB9XG4gIH1cblxuICBjb252ZXJ0VmFsdWVUb0RhdGUodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dFBhcnNlKHZhbHVlKSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9XG5cbiAgaW5wdXRQYXJzZShkYXRlOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuaW5wdXREYXRlUGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSB0aGlzLmlucHV0RGF0ZVBhcnNlKGRhdGUpO1xuICAgICAgaWYgKGlzVmFsaWREYXRlKHBhcnNlZERhdGUpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZWREYXRlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0TG9jYWxEYXRlRnJvbVN0cmluZyhkYXRlLCB0aGlzLmxvY2FsZSgpLCB0aGlzLnRpbWVwaWNrZXIpO1xuICB9XG5cbiAgZ2V0Q3VzdG9tUmFuZ2VLZXkoY3VzdG9tUmFuZ2U6IGFueSkge1xuICAgIHJldHVybiBjdXN0b21SYW5nZVswXTtcbiAgfVxuXG4gIHNldEN1c3RvbVJhbmdlKGN1c3RvbVJhbmdlOiBhbnkpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEN1c3RvbVJhbmdlS2V5KGN1c3RvbVJhbmdlKTtcbiAgICB0aGlzLmhhbmRsZVN0YXJ0RGF0ZUNoYW5nZShjdXN0b21SYW5nZVsxXVswXSk7XG4gICAgdGhpcy5oYW5kbGVFbmREYXRlQ2hhbmdlKGN1c3RvbVJhbmdlWzFdWzFdKTtcbiAgfVxuXG4gIGhhbmRsZUNhbGVuZGFyQ2VsbEhvdmVyKCRldmVudDogRGF0ZSB8IG51bGwpIHtcbiAgICB0aGlzLmNhbGVuZGFyQ2VsbEhvdmVyLmVtaXQoJGV2ZW50KTtcbiAgICBpZiAoIXRoaXMuc3RhcnREYXRlKCkpIHtcbiAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLnN0YXJ0RGF0ZUVsZW1lbnRSZWYsICRldmVudCk7XG4gICAgICB0aGlzLmlucHV0U3RhcnRIb3ZlclZhbHVlID0gJGV2ZW50O1xuICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZW5kRGF0ZUVsZW1lbnRSZWYsIG51bGwpO1xuICAgICAgdGhpcy5pbnB1dEVuZEhvdmVyVmFsdWUgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5lbmREYXRlRWxlbWVudFJlZiwgJGV2ZW50KTtcbiAgICAgIHRoaXMuaW5wdXRFbmRIb3ZlclZhbHVlID0gJGV2ZW50O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNhbGVuZGFyRGF0ZUNoYW5nZSgkZXZlbnQ6IERhdGUpIHtcbiAgICBpZiAodGhpcy5jYWxlbmRhckRhdGUuZ2V0VGltZSgpICE9PSAkZXZlbnQuZ2V0VGltZSgpKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyRGF0ZUNoYW5nZS5lbWl0KCRldmVudCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlU3RhcnREYXRlQ2hhbmdlKGRhdGU6IERhdGUgfCBudWxsKSB7XG4gICAgdGhpcy5zdGFydERhdGVNb2RlbC5zZXQoZGF0ZSA/PyBudWxsKTtcbiAgICB0aGlzLmRhdGVSYW5nZUdyb3VwLnBhdGNoVmFsdWUoeyBzdGFydERhdGVJbnB1dDogdGhpcy5zdGFydERhdGVWYWx1ZSgpIH0pO1xuICAgIHRoaXMuaW5wdXRTdGFydEhvdmVyVmFsdWUgPSBudWxsO1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLnJhbmdlID8geyBzdGFydERhdGU6IHRoaXMuc3RhcnREYXRlKCksIGVuZERhdGU6IHRoaXMuZW5kRGF0ZSgpIH0gOiB0aGlzLnN0YXJ0RGF0ZSgpO1xuICB9XG5cbiAgaGFuZGxlRW5kRGF0ZUNoYW5nZShkYXRlOiBEYXRlIHwgbnVsbCkge1xuICAgIGlmICghdGhpcy5yYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVuZERhdGVNb2RlbC5zZXQoZGF0ZSA/PyBudWxsKTtcbiAgICB0aGlzLmRhdGVSYW5nZUdyb3VwLnBhdGNoVmFsdWUoeyBlbmREYXRlSW5wdXQ6IHRoaXMuZW5kRGF0ZVZhbHVlKCkgfSk7XG4gICAgdGhpcy5pbnB1dEVuZEhvdmVyVmFsdWUgPSBudWxsO1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLnJhbmdlID8geyBzdGFydERhdGU6IHRoaXMuc3RhcnREYXRlKCksIGVuZERhdGU6IHRoaXMuZW5kRGF0ZSgpIH0gOiB0aGlzLnN0YXJ0RGF0ZSgpO1xuICB9XG5cbiAgaGFuZGxlQ2xlYXIoJGV2ZW50PzogTW91c2VFdmVudCkge1xuICAgIC8vIHRoaXMuY2FsZW5kYXJDb21wb25lbnQuY2xlYXJEYXRlcygpO1xuICAgIHRoaXMuaGFuZGxlU3RhcnREYXRlQ2hhbmdlKG51bGwpO1xuICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShudWxsKTtcbiAgfVxuXG4gIGhhbmRsZVN0YXJ0RGF0ZUlucHV0Q2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9ICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmlucHV0UGFyc2UoaW5wdXRWYWx1ZSk7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICAvLyB0aGlzLmNhbGVuZGFyQ29tcG9uZW50LmNsZWFyRGF0ZXMoKTtcbiAgICAgIHRoaXMuaGFuZGxlU3RhcnREYXRlQ2hhbmdlKG51bGwpO1xuICAgICAgdGhpcy5oYW5kbGVFbmREYXRlQ2hhbmdlKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUgJiYgZGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICghKHRoaXMuZm9yYmlkZGVuRGF0ZShkYXRlKSB8fCAodGhpcy5lbmREYXRlKCkgJiYgdGhpcy5lbmREYXRlKCkgPCBkYXRlKSkpIHtcbiAgICAgICAgdGhpcy5jYWxlbmRhckRhdGUgPSBkYXRlO1xuICAgICAgICB0aGlzLmhhbmRsZVN0YXJ0RGF0ZUNoYW5nZShkYXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5oYW5kbGVTdGFydERhdGVDaGFuZ2UodGhpcy5zdGFydERhdGUoKSA/PyBudWxsKTtcbiAgfVxuXG4gIGhhbmRsZUVuZERhdGVJbnB1dENoYW5nZSgkZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPSAoJGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5pbnB1dFBhcnNlKGlucHV0VmFsdWUpO1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgdGhpcy5oYW5kbGVFbmREYXRlQ2hhbmdlKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUgJiYgZGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICghKHRoaXMuZm9yYmlkZGVuRGF0ZShkYXRlKSB8fCAodGhpcy5zdGFydERhdGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpID4gZGF0ZSkpKSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJEYXRlID0gZGF0ZTtcbiAgICAgICAgdGhpcy5oYW5kbGVFbmREYXRlQ2hhbmdlKGRhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oYW5kbGVFbmREYXRlQ2hhbmdlKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmhhbmRsZUVuZERhdGVDaGFuZ2UodGhpcy5lbmREYXRlKCkgPz8gbnVsbCk7XG4gIH1cblxuICBmb3JiaWRkZW5EYXRlKGRhdGU6IERhdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgaXNEYXRlRGlzYWJsZWQoZGF0ZSwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUsIHRoaXMuZGlzYWJsZWREYXRlcykgfHxcbiAgICAgICh0aGlzLmRhdGVGaWx0ZXIgPyAhdGhpcy5kYXRlRmlsdGVyKGRhdGUpIDogZmFsc2UpXG4gICAgKTtcbiAgfVxuXG4gIHNldElucHV0VmFsdWUgPSAoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgZGF0ZTogRGF0ZSB8IG51bGwpID0+IHtcbiAgICBpZiAoIWVsZW1lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5mb3JtYXREYXRlKGRhdGUpO1xuICAgIC8vIGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZUFzRGF0ZSA9IGRhdGU7XG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIG9uQ2hhbmdlOiBhbnkgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgIC8qIGVtcHR5ICovXG4gIH07XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge1xuICAgIC8qIGVtcHR5ICovXG4gIH07XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghIXZhbHVlKSB7XG4gICAgICB0aGlzLmhhbmRsZVN0YXJ0RGF0ZUNoYW5nZSh0aGlzLnJhbmdlID8gdmFsdWUuc3RhcnREYXRlIDogdmFsdWUpO1xuICAgICAgdGhpcy5oYW5kbGVFbmREYXRlQ2hhbmdlKHRoaXMucmFuZ2UgPyB2YWx1ZS5lbmREYXRlIDogbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlU3RhcnRUaW1lQ2hhbmdlKHRpbWU6IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnN0YXJ0RGF0ZU1vZGVsLnNldCh0aW1lID8/IHRoaXMuc3RhcnREYXRlKCkpO1xuICB9XG5cbiAgaGFuZGxlRW5kVGltZUNoYW5nZSh0aW1lOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF0aGlzLnJhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZW5kRGF0ZU1vZGVsLnNldCh0aW1lID8/IHRoaXMuZW5kRGF0ZSgpKTtcbiAgfVxufVxuIiwiPGZpZWxkc2V0IFtmb3JtR3JvdXBdPVwiZGF0ZVJhbmdlR3JvdXBcIj5cbiAgPGMtZHJvcGRvd24gI2Ryb3Bkb3duPVwiY0Ryb3Bkb3duXCIgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCIgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIiBbbmdDbGFzc109XCJkYXRlUGlja2VyQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgIFtwb3BwZXJPcHRpb25zXT1cInBvcHBlcmpzT3B0aW9uc1wiIGNsYXNzPVwiZGF0ZS1waWNrZXIgcGlja2VyXCI+XG4gICAgPGRpdiBbY2FyZXRdPVwiZmFsc2VcIlxuICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkID8/IGRyb3Bkb3duLnZpc2libGVcIlxuICAgICAgICAgY0Ryb3Bkb3duVG9nZ2xlXG4gICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWlucHV0LWdyb3VwXCJcbiAgICA+XG4gICAgICA8aW5wdXQgI3N0YXJ0RGF0ZUVsZW1lbnRSZWZcbiAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVN0YXJ0RGF0ZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJ7aG92ZXI6ICEhaW5wdXRTdGFydEhvdmVyVmFsdWV9XCJcbiAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic3RhcnREYXRlUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgIFtyZWFkb25seV09XCJpbnB1dFJlYWRPbmx5ID8/IG51bGxcIlxuICAgICAgICAgICAgIFt2YWxpZF09XCJyYW5nZSA/IHVuZGVmaW5lZCA6IHZhbGlkXCJcbiAgICAgICAgICAgICBjRm9ybUNvbnRyb2xcbiAgICAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWlucHV0XCJcbiAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdGFydERhdGVJbnB1dFwiXG4gICAgICAgICAgICAgcGF0dGVybj1cIlsxLTldKlwiXG4gICAgICA+XG4gICAgICBAaWYgKHJhbmdlICYmIHNlcGFyYXRvciAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLXNlcGFyYXRvclwiPjwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChyYW5nZSkge1xuICAgICAgICA8aW5wdXQgI2VuZERhdGVFbGVtZW50UmVmXG4gICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUVuZERhdGVJbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCJcbiAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntob3ZlcjogISFpbnB1dEVuZEhvdmVyVmFsdWV9XCJcbiAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJlbmREYXRlUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImlucHV0UmVhZE9ubHkgPz8gbnVsbFwiXG4gICAgICAgICAgICAgICBbdmFsaWRdPVwidmFsaWQgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgIGNGb3JtQ29udHJvbFxuICAgICAgICAgICAgICAgY2xhc3M9XCJkYXRlLXBpY2tlci1pbnB1dFwiXG4gICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJlbmREYXRlSW5wdXRcIlxuICAgICAgICAgICAgICAgcGF0dGVybj1cIlsxLTldKlwiXG4gICAgICAgID5cbiAgICAgIH1cbiAgICAgIEBpZiAoaW5kaWNhdG9yKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1pbmRpY2F0b3JcIj48L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY2xlYW5lciAmJiBzdGFydERhdGVFbGVtZW50UmVmLnZhbHVlICYmICFkaXNhYmxlZCkge1xuICAgICAgICA8ZGl2IChjbGljayk9XCIhZGlzYWJsZWQgJiYgaGFuZGxlQ2xlYXIoJGV2ZW50KVwiIGNsYXNzPVwiZGF0ZS1waWNrZXItY2xlYW5lclwiIHJvbGU9XCJidXR0b25cIj48L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNEcm9wZG93bk1lbnUgY2xhc3M9XCJkYXRlLXBpY2tlci1kcm9wZG93biBweS0wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItYm9keVwiPlxuICAgICAgICBAaWYgKCFzaG93UmFuZ2VzKSB7XG4gICAgICAgICAgQGlmIChyYW5nZXMgJiYgY3VzdG9tUmFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1yYW5nZXNcIj5cbiAgICAgICAgICAgICAgQGZvciAoY3VzdG9tUmFuZ2Ugb2YgY3VzdG9tUmFuZ2VzOyB0cmFjayBjdXN0b21SYW5nZSkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInNldEN1c3RvbVJhbmdlKGN1c3RvbVJhbmdlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwicmFuZ2VzQnV0dG9uc0NvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cInJhbmdlc0J1dHRvbnNTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YXJpYW50XT1cInJhbmdlc0J1dHRvbnNWYXJpYW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNCdXR0b24+XG4gICAgICAgICAgICAgICAgICB7eyBjdXN0b21SYW5nZSB8IGN1c3RvbVJhbmdlS2V5IH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8Yy1jYWxlbmRhclxuICAgICAgICAgIChjYWxlbmRhckNlbGxIb3Zlcik9XCJoYW5kbGVDYWxlbmRhckNlbGxIb3ZlcigkZXZlbnQpXCJcbiAgICAgICAgICAoY2FsZW5kYXJEYXRlQ2hhbmdlKT1cImhhbmRsZUNhbGVuZGFyRGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAoZW5kRGF0ZUNoYW5nZSk9XCJoYW5kbGVFbmREYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChzdGFydERhdGVDaGFuZ2UpPVwiaGFuZGxlU3RhcnREYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtjYWxlbmRhckRhdGVdPVwiY2FsZW5kYXJEYXRlXCJcbiAgICAgICAgICBbY2FsZW5kYXJzXT1cImlzTW9iaWxlID8gMSA6IGNhbGVuZGFyc1wiXG4gICAgICAgICAgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlclwiXG4gICAgICAgICAgW2RheUZvcm1hdF09XCJkYXlGb3JtYXRcIlxuICAgICAgICAgIFtkaXNhYmxlZERhdGVzXT1cImRpc2FibGVkRGF0ZXNcIlxuICAgICAgICAgIFtlbmREYXRlXT1cImVuZERhdGUoKVwiXG4gICAgICAgICAgW2ZpcnN0RGF5T2ZXZWVrXT1cImZpcnN0RGF5T2ZXZWVrXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZSgpXCJcbiAgICAgICAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCJcbiAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcbiAgICAgICAgICBbbmF2WWVhckZpcnN0XT1cIm5hdlllYXJGaXJzdFwiXG4gICAgICAgICAgW25hdmlnYXRpb25dPVwibmF2aWdhdGlvblwiXG4gICAgICAgICAgW3JhbmdlXT1cInJhbmdlXCJcbiAgICAgICAgICBbc2VsZWN0QWRqYWNlbnREYXlzXT1cInNlbGVjdEFkamFjZW50RGF5c1wiXG4gICAgICAgICAgW3NlbGVjdGlvblR5cGVdPVwic2VsZWN0aW9uVHlwZVwiXG4gICAgICAgICAgW3Nob3dBZGphY2VudERheXNdPVwic2hvd0FkamFjZW50RGF5c1wiXG4gICAgICAgICAgW3Nob3dXZWVrTnVtYmVyXT1cInNob3dXZWVrTnVtYmVyXCJcbiAgICAgICAgICBbc3RhcnREYXRlXT1cInN0YXJ0RGF0ZSgpXCJcbiAgICAgICAgICBbd2Vla051bWJlcnNMYWJlbF09XCJ3ZWVrTnVtYmVyc0xhYmVsXCJcbiAgICAgICAgICBbd2Vla2RheUZvcm1hdF09XCJ3ZWVrZGF5Rm9ybWF0XCJcbiAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWNhbGVuZGFyc1wiXG4gICAgICAgIC8+XG4gICAgICAgIEBpZiAoZmFsc2UgJiYgdGltZXBpY2tlcikge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci10aW1lcGlja2Vyc1wiPlxuICAgICAgICAgICAgPCEtLSB0b2RvLS0+XG4gICAgICAgICAgICA8Yy10aW1lLXBpY2tlclxuICAgICAgICAgICAgICB2YXJpYW50PVwic2VsZWN0XCJcbiAgICAgICAgICAgICAgW2xvY2FsZV09XCJsb2NhbGUoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhcnREYXRlKClcIlxuICAgICAgICAgICAgICBbdGltZV09XCJzdGFydERhdGUoKSA/PyB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAodGltZUNoYW5nZSk9XCJoYW5kbGVTdGFydFRpbWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgQGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICA8Yy10aW1lLXBpY2tlclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWxlY3RcIlxuICAgICAgICAgICAgICAgIFtsb2NhbGVdPVwibG9jYWxlKClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZW5kRGF0ZSgpXCJcbiAgICAgICAgICAgICAgICBbdGltZV09XCJlbmREYXRlKCkgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICAodGltZUNoYW5nZSk9XCJoYW5kbGVFbmRUaW1lQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAodGVtcGxhdGVzPy5kYXRlUGlja2VyRm9vdGVyKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1mb290ZXJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVzPy5kYXRlUGlja2VyRm9vdGVyOyBjb250ZXh0OiB7JGltcGxpY2l0OiBkcm9wZG93bn1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGVudCAvPlxuICA8L2MtZHJvcGRvd24+XG48L2ZpZWxkc2V0PlxuIl19
|
|
599
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFVBQVUsRUFDVixNQUFNLEVBRU4sVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLGVBQWUsRUFHZixNQUFNLEVBQ04sTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBRUwsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBS3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUNMLGFBQWEsRUFDYixVQUFVLEVBQ1Ysc0JBQXNCLEVB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dUJBQXVCLDBKQUN2QixxQkFBcUIsMkhBRXJCLG9CQUFvQixxSUFFcEIsa0JBQWtCOzsyRkFXVCx3QkFBd0I7a0JBOUJwQyxTQUFTOytCQUNFLHFCQUFxQixZQUdyQixrQkFBa0IsY0FDaEIsSUFBSSxXQUNQO3dCQUNQLE9BQU87d0JBQ1AsZ0JBQWdCO3dCQUNoQixtQkFBbUI7d0JBQ25CLGlCQUFpQjt3QkFDakIsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsdUJBQXVCO3dCQUN2QixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsb0JBQW9CO3dCQUNwQix1QkFBdUI7d0JBQ3ZCLGtCQUFrQjtxQkFDbkIsYUFDVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzs0QkFDdkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07OEJBdU1WLFlBQVk7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFO2dCQWlEL0IsS0FBSztzQkFEUixLQUFLO2dCQXdIb0IsTUFBTTtzQkFBL0IsWUFBWTt1QkFBQyxVQUFVO2dCQWtEcEIsaUJBQWlCO3NCQURwQixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgY29udGVudENoaWxkcmVuLFxuICBEZXN0cm95UmVmLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIElucHV0LFxuICBtb2RlbCxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIFRlbXBsYXRlUmVmLFxuICB2aWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGZvcm1hdERhdGUsIE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5cbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2J1dHRvbic7XG5pbXBvcnQge1xuICBkYXRlVHJhbnNmb3JtLFxuICBlcXVhbERhdGVzLFxuICBnZXRMb2NhbERhdGVGcm9tU3RyaW5nLFxuICBpc0RhdGVEaXNhYmxlZCxcbiAgaXNWYWxpZERhdGVcbn0gZnJvbSAnLi4vLi4vY2FsZW5kYXIvY2FsZW5kYXIudXRpbHMnO1xuaW1wb3J0IHtcbiAgRGF0ZUZpbHRlclR5cGUsXG4gIERheUZvcm1hdFR5cGUsXG4gIERheXNPZldlZWssXG4gIFNlbGVjdGlvblR5cGUsXG4gIFdlZWtkYXlGb3JtYXRUeXBlXG59IGZyb20gJy4uLy4uL2NhbGVuZGFyL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jYWxlbmRhcic7XG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tICcuLi8uLi9jb3JldWkudHlwZXMnO1xuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQsIERyb3Bkb3duTWVudURpcmVjdGl2ZSwgRHJvcGRvd25Ub2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kcm9wZG93bic7XG5pbXBvcnQgeyBGb3JtQ29udHJvbERpcmVjdGl2ZSwgSW5wdXRHcm91cENvbXBvbmVudCwgSW5wdXRHcm91cFRleHREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9mb3JtJztcbmltcG9ydCB7IFRlbXBsYXRlSWREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgVGltZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3RpbWUtcGlja2VyJztcbmltcG9ydCB7IEN1c3RvbVJhbmdlS2V5UGlwZSB9IGZyb20gJy4vY3VzdG9tLXJhbmdlLWtleS5waXBlJztcblxuZXhwb3J0IGludGVyZmFjZSBJQ2FsZW5kYXJSYW5nZXMge1xuICBba2V5OiBzdHJpbmddOiBEYXRlW107XG59XG5cbmV4cG9ydCB0eXBlIFRDdXN0b21SYW5nZSA9IFtzdHJpbmcsIERhdGVbXV07XG5cbi8qKiBNdXN0IGJlIGEgdmFsaWQgZGF0ZSBzdHJpbmcgKi9cbi8vIHRvZG86IHZhbGlkYXRpb25cbi8vIGV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkRGF0ZVN0cmluZ1ZhbGlkYXRvcihsb2NhbGU6IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcbi8vICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4vLyAgICAgLy8gY29uc3QgdmFsaWREYXRlID0gIWlzTmFOKERhdGUucGFyc2UoY29udHJvbC52YWx1ZSkpO1xuLy8gICAgIHN0cmluZ1RvRGF0ZUNvbnZlcnQoY29udHJvbC52YWx1ZSwgbG9jYWxlKTtcbi8vICAgICBjb25zdCBkYXRlU2hpbSA9IGN2dERhdGUoY29udHJvbC52YWx1ZSwgbG9jYWxlKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgLy8gY29udHJvbC5zZXRWYWx1ZShuZXcgRGF0ZShkYXRlU2hpbS55ZWFyLCBkYXRlU2hpbS5tb250aCwgZGF0ZVNoaW0uZGF5KSlcbi8vICAgICBjb25zb2xlLmxvZygnZGF0ZVNoaW0nLCBkYXRlU2hpbSwgbG9jYWxlKTtcbi8vICAgICBjb25zdCB2YWxpZERhdGUgPSBpc1ZhbGlkRGF0ZShjb250cm9sLnZhbHVlKTtcbi8vICAgICBjb25zb2xlLmxvZygnaW52YWxpZERhdGVTdHJpbmdWYWxpZGF0b3InLCBjb250cm9sLCBjb250cm9sLnZhbHVlLCB2YWxpZERhdGUpO1xuLy8gICAgIHJldHVybiB2YWxpZERhdGUgPyB7IGludmFsaWREYXRlU3RyaW5nVmFsaWRhdG9yOiB7IHZhbHVlOiBjb250cm9sLnZhbHVlIH0gfSA6IG51bGw7XG4vLyAgIH07XG4vLyB9XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2MtZGF0ZS1yYW5nZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICBleHBvcnRBczogJ2NEYXRlUmFuZ2VQaWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcyxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgQ2FsZW5kYXJDb21wb25lbnQsXG4gICAgVGltZVBpY2tlckNvbXBvbmVudCxcbiAgICBCdXR0b25EaXJlY3RpdmUsXG4gICAgRHJvcGRvd25Db21wb25lbnQsXG4gICAgRHJvcGRvd25Ub2dnbGVEaXJlY3RpdmUsXG4gICAgRHJvcGRvd25NZW51RGlyZWN0aXZlLFxuICAgIElucHV0R3JvdXBDb21wb25lbnQsXG4gICAgRm9ybUNvbnRyb2xEaXJlY3RpdmUsXG4gICAgSW5wdXRHcm91cFRleHREaXJlY3RpdmUsXG4gICAgQ3VzdG9tUmFuZ2VLZXlQaXBlXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICByZWFkb25seSAjYnJlYWtwb2ludE9ic2VydmVyID0gaW5qZWN0KEJyZWFrcG9pbnRPYnNlcnZlcik7XG4gIHJlYWRvbmx5ICNkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZvcm1hdCBvZiBkYXkgbmFtZS5cbiAgICogQGRlZmF1bHQgJ251bWVyaWMnXG4gICAqIEB0eXBlIERheUZvcm1hdFR5cGVcbiAgICovXG4gIHJlYWRvbmx5IGRheUZvcm1hdCA9IGlucHV0PERheUZvcm1hdFR5cGU+KCdudW1lcmljJyk7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY2FsZW5kYXJzIHRoYXQgcmVuZGVyIG9uIGRlc2t0b3AgZGV2aWNlcy5cbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIHJlYWRvbmx5IGNhbGVuZGFycyA9IGlucHV0KDIsIHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSk7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB2aXNpYmlsaXR5IG9yIHNldCB0aGUgY29udGVudCBvZiB0aGUgY2xlYW5lciBidXR0b24uXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW5lciA9IGlucHV0KHRydWUsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgdGhlIGRyb3Bkb3duIHNob3VsZCBiZSBjbG9zZWQgYWZ0ZXIgdmFsdWUgc2V0dGluZy5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xvc2VPblNlbGVjdCA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogU2V0IGRhdGUgZm9ybWF0LlxuICAgKiBXZSB1c2UgQW5ndWxhciBmb3JtYXREYXRlKCkgZnVuY3Rpb24sIHNlZTpcbiAgICogLSBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2NvbW1vbi9mb3JtYXREYXRlXG4gICAqIC0gaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24vRGF0ZVBpcGUjcHJlLWRlZmluZWQtZm9ybWF0LW9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdCA9IGlucHV0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogVG9nZ2xlIHZpc2liaWxpdHkgb3Igc2V0IHRoZSBjb250ZW50IG9mIHRoZSBpbnB1dCBpbmRpY2F0b3IuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kaWNhdG9yID0gaW5wdXQodHJ1ZSk7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBmdW5jdGlvbiB0byBmb3JtYXQgdGhlIHNlbGVjdGVkIGRhdGUgaW50byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gYSBjdXN0b20gZm9ybWF0LlxuICAgKiBAc2luY2UgdjUuMC4wXG4gICAqL1xuICByZWFkb25seSBpbnB1dERhdGVGb3JtYXQgPSBpbnB1dDwoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gZnVuY3Rpb24gdG8gcGFyc2UgdGhlIGlucHV0IHZhbHVlIGludG8gYSB2YWxpZCBEYXRlIG9iamVjdC5cbiAgICogQHNpbmNlIHY1LjAuMFxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXREYXRlUGFyc2UgPSBpbnB1dDwoZGF0ZTogc3RyaW5nIHwgRGF0ZSkgPT4gRGF0ZT4oKTtcblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSByZWFkb25seSBzdGF0ZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRSZWFkT25seUlucHV0ID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ2lucHV0UmVhZE9ubHknIH0pO1xuXG4gIHJlYWRvbmx5IGlucHV0UmVhZE9ubHkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRSZWFkT25seUlucHV0KCkgfHwgdHlwZW9mIHRoaXMuZm9ybWF0KCkgPT09ICdzdHJpbmcnO1xuICB9KTtcblxuICAvKipcbiAgICogUmVvcmRlciB5ZWFyLW1vbnRoIG5hdmlnYXRpb24sIGFuZCByZW5kZXIgeWVhciBmaXJzdC5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgbmF2WWVhckZpcnN0ID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgc2hvcnQgaGludHMgdGhhdCBhcmUgdmlzaWJsZSBpbiBzdGFydCBkYXRlIGFuZCBlbmQgZGF0ZSBpbnB1dHMuXG4gICAqIHR5cGUgc3RyaW5nXG4gICAqL1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZyB8IHN0cmluZ1tdPihbJ1N0YXJ0IGRhdGUnLCAnRW5kIGRhdGUnXSk7XG5cbiAgLyoqXG4gICAqIFByZWRlZmluZWQgZGF0ZSByYW5nZXMgdGhlIHVzZXIgY2FuIHNlbGVjdCBmcm9tLlxuICAgKiBAdHlwZSBJQ2FsZW5kYXJSYW5nZXNcbiAgICovXG4gIHJlYWRvbmx5IHJhbmdlcyA9IGlucHV0PElDYWxlbmRhclJhbmdlcz4oKTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgY29sb3IgY29udGV4dCBvZiB0aGUgY2FuY2VsIGJ1dHRvbiB0byBvbmUgb2YgQ29yZVVJ4oCZcyB0aGVtZWQgY29sb3JzLlxuICAgKiBAdHlwZSAncHJpbWFyeScgfCAnc2Vjb25kYXJ5JyB8ICdzdWNjZXNzJyB8ICdkYW5nZXInIHwgJ3dhcm5pbmcnIHwgJ2luZm8nIHwgJ2RhcmsnIHwgJ2xpZ2h0JyB8IHN0cmluZ1xuICAgKiBAZGVmYXVsdCAnc2Vjb25kYXJ5J1xuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2VzQnV0dG9uc0NvbG9yID0gaW5wdXQ8Q29sb3JzPignc2Vjb25kYXJ5Jyk7XG5cbiAgLyoqXG4gICAqIFNpemUgdGhlIHJhbmdlcyBidXR0b24gc21hbGwgb3IgbGFyZ2UuXG4gICAqIEB0eXBlICdzbScgfCAnbGcnIHwgJydcbiAgICovXG4gIHJlYWRvbmx5IHJhbmdlc0J1dHRvbnNTaXplID0gaW5wdXQ8J3NtJyB8ICdsZycgfCAnJz4oJycpO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHJhbmdlcyBidXR0b24gdmFyaWFudCB0byBhbiBvdXRsaW5lZCBidXR0b24gb3IgYSBnaG9zdCBidXR0b24uXG4gICAqIEB0eXBlICdvdXRsaW5lJyB8ICdnaG9zdCcgfCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHJhbmdlc0J1dHRvbnNWYXJpYW50ID0gaW5wdXQ8J291dGxpbmUnIHwgJ2dob3N0Jz4oJ2dob3N0Jyk7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaWNvbiBvciBjaGFyYWN0ZXIgdGhhdCBzZXBhcmF0ZXMgdHdvIGRhdGVzLlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNlcGFyYXRvciA9IGlucHV0KHRydWUsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gIC8qKlxuICAgKiBTaXplIHRoZSBjb21wb25lbnQgc21hbGwgb3IgbGFyZ2UuXG4gICAqIEB0eXBlICdzbScgfCAnbGcnIHwgdW5kZWZpbmVkXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgc2l6ZSA9IGlucHV0PCdzbScgfCAnbGcnPigpO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGFkZGl0aW9uYWwgdGltZSBzZWxlY3Rpb24gYnkgYWRkaW5nIHNlbGVjdCBib3hlcyB0byBjaG9vc2UgdGltZS5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZXBpY2tlcklucHV0ID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ3RpbWVwaWNrZXInIH0pO1xuXG4gIGdldCB0aW1lcGlja2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyByZXR1cm4gdGhpcy50aW1lcGlja2VySW5wdXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgdmlzdWFsIHZhbGlkYXRpb24gZmVlZGJhY2suXG4gICAqIEB0eXBlIGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSB2YWxpZCA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZHJvcGRvd24gZGF0ZS1waWNrZXIgY29tcG9uZW50LlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB2aXNpYmxlSW5wdXQgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgcmVhZG9ubHkgdmlzaWJsZUlucHV0RWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIHRoaXMudmlzaWJsZS5zZXQodGhpcy52aXNpYmxlSW5wdXQoKSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgKTtcblxuICByZWFkb25seSB2aXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcblxuICByZWFkb25seSBzdGFydERhdGVNb2RlbCA9IG1vZGVsPERhdGUgfCBudWxsPihudWxsLCB7XG4gICAgYWxpYXM6ICdzdGFydERhdGUnXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGRhdGVNb2RlbEVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLmRhdGVSYW5nZUdyb3VwLnBhdGNoVmFsdWUoeyBzdGFydERhdGVJbnB1dDogdGhpcy5zdGFydERhdGVWYWx1ZSgpLCBlbmREYXRlSW5wdXQ6IHRoaXMuZW5kRGF0ZVZhbHVlKCkgfSk7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZSgpO1xuICAgICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuZW5kRGF0ZSgpO1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucmFuZ2UoKSA/IHsgc3RhcnREYXRlOiBzdGFydERhdGUsIGVuZERhdGU6IGVuZERhdGUgfSA6IHN0YXJ0RGF0ZTtcbiAgICAgIHRoaXMuc3RhcnREYXRlTW9kZWwuc2V0KHN0YXJ0RGF0ZSk7XG4gICAgICB0aGlzLmVuZERhdGVNb2RlbC5zZXQoZW5kRGF0ZSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgKTtcblxuICByZWFkb25seSBzdGFydERhdGUgPSBjb21wdXRlZChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZU1vZGVsKCk7XG4gICAgICByZXR1cm4gc3RhcnREYXRlID8gbmV3IERhdGUoc3RhcnREYXRlKSA6IG51bGw7XG4gICAgfSxcbiAgICB7IGVxdWFsOiBlcXVhbERhdGVzIH1cbiAgKTtcblxuICByZWFkb25seSBzdGFydERhdGVDaGFuZ2UgPSB0b09ic2VydmFibGUodGhpcy5zdGFydERhdGUpO1xuXG4gIHB1YmxpYyByZWFkb25seSBlbmREYXRlTW9kZWwgPSBtb2RlbDxEYXRlIHwgbnVsbD4obnVsbCwge1xuICAgIGFsaWFzOiAnZW5kRGF0ZSdcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZW5kRGF0ZSA9IGNvbXB1dGVkKFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLmVuZERhdGVNb2RlbCgpO1xuICAgICAgcmV0dXJuIGVuZERhdGUgPyBuZXcgRGF0ZShlbmREYXRlKSA6IG51bGw7XG4gICAgfSxcbiAgICB7IGVxdWFsOiBlcXVhbERhdGVzIH1cbiAgKTtcblxuICByZWFkb25seSBlbmREYXRlQ2hhbmdlID0gdG9PYnNlcnZhYmxlKHRoaXMuZW5kRGF0ZSk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBkYXRlVHJhbnNmb3JtIH0pIGNhbGVuZGFyRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgcmVhZG9ubHkgZGlzYWJsZWREYXRlcyA9IGlucHV0PChEYXRlW10gfCBEYXRlKVtdPihbXSk7XG5cbiAgLyoqXG4gICAqIFNldCBmaXJzdCBkYXkgb2Ygd2Vlay5cbiAgICogQHR5cGUgRGF5c09mV2Vla1xuICAgKiBAZGVmYXVsdCAxIChNb25kYXkpXG4gICAqL1xuICByZWFkb25seSBmaXJzdERheU9mV2VlayA9IGlucHV0PERheXNPZldlZWs+KDEpO1xuXG4gIHJlYWRvbmx5IGxvY2FsZSA9IGlucHV0KCdkZWZhdWx0Jyk7XG5cbiAgcmVhZG9ubHkgbWF4RGF0ZSA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgbWluRGF0ZSA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAvKipcbiAgICogU2hvdyBjYWxlbmRhciBuYXZpZ2F0aW9uLlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IG5hdmlnYXRpb24gPSBpbnB1dCh0cnVlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogQWxsb3cgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJhbmdlSW5wdXQgPSBpbnB1dCh0cnVlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdyYW5nZScgfSk7XG5cbiAgcmVhZG9ubHkgcmFuZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VJbnB1dCgpO1xuICB9KTtcblxuICByZWFkb25seSBkYXRlRmlsdGVyID0gaW5wdXQ8RGF0ZUZpbHRlclR5cGU+KCk7XG5cbiAgcmVhZG9ubHkgZGlzYWJsZWRJbnB1dCA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdkaXNhYmxlZCcgfSk7XG5cbiAgcmVhZG9ubHkgZGlzYWJsZWRFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIHRoaXMuZGlzYWJsZWQoKSA/IHRoaXMuZGF0ZVJhbmdlR3JvdXAuZGlzYWJsZSgpIDogdGhpcy5kYXRlUmFuZ2VHcm91cC5lbmFibGUoKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuI2Rpc2FibGVkKCkgfHwgdGhpcy5kaXNhYmxlZElucHV0KCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5ICNkaXNhYmxlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMucmFuZ2UoKSA/IHsgLi4udmFsdWUgfSA6IHZhbHVlO1xuICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLl92YWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KG5ld1ZhbHVlKSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIHRoaXMub25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KCkgJiYgdGhpcy52aXNpYmxlKCkpIHtcbiAgICAgICAgY29uc3QgaGFzVmFsdWUgPSB0aGlzLnJhbmdlKCkgPyAhISh0aGlzLl92YWx1ZS5zdGFydERhdGUgJiYgdGhpcy5fdmFsdWUuZW5kRGF0ZSkgOiAhIXRoaXMuX3ZhbHVlO1xuICAgICAgICB0aGlzLnZpc2libGUuc2V0KCFoYXNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZhbHVlOiBhbnkgPSB7fTtcblxuICAvKipcbiAgICogU2V0IGxlbmd0aCBvciBmb3JtYXQgb2YgZGF5IG5hbWUuXG4gICAqIEB0eXBlIFdlZWtkYXlGb3JtYXRUeXBlXG4gICAqIEBkZWZhdWx0ICdzaG9ydCdcbiAgICovXG4gIHJlYWRvbmx5IHdlZWtkYXlGb3JtYXQgPSBpbnB1dDxXZWVrZGF5Rm9ybWF0VHlwZT4oJ3Nob3J0Jyk7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHBvcHBlciBPcHRpb25zIG9iamVjdFxuICAgKiBAdHlwZSBQYXJ0aWFsPE9wdGlvbnM+XG4gICAqL1xuICByZWFkb25seSBwb3BwZXJqc09wdGlvbnMgPSBpbnB1dDxQYXJ0aWFsPE9wdGlvbnM+Pih7IHN0cmF0ZWd5OiAnYWJzb2x1dGUnIH0sIHsgYWxpYXM6ICdwb3BwZXJPcHRpb25zJyB9KTtcblxuICAvKipcbiAgICogU2V0IHdoZXRoZXIgZGF5cyBpbiBhZGphY2VudCBtb250aHMgc2hvd24gYmVmb3JlIG9yIGFmdGVyIHRoZSBjdXJyZW50IG1vbnRoIGFyZSBzZWxlY3RhYmxlLiBUaGlzIG9ubHkgYXBwbGllcyBpZiB0aGUgYHNob3dBZGphY2VudERheXNgIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAc2luY2UgNC40LjEwXG4gICAqL1xuICByZWFkb25seSBzZWxlY3RBZGphY2VudERheXMgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIHRvIGRpc3BsYXkgZGF0ZXMgaW4gYWRqYWNlbnQgbW9udGhzIChub24tc2VsZWN0YWJsZSkgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGN1cnJlbnQgbW9udGguXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAc2luY2UgNC40LjEwXG4gICAqL1xuICByZWFkb25seSBzaG93QWRqYWNlbnREYXlzID0gaW5wdXQodHJ1ZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHR5cGUgb2YgZGF0ZSBzZWxlY3Rpb24gYXMgZGF5LCB3ZWVrLCBtb250aCwgb3IgeWVhci5cbiAgICogQHR5cGUgJ2RheScgfCAnd2VlaycgfCAnbW9udGgnIHwgJ3llYXInXG4gICAqIEBkZWZhdWx0ICdkYXknXG4gICAqIEBzaW5jZSA1LjAuMFxuICAgKi9cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVHlwZSA9IGlucHV0PFNlbGVjdGlvblR5cGU+KCdkYXknKTtcblxuICAvKipcbiAgICogU2V0IHdoZXRoZXIgdG8gZGlzcGxheSB3ZWVrIG51bWJlcnMgaW4gdGhlIGNhbGVuZGFyLlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBzaW5jZSA1LjAuMFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd1dlZWtOdW1iZXIgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgLyoqXG4gICAqIExhYmVsIGRpc3BsYXllZCBvdmVyIHdlZWsgbnVtYmVycyBpbiB0aGUgY2FsZW5kYXIuXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICogQHNpbmNlIDUuMC4wXG4gICAqL1xuICByZWFkb25seSB3ZWVrTnVtYmVyc0xhYmVsID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gb3V0cHV0PERhdGUgfCBEYXRlW10gfCB1bmRlZmluZWQ+KCk7XG5cbiAgcmVhZG9ubHkgY2FsZW5kYXJDZWxsSG92ZXIgPSBvdXRwdXQ8RGF0ZSB8IG51bGw+KCk7XG4gIHJlYWRvbmx5IGNhbGVuZGFyRGF0ZUNoYW5nZSA9IG91dHB1dDxEYXRlPigpO1xuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZUVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pj4oJ3N0YXJ0RGF0ZUVsZW1lbnRSZWYnKTtcbiAgcmVhZG9ubHkgZW5kRGF0ZUVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pj4oJ2VuZERhdGVFbGVtZW50UmVmJyk7XG5cbiAgcmVhZG9ubHkgY29udGVudFRlbXBsYXRlcyA9IGNvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZUlkRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IHRlbXBsYXRlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50VGVtcGxhdGVzKCkucmVkdWNlKFxuICAgICAgKGFjYywgY2hpbGQpID0+IHtcbiAgICAgICAgYWNjW2NoaWxkLmlkXSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIFRlbXBsYXRlUmVmPGFueT4+XG4gICAgKTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIGRhdGVDaGFuZ2VTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVEYXRlQ2hhbmdlKHN1YnNjcmliZTogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoc3Vic2NyaWJlKSB7XG4gICAgICAvLyB0b2RvXG4gICAgICAvLyB0aGlzLmRhdGVDaGFuZ2VTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAvLyAgIHRoaXMuc3RhcnREYXRlQ2hhbmdlLnN1YnNjcmliZSgobmV4dCkgPT4ge1xuICAgICAgLy8gICAgIC8vIGNvbnNvbGUubG9nKCdzdGFydERhdGVDaGFuZ2UnLCBuZXh0KTtcbiAgICAgIC8vICAgICAvLyB0aGlzLnN0YXJ0RGF0ZSA9IG5leHQ7XG4gICAgICAvLyAgICAgLy8gdGhpcy5vbkNoYW5nZShuZXh0KTtcbiAgICAgIC8vICAgfSlcbiAgICAgIC8vICk7XG4gICAgICAvLyB0aGlzLmRhdGVDaGFuZ2VTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAvLyAgIHRoaXMuZW5kRGF0ZUNoYW5nZS5zdWJzY3JpYmUoKG5leHQpID0+IHtcbiAgICAgIC8vICAgICAvLyBjb25zb2xlLmxvZygnZW5kRGF0ZUNoYW5nZScsIG5leHQpO1xuICAgICAgLy8gICAgIC8vIHRoaXMuZW5kRGF0ZSA9IG5leHQ7XG4gICAgICAvLyAgICAgLy8gdGhpcy5vbkNoYW5nZShuZXh0KTtcbiAgICAgIC8vICAgfSlcbiAgICAgIC8vICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcpIG9uQmx1cigpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgcHVibGljIGlzTW9iaWxlID0gdHJ1ZTtcbiAgcHVibGljIGN1c3RvbVJhbmdlcyE6IFRDdXN0b21SYW5nZVtdO1xuICBwdWJsaWMgc2hvd1JhbmdlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZVZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMubG9jYWxlKCkgPz8gJ2RlZmF1bHQnO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5zdGFydERhdGUoKSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGVuZERhdGVWYWx1ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmxvY2FsZSgpID8/ICdkZWZhdWx0JztcbiAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKHRoaXMuZW5kRGF0ZSgpKTtcbiAgfSk7XG5cbiAgcHVibGljIGdldCBzdGFydERhdGVQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlcigpO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBsYWNlaG9sZGVyKSA/IHBsYWNlaG9sZGVyWzBdIDogcGxhY2Vob2xkZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVuZERhdGVQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlcigpO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBsYWNlaG9sZGVyKSA/IHBsYWNlaG9sZGVyWzFdIDogcGxhY2Vob2xkZXI7XG4gIH1cblxuICAvLyB0b2RvOiB2YWxpZGF0aW9uXG4gIC8vIHN0YXJ0RGF0ZUlucHV0ID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMuc3RhcnREYXRlVmFsdWUsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkIH0sIFtcbiAgLy8gICBWYWxpZGF0b3JzLnJlcXVpcmVkXG4gIC8vICAgLy8gVmFsaWRhdG9ycy5taW5MZW5ndGgoOCksXG4gIC8vICAgLy8gVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTApLFxuICAvLyAgIC8vIGludmFsaWREYXRlU3RyaW5nVmFsaWRhdG9yKHRoaXMubG9jYWxlKVxuICAvLyBdKTtcbiAgLy8gZW5kRGF0ZUlucHV0ID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMuZW5kRGF0ZVZhbHVlLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCBbXG4gIC8vICAgVmFsaWRhdG9ycy5yZXF1aXJlZFxuICAvLyAgIC8vIFZhbGlkYXRvcnMubWluTGVuZ3RoKDgpLFxuICAvLyAgIC8vIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwKSxcbiAgLy8gICAvLyBpbnZhbGlkRGF0ZVN0cmluZ1ZhbGlkYXRvcih0aGlzLmxvY2FsZSlcbiAgLy8gXSk7XG4gIHJlYWRvbmx5IGRhdGVSYW5nZUdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGFydERhdGVJbnB1dDogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCgpIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgZW5kRGF0ZUlucHV0OiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkKCkgfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICB9KTtcblxuICByZWFkb25seSBpbnB1dFN0YXJ0SG92ZXJWYWx1ZSA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGlucHV0RW5kSG92ZXJWYWx1ZSA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBkYXRlUGlja2VyQ2xhc3NlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2RhdGUtcGlja2VyJzogdHJ1ZSxcbiAgICAgIFtgZGF0ZS1waWNrZXItJHt0aGlzLnNpemUoKX1gXTogdGhpcy5zaXplKCksXG4gICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCgpLFxuICAgICAgJ2lzLXZhbGlkJzogdGhpcy52YWxpZCgpID09PSB0cnVlLFxuICAgICAgJ2lzLWludmFsaWQnOiB0aGlzLnZhbGlkKCkgPT09IGZhbHNlXG4gICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbiAgfVxuXG4gIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBmb3JtYXQgPSB0aGlzLmZvcm1hdCgpO1xuICAgIGNvbnN0IGlucHV0RGF0ZUZvcm1hdCA9IHRoaXMuaW5wdXREYXRlRm9ybWF0KCk7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5sb2NhbGUoKTtcblxuICAgIHJldHVybiAhZGF0ZSB8fCAhaXNWYWxpZERhdGUoZGF0ZSlcbiAgICAgID8gJydcbiAgICAgIDogdHlwZW9mIGlucHV0RGF0ZUZvcm1hdCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGlucHV0RGF0ZUZvcm1hdChkYXRlKVxuICAgICAgICA6ICEhZm9ybWF0ICYmICEhbG9jYWxlICYmIGxvY2FsZSAhPT0gJ2RlZmF1bHQnXG4gICAgICAgICAgPyBmb3JtYXREYXRlKGRhdGUsIGZvcm1hdCwgbG9jYWxlKVxuICAgICAgICAgIDogdGhpcy50aW1lcGlja2VyXG4gICAgICAgICAgICA/IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlKVxuICAgICAgICAgICAgOiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhsb2NhbGUpO1xuICB9XG5cbiAgcmVhZG9ubHkgI2JyZWFrcG9pbnRzID0ge1xuICAgIE9uZUNhbGVuZGFyUmFuZ2VzOiAnKG1pbi13aWR0aDogNDgwcHgpJyxcbiAgICBUd29DYWxlbmRhcnM6ICcobWF4LXdpZHRoOiA2NTBweCknLFxuICAgIFR3b0NhbGVuZGFyc1JhbmdlczogJyhtYXgtd2lkdGg6IDgxMHB4KSdcbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCByYW5nZXMgPSB0aGlzLnJhbmdlcygpO1xuICAgIHRoaXMuY3VzdG9tUmFuZ2VzID0gcmFuZ2VzID8gT2JqZWN0LmVudHJpZXMocmFuZ2VzKSA6IFtdO1xuXG4gICAgY29uc3QgYnJlYWtwb2ludHMgPSB0aGlzLiNicmVha3BvaW50cztcblxuICAgIHRoaXMuI2JyZWFrcG9pbnRPYnNlcnZlclxuICAgICAgLm9ic2VydmUoW2JyZWFrcG9pbnRzLk9uZUNhbGVuZGFyUmFuZ2VzLCBicmVha3BvaW50cy5Ud29DYWxlbmRhcnMsIGJyZWFrcG9pbnRzLlR3b0NhbGVuZGFyc1Jhbmdlc10pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy4jZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5tYXRjaGVzKSB7XG4gICAgICAgICAgdGhpcy5pc01vYmlsZSA9XG4gICAgICAgICAgICAodGhpcy5jdXN0b21SYW5nZXM/Lmxlbmd0aCA+IDAgJiYgcmVzdWx0LmJyZWFrcG9pbnRzW2JyZWFrcG9pbnRzLlR3b0NhbGVuZGFyc1Jhbmdlc10pIHx8XG4gICAgICAgICAgICByZXN1bHQuYnJlYWtwb2ludHNbYnJlYWtwb2ludHMuVHdvQ2FsZW5kYXJzXTtcbiAgICAgICAgICBpZiAodGhpcy5jdXN0b21SYW5nZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1JhbmdlcyA9ICFyZXN1bHQuYnJlYWtwb2ludHNbYnJlYWtwb2ludHMuT25lQ2FsZW5kYXJSYW5nZXNdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLnN1YnNjcmliZURhdGVDaGFuZ2UoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaWJlRGF0ZUNoYW5nZShmYWxzZSk7XG4gIH1cblxuICBjb252ZXJ0VmFsdWVUb0RhdGUodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dFBhcnNlKHZhbHVlKSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9XG5cbiAgaW5wdXRQYXJzZShkYXRlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpbnB1dERhdGVQYXJzZSA9IHRoaXMuaW5wdXREYXRlUGFyc2UoKTtcblxuICAgIGlmICh0eXBlb2YgaW5wdXREYXRlUGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSBpbnB1dERhdGVQYXJzZShkYXRlKTtcbiAgICAgIGlmIChpc1ZhbGlkRGF0ZShwYXJzZWREYXRlKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VkRGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldExvY2FsRGF0ZUZyb21TdHJpbmcoZGF0ZSwgdGhpcy5sb2NhbGUoKSwgdGhpcy50aW1lcGlja2VyKTtcbiAgfVxuXG4gIGdldEN1c3RvbVJhbmdlS2V5KGN1c3RvbVJhbmdlOiBhbnkpIHtcbiAgICByZXR1cm4gY3VzdG9tUmFuZ2VbMF07XG4gIH1cblxuICBzZXRDdXN0b21SYW5nZShjdXN0b21SYW5nZTogYW55KSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRDdXN0b21SYW5nZUtleShjdXN0b21SYW5nZSk7XG4gICAgdGhpcy5oYW5kbGVTdGFydERhdGVDaGFuZ2UoY3VzdG9tUmFuZ2VbMV1bMF0pO1xuICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShjdXN0b21SYW5nZVsxXVsxXSk7XG4gIH1cblxuICBoYW5kbGVDYWxlbmRhckNlbGxIb3ZlcigkZXZlbnQ6IERhdGUgfCBudWxsKSB7XG4gICAgdGhpcy5jYWxlbmRhckNlbGxIb3Zlci5lbWl0KCRldmVudCk7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5zdGFydERhdGVFbGVtZW50UmVmKCksICRldmVudCk7XG4gICAgICB0aGlzLmlucHV0U3RhcnRIb3ZlclZhbHVlLnNldCgkZXZlbnQpO1xuICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZW5kRGF0ZUVsZW1lbnRSZWYoKSwgbnVsbCk7XG4gICAgICB0aGlzLmlucHV0RW5kSG92ZXJWYWx1ZS5zZXQobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmVuZERhdGVFbGVtZW50UmVmKCksICRldmVudCk7XG4gICAgICB0aGlzLmlucHV0RW5kSG92ZXJWYWx1ZS5zZXQoJGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDYWxlbmRhckRhdGVDaGFuZ2UoJGV2ZW50OiBEYXRlKSB7XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJEYXRlLmdldFRpbWUoKSAhPT0gJGV2ZW50LmdldFRpbWUoKSkge1xuICAgICAgdGhpcy5jYWxlbmRhckRhdGVDaGFuZ2UuZW1pdCgkZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVN0YXJ0RGF0ZUNoYW5nZShkYXRlOiBEYXRlIHwgbnVsbCkge1xuICAgIHRoaXMuc3RhcnREYXRlTW9kZWwuc2V0KGRhdGUgPz8gbnVsbCk7XG4gICAgdGhpcy5pbnB1dFN0YXJ0SG92ZXJWYWx1ZS5zZXQobnVsbCk7XG4gIH1cblxuICBoYW5kbGVFbmREYXRlQ2hhbmdlKGRhdGU6IERhdGUgfCBudWxsKSB7XG4gICAgaWYgKCF0aGlzLnJhbmdlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbmREYXRlTW9kZWwuc2V0KGRhdGUgPz8gbnVsbCk7XG4gICAgdGhpcy5pbnB1dEVuZEhvdmVyVmFsdWUuc2V0KG51bGwpO1xuICB9XG5cbiAgaGFuZGxlQ2xlYXIoJGV2ZW50PzogTW91c2VFdmVudCkge1xuICAgIHRoaXMuaGFuZGxlU3RhcnREYXRlQ2hhbmdlKG51bGwpO1xuICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShudWxsKTtcbiAgfVxuXG4gIGhhbmRsZVN0YXJ0RGF0ZUlucHV0Q2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9ICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmlucHV0UGFyc2UoaW5wdXRWYWx1ZSk7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICB0aGlzLmhhbmRsZVN0YXJ0RGF0ZUNoYW5nZShudWxsKTtcbiAgICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlICYmIGRhdGUuZ2V0VGltZSgpKSB7XG4gICAgICBjb25zdCBlbmREYXRlID0gdGhpcy5lbmREYXRlKCk7XG4gICAgICBpZiAoISh0aGlzLmZvcmJpZGRlbkRhdGUoZGF0ZSkgfHwgKGVuZERhdGUgJiYgZW5kRGF0ZSA8IGRhdGUpKSkge1xuICAgICAgICB0aGlzLmNhbGVuZGFyRGF0ZSA9IGRhdGU7XG4gICAgICAgIHRoaXMuaGFuZGxlU3RhcnREYXRlQ2hhbmdlKGRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmhhbmRsZVN0YXJ0RGF0ZUNoYW5nZSh0aGlzLnN0YXJ0RGF0ZSgpID8/IG51bGwpO1xuICB9XG5cbiAgaGFuZGxlRW5kRGF0ZUlucHV0Q2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9ICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmlucHV0UGFyc2UoaW5wdXRWYWx1ZSk7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICB0aGlzLmhhbmRsZUVuZERhdGVDaGFuZ2UobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiBkYXRlLmdldFRpbWUoKSkge1xuICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGUoKTtcbiAgICAgIGlmICghKHRoaXMuZm9yYmlkZGVuRGF0ZShkYXRlKSB8fCAoc3RhcnREYXRlICYmIHN0YXJ0RGF0ZSA+IGRhdGUpKSkge1xuICAgICAgICB0aGlzLmNhbGVuZGFyRGF0ZSA9IGRhdGU7XG4gICAgICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShkYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5oYW5kbGVFbmREYXRlQ2hhbmdlKHRoaXMuZW5kRGF0ZSgpID8/IG51bGwpO1xuICB9XG5cbiAgZm9yYmlkZGVuRGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgY29uc3QgZGF0ZUZpbHRlciA9IHRoaXMuZGF0ZUZpbHRlcigpO1xuICAgIHJldHVybiAoXG4gICAgICBpc0RhdGVEaXNhYmxlZChkYXRlLCB0aGlzLm1pbkRhdGUoKSwgdGhpcy5tYXhEYXRlKCksIHRoaXMuZGlzYWJsZWREYXRlcygpKSB8fFxuICAgICAgKGRhdGVGaWx0ZXIgPyAhZGF0ZUZpbHRlcihkYXRlKSA6IGZhbHNlKVxuICAgICk7XG4gIH1cblxuICBzZXRJbnB1dFZhbHVlID0gKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQsIGRhdGU6IERhdGUgfCBudWxsKSA9PiB7XG4gICAgaWYgKCFlbGVtZW50UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlKTtcbiAgICAvLyBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWVBc0RhdGUgPSBkYXRlO1xuICAgIHJldHVybjtcbiAgfTtcblxuICBvbkNoYW5nZTogYW55ID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAvKiBlbXB0eSAqL1xuICB9O1xuICBvblRvdWNoZWQ6IGFueSA9ICgpID0+IHtcbiAgICAvKiBlbXB0eSAqL1xuICB9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy4jZGlzYWJsZWQuc2V0KGlzRGlzYWJsZWQpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCEhdmFsdWUpIHtcbiAgICAgIHRoaXMuaGFuZGxlU3RhcnREYXRlQ2hhbmdlKHRoaXMucmFuZ2UoKSA/IHZhbHVlLnN0YXJ0RGF0ZSA6IHZhbHVlKTtcbiAgICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZSh0aGlzLnJhbmdlKCkgPyB2YWx1ZS5lbmREYXRlIDogbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlU3RhcnRUaW1lQ2hhbmdlKHRpbWU6IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnN0YXJ0RGF0ZU1vZGVsLnNldCh0aW1lID8/IHRoaXMuc3RhcnREYXRlKCkpO1xuICB9XG5cbiAgaGFuZGxlRW5kVGltZUNoYW5nZSh0aW1lOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF0aGlzLnJhbmdlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbmREYXRlTW9kZWwuc2V0KHRpbWUgPz8gdGhpcy5lbmREYXRlKCkpO1xuICB9XG59XG4iLCI8ZmllbGRzZXQgW2Zvcm1Hcm91cF09XCJkYXRlUmFuZ2VHcm91cFwiPlxuICA8Yy1kcm9wZG93biAjZHJvcGRvd249XCJjRHJvcGRvd25cIiBbKHZpc2libGUpXT1cInZpc2libGVcIiBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiIFtuZ0NsYXNzXT1cImRhdGVQaWNrZXJDbGFzc2VzXCJcbiAgICAgICAgICAgICAgW3BvcHBlck9wdGlvbnNdPVwicG9wcGVyanNPcHRpb25zKClcIiBjbGFzcz1cImRhdGUtcGlja2VyIHBpY2tlclwiPlxuICAgIDxkaXYgW2NhcmV0XT1cImZhbHNlXCJcbiAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpID8/IGRyb3Bkb3duLnZpc2libGVcIlxuICAgICAgICAgY0Ryb3Bkb3duVG9nZ2xlXG4gICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWlucHV0LWdyb3VwXCJcbiAgICA+XG4gICAgICA8aW5wdXQgI3N0YXJ0RGF0ZUVsZW1lbnRSZWZcbiAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVN0YXJ0RGF0ZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImRpc2FibGVkKCkgPyAtMSA6IDBcIlxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntob3ZlcjogISFpbnB1dFN0YXJ0SG92ZXJWYWx1ZSgpfVwiXG4gICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInN0YXJ0RGF0ZVBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICBbcmVhZG9ubHldPVwiaW5wdXRSZWFkT25seSgpID8/IG51bGxcIlxuICAgICAgICAgICAgIFt2YWxpZF09XCJyYW5nZSgpID8gdW5kZWZpbmVkIDogdmFsaWQoKVwiXG4gICAgICAgICAgICAgY0Zvcm1Db250cm9sXG4gICAgICAgICAgICAgY2xhc3M9XCJkYXRlLXBpY2tlci1pbnB1dFwiXG4gICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3RhcnREYXRlSW5wdXRcIlxuICAgICAgICAgICAgIHBhdHRlcm49XCJbMS05XSpcIlxuICAgICAgPlxuICAgICAgQGlmIChyYW5nZSgpICYmIHNlcGFyYXRvcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1zZXBhcmF0b3JcIj48L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAocmFuZ2UoKSkge1xuICAgICAgICA8aW5wdXQgI2VuZERhdGVFbGVtZW50UmVmXG4gICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUVuZERhdGVJbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImRpc2FibGVkKCkgPyAtMSA6IDBcIlxuICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie2hvdmVyOiAhIWlucHV0RW5kSG92ZXJWYWx1ZSgpfVwiXG4gICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZW5kRGF0ZVBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpbnB1dFJlYWRPbmx5KCkgPz8gbnVsbFwiXG4gICAgICAgICAgICAgICBbdmFsaWRdPVwidmFsaWQoKSA/PyB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgY0Zvcm1Db250cm9sXG4gICAgICAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWlucHV0XCJcbiAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImVuZERhdGVJbnB1dFwiXG4gICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzEtOV0qXCJcbiAgICAgICAgPlxuICAgICAgfVxuICAgICAgQGlmIChpbmRpY2F0b3IoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItaW5kaWNhdG9yXCI+PC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGNsZWFuZXIoKSAmJiBzdGFydERhdGVFbGVtZW50UmVmLnZhbHVlICYmICFkaXNhYmxlZCgpKSB7XG4gICAgICAgIDxkaXYgKGNsaWNrKT1cIiFkaXNhYmxlZCgpICYmIGhhbmRsZUNsZWFyKCRldmVudClcIiBjbGFzcz1cImRhdGUtcGlja2VyLWNsZWFuZXJcIiByb2xlPVwiYnV0dG9uXCI+PC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjRHJvcGRvd25NZW51IGNsYXNzPVwiZGF0ZS1waWNrZXItZHJvcGRvd24gcHktMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWJvZHlcIj5cbiAgICAgICAgQGlmICghc2hvd1Jhbmdlcykge1xuICAgICAgICAgIEBpZiAocmFuZ2VzKCkgJiYgY3VzdG9tUmFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1yYW5nZXNcIj5cbiAgICAgICAgICAgICAgQGZvciAoY3VzdG9tUmFuZ2Ugb2YgY3VzdG9tUmFuZ2VzOyB0cmFjayBjdXN0b21SYW5nZSkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInNldEN1c3RvbVJhbmdlKGN1c3RvbVJhbmdlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwicmFuZ2VzQnV0dG9uc0NvbG9yKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwicmFuZ2VzQnV0dG9uc1NpemUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFyaWFudF09XCJyYW5nZXNCdXR0b25zVmFyaWFudCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNCdXR0b24+XG4gICAgICAgICAgICAgICAgICB7eyBjdXN0b21SYW5nZSB8IGN1c3RvbVJhbmdlS2V5IH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8Yy1jYWxlbmRhclxuICAgICAgICAgIChjYWxlbmRhckNlbGxIb3Zlcik9XCJoYW5kbGVDYWxlbmRhckNlbGxIb3ZlcigkZXZlbnQpXCJcbiAgICAgICAgICAoY2FsZW5kYXJEYXRlQ2hhbmdlKT1cImhhbmRsZUNhbGVuZGFyRGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAoZW5kRGF0ZUNoYW5nZSk9XCJoYW5kbGVFbmREYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChzdGFydERhdGVDaGFuZ2UpPVwiaGFuZGxlU3RhcnREYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtjYWxlbmRhckRhdGVdPVwiY2FsZW5kYXJEYXRlXCJcbiAgICAgICAgICBbY2FsZW5kYXJzXT1cImlzTW9iaWxlID8gMSA6IGNhbGVuZGFycygpXCJcbiAgICAgICAgICBbZGF0ZUZpbHRlcl09XCJkYXRlRmlsdGVyKClcIlxuICAgICAgICAgIFtkYXlGb3JtYXRdPVwiZGF5Rm9ybWF0KClcIlxuICAgICAgICAgIFtkaXNhYmxlZERhdGVzXT1cImRpc2FibGVkRGF0ZXMoKVwiXG4gICAgICAgICAgW2VuZERhdGVdPVwiZW5kRGF0ZSgpXCJcbiAgICAgICAgICBbZmlyc3REYXlPZldlZWtdPVwiZmlyc3REYXlPZldlZWsoKVwiXG4gICAgICAgICAgW2xvY2FsZV09XCJsb2NhbGUoKVwiXG4gICAgICAgICAgW21heERhdGVdPVwibWF4RGF0ZSgpXCJcbiAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlKClcIlxuICAgICAgICAgIFtuYXZZZWFyRmlyc3RdPVwibmF2WWVhckZpcnN0KClcIlxuICAgICAgICAgIFtuYXZpZ2F0aW9uXT1cIm5hdmlnYXRpb24oKVwiXG4gICAgICAgICAgW3JhbmdlXT1cInJhbmdlKClcIlxuICAgICAgICAgIFtzZWxlY3RBZGphY2VudERheXNdPVwic2VsZWN0QWRqYWNlbnREYXlzKClcIlxuICAgICAgICAgIFtzZWxlY3Rpb25UeXBlXT1cInNlbGVjdGlvblR5cGUoKVwiXG4gICAgICAgICAgW3Nob3dBZGphY2VudERheXNdPVwic2hvd0FkamFjZW50RGF5cygpXCJcbiAgICAgICAgICBbc2hvd1dlZWtOdW1iZXJdPVwic2hvd1dlZWtOdW1iZXIoKVwiXG4gICAgICAgICAgW3N0YXJ0RGF0ZV09XCJzdGFydERhdGUoKVwiXG4gICAgICAgICAgW3dlZWtOdW1iZXJzTGFiZWxdPVwid2Vla051bWJlcnNMYWJlbCgpXCJcbiAgICAgICAgICBbd2Vla2RheUZvcm1hdF09XCJ3ZWVrZGF5Rm9ybWF0KClcIlxuICAgICAgICAgIGNsYXNzPVwiZGF0ZS1waWNrZXItY2FsZW5kYXJzXCJcbiAgICAgICAgLz5cbiAgICAgICAgQGlmIChmYWxzZSAmJiB0aW1lcGlja2VyKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLXRpbWVwaWNrZXJzXCI+XG4gICAgICAgICAgICA8IS0tIHRvZG8tLT5cbiAgICAgICAgICAgIDxjLXRpbWUtcGlja2VyXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWxlY3RcIlxuICAgICAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZSgpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGFydERhdGUoKVwiXG4gICAgICAgICAgICAgIFt0aW1lXT1cInN0YXJ0RGF0ZSgpID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICh0aW1lQ2hhbmdlKT1cImhhbmRsZVN0YXJ0VGltZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICBAaWYgKHJhbmdlKCkpIHtcbiAgICAgICAgICAgICAgPGMtdGltZS1waWNrZXJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwic2VsZWN0XCJcbiAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZSgpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVuZERhdGUoKVwiXG4gICAgICAgICAgICAgICAgW3RpbWVdPVwiZW5kRGF0ZSgpID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgKHRpbWVDaGFuZ2UpPVwiaGFuZGxlRW5kVGltZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICBAbGV0IGZvb3RlciA9IHRlbXBsYXRlcygpPy5bJ2RhdGVQaWNrZXJGb290ZXInXTtcbiAgICAgIEBpZiAoZm9vdGVyKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1mb290ZXJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9vdGVyOyBjb250ZXh0OiB7JGltcGxpY2l0OiBkcm9wZG93bn1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGVudCAvPlxuICA8L2MtZHJvcGRvd24+XG48L2ZpZWxkc2V0PlxuIl19
|