barsa-calendar 2.2.73 → 2.2.75
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/fesm2022/barsa-calendar.mjs +87 -87
- package/fesm2022/barsa-calendar.mjs.map +1 -1
- package/lib/calendar-container/calendar-container.component.d.ts +1 -1
- package/lib/calendar-list/calendar-list.component.d.ts +1 -1
- package/lib/calendar-month/calendar-month.component.d.ts +1 -1
- package/lib/calendar-week/calendar-week.component.d.ts +3 -3
- package/lib/month-days/month-days.component.d.ts +1 -1
- package/lib/services/calendar.service.d.ts +1 -1
- package/package.json +3 -5
- package/esm2022/barsa-calendar.mjs +0 -5
- package/esm2022/lib/barsa-calendar.module.mjs +0 -117
- package/esm2022/lib/calendar-container/calendar-container.component.mjs +0 -221
- package/esm2022/lib/calendar-header/calendar-header.component.mjs +0 -66
- package/esm2022/lib/calendar-list/calendar-list.component.mjs +0 -18
- package/esm2022/lib/calendar-list-container/calendar-list-container.component.mjs +0 -29
- package/esm2022/lib/calendar-list-item/calendar-list-item.component.mjs +0 -14
- package/esm2022/lib/calendar-month/calendar-month.component.mjs +0 -249
- package/esm2022/lib/calendar-selection-days/calendar-selection-days.component.mjs +0 -196
- package/esm2022/lib/calendar-week/calendar-week.component.mjs +0 -255
- package/esm2022/lib/constants.mjs +0 -4
- package/esm2022/lib/date-time-picker/date-time-picker.component.mjs +0 -457
- package/esm2022/lib/day-event-list/day-event-list.component.mjs +0 -58
- package/esm2022/lib/day-number-box/day-number-box.component.mjs +0 -105
- package/esm2022/lib/days-in-week.pipe.mjs +0 -18
- package/esm2022/lib/equal-date.pipe.mjs +0 -24
- package/esm2022/lib/event-button/event-button.component.mjs +0 -100
- package/esm2022/lib/event-button-end-arrow/event-button-end-arrow.component.mjs +0 -29
- package/esm2022/lib/event-button-start-arrow/event-button-start-arrow.component.mjs +0 -29
- package/esm2022/lib/event-date.pipe.mjs +0 -25
- package/esm2022/lib/event-preview/event-preview.component.mjs +0 -81
- package/esm2022/lib/event-time.pipe.mjs +0 -23
- package/esm2022/lib/from-to-time.pipe.mjs +0 -24
- package/esm2022/lib/models.mjs +0 -14
- package/esm2022/lib/month-days/month-days.component.mjs +0 -222
- package/esm2022/lib/services/calendar.service.mjs +0 -645
- package/esm2022/public-api.mjs +0 -23
|
@@ -1,645 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import { takeUntil } from 'rxjs/operators';
|
|
4
|
-
import { BaseComponent, getUniqueId, getDateService } from 'barsa-novin-ray-core';
|
|
5
|
-
import { CalendarMonthInfo, DayStatus } from '../models';
|
|
6
|
-
import moment from 'moment/moment';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "barsa-novin-ray-core";
|
|
9
|
-
export class CalendarService extends BaseComponent {
|
|
10
|
-
constructor(_logService, culture) {
|
|
11
|
-
super();
|
|
12
|
-
this._logService = _logService;
|
|
13
|
-
this._calendarsSource = new BehaviorSubject([]);
|
|
14
|
-
this._modeSource = new BehaviorSubject('month');
|
|
15
|
-
this._currentMonthIndexSource = new BehaviorSubject(-1);
|
|
16
|
-
this._weekModeDaysSource = new BehaviorSubject([]);
|
|
17
|
-
this._daysSource = new BehaviorSubject([]);
|
|
18
|
-
this._dateService = getDateService(_logService, culture);
|
|
19
|
-
this.days$ = this._daysSource.asObservable();
|
|
20
|
-
this.mode$ = this._modeSource.asObservable();
|
|
21
|
-
this.weekModeDays$ = this._weekModeDaysSource.asObservable();
|
|
22
|
-
this.calendars$ = this._calendarsSource.asObservable();
|
|
23
|
-
this.currentMonthIndex$ = this._currentMonthIndexSource.asObservable();
|
|
24
|
-
this._initilize();
|
|
25
|
-
this.setMode('day');
|
|
26
|
-
}
|
|
27
|
-
get todayMonthInfo() {
|
|
28
|
-
return this._todayMonthInfo;
|
|
29
|
-
}
|
|
30
|
-
get selectedMonth() {
|
|
31
|
-
return this._selectedSource.getValue();
|
|
32
|
-
}
|
|
33
|
-
get calendars() {
|
|
34
|
-
return this._calendarsSource.getValue();
|
|
35
|
-
}
|
|
36
|
-
get weeksCount() {
|
|
37
|
-
return this._daysSource.getValue().length / 7;
|
|
38
|
-
}
|
|
39
|
-
get days() {
|
|
40
|
-
return this._daysSource.getValue();
|
|
41
|
-
}
|
|
42
|
-
get Months() {
|
|
43
|
-
return this._dateService.monthNames();
|
|
44
|
-
}
|
|
45
|
-
loadMonthByDate(value) {
|
|
46
|
-
const monthInfo = this._dateService.getDateInfo(value);
|
|
47
|
-
this.loadMonth(monthInfo);
|
|
48
|
-
}
|
|
49
|
-
setDateService(primaryCalendarType) {
|
|
50
|
-
let dateService = this._dateService;
|
|
51
|
-
switch (primaryCalendarType) {
|
|
52
|
-
case 'Persian':
|
|
53
|
-
dateService = getDateService(this._logService, 'fa-IR');
|
|
54
|
-
break;
|
|
55
|
-
case 'Gregorian':
|
|
56
|
-
dateService = getDateService(this._logService, 'en-US');
|
|
57
|
-
break;
|
|
58
|
-
case 'Arabic':
|
|
59
|
-
dateService = getDateService(this._logService, 'ar-AE');
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
this._dateService = dateService;
|
|
63
|
-
this._initilize();
|
|
64
|
-
}
|
|
65
|
-
setDays(days) {
|
|
66
|
-
this._daysSource.next(days);
|
|
67
|
-
}
|
|
68
|
-
prepareWeek(monthInfo, startIndex, daysCount) {
|
|
69
|
-
const startDays = monthInfo.days.slice(startIndex, startIndex + daysCount);
|
|
70
|
-
this._weekModeDaysSource.next(startDays);
|
|
71
|
-
}
|
|
72
|
-
setSelected(selected) {
|
|
73
|
-
this._selectedSource.next(selected);
|
|
74
|
-
}
|
|
75
|
-
weekDaysMin() {
|
|
76
|
-
return this._dateService.weekdaysMin();
|
|
77
|
-
}
|
|
78
|
-
weekDays() {
|
|
79
|
-
return this._dateService.weekDays();
|
|
80
|
-
}
|
|
81
|
-
gotoToday() {
|
|
82
|
-
this.loadMonth(this._todayMonthInfo.dateInfo, 0);
|
|
83
|
-
this.setMode(this._modeSource.getValue(), this._todayMonthInfo.days.find((c) => c.isToday), this._weekModeDaysSource.getValue().length);
|
|
84
|
-
}
|
|
85
|
-
rangeSelect(startDay, endDay, monthInfo) {
|
|
86
|
-
const diff = endDay.index - startDay.index;
|
|
87
|
-
if (diff < 7) {
|
|
88
|
-
this.setMode('week', startDay, diff + 1);
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
const diff2 = diff + 1;
|
|
92
|
-
this.setMode('customMonth');
|
|
93
|
-
this.setMonth(monthInfo, startDay, diff2);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
setMonth(monthInfo, startDay, diff = 0) {
|
|
97
|
-
if (startDay && diff > 0) {
|
|
98
|
-
const startIndex = startDay.index;
|
|
99
|
-
this.loadCalendarMonthInfo(monthInfo);
|
|
100
|
-
this.setDays(monthInfo.days.slice(startIndex, startIndex + diff));
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
this.loadCalendarMonthInfo(monthInfo);
|
|
104
|
-
this.setDays(monthInfo.days);
|
|
105
|
-
// else if (mode === 'month') {
|
|
106
|
-
// startDay = daysLoaded[0];
|
|
107
|
-
// if (startDay) this.loadMonth(startDay.monthDateInfo);
|
|
108
|
-
// }
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
setMode(mode, startDay, daysCount) {
|
|
112
|
-
const oldMode = this._modeSource.getValue();
|
|
113
|
-
this._modeSource.next(mode);
|
|
114
|
-
if (mode === 'month') {
|
|
115
|
-
this.setMonth(this.selectedMonth, startDay);
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
else if (mode === 'customMonth') {
|
|
119
|
-
this.setMonth(this.selectedMonth, startDay, this.days.length);
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
const daysLoaded = this._weekModeDaysSource.getValue();
|
|
123
|
-
daysCount = daysCount ?? (mode === 'week' ? 7 : 1);
|
|
124
|
-
let startIndex = 0;
|
|
125
|
-
if (!startDay) {
|
|
126
|
-
if (mode === 'week' || mode === 'day') {
|
|
127
|
-
if (oldMode === 'month') {
|
|
128
|
-
{
|
|
129
|
-
startDay = this.selectedMonth.days.find((c) => c.isToday);
|
|
130
|
-
if (!startDay) {
|
|
131
|
-
startDay = this.selectedMonth.days.find((c) => c.isStartOfMonth);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
else if (oldMode === 'customMonth') {
|
|
136
|
-
startDay = this.days[0];
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
startDay = daysLoaded[0];
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
if (startDay) {
|
|
144
|
-
if (startDay.monthDateInfo.month !== this.selectedMonth.dateInfo.month ||
|
|
145
|
-
startDay.monthDateInfo.year !== this.selectedMonth.dateInfo.year) {
|
|
146
|
-
this.loadMonth(startDay.monthDateInfo);
|
|
147
|
-
}
|
|
148
|
-
startIndex = this.selectedMonth.days.findIndex((c) => c.month === startDay?.month && c.dayInMonth === startDay.dayInMonth);
|
|
149
|
-
}
|
|
150
|
-
this.prepareWeek(this._selectedSource.getValue(), startIndex, daysCount);
|
|
151
|
-
}
|
|
152
|
-
fillWeek(week, daysCount = 7) {
|
|
153
|
-
const arr = Object.values(week);
|
|
154
|
-
arr.forEach((element) => {
|
|
155
|
-
for (const el of element) {
|
|
156
|
-
const valueDate = el.end;
|
|
157
|
-
if (valueDate && this._dateService.getMoment(valueDate).isBefore(this.today, 'day')) {
|
|
158
|
-
el.opacity = 0.5;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
for (let i = element.length; i < daysCount; i++) {
|
|
162
|
-
element.push({ colSpan: 1 });
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
sortTasks(calendarTasks, calendarFields) {
|
|
167
|
-
const startDateField = calendarFields.StartDate;
|
|
168
|
-
const endDateField = calendarFields.EndDate;
|
|
169
|
-
calendarTasks.sort((taskA, taskB) => (taskA[startDateField] < taskB[startDateField] ? -1 : 1));
|
|
170
|
-
calendarTasks.sort((taskA, taskB) => {
|
|
171
|
-
const taskAStartDate = taskA[startDateField];
|
|
172
|
-
const taskBStartDate = taskB[startDateField];
|
|
173
|
-
const momentTaskAStartDate = this._dateService.getMoment(taskAStartDate);
|
|
174
|
-
const momentTaskBStartDate = this._dateService.getMoment(taskBStartDate);
|
|
175
|
-
if (momentTaskAStartDate.isSame(momentTaskBStartDate, 'day')) {
|
|
176
|
-
const taskAEndDate = taskA[endDateField];
|
|
177
|
-
const taskBEndDate = taskB[endDateField];
|
|
178
|
-
const dayADiff = momentTaskAStartDate.diff(taskAEndDate, 'day');
|
|
179
|
-
const dayBDiff = momentTaskBStartDate.diff(taskBEndDate, 'day');
|
|
180
|
-
if (dayADiff > dayBDiff) {
|
|
181
|
-
return 1;
|
|
182
|
-
}
|
|
183
|
-
if (dayADiff < dayBDiff) {
|
|
184
|
-
return -1;
|
|
185
|
-
}
|
|
186
|
-
return 0;
|
|
187
|
-
}
|
|
188
|
-
{
|
|
189
|
-
return 0;
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
return calendarTasks;
|
|
193
|
-
}
|
|
194
|
-
createWeekTask(days, moDataList, calendarFields, taskHeight) {
|
|
195
|
-
const week = {};
|
|
196
|
-
days.forEach((day, dayIndex) => {
|
|
197
|
-
let counter = 0;
|
|
198
|
-
moDataList.forEach((event) => {
|
|
199
|
-
const counterIndex = counter.toString();
|
|
200
|
-
if (!week[counterIndex]) {
|
|
201
|
-
week[counterIndex] = [];
|
|
202
|
-
}
|
|
203
|
-
else if (week[counterIndex].length > dayIndex) {
|
|
204
|
-
counter++;
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
for (let m = week[counterIndex].length; m < dayIndex; m++) {
|
|
208
|
-
week[counterIndex].push({ colSpan: 1 });
|
|
209
|
-
}
|
|
210
|
-
// agar week[counter] colspan ja dasht anjam gardad.
|
|
211
|
-
const newTask = { colSpan: 1 };
|
|
212
|
-
const momentDay = this._dateService.getMoment(day.date);
|
|
213
|
-
const momentOfStartEvent = this._dateService.getMoment(event[calendarFields.StartDate]);
|
|
214
|
-
const endDate = event[calendarFields.EndDate];
|
|
215
|
-
const momentOfEndEvent = this._dateService.getMoment(endDate);
|
|
216
|
-
const diff = Math.abs(momentOfStartEvent.diff(momentOfEndEvent, 'day'));
|
|
217
|
-
if (diff === 0 && momentDay.isSame(momentOfStartEvent, 'day')) {
|
|
218
|
-
newTask.colSpan = 1;
|
|
219
|
-
const startMinuteTop = (event.$StartDateInfo.minutes * taskHeight) / 60;
|
|
220
|
-
newTask.top = event.$StartDateInfo.hour * taskHeight + startMinuteTop;
|
|
221
|
-
const endMinuteTop = (event.$EndDateInfo.minutes * taskHeight) / 60;
|
|
222
|
-
newTask.height =
|
|
223
|
-
(event.$EndDateInfo.hour - event.$StartDateInfo.hour) * taskHeight +
|
|
224
|
-
endMinuteTop -
|
|
225
|
-
startMinuteTop;
|
|
226
|
-
newTask.event = event;
|
|
227
|
-
newTask.enddayIsInRow = true;
|
|
228
|
-
newTask.startdayIsInRow = true;
|
|
229
|
-
newTask.isStartDay = true;
|
|
230
|
-
newTask.isEndDay = true;
|
|
231
|
-
newTask.start = newTask.end = day.date;
|
|
232
|
-
newTask.inDay =
|
|
233
|
-
event.$StartDateInfo.hour > 0 ||
|
|
234
|
-
event.$StartDateInfo.minutes > 0 ||
|
|
235
|
-
event.$EndDateInfo.hour > 0 ||
|
|
236
|
-
event.$EndDateInfo.minutes > 0;
|
|
237
|
-
week[counterIndex].splice(dayIndex, 0, newTask);
|
|
238
|
-
day.tasks.push(newTask);
|
|
239
|
-
counter++;
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
let diffFromEndOfEvent = 0;
|
|
243
|
-
let diffFromStartOfEvent = 0;
|
|
244
|
-
const isBetween = momentDay.isSameOrAfter(momentOfStartEvent, 'day') &&
|
|
245
|
-
momentDay.isSameOrBefore(momentOfEndEvent, 'day');
|
|
246
|
-
if (isBetween) {
|
|
247
|
-
diffFromEndOfEvent = 0;
|
|
248
|
-
if (diff === 0) {
|
|
249
|
-
newTask.colSpan = 1;
|
|
250
|
-
newTask.event = event;
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
diffFromEndOfEvent = Math.abs(momentDay.diff(momentOfEndEvent, 'day'));
|
|
254
|
-
diffFromStartOfEvent = Math.abs(momentDay.diff(momentOfStartEvent, 'day'));
|
|
255
|
-
const isStartDay = momentDay.isSame(momentOfStartEvent, 'day');
|
|
256
|
-
const isEndDay = momentDay.isSame(momentOfEndEvent, 'day');
|
|
257
|
-
let colSpan = diff;
|
|
258
|
-
if (!isStartDay) {
|
|
259
|
-
colSpan = diffFromEndOfEvent;
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
colSpan = diff + 1; // include the start
|
|
263
|
-
}
|
|
264
|
-
newTask.colSpan = this._calcColSpan(colSpan, dayIndex, days.length);
|
|
265
|
-
newTask.isStartDay = isStartDay;
|
|
266
|
-
newTask.isEndDay = isEndDay;
|
|
267
|
-
newTask.isMiddle = !isStartDay && !isEndDay;
|
|
268
|
-
newTask.event = event;
|
|
269
|
-
}
|
|
270
|
-
if (newTask.isStartDay || dayIndex === 0) {
|
|
271
|
-
for (let span = 0; span < newTask.colSpan; span++) {
|
|
272
|
-
const taskIndex = dayIndex + span;
|
|
273
|
-
if (taskIndex > days.length - 1) {
|
|
274
|
-
break;
|
|
275
|
-
}
|
|
276
|
-
const taskDayInfo = days[taskIndex];
|
|
277
|
-
const taskInfo = {
|
|
278
|
-
...newTask,
|
|
279
|
-
start: taskDayInfo.date,
|
|
280
|
-
end: endDate,
|
|
281
|
-
isStartDay: span === 0 ? newTask.isStartDay : null,
|
|
282
|
-
startTask: event.$StartDayInfo,
|
|
283
|
-
endTask: event.$EndDayInfo,
|
|
284
|
-
startdayIsInRow: dayIndex - diffFromStartOfEvent > -1,
|
|
285
|
-
enddayIsInRow: !!days[diffFromEndOfEvent],
|
|
286
|
-
isMiddle: span === 0
|
|
287
|
-
? newTask.isMiddle
|
|
288
|
-
: this._dateService
|
|
289
|
-
.getMoment(taskDayInfo.date)
|
|
290
|
-
.isBetween(momentOfStartEvent, momentOfEndEvent, 'day'),
|
|
291
|
-
isEndDay: span === 0
|
|
292
|
-
? newTask.isEndDay
|
|
293
|
-
: Math.abs(this._dateService
|
|
294
|
-
.getMoment(taskDayInfo.date)
|
|
295
|
-
.diff(momentOfEndEvent, 'day')) <= 1,
|
|
296
|
-
colSpan: span === 0 ? newTask.colSpan : null
|
|
297
|
-
};
|
|
298
|
-
week[counter.toString()].splice(taskIndex, 0, taskInfo);
|
|
299
|
-
taskDayInfo.tasks.push(taskInfo);
|
|
300
|
-
}
|
|
301
|
-
counter++;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
});
|
|
306
|
-
day.tasks = day.tasks
|
|
307
|
-
.map((t) => {
|
|
308
|
-
t.positionCausedByOverlap = 0;
|
|
309
|
-
return t;
|
|
310
|
-
})
|
|
311
|
-
.map((t) => {
|
|
312
|
-
const tasksInDay = day.tasks.filter((innerT) => innerT.isStartDay && innerT.isEndDay);
|
|
313
|
-
const overlaps = tasksInDay.filter((innerT) => {
|
|
314
|
-
const startTime = moment(t.event.$StartDateInfo.date);
|
|
315
|
-
const endTime = moment(t.event.$EndDateInfo.date);
|
|
316
|
-
const innerStartTime = moment(innerT.event.$StartDateInfo.date);
|
|
317
|
-
const innerEndTime = moment(innerT.event.$EndDateInfo.date);
|
|
318
|
-
return ((startTime.isSameOrAfter(innerStartTime) && startTime.isBefore(innerEndTime)) ||
|
|
319
|
-
endTime.isAfter(innerStartTime));
|
|
320
|
-
});
|
|
321
|
-
t.countOfOverlaps = overlaps.length;
|
|
322
|
-
const beforeOverlaps = tasksInDay.filter((innerT) => {
|
|
323
|
-
const startTime = moment(t.event.$StartDateInfo.date);
|
|
324
|
-
const innerStartTime = moment(innerT.event.$StartDateInfo.date);
|
|
325
|
-
const innerEndTime = moment(innerT.event.$EndDateInfo.date);
|
|
326
|
-
return startTime.isSameOrAfter(innerStartTime) && startTime.isBefore(innerEndTime);
|
|
327
|
-
});
|
|
328
|
-
t.positionCausedByOverlap = beforeOverlaps.findIndex((innerT) => innerT.event.Id === t.event.Id);
|
|
329
|
-
return t;
|
|
330
|
-
});
|
|
331
|
-
});
|
|
332
|
-
return week;
|
|
333
|
-
}
|
|
334
|
-
loadNext() {
|
|
335
|
-
const mode = this._modeSource.getValue();
|
|
336
|
-
const selectedMonth = this._selectedSource.getValue();
|
|
337
|
-
switch (mode) {
|
|
338
|
-
case 'customMonth':
|
|
339
|
-
case 'month':
|
|
340
|
-
{
|
|
341
|
-
const days = this.days;
|
|
342
|
-
const newDays = this._loadNextMonth(days, selectedMonth);
|
|
343
|
-
this.setDays(newDays);
|
|
344
|
-
}
|
|
345
|
-
break;
|
|
346
|
-
case 'week':
|
|
347
|
-
case 'day':
|
|
348
|
-
{
|
|
349
|
-
const days = this._weekModeDaysSource.getValue();
|
|
350
|
-
const newDays = this._loadNextWeek(days, selectedMonth);
|
|
351
|
-
this._weekModeDaysSource.next(newDays);
|
|
352
|
-
}
|
|
353
|
-
break;
|
|
354
|
-
break;
|
|
355
|
-
case 'list':
|
|
356
|
-
break;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
gotoMonth(monthName, monthIndex) {
|
|
360
|
-
const selectedMonth = this.selectedMonth.dateInfo.month;
|
|
361
|
-
const val = monthIndex - selectedMonth;
|
|
362
|
-
this.loadMonth(this.selectedMonth.dateInfo, val);
|
|
363
|
-
}
|
|
364
|
-
gotoYear(year) {
|
|
365
|
-
const selectedYear = this.selectedMonth.dateInfo.year;
|
|
366
|
-
const val = year - selectedYear;
|
|
367
|
-
this.increaseYear(val);
|
|
368
|
-
}
|
|
369
|
-
loadNextYear() {
|
|
370
|
-
this.increaseYear(1);
|
|
371
|
-
}
|
|
372
|
-
loadPrevYear() {
|
|
373
|
-
this.increaseYear(-1);
|
|
374
|
-
}
|
|
375
|
-
increaseYear(value) {
|
|
376
|
-
const selectedYear = this.selectedMonth.dateInfo.moment.toDate();
|
|
377
|
-
selectedYear.setFullYear(selectedYear.getFullYear() + value); // next year
|
|
378
|
-
this.loadMonthByDate(selectedYear);
|
|
379
|
-
}
|
|
380
|
-
loadPrevious() {
|
|
381
|
-
const mode = this._modeSource.getValue();
|
|
382
|
-
const selectedMonth = this._selectedSource.getValue();
|
|
383
|
-
switch (mode) {
|
|
384
|
-
case 'customMonth':
|
|
385
|
-
case 'month':
|
|
386
|
-
{
|
|
387
|
-
const days = this.days;
|
|
388
|
-
const newDays = this._loadPrevMonth(days, selectedMonth);
|
|
389
|
-
this.setDays(newDays);
|
|
390
|
-
}
|
|
391
|
-
break;
|
|
392
|
-
case 'week':
|
|
393
|
-
case 'day':
|
|
394
|
-
{
|
|
395
|
-
const days = this._weekModeDaysSource.getValue();
|
|
396
|
-
const newDays = this._loadPrevWeek(days, selectedMonth);
|
|
397
|
-
this._weekModeDaysSource.next(newDays);
|
|
398
|
-
}
|
|
399
|
-
break;
|
|
400
|
-
break;
|
|
401
|
-
case 'list':
|
|
402
|
-
break;
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
loadMonth(dateInfo, addMonth = 0) {
|
|
406
|
-
let loadedMonthDate = this._dateService.getMoment(dateInfo.date);
|
|
407
|
-
if (addMonth > 0) {
|
|
408
|
-
loadedMonthDate = this._dateService.addMonth(loadedMonthDate, addMonth);
|
|
409
|
-
}
|
|
410
|
-
if (addMonth < 0) {
|
|
411
|
-
loadedMonthDate = this._dateService.subtractMonth(loadedMonthDate, Math.abs(addMonth));
|
|
412
|
-
}
|
|
413
|
-
let loadedCalendarMonthInfo = this.calendars.find((c) => c.dateInfo.moment.isSame(loadedMonthDate, 'day'));
|
|
414
|
-
if (!loadedCalendarMonthInfo) {
|
|
415
|
-
loadedCalendarMonthInfo = this.getMonthInfo(loadedMonthDate, this.today);
|
|
416
|
-
}
|
|
417
|
-
this.loadCalendarMonthInfo(loadedCalendarMonthInfo);
|
|
418
|
-
return loadedCalendarMonthInfo;
|
|
419
|
-
}
|
|
420
|
-
loadCalendarMonthInfo(loadedCalendarMonthInfo) {
|
|
421
|
-
const calendarsInfo = [...this.calendars];
|
|
422
|
-
const exists = calendarsInfo.find((c) => c.dateInfo.year === loadedCalendarMonthInfo.dateInfo.year &&
|
|
423
|
-
c.dateInfo.month === loadedCalendarMonthInfo.dateInfo.month);
|
|
424
|
-
if (!exists) {
|
|
425
|
-
calendarsInfo.push(loadedCalendarMonthInfo);
|
|
426
|
-
this._calendarsSource.next(calendarsInfo);
|
|
427
|
-
}
|
|
428
|
-
this.setSelected(loadedCalendarMonthInfo);
|
|
429
|
-
}
|
|
430
|
-
addCalendarMonthInfo(calendarMonthInfo) {
|
|
431
|
-
const newList = this.calendars;
|
|
432
|
-
newList.push(calendarMonthInfo);
|
|
433
|
-
this._calendarsSource.next(newList);
|
|
434
|
-
}
|
|
435
|
-
getNumber(value) {
|
|
436
|
-
const find = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
|
|
437
|
-
const replace = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
|
|
438
|
-
let replaceString = value;
|
|
439
|
-
let regex;
|
|
440
|
-
for (let i = 0; i < find.length; i++) {
|
|
441
|
-
regex = new RegExp(find[i], 'g');
|
|
442
|
-
replaceString = replaceString.replace(regex, replace[i]);
|
|
443
|
-
}
|
|
444
|
-
return Number(replaceString);
|
|
445
|
-
}
|
|
446
|
-
_initilize() {
|
|
447
|
-
this.today = this._dateService.getMoment(new Date());
|
|
448
|
-
const todayMonthInfo = this.getCalendarMonthInfo(new Date());
|
|
449
|
-
this.todayDay = todayMonthInfo.days.find((c) => c.isToday);
|
|
450
|
-
this._selectedSource = new BehaviorSubject(todayMonthInfo);
|
|
451
|
-
this.selected$ = this._selectedSource.asObservable();
|
|
452
|
-
this._calendarsSource.next([todayMonthInfo]);
|
|
453
|
-
this.setDays(todayMonthInfo.days);
|
|
454
|
-
this.setSelected(todayMonthInfo);
|
|
455
|
-
this._currentMonthIndexSource.next(todayMonthInfo.dateInfo.month);
|
|
456
|
-
this._todayMonthInfo = todayMonthInfo;
|
|
457
|
-
this.calendars$.pipe(takeUntil(this._onDestroy$)).subscribe();
|
|
458
|
-
}
|
|
459
|
-
_calcColSpan(diff, dayIndex, maxColSpan) {
|
|
460
|
-
if (diff === 0) {
|
|
461
|
-
return 2;
|
|
462
|
-
}
|
|
463
|
-
if (Math.floor(diff / maxColSpan) > 0) {
|
|
464
|
-
return maxColSpan;
|
|
465
|
-
}
|
|
466
|
-
if (dayIndex + diff > maxColSpan) {
|
|
467
|
-
return maxColSpan - dayIndex;
|
|
468
|
-
}
|
|
469
|
-
return diff;
|
|
470
|
-
}
|
|
471
|
-
_loadNextMonth(days, monthInfo) {
|
|
472
|
-
const daysCount = days.length;
|
|
473
|
-
let lastDay = days[daysCount - 1];
|
|
474
|
-
const lastDayIndex = monthInfo.days.findIndex((c) => c.dayInMonth === lastDay.dayInMonth && c.month === lastDay.month);
|
|
475
|
-
let newDays = lastDayIndex > -1 ? monthInfo.days.slice(lastDayIndex + 1, lastDayIndex + 1 + daysCount) : [];
|
|
476
|
-
if (newDays.length < daysCount) {
|
|
477
|
-
// we move to next month
|
|
478
|
-
if (newDays.length > 0) {
|
|
479
|
-
lastDay = newDays[newDays.length - 1];
|
|
480
|
-
}
|
|
481
|
-
const needCountDay = daysCount - newDays.length;
|
|
482
|
-
const nextMonth = this.loadMonth(monthInfo.dateInfo, 1);
|
|
483
|
-
let startPosition = 0;
|
|
484
|
-
if (needCountDay < 42) {
|
|
485
|
-
startPosition = nextMonth.days.findIndex((c) => c.dayInMonth === lastDay.dayInMonth && c.month === lastDay.month);
|
|
486
|
-
if (startPosition === -1) {
|
|
487
|
-
startPosition = 0;
|
|
488
|
-
}
|
|
489
|
-
else {
|
|
490
|
-
startPosition++;
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
const nextDays = nextMonth.days.slice(startPosition, startPosition + needCountDay);
|
|
494
|
-
newDays = [...newDays, ...nextDays];
|
|
495
|
-
}
|
|
496
|
-
return newDays;
|
|
497
|
-
}
|
|
498
|
-
_loadNextWeek(days, monthInfo) {
|
|
499
|
-
const daysCount = days.length;
|
|
500
|
-
const lastDay = days[daysCount - 1];
|
|
501
|
-
const lastDayIndex = monthInfo.days.findIndex((c) => c.dayInMonth === lastDay.dayInMonth && c.month === lastDay.month);
|
|
502
|
-
let newDays = monthInfo.days.slice(lastDayIndex + 1, lastDayIndex + 1 + daysCount);
|
|
503
|
-
if (newDays.length < daysCount) {
|
|
504
|
-
// we move to next month
|
|
505
|
-
let lastNewDay = newDays[newDays.length - 1];
|
|
506
|
-
if (!lastNewDay) {
|
|
507
|
-
lastNewDay = lastDay;
|
|
508
|
-
}
|
|
509
|
-
const nextMonth = this.loadMonth(monthInfo.dateInfo, 1);
|
|
510
|
-
const lastDayIndex2 = nextMonth.days.findIndex((c) => c.dayInMonth === lastNewDay.dayInMonth && c.month === lastNewDay.month);
|
|
511
|
-
newDays = newDays.concat(nextMonth.days.slice(lastDayIndex2 + 1, lastDayIndex2 + 1 + (daysCount - newDays.length)));
|
|
512
|
-
}
|
|
513
|
-
return newDays;
|
|
514
|
-
}
|
|
515
|
-
_loadPrevMonth(days, monthInfo) {
|
|
516
|
-
const daysCount = days.length;
|
|
517
|
-
let firstDay = days[0];
|
|
518
|
-
const firstDayIndex = monthInfo.days.findIndex((c) => c.dayInMonth === firstDay.dayInMonth && c.month === firstDay.month);
|
|
519
|
-
let newDays = monthInfo.days.slice(firstDayIndex - daysCount > 0 ? firstDayIndex - daysCount : 0, firstDayIndex);
|
|
520
|
-
if (newDays.length < daysCount) {
|
|
521
|
-
// we move to prev month
|
|
522
|
-
if (newDays.length > 0) {
|
|
523
|
-
firstDay = newDays[0];
|
|
524
|
-
}
|
|
525
|
-
const needCountDay = daysCount - newDays.length;
|
|
526
|
-
const prevMonth = this.loadMonth(monthInfo.dateInfo, -1);
|
|
527
|
-
let endPosition = prevMonth.days.length;
|
|
528
|
-
if (needCountDay < 42) {
|
|
529
|
-
endPosition = prevMonth.days.findIndex((c) => c.dayInMonth === firstDay.dayInMonth && c.month === firstDay.month);
|
|
530
|
-
if (endPosition === -1) {
|
|
531
|
-
endPosition = prevMonth.days.length;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
const prevDays = prevMonth.days.slice(endPosition - needCountDay, endPosition);
|
|
535
|
-
newDays = [...prevDays, ...newDays];
|
|
536
|
-
}
|
|
537
|
-
return newDays;
|
|
538
|
-
}
|
|
539
|
-
_loadPrevWeek(days, monthInfo) {
|
|
540
|
-
const daysCount = days.length;
|
|
541
|
-
const firstDay = days[0];
|
|
542
|
-
const firstDayIndex = monthInfo.days.findIndex((c) => c.dayInMonth === firstDay.dayInMonth && c.month === firstDay.month);
|
|
543
|
-
const partIndexPrev = firstDayIndex - daysCount;
|
|
544
|
-
let newDays = [];
|
|
545
|
-
if (partIndexPrev < 0) {
|
|
546
|
-
newDays = firstDayIndex - 1 >= 0 ? monthInfo.days.slice(0, firstDayIndex - 1) : [];
|
|
547
|
-
}
|
|
548
|
-
else {
|
|
549
|
-
newDays = monthInfo.days.slice(firstDayIndex - daysCount, firstDayIndex);
|
|
550
|
-
}
|
|
551
|
-
if (newDays.length < daysCount) {
|
|
552
|
-
// we move to prev month
|
|
553
|
-
let firstNewDay = newDays[0];
|
|
554
|
-
if (!firstNewDay) {
|
|
555
|
-
firstNewDay = firstDay;
|
|
556
|
-
}
|
|
557
|
-
const prevMonth = this.loadMonth(monthInfo.dateInfo, -1);
|
|
558
|
-
const firstDayIndex2 = prevMonth.days.findIndex((c) => c.dayInMonth === firstNewDay.dayInMonth && c.month === firstNewDay.month);
|
|
559
|
-
newDays = newDays.concat(prevMonth.days.slice(firstDayIndex2 - (daysCount - newDays.length), firstDayIndex2));
|
|
560
|
-
}
|
|
561
|
-
return newDays;
|
|
562
|
-
}
|
|
563
|
-
getCalendarMonthInfo(date) {
|
|
564
|
-
const startOfMonth = this._dateService.startOfMonth(date);
|
|
565
|
-
const momentDate = this._dateService.getMoment(date);
|
|
566
|
-
return this.getMonthInfo(startOfMonth, momentDate);
|
|
567
|
-
}
|
|
568
|
-
getMonthInfo(date, today) {
|
|
569
|
-
const days = [];
|
|
570
|
-
const activeDate = this._dateService.getMoment(date);
|
|
571
|
-
const startOfMonth = this._dateService.startOfMonth(activeDate);
|
|
572
|
-
const endOfMonth = this._dateService.endOfMonth(activeDate);
|
|
573
|
-
const dateInfo = this._dateService.getDateInfo(activeDate);
|
|
574
|
-
const dayInWeek = this._dateService.day(startOfMonth); // we add 1 to the dayInWeek because it's starts with zero
|
|
575
|
-
let weekCounter = 0;
|
|
576
|
-
let dayCounter = 0;
|
|
577
|
-
for (let i = 0; i < 42; i++) {
|
|
578
|
-
const dateOfStartOfMonth = new Date(startOfMonth);
|
|
579
|
-
dateOfStartOfMonth.setDate(dateOfStartOfMonth.getDate() + i - dayInWeek);
|
|
580
|
-
const { day, isInMonth } = this._getDay(dateOfStartOfMonth, activeDate, today, endOfMonth, startOfMonth, dateInfo, i);
|
|
581
|
-
days.push(day);
|
|
582
|
-
dayCounter++;
|
|
583
|
-
if (isInMonth && dayCounter > weekCounter * 7) {
|
|
584
|
-
weekCounter++;
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
// const endOfMonthIndex = days.findIndex((c) => c.isEndOfMonth);
|
|
588
|
-
// if (endOfMonthIndex > -1 && days.length - endOfMonthIndex > 7) {
|
|
589
|
-
// // days.splice(days.length - 7, 7);
|
|
590
|
-
// }
|
|
591
|
-
const calendarInfo = new CalendarMonthInfo();
|
|
592
|
-
calendarInfo.id = getUniqueId(3);
|
|
593
|
-
calendarInfo.dateInfo = dateInfo;
|
|
594
|
-
calendarInfo.days = days;
|
|
595
|
-
calendarInfo.weeksCount = weekCounter;
|
|
596
|
-
// this.cdr.detectChanges();
|
|
597
|
-
return calendarInfo;
|
|
598
|
-
}
|
|
599
|
-
_getDay(date, activeDate, today, endOfMonth, startOfMonth, dateInfo, i) {
|
|
600
|
-
const isInMonth = this._dateService.isSame(date, activeDate, 'month');
|
|
601
|
-
const momentOfDate = this._dateService.getMoment(date);
|
|
602
|
-
const isToday = momentOfDate.isSame(today, 'day');
|
|
603
|
-
const dayInMonth = this._dateService.strDate(date);
|
|
604
|
-
const dayInWeek = this._dateService.day(date);
|
|
605
|
-
const isEndOfMonth = momentOfDate.isSame(endOfMonth, 'day');
|
|
606
|
-
const isStartOfMonth = momentOfDate.isSame(startOfMonth, 'day');
|
|
607
|
-
const monthDateInfo = isInMonth ? dateInfo : this._dateService.getDateInfo(date);
|
|
608
|
-
const day = {
|
|
609
|
-
index: i,
|
|
610
|
-
date,
|
|
611
|
-
dayInWeek,
|
|
612
|
-
status: DayStatus.Open,
|
|
613
|
-
dayInMonth,
|
|
614
|
-
dayInMonthN: this.getNumber(dayInMonth),
|
|
615
|
-
isToday,
|
|
616
|
-
isInMonth,
|
|
617
|
-
isEndOfMonth,
|
|
618
|
-
isStartOfMonth,
|
|
619
|
-
momentOfDate,
|
|
620
|
-
month: monthDateInfo.month,
|
|
621
|
-
year: monthDateInfo.year,
|
|
622
|
-
monthName: monthDateInfo.monthName,
|
|
623
|
-
dayName: momentOfDate.format('dddd'),
|
|
624
|
-
tasks: [],
|
|
625
|
-
monthDateInfo,
|
|
626
|
-
row: Math.floor(i / 7 + 1),
|
|
627
|
-
col: 6 - (i % 7),
|
|
628
|
-
isAddingNewEvent: false,
|
|
629
|
-
addingEventPoint1: null,
|
|
630
|
-
addingEventPoint2: null
|
|
631
|
-
};
|
|
632
|
-
return { day, isInMonth };
|
|
633
|
-
}
|
|
634
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarService, deps: [{ token: i1.LogService }, { token: 'Date_Culture', optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
635
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarService }); }
|
|
636
|
-
}
|
|
637
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarService, decorators: [{
|
|
638
|
-
type: Injectable
|
|
639
|
-
}], ctorParameters: () => [{ type: i1.LogService }, { type: undefined, decorators: [{
|
|
640
|
-
type: Optional
|
|
641
|
-
}, {
|
|
642
|
-
type: Inject,
|
|
643
|
-
args: ['Date_Culture']
|
|
644
|
-
}] }] });
|
|
645
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLWNhbGVuZGFyL3NyYy9saWIvc2VydmljZXMvY2FsZW5kYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFjLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUVILGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUtqQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBZ0IsaUJBQWlCLEVBQU8sU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVFLE9BQU8sTUFBTSxNQUFNLGVBQWUsQ0FBQzs7O0FBR25DLE1BQU0sT0FBTyxlQUFnQixTQUFRLGFBQWE7SUFpQjlDLFlBQW9CLFdBQXVCLEVBQXNDLE9BQWdCO1FBQzdGLEtBQUssRUFBRSxDQUFDO1FBRFEsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFObkMscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBRWhFLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQWUsT0FBTyxDQUFDLENBQUM7UUFDekQsNkJBQXdCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCx3QkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztRQUNyRCxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO1FBR2pELElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsS0FB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QyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGlCQUFpQixFQUFFLElBQUk7U0FDMUIsQ0FBQztRQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDOUIsQ0FBQzsrR0F2ckJRLGVBQWUsNENBaUJ5QyxjQUFjO21IQWpCdEUsZUFBZTs7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVTs7MEJBa0J1QyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAgRGF0ZVNlcnZpY2UsXG4gICAgQmFzZUNvbXBvbmVudCxcbiAgICBnZXRVbmlxdWVJZCxcbiAgICBnZXREYXRlU2VydmljZSxcbiAgICBMb2dTZXJ2aWNlLFxuICAgIERhdGVJbmZvLFxuICAgIE1ldGFvYmplY3REYXRhTW9kZWwsXG4gICAgQ2FsZW5kYXJGaWVsZHNcbn0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJNb2RlLCBDYWxlbmRhck1vbnRoSW5mbywgRGF5LCBEYXlTdGF0dXMgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQvbW9tZW50JztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyU2VydmljZSBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIHNlbGVjdGVkJDogT2JzZXJ2YWJsZTxDYWxlbmRhck1vbnRoSW5mbz47XG4gICAgZGF5cyQ6IE9ic2VydmFibGU8RGF5W10+O1xuICAgIG1vZGUkOiBPYnNlcnZhYmxlPENhbGVuZGFyTW9kZT47XG4gICAgd2Vla01vZGVEYXlzJDogT2JzZXJ2YWJsZTxEYXlbXT47XG4gICAgY2FsZW5kYXJzJDogT2JzZXJ2YWJsZTxDYWxlbmRhck1vbnRoSW5mb1tdPjtcbiAgICBjdXJyZW50TW9udGhJbmRleCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgICB0b2RheTogRGF0ZTtcbiAgICB0b2RheURheTogRGF5IHwgdW5kZWZpbmVkO1xuICAgIF9kYXRlU2VydmljZTogRGF0ZVNlcnZpY2U7XG4gICAgcHJpdmF0ZSBfdG9kYXlNb250aEluZm86IENhbGVuZGFyTW9udGhJbmZvO1xuICAgIHByaXZhdGUgX2NhbGVuZGFyc1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FsZW5kYXJNb250aEluZm9bXT4oW10pO1xuICAgIHByaXZhdGUgX3NlbGVjdGVkU291cmNlOiBCZWhhdmlvclN1YmplY3Q8Q2FsZW5kYXJNb250aEluZm8+O1xuICAgIHByaXZhdGUgX21vZGVTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhbGVuZGFyTW9kZT4oJ21vbnRoJyk7XG4gICAgcHJpdmF0ZSBfY3VycmVudE1vbnRoSW5kZXhTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oLTEpO1xuICAgIHByaXZhdGUgX3dlZWtNb2RlRGF5c1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF5W10+KFtdKTtcbiAgICBwcml2YXRlIF9kYXlzU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXlbXT4oW10pO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsIEBPcHRpb25hbCgpIEBJbmplY3QoJ0RhdGVfQ3VsdHVyZScpIGN1bHR1cmU/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fZGF0ZVNlcnZpY2UgPSBnZXREYXRlU2VydmljZShfbG9nU2VydmljZSwgY3VsdHVyZSk7XG4gICAgICAgIHRoaXMuZGF5cyQgPSB0aGlzLl9kYXlzU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLm1vZGUkID0gdGhpcy5fbW9kZVNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy53ZWVrTW9kZURheXMkID0gdGhpcy5fd2Vla01vZGVEYXlzU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLmNhbGVuZGFycyQgPSB0aGlzLl9jYWxlbmRhcnNTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMuY3VycmVudE1vbnRoSW5kZXgkID0gdGhpcy5fY3VycmVudE1vbnRoSW5kZXhTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMuX2luaXRpbGl6ZSgpO1xuICAgICAgICB0aGlzLnNldE1vZGUoJ2RheScpO1xuICAgIH1cbiAgICBnZXQgdG9kYXlNb250aEluZm8oKTogQ2FsZW5kYXJNb250aEluZm8ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG9kYXlNb250aEluZm87XG4gICAgfVxuICAgIGdldCBzZWxlY3RlZE1vbnRoKCk6IENhbGVuZGFyTW9udGhJbmZvIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkU291cmNlLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBjYWxlbmRhcnMoKTogQXJyYXk8Q2FsZW5kYXJNb250aEluZm8+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFyc1NvdXJjZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBnZXQgd2Vla3NDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF5c1NvdXJjZS5nZXRWYWx1ZSgpLmxlbmd0aCAvIDc7XG4gICAgfVxuICAgIGdldCBkYXlzKCk6IEFycmF5PERheT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF5c1NvdXJjZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBnZXQgTW9udGhzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVTZXJ2aWNlLm1vbnRoTmFtZXMoKTtcbiAgICB9XG4gICAgbG9hZE1vbnRoQnlEYXRlKHZhbHVlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1vbnRoSW5mbyA9IHRoaXMuX2RhdGVTZXJ2aWNlLmdldERhdGVJbmZvKHZhbHVlKTtcbiAgICAgICAgdGhpcy5sb2FkTW9udGgobW9udGhJbmZvKTtcbiAgICB9XG4gICAgc2V0RGF0ZVNlcnZpY2UocHJpbWFyeUNhbGVuZGFyVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGxldCBkYXRlU2VydmljZSA9IHRoaXMuX2RhdGVTZXJ2aWNlO1xuICAgICAgICBzd2l0Y2ggKHByaW1hcnlDYWxlbmRhclR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ1BlcnNpYW4nOlxuICAgICAgICAgICAgICAgIGRhdGVTZXJ2aWNlID0gZ2V0RGF0ZVNlcnZpY2UodGhpcy5fbG9nU2VydmljZSwgJ2ZhLUlSJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdHcmVnb3JpYW4nOlxuICAgICAgICAgICAgICAgIGRhdGVTZXJ2aWNlID0gZ2V0RGF0ZVNlcnZpY2UodGhpcy5fbG9nU2VydmljZSwgJ2VuLVVTJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcmFiaWMnOlxuICAgICAgICAgICAgICAgIGRhdGVTZXJ2aWNlID0gZ2V0RGF0ZVNlcnZpY2UodGhpcy5fbG9nU2VydmljZSwgJ2FyLUFFJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0ZVNlcnZpY2UgPSBkYXRlU2VydmljZTtcbiAgICAgICAgdGhpcy5faW5pdGlsaXplKCk7XG4gICAgfVxuICAgIHNldERheXMoZGF5czogRGF5W10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGF5c1NvdXJjZS5uZXh0KGRheXMpO1xuICAgIH1cbiAgICBwcmVwYXJlV2Vlayhtb250aEluZm86IENhbGVuZGFyTW9udGhJbmZvLCBzdGFydEluZGV4OiBudW1iZXIsIGRheXNDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0RGF5cyA9IG1vbnRoSW5mby5kYXlzLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBkYXlzQ291bnQpO1xuICAgICAgICB0aGlzLl93ZWVrTW9kZURheXNTb3VyY2UubmV4dChzdGFydERheXMpO1xuICAgIH1cbiAgICBzZXRTZWxlY3RlZChzZWxlY3RlZDogQ2FsZW5kYXJNb250aEluZm8pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRTb3VyY2UubmV4dChzZWxlY3RlZCk7XG4gICAgfVxuICAgIHdlZWtEYXlzTWluKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVNlcnZpY2Uud2Vla2RheXNNaW4oKTtcbiAgICB9XG4gICAgd2Vla0RheXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlU2VydmljZS53ZWVrRGF5cygpO1xuICAgIH1cbiAgICBnb3RvVG9kYXkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZE1vbnRoKHRoaXMuX3RvZGF5TW9udGhJbmZvLmRhdGVJbmZvLCAwKTtcbiAgICAgICAgdGhpcy5zZXRNb2RlKFxuICAgICAgICAgICAgdGhpcy5fbW9kZVNvdXJjZS5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgdGhpcy5fdG9kYXlNb250aEluZm8uZGF5cy5maW5kKChjKSA9PiBjLmlzVG9kYXkpLFxuICAgICAgICAgICAgdGhpcy5fd2Vla01vZGVEYXlzU291cmNlLmdldFZhbHVlKCkubGVuZ3RoXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJhbmdlU2VsZWN0KHN0YXJ0RGF5OiBEYXksIGVuZERheTogRGF5LCBtb250aEluZm86IENhbGVuZGFyTW9udGhJbmZvKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBlbmREYXkuaW5kZXggLSBzdGFydERheS5pbmRleDtcbiAgICAgICAgaWYgKGRpZmYgPCA3KSB7XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ3dlZWsnLCBzdGFydERheSwgZGlmZiArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGlmZjIgPSBkaWZmICsgMTtcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnY3VzdG9tTW9udGgnKTtcbiAgICAgICAgICAgIHRoaXMuc2V0TW9udGgobW9udGhJbmZvLCBzdGFydERheSwgZGlmZjIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldE1vbnRoKG1vbnRoSW5mbzogQ2FsZW5kYXJNb250aEluZm8sIHN0YXJ0RGF5PzogRGF5LCBkaWZmOiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgICAgIGlmIChzdGFydERheSAmJiBkaWZmID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHN0YXJ0RGF5LmluZGV4O1xuICAgICAgICAgICAgdGhpcy5sb2FkQ2FsZW5kYXJNb250aEluZm8obW9udGhJbmZvKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF5cyhtb250aEluZm8uZGF5cy5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgZGlmZikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkQ2FsZW5kYXJNb250aEluZm8obW9udGhJbmZvKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF5cyhtb250aEluZm8uZGF5cyk7XG4gICAgICAgICAgICAvLyBlbHNlIGlmIChtb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICAvLyAgIHN0YXJ0RGF5ID0gZGF5c0xvYWRlZFswXTtcbiAgICAgICAgICAgIC8vIGlmIChzdGFydERheSkgdGhpcy5sb2FkTW9udGgoc3RhcnREYXkubW9udGhEYXRlSW5mbyk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0TW9kZShtb2RlOiBDYWxlbmRhck1vZGUsIHN0YXJ0RGF5PzogRGF5LCBkYXlzQ291bnQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb2xkTW9kZSA9IHRoaXMuX21vZGVTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgdGhpcy5fbW9kZVNvdXJjZS5uZXh0KG1vZGUpO1xuICAgICAgICBpZiAobW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5zZXRNb250aCh0aGlzLnNlbGVjdGVkTW9udGgsIHN0YXJ0RGF5KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnY3VzdG9tTW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLnNldE1vbnRoKHRoaXMuc2VsZWN0ZWRNb250aCwgc3RhcnREYXksIHRoaXMuZGF5cy5sZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRheXNMb2FkZWQgPSB0aGlzLl93ZWVrTW9kZURheXNTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgZGF5c0NvdW50ID0gZGF5c0NvdW50ID8/IChtb2RlID09PSAnd2VlaycgPyA3IDogMSk7XG4gICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgaWYgKCFzdGFydERheSkge1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09ICd3ZWVrJyB8fCBtb2RlID09PSAnZGF5Jykge1xuICAgICAgICAgICAgICAgIGlmIChvbGRNb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gdGhpcy5zZWxlY3RlZE1vbnRoLmRheXMuZmluZCgoYykgPT4gYy5pc1RvZGF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhcnREYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERheSA9IHRoaXMuc2VsZWN0ZWRNb250aC5kYXlzLmZpbmQoKGMpID0+IGMuaXNTdGFydE9mTW9udGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvbGRNb2RlID09PSAnY3VzdG9tTW9udGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gdGhpcy5kYXlzWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gZGF5c0xvYWRlZFswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0RGF5KSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc3RhcnREYXkubW9udGhEYXRlSW5mby5tb250aCAhPT0gdGhpcy5zZWxlY3RlZE1vbnRoLmRhdGVJbmZvLm1vbnRoIHx8XG4gICAgICAgICAgICAgICAgc3RhcnREYXkubW9udGhEYXRlSW5mby55ZWFyICE9PSB0aGlzLnNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhclxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkTW9udGgoc3RhcnREYXkubW9udGhEYXRlSW5mbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gdGhpcy5zZWxlY3RlZE1vbnRoLmRheXMuZmluZEluZGV4KFxuICAgICAgICAgICAgICAgIChjKSA9PiBjLm1vbnRoID09PSBzdGFydERheT8ubW9udGggJiYgYy5kYXlJbk1vbnRoID09PSBzdGFydERheS5kYXlJbk1vbnRoXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcGFyZVdlZWsodGhpcy5fc2VsZWN0ZWRTb3VyY2UuZ2V0VmFsdWUoKSwgc3RhcnRJbmRleCwgZGF5c0NvdW50KTtcbiAgICB9XG4gICAgZmlsbFdlZWsod2VlazogeyBba2V5OiBzdHJpbmddOiBhbnlbXSB9LCBkYXlzQ291bnQgPSA3KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFycjogYW55W10gPSBPYmplY3QudmFsdWVzKHdlZWspO1xuICAgICAgICBhcnIuZm9yRWFjaChcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbFNwYW46IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ/OiBNZXRhb2JqZWN0RGF0YU1vZGVsO1xuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5PzogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBzdGFydD86IERhdGU7XG4gICAgICAgICAgICAgICAgICAgIGVuZD86IERhdGU7XG4gICAgICAgICAgICAgICAgfVtdXG4gICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVEYXRlID0gZWwuZW5kO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVEYXRlICYmIHRoaXMuX2RhdGVTZXJ2aWNlLmdldE1vbWVudCh2YWx1ZURhdGUpLmlzQmVmb3JlKHRoaXMudG9kYXksICdkYXknKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwub3BhY2l0eSA9IDAuNTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gZWxlbWVudC5sZW5ndGg7IGkgPCBkYXlzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnB1c2goeyBjb2xTcGFuOiAxIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG4gICAgc29ydFRhc2tzKGNhbGVuZGFyVGFza3M6IE1ldGFvYmplY3REYXRhTW9kZWxbXSwgY2FsZW5kYXJGaWVsZHM6IENhbGVuZGFyRmllbGRzKTogQXJyYXk8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGFydERhdGVGaWVsZCA9IGNhbGVuZGFyRmllbGRzLlN0YXJ0RGF0ZTtcbiAgICAgICAgY29uc3QgZW5kRGF0ZUZpZWxkID0gY2FsZW5kYXJGaWVsZHMuRW5kRGF0ZTtcbiAgICAgICAgY2FsZW5kYXJUYXNrcy5zb3J0KCh0YXNrQSwgdGFza0IpID0+ICh0YXNrQVtzdGFydERhdGVGaWVsZF0gPCB0YXNrQltzdGFydERhdGVGaWVsZF0gPyAtMSA6IDEpKTtcbiAgICAgICAgY2FsZW5kYXJUYXNrcy5zb3J0KCh0YXNrQSwgdGFza0IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhc2tBU3RhcnREYXRlID0gdGFza0Fbc3RhcnREYXRlRmllbGRdO1xuICAgICAgICAgICAgY29uc3QgdGFza0JTdGFydERhdGUgPSB0YXNrQltzdGFydERhdGVGaWVsZF07XG4gICAgICAgICAgICBjb25zdCBtb21lbnRUYXNrQVN0YXJ0RGF0ZSA9IHRoaXMuX2RhdGVTZXJ2aWNlLmdldE1vbWVudCh0YXNrQVN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBtb21lbnRUYXNrQlN0YXJ0RGF0ZSA9IHRoaXMuX2RhdGVTZXJ2aWNlLmdldE1vbWVudCh0YXNrQlN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICBpZiAobW9tZW50VGFza0FTdGFydERhdGUuaXNTYW1lKG1vbWVudFRhc2tCU3RhcnREYXRlLCAnZGF5JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXNrQUVuZERhdGUgPSB0YXNrQVtlbmREYXRlRmllbGRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhc2tCRW5kRGF0ZSA9IHRhc2tCW2VuZERhdGVGaWVsZF07XG4gICAgICAgICAgICAgICAgY29uc3QgZGF5QURpZmYgPSBtb21lbnRUYXNrQVN0YXJ0RGF0ZS5kaWZmKHRhc2tBRW5kRGF0ZSwgJ2RheScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRheUJEaWZmID0gbW9tZW50VGFza0JTdGFydERhdGUuZGlmZih0YXNrQkVuZERhdGUsICdkYXknKTtcbiAgICAgICAgICAgICAgICBpZiAoZGF5QURpZmYgPiBkYXlCRGlmZikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRheUFEaWZmIDwgZGF5QkRpZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjYWxlbmRhclRhc2tzO1xuICAgIH1cbiAgICBjcmVhdGVXZWVrVGFzayhcbiAgICAgICAgZGF5czogRGF5W10sXG4gICAgICAgIG1vRGF0YUxpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSxcbiAgICAgICAgY2FsZW5kYXJGaWVsZHM6IENhbGVuZGFyRmllbGRzLFxuICAgICAgICB0YXNrSGVpZ2h0OiBudW1iZXJcbiAgICApOiB7IFtrZXk6IHN0cmluZ106IGFueVtdIH0ge1xuICAgICAgICBjb25zdCB3ZWVrOiB7IFtrZXk6IHN0cmluZ106IGFueVtdIH0gPSB7fTtcbiAgICAgICAgZGF5cy5mb3JFYWNoKChkYXksIGRheUluZGV4KSA9PiB7XG4gICAgICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgICAgICBtb0RhdGFMaXN0LmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY291bnRlckluZGV4ID0gY291bnRlci50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICghd2Vla1tjb3VudGVySW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtbY291bnRlckluZGV4XSA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2Vla1tjb3VudGVySW5kZXhdLmxlbmd0aCA+IGRheUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBtID0gd2Vla1tjb3VudGVySW5kZXhdLmxlbmd0aDsgbSA8IGRheUluZGV4OyBtKyspIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla1tjb3VudGVySW5kZXhdLnB1c2goeyBjb2xTcGFuOiAxIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBhZ2FyIHdlZWtbY291bnRlcl0gY29sc3BhbiBqYSBkYXNodCBhbmphbSBnYXJkYWQuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VGFzazogYW55ID0geyBjb2xTcGFuOiAxIH07XG4gICAgICAgICAgICAgICAgY29uc3QgbW9tZW50RGF5ID0gdGhpcy5fZGF0ZVNlcnZpY2UuZ2V0TW9tZW50KGRheS5kYXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb21lbnRPZlN0YXJ0RXZlbnQgPSB0aGlzLl9kYXRlU2VydmljZS5nZXRNb21lbnQoZXZlbnRbY2FsZW5kYXJGaWVsZHMuU3RhcnREYXRlXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IGV2ZW50W2NhbGVuZGFyRmllbGRzLkVuZERhdGVdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vbWVudE9mRW5kRXZlbnQgPSB0aGlzLl9kYXRlU2VydmljZS5nZXRNb21lbnQoZW5kRGF0ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKG1vbWVudE9mU3RhcnRFdmVudC5kaWZmKG1vbWVudE9mRW5kRXZlbnQsICdkYXknKSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpZmYgPT09IDAgJiYgbW9tZW50RGF5LmlzU2FtZShtb21lbnRPZlN0YXJ0RXZlbnQsICdkYXknKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdUYXNrLmNvbFNwYW4gPSAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydE1pbnV0ZVRvcCA9IChldmVudC4kU3RhcnREYXRlSW5mby5taW51dGVzICogdGFza0hlaWdodCkgLyA2MDtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGFzay50b3AgPSBldmVudC4kU3RhcnREYXRlSW5mby5ob3VyICogdGFza0hlaWdodCArIHN0YXJ0TWludXRlVG9wO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRNaW51dGVUb3AgPSAoZXZlbnQuJEVuZERhdGVJbmZvLm1pbnV0ZXMgKiB0YXNrSGVpZ2h0KSAvIDYwO1xuICAgICAgICAgICAgICAgICAgICBuZXdUYXNrLmhlaWdodCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQuJEVuZERhdGVJbmZvLmhvdXIgLSBldmVudC4kU3RhcnREYXRlSW5mby5ob3VyKSAqIHRhc2tIZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kTWludXRlVG9wIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWludXRlVG9wO1xuICAgICAgICAgICAgICAgICAgICBuZXdUYXNrLmV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgIG5ld1Rhc2suZW5kZGF5SXNJblJvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG5ld1Rhc2suc3RhcnRkYXlJc0luUm93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGFzay5pc1N0YXJ0RGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGFzay5pc0VuZERheSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG5ld1Rhc2suc3RhcnQgPSBuZXdUYXNrLmVuZCA9IGRheS5kYXRlO1xuICAgICAgICAgICAgICAgICAgICBuZXdUYXNrLmluRGF5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LiRTdGFydERhdGVJbmZvLmhvdXIgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC4kU3RhcnREYXRlSW5mby5taW51dGVzID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuJEVuZERhdGVJbmZvLmhvdXIgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC4kRW5kRGF0ZUluZm8ubWludXRlcyA+IDA7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtbY291bnRlckluZGV4XS5zcGxpY2UoZGF5SW5kZXgsIDAsIG5ld1Rhc2spO1xuICAgICAgICAgICAgICAgICAgICBkYXkudGFza3MucHVzaChuZXdUYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWZmRnJvbUVuZE9mRXZlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlmZkZyb21TdGFydE9mRXZlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0JldHdlZW4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgbW9tZW50RGF5LmlzU2FtZU9yQWZ0ZXIobW9tZW50T2ZTdGFydEV2ZW50LCAnZGF5JykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbWVudERheS5pc1NhbWVPckJlZm9yZShtb21lbnRPZkVuZEV2ZW50LCAnZGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0JldHdlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZGcm9tRW5kT2ZFdmVudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Rhc2suY29sU3BhbiA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFzay5ldmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmRnJvbUVuZE9mRXZlbnQgPSBNYXRoLmFicyhtb21lbnREYXkuZGlmZihtb21lbnRPZkVuZEV2ZW50LCAnZGF5JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZGcm9tU3RhcnRPZkV2ZW50ID0gTWF0aC5hYnMobW9tZW50RGF5LmRpZmYobW9tZW50T2ZTdGFydEV2ZW50LCAnZGF5JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU3RhcnREYXkgPSBtb21lbnREYXkuaXNTYW1lKG1vbWVudE9mU3RhcnRFdmVudCwgJ2RheScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRW5kRGF5ID0gbW9tZW50RGF5LmlzU2FtZShtb21lbnRPZkVuZEV2ZW50LCAnZGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbFNwYW4gPSBkaWZmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTdGFydERheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuID0gZGlmZkZyb21FbmRPZkV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFNwYW4gPSBkaWZmICsgMTsgLy8gaW5jbHVkZSB0aGUgc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFzay5jb2xTcGFuID0gdGhpcy5fY2FsY0NvbFNwYW4oY29sU3BhbiwgZGF5SW5kZXgsIGRheXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYXNrLmlzU3RhcnREYXkgPSBpc1N0YXJ0RGF5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Rhc2suaXNFbmREYXkgPSBpc0VuZERheTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYXNrLmlzTWlkZGxlID0gIWlzU3RhcnREYXkgJiYgIWlzRW5kRGF5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Rhc2suZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdUYXNrLmlzU3RhcnREYXkgfHwgZGF5SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzcGFuID0gMDsgc3BhbiA8IG5ld1Rhc2suY29sU3Bhbjsgc3BhbisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2tJbmRleCA9IGRheUluZGV4ICsgc3BhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tJbmRleCA+IGRheXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFza0RheUluZm8gPSBkYXlzW3Rhc2tJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2tJbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubmV3VGFzayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0YXNrRGF5SW5mby5kYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBlbmREYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdGFydERheTogc3BhbiA9PT0gMCA/IG5ld1Rhc2suaXNTdGFydERheSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRhc2s6IGV2ZW50LiRTdGFydERheUluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUYXNrOiBldmVudC4kRW5kRGF5SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZGF5SXNJblJvdzogZGF5SW5kZXggLSBkaWZmRnJvbVN0YXJ0T2ZFdmVudCA+IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kZGF5SXNJblJvdzogISFkYXlzW2RpZmZGcm9tRW5kT2ZFdmVudF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01pZGRsZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3VGFzay5pc01pZGRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2RhdGVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNb21lbnQodGFza0RheUluZm8uZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzQmV0d2Vlbihtb21lbnRPZlN0YXJ0RXZlbnQsIG1vbWVudE9mRW5kRXZlbnQsICdkYXknKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRW5kRGF5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4gPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXdUYXNrLmlzRW5kRGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTWF0aC5hYnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TW9tZW50KHRhc2tEYXlJbmZvLmRhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlmZihtb21lbnRPZkVuZEV2ZW50LCAnZGF5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDw9IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuOiBzcGFuID09PSAwID8gbmV3VGFzay5jb2xTcGFuIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrW2NvdW50ZXIudG9TdHJpbmcoKV0uc3BsaWNlKHRhc2tJbmRleCwgMCwgdGFza0luZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrRGF5SW5mby50YXNrcy5wdXNoKHRhc2tJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkYXkudGFza3MgPSBkYXkudGFza3NcbiAgICAgICAgICAgICAgICAubWFwKCh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHQucG9zaXRpb25DYXVzZWRCeU92ZXJsYXAgPSAwO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5tYXAoKHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFza3NJbkRheSA9IGRheS50YXNrcy5maWx0ZXIoKGlubmVyVCkgPT4gaW5uZXJULmlzU3RhcnREYXkgJiYgaW5uZXJULmlzRW5kRGF5KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcHMgPSB0YXNrc0luRGF5LmZpbHRlcigoaW5uZXJUKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBtb21lbnQodC5ldmVudC4kU3RhcnREYXRlSW5mby5kYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBtb21lbnQodC5ldmVudC4kRW5kRGF0ZUluZm8uZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lclN0YXJ0VGltZSA9IG1vbWVudChpbm5lclQuZXZlbnQuJFN0YXJ0RGF0ZUluZm8uZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckVuZFRpbWUgPSBtb21lbnQoaW5uZXJULmV2ZW50LiRFbmREYXRlSW5mby5kYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0VGltZS5pc1NhbWVPckFmdGVyKGlubmVyU3RhcnRUaW1lKSAmJiBzdGFydFRpbWUuaXNCZWZvcmUoaW5uZXJFbmRUaW1lKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lLmlzQWZ0ZXIoaW5uZXJTdGFydFRpbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdC5jb3VudE9mT3ZlcmxhcHMgPSBvdmVybGFwcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZU92ZXJsYXBzID0gdGFza3NJbkRheS5maWx0ZXIoKGlubmVyVCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbW9tZW50KHQuZXZlbnQuJFN0YXJ0RGF0ZUluZm8uZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lclN0YXJ0VGltZSA9IG1vbWVudChpbm5lclQuZXZlbnQuJFN0YXJ0RGF0ZUluZm8uZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckVuZFRpbWUgPSBtb21lbnQoaW5uZXJULmV2ZW50LiRFbmREYXRlSW5mby5kYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFRpbWUuaXNTYW1lT3JBZnRlcihpbm5lclN0YXJ0VGltZSkgJiYgc3RhcnRUaW1lLmlzQmVmb3JlKGlubmVyRW5kVGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0LnBvc2l0aW9uQ2F1c2VkQnlPdmVybGFwID0gYmVmb3JlT3ZlcmxhcHMuZmluZEluZGV4KChpbm5lclQpID0+IGlubmVyVC5ldmVudC5JZCA9PT0gdC5ldmVudC5JZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHdlZWs7XG4gICAgfVxuICAgIGxvYWROZXh0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5fbW9kZVNvdXJjZS5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZE1vbnRoID0gdGhpcy5fc2VsZWN0ZWRTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdjdXN0b21Nb250aCc6XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXlzID0gdGhpcy5kYXlzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdEYXlzID0gdGhpcy5fbG9hZE5leHRNb250aChkYXlzLCBzZWxlY3RlZE1vbnRoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXlzKG5ld0RheXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheXMgPSB0aGlzLl93ZWVrTW9kZURheXNTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RGF5cyA9IHRoaXMuX2xvYWROZXh0V2VlayhkYXlzLCBzZWxlY3RlZE1vbnRoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2Vla01vZGVEYXlzU291cmNlLm5leHQobmV3RGF5cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ290b01vbnRoKG1vbnRoTmFtZTogc3RyaW5nLCBtb250aEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRNb250aCA9IHRoaXMuc2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aDtcbiAgICAgICAgY29uc3QgdmFsID0gbW9udGhJbmRleCAtIHNlbGVjdGVkTW9udGg7XG4gICAgICAgIHRoaXMubG9hZE1vbnRoKHRoaXMuc2VsZWN0ZWRNb250aC5kYXRlSW5mbywgdmFsKTtcbiAgICB9XG4gICAgZ290b1llYXIoeWVhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhciA9IHRoaXMuc2VsZWN0ZWRNb250aC5kYXRlSW5mby55ZWFyO1xuICAgICAgICBjb25zdCB2YWwgPSB5ZWFyIC0gc2VsZWN0ZWRZZWFyO1xuICAgICAgICB0aGlzLmluY3JlYXNlWWVhcih2YWwpO1xuICAgIH1cbiAgICBsb2FkTmV4dFllYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5jcmVhc2VZZWFyKDEpO1xuICAgIH1cbiAgICBsb2FkUHJldlllYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5jcmVhc2VZZWFyKC0xKTtcbiAgICB9XG4gICAgaW5jcmVhc2VZZWFyKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5zZWxlY3RlZE1vbnRoLmRhdGVJbmZvLm1vbWVudC50b0RhdGUoKTtcbiAgICAgICAgc2VsZWN0ZWRZZWFyLnNldEZ1bGxZZWFyKHNlbGVjdGVkWWVhci5nZXRGdWxsWWVhcigpICsgdmFsdWUpOyAvLyBuZXh0IHllYXJcbiAgICAgICAgdGhpcy5sb2FkTW9udGhCeURhdGUoc2VsZWN0ZWRZZWFyKTtcbiAgICB9XG4gICAgbG9hZFByZXZpb3VzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5fbW9kZVNvdXJjZS5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZE1vbnRoID0gdGhpcy5fc2VsZWN0ZWRTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdjdXN0b21Nb250aCc6XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXlzID0gdGhpcy5kYXlzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdEYXlzID0gdGhpcy5fbG9hZFByZXZNb250aChkYXlzLCBzZWxlY3RlZE1vbnRoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXlzKG5ld0RheXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheXMgPSB0aGlzLl93ZWVrTW9kZURheXNTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RGF5cyA9IHRoaXMuX2xvYWRQcmV2V2VlayhkYXlzLCBzZWxlY3RlZE1vbnRoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2Vla01vZGVEYXlzU291cmNlLm5leHQobmV3RGF5cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbG9hZE1vbnRoKGRhdGVJbmZvOiBEYXRlSW5mbywgYWRkTW9udGg6IG51bWJlciA9IDApOiBDYWxlbmRhck1vbnRoSW5mbyB7XG4gICAgICAgIGxldCBsb2FkZWRNb250aERhdGUgPSB0aGlzLl9kYXRlU2VydmljZS5nZXRNb21lbnQoZGF0ZUluZm8uZGF0ZSk7XG4gICAgICAgIGlmIChhZGRNb250aCA+IDApIHtcbiAgICAgICAgICAgIGxvYWRlZE1vbnRoRGF0ZSA9IHRoaXMuX2RhdGVTZXJ2aWNlLmFkZE1vbnRoKGxvYWRlZE1vbnRoRGF0ZSwgYWRkTW9udGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhZGRNb250aCA8IDApIHtcbiAgICAgICAgICAgIGxvYWRlZE1vbnRoRGF0ZSA9IHRoaXMuX2RhdGVTZXJ2aWNlLnN1YnRyYWN0TW9udGgobG9hZGVkTW9udGhEYXRlLCBNYXRoLmFicyhhZGRNb250aCkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsb2FkZWRDYWxlbmRhck1vbnRoSW5mbyA9IHRoaXMuY2FsZW5kYXJzLmZpbmQoKGMpID0+IGMuZGF0ZUluZm8ubW9tZW50LmlzU2FtZShsb2FkZWRNb250aERhdGUsICdkYXknKSk7XG4gICAgICAgIGlmICghbG9hZGVkQ2FsZW5kYXJNb250aEluZm8pIHtcbiAgICAgICAgICAgIGxvYWRlZENhbGVuZGFyTW9udGhJbmZvID0gdGhpcy5nZXRNb250aEluZm8obG9hZGVkTW9udGhEYXRlLCB0aGlzLnRvZGF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRDYWxlbmRhck1vbnRoSW5mbyhsb2FkZWRDYWxlbmRhck1vbnRoSW5mbyk7XG4gICAgICAgIHJldHVybiBsb2FkZWRDYWxlbmRhck1vbnRoSW5mbztcbiAgICB9XG4gICAgbG9hZENhbGVuZGFyTW9udGhJbmZvKGxvYWRlZENhbGVuZGFyTW9udGhJbmZvOiBDYWxlbmRhck1vbnRoSW5mbyk6IHZvaWQge1xuICAgICAgICBjb25zdCBjYWxlbmRhcnNJbmZvID0gWy4uLnRoaXMuY2FsZW5kYXJzXTtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gY2FsZW5kYXJzSW5mby5maW5kKFxuICAgICAgICAgICAgKGMpID0+XG4gICAgICAgICAgICAgICAgYy5kYXRlSW5mby55ZWFyID09PSBsb2FkZWRDYWxlbmRhck1vbnRoSW5mby5kYXRlSW5mby55ZWFyICYmXG4gICAgICAgICAgICAgICAgYy5kYXRlSW5mby5tb250aCA9PT0gbG9hZGVkQ2FsZW5kYXJNb250aEluZm8uZGF0ZUluZm8ubW9udGhcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgIGNhbGVuZGFyc0luZm8ucHVzaChsb2FkZWRDYWxlbmRhck1vbnRoSW5mbyk7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhcnNTb3VyY2UubmV4dChjYWxlbmRhcnNJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkKGxvYWRlZENhbGVuZGFyTW9udGhJbmZvKTtcbiAgICB9XG4gICAgYWRkQ2FsZW5kYXJNb250aEluZm8oY2FsZW5kYXJNb250aEluZm86IENhbGVuZGFyTW9udGhJbmZvKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld0xpc3QgPSB0aGlzLmNhbGVuZGFycztcbiAgICAgICAgbmV3TGlzdC5wdXNoKGNhbGVuZGFyTW9udGhJbmZvKTtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJzU291cmNlLm5leHQobmV3TGlzdCk7XG4gICAgfVxuICAgIGdldE51bWJlcih2YWx1ZSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGZpbmQgPSBbJ9uwJywgJ9uxJywgJ9uyJywgJ9uzJywgJ9u0JywgJ9u1JywgJ9u2JywgJ9u3JywgJ9u4JywgJ9u5J107XG4gICAgICAgIGNvbnN0IHJlcGxhY2UgPSBbJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknXTtcbiAgICAgICAgbGV0IHJlcGxhY2VTdHJpbmcgPSB2YWx1ZTtcbiAgICAgICAgbGV0IHJlZ2V4O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChmaW5kW2ldLCAnZycpO1xuICAgICAgICAgICAgcmVwbGFjZVN0cmluZyA9IHJlcGxhY2VTdHJpbmcucmVwbGFjZShyZWdleCwgcmVwbGFjZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE51bWJlcihyZXBsYWNlU3RyaW5nKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfaW5pdGlsaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRvZGF5ID0gdGhpcy5fZGF0ZVNlcnZpY2UuZ2V0TW9tZW50KG5ldyBEYXRlKCkpO1xuICAgICAgICBjb25zdCB0b2RheU1vbnRoSW5mbyA9IHRoaXMuZ2V0Q2FsZW5kYXJNb250aEluZm8obmV3IERhdGUoKSk7XG4gICAgICAgIHRoaXMudG9kYXlEYXkgPSB0b2RheU1vbnRoSW5mby5kYXlzLmZpbmQoKGMpID0+IGMuaXNUb2RheSk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDYWxlbmRhck1vbnRoSW5mbz4odG9kYXlNb250aEluZm8pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkJCA9IHRoaXMuX3NlbGVjdGVkU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLl9jYWxlbmRhcnNTb3VyY2UubmV4dChbdG9kYXlNb250aEluZm9dKTtcbiAgICAgICAgdGhpcy5zZXREYXlzKHRvZGF5TW9udGhJbmZvLmRheXMpO1xuICAgICAgICB0aGlzLnNldFNlbGVjdGVkKHRvZGF5TW9udGhJbmZvKTtcbiAgICAgICAgdGhpcy5fY3VycmVudE1vbnRoSW5kZXhTb3VyY2UubmV4dCh0b2RheU1vbnRoSW5mby5kYXRlSW5mby5tb250aCk7XG4gICAgICAgIHRoaXMuX3RvZGF5TW9udGhJbmZvID0gdG9kYXlNb250aEluZm87XG4gICAgICAgIHRoaXMuY2FsZW5kYXJzJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHByaXZhdGUgX2NhbGNDb2xTcGFuKGRpZmY6IG51bWJlciwgZGF5SW5kZXg6IG51bWJlciwgbWF4Q29sU3BhbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNYXRoLmZsb29yKGRpZmYgLyBtYXhDb2xTcGFuKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBtYXhDb2xTcGFuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlJbmRleCArIGRpZmYgPiBtYXhDb2xTcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF4Q29sU3BhbiAtIGRheUluZGV4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaWZmO1xuICAgIH1cbiAgICBwcml2YXRlIF9sb2FkTmV4dE1vbnRoKGRheXM6IERheVtdLCBtb250aEluZm86IENhbGVuZGFyTW9udGhJbmZvKTogQXJyYXk8RGF5PiB7XG4gICAgICAgIGNvbnN0IGRheXNDb3VudCA9IGRheXMubGVuZ3RoO1xuICAgICAgICBsZXQgbGFzdERheSA9IGRheXNbZGF5c0NvdW50IC0gMV07XG4gICAgICAgIGNvbnN0IGxhc3REYXlJbmRleCA9IG1vbnRoSW5mby5kYXlzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChjKSA9PiBjLmRheUluTW9udGggPT09IGxhc3REYXkuZGF5SW5Nb250aCAmJiBjLm1vbnRoID09PSBsYXN0RGF5Lm1vbnRoXG4gICAgICAgICk7XG4gICAgICAgIGxldCBuZXdEYXlzID0gbGFzdERheUluZGV4ID4gLTEgPyBtb250aEluZm8uZGF5cy5zbGljZShsYXN0RGF5SW5kZXggKyAxLCBsYXN0RGF5SW5kZXggKyAxICsgZGF5c0NvdW50KSA6IFtdO1xuICAgICAgICBpZiAobmV3RGF5cy5sZW5ndGggPCBkYXlzQ291bnQpIHtcbiAgICAgICAgICAgIC8vIHdlIG1vdmUgdG8gbmV4dCBtb250aFxuICAgICAgICAgICAgaWYgKG5ld0RheXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxhc3REYXkgPSBuZXdEYXlzW25ld0RheXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZWVkQ291bnREYXkgPSBkYXlzQ291bnQgLSBuZXdEYXlzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMubG9hZE1vbnRoKG1vbnRoSW5mby5kYXRlSW5mbywgMSk7XG4gICAgICAgICAgICBsZXQgc3RhcnRQb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICBpZiAobmVlZENvdW50RGF5IDwgNDIpIHtcbiAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gbmV4dE1vbnRoLmRheXMuZmluZEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAoYykgPT4gYy5kYXlJbk1vbnRoID09PSBsYXN0RGF5LmRheUluTW9udGggJiYgYy5tb250aCA9PT0gbGFzdERheS5tb250aFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0UG9zaXRpb24gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0RGF5cyA9IG5leHRNb250aC5kYXlzLnNsaWNlKHN0YXJ0UG9zaXRpb24sIHN0YXJ0UG9zaXRpb24gKyBuZWVkQ291bnREYXkpO1xuICAgICAgICAgICAgbmV3RGF5cyA9IFsuLi5uZXdEYXlzLCAuLi5uZXh0RGF5c107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0RheXM7XG4gICAgfVxuICAgIHByaXZhdGUgX2xvYWROZXh0V2VlayhkYXlzOiBEYXlbXSwgbW9udGhJbmZvOiBDYWxlbmRhck1vbnRoSW5mbyk6IEFycmF5PERheT4ge1xuICAgICAgICBjb25zdCBkYXlzQ291bnQgPSBkYXlzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbGFzdERheSA9IGRheXNbZGF5c0NvdW50IC0gMV07XG4gICAgICAgIGNvbnN0IGxhc3REYXlJbmRleCA9IG1vbnRoSW5mby5kYXlzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChjKSA9PiBjLmRheUluTW9udGggPT09IGxhc3REYXkuZGF5SW5Nb250aCAmJiBjLm1vbnRoID09PSBsYXN0RGF5Lm1vbnRoXG4gICAgICAgICk7XG4gICAgICAgIGxldCBuZXdEYXlzID0gbW9udGhJbmZvLmRheXMuc2xpY2UobGFzdERheUluZGV4ICsgMSwgbGFzdERheUluZGV4ICsgMSArIGRheXNDb3VudCk7XG4gICAgICAgIGlmIChuZXdEYXlzLmxlbmd0aCA8IGRheXNDb3VudCkge1xuICAgICAgICAgICAgLy8gd2UgbW92ZSB0byBuZXh0IG1vbnRoXG4gICAgICAgICAgICBsZXQgbGFzdE5ld0RheSA9IG5ld0RheXNbbmV3RGF5cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmICghbGFzdE5ld0RheSkge1xuICAgICAgICAgICAgICAgIGxhc3ROZXdEYXkgPSBsYXN0RGF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5sb2FkTW9udGgobW9udGhJbmZvLmRhdGVJbmZvLCAxKTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3REYXlJbmRleDIgPSBuZXh0TW9udGguZGF5cy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgKGMpID0+IGMuZGF5SW5Nb250aCA9PT0gbGFzdE5ld0RheS5kYXlJbk1vbnRoICYmIGMubW9udGggPT09IGxhc3ROZXdEYXkubW9udGhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBuZXdEYXlzID0gbmV3RGF5cy5jb25jYXQoXG4gICAgICAgICAgICAgICAgbmV4dE1vbnRoLmRheXMuc2xpY2UobGFzdERheUluZGV4MiArIDEsIGxhc3REYXlJbmRleDIgKyAxICsgKGRheXNDb3VudCAtIG5ld0RheXMubGVuZ3RoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0RheXM7XG4gICAgfVxuICAgIHByaXZhdGUgX2xvYWRQcmV2TW9udGgoZGF5czogRGF5W10sIG1vbnRoSW5mbzogQ2FsZW5kYXJNb250aEluZm8pOiBBcnJheTxEYXk+IHtcbiAgICAgICAgY29uc3QgZGF5c0NvdW50ID0gZGF5cy5sZW5ndGg7XG4gICAgICAgIGxldCBmaXJzdERheSA9IGRheXNbMF07XG4gICAgICAgIGNvbnN0IGZpcnN0RGF5SW5kZXggPSBtb250aEluZm8uZGF5cy5maW5kSW5kZXgoXG4gICAgICAgICAgICAoYykgPT4gYy5kYXlJbk1vbnRoID09PSBmaXJzdERheS5kYXlJbk1vbnRoICYmIGMubW9udGggPT09IGZpcnN0RGF5Lm1vbnRoXG4gICAgICAgICk7XG4gICAgICAgIGxldCBuZXdEYXlzOiBEYXlbXSA9IG1vbnRoSW5mby5kYXlzLnNsaWNlKFxuICAgICAgICAgICAgZmlyc3REYXlJbmRleCAtIGRheXNDb3VudCA+IDAgPyBmaXJzdERheUluZGV4IC0gZGF5c0NvdW50IDogMCxcbiAgICAgICAgICAgIGZpcnN0RGF5SW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld0RheXMubGVuZ3RoIDwgZGF5c0NvdW50KSB7XG4gICAgICAgICAgICAvLyB3ZSBtb3ZlIHRvIHByZXYgbW9udGhcbiAgICAgICAgICAgIGlmIChuZXdEYXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmaXJzdERheSA9IG5ld0RheXNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZWVkQ291bnREYXkgPSBkYXlzQ291bnQgLSBuZXdEYXlzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHByZXZNb250aCA9IHRoaXMubG9hZE1vbnRoKG1vbnRoSW5mby5kYXRlSW5mbywgLTEpO1xuICAgICAgICAgICAgbGV0IGVuZFBvc2l0aW9uID0gcHJldk1vbnRoLmRheXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG5lZWRDb3VudERheSA8IDQyKSB7XG4gICAgICAgICAgICAgICAgZW5kUG9zaXRpb24gPSBwcmV2TW9udGguZGF5cy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIChjKSA9PiBjLmRheUluTW9udGggPT09IGZpcnN0RGF5LmRheUluTW9udGggJiYgYy5tb250aCA9PT0gZmlyc3REYXkubW9udGhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChlbmRQb3NpdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kUG9zaXRpb24gPSBwcmV2TW9udGguZGF5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJldkRheXMgPSBwcmV2TW9udGguZGF5cy5zbGljZShlbmRQb3NpdGlvbiAtIG5lZWRDb3VudERheSwgZW5kUG9zaXRpb24pO1xuICAgICAgICAgICAgbmV3RGF5cyA9IFsuLi5wcmV2RGF5cywgLi4ubmV3RGF5c107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0RheXM7XG4gICAgfVxuICAgIHByaXZhdGUgX2xvYWRQcmV2V2VlayhkYXlzOiBEYXlbXSwgbW9udGhJbmZvOiBDYWxlbmRhck1vbnRoSW5mbyk6IEFycmF5PERheT4ge1xuICAgICAgICBjb25zdCBkYXlzQ291bnQgPSBkYXlzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZmlyc3REYXkgPSBkYXlzWzBdO1xuICAgICAgICBjb25zdCBmaXJzdERheUluZGV4ID0gbW9udGhJbmZvLmRheXMuZmluZEluZGV4KFxuICAgICAgICAgICAgKGMpID0+IGMuZGF5SW5Nb250aCA9PT0gZmlyc3REYXkuZGF5SW5Nb250aCAmJiBjLm1vbnRoID09PSBmaXJzdERheS5tb250aFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwYXJ0SW5kZXhQcmV2ID0gZmlyc3REYXlJbmRleCAtIGRheXNDb3VudDtcbiAgICAgICAgbGV0IG5ld0RheXM6IERheVtdID0gW107XG4gICAgICAgIGlmIChwYXJ0SW5kZXhQcmV2IDwgMCkge1xuICAgICAgICAgICAgbmV3RGF5cyA9IGZpcnN0RGF5SW5kZXggLSAxID49IDAgPyBtb250aEluZm8uZGF5cy5zbGljZSgwLCBmaXJzdERheUluZGV4IC0gMSkgOiBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0RheXMgPSBtb250aEluZm8uZGF5cy5zbGljZShmaXJzdERheUluZGV4IC0gZGF5c0NvdW50LCBmaXJzdERheUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3RGF5cy5sZW5ndGggPCBkYXlzQ291bnQpIHtcbiAgICAgICAgICAgIC8vIHdlIG1vdmUgdG8gcHJldiBtb250aFxuICAgICAgICAgICAgbGV0IGZpcnN0TmV3RGF5ID0gbmV3RGF5c1swXTtcbiAgICAgICAgICAgIGlmICghZmlyc3ROZXdEYXkpIHtcbiAgICAgICAgICAgICAgICBmaXJzdE5ld0RheSA9IGZpcnN0RGF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJldk1vbnRoID0gdGhpcy5sb2FkTW9udGgobW9udGhJbmZvLmRhdGVJbmZvLCAtMSk7XG4gICAgICAgICAgICBjb25zdCBmaXJzdERheUluZGV4MiA9IHByZXZNb250aC5kYXlzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAoYykgPT4gYy5kYXlJbk1vbnRoID09PSBmaXJzdE5ld0RheS5kYXlJbk1vbnRoICYmIGMubW9udGggPT09IGZpcnN0TmV3RGF5Lm1vbnRoXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbmV3RGF5cyA9IG5ld0RheXMuY29uY2F0KFxuICAgICAgICAgICAgICAgIHByZXZNb250aC5kYXlzLnNsaWNlKGZpcnN0RGF5SW5kZXgyIC0gKGRheXNDb3VudCAtIG5ld0RheXMubGVuZ3RoKSwgZmlyc3REYXlJbmRleDIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdEYXlzO1xuICAgIH1cbiAgICBwcml2YXRlIGdldENhbGVuZGFyTW9udGhJbmZvKGRhdGUpOiBDYWxlbmRhck1vbnRoSW5mbyB7XG4gICAgICAgIGNvbnN0IHN0YXJ0T2ZNb250aCA9IHRoaXMuX2RhdGVTZXJ2aWNlLnN0YXJ0T2ZNb250aChkYXRlKTtcbiAgICAgICAgY29uc3QgbW9tZW50RGF0ZSA9IHRoaXMuX2RhdGVTZXJ2aWNlLmdldE1vbWVudChkYXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TW9udGhJbmZvKHN0YXJ0T2ZNb250aCwgbW9tZW50RGF0ZSk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0TW9udGhJbmZvKGRhdGUsIHRvZGF5KTogQ2FsZW5kYXJNb250aEluZm8ge1xuICAgICAgICBjb25zdCBkYXlzOiBEYXlbXSA9IFtdO1xuICAgICAgICBjb25zdCBhY3RpdmVEYXRlID0gdGhpcy5fZGF0ZVNlcnZpY2UuZ2V0TW9tZW50KGRhdGUpO1xuICAgICAgICBjb25zdCBzdGFydE9mTW9udGg6IERhdGUgPSB0aGlzLl9kYXRlU2VydmljZS5zdGFydE9mTW9udGgoYWN0aXZlRGF0ZSk7XG4gICAgICAgIGNvbnN0IGVuZE9mTW9udGg6IERhdGUgPSB0aGlzLl9kYXRlU2VydmljZS5lbmRPZk1vbnRoKGFjdGl2ZURhdGUpO1xuICAgICAgICBjb25zdCBkYXRlSW5mbyA9IHRoaXMuX2RhdGVTZXJ2aWNlLmdldERhdGVJbmZvKGFjdGl2ZURhdGUpO1xuICAgICAgICBjb25zdCBkYXlJbldlZWsgPSB0aGlzLl9kYXRlU2VydmljZS5kYXkoc3RhcnRPZk1vbnRoKTsgLy8gd2UgYWRkIDEgdG8gdGhlIGRheUluV2VlayBiZWNhdXNlIGl0J3Mgc3RhcnRzIHdpdGggemVyb1xuICAgICAgICBsZXQgd2Vla0NvdW50ZXIgPSAwO1xuICAgICAgICBsZXQgZGF5Q291bnRlciA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZU9mU3RhcnRPZk1vbnRoOiBEYXRlID0gbmV3IERhdGUoc3RhcnRPZk1vbnRoKTtcbiAgICAgICAgICAgIGRhdGVPZlN0YXJ0T2ZNb250aC5zZXREYXRlKGRhdGVPZlN0YXJ0T2ZNb250aC5nZXREYXRlKCkgKyBpIC0gZGF5SW5XZWVrKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF5LCBpc0luTW9udGggfTogeyBkYXk6IERheTsgaXNJbk1vbnRoOiBhbnkgfSA9IHRoaXMuX2dldERheShcbiAgICAgICAgICAgICAgICBkYXRlT2ZTdGFydE9mTW9udGgsXG4gICAgICAgICAgICAgICAgYWN0aXZlRGF0ZSxcbiAgICAgICAgICAgICAgICB0b2RheSxcbiAgICAgICAgICAgICAgICBlbmRPZk1vbnRoLFxuICAgICAgICAgICAgICAgIHN0YXJ0T2ZNb250aCxcbiAgICAgICAgICAgICAgICBkYXRlSW5mbyxcbiAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZGF5cy5wdXNoKGRheSk7XG4gICAgICAgICAgICBkYXlDb3VudGVyKys7XG4gICAgICAgICAgICBpZiAoaXNJbk1vbnRoICYmIGRheUNvdW50ZXIgPiB3ZWVrQ291bnRlciAqIDcpIHtcbiAgICAgICAgICAgICAgICB3ZWVrQ291bnRlcisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnN0IGVuZE9mTW9udGhJbmRleCA9IGRheXMuZmluZEluZGV4KChjKSA9PiBjLmlzRW5kT2ZNb250aCk7XG4gICAgICAgIC8vIGlmIChlbmRPZk1vbnRoSW5kZXggPiAtMSAmJiBkYXlzLmxlbmd0aCAtIGVuZE9mTW9udGhJbmRleCA+IDcpIHtcbiAgICAgICAgLy8gICAgIC8vIGRheXMuc3BsaWNlKGRheXMubGVuZ3RoIC0gNywgNyk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgY29uc3QgY2FsZW5kYXJJbmZvID0gbmV3IENhbGVuZGFyTW9udGhJbmZvKCk7XG4gICAgICAgIGNhbGVuZGFySW5mby5pZCA9IGdldFVuaXF1ZUlkKDMpO1xuICAgICAgICBjYWxlbmRhckluZm8uZGF0ZUluZm8gPSBkYXRlSW5mbztcbiAgICAgICAgY2FsZW5kYXJJbmZvLmRheXMgPSBkYXlzO1xuICAgICAgICBjYWxlbmRhckluZm8ud2Vla3NDb3VudCA9IHdlZWtDb3VudGVyO1xuICAgICAgICAvLyB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHJldHVybiBjYWxlbmRhckluZm87XG4gICAgfVxuICAgIHByaXZhdGUgX2dldERheShcbiAgICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgICAgYWN0aXZlRGF0ZTogYW55LFxuICAgICAgICB0b2RheTogYW55LFxuICAgICAgICBlbmRPZk1vbnRoOiBEYXRlLFxuICAgICAgICBzdGFydE9mTW9udGg6IERhdGUsXG4gICAgICAgIGRhdGVJbmZvOiBEYXRlSW5mbyxcbiAgICAgICAgaTogbnVtYmVyXG4gICAgKTogeyBkYXk6IERheTsgaXNJbk1vbnRoOiBib29sZWFuIH0ge1xuICAgICAgICBjb25zdCBpc0luTW9udGggPSB0aGlzLl9kYXRlU2VydmljZS5pc1NhbWUoZGF0ZSwgYWN0aXZlRGF0ZSwgJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbWVudE9mRGF0ZSA9IHRoaXMuX2RhdGVTZXJ2aWNlLmdldE1vbWVudChkYXRlKTtcbiAgICAgICAgY29uc3QgaXNUb2RheSA9IG1vbWVudE9mRGF0ZS5pc1NhbWUodG9kYXksICdkYXknKTtcbiAgICAgICAgY29uc3QgZGF5SW5Nb250aCA9IHRoaXMuX2RhdGVTZXJ2aWNlLnN0ckRhdGUoZGF0ZSk7XG4gICAgICAgIGNvbnN0IGRheUluV2VlayA9IHRoaXMuX2RhdGVTZXJ2aWNlLmRheShkYXRlKTtcbiAgICAgICAgY29uc3QgaXNFbmRPZk1vbnRoID0gbW9tZW50T2ZEYXRlLmlzU2FtZShlbmRPZk1vbnRoLCAnZGF5Jyk7XG4gICAgICAgIGNvbnN0IGlzU3RhcnRPZk1vbnRoID0gbW9tZW50T2ZEYXRlLmlzU2FtZShzdGFydE9mTW9udGgsICdkYXknKTtcbiAgICAgICAgY29uc3QgbW9udGhEYXRlSW5mbyA9IGlzSW5Nb250aCA/IGRhdGVJbmZvIDogdGhpcy5fZGF0ZVNlcnZpY2UuZ2V0RGF0ZUluZm8oZGF0ZSk7XG4gICAgICAgIGNvbnN0IGRheTogRGF5ID0ge1xuICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgZGF5SW5XZWVrLFxuICAgICAgICAgICAgc3RhdHVzOiBEYXlTdGF0dXMuT3BlbixcbiAgICAgICAgICAgIGRheUluTW9udGgsXG4gICAgICAgICAgICBkYXlJbk1vbnRoTjogdGhpcy5nZXROdW1iZXIoZGF5SW5Nb250aCksXG4gICAgICAgICAgICBpc1RvZGF5LFxuICAgICAgICAgICAgaXNJbk1vbnRoLFxuICAgICAgICAgICAgaXNFbmRPZk1vbnRoLFxuICAgICAgICAgICAgaXNTdGFydE9mTW9udGgsXG4gICAgICAgICAgICBtb21lbnRPZkRhdGUsXG4gICAgICAgICAgICBtb250aDogbW9udGhEYXRlSW5mby5tb250aCxcbiAgICAgICAgICAgIHllYXI6IG1vbnRoRGF0ZUluZm8ueWVhcixcbiAgICAgICAgICAgIG1vbnRoTmFtZTogbW9udGhEYXRlSW5mby5tb250aE5hbWUsXG4gICAgICAgICAgICBkYXlOYW1lOiBtb21lbnRPZkRhdGUuZm9ybWF0KCdkZGRkJyksXG4gICAgICAgICAgICB0YXNrczogW10sXG4gICAgICAgICAgICBtb250aERhdGVJbmZvLFxuICAgICAgICAgICAgcm93OiBNYXRoLmZsb29yKGkgLyA3ICsgMSksXG4gICAgICAgICAgICBjb2w6IDYgLSAoaSAlIDcpLFxuICAgICAgICAgICAgaXNBZGRpbmdOZXdFdmVudDogZmFsc2UsXG4gICAgICAgICAgICBhZGRpbmdFdmVudFBvaW50MTogbnVsbCxcbiAgICAgICAgICAgIGFkZGluZ0V2ZW50UG9pbnQyOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IGRheSwgaXNJbk1vbnRoIH07XG4gICAgfVxufVxuIl19
|