angular-calendar-scheduler
Version:
This project provide a scheduler view component for [mattlewis92/angular-calendar](https://github.com/mattlewis92/angular-calendar).
247 lines • 44.4 kB
JavaScript
export var DAYS_OF_WEEK;
(function (DAYS_OF_WEEK) {
DAYS_OF_WEEK[DAYS_OF_WEEK["SUNDAY"] = 0] = "SUNDAY";
DAYS_OF_WEEK[DAYS_OF_WEEK["MONDAY"] = 1] = "MONDAY";
DAYS_OF_WEEK[DAYS_OF_WEEK["TUESDAY"] = 2] = "TUESDAY";
DAYS_OF_WEEK[DAYS_OF_WEEK["WEDNESDAY"] = 3] = "WEDNESDAY";
DAYS_OF_WEEK[DAYS_OF_WEEK["THURSDAY"] = 4] = "THURSDAY";
DAYS_OF_WEEK[DAYS_OF_WEEK["FRIDAY"] = 5] = "FRIDAY";
DAYS_OF_WEEK[DAYS_OF_WEEK["SATURDAY"] = 6] = "SATURDAY";
})(DAYS_OF_WEEK || (DAYS_OF_WEEK = {}));
var DEFAULT_WEEKEND_DAYS = [
DAYS_OF_WEEK.SUNDAY,
DAYS_OF_WEEK.SATURDAY
];
export var DAYS_IN_WEEK = 7;
export var HOURS_IN_DAY = 24;
export var MINUTES_IN_HOUR = 60;
export var SECONDS_IN_DAY = 60 * 60 * 24;
export var DEFAULT_HOUR_SEGMENT_HEIGHT_PX = 40;
export var DEFAULT_EVENT_WIDTH_PERCENT = 100;
export var DEFAULT_HOUR_SEGMENTS = 2;
export function getSchedulerViewHourGrid(dateAdapter, args) {
var viewDate = args.viewDate, hourSegments = args.hourSegments, dayStart = args.dayStart, dayEnd = args.dayEnd;
var hours = [];
var startOfView = dateAdapter.setMinutes(dateAdapter.setHours(dateAdapter.startOfDay(viewDate), dayStart.hour), dayStart.minute);
var endOfView = dateAdapter.setMinutes(dateAdapter.setHours(dateAdapter.startOfMinute(dateAdapter.endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);
var segmentDuration = MINUTES_IN_HOUR / hourSegments;
var startOfViewDay = dateAdapter.startOfDay(viewDate);
var range = function (start, end) { return Array.from({ length: ((end + 1) - start) }, function (v, k) { return k + start; }); };
var hoursInView = range(dayStart.hour, dayEnd.hour);
hoursInView.forEach(function (hour, i) {
var segments = [];
for (var j = 0; j < hourSegments; j++) {
var date = dateAdapter.addMinutes(dateAdapter.addHours(startOfViewDay, hour), j * segmentDuration);
if (date >= startOfView && date < endOfView) {
segments.push({
date: date,
isStart: j === 0
});
}
}
if (segments.length > 0) {
hours.push({ segments: segments });
}
});
return hours;
}
export function getSchedulerView(dateAdapter, args) {
var events = args.events || [];
if (!events) {
events = [];
}
var viewDate = args.viewDate;
var weekStartsOn = args.weekStartsOn;
var startsWithToday = args.startsWithToday;
var excluded = args.excluded || [];
var hourSegments = args.hourSegments || DEFAULT_HOUR_SEGMENTS;
var hourSegmentHeight = args.hourSegmentHeight || DEFAULT_HOUR_SEGMENT_HEIGHT_PX;
var eventWidth = args.eventWidth || DEFAULT_EVENT_WIDTH_PERCENT;
var dayStart = args.dayStart, dayEnd = args.dayEnd;
var startOfViewWeek = startsWithToday ? dateAdapter.startOfDay(viewDate) : dateAdapter.startOfWeek(viewDate, { weekStartsOn: weekStartsOn });
var endOfViewWeek = startsWithToday ? dateAdapter.addDays(dateAdapter.endOfDay(viewDate), 6) : dateAdapter.endOfWeek(viewDate, { weekStartsOn: weekStartsOn });
var eventsInWeek = getEventsInPeriod(dateAdapter, {
events: events,
periodStart: startOfViewWeek,
periodEnd: endOfViewWeek
});
var days = getSchedulerViewDays(dateAdapter, {
viewDate: viewDate,
weekStartsOn: weekStartsOn,
startsWithToday: startsWithToday,
excluded: excluded
});
days.forEach(function (day) {
var startOfView = dateAdapter.setMinutes(dateAdapter.setHours(dateAdapter.startOfDay(day.date), dayStart.hour), dayStart.minute);
var endOfView = dateAdapter.setMinutes(dateAdapter.setHours(dateAdapter.startOfMinute(dateAdapter.endOfDay(day.date)), dayEnd.hour), dayEnd.minute);
var previousDayEvents = [];
var eventsInDay = getEventsInPeriod(dateAdapter, {
events: eventsInWeek,
periodStart: startOfView,
periodEnd: endOfView
});
day.events = eventsInDay
.sort(function (eventA, eventB) { return eventA.start.valueOf() - eventB.start.valueOf(); })
.map(function (ev) {
var eventStart = ev.start;
var eventEnd = ev.end || eventStart;
var startsBeforeDay = eventStart < startOfView;
var endsAfterDay = dateAdapter.addMinutes(eventEnd, -1) > endOfView;
var hourHeightModifier = ((hourSegments * hourSegmentHeight) + 1) / MINUTES_IN_HOUR; // +1 for the 1px segment bottom border
var top = 0;
if (eventStart > startOfView) {
top += dateAdapter.differenceInMinutes(eventStart, startOfView);
}
top *= hourHeightModifier;
var startDate = startsBeforeDay ? startOfView : eventStart;
var endDate = endsAfterDay ? endOfView : eventEnd;
var height = dateAdapter.differenceInMinutes(endDate, startDate);
if (!ev.end) {
height = hourSegmentHeight;
}
else {
height *= hourHeightModifier;
}
var bottom = top + height;
var overlappingPreviousEvents = getOverLappingDayViewEvents(previousDayEvents, top, bottom);
var left = 0;
while (overlappingPreviousEvents.some(function (previousEvent) { return previousEvent.left === left; })) {
left += eventWidth;
}
var event = {
event: ev,
top: top,
height: height,
width: eventWidth,
left: left,
startsBeforeDay: startsBeforeDay,
endsAfterDay: endsAfterDay,
isProcessed: false
};
previousDayEvents.push(event);
return event;
});
day.hours = getSchedulerViewHourGrid(dateAdapter, {
viewDate: viewDate,
hourSegments: hourSegments,
dayStart: {
hour: dayStart.hour,
minute: dayStart.minute
},
dayEnd: {
hour: dayEnd.hour,
minute: dayEnd.minute
}
}).map(function (hour) {
var date = new Date(day.date.getFullYear(), day.date.getMonth(), day.date.getDate(), hour.segments[0].date.getHours());
var startOfHour = new Date(day.date.getFullYear(), day.date.getMonth(), day.date.getDate(), hour.segments[0].date.getHours());
var endOfHour = dateAdapter.addMinutes(dateAdapter.addHours(startOfHour, 1), -1);
var eventsInHour = getEventsInPeriod(dateAdapter, {
events: eventsInDay,
periodStart: startOfHour,
periodEnd: endOfHour
});
var segments = hour.segments.map(function (segment) {
segment.date = dateAdapter.setDate(dateAdapter.setMonth(dateAdapter.setYear(segment.date, day.date.getFullYear()), day.date.getMonth()), day.date.getDate());
var startOfSegment = segment.date;
var endOfSegment = dateAdapter.addMinutes(segment.date, MINUTES_IN_HOUR / hourSegments);
var eventsInSegment = getEventsInPeriod(dateAdapter, {
events: eventsInHour,
periodStart: startOfSegment,
periodEnd: endOfSegment
});
return {
segment: segment,
date: new Date(segment.date),
events: eventsInSegment
};
});
return {
hour: hour,
date: date,
events: eventsInHour,
segments: segments
};
});
});
return {
days: days,
period: {
events: eventsInWeek,
start: startOfViewWeek,
end: endOfViewWeek
}
};
}
export function getSchedulerViewDays(dateAdapter, args) {
var viewDate = args.viewDate;
var weekStartsOn = args.weekStartsOn;
var startsWithToday = args.startsWithToday;
var excluded = args.excluded || [];
var weekendDays = args.weekendDays || DEFAULT_WEEKEND_DAYS;
var start = startsWithToday ? new Date(viewDate) : dateAdapter.startOfWeek(viewDate, { weekStartsOn: weekStartsOn });
var days = [];
var loop = function (i) {
var date = dateAdapter.addDays(start, i);
if (!excluded.some(function (e) { return date.getDay() === e; })) {
days.push(getSchedulerDay(dateAdapter, { date: date, weekendDays: weekendDays }));
}
};
for (var i = 0; i < DAYS_IN_WEEK; i++) {
loop(i);
}
return days;
}
function getSchedulerDay(dateAdapter, args) {
var date = args.date;
var today = dateAdapter.startOfDay(new Date());
return {
date: date,
isPast: date < today,
isToday: dateAdapter.isSameDay(date, today),
isFuture: date >= dateAdapter.addDays(today, 1),
isWeekend: args.weekendDays.indexOf(dateAdapter.getDay(date)) > -1,
inMonth: dateAdapter.isSameMonth(date, today),
hours: []
};
}
function getEventsInPeriod(dateAdapter, args) {
var events = args.events, periodStart = args.periodStart, periodEnd = args.periodEnd;
return events.filter(function (event) { return isEventInPeriod(dateAdapter, { event: event, periodStart: periodStart, periodEnd: periodEnd }); });
}
function isEventInPeriod(dateAdapter, args) {
var isSameSecond = dateAdapter.isSameSecond;
var event = args.event, periodStart = args.periodStart, periodEnd = args.periodEnd;
var eventStart = event.start;
var eventEnd = event.end || event.start;
if (eventStart > periodStart && eventStart < periodEnd) {
return true;
}
if (eventEnd > periodStart && eventEnd < periodEnd) {
return true;
}
if (eventStart < periodStart && eventEnd > periodEnd) {
return true;
}
if (isSameSecond(eventStart, periodStart) || isSameSecond(eventStart, periodEnd)) {
return true;
}
if (isSameSecond(eventEnd, periodStart) || isSameSecond(eventEnd, periodEnd)) {
return true;
}
return false;
}
function getOverLappingDayViewEvents(events, top, bottom) {
return events.filter(function (previousEvent) {
var previousEventTop = previousEvent.top;
var previousEventBottom = previousEvent.top + previousEvent.height;
if (top < previousEventBottom && previousEventBottom < bottom) {
return true;
}
else if (previousEventTop <= top && bottom <= previousEventBottom) {
return true;
}
return false;
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItc2NoZWR1bGVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1jYWxlbmRhci1zY2hlZHVsZXIvIiwic291cmNlcyI6WyJtb2R1bGVzL3NjaGVkdWxlci91dGlscy9jYWxlbmRhci1zY2hlZHVsZXItdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE1BQU0sQ0FBTixJQUFZLFlBUVg7QUFSRCxXQUFZLFlBQVk7SUFDcEIsbURBQVUsQ0FBQTtJQUNWLG1EQUFVLENBQUE7SUFDVixxREFBVyxDQUFBO0lBQ1gseURBQWEsQ0FBQTtJQUNiLHVEQUFZLENBQUE7SUFDWixtREFBVSxDQUFBO0lBQ1YsdURBQVksQ0FBQTtBQUNoQixDQUFDLEVBUlcsWUFBWSxLQUFaLFlBQVksUUFRdkI7QUFFRCxJQUFNLG9CQUFvQixHQUFhO0lBQ25DLFlBQVksQ0FBQyxNQUFNO0lBQ25CLFlBQVksQ0FBQyxRQUFRO0NBQ3hCLENBQUM7QUFFRixNQUFNLENBQUMsSUFBTSxZQUFZLEdBQVcsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxJQUFNLFlBQVksR0FBVyxFQUFFLENBQUM7QUFDdkMsTUFBTSxDQUFDLElBQU0sZUFBZSxHQUFXLEVBQUUsQ0FBQztBQUMxQyxNQUFNLENBQUMsSUFBTSxjQUFjLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFbkQsTUFBTSxDQUFDLElBQU0sOEJBQThCLEdBQUcsRUFBRSxDQUFDO0FBQ2pELE1BQU0sQ0FBQyxJQUFNLDJCQUEyQixHQUFHLEdBQUcsQ0FBQztBQUMvQyxNQUFNLENBQUMsSUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFldkMsTUFBTSxVQUFVLHdCQUF3QixDQUFDLFdBQXdCLEVBQUUsSUFBa0M7SUFDakcsSUFBTSxRQUFRLEdBQVMsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLEdBQVcsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEdBQVEsSUFBSSxDQUFD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QUFDLE1BQTRCLEVBQUUsR0FBVyxFQUFFLE1BQWM7SUFDMUYsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQUMsYUFBaUM7UUFDbkQsSUFBTSxnQkFBZ0IsR0FBVyxhQUFhLENBQUMsR0FBRyxDQUFDO1FBQ25ELElBQU0sbUJBQW1CLEdBQVcsYUFBYSxDQUFDLEdBQUcsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBRTdFLElBQUksR0FBRyxHQUFHLG1CQUFtQixJQUFJLG1CQUFtQixHQUFHLE1BQU0sRUFBRTtZQUMzRCxPQUFPLElBQUksQ0FBQztTQUNmO2FBQU0sSUFBSSxnQkFBZ0IsSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLG1CQUFtQixFQUFFO1lBQ2pFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2FsZW5kYXJTY2hlZHVsZXJFdmVudCxcclxuICAgIFNjaGVkdWxlclZpZXdIb3VyLFxyXG4gICAgU2NoZWR1bGVyVmlld0RheSxcclxuICAgIFNjaGVkdWxlclZpZXdFdmVudCxcclxuICAgIFNjaGVkdWxlclZpZXdIb3VyU2VnbWVudCxcclxuICAgIFNjaGVkdWxlclZpZXcsXHJcbiAgICBTY2hlZHVsZXJWaWV3UGVyaW9kXHJcbn0gZnJvbSAnLi4vbW9kZWxzJztcclxuaW1wb3J0IHtcclxuICAgIERheVZpZXdIb3VyLFxyXG4gICAgRGF5Vmlld0hvdXJTZWdtZW50XHJcbn0gZnJvbSAnY2FsZW5kYXItdXRpbHMnO1xyXG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJ2FuZ3VsYXItY2FsZW5kYXInO1xyXG5cclxuXHJcbmV4cG9ydCBlbnVtIERBWVNfT0ZfV0VFSyB7XHJcbiAgICBTVU5EQVkgPSAwLFxyXG4gICAgTU9OREFZID0gMSxcclxuICAgIFRVRVNEQVkgPSAyLFxyXG4gICAgV0VETkVTREFZID0gMyxcclxuICAgIFRIVVJTREFZID0gNCxcclxuICAgIEZSSURBWSA9IDUsXHJcbiAgICBTQVRVUkRBWSA9IDZcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9XRUVLRU5EX0RBWVM6IG51bWJlcltdID0gW1xyXG4gICAgREFZU19PRl9XRUVLLlNVTkRBWSxcclxuICAgIERBWVNfT0ZfV0VFSy5TQVRVUkRBWVxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IERBWVNfSU5fV0VFSzogbnVtYmVyID0gNztcclxuZXhwb3J0IGNvbnN0IEhPVVJTX0lOX0RBWTogbnVtYmVyID0gMjQ7XHJcbmV4cG9ydCBjb25zdCBNSU5VVEVTX0lOX0hPVVI6IG51bWJlciA9IDYwO1xyXG5leHBvcnQgY29uc3QgU0VDT05EU19JTl9EQVk6IG51bWJlciA9IDYwICogNjAgKiAyNDtcclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX0hPVVJfU0VHTUVOVF9IRUlHSFRfUFggPSA0MDtcclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVZFTlRfV0lEVEhfUEVSQ0VOVCA9IDEwMDtcclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSE9VUl9TRUdNRU5UUyA9IDI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdldFNjaGVkdWxlclZpZXdIb3VyR3JpZEFyZ3Mge1xyXG4gICAgdmlld0RhdGU6IERhdGU7XHJcbiAgICBob3VyU2VnbWVudHM6IG51bWJlcjtcclxuICAgIGRheVN0YXJ0OiB7XHJcbiAgICAgICAgaG91cjogbnVtYmVyO1xyXG4gICAgICAgIG1pbnV0ZTogbnVtYmVyO1xyXG4gICAgfTtcclxuICAgIGRheUVuZDoge1xyXG4gICAgICAgIGhvdXI6IG51bWJlcjtcclxuICAgICAgICBtaW51dGU6IG51bWJlcjtcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlZHVsZXJWaWV3SG91ckdyaWQoZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyLCBhcmdzOiBHZXRTY2hlZHVsZXJWaWV3SG91ckdyaWRBcmdzKTogRGF5Vmlld0hvdXJbXSB7XHJcbiAgICBjb25zdCB2aWV3RGF0ZTogRGF0ZSA9IGFyZ3Mudmlld0RhdGUsIGhvdXJTZWdtZW50czogbnVtYmVyID0gYXJncy5ob3VyU2VnbWVudHMsIGRheVN0YXJ0OiBhbnkgPSBhcmdzLmRheVN0YXJ0LCBkYXlFbmQ6IGFueSA9IGFyZ3MuZGF5RW5kO1xyXG4gICAgY29uc3QgaG91cnM6IERheVZpZXdIb3VyW10gPSBbXTtcclxuXHJcbiAgICBjb25zdCBzdGFydE9mVmlldzogRGF0ZSA9IGRhdGVBZGFwdGVyLnNldE1pbnV0ZXMoZGF0ZUFkYXB0ZXIuc2V0SG91cnMoZGF0ZUFkYXB0ZXIuc3RhcnRPZkRheSh2aWV3RGF0ZSksIGRheVN0YXJ0LmhvdXIpLCBkYXlTdGFydC5taW51dGUpO1xyXG4gICAgY29uc3QgZW5kT2ZWaWV3OiBEYXRlID0gZGF0ZUFkYXB0ZXIuc2V0TWludXRlcyhkYXRlQWRhcHRlci5zZXRIb3VycyhkYXRlQWRhcHRlci5zdGFydE9mTWludXRlKGRhdGVBZGFwdGVyLmVuZE9mRGF5KHZpZXdEYXRlKSksIGRheUVuZC5ob3VyKSwgZGF5RW5kLm1pbnV0ZSk7XHJcbiAgICBjb25zdCBzZWdtZW50RHVyYXRpb246IG51bWJlciA9IE1JTlVURVNfSU5fSE9VUiAvIGhvdXJTZWdtZW50cztcclxuICAgIGNvbnN0IHN0YXJ0T2ZWaWV3RGF5OiBEYXRlID0gZGF0ZUFkYXB0ZXIuc3RhcnRPZkRheSh2aWV3RGF0ZSk7XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBudW1iZXJbXSA9PiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAoKGVuZCArIDEpIC0gc3RhcnQpIH0sICh2LCBrKSA9PiBrICsgc3RhcnQpO1xyXG4gICAgY29uc3QgaG91cnNJblZpZXc6IG51bWJlcltdID0gcmFuZ2UoZGF5U3RhcnQuaG91ciwgZGF5RW5kLmhvdXIpO1xyXG5cclxuICAgIGhvdXJzSW5WaWV3LmZvckVhY2goKGhvdXI6IG51bWJlciwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhvdXJTZWdtZW50czsgaisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBkYXRlQWRhcHRlci5hZGRNaW51dGVzKGRhdGVBZGFwdGVyLmFkZEhvdXJzKHN0YXJ0T2ZWaWV3RGF5LCBob3VyKSwgaiAqIHNlZ21lbnREdXJhdGlvbik7XHJcbiAgICAgICAgICAgIGlmIChkYXRlID49IHN0YXJ0T2ZWaWV3ICYmIGRhdGUgPCBlbmRPZlZpZXcpIHtcclxuICAgICAgICAgICAgICAgIHNlZ21lbnRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IGRhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNTdGFydDogaiA9PT0gMFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaG91cnMucHVzaCg8RGF5Vmlld0hvdXI+eyBzZWdtZW50czogc2VnbWVudHMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gaG91cnM7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2V0U2NoZWR1bGVyVmlld0FyZ3Mge1xyXG4gICAgZXZlbnRzPzogQ2FsZW5kYXJTY2hlZHVsZXJFdmVudFtdO1xyXG4gICAgdmlld0RhdGU6IERhdGU7XHJcbiAgICBob3VyU2VnbWVudHM6IDEgfCAyIHwgNCB8IDY7XHJcbiAgICB3ZWVrU3RhcnRzT246IG51bWJlcjtcclxuICAgIHN0YXJ0c1dpdGhUb2RheTogYm9vbGVhbjtcclxuICAgIGRheVN0YXJ0OiB7XHJcbiAgICAgICAgaG91cjogbnVtYmVyO1xyXG4gICAgICAgIG1pbnV0ZTogbnVtYmVyO1xyXG4gICAgfTtcclxuICAgIGRheUVuZDoge1xyXG4gICAgICAgIGhvdXI6IG51bWJlcjtcclxuICAgICAgICBtaW51dGU6IG51bWJlcjtcclxuICAgIH07XHJcbiAgICBleGNsdWRlZD86IG51bWJlcltdO1xyXG4gICAgZXZlbnRXaWR0aDogbnVtYmVyO1xyXG4gICAgaG91clNlZ21lbnRIZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVkdWxlclZpZXcoZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyLCBhcmdzOiBHZXRTY2hlZHVsZXJWaWV3QXJncyk6IFNjaGVkdWxlclZpZXcge1xyXG4gICAgbGV0IGV2ZW50czogQ2FsZW5kYXJTY2hlZHVsZXJFdmVudFtdID0gYXJncy5ldmVudHMgfHwgW107XHJcbiAgICBpZiAoIWV2ZW50cykgeyBldmVudHMgPSBbXTsgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdEYXRlOiBEYXRlID0gYXJncy52aWV3RGF0ZTtcclxuICAgIGNvbnN0IHdlZWtTdGFydHNPbjogbnVtYmVyID0gYXJncy53ZWVrU3RhcnRzT247XHJcbiAgICBjb25zdCBzdGFydHNXaXRoVG9kYXk6IGJvb2xlYW4gPSBhcmdzLnN0YXJ0c1dpdGhUb2RheTtcclxuICAgIGNvbnN0IGV4Y2x1ZGVkOiBudW1iZXJbXSA9IGFyZ3MuZXhjbHVkZWQgfHwgW107XHJcbiAgICBjb25zdCBob3VyU2VnbWVudHM6IG51bWJlciA9IGFyZ3MuaG91clNlZ21lbnRzIHx8IERFRkFVTFRfSE9VUl9TRUdNRU5UUztcclxuICAgIGNvbnN0IGhvdXJTZWdtZW50SGVpZ2h0OiBudW1iZXIgPSBhcmdzLmhvdXJTZWdtZW50SGVpZ2h0IHx8IERFRkFVTFRfSE9VUl9TRUdNRU5UX0hFSUdIVF9QWDtcclxuICAgIGNvbnN0IGV2ZW50V2lkdGg6IG51bWJlciA9IGFyZ3MuZXZlbnRXaWR0aCB8fCBERUZBVUxUX0VWRU5UX1dJRFRIX1BFUkNFTlQ7XHJcbiAgICBjb25zdCBkYXlTdGFydDogYW55ID0gYXJncy5kYXlTdGFydCwgZGF5RW5kOiBhbnkgPSBhcmdzLmRheUVuZDtcclxuXHJcbiAgICBjb25zdCBzdGFydE9mVmlld1dlZWs6IERhdGUgPSBzdGFydHNXaXRoVG9kYXkgPyBkYXRlQWRhcHRlci5zdGFydE9mRGF5KHZpZXdEYXRlKSA6IGRhdGVBZGFwdGVyLnN0YXJ0T2ZXZWVrKHZpZXdEYXRlLCB7IHdlZWtTdGFydHNPbjogd2Vla1N0YXJ0c09uIH0pO1xyXG4gICAgY29uc3QgZW5kT2ZWaWV3V2VlazogRGF0ZSA9IHN0YXJ0c1dpdGhUb2RheSA/IGRhdGVBZGFwdGVyLmFkZERheXMoZGF0ZUFkYXB0ZXIuZW5kT2ZEYXkodmlld0RhdGUpLCA2KSA6IGRhdGVBZGFwdGVyLmVuZE9mV2Vlayh2aWV3RGF0ZSwgeyB3ZWVrU3RhcnRzT246IHdlZWtTdGFydHNPbiB9KTtcclxuXHJcbiAgICBjb25zdCBldmVudHNJbldlZWs6IENhbGVuZGFyU2NoZWR1bGVyRXZlbnRbXSA9IGdldEV2ZW50c0luUGVyaW9kKGRhdGVBZGFwdGVyLCB7XHJcbiAgICAgICAgZXZlbnRzOiBldmVudHMsXHJcbiAgICAgICAgcGVyaW9kU3RhcnQ6IHN0YXJ0T2ZWaWV3V2VlayxcclxuICAgICAgICBwZXJpb2RFbmQ6IGVuZE9mVmlld1dlZWtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGRheXM6IFNjaGVkdWxlclZpZXdEYXlbXSA9IGdldFNjaGVkdWxlclZpZXdEYXlzKGRhdGVBZGFwdGVyLCB7XHJcbiAgICAgICAgdmlld0RhdGU6IHZpZXdEYXRlLFxyXG4gICAgICAgIHdlZWtTdGFydHNPbjogd2Vla1N0YXJ0c09uLFxyXG4gICAgICAgIHN0YXJ0c1dpdGhUb2RheTogc3RhcnRzV2l0aFRvZGF5LFxyXG4gICAgICAgIGV4Y2x1ZGVkOiBleGNsdWRlZFxyXG4gICAgfSk7XHJcbiAgICBkYXlzLmZvckVhY2goKGRheTogU2NoZWR1bGVyVmlld0RheSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0T2ZWaWV3OiBEYXRlID0gZGF0ZUFkYXB0ZXIuc2V0TWludXRlcyhkYXRlQWRhcHRlci5zZXRIb3VycyhkYXRlQWRhcHRlci5zdGFydE9mRGF5KGRheS5kYXRlKSwgZGF5U3RhcnQuaG91ciksIGRheVN0YXJ0Lm1pbnV0ZSk7XHJcbiAgICAgICAgY29uc3QgZW5kT2ZWaWV3OiBEYXRlID0gZGF0ZUFkYXB0ZXIuc2V0TWludXRlcyhkYXRlQWRhcHRlci5zZXRIb3VycyhkYXRlQWRhcHRlci5zdGFydE9mTWludXRlKGRhdGVBZGFwdGVyLmVuZE9mRGF5KGRheS5kYXRlKSksIGRheUVuZC5ob3VyKSwgZGF5RW5kLm1pbnV0ZSk7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNEYXlFdmVudHM6IFNjaGVkdWxlclZpZXdFdmVudFtdID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50c0luRGF5OiBDYWxlbmRhclNjaGVkdWxlckV2ZW50W10gPSBnZXRFdmVudHNJblBlcmlvZChkYXRlQWRhcHRlciwge1xyXG4gICAgICAgICAgICBldmVudHM6IGV2ZW50c0luV2VlayxcclxuICAgICAgICAgICAgcGVyaW9kU3RhcnQ6IHN0YXJ0T2ZWaWV3LFxyXG4gICAgICAgICAgICBwZXJpb2RFbmQ6IGVuZE9mVmlld1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkYXkuZXZlbnRzID0gZXZlbnRzSW5EYXlcclxuICAgICAgICAgICAgLnNvcnQoKGV2ZW50QTogQ2FsZW5kYXJTY2hlZHVsZXJFdmVudCwgZXZlbnRCOiBDYWxlbmRhclNjaGVkdWxlckV2ZW50KSA9PiBldmVudEEuc3RhcnQudmFsdWVPZigpIC0gZXZlbnRCLnN0YXJ0LnZhbHVlT2YoKSlcclxuICAgICAgICAgICAgLm1hcCgoZXY6IENhbGVuZGFyU2NoZWR1bGVyRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50U3RhcnQ6IERhdGUgPSBldi5zdGFydDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RW5kOiBEYXRlID0gZXYuZW5kIHx8IGV2ZW50U3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydHNCZWZvcmVEYXk6IGJvb2xlYW4gPSBldmVudFN0YXJ0IDwgc3RhcnRPZlZpZXc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRzQWZ0ZXJEYXk6IGJvb2xlYW4gPSBkYXRlQWRhcHRlci5hZGRNaW51dGVzKGV2ZW50RW5kLCAtMSkgPiBlbmRPZlZpZXc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBob3VySGVpZ2h0TW9kaWZpZXI6IG51bWJlciA9ICgoaG91clNlZ21lbnRzICogaG91clNlZ21lbnRIZWlnaHQpICsgMSkgLyBNSU5VVEVTX0lOX0hPVVI7IC8vICsxIGZvciB0aGUgMXB4IHNlZ21lbnQgYm90dG9tIGJvcmRlclxyXG5cclxuICAgICAgICAgICAgICAgIGxldCB0b3A6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRTdGFydCA+IHN0YXJ0T2ZWaWV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9wICs9IGRhdGVBZGFwdGVyLmRpZmZlcmVuY2VJbk1pbnV0ZXMoZXZlbnRTdGFydCwgc3RhcnRPZlZpZXcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdG9wICo9IGhvdXJIZWlnaHRNb2RpZmllcjtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGU6IERhdGUgPSBzdGFydHNCZWZvcmVEYXkgPyBzdGFydE9mVmlldyA6IGV2ZW50U3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmREYXRlOiBEYXRlID0gZW5kc0FmdGVyRGF5ID8gZW5kT2ZWaWV3IDogZXZlbnRFbmQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXIgPSBkYXRlQWRhcHRlci5kaWZmZXJlbmNlSW5NaW51dGVzKGVuZERhdGUsIHN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWV2LmVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGhvdXJTZWdtZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgKj0gaG91ckhlaWdodE1vZGlmaWVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbTogbnVtYmVyID0gdG9wICsgaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdQcmV2aW91c0V2ZW50cyA9IGdldE92ZXJMYXBwaW5nRGF5Vmlld0V2ZW50cyhcclxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0RheUV2ZW50cyxcclxuICAgICAgICAgICAgICAgICAgICB0b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tXHJcbiAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBsZWZ0OiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG92ZXJsYXBwaW5nUHJldmlvdXNFdmVudHMuc29tZShwcmV2aW91c0V2ZW50ID0+IHByZXZpb3VzRXZlbnQubGVmdCA9PT0gbGVmdCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0ICs9IGV2ZW50V2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFNjaGVkdWxlclZpZXdFdmVudCA9XHJcbiAgICAgICAgICAgICAgICA8U2NoZWR1bGVyVmlld0V2ZW50PntcclxuICAgICAgICAgICAgICAgICAgICBldmVudDogZXYsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiB0b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGV2ZW50V2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogbGVmdCxcclxuICAgICAgICAgICAgICAgICAgICBzdGFydHNCZWZvcmVEYXk6IHN0YXJ0c0JlZm9yZURheSxcclxuICAgICAgICAgICAgICAgICAgICBlbmRzQWZ0ZXJEYXk6IGVuZHNBZnRlckRheSxcclxuICAgICAgICAgICAgICAgICAgICBpc1Byb2Nlc3NlZDogZmFsc2VcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgcHJldmlvdXNEYXlFdmVudHMucHVzaChldmVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZGF5LmhvdXJzID0gZ2V0U2NoZWR1bGVyVmlld0hvdXJHcmlkKGRhdGVBZGFwdGVyLCB7XHJcbiAgICAgICAgICAgIHZpZXdEYXRlOiB2aWV3RGF0ZSxcclxuICAgICAgICAgICAgaG91clNlZ21lbnRzOiBob3VyU2VnbWVudHMsXHJcbiAgICAgICAgICAgIGRheVN0YXJ0OiB7XHJcbiAgICAgICAgICAgICAgICBob3VyOiBkYXlTdGFydC5ob3VyLFxyXG4gICAgICAgICAgICAgICAgbWludXRlOiBkYXlTdGFydC5taW51dGVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGF5RW5kOiB7XHJcbiAgICAgICAgICAgICAgICBob3VyOiBkYXlFbmQuaG91cixcclxuICAgICAgICAgICAgICAgIG1pbnV0ZTogZGF5RW5kLm1pbnV0ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkubWFwKChob3VyOiBEYXlWaWV3SG91cikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUoZGF5LmRhdGUuZ2V0RnVsbFllYXIoKSwgZGF5LmRhdGUuZ2V0TW9udGgoKSwgZGF5LmRhdGUuZ2V0RGF0ZSgpLCBob3VyLnNlZ21lbnRzWzBdLmRhdGUuZ2V0SG91cnMoKSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGFydE9mSG91cjogRGF0ZSA9IG5ldyBEYXRlKGRheS5kYXRlLmdldEZ1bGxZZWFyKCksIGRheS5kYXRlLmdldE1vbnRoKCksIGRheS5kYXRlLmdldERhdGUoKSwgaG91ci5zZWdtZW50c1swXS5kYXRlLmdldEhvdXJzKCkpO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRPZkhvdXI6IERhdGUgPSBkYXRlQWRhcHRlci5hZGRNaW51dGVzKGRhdGVBZGFwdGVyLmFkZEhvdXJzKHN0YXJ0T2ZIb3VyLCAxKSwgLTEpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnRzSW5Ib3VyOiBDYWxlbmRhclNjaGVkdWxlckV2ZW50W10gPSBnZXRFdmVudHNJblBlcmlvZChkYXRlQWRhcHRlciwge1xyXG4gICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudHNJbkRheSxcclxuICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0OiBzdGFydE9mSG91cixcclxuICAgICAgICAgICAgICAgIHBlcmlvZEVuZDogZW5kT2ZIb3VyXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudHM6IFNjaGVkdWxlclZpZXdIb3VyU2VnbWVudFtdID1cclxuICAgICAgICAgICAgICAgIGhvdXIuc2VnbWVudHMubWFwKChzZWdtZW50OiBEYXlWaWV3SG91clNlZ21lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmRhdGUgPSBkYXRlQWRhcHRlci5zZXREYXRlKGRhdGVBZGFwdGVyLnNldE1vbnRoKGRhdGVBZGFwdGVyLnNldFllYXIoc2VnbWVudC5kYXRlLCBkYXkuZGF0ZS5nZXRGdWxsWWVhcigpKSwgZGF5LmRhdGUuZ2V0TW9udGgoKSksIGRheS5kYXRlLmdldERhdGUoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0T2ZTZWdtZW50OiBEYXRlID0gc2VnbWVudC5kYXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZE9mU2VnbWVudDogRGF0ZSA9IGRhdGVBZGFwdGVyLmFkZE1pbnV0ZXMoc2VnbWVudC5kYXRlLCBNSU5VVEVTX0lOX0hPVVIgLyBob3VyU2VnbWVudHMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudHNJblNlZ21lbnQ6IENhbGVuZGFyU2NoZWR1bGVyRXZlbnRbXSA9IGdldEV2ZW50c0luUGVyaW9kKGRhdGVBZGFwdGVyLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXZlbnRzSW5Ib3VyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RTdGFydDogc3RhcnRPZlNlZ21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZEVuZDogZW5kT2ZTZWdtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8U2NoZWR1bGVyVmlld0hvdXJTZWdtZW50PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogc2VnbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoc2VnbWVudC5kYXRlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudHNJblNlZ21lbnRcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gPFNjaGVkdWxlclZpZXdIb3VyPntcclxuICAgICAgICAgICAgICAgIGhvdXI6IGhvdXIsXHJcbiAgICAgICAgICAgICAgICBkYXRlOiBkYXRlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudHNJbkhvdXIsXHJcbiAgICAgICAgICAgICAgICBzZWdtZW50czogc2VnbWVudHNcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiA8U2NoZWR1bGVyVmlldz57XHJcbiAgICAgICAgZGF5czogZGF5cyxcclxuICAgICAgICBwZXJpb2Q6IDxTY2hlZHVsZXJWaWV3UGVyaW9kPntcclxuICAgICAgICAgICAgZXZlbnRzOiBldmVudHNJbldlZWssXHJcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydE9mVmlld1dlZWssXHJcbiAgICAgICAgICAgIGVuZDogZW5kT2ZWaWV3V2Vla1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2V0U2NoZWR1bGVyVmlld0RheXNBcmdzIHtcclxuICAgIHZpZXdEYXRlOiBEYXRlO1xyXG4gICAgd2Vla1N0YXJ0c09uOiBudW1iZXI7XHJcbiAgICBzdGFydHNXaXRoVG9kYXk6IGJvb2xlYW47XHJcbiAgICBleGNsdWRlZD86IG51bWJlcltdO1xyXG4gICAgd2Vla2VuZERheXM/OiBudW1iZXJbXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVkdWxlclZpZXdEYXlzKGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlciwgYXJnczogR2V0U2NoZWR1bGVyVmlld0RheXNBcmdzKTogU2NoZWR1bGVyVmlld0RheVtdIHtcclxuICAgIGNvbnN0IHZpZXdEYXRlOiBEYXRlID0gYXJncy52aWV3RGF0ZTtcclxuICAgIGNvbnN0IHdlZWtTdGFydHNPbjogbnVtYmVyID0gYXJncy53ZWVrU3RhcnRzT247XHJcbiAgICBjb25zdCBzdGFydHNXaXRoVG9kYXk6IGJvb2xlYW4gPSBhcmdzLnN0YXJ0c1dpdGhUb2RheTtcclxuICAgIGNvbnN0IGV4Y2x1ZGVkOiBudW1iZXJbXSA9IGFyZ3MuZXhjbHVkZWQgfHwgW107XHJcbiAgICBjb25zdCB3ZWVrZW5kRGF5czogbnVtYmVyW10gPSBhcmdzLndlZWtlbmREYXlzIHx8IERFRkFVTFRfV0VFS0VORF9EQVlTO1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRzV2l0aFRvZGF5ID8gbmV3IERhdGUodmlld0RhdGUpIDogZGF0ZUFkYXB0ZXIuc3RhcnRPZldlZWsodmlld0RhdGUsIHsgd2Vla1N0YXJ0c09uOiB3ZWVrU3RhcnRzT24gfSk7XHJcbiAgICBjb25zdCBkYXlzOiBTY2hlZHVsZXJWaWV3RGF5W10gPSBbXTtcclxuICAgIGNvbnN0IGxvb3AgPSAoaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0ZSA9IGRhdGVBZGFwdGVyLmFkZERheXMoc3RhcnQsIGkpO1xyXG4gICAgICAgIGlmICghZXhjbHVkZWQuc29tZSgoZTogbnVtYmVyKSA9PiBkYXRlLmdldERheSgpID09PSBlKSkge1xyXG4gICAgICAgICAgICBkYXlzLnB1c2goZ2V0U2NoZWR1bGVyRGF5KGRhdGVBZGFwdGVyLCB7IGRhdGUsIHdlZWtlbmREYXlzIH0pKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEQVlTX0lOX1dFRUs7IGkrKykge1xyXG4gICAgICAgIGxvb3AoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF5cztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U2NoZWR1bGVyRGF5KGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlciwgYXJnczogeyBkYXRlOiBEYXRlLCB3ZWVrZW5kRGF5czogbnVtYmVyW10gfSk6IFNjaGVkdWxlclZpZXdEYXkge1xyXG4gICAgY29uc3QgZGF0ZTogRGF0ZSA9IGFyZ3MuZGF0ZTtcclxuICAgIGNvbnN0IHRvZGF5OiBEYXRlID0gZGF0ZUFkYXB0ZXIuc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuXHJcbiAgICByZXR1cm4gPFNjaGVkdWxlclZpZXdEYXk+e1xyXG4gICAgICAgIGRhdGU6IGRhdGUsXHJcbiAgICAgICAgaXNQYXN0OiBkYXRlIDwgdG9kYXksXHJcbiAgICAgICAgaXNUb2RheTogZGF0ZUFkYXB0ZXIuaXNTYW1lRGF5KGRhdGUsIHRvZGF5KSxcclxuICAgICAgICBpc0Z1dHVyZTogZGF0ZSA+PSBkYXRlQWRhcHRlci5hZGREYXlzKHRvZGF5LCAxKSxcclxuICAgICAgICBpc1dlZWtlbmQ6IGFyZ3Mud2Vla2VuZERheXMuaW5kZXhPZihkYXRlQWRhcHRlci5nZXREYXkoZGF0ZSkpID4gLTEsXHJcbiAgICAgICAgaW5Nb250aDogZGF0ZUFkYXB0ZXIuaXNTYW1lTW9udGgoZGF0ZSwgdG9kYXkpLFxyXG4gICAgICAgIGhvdXJzOiBbXVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHZXRFdmVudHNJblBlcmlvZEFyZ3Mge1xyXG4gICAgZXZlbnRzOiBDYWxlbmRhclNjaGVkdWxlckV2ZW50W107XHJcbiAgICBwZXJpb2RTdGFydDogRGF0ZTtcclxuICAgIHBlcmlvZEVuZDogRGF0ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RXZlbnRzSW5QZXJpb2QoZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyLCBhcmdzOiBHZXRFdmVudHNJblBlcmlvZEFyZ3MpOiBDYWxlbmRhclNjaGVkdWxlckV2ZW50W10ge1xyXG4gICAgY29uc3QgZXZlbnRzOiBDYWxlbmRhclNjaGVkdWxlckV2ZW50W10gPSBhcmdzLmV2ZW50cywgcGVyaW9kU3RhcnQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBhcmdzLnBlcmlvZFN0YXJ0LCBwZXJpb2RFbmQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBhcmdzLnBlcmlvZEVuZDtcclxuICAgIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCkgPT4gaXNFdmVudEluUGVyaW9kKGRhdGVBZGFwdGVyLCB7IGV2ZW50OiBldmVudCwgcGVyaW9kU3RhcnQ6IHBlcmlvZFN0YXJ0LCBwZXJpb2RFbmQ6IHBlcmlvZEVuZCB9KSk7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJc0V2ZW50SW5QZXJpb2RBcmdzIHtcclxuICAgIGV2ZW50OiBDYWxlbmRhclNjaGVkdWxlckV2ZW50O1xyXG4gICAgcGVyaW9kU3RhcnQ6IERhdGU7XHJcbiAgICBwZXJpb2RFbmQ6IERhdGU7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBpc0V2ZW50SW5QZXJpb2QoZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyLCBhcmdzOiBJc0V2ZW50SW5QZXJpb2RBcmdzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB7IGlzU2FtZVNlY29uZCB9ID0gZGF0ZUFkYXB0ZXI7XHJcbiAgICBjb25zdCBldmVudDogQ2FsZW5kYXJTY2hlZHVsZXJFdmVudCA9IGFyZ3MuZXZlbnQsIHBlcmlvZFN0YXJ0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gYXJncy5wZXJpb2RTdGFydCwgcGVyaW9kRW5kOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gYXJncy5wZXJpb2RFbmQ7XHJcbiAgICBjb25zdCBldmVudFN0YXJ0OiBEYXRlID0gZXZlbnQuc3RhcnQ7XHJcbiAgICBjb25zdCBldmVudEVuZDogRGF0ZSA9IGV2ZW50LmVuZCB8fCBldmVudC5zdGFydDtcclxuXHJcbiAgICBpZiAoZXZlbnRTdGFydCA+IHBlcmlvZFN0YXJ0ICYmIGV2ZW50U3RhcnQgPCBwZXJpb2RFbmQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXZlbnRFbmQgPiBwZXJpb2RTdGFydCAmJiBldmVudEVuZCA8IHBlcmlvZEVuZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudFN0YXJ0IDwgcGVyaW9kU3RhcnQgJiYgZXZlbnRFbmQgPiBwZXJpb2RFbmQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNTYW1lU2Vjb25kKGV2ZW50U3RhcnQsIHBlcmlvZFN0YXJ0KSB8fCBpc1NhbWVTZWNvbmQoZXZlbnRTdGFydCwgcGVyaW9kRW5kKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc1NhbWVTZWNvbmQoZXZlbnRFbmQsIHBlcmlvZFN0YXJ0KSB8fCBpc1NhbWVTZWNvbmQoZXZlbnRFbmQsIHBlcmlvZEVuZCkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZXRPdmVyTGFwcGluZ0RheVZpZXdFdmVudHMoZXZlbnRzOiBTY2hlZHVsZXJWaWV3RXZlbnRbXSwgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyKTogU2NoZWR1bGVyVmlld0V2ZW50W10ge1xyXG4gICAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKHByZXZpb3VzRXZlbnQ6IFNjaGVkdWxlclZpZXdFdmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRXZlbnRUb3A6IG51bWJlciA9IHByZXZpb3VzRXZlbnQudG9wO1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRXZlbnRCb3R0b206IG51bWJlciA9IHByZXZpb3VzRXZlbnQudG9wICsgcHJldmlvdXNFdmVudC5oZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICh0b3AgPCBwcmV2aW91c0V2ZW50Qm90dG9tICYmIHByZXZpb3VzRXZlbnRCb3R0b20gPCBib3R0b20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c0V2ZW50VG9wIDw9IHRvcCAmJiBib3R0b20gPD0gcHJldmlvdXNFdmVudEJvdHRvbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0pO1xyXG59XHJcbiJdfQ==