@up_si_vale/sivale-componentes-angular 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/atoms/button/button.component.mjs +55 -0
- package/esm2022/lib/atoms/checkbox/checkbox.component.mjs +174 -0
- package/esm2022/lib/atoms/date-picker/date-picker.component.mjs +835 -0
- package/esm2022/lib/atoms/input/input.component.mjs +218 -0
- package/esm2022/lib/atoms/loader/loader.component.mjs +81 -0
- package/esm2022/lib/atoms/radio/radio.component.mjs +142 -0
- package/esm2022/lib/atoms/textarea/textarea.component.mjs +126 -0
- package/esm2022/lib/directives/asset-source.directive.mjs +68 -0
- package/esm2022/lib/directives/icon-source.directive.mjs +65 -0
- package/esm2022/lib/directives/no-leading-space.directive.mjs +24 -0
- package/esm2022/lib/directives/only-letters.directive.mjs +25 -0
- package/esm2022/lib/directives/only-number.directive.mjs +21 -0
- package/esm2022/lib/directives/rfc.directive.mjs +67 -0
- package/esm2022/lib/directives/tooltip.directive.mjs +199 -0
- package/esm2022/lib/models/snackbar.models.mjs +2 -0
- package/esm2022/lib/molecules/alert/alert.component.mjs +79 -0
- package/esm2022/lib/molecules/copy-input/copy-input.component.mjs +46 -0
- package/esm2022/lib/molecules/multiselect/multiselect.component.mjs +466 -0
- package/esm2022/lib/molecules/option/option.component.mjs +55 -0
- package/esm2022/lib/molecules/phone-input/phone-input.component.mjs +64 -0
- package/esm2022/lib/molecules/select/select.component.mjs +498 -0
- package/esm2022/lib/molecules/snackbar/snackbar.component.mjs +581 -0
- package/esm2022/lib/organisms/sidebar/sidebar-icon.component.mjs +91 -0
- package/esm2022/lib/organisms/sidebar/sidebar.component.mjs +115 -0
- package/esm2022/lib/services/snackbar.service.mjs +96 -0
- package/esm2022/lib/tokens/asset-base-url.token.mjs +10 -0
- package/esm2022/public-api.mjs +37 -0
- package/esm2022/up_si_vale-sivale-componentes-angular.mjs +5 -0
- package/fesm2022/up_si_vale-sivale-componentes-angular.mjs +4116 -0
- package/fesm2022/up_si_vale-sivale-componentes-angular.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/atoms/button/button.component.d.ts +20 -0
- package/lib/atoms/checkbox/checkbox.component.d.ts +31 -0
- package/lib/atoms/date-picker/date-picker.component.d.ts +134 -0
- package/lib/atoms/input/input.component.d.ts +35 -0
- package/lib/atoms/loader/loader.component.d.ts +10 -0
- package/lib/atoms/radio/radio.component.d.ts +25 -0
- package/lib/atoms/textarea/textarea.component.d.ts +27 -0
- package/lib/directives/asset-source.directive.d.ts +19 -0
- package/lib/directives/icon-source.directive.d.ts +18 -0
- package/lib/directives/no-leading-space.directive.d.ts +6 -0
- package/lib/directives/only-letters.directive.d.ts +7 -0
- package/lib/directives/only-number.directive.d.ts +6 -0
- package/lib/directives/rfc.directive.d.ts +12 -0
- package/lib/directives/tooltip.directive.d.ts +27 -0
- package/{src/lib/models/snackbar.models.ts → lib/models/snackbar.models.d.ts} +8 -10
- package/lib/molecules/alert/alert.component.d.ts +29 -0
- package/lib/molecules/copy-input/copy-input.component.d.ts +14 -0
- package/lib/molecules/multiselect/multiselect.component.d.ts +74 -0
- package/lib/molecules/option/option.component.d.ts +19 -0
- package/lib/molecules/phone-input/phone-input.component.d.ts +12 -0
- package/lib/molecules/select/select.component.d.ts +88 -0
- package/lib/molecules/snackbar/snackbar.component.d.ts +17 -0
- package/lib/organisms/sidebar/sidebar-icon.component.d.ts +8 -0
- package/lib/organisms/sidebar/sidebar.component.d.ts +47 -0
- package/lib/services/snackbar.service.d.ts +40 -0
- package/{src/lib/tokens/asset-base-url.token.ts → lib/tokens/asset-base-url.token.d.ts} +1 -5
- package/package.json +39 -28
- package/{src/public-api.ts → public-api.d.ts} +3 -15
- package/ng-package.json +0 -9
- package/src/lib/atoms/button/button.component.html +0 -21
- package/src/lib/atoms/button/button.component.scss +0 -242
- package/src/lib/atoms/button/button.component.ts +0 -43
- package/src/lib/atoms/checkbox/checkbox.component.scss +0 -131
- package/src/lib/atoms/checkbox/checkbox.component.ts +0 -130
- package/src/lib/atoms/date-picker/date-picker.component.html +0 -295
- package/src/lib/atoms/date-picker/date-picker.component.scss +0 -1002
- package/src/lib/atoms/date-picker/date-picker.component.ts +0 -942
- package/src/lib/atoms/input/input.component.ts +0 -239
- package/src/lib/atoms/loader/loader.component.scss +0 -144
- package/src/lib/atoms/loader/loader.component.ts +0 -44
- package/src/lib/atoms/radio/radio.component.scss +0 -115
- package/src/lib/atoms/radio/radio.component.ts +0 -103
- package/src/lib/atoms/textarea/textarea.component.ts +0 -155
- package/src/lib/directives/asset-source.directive.ts +0 -64
- package/src/lib/directives/icon-source.directive.ts +0 -74
- package/src/lib/directives/no-leading-space.directive.ts +0 -18
- package/src/lib/directives/only-letters.directive.ts +0 -21
- package/src/lib/directives/only-number.directive.ts +0 -15
- package/src/lib/directives/rfc.directive.ts +0 -60
- package/src/lib/directives/tooltip.directive.ts +0 -211
- package/src/lib/molecules/copy-input/copy-input.component.html +0 -29
- package/src/lib/molecules/copy-input/copy-input.component.scss +0 -101
- package/src/lib/molecules/copy-input/copy-input.component.ts +0 -41
- package/src/lib/molecules/multiselect/multiselect.component.scss +0 -298
- package/src/lib/molecules/multiselect/multiselect.component.ts +0 -487
- package/src/lib/molecules/option/option.component.ts +0 -45
- package/src/lib/molecules/phone-input/phone-input.component.scss +0 -78
- package/src/lib/molecules/phone-input/phone-input.component.ts +0 -43
- package/src/lib/molecules/select/select.component.ts +0 -482
- package/src/lib/molecules/snackbar/snackbar.component.scss +0 -201
- package/src/lib/molecules/snackbar/snackbar.component.ts +0 -321
- package/src/lib/services/snackbar.service.ts +0 -103
- package/tsconfig.json +0 -31
|
@@ -0,0 +1,835 @@
|
|
|
1
|
+
import { Component, Input, forwardRef, ViewChild, ElementRef, HostListener } from '@angular/core';
|
|
2
|
+
import { CommonModule, DOCUMENT } from '@angular/common';
|
|
3
|
+
import { NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
4
|
+
import { Inject } from '@angular/core';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
export class DatePickerComponent {
|
|
8
|
+
renderer;
|
|
9
|
+
document;
|
|
10
|
+
label = '';
|
|
11
|
+
id = '';
|
|
12
|
+
placeholder = 'Seleccionar fecha';
|
|
13
|
+
hasError = false;
|
|
14
|
+
errorMessage = '';
|
|
15
|
+
disabled = false;
|
|
16
|
+
minDate;
|
|
17
|
+
maxDate;
|
|
18
|
+
rangeMode = false; // false = single date, true = date range
|
|
19
|
+
iconPosition = 'left';
|
|
20
|
+
trigger;
|
|
21
|
+
dropdown;
|
|
22
|
+
// Single date value
|
|
23
|
+
singleValue = null;
|
|
24
|
+
// Range value
|
|
25
|
+
rangeValue = { startDate: null, endDate: null };
|
|
26
|
+
isOpen = false;
|
|
27
|
+
onChange = () => { };
|
|
28
|
+
onTouched = () => { };
|
|
29
|
+
leftMonthDate = new Date();
|
|
30
|
+
rightMonthDate = new Date();
|
|
31
|
+
tempStartDate = null;
|
|
32
|
+
tempEndDate = null;
|
|
33
|
+
tempSingleDate = null;
|
|
34
|
+
hoverDate = null;
|
|
35
|
+
// Store original calendar positions for cancel
|
|
36
|
+
originalLeftMonthDate = new Date();
|
|
37
|
+
originalRightMonthDate = new Date();
|
|
38
|
+
// Cached calendar days
|
|
39
|
+
leftCalendarDays = [];
|
|
40
|
+
rightCalendarDays = [];
|
|
41
|
+
filterOptions = [
|
|
42
|
+
{ value: 'hoy', label: 'Hoy' },
|
|
43
|
+
{ value: 'ayer', label: 'Ayer' },
|
|
44
|
+
{ value: 'esta-semana', label: 'Esta semana' },
|
|
45
|
+
{ value: 'semana-pasada', label: 'Semana pasada' },
|
|
46
|
+
{ value: 'este-mes', label: 'Este mes' },
|
|
47
|
+
{ value: 'mes-pasado', label: 'Mes pasado' },
|
|
48
|
+
{ value: 'este-ano', label: 'Este año' },
|
|
49
|
+
{ value: 'ano-pasado', label: 'Año pasado' },
|
|
50
|
+
{ value: 'mostrar-todo', label: 'Mostrar todo' }
|
|
51
|
+
];
|
|
52
|
+
selectedFilter = '';
|
|
53
|
+
weekDays = ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'];
|
|
54
|
+
months = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
|
|
55
|
+
// Month/Year picker state
|
|
56
|
+
showLeftMonthPicker = false;
|
|
57
|
+
showRightMonthPicker = false;
|
|
58
|
+
years = [];
|
|
59
|
+
leftYearPickerPage = 0;
|
|
60
|
+
rightYearPickerPage = 0;
|
|
61
|
+
yearsPerPage = 12;
|
|
62
|
+
scrollHandler = null;
|
|
63
|
+
resizeHandler = null;
|
|
64
|
+
dropdownPosition = { top: '0px', left: '0px' };
|
|
65
|
+
constructor(renderer, document) {
|
|
66
|
+
this.renderer = renderer;
|
|
67
|
+
this.document = document;
|
|
68
|
+
}
|
|
69
|
+
ngOnInit() {
|
|
70
|
+
this.initializeDates();
|
|
71
|
+
}
|
|
72
|
+
ngOnDestroy() {
|
|
73
|
+
this.removeRepositionListeners();
|
|
74
|
+
}
|
|
75
|
+
initializeDates() {
|
|
76
|
+
const today = new Date();
|
|
77
|
+
this.leftMonthDate = new Date(today.getFullYear(), today.getMonth(), 1);
|
|
78
|
+
this.rightMonthDate = new Date(today.getFullYear(), today.getMonth() + 1, 1);
|
|
79
|
+
this.updateCalendarDays();
|
|
80
|
+
}
|
|
81
|
+
updateCalendarDays() {
|
|
82
|
+
this.leftCalendarDays = this.generateCalendarDays(this.leftMonthDate);
|
|
83
|
+
if (this.rangeMode) {
|
|
84
|
+
this.rightCalendarDays = this.generateCalendarDays(this.rightMonthDate);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
onDocumentClick(event) {
|
|
88
|
+
if (!this.isOpen)
|
|
89
|
+
return;
|
|
90
|
+
const triggerElement = this.trigger?.nativeElement;
|
|
91
|
+
const dropdownElement = this.document.querySelector('.date-picker-dropdown');
|
|
92
|
+
const monthYearPickers = this.document.querySelectorAll('.month-year-picker');
|
|
93
|
+
const monthYearButtons = this.document.querySelectorAll('.month-year');
|
|
94
|
+
let isOnMonthYearButton = false;
|
|
95
|
+
monthYearButtons.forEach(button => {
|
|
96
|
+
if (button.contains(event.target)) {
|
|
97
|
+
isOnMonthYearButton = true;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
let isInsideMonthYearPicker = false;
|
|
101
|
+
monthYearPickers.forEach(picker => {
|
|
102
|
+
if (picker.contains(event.target)) {
|
|
103
|
+
isInsideMonthYearPicker = true;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
if (isOnMonthYearButton || isInsideMonthYearPicker) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (dropdownElement && dropdownElement.contains(event.target)) {
|
|
110
|
+
this.showLeftMonthPicker = false;
|
|
111
|
+
this.showRightMonthPicker = false;
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (triggerElement && !triggerElement.contains(event.target)) {
|
|
115
|
+
if (dropdownElement && !dropdownElement.contains(event.target)) {
|
|
116
|
+
this.closeDropdown();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
toggleDropdown(event) {
|
|
121
|
+
event.stopPropagation();
|
|
122
|
+
if (this.disabled)
|
|
123
|
+
return;
|
|
124
|
+
if (this.isOpen) {
|
|
125
|
+
this.closeDropdown();
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
this.openDropdown();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
openDropdown() {
|
|
132
|
+
if (!this.trigger)
|
|
133
|
+
return;
|
|
134
|
+
if (this.rangeMode) {
|
|
135
|
+
this.tempStartDate = this.rangeValue.startDate;
|
|
136
|
+
this.tempEndDate = this.rangeValue.endDate;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this.tempSingleDate = this.singleValue;
|
|
140
|
+
}
|
|
141
|
+
this.originalLeftMonthDate = new Date(this.leftMonthDate);
|
|
142
|
+
this.originalRightMonthDate = new Date(this.rightMonthDate);
|
|
143
|
+
this.leftYearPickerPage = 0;
|
|
144
|
+
this.rightYearPickerPage = 0;
|
|
145
|
+
this.isOpen = true;
|
|
146
|
+
setTimeout(() => {
|
|
147
|
+
this.updateDropdownPosition();
|
|
148
|
+
this.addRepositionListeners();
|
|
149
|
+
}, 0);
|
|
150
|
+
}
|
|
151
|
+
getDropdownStyle() {
|
|
152
|
+
if (!this.trigger)
|
|
153
|
+
return {};
|
|
154
|
+
const position = this.calculatePosition();
|
|
155
|
+
return {
|
|
156
|
+
'position': 'fixed',
|
|
157
|
+
'left': position.left,
|
|
158
|
+
'top': position.top,
|
|
159
|
+
'z-index': '10000'
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
calculatePosition() {
|
|
163
|
+
const triggerElement = this.trigger.nativeElement;
|
|
164
|
+
const rect = triggerElement.getBoundingClientRect();
|
|
165
|
+
let dropdownWidth = this.rangeMode ? 830 : 320;
|
|
166
|
+
let dropdownHeight = this.rangeMode ? 520 : 400;
|
|
167
|
+
if (this.dropdown) {
|
|
168
|
+
const dropdownElement = this.dropdown.nativeElement;
|
|
169
|
+
const dropdownRect = dropdownElement.getBoundingClientRect();
|
|
170
|
+
if (dropdownRect.width > 0) {
|
|
171
|
+
dropdownWidth = dropdownRect.width;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
dropdownWidth = window.innerWidth < 768 ? 280 : (this.rangeMode ? 830 : 320);
|
|
175
|
+
}
|
|
176
|
+
if (dropdownRect.height > 0) {
|
|
177
|
+
dropdownHeight = dropdownRect.height;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
dropdownWidth = window.innerWidth < 768 ? 280 : (this.rangeMode ? 830 : 320);
|
|
182
|
+
}
|
|
183
|
+
const spaceOnRight = window.innerWidth - rect.left;
|
|
184
|
+
let left = rect.left;
|
|
185
|
+
if (spaceOnRight < dropdownWidth) {
|
|
186
|
+
left = rect.right - dropdownWidth;
|
|
187
|
+
if (left < 0) {
|
|
188
|
+
left = Math.max(8, window.innerWidth - dropdownWidth - 8);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (window.innerWidth < 768) {
|
|
192
|
+
const centeredLeft = rect.left + (rect.width / 2) - (dropdownWidth / 2);
|
|
193
|
+
const minLeft = 8;
|
|
194
|
+
const maxLeft = window.innerWidth - dropdownWidth - 8;
|
|
195
|
+
left = Math.max(minLeft, Math.min(centeredLeft, maxLeft));
|
|
196
|
+
}
|
|
197
|
+
const spaceBelow = window.innerHeight - rect.bottom;
|
|
198
|
+
const spaceAbove = rect.top;
|
|
199
|
+
let top = rect.bottom + 4;
|
|
200
|
+
if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {
|
|
201
|
+
top = rect.top - dropdownHeight - 4;
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
top: `${top}px`,
|
|
205
|
+
left: `${left}px`
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
closeDropdown() {
|
|
209
|
+
this.leftMonthDate = new Date(this.originalLeftMonthDate);
|
|
210
|
+
this.rightMonthDate = new Date(this.originalRightMonthDate);
|
|
211
|
+
if (this.rangeMode) {
|
|
212
|
+
this.tempStartDate = this.rangeValue.startDate;
|
|
213
|
+
this.tempEndDate = this.rangeValue.endDate;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
this.tempSingleDate = this.singleValue;
|
|
217
|
+
}
|
|
218
|
+
this.updateCalendarDays();
|
|
219
|
+
this.removeRepositionListeners();
|
|
220
|
+
this.isOpen = false;
|
|
221
|
+
this.hoverDate = null;
|
|
222
|
+
this.showLeftMonthPicker = false;
|
|
223
|
+
this.showRightMonthPicker = false;
|
|
224
|
+
}
|
|
225
|
+
addRepositionListeners() {
|
|
226
|
+
const scrollHandler = () => this.updateDropdownPosition();
|
|
227
|
+
const resizeHandler = () => this.updateDropdownPosition();
|
|
228
|
+
window.addEventListener('scroll', scrollHandler, true);
|
|
229
|
+
this.scrollHandler = () => window.removeEventListener('scroll', scrollHandler, true);
|
|
230
|
+
window.addEventListener('resize', resizeHandler);
|
|
231
|
+
this.resizeHandler = () => window.removeEventListener('resize', resizeHandler);
|
|
232
|
+
}
|
|
233
|
+
removeRepositionListeners() {
|
|
234
|
+
if (this.scrollHandler) {
|
|
235
|
+
this.scrollHandler();
|
|
236
|
+
this.scrollHandler = null;
|
|
237
|
+
}
|
|
238
|
+
if (this.resizeHandler) {
|
|
239
|
+
this.resizeHandler();
|
|
240
|
+
this.resizeHandler = null;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
updateDropdownPosition() {
|
|
244
|
+
if (!this.trigger)
|
|
245
|
+
return;
|
|
246
|
+
this.dropdownPosition = this.calculatePosition();
|
|
247
|
+
}
|
|
248
|
+
getDisplayValue() {
|
|
249
|
+
if (this.rangeMode) {
|
|
250
|
+
if (this.rangeValue.startDate && this.rangeValue.endDate) {
|
|
251
|
+
const start = this.formatDateShort(this.rangeValue.startDate);
|
|
252
|
+
const end = this.formatDateShort(this.rangeValue.endDate);
|
|
253
|
+
return `${start} - ${end}`;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
if (this.singleValue) {
|
|
258
|
+
return this.formatDateShort(this.singleValue);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return '';
|
|
262
|
+
}
|
|
263
|
+
formatDateShort(date) {
|
|
264
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
265
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
266
|
+
const year = date.getFullYear();
|
|
267
|
+
return `${day}/${month}/${year}`;
|
|
268
|
+
}
|
|
269
|
+
generateCalendarDays(monthDate) {
|
|
270
|
+
const year = monthDate.getFullYear();
|
|
271
|
+
const month = monthDate.getMonth();
|
|
272
|
+
const firstDay = new Date(year, month, 1);
|
|
273
|
+
const lastDay = new Date(year, month + 1, 0);
|
|
274
|
+
let startDay = firstDay.getDay() - 1;
|
|
275
|
+
if (startDay === -1)
|
|
276
|
+
startDay = 6;
|
|
277
|
+
const days = [];
|
|
278
|
+
const prevMonthLastDay = new Date(year, month, 0);
|
|
279
|
+
for (let i = startDay - 1; i >= 0; i--) {
|
|
280
|
+
const date = new Date(year, month - 1, prevMonthLastDay.getDate() - i);
|
|
281
|
+
date.setHours(0, 0, 0, 0);
|
|
282
|
+
days.push(this.createCalendarDay(date, false));
|
|
283
|
+
}
|
|
284
|
+
for (let day = 1; day <= lastDay.getDate(); day++) {
|
|
285
|
+
const date = new Date(year, month, day);
|
|
286
|
+
date.setHours(0, 0, 0, 0);
|
|
287
|
+
days.push(this.createCalendarDay(date, true));
|
|
288
|
+
}
|
|
289
|
+
const remainingDays = 42 - days.length;
|
|
290
|
+
for (let day = 1; day <= remainingDays; day++) {
|
|
291
|
+
const date = new Date(year, month + 1, day);
|
|
292
|
+
date.setHours(0, 0, 0, 0);
|
|
293
|
+
days.push(this.createCalendarDay(date, false));
|
|
294
|
+
}
|
|
295
|
+
return days;
|
|
296
|
+
}
|
|
297
|
+
createCalendarDay(date, isCurrentMonth) {
|
|
298
|
+
const today = new Date();
|
|
299
|
+
today.setHours(0, 0, 0, 0);
|
|
300
|
+
const dateOnly = new Date(date);
|
|
301
|
+
dateOnly.setHours(0, 0, 0, 0);
|
|
302
|
+
const isToday = dateOnly.getTime() === today.getTime();
|
|
303
|
+
let isSelected = false;
|
|
304
|
+
let isRangeStart = false;
|
|
305
|
+
let isRangeEnd = false;
|
|
306
|
+
let isInRange = false;
|
|
307
|
+
if (this.rangeMode) {
|
|
308
|
+
const startDate = this.tempStartDate ? new Date(this.tempStartDate) : null;
|
|
309
|
+
const endDate = this.tempEndDate ? new Date(this.tempEndDate) : null;
|
|
310
|
+
if (startDate)
|
|
311
|
+
startDate.setHours(0, 0, 0, 0);
|
|
312
|
+
if (endDate)
|
|
313
|
+
endDate.setHours(0, 0, 0, 0);
|
|
314
|
+
isRangeStart = isCurrentMonth && startDate ? dateOnly.getTime() === startDate.getTime() : false;
|
|
315
|
+
isRangeEnd = isCurrentMonth && endDate ? dateOnly.getTime() === endDate.getTime() : false;
|
|
316
|
+
isSelected = isRangeStart || isRangeEnd;
|
|
317
|
+
if (isCurrentMonth && startDate && endDate) {
|
|
318
|
+
isInRange = dateOnly > startDate && dateOnly < endDate;
|
|
319
|
+
}
|
|
320
|
+
else if (isCurrentMonth && startDate && this.hoverDate && !endDate) {
|
|
321
|
+
const hoverDateOnly = new Date(this.hoverDate);
|
|
322
|
+
hoverDateOnly.setHours(0, 0, 0, 0);
|
|
323
|
+
if (hoverDateOnly > startDate) {
|
|
324
|
+
isInRange = dateOnly > startDate && dateOnly < hoverDateOnly;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
const selectedDate = this.tempSingleDate ? new Date(this.tempSingleDate) : null;
|
|
330
|
+
if (selectedDate)
|
|
331
|
+
selectedDate.setHours(0, 0, 0, 0);
|
|
332
|
+
isSelected = isCurrentMonth && selectedDate ? dateOnly.getTime() === selectedDate.getTime() : false;
|
|
333
|
+
}
|
|
334
|
+
const isDisabled = !isCurrentMonth || this.isDateDisabled(date);
|
|
335
|
+
return {
|
|
336
|
+
date,
|
|
337
|
+
isCurrentMonth,
|
|
338
|
+
isToday,
|
|
339
|
+
isSelected,
|
|
340
|
+
isInRange,
|
|
341
|
+
isRangeStart,
|
|
342
|
+
isRangeEnd,
|
|
343
|
+
isDisabled
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
isDateDisabled(date) {
|
|
347
|
+
if (this.minDate && date < this.minDate)
|
|
348
|
+
return true;
|
|
349
|
+
if (this.maxDate && date > this.maxDate)
|
|
350
|
+
return true;
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
trackByDate(index, day) {
|
|
354
|
+
return day.date.getTime().toString();
|
|
355
|
+
}
|
|
356
|
+
isInRange(date) {
|
|
357
|
+
if (!this.rangeMode)
|
|
358
|
+
return false;
|
|
359
|
+
const dateOnly = new Date(date);
|
|
360
|
+
dateOnly.setHours(0, 0, 0, 0);
|
|
361
|
+
const startDate = this.tempStartDate ? new Date(this.tempStartDate) : null;
|
|
362
|
+
const endDate = this.tempEndDate ? new Date(this.tempEndDate) : null;
|
|
363
|
+
if (startDate)
|
|
364
|
+
startDate.setHours(0, 0, 0, 0);
|
|
365
|
+
if (endDate)
|
|
366
|
+
endDate.setHours(0, 0, 0, 0);
|
|
367
|
+
if (startDate && endDate) {
|
|
368
|
+
return dateOnly > startDate && dateOnly < endDate;
|
|
369
|
+
}
|
|
370
|
+
else if (startDate && this.hoverDate && !endDate) {
|
|
371
|
+
const hoverDateOnly = new Date(this.hoverDate);
|
|
372
|
+
hoverDateOnly.setHours(0, 0, 0, 0);
|
|
373
|
+
if (hoverDateOnly > startDate) {
|
|
374
|
+
return dateOnly > startDate && dateOnly < hoverDateOnly;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
onDayClick(day) {
|
|
380
|
+
if (day.isDisabled)
|
|
381
|
+
return;
|
|
382
|
+
const clickedDate = new Date(day.date);
|
|
383
|
+
clickedDate.setHours(0, 0, 0, 0);
|
|
384
|
+
if (this.rangeMode) {
|
|
385
|
+
this.selectedFilter = '';
|
|
386
|
+
if (!this.tempStartDate || (this.tempStartDate && this.tempEndDate)) {
|
|
387
|
+
this.tempStartDate = clickedDate;
|
|
388
|
+
this.tempEndDate = null;
|
|
389
|
+
this.hoverDate = null;
|
|
390
|
+
}
|
|
391
|
+
else if (this.tempStartDate && !this.tempEndDate) {
|
|
392
|
+
const startDate = new Date(this.tempStartDate);
|
|
393
|
+
startDate.setHours(0, 0, 0, 0);
|
|
394
|
+
if (clickedDate.getTime() === startDate.getTime()) {
|
|
395
|
+
this.tempEndDate = clickedDate;
|
|
396
|
+
}
|
|
397
|
+
else if (clickedDate > startDate) {
|
|
398
|
+
this.tempEndDate = clickedDate;
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
this.tempEndDate = startDate;
|
|
402
|
+
this.tempStartDate = clickedDate;
|
|
403
|
+
}
|
|
404
|
+
this.hoverDate = null;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
this.tempSingleDate = clickedDate;
|
|
409
|
+
// Auto-apply for single date mode
|
|
410
|
+
this.apply();
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
this.updateCalendarDays();
|
|
414
|
+
}
|
|
415
|
+
onDayHover(day) {
|
|
416
|
+
if (day.isDisabled || !this.rangeMode)
|
|
417
|
+
return;
|
|
418
|
+
this.hoverDate = day.date;
|
|
419
|
+
}
|
|
420
|
+
onDayLeave() {
|
|
421
|
+
this.hoverDate = null;
|
|
422
|
+
}
|
|
423
|
+
previousMonth() {
|
|
424
|
+
if (!this.canNavigatePreviousMonth())
|
|
425
|
+
return;
|
|
426
|
+
this.leftMonthDate = new Date(this.leftMonthDate.getFullYear(), this.leftMonthDate.getMonth() - 1, 1);
|
|
427
|
+
if (this.rangeMode) {
|
|
428
|
+
this.rightMonthDate = new Date(this.rightMonthDate.getFullYear(), this.rightMonthDate.getMonth() - 1, 1);
|
|
429
|
+
}
|
|
430
|
+
this.updateCalendarDays();
|
|
431
|
+
}
|
|
432
|
+
nextMonth() {
|
|
433
|
+
if (!this.canNavigateNextMonth())
|
|
434
|
+
return;
|
|
435
|
+
this.leftMonthDate = new Date(this.leftMonthDate.getFullYear(), this.leftMonthDate.getMonth() + 1, 1);
|
|
436
|
+
if (this.rangeMode) {
|
|
437
|
+
this.rightMonthDate = new Date(this.rightMonthDate.getFullYear(), this.rightMonthDate.getMonth() + 1, 1);
|
|
438
|
+
}
|
|
439
|
+
this.updateCalendarDays();
|
|
440
|
+
}
|
|
441
|
+
canNavigatePreviousMonth() {
|
|
442
|
+
if (!this.minDate)
|
|
443
|
+
return true;
|
|
444
|
+
const newLeftMonth = new Date(this.leftMonthDate.getFullYear(), this.leftMonthDate.getMonth() - 1, 1);
|
|
445
|
+
const minDateMonth = new Date(this.minDate.getFullYear(), this.minDate.getMonth(), 1);
|
|
446
|
+
return newLeftMonth >= minDateMonth;
|
|
447
|
+
}
|
|
448
|
+
canNavigateNextMonth() {
|
|
449
|
+
if (!this.maxDate)
|
|
450
|
+
return true;
|
|
451
|
+
const checkMonth = this.rangeMode ? this.rightMonthDate : this.leftMonthDate;
|
|
452
|
+
const newMonth = new Date(checkMonth.getFullYear(), checkMonth.getMonth() + 1, 1);
|
|
453
|
+
const maxDateMonth = new Date(this.maxDate.getFullYear(), this.maxDate.getMonth(), 1);
|
|
454
|
+
return newMonth <= maxDateMonth;
|
|
455
|
+
}
|
|
456
|
+
getMonthYear(date) {
|
|
457
|
+
return `${this.months[date.getMonth()]} ${date.getFullYear()}`;
|
|
458
|
+
}
|
|
459
|
+
selectFilter(filter) {
|
|
460
|
+
this.selectedFilter = filter;
|
|
461
|
+
this.applyFilter(filter);
|
|
462
|
+
this.updateCalendarDays();
|
|
463
|
+
}
|
|
464
|
+
applyFilter(filter) {
|
|
465
|
+
const today = new Date();
|
|
466
|
+
today.setHours(0, 0, 0, 0);
|
|
467
|
+
let startDate = null;
|
|
468
|
+
let endDate = null;
|
|
469
|
+
switch (filter) {
|
|
470
|
+
case 'hoy':
|
|
471
|
+
startDate = new Date(today);
|
|
472
|
+
endDate = new Date(today);
|
|
473
|
+
break;
|
|
474
|
+
case 'ayer':
|
|
475
|
+
startDate = new Date(today);
|
|
476
|
+
startDate.setDate(startDate.getDate() - 1);
|
|
477
|
+
endDate = new Date(startDate);
|
|
478
|
+
break;
|
|
479
|
+
case 'esta-semana':
|
|
480
|
+
startDate = this.getStartOfWeek(today);
|
|
481
|
+
endDate = new Date(today);
|
|
482
|
+
break;
|
|
483
|
+
case 'semana-pasada':
|
|
484
|
+
const lastWeekEnd = new Date(this.getStartOfWeek(today));
|
|
485
|
+
lastWeekEnd.setDate(lastWeekEnd.getDate() - 1);
|
|
486
|
+
startDate = this.getStartOfWeek(lastWeekEnd);
|
|
487
|
+
endDate = lastWeekEnd;
|
|
488
|
+
break;
|
|
489
|
+
case 'este-mes':
|
|
490
|
+
startDate = new Date(today.getFullYear(), today.getMonth(), 1);
|
|
491
|
+
endDate = new Date(today);
|
|
492
|
+
break;
|
|
493
|
+
case 'mes-pasado':
|
|
494
|
+
startDate = new Date(today.getFullYear(), today.getMonth() - 1, 1);
|
|
495
|
+
endDate = new Date(today.getFullYear(), today.getMonth(), 0);
|
|
496
|
+
break;
|
|
497
|
+
case 'este-ano':
|
|
498
|
+
startDate = new Date(today.getFullYear(), 0, 1);
|
|
499
|
+
endDate = new Date(today);
|
|
500
|
+
break;
|
|
501
|
+
case 'ano-pasado':
|
|
502
|
+
startDate = new Date(today.getFullYear() - 1, 0, 1);
|
|
503
|
+
endDate = new Date(today.getFullYear() - 1, 11, 31);
|
|
504
|
+
break;
|
|
505
|
+
case 'mostrar-todo':
|
|
506
|
+
startDate = null;
|
|
507
|
+
endDate = null;
|
|
508
|
+
break;
|
|
509
|
+
}
|
|
510
|
+
this.tempStartDate = startDate;
|
|
511
|
+
this.tempEndDate = endDate;
|
|
512
|
+
if (startDate) {
|
|
513
|
+
this.leftMonthDate = new Date(startDate.getFullYear(), startDate.getMonth(), 1);
|
|
514
|
+
this.rightMonthDate = new Date(startDate.getFullYear(), startDate.getMonth() + 1, 1);
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
const currentDate = new Date();
|
|
518
|
+
this.leftMonthDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);
|
|
519
|
+
this.rightMonthDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
getStartOfWeek(date) {
|
|
523
|
+
const day = date.getDay();
|
|
524
|
+
const diff = day === 0 ? -6 : 1 - day;
|
|
525
|
+
const startOfWeek = new Date(date);
|
|
526
|
+
startOfWeek.setDate(date.getDate() + diff);
|
|
527
|
+
return startOfWeek;
|
|
528
|
+
}
|
|
529
|
+
cancel() {
|
|
530
|
+
if (this.rangeMode) {
|
|
531
|
+
this.tempStartDate = this.rangeValue.startDate;
|
|
532
|
+
this.tempEndDate = this.rangeValue.endDate;
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
this.tempSingleDate = this.singleValue;
|
|
536
|
+
}
|
|
537
|
+
this.selectedFilter = '';
|
|
538
|
+
this.leftMonthDate = new Date(this.originalLeftMonthDate);
|
|
539
|
+
this.rightMonthDate = new Date(this.originalRightMonthDate);
|
|
540
|
+
this.updateCalendarDays();
|
|
541
|
+
this.closeDropdown();
|
|
542
|
+
}
|
|
543
|
+
apply() {
|
|
544
|
+
if (this.rangeMode) {
|
|
545
|
+
this.rangeValue = {
|
|
546
|
+
startDate: this.tempStartDate,
|
|
547
|
+
endDate: this.tempEndDate
|
|
548
|
+
};
|
|
549
|
+
this.onChange(this.rangeValue);
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
this.singleValue = this.tempSingleDate;
|
|
553
|
+
this.onChange(this.singleValue);
|
|
554
|
+
}
|
|
555
|
+
this.originalLeftMonthDate = new Date(this.leftMonthDate);
|
|
556
|
+
this.originalRightMonthDate = new Date(this.rightMonthDate);
|
|
557
|
+
this.onTouched();
|
|
558
|
+
this.removeRepositionListeners();
|
|
559
|
+
this.isOpen = false;
|
|
560
|
+
this.hoverDate = null;
|
|
561
|
+
this.showLeftMonthPicker = false;
|
|
562
|
+
this.showRightMonthPicker = false;
|
|
563
|
+
}
|
|
564
|
+
getStartDateDisplay() {
|
|
565
|
+
if (this.tempStartDate) {
|
|
566
|
+
return this.formatDateForInput(this.tempStartDate);
|
|
567
|
+
}
|
|
568
|
+
return 'Fecha inicio';
|
|
569
|
+
}
|
|
570
|
+
getEndDateDisplay() {
|
|
571
|
+
if (this.tempEndDate) {
|
|
572
|
+
return this.formatDateForInput(this.tempEndDate);
|
|
573
|
+
}
|
|
574
|
+
return 'Fecha fin';
|
|
575
|
+
}
|
|
576
|
+
formatDateForInput(date) {
|
|
577
|
+
const day = date.getDate();
|
|
578
|
+
const month = date.toLocaleString('es-ES', { month: 'short' });
|
|
579
|
+
const year = date.getFullYear();
|
|
580
|
+
return `${day} ${month} ${year}`;
|
|
581
|
+
}
|
|
582
|
+
toggleLeftMonthPicker(event) {
|
|
583
|
+
event.stopPropagation();
|
|
584
|
+
this.showLeftMonthPicker = !this.showLeftMonthPicker;
|
|
585
|
+
this.showRightMonthPicker = false;
|
|
586
|
+
if (this.showLeftMonthPicker) {
|
|
587
|
+
this.leftYearPickerPage = 0;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
toggleRightMonthPicker(event) {
|
|
591
|
+
event.stopPropagation();
|
|
592
|
+
this.showRightMonthPicker = !this.showRightMonthPicker;
|
|
593
|
+
this.showLeftMonthPicker = false;
|
|
594
|
+
if (this.showRightMonthPicker) {
|
|
595
|
+
this.rightYearPickerPage = 0;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
getLeftYears() {
|
|
599
|
+
const currentYear = this.leftMonthDate.getFullYear();
|
|
600
|
+
const baseYear = currentYear + (this.leftYearPickerPage * this.yearsPerPage);
|
|
601
|
+
const years = [];
|
|
602
|
+
for (let i = 0; i < this.yearsPerPage; i++) {
|
|
603
|
+
const year = baseYear - 5 + i;
|
|
604
|
+
years.push(year);
|
|
605
|
+
}
|
|
606
|
+
return years;
|
|
607
|
+
}
|
|
608
|
+
getRightYears() {
|
|
609
|
+
const currentYear = this.rightMonthDate.getFullYear();
|
|
610
|
+
const baseYear = currentYear + (this.rightYearPickerPage * this.yearsPerPage);
|
|
611
|
+
const years = [];
|
|
612
|
+
for (let i = 0; i < this.yearsPerPage; i++) {
|
|
613
|
+
const year = baseYear - 5 + i;
|
|
614
|
+
years.push(year);
|
|
615
|
+
}
|
|
616
|
+
return years;
|
|
617
|
+
}
|
|
618
|
+
previousLeftYearPage(event) {
|
|
619
|
+
event.stopPropagation();
|
|
620
|
+
this.leftYearPickerPage--;
|
|
621
|
+
}
|
|
622
|
+
nextLeftYearPage(event) {
|
|
623
|
+
event.stopPropagation();
|
|
624
|
+
this.leftYearPickerPage++;
|
|
625
|
+
}
|
|
626
|
+
previousRightYearPage(event) {
|
|
627
|
+
event.stopPropagation();
|
|
628
|
+
this.rightYearPickerPage--;
|
|
629
|
+
}
|
|
630
|
+
nextRightYearPage(event) {
|
|
631
|
+
event.stopPropagation();
|
|
632
|
+
this.rightYearPickerPage++;
|
|
633
|
+
}
|
|
634
|
+
isMonthDisabled(monthIndex, calendarDate) {
|
|
635
|
+
const testDate = new Date(calendarDate.getFullYear(), monthIndex, 1);
|
|
636
|
+
if (this.minDate) {
|
|
637
|
+
const minDateMonth = new Date(this.minDate.getFullYear(), this.minDate.getMonth(), 1);
|
|
638
|
+
if (testDate < minDateMonth)
|
|
639
|
+
return true;
|
|
640
|
+
}
|
|
641
|
+
if (this.maxDate) {
|
|
642
|
+
const maxDateMonth = new Date(this.maxDate.getFullYear(), this.maxDate.getMonth(), 1);
|
|
643
|
+
if (testDate > maxDateMonth)
|
|
644
|
+
return true;
|
|
645
|
+
}
|
|
646
|
+
return false;
|
|
647
|
+
}
|
|
648
|
+
isYearDisabled(year) {
|
|
649
|
+
if (this.minDate && year < this.minDate.getFullYear())
|
|
650
|
+
return true;
|
|
651
|
+
if (this.maxDate && year > this.maxDate.getFullYear())
|
|
652
|
+
return true;
|
|
653
|
+
return false;
|
|
654
|
+
}
|
|
655
|
+
getLeftYearRangeLabel() {
|
|
656
|
+
const years = this.getLeftYears();
|
|
657
|
+
return `${years[0]} - ${years[years.length - 1]}`;
|
|
658
|
+
}
|
|
659
|
+
getRightYearRangeLabel() {
|
|
660
|
+
const years = this.getRightYears();
|
|
661
|
+
return `${years[0]} - ${years[years.length - 1]}`;
|
|
662
|
+
}
|
|
663
|
+
canNavigateLeftYearsPrevious() {
|
|
664
|
+
if (!this.minDate && !this.maxDate)
|
|
665
|
+
return true;
|
|
666
|
+
const currentYear = this.leftMonthDate.getFullYear();
|
|
667
|
+
const baseYear = currentYear + ((this.leftYearPickerPage - 1) * this.yearsPerPage);
|
|
668
|
+
const previousPageYears = [];
|
|
669
|
+
for (let i = 0; i < this.yearsPerPage; i++) {
|
|
670
|
+
previousPageYears.push(baseYear - 5 + i);
|
|
671
|
+
}
|
|
672
|
+
return previousPageYears.some(year => !this.isYearDisabled(year));
|
|
673
|
+
}
|
|
674
|
+
canNavigateLeftYearsNext() {
|
|
675
|
+
if (!this.minDate && !this.maxDate)
|
|
676
|
+
return true;
|
|
677
|
+
const currentYear = this.leftMonthDate.getFullYear();
|
|
678
|
+
const baseYear = currentYear + ((this.leftYearPickerPage + 1) * this.yearsPerPage);
|
|
679
|
+
const nextPageYears = [];
|
|
680
|
+
for (let i = 0; i < this.yearsPerPage; i++) {
|
|
681
|
+
nextPageYears.push(baseYear - 5 + i);
|
|
682
|
+
}
|
|
683
|
+
return nextPageYears.some(year => !this.isYearDisabled(year));
|
|
684
|
+
}
|
|
685
|
+
canNavigateRightYearsPrevious() {
|
|
686
|
+
if (!this.minDate && !this.maxDate)
|
|
687
|
+
return true;
|
|
688
|
+
const currentYear = this.rightMonthDate.getFullYear();
|
|
689
|
+
const baseYear = currentYear + ((this.rightYearPickerPage - 1) * this.yearsPerPage);
|
|
690
|
+
const previousPageYears = [];
|
|
691
|
+
for (let i = 0; i < this.yearsPerPage; i++) {
|
|
692
|
+
previousPageYears.push(baseYear - 5 + i);
|
|
693
|
+
}
|
|
694
|
+
return previousPageYears.some(year => !this.isYearDisabled(year));
|
|
695
|
+
}
|
|
696
|
+
canNavigateRightYearsNext() {
|
|
697
|
+
if (!this.minDate && !this.maxDate)
|
|
698
|
+
return true;
|
|
699
|
+
const currentYear = this.rightMonthDate.getFullYear();
|
|
700
|
+
const baseYear = currentYear + ((this.rightYearPickerPage + 1) * this.yearsPerPage);
|
|
701
|
+
const nextPageYears = [];
|
|
702
|
+
for (let i = 0; i < this.yearsPerPage; i++) {
|
|
703
|
+
nextPageYears.push(baseYear - 5 + i);
|
|
704
|
+
}
|
|
705
|
+
return nextPageYears.some(year => !this.isYearDisabled(year));
|
|
706
|
+
}
|
|
707
|
+
selectLeftMonth(monthIndex, event) {
|
|
708
|
+
if (event) {
|
|
709
|
+
event.stopPropagation();
|
|
710
|
+
}
|
|
711
|
+
this.leftMonthDate = new Date(this.leftMonthDate.getFullYear(), monthIndex, 1);
|
|
712
|
+
if (this.rangeMode) {
|
|
713
|
+
this.rightMonthDate = new Date(this.leftMonthDate.getFullYear(), monthIndex + 1, 1);
|
|
714
|
+
}
|
|
715
|
+
this.updateCalendarDays();
|
|
716
|
+
this.showLeftMonthPicker = false;
|
|
717
|
+
}
|
|
718
|
+
selectRightMonth(monthIndex, event) {
|
|
719
|
+
if (event) {
|
|
720
|
+
event.stopPropagation();
|
|
721
|
+
}
|
|
722
|
+
this.rightMonthDate = new Date(this.rightMonthDate.getFullYear(), monthIndex, 1);
|
|
723
|
+
this.leftMonthDate = new Date(this.rightMonthDate.getFullYear(), monthIndex - 1, 1);
|
|
724
|
+
this.updateCalendarDays();
|
|
725
|
+
this.showRightMonthPicker = false;
|
|
726
|
+
}
|
|
727
|
+
selectLeftYear(year, event) {
|
|
728
|
+
if (event) {
|
|
729
|
+
event.stopPropagation();
|
|
730
|
+
}
|
|
731
|
+
this.leftMonthDate = new Date(year, this.leftMonthDate.getMonth(), 1);
|
|
732
|
+
if (this.rangeMode) {
|
|
733
|
+
this.rightMonthDate = new Date(year, this.leftMonthDate.getMonth() + 1, 1);
|
|
734
|
+
}
|
|
735
|
+
this.updateCalendarDays();
|
|
736
|
+
this.showLeftMonthPicker = false;
|
|
737
|
+
}
|
|
738
|
+
selectRightYear(year, event) {
|
|
739
|
+
if (event) {
|
|
740
|
+
event.stopPropagation();
|
|
741
|
+
}
|
|
742
|
+
this.rightMonthDate = new Date(year, this.rightMonthDate.getMonth(), 1);
|
|
743
|
+
this.leftMonthDate = new Date(year, this.rightMonthDate.getMonth() - 1, 1);
|
|
744
|
+
this.updateCalendarDays();
|
|
745
|
+
this.showRightMonthPicker = false;
|
|
746
|
+
}
|
|
747
|
+
writeValue(value) {
|
|
748
|
+
if (this.rangeMode) {
|
|
749
|
+
const rangeVal = value;
|
|
750
|
+
this.rangeValue = rangeVal || { startDate: null, endDate: null };
|
|
751
|
+
this.tempStartDate = this.rangeValue.startDate;
|
|
752
|
+
this.tempEndDate = this.rangeValue.endDate;
|
|
753
|
+
}
|
|
754
|
+
else {
|
|
755
|
+
this.singleValue = value;
|
|
756
|
+
this.tempSingleDate = this.singleValue;
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
registerOnChange(fn) {
|
|
760
|
+
this.onChange = fn;
|
|
761
|
+
}
|
|
762
|
+
registerOnTouched(fn) {
|
|
763
|
+
this.onTouched = fn;
|
|
764
|
+
}
|
|
765
|
+
setDisabledState(isDisabled) {
|
|
766
|
+
this.disabled = isDisabled;
|
|
767
|
+
}
|
|
768
|
+
resetDatePicker() {
|
|
769
|
+
if (this.rangeMode) {
|
|
770
|
+
this.rangeValue = { startDate: null, endDate: null };
|
|
771
|
+
this.tempStartDate = null;
|
|
772
|
+
this.tempEndDate = null;
|
|
773
|
+
this.onChange(this.rangeValue);
|
|
774
|
+
}
|
|
775
|
+
else {
|
|
776
|
+
this.singleValue = null;
|
|
777
|
+
this.tempSingleDate = null;
|
|
778
|
+
this.onChange(this.singleValue);
|
|
779
|
+
}
|
|
780
|
+
this.selectedFilter = '';
|
|
781
|
+
this.initializeDates();
|
|
782
|
+
this.updateCalendarDays();
|
|
783
|
+
}
|
|
784
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DatePickerComponent, deps: [{ token: i0.Renderer2 }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
785
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DatePickerComponent, isStandalone: true, selector: "app-date-picker", inputs: { label: "label", id: "id", placeholder: "placeholder", hasError: "hasError", errorMessage: "errorMessage", disabled: "disabled", minDate: "minDate", maxDate: "maxDate", rangeMode: "rangeMode", iconPosition: "iconPosition" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
|
|
786
|
+
{
|
|
787
|
+
provide: NG_VALUE_ACCESSOR,
|
|
788
|
+
useExisting: forwardRef(() => DatePickerComponent),
|
|
789
|
+
multi: true
|
|
790
|
+
}
|
|
791
|
+
], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, read: ElementRef }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"date-picker-wrapper\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n\n <div class=\"date-picker-container\">\n <div\n #trigger\n class=\"date-picker-input\"\n [class.error]=\"hasError\"\n [class.disabled]=\"disabled\"\n [class.open]=\"isOpen\"\n [class.icon-right]=\"iconPosition === 'right'\"\n (click)=\"toggleDropdown($event)\">\n\n <svg *ngIf=\"iconPosition === 'left'\" class=\"calendar-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66667 1.66667V4.16667M13.3333 1.66667V4.16667M2.5 7.5H17.5M4.16667 3.33333H15.8333C16.7538 3.33333 17.5 4.07953 17.5 5V16.6667C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6667V5C2.5 4.07953 3.24619 3.33333 4.16667 3.33333Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n\n <span class=\"date-picker-placeholder\" *ngIf=\"!getDisplayValue()\">\n {{ placeholder }}\n </span>\n <span class=\"date-picker-value\" *ngIf=\"getDisplayValue()\">\n {{ getDisplayValue() }}\n </span>\n\n <svg *ngIf=\"iconPosition === 'right'\" class=\"calendar-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66667 1.66667V4.16667M13.3333 1.66667V4.16667M2.5 7.5H17.5M4.16667 3.33333H15.8333C16.7538 3.33333 17.5 4.07953 17.5 5V16.6667C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6667V5C2.5 4.07953 3.24619 3.33333 4.16667 3.33333Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n\n <div *ngIf=\"hasError && errorMessage\" class=\"field-error\">\n {{ errorMessage }}\n </div>\n</div>\n\n<!-- Dropdown content (rendered with fixed position) -->\n<div *ngIf=\"isOpen\" class=\"date-picker-overlay\">\n <div #dropdown class=\"date-picker-dropdown\" [class.open]=\"isOpen\" [class.range-mode]=\"rangeMode\" [ngStyle]=\"getDropdownStyle()\">\n <div class=\"date-picker-content\">\n <!-- Sidebar with filters (only for range mode) -->\n <div class=\"filter-sidebar\" *ngIf=\"rangeMode\">\n <div\n *ngFor=\"let option of filterOptions\"\n class=\"filter-option\"\n [class.active]=\"selectedFilter === option.value\"\n (click)=\"selectFilter(option.value)\">\n {{ option.label }}\n </div>\n </div>\n\n <!-- Main content (calendars + footer) -->\n <div class=\"date-picker-main\">\n <!-- Calendars -->\n <div class=\"calendars-container\">\n <!-- Left Calendar (or single calendar in single mode) -->\n <div class=\"calendar\">\n <div class=\"calendar-header\">\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigatePreviousMonth()\"\n [class.disabled]=\"!canNavigatePreviousMonth()\"\n (click)=\"previousMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 2L3.5 6L7.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"month-year-selector\">\n <button type=\"button\" class=\"month-year\" (click)=\"toggleLeftMonthPicker($event)\">\n {{ getMonthYear(leftMonthDate) }}\n </button>\n\n <!-- Month/Year Picker Dropdown -->\n <div class=\"month-year-picker\" *ngIf=\"showLeftMonthPicker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-section\">\n <div class=\"picker-title\">Mes</div>\n <div class=\"months-grid\">\n <button\n type=\"button\"\n *ngFor=\"let month of months; let i = index\"\n class=\"month-option\"\n [class.active]=\"i === leftMonthDate.getMonth()\"\n [class.disabled]=\"isMonthDisabled(i, leftMonthDate)\"\n [disabled]=\"isMonthDisabled(i, leftMonthDate)\"\n (click)=\"selectLeftMonth(i, $event)\">\n {{ month.substring(0, 3) }}\n </button>\n </div>\n </div>\n <div class=\"picker-section\">\n <div class=\"picker-header\">\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateLeftYearsPrevious()\"\n [class.disabled]=\"!canNavigateLeftYearsPrevious()\"\n (click)=\"previousLeftYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.25 2.5L3.75 5L6.25 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"picker-title\">{{ getLeftYearRangeLabel() }}</div>\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateLeftYearsNext()\"\n [class.disabled]=\"!canNavigateLeftYearsNext()\"\n (click)=\"nextLeftYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.75 2.5L6.25 5L3.75 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"years-grid\">\n <button\n type=\"button\"\n *ngFor=\"let year of getLeftYears()\"\n class=\"year-option\"\n [class.active]=\"year === leftMonthDate.getFullYear()\"\n [class.disabled]=\"isYearDisabled(year)\"\n [disabled]=\"isYearDisabled(year)\"\n (click)=\"selectLeftYear(year, $event)\">\n {{ year }}\n </button>\n </div>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigateNextMonth()\"\n [class.disabled]=\"!canNavigateNextMonth()\"\n (click)=\"nextMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.5 2L8.5 6L4.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <div class=\"calendar-grid\">\n <div class=\"weekday-header\" *ngFor=\"let day of weekDays\">\n {{ day }}\n </div>\n\n <div\n *ngFor=\"let day of leftCalendarDays; trackBy: trackByDate\"\n class=\"calendar-day\"\n [class.other-month]=\"!day.isCurrentMonth\"\n [class.today]=\"day.isToday\"\n [class.selected]=\"day.isSelected\"\n [class.in-range]=\"rangeMode && isInRange(day.date)\"\n [class.range-start]=\"day.isRangeStart\"\n [class.range-end]=\"day.isRangeEnd\"\n [class.disabled]=\"day.isDisabled\"\n (click)=\"onDayClick(day)\"\n (mouseenter)=\"onDayHover(day)\"\n (mouseleave)=\"onDayLeave()\">\n <span>{{ day.date.getDate() }}</span>\n </div>\n </div>\n </div>\n\n <!-- Right Calendar (only for range mode) -->\n <div class=\"calendar\" *ngIf=\"rangeMode\">\n <div class=\"calendar-header\">\n <div class=\"nav-button-placeholder\"></div>\n <div class=\"month-year-selector\">\n <button type=\"button\" class=\"month-year\" (click)=\"toggleRightMonthPicker($event)\">\n {{ getMonthYear(rightMonthDate) }}\n </button>\n\n <!-- Month/Year Picker Dropdown -->\n <div class=\"month-year-picker\" *ngIf=\"showRightMonthPicker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-section\">\n <div class=\"picker-title\">Mes</div>\n <div class=\"months-grid\">\n <button\n type=\"button\"\n *ngFor=\"let month of months; let i = index\"\n class=\"month-option\"\n [class.active]=\"i === rightMonthDate.getMonth()\"\n [class.disabled]=\"isMonthDisabled(i, rightMonthDate)\"\n [disabled]=\"isMonthDisabled(i, rightMonthDate)\"\n (click)=\"selectRightMonth(i, $event)\">\n {{ month.substring(0, 3) }}\n </button>\n </div>\n </div>\n <div class=\"picker-section\">\n <div class=\"picker-header\">\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateRightYearsPrevious()\"\n [class.disabled]=\"!canNavigateRightYearsPrevious()\"\n (click)=\"previousRightYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.25 2.5L3.75 5L6.25 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"picker-title\">{{ getRightYearRangeLabel() }}</div>\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateRightYearsNext()\"\n [class.disabled]=\"!canNavigateRightYearsNext()\"\n (click)=\"nextRightYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.75 2.5L6.25 5L3.75 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"years-grid\">\n <button\n type=\"button\"\n *ngFor=\"let year of getRightYears()\"\n class=\"year-option\"\n [class.active]=\"year === rightMonthDate.getFullYear()\"\n [class.disabled]=\"isYearDisabled(year)\"\n [disabled]=\"isYearDisabled(year)\"\n (click)=\"selectRightYear(year, $event)\">\n {{ year }}\n </button>\n </div>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigateNextMonth()\"\n [class.disabled]=\"!canNavigateNextMonth()\"\n (click)=\"nextMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.5 2L8.5 6L4.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <div class=\"calendar-grid\">\n <div class=\"weekday-header\" *ngFor=\"let day of weekDays\">\n {{ day }}\n </div>\n\n <div\n *ngFor=\"let day of rightCalendarDays; trackBy: trackByDate\"\n class=\"calendar-day\"\n [class.other-month]=\"!day.isCurrentMonth\"\n [class.today]=\"day.isToday\"\n [class.selected]=\"day.isSelected\"\n [class.in-range]=\"isInRange(day.date)\"\n [class.range-start]=\"day.isRangeStart\"\n [class.range-end]=\"day.isRangeEnd\"\n [class.disabled]=\"day.isDisabled\"\n (click)=\"onDayClick(day)\"\n (mouseenter)=\"onDayHover(day)\"\n (mouseleave)=\"onDayLeave()\">\n <span>{{ day.date.getDate() }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer with dates and actions (only for range mode) -->\n <div class=\"footer\" *ngIf=\"rangeMode\">\n <div class=\"selected-dates\">\n <div class=\"date-display\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.33333 1.33333V3.33333M10.6667 1.33333V3.33333M2 6H14M3.33333 2.66667H12.6667C13.403 2.66667 14 3.26362 14 4V13.3333C14 14.0697 13.403 14.6667 12.6667 14.6667H3.33333C2.59695 14.6667 2 14.0697 2 13.3333V4C2 3.26362 2.59695 2.66667 3.33333 2.66667Z\" stroke=\"#6B7280\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"date-text\">{{ getStartDateDisplay() }}</span>\n </div>\n <span class=\"date-separator\">-</span>\n <div class=\"date-display\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.33333 1.33333V3.33333M10.6667 1.33333V3.33333M2 6H14M3.33333 2.66667H12.6667C13.403 2.66667 14 3.26362 14 4V13.3333C14 14.0697 13.403 14.6667 12.6667 14.6667H3.33333C2.59695 14.6667 2 14.0697 2 13.3333V4C2 3.26362 2.59695 2.66667 3.33333 2.66667Z\" stroke=\"#6B7280\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"date-text\">{{ getEndDateDisplay() }}</span>\n </div>\n </div>\n\n <div class=\"action-buttons\">\n <button type=\"button\" class=\"btn-cancel\" (click)=\"cancel()\">\n Cancelar\n </button>\n <button type=\"button\" class=\"btn-apply\" (click)=\"apply()\">\n Aplicar\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".date-picker-wrapper{display:flex;flex-direction:column;width:100%;margin-bottom:6px;padding:0 4px}.date-picker-wrapper label{display:block;margin-bottom:.5rem;font-family:Quicksand,sans-serif;font-weight:500;font-size:14px;color:#585d61}.date-picker-container{position:relative;width:100%}.date-picker-input{display:flex;align-items:center;gap:.5rem;width:100%;min-height:44px;height:44px;padding:0 .75rem;border:1px solid #EAECF5;box-shadow:0 1px 2px #a1afec66;border-radius:8px;background:#fff;cursor:pointer;transition:all .2s ease;font-family:Quicksand,sans-serif}.date-picker-input:hover:not(.disabled){border-color:#fbd399}.date-picker-input.open{border-color:#fbd399;box-shadow:0 0 0 4px #ffe8c8,0 1px 2px #0a0d120d}.date-picker-input.error{border-color:#f04438}.date-picker-input.disabled{background:#f9fafb;cursor:not-allowed;opacity:.6}.date-picker-input .calendar-icon{color:#a4a7ae;flex-shrink:0}.date-picker-input .date-picker-placeholder{color:#a4a7ae;font-size:14px;flex:1}.date-picker-input .date-picker-value{color:#2e353a;font-size:14px;font-weight:500;flex:1}.field-error{color:#f04438;font-size:.875rem;margin-top:.25rem;font-family:Quicksand,sans-serif}.date-picker-overlay{position:fixed;inset:0;z-index:9999;pointer-events:none}.date-picker-dropdown{pointer-events:all;background:#fff;border-radius:12px;box-shadow:0 10px 40px #00000026;opacity:0;transform:translateY(-10px);transition:all .2s ease;overflow:visible}.date-picker-dropdown.open{opacity:1;transform:translateY(0)}.date-picker-content{display:flex;font-family:Quicksand,sans-serif;overflow:visible}.date-picker-main{display:flex;flex-direction:column;flex:1;overflow:visible}.filter-sidebar{padding:.5rem .8rem;min-width:170px;display:flex;flex-direction:column;border-right:1px solid #F3F4F6}.filter-sidebar .filter-option{font-family:Quicksand,sans-serif;padding:.625rem .8rem;color:#6b7280;cursor:pointer;transition:all .15s ease;white-space:nowrap;position:relative;font-weight:400;font-size:14px}.filter-sidebar .filter-option:hover:not(.active){background:#f9fafb}.filter-sidebar .filter-option.active{background:#fef4e6;color:#f7a733;font-weight:500;border-radius:6px}.calendars-container{display:flex;gap:3rem;padding:1rem;overflow:visible}.date-picker-dropdown:not(.range-mode) .calendars-container{gap:0;justify-content:center}.calendar{display:flex;flex-direction:column;gap:1rem;position:relative;overflow:visible}.calendar .calendar-header{display:flex;align-items:center;justify-content:space-between;padding:0 .25rem;margin-bottom:.5rem;position:relative;overflow:visible}.calendar .calendar-header .month-year-selector{position:relative;flex:1;display:flex;justify-content:center}.calendar .calendar-header .month-year{font-size:.9375rem;font-weight:600;color:#1f2937;min-width:160px;text-align:center;background:transparent;border:none;cursor:pointer;padding:.375rem .5rem;border-radius:6px;transition:all .15s ease}.calendar .calendar-header .month-year:hover{background:#f3f4f6}.calendar .calendar-header .nav-button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:6px;cursor:pointer;color:#6b7280;transition:all .15s ease;padding:0}.calendar .calendar-header .nav-button:hover:not(:disabled):not(.disabled){background:#f3f4f6;color:#1f2937}.calendar .calendar-header .nav-button.disabled,.calendar .calendar-header .nav-button:disabled{color:#d1d5db;cursor:not-allowed;opacity:.4}.calendar .calendar-header .nav-button svg{width:10px;height:10px}.calendar .calendar-header .nav-button-placeholder{width:28px;height:28px}.calendar .month-year-picker{position:absolute;top:100%;left:50%;transform:translate(-50%);margin-top:.5rem;background:#fff;border-radius:8px;box-shadow:0 10px 30px #0003;z-index:10002;padding:1rem;min-width:280px;border:1px solid #E5E7EB}.calendar .month-year-picker .picker-section{margin-bottom:1rem}.calendar .month-year-picker .picker-section:last-child{margin-bottom:0}.calendar .month-year-picker .picker-section .picker-title{font-size:.75rem;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:.5px;margin-bottom:.5rem}.calendar .month-year-picker .picker-section .picker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.calendar .month-year-picker .picker-section .picker-header .picker-title{margin-bottom:0;font-size:.75rem;font-weight:600;color:#1f2937;text-transform:none;letter-spacing:0}.calendar .month-year-picker .picker-section .picker-header .year-nav-button{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;cursor:pointer;color:#6b7280;transition:all .15s ease;padding:0}.calendar .month-year-picker .picker-section .picker-header .year-nav-button:hover:not(:disabled):not(.disabled){background:#f3f4f6;color:#1f2937}.calendar .month-year-picker .picker-section .picker-header .year-nav-button.disabled,.calendar .month-year-picker .picker-section .picker-header .year-nav-button:disabled{color:#d1d5db;cursor:not-allowed;opacity:.5}.calendar .month-year-picker .picker-section .picker-header .year-nav-button svg{width:10px;height:10px}.calendar .month-year-picker .months-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.375rem}.calendar .month-year-picker .months-grid .month-option{padding:.5rem;border:1px solid #E5E7EB;background:#fff;border-radius:6px;font-size:.75rem;font-weight:500;color:#6b7280;cursor:pointer;transition:all .15s ease}.calendar .month-year-picker .months-grid .month-option:hover{background:#f9fafb;border-color:#d1d5db}.calendar .month-year-picker .months-grid .month-option.active{background:#f59100;color:#fff;border-color:#f59100}.calendar .month-year-picker .months-grid .month-option.disabled,.calendar .month-year-picker .months-grid .month-option:disabled{background:#f9fafb;color:#d1d5db;border-color:#e5e7eb;cursor:not-allowed;pointer-events:none}.calendar .month-year-picker .years-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.375rem;max-height:200px;overflow-y:auto}.calendar .month-year-picker .years-grid .year-option{padding:.5rem;border:1px solid #E5E7EB;background:#fff;border-radius:6px;font-size:.75rem;font-weight:500;color:#6b7280;cursor:pointer;transition:all .15s ease}.calendar .month-year-picker .years-grid .year-option:hover{background:#f9fafb;border-color:#d1d5db}.calendar .month-year-picker .years-grid .year-option.active{background:#f59100;color:#fff;border-color:#f59100}.calendar .month-year-picker .years-grid .year-option.disabled,.calendar .month-year-picker .years-grid .year-option:disabled{background:#f9fafb;color:#d1d5db;border-color:#e5e7eb;cursor:not-allowed;pointer-events:none}.calendar .calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px 0}.calendar .calendar-grid .weekday-header{display:flex;align-items:center;justify-content:center;font-size:.6875rem;font-weight:500;color:#9ca3af;padding:.5rem 0;text-transform:uppercase;letter-spacing:.5px}.calendar .calendar-grid .calendar-day{display:flex;align-items:center;justify-content:center;width:36px;height:36px;font-size:.8125rem;color:#1f2937;cursor:pointer;transition:all .15s ease;position:relative;font-weight:400;border-radius:0}.calendar .calendar-grid .calendar-day.other-month{color:#d1d5db}.calendar .calendar-grid .calendar-day.today{font-weight:600;color:#f59100;background:transparent}.calendar .calendar-grid .calendar-day.today:after{content:\"\";position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:4px;height:4px;background:#f59100;border-radius:50%}.calendar .calendar-grid .calendar-day:hover:not(.disabled):not(.selected):not(.range-start):not(.range-end):not(.in-range){background:#fef4e6;border-radius:50%}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end){position:relative;background:transparent}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:0}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#fef4e6;border-radius:50%;z-index:0}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end) span{position:relative;z-index:1;color:#f59100}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end){background:#fef4e6;color:#f59100;border-radius:0}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+8){border-radius:50% 0 0 50%}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+14){border-radius:0 50% 50% 0}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+8):nth-child(7n+14){border-radius:50%}.calendar .calendar-grid .calendar-day.range-start:not(.disabled){position:relative;background:transparent;color:#fff;font-weight:600;z-index:2}.calendar .calendar-grid .calendar-day.range-start:not(.disabled):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:50% 0 0 50%}.calendar .calendar-grid .calendar-day.range-start:not(.disabled):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#f59100;border-radius:50%;z-index:1}.calendar .calendar-grid .calendar-day.range-start:not(.disabled) span{position:relative;z-index:2}.calendar .calendar-grid .calendar-day.range-start:not(.disabled).range-end:before{border-radius:50%}.calendar .calendar-grid .calendar-day.range-end:not(.disabled){position:relative;background:transparent;color:#fff;font-weight:600;z-index:2}.calendar .calendar-grid .calendar-day.range-end:not(.disabled):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:0 50% 50% 0}.calendar .calendar-grid .calendar-day.range-end:not(.disabled):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#f59100;border-radius:50%;z-index:1}.calendar .calendar-grid .calendar-day.range-end:not(.disabled) span{position:relative;z-index:2}.calendar .calendar-grid .calendar-day.range-end:not(.disabled).range-start:before{border-radius:50%}.calendar .calendar-grid .calendar-day.range-start.in-range:not(.disabled){position:relative}.calendar .calendar-grid .calendar-day.range-start.in-range:not(.disabled):before{content:\"\";position:absolute;inset:0 -2px 0 50%;background:#fef4e6;z-index:-1}.calendar .calendar-grid .calendar-day.range-end.in-range:not(.disabled){position:relative}.calendar .calendar-grid .calendar-day.range-end.in-range:not(.disabled):before{content:\"\";position:absolute;inset:0 50% 0 -2px;background:#fef4e6;z-index:-1}.calendar .calendar-grid .calendar-day.selected:not(.range-start):not(.range-end){background:#f59100;color:#fff;font-weight:600;border-radius:50%}.calendar .calendar-grid .calendar-day.disabled{color:#e5e7eb;cursor:not-allowed;pointer-events:none}.footer{display:flex;align-items:center;justify-content:space-between;padding:1rem;border-top:1px solid #E5E7EB}.footer .selected-dates{display:flex;align-items:center;gap:.75rem}.footer .selected-dates .date-display{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:#fff;border:1px solid #E5E7EB;border-radius:6px;font-size:.8125rem;color:#6b7280}.footer .selected-dates .date-display svg{flex-shrink:0;color:#9ca3af}.footer .selected-dates .date-display .date-text{font-weight:400;white-space:nowrap;-webkit-user-select:none;user-select:none}.footer .selected-dates .date-separator{color:#9ca3af;font-weight:400;font-size:.875rem}.footer .action-buttons{display:flex;gap:.75rem}.footer .action-buttons button{padding:.625rem 1.75rem;border-radius:8px;font-size:.875rem;font-weight:500;font-family:Quicksand,sans-serif;cursor:pointer;transition:all .15s ease;border:none;outline:none}.footer .action-buttons button:focus-visible{outline:2px solid rgba(245,145,0,.3);outline-offset:2px}.footer .action-buttons .btn-cancel{background:#fff;color:#6b7280;border:1px solid #D1D5DB}.footer .action-buttons .btn-cancel:hover{background:#f9fafb;border-color:#9ca3af}.footer .action-buttons .btn-apply{background:#f59100;color:#fff;border:1px solid #F59100}.footer .action-buttons .btn-apply:hover{background:#e08500;border-color:#e08500}.footer .action-buttons .btn-apply:active{background:#cc7a00;border-color:#cc7a00}@media (max-width: 768px){.date-picker-content{flex-direction:column}.filter-sidebar{display:none}.calendars-container{padding:.75rem;gap:0;justify-content:center}.calendars-container .calendar:last-child:not(:first-child){display:none}.calendar .calendar-header .month-year-selector{flex:1}.calendar .calendar-header .month-year{min-width:auto;font-size:.875rem;padding:.25rem .375rem}.calendar .calendar-header .nav-button{width:28px;height:28px}.calendar .calendar-header .nav-button svg{width:10px;height:10px}.calendar .calendar-header .nav-button-placeholder{display:none}.calendar .month-year-picker{min-width:240px;padding:.75rem}.calendar .month-year-picker .picker-section .picker-title{font-size:.7rem}.calendar .month-year-picker .months-grid{grid-template-columns:repeat(3,1fr);gap:.25rem}.calendar .month-year-picker .months-grid .month-option{padding:.4rem;font-size:.7rem}.calendar .month-year-picker .years-grid{grid-template-columns:repeat(3,1fr);gap:.25rem;max-height:150px}.calendar .month-year-picker .years-grid .year-option{padding:.4rem;font-size:.7rem}.calendar .calendar-grid{gap:2px 0}.calendar .calendar-grid .calendar-day{width:30px;height:30px;font-size:.75rem}.calendar .calendar-grid .weekday-header{font-size:.65rem}.footer{flex-direction:column;gap:.75rem;padding:.75rem}.footer .selected-dates{width:100%;justify-content:center;flex-wrap:wrap;gap:.5rem}.footer .selected-dates .date-display{font-size:.7rem;padding:.35rem .5rem}.footer .selected-dates .date-display svg{width:12px;height:12px}.footer .selected-dates .date-separator{font-size:.7rem}.footer .action-buttons{width:100%;gap:.5rem}.footer .action-buttons button{flex:1;padding:.625rem .75rem;font-size:.75rem}.date-picker-dropdown{width:280px!important;max-width:calc(100vw - 2rem);max-height:calc(100vh - 4rem);overflow-y:auto}.date-picker-dropdown.range-mode{width:280px!important}}@media (max-width: 480px){.calendars-container{padding:.5rem}.calendar .calendar-header .month-year{font-size:.8125rem;padding:.2rem .3rem}.calendar .calendar-header .nav-button{width:26px;height:26px}.calendar .calendar-header .nav-button svg{width:9px;height:9px}.calendar .month-year-picker{min-width:220px;padding:.625rem}.calendar .month-year-picker .picker-section{margin-bottom:.75rem}.calendar .month-year-picker .picker-section .picker-title{font-size:.65rem;margin-bottom:.375rem}.calendar .month-year-picker .months-grid{gap:.2rem}.calendar .month-year-picker .months-grid .month-option{padding:.35rem;font-size:.65rem}.calendar .month-year-picker .years-grid{gap:.2rem;max-height:120px}.calendar .month-year-picker .years-grid .year-option{padding:.35rem;font-size:.65rem}.calendar .calendar-grid{gap:1px 0}.calendar .calendar-grid .weekday-header{font-size:.6rem;padding:.35rem 0}.calendar .calendar-grid .calendar-day{width:28px;height:28px;font-size:.7rem}.footer{padding:.5rem;gap:.5rem}.footer .selected-dates{gap:.4rem}.footer .selected-dates .date-display{font-size:.65rem;padding:.3rem .4rem}.footer .selected-dates .date-display svg{width:11px;height:11px}.footer .selected-dates .date-separator{font-size:.65rem}.footer .action-buttons{gap:.4rem}.footer .action-buttons button{padding:.5rem .625rem;font-size:.7rem}.date-picker-dropdown{width:260px!important;max-width:calc(100vw - 1rem)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormsModule }] });
|
|
792
|
+
}
|
|
793
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DatePickerComponent, decorators: [{
|
|
794
|
+
type: Component,
|
|
795
|
+
args: [{ selector: 'app-date-picker', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule], providers: [
|
|
796
|
+
{
|
|
797
|
+
provide: NG_VALUE_ACCESSOR,
|
|
798
|
+
useExisting: forwardRef(() => DatePickerComponent),
|
|
799
|
+
multi: true
|
|
800
|
+
}
|
|
801
|
+
], template: "<div class=\"date-picker-wrapper\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n\n <div class=\"date-picker-container\">\n <div\n #trigger\n class=\"date-picker-input\"\n [class.error]=\"hasError\"\n [class.disabled]=\"disabled\"\n [class.open]=\"isOpen\"\n [class.icon-right]=\"iconPosition === 'right'\"\n (click)=\"toggleDropdown($event)\">\n\n <svg *ngIf=\"iconPosition === 'left'\" class=\"calendar-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66667 1.66667V4.16667M13.3333 1.66667V4.16667M2.5 7.5H17.5M4.16667 3.33333H15.8333C16.7538 3.33333 17.5 4.07953 17.5 5V16.6667C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6667V5C2.5 4.07953 3.24619 3.33333 4.16667 3.33333Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n\n <span class=\"date-picker-placeholder\" *ngIf=\"!getDisplayValue()\">\n {{ placeholder }}\n </span>\n <span class=\"date-picker-value\" *ngIf=\"getDisplayValue()\">\n {{ getDisplayValue() }}\n </span>\n\n <svg *ngIf=\"iconPosition === 'right'\" class=\"calendar-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66667 1.66667V4.16667M13.3333 1.66667V4.16667M2.5 7.5H17.5M4.16667 3.33333H15.8333C16.7538 3.33333 17.5 4.07953 17.5 5V16.6667C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6667V5C2.5 4.07953 3.24619 3.33333 4.16667 3.33333Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n\n <div *ngIf=\"hasError && errorMessage\" class=\"field-error\">\n {{ errorMessage }}\n </div>\n</div>\n\n<!-- Dropdown content (rendered with fixed position) -->\n<div *ngIf=\"isOpen\" class=\"date-picker-overlay\">\n <div #dropdown class=\"date-picker-dropdown\" [class.open]=\"isOpen\" [class.range-mode]=\"rangeMode\" [ngStyle]=\"getDropdownStyle()\">\n <div class=\"date-picker-content\">\n <!-- Sidebar with filters (only for range mode) -->\n <div class=\"filter-sidebar\" *ngIf=\"rangeMode\">\n <div\n *ngFor=\"let option of filterOptions\"\n class=\"filter-option\"\n [class.active]=\"selectedFilter === option.value\"\n (click)=\"selectFilter(option.value)\">\n {{ option.label }}\n </div>\n </div>\n\n <!-- Main content (calendars + footer) -->\n <div class=\"date-picker-main\">\n <!-- Calendars -->\n <div class=\"calendars-container\">\n <!-- Left Calendar (or single calendar in single mode) -->\n <div class=\"calendar\">\n <div class=\"calendar-header\">\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigatePreviousMonth()\"\n [class.disabled]=\"!canNavigatePreviousMonth()\"\n (click)=\"previousMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 2L3.5 6L7.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"month-year-selector\">\n <button type=\"button\" class=\"month-year\" (click)=\"toggleLeftMonthPicker($event)\">\n {{ getMonthYear(leftMonthDate) }}\n </button>\n\n <!-- Month/Year Picker Dropdown -->\n <div class=\"month-year-picker\" *ngIf=\"showLeftMonthPicker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-section\">\n <div class=\"picker-title\">Mes</div>\n <div class=\"months-grid\">\n <button\n type=\"button\"\n *ngFor=\"let month of months; let i = index\"\n class=\"month-option\"\n [class.active]=\"i === leftMonthDate.getMonth()\"\n [class.disabled]=\"isMonthDisabled(i, leftMonthDate)\"\n [disabled]=\"isMonthDisabled(i, leftMonthDate)\"\n (click)=\"selectLeftMonth(i, $event)\">\n {{ month.substring(0, 3) }}\n </button>\n </div>\n </div>\n <div class=\"picker-section\">\n <div class=\"picker-header\">\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateLeftYearsPrevious()\"\n [class.disabled]=\"!canNavigateLeftYearsPrevious()\"\n (click)=\"previousLeftYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.25 2.5L3.75 5L6.25 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"picker-title\">{{ getLeftYearRangeLabel() }}</div>\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateLeftYearsNext()\"\n [class.disabled]=\"!canNavigateLeftYearsNext()\"\n (click)=\"nextLeftYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.75 2.5L6.25 5L3.75 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"years-grid\">\n <button\n type=\"button\"\n *ngFor=\"let year of getLeftYears()\"\n class=\"year-option\"\n [class.active]=\"year === leftMonthDate.getFullYear()\"\n [class.disabled]=\"isYearDisabled(year)\"\n [disabled]=\"isYearDisabled(year)\"\n (click)=\"selectLeftYear(year, $event)\">\n {{ year }}\n </button>\n </div>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigateNextMonth()\"\n [class.disabled]=\"!canNavigateNextMonth()\"\n (click)=\"nextMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.5 2L8.5 6L4.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <div class=\"calendar-grid\">\n <div class=\"weekday-header\" *ngFor=\"let day of weekDays\">\n {{ day }}\n </div>\n\n <div\n *ngFor=\"let day of leftCalendarDays; trackBy: trackByDate\"\n class=\"calendar-day\"\n [class.other-month]=\"!day.isCurrentMonth\"\n [class.today]=\"day.isToday\"\n [class.selected]=\"day.isSelected\"\n [class.in-range]=\"rangeMode && isInRange(day.date)\"\n [class.range-start]=\"day.isRangeStart\"\n [class.range-end]=\"day.isRangeEnd\"\n [class.disabled]=\"day.isDisabled\"\n (click)=\"onDayClick(day)\"\n (mouseenter)=\"onDayHover(day)\"\n (mouseleave)=\"onDayLeave()\">\n <span>{{ day.date.getDate() }}</span>\n </div>\n </div>\n </div>\n\n <!-- Right Calendar (only for range mode) -->\n <div class=\"calendar\" *ngIf=\"rangeMode\">\n <div class=\"calendar-header\">\n <div class=\"nav-button-placeholder\"></div>\n <div class=\"month-year-selector\">\n <button type=\"button\" class=\"month-year\" (click)=\"toggleRightMonthPicker($event)\">\n {{ getMonthYear(rightMonthDate) }}\n </button>\n\n <!-- Month/Year Picker Dropdown -->\n <div class=\"month-year-picker\" *ngIf=\"showRightMonthPicker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-section\">\n <div class=\"picker-title\">Mes</div>\n <div class=\"months-grid\">\n <button\n type=\"button\"\n *ngFor=\"let month of months; let i = index\"\n class=\"month-option\"\n [class.active]=\"i === rightMonthDate.getMonth()\"\n [class.disabled]=\"isMonthDisabled(i, rightMonthDate)\"\n [disabled]=\"isMonthDisabled(i, rightMonthDate)\"\n (click)=\"selectRightMonth(i, $event)\">\n {{ month.substring(0, 3) }}\n </button>\n </div>\n </div>\n <div class=\"picker-section\">\n <div class=\"picker-header\">\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateRightYearsPrevious()\"\n [class.disabled]=\"!canNavigateRightYearsPrevious()\"\n (click)=\"previousRightYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.25 2.5L3.75 5L6.25 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"picker-title\">{{ getRightYearRangeLabel() }}</div>\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateRightYearsNext()\"\n [class.disabled]=\"!canNavigateRightYearsNext()\"\n (click)=\"nextRightYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.75 2.5L6.25 5L3.75 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"years-grid\">\n <button\n type=\"button\"\n *ngFor=\"let year of getRightYears()\"\n class=\"year-option\"\n [class.active]=\"year === rightMonthDate.getFullYear()\"\n [class.disabled]=\"isYearDisabled(year)\"\n [disabled]=\"isYearDisabled(year)\"\n (click)=\"selectRightYear(year, $event)\">\n {{ year }}\n </button>\n </div>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigateNextMonth()\"\n [class.disabled]=\"!canNavigateNextMonth()\"\n (click)=\"nextMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.5 2L8.5 6L4.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <div class=\"calendar-grid\">\n <div class=\"weekday-header\" *ngFor=\"let day of weekDays\">\n {{ day }}\n </div>\n\n <div\n *ngFor=\"let day of rightCalendarDays; trackBy: trackByDate\"\n class=\"calendar-day\"\n [class.other-month]=\"!day.isCurrentMonth\"\n [class.today]=\"day.isToday\"\n [class.selected]=\"day.isSelected\"\n [class.in-range]=\"isInRange(day.date)\"\n [class.range-start]=\"day.isRangeStart\"\n [class.range-end]=\"day.isRangeEnd\"\n [class.disabled]=\"day.isDisabled\"\n (click)=\"onDayClick(day)\"\n (mouseenter)=\"onDayHover(day)\"\n (mouseleave)=\"onDayLeave()\">\n <span>{{ day.date.getDate() }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer with dates and actions (only for range mode) -->\n <div class=\"footer\" *ngIf=\"rangeMode\">\n <div class=\"selected-dates\">\n <div class=\"date-display\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.33333 1.33333V3.33333M10.6667 1.33333V3.33333M2 6H14M3.33333 2.66667H12.6667C13.403 2.66667 14 3.26362 14 4V13.3333C14 14.0697 13.403 14.6667 12.6667 14.6667H3.33333C2.59695 14.6667 2 14.0697 2 13.3333V4C2 3.26362 2.59695 2.66667 3.33333 2.66667Z\" stroke=\"#6B7280\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"date-text\">{{ getStartDateDisplay() }}</span>\n </div>\n <span class=\"date-separator\">-</span>\n <div class=\"date-display\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.33333 1.33333V3.33333M10.6667 1.33333V3.33333M2 6H14M3.33333 2.66667H12.6667C13.403 2.66667 14 3.26362 14 4V13.3333C14 14.0697 13.403 14.6667 12.6667 14.6667H3.33333C2.59695 14.6667 2 14.0697 2 13.3333V4C2 3.26362 2.59695 2.66667 3.33333 2.66667Z\" stroke=\"#6B7280\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"date-text\">{{ getEndDateDisplay() }}</span>\n </div>\n </div>\n\n <div class=\"action-buttons\">\n <button type=\"button\" class=\"btn-cancel\" (click)=\"cancel()\">\n Cancelar\n </button>\n <button type=\"button\" class=\"btn-apply\" (click)=\"apply()\">\n Aplicar\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".date-picker-wrapper{display:flex;flex-direction:column;width:100%;margin-bottom:6px;padding:0 4px}.date-picker-wrapper label{display:block;margin-bottom:.5rem;font-family:Quicksand,sans-serif;font-weight:500;font-size:14px;color:#585d61}.date-picker-container{position:relative;width:100%}.date-picker-input{display:flex;align-items:center;gap:.5rem;width:100%;min-height:44px;height:44px;padding:0 .75rem;border:1px solid #EAECF5;box-shadow:0 1px 2px #a1afec66;border-radius:8px;background:#fff;cursor:pointer;transition:all .2s ease;font-family:Quicksand,sans-serif}.date-picker-input:hover:not(.disabled){border-color:#fbd399}.date-picker-input.open{border-color:#fbd399;box-shadow:0 0 0 4px #ffe8c8,0 1px 2px #0a0d120d}.date-picker-input.error{border-color:#f04438}.date-picker-input.disabled{background:#f9fafb;cursor:not-allowed;opacity:.6}.date-picker-input .calendar-icon{color:#a4a7ae;flex-shrink:0}.date-picker-input .date-picker-placeholder{color:#a4a7ae;font-size:14px;flex:1}.date-picker-input .date-picker-value{color:#2e353a;font-size:14px;font-weight:500;flex:1}.field-error{color:#f04438;font-size:.875rem;margin-top:.25rem;font-family:Quicksand,sans-serif}.date-picker-overlay{position:fixed;inset:0;z-index:9999;pointer-events:none}.date-picker-dropdown{pointer-events:all;background:#fff;border-radius:12px;box-shadow:0 10px 40px #00000026;opacity:0;transform:translateY(-10px);transition:all .2s ease;overflow:visible}.date-picker-dropdown.open{opacity:1;transform:translateY(0)}.date-picker-content{display:flex;font-family:Quicksand,sans-serif;overflow:visible}.date-picker-main{display:flex;flex-direction:column;flex:1;overflow:visible}.filter-sidebar{padding:.5rem .8rem;min-width:170px;display:flex;flex-direction:column;border-right:1px solid #F3F4F6}.filter-sidebar .filter-option{font-family:Quicksand,sans-serif;padding:.625rem .8rem;color:#6b7280;cursor:pointer;transition:all .15s ease;white-space:nowrap;position:relative;font-weight:400;font-size:14px}.filter-sidebar .filter-option:hover:not(.active){background:#f9fafb}.filter-sidebar .filter-option.active{background:#fef4e6;color:#f7a733;font-weight:500;border-radius:6px}.calendars-container{display:flex;gap:3rem;padding:1rem;overflow:visible}.date-picker-dropdown:not(.range-mode) .calendars-container{gap:0;justify-content:center}.calendar{display:flex;flex-direction:column;gap:1rem;position:relative;overflow:visible}.calendar .calendar-header{display:flex;align-items:center;justify-content:space-between;padding:0 .25rem;margin-bottom:.5rem;position:relative;overflow:visible}.calendar .calendar-header .month-year-selector{position:relative;flex:1;display:flex;justify-content:center}.calendar .calendar-header .month-year{font-size:.9375rem;font-weight:600;color:#1f2937;min-width:160px;text-align:center;background:transparent;border:none;cursor:pointer;padding:.375rem .5rem;border-radius:6px;transition:all .15s ease}.calendar .calendar-header .month-year:hover{background:#f3f4f6}.calendar .calendar-header .nav-button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:6px;cursor:pointer;color:#6b7280;transition:all .15s ease;padding:0}.calendar .calendar-header .nav-button:hover:not(:disabled):not(.disabled){background:#f3f4f6;color:#1f2937}.calendar .calendar-header .nav-button.disabled,.calendar .calendar-header .nav-button:disabled{color:#d1d5db;cursor:not-allowed;opacity:.4}.calendar .calendar-header .nav-button svg{width:10px;height:10px}.calendar .calendar-header .nav-button-placeholder{width:28px;height:28px}.calendar .month-year-picker{position:absolute;top:100%;left:50%;transform:translate(-50%);margin-top:.5rem;background:#fff;border-radius:8px;box-shadow:0 10px 30px #0003;z-index:10002;padding:1rem;min-width:280px;border:1px solid #E5E7EB}.calendar .month-year-picker .picker-section{margin-bottom:1rem}.calendar .month-year-picker .picker-section:last-child{margin-bottom:0}.calendar .month-year-picker .picker-section .picker-title{font-size:.75rem;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:.5px;margin-bottom:.5rem}.calendar .month-year-picker .picker-section .picker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.calendar .month-year-picker .picker-section .picker-header .picker-title{margin-bottom:0;font-size:.75rem;font-weight:600;color:#1f2937;text-transform:none;letter-spacing:0}.calendar .month-year-picker .picker-section .picker-header .year-nav-button{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;cursor:pointer;color:#6b7280;transition:all .15s ease;padding:0}.calendar .month-year-picker .picker-section .picker-header .year-nav-button:hover:not(:disabled):not(.disabled){background:#f3f4f6;color:#1f2937}.calendar .month-year-picker .picker-section .picker-header .year-nav-button.disabled,.calendar .month-year-picker .picker-section .picker-header .year-nav-button:disabled{color:#d1d5db;cursor:not-allowed;opacity:.5}.calendar .month-year-picker .picker-section .picker-header .year-nav-button svg{width:10px;height:10px}.calendar .month-year-picker .months-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.375rem}.calendar .month-year-picker .months-grid .month-option{padding:.5rem;border:1px solid #E5E7EB;background:#fff;border-radius:6px;font-size:.75rem;font-weight:500;color:#6b7280;cursor:pointer;transition:all .15s ease}.calendar .month-year-picker .months-grid .month-option:hover{background:#f9fafb;border-color:#d1d5db}.calendar .month-year-picker .months-grid .month-option.active{background:#f59100;color:#fff;border-color:#f59100}.calendar .month-year-picker .months-grid .month-option.disabled,.calendar .month-year-picker .months-grid .month-option:disabled{background:#f9fafb;color:#d1d5db;border-color:#e5e7eb;cursor:not-allowed;pointer-events:none}.calendar .month-year-picker .years-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.375rem;max-height:200px;overflow-y:auto}.calendar .month-year-picker .years-grid .year-option{padding:.5rem;border:1px solid #E5E7EB;background:#fff;border-radius:6px;font-size:.75rem;font-weight:500;color:#6b7280;cursor:pointer;transition:all .15s ease}.calendar .month-year-picker .years-grid .year-option:hover{background:#f9fafb;border-color:#d1d5db}.calendar .month-year-picker .years-grid .year-option.active{background:#f59100;color:#fff;border-color:#f59100}.calendar .month-year-picker .years-grid .year-option.disabled,.calendar .month-year-picker .years-grid .year-option:disabled{background:#f9fafb;color:#d1d5db;border-color:#e5e7eb;cursor:not-allowed;pointer-events:none}.calendar .calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px 0}.calendar .calendar-grid .weekday-header{display:flex;align-items:center;justify-content:center;font-size:.6875rem;font-weight:500;color:#9ca3af;padding:.5rem 0;text-transform:uppercase;letter-spacing:.5px}.calendar .calendar-grid .calendar-day{display:flex;align-items:center;justify-content:center;width:36px;height:36px;font-size:.8125rem;color:#1f2937;cursor:pointer;transition:all .15s ease;position:relative;font-weight:400;border-radius:0}.calendar .calendar-grid .calendar-day.other-month{color:#d1d5db}.calendar .calendar-grid .calendar-day.today{font-weight:600;color:#f59100;background:transparent}.calendar .calendar-grid .calendar-day.today:after{content:\"\";position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:4px;height:4px;background:#f59100;border-radius:50%}.calendar .calendar-grid .calendar-day:hover:not(.disabled):not(.selected):not(.range-start):not(.range-end):not(.in-range){background:#fef4e6;border-radius:50%}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end){position:relative;background:transparent}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:0}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#fef4e6;border-radius:50%;z-index:0}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end) span{position:relative;z-index:1;color:#f59100}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end){background:#fef4e6;color:#f59100;border-radius:0}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+8){border-radius:50% 0 0 50%}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+14){border-radius:0 50% 50% 0}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+8):nth-child(7n+14){border-radius:50%}.calendar .calendar-grid .calendar-day.range-start:not(.disabled){position:relative;background:transparent;color:#fff;font-weight:600;z-index:2}.calendar .calendar-grid .calendar-day.range-start:not(.disabled):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:50% 0 0 50%}.calendar .calendar-grid .calendar-day.range-start:not(.disabled):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#f59100;border-radius:50%;z-index:1}.calendar .calendar-grid .calendar-day.range-start:not(.disabled) span{position:relative;z-index:2}.calendar .calendar-grid .calendar-day.range-start:not(.disabled).range-end:before{border-radius:50%}.calendar .calendar-grid .calendar-day.range-end:not(.disabled){position:relative;background:transparent;color:#fff;font-weight:600;z-index:2}.calendar .calendar-grid .calendar-day.range-end:not(.disabled):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:0 50% 50% 0}.calendar .calendar-grid .calendar-day.range-end:not(.disabled):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#f59100;border-radius:50%;z-index:1}.calendar .calendar-grid .calendar-day.range-end:not(.disabled) span{position:relative;z-index:2}.calendar .calendar-grid .calendar-day.range-end:not(.disabled).range-start:before{border-radius:50%}.calendar .calendar-grid .calendar-day.range-start.in-range:not(.disabled){position:relative}.calendar .calendar-grid .calendar-day.range-start.in-range:not(.disabled):before{content:\"\";position:absolute;inset:0 -2px 0 50%;background:#fef4e6;z-index:-1}.calendar .calendar-grid .calendar-day.range-end.in-range:not(.disabled){position:relative}.calendar .calendar-grid .calendar-day.range-end.in-range:not(.disabled):before{content:\"\";position:absolute;inset:0 50% 0 -2px;background:#fef4e6;z-index:-1}.calendar .calendar-grid .calendar-day.selected:not(.range-start):not(.range-end){background:#f59100;color:#fff;font-weight:600;border-radius:50%}.calendar .calendar-grid .calendar-day.disabled{color:#e5e7eb;cursor:not-allowed;pointer-events:none}.footer{display:flex;align-items:center;justify-content:space-between;padding:1rem;border-top:1px solid #E5E7EB}.footer .selected-dates{display:flex;align-items:center;gap:.75rem}.footer .selected-dates .date-display{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:#fff;border:1px solid #E5E7EB;border-radius:6px;font-size:.8125rem;color:#6b7280}.footer .selected-dates .date-display svg{flex-shrink:0;color:#9ca3af}.footer .selected-dates .date-display .date-text{font-weight:400;white-space:nowrap;-webkit-user-select:none;user-select:none}.footer .selected-dates .date-separator{color:#9ca3af;font-weight:400;font-size:.875rem}.footer .action-buttons{display:flex;gap:.75rem}.footer .action-buttons button{padding:.625rem 1.75rem;border-radius:8px;font-size:.875rem;font-weight:500;font-family:Quicksand,sans-serif;cursor:pointer;transition:all .15s ease;border:none;outline:none}.footer .action-buttons button:focus-visible{outline:2px solid rgba(245,145,0,.3);outline-offset:2px}.footer .action-buttons .btn-cancel{background:#fff;color:#6b7280;border:1px solid #D1D5DB}.footer .action-buttons .btn-cancel:hover{background:#f9fafb;border-color:#9ca3af}.footer .action-buttons .btn-apply{background:#f59100;color:#fff;border:1px solid #F59100}.footer .action-buttons .btn-apply:hover{background:#e08500;border-color:#e08500}.footer .action-buttons .btn-apply:active{background:#cc7a00;border-color:#cc7a00}@media (max-width: 768px){.date-picker-content{flex-direction:column}.filter-sidebar{display:none}.calendars-container{padding:.75rem;gap:0;justify-content:center}.calendars-container .calendar:last-child:not(:first-child){display:none}.calendar .calendar-header .month-year-selector{flex:1}.calendar .calendar-header .month-year{min-width:auto;font-size:.875rem;padding:.25rem .375rem}.calendar .calendar-header .nav-button{width:28px;height:28px}.calendar .calendar-header .nav-button svg{width:10px;height:10px}.calendar .calendar-header .nav-button-placeholder{display:none}.calendar .month-year-picker{min-width:240px;padding:.75rem}.calendar .month-year-picker .picker-section .picker-title{font-size:.7rem}.calendar .month-year-picker .months-grid{grid-template-columns:repeat(3,1fr);gap:.25rem}.calendar .month-year-picker .months-grid .month-option{padding:.4rem;font-size:.7rem}.calendar .month-year-picker .years-grid{grid-template-columns:repeat(3,1fr);gap:.25rem;max-height:150px}.calendar .month-year-picker .years-grid .year-option{padding:.4rem;font-size:.7rem}.calendar .calendar-grid{gap:2px 0}.calendar .calendar-grid .calendar-day{width:30px;height:30px;font-size:.75rem}.calendar .calendar-grid .weekday-header{font-size:.65rem}.footer{flex-direction:column;gap:.75rem;padding:.75rem}.footer .selected-dates{width:100%;justify-content:center;flex-wrap:wrap;gap:.5rem}.footer .selected-dates .date-display{font-size:.7rem;padding:.35rem .5rem}.footer .selected-dates .date-display svg{width:12px;height:12px}.footer .selected-dates .date-separator{font-size:.7rem}.footer .action-buttons{width:100%;gap:.5rem}.footer .action-buttons button{flex:1;padding:.625rem .75rem;font-size:.75rem}.date-picker-dropdown{width:280px!important;max-width:calc(100vw - 2rem);max-height:calc(100vh - 4rem);overflow-y:auto}.date-picker-dropdown.range-mode{width:280px!important}}@media (max-width: 480px){.calendars-container{padding:.5rem}.calendar .calendar-header .month-year{font-size:.8125rem;padding:.2rem .3rem}.calendar .calendar-header .nav-button{width:26px;height:26px}.calendar .calendar-header .nav-button svg{width:9px;height:9px}.calendar .month-year-picker{min-width:220px;padding:.625rem}.calendar .month-year-picker .picker-section{margin-bottom:.75rem}.calendar .month-year-picker .picker-section .picker-title{font-size:.65rem;margin-bottom:.375rem}.calendar .month-year-picker .months-grid{gap:.2rem}.calendar .month-year-picker .months-grid .month-option{padding:.35rem;font-size:.65rem}.calendar .month-year-picker .years-grid{gap:.2rem;max-height:120px}.calendar .month-year-picker .years-grid .year-option{padding:.35rem;font-size:.65rem}.calendar .calendar-grid{gap:1px 0}.calendar .calendar-grid .weekday-header{font-size:.6rem;padding:.35rem 0}.calendar .calendar-grid .calendar-day{width:28px;height:28px;font-size:.7rem}.footer{padding:.5rem;gap:.5rem}.footer .selected-dates{gap:.4rem}.footer .selected-dates .date-display{font-size:.65rem;padding:.3rem .4rem}.footer .selected-dates .date-display svg{width:11px;height:11px}.footer .selected-dates .date-separator{font-size:.65rem}.footer .action-buttons{gap:.4rem}.footer .action-buttons button{padding:.5rem .625rem;font-size:.7rem}.date-picker-dropdown{width:260px!important;max-width:calc(100vw - 1rem)}}\n"] }]
|
|
802
|
+
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: Document, decorators: [{
|
|
803
|
+
type: Inject,
|
|
804
|
+
args: [DOCUMENT]
|
|
805
|
+
}] }], propDecorators: { label: [{
|
|
806
|
+
type: Input
|
|
807
|
+
}], id: [{
|
|
808
|
+
type: Input
|
|
809
|
+
}], placeholder: [{
|
|
810
|
+
type: Input
|
|
811
|
+
}], hasError: [{
|
|
812
|
+
type: Input
|
|
813
|
+
}], errorMessage: [{
|
|
814
|
+
type: Input
|
|
815
|
+
}], disabled: [{
|
|
816
|
+
type: Input
|
|
817
|
+
}], minDate: [{
|
|
818
|
+
type: Input
|
|
819
|
+
}], maxDate: [{
|
|
820
|
+
type: Input
|
|
821
|
+
}], rangeMode: [{
|
|
822
|
+
type: Input
|
|
823
|
+
}], iconPosition: [{
|
|
824
|
+
type: Input
|
|
825
|
+
}], trigger: [{
|
|
826
|
+
type: ViewChild,
|
|
827
|
+
args: ['trigger', { read: ElementRef }]
|
|
828
|
+
}], dropdown: [{
|
|
829
|
+
type: ViewChild,
|
|
830
|
+
args: ['dropdown', { read: ElementRef }]
|
|
831
|
+
}], onDocumentClick: [{
|
|
832
|
+
type: HostListener,
|
|
833
|
+
args: ['document:click', ['$event']]
|
|
834
|
+
}] } });
|
|
835
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9hdG9tcy9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2F0b21zL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUVWLFlBQVksRUFHYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBb0N2QyxNQUFNLE9BQU8sbUJBQW1CO0lBcUVwQjtJQUNrQjtJQXJFbkIsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDUixXQUFXLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsT0FBTyxDQUFRO0lBQ2YsT0FBTyxDQUFRO0lBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLHlDQUF5QztJQUM1RCxZQUFZLEdBQXFCLE1BQU0sQ0FBQztJQUVMLE9BQU8sQ0FBYztJQUNwQixRQUFRLENBQWM7SUFFbkUsb0JBQW9CO0lBQ3BCLFdBQVcsR0FBZ0IsSUFBSSxDQUFDO0lBQ2hDLGNBQWM7SUFDZCxVQUFVLEdBQWMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUUzRCxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2YsUUFBUSxHQUFRLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUN6QixTQUFTLEdBQVEsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBRTFCLGFBQWEsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ2pDLGNBQWMsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ2xDLGFBQWEsR0FBZ0IsSUFBSSxDQUFDO0lBQ2xDLFdBQVcsR0FBZ0IsSUFBSSxDQUFDO0lBQ2hDLGNBQWMsR0FBZ0IsSUFBSSxDQUFDO0lBQ25DLFNBQVMsR0FBZ0IsSUFBSSxDQUFDO0lBRTlCLCtDQUErQztJQUMvQyxxQkFBcUIsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3pDLHNCQUFzQixHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7SUFFMUMsdUJBQXVCO0lBQ3ZCLGdCQUFnQixHQUFrQixFQUFFLENBQUM7SUFDckMsaUJBQWlCLEdBQWtCLEVBQUUsQ0FBQztJQUV0QyxhQUFhLEdBQTZDO1FBQ3hELEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1FBQzlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1FBQ2hDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO1FBQzlDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO1FBQ2xELEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1FBQ3hDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO1FBQzVDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1FBQ3hDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO1FBQzVDLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO0tBQ2pELENBQUM7SUFFRixjQUFjLEdBQXNCLEVBQUUsQ0FBQztJQUV2QyxRQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXZJLDBCQUEwQjtJQUMxQixtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDNUIsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQzdCLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDckIsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLG1CQUFtQixHQUFHLENBQUMsQ0FBQztJQUN4QixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRVYsYUFBYSxHQUF3QixJQUFJLENBQUM7SUFDMUMsYUFBYSxHQUF3QixJQUFJLENBQUM7SUFDbEQsZ0JBQWdCLEdBQWtDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFFOUUsWUFDVSxRQUFtQixFQUNELFFBQWtCO1FBRHBDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDRCxhQUFRLEdBQVIsUUFBUSxDQUFVO0lBQzNDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFFLENBQUM7SUFDSCxDQUFDO0lBR0QsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFFekIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7UUFDbkQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM3RSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM5RSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFdkUsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDaEMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBYyxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLG1CQUFtQixJQUFJLHVCQUF1QixFQUFFLENBQUM7WUFDbkQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3RFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDakMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksY0FBYyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBYyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxJQUFJLGVBQWUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsS0FBWTtRQUN6QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRTFCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUM3QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTVELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUU3QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVuQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDaEMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFDLE9BQU87WUFDTCxVQUFVLEVBQUUsT0FBTztZQUNuQixNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDckIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxHQUFHO1lBQ25CLFNBQVMsRUFBRSxPQUFPO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRXBELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQy9DLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRWhELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3BELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBRTdELElBQUksWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsYUFBYSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDckMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0UsQ0FBQztZQUVELElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsY0FBYyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sYUFBYSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRW5ELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFckIsSUFBSSxZQUFZLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDakMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDO1lBRWxDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNiLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUM1QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4RSxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDbEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1lBRXRELElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUU1QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUUxQixJQUFJLFVBQVUsR0FBRyxjQUFjLElBQUksVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDO1lBQzNELEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE9BQU87WUFDTCxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUk7WUFDZixJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUk7U0FDbEIsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTVELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUM3QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDMUQsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFMUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVyRixNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRU8seUJBQXlCO1FBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUQsT0FBTyxHQUFHLEtBQUssTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUFVO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsT0FBTyxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELG9CQUFvQixDQUFDLFNBQWU7UUFDbEMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTdDLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDO1lBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVsQyxNQUFNLElBQUksR0FBa0IsRUFBRSxDQUFDO1FBRS9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxJQUFVLEVBQUUsY0FBdUI7UUFDM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFOUIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV2RCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDM0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFFckUsSUFBSSxTQUFTO2dCQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxPQUFPO2dCQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFMUMsWUFBWSxHQUFHLGNBQWMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNoRyxVQUFVLEdBQUcsY0FBYyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzFGLFVBQVUsR0FBRyxZQUFZLElBQUksVUFBVSxDQUFDO1lBRXhDLElBQUksY0FBYyxJQUFJLFNBQVMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDM0MsU0FBUyxHQUFHLFFBQVEsR0FBRyxTQUFTLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUN6RCxDQUFDO2lCQUFNLElBQUksY0FBYyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JFLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0MsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxhQUFhLEdBQUcsU0FBUyxFQUFFLENBQUM7b0JBQzlCLFNBQVMsR0FBRyxRQUFRLEdBQUcsU0FBUyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUM7Z0JBQy9ELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNoRixJQUFJLFlBQVk7Z0JBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRCxVQUFVLEdBQUcsY0FBYyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3RHLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhFLE9BQU87WUFDTCxJQUFJO1lBQ0osY0FBYztZQUNkLE9BQU87WUFDUCxVQUFVO1lBQ1YsU0FBUztZQUNULFlBQVk7WUFDWixVQUFVO1lBQ1YsVUFBVTtTQUNYLENBQUM7SUFDSixDQUFDO0lBRU8sY0FBYyxDQUFDLElBQVU7UUFDL0IsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQztRQUNyRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYSxFQUFFLEdBQWdCO1FBQ3pDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVU7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUVyRSxJQUFJLFNBQVM7WUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlDLElBQUksT0FBTztZQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFMUMsSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFLENBQUM7WUFDekIsT0FBTyxRQUFRLEdBQUcsU0FBUyxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDcEQsQ0FBQzthQUFNLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuRCxNQUFNLGFBQWEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0MsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLGFBQWEsR0FBRyxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxRQUFRLEdBQUcsU0FBUyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBZ0I7UUFDekIsSUFBSSxHQUFHLENBQUMsVUFBVTtZQUFFLE9BQU87UUFFM0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFakMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFrQixDQUFDO1lBRXpDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN4QixDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMvQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUUvQixJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztvQkFDbEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7Z0JBQ2pDLENBQUM7cUJBQU0sSUFBSSxXQUFXLEdBQUcsU0FBUyxFQUFFLENBQUM7b0JBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO2dCQUNqQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7b0JBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO2dCQUNuQyxDQUFDO2dCQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDO1lBQ2xDLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBZ0I7UUFDekIsSUFBSSxHQUFHLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzlDLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUFFLE9BQU87UUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQUUsT0FBTztRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEcsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNHLENBQUM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRS9CLE1BQU0sWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEcsTUFBTSxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXRGLE9BQU8sWUFBWSxJQUFJLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRS9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDN0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXRGLE9BQU8sUUFBUSxJQUFJLFlBQVksQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQVU7UUFDckIsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFvQjtRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTyxXQUFXLENBQUMsTUFBb0I7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNCLElBQUksU0FBUyxHQUFnQixJQUFJLENBQUM7UUFDbEMsSUFBSSxPQUFPLEdBQWdCLElBQUksQ0FBQztRQUVoQyxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxLQUFLO2dCQUNSLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDOUIsTUFBTTtZQUNSLEtBQUssYUFBYTtnQkFDaEIsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsTUFBTTtZQUNSLEtBQUssZUFBZTtnQkFDbEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0MsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzdDLE9BQU8sR0FBRyxXQUFXLENBQUM7Z0JBQ3RCLE1BQU07WUFDUixLQUFLLFVBQVU7Z0JBQ2IsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsTUFBTTtZQUNSLEtBQUssWUFBWTtnQkFDZixTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNO1lBQ1IsS0FBSyxVQUFVO2dCQUNiLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLE1BQU07WUFDUixLQUFLLFlBQVk7Z0JBQ2YsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNwRCxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3BELE1BQU07WUFDUixLQUFLLGNBQWM7Z0JBQ2pCLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ2pCLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ2YsTUFBTTtRQUNWLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztRQUUzQixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNGLENBQUM7SUFDSCxDQUFDO0lBRU8sY0FBYyxDQUFDLElBQVU7UUFDL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzNDLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztZQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQzdDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRztnQkFDaEIsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUM3QixPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDMUIsQ0FBQztZQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQVU7UUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFZO1FBQ2hDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDckQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxLQUFZO1FBQ2pDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDdkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdFLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUUzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxHQUFHLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGFBQWE7UUFDWCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUUsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBRTNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEdBQUcsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBWTtRQUMvQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQVk7UUFDM0IsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFZO1FBQ2hDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBWTtRQUM1QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUFrQixFQUFFLFlBQWtCO1FBQ3BELE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFckUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLElBQUksUUFBUSxHQUFHLFlBQVk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0MsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RixJQUFJLFFBQVEsR0FBRyxZQUFZO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNDLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBWTtRQUN6QixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkUsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ25FLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25DLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsNEJBQTRCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQztRQUVoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVuRixNQUFNLGlCQUFpQixHQUFhLEVBQUUsQ0FBQztRQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWhELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRW5GLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztRQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELDZCQUE2QjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFcEYsTUFBTSxpQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQseUJBQXlCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQztRQUVoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVwRixNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxlQUFlLENBQUMsVUFBa0IsRUFBRSxLQUFhO1FBQy9DLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0UsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQWtCLEVBQUUsS0FBYTtRQUNoRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUN4QyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDekMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBc0I7UUFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsTUFBTSxRQUFRLEdBQUcsS0FBa0IsQ0FBQztZQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUM3QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBb0IsQ0FBQztZQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFFekIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBMzNCVSxtQkFBbUIsMkNBc0VwQixRQUFROzRGQXRFUCxtQkFBbUIsOFdBUm5CO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbEQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLHlHQWM2QixVQUFVLCtGQUNULFVBQVUsNkJDOUQzQyxnM2VBdVNBLHV1ZkRqUVksWUFBWSxvVkFBRSxtQkFBbUIsOEJBQUUsV0FBVzs7NEZBVzdDLG1CQUFtQjtrQkFkL0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLGFBRzlDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDOzRCQUNsRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjs7MEJBd0VFLE1BQU07MkJBQUMsUUFBUTt5Q0FyRVQsS0FBSztzQkFBYixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVzQyxPQUFPO3NCQUFsRCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ0csUUFBUTtzQkFBcEQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQW1GM0MsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgZm9yd2FyZFJlZixcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIEhvc3RMaXN0ZW5lcixcbiAgUmVuZGVyZXIyLFxuICBPbkluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICBzdGFydERhdGU6IERhdGUgfCBudWxsO1xuICBlbmREYXRlOiBEYXRlIHwgbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgRGF0ZVBpY2tlclZhbHVlID0gRGF0ZSB8IG51bGwgfCBEYXRlUmFuZ2U7XG5cbmludGVyZmFjZSBDYWxlbmRhckRheSB7XG4gIGRhdGU6IERhdGU7XG4gIGlzQ3VycmVudE1vbnRoOiBib29sZWFuO1xuICBpc1RvZGF5OiBib29sZWFuO1xuICBpc1NlbGVjdGVkOiBib29sZWFuO1xuICBpc0luUmFuZ2U6IGJvb2xlYW47XG4gIGlzUmFuZ2VTdGFydDogYm9vbGVhbjtcbiAgaXNSYW5nZUVuZDogYm9vbGVhbjtcbiAgaXNEaXNhYmxlZDogYm9vbGVhbjtcbn1cblxudHlwZSBGaWx0ZXJPcHRpb24gPSAnaG95JyB8ICdheWVyJyB8ICdlc3RhLXNlbWFuYScgfCAnc2VtYW5hLXBhc2FkYScgfCAnZXN0ZS1tZXMnIHwgJ21lcy1wYXNhZG8nIHwgJ2VzdGUtYW5vJyB8ICdhbm8tcGFzYWRvJyB8ICdtb3N0cmFyLXRvZG8nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGF0ZS1waWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgQElucHV0KCkgaWQgPSAnJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnU2VsZWNjaW9uYXIgZmVjaGEnO1xuICBASW5wdXQoKSBoYXNFcnJvciA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2UgPSAnJztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgbWluRGF0ZT86IERhdGU7XG4gIEBJbnB1dCgpIG1heERhdGU/OiBEYXRlO1xuICBASW5wdXQoKSByYW5nZU1vZGUgPSBmYWxzZTsgLy8gZmFsc2UgPSBzaW5nbGUgZGF0ZSwgdHJ1ZSA9IGRhdGUgcmFuZ2VcbiAgQElucHV0KCkgaWNvblBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnID0gJ2xlZnQnO1xuXG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgdHJpZ2dlciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3Bkb3duPzogRWxlbWVudFJlZjtcblxuICAvLyBTaW5nbGUgZGF0ZSB2YWx1ZVxuICBzaW5nbGVWYWx1ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAvLyBSYW5nZSB2YWx1ZVxuICByYW5nZVZhbHVlOiBEYXRlUmFuZ2UgPSB7IHN0YXJ0RGF0ZTogbnVsbCwgZW5kRGF0ZTogbnVsbCB9O1xuXG4gIGlzT3BlbiA9IGZhbHNlO1xuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgbGVmdE1vbnRoRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIHJpZ2h0TW9udGhEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgdGVtcFN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICB0ZW1wRW5kRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICB0ZW1wU2luZ2xlRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBob3ZlckRhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICAvLyBTdG9yZSBvcmlnaW5hbCBjYWxlbmRhciBwb3NpdGlvbnMgZm9yIGNhbmNlbFxuICBvcmlnaW5hbExlZnRNb250aERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICBvcmlnaW5hbFJpZ2h0TW9udGhEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcblxuICAvLyBDYWNoZWQgY2FsZW5kYXIgZGF5c1xuICBsZWZ0Q2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheVtdID0gW107XG4gIHJpZ2h0Q2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheVtdID0gW107XG5cbiAgZmlsdGVyT3B0aW9uczogeyB2YWx1ZTogRmlsdGVyT3B0aW9uOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHZhbHVlOiAnaG95JywgbGFiZWw6ICdIb3knIH0sXG4gICAgeyB2YWx1ZTogJ2F5ZXInLCBsYWJlbDogJ0F5ZXInIH0sXG4gICAgeyB2YWx1ZTogJ2VzdGEtc2VtYW5hJywgbGFiZWw6ICdFc3RhIHNlbWFuYScgfSxcbiAgICB7IHZhbHVlOiAnc2VtYW5hLXBhc2FkYScsIGxhYmVsOiAnU2VtYW5hIHBhc2FkYScgfSxcbiAgICB7IHZhbHVlOiAnZXN0ZS1tZXMnLCBsYWJlbDogJ0VzdGUgbWVzJyB9LFxuICAgIHsgdmFsdWU6ICdtZXMtcGFzYWRvJywgbGFiZWw6ICdNZXMgcGFzYWRvJyB9LFxuICAgIHsgdmFsdWU6ICdlc3RlLWFubycsIGxhYmVsOiAnRXN0ZSBhw7FvJyB9LFxuICAgIHsgdmFsdWU6ICdhbm8tcGFzYWRvJywgbGFiZWw6ICdBw7FvIHBhc2FkbycgfSxcbiAgICB7IHZhbHVlOiAnbW9zdHJhci10b2RvJywgbGFiZWw6ICdNb3N0cmFyIHRvZG8nIH1cbiAgXTtcblxuICBzZWxlY3RlZEZpbHRlcjogRmlsdGVyT3B0aW9uIHwgJycgPSAnJztcblxuICB3ZWVrRGF5cyA9IFsnTHUnLCAnTWEnLCAnTWknLCAnSnUnLCAnVmknLCAnU2EnLCAnRG8nXTtcbiAgbW9udGhzID0gWydFbmVybycsICdGZWJyZXJvJywgJ01hcnpvJywgJ0FicmlsJywgJ01heW8nLCAnSnVuaW8nLCAnSnVsaW8nLCAnQWdvc3RvJywgJ1NlcHRpZW1icmUnLCAnT2N0dWJyZScsICdOb3ZpZW1icmUnLCAnRGljaWVtYnJlJ107XG5cbiAgLy8gTW9udGgvWWVhciBwaWNrZXIgc3RhdGVcbiAgc2hvd0xlZnRNb250aFBpY2tlciA9IGZhbHNlO1xuICBzaG93UmlnaHRNb250aFBpY2tlciA9IGZhbHNlO1xuICB5ZWFyczogbnVtYmVyW10gPSBbXTtcbiAgbGVmdFllYXJQaWNrZXJQYWdlID0gMDtcbiAgcmlnaHRZZWFyUGlja2VyUGFnZSA9IDA7XG4gIHllYXJzUGVyUGFnZSA9IDEyO1xuXG4gIHByaXZhdGUgc2Nyb2xsSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVzaXplSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIGRyb3Bkb3duUG9zaXRpb246IHsgdG9wOiBzdHJpbmc7IGxlZnQ6IHN0cmluZyB9ID0geyB0b3A6ICcwcHgnLCBsZWZ0OiAnMHB4JyB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplRGF0ZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlUmVwb3NpdGlvbkxpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRGF0ZXMoKTogdm9pZCB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMubGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIDEpO1xuICAgIHRoaXMucmlnaHRNb250aERhdGUgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhckRheXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXJEYXlzKCk6IHZvaWQge1xuICAgIHRoaXMubGVmdENhbGVuZGFyRGF5cyA9IHRoaXMuZ2VuZXJhdGVDYWxlbmRhckRheXModGhpcy5sZWZ0TW9udGhEYXRlKTtcbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhckRheXMgPSB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJEYXlzKHRoaXMucmlnaHRNb250aERhdGUpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJpZ2dlckVsZW1lbnQgPSB0aGlzLnRyaWdnZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZHJvcGRvd25FbGVtZW50ID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZGF0ZS1waWNrZXItZHJvcGRvd24nKTtcbiAgICBjb25zdCBtb250aFllYXJQaWNrZXJzID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW9udGgteWVhci1waWNrZXInKTtcbiAgICBjb25zdCBtb250aFllYXJCdXR0b25zID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW9udGgteWVhcicpO1xuXG4gICAgbGV0IGlzT25Nb250aFllYXJCdXR0b24gPSBmYWxzZTtcbiAgICBtb250aFllYXJCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcbiAgICAgIGlmIChidXR0b24uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIGlzT25Nb250aFllYXJCdXR0b24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGlzSW5zaWRlTW9udGhZZWFyUGlja2VyID0gZmFsc2U7XG4gICAgbW9udGhZZWFyUGlja2Vycy5mb3JFYWNoKHBpY2tlciA9PiB7XG4gICAgICBpZiAocGlja2VyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgICBpc0luc2lkZU1vbnRoWWVhclBpY2tlciA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaXNPbk1vbnRoWWVhckJ1dHRvbiB8fCBpc0luc2lkZU1vbnRoWWVhclBpY2tlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkcm9wZG93bkVsZW1lbnQgJiYgZHJvcGRvd25FbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgdGhpcy5zaG93TGVmdE1vbnRoUGlja2VyID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dSaWdodE1vbnRoUGlja2VyID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJFbGVtZW50ICYmICF0cmlnZ2VyRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgJiYgIWRyb3Bkb3duRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlbkRyb3Bkb3duKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRHJvcGRvd24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgdGhpcy50ZW1wU3RhcnREYXRlID0gdGhpcy5yYW5nZVZhbHVlLnN0YXJ0RGF0ZTtcbiAgICAgIHRoaXMudGVtcEVuZERhdGUgPSB0aGlzLnJhbmdlVmFsdWUuZW5kRGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wU2luZ2xlRGF0ZSA9IHRoaXMuc2luZ2xlVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5vcmlnaW5hbExlZnRNb250aERhdGUgPSBuZXcgRGF0ZSh0aGlzLmxlZnRNb250aERhdGUpO1xuICAgIHRoaXMub3JpZ2luYWxSaWdodE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRoaXMucmlnaHRNb250aERhdGUpO1xuXG4gICAgdGhpcy5sZWZ0WWVhclBpY2tlclBhZ2UgPSAwO1xuICAgIHRoaXMucmlnaHRZZWFyUGlja2VyUGFnZSA9IDA7XG5cbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpO1xuICAgICAgdGhpcy5hZGRSZXBvc2l0aW9uTGlzdGVuZXJzKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXREcm9wZG93blN0eWxlKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIpIHJldHVybiB7fTtcblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbigpO1xuICAgIHJldHVybiB7XG4gICAgICAncG9zaXRpb24nOiAnZml4ZWQnLFxuICAgICAgJ2xlZnQnOiBwb3NpdGlvbi5sZWZ0LFxuICAgICAgJ3RvcCc6IHBvc2l0aW9uLnRvcCxcbiAgICAgICd6LWluZGV4JzogJzEwMDAwJ1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uKCk6IHsgdG9wOiBzdHJpbmc7IGxlZnQ6IHN0cmluZyB9IHtcbiAgICBjb25zdCB0cmlnZ2VyRWxlbWVudCA9IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGxldCBkcm9wZG93bldpZHRoID0gdGhpcy5yYW5nZU1vZGUgPyA4MzAgOiAzMjA7XG4gICAgbGV0IGRyb3Bkb3duSGVpZ2h0ID0gdGhpcy5yYW5nZU1vZGUgPyA1MjAgOiA0MDA7XG5cbiAgICBpZiAodGhpcy5kcm9wZG93bikge1xuICAgICAgY29uc3QgZHJvcGRvd25FbGVtZW50ID0gdGhpcy5kcm9wZG93bi5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgZHJvcGRvd25SZWN0ID0gZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICBpZiAoZHJvcGRvd25SZWN0LndpZHRoID4gMCkge1xuICAgICAgICBkcm9wZG93bldpZHRoID0gZHJvcGRvd25SZWN0LndpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJvcGRvd25XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNzY4ID8gMjgwIDogKHRoaXMucmFuZ2VNb2RlID8gODMwIDogMzIwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyb3Bkb3duUmVjdC5oZWlnaHQgPiAwKSB7XG4gICAgICAgIGRyb3Bkb3duSGVpZ2h0ID0gZHJvcGRvd25SZWN0LmhlaWdodDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZHJvcGRvd25XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNzY4ID8gMjgwIDogKHRoaXMucmFuZ2VNb2RlID8gODMwIDogMzIwKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjZU9uUmlnaHQgPSB3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QubGVmdDtcblxuICAgIGxldCBsZWZ0ID0gcmVjdC5sZWZ0O1xuXG4gICAgaWYgKHNwYWNlT25SaWdodCA8IGRyb3Bkb3duV2lkdGgpIHtcbiAgICAgIGxlZnQgPSByZWN0LnJpZ2h0IC0gZHJvcGRvd25XaWR0aDtcblxuICAgICAgaWYgKGxlZnQgPCAwKSB7XG4gICAgICAgIGxlZnQgPSBNYXRoLm1heCg4LCB3aW5kb3cuaW5uZXJXaWR0aCAtIGRyb3Bkb3duV2lkdGggLSA4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPCA3NjgpIHtcbiAgICAgIGNvbnN0IGNlbnRlcmVkTGVmdCA9IHJlY3QubGVmdCArIChyZWN0LndpZHRoIC8gMikgLSAoZHJvcGRvd25XaWR0aCAvIDIpO1xuICAgICAgY29uc3QgbWluTGVmdCA9IDg7XG4gICAgICBjb25zdCBtYXhMZWZ0ID0gd2luZG93LmlubmVyV2lkdGggLSBkcm9wZG93bldpZHRoIC0gODtcblxuICAgICAgbGVmdCA9IE1hdGgubWF4KG1pbkxlZnQsIE1hdGgubWluKGNlbnRlcmVkTGVmdCwgbWF4TGVmdCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNwYWNlQmVsb3cgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmJvdHRvbTtcbiAgICBjb25zdCBzcGFjZUFib3ZlID0gcmVjdC50b3A7XG5cbiAgICBsZXQgdG9wID0gcmVjdC5ib3R0b20gKyA0O1xuXG4gICAgaWYgKHNwYWNlQmVsb3cgPCBkcm9wZG93bkhlaWdodCAmJiBzcGFjZUFib3ZlID4gc3BhY2VCZWxvdykge1xuICAgICAgdG9wID0gcmVjdC50b3AgLSBkcm9wZG93bkhlaWdodCAtIDQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcDogYCR7dG9wfXB4YCxcbiAgICAgIGxlZnQ6IGAke2xlZnR9cHhgXG4gICAgfTtcbiAgfVxuXG4gIGNsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5sZWZ0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5vcmlnaW5hbExlZnRNb250aERhdGUpO1xuICAgIHRoaXMucmlnaHRNb250aERhdGUgPSBuZXcgRGF0ZSh0aGlzLm9yaWdpbmFsUmlnaHRNb250aERhdGUpO1xuXG4gICAgaWYgKHRoaXMucmFuZ2VNb2RlKSB7XG4gICAgICB0aGlzLnRlbXBTdGFydERhdGUgPSB0aGlzLnJhbmdlVmFsdWUuc3RhcnREYXRlO1xuICAgICAgdGhpcy50ZW1wRW5kRGF0ZSA9IHRoaXMucmFuZ2VWYWx1ZS5lbmREYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBTaW5nbGVEYXRlID0gdGhpcy5zaW5nbGVWYWx1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyRGF5cygpO1xuICAgIHRoaXMucmVtb3ZlUmVwb3NpdGlvbkxpc3RlbmVycygpO1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5ob3ZlckRhdGUgPSBudWxsO1xuICAgIHRoaXMuc2hvd0xlZnRNb250aFBpY2tlciA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1JpZ2h0TW9udGhQaWNrZXIgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVwb3NpdGlvbkxpc3RlbmVycygpOiB2b2lkIHtcbiAgICBjb25zdCBzY3JvbGxIYW5kbGVyID0gKCkgPT4gdGhpcy51cGRhdGVEcm9wZG93blBvc2l0aW9uKCk7XG4gICAgY29uc3QgcmVzaXplSGFuZGxlciA9ICgpID0+IHRoaXMudXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIsIHRydWUpO1xuICAgIHRoaXMuc2Nyb2xsSGFuZGxlciA9ICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyLCB0cnVlKTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemVIYW5kbGVyKTtcbiAgICB0aGlzLnJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcmVzaXplSGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVJlcG9zaXRpb25MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsSGFuZGxlcikge1xuICAgICAgdGhpcy5zY3JvbGxIYW5kbGVyKCk7XG4gICAgICB0aGlzLnNjcm9sbEhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc2l6ZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMucmVzaXplSGFuZGxlcigpO1xuICAgICAgdGhpcy5yZXNpemVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIpIHJldHVybjtcbiAgICB0aGlzLmRyb3Bkb3duUG9zaXRpb24gPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKCk7XG4gIH1cblxuICBnZXREaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIGlmICh0aGlzLnJhbmdlVmFsdWUuc3RhcnREYXRlICYmIHRoaXMucmFuZ2VWYWx1ZS5lbmREYXRlKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5mb3JtYXREYXRlU2hvcnQodGhpcy5yYW5nZVZhbHVlLnN0YXJ0RGF0ZSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuZm9ybWF0RGF0ZVNob3J0KHRoaXMucmFuZ2VWYWx1ZS5lbmREYXRlKTtcbiAgICAgICAgcmV0dXJuIGAke3N0YXJ0fSAtICR7ZW5kfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnNpbmdsZVZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGVTaG9ydCh0aGlzLnNpbmdsZVZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZm9ybWF0RGF0ZVNob3J0KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XG4gIH1cblxuICBnZW5lcmF0ZUNhbGVuZGFyRGF5cyhtb250aERhdGU6IERhdGUpOiBDYWxlbmRhckRheVtdIHtcbiAgICBjb25zdCB5ZWFyID0gbW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBtb250aERhdGUuZ2V0TW9udGgoKTtcbiAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICBjb25zdCBsYXN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKTtcblxuICAgIGxldCBzdGFydERheSA9IGZpcnN0RGF5LmdldERheSgpIC0gMTtcbiAgICBpZiAoc3RhcnREYXkgPT09IC0xKSBzdGFydERheSA9IDY7XG5cbiAgICBjb25zdCBkYXlzOiBDYWxlbmRhckRheVtdID0gW107XG5cbiAgICBjb25zdCBwcmV2TW9udGhMYXN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApO1xuICAgIGZvciAobGV0IGkgPSBzdGFydERheSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBwcmV2TW9udGhMYXN0RGF5LmdldERhdGUoKSAtIGkpO1xuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGRheXMucHVzaCh0aGlzLmNyZWF0ZUNhbGVuZGFyRGF5KGRhdGUsIGZhbHNlKSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IGxhc3REYXkuZ2V0RGF0ZSgpOyBkYXkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpO1xuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGRheXMucHVzaCh0aGlzLmNyZWF0ZUNhbGVuZGFyRGF5KGRhdGUsIHRydWUpKTtcbiAgICB9XG5cbiAgICBjb25zdCByZW1haW5pbmdEYXlzID0gNDIgLSBkYXlzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBkYXkgPSAxOyBkYXkgPD0gcmVtYWluaW5nRGF5czsgZGF5KyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIGRheSk7XG4gICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgZGF5cy5wdXNoKHRoaXMuY3JlYXRlQ2FsZW5kYXJEYXkoZGF0ZSwgZmFsc2UpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF5cztcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2FsZW5kYXJEYXkoZGF0ZTogRGF0ZSwgaXNDdXJyZW50TW9udGg6IGJvb2xlYW4pOiBDYWxlbmRhckRheSB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgY29uc3QgZGF0ZU9ubHkgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBkYXRlT25seS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgIGNvbnN0IGlzVG9kYXkgPSBkYXRlT25seS5nZXRUaW1lKCkgPT09IHRvZGF5LmdldFRpbWUoKTtcblxuICAgIGxldCBpc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgbGV0IGlzUmFuZ2VTdGFydCA9IGZhbHNlO1xuICAgIGxldCBpc1JhbmdlRW5kID0gZmFsc2U7XG4gICAgbGV0IGlzSW5SYW5nZSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMucmFuZ2VNb2RlKSB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLnRlbXBTdGFydERhdGUgPyBuZXcgRGF0ZSh0aGlzLnRlbXBTdGFydERhdGUpIDogbnVsbDtcbiAgICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLnRlbXBFbmREYXRlID8gbmV3IERhdGUodGhpcy50ZW1wRW5kRGF0ZSkgOiBudWxsO1xuXG4gICAgICBpZiAoc3RhcnREYXRlKSBzdGFydERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBpZiAoZW5kRGF0ZSkgZW5kRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgICAgaXNSYW5nZVN0YXJ0ID0gaXNDdXJyZW50TW9udGggJiYgc3RhcnREYXRlID8gZGF0ZU9ubHkuZ2V0VGltZSgpID09PSBzdGFydERhdGUuZ2V0VGltZSgpIDogZmFsc2U7XG4gICAgICBpc1JhbmdlRW5kID0gaXNDdXJyZW50TW9udGggJiYgZW5kRGF0ZSA/IGRhdGVPbmx5LmdldFRpbWUoKSA9PT0gZW5kRGF0ZS5nZXRUaW1lKCkgOiBmYWxzZTtcbiAgICAgIGlzU2VsZWN0ZWQgPSBpc1JhbmdlU3RhcnQgfHwgaXNSYW5nZUVuZDtcblxuICAgICAgaWYgKGlzQ3VycmVudE1vbnRoICYmIHN0YXJ0RGF0ZSAmJiBlbmREYXRlKSB7XG4gICAgICAgIGlzSW5SYW5nZSA9IGRhdGVPbmx5ID4gc3RhcnREYXRlICYmIGRhdGVPbmx5IDwgZW5kRGF0ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNDdXJyZW50TW9udGggJiYgc3RhcnREYXRlICYmIHRoaXMuaG92ZXJEYXRlICYmICFlbmREYXRlKSB7XG4gICAgICAgIGNvbnN0IGhvdmVyRGF0ZU9ubHkgPSBuZXcgRGF0ZSh0aGlzLmhvdmVyRGF0ZSk7XG4gICAgICAgIGhvdmVyRGF0ZU9ubHkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICAgIGlmIChob3ZlckRhdGVPbmx5ID4gc3RhcnREYXRlKSB7XG4gICAgICAgICAgaXNJblJhbmdlID0gZGF0ZU9ubHkgPiBzdGFydERhdGUgJiYgZGF0ZU9ubHkgPCBob3ZlckRhdGVPbmx5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IHRoaXMudGVtcFNpbmdsZURhdGUgPyBuZXcgRGF0ZSh0aGlzLnRlbXBTaW5nbGVEYXRlKSA6IG51bGw7XG4gICAgICBpZiAoc2VsZWN0ZWREYXRlKSBzZWxlY3RlZERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBpc1NlbGVjdGVkID0gaXNDdXJyZW50TW9udGggJiYgc2VsZWN0ZWREYXRlID8gZGF0ZU9ubHkuZ2V0VGltZSgpID09PSBzZWxlY3RlZERhdGUuZ2V0VGltZSgpIDogZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9ICFpc0N1cnJlbnRNb250aCB8fCB0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGUsXG4gICAgICBpc0N1cnJlbnRNb250aCxcbiAgICAgIGlzVG9kYXksXG4gICAgICBpc1NlbGVjdGVkLFxuICAgICAgaXNJblJhbmdlLFxuICAgICAgaXNSYW5nZVN0YXJ0LFxuICAgICAgaXNSYW5nZUVuZCxcbiAgICAgIGlzRGlzYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWluRGF0ZSAmJiBkYXRlIDwgdGhpcy5taW5EYXRlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5tYXhEYXRlICYmIGRhdGUgPiB0aGlzLm1heERhdGUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyYWNrQnlEYXRlKGluZGV4OiBudW1iZXIsIGRheTogQ2FsZW5kYXJEYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXkuZGF0ZS5nZXRUaW1lKCkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGlzSW5SYW5nZShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnJhbmdlTW9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgZGF0ZU9ubHkgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBkYXRlT25seS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMudGVtcFN0YXJ0RGF0ZSA/IG5ldyBEYXRlKHRoaXMudGVtcFN0YXJ0RGF0ZSkgOiBudWxsO1xuICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLnRlbXBFbmREYXRlID8gbmV3IERhdGUodGhpcy50ZW1wRW5kRGF0ZSkgOiBudWxsO1xuXG4gICAgaWYgKHN0YXJ0RGF0ZSkgc3RhcnREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIGlmIChlbmREYXRlKSBlbmREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlKSB7XG4gICAgICByZXR1cm4gZGF0ZU9ubHkgPiBzdGFydERhdGUgJiYgZGF0ZU9ubHkgPCBlbmREYXRlO1xuICAgIH0gZWxzZSBpZiAoc3RhcnREYXRlICYmIHRoaXMuaG92ZXJEYXRlICYmICFlbmREYXRlKSB7XG4gICAgICBjb25zdCBob3ZlckRhdGVPbmx5ID0gbmV3IERhdGUodGhpcy5ob3ZlckRhdGUpO1xuICAgICAgaG92ZXJEYXRlT25seS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGlmIChob3ZlckRhdGVPbmx5ID4gc3RhcnREYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlT25seSA+IHN0YXJ0RGF0ZSAmJiBkYXRlT25seSA8IGhvdmVyRGF0ZU9ubHk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG9uRGF5Q2xpY2soZGF5OiBDYWxlbmRhckRheSk6IHZvaWQge1xuICAgIGlmIChkYXkuaXNEaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2xpY2tlZERhdGUgPSBuZXcgRGF0ZShkYXkuZGF0ZSk7XG4gICAgY2xpY2tlZERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXIgPSAnJyBhcyBGaWx0ZXJPcHRpb247XG5cbiAgICAgIGlmICghdGhpcy50ZW1wU3RhcnREYXRlIHx8ICh0aGlzLnRlbXBTdGFydERhdGUgJiYgdGhpcy50ZW1wRW5kRGF0ZSkpIHtcbiAgICAgICAgdGhpcy50ZW1wU3RhcnREYXRlID0gY2xpY2tlZERhdGU7XG4gICAgICAgIHRoaXMudGVtcEVuZERhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLmhvdmVyRGF0ZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudGVtcFN0YXJ0RGF0ZSAmJiAhdGhpcy50ZW1wRW5kRGF0ZSkge1xuICAgICAgICBjb25zdCBzdGFydERhdGUgPSBuZXcgRGF0ZSh0aGlzLnRlbXBTdGFydERhdGUpO1xuICAgICAgICBzdGFydERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgaWYgKGNsaWNrZWREYXRlLmdldFRpbWUoKSA9PT0gc3RhcnREYXRlLmdldFRpbWUoKSkge1xuICAgICAgICAgIHRoaXMudGVtcEVuZERhdGUgPSBjbGlja2VkRGF0ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjbGlja2VkRGF0ZSA+IHN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHRoaXMudGVtcEVuZERhdGUgPSBjbGlja2VkRGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRlbXBFbmREYXRlID0gc3RhcnREYXRlO1xuICAgICAgICAgIHRoaXMudGVtcFN0YXJ0RGF0ZSA9IGNsaWNrZWREYXRlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaG92ZXJEYXRlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wU2luZ2xlRGF0ZSA9IGNsaWNrZWREYXRlO1xuICAgICAgLy8gQXV0by1hcHBseSBmb3Igc2luZ2xlIGRhdGUgbW9kZVxuICAgICAgdGhpcy5hcHBseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gIH1cblxuICBvbkRheUhvdmVyKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICBpZiAoZGF5LmlzRGlzYWJsZWQgfHwgIXRoaXMucmFuZ2VNb2RlKSByZXR1cm47XG4gICAgdGhpcy5ob3ZlckRhdGUgPSBkYXkuZGF0ZTtcbiAgfVxuXG4gIG9uRGF5TGVhdmUoKTogdm9pZCB7XG4gICAgdGhpcy5ob3ZlckRhdGUgPSBudWxsO1xuICB9XG5cbiAgcHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuTmF2aWdhdGVQcmV2aW91c01vbnRoKCkpIHJldHVybjtcbiAgICB0aGlzLmxlZnRNb250aERhdGUgPSBuZXcgRGF0ZSh0aGlzLmxlZnRNb250aERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5sZWZ0TW9udGhEYXRlLmdldE1vbnRoKCkgLSAxLCAxKTtcbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIHRoaXMucmlnaHRNb250aERhdGUgPSBuZXcgRGF0ZSh0aGlzLnJpZ2h0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMucmlnaHRNb250aERhdGUuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyRGF5cygpO1xuICB9XG5cbiAgbmV4dE1vbnRoKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5OYXZpZ2F0ZU5leHRNb250aCgpKSByZXR1cm47XG4gICAgdGhpcy5sZWZ0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5sZWZ0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMubGVmdE1vbnRoRGF0ZS5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgaWYgKHRoaXMucmFuZ2VNb2RlKSB7XG4gICAgICB0aGlzLnJpZ2h0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5yaWdodE1vbnRoRGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnJpZ2h0TW9udGhEYXRlLmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhckRheXMoKTtcbiAgfVxuXG4gIGNhbk5hdmlnYXRlUHJldmlvdXNNb250aCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWluRGF0ZSkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBuZXdMZWZ0TW9udGggPSBuZXcgRGF0ZSh0aGlzLmxlZnRNb250aERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5sZWZ0TW9udGhEYXRlLmdldE1vbnRoKCkgLSAxLCAxKTtcbiAgICBjb25zdCBtaW5EYXRlTW9udGggPSBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5taW5EYXRlLmdldE1vbnRoKCksIDEpO1xuXG4gICAgcmV0dXJuIG5ld0xlZnRNb250aCA+PSBtaW5EYXRlTW9udGg7XG4gIH1cblxuICBjYW5OYXZpZ2F0ZU5leHRNb250aCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWF4RGF0ZSkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBjaGVja01vbnRoID0gdGhpcy5yYW5nZU1vZGUgPyB0aGlzLnJpZ2h0TW9udGhEYXRlIDogdGhpcy5sZWZ0TW9udGhEYXRlO1xuICAgIGNvbnN0IG5ld01vbnRoID0gbmV3IERhdGUoY2hlY2tNb250aC5nZXRGdWxsWWVhcigpLCBjaGVja01vbnRoLmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICBjb25zdCBtYXhEYXRlTW9udGggPSBuZXcgRGF0ZSh0aGlzLm1heERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5tYXhEYXRlLmdldE1vbnRoKCksIDEpO1xuXG4gICAgcmV0dXJuIG5ld01vbnRoIDw9IG1heERhdGVNb250aDtcbiAgfVxuXG4gIGdldE1vbnRoWWVhcihkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5tb250aHNbZGF0ZS5nZXRNb250aCgpXX0gJHtkYXRlLmdldEZ1bGxZZWFyKCl9YDtcbiAgfVxuXG4gIHNlbGVjdEZpbHRlcihmaWx0ZXI6IEZpbHRlck9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXIpO1xuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RmlsdGVyKGZpbHRlcjogRmlsdGVyT3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgbGV0IHN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBlbmREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpbHRlcikge1xuICAgICAgY2FzZSAnaG95JzpcbiAgICAgICAgc3RhcnREYXRlID0gbmV3IERhdGUodG9kYXkpO1xuICAgICAgICBlbmREYXRlID0gbmV3IERhdGUodG9kYXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2F5ZXInOlxuICAgICAgICBzdGFydERhdGUgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgICAgIHN0YXJ0RGF0ZS5zZXREYXRlKHN0YXJ0RGF0ZS5nZXREYXRlKCkgLSAxKTtcbiAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXN0YS1zZW1hbmEnOlxuICAgICAgICBzdGFydERhdGUgPSB0aGlzLmdldFN0YXJ0T2ZXZWVrKHRvZGF5KTtcbiAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZW1hbmEtcGFzYWRhJzpcbiAgICAgICAgY29uc3QgbGFzdFdlZWtFbmQgPSBuZXcgRGF0ZSh0aGlzLmdldFN0YXJ0T2ZXZWVrKHRvZGF5KSk7XG4gICAgICAgIGxhc3RXZWVrRW5kLnNldERhdGUobGFzdFdlZWtFbmQuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgICAgIHN0YXJ0RGF0ZSA9IHRoaXMuZ2V0U3RhcnRPZldlZWsobGFzdFdlZWtFbmQpO1xuICAgICAgICBlbmREYXRlID0gbGFzdFdlZWtFbmQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXN0ZS1tZXMnOlxuICAgICAgICBzdGFydERhdGUgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtZXMtcGFzYWRvJzpcbiAgICAgICAgc3RhcnREYXRlID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICBlbmREYXRlID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXN0ZS1hbm8nOlxuICAgICAgICBzdGFydERhdGUgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbm8tcGFzYWRvJzpcbiAgICAgICAgc3RhcnREYXRlID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSAtIDEsIDAsIDEpO1xuICAgICAgICBlbmREYXRlID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSAtIDEsIDExLCAzMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9zdHJhci10b2RvJzpcbiAgICAgICAgc3RhcnREYXRlID0gbnVsbDtcbiAgICAgICAgZW5kRGF0ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMudGVtcFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTtcbiAgICB0aGlzLnRlbXBFbmREYXRlID0gZW5kRGF0ZTtcblxuICAgIGlmIChzdGFydERhdGUpIHtcbiAgICAgIHRoaXMubGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLCBzdGFydERhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgICB0aGlzLnJpZ2h0TW9udGhEYXRlID0gbmV3IERhdGUoc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksIHN0YXJ0RGF0ZS5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIHRoaXMubGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXRlLmdldE1vbnRoKCksIDEpO1xuICAgICAgdGhpcy5yaWdodE1vbnRoRGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXJ0T2ZXZWVrKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICBjb25zdCBkYXkgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGRpZmYgPSBkYXkgPT09IDAgPyAtNiA6IDEgLSBkYXk7XG4gICAgY29uc3Qgc3RhcnRPZldlZWsgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBzdGFydE9mV2Vlay5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgZGlmZik7XG4gICAgcmV0dXJuIHN0YXJ0T2ZXZWVrO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgdGhpcy50ZW1wU3RhcnREYXRlID0gdGhpcy5yYW5nZVZhbHVlLnN0YXJ0RGF0ZTtcbiAgICAgIHRoaXMudGVtcEVuZERhdGUgPSB0aGlzLnJhbmdlVmFsdWUuZW5kRGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wU2luZ2xlRGF0ZSA9IHRoaXMuc2luZ2xlVmFsdWU7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXIgPSAnJztcblxuICAgIHRoaXMubGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRoaXMub3JpZ2luYWxMZWZ0TW9udGhEYXRlKTtcbiAgICB0aGlzLnJpZ2h0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5vcmlnaW5hbFJpZ2h0TW9udGhEYXRlKTtcblxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gIH1cblxuICBhcHBseSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIHRoaXMucmFuZ2VWYWx1ZSA9IHtcbiAgICAgICAgc3RhcnREYXRlOiB0aGlzLnRlbXBTdGFydERhdGUsXG4gICAgICAgIGVuZERhdGU6IHRoaXMudGVtcEVuZERhdGVcbiAgICAgIH07XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMucmFuZ2VWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2luZ2xlVmFsdWUgPSB0aGlzLnRlbXBTaW5nbGVEYXRlO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnNpbmdsZVZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbmFsTGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRoaXMubGVmdE1vbnRoRGF0ZSk7XG4gICAgdGhpcy5vcmlnaW5hbFJpZ2h0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5yaWdodE1vbnRoRGF0ZSk7XG5cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgdGhpcy5yZW1vdmVSZXBvc2l0aW9uTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmhvdmVyRGF0ZSA9IG51bGw7XG4gICAgdGhpcy5zaG93TGVmdE1vbnRoUGlja2VyID0gZmFsc2U7XG4gICAgdGhpcy5zaG93UmlnaHRNb250aFBpY2tlciA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0U3RhcnREYXRlRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRlbXBTdGFydERhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGVGb3JJbnB1dCh0aGlzLnRlbXBTdGFydERhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gJ0ZlY2hhIGluaWNpbyc7XG4gIH1cblxuICBnZXRFbmREYXRlRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRlbXBFbmREYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlRm9ySW5wdXQodGhpcy50ZW1wRW5kRGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiAnRmVjaGEgZmluJztcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGF0ZUZvcklucHV0KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS50b0xvY2FsZVN0cmluZygnZXMtRVMnLCB7IG1vbnRoOiAnc2hvcnQnIH0pO1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgcmV0dXJuIGAke2RheX0gJHttb250aH0gJHt5ZWFyfWA7XG4gIH1cblxuICB0b2dnbGVMZWZ0TW9udGhQaWNrZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zaG93TGVmdE1vbnRoUGlja2VyID0gIXRoaXMuc2hvd0xlZnRNb250aFBpY2tlcjtcbiAgICB0aGlzLnNob3dSaWdodE1vbnRoUGlja2VyID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuc2hvd0xlZnRNb250aFBpY2tlcikge1xuICAgICAgdGhpcy5sZWZ0WWVhclBpY2tlclBhZ2UgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVJpZ2h0TW9udGhQaWNrZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zaG93UmlnaHRNb250aFBpY2tlciA9ICF0aGlzLnNob3dSaWdodE1vbnRoUGlja2VyO1xuICAgIHRoaXMuc2hvd0xlZnRNb250aFBpY2tlciA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNob3dSaWdodE1vbnRoUGlja2VyKSB7XG4gICAgICB0aGlzLnJpZ2h0WWVhclBpY2tlclBhZ2UgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGdldExlZnRZZWFycygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLmxlZnRNb250aERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBiYXNlWWVhciA9IGN1cnJlbnRZZWFyICsgKHRoaXMubGVmdFllYXJQaWNrZXJQYWdlICogdGhpcy55ZWFyc1BlclBhZ2UpO1xuICAgIGNvbnN0IHllYXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnllYXJzUGVyUGFnZTsgaSsrKSB7XG4gICAgICBjb25zdCB5ZWFyID0gYmFzZVllYXIgLSA1ICsgaTtcbiAgICAgIHllYXJzLnB1c2goeWVhcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHllYXJzO1xuICB9XG5cbiAgZ2V0UmlnaHRZZWFycygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLnJpZ2h0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgYmFzZVllYXIgPSBjdXJyZW50WWVhciArICh0aGlzLnJpZ2h0WWVhclBpY2tlclBhZ2UgKiB0aGlzLnllYXJzUGVyUGFnZSk7XG4gICAgY29uc3QgeWVhcnM6IG51bWJlcltdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMueWVhcnNQZXJQYWdlOyBpKyspIHtcbiAgICAgIGNvbnN0IHllYXIgPSBiYXNlWWVhciAtIDUgKyBpO1xuICAgICAgeWVhcnMucHVzaCh5ZWFyKTtcbiAgICB9XG5cbiAgICByZXR1cm4geWVhcnM7XG4gIH1cblxuICBwcmV2aW91c0xlZnRZZWFyUGFnZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmxlZnRZZWFyUGlja2VyUGFnZS0tO1xuICB9XG5cbiAgbmV4dExlZnRZZWFyUGFnZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmxlZnRZZWFyUGlja2VyUGFnZSsrO1xuICB9XG5cbiAgcHJldmlvdXNSaWdodFllYXJQYWdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmlnaHRZZWFyUGlja2VyUGFnZS0tO1xuICB9XG5cbiAgbmV4dFJpZ2h0WWVhclBhZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yaWdodFllYXJQaWNrZXJQYWdlKys7XG4gIH1cblxuICBpc01vbnRoRGlzYWJsZWQobW9udGhJbmRleDogbnVtYmVyLCBjYWxlbmRhckRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICBjb25zdCB0ZXN0RGF0ZSA9IG5ldyBEYXRlKGNhbGVuZGFyRGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aEluZGV4LCAxKTtcblxuICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1pbkRhdGVNb250aCA9IG5ldyBEYXRlKHRoaXMubWluRGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLm1pbkRhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgICBpZiAodGVzdERhdGUgPCBtaW5EYXRlTW9udGgpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1heERhdGUpIHtcbiAgICAgIGNvbnN0IG1heERhdGVNb250aCA9IG5ldyBEYXRlKHRoaXMubWF4RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLm1heERhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgICBpZiAodGVzdERhdGUgPiBtYXhEYXRlTW9udGgpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzWWVhckRpc2FibGVkKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgeWVhciA8IHRoaXMubWluRGF0ZS5nZXRGdWxsWWVhcigpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5tYXhEYXRlICYmIHllYXIgPiB0aGlzLm1heERhdGUuZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0TGVmdFllYXJSYW5nZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcnMgPSB0aGlzLmdldExlZnRZZWFycygpO1xuICAgIHJldHVybiBgJHt5ZWFyc1swXX0gLSAke3llYXJzW3llYXJzLmxlbmd0aCAtIDFdfWA7XG4gIH1cblxuICBnZXRSaWdodFllYXJSYW5nZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcnMgPSB0aGlzLmdldFJpZ2h0WWVhcnMoKTtcbiAgICByZXR1cm4gYCR7eWVhcnNbMF19IC0gJHt5ZWFyc1t5ZWFycy5sZW5ndGggLSAxXX1gO1xuICB9XG5cbiAgY2FuTmF2aWdhdGVMZWZ0WWVhcnNQcmV2aW91cygpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWluRGF0ZSAmJiAhdGhpcy5tYXhEYXRlKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gdGhpcy5sZWZ0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgYmFzZVllYXIgPSBjdXJyZW50WWVhciArICgodGhpcy5sZWZ0WWVhclBpY2tlclBhZ2UgLSAxKSAqIHRoaXMueWVhcnNQZXJQYWdlKTtcblxuICAgIGNvbnN0IHByZXZpb3VzUGFnZVllYXJzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy55ZWFyc1BlclBhZ2U7IGkrKykge1xuICAgICAgcHJldmlvdXNQYWdlWWVhcnMucHVzaChiYXNlWWVhciAtIDUgKyBpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJldmlvdXNQYWdlWWVhcnMuc29tZSh5ZWFyID0+ICF0aGlzLmlzWWVhckRpc2FibGVkKHllYXIpKTtcbiAgfVxuXG4gIGNhbk5hdmlnYXRlTGVmdFllYXJzTmV4dCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWluRGF0ZSAmJiAhdGhpcy5tYXhEYXRlKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gdGhpcy5sZWZ0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgYmFzZVllYXIgPSBjdXJyZW50WWVhciArICgodGhpcy5sZWZ0WWVhclBpY2tlclBhZ2UgKyAxKSAqIHRoaXMueWVhcnNQZXJQYWdlKTtcblxuICAgIGNvbnN0IG5leHRQYWdlWWVhcnM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnllYXJzUGVyUGFnZTsgaSsrKSB7XG4gICAgICBuZXh0UGFnZVllYXJzLnB1c2goYmFzZVllYXIgLSA1ICsgaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRQYWdlWWVhcnMuc29tZSh5ZWFyID0+ICF0aGlzLmlzWWVhckRpc2FibGVkKHllYXIpKTtcbiAgfVxuXG4gIGNhbk5hdmlnYXRlUmlnaHRZZWFyc1ByZXZpb3VzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5taW5EYXRlICYmICF0aGlzLm1heERhdGUpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLnJpZ2h0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgYmFzZVllYXIgPSBjdXJyZW50WWVhciArICgodGhpcy5yaWdodFllYXJQaWNrZXJQYWdlIC0gMSkgKiB0aGlzLnllYXJzUGVyUGFnZSk7XG5cbiAgICBjb25zdCBwcmV2aW91c1BhZ2VZZWFyczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMueWVhcnNQZXJQYWdlOyBpKyspIHtcbiAgICAgIHByZXZpb3VzUGFnZVllYXJzLnB1c2goYmFzZVllYXIgLSA1ICsgaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZpb3VzUGFnZVllYXJzLnNvbWUoeWVhciA9PiAhdGhpcy5pc1llYXJEaXNhYmxlZCh5ZWFyKSk7XG4gIH1cblxuICBjYW5OYXZpZ2F0ZVJpZ2h0WWVhcnNOZXh0KCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5taW5EYXRlICYmICF0aGlzLm1heERhdGUpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLnJpZ2h0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgYmFzZVllYXIgPSBjdXJyZW50WWVhciArICgodGhpcy5yaWdodFllYXJQaWNrZXJQYWdlICsgMSkgKiB0aGlzLnllYXJzUGVyUGFnZSk7XG5cbiAgICBjb25zdCBuZXh0UGFnZVllYXJzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy55ZWFyc1BlclBhZ2U7IGkrKykge1xuICAgICAgbmV4dFBhZ2VZZWFycy5wdXNoKGJhc2VZZWFyIC0gNSArIGkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0UGFnZVllYXJzLnNvbWUoeWVhciA9PiAhdGhpcy5pc1llYXJEaXNhYmxlZCh5ZWFyKSk7XG4gIH1cblxuICBzZWxlY3RMZWZ0TW9udGgobW9udGhJbmRleDogbnVtYmVyLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5sZWZ0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5sZWZ0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoSW5kZXgsIDEpO1xuICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgdGhpcy5yaWdodE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRoaXMubGVmdE1vbnRoRGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aEluZGV4ICsgMSwgMSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gICAgdGhpcy5zaG93TGVmdE1vbnRoUGlja2VyID0gZmFsc2U7XG4gIH1cblxuICBzZWxlY3RSaWdodE1vbnRoKG1vbnRoSW5kZXg6IG51bWJlciwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMucmlnaHRNb250aERhdGUgPSBuZXcgRGF0ZSh0aGlzLnJpZ2h0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoSW5kZXgsIDEpO1xuICAgIHRoaXMubGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRoaXMucmlnaHRNb250aERhdGUuZ2V0RnVsbFllYXIoKSwgbW9udGhJbmRleCAtIDEsIDEpO1xuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gICAgdGhpcy5zaG93UmlnaHRNb250aFBpY2tlciA9IGZhbHNlO1xuICB9XG5cbiAgc2VsZWN0TGVmdFllYXIoeWVhcjogbnVtYmVyLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5sZWZ0TW9udGhEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5sZWZ0TW9udGhEYXRlLmdldE1vbnRoKCksIDEpO1xuICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgdGhpcy5yaWdodE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMubGVmdE1vbnRoRGF0ZS5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gICAgdGhpcy5zaG93TGVmdE1vbnRoUGlja2VyID0gZmFsc2U7XG4gIH1cblxuICBzZWxlY3RSaWdodFllYXIoeWVhcjogbnVtYmVyLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMucmlnaHRNb250aERhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgdGhpcy5sZWZ0TW9udGhEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5yaWdodE1vbnRoRGF0ZS5nZXRNb250aCgpIC0gMSwgMSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhckRheXMoKTtcbiAgICB0aGlzLnNob3dSaWdodE1vbnRoUGlja2VyID0gZmFsc2U7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlUGlja2VyVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIGNvbnN0IHJhbmdlVmFsID0gdmFsdWUgYXMgRGF0ZVJhbmdlO1xuICAgICAgdGhpcy5yYW5nZVZhbHVlID0gcmFuZ2VWYWwgfHwgeyBzdGFydERhdGU6IG51bGwsIGVuZERhdGU6IG51bGwgfTtcbiAgICAgIHRoaXMudGVtcFN0YXJ0RGF0ZSA9IHRoaXMucmFuZ2VWYWx1ZS5zdGFydERhdGU7XG4gICAgICB0aGlzLnRlbXBFbmREYXRlID0gdGhpcy5yYW5nZVZhbHVlLmVuZERhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2luZ2xlVmFsdWUgPSB2YWx1ZSBhcyBEYXRlIHwgbnVsbDtcbiAgICAgIHRoaXMudGVtcFNpbmdsZURhdGUgPSB0aGlzLnNpbmdsZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgcmVzZXREYXRlUGlja2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgdGhpcy5yYW5nZVZhbHVlID0geyBzdGFydERhdGU6IG51bGwsIGVuZERhdGU6IG51bGwgfTtcbiAgICAgIHRoaXMudGVtcFN0YXJ0RGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBFbmREYXRlID0gbnVsbDtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5yYW5nZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaW5nbGVWYWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBTaW5nbGVEYXRlID0gbnVsbDtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5zaW5nbGVWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXIgPSAnJztcblxuICAgIHRoaXMuaW5pdGlhbGl6ZURhdGVzKCk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhckRheXMoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLXdyYXBwZXJcIj5cbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9yXT1cImlkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuXG4gIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jb250YWluZXJcIj5cbiAgICA8ZGl2XG4gICAgICAjdHJpZ2dlclxuICAgICAgY2xhc3M9XCJkYXRlLXBpY2tlci1pbnB1dFwiXG4gICAgICBbY2xhc3MuZXJyb3JdPVwiaGFzRXJyb3JcIlxuICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtjbGFzcy5vcGVuXT1cImlzT3BlblwiXG4gICAgICBbY2xhc3MuaWNvbi1yaWdodF09XCJpY29uUG9zaXRpb24gPT09ICdyaWdodCdcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCRldmVudClcIj5cblxuICAgICAgPHN2ZyAqbmdJZj1cImljb25Qb3NpdGlvbiA9PT0gJ2xlZnQnXCIgY2xhc3M9XCJjYWxlbmRhci1pY29uXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMS42NjY2N1Y0LjE2NjY3TTEzLjMzMzMgMS42NjY2N1Y0LjE2NjY3TTIuNSA3LjVIMTcuNU00LjE2NjY3IDMuMzMzMzNIMTUuODMzM0MxNi43NTM4IDMuMzMzMzMgMTcuNSA0LjA3OTUzIDE3LjUgNVYxNi42NjY3QzE3LjUgMTcuNTg3MSAxNi43NTM4IDE4LjMzMzMgMTUuODMzMyAxOC4zMzMzSDQuMTY2NjdDMy4yNDYxOSAxOC4zMzMzIDIuNSAxNy41ODcxIDIuNSAxNi42NjY3VjVDMi41IDQuMDc5NTMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjcgMy4zMzMzM1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXBpY2tlci1wbGFjZWhvbGRlclwiICpuZ0lmPVwiIWdldERpc3BsYXlWYWx1ZSgpXCI+XG4gICAgICAgIHt7IHBsYWNlaG9sZGVyIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImRhdGUtcGlja2VyLXZhbHVlXCIgKm5nSWY9XCJnZXREaXNwbGF5VmFsdWUoKVwiPlxuICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoKSB9fVxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8c3ZnICpuZ0lmPVwiaWNvblBvc2l0aW9uID09PSAncmlnaHQnXCIgY2xhc3M9XCJjYWxlbmRhci1pY29uXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMS42NjY2N1Y0LjE2NjY3TTEzLjMzMzMgMS42NjY2N1Y0LjE2NjY3TTIuNSA3LjVIMTcuNU00LjE2NjY3IDMuMzMzMzNIMTUuODMzM0MxNi43NTM4IDMuMzMzMzMgMTcuNSA0LjA3OTUzIDE3LjUgNVYxNi42NjY3QzE3LjUgMTcuNTg3MSAxNi43NTM4IDE4LjMzMzMgMTUuODMzMyAxOC4zMzMzSDQuMTY2NjdDMy4yNDYxOSAxOC4zMzMzIDIuNSAxNy41ODcxIDIuNSAxNi42NjY3VjVDMi41IDQuMDc5NTMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjcgMy4zMzMzM1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImhhc0Vycm9yICYmIGVycm9yTWVzc2FnZVwiIGNsYXNzPVwiZmllbGQtZXJyb3JcIj5cbiAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBEcm9wZG93biBjb250ZW50IChyZW5kZXJlZCB3aXRoIGZpeGVkIHBvc2l0aW9uKSAtLT5cbjxkaXYgKm5nSWY9XCJpc09wZW5cIiBjbGFzcz1cImRhdGUtcGlja2VyLW92ZXJsYXlcIj5cbiAgPGRpdiAjZHJvcGRvd24gY2xhc3M9XCJkYXRlLXBpY2tlci1kcm9wZG93blwiIFtjbGFzcy5vcGVuXT1cImlzT3BlblwiIFtjbGFzcy5yYW5nZS1tb2RlXT1cInJhbmdlTW9kZVwiIFtuZ1N0eWxlXT1cImdldERyb3Bkb3duU3R5bGUoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jb250ZW50XCI+XG4gICAgICA8IS0tIFNpZGViYXIgd2l0aCBmaWx0ZXJzIChvbmx5IGZvciByYW5nZSBtb2RlKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItc2lkZWJhclwiICpuZ0lmPVwicmFuZ2VNb2RlXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlck9wdGlvbnNcIlxuICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLW9wdGlvblwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZEZpbHRlciA9PT0gb3B0aW9uLnZhbHVlXCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RmlsdGVyKG9wdGlvbi52YWx1ZSlcIj5cbiAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBNYWluIGNvbnRlbnQgKGNhbGVuZGFycyArIGZvb3RlcikgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItbWFpblwiPlxuICAgICAgICA8IS0tIENhbGVuZGFycyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFycy1jb250YWluZXJcIj5cbiAgICAgICAgICA8IS0tIExlZnQgQ2FsZW5kYXIgKG9yIHNpbmdsZSBjYWxlbmRhciBpbiBzaW5nbGUgbW9kZSkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItaGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1idXR0b25cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVQcmV2aW91c01vbnRoKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVQcmV2aW91c01vbnRoKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmV2aW91c01vbnRoKClcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy41IDJMMy41IDZMNy41IDEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0b3JcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vbnRoLXllYXJcIiAoY2xpY2spPVwidG9nZ2xlTGVmdE1vbnRoUGlja2VyKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGdldE1vbnRoWWVhcihsZWZ0TW9udGhEYXRlKSB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBNb250aC9ZZWFyIFBpY2tlciBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgteWVhci1waWNrZXJcIiAqbmdJZj1cInNob3dMZWZ0TW9udGhQaWNrZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2VyLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tlci10aXRsZVwiPk1lczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGhzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb250aC1vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBsZWZ0TW9udGhEYXRlLmdldE1vbnRoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChpLCBsZWZ0TW9udGhEYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb250aERpc2FibGVkKGksIGxlZnRNb250aERhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMZWZ0TW9udGgoaSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbW9udGguc3Vic3RyaW5nKDAsIDMpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2VyLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tlci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwieWVhci1uYXYtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVMZWZ0WWVhcnNQcmV2aW91cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVMZWZ0WWVhcnNQcmV2aW91cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmV2aW91c0xlZnRZZWFyUGFnZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1IDIuNUwzLjc1IDVMNi4yNSA3LjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2VyLXRpdGxlXCI+e3sgZ2V0TGVmdFllYXJSYW5nZUxhYmVsKCkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwieWVhci1uYXYtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVMZWZ0WWVhcnNOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZUxlZnRZZWFyc05leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmV4dExlZnRZZWFyUGFnZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjc1IDIuNUw2LjI1IDVMMy43NSA3LjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ5ZWFycy1ncmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgeWVhciBvZiBnZXRMZWZ0WWVhcnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInllYXItb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwieWVhciA9PT0gbGVmdE1vbnRoRGF0ZS5nZXRGdWxsWWVhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc1llYXJEaXNhYmxlZCh5ZWFyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExlZnRZZWFyKHllYXIsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1idXR0b25cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVOZXh0TW9udGgoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZU5leHRNb250aCgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibmV4dE1vbnRoKClcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNC41IDJMOC41IDZMNC41IDEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItZ3JpZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Vla2RheS1oZWFkZXJcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtEYXlzXCI+XG4gICAgICAgICAgICAgICAge3sgZGF5IH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIGxlZnRDYWxlbmRhckRheXM7IHRyYWNrQnk6IHRyYWNrQnlEYXRlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNhbGVuZGFyLWRheVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm90aGVyLW1vbnRoXT1cIiFkYXkuaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJkYXkuaXNUb2RheVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwicmFuZ2VNb2RlICYmIGlzSW5SYW5nZShkYXkuZGF0ZSlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5yYW5nZS1zdGFydF09XCJkYXkuaXNSYW5nZVN0YXJ0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MucmFuZ2UtZW5kXT1cImRheS5pc1JhbmdlRW5kXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRheUNsaWNrKGRheSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uRGF5SG92ZXIoZGF5KVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25EYXlMZWF2ZSgpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgZGF5LmRhdGUuZ2V0RGF0ZSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSaWdodCBDYWxlbmRhciAob25seSBmb3IgcmFuZ2UgbW9kZSkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyXCIgKm5nSWY9XCJyYW5nZU1vZGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b24tcGxhY2Vob2xkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0b3JcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vbnRoLXllYXJcIiAoY2xpY2spPVwidG9nZ2xlUmlnaHRNb250aFBpY2tlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICB7eyBnZXRNb250aFllYXIocmlnaHRNb250aERhdGUpIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE1vbnRoL1llYXIgUGlja2VyIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC15ZWFyLXBpY2tlclwiICpuZ0lmPVwic2hvd1JpZ2h0TW9udGhQaWNrZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2VyLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tlci10aXRsZVwiPk1lczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGhzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb250aC1vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSByaWdodE1vbnRoRGF0ZS5nZXRNb250aCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc01vbnRoRGlzYWJsZWQoaSwgcmlnaHRNb250aERhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01vbnRoRGlzYWJsZWQoaSwgcmlnaHRNb250aERhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSaWdodE1vbnRoKGksICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1vbnRoLnN1YnN0cmluZygwLCAzKSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tlci1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaWNrZXItaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInllYXItbmF2LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbk5hdmlnYXRlUmlnaHRZZWFyc1ByZXZpb3VzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZVJpZ2h0WWVhcnNQcmV2aW91cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmV2aW91c1JpZ2h0WWVhclBhZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4yNSAyLjVMMy43NSA1TDYuMjUgNy41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tlci10aXRsZVwiPnt7IGdldFJpZ2h0WWVhclJhbmdlTGFiZWwoKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ5ZWFyLW5hdi1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZVJpZ2h0WWVhcnNOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZVJpZ2h0WWVhcnNOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5leHRSaWdodFllYXJQYWdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNzUgMi41TDYuMjUgNUwzLjc1IDcuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInllYXJzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB5ZWFyIG9mIGdldFJpZ2h0WWVhcnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInllYXItb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwieWVhciA9PT0gcmlnaHRNb250aERhdGUuZ2V0RnVsbFllYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzWWVhckRpc2FibGVkKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSaWdodFllYXIoeWVhciwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZU5leHRNb250aCgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWNhbk5hdmlnYXRlTmV4dE1vbnRoKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJuZXh0TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00LjUgMkw4LjUgNkw0LjUgMTBcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1ncmlkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrZGF5LWhlYWRlclwiICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla0RheXNcIj5cbiAgICAgICAgICAgICAgICB7eyBkYXkgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2YgcmlnaHRDYWxlbmRhckRheXM7IHRyYWNrQnk6IHRyYWNrQnlEYXRlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNhbGVuZGFyLWRheVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm90aGVyLW1vbnRoXT1cIiFkYXkuaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJkYXkuaXNUb2RheVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwiaXNJblJhbmdlKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnJhbmdlLXN0YXJ0XT1cImRheS5pc1JhbmdlU3RhcnRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5yYW5nZS1lbmRdPVwiZGF5LmlzUmFuZ2VFbmRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXkuaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGF5Q2xpY2soZGF5KVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25EYXlIb3ZlcihkYXkpXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkRheUxlYXZlKClcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBkYXkuZGF0ZS5nZXREYXRlKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRm9vdGVyIHdpdGggZGF0ZXMgYW5kIGFjdGlvbnMgKG9ubHkgZm9yIHJhbmdlIG1vZGUpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCIgKm5nSWY9XCJyYW5nZU1vZGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtZGF0ZXNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWRpc3BsYXlcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk01LjMzMzMzIDEuMzMzMzNWMy4zMzMzM00xMC42NjY3IDEuMzMzMzNWMy4zMzMzM00yIDZIMTRNMy4zMzMzMyAyLjY2NjY3SDEyLjY2NjdDMTMuNDAzIDIuNjY2NjcgMTQgMy4yNjM2MiAxNCA0VjEzLjMzMzNDMTQgMTQuMDY5NyAxMy40MDMgMTQuNjY2NyAxMi42NjY3IDE0LjY2NjdIMy4zMzMzM0MyLjU5Njk1IDE0LjY2NjcgMiAxNC4wNjk3IDIgMTMuMzMzM1Y0QzIgMy4yNjM2MiAyLjU5Njk1IDIuNjY2NjcgMy4zMzMzMyAyLjY2NjY3WlwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGUtdGV4dFwiPnt7IGdldFN0YXJ0RGF0ZURpc3BsYXkoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXNlcGFyYXRvclwiPi08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1kaXNwbGF5XCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS4zMzMzMyAxLjMzMzMzVjMuMzMzMzNNMTAuNjY2NyAxLjMzMzMzVjMuMzMzMzNNMiA2SDE0TTMuMzMzMzMgMi42NjY2N0gxMi42NjY3QzEzLjQwMyAyLjY2NjY3IDE0IDMuMjYzNjIgMTQgNFYxMy4zMzMzQzE0IDE0LjA2OTcgMTMuNDAzIDE0LjY2NjcgMTIuNjY2NyAxNC42NjY3SDMuMzMzMzNDMi41OTY5NSAxNC42NjY3IDIgMTQuMDY5NyAyIDEzLjMzMzNWNEMyIDMuMjYzNjIgMi41OTY5NSAyLjY2NjY3IDMuMzMzMzMgMi42NjY2N1pcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXRleHRcIj57eyBnZXRFbmREYXRlRGlzcGxheSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNhbmNlbFwiIChjbGljayk9XCJjYW5jZWwoKVwiPlxuICAgICAgICAgICAgICBDYW5jZWxhclxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1hcHBseVwiIChjbGljayk9XCJhcHBseSgpXCI+XG4gICAgICAgICAgICAgIEFwbGljYXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|