@ng-bootstrap/ng-bootstrap
Version:
Angular powered Bootstrap
181 lines • 29.9 kB
JavaScript
import { NgbDate } from './ngb-date';
export function isChangedDate(prev, next) {
return !dateComparator(prev, next);
}
export function isChangedMonth(prev, next) {
return !prev && !next ? false : !prev || !next ? true : prev.year !== next.year || prev.month !== next.month;
}
export function dateComparator(prev, next) {
return (!prev && !next) || (!!prev && !!next && prev.equals(next));
}
export function checkMinBeforeMax(minDate, maxDate) {
if (maxDate && minDate && maxDate.before(minDate)) {
throw new Error(`'maxDate' ${maxDate} should be greater than 'minDate' ${minDate}`);
}
}
export function checkDateInRange(date, minDate, maxDate) {
if (date && minDate && date.before(minDate)) {
return minDate;
}
if (date && maxDate && date.after(maxDate)) {
return maxDate;
}
return date || null;
}
export function isDateSelectable(date, state) {
const { minDate, maxDate, disabled, markDisabled } = state;
return !(date === null ||
date === undefined ||
disabled ||
(markDisabled && markDisabled(date, { year: date.year, month: date.month })) ||
(minDate && date.before(minDate)) ||
(maxDate && date.after(maxDate)));
}
export function generateSelectBoxMonths(calendar, date, minDate, maxDate) {
if (!date) {
return [];
}
let months = calendar.getMonths(date.year);
if (minDate && date.year === minDate.year) {
const index = months.findIndex((month) => month === minDate.month);
months = months.slice(index);
}
if (maxDate && date.year === maxDate.year) {
const index = months.findIndex((month) => month === maxDate.month);
months = months.slice(0, index + 1);
}
return months;
}
export function generateSelectBoxYears(date, minDate, maxDate) {
if (!date) {
return [];
}
const start = minDate ? Math.max(minDate.year, date.year - 500) : date.year - 10;
const end = maxDate ? Math.min(maxDate.year, date.year + 500) : date.year + 10;
const length = end - start + 1;
const numbers = Array(length);
for (let i = 0; i < length; i++) {
numbers[i] = start + i;
}
return numbers;
}
export function nextMonthDisabled(calendar, date, maxDate) {
const nextDate = Object.assign(calendar.getNext(date, 'm'), { day: 1 });
return maxDate != null && nextDate.after(maxDate);
}
export function prevMonthDisabled(calendar, date, minDate) {
const prevDate = Object.assign(calendar.getPrev(date, 'm'), { day: 1 });
return (minDate != null &&
((prevDate.year === minDate.year && prevDate.month < minDate.month) ||
(prevDate.year < minDate.year && minDate.month === 1)));
}
export function buildMonths(calendar, date, state, i18n, force) {
const { displayMonths, months } = state;
// move old months to a temporary array
const monthsToReuse = months.splice(0, months.length);
// generate new first dates, nullify or reuse months
const firstDates = Array.from({ length: displayMonths }, (_, i) => {
const firstDate = Object.assign(calendar.getNext(date, 'm', i), { day: 1 });
months[i] = null;
if (!force) {
const reusedIndex = monthsToReuse.findIndex((month) => month.firstDate.equals(firstDate));
// move reused month back to months
if (reusedIndex !== -1) {
months[i] = monthsToReuse.splice(reusedIndex, 1)[0];
}
}
return firstDate;
});
// rebuild nullified months
firstDates.forEach((firstDate, i) => {
if (months[i] === null) {
months[i] = buildMonth(calendar, firstDate, state, i18n, monthsToReuse.shift() || {});
}
});
return months;
}
export function buildMonth(calendar, date, state, i18n, month = {}) {
const { dayTemplateData, minDate, maxDate, firstDayOfWeek, markDisabled, outsideDays, weekdayWidth, weekdaysVisible, } = state;
const calendarToday = calendar.getToday();
month.firstDate = null;
month.lastDate = null;
month.number = date.month;
month.year = date.year;
month.weeks = month.weeks || [];
month.weekdays = month.weekdays || [];
date = getFirstViewDate(calendar, date, firstDayOfWeek);
// clearing weekdays, if not visible
if (!weekdaysVisible) {
month.weekdays.length = 0;
}
// month has weeks
for (let week = 0; week < calendar.getWeeksPerMonth(); week++) {
let weekObject = month.weeks[week];
if (!weekObject) {
weekObject = month.weeks[week] = { number: 0, days: [], collapsed: true };
}
const days = weekObject.days;
// week has days
for (let day = 0; day < calendar.getDaysPerWeek(); day++) {
if (week === 0 && weekdaysVisible) {
month.weekdays[day] = i18n.getWeekdayLabel(calendar.getWeekday(date), weekdayWidth);
}
const newDate = new NgbDate(date.year, date.month, date.day);
const nextDate = calendar.getNext(newDate);
const ariaLabel = i18n.getDayAriaLabel(newDate);
// marking date as disabled
let disabled = !!((minDate && newDate.before(minDate)) || (maxDate && newDate.after(maxDate)));
if (!disabled && markDisabled) {
disabled = markDisabled(newDate, { month: month.number, year: month.year });
}
// today
let today = newDate.equals(calendarToday);
// adding user-provided data to the context
let contextUserData = dayTemplateData
? dayTemplateData(newDate, { month: month.number, year: month.year })
: undefined;
// saving first date of the month
if (month.firstDate === null && newDate.month === month.number) {
month.firstDate = newDate;
}
// saving last date of the month
if (newDate.month === month.number && nextDate.month !== month.number) {
month.lastDate = newDate;
}
let dayObject = days[day];
if (!dayObject) {
dayObject = days[day] = {};
}
dayObject.date = newDate;
dayObject.context = Object.assign(dayObject.context || {}, {
$implicit: newDate,
date: newDate,
data: contextUserData,
currentMonth: month.number,
currentYear: month.year,
disabled,
focused: false,
selected: false,
today,
});
dayObject.tabindex = -1;
dayObject.ariaLabel = ariaLabel;
dayObject.hidden = false;
date = nextDate;
}
weekObject.number = calendar.getWeekNumber(days.map((day) => day.date), firstDayOfWeek);
// marking week as collapsed
weekObject.collapsed =
outsideDays === 'collapsed' &&
days[0].date.month !== month.number &&
days[days.length - 1].date.month !== month.number;
}
return month;
}
export function getFirstViewDate(calendar, date, firstDayOfWeek) {
const daysPerWeek = calendar.getDaysPerWeek();
const firstMonthDate = new NgbDate(date.year, date.month, 1);
const dayOfWeek = calendar.getWeekday(firstMonthDate) % daysPerWeek;
return calendar.getPrev(firstMonthDate, 'd', (daysPerWeek + dayOfWeek - firstDayOfWeek) % daysPerWeek);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci10b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRlcGlja2VyL2RhdGVwaWNrZXItdG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUtyQyxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQXFCLEVBQUUsSUFBcUI7SUFDekUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBcUIsRUFBRSxJQUFxQjtJQUMxRSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDOUcsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBcUIsRUFBRSxJQUFxQjtJQUMxRSxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxPQUF3QixFQUFFLE9BQXdCO0lBQ25GLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxPQUFPLHFDQUFxQyxPQUFPLEVB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UUFBcUIsRUFBRSxJQUFhLEVBQUUsY0FBc0I7SUFDNUYsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlDLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUNwRSxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLEdBQUcsY0FBYyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7QUFDeEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nYkRhdGUgfSBmcm9tICcuL25nYi1kYXRlJztcbmltcG9ydCB7IERhdGVwaWNrZXJWaWV3TW9kZWwsIERheVZpZXdNb2RlbCwgTW9udGhWaWV3TW9kZWwgfSBmcm9tICcuL2RhdGVwaWNrZXItdmlldy1tb2RlbCc7XG5pbXBvcnQgeyBOZ2JDYWxlbmRhciB9IGZyb20gJy4vbmdiLWNhbGVuZGFyJztcbmltcG9ydCB7IE5nYkRhdGVwaWNrZXJJMThuIH0gZnJvbSAnLi9kYXRlcGlja2VyLWkxOG4nO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDaGFuZ2VkRGF0ZShwcmV2PzogTmdiRGF0ZSB8IG51bGwsIG5leHQ/OiBOZ2JEYXRlIHwgbnVsbCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gIWRhdGVDb21wYXJhdG9yKHByZXYsIG5leHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDaGFuZ2VkTW9udGgocHJldj86IE5nYkRhdGUgfCBudWxsLCBuZXh0PzogTmdiRGF0ZSB8IG51bGwpOiBib29sZWFuIHtcblx0cmV0dXJuICFwcmV2ICYmICFuZXh0ID8gZmFsc2UgOiAhcHJldiB8fCAhbmV4dCA/IHRydWUgOiBwcmV2LnllYXIgIT09IG5leHQueWVhciB8fCBwcmV2Lm1vbnRoICE9PSBuZXh0Lm1vbnRoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUNvbXBhcmF0b3IocHJldj86IE5nYkRhdGUgfCBudWxsLCBuZXh0PzogTmdiRGF0ZSB8IG51bGwpOiBib29sZWFuIHtcblx0cmV0dXJuICghcHJldiAmJiAhbmV4dCkgfHwgKCEhcHJldiAmJiAhIW5leHQgJiYgcHJldi5lcXVhbHMobmV4dCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tNaW5CZWZvcmVNYXgobWluRGF0ZT86IE5nYkRhdGUgfCBudWxsLCBtYXhEYXRlPzogTmdiRGF0ZSB8IG51bGwpOiB2b2lkIHtcblx0aWYgKG1heERhdGUgJiYgbWluRGF0ZSAmJiBtYXhEYXRlLmJlZm9yZShtaW5EYXRlKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJ21heERhdGUnICR7bWF4RGF0ZX0gc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAnbWluRGF0ZScgJHttaW5EYXRlfWApO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0RhdGVJblJhbmdlKFxuXHRkYXRlPzogTmdiRGF0ZSB8IG51bGwsXG5cdG1pbkRhdGU/OiBOZ2JEYXRlIHwgbnVsbCxcblx0bWF4RGF0ZT86IE5nYkRhdGUgfCBudWxsLFxuKTogTmdiRGF0ZSB8IG51bGwge1xuXHRpZiAoZGF0ZSAmJiBtaW5EYXRlICYmIGRhdGUuYmVmb3JlKG1pbkRhdGUpKSB7XG5cdFx0cmV0dXJuIG1pbkRhdGU7XG5cdH1cblx0aWYgKGRhdGUgJiYgbWF4RGF0ZSAmJiBkYXRlLmFmdGVyKG1heERhdGUpKSB7XG5cdFx0cmV0dXJuIG1heERhdGU7XG5cdH1cblxuXHRyZXR1cm4gZGF0ZSB8fCBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlU2VsZWN0YWJsZShkYXRlOiBOZ2JEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgc3RhdGU6IERhdGVwaWNrZXJWaWV3TW9kZWwpIHtcblx0Y29uc3QgeyBtaW5EYXRlLCBtYXhEYXRlLCBkaXNhYmxlZCwgbWFya0Rpc2FibGVkIH0gPSBzdGF0ZTtcblx0cmV0dXJuICEoXG5cdFx0ZGF0ZSA9PT0gbnVsbCB8fFxuXHRcdGRhdGUgPT09IHVuZGVmaW5lZCB8fFxuXHRcdGRpc2FibGVkIHx8XG5cdFx0KG1hcmtEaXNhYmxlZCAmJiBtYXJrRGlzYWJsZWQoZGF0ZSwgeyB5ZWFyOiBkYXRlLnllYXIsIG1vbnRoOiBkYXRlLm1vbnRoIH0pKSB8fFxuXHRcdChtaW5EYXRlICYmIGRhdGUuYmVmb3JlKG1pbkRhdGUpKSB8fFxuXHRcdChtYXhEYXRlICYmIGRhdGUuYWZ0ZXIobWF4RGF0ZSkpXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNlbGVjdEJveE1vbnRocyhcblx0Y2FsZW5kYXI6IE5nYkNhbGVuZGFyLFxuXHRkYXRlOiBOZ2JEYXRlLFxuXHRtaW5EYXRlOiBOZ2JEYXRlIHwgbnVsbCxcblx0bWF4RGF0ZTogTmdiRGF0ZSB8IG51bGwsXG4pIHtcblx0aWYgKCFkYXRlKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0bGV0IG1vbnRocyA9IGNhbGVuZGFyLmdldE1vbnRocyhkYXRlLnllYXIpO1xuXG5cdGlmIChtaW5EYXRlICYmIGRhdGUueWVhciA9PT0gbWluRGF0ZS55ZWFyKSB7XG5cdFx0Y29uc3QgaW5kZXggPSBtb250aHMuZmluZEluZGV4KChtb250aCkgPT4gbW9udGggPT09IG1pbkRhdGUubW9udGgpO1xuXHRcdG1vbnRocyA9IG1vbnRocy5zbGljZShpbmRleCk7XG5cdH1cblxuXHRpZiAobWF4RGF0ZSAmJiBkYXRlLnllYXIgPT09IG1heERhdGUueWVhcikge1xuXHRcdGNvbnN0IGluZGV4ID0gbW9udGhzLmZpbmRJbmRleCgobW9udGgpID0+IG1vbnRoID09PSBtYXhEYXRlLm1vbnRoKTtcblx0XHRtb250aHMgPSBtb250aHMuc2xpY2UoMCwgaW5kZXggKyAxKTtcblx0fVxuXG5cdHJldHVybiBtb250aHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNlbGVjdEJveFllYXJzKGRhdGU6IE5nYkRhdGUsIG1pbkRhdGU6IE5nYkRhdGUgfCBudWxsLCBtYXhEYXRlOiBOZ2JEYXRlIHwgbnVsbCkge1xuXHRpZiAoIWRhdGUpIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRjb25zdCBzdGFydCA9IG1pbkRhdGUgPyBNYXRoLm1heChtaW5EYXRlLnllYXIsIGRhdGUueWVhciAtIDUwMCkgOiBkYXRlLnllYXIgLSAxMDtcblx0Y29uc3QgZW5kID0gbWF4RGF0ZSA/IE1hdGgubWluKG1heERhdGUueWVhciwgZGF0ZS55ZWFyICsgNTAwKSA6IGRhdGUueWVhciArIDEwO1xuXG5cdGNvbnN0IGxlbmd0aCA9IGVuZCAtIHN0YXJ0ICsgMTtcblx0Y29uc3QgbnVtYmVycyA9IEFycmF5KGxlbmd0aCk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRudW1iZXJzW2ldID0gc3RhcnQgKyBpO1xuXHR9XG5cblx0cmV0dXJuIG51bWJlcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXh0TW9udGhEaXNhYmxlZChjYWxlbmRhcjogTmdiQ2FsZW5kYXIsIGRhdGU6IE5nYkRhdGUsIG1heERhdGU6IE5nYkRhdGUgfCBudWxsKSB7XG5cdGNvbnN0IG5leHREYXRlID0gT2JqZWN0LmFzc2lnbihjYWxlbmRhci5nZXROZXh0KGRhdGUsICdtJyksIHsgZGF5OiAxIH0pO1xuXHRyZXR1cm4gbWF4RGF0ZSAhPSBudWxsICYmIG5leHREYXRlLmFmdGVyKG1heERhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJldk1vbnRoRGlzYWJsZWQoY2FsZW5kYXI6IE5nYkNhbGVuZGFyLCBkYXRlOiBOZ2JEYXRlLCBtaW5EYXRlOiBOZ2JEYXRlIHwgbnVsbCkge1xuXHRjb25zdCBwcmV2RGF0ZSA9IE9iamVjdC5hc3NpZ24oY2FsZW5kYXIuZ2V0UHJldihkYXRlLCAnbScpLCB7IGRheTogMSB9KTtcblx0cmV0dXJuIChcblx0XHRtaW5EYXRlICE9IG51bGwgJiZcblx0XHQoKHByZXZEYXRlLnllYXIgPT09IG1pbkRhdGUueWVhciAmJiBwcmV2RGF0ZS5tb250aCA8IG1pbkRhdGUubW9udGgpIHx8XG5cdFx0XHQocHJldkRhdGUueWVhciA8IG1pbkRhdGUueWVhciAmJiBtaW5EYXRlLm1vbnRoID09PSAxKSlcblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTW9udGhzKFxuXHRjYWxlbmRhcjogTmdiQ2FsZW5kYXIsXG5cdGRhdGU6IE5nYkRhdGUsXG5cdHN0YXRlOiBEYXRlcGlja2VyVmlld01vZGVsLFxuXHRpMThuOiBOZ2JEYXRlcGlja2VySTE4bixcblx0Zm9yY2U6IGJvb2xlYW4sXG4pOiBNb250aFZpZXdNb2RlbFtdIHtcblx0Y29uc3QgeyBkaXNwbGF5TW9udGhzLCBtb250aHMgfSA9IHN0YXRlO1xuXHQvLyBtb3ZlIG9sZCBtb250aHMgdG8gYSB0ZW1wb3JhcnkgYXJyYXlcblx0Y29uc3QgbW9udGhzVG9SZXVzZSA9IG1vbnRocy5zcGxpY2UoMCwgbW9udGhzLmxlbmd0aCk7XG5cblx0Ly8gZ2VuZXJhdGUgbmV3IGZpcnN0IGRhdGVzLCBudWxsaWZ5IG9yIHJldXNlIG1vbnRoc1xuXHRjb25zdCBmaXJzdERhdGVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogZGlzcGxheU1vbnRocyB9LCAoXywgaSkgPT4ge1xuXHRcdGNvbnN0IGZpcnN0RGF0ZSA9IE9iamVjdC5hc3NpZ24oY2FsZW5kYXIuZ2V0TmV4dChkYXRlLCAnbScsIGkpLCB7IGRheTogMSB9KTtcblx0XHRtb250aHNbaV0gPSA8YW55Pm51bGw7XG5cblx0XHRpZiAoIWZvcmNlKSB7XG5cdFx0XHRjb25zdCByZXVzZWRJbmRleCA9IG1vbnRoc1RvUmV1c2UuZmluZEluZGV4KChtb250aCkgPT4gbW9udGguZmlyc3REYXRlLmVxdWFscyhmaXJzdERhdGUpKTtcblx0XHRcdC8vIG1vdmUgcmV1c2VkIG1vbnRoIGJhY2sgdG8gbW9udGhzXG5cdFx0XHRpZiAocmV1c2VkSW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdG1vbnRoc1tpXSA9IG1vbnRoc1RvUmV1c2Uuc3BsaWNlKHJldXNlZEluZGV4LCAxKVswXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmlyc3REYXRlO1xuXHR9KTtcblxuXHQvLyByZWJ1aWxkIG51bGxpZmllZCBtb250aHNcblx0Zmlyc3REYXRlcy5mb3JFYWNoKChmaXJzdERhdGUsIGkpID0+IHtcblx0XHRpZiAobW9udGhzW2ldID09PSBudWxsKSB7XG5cdFx0XHRtb250aHNbaV0gPSBidWlsZE1vbnRoKGNhbGVuZGFyLCBmaXJzdERhdGUsIHN0YXRlLCBpMThuLCBtb250aHNUb1JldXNlLnNoaWZ0KCkgfHwgKHt9IGFzIE1vbnRoVmlld01vZGVsKSk7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gbW9udGhzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNb250aChcblx0Y2FsZW5kYXI6IE5nYkNhbGVuZGFyLFxuXHRkYXRlOiBOZ2JEYXRlLFxuXHRzdGF0ZTogRGF0ZXBpY2tlclZpZXdNb2RlbCxcblx0aTE4bjogTmdiRGF0ZXBpY2tlckkxOG4sXG5cdG1vbnRoOiBNb250aFZpZXdNb2RlbCA9IHt9IGFzIE1vbnRoVmlld01vZGVsLFxuKTogTW9udGhWaWV3TW9kZWwge1xuXHRjb25zdCB7XG5cdFx0ZGF5VGVtcGxhdGVEYXRhLFxuXHRcdG1pbkRhdGUsXG5cdFx0bWF4RGF0ZSxcblx0XHRmaXJzdERheU9mV2Vlayxcblx0XHRtYXJrRGlzYWJsZWQsXG5cdFx0b3V0c2lkZURheXMsXG5cdFx0d2Vla2RheVdpZHRoLFxuXHRcdHdlZWtkYXlzVmlzaWJsZSxcblx0fSA9IHN0YXRlO1xuXHRjb25zdCBjYWxlbmRhclRvZGF5ID0gY2FsZW5kYXIuZ2V0VG9kYXkoKTtcblxuXHRtb250aC5maXJzdERhdGUgPSA8YW55Pm51bGw7XG5cdG1vbnRoLmxhc3REYXRlID0gPGFueT5udWxsO1xuXHRtb250aC5udW1iZXIgPSBkYXRlLm1vbnRoO1xuXHRtb250aC55ZWFyID0gZGF0ZS55ZWFyO1xuXHRtb250aC53ZWVrcyA9IG1vbnRoLndlZWtzIHx8IFtdO1xuXHRtb250aC53ZWVrZGF5cyA9IG1vbnRoLndlZWtkYXlzIHx8IFtdO1xuXG5cdGRhdGUgPSBnZXRGaXJzdFZpZXdEYXRlKGNhbGVuZGFyLCBkYXRlLCBmaXJzdERheU9mV2Vlayk7XG5cblx0Ly8gY2xlYXJpbmcgd2Vla2RheXMsIGlmIG5vdCB2aXNpYmxlXG5cdGlmICghd2Vla2RheXNWaXNpYmxlKSB7XG5cdFx0bW9udGgud2Vla2RheXMubGVuZ3RoID0gMDtcblx0fVxuXG5cdC8vIG1vbnRoIGhhcyB3ZWVrc1xuXHRmb3IgKGxldCB3ZWVrID0gMDsgd2VlayA8IGNhbGVuZGFyLmdldFdlZWtzUGVyTW9udGgoKTsgd2VlaysrKSB7XG5cdFx0bGV0IHdlZWtPYmplY3QgPSBtb250aC53ZWVrc1t3ZWVrXTtcblx0XHRpZiAoIXdlZWtPYmplY3QpIHtcblx0XHRcdHdlZWtPYmplY3QgPSBtb250aC53ZWVrc1t3ZWVrXSA9IHsgbnVtYmVyOiAwLCBkYXlzOiBbXSwgY29sbGFwc2VkOiB0cnVlIH07XG5cdFx0fVxuXHRcdGNvbnN0IGRheXMgPSB3ZWVrT2JqZWN0LmRheXM7XG5cblx0XHQvLyB3ZWVrIGhhcyBkYXlzXG5cdFx0Zm9yIChsZXQgZGF5ID0gMDsgZGF5IDwgY2FsZW5kYXIuZ2V0RGF5c1BlcldlZWsoKTsgZGF5KyspIHtcblx0XHRcdGlmICh3ZWVrID09PSAwICYmIHdlZWtkYXlzVmlzaWJsZSkge1xuXHRcdFx0XHRtb250aC53ZWVrZGF5c1tkYXldID0gaTE4bi5nZXRXZWVrZGF5TGFiZWwoY2FsZW5kYXIuZ2V0V2Vla2RheShkYXRlKSwgd2Vla2RheVdpZHRoKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbmV3RGF0ZSA9IG5ldyBOZ2JEYXRlKGRhdGUueWVhciwgZGF0ZS5tb250aCwgZGF0ZS5kYXkpO1xuXHRcdFx0Y29uc3QgbmV4dERhdGUgPSBjYWxlbmRhci5nZXROZXh0KG5ld0RhdGUpO1xuXG5cdFx0XHRjb25zdCBhcmlhTGFiZWwgPSBpMThuLmdldERheUFyaWFMYWJlbChuZXdEYXRlKTtcblxuXHRcdFx0Ly8gbWFya2luZyBkYXRlIGFzIGRpc2FibGVkXG5cdFx0XHRsZXQgZGlzYWJsZWQgPSAhISgobWluRGF0ZSAmJiBuZXdEYXRlLmJlZm9yZShtaW5EYXRlKSkgfHwgKG1heERhdGUgJiYgbmV3RGF0ZS5hZnRlcihtYXhEYXRlKSkpO1xuXHRcdFx0aWYgKCFkaXNhYmxlZCAmJiBtYXJrRGlzYWJsZWQpIHtcblx0XHRcdFx0ZGlzYWJsZWQgPSBtYXJrRGlzYWJsZWQobmV3RGF0ZSwgeyBtb250aDogbW9udGgubnVtYmVyLCB5ZWFyOiBtb250aC55ZWFyIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyB0b2RheVxuXHRcdFx0bGV0IHRvZGF5ID0gbmV3RGF0ZS5lcXVhbHMoY2FsZW5kYXJUb2RheSk7XG5cblx0XHRcdC8vIGFkZGluZyB1c2VyLXByb3ZpZGVkIGRhdGEgdG8gdGhlIGNvbnRleHRcblx0XHRcdGxldCBjb250ZXh0VXNlckRhdGEgPSBkYXlUZW1wbGF0ZURhdGFcblx0XHRcdFx0PyBkYXlUZW1wbGF0ZURhdGEobmV3RGF0ZSwgeyBtb250aDogbW9udGgubnVtYmVyLCB5ZWFyOiBtb250aC55ZWFyIH0pXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBzYXZpbmcgZmlyc3QgZGF0ZSBvZiB0aGUgbW9udGhcblx0XHRcdGlmIChtb250aC5maXJzdERhdGUgPT09IG51bGwgJiYgbmV3RGF0ZS5tb250aCA9PT0gbW9udGgubnVtYmVyKSB7XG5cdFx0XHRcdG1vbnRoLmZpcnN0RGF0ZSA9IG5ld0RhdGU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHNhdmluZyBsYXN0IGRhdGUgb2YgdGhlIG1vbnRoXG5cdFx0XHRpZiAobmV3RGF0ZS5tb250aCA9PT0gbW9udGgubnVtYmVyICYmIG5leHREYXRlLm1vbnRoICE9PSBtb250aC5udW1iZXIpIHtcblx0XHRcdFx0bW9udGgubGFzdERhdGUgPSBuZXdEYXRlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgZGF5T2JqZWN0ID0gZGF5c1tkYXldO1xuXHRcdFx0aWYgKCFkYXlPYmplY3QpIHtcblx0XHRcdFx0ZGF5T2JqZWN0ID0gZGF5c1tkYXldID0ge30gYXMgRGF5Vmlld01vZGVsO1xuXHRcdFx0fVxuXHRcdFx0ZGF5T2JqZWN0LmRhdGUgPSBuZXdEYXRlO1xuXHRcdFx0ZGF5T2JqZWN0LmNvbnRleHQgPSBPYmplY3QuYXNzaWduKGRheU9iamVjdC5jb250ZXh0IHx8IHt9LCB7XG5cdFx0XHRcdCRpbXBsaWNpdDogbmV3RGF0ZSxcblx0XHRcdFx0ZGF0ZTogbmV3RGF0ZSxcblx0XHRcdFx0ZGF0YTogY29udGV4dFVzZXJEYXRhLFxuXHRcdFx0XHRjdXJyZW50TW9udGg6IG1vbnRoLm51bWJlcixcblx0XHRcdFx0Y3VycmVudFllYXI6IG1vbnRoLnllYXIsXG5cdFx0XHRcdGRpc2FibGVkLFxuXHRcdFx0XHRmb2N1c2VkOiBmYWxzZSxcblx0XHRcdFx0c2VsZWN0ZWQ6IGZhbHNlLFxuXHRcdFx0XHR0b2RheSxcblx0XHRcdH0pO1xuXHRcdFx0ZGF5T2JqZWN0LnRhYmluZGV4ID0gLTE7XG5cdFx0XHRkYXlPYmplY3QuYXJpYUxhYmVsID0gYXJpYUxhYmVsO1xuXHRcdFx0ZGF5T2JqZWN0LmhpZGRlbiA9IGZhbHNlO1xuXG5cdFx0XHRkYXRlID0gbmV4dERhdGU7XG5cdFx0fVxuXG5cdFx0d2Vla09iamVjdC5udW1iZXIgPSBjYWxlbmRhci5nZXRXZWVrTnVtYmVyKFxuXHRcdFx0ZGF5cy5tYXAoKGRheSkgPT4gZGF5LmRhdGUpLFxuXHRcdFx0Zmlyc3REYXlPZldlZWssXG5cdFx0KTtcblxuXHRcdC8vIG1hcmtpbmcgd2VlayBhcyBjb2xsYXBzZWRcblx0XHR3ZWVrT2JqZWN0LmNvbGxhcHNlZCA9XG5cdFx0XHRvdXRzaWRlRGF5cyA9PT0gJ2NvbGxhcHNlZCcgJiZcblx0XHRcdGRheXNbMF0uZGF0ZS5tb250aCAhPT0gbW9udGgubnVtYmVyICYmXG5cdFx0XHRkYXlzW2RheXMubGVuZ3RoIC0gMV0uZGF0ZS5tb250aCAhPT0gbW9udGgubnVtYmVyO1xuXHR9XG5cblx0cmV0dXJuIG1vbnRoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RWaWV3RGF0ZShjYWxlbmRhcjogTmdiQ2FsZW5kYXIsIGRhdGU6IE5nYkRhdGUsIGZpcnN0RGF5T2ZXZWVrOiBudW1iZXIpOiBOZ2JEYXRlIHtcblx0Y29uc3QgZGF5c1BlcldlZWsgPSBjYWxlbmRhci5nZXREYXlzUGVyV2VlaygpO1xuXHRjb25zdCBmaXJzdE1vbnRoRGF0ZSA9IG5ldyBOZ2JEYXRlKGRhdGUueWVhciwgZGF0ZS5tb250aCwgMSk7XG5cdGNvbnN0IGRheU9mV2VlayA9IGNhbGVuZGFyLmdldFdlZWtkYXkoZmlyc3RNb250aERhdGUpICUgZGF5c1BlcldlZWs7XG5cdHJldHVybiBjYWxlbmRhci5nZXRQcmV2KGZpcnN0TW9udGhEYXRlLCAnZCcsIChkYXlzUGVyV2VlayArIGRheU9mV2VlayAtIGZpcnN0RGF5T2ZXZWVrKSAlIGRheXNQZXJXZWVrKTtcbn1cbiJdfQ==