@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
396 lines (395 loc) • 37 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { DefaultControlValueAccessor } from './../common/default-control-value-accessor';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Component, forwardRef, Input, Output, EventEmitter, ElementRef, Inject, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import * as calendarConst from './asi-calendar-constants';
import * as nh from '../../native-helper';
import moment from 'moment';
var AsiCalendarComponent = /** @class */ (function (_super) {
tslib_1.__extends(AsiCalendarComponent, _super);
function AsiCalendarComponent(platformId) {
var _this = _super.call(this) || this;
_this.platformId = platformId;
_this.onDatePicked = new EventEmitter();
_this.open = false;
if (_this.isFr()) {
_this.days = calendarConst.days_fr;
_this.months = calendarConst.months_fr;
}
else {
_this.days = calendarConst.days_en;
_this.months = calendarConst.months_en;
}
_this.initYears();
return _this;
}
Object.defineProperty(AsiCalendarComponent.prototype, "disableDayOfWeek", {
/** allow you to disable day of week exemple [disableDayOfWeek]="[1, 2]"" while disabled monday and tusday */
set: /**
* allow you to disable day of week exemple [disableDayOfWeek]="[1, 2]"" while disabled monday and tusday
* @param {?} daysOfWeek
* @return {?}
*/
function (daysOfWeek) {
if (!daysOfWeek) {
this._disableDayOfWeek = [];
}
else if (nh.isArray(daysOfWeek)) {
this._disableDayOfWeek = daysOfWeek;
}
else {
this._disableDayOfWeek = [daysOfWeek];
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
AsiCalendarComponent.prototype.isFr = /**
* @return {?}
*/
function () {
if (isPlatformBrowser(this.platformId)) {
return navigator.language === 'fr' || navigator.language === 'fr-FR';
}
else {
return false;
}
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
if (this.minDate) {
this.minDate.setHours(0, 0, 0, 0);
}
if (this.maxDate) {
this.maxDate.setHours(23, 59, 59, 999);
}
this.calculDays();
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.initYears = /**
* @return {?}
*/
function () {
/** @type {?} */
var results = new Array();
/** @type {?} */
var currentYear = new Date().getFullYear() + 1;
for (var year = currentYear; year >= 1900; year--) {
results.push(year);
}
this.years = results;
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.onDropdownClose = /**
* @return {?}
*/
function () {
this.open = false;
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.openCalendar = /**
* @return {?}
*/
function () {
this.open = true;
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.closeCalendar = /**
* @return {?}
*/
function () {
this.open = false;
};
/**
* @param {?} dayItem
* @return {?}
*/
AsiCalendarComponent.prototype.onDaySelected = /**
* @param {?} dayItem
* @return {?}
*/
function (dayItem) {
this.selectedDay = new calendarConst.DayItem(dayItem.day, dayItem.month, dayItem.year, dayItem.date, 'selected enabled');
this.value = dayItem.date;
this.closeCalendar();
this.calculDays();
this.onDatePicked.emit(this.value);
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.onMonthSelected = /**
* @return {?}
*/
function () {
/** @type {?} */
var date = new Date(this.selectedYear, this.selectedMonth.num - 1, this.selectedDay.day);
this.value = date;
this.calculDays();
this.onDatePicked.emit(date);
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.onYearSelected = /**
* @return {?}
*/
function () {
/** @type {?} */
var date = new Date(this.selectedYear, this.selectedMonth.num - 1, this.selectedDay.day);
this.value = date;
this.calculDays();
this.onDatePicked.emit(date);
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.calculDays = /**
* @return {?}
*/
function () {
if (!this.selectedMonth || !this.selectedYear) {
return;
}
/** @type {?} */
var month = this.selectedMonth.num - 1;
/** @type {?} */
var year = this.selectedYear;
/** @type {?} */
var result = [];
/** @type {?} */
var date = new Date(year, month, 1);
/** @type {?} */
var mondayDelta = 0;
/** @type {?} */
var day = date.getDay();
if (day === 0) {
mondayDelta = -6;
}
else {
mondayDelta = -(day - 1);
}
date = moment(date).add(mondayDelta, 'days').toDate();
/** @type {?} */
var deltaMonth = date.getMonth();
if (deltaMonth !== month) {
// Before first day of the month
while (date.getMonth() === deltaMonth) {
if (date.getDate() === this.selectedDay.day
&& date.getMonth() + 1 === this.selectedDay.month
&& date.getFullYear() === this.selectedDay.year) {
result.push(this.selectedDay);
}
else {
result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'extra enabled'));
}
date.setDate(date.getDate() + 1);
}
}
// Month dates
while (date.getMonth() === month) {
if (date.getDate() === this.selectedDay.day
&& date.getMonth() + 1 === this.selectedDay.month
&& date.getFullYear() === this.selectedDay.year) {
result.push(this.selectedDay);
}
else {
result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'enabled'));
}
date.setDate(date.getDate() + 1);
}
// Days of the last week
while (date.getDay() !== 1) {
if (date.getDate() === this.selectedDay.day
&& date.getMonth() + 1 === this.selectedDay.month
&& date.getFullYear() === this.selectedDay.year) {
result.push(this.selectedDay);
}
else {
result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'extra enabled'));
}
date.setDate(date.getDate() + 1);
}
this.dayOfMonths = result;
this.manageDisabledDate();
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.manageDisabledDate = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var dayOfWeekDisabled = !nh.isEmpty(this._disableDayOfWeek);
if (this.dayOfMonths) {
nh.forEach(this.dayOfMonths, function (dayItem) {
if (_this.minDate != null) {
if (dayItem.date < _this.minDate) {
dayItem.class = 'disabled';
}
}
if (_this.maxDate != null) {
if (dayItem.date > _this.maxDate) {
dayItem.class = 'disabled';
}
}
if (dayOfWeekDisabled && _this._disableDayOfWeek.includes(/** @type {?} */ (dayItem.date.getDay()))) {
dayItem.class = 'disabled';
}
});
}
};
/**
* @param {?} value
* @return {?}
*/
AsiCalendarComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this._value = value;
this.initToDate(value);
};
/**
* @param {?} value
* @return {?}
*/
AsiCalendarComponent.prototype.initToDate = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value == null) {
value = new Date();
}
this.selectedYear = value.getFullYear();
/** @type {?} */
var dateMonth = value.getMonth() + 1;
this.selectedMonth = nh.find(this.months, function (month) {
return month.num === dateMonth;
});
this.selectedDay = new calendarConst.DayItem(value.getDate(), this.selectedMonth.num, this.selectedYear, new Date(value), 'selected enabled');
this.calculDays();
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.goNextMonth = /**
* @return {?}
*/
function () {
/** @type {?} */
var nextMonthNum = this.selectedMonth.num + 1;
if (nextMonthNum === 13) {
nextMonthNum = 1;
this.selectedYear = this.selectedYear + 1;
if (this.years.indexOf(this.selectedYear) === -1) {
this.years.push(this.selectedYear);
}
}
this.selectedMonth = nh.find(this.months, function (month) {
return month.num === nextMonthNum;
});
this.calculDays();
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.goPreviousMonth = /**
* @return {?}
*/
function () {
/** @type {?} */
var nextMonthNum = this.selectedMonth.num - 1;
if (nextMonthNum === 0) {
nextMonthNum = 12;
this.selectedYear = this.selectedYear - 1;
}
this.selectedMonth = nh.find(this.months, function (month) {
return month.num === nextMonthNum;
});
this.calculDays();
};
AsiCalendarComponent.decorators = [
{ type: Component, args: [{
selector: 'asi-calendar',
template: "<asi-fa-icon [disabled]=\"disabled\" icon=\"fa fa-calendar\" (onClick)=\"open = !open\"></asi-fa-icon>\n\n<asi-dropdown [open]=\"open\" [relativeTo]=\"relativeTo\" (onClose)=\"onDropdownClose()\" [calculWidth]=\"false\"\n dropDownClass=\"asi-calendar-dropdown\">\n\n <div class=\"asi-calendar-picker\">\n <div class=\"calendar-header\">\n <asi-fa-icon icon=\"fa fa-angle-left\" size=\"lg\" (onClick)=\"goPreviousMonth()\"></asi-fa-icon>\n <asi-select class=\"select-month\" [disabled]=\"disabled\" [(ngModel)]=\"selectedMonth\" [data]=\"months\"\n (onValueChange)=\"calculDays()\">\n <asi-selected *asiSelectedDef=\"let data\">{{data.num + \" - \" + data.libelle}}</asi-selected>\n <asi-option *asiOptionDef=\"let data\">{{data.num + \" - \" + data.libelle}}</asi-option>\n </asi-select>\n <asi-select class=\"select-year\" [disabled]=\"disabled\" [(ngModel)]=\"selectedYear\" [data]=\"years\"\n (onValueChange)=\"calculDays()\">\n <asi-selected *asiSelectedDef=\"let data\">{{data}}</asi-selected>\n <asi-option *asiOptionDef=\"let data\">{{data}}</asi-option>\n </asi-select>\n <asi-fa-icon icon=\"fa fa-angle-right\" size=\"lg\" (onClick)=\"goNextMonth()\"></asi-fa-icon>\n </div>\n <div class=\"day-list\">\n <div class=\"day-str\" *ngFor=\"let day of days\">\n <span>{{day.libelle}}</span>\n </div>\n </div>\n <div class=\"calendar-panel\" mouseWheel (mouseWheelUp)=\"goPreviousMonth()\" (mouseWheelDown)=\"goNextMonth()\">\n <button [attr.disabled]=\"day.class === 'disabled' ? true : null\" class=\"day-item\" *ngFor=\"let day of dayOfMonths\"\n [ngClass]=\"day.class\" (click)=\"onDaySelected(day)\">\n <span>{{day.day}}</span>\n </button>\n </div>\n </div>\n</asi-dropdown>\n",
host: { 'class': 'asi-component asi-calendar' },
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return AsiCalendarComponent; }),
multi: true
}
]
}] }
];
/** @nocollapse */
AsiCalendarComponent.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
]; };
AsiCalendarComponent.propDecorators = {
relativeTo: [{ type: Input }],
minDate: [{ type: Input }],
maxDate: [{ type: Input }],
disableDayOfWeek: [{ type: Input }],
onDatePicked: [{ type: Output }]
};
return AsiCalendarComponent;
}(DefaultControlValueAccessor));
export { AsiCalendarComponent };
if (false) {
/** @type {?} */
AsiCalendarComponent.prototype.relativeTo;
/** @type {?} */
AsiCalendarComponent.prototype.minDate;
/** @type {?} */
AsiCalendarComponent.prototype.maxDate;
/** @type {?} */
AsiCalendarComponent.prototype._disableDayOfWeek;
/** @type {?} */
AsiCalendarComponent.prototype.onDatePicked;
/** @type {?} */
AsiCalendarComponent.prototype.days;
/** @type {?} */
AsiCalendarComponent.prototype.months;
/** @type {?} */
AsiCalendarComponent.prototype.years;
/** @type {?} */
AsiCalendarComponent.prototype.selectedMonth;
/** @type {?} */
AsiCalendarComponent.prototype.selectedYear;
/** @type {?} */
AsiCalendarComponent.prototype.selectedDay;
/** @type {?} */
AsiCalendarComponent.prototype.dayOfMonths;
/** @type {?} */
AsiCalendarComponent.prototype.open;
/** @type {?} */
AsiCalendarComponent.prototype.platformId;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWNhbGVuZGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktY2FsZW5kYXIvYXNpLWNhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQy9ILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXBELE9BQU8sS0FBSyxhQUFhLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7O0lBY2MsZ0RBQTJCO0lBb0NuRSw4QkFBeUMsVUFBZTtRQUF4RCxZQUNFLGlCQUFPLFNBU1I7UUFWd0MsZ0JBQVUsR0FBVixVQUFVLENBQUs7NkJBZC9CLElBQUksWUFBWSxFQUFRO3FCQVkxQyxLQUFLO1FBSVYsRUFBRSxDQUFDLENBQUMsS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoQixLQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDbEMsS0FBSSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDO1NBQ3ZDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixLQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDbEMsS0FBSSxDQUFDLE1BQU0sR0FBRyxhQUFhLENB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QUcsQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBQyxLQUFLO1lBQzlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLFlBQVksQ0FBQztTQUNuQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7S0FDbkI7O2dCQWpRRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLHN5REFBMEM7b0JBQzFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRTtvQkFDL0MsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLG9CQUFvQixFQUFwQixDQUFvQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7OztnREFxQ2MsTUFBTSxTQUFDLFdBQVc7Ozs2QkFsQzlCLEtBQUs7MEJBRUwsS0FBSzswQkFDTCxLQUFLO21DQUtMLEtBQUs7K0JBWUwsTUFBTTs7K0JBM0NUO0VBcUIwQywyQkFBMkI7U0FBeEQsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi8uLi9jb21tb24vZGVmYXVsdC1jb250cm9sLXZhbHVlLWFjY2Vzc29yJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmLCBJbmplY3QsIFBMQVRGT1JNX0lELCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0ICogYXMgY2FsZW5kYXJDb25zdCBmcm9tICcuL2FzaS1jYWxlbmRhci1jb25zdGFudHMnO1xyXG5pbXBvcnQgKiBhcyBuaCBmcm9tICcuLi8uLi9uYXRpdmUtaGVscGVyJztcclxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhc2ktY2FsZW5kYXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnYXNpLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcclxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1jYWxlbmRhcicgfSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzaUNhbGVuZGFyQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc2lDYWxlbmRhckNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIHJlbGF0aXZlVG86IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGU7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcclxuXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZURheU9mV2VlazogbnVtYmVyW107XHJcblxyXG4gIC8qKiBhbGxvdyB5b3UgdG8gZGlzYWJsZSBkYXkgb2Ygd2VlayBleGVtcGxlIFtkaXNhYmxlRGF5T2ZXZWVrXT1cIlsxLCAyXVwiXCIgd2hpbGUgZGlzYWJsZWQgbW9uZGF5IGFuZCB0dXNkYXkgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXNhYmxlRGF5T2ZXZWVrKGRheXNPZldlZWspIHtcclxuICAgIGlmICghZGF5c09mV2Vlaykge1xyXG4gICAgICB0aGlzLl9kaXNhYmxlRGF5T2ZXZWVrID0gW107XHJcbiAgICB9IGVsc2UgaWYgKG5oLmlzQXJyYXkoZGF5c09mV2VlaykpIHtcclxuICAgICAgdGhpcy5fZGlzYWJsZURheU9mV2VlayA9IGRheXNPZldlZWs7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kaXNhYmxlRGF5T2ZXZWVrID0gW2RheXNPZldlZWtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIEBPdXRwdXQoKSBvbkRhdGVQaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XHJcblxyXG4gIGRheXM6IEFycmF5PGNhbGVuZGFyQ29uc3QuRGF5PjtcclxuICBtb250aHM6IEFycmF5PGNhbGVuZGFyQ29uc3QuTW9udGg+O1xyXG4gIHllYXJzOiBBcnJheTxudW1iZXI+O1xyXG5cclxuICBzZWxlY3RlZE1vbnRoOiBjYWxlbmRhckNvbnN0Lk1vbnRoO1xyXG4gIHNlbGVjdGVkWWVhcjogbnVtYmVyO1xyXG4gIHNlbGVjdGVkRGF5OiBjYWxlbmRhckNvbnN0LkRheUl0ZW07XHJcblxyXG4gIGRheU9mTW9udGhzOiBBcnJheTxjYWxlbmRhckNvbnN0LkRheUl0ZW0+O1xyXG5cclxuICBvcGVuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKHRoaXMuaXNGcigpKSB7XHJcbiAgICAgIHRoaXMuZGF5cyA9IGNhbGVuZGFyQ29uc3QuZGF5c19mcjtcclxuICAgICAgdGhpcy5tb250aHMgPSBjYWxlbmRhckNvbnN0Lm1vbnRoc19mcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF5cyA9IGNhbGVuZGFyQ29uc3QuZGF5c19lbjtcclxuICAgICAgdGhpcy5tb250aHMgPSBjYWxlbmRhckNvbnN0Lm1vbnRoc19lbjtcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdFllYXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRnIoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdG9yLmxhbmd1YWdlID09PSAnZnInIHx8IG5hdmlnYXRvci5sYW5ndWFnZSA9PT0gJ2ZyLUZSJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgaWYgKHRoaXMubWluRGF0ZSkge1xyXG4gICAgICB0aGlzLm1pbkRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgIHRoaXMubWF4RGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYWxjdWxEYXlzKCk7XHJcbiAgfVxyXG5cclxuICBpbml0WWVhcnMoKSB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgICBsZXQgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgKyAxO1xyXG4gICAgZm9yIChsZXQgeWVhciA9IGN1cnJlbnRZZWFyOyB5ZWFyID49IDE5MDA7IHllYXItLSkge1xyXG4gICAgICByZXN1bHRzLnB1c2goeWVhcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnllYXJzID0gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIG9uRHJvcGRvd25DbG9zZSgpIHtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5DYWxlbmRhcigpIHtcclxuICAgIHRoaXMub3BlbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VDYWxlbmRhcigpIHtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25EYXlTZWxlY3RlZChkYXlJdGVtOiBjYWxlbmRhckNvbnN0LkRheUl0ZW0pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXkgPSBuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRheUl0ZW0uZGF5LCBkYXlJdGVtLm1vbnRoLCBkYXlJdGVtLnllYXIsIGRheUl0ZW0uZGF0ZSwgJ3NlbGVjdGVkIGVuYWJsZWQnKTtcclxuICAgIHRoaXMudmFsdWUgPSBkYXlJdGVtLmRhdGU7XHJcbiAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG5cclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvbk1vbnRoU2VsZWN0ZWQoKSB7XHJcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWRZZWFyLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtIC0gMSwgdGhpcy5zZWxlY3RlZERheS5kYXkpO1xyXG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XHJcbiAgICB0aGlzLmNhbGN1bERheXMoKTtcclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvblllYXJTZWxlY3RlZCgpIHtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZFllYXIsIHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxLCB0aGlzLnNlbGVjdGVkRGF5LmRheSk7XHJcbiAgICB0aGlzLnZhbHVlID0gZGF0ZTtcclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gICAgdGhpcy5vbkRhdGVQaWNrZWQuZW1pdChkYXRlKTtcclxuICB9XHJcblxyXG4gIGNhbGN1bERheXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRNb250aCB8fCAhdGhpcy5zZWxlY3RlZFllYXIpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgbW9udGggPSB0aGlzLnNlbGVjdGVkTW9udGgubnVtIC0gMTtcclxuICAgIGxldCB5ZWFyID0gdGhpcy5zZWxlY3RlZFllYXI7XHJcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xyXG5cclxuICAgIGxldCBtb25kYXlEZWx0YSA9IDA7XHJcbiAgICBsZXQgZGF5ID0gZGF0ZS5nZXREYXkoKTtcclxuICAgIGlmIChkYXkgPT09IDApIHtcclxuICAgICAgbW9uZGF5RGVsdGEgPSAtNjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1vbmRheURlbHRhID0gLShkYXkgLSAxKTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRlID0gbW9tZW50KGRhdGUpLmFkZChtb25kYXlEZWx0YSwgJ2RheXMnKS50b0RhdGUoKTtcclxuXHJcbiAgICBsZXQgZGVsdGFNb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcclxuXHJcbiAgICBpZiAoZGVsdGFNb250aCAhPT0gbW9udGgpIHtcclxuICAgICAgLy8gQmVmb3JlIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcclxuICAgICAgd2hpbGUgKGRhdGUuZ2V0TW9udGgoKSA9PT0gZGVsdGFNb250aCkge1xyXG4gICAgICAgIGlmIChkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERheS5kYXlcclxuICAgICAgICAgICYmIGRhdGUuZ2V0TW9udGgoKSArIDEgPT09IHRoaXMuc2VsZWN0ZWREYXkubW9udGhcclxuICAgICAgICAgICYmIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERheS55ZWFyKSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2gobmV3IGNhbGVuZGFyQ29uc3QuRGF5SXRlbShkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXRGdWxsWWVhcigpLCBuZXcgRGF0ZShkYXRlKSwgJ2V4dHJhIGVuYWJsZWQnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTW9udGggZGF0ZXNcclxuICAgIHdoaWxlIChkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoKSB7XHJcbiAgICAgIGlmIChkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERheS5kYXlcclxuICAgICAgICAmJiBkYXRlLmdldE1vbnRoKCkgKyAxID09PSB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoXHJcbiAgICAgICAgJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF5LnllYXIpIHtcclxuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQucHVzaChuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldEZ1bGxZZWFyKCksIG5ldyBEYXRlKGRhdGUpLCAnZW5hYmxlZCcpKTtcclxuICAgICAgfVxyXG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEYXlzIG9mIHRoZSBsYXN0IHdlZWtcclxuICAgIHdoaWxlIChkYXRlLmdldERheSgpICE9PSAxKSB7XHJcbiAgICAgIGlmIChkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERheS5kYXlcclxuICAgICAgICAmJiBkYXRlLmdldE1vbnRoKCkgKyAxID09PSB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoXHJcbiAgICAgICAgJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF5LnllYXIpIHtcclxuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQucHVzaChuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldEZ1bGxZZWFyKCksIG5ldyBEYXRlKGRhdGUpLCAnZXh0cmEgZW5hYmxlZCcpKTtcclxuICAgICAgfVxyXG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRheU9mTW9udGhzID0gcmVzdWx0O1xyXG5cclxuICAgIHRoaXMubWFuYWdlRGlzYWJsZWREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hbmFnZURpc2FibGVkRGF0ZSgpIHtcclxuICAgIGNvbnN0IGRheU9mV2Vla0Rpc2FibGVkID0gIW5oLmlzRW1wdHkodGhpcy5fZGlzYWJsZURheU9mV2Vlayk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF5T2ZNb250aHMpIHtcclxuICAgICAgbmguZm9yRWFjaCh0aGlzLmRheU9mTW9udGhzLCAoZGF5SXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGRheUl0ZW0uZGF0ZSA8IHRoaXMubWluRGF0ZSkge1xyXG4gICAgICAgICAgICBkYXlJdGVtLmNsYXNzID0gJ2Rpc2FibGVkJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWF4RGF0ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoZGF5SXRlbS5kYXRlID4gdGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgICAgICAgIGRheUl0ZW0uY2xhc3MgPSAnZGlzYWJsZWQnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF5T2ZXZWVrRGlzYWJsZWQgJiYgdGhpcy5fZGlzYWJsZURheU9mV2Vlay5pbmNsdWRlcyg8bnVtYmVyPmRheUl0ZW0uZGF0ZS5nZXREYXkoKSkpIHtcclxuICAgICAgICAgIGRheUl0ZW0uY2xhc3MgPSAnZGlzYWJsZWQnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlKSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5pbml0VG9EYXRlKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGluaXRUb0RhdGUodmFsdWU6IERhdGUpIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRZZWFyID0gdmFsdWUuZ2V0RnVsbFllYXIoKTtcclxuXHJcbiAgICBsZXQgZGF0ZU1vbnRoID0gdmFsdWUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcclxuICAgICAgcmV0dXJuIG1vbnRoLm51bSA9PT0gZGF0ZU1vbnRoO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZERheSA9IG5ldyBjYWxlbmRhckNvbnN0LkRheUl0ZW0odmFsdWUuZ2V0RGF0ZSgpLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkWWVhciwgbmV3IERhdGUodmFsdWUpLCAnc2VsZWN0ZWQgZW5hYmxlZCcpO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgZ29OZXh0TW9udGgoKSB7XHJcbiAgICBsZXQgbmV4dE1vbnRoTnVtID0gdGhpcy5zZWxlY3RlZE1vbnRoLm51bSArIDE7XHJcbiAgICBpZiAobmV4dE1vbnRoTnVtID09PSAxMykge1xyXG4gICAgICBuZXh0TW9udGhOdW0gPSAxO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkWWVhciA9IHRoaXMuc2VsZWN0ZWRZZWFyICsgMTtcclxuICAgICAgaWYgKHRoaXMueWVhcnMuaW5kZXhPZih0aGlzLnNlbGVjdGVkWWVhcikgPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy55ZWFycy5wdXNoKHRoaXMuc2VsZWN0ZWRZZWFyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZE1vbnRoID0gbmguZmluZCh0aGlzLm1vbnRocywgKG1vbnRoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtb250aC5udW0gPT09IG5leHRNb250aE51bTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgZ29QcmV2aW91c01vbnRoKCkge1xyXG4gICAgbGV0IG5leHRNb250aE51bSA9IHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxO1xyXG4gICAgaWYgKG5leHRNb250aE51bSA9PT0gMCkge1xyXG4gICAgICBuZXh0TW9udGhOdW0gPSAxMjtcclxuICAgICAgdGhpcy5zZWxlY3RlZFllYXIgPSB0aGlzLnNlbGVjdGVkWWVhciAtIDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcclxuICAgICAgcmV0dXJuIG1vbnRoLm51bSA9PT0gbmV4dE1vbnRoTnVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxjdWxEYXlzKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==