date-picker-custom
Version:
A simple customizable date picker for Angular
199 lines • 33 kB
JavaScript
import { __decorate } from "tslib";
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { DatePickerService } from '../custom-date-picker.service';
let DatePickerComponent = class DatePickerComponent {
constructor(datePickerService) {
this.datePickerService = datePickerService;
this.showDay = true;
this.showMonth = true;
this.showYear = true;
this.themeColor = 'default';
this.finalDate = new EventEmitter();
this.finalDay = new EventEmitter();
this.finalMonth = new EventEmitter();
this.finalMonthName = new EventEmitter();
this.finalYear = new EventEmitter();
this.showDateBox = true;
this.showMonthBox = false;
this.showYearBox = false;
}
ngOnInit() {
let date = new Date();
this.selectedDay = this.checkDay = date.getDate();
this.selectedMonth = this.checkMonth = date.getMonth();
this.selectedYear = this.currentYear = this.checkYear = date.getFullYear();
this.years = Array(12).fill(this.selectedYear).map((val, ind) => { val += ind; return val; });
this.monthDayMap = this.datePickerService.getMap();
this.themeColor = `theme-${this.themeColor}`;
if (this.showYear) {
this.toggleDayMonthYear('year');
}
if (this.showMonth) {
this.toggleDayMonthYear('month');
}
if (this.showDay) {
this.toggleDayMonthYear('day');
}
}
monthYearPrev() {
if (this.showDateBox) {
this.selectedMonth--;
if (this.selectedMonth < 0) {
this.selectedYear--;
this.selectedMonth = 11;
}
this.monthDayMap[this.selectedMonth].days = this.datePickerService.arrangeDates(this.selectedMonth, this.monthDayMap[this.selectedMonth].numberOfDays, this.selectedYear);
}
else if (this.showMonthBox) {
this.selectedYear--;
}
else if (this.showYearBox) {
this.currentYear -= 12;
this.years = Array(12).fill(this.currentYear).map((val, ind) => { val += ind; return val; });
}
}
monthYearNext() {
if (this.showDateBox) {
this.selectedMonth++;
if (this.selectedMonth > 11) {
this.selectedYear++;
this.selectedMonth = 0;
}
this.monthDayMap[this.selectedMonth].days = this.datePickerService.arrangeDates(this.selectedMonth, this.monthDayMap[this.selectedMonth].numberOfDays, this.selectedYear);
}
else if (this.showMonthBox) {
this.selectedYear++;
}
else if (this.showYearBox) {
this.currentYear += 12;
this.years = Array(12).fill(this.currentYear).map((val, ind) => { val += ind; return val; });
}
}
selectDay(day) {
this.selectedDay = this.checkDay = day;
this.checkMonth = this.selectedMonth;
this.checkYear = this.selectedYear;
this.emitOutput();
}
selectMonth(month) {
this.selectedMonth = this.checkMonth = this.datePickerService.nameToMonth(month);
this.checkYear = this.selectedYear;
if (!this.showDay) {
this.emitOutput();
}
else {
this.toggleDayMonthYear('day');
}
}
selectYear(year) {
this.selectedYear = this.checkYear = year;
if (!this.showMonth && !this.showDay) {
this.emitOutput();
}
else if (!this.showMonth) {
this.toggleDayMonthYear('day');
}
else {
this.toggleDayMonthYear('month');
}
}
toggleDayMonthYear(param) {
if (param === 'day') {
this.showDateBox = true;
this.showMonthBox = false;
this.showYearBox = false;
}
else if (param === 'month') {
this.showDateBox = false;
this.showMonthBox = true;
this.showYearBox = false;
if (!this.showMonth && this.showYear) {
this.toggleDayMonthYear('year');
}
else if (!this.showMonth && !this.showYear) {
this.toggleDayMonthYear('day');
}
}
else if (param === 'year' && this.showYear) {
this.showDateBox = false;
this.showMonthBox = false;
this.showYearBox = true;
}
this.datePickerService.arrangeDates(this.selectedMonth, this.monthDayMap[this.selectedMonth].numberOfDays, this.selectedYear);
}
highlightCurrentDate(day) {
let date = new Date();
return this.selectedDay === day && this.selectedMonth === this.checkMonth && this.selectedYear === this.checkYear;
}
highlightCurrentMonth(month) {
let date = new Date();
return this.selectedMonth === this.datePickerService.nameToMonth(month) && this.selectedYear === this.checkYear;
}
highlightCurrentYear(year) {
return year === this.selectedYear;
}
emitOutput() {
let date = new Date(this.selectedYear, this.selectedMonth, this.selectedDay);
let emitMonthName = this.datePickerService.monthToName(this.selectedMonth);
let emitDay = this.selectedDay;
let emitMonth = this.selectedMonth;
let emitYear = this.selectedYear;
if (!this.showDay) {
emitDay = undefined;
date = undefined;
}
if (!this.showMonth) {
emitMonth = undefined;
emitMonthName = undefined;
date = undefined;
}
if (!this.showYear) {
emitYear = undefined;
date = undefined;
}
this.finalDate.emit(date);
this.finalDay.emit(emitDay);
this.finalMonth.emit(emitMonth);
this.finalMonthName.emit(emitMonthName);
this.finalYear.emit(emitYear);
}
};
DatePickerComponent.ctorParameters = () => [
{ type: DatePickerService }
];
__decorate([
Input('showDay')
], DatePickerComponent.prototype, "showDay", void 0);
__decorate([
Input('showMonth')
], DatePickerComponent.prototype, "showMonth", void 0);
__decorate([
Input('showYear')
], DatePickerComponent.prototype, "showYear", void 0);
__decorate([
Input('theme')
], DatePickerComponent.prototype, "themeColor", void 0);
__decorate([
Output('date')
], DatePickerComponent.prototype, "finalDate", void 0);
__decorate([
Output('day')
], DatePickerComponent.prototype, "finalDay", void 0);
__decorate([
Output('month')
], DatePickerComponent.prototype, "finalMonth", void 0);
__decorate([
Output('month_name')
], DatePickerComponent.prototype, "finalMonthName", void 0);
__decorate([
Output('year')
], DatePickerComponent.prototype, "finalYear", void 0);
DatePickerComponent = __decorate([
Component({
selector: 'date-picker',
template: "<main class='calendar-box' [ngClass]=\"themeColor\">\r\n <div class='calendar-box-heading-bar'>\r\n <div class=\"calendar-box-heading-bar-prev\" \r\n (click)=\"monthYearPrev()\">\r\n < \r\n </div>\r\n <div class=\"calendar-box-heading-bar-month\" \r\n (click)=\"toggleDayMonthYear('month')\"\r\n *ngIf='showDateBox && showDay'>\r\n {{monthDayMap[selectedMonth].month}} - {{selectedYear}}\r\n </div>\r\n <div class=\"calendar-box-heading-bar-month\" \r\n (click)=\"toggleDayMonthYear('year')\"\r\n *ngIf='showMonthBox && showMonth'>\r\n {{selectedYear}}\r\n </div>\r\n <div class=\"calendar-box-heading-bar-month\"\r\n *ngIf='showYearBox'>\r\n {{years[0]}}-{{years[11]}}\r\n </div>\r\n <div class=\"calendar-box-heading-bar-next\" \r\n (click)=\"monthYearNext()\">\r\n >\r\n </div>\r\n </div>\r\n <div class='calendar-box-days' *ngIf='showDateBox && showDay'>\r\n <div class='calendar-box-days-name' \r\n *ngFor=\"let day of ['S', 'M', 'T', 'W', 'T', 'F', 'S']\">\r\n {{day}}\r\n </div>\r\n <div class='calendar-box-days-day' \r\n *ngFor=\"let day of monthDayMap[selectedMonth].days\"\r\n (click)='selectDay(day)' \r\n [class.zero]='day === 0' \r\n [class.selected]='highlightCurrentDate(day)'>\r\n {{day}}\r\n </div>\r\n </div>\r\n <div class='calendar-box-months-years' *ngIf='showMonthBox && showMonth'>\r\n <div class='calendar-box-months-years-month-year' \r\n *ngFor=\"let month of monthDayMap\"\r\n (click)='selectMonth(month.month)' \r\n [class.selected]='highlightCurrentMonth(month.month)'>\r\n {{month.month.slice(0,3)}}\r\n </div>\r\n </div>\r\n <div class='calendar-box-months-years' *ngIf='showYearBox && showYear'>\r\n <div class='calendar-box-months-years-month-year' \r\n *ngFor=\"let year of years\" \r\n (click)='selectYear(year)'\r\n [class.selected]='highlightCurrentYear(year)'>\r\n {{year}}\r\n </div>\r\n </div>\r\n</main>",
styles: [".calendar-box-heading-bar{cursor:pointer;display:flex}.calendar-box-heading-bar>*{padding:5px;transition:.2s ease-in-out}.theme-default .calendar-box-heading-bar>:hover{background-color:rgba(235,235,235,.377)}.theme-default .calendar-box-heading-bar>:active{background-color:rgba(158,158,158,.377);transition:.2s ease-in-out}.theme-red .calendar-box-heading-bar>:hover{background-color:rgba(255,208,208,.327)}.theme-red .calendar-box-heading-bar>:active{background-color:rgba(255,55,55,.327);transition:.2s ease-in-out}.theme-green .calendar-box-heading-bar>:hover{background-color:rgba(204,255,153,.534)}.theme-green .calendar-box-heading-bar>:active{background-color:rgba(128,255,0,.534);transition:.2s ease-in-out}.theme-yellow .calendar-box-heading-bar>:hover{background-color:rgba(255,255,168,.327)}.theme-yellow .calendar-box-heading-bar>:active{background-color:rgba(255,255,15,.327);transition:.2s ease-in-out}.theme-blue .calendar-box-heading-bar>:hover{background-color:rgba(168,213,255,.327)}.theme-blue .calendar-box-heading-bar>:active{background-color:rgba(15,139,255,.327);transition:.2s ease-in-out}.calendar-box-heading-bar-prev{width:10%;font-weight:700;font-size:18px;text-align:center}.theme-default .calendar-box-heading-bar-prev{border:1.5px solid rgba(82,82,82,.377);color:rgba(82,82,82,.377)}.theme-red .calendar-box-heading-bar-prev{border:1.5px solid rgba(157,0,0,.327);color:rgba(157,0,0,.327)}.theme-green .calendar-box-heading-bar-prev{border:1.5px solid rgba(51,102,0,.534);color:rgba(51,102,0,.534)}.theme-yellow .calendar-box-heading-bar-prev{border:1.5px solid rgba(117,117,0,.327);color:rgba(117,117,0,.327)}.theme-blue .calendar-box-heading-bar-prev{border:1.5px solid rgba(0,60,117,.327);color:rgba(0,60,117,.327)}.calendar-box-heading-bar-month{flex:1 1 auto;text-align:center}.calendar-box-heading-bar-next{width:10%;font-weight:700;font-size:18px;text-align:center}.theme-default .calendar-box-heading-bar-next{border:1.5px solid rgba(82,82,82,.377);color:rgba(82,82,82,.377)}.theme-red .calendar-box-heading-bar-next{border:1.5px solid rgba(157,0,0,.327);color:rgba(157,0,0,.327)}.theme-green .calendar-box-heading-bar-next{border:1.5px solid rgba(51,102,0,.534);color:rgba(51,102,0,.534)}.theme-yellow .calendar-box-heading-bar-next{border:1.5px solid rgba(117,117,0,.327);color:rgba(117,117,0,.327)}.theme-blue .calendar-box-heading-bar-next{border:1.5px solid rgba(0,60,117,.327);color:rgba(0,60,117,.327)}.calendar-box-days{height:200px;display:-ms-grid;display:grid;-ms-grid-columns:(1fr)[7];grid-template-columns:repeat(7,1fr)}.calendar-box-days-name{height:100%;width:100%;align-self:center;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:100;cursor:default;color:#979797;border-bottom:.05px solid #c7c7c7}.calendar-box-days-day{height:100%;width:100%;cursor:pointer;align-self:center;display:flex;align-items:center;justify-content:center;font-size:13px}.theme-default .calendar-box-days-day:hover{background-color:rgba(235,235,235,.377)}.theme-default .calendar-box-days-day:active{background-color:rgba(158,158,158,.377);transition:.2s ease-in-out}.theme-red .calendar-box-days-day:hover{background-color:rgba(255,208,208,.327)}.theme-red .calendar-box-days-day:active{background-color:rgba(255,55,55,.327);transition:.2s ease-in-out}.theme-green .calendar-box-days-day:hover{background-color:rgba(204,255,153,.534)}.theme-green .calendar-box-days-day:active{background-color:rgba(128,255,0,.534);transition:.2s ease-in-out}.theme-yellow .calendar-box-days-day:hover{background-color:rgba(255,255,168,.327)}.theme-yellow .calendar-box-days-day:active{background-color:rgba(255,255,15,.327);transition:.2s ease-in-out}.theme-blue .calendar-box-days-day:hover{background-color:rgba(168,213,255,.327)}.theme-blue .calendar-box-days-day:active{background-color:rgba(15,139,255,.327);transition:.2s ease-in-out}.theme-default .calendar-box-days-day.selected{background-color:rgba(158,158,158,.377)}.theme-red .calendar-box-days-day.selected{background-color:rgba(255,55,55,.327)}.theme-green .calendar-box-days-day.selected{background-color:rgba(128,255,0,.534)}.theme-yellow .calendar-box-days-day.selected{background-color:rgba(255,255,15,.327)}.theme-blue .calendar-box-days-day.selected{background-color:rgba(15,139,255,.327)}.calendar-box-days-day.zero{visibility:hidden!important}*{padding:0;margin:0;font-family:\"Segoe UI\",sans-serif,\"Helvetica Neue\"}.calendar-box-months-years{height:200px;display:-ms-grid;display:grid;-ms-grid-columns:(1fr)[3];grid-template-columns:repeat(3,1fr)}.calendar-box-months-years-month-year{height:100%;width:100%;cursor:pointer;align-self:center;display:flex;align-items:center;justify-content:center;font-size:13px}.theme-default .calendar-box-months-years-month-year:hover{background-color:rgba(235,235,235,.377)}.theme-default .calendar-box-months-years-month-year:active{background-color:rgba(158,158,158,.377);transition:.2s ease-in-out}.theme-red .calendar-box-months-years-month-year:hover{background-color:rgba(255,208,208,.327)}.theme-red .calendar-box-months-years-month-year:active{background-color:rgba(255,55,55,.327);transition:.2s ease-in-out}.theme-green .calendar-box-months-years-month-year:hover{background-color:rgba(204,255,153,.534)}.theme-green .calendar-box-months-years-month-year:active{background-color:rgba(128,255,0,.534);transition:.2s ease-in-out}.theme-yellow .calendar-box-months-years-month-year:hover{background-color:rgba(255,255,168,.327)}.theme-yellow .calendar-box-months-years-month-year:active{background-color:rgba(255,255,15,.327);transition:.2s ease-in-out}.theme-blue .calendar-box-months-years-month-year:hover{background-color:rgba(168,213,255,.327)}.theme-blue .calendar-box-months-years-month-year:active{background-color:rgba(15,139,255,.327);transition:.2s ease-in-out}.theme-default .calendar-box-months-years-month-year.selected{background-color:rgba(158,158,158,.377)}.theme-red .calendar-box-months-years-month-year.selected{background-color:rgba(255,55,55,.327)}.theme-green .calendar-box-months-years-month-year.selected{background-color:rgba(128,255,0,.534)}.theme-yellow .calendar-box-months-years-month-year.selected{background-color:rgba(255,255,15,.327)}.theme-blue .calendar-box-months-years-month-year.selected{background-color:rgba(15,139,255,.327)}.calendar-box{transition:.2s ease-in-out;position:relative;box-shadow:0 1.1px 2.1px -2px rgba(0,0,0,.1),0 4px 17px -8px rgba(0,0,0,.3);width:220px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}"]
})
], DatePickerComponent);
export { DatePickerComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGF0ZS1waWNrZXItY3VzdG9tLyIsInNvdXJjZXMiOlsibGliL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQU9sRSxJQUFhLG1CQUFtQixHQUFoQyxNQUFhLG1CQUFtQjtJQTZCOUIsWUFBb0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUEzQnRDLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDYixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFDbkIsZUFBVSxHQUFHLFNBQVMsQ0FBQztRQUV2QixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN0QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNwQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNuQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDbEQsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFdkQsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUFjd0MsQ0FBQztJQUU3RCxRQUFRO1FBQ04sSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxD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dUM7QUFDcEM7SUFBaEIsTUFBTSxDQUFDLE9BQU8sQ0FBQzt1REFBeUM7QUFDbkM7SUFBckIsTUFBTSxDQUFDLFlBQVksQ0FBQzsyREFBNkM7QUFDbEQ7SUFBZixNQUFNLENBQUMsTUFBTSxDQUFDO3NEQUF3QztBQVg1QyxtQkFBbUI7SUFML0IsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLGFBQWE7UUFDdkIsZ3dFQUEyQzs7S0FFNUMsQ0FBQztHQUNXLG1CQUFtQixDQXVML0I7U0F2TFksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tZGF0ZS1waWNrZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RhdGUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoJ3Nob3dEYXknKSBzaG93RGF5ID0gdHJ1ZTtcbiAgQElucHV0KCdzaG93TW9udGgnKSBzaG93TW9udGggPSB0cnVlO1xuICBASW5wdXQoJ3Nob3dZZWFyJykgc2hvd1llYXIgPSB0cnVlO1xuICBASW5wdXQoJ3RoZW1lJykgdGhlbWVDb2xvciA9ICdkZWZhdWx0JztcblxuICBAT3V0cHV0KCdkYXRlJykgZmluYWxEYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICBAT3V0cHV0KCdkYXknKSBmaW5hbERheSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCdtb250aCcpIGZpbmFsTW9udGggPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgnbW9udGhfbmFtZScpIGZpbmFsTW9udGhOYW1lID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoJ3llYXInKSBmaW5hbFllYXIgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBzaG93RGF0ZUJveCA9IHRydWU7XG4gIHNob3dNb250aEJveCA9IGZhbHNlO1xuICBzaG93WWVhckJveCA9IGZhbHNlO1xuXG4gIHNlbGVjdGVkRGF5OiBudW1iZXI7XG4gIHNlbGVjdGVkTW9udGg6IG51bWJlcjtcbiAgc2VsZWN0ZWRZZWFyOiBudW1iZXI7XG4gIGN1cnJlbnRZZWFyOiBudW1iZXI7XG5cbiAgY2hlY2tEYXk6IG51bWJlcjtcbiAgY2hlY2tNb250aDogbnVtYmVyO1xuICBjaGVja1llYXI6IG51bWJlclxuXG4gIHllYXJzOiBBcnJheTxudW1iZXI+O1xuICBtb250aERheU1hcDogQXJyYXk8eyBudW1iZXJPZkRheXM6IG51bWJlciwgbW9udGg6IHN0cmluZywgZGF5czogQXJyYXk8bnVtYmVyPiB9PjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVQaWNrZXJTZXJ2aWNlOiBEYXRlUGlja2VyU2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWREYXkgPSB0aGlzLmNoZWNrRGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgdGhpcy5zZWxlY3RlZE1vbnRoID0gdGhpcy5jaGVja01vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIHRoaXMuc2VsZWN0ZWRZZWFyID0gdGhpcy5jdXJyZW50WWVhciA9IHRoaXMuY2hlY2tZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIHRoaXMueWVhcnMgPSBBcnJheSgxMikuZmlsbCh0aGlzLnNlbGVjdGVkWWVhcikubWFwKCh2YWwsIGluZCkgPT4geyB2YWwgKz0gaW5kOyByZXR1cm4gdmFsIH0pO1xuICAgIHRoaXMubW9udGhEYXlNYXAgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmdldE1hcCgpO1xuICAgIHRoaXMudGhlbWVDb2xvciA9IGB0aGVtZS0ke3RoaXMudGhlbWVDb2xvcn1gO1xuXG4gICAgaWYgKHRoaXMuc2hvd1llYXIpIHtcbiAgICAgIHRoaXMudG9nZ2xlRGF5TW9udGhZZWFyKCd5ZWFyJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dNb250aCkge1xuICAgICAgdGhpcy50b2dnbGVEYXlNb250aFllYXIoJ21vbnRoJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dEYXkpIHtcbiAgICAgIHRoaXMudG9nZ2xlRGF5TW9udGhZZWFyKCdkYXknKTtcbiAgICB9XG5cbiAgfVxuXG4gIG1vbnRoWWVhclByZXYoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd0RhdGVCb3gpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNb250aC0tO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNb250aCA8IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFllYXItLTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vbnRoID0gMTE7XG4gICAgICB9XG4gICAgICB0aGlzLm1vbnRoRGF5TWFwW3RoaXMuc2VsZWN0ZWRNb250aF0uZGF5cyA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuYXJyYW5nZURhdGVzKHRoaXMuc2VsZWN0ZWRNb250aCwgdGhpcy5tb250aERheU1hcFt0aGlzLnNlbGVjdGVkTW9udGhdLm51bWJlck9mRGF5cywgdGhpcy5zZWxlY3RlZFllYXIpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnNob3dNb250aEJveCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFllYXItLTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5zaG93WWVhckJveCkge1xuICAgICAgdGhpcy5jdXJyZW50WWVhciAtPSAxMjtcbiAgICAgIHRoaXMueWVhcnMgPSBBcnJheSgxMikuZmlsbCh0aGlzLmN1cnJlbnRZZWFyKS5tYXAoKHZhbCwgaW5kKSA9PiB7IHZhbCArPSBpbmQ7IHJldHVybiB2YWwgfSk7XG4gICAgfVxuICB9XG5cbiAgbW9udGhZZWFyTmV4dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93RGF0ZUJveCkge1xuICAgICAgdGhpcy5zZWxlY3RlZE1vbnRoKys7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1vbnRoID4gMTEpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFllYXIrKztcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vbnRoID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMubW9udGhEYXlNYXBbdGhpcy5zZWxlY3RlZE1vbnRoXS5kYXlzID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5hcnJhbmdlRGF0ZXModGhpcy5zZWxlY3RlZE1vbnRoLCB0aGlzLm1vbnRoRGF5TWFwW3RoaXMuc2VsZWN0ZWRNb250aF0ubnVtYmVyT2ZEYXlzLCB0aGlzLnNlbGVjdGVkWWVhcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuc2hvd01vbnRoQm94KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkWWVhcisrO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnNob3dZZWFyQm94KSB7XG4gICAgICB0aGlzLmN1cnJlbnRZZWFyICs9IDEyO1xuICAgICAgdGhpcy55ZWFycyA9IEFycmF5KDEyKS5maWxsKHRoaXMuY3VycmVudFllYXIpLm1hcCgodmFsLCBpbmQpID0+IHsgdmFsICs9IGluZDsgcmV0dXJuIHZhbCB9KTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3REYXkoZGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF5ID0gdGhpcy5jaGVja0RheSA9IGRheTtcbiAgICB0aGlzLmNoZWNrTW9udGggPSB0aGlzLnNlbGVjdGVkTW9udGg7XG4gICAgdGhpcy5jaGVja1llYXIgPSB0aGlzLnNlbGVjdGVkWWVhcjtcbiAgICB0aGlzLmVtaXRPdXRwdXQoKTtcbiAgfVxuXG4gIHNlbGVjdE1vbnRoKG1vbnRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSB0aGlzLmNoZWNrTW9udGggPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLm5hbWVUb01vbnRoKG1vbnRoKTtcbiAgICB0aGlzLmNoZWNrWWVhciA9IHRoaXMuc2VsZWN0ZWRZZWFyO1xuICAgIGlmICghdGhpcy5zaG93RGF5KSB7XG4gICAgICB0aGlzLmVtaXRPdXRwdXQoKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudG9nZ2xlRGF5TW9udGhZZWFyKCdkYXknKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RZZWFyKHllYXI6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRZZWFyID0gdGhpcy5jaGVja1llYXIgPSB5ZWFyO1xuICAgIGlmICghdGhpcy5zaG93TW9udGggJiYgIXRoaXMuc2hvd0RheSkge1xuICAgICAgdGhpcy5lbWl0T3V0cHV0KClcbiAgICB9XG4gICAgZWxzZSBpZiAoIXRoaXMuc2hvd01vbnRoKSB7XG4gICAgICB0aGlzLnRvZ2dsZURheU1vbnRoWWVhcignZGF5JylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnRvZ2dsZURheU1vbnRoWWVhcignbW9udGgnKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVEYXlNb250aFllYXIocGFyYW06IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChwYXJhbSA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMuc2hvd0RhdGVCb3ggPSB0cnVlO1xuICAgICAgdGhpcy5zaG93TW9udGhCb3ggPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd1llYXJCb3ggPSBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFyYW0gPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMuc2hvd0RhdGVCb3ggPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd01vbnRoQm94ID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2hvd1llYXJCb3ggPSBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5zaG93TW9udGggJiYgdGhpcy5zaG93WWVhcikge1xuICAgICAgICB0aGlzLnRvZ2dsZURheU1vbnRoWWVhcigneWVhcicpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIXRoaXMuc2hvd01vbnRoICYmICF0aGlzLnNob3dZZWFyKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlRGF5TW9udGhZZWFyKCdkYXknKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAocGFyYW0gPT09ICd5ZWFyJyAmJiB0aGlzLnNob3dZZWFyKSB7XG4gICAgICB0aGlzLnNob3dEYXRlQm94ID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dNb250aEJveCA9IGZhbHNlO1xuICAgICAgdGhpcy5zaG93WWVhckJveCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuYXJyYW5nZURhdGVzKHRoaXMuc2VsZWN0ZWRNb250aCwgdGhpcy5tb250aERheU1hcFt0aGlzLnNlbGVjdGVkTW9udGhdLm51bWJlck9mRGF5cywgdGhpcy5zZWxlY3RlZFllYXIpO1xuICB9XG5cbiAgaGlnaGxpZ2h0Q3VycmVudERhdGUoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXkgPT09IGRheSAmJiB0aGlzLnNlbGVjdGVkTW9udGggPT09IHRoaXMuY2hlY2tNb250aCAmJiB0aGlzLnNlbGVjdGVkWWVhciA9PT0gdGhpcy5jaGVja1llYXI7XG4gIH1cblxuICBoaWdobGlnaHRDdXJyZW50TW9udGgobW9udGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE1vbnRoID09PSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLm5hbWVUb01vbnRoKG1vbnRoKSAmJiB0aGlzLnNlbGVjdGVkWWVhciA9PT0gdGhpcy5jaGVja1llYXI7XG4gIH1cblxuICBoaWdobGlnaHRDdXJyZW50WWVhcih5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4geWVhciA9PT0gdGhpcy5zZWxlY3RlZFllYXI7XG4gIH1cblxuICBlbWl0T3V0cHV0KCk6IHZvaWQge1xuICAgIGxldCBkYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZFllYXIsIHRoaXMuc2VsZWN0ZWRNb250aCwgdGhpcy5zZWxlY3RlZERheSk7XG4gICAgbGV0IGVtaXRNb250aE5hbWUgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLm1vbnRoVG9OYW1lKHRoaXMuc2VsZWN0ZWRNb250aCk7XG4gICAgbGV0IGVtaXREYXkgPSB0aGlzLnNlbGVjdGVkRGF5O1xuICAgIGxldCBlbWl0TW9udGggPSB0aGlzLnNlbGVjdGVkTW9udGg7XG4gICAgbGV0IGVtaXRZZWFyID0gdGhpcy5zZWxlY3RlZFllYXI7XG4gICAgaWYgKCF0aGlzLnNob3dEYXkpIHtcbiAgICAgIGVtaXREYXkgPSB1bmRlZmluZWQ7XG4gICAgICBkYXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2hvd01vbnRoKSB7XG4gICAgICBlbWl0TW9udGggPSB1bmRlZmluZWQ7XG4gICAgICBlbWl0TW9udGhOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNob3dZZWFyKSB7XG4gICAgICBlbWl0WWVhciA9IHVuZGVmaW5lZFxuICAgICAgZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5maW5hbERhdGUuZW1pdChkYXRlKTtcbiAgICB0aGlzLmZpbmFsRGF5LmVtaXQoZW1pdERheSk7XG4gICAgdGhpcy5maW5hbE1vbnRoLmVtaXQoZW1pdE1vbnRoKTtcbiAgICB0aGlzLmZpbmFsTW9udGhOYW1lLmVtaXQoZW1pdE1vbnRoTmFtZSk7XG4gICAgdGhpcy5maW5hbFllYXIuZW1pdChlbWl0WWVhcik7XG4gIH1cbn1cbiJdfQ==