@qeydar/datepicker
Version:
A comprehensive Date and Time Picker for Angular with Jalali calendar support
210 lines • 31.6 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class ValidationStrategyService {
/**
* Check if a date is disabled based on various criteria
*/
isDateDisabled(date, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat) {
// Check min/max date constraints
if ((minDate && dateAdapter.isBefore(date, minDate)) ||
(maxDate && dateAdapter.isAfter(date, maxDate))) {
return true;
}
// Check if date is in disabled dates array
const parsedDisabledDates = this.parseDisabledDates(disabledDates || [], dateAdapter, dateFormat);
const isDisabledDate = parsedDisabledDates.some((disabledDate) => dateAdapter.isSameDay(date, disabledDate));
// Check custom filter function if provided
const isFilterDisabled = disabledDatesFilter
? disabledDatesFilter(date)
: false;
return isDisabledDate || isFilterDisabled;
}
/**
* Check if a month is disabled (all days in month are disabled)
*/
isMonthDisabled(month, year, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat) {
const startOfMonth = dateAdapter.createDate(year, month - 1, 1);
// Check if all days in month are disabled
const daysInMonth = dateAdapter.getDaysInMonth(startOfMonth);
let allDaysDisabled = true;
for (let day = 1; day <= daysInMonth; day++) {
const date = dateAdapter.createDate(year, month - 1, day);
if (!this.isDateDisabled(date, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat)) {
allDaysDisabled = false;
break;
}
}
return allDaysDisabled;
}
/**
* Check if a year is disabled (all months in year are disabled)
*/
isYearDisabled(year, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat) {
// Check year boundaries
if (minDate && dateAdapter.getYear(minDate) > year)
return true;
if (maxDate && dateAdapter.getYear(maxDate) < year)
return true;
// Check if all months in year are disabled
const firstOfMonth = dateAdapter.createDate(year, 0, 1);
let day = 1;
for (let date = firstOfMonth; date.getFullYear() == firstOfMonth.getFullYear(); date = dateAdapter.addDays(firstOfMonth, day++)) {
if (!this.isDateDisabled(date, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat)) {
return false;
}
}
return true;
}
/**
* Check if a year range is disabled
*/
isYearRangeDisabled(yearRange, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat) {
if (minDate && dateAdapter.getYear(minDate) > yearRange.end)
return true;
if (maxDate && dateAdapter.getYear(maxDate) < yearRange.start)
return true;
// Check if all years in range are disabled
for (let year = yearRange.start; year <= yearRange.end; year++) {
if (!this.isYearDisabled(year, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat)) {
return false;
}
}
return true;
}
/**
* Check if previous navigation is disabled
*/
isPrevNavigationDisabled(currentDate, viewMode, dateAdapter, minDate, yearList) {
if (!minDate)
return false;
const minYear = dateAdapter.getYear(minDate);
const minMonth = dateAdapter.getMonth(minDate);
const currentYear = dateAdapter.getYear(currentDate);
const currentMonth = dateAdapter.getMonth(currentDate);
switch (viewMode) {
case 'days':
const prevMonthUnnorm = currentMonth - 1;
const prevMonthYear = currentYear + Math.floor(prevMonthUnnorm / 12);
// نرمالسازی برای مقادیر منفی
const prevMonthIndex = (prevMonthUnnorm + 12) % 12;
if (minYear > prevMonthYear)
return true;
if (minYear === prevMonthYear && minMonth > prevMonthIndex)
return true;
return false;
case 'months':
const prevYear = currentYear - 1;
return minYear > prevYear;
case 'years':
if (!yearList || yearList.length === 0)
return false;
const minDisplayedYear = Math.min(...yearList);
const prevLastYear = minDisplayedYear - 1;
return minYear > prevLastYear;
default:
return false;
}
}
/**
* Check if next navigation is disabled
*/
isNextNavigationDisabled(currentDate, viewMode, dateAdapter, maxDate, yearList) {
if (!maxDate)
return false;
const maxYear = dateAdapter.getYear(maxDate);
const maxMonth = dateAdapter.getMonth(maxDate);
const currentYear = dateAdapter.getYear(currentDate);
const currentMonth = dateAdapter.getMonth(currentDate);
switch (viewMode) {
case 'days':
const nextMonthUnnorm = currentMonth + 1;
const nextMonthYear = currentYear + Math.floor(nextMonthUnnorm / 12);
const nextMonthIndex = nextMonthUnnorm % 12;
// اگر maxDate قبل از شروع ماه بعدی باشد، navigation غیرفعال است
if (maxYear < nextMonthYear)
return true;
if (maxYear === nextMonthYear && maxMonth < nextMonthIndex)
return true;
return false;
case 'months':
const nextYear = currentYear + 1;
return maxYear < nextYear;
case 'years':
if (!yearList || yearList.length === 0)
return false;
const maxDisplayedYear = Math.max(...yearList);
const nextFirstYear = maxDisplayedYear + 1;
return maxYear < nextFirstYear;
default:
return false;
}
}
/**
* Parse disabled dates from various formats
*/
parseDisabledDates(disabledDates, dateAdapter, dateFormat) {
return disabledDates
.map((date) => {
if (date instanceof Date) {
return dateAdapter.startOfDay(date);
}
const parsedDate = dateAdapter.parse(date, dateFormat);
return parsedDate || null;
})
.filter((date) => date !== null);
}
/**
* Adjust current date to valid range
*/
adjustDateToValidRange(currentDate, dateAdapter, minDate, maxDate) {
let adjustedDate = currentDate;
if (minDate && dateAdapter.isBefore(adjustedDate, minDate)) {
adjustedDate = minDate;
}
else if (maxDate && dateAdapter.isAfter(adjustedDate, maxDate)) {
adjustedDate = maxDate;
}
return adjustedDate;
}
/**
* Check if date is within valid range
*/
isDateInValidRange(date, dateAdapter, minDate, maxDate) {
if (minDate && dateAdapter.isBefore(date, minDate))
return false;
if (maxDate && dateAdapter.isAfter(date, maxDate))
return false;
return true;
}
/**
* Validate date range
*/
validateDateRange(startDate, endDate, dateAdapter, minDate, maxDate) {
const errors = [];
// Check if start date is valid
if (!this.isDateInValidRange(startDate, dateAdapter, minDate, maxDate)) {
errors.push('Start date is outside valid range');
}
// Check if end date is valid
if (!this.isDateInValidRange(endDate, dateAdapter, minDate, maxDate)) {
errors.push('End date is outside valid range');
}
// Check if start date is before end date
if (dateAdapter.isAfter(startDate, endDate)) {
errors.push('Start date must be before end date');
}
return {
isValid: errors.length === 0,
errors,
};
}
}
ValidationStrategyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ValidationStrategyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
ValidationStrategyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ValidationStrategyService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ValidationStrategyService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1zdHJhdGVneS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcWV5ZGFyLWRhdGVwaWNrZXIvc3JjL2RhdGUtcGlja2VyLXBvcHVwL3NlcnZpY2VzL3ZhbGlkYXRpb24tc3RyYXRlZ3kuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU8zQyxNQUFNLE9BQU8seUJBQXlCO0lBQ3BDOztPQUVHO0lBQ0gsY0FBYyxDQUNaLElBQVUsRUFDVixXQUE4QixFQUM5QixPQUFxQixFQUNyQixPQUFxQixFQUNyQixhQUFvQyxFQUNwQyxtQkFBNkMsRUFDN0MsVUFBbUI7UUFFbkIsaUNBQWlDO1FBQ2pDLElBQ0UsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEQsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFDL0M7WUFDQSxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsMkNBQTJDO1FBQzNDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUNqRCxhQUFhLElBQUksRUFBRSxFQUNuQixXQUFXLEVBQ1gsVUFBVSxDQUNYLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUMvRCxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FDMUMsQ0FBQztRQUVGLDJDQUEyQztRQUMzQyxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQjtZQUMxQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFVixPQUFPLGNB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T0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3BFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNoRDtRQUVELHlDQUF5QztRQUN6QyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUNuRDtRQUVELE9BQU87WUFDTCxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzVCLE1BQU07U0FDUCxDQUFDO0lBQ0osQ0FBQzs7c0hBclVVLHlCQUF5QjswSEFBekIseUJBQXlCLGNBRnhCLE1BQU07MkZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kYXRlLWFkYXB0ZXInO1xyXG5pbXBvcnQgeyBZZWFyUmFuZ2UgfSBmcm9tICcuLi8uLi91dGlscy9tb2RlbHMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25TdHJhdGVneVNlcnZpY2Uge1xyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgZGF0ZSBpcyBkaXNhYmxlZCBiYXNlZCBvbiB2YXJpb3VzIGNyaXRlcmlhXHJcbiAgICovXHJcbiAgaXNEYXRlRGlzYWJsZWQoXHJcbiAgICBkYXRlOiBEYXRlLFxyXG4gICAgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+LFxyXG4gICAgbWluRGF0ZT86IERhdGUgfCBudWxsLFxyXG4gICAgbWF4RGF0ZT86IERhdGUgfCBudWxsLFxyXG4gICAgZGlzYWJsZWREYXRlcz86IEFycmF5PERhdGUgfCBzdHJpbmc+LFxyXG4gICAgZGlzYWJsZWREYXRlc0ZpbHRlcj86IChkYXRlOiBEYXRlKSA9PiBib29sZWFuLFxyXG4gICAgZGF0ZUZvcm1hdD86IHN0cmluZ1xyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgLy8gQ2hlY2sgbWluL21heCBkYXRlIGNvbnN0cmFpbnRzXHJcbiAgICBpZiAoXHJcbiAgICAgIChtaW5EYXRlICYmIGRhdGVBZGFwdGVyLmlzQmVmb3JlKGRhdGUsIG1pbkRhdGUpKSB8fFxyXG4gICAgICAobWF4RGF0ZSAmJiBkYXRlQWRhcHRlci5pc0FmdGVyKGRhdGUsIG1heERhdGUpKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIGRhdGUgaXMgaW4gZGlzYWJsZWQgZGF0ZXMgYXJyYXlcclxuICAgIGNvbnN0IHBhcnNlZERpc2FibGVkRGF0ZXMgPSB0aGlzLnBhcnNlRGlzYWJsZWREYXRlcyhcclxuICAgICAgZGlzYWJsZWREYXRlcyB8fCBbXSxcclxuICAgICAgZGF0ZUFkYXB0ZXIsXHJcbiAgICAgIGRhdGVGb3JtYXRcclxuICAgICk7XHJcbiAgICBjb25zdCBpc0Rpc2FibGVkRGF0ZSA9IHBhcnNlZERpc2FibGVkRGF0ZXMuc29tZSgoZGlzYWJsZWREYXRlKSA9PlxyXG4gICAgICBkYXRlQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgZGlzYWJsZWREYXRlKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBDaGVjayBjdXN0b20gZmlsdGVyIGZ1bmN0aW9uIGlmIHByb3ZpZGVkXHJcbiAgICBjb25zdCBpc0ZpbHRlckRpc2FibGVkID0gZGlzYWJsZWREYXRlc0ZpbHRlclxyXG4gICAgICA/IGRpc2FibGVkRGF0ZXNGaWx0ZXIoZGF0ZSlcclxuICAgICAgOiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gaXNEaXNhYmxlZERhdGUgfHwgaXNGaWx0ZXJEaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgbW9udGggaXMgZGlzYWJsZWQgKGFsbCBkYXlzIGluIG1vbnRoIGFyZSBkaXNhYmxlZClcclxuICAgKi9cclxuICBpc01vbnRoRGlzYWJsZWQoXHJcbiAgICBtb250aDogbnVtYmVyLFxyXG4gICAgeWVhcjogbnVtYmVyLFxyXG4gICAgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+LFxyXG4gICAgbWluRGF0ZT86IERhdGUgfCBudWxsLFxyXG4gICAgbWF4RGF0ZT86IERhdGUgfCBudWxsLFxyXG4gICAgZGlzYWJsZWREYXRlcz86IEFycmF5PERhdGUgfCBzdHJpbmc+LFxyXG4gICAgZGlzYWJsZWREYXRlc0ZpbHRlcj86IChkYXRlOiBEYXRlKSA9PiBib29sZWFuLFxyXG4gICAgZGF0ZUZvcm1hdD86IHN0cmluZ1xyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc3RhcnRPZk1vbnRoID0gZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCAtIDEsIDEpO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIGFsbCBkYXlzIGluIG1vbnRoIGFyZSBkaXNhYmxlZFxyXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBkYXRlQWRhcHRlci5nZXREYXlzSW5Nb250aChzdGFydE9mTW9udGgpO1xyXG4gICAgbGV0IGFsbERheXNEaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IGRheXNJbk1vbnRoOyBkYXkrKykge1xyXG4gICAgICBjb25zdCBkYXRlID0gZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAhdGhpcy5pc0RhdGVEaXNhYmxlZChcclxuICAgICAgICAgIGRhdGUsXHJcbiAgICAgICAgICBkYXRlQWRhcHRlcixcclxuICAgICAgICAgIG1pbkRhdGUsXHJcbiAgICAgICAgICBtYXhEYXRlLFxyXG4gICAgICAgICAgZGlzYWJsZWREYXRlcyxcclxuICAgICAgICAgIGRpc2FibGVkRGF0ZXNGaWx0ZXIsXHJcbiAgICAgICAgICBkYXRlRm9ybWF0XHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICBhbGxEYXlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhbGxEYXlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhIHllYXIgaXMgZGlzYWJsZWQgKGFsbCBtb250aHMgaW4geWVhciBhcmUgZGlzYWJsZWQpXHJcbiAgICovXHJcbiAgaXNZZWFyRGlzYWJsZWQoXHJcbiAgICB5ZWFyOiBudW1iZXIsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sXHJcbiAgICBtaW5EYXRlPzogRGF0ZSB8IG51bGwsXHJcbiAgICBtYXhEYXRlPzogRGF0ZSB8IG51bGwsXHJcbiAgICBkaXNhYmxlZERhdGVzPzogQXJyYXk8RGF0ZSB8IHN0cmluZz4sXHJcbiAgICBkaXNhYmxlZERhdGVzRmlsdGVyPzogKGRhdGU6IERhdGUpID0+IGJvb2xlYW4sXHJcbiAgICBkYXRlRm9ybWF0Pzogc3RyaW5nXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICAvLyBDaGVjayB5ZWFyIGJvdW5kYXJpZXNcclxuICAgIGlmIChtaW5EYXRlICYmIGRhdGVBZGFwdGVyLmdldFllYXIobWluRGF0ZSkgPiB5ZWFyKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmIChtYXhEYXRlICYmIGRhdGVBZGFwdGVyLmdldFllYXIobWF4RGF0ZSkgPCB5ZWFyKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBhbGwgbW9udGhzIGluIHllYXIgYXJlIGRpc2FibGVkXHJcbiAgICBjb25zdCBmaXJzdE9mTW9udGggPSBkYXRlQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIDAsIDEpO1xyXG4gICAgbGV0IGRheSA9IDE7XHJcblxyXG4gICAgZm9yIChcclxuICAgICAgbGV0IGRhdGUgPSBmaXJzdE9mTW9udGg7XHJcbiAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSA9PSBmaXJzdE9mTW9udGguZ2V0RnVsbFllYXIoKTtcclxuICAgICAgZGF0ZSA9IGRhdGVBZGFwdGVyLmFkZERheXMoZmlyc3RPZk1vbnRoLCBkYXkrKylcclxuICAgICkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIXRoaXMuaXNEYXRlRGlzYWJsZWQoXHJcbiAgICAgICAgICBkYXRlLFxyXG4gICAgICAgICAgZGF0ZUFkYXB0ZXIsXHJcbiAgICAgICAgICBtaW5EYXRlLFxyXG4gICAgICAgICAgbWF4RGF0ZSxcclxuICAgICAgICAgIGRpc2FibGVkRGF0ZXMsXHJcbiAgICAgICAgICBkaXNhYmxlZERhdGVzRmlsdGVyLFxyXG4gICAgICAgICAgZGF0ZUZvcm1hdFxyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhIHllYXIgcmFuZ2UgaXMgZGlzYWJsZWRcclxuICAgKi9cclxuICBpc1llYXJSYW5nZURpc2FibGVkKFxyXG4gICAgeWVhclJhbmdlOiBZZWFyUmFuZ2UsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sXHJcbiAgICBtaW5EYXRlPzogRGF0ZSB8IG51bGwsXHJcbiAgICBtYXhEYXRlPzogRGF0ZSB8IG51bGwsXHJcbiAgICBkaXNhYmxlZERhdGVzPzogQXJyYXk8RGF0ZSB8IHN0cmluZz4sXHJcbiAgICBkaXNhYmxlZERhdGVzRmlsdGVyPzogKGRhdGU6IERhdGUpID0+IGJvb2xlYW4sXHJcbiAgICBkYXRlRm9ybWF0Pzogc3RyaW5nXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBpZiAobWluRGF0ZSAmJiBkYXRlQWRhcHRlci5nZXRZZWFyKG1pbkRhdGUpID4geWVhclJhbmdlLmVuZCkgcmV0dXJuIHRydWU7XHJcbiAgICBpZiAobWF4RGF0ZSAmJiBkYXRlQWRhcHRlci5nZXRZZWFyKG1heERhdGUpIDwgeWVhclJhbmdlLnN0YXJ0KSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBhbGwgeWVhcnMgaW4gcmFuZ2UgYXJlIGRpc2FibGVkXHJcbiAgICBmb3IgKGxldCB5ZWFyID0geWVhclJhbmdlLnN0YXJ0OyB5ZWFyIDw9IHllYXJSYW5nZS5lbmQ7IHllYXIrKykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIXRoaXMuaXNZZWFyRGlzYWJsZWQoXHJcbiAgICAgICAgICB5ZWFyLFxyXG4gICAgICAgICAgZGF0ZUFkYXB0ZXIsXHJcbiAgICAgICAgICBtaW5EYXRlLFxyXG4gICAgICAgICAgbWF4RGF0ZSxcclxuICAgICAgICAgIGRpc2FibGVkRGF0ZXMsXHJcbiAgICAgICAgICBkaXNhYmxlZERhdGVzRmlsdGVyLFxyXG4gICAgICAgICAgZGF0ZUZvcm1hdFxyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBwcmV2aW91cyBuYXZpZ2F0aW9uIGlzIGRpc2FibGVkXHJcbiAgICovXHJcbiAgaXNQcmV2TmF2aWdhdGlvbkRpc2FibGVkKFxyXG4gICAgY3VycmVudERhdGU6IERhdGUsXHJcbiAgICB2aWV3TW9kZTogJ2RheXMnIHwgJ21vbnRocycgfCAneWVhcnMnLFxyXG4gICAgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+LFxyXG4gICAgbWluRGF0ZT86IERhdGUgfCBudWxsLFxyXG4gICAgeWVhckxpc3Q/OiBudW1iZXJbXVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFtaW5EYXRlKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgbWluWWVhciA9IGRhdGVBZGFwdGVyLmdldFllYXIobWluRGF0ZSk7XHJcbiAgICBjb25zdCBtaW5Nb250aCA9IGRhdGVBZGFwdGVyLmdldE1vbnRoKG1pbkRhdGUpO1xyXG4gICAgY29uc3QgY3VycmVudFllYXIgPSBkYXRlQWRhcHRlci5nZXRZZWFyKGN1cnJlbnREYXRlKTtcclxuICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IGRhdGVBZGFwdGVyLmdldE1vbnRoKGN1cnJlbnREYXRlKTtcclxuXHJcbiAgICBzd2l0Y2ggKHZpZXdNb2RlKSB7XHJcbiAgICAgIGNhc2UgJ2RheXMnOlxyXG4gICAgICAgIGNvbnN0IHByZXZNb250aFVubm9ybSA9IGN1cnJlbnRNb250aCAtIDE7XHJcbiAgICAgICAgY29uc3QgcHJldk1vbnRoWWVhciA9IGN1cnJlbnRZZWFyICsgTWF0aC5mbG9vcihwcmV2TW9udGhVbm5vcm0gLyAxMik7XHJcbiAgICAgICAgLy8g2YbYsdmF2KfZhOKAjNiz2KfYstuMINio2LHYp9uMINmF2YLYp9iv24zYsSDZhdmG2YHbjFxyXG4gICAgICAgIGNvbnN0IHByZXZNb250aEluZGV4ID0gKHByZXZNb250aFVubm9ybSArIDEyKSAlIDEyO1xyXG5cclxuICAgICAgICBpZiAobWluWWVhciA+IHByZXZNb250aFllYXIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChtaW5ZZWFyID09PSBwcmV2TW9udGhZZWFyICYmIG1pbk1vbnRoID4gcHJldk1vbnRoSW5kZXgpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGNhc2UgJ21vbnRocyc6XHJcbiAgICAgICAgY29uc3QgcHJldlllYXIgPSBjdXJyZW50WWVhciAtIDE7XHJcbiAgICAgICAgcmV0dXJuIG1pblllYXIgPiBwcmV2WWVhcjtcclxuXHJcbiAgICAgIGNhc2UgJ3llYXJzJzpcclxuICAgICAgICBpZiAoIXllYXJMaXN0IHx8IHllYXJMaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IG1pbkRpc3BsYXllZFllYXIgPSBNYXRoLm1pbiguLi55ZWFyTGlzdCk7XHJcbiAgICAgICAgY29uc3QgcHJldkxhc3RZZWFyID0gbWluRGlzcGxheWVkWWVhciAtIDE7XHJcbiAgICAgICAgcmV0dXJuIG1pblllYXIgPiBwcmV2TGFzdFllYXI7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIG5leHQgbmF2aWdhdGlvbiBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIGlzTmV4dE5hdmlnYXRpb25EaXNhYmxlZChcclxuICAgIGN1cnJlbnREYXRlOiBEYXRlLFxyXG4gICAgdmlld01vZGU6ICdkYXlzJyB8ICdtb250aHMnIHwgJ3llYXJzJyxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPixcclxuICAgIG1heERhdGU/OiBEYXRlIHwgbnVsbCxcclxuICAgIHllYXJMaXN0PzogbnVtYmVyW11cclxuICApOiBib29sZWFuIHtcclxuICAgIGlmICghbWF4RGF0ZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IG1heFllYXIgPSBkYXRlQWRhcHRlci5nZXRZZWFyKG1heERhdGUpO1xyXG4gICAgY29uc3QgbWF4TW9udGggPSBkYXRlQWRhcHRlci5nZXRNb250aChtYXhEYXRlKTtcclxuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gZGF0ZUFkYXB0ZXIuZ2V0WWVhcihjdXJyZW50RGF0ZSk7XHJcbiAgICBjb25zdCBjdXJyZW50TW9udGggPSBkYXRlQWRhcHRlci5nZXRNb250aChjdXJyZW50RGF0ZSk7XHJcblxyXG4gICAgc3dpdGNoICh2aWV3TW9kZSkge1xyXG4gICAgICBjYXNlICdkYXlzJzpcclxuICAgICAgICBjb25zdCBuZXh0TW9udGhVbm5vcm0gPSBjdXJyZW50TW9udGggKyAxO1xyXG4gICAgICAgIGNvbnN0IG5leHRNb250aFllYXIgPSBjdXJyZW50WWVhciArIE1hdGguZmxvb3IobmV4dE1vbnRoVW5ub3JtIC8gMTIpO1xyXG4gICAgICAgIGNvbnN0IG5leHRNb250aEluZGV4ID0gbmV4dE1vbnRoVW5ub3JtICUgMTI7XHJcblxyXG4gICAgICAgIC8vINin2q/YsSBtYXhEYXRlINmC2KjZhCDYp9iyINi02LHZiNi5INmF2KfZhyDYqNi52K/bjCDYqNin2LTYr9iMIG5hdmlnYXRpb24g2LrbjNix2YHYudin2YQg2KfYs9iqXHJcbiAgICAgICAgaWYgKG1heFllYXIgPCBuZXh0TW9udGhZZWFyKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAobWF4WWVhciA9PT0gbmV4dE1vbnRoWWVhciAmJiBtYXhNb250aCA8IG5leHRNb250aEluZGV4KSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBjYXNlICdtb250aHMnOlxyXG4gICAgICAgIGNvbnN0IG5leHRZZWFyID0gY3VycmVudFllYXIgKyAxO1xyXG4gICAgICAgIHJldHVybiBtYXhZZWFyIDwgbmV4dFllYXI7XHJcbiAgICAgIGNhc2UgJ3llYXJzJzpcclxuICAgICAgICBpZiAoIXllYXJMaXN0IHx8IHllYXJMaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IG1heERpc3BsYXllZFllYXIgPSBNYXRoLm1heCguLi55ZWFyTGlzdCk7XHJcbiAgICAgICAgY29uc3QgbmV4dEZpcnN0WWVhciA9IG1heERpc3BsYXllZFllYXIgKyAxO1xyXG4gICAgICAgIHJldHVybiBtYXhZZWFyIDwgbmV4dEZpcnN0WWVhcjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXJzZSBkaXNhYmxlZCBkYXRlcyBmcm9tIHZhcmlvdXMgZm9ybWF0c1xyXG4gICAqL1xyXG4gIHBhcnNlRGlzYWJsZWREYXRlcyhcclxuICAgIGRpc2FibGVkRGF0ZXM6IEFycmF5PERhdGUgfCBzdHJpbmc+LFxyXG4gICAgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+LFxyXG4gICAgZGF0ZUZvcm1hdD86IHN0cmluZ1xyXG4gICk6IERhdGVbXSB7XHJcbiAgICByZXR1cm4gZGlzYWJsZWREYXRlc1xyXG4gICAgICAubWFwKChkYXRlKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZGF0ZUFkYXB0ZXIuc3RhcnRPZkRheShkYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IGRhdGVBZGFwdGVyLnBhcnNlKGRhdGUsIGRhdGVGb3JtYXQpO1xyXG4gICAgICAgIHJldHVybiBwYXJzZWREYXRlIHx8IG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoKGRhdGUpID0+IGRhdGUgIT09IG51bGwpIGFzIERhdGVbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkanVzdCBjdXJyZW50IGRhdGUgdG8gdmFsaWQgcmFuZ2VcclxuICAgKi9cclxuICBhZGp1c3REYXRlVG9WYWxpZFJhbmdlKFxyXG4gICAgY3VycmVudERhdGU6IERhdGUsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sXHJcbiAgICBtaW5EYXRlPzogRGF0ZSB8IG51bGwsXHJcbiAgICBtYXhEYXRlPzogRGF0ZSB8IG51bGxcclxuICApOiBEYXRlIHtcclxuICAgIGxldCBhZGp1c3RlZERhdGUgPSBjdXJyZW50RGF0ZTtcclxuXHJcbiAgICBpZiAobWluRGF0ZSAmJiBkYXRlQWRhcHRlci5pc0JlZm9yZShhZGp1c3RlZERhdGUsIG1pbkRhdGUpKSB7XHJcbiAgICAgIGFkanVzdGVkRGF0ZSA9IG1pbkRhdGU7XHJcbiAgICB9IGVsc2UgaWYgKG1heERhdGUgJiYgZGF0ZUFkYXB0ZXIuaXNBZnRlcihhZGp1c3RlZERhdGUsIG1heERhdGUpKSB7XHJcbiAgICAgIGFkanVzdGVkRGF0ZSA9IG1heERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFkanVzdGVkRGF0ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGRhdGUgaXMgd2l0aGluIHZhbGlkIHJhbmdlXHJcbiAgICovXHJcbiAgaXNEYXRlSW5WYWxpZFJhbmdlKFxyXG4gICAgZGF0ZTogRGF0ZSxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPixcclxuICAgIG1pbkRhdGU/OiBEYXRlIHwgbnVsbCxcclxuICAgIG1heERhdGU/OiBEYXRlIHwgbnVsbFxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG1pbkRhdGUgJiYgZGF0ZUFkYXB0ZXIuaXNCZWZvcmUoZGF0ZSwgbWluRGF0ZSkpIHJldHVybiBmYWxzZTtcclxuICAgIGlmIChtYXhEYXRlICYmIGRhdGVBZGFwdGVyLmlzQWZ0ZXIoZGF0ZSwgbWF4RGF0ZSkpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgZGF0ZSByYW5nZVxyXG4gICAqL1xyXG4gIHZhbGlkYXRlRGF0ZVJhbmdlKFxyXG4gICAgc3RhcnREYXRlOiBEYXRlLFxyXG4gICAgZW5kRGF0ZTogRGF0ZSxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPixcclxuICAgIG1pbkRhdGU/OiBEYXRlIHwgbnVsbCxcclxuICAgIG1heERhdGU/OiBEYXRlIHwgbnVsbFxyXG4gICk6IHsgaXNWYWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcclxuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBzdGFydCBkYXRlIGlzIHZhbGlkXHJcbiAgICBpZiAoIXRoaXMuaXNEYXRlSW5WYWxpZFJhbmdlKHN0YXJ0RGF0ZSwgZGF0ZUFkYXB0ZXIsIG1pbkRhdGUsIG1heERhdGUpKSB7XHJcbiAgICAgIGVycm9ycy5wdXNoKCdTdGFydCBkYXRlIGlzIG91dHNpZGUgdmFsaWQgcmFuZ2UnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiBlbmQgZGF0ZSBpcyB2YWxpZFxyXG4gICAgaWYgKCF0aGlzLmlzRGF0ZUluVmFsaWRSYW5nZShlbmREYXRlLCBkYXRlQWRhcHRlciwgbWluRGF0ZSwgbWF4RGF0ZSkpIHtcclxuICAgICAgZXJyb3JzLnB1c2goJ0VuZCBkYXRlIGlzIG91dHNpZGUgdmFsaWQgcmFuZ2UnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiBzdGFydCBkYXRlIGlzIGJlZm9yZSBlbmQgZGF0ZVxyXG4gICAgaWYgKGRhdGVBZGFwdGVyLmlzQWZ0ZXIoc3RhcnREYXRlLCBlbmREYXRlKSkge1xyXG4gICAgICBlcnJvcnMucHVzaCgnU3RhcnQgZGF0ZSBtdXN0IGJlIGJlZm9yZSBlbmQgZGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlzVmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXHJcbiAgICAgIGVycm9ycyxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==