@energycap/components 0.42.0 → 0.42.1
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/components.module.mjs +10 -5
- package/esm2022/lib/controls/calendar/calendar-item.component.mjs +46 -14
- package/esm2022/lib/controls/calendar/calendar.component.mjs +169 -121
- package/esm2022/lib/controls/calendar/calendar.types.mjs +2 -4
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.mjs +57 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.mjs +62 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.mjs +100 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.mjs +101 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.mjs +76 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.mjs +79 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs +210 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs +81 -0
- package/esm2022/lib/controls/date-input/date-input.component.mjs +322 -113
- package/esm2022/lib/controls/date-input/date-input.types.mjs +44 -0
- package/esm2022/lib/controls/file-upload/file-upload.component.mjs +1 -1
- package/esm2022/lib/controls/form-control/form-control.component.mjs +6 -12
- package/esm2022/lib/core/date-time-helper.mjs +10 -2
- package/esm2022/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.mjs +100 -0
- package/esm2022/public-api.mjs +63 -61
- package/fesm2022/energycap-components.mjs +1666 -507
- package/fesm2022/energycap-components.mjs.map +1 -1
- package/lib/components.module.d.ts +9 -8
- package/lib/controls/calendar/calendar-item.component.d.ts +11 -6
- package/lib/controls/calendar/calendar.component.d.ts +21 -23
- package/lib/controls/calendar/calendar.types.d.ts +11 -7
- package/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.d.ts +42 -0
- package/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.d.ts +18 -0
- package/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.d.ts +18 -0
- package/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.d.ts +20 -0
- package/lib/controls/date-input/date-input.component.d.ts +63 -28
- package/lib/controls/date-input/date-input.types.d.ts +62 -0
- package/lib/controls/form-control/form-control.component.d.ts +4 -6
- package/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.d.ts +23 -0
- package/package.json +1 -1
- package/public-api.d.ts +62 -60
- package/src/assets/locales/en_US.json +9 -1
package/esm2022/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
import moment from "moment";
|
2
|
+
import { DateInput } from "../date-input.types";
|
3
|
+
import { DateInputSelectionStrategyBase } from "./date-input-selection-strategy-base";
|
4
|
+
/**
|
5
|
+
* Selection strategy for the 'range' selection mode.
|
6
|
+
*/
|
7
|
+
export class RangeSelectionStrategy extends DateInputSelectionStrategyBase {
|
8
|
+
constructor() {
|
9
|
+
super(...arguments);
|
10
|
+
this.selectionViewMode = 'day';
|
11
|
+
this.validViewModes = ['day', 'month', 'year'];
|
12
|
+
this.showSecondaryTextbox = true;
|
13
|
+
this.showSecondaryCalendar = true;
|
14
|
+
}
|
15
|
+
formatSelection(selection) {
|
16
|
+
if (!selection) {
|
17
|
+
return { textbox: null, textbox2: null };
|
18
|
+
}
|
19
|
+
// We use the 'll' moment medium format here to make sure the formatted date is formatted according to the user's locale
|
20
|
+
if (DateInput.isSelectionSingleDate(selection)) {
|
21
|
+
return { textbox: moment(selection).format('ll'), textbox2: null };
|
22
|
+
}
|
23
|
+
else {
|
24
|
+
const start = selection.start ? moment(selection.start).format('ll') : null;
|
25
|
+
const end = selection.end ? moment(selection.end).format('ll') : null;
|
26
|
+
return { textbox: start, textbox2: end };
|
27
|
+
}
|
28
|
+
}
|
29
|
+
parseTextboxValues(value, parseFormats, opts) {
|
30
|
+
let start = this.parseString(value.textbox, parseFormats, opts);
|
31
|
+
let end = this.parseString(value.textbox2, parseFormats, opts);
|
32
|
+
// If the start date is after the end date, we need to clear out the invalid date. This is different from the last 7/28 days strategies
|
33
|
+
// because we don't have a fixed range to automatically adjust the dates to. If the user is changing the begin date or end date and ends
|
34
|
+
// up crossing the other date, we should clear out the date that's not being changed so that the user can enter a valid range using the
|
35
|
+
// begin/end date they just entered.
|
36
|
+
if (start && end && moment(start).isAfter(end)) {
|
37
|
+
if (opts?.parseFromEnd) {
|
38
|
+
start = null;
|
39
|
+
}
|
40
|
+
else {
|
41
|
+
end = null;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
if (!start && !end) {
|
45
|
+
return null;
|
46
|
+
}
|
47
|
+
else {
|
48
|
+
return { start, end };
|
49
|
+
}
|
50
|
+
}
|
51
|
+
getSelectionFromDate(date, existingSelection) {
|
52
|
+
if (DateInput.isSelectionRange(existingSelection)) {
|
53
|
+
const { start, end } = existingSelection;
|
54
|
+
if (start && !end) {
|
55
|
+
// If the selected date is before the existing start date, set it as the new start date and use the existing start date as the end date
|
56
|
+
return moment(date).isBefore(start) ? { start: date, end: start } : { start, end: date };
|
57
|
+
}
|
58
|
+
if (end && !start) {
|
59
|
+
// If the selected date is after the existing end date, set it as the new end date and use the existing end date as the start date
|
60
|
+
return moment(date).isBefore(end) ? { start: date, end } : { start: end, end: date };
|
61
|
+
}
|
62
|
+
}
|
63
|
+
else if (DateInput.isSelectionSingleDate(existingSelection)) {
|
64
|
+
// If the selected date is before the existing date, set it as the new start date and use the existing date as the end date
|
65
|
+
return moment(date).isBefore(existingSelection) ? { start: date, end: existingSelection } : { start: existingSelection, end: date };
|
66
|
+
}
|
67
|
+
// If no selection exists or we already have a complete selection, start a new one with the selected date as the start date.
|
68
|
+
return { start: date, end: null };
|
69
|
+
}
|
70
|
+
getNewSelectionFromExisting(previousSelection) {
|
71
|
+
if (DateInput.isSelectionRange(previousSelection)) {
|
72
|
+
// If we have a range, just return it as is. We don't have a fixed range to adjust the dates to.
|
73
|
+
// Even if it's incomplete, the user will still be able to select the remaining date.
|
74
|
+
return previousSelection;
|
75
|
+
}
|
76
|
+
else if (DateInput.isSelectionSingleDate(previousSelection)) {
|
77
|
+
// If we have a single date selection, use it as the start date for the new one.
|
78
|
+
return { start: previousSelection, end: null };
|
79
|
+
}
|
80
|
+
return null;
|
81
|
+
}
|
82
|
+
getSelectionForQuickSelectDate(date, existingSelection) {
|
83
|
+
// If we have a valid range, we'll shift the range to the date provided, using it as the end date
|
84
|
+
// The new selection will have the same length as the previous.
|
85
|
+
if (DateInput.isSelectionRange(existingSelection) && existingSelection.start && existingSelection.end) {
|
86
|
+
const length = moment(existingSelection.end).diff(existingSelection.start, 'days');
|
87
|
+
return {
|
88
|
+
start: moment(date).subtract(length, 'days').toDate(),
|
89
|
+
end: date
|
90
|
+
};
|
91
|
+
}
|
92
|
+
// If we only have a single date, we'll use the date provided as the end date.
|
93
|
+
// The user will be able to select the start date.
|
94
|
+
return { start: null, end: date };
|
95
|
+
}
|
96
|
+
getNextSelection(selection) {
|
97
|
+
// We can only determine the next selection if we have a valid range
|
98
|
+
if (DateInput.isSelectionRange(selection) && selection.start && selection.end) {
|
99
|
+
// Shift the range forward by the number of days between the start and end dates
|
100
|
+
const length = moment(selection.end).diff(selection.start, 'days');
|
101
|
+
return {
|
102
|
+
start: moment(selection.end).add(1, 'days').toDate(),
|
103
|
+
end: moment(selection.end).add(1 + length, 'days').toDate()
|
104
|
+
};
|
105
|
+
}
|
106
|
+
// This shouldn't happen since the next stepper is disabled if the selection only has one date.
|
107
|
+
// If it does, just return the selection as-is.
|
108
|
+
return selection;
|
109
|
+
}
|
110
|
+
getPreviousSelection(selection) {
|
111
|
+
// We can only determine the previous selection if we have a valid range
|
112
|
+
if (DateInput.isSelectionRange(selection) && selection.start && selection.end) {
|
113
|
+
// Shift the range back by the number of days between the start and end dates
|
114
|
+
const length = moment(selection.end).diff(selection.start, 'days');
|
115
|
+
return {
|
116
|
+
start: moment(selection.start).subtract(1 + length, 'days').toDate(),
|
117
|
+
end: moment(selection.start).subtract(1, 'days').toDate()
|
118
|
+
};
|
119
|
+
}
|
120
|
+
// This shouldn't happen since the previous stepper is disabled if the selection only has one date.
|
121
|
+
// If it does, just return the selection as-is.
|
122
|
+
return selection;
|
123
|
+
}
|
124
|
+
getPrimaryCalendarView(selection, minDate, maxDate, currentView) {
|
125
|
+
let viewDate;
|
126
|
+
if (DateInput.isSelectionRange(selection)) {
|
127
|
+
let start = selection.start ? moment(selection.start) : null;
|
128
|
+
let end = selection.end ? moment(selection.end) : null;
|
129
|
+
// Since we're in range mode, the primary calendar is mostly concerned with the start date
|
130
|
+
if (start) {
|
131
|
+
// If we have a start date in the selection and it's before the min date, shift the view to the min date.
|
132
|
+
if (start.isBefore(minDate, 'month')) {
|
133
|
+
viewDate = minDate;
|
134
|
+
// If the start is after the max date, shift the view to the max date.
|
135
|
+
}
|
136
|
+
else if (start.isSameOrAfter(maxDate, 'month')) {
|
137
|
+
// the secondary calendar will show the max date month.
|
138
|
+
// The primary calendar will show the month before the max date.
|
139
|
+
viewDate = moment(maxDate).subtract(1, 'month').toDate();
|
140
|
+
}
|
141
|
+
else {
|
142
|
+
viewDate = start.toDate();
|
143
|
+
}
|
144
|
+
}
|
145
|
+
else if (end && end.isSameOrBefore(minDate, 'month')) {
|
146
|
+
// If we don't have a start date, and the end date is the same month or before the min date, shift the view to the min date.
|
147
|
+
viewDate = minDate;
|
148
|
+
}
|
149
|
+
else if (end && end.isSameOrBefore(new Date(), 'month')) {
|
150
|
+
// If we don't have a start date, and the end date is the same month or before the current month, shift the view to the month before the end
|
151
|
+
viewDate = moment(end).subtract(1, 'month').toDate();
|
152
|
+
}
|
153
|
+
else {
|
154
|
+
// Otherwise, show the current month.
|
155
|
+
viewDate = new Date();
|
156
|
+
}
|
157
|
+
}
|
158
|
+
else {
|
159
|
+
viewDate = selection || new Date();
|
160
|
+
}
|
161
|
+
// If the current calendar view mode is valid for the selection mode, use it, otherwise use the selection view mode
|
162
|
+
// This prevents the calendar from changing view modes as the user types/blurs the textboxes as long as the view mode is valid
|
163
|
+
const viewMode = this.validViewModes.includes(currentView.mode) ? currentView.mode : this.selectionViewMode;
|
164
|
+
return { mode: viewMode, date: viewDate };
|
165
|
+
}
|
166
|
+
getSecondaryCalendarView(selection, minDate, maxDate, currentView) {
|
167
|
+
let viewDate;
|
168
|
+
if (DateInput.isSelectionRange(selection)) {
|
169
|
+
let start = selection.start ? moment(selection.start) : null;
|
170
|
+
let end = selection.end ? moment(selection.end) : null;
|
171
|
+
// The secondary calendar is primarily concerned with the end date in the selection.
|
172
|
+
if (end) {
|
173
|
+
if (end.isAfter(maxDate, 'month')) {
|
174
|
+
// If the end date is after the max date, shift the view to the max date.
|
175
|
+
viewDate = maxDate;
|
176
|
+
}
|
177
|
+
else if (end.isSameOrBefore(minDate, 'month')) {
|
178
|
+
// If the end date is the same month or before the min date, shift the view to show
|
179
|
+
// the month after the min date. The primary calendar will show the min date month.
|
180
|
+
viewDate = moment(minDate).add(1, 'month').toDate();
|
181
|
+
}
|
182
|
+
else {
|
183
|
+
// Otherwise, show the end date month.
|
184
|
+
viewDate = end.toDate();
|
185
|
+
}
|
186
|
+
}
|
187
|
+
else if (start && start.isSameOrAfter(maxDate, 'month')) {
|
188
|
+
// If we don't have an end date, and the start date is after the max date, show the max date month
|
189
|
+
viewDate = maxDate;
|
190
|
+
}
|
191
|
+
else if (start && start.isSameOrAfter(new Date(), 'month')) {
|
192
|
+
// If we don't have an end date, and the start date is on or after the current month,
|
193
|
+
// show the month after the start date.
|
194
|
+
viewDate = moment(start).add(1, 'month').toDate();
|
195
|
+
}
|
196
|
+
else {
|
197
|
+
// Otherwise, show the current month.
|
198
|
+
viewDate = new Date();
|
199
|
+
}
|
200
|
+
}
|
201
|
+
else {
|
202
|
+
viewDate = selection || new Date();
|
203
|
+
}
|
204
|
+
// If the current calendar view mode is valid for the selection mode, use it, otherwise use the selection view mode
|
205
|
+
// This prevents the calendar from changing view modes as the user types/blurs the textboxes as long as the view mode is valid
|
206
|
+
const viewMode = this.validViewModes.includes(currentView.mode) ? currentView.mode : this.selectionViewMode;
|
207
|
+
return { mode: viewMode, date: viewDate };
|
208
|
+
}
|
209
|
+
}
|
210
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2Utc2VsZWN0aW9uLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2RhdGUtaW5wdXQvZGF0ZS1pbnB1dC1zZWxlY3Rpb24tc3RyYXRlZ2llcy9yYW5nZS1zZWxlY3Rpb24tc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV0Rjs7R0FFRztBQUNILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSw4QkFBOEI7SUFBMUU7O1FBQ2tCLHNCQUFpQixHQUFzQixLQUFLLENBQUM7UUFDN0MsbUJBQWMsR0FBd0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELHlCQUFvQixHQUFHLElBQUksQ0FBQztRQUM1QiwwQkFBcUIsR0FBRyxJQUFJLENBQUM7SUEyTS9DLENBQUM7SUF6TUMsZUFBZSxDQUFDLFNBQXNDO1FBQ3BELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzQyxDQUFDO1FBRUQsd0hBQXdIO1FBQ3hILElBQUksU0FBUyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNyRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxL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LE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BELENBQUM7aUJBQU0sQ0FBQztnQkFDTixxQ0FBcUM7Z0JBQ3JDLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsR0FBRyxTQUFTLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBRUQsbUhBQW1IO1FBQ25ILDhIQUE4SDtRQUM5SCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUU1RyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDNUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCB7IENhbGVuZGFyIH0gZnJvbSBcIi4uLy4uL2NhbGVuZGFyL2NhbGVuZGFyLnR5cGVzXCI7XHJcbmltcG9ydCB7IERhdGVJbnB1dCB9IGZyb20gXCIuLi9kYXRlLWlucHV0LnR5cGVzXCI7XHJcbmltcG9ydCB7IERhdGVJbnB1dFNlbGVjdGlvblN0cmF0ZWd5QmFzZSB9IGZyb20gXCIuL2RhdGUtaW5wdXQtc2VsZWN0aW9uLXN0cmF0ZWd5LWJhc2VcIjtcclxuXHJcbi8qKlxyXG4gKiBTZWxlY3Rpb24gc3RyYXRlZ3kgZm9yIHRoZSAncmFuZ2UnIHNlbGVjdGlvbiBtb2RlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJhbmdlU2VsZWN0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBEYXRlSW5wdXRTZWxlY3Rpb25TdHJhdGVneUJhc2Uge1xyXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb25WaWV3TW9kZTogQ2FsZW5kYXIuVmlld01vZGUgPSAnZGF5JztcclxuICBwdWJsaWMgcmVhZG9ubHkgdmFsaWRWaWV3TW9kZXM6IENhbGVuZGFyLlZpZXdNb2RlW10gPSBbJ2RheScsICdtb250aCcsICd5ZWFyJ107XHJcbiAgcHVibGljIHJlYWRvbmx5IHNob3dTZWNvbmRhcnlUZXh0Ym94ID0gdHJ1ZTtcclxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1NlY29uZGFyeUNhbGVuZGFyID0gdHJ1ZTtcclxuXHJcbiAgZm9ybWF0U2VsZWN0aW9uKHNlbGVjdGlvbj86IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsKTogRGF0ZUlucHV0LlRleHRib3hHcm91cFsndmFsdWUnXSB7XHJcbiAgICBpZiAoIXNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm4geyB0ZXh0Ym94OiBudWxsLCB0ZXh0Ym94MjogbnVsbCB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdlIHVzZSB0aGUgJ2xsJyBtb21lbnQgbWVkaXVtIGZvcm1hdCBoZXJlIHRvIG1ha2Ugc3VyZSB0aGUgZm9ybWF0dGVkIGRhdGUgaXMgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgdXNlcidzIGxvY2FsZVxyXG4gICAgaWYgKERhdGVJbnB1dC5pc1NlbGVjdGlvblNpbmdsZURhdGUoc2VsZWN0aW9uKSkge1xyXG4gICAgICByZXR1cm4geyB0ZXh0Ym94OiBtb21lbnQoc2VsZWN0aW9uKS5mb3JtYXQoJ2xsJyksIHRleHRib3gyOiBudWxsIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzdGFydCA9IHNlbGVjdGlvbi5zdGFydCA/IG1vbWVudChzZWxlY3Rpb24uc3RhcnQpLmZvcm1hdCgnbGwnKSA6IG51bGw7XHJcbiAgICAgIGNvbnN0IGVuZCA9IHNlbGVjdGlvbi5lbmQgPyBtb21lbnQoc2VsZWN0aW9uLmVuZCkuZm9ybWF0KCdsbCcpIDogbnVsbDtcclxuXHJcbiAgICAgIHJldHVybiB7IHRleHRib3g6IHN0YXJ0LCB0ZXh0Ym94MjogZW5kIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwYXJzZVRleHRib3hWYWx1ZXModmFsdWU6IERhdGVJbnB1dC5UZXh0Ym94R3JvdXBbJ3ZhbHVlJ10sIHBhcnNlRm9ybWF0czogc3RyaW5nW10sIG9wdHM/OiBEYXRlSW5wdXQuUGFyc2luZ09wdGlvbnMpOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICBsZXQgc3RhcnQgPSB0aGlzLnBhcnNlU3RyaW5nKHZhbHVlLnRleHRib3gsIHBhcnNlRm9ybWF0cywgb3B0cyk7XHJcbiAgICBsZXQgZW5kID0gdGhpcy5wYXJzZVN0cmluZyh2YWx1ZS50ZXh0Ym94MiwgcGFyc2VGb3JtYXRzLCBvcHRzKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgZW5kIGRhdGUsIHdlIG5lZWQgdG8gY2xlYXIgb3V0IHRoZSBpbnZhbGlkIGRhdGUuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGxhc3QgNy8yOCBkYXlzIHN0cmF0ZWdpZXNcclxuICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIGZpeGVkIHJhbmdlIHRvIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBkYXRlcyB0by4gSWYgdGhlIHVzZXIgaXMgY2hhbmdpbmcgdGhlIGJlZ2luIGRhdGUgb3IgZW5kIGRhdGUgYW5kIGVuZHNcclxuICAgIC8vIHVwIGNyb3NzaW5nIHRoZSBvdGhlciBkYXRlLCB3ZSBzaG91bGQgY2xlYXIgb3V0IHRoZSBkYXRlIHRoYXQncyBub3QgYmVpbmcgY2hhbmdlZCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBlbnRlciBhIHZhbGlkIHJhbmdlIHVzaW5nIHRoZVxyXG4gICAgLy8gYmVnaW4vZW5kIGRhdGUgdGhleSBqdXN0IGVudGVyZWQuXHJcbiAgICBpZiAoc3RhcnQgJiYgZW5kICYmIG1vbWVudChzdGFydCkuaXNBZnRlcihlbmQpKSB7XHJcbiAgICAgIGlmIChvcHRzPy5wYXJzZUZyb21FbmQpIHtcclxuICAgICAgICBzdGFydCA9IG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZW5kID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghc3RhcnQgJiYgIWVuZCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGlvbkZyb21EYXRlKGRhdGU6IERhdGUsIGV4aXN0aW5nU2VsZWN0aW9uOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShleGlzdGluZ1NlbGVjdGlvbikpIHtcclxuICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBleGlzdGluZ1NlbGVjdGlvbjtcclxuICAgICAgaWYgKHN0YXJ0ICYmICFlbmQpIHtcclxuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgZGF0ZSBpcyBiZWZvcmUgdGhlIGV4aXN0aW5nIHN0YXJ0IGRhdGUsIHNldCBpdCBhcyB0aGUgbmV3IHN0YXJ0IGRhdGUgYW5kIHVzZSB0aGUgZXhpc3Rpbmcgc3RhcnQgZGF0ZSBhcyB0aGUgZW5kIGRhdGVcclxuICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmlzQmVmb3JlKHN0YXJ0KSA/IHsgc3RhcnQ6IGRhdGUsIGVuZDogc3RhcnQgfSA6IHsgc3RhcnQsIGVuZDogZGF0ZSB9O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChlbmQgJiYgIXN0YXJ0KSB7XHJcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIGRhdGUgaXMgYWZ0ZXIgdGhlIGV4aXN0aW5nIGVuZCBkYXRlLCBzZXQgaXQgYXMgdGhlIG5ldyBlbmQgZGF0ZSBhbmQgdXNlIHRoZSBleGlzdGluZyBlbmQgZGF0ZSBhcyB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkuaXNCZWZvcmUoZW5kKSA/IHsgc3RhcnQ6IGRhdGUsIGVuZCB9IDogeyBzdGFydDogZW5kLCBlbmQ6IGRhdGUgfTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25TaW5nbGVEYXRlKGV4aXN0aW5nU2VsZWN0aW9uKSkge1xyXG4gICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgZGF0ZSBpcyBiZWZvcmUgdGhlIGV4aXN0aW5nIGRhdGUsIHNldCBpdCBhcyB0aGUgbmV3IHN0YXJ0IGRhdGUgYW5kIHVzZSB0aGUgZXhpc3RpbmcgZGF0ZSBhcyB0aGUgZW5kIGRhdGVcclxuICAgICAgcmV0dXJuIG1vbWVudChkYXRlKS5pc0JlZm9yZShleGlzdGluZ1NlbGVjdGlvbikgPyB7IHN0YXJ0OiBkYXRlLCBlbmQ6IGV4aXN0aW5nU2VsZWN0aW9uIH0gOiB7IHN0YXJ0OiBleGlzdGluZ1NlbGVjdGlvbiwgZW5kOiBkYXRlIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgbm8gc2VsZWN0aW9uIGV4aXN0cyBvciB3ZSBhbHJlYWR5IGhhdmUgYSBjb21wbGV0ZSBzZWxlY3Rpb24sIHN0YXJ0IGEgbmV3IG9uZSB3aXRoIHRoZSBzZWxlY3RlZCBkYXRlIGFzIHRoZSBzdGFydCBkYXRlLlxyXG4gICAgcmV0dXJuIHsgc3RhcnQ6IGRhdGUsIGVuZDogbnVsbCB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV3U2VsZWN0aW9uRnJvbUV4aXN0aW5nKHByZXZpb3VzU2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbik6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShwcmV2aW91c1NlbGVjdGlvbikpIHtcclxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHJhbmdlLCBqdXN0IHJldHVybiBpdCBhcyBpcy4gV2UgZG9uJ3QgaGF2ZSBhIGZpeGVkIHJhbmdlIHRvIGFkanVzdCB0aGUgZGF0ZXMgdG8uXHJcbiAgICAgIC8vIEV2ZW4gaWYgaXQncyBpbmNvbXBsZXRlLCB0aGUgdXNlciB3aWxsIHN0aWxsIGJlIGFibGUgdG8gc2VsZWN0IHRoZSByZW1haW5pbmcgZGF0ZS5cclxuICAgICAgcmV0dXJuIHByZXZpb3VzU2VsZWN0aW9uO1xyXG4gICAgfSBlbHNlIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25TaW5nbGVEYXRlKHByZXZpb3VzU2VsZWN0aW9uKSkge1xyXG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgc2luZ2xlIGRhdGUgc2VsZWN0aW9uLCB1c2UgaXQgYXMgdGhlIHN0YXJ0IGRhdGUgZm9yIHRoZSBuZXcgb25lLlxyXG4gICAgICByZXR1cm4geyBzdGFydDogcHJldmlvdXNTZWxlY3Rpb24sIGVuZDogbnVsbCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0aW9uRm9yUXVpY2tTZWxlY3REYXRlKGRhdGU6IERhdGUsIGV4aXN0aW5nU2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwpOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsaWQgcmFuZ2UsIHdlJ2xsIHNoaWZ0IHRoZSByYW5nZSB0byB0aGUgZGF0ZSBwcm92aWRlZCwgdXNpbmcgaXQgYXMgdGhlIGVuZCBkYXRlXHJcbiAgICAvLyBUaGUgbmV3IHNlbGVjdGlvbiB3aWxsIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBwcmV2aW91cy5cclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShleGlzdGluZ1NlbGVjdGlvbikgJiYgZXhpc3RpbmdTZWxlY3Rpb24uc3RhcnQgJiYgZXhpc3RpbmdTZWxlY3Rpb24uZW5kKSB7XHJcbiAgICAgIGNvbnN0IGxlbmd0aCA9IG1vbWVudChleGlzdGluZ1NlbGVjdGlvbi5lbmQpLmRpZmYoZXhpc3RpbmdTZWxlY3Rpb24uc3RhcnQsICdkYXlzJyk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3RhcnQ6IG1vbWVudChkYXRlKS5zdWJ0cmFjdChsZW5ndGgsICdkYXlzJykudG9EYXRlKCksXHJcbiAgICAgICAgZW5kOiBkYXRlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGRhdGUsIHdlJ2xsIHVzZSB0aGUgZGF0ZSBwcm92aWRlZCBhcyB0aGUgZW5kIGRhdGUuXHJcbiAgICAvLyBUaGUgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VsZWN0IHRoZSBzdGFydCBkYXRlLlxyXG4gICAgcmV0dXJuIHsgc3RhcnQ6IG51bGwsIGVuZDogZGF0ZSB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV4dFNlbGVjdGlvbihzZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsKTogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwge1xyXG4gICAgLy8gV2UgY2FuIG9ubHkgZGV0ZXJtaW5lIHRoZSBuZXh0IHNlbGVjdGlvbiBpZiB3ZSBoYXZlIGEgdmFsaWQgcmFuZ2VcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24pICYmIHNlbGVjdGlvbi5zdGFydCAmJiBzZWxlY3Rpb24uZW5kKSB7XHJcbiAgICAgIC8vIFNoaWZ0IHRoZSByYW5nZSBmb3J3YXJkIGJ5IHRoZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIGRhdGVzXHJcbiAgICAgIGNvbnN0IGxlbmd0aCA9IG1vbWVudChzZWxlY3Rpb24uZW5kKS5kaWZmKHNlbGVjdGlvbi5zdGFydCwgJ2RheXMnKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzdGFydDogbW9tZW50KHNlbGVjdGlvbi5lbmQpLmFkZCgxLCAnZGF5cycpLnRvRGF0ZSgpLFxyXG4gICAgICAgIGVuZDogbW9tZW50KHNlbGVjdGlvbi5lbmQpLmFkZCgxICsgbGVuZ3RoLCAnZGF5cycpLnRvRGF0ZSgpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlIHRoZSBuZXh0IHN0ZXBwZXIgaXMgZGlzYWJsZWQgaWYgdGhlIHNlbGVjdGlvbiBvbmx5IGhhcyBvbmUgZGF0ZS5cclxuICAgIC8vIElmIGl0IGRvZXMsIGp1c3QgcmV0dXJuIHRoZSBzZWxlY3Rpb24gYXMtaXMuXHJcbiAgICByZXR1cm4gc2VsZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJldmlvdXNTZWxlY3Rpb24oc2VsZWN0aW9uOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIC8vIFdlIGNhbiBvbmx5IGRldGVybWluZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uIGlmIHdlIGhhdmUgYSB2YWxpZCByYW5nZVxyXG4gICAgaWYgKERhdGVJbnB1dC5pc1NlbGVjdGlvblJhbmdlKHNlbGVjdGlvbikgJiYgc2VsZWN0aW9uLnN0YXJ0ICYmIHNlbGVjdGlvbi5lbmQpIHtcclxuICAgICAgLy8gU2hpZnQgdGhlIHJhbmdlIGJhY2sgYnkgdGhlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZXNcclxuICAgICAgY29uc3QgbGVuZ3RoID0gbW9tZW50KHNlbGVjdGlvbi5lbmQpLmRpZmYoc2VsZWN0aW9uLnN0YXJ0LCAnZGF5cycpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHN0YXJ0OiBtb21lbnQoc2VsZWN0aW9uLnN0YXJ0KS5zdWJ0cmFjdCgxICsgbGVuZ3RoLCAnZGF5cycpLnRvRGF0ZSgpLFxyXG4gICAgICAgIGVuZDogbW9tZW50KHNlbGVjdGlvbi5zdGFydCkuc3VidHJhY3QoMSwgJ2RheXMnKS50b0RhdGUoKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBzaW5jZSB0aGUgcHJldmlvdXMgc3RlcHBlciBpcyBkaXNhYmxlZCBpZiB0aGUgc2VsZWN0aW9uIG9ubHkgaGFzIG9uZSBkYXRlLlxyXG4gICAgLy8gSWYgaXQgZG9lcywganVzdCByZXR1cm4gdGhlIHNlbGVjdGlvbiBhcy1pcy5cclxuICAgIHJldHVybiBzZWxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBnZXRQcmltYXJ5Q2FsZW5kYXJWaWV3KHNlbGVjdGlvbjogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwsIG1pbkRhdGU6IERhdGUsIG1heERhdGU6IERhdGUsIGN1cnJlbnRWaWV3OiBDYWxlbmRhci5WaWV3KTogQ2FsZW5kYXIuVmlldyB7XHJcbiAgICBsZXQgdmlld0RhdGU6IERhdGU7XHJcbiAgICBpZiAoRGF0ZUlucHV0LmlzU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uKSkge1xyXG4gICAgICBsZXQgc3RhcnQgPSBzZWxlY3Rpb24uc3RhcnQgPyBtb21lbnQoc2VsZWN0aW9uLnN0YXJ0KSA6IG51bGw7XHJcbiAgICAgIGxldCBlbmQgPSBzZWxlY3Rpb24uZW5kID8gbW9tZW50KHNlbGVjdGlvbi5lbmQpIDogbnVsbDtcclxuXHJcbiAgICAgIC8vIFNpbmNlIHdlJ3JlIGluIHJhbmdlIG1vZGUsIHRoZSBwcmltYXJ5IGNhbGVuZGFyIGlzIG1vc3RseSBjb25jZXJuZWQgd2l0aCB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICBpZiAoc3RhcnQpIHtcclxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgc3RhcnQgZGF0ZSBpbiB0aGUgc2VsZWN0aW9uIGFuZCBpdCdzIGJlZm9yZSB0aGUgbWluIGRhdGUsIHNoaWZ0IHRoZSB2aWV3IHRvIHRoZSBtaW4gZGF0ZS5cclxuICAgICAgICBpZiAoc3RhcnQuaXNCZWZvcmUobWluRGF0ZSwgJ21vbnRoJykpIHtcclxuICAgICAgICAgIHZpZXdEYXRlID0gbWluRGF0ZTtcclxuICAgICAgICAgIC8vIElmIHRoZSBzdGFydCBpcyBhZnRlciB0aGUgbWF4IGRhdGUsIHNoaWZ0IHRoZSB2aWV3IHRvIHRoZSBtYXggZGF0ZS5cclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0LmlzU2FtZU9yQWZ0ZXIobWF4RGF0ZSwgJ21vbnRoJykpIHtcclxuICAgICAgICAgIC8vIHRoZSBzZWNvbmRhcnkgY2FsZW5kYXIgd2lsbCBzaG93IHRoZSBtYXggZGF0ZSBtb250aC5cclxuICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNhbGVuZGFyIHdpbGwgc2hvdyB0aGUgbW9udGggYmVmb3JlIHRoZSBtYXggZGF0ZS5cclxuICAgICAgICAgIHZpZXdEYXRlID0gbW9tZW50KG1heERhdGUpLnN1YnRyYWN0KDEsICdtb250aCcpLnRvRGF0ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2aWV3RGF0ZSA9IHN0YXJ0LnRvRGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChlbmQgJiYgZW5kLmlzU2FtZU9yQmVmb3JlKG1pbkRhdGUsICdtb250aCcpKSB7XHJcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHN0YXJ0IGRhdGUsIGFuZCB0aGUgZW5kIGRhdGUgaXMgdGhlIHNhbWUgbW9udGggb3IgYmVmb3JlIHRoZSBtaW4gZGF0ZSwgc2hpZnQgdGhlIHZpZXcgdG8gdGhlIG1pbiBkYXRlLlxyXG4gICAgICAgIHZpZXdEYXRlID0gbWluRGF0ZTtcclxuICAgICAgfSBlbHNlIGlmIChlbmQgJiYgZW5kLmlzU2FtZU9yQmVmb3JlKG5ldyBEYXRlKCksICdtb250aCcpKSB7XHJcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHN0YXJ0IGRhdGUsIGFuZCB0aGUgZW5kIGRhdGUgaXMgdGhlIHNhbWUgbW9udGggb3IgYmVmb3JlIHRoZSBjdXJyZW50IG1vbnRoLCBzaGlmdCB0aGUgdmlldyB0byB0aGUgbW9udGggYmVmb3JlIHRoZSBlbmRcclxuICAgICAgICB2aWV3RGF0ZSA9IG1vbWVudChlbmQpLnN1YnRyYWN0KDEsICdtb250aCcpLnRvRGF0ZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2hvdyB0aGUgY3VycmVudCBtb250aC5cclxuICAgICAgICB2aWV3RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZpZXdEYXRlID0gc2VsZWN0aW9uIHx8IG5ldyBEYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY2FsZW5kYXIgdmlldyBtb2RlIGlzIHZhbGlkIGZvciB0aGUgc2VsZWN0aW9uIG1vZGUsIHVzZSBpdCwgb3RoZXJ3aXNlIHVzZSB0aGUgc2VsZWN0aW9uIHZpZXcgbW9kZVxyXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgY2FsZW5kYXIgZnJvbSBjaGFuZ2luZyB2aWV3IG1vZGVzIGFzIHRoZSB1c2VyIHR5cGVzL2JsdXJzIHRoZSB0ZXh0Ym94ZXMgYXMgbG9uZyBhcyB0aGUgdmlldyBtb2RlIGlzIHZhbGlkXHJcbiAgICBjb25zdCB2aWV3TW9kZSA9IHRoaXMudmFsaWRWaWV3TW9kZXMuaW5jbHVkZXMoY3VycmVudFZpZXcubW9kZSkgPyBjdXJyZW50Vmlldy5tb2RlIDogdGhpcy5zZWxlY3Rpb25WaWV3TW9kZTtcclxuXHJcbiAgICByZXR1cm4geyBtb2RlOiB2aWV3TW9kZSwgZGF0ZTogdmlld0RhdGUgfTtcclxuICB9XHJcblxyXG4gIGdldFNlY29uZGFyeUNhbGVuZGFyVmlldyhzZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsLCBtaW5EYXRlOiBEYXRlLCBtYXhEYXRlOiBEYXRlLCBjdXJyZW50VmlldzogQ2FsZW5kYXIuVmlldyk6IENhbGVuZGFyLlZpZXcge1xyXG4gICAgbGV0IHZpZXdEYXRlOiBEYXRlO1xyXG5cclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24pKSB7XHJcbiAgICAgIGxldCBzdGFydCA9IHNlbGVjdGlvbi5zdGFydCA/IG1vbWVudChzZWxlY3Rpb24uc3RhcnQpIDogbnVsbDtcclxuICAgICAgbGV0IGVuZCA9IHNlbGVjdGlvbi5lbmQgPyBtb21lbnQoc2VsZWN0aW9uLmVuZCkgOiBudWxsO1xyXG5cclxuICAgICAgLy8gVGhlIHNlY29uZGFyeSBjYWxlbmRhciBpcyBwcmltYXJpbHkgY29uY2VybmVkIHdpdGggdGhlIGVuZCBkYXRlIGluIHRoZSBzZWxlY3Rpb24uXHJcbiAgICAgIGlmIChlbmQpIHtcclxuICAgICAgICBpZiAoZW5kLmlzQWZ0ZXIobWF4RGF0ZSwgJ21vbnRoJykpIHtcclxuICAgICAgICAgIC8vIElmIHRoZSBlbmQgZGF0ZSBpcyBhZnRlciB0aGUgbWF4IGRhdGUsIHNoaWZ0IHRoZSB2aWV3IHRvIHRoZSBtYXggZGF0ZS5cclxuICAgICAgICAgIHZpZXdEYXRlID0gbWF4RGF0ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGVuZC5pc1NhbWVPckJlZm9yZShtaW5EYXRlLCAnbW9udGgnKSkge1xyXG4gICAgICAgICAgLy8gSWYgdGhlIGVuZCBkYXRlIGlzIHRoZSBzYW1lIG1vbnRoIG9yIGJlZm9yZSB0aGUgbWluIGRhdGUsIHNoaWZ0IHRoZSB2aWV3IHRvIHNob3dcclxuICAgICAgICAgIC8vIHRoZSBtb250aCBhZnRlciB0aGUgbWluIGRhdGUuIFRoZSBwcmltYXJ5IGNhbGVuZGFyIHdpbGwgc2hvdyB0aGUgbWluIGRhdGUgbW9udGguXHJcbiAgICAgICAgICB2aWV3RGF0ZSA9IG1vbWVudChtaW5EYXRlKS5hZGQoMSwgJ21vbnRoJykudG9EYXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2hvdyB0aGUgZW5kIGRhdGUgbW9udGguXHJcbiAgICAgICAgICB2aWV3RGF0ZSA9IGVuZC50b0RhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnQgJiYgc3RhcnQuaXNTYW1lT3JBZnRlcihtYXhEYXRlLCAnbW9udGgnKSkge1xyXG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gZW5kIGRhdGUsIGFuZCB0aGUgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgbWF4IGRhdGUsIHNob3cgdGhlIG1heCBkYXRlIG1vbnRoXHJcbiAgICAgICAgdmlld0RhdGUgPSBtYXhEYXRlO1xyXG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0ICYmIHN0YXJ0LmlzU2FtZU9yQWZ0ZXIobmV3IERhdGUoKSwgJ21vbnRoJykpIHtcclxuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIGVuZCBkYXRlLCBhbmQgdGhlIHN0YXJ0IGRhdGUgaXMgb24gb3IgYWZ0ZXIgdGhlIGN1cnJlbnQgbW9udGgsXHJcbiAgICAgICAgLy8gc2hvdyB0aGUgbW9udGggYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUuXHJcbiAgICAgICAgdmlld0RhdGUgPSBtb21lbnQoc3RhcnQpLmFkZCgxLCAnbW9udGgnKS50b0RhdGUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBPdGhlcndpc2UsIHNob3cgdGhlIGN1cnJlbnQgbW9udGguXHJcbiAgICAgICAgdmlld0RhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2aWV3RGF0ZSA9IHNlbGVjdGlvbiB8fCBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGNhbGVuZGFyIHZpZXcgbW9kZSBpcyB2YWxpZCBmb3IgdGhlIHNlbGVjdGlvbiBtb2RlLCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIHNlbGVjdGlvbiB2aWV3IG1vZGVcclxuICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIGNhbGVuZGFyIGZyb20gY2hhbmdpbmcgdmlldyBtb2RlcyBhcyB0aGUgdXNlciB0eXBlcy9ibHVycyB0aGUgdGV4dGJveGVzIGFzIGxvbmcgYXMgdGhlIHZpZXcgbW9kZSBpcyB2YWxpZFxyXG4gICAgY29uc3Qgdmlld01vZGUgPSB0aGlzLnZhbGlkVmlld01vZGVzLmluY2x1ZGVzKGN1cnJlbnRWaWV3Lm1vZGUpID8gY3VycmVudFZpZXcubW9kZSA6IHRoaXMuc2VsZWN0aW9uVmlld01vZGU7XHJcblxyXG4gICAgcmV0dXJuIHsgbW9kZTogdmlld01vZGUsIGRhdGU6IHZpZXdEYXRlIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
package/esm2022/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
import moment from "moment";
|
2
|
+
import { DateInput } from "../date-input.types";
|
3
|
+
import { DateInputSelectionStrategyBase } from "./date-input-selection-strategy-base";
|
4
|
+
/**
|
5
|
+
* Selection strategy for the 'year' selection mode.
|
6
|
+
*/
|
7
|
+
export class YearSelectionStrategy extends DateInputSelectionStrategyBase {
|
8
|
+
constructor() {
|
9
|
+
super(...arguments);
|
10
|
+
this.selectionViewMode = 'year';
|
11
|
+
this.validViewModes = ['year'];
|
12
|
+
this.showSecondaryTextbox = false;
|
13
|
+
this.showSecondaryCalendar = false;
|
14
|
+
}
|
15
|
+
formatSelection(selection) {
|
16
|
+
if (!selection) {
|
17
|
+
return { textbox: null, textbox2: null };
|
18
|
+
}
|
19
|
+
// Only one date is needed for formatting since the ranges span a single year.
|
20
|
+
// There shouldn't be any case where there's only a single date but it's covered anyway.
|
21
|
+
const date = DateInput.isSelectionRange(selection) ? selection.start : selection;
|
22
|
+
return { textbox: moment(date).format('YYYY'), textbox2: null };
|
23
|
+
}
|
24
|
+
parseString(value, parseFormats, opts) {
|
25
|
+
// Including 'YY' and 'YYYY' as valid formats for year input. These aren't included in the default parse
|
26
|
+
// formats because they cause issues with the default date parsing.
|
27
|
+
return super.parseString(value, ['YY', 'YYYY', ...parseFormats], opts);
|
28
|
+
}
|
29
|
+
parseTextboxValues(value, parseFormats, opts) {
|
30
|
+
// Only a single textbox is used in year mode
|
31
|
+
const date = this.parseString(value.textbox, parseFormats, opts);
|
32
|
+
if (!date) {
|
33
|
+
return null;
|
34
|
+
}
|
35
|
+
return this.getSelectionFromDate(date);
|
36
|
+
}
|
37
|
+
getSelectionFromDate(date) {
|
38
|
+
return {
|
39
|
+
start: moment(date).startOf('year').toDate(),
|
40
|
+
end: moment(date).endOf('year').toDate()
|
41
|
+
};
|
42
|
+
}
|
43
|
+
getNewSelectionFromExisting(previousSelection) {
|
44
|
+
if (DateInput.isSelectionRange(previousSelection)) {
|
45
|
+
// Base the year range off of the existing selection's end date, falling back to the start date
|
46
|
+
const date = previousSelection.end || previousSelection.start;
|
47
|
+
if (date) {
|
48
|
+
return this.getSelectionFromDate(date);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
else if (DateInput.isSelectionSingleDate(previousSelection)) {
|
52
|
+
// If the previous selection was a single date, make the range that year
|
53
|
+
return this.getSelectionFromDate(previousSelection);
|
54
|
+
}
|
55
|
+
return null;
|
56
|
+
}
|
57
|
+
getSelectionForQuickSelectDate(date) {
|
58
|
+
return this.getSelectionFromDate(date);
|
59
|
+
}
|
60
|
+
getNextSelection(selection) {
|
61
|
+
// Move the selection to the next year
|
62
|
+
if (DateInput.isSelectionRange(selection) && selection.start) {
|
63
|
+
const date = moment(selection.start).add(1, 'year');
|
64
|
+
return this.getSelectionFromDate(date.toDate());
|
65
|
+
}
|
66
|
+
// This shouldn't happen since the next stepper is disabled if the selection only has one date.
|
67
|
+
// If it does, just return the selection as-is.
|
68
|
+
return selection;
|
69
|
+
}
|
70
|
+
getPreviousSelection(selection) {
|
71
|
+
// Move the selection to the previous year
|
72
|
+
if (DateInput.isSelectionRange(selection) && selection.start) {
|
73
|
+
const date = moment(selection.start).subtract(1, 'year');
|
74
|
+
return this.getSelectionFromDate(date.toDate());
|
75
|
+
}
|
76
|
+
// This shouldn't happen since the previous stepper is disabled if the selection only has one date.
|
77
|
+
// If it does, just return the selection as-is.
|
78
|
+
return selection;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWVhci1zZWxlY3Rpb24tc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvZGF0ZS1pbnB1dC9kYXRlLWlucHV0LXNlbGVjdGlvbi1zdHJhdGVnaWVzL3llYXItc2VsZWN0aW9uLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFdEY7O0dBRUc7QUFDSCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsOEJBQThCO0lBQXpFOztRQUNrQixzQkFBaUIsR0FBc0IsTUFBTSxDQUFDO1FBQzlDLG1CQUFjLEdBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MseUJBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQzdCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztJQStFaEQsQ0FBQztJQTdFQyxlQUFlLENBQUMsU0FBc0M7UUFDcEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFFRCw4RUFBOEU7UUFDOUUsd0ZBQXdGO1FBQ3hGLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbEUs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QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuaW1wb3J0IHsgQ2FsZW5kYXIgfSBmcm9tIFwiLi4vLi4vY2FsZW5kYXIvY2FsZW5kYXIudHlwZXNcIjtcclxuaW1wb3J0IHsgRGF0ZUlucHV0IH0gZnJvbSBcIi4uL2RhdGUtaW5wdXQudHlwZXNcIjtcclxuaW1wb3J0IHsgRGF0ZUlucHV0U2VsZWN0aW9uU3RyYXRlZ3lCYXNlIH0gZnJvbSBcIi4vZGF0ZS1pbnB1dC1zZWxlY3Rpb24tc3RyYXRlZ3ktYmFzZVwiO1xyXG5cclxuLyoqXHJcbiAqIFNlbGVjdGlvbiBzdHJhdGVneSBmb3IgdGhlICd5ZWFyJyBzZWxlY3Rpb24gbW9kZS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBZZWFyU2VsZWN0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBEYXRlSW5wdXRTZWxlY3Rpb25TdHJhdGVneUJhc2Uge1xyXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb25WaWV3TW9kZTogQ2FsZW5kYXIuVmlld01vZGUgPSAneWVhcic7XHJcbiAgcHVibGljIHJlYWRvbmx5IHZhbGlkVmlld01vZGVzOiBDYWxlbmRhci5WaWV3TW9kZVtdID0gWyd5ZWFyJ107XHJcbiAgcHVibGljIHJlYWRvbmx5IHNob3dTZWNvbmRhcnlUZXh0Ym94ID0gZmFsc2U7XHJcbiAgcHVibGljIHJlYWRvbmx5IHNob3dTZWNvbmRhcnlDYWxlbmRhciA9IGZhbHNlO1xyXG5cclxuICBmb3JtYXRTZWxlY3Rpb24oc2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwpOiBEYXRlSW5wdXQuVGV4dGJveEdyb3VwWyd2YWx1ZSddIHtcclxuICAgIGlmICghc2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiB7IHRleHRib3g6IG51bGwsIHRleHRib3gyOiBudWxsIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT25seSBvbmUgZGF0ZSBpcyBuZWVkZWQgZm9yIGZvcm1hdHRpbmcgc2luY2UgdGhlIHJhbmdlcyBzcGFuIGEgc2luZ2xlIHllYXIuXHJcbiAgICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IGNhc2Ugd2hlcmUgdGhlcmUncyBvbmx5IGEgc2luZ2xlIGRhdGUgYnV0IGl0J3MgY292ZXJlZCBhbnl3YXkuXHJcbiAgICBjb25zdCBkYXRlID0gRGF0ZUlucHV0LmlzU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbi5zdGFydCA6IHNlbGVjdGlvbjtcclxuICAgIHJldHVybiB7IHRleHRib3g6IG1vbWVudChkYXRlKS5mb3JtYXQoJ1lZWVknKSwgdGV4dGJveDI6IG51bGwgfTtcclxuICB9XHJcblxyXG4gIHBhcnNlU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJzZUZvcm1hdHM6IHN0cmluZ1tdLCBvcHRzPzogRGF0ZUlucHV0LlBhcnNpbmdPcHRpb25zKTogRGF0ZSB8IG51bGwge1xyXG4gICAgLy8gSW5jbHVkaW5nICdZWScgYW5kICdZWVlZJyBhcyB2YWxpZCBmb3JtYXRzIGZvciB5ZWFyIGlucHV0LiBUaGVzZSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIGRlZmF1bHQgcGFyc2VcclxuICAgIC8vIGZvcm1hdHMgYmVjYXVzZSB0aGV5IGNhdXNlIGlzc3VlcyB3aXRoIHRoZSBkZWZhdWx0IGRhdGUgcGFyc2luZy5cclxuICAgIHJldHVybiBzdXBlci5wYXJzZVN0cmluZyh2YWx1ZSwgWydZWScsICdZWVlZJywgLi4ucGFyc2VGb3JtYXRzXSwgb3B0cyk7XHJcbiAgfVxyXG5cclxuICBwYXJzZVRleHRib3hWYWx1ZXModmFsdWU6IERhdGVJbnB1dC5UZXh0Ym94R3JvdXBbJ3ZhbHVlJ10sIHBhcnNlRm9ybWF0czogc3RyaW5nW10sIG9wdHM/OiBEYXRlSW5wdXQuUGFyc2luZ09wdGlvbnMpOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICAvLyBPbmx5IGEgc2luZ2xlIHRleHRib3ggaXMgdXNlZCBpbiB5ZWFyIG1vZGVcclxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLnBhcnNlU3RyaW5nKHZhbHVlLnRleHRib3gsIHBhcnNlRm9ybWF0cywgb3B0cyk7XHJcblxyXG4gICAgaWYgKCFkYXRlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGlvbkZyb21EYXRlKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0aW9uRnJvbURhdGUoZGF0ZTogRGF0ZSk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0YXJ0OiBtb21lbnQoZGF0ZSkuc3RhcnRPZigneWVhcicpLnRvRGF0ZSgpLFxyXG4gICAgICBlbmQ6IG1vbWVudChkYXRlKS5lbmRPZigneWVhcicpLnRvRGF0ZSgpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV3U2VsZWN0aW9uRnJvbUV4aXN0aW5nKHByZXZpb3VzU2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbik6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShwcmV2aW91c1NlbGVjdGlvbikpIHtcclxuICAgICAgLy8gQmFzZSB0aGUgeWVhciByYW5nZSBvZmYgb2YgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbidzIGVuZCBkYXRlLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgY29uc3QgZGF0ZSA9IHByZXZpb3VzU2VsZWN0aW9uLmVuZCB8fCBwcmV2aW91c1NlbGVjdGlvbi5zdGFydDtcclxuICAgICAgaWYgKGRhdGUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Gcm9tRGF0ZShkYXRlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25TaW5nbGVEYXRlKHByZXZpb3VzU2VsZWN0aW9uKSkge1xyXG4gICAgICAvLyBJZiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uIHdhcyBhIHNpbmdsZSBkYXRlLCBtYWtlIHRoZSByYW5nZSB0aGF0IHllYXJcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uRnJvbURhdGUocHJldmlvdXNTZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0aW9uRm9yUXVpY2tTZWxlY3REYXRlKGRhdGU6IERhdGUpOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Gcm9tRGF0ZShkYXRlKTtcclxuICB9XHJcblxyXG4gIGdldE5leHRTZWxlY3Rpb24oc2VsZWN0aW9uOiBEYXRlSW5wdXQuU2VsZWN0aW9uKTogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwge1xyXG4gICAgLy8gTW92ZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBuZXh0IHllYXJcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24pICYmIHNlbGVjdGlvbi5zdGFydCkge1xyXG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KHNlbGVjdGlvbi5zdGFydCkuYWRkKDEsICd5ZWFyJyk7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGlvbkZyb21EYXRlKGRhdGUudG9EYXRlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBzaW5jZSB0aGUgbmV4dCBzdGVwcGVyIGlzIGRpc2FibGVkIGlmIHRoZSBzZWxlY3Rpb24gb25seSBoYXMgb25lIGRhdGUuXHJcbiAgICAvLyBJZiBpdCBkb2VzLCBqdXN0IHJldHVybiB0aGUgc2VsZWN0aW9uIGFzLWlzLlxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIGdldFByZXZpb3VzU2VsZWN0aW9uKHNlbGVjdGlvbjogRGF0ZUlucHV0LlNlbGVjdGlvbik6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIC8vIE1vdmUgdGhlIHNlbGVjdGlvbiB0byB0aGUgcHJldmlvdXMgeWVhclxyXG4gICAgaWYgKERhdGVJbnB1dC5pc1NlbGVjdGlvblJhbmdlKHNlbGVjdGlvbikgJiYgc2VsZWN0aW9uLnN0YXJ0KSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBtb21lbnQoc2VsZWN0aW9uLnN0YXJ0KS5zdWJ0cmFjdCgxLCAneWVhcicpO1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Gcm9tRGF0ZShkYXRlLnRvRGF0ZSgpKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlIHRoZSBwcmV2aW91cyBzdGVwcGVyIGlzIGRpc2FibGVkIGlmIHRoZSBzZWxlY3Rpb24gb25seSBoYXMgb25lIGRhdGUuXHJcbiAgICAvLyBJZiBpdCBkb2VzLCBqdXN0IHJldHVybiB0aGUgc2VsZWN0aW9uIGFzLWlzLlxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcclxuICB9XHJcbn1cclxuIl19
|