ng-zenduit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2020/lib/breadcrumbs/zendu-breadcrumbs.component.mjs +37 -0
- package/esm2020/lib/card-block/zendu-card-block.component.mjs +21 -0
- package/esm2020/lib/checkbox/zendu-checkbox.component.mjs +44 -0
- package/esm2020/lib/colorpicker/zendu-colorpicker.component.mjs +106 -0
- package/esm2020/lib/column-configuration/columnState.mjs +2 -0
- package/esm2020/lib/column-configuration/zendu-column-configuration.component.mjs +118 -0
- package/esm2020/lib/datepicker/date-picker-day.mjs +2 -0
- package/esm2020/lib/datepicker/date-picker-hint.mjs +2 -0
- package/esm2020/lib/datepicker/datepicker.mjs +9 -0
- package/esm2020/lib/datepicker/zendu-datepicker.component.mjs +434 -0
- package/esm2020/lib/doc-scanner/zendu-doc-scanner.component.mjs +628 -0
- package/esm2020/lib/file-upload/zendu-file-upload.component.mjs +107 -0
- package/esm2020/lib/filter/dateRange.mjs +2 -0
- package/esm2020/lib/filter/filtersConfig.mjs +2 -0
- package/esm2020/lib/filter/numberRange.mjs +2 -0
- package/esm2020/lib/filter/zendu-filter.component.mjs +461 -0
- package/esm2020/lib/icon/zendu-icon.component.mjs +24 -0
- package/esm2020/lib/local.lock.mjs +33 -0
- package/esm2020/lib/location-search/location.address.mjs +2 -0
- package/esm2020/lib/location-search/zendu-location-search.component.mjs +129 -0
- package/esm2020/lib/map/map.types.mjs +2 -0
- package/esm2020/lib/map/zendu-map.component.mjs +129 -0
- package/esm2020/lib/map-preview/zendu-map-preview.component.mjs +30 -0
- package/esm2020/lib/ng-zenduit.module.mjs +158 -0
- package/esm2020/lib/pagination-bar/pageItem.mjs +2 -0
- package/esm2020/lib/pagination-bar/zendu-pagination-bar.component.mjs +71 -0
- package/esm2020/lib/phone-input/zendu-phone-input.component.mjs +141 -0
- package/esm2020/lib/progress/zendu-progress.component.mjs +29 -0
- package/esm2020/lib/radio-button/radio-button.component.mjs +48 -0
- package/esm2020/lib/search-box/zendu-search-box.component.mjs +124 -0
- package/esm2020/lib/select/templates/zendu-select-option.directive.mjs +16 -0
- package/esm2020/lib/select/templates/zendu-select-value.directive.mjs +16 -0
- package/esm2020/lib/select/zendu-select.component.mjs +303 -0
- package/esm2020/lib/services/geoconding.service.mjs +61 -0
- package/esm2020/lib/services/map.service.mjs +181 -0
- package/esm2020/lib/services/opencv.service.mjs +109 -0
- package/esm2020/lib/services/zendu-notify.service.mjs +92 -0
- package/esm2020/lib/sort-header/zendu-sort-header.component.mjs +36 -0
- package/esm2020/lib/spinner/zendu-spinner.component.mjs +11 -0
- package/esm2020/lib/toggle/zendu-toggle.component.mjs +32 -0
- package/esm2020/lib/toggle-slide/zendu-toggle-slide.component.mjs +27 -0
- package/esm2020/lib/util.mjs +93 -0
- package/esm2020/ng-zenduit.mjs +5 -0
- package/esm2020/public-api.mjs +42 -0
- package/fesm2015/ng-zenduit.mjs +3768 -0
- package/fesm2015/ng-zenduit.mjs.map +1 -0
- package/fesm2020/ng-zenduit.mjs +3735 -0
- package/fesm2020/ng-zenduit.mjs.map +1 -0
- package/icons/arrow-down-small.svg +3 -0
- package/icons/arrow-up-small.svg +3 -0
- package/icons/calendar.svg +6 -0
- package/icons/cross.svg +3 -0
- package/icons/date.svg +3 -0
- package/icons/expand.svg +3 -0
- package/icons/filter.svg +3 -0
- package/icons/play.svg +10 -0
- package/icons/redo.svg +3 -0
- package/icons/rotate.svg +3 -0
- package/icons/time.svg +4 -0
- package/icons/undo.svg +3 -0
- package/index.d.ts +5 -0
- package/lib/breadcrumbs/zendu-breadcrumbs.component.d.ts +22 -0
- package/lib/card-block/zendu-card-block.component.d.ts +9 -0
- package/lib/checkbox/zendu-checkbox.component.d.ts +17 -0
- package/lib/colorpicker/zendu-colorpicker.component.d.ts +28 -0
- package/lib/column-configuration/columnState.d.ts +7 -0
- package/lib/column-configuration/zendu-column-configuration.component.d.ts +43 -0
- package/lib/datepicker/date-picker-day.d.ts +8 -0
- package/lib/datepicker/date-picker-hint.d.ts +5 -0
- package/lib/datepicker/datepicker.d.ts +7 -0
- package/lib/datepicker/zendu-datepicker.component.d.ts +94 -0
- package/lib/doc-scanner/zendu-doc-scanner.component.d.ts +82 -0
- package/lib/file-upload/zendu-file-upload.component.d.ts +28 -0
- package/lib/filter/dateRange.d.ts +4 -0
- package/lib/filter/filtersConfig.d.ts +88 -0
- package/lib/filter/numberRange.d.ts +4 -0
- package/lib/filter/zendu-filter.component.d.ts +59 -0
- package/lib/icon/zendu-icon.component.d.ts +10 -0
- package/lib/local.lock.d.ts +8 -0
- package/lib/location-search/location.address.d.ts +12 -0
- package/lib/location-search/zendu-location-search.component.d.ts +32 -0
- package/lib/map/map.types.d.ts +33 -0
- package/lib/map/zendu-map.component.d.ts +23 -0
- package/lib/map-preview/zendu-map-preview.component.d.ts +11 -0
- package/lib/ng-zenduit.module.d.ts +34 -0
- package/lib/pagination-bar/pageItem.d.ts +4 -0
- package/lib/pagination-bar/zendu-pagination-bar.component.d.ts +25 -0
- package/lib/phone-input/zendu-phone-input.component.d.ts +39 -0
- package/lib/progress/zendu-progress.component.d.ts +14 -0
- package/lib/radio-button/radio-button.component.d.ts +18 -0
- package/lib/search-box/zendu-search-box.component.d.ts +26 -0
- package/lib/select/templates/zendu-select-option.directive.d.ts +8 -0
- package/lib/select/templates/zendu-select-value.directive.d.ts +8 -0
- package/lib/select/zendu-select.component.d.ts +107 -0
- package/lib/services/geoconding.service.d.ts +23 -0
- package/lib/services/map.service.d.ts +22 -0
- package/lib/services/opencv.service.d.ts +46 -0
- package/lib/services/zendu-notify.service.d.ts +10 -0
- package/lib/sort-header/zendu-sort-header.component.d.ts +10 -0
- package/lib/spinner/zendu-spinner.component.d.ts +5 -0
- package/lib/toggle/zendu-toggle.component.d.ts +14 -0
- package/lib/toggle-slide/zendu-toggle-slide.component.d.ts +13 -0
- package/lib/util.d.ts +11 -0
- package/package.json +36 -0
- package/public-api.d.ts +38 -0
- package/styles/action-menu.scss +127 -0
- package/styles/all.scss +11 -0
- package/styles/button.scss +188 -0
- package/styles/colors.scss +125 -0
- package/styles/common-form.scss +159 -0
- package/styles/extenal.scss +2 -0
- package/styles/ghost.scss +38 -0
- package/styles/global-restyle.scss +25 -0
- package/styles/page-layout.scss +82 -0
- package/styles/snackbar.scss +91 -0
- package/styles/table.scss +107 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
|
|
2
|
+
import moment from 'moment/moment';
|
|
3
|
+
import { DATEPICKER_POSITION } from './datepicker';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
import * as i2 from "@angular/forms";
|
|
7
|
+
import * as i3 from "../icon/zendu-icon.component";
|
|
8
|
+
const defaultHours = '12';
|
|
9
|
+
const defaultMinuts = '00';
|
|
10
|
+
export class ZenduDatepickerComponent {
|
|
11
|
+
constructor(_element) {
|
|
12
|
+
this._element = _element;
|
|
13
|
+
/**
|
|
14
|
+
* callback to emit changes for parent component
|
|
15
|
+
*/
|
|
16
|
+
this.dateChange = new EventEmitter();
|
|
17
|
+
this.showTime = false;
|
|
18
|
+
this.showDate = true;
|
|
19
|
+
this.boxDesign = false;
|
|
20
|
+
this.highlightDays = [];
|
|
21
|
+
this.autoConfirm = false;
|
|
22
|
+
/**
|
|
23
|
+
* datepicker states
|
|
24
|
+
*/
|
|
25
|
+
this.highlightError = false;
|
|
26
|
+
this.disabled = false;
|
|
27
|
+
this.readonly = false;
|
|
28
|
+
this.xPosition = DATEPICKER_POSITION.AUTO;
|
|
29
|
+
this.yPosition = DATEPICKER_POSITION.AUTO;
|
|
30
|
+
this.selectedTime = { Hr: 1, Min: 0 };
|
|
31
|
+
this.isPickerVisible = false;
|
|
32
|
+
this.dayRows = [];
|
|
33
|
+
this.daysTitle = "";
|
|
34
|
+
this.weekDays = ["Mo", "Tu", "We", "Th", "Fri", "Sa", "Su"];
|
|
35
|
+
this.currentSlot = new Date();
|
|
36
|
+
this.hour = defaultHours;
|
|
37
|
+
this.min = defaultMinuts;
|
|
38
|
+
this.isPM = false;
|
|
39
|
+
this.months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
40
|
+
this.years = [];
|
|
41
|
+
this.monthPickerVisible = false;
|
|
42
|
+
this.yearPickerVisible = false;
|
|
43
|
+
this.right = false;
|
|
44
|
+
this.bottom = false;
|
|
45
|
+
}
|
|
46
|
+
outsideHandling(event) {
|
|
47
|
+
if (!document.body.contains(event.target)) {
|
|
48
|
+
// element not in the DOM
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (this._element.nativeElement.contains(event.target)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.hideTimePicker();
|
|
55
|
+
}
|
|
56
|
+
scroll() {
|
|
57
|
+
this.updatePlacement();
|
|
58
|
+
}
|
|
59
|
+
ngOnChanges(changes) {
|
|
60
|
+
if (this.date) {
|
|
61
|
+
this._dateToSet = new Date(this.date);
|
|
62
|
+
this.selectedTime = {
|
|
63
|
+
Hr: moment(this.date).hours(),
|
|
64
|
+
Min: moment(this.date).minutes()
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
updatePlacement() {
|
|
69
|
+
this.right = false;
|
|
70
|
+
this.bottom = false;
|
|
71
|
+
if (this.xPosition === DATEPICKER_POSITION.AUTO && this.getHorizontalMenuDirection() === DATEPICKER_POSITION.LEFT) {
|
|
72
|
+
this.right = true;
|
|
73
|
+
}
|
|
74
|
+
if (this.yPosition === DATEPICKER_POSITION.AUTO && this.getVerticalMenuDirection() === DATEPICKER_POSITION.TOP) {
|
|
75
|
+
this.bottom = true;
|
|
76
|
+
}
|
|
77
|
+
if (this.xPosition === DATEPICKER_POSITION.RIGHT) {
|
|
78
|
+
this.right = true;
|
|
79
|
+
}
|
|
80
|
+
if (this.yPosition === DATEPICKER_POSITION.TOP) {
|
|
81
|
+
this.bottom = true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
getVerticalMenuDirection() {
|
|
85
|
+
const element = this._element.nativeElement;
|
|
86
|
+
const top = element.getBoundingClientRect().top;
|
|
87
|
+
const height = window.innerHeight;
|
|
88
|
+
if (top > (height / 2)) {
|
|
89
|
+
return DATEPICKER_POSITION.TOP;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
return DATEPICKER_POSITION.BOTTOM;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Used to get datepicker position
|
|
97
|
+
* @returns either "left" or "right"
|
|
98
|
+
*/
|
|
99
|
+
getHorizontalMenuDirection() {
|
|
100
|
+
const element = this._element.nativeElement;
|
|
101
|
+
const left = element.getBoundingClientRect().left;
|
|
102
|
+
const width = window.innerWidth;
|
|
103
|
+
if (left > (width / 2)) {
|
|
104
|
+
return DATEPICKER_POSITION.LEFT;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
return DATEPICKER_POSITION.RIGHT;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
togglePicker() {
|
|
111
|
+
if (this.disabled)
|
|
112
|
+
return;
|
|
113
|
+
this._dateToSet = this.date ? new Date(this.date) : null;
|
|
114
|
+
this.isPickerVisible = !this.isPickerVisible;
|
|
115
|
+
if (this.showDate) {
|
|
116
|
+
this.currentSlot = this._dateToSet || new Date();
|
|
117
|
+
this.updateDays();
|
|
118
|
+
}
|
|
119
|
+
if (this.showTime) {
|
|
120
|
+
this.selectedTime = {
|
|
121
|
+
Hr: moment(this.date).hours(),
|
|
122
|
+
Min: moment(this.date).minutes()
|
|
123
|
+
};
|
|
124
|
+
if (this.date) {
|
|
125
|
+
const formatted = moment(this.date).format('hh:mm A');
|
|
126
|
+
this.isPM = formatted.includes('PM');
|
|
127
|
+
this.hour = formatted.slice(0, 2);
|
|
128
|
+
this.min = formatted.slice(3, 5);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
this.updatePlacement();
|
|
132
|
+
}
|
|
133
|
+
updateDays() {
|
|
134
|
+
if (!this.currentSlot) {
|
|
135
|
+
this.currentSlot = new Date();
|
|
136
|
+
}
|
|
137
|
+
this.daysTitle = moment(this.currentSlot).format("MMM yyyy");
|
|
138
|
+
this.dayRows = [];
|
|
139
|
+
let current = moment(this.currentSlot).startOf("month").startOf("week").add(1, "day");
|
|
140
|
+
let end = moment(this.currentSlot).endOf("month").endOf("week").add(1, "day");
|
|
141
|
+
const currentMonth = moment(this.currentSlot).month();
|
|
142
|
+
const date = moment(this._dateToSet);
|
|
143
|
+
while (current <= end) {
|
|
144
|
+
const row = { days: [] };
|
|
145
|
+
this.dayRows.push(row);
|
|
146
|
+
for (let idx = 0; idx < 7; idx++) {
|
|
147
|
+
let isSelected = false;
|
|
148
|
+
if (date) {
|
|
149
|
+
isSelected = current.date() == date.date() &&
|
|
150
|
+
date.month() == current.month();
|
|
151
|
+
}
|
|
152
|
+
let isOutside = currentMonth != current.month();
|
|
153
|
+
let isDisabled = false;
|
|
154
|
+
if (this.minDate && current.toDate() < this.minDate) {
|
|
155
|
+
isDisabled = true;
|
|
156
|
+
}
|
|
157
|
+
else if (this.maxDate && current.toDate() > this.maxDate) {
|
|
158
|
+
isDisabled = true;
|
|
159
|
+
}
|
|
160
|
+
let isHighlighted = false;
|
|
161
|
+
if (this.highlightDays && this.highlightDays.length) {
|
|
162
|
+
isHighlighted = this.highlightDays.indexOf(current.valueOf()) >= 0;
|
|
163
|
+
}
|
|
164
|
+
row.days.push({
|
|
165
|
+
date: current.toDate(),
|
|
166
|
+
lbl: moment(current).date().toString(),
|
|
167
|
+
isOutside: isOutside,
|
|
168
|
+
selected: isSelected,
|
|
169
|
+
isDisabled: isDisabled,
|
|
170
|
+
isHighlighted: isHighlighted
|
|
171
|
+
});
|
|
172
|
+
current = moment(current).add(1, "day");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
nextMonth() {
|
|
177
|
+
this.currentSlot = moment(this.currentSlot).add(1, "month").toDate();
|
|
178
|
+
this.updateDays();
|
|
179
|
+
}
|
|
180
|
+
prevMonth() {
|
|
181
|
+
this.currentSlot = moment(this.currentSlot).subtract(1, "month").toDate();
|
|
182
|
+
this.updateDays();
|
|
183
|
+
}
|
|
184
|
+
nextYear() {
|
|
185
|
+
this.currentSlot = moment(this.currentSlot).add(1, "year").toDate();
|
|
186
|
+
this.updateDays();
|
|
187
|
+
}
|
|
188
|
+
prevYear() {
|
|
189
|
+
this.currentSlot = moment(this.currentSlot).subtract(1, "year").toDate();
|
|
190
|
+
this.updateDays();
|
|
191
|
+
}
|
|
192
|
+
nextYearGroup() {
|
|
193
|
+
this.years = this.years.map(year => year + 15);
|
|
194
|
+
}
|
|
195
|
+
prevYearGroup() {
|
|
196
|
+
this.years = this.years.map(year => year - 15);
|
|
197
|
+
}
|
|
198
|
+
selectDay(day) {
|
|
199
|
+
if (day.isDisabled) {
|
|
200
|
+
// day is disabled
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (this.showTime) {
|
|
204
|
+
this._dateToSet = moment(day.date).hour(this.selectedTime.Hr).minute(this.selectedTime.Min).toDate();
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
this._dateToSet = new Date(day.date);
|
|
208
|
+
if (this.autoConfirm) {
|
|
209
|
+
this.apply();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
this.updateDays();
|
|
213
|
+
}
|
|
214
|
+
selectMonth(month) {
|
|
215
|
+
const newDate = new Date(this.currentSlot);
|
|
216
|
+
newDate.setMonth(month);
|
|
217
|
+
this.currentSlot = newDate;
|
|
218
|
+
this.updateDays();
|
|
219
|
+
this.monthPickerVisible = false;
|
|
220
|
+
}
|
|
221
|
+
selectYear(year) {
|
|
222
|
+
const newDate = new Date(this.currentSlot);
|
|
223
|
+
newDate.setFullYear(year);
|
|
224
|
+
this.currentSlot = newDate;
|
|
225
|
+
this.updateDays();
|
|
226
|
+
this.yearPickerVisible = false;
|
|
227
|
+
}
|
|
228
|
+
hideTimePicker() {
|
|
229
|
+
this.isPickerVisible = false;
|
|
230
|
+
}
|
|
231
|
+
timeChanged() {
|
|
232
|
+
let min = parseInt(this.min);
|
|
233
|
+
let hour = parseInt(this.hour);
|
|
234
|
+
if (isNaN(hour) || isNaN(min)) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
hour = Math.min(hour, 12);
|
|
238
|
+
hour = Math.max(hour, 1);
|
|
239
|
+
min = Math.min(min, 59);
|
|
240
|
+
min = Math.max(min, 0);
|
|
241
|
+
const time = moment(`${hour} ${min} ${this.isPM ? "pm" : "am"}`, "h:m a");
|
|
242
|
+
this.selectedTime = {
|
|
243
|
+
Hr: time.hours(),
|
|
244
|
+
Min: time.minutes()
|
|
245
|
+
};
|
|
246
|
+
// added below condition because we can select the time without date, and it was showing invalid date in the input box
|
|
247
|
+
// second condition is required to disable apply button when date is not selected
|
|
248
|
+
if (this._dateToSet) {
|
|
249
|
+
this._dateToSet = moment(this._dateToSet).hour(this.selectedTime.Hr).minute(this.selectedTime.Min).toDate();
|
|
250
|
+
}
|
|
251
|
+
else if (!this.showDate) {
|
|
252
|
+
this._dateToSet = moment().hour(this.selectedTime.Hr).minute(this.selectedTime.Min).toDate();
|
|
253
|
+
}
|
|
254
|
+
// format
|
|
255
|
+
if (hour < 10) {
|
|
256
|
+
this.hour = `0${hour}`;
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
this.hour = `${hour}`;
|
|
260
|
+
}
|
|
261
|
+
if (min < 10) {
|
|
262
|
+
this.min = `0${min}`;
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
this.min = `${min}`;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
formattedDate() {
|
|
269
|
+
if (!this.date) {
|
|
270
|
+
return "";
|
|
271
|
+
}
|
|
272
|
+
if (this.boxDesign && moment(this.date).isSame(moment(), "day")) {
|
|
273
|
+
return 'Today';
|
|
274
|
+
}
|
|
275
|
+
if (this.showDate && !this.showTime && !this.boxDesign) {
|
|
276
|
+
// Expanded formatting for date only picker
|
|
277
|
+
return moment(this.date).format("ddd, DD MMM YYYY");
|
|
278
|
+
}
|
|
279
|
+
return moment(this.date).format("MMM DD, YY");
|
|
280
|
+
}
|
|
281
|
+
formattedTime() {
|
|
282
|
+
if (!this.date) {
|
|
283
|
+
return "";
|
|
284
|
+
}
|
|
285
|
+
return moment(this.date).format("h:mm A");
|
|
286
|
+
}
|
|
287
|
+
toggleTime() {
|
|
288
|
+
this.isPM = !this.isPM;
|
|
289
|
+
this.timeChanged();
|
|
290
|
+
}
|
|
291
|
+
showMonthPicker() {
|
|
292
|
+
this.monthPickerVisible = true;
|
|
293
|
+
}
|
|
294
|
+
showYearPicker() {
|
|
295
|
+
this.yearPickerVisible = true;
|
|
296
|
+
this.years = [];
|
|
297
|
+
for (let i = this.currentSlot.getFullYear() - 7; i < this.currentSlot.getFullYear() + 8; i++) {
|
|
298
|
+
this.years.push(i);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
hourUp() {
|
|
302
|
+
let hour = parseInt(this.hour);
|
|
303
|
+
if (isNaN(hour)) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
hour++;
|
|
307
|
+
this.hour = hour.toString();
|
|
308
|
+
this.timeChanged();
|
|
309
|
+
}
|
|
310
|
+
hourDown() {
|
|
311
|
+
let hour = parseInt(this.hour);
|
|
312
|
+
if (isNaN(hour)) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
hour--;
|
|
316
|
+
this.hour = hour.toString();
|
|
317
|
+
this.timeChanged();
|
|
318
|
+
}
|
|
319
|
+
minUp() {
|
|
320
|
+
let min = parseInt(this.min);
|
|
321
|
+
if (isNaN(min)) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
min++;
|
|
325
|
+
this.min = min.toString();
|
|
326
|
+
this.timeChanged();
|
|
327
|
+
}
|
|
328
|
+
minDown() {
|
|
329
|
+
let min = parseInt(this.min);
|
|
330
|
+
if (isNaN(min)) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
min--;
|
|
334
|
+
this.min = min.toString();
|
|
335
|
+
this.timeChanged();
|
|
336
|
+
}
|
|
337
|
+
apply() {
|
|
338
|
+
if (this._dateToSet) {
|
|
339
|
+
// If time selection has enabled and user keeps default time then triggering the timeChanged function
|
|
340
|
+
if (this.showTime && this.hour === defaultHours && this.min === defaultMinuts) {
|
|
341
|
+
this.timeChanged();
|
|
342
|
+
}
|
|
343
|
+
this.date = new Date(this._dateToSet);
|
|
344
|
+
}
|
|
345
|
+
this.dateChange.emit(this.date);
|
|
346
|
+
this.hideTimePicker();
|
|
347
|
+
}
|
|
348
|
+
cancel() {
|
|
349
|
+
this.hideTimePicker();
|
|
350
|
+
}
|
|
351
|
+
clear() {
|
|
352
|
+
this._dateToSet = null;
|
|
353
|
+
this.hour = defaultHours;
|
|
354
|
+
this.min = defaultMinuts;
|
|
355
|
+
this.date = null;
|
|
356
|
+
this.apply();
|
|
357
|
+
}
|
|
358
|
+
getIcon() {
|
|
359
|
+
// Change picker icon based on mode
|
|
360
|
+
switch (true) {
|
|
361
|
+
case this.showDate && this.showTime:
|
|
362
|
+
// Date + Time
|
|
363
|
+
return 'assets/ng-zenduit/icons/date.svg';
|
|
364
|
+
case this.showDate && !this.showTime:
|
|
365
|
+
// Date only
|
|
366
|
+
return 'assets/ng-zenduit/icons/calendar.svg';
|
|
367
|
+
case !this.showDate && this.showTime:
|
|
368
|
+
// Time only
|
|
369
|
+
return 'assets/ng-zenduit/icons/time.svg';
|
|
370
|
+
default:
|
|
371
|
+
return 'assets/ng-zenduit/icons/date.svg';
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
selectHintDate(date) {
|
|
375
|
+
if (!date) {
|
|
376
|
+
console.error('Invalid hint');
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
this._dateToSet = new Date(date);
|
|
380
|
+
this.selectedTime = {
|
|
381
|
+
Hr: moment(date).hours(),
|
|
382
|
+
Min: moment(date).minutes()
|
|
383
|
+
};
|
|
384
|
+
if (this.autoConfirm) {
|
|
385
|
+
this.apply();
|
|
386
|
+
}
|
|
387
|
+
this.updateDays();
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
ZenduDatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatepickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
391
|
+
ZenduDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduDatepickerComponent, selector: "zen-datepicker", inputs: { date: "date", showTime: "showTime", showDate: "showDate", containerClass: "containerClass", minDate: "minDate", maxDate: "maxDate", boxDesign: "boxDesign", highlightDays: "highlightDays", autoConfirm: "autoConfirm", hint: "hint", highlightError: "highlightError", disabled: "disabled", readonly: "readonly", xPosition: "xPosition", yPosition: "yPosition" }, outputs: { dateChange: "dateChange" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:scroll": "scroll()" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"date-component\">\n <!-- Material design datepicker toggle -->\n <ng-container *ngIf=\"!boxDesign\">\n <button class=\"date-toggle\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n\n <div class=\"date-content\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n Select Date\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\"> {{formattedTime()}}</span>\n </div>\n </div>\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n </button>\n </ng-container>\n\n <!-- Box design datepicker toggle -->\n <ng-container *ngIf=\"boxDesign\">\n <button class=\"date-toggle new-box-design\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n\n <div class=\"date-content new-box-design\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n Select Date\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\"> {{formattedTime()}}</span>\n </div>\n </div>\n </button>\n </ng-container>\n\n <!-- Datepicker popup -->\n <div *ngIf=\"isPickerVisible\"\n class=\"date-menu\"\n [ngClass]=\"{ 'right': right, 'bottom': bottom }\">\n <div class=\"date-modal\">\n <ng-container *ngIf=\"showDate\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevMonth()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showMonthPicker()\">{{daysTitle}}</span>\n <i (click)=\"nextMonth()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"days-container\">\n <div class=\"week-days\">\n <div *ngFor=\"let weekDay of weekDays\"\n class=\"week-day\">\n {{weekDay}}\n </div>\n </div>\n <div *ngFor=\"let row of dayRows\"\n class=\"day-row\">\n <div *ngFor=\"let day of row.days\"\n (click)=\"selectDay(day)\"\n class=\"day-item\"\n [class.ousideRange]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.disabledDay]=\"day.isDisabled\">\n {{day.lbl}}\n <zen-icon *ngIf=\"day.isHighlighted\"\n class=\"highlight-icon\"\n src=\"assets/ng-zenduit/icons/play.svg\"></zen-icon>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div *ngIf=\"showTime\"\n class=\"time-container\">\n\n <div class=\"time-lbl\">\n Select Time:\n </div>\n\n <div class=\"time-picker\">\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"hourUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"hour\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"hourDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <label>:</label>\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"minUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"min\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"minDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <div class=\"am-pm-picker\">\n <div class=\"main\"\n (click)=\"toggleTime()\">\n {{isPM ? 'PM' : 'AM'}}\n </div>\n <div class=\"sub\"\n (click)=\"toggleTime()\">\n {{isPM ? 'AM' : 'PM'}}\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"hint\"\n *ngIf=\"hint\">\n <div class=\"hint-description\">\n {{hint.description}}\n </div>\n <div class=\"hint-date\"\n (click)=\"selectHintDate(hint.date)\">\n {{hint.maskText}}\n </div>\n </div>\n\n <div class=\"footer\"\n *ngIf=\"!autoConfirm || showTime\">\n <button *ngIf=\"date\"\n (click)=\"clear()\"\n class=\"button-stroked\">\n Clear\n </button>\n <button *ngIf=\"!date\"\n (click)=\"cancel()\"\n class=\"button-stroked\">\n Cancel\n </button>\n <button [disabled]=\"!_dateToSet\"\n (click)=\"apply()\"\n class=\"button-flat\">\n Apply\n </button>\n </div>\n\n <ng-container *ngIf=\"monthPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYear()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYear()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let month of months; index as index\"\n (click)=\"selectMonth(index)\">\n {{ month }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"yearPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYearGroup()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYearGroup()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let year of years\"\n (click)=\"selectYear(year)\">\n {{ year }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"date-modal-extra-space\"></div>\n </div>\n</div>\n", styles: [".date-component{width:100%;position:relative}.date-component .date-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;gap:9px;transition:.3s;width:100%;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:14px;font-style:normal;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.date-component .date-toggle.new-box-design{border:1px solid var(--color-white-tint-1, #f2f2f2);border-radius:2px;padding:6px 12px;gap:4px!important}.date-component .date-toggle:hover .date-placeholder{color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:hover .date-icon{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:focus,.date-component .date-toggle.active{border-color:var(--color-blue-primary, #2188d9)}.date-component .date-toggle:focus .date-icon,.date-component .date-toggle.active .date-icon{background-color:var(--color-blue-primary, #2188d9)!important}.date-component .date-toggle[disabled]{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle[disabled] .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle[disabled] .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle.readonly .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.error{border-color:var(--color-error-primary, #dc3e33)}.date-component .date-toggle.error .date-icon{background-color:var(--color-error-primary, #dc3e33)!important}.date-component .date-toggle.error .date-content.new-box-design{color:var(--color-error-primary, #dc3e33)!important}.date-component .date-content{flex:1;font-size:16px;text-align:left;height:18px;min-width:30px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap;transition:.3s}.date-component .date-content .date-placeholder{transition:.3s;color:var(--color-white-tint-6, #bebebe)}.date-component .date-content.new-box-design{color:var(--color-grey-shade-2, #828282)}.date-component .date-icon{width:24px;height:24px;background-color:var(--color-white-tint-6, #bebebe);transition:.3s}.date-component .date-icon.filled{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-menu{width:320px;background:transparent;position:absolute;z-index:10}.date-component .date-menu .date-modal{border-radius:8px;width:320px;overflow-y:auto;white-space:initial;background:#ffffff;box-shadow:0 2px 4px -1px #00000008,0 4px 5px #0000003d,0 1px 10px #0000001a}.date-component .date-menu .date-modal-extra-space{height:10px;margin:0 0 -10px;background:transparent}.date-component .date-menu .days-toolbar{display:flex;align-items:center;justify-content:space-between;padding:16px 34px}.date-component .date-menu .days-toolbar .material-icons{color:#333;font-size:20px;cursor:pointer;-webkit-user-select:none;user-select:none}.date-component .date-menu .days-toolbar .title{font-size:14px;font-weight:500;color:var(--color-grey-primary, #4f4f4f);cursor:pointer}.date-component .date-menu .days-container{border-bottom:1px solid #f2f2f2;padding:0 24px}.date-component .date-menu .days-container .week-days{display:flex;align-items:center;justify-content:space-between;font-size:14px;color:var(--color-grey-primary, #4f4f4f);font-weight:500;margin-bottom:8px;cursor:default}.date-component .date-menu .days-container .week-days .week-day{width:39px;text-align:center}.date-component .date-menu .days-container .day-row{display:flex;align-items:center;justify-content:space-between;font-size:14px;font-weight:400;color:var(--color-grey-primary, #4f4f4f)}.date-component .date-menu .days-container .day-row .day-item{position:relative;width:39px;height:39px;display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:4px}.date-component .date-menu .days-container .day-row .day-item .highlight-icon{position:absolute;right:0;height:14px;width:14px;background-color:#5cbb3a}.date-component .date-menu .days-container .day-row .day-item:hover{background:var(--color-blue-tint-1, #f4f9fd);color:var(--color-blue-primary, #2188d9)}.date-component .date-menu .days-container .day-row .day-item.selected{background:var(--color-primary, #2188d9);color:#fff}.date-component .date-menu .days-container .day-row .day-item.selected .highlight-icon{background-color:#fff}.date-component .date-menu .days-container .day-row .day-item.ousideRange{color:#b8b9bc}.date-component .date-menu .days-container .day-row .day-item.disabledDay{color:#b8b9bc;cursor:not-allowed!important}.date-component .time-container{display:flex;padding:16px 24px;justify-content:space-between;border-bottom:1px solid #f2f2f2;align-items:center}.date-component .time-container .time-lbl{font-weight:500;font-size:14px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap}.date-component .time-container .time-picker{display:flex;align-items:center;gap:7px}.date-component .time-container .time-picker .input-wrapper{display:flex;flex-direction:column;align-items:center}.date-component .time-container .time-picker .input-wrapper zen-icon{background-color:var(--color-white-tint-4, #d6d6d8);width:16px;height:16px;cursor:pointer}.date-component .time-container .time-picker .input-wrapper input{width:30px;height:25px;text-align:center;border:1px solid var(--color-white-tint-1, #f2f2f2);font-weight:400;font-size:14px;color:var(--color-grey-primary, #4f4f4f);border-radius:2px}.date-component .time-container .time-picker .input-wrapper input:focus{outline:none;border-color:var(--color-blue-primary, #2188d9)}.date-component .time-container .time-picker .am-pm-picker{font-weight:400;font-size:14px;padding-top:18px;cursor:pointer}.date-component .time-container .time-picker .am-pm-picker .main{color:var(--color-grey-primary, #4f4f4f)}.date-component .time-container .time-picker .am-pm-picker .sub{color:var(--color-white-tint-4, #d6d6d8)}.date-component .hint{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:16px 24px;border-bottom:1px solid #ECECED;font-style:normal;font-weight:400;font-size:14px;line-height:130%;color:#4f4f4f}.date-component .hint .hint-date{cursor:pointer;text-decoration-line:underline}.date-component .footer{display:flex;justify-content:end;gap:16px;padding:16px 24px}.date-component .month-picker{position:absolute;inset:0;background:white}.date-component .month-picker .months-container{display:flex;flex-wrap:wrap;justify-content:space-between;padding:10px 20px}.date-component .month-picker .months-container .month-item{display:inline-flex;align-items:center;justify-content:center;height:50px;width:30%;cursor:pointer;color:var(--color-grey-shade-2, #828282);border-radius:4px}.date-component .month-picker .months-container .month-item:hover{color:#fff;background-color:var(--color-blue-primary, #2188d9)}.date-component .right{right:0}.date-component .bottom{bottom:42px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
|
|
392
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatepickerComponent, decorators: [{
|
|
393
|
+
type: Component,
|
|
394
|
+
args: [{ selector: 'zen-datepicker', template: "<div class=\"date-component\">\n <!-- Material design datepicker toggle -->\n <ng-container *ngIf=\"!boxDesign\">\n <button class=\"date-toggle\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n\n <div class=\"date-content\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n Select Date\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\"> {{formattedTime()}}</span>\n </div>\n </div>\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n </button>\n </ng-container>\n\n <!-- Box design datepicker toggle -->\n <ng-container *ngIf=\"boxDesign\">\n <button class=\"date-toggle new-box-design\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n\n <div class=\"date-content new-box-design\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n Select Date\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\"> {{formattedTime()}}</span>\n </div>\n </div>\n </button>\n </ng-container>\n\n <!-- Datepicker popup -->\n <div *ngIf=\"isPickerVisible\"\n class=\"date-menu\"\n [ngClass]=\"{ 'right': right, 'bottom': bottom }\">\n <div class=\"date-modal\">\n <ng-container *ngIf=\"showDate\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevMonth()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showMonthPicker()\">{{daysTitle}}</span>\n <i (click)=\"nextMonth()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"days-container\">\n <div class=\"week-days\">\n <div *ngFor=\"let weekDay of weekDays\"\n class=\"week-day\">\n {{weekDay}}\n </div>\n </div>\n <div *ngFor=\"let row of dayRows\"\n class=\"day-row\">\n <div *ngFor=\"let day of row.days\"\n (click)=\"selectDay(day)\"\n class=\"day-item\"\n [class.ousideRange]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.disabledDay]=\"day.isDisabled\">\n {{day.lbl}}\n <zen-icon *ngIf=\"day.isHighlighted\"\n class=\"highlight-icon\"\n src=\"assets/ng-zenduit/icons/play.svg\"></zen-icon>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div *ngIf=\"showTime\"\n class=\"time-container\">\n\n <div class=\"time-lbl\">\n Select Time:\n </div>\n\n <div class=\"time-picker\">\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"hourUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"hour\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"hourDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <label>:</label>\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"minUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"min\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"minDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <div class=\"am-pm-picker\">\n <div class=\"main\"\n (click)=\"toggleTime()\">\n {{isPM ? 'PM' : 'AM'}}\n </div>\n <div class=\"sub\"\n (click)=\"toggleTime()\">\n {{isPM ? 'AM' : 'PM'}}\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"hint\"\n *ngIf=\"hint\">\n <div class=\"hint-description\">\n {{hint.description}}\n </div>\n <div class=\"hint-date\"\n (click)=\"selectHintDate(hint.date)\">\n {{hint.maskText}}\n </div>\n </div>\n\n <div class=\"footer\"\n *ngIf=\"!autoConfirm || showTime\">\n <button *ngIf=\"date\"\n (click)=\"clear()\"\n class=\"button-stroked\">\n Clear\n </button>\n <button *ngIf=\"!date\"\n (click)=\"cancel()\"\n class=\"button-stroked\">\n Cancel\n </button>\n <button [disabled]=\"!_dateToSet\"\n (click)=\"apply()\"\n class=\"button-flat\">\n Apply\n </button>\n </div>\n\n <ng-container *ngIf=\"monthPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYear()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYear()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let month of months; index as index\"\n (click)=\"selectMonth(index)\">\n {{ month }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"yearPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYearGroup()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYearGroup()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let year of years\"\n (click)=\"selectYear(year)\">\n {{ year }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"date-modal-extra-space\"></div>\n </div>\n</div>\n", styles: [".date-component{width:100%;position:relative}.date-component .date-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;gap:9px;transition:.3s;width:100%;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:14px;font-style:normal;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.date-component .date-toggle.new-box-design{border:1px solid var(--color-white-tint-1, #f2f2f2);border-radius:2px;padding:6px 12px;gap:4px!important}.date-component .date-toggle:hover .date-placeholder{color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:hover .date-icon{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:focus,.date-component .date-toggle.active{border-color:var(--color-blue-primary, #2188d9)}.date-component .date-toggle:focus .date-icon,.date-component .date-toggle.active .date-icon{background-color:var(--color-blue-primary, #2188d9)!important}.date-component .date-toggle[disabled]{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle[disabled] .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle[disabled] .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle.readonly .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.error{border-color:var(--color-error-primary, #dc3e33)}.date-component .date-toggle.error .date-icon{background-color:var(--color-error-primary, #dc3e33)!important}.date-component .date-toggle.error .date-content.new-box-design{color:var(--color-error-primary, #dc3e33)!important}.date-component .date-content{flex:1;font-size:16px;text-align:left;height:18px;min-width:30px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap;transition:.3s}.date-component .date-content .date-placeholder{transition:.3s;color:var(--color-white-tint-6, #bebebe)}.date-component .date-content.new-box-design{color:var(--color-grey-shade-2, #828282)}.date-component .date-icon{width:24px;height:24px;background-color:var(--color-white-tint-6, #bebebe);transition:.3s}.date-component .date-icon.filled{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-menu{width:320px;background:transparent;position:absolute;z-index:10}.date-component .date-menu .date-modal{border-radius:8px;width:320px;overflow-y:auto;white-space:initial;background:#ffffff;box-shadow:0 2px 4px -1px #00000008,0 4px 5px #0000003d,0 1px 10px #0000001a}.date-component .date-menu .date-modal-extra-space{height:10px;margin:0 0 -10px;background:transparent}.date-component .date-menu .days-toolbar{display:flex;align-items:center;justify-content:space-between;padding:16px 34px}.date-component .date-menu .days-toolbar .material-icons{color:#333;font-size:20px;cursor:pointer;-webkit-user-select:none;user-select:none}.date-component .date-menu .days-toolbar .title{font-size:14px;font-weight:500;color:var(--color-grey-primary, #4f4f4f);cursor:pointer}.date-component .date-menu .days-container{border-bottom:1px solid #f2f2f2;padding:0 24px}.date-component .date-menu .days-container .week-days{display:flex;align-items:center;justify-content:space-between;font-size:14px;color:var(--color-grey-primary, #4f4f4f);font-weight:500;margin-bottom:8px;cursor:default}.date-component .date-menu .days-container .week-days .week-day{width:39px;text-align:center}.date-component .date-menu .days-container .day-row{display:flex;align-items:center;justify-content:space-between;font-size:14px;font-weight:400;color:var(--color-grey-primary, #4f4f4f)}.date-component .date-menu .days-container .day-row .day-item{position:relative;width:39px;height:39px;display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:4px}.date-component .date-menu .days-container .day-row .day-item .highlight-icon{position:absolute;right:0;height:14px;width:14px;background-color:#5cbb3a}.date-component .date-menu .days-container .day-row .day-item:hover{background:var(--color-blue-tint-1, #f4f9fd);color:var(--color-blue-primary, #2188d9)}.date-component .date-menu .days-container .day-row .day-item.selected{background:var(--color-primary, #2188d9);color:#fff}.date-component .date-menu .days-container .day-row .day-item.selected .highlight-icon{background-color:#fff}.date-component .date-menu .days-container .day-row .day-item.ousideRange{color:#b8b9bc}.date-component .date-menu .days-container .day-row .day-item.disabledDay{color:#b8b9bc;cursor:not-allowed!important}.date-component .time-container{display:flex;padding:16px 24px;justify-content:space-between;border-bottom:1px solid #f2f2f2;align-items:center}.date-component .time-container .time-lbl{font-weight:500;font-size:14px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap}.date-component .time-container .time-picker{display:flex;align-items:center;gap:7px}.date-component .time-container .time-picker .input-wrapper{display:flex;flex-direction:column;align-items:center}.date-component .time-container .time-picker .input-wrapper zen-icon{background-color:var(--color-white-tint-4, #d6d6d8);width:16px;height:16px;cursor:pointer}.date-component .time-container .time-picker .input-wrapper input{width:30px;height:25px;text-align:center;border:1px solid var(--color-white-tint-1, #f2f2f2);font-weight:400;font-size:14px;color:var(--color-grey-primary, #4f4f4f);border-radius:2px}.date-component .time-container .time-picker .input-wrapper input:focus{outline:none;border-color:var(--color-blue-primary, #2188d9)}.date-component .time-container .time-picker .am-pm-picker{font-weight:400;font-size:14px;padding-top:18px;cursor:pointer}.date-component .time-container .time-picker .am-pm-picker .main{color:var(--color-grey-primary, #4f4f4f)}.date-component .time-container .time-picker .am-pm-picker .sub{color:var(--color-white-tint-4, #d6d6d8)}.date-component .hint{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:16px 24px;border-bottom:1px solid #ECECED;font-style:normal;font-weight:400;font-size:14px;line-height:130%;color:#4f4f4f}.date-component .hint .hint-date{cursor:pointer;text-decoration-line:underline}.date-component .footer{display:flex;justify-content:end;gap:16px;padding:16px 24px}.date-component .month-picker{position:absolute;inset:0;background:white}.date-component .month-picker .months-container{display:flex;flex-wrap:wrap;justify-content:space-between;padding:10px 20px}.date-component .month-picker .months-container .month-item{display:inline-flex;align-items:center;justify-content:center;height:50px;width:30%;cursor:pointer;color:var(--color-grey-shade-2, #828282);border-radius:4px}.date-component .month-picker .months-container .month-item:hover{color:#fff;background-color:var(--color-blue-primary, #2188d9)}.date-component .right{right:0}.date-component .bottom{bottom:42px}\n"] }]
|
|
395
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { date: [{
|
|
396
|
+
type: Input
|
|
397
|
+
}], dateChange: [{
|
|
398
|
+
type: Output
|
|
399
|
+
}], showTime: [{
|
|
400
|
+
type: Input
|
|
401
|
+
}], showDate: [{
|
|
402
|
+
type: Input
|
|
403
|
+
}], containerClass: [{
|
|
404
|
+
type: Input
|
|
405
|
+
}], minDate: [{
|
|
406
|
+
type: Input
|
|
407
|
+
}], maxDate: [{
|
|
408
|
+
type: Input
|
|
409
|
+
}], boxDesign: [{
|
|
410
|
+
type: Input
|
|
411
|
+
}], highlightDays: [{
|
|
412
|
+
type: Input
|
|
413
|
+
}], autoConfirm: [{
|
|
414
|
+
type: Input
|
|
415
|
+
}], hint: [{
|
|
416
|
+
type: Input
|
|
417
|
+
}], highlightError: [{
|
|
418
|
+
type: Input
|
|
419
|
+
}], disabled: [{
|
|
420
|
+
type: Input
|
|
421
|
+
}], readonly: [{
|
|
422
|
+
type: Input
|
|
423
|
+
}], xPosition: [{
|
|
424
|
+
type: Input
|
|
425
|
+
}], yPosition: [{
|
|
426
|
+
type: Input
|
|
427
|
+
}], outsideHandling: [{
|
|
428
|
+
type: HostListener,
|
|
429
|
+
args: ['window:mousedown', ['$event']]
|
|
430
|
+
}], scroll: [{
|
|
431
|
+
type: HostListener,
|
|
432
|
+
args: ['window:scroll', []]
|
|
433
|
+
}] } });
|
|
434
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy16ZW5kdWl0L3NyYy9saWIvZGF0ZXBpY2tlci96ZW5kdS1kYXRlcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9kYXRlcGlja2VyL3plbmR1LWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sTUFBTSxNQUFNLGVBQWUsQ0FBQztBQUduQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7O0FBRW5ELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFPM0IsTUFBTSxPQUFPLHdCQUF3QjtJQTBFbkMsWUFDVSxRQUFvQjtRQUFwQixhQUFRLEdBQVIsUUFBUSxDQUFZO1FBcEU5Qjs7V0FFRztRQUNPLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXZDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsYUFBUSxHQUFHLElBQUksQ0FBQztRQVFoQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBRTNCLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBRTdCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBSXRDOztXQUVHO1FBQ00sbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFaEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFCLGNBQVMsR0FBd0IsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1FBRTFELGNBQVMsR0FBd0IsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1FBRTVELGlCQUFZLEdBQWdDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFOUQsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFFeEIsWUFBTyxHQUFxQyxFQUFFLENBQUM7UUFFL0MsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVmLGFBQVEsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXZELGdCQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUV6QixTQUFJLEdBQUcsWUFBWSxDQUFDO1FBRXBCLFFBQUcsR0FBRyxhQUFhLENBQUM7UUFFcEIsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUliLFdBQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFOUYsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUVwQyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFFMUMsVUFBSyxHQUFZLEtBQUssQ0FBQztRQUN2QixXQUFNLEdBQVksS0FBSyxDQUFDO0lBSXBCLENBQUM7SUFJTCxlQUFlLENBQUMsS0FBSztRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pDLHlCQUF5QjtZQUN6QixPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdEQsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBQ3ZCLENBQUM7SUFHRCxNQUFNO1FBQ0osSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDdkMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdEMsSUFBSSxDQUFDLFlBQVksR0FBRztnQkFDbEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO2dCQUM3QixHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7YUFDakMsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLG1CQUFtQixDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUU7WUFDakgsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7U0FDbkI7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssbUJBQW1CLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLG1CQUFtQixDQUFDLEdBQUcsRUFBRTtZQUM5RyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNwQjtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7WUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7U0FDbkI7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssbUJBQW1CLENBQUMsR0FBRyxFQUFFO1lBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNsQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtZQUN0QixPQUFPLG1CQUFtQixDQUFDLEdBQUcsQ0FBQTtTQUMvQjthQUNJO1lBQ0gsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssMEJBQTBCO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ2hDLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3RCLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDO1NBQ2pDO2FBQ0k7WUFDSCxPQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQztTQUNsQztJQUNILENBQUM7SUFHTSxZQUFZO1FBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRTFCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUUsSUFBSSxDQUFDLElBQUksQ0FBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFM0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHO2dCQUNsQixFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQzdCLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTthQUNqQyxDQUFDO1lBRUgsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNiLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUV0RCxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbEM7U0FDRDtRQUVELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUV6QixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7U0FDL0I7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RGLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTlFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVyQyxPQUFPLE9BQU8sSUFBSSxHQUFHLEVBQUU7WUFDckIsTUFBTSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBcUIsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBRWhDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxJQUFJLEVBQUU7b0JBQ1IsVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO3dCQUN4QyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUNuQztnQkFFRCxJQUFJLFNBQVMsR0FBRyxZQUFZLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUVoRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBRXZCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDbkQsVUFBVSxHQUFHLElBQUksQ0FBQztpQkFDbkI7cUJBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUMxRCxVQUFVLEdBQUcsSUFBSSxDQUFDO2lCQUNuQjtnQkFFRCxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBRTFCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtvQkFDbkQsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEU7Z0JBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1osSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUU7b0JBQ3RCLEdBQUcsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO29CQUN0QyxTQUFTLEVBQUUsU0FBUztvQkFDcEIsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFVBQVUsRUFBRSxVQUFVO29CQUN0QixhQUFhLEVBQUUsYUFBYTtpQkFDN0IsQ0FBQyxDQUFDO2dCQUVILE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN6QztTQUNGO0lBQ0gsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6RSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU0sYUFBYTtRQUNsQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTSxTQUFTLENBQUMsR0FBa0I7UUFDakMsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ2xCLGtCQUFrQjtZQUNsQixPQUFPO1NBQ1I7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3RHO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNkO1NBQ0Y7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxLQUFhO1FBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxVQUFVLENBQUMsSUFBWTtRQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBR00sV0FBVztRQUNoQixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE9BQU87U0FDUjtRQUVELElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFekIsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV2QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFMUUsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNoQixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtTQUNwQixDQUFDO1FBRUYsc0hBQXNIO1FBQ3RILGlGQUFpRjtRQUNqRixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQy9HO2FBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNoRztRQUVELFNBQVM7UUFDVCxJQUFJLElBQUksR0FBRyxFQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7U0FDeEI7YUFDSTtZQUNILElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztTQUN2QjtRQUVELElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRTtZQUNaLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztTQUN0QjthQUNJO1lBQ0gsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzdELE9BQU8sT0FBTyxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDdEQsMkNBQTJDO1lBQzNDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUNyRDtRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sVUFBVTtRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFTSxjQUFjO1FBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLEVBQUUsQ0FBQztRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sUUFBUTtRQUNiLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLEVBQUUsQ0FBQztRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZCxPQUFPO1NBQ1I7UUFDRCxHQUFHLEVBQUUsQ0FBQztRQUNOLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZCxPQUFPO1NBQ1I7UUFDRCxHQUFHLEVBQUUsQ0FBQztRQUNOLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUssSUFBSSxDQUFDLFVBQVUsRUFBRztZQUNyQixxR0FBcUc7WUFDckcsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssYUFBYSxFQUFFO2dCQUM3RSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDcEI7WUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUUsQ0FBQztTQUN6QztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQztRQUN6QixJQUFJLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRU0sT0FBTztRQUNaLG1DQUFtQztRQUNuQyxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUTtnQkFDakMsY0FBYztnQkFDZCxPQUFPLGtDQUFrQyxDQUFDO1lBQzVDLEtBQUssSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUNsQyxZQUFZO2dCQUNaLE9BQU8sc0NBQXNDLENBQUM7WUFDaEQsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQ2xDLFlBQVk7Z0JBQ1osT0FBTyxrQ0FBa0MsQ0FBQztZQUM1QztnQkFDRSxPQUFPLGtDQUFrQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUFVO1FBQzlCLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUN4QixHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtTQUM1QixDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNkO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7O3NIQXhlVSx3QkFBd0I7MEdBQXhCLHdCQUF3Qix1a0JDZHJDLHV4UkFnTkE7NEZEbE1hLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSxnQkFBZ0I7aUdBU2pCLElBQUk7c0JBQVosS0FBSztnQkFLSSxVQUFVO3NCQUFuQixNQUFNO2dCQUVFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUtHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkF1Q04sZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWE1QyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50L21vbWVudCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyRGF5IH0gZnJvbSAnLi9kYXRlLXBpY2tlci1kYXknO1xuaW1wb3J0IHsgRGF0ZVBpY2tlckhpbnQgfSBmcm9tIFwiLi9kYXRlLXBpY2tlci1oaW50XCI7XG5pbXBvcnQgeyBEQVRFUElDS0VSX1BPU0lUSU9OIH0gZnJvbSAnLi9kYXRlcGlja2VyJztcblxuY29uc3QgZGVmYXVsdEhvdXJzID0gJzEyJztcbmNvbnN0IGRlZmF1bHRNaW51dHMgPSAnMDAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd6ZW4tZGF0ZXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi96ZW5kdS1kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vemVuZHUtZGF0ZXBpY2tlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFplbmR1RGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBwcm9wZXJ0eVxuICAgKi9cbiAgQElucHV0KCkgZGF0ZTogRGF0ZTtcblxuICAvKipcbiAgICogY2FsbGJhY2sgdG8gZW1pdCBjaGFuZ2VzIGZvciBwYXJlbnQgY29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KCkgZGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcblxuICBASW5wdXQoKSBzaG93VGltZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNob3dEYXRlID0gdHJ1ZTtcblxuICBASW5wdXQoKSBjb250YWluZXJDbGFzczogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGU7XG5cbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcblxuICBASW5wdXQoKSBib3hEZXNpZ246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBoaWdobGlnaHREYXlzOiBudW1iZXJbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGF1dG9Db25maXJtOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgaGludDogRGF0ZVBpY2tlckhpbnQ7XG5cbiAgLyoqXG4gICAqIGRhdGVwaWNrZXIgc3RhdGVzXG4gICAqL1xuICBASW5wdXQoKSBoaWdobGlnaHRFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSB4UG9zaXRpb246IERBVEVQSUNLRVJfUE9TSVRJT04gPSBEQVRFUElDS0VSX1BPU0lUSU9OLkFVVE87XG5cbiAgQElucHV0KCkgeVBvc2l0aW9uOiBEQVRFUElDS0VSX1BPU0lUSU9OID0gREFURVBJQ0tFUl9QT1NJVElPTi5BVVRPO1xuXG4gIHB1YmxpYyBzZWxlY3RlZFRpbWU6IHsgSHI6IG51bWJlciwgTWluOiBudW1iZXIgfSA9IHsgSHI6IDEsIE1pbjogMCB9O1xuXG4gIHB1YmxpYyBpc1BpY2tlclZpc2libGUgPSBmYWxzZTtcblxuICBwdWJsaWMgZGF5Um93czogQXJyYXk8eyBkYXlzOiBEYXRlUGlja2VyRGF5W10gfT4gPSBbXTtcblxuICBwdWJsaWMgZGF5c1RpdGxlID0gXCJcIjtcblxuICBwdWJsaWMgd2Vla0RheXMgPSBbXCJNb1wiLCBcIlR1XCIsIFwiV2VcIiwgXCJUaFwiLCBcIkZyaVwiLCBcIlNhXCIsIFwiU3VcIl07XG5cbiAgcHVibGljIGN1cnJlbnRTbG90ID0gbmV3IERhdGUoKTtcblxuICBwdWJsaWMgaG91ciA9IGRlZmF1bHRIb3VycztcblxuICBwdWJsaWMgbWluID0gZGVmYXVsdE1pbnV0cztcblxuICBwdWJsaWMgaXNQTSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBfZGF0ZVRvU2V0OiBEYXRlO1xuXG4gIHB1YmxpYyBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbiAgcHVibGljIHllYXJzID0gW107XG5cbiAgcHVibGljIG1vbnRoUGlja2VyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyB5ZWFyUGlja2VyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHJpZ2h0OiBib29sZWFuID0gZmFsc2U7XG4gIGJvdHRvbTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWZcbiAgKSB7IH1cblxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBvdXRzaWRlSGFuZGxpbmcoZXZlbnQpIHtcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgLy8gZWxlbWVudCBub3QgaW4gdGhlIERPTVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oaWRlVGltZVBpY2tlcigpXG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgW10pXG4gIHNjcm9sbCgpIHtcbiAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCgpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRlKSB7XG4gICAgICB0aGlzLl9kYXRlVG9TZXQgPSBuZXcgRGF0ZSh0aGlzLmRhdGUpO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkVGltZSA9IHtcbiAgICAgICAgSHI6IG1vbWVudCh0aGlzLmRhdGUpLmhvdXJzKCksXG4gICAgICAgIE1pbjogbW9tZW50KHRoaXMuZGF0ZSkubWludXRlcygpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQbGFjZW1lbnQoKSB7XG4gICAgdGhpcy5yaWdodCA9IGZhbHNlO1xuICAgIHRoaXMuYm90dG9tID0gZmFsc2U7XG4gICAgaWYgKHRoaXMueFBvc2l0aW9uID09PSBEQVRFUElDS0VSX1BPU0lUSU9OLkFVVE8gJiYgdGhpcy5nZXRIb3Jpem9udGFsTWVudURpcmVjdGlvbigpID09PSBEQVRFUElDS0VSX1BPU0lUSU9OLkxFRlQpIHtcbiAgICAgIHRoaXMucmlnaHQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy55UG9zaXRpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uQVVUTyAmJiB0aGlzLmdldFZlcnRpY2FsTWVudURpcmVjdGlvbigpID09PSBEQVRFUElDS0VSX1BPU0lUSU9OLlRPUCkge1xuICAgICAgdGhpcy5ib3R0b20gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy54UG9zaXRpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uUklHSFQpIHtcbiAgICAgIHRoaXMucmlnaHQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy55UG9zaXRpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uVE9QKSB7XG4gICAgICB0aGlzLmJvdHRvbSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZXJ0aWNhbE1lbnVEaXJlY3Rpb24oKTogREFURVBJQ0tFUl9QT1NJVElPTiB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB0b3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICBjb25zdCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgaWYgKHRvcCA+IChoZWlnaHQgLyAyKSkge1xuICAgICAgcmV0dXJuIERBVEVQSUNLRVJfUE9TSVRJT04uVE9QXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIERBVEVQSUNLRVJfUE9TSVRJT04uQk9UVE9NO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGdldCBkYXRlcGlja2VyIHBvc2l0aW9uXG4gICAqIEByZXR1cm5zIGVpdGhlciBcImxlZnRcIiBvciBcInJpZ2h0XCJcbiAgICovXG4gIHByaXZhdGUgZ2V0SG9yaXpvbnRhbE1lbnVEaXJlY3Rpb24oKTogREFURVBJQ0tFUl9QT1NJVElPTiB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBsZWZ0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgaWYgKGxlZnQgPiAod2lkdGggLyAyKSkge1xuICAgICAgcmV0dXJuIERBVEVQSUNLRVJfUE9TSVRJT04uTEVGVDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gREFURVBJQ0tFUl9QT1NJVElPTi5SSUdIVDtcbiAgICB9XG4gIH1cblxuXG4gIHB1YmxpYyB0b2dnbGVQaWNrZXIoKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIHRoaXMuX2RhdGVUb1NldCA9IHRoaXMuZGF0ZSA/IG5ldyBEYXRlKCB0aGlzLmRhdGUgKSA6IG51bGw7XG5cbiAgICB0aGlzLmlzUGlja2VyVmlzaWJsZSA9ICF0aGlzLmlzUGlja2VyVmlzaWJsZTtcbiAgICBpZiAodGhpcy5zaG93RGF0ZSkge1xuICAgICAgdGhpcy5jdXJyZW50U2xvdCA9IHRoaXMuX2RhdGVUb1NldCB8fCBuZXcgRGF0ZSgpO1xuICAgICAgdGhpcy51cGRhdGVEYXlzKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZSA9IHtcbiAgICAgICAgSHI6IG1vbWVudCh0aGlzLmRhdGUpLmhvdXJzKCksXG4gICAgICAgIE1pbjogbW9tZW50KHRoaXMuZGF0ZSkubWludXRlcygpXG4gICAgICB9O1xuXG4gICAgIGlmICh0aGlzLmRhdGUpIHtcbiAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSBtb21lbnQodGhpcy5kYXRlKS5mb3JtYXQoJ2hoOm1tIEEnKTtcblxuICAgICAgIHRoaXMuaXNQTSA9IGZvcm1hdHRlZC5pbmNsdWRlcygnUE0nKTtcbiAgICAgICB0aGlzLmhvdXIgPSBmb3JtYXR0ZWQuc2xpY2UoMCwgMik7XG4gICAgICAgdGhpcy5taW4gPSBmb3JtYXR0ZWQuc2xpY2UoMywgNSk7XG4gICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCgpO1xuXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURheXMoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTbG90KSB7XG4gICAgICB0aGlzLmN1cnJlbnRTbG90ID0gbmV3IERhdGUoKTtcbiAgICB9XG4gICAgdGhpcy5kYXlzVGl0bGUgPSBtb21lbnQodGhpcy5jdXJyZW50U2xvdCkuZm9ybWF0KFwiTU1NIHl5eXlcIik7XG4gICAgdGhpcy5kYXlSb3dzID0gW107XG4gICAgbGV0IGN1cnJlbnQgPSBtb21lbnQodGhpcy5jdXJyZW50U2xvdCkuc3RhcnRPZihcIm1vbnRoXCIpLnN0YXJ0T2YoXCJ3ZWVrXCIpLmFkZCgxLCBcImRheVwiKTtcbiAgICBsZXQgZW5kID0gbW9tZW50KHRoaXMuY3VycmVudFNsb3QpLmVuZE9mKFwibW9udGhcIikuZW5kT2YoXCJ3ZWVrXCIpLmFkZCgxLCBcImRheVwiKTtcblxuICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IG1vbWVudCh0aGlzLmN1cnJlbnRTbG90KS5tb250aCgpO1xuXG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudCh0aGlzLl9kYXRlVG9TZXQpO1xuXG4gICAgd2hpbGUgKGN1cnJlbnQgPD0gZW5kKSB7XG4gICAgICBjb25zdCByb3cgPSB7IGRheXM6IFtdIGFzIERhdGVQaWNrZXJEYXlbXSB9O1xuICAgICAgdGhpcy5kYXlSb3dzLnB1c2gocm93KTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IDc7IGlkeCsrKSB7XG5cbiAgICAgICAgbGV0IGlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICBpc1NlbGVjdGVkID0gY3VycmVudC5kYXRlKCkgPT0gZGF0ZS5kYXRlKCkgJiZcbiAgICAgICAgICAgIGRhdGUubW9udGgoKSA9PSBjdXJyZW50Lm1vbnRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNPdXRzaWRlID0gY3VycmVudE1vbnRoICE9IGN1cnJlbnQubW9udGgoKTtcblxuICAgICAgICBsZXQgaXNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgY3VycmVudC50b0RhdGUoKSA8IHRoaXMubWluRGF0ZSkge1xuICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4RGF0ZSAmJiBjdXJyZW50LnRvRGF0ZSgpID4gdGhpcy5tYXhEYXRlKSB7XG4gICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNIaWdobGlnaHRlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodERheXMgJiYgdGhpcy5oaWdobGlnaHREYXlzLmxlbmd0aCkge1xuICAgICAgICAgIGlzSGlnaGxpZ2h0ZWQgPSB0aGlzLmhpZ2hsaWdodERheXMuaW5kZXhPZihjdXJyZW50LnZhbHVlT2YoKSkgPj0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdy5kYXlzLnB1c2goe1xuICAgICAgICAgIGRhdGU6IGN1cnJlbnQudG9EYXRlKCksXG4gICAgICAgICAgbGJsOiBtb21lbnQoY3VycmVudCkuZGF0ZSgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgaXNPdXRzaWRlOiBpc091dHNpZGUsXG4gICAgICAgICAgc2VsZWN0ZWQ6IGlzU2VsZWN0ZWQsXG4gICAgICAgICAgaXNEaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgICAgICBpc0hpZ2hsaWdodGVkOiBpc0hpZ2hsaWdodGVkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN1cnJlbnQgPSBtb21lbnQoY3VycmVudCkuYWRkKDEsIFwiZGF5XCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZXh0TW9udGgoKSB7XG4gICAgdGhpcy5jdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmN1cnJlbnRTbG90KS5hZGQoMSwgXCJtb250aFwiKS50b0RhdGUoKTtcbiAgICB0aGlzLnVwZGF0ZURheXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmV2TW9udGgoKSB7XG4gICAgdGhpcy5jdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmN1cnJlbnRTbG90KS5zdWJ0cmFjdCgxLCBcIm1vbnRoXCIpLnRvRGF0ZSgpO1xuICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICB9XG5cbiAgcHVibGljIG5leHRZZWFyKCkge1xuICAgIHRoaXMuY3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5jdXJyZW50U2xvdCkuYWRkKDEsIFwieWVhclwiKS50b0RhdGUoKTtcbiAgICB0aGlzLnVwZGF0ZURheXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmV2WWVhcigpIHtcbiAgICB0aGlzLmN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMuY3VycmVudFNsb3QpLnN1YnRyYWN0KDEsIFwieWVhclwiKS50b0RhdGUoKTtcbiAgICB0aGlzLnVwZGF0ZURheXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZXh0WWVhckdyb3VwKCkge1xuICAgIHRoaXMueWVhcnMgPSB0aGlzLnllYXJzLm1hcCh5ZWFyID0+IHllYXIgKyAxNSk7XG4gIH1cblxuICBwdWJsaWMgcHJldlllYXJHcm91cCgpIHtcbiAgICB0aGlzLnllYXJzID0gdGhpcy55ZWFycy5tYXAoeWVhciA9PiB5ZWFyIC0gMTUpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdERheShkYXk6IERhdGVQaWNrZXJEYXkpIHtcbiAgICBpZiAoZGF5LmlzRGlzYWJsZWQpIHtcbiAgICAgIC8vIGRheSBpcyBkaXNhYmxlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICB0aGlzLl9kYXRlVG9TZXQgPSBtb21lbnQoZGF5LmRhdGUpLmhvdXIodGhpcy5zZWxlY3RlZFRpbWUuSHIpLm1pbnV0ZSh0aGlzLnNlbGVjdGVkVGltZS5NaW4pLnRvRGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRlVG9TZXQgPSBuZXcgRGF0ZShkYXkuZGF0ZSk7XG5cbiAgICAgIGlmICh0aGlzLmF1dG9Db25maXJtKSB7XG4gICAgICAgIHRoaXMuYXBwbHkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZURheXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNb250aChtb250aDogbnVtYmVyKSB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFNsb3QpO1xuICAgIG5ld0RhdGUuc2V0TW9udGgobW9udGgpO1xuICAgIHRoaXMuY3VycmVudFNsb3QgPSBuZXdEYXRlO1xuICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICAgIHRoaXMubW9udGhQaWNrZXJWaXNpYmxlID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpIHtcbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy5jdXJyZW50U2xvdCk7XG4gICAgbmV3RGF0ZS5zZXRGdWxsWWVhcih5ZWFyKTtcbiAgICB0aGlzLmN1cnJlbnRTbG90ID0gbmV3RGF0ZTtcbiAgICB0aGlzLnVwZGF0ZURheXMoKTtcbiAgICB0aGlzLnllYXJQaWNrZXJWaXNpYmxlID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgaGlkZVRpbWVQaWNrZXIoKSB7XG4gICAgdGhpcy5pc1BpY2tlclZpc2libGUgPSBmYWxzZTtcbiAgfVxuXG5cbiAgcHVibGljIHRpbWVDaGFuZ2VkKCkge1xuICAgIGxldCBtaW4gPSBwYXJzZUludCh0aGlzLm1pbik7XG4gICAgbGV0IGhvdXIgPSBwYXJzZUludCh0aGlzLmhvdXIpO1xuICAgIGlmIChpc05hTihob3VyKSB8fCBpc05hTihtaW4pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaG91ciA9IE1hdGgubWluKGhvdXIsIDEyKTtcbiAgICBob3VyID0gTWF0aC5tYXgoaG91ciwgMSk7XG5cbiAgICBtaW4gPSBNYXRoLm1pbihtaW4sIDU5KTtcbiAgICBtaW4gPSBNYXRoLm1heChtaW4sIDApO1xuXG4gICAgY29uc3QgdGltZSA9IG1vbWVudChgJHtob3VyfSAke21pbn0gJHt0aGlzLmlzUE0gPyBcInBtXCIgOiBcImFtXCJ9YCwgXCJoOm0gYVwiKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0ge1xuICAgICAgSHI6IHRpbWUuaG91cnMoKSxcbiAgICAgIE1pbjogdGltZS5taW51dGVzKClcbiAgICB9O1xuXG4gICAgLy8gYWRkZWQgYmVsb3cgY29uZGl0aW9uIGJlY2F1c2Ugd2UgY2FuIHNlbGVjdCB0aGUgdGltZSB3aXRob3V0IGRhdGUsIGFuZCBpdCB3YXMgc2hvd2luZyBpbnZhbGlkIGRhdGUgaW4gdGhlIGlucHV0IGJveFxuICAgIC8vIHNlY29uZCBjb25kaXRpb24gaXMgcmVxdWlyZWQgdG8gZGlzYWJsZSBhcHBseSBidXR0b24gd2hlbiBkYXRlIGlzIG5vdCBzZWxlY3RlZFxuICAgIGlmICh0aGlzLl9kYXRlVG9TZXQpIHtcbiAgICAgICAgdGhpcy5fZGF0ZVRvU2V0ID0gbW9tZW50KHRoaXMuX2RhdGVUb1NldCkuaG91cih0aGlzLnNlbGVjdGVkVGltZS5IcikubWludXRlKHRoaXMuc2VsZWN0ZWRUaW1lLk1pbikudG9EYXRlKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5zaG93RGF0ZSkge1xuICAgICAgICB0aGlzLl9kYXRlVG9TZXQgPSBtb21lbnQoKS5ob3VyKHRoaXMuc2VsZWN0ZWRUaW1lLkhyKS5taW51dGUodGhpcy5zZWxlY3RlZFRpbWUuTWluKS50b0RhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBmb3JtYXRcbiAgICBpZiAoaG91ciA8IDEwKSB7XG4gICAgICB0aGlzLmhvdXIgPSBgMCR7aG91cn1gO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaG91ciA9IGAke2hvdXJ9YDtcbiAgICB9XG5cbiAgICBpZiAobWluIDwgMTApIHtcbiAgICAgIHRoaXMubWluID0gYDAke21pbn1gO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMubWluID0gYCR7bWlufWA7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvcm1hdHRlZERhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGUpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJveERlc2lnbiAmJiBtb21lbnQodGhpcy5kYXRlKS5pc1NhbWUobW9tZW50KCksIFwiZGF5XCIpKSB7XG4gICAgICAgIHJldHVybiAnVG9kYXknO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3dEYXRlICYmICF0aGlzLnNob3dUaW1lICYmICF0aGlzLmJveERlc2lnbikge1xuICAgICAgLy8gRXhwYW5kZWQgZm9ybWF0dGluZyBmb3IgZGF0ZSBvbmx5IHBpY2tlclxuICAgICAgcmV0dXJuIG1vbWVudCh0aGlzLmRhdGUpLmZvcm1hdChcImRkZCwgREQgTU1NIFlZWVlcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudCh0aGlzLmRhdGUpLmZvcm1hdChcIk1NTSBERCwgWVlcIik7XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0dGVkVGltZSgpIHtcbiAgICBpZiAoIXRoaXMuZGF0ZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHJldHVybiBtb21lbnQodGhpcy5kYXRlKS5mb3JtYXQoXCJoOm1tIEFcIik7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlVGltZSgpIHtcbiAgICB0aGlzLmlzUE0gPSAhdGhpcy5pc1BNO1xuICAgIHRoaXMudGltZUNoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93TW9udGhQaWNrZXIoKSB7XG4gICAgdGhpcy5tb250aFBpY2tlclZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIHNob3dZZWFyUGlja2VyKCkge1xuICAgIHRoaXMueWVhclBpY2tlclZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMueWVhcnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5jdXJyZW50U2xvdC5nZXRGdWxsWWVhcigpIC0gNzsgaSA8IHRoaXMuY3VycmVudFNsb3QuZ2V0RnVsbFllYXIoKSArIDg7IGkrKykge1xuICAgICAgdGhpcy55ZWFycy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBob3VyVXAoKSB7XG4gICAgbGV0IGhvdXIgPSBwYXJzZUludCh0aGlzLmhvdXIpO1xuICAgIGlmIChpc05hTihob3VyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBob3VyKys7XG4gICAgdGhpcy5ob3VyID0gaG91ci50b1N0cmluZygpO1xuICAgIHRoaXMudGltZUNoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBob3VyRG93bigpIHtcbiAgICBsZXQgaG91ciA9IHBhcnNlSW50KHRoaXMuaG91cik7XG4gICAgaWYgKGlzTmFOKGhvdXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhvdXItLTtcbiAgICB0aGlzLmhvdXIgPSBob3VyLnRvU3RyaW5nKCk7XG4gICAgdGhpcy50aW1lQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHVibGljIG1pblVwKCkge1xuICAgIGxldCBtaW4gPSBwYXJzZUludCh0aGlzLm1pbik7XG4gICAgaWYgKGlzTmFOKG1pbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbWluKys7XG4gICAgdGhpcy5taW4gPSBtaW4udG9TdHJpbmcoKTtcbiAgICB0aGlzLnRpbWVDaGFuZ2VkKCk7XG4gIH1cblxuICBwdWJsaWMgbWluRG93bigpIHtcbiAgICBsZXQgbWluID0gcGFyc2VJbnQodGhpcy5taW4pO1xuICAgIGlmIChpc05hTihtaW4pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1pbi0tO1xuICAgIHRoaXMubWluID0gbWluLnRvU3RyaW5nKCk7XG4gICAgdGhpcy50aW1lQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5KCkge1xuICAgIGlmICggdGhpcy5fZGF0ZVRvU2V0ICkge1xuICAgICAgLy8gSWYgdGltZSBzZWxlY3Rpb24gaGFzIGVuYWJsZWQgYW5kIHVzZXIga2VlcHMgZGVmYXVsdCB0aW1lIHRoZW4gdHJpZ2dlcmluZyB0aGUgdGltZUNoYW5nZWQgZnVuY3Rpb25cbiAgICAgIGlmICh0aGlzLnNob3dUaW1lICYmIHRoaXMuaG91ciA9PT0gZGVmYXVsdEhvdXJzICYmIHRoaXMubWluID09PSBkZWZhdWx0TWludXRzKSB7XG4gICAgICAgIHRoaXMudGltZUNoYW5nZWQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRlID0gbmV3IERhdGUoIHRoaXMuX2RhdGVUb1NldCApO1xuICAgIH1cbiAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCh0aGlzLmRhdGUpO1xuICAgIHRoaXMuaGlkZVRpbWVQaWNrZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWwoKSB7XG4gICAgdGhpcy5oaWRlVGltZVBpY2tlcigpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuX2RhdGVUb1NldCA9IG51bGw7XG4gICAgdGhpcy5ob3VyID0gZGVmYXVsdEhvdXJzO1xuICAgIHRoaXMubWluID0gZGVmYXVsdE1pbnV0cztcbiAgICB0aGlzLmRhdGUgPSBudWxsO1xuICAgIHRoaXMuYXBwbHkoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJY29uKCkge1xuICAgIC8vIENoYW5nZSBwaWNrZXIgaWNvbiBiYXNlZCBvbiBtb2RlXG4gICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICBjYXNlIHRoaXMuc2hvd0RhdGUgJiYgdGhpcy5zaG93VGltZTpcbiAgICAgICAgLy8gRGF0ZSArIFRpbWVcbiAgICAgICAgcmV0dXJuICdhc3NldHMvbmctemVuZHVpdC9pY29ucy9kYXRlLnN2Zyc7XG4gICAgICBjYXNlIHRoaXMuc2hvd0RhdGUgJiYgIXRoaXMuc2hvd1RpbWU6XG4gICAgICAgIC8vIERhdGUgb25seVxuICAgICAgICByZXR1cm4gJ2Fzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2NhbGVuZGFyLnN2Zyc7XG4gICAgICBjYXNlICF0aGlzLnNob3dEYXRlICYmIHRoaXMuc2hvd1RpbWU6XG4gICAgICAgIC8vIFRpbWUgb25seVxuICAgICAgICByZXR1cm4gJ2Fzc2V0cy9uZy16ZW5kdWl0L2ljb25zL3RpbWUuc3ZnJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvZGF0ZS5zdmcnO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RIaW50RGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGhpbnQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRlVG9TZXQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICB0aGlzLnNlbGVjdGVkVGltZSA9IHtcbiAgICAgIEhyOiBtb21lbnQoZGF0ZSkuaG91cnMoKSxcbiAgICAgIE1pbjogbW9tZW50KGRhdGUpLm1pbnV0ZXMoKVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5hdXRvQ29uZmlybSkge1xuICAgICAgdGhpcy5hcHBseSgpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZS1jb21wb25lbnRcIj5cbiAgICA8IS0tIE1hdGVyaWFsIGRlc2lnbiBkYXRlcGlja2VyIHRvZ2dsZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWJveERlc2lnblwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGF0ZS10b2dnbGVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBpY2tlcigpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGlzUGlja2VyVmlzaWJsZSwnZXJyb3InOiBoaWdobGlnaHRFcnJvciwncmVhZG9ubHknOiByZWFkb25seX1cIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDwhLS0gZGF0ZSBwbGFjZWhvbGRlciAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIFNlbGVjdCBEYXRlXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdGVkIGRhdGV0aW1lIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0RhdGVcIj57e2Zvcm1hdHRlZERhdGUoKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dUaW1lXCI+Jm5ic3A7e3tmb3JtYXR0ZWRUaW1lKCl9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIERhdGVwaWNrZXIgaWNvbiwgZGVwZW5kcyBvbiBwaWNrZXIgdHlwZSAtLT5cbiAgICAgICAgICAgIDx6ZW4taWNvbiBjbGFzcz1cImRhdGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJnZXRJY29uKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmlsbGVkJzogZGF0ZX1cIj5cbiAgICAgICAgICAgIDwvemVuLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBCb3ggZGVzaWduIGRhdGVwaWNrZXIgdG9nZ2xlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJib3hEZXNpZ25cIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRhdGUtdG9nZ2xlIG5ldy1ib3gtZGVzaWduXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQaWNrZXIoKVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBpc1BpY2tlclZpc2libGUsJ2Vycm9yJzogaGlnaGxpZ2h0RXJyb3IsJ3JlYWRvbmx5JzogcmVhZG9ubHl9XCI+XG5cbiAgICAgICAgICAgIDwhLS0gRGF0ZXBpY2tlciBpY29uLCBkZXBlbmRzIG9uIHBpY2tlciB0eXBlIC0tPlxuICAgICAgICAgICAgPHplbi1pY29uIGNsYXNzPVwiZGF0ZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImdldEljb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmaWxsZWQnOiBkYXRlfVwiPlxuICAgICAgICAgICAgPC96ZW4taWNvbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtY29udGVudCBuZXctYm94LWRlc2lnblwiPlxuICAgICAgICAgICAgICAgIDwhLS0gZGF0ZSBwbGFjZWhvbGRlciAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIFNlbGVjdCBEYXRlXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdGVkIGRhdGV0aW1lIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0RhdGVcIj57e2Zvcm1hdHRlZERhdGUoKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dUaW1lXCI+Jm5ic3A7e3tmb3JtYXR0ZWRUaW1lKCl9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRGF0ZXBpY2tlciBwb3B1cCAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNQaWNrZXJWaXNpYmxlXCJcbiAgICAgICAgIGNsYXNzPVwiZGF0ZS1tZW51XCJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3JpZ2h0JzogcmlnaHQsICdib3R0b20nOiBib3R0b20gfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1tb2RhbFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dEYXRlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheXMtdG9vbGJhclwiPlxuICAgICAgICAgICAgICAgICAgICA8aSAoY2xpY2spPVwicHJldk1vbnRoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+bmF2aWdhdGVfYmVmb3JlPC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dNb250aFBpY2tlcigpXCI+e3tkYXlzVGl0bGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGkgKGNsaWNrKT1cIm5leHRNb250aCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPm5hdmlnYXRlX25leHQ8L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrLWRheXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHdlZWtEYXkgb2Ygd2Vla0RheXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIndlZWstZGF5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3t3ZWVrRGF5fX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGRheVJvd3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF5LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZGF5IG9mIHJvdy5kYXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERheShkYXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkYXktaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vdXNpZGVSYW5nZV09XCJkYXkuaXNPdXRzaWRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImRheS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZERheV09XCJkYXkuaXNEaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZGF5LmxibH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uICpuZ0lmPVwiZGF5LmlzSGlnaGxpZ2h0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZ2hsaWdodC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvcGxheS5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGltZVwiXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1jb250YWluZXJcIj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWxibFwiPlxuICAgICAgICAgICAgICAgICAgICBTZWxlY3QgVGltZTpcbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uIChjbGljayk9XCJob3VyVXAoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctdXAtc21hbGwuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImhvdXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRpbWVDaGFuZ2VkKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uIChjbGljayk9XCJob3VyRG93bigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy1kb3duLXNtYWxsLnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gKGNsaWNrKT1cIm1pblVwKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LXVwLXNtYWxsLnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJtaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRpbWVDaGFuZ2VkKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uIChjbGljayk9XCJtaW5Eb3duKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LWRvd24tc21hbGwuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbS1wbS1waWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVRpbWUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXNQTSA/ICdQTScgOiAnQU0nfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1YlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVUaW1lKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2lzUE0gPyAnQU0nIDogJ1BNJ319XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhpbnRcIlxuICAgICAgICAgICAgICAgICAqbmdJZj1cImhpbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGludC1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICB7e2hpbnQuZGVzY3JpcHRpb259fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaW50LWRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEhpbnREYXRlKGhpbnQuZGF0ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAge3toaW50Lm1hc2tUZXh0fX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYXV0b0NvbmZpcm0gfHwgc2hvd1RpbWVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1zdHJva2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIENsZWFyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1zdHJva2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cIiFfZGF0ZVRvU2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uLWZsYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgQXBwbHlcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9udGhQaWNrZXJWaXNpYmxlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXBpY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5cy10b29sYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSAoY2xpY2spPVwicHJldlllYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+bmF2aWdhdGVfYmVmb3JlPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1llYXJQaWNrZXIoKVwiPnt7IGN1cnJlbnRTbG90IHwgZGF0ZTogJ3l5eXknIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKGNsaWNrKT1cIm5leHRZZWFyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPm5hdmlnYXRlX25leHQ8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGhzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhzOyBpbmRleCBhcyBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNb250aChpbmRleClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtb250aCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ5ZWFyUGlja2VyVmlzaWJsZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1waWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheXMtdG9vbGJhclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKGNsaWNrKT1cInByZXZZZWFyR3JvdXAoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+bmF2aWdhdGVfYmVmb3JlPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1llYXJQaWNrZXIoKVwiPnt7IGN1cnJlbnRTbG90IHwgZGF0ZTogJ3l5eXknIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKGNsaWNrKT1cIm5leHRZZWFyR3JvdXAoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+bmF2aWdhdGVfbmV4dDwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aHMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFllYXIoeWVhcilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLW1vZGFsLWV4dHJhLXNwYWNlXCI+PC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|