@junte/ui
Version:
Quality Angular UI components kit
206 lines • 28.3 kB
JavaScript
import { __decorate, __metadata, __read, __spread } from "tslib";
import { Component, ContentChild, ContentChildren, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, QueryList, TemplateRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { addDays, addMonths, addWeeks, addYears, getMonth, getYear, isSameMonth, startOfWeek, subMonths, subYears } from 'date-fns';
import { NGXLogger } from 'ngx-logger';
import { JunteUIConfig } from '../../config';
import { PropertyApi } from '../../core/decorators/api';
import { Feature } from '../../core/enums/feature';
import { UI } from '../../core/enums/ui';
import { I18N_PROVIDERS } from '../../core/i18n/providers';
import { today } from './utils';
import { WeekMetricComponent } from './week/week-metric.component';
var WEEKS_DISPLAYED = 6;
var DAYS_IN_WEEK = 7;
var DATE_ROWS = 3;
var DATE_COLS = 4;
var ViewType;
(function (ViewType) {
ViewType["date"] = "date";
ViewType["year"] = "year";
ViewType["month"] = "month";
})(ViewType || (ViewType = {}));
var CalendarComponent = /** @class */ (function () {
function CalendarComponent(logger, config) {
var _this = this;
this.logger = logger;
this.config = config;
this.host = 'jnt-calendar-host';
this.ui = UI;
this._period = today();
this.weeks = [];
this.months = [];
this.years = [];
this.viewType = ViewType;
this.view = ViewType.date;
this.features = [];
this.updated = new EventEmitter();
this.selected = new EventEmitter();
this.disabled = false;
this.onChange = function () { return _this.logger.debug('value accessor is not registered'); };
this.onTouched = function () { return _this.logger.debug('value accessor is not registered'); };
this.registerOnChange = function (fn) { return _this.onChange = fn; };
this.registerOnTouched = function (fn) { return _this.onTouched = fn; };
this.onBlur = function () { return _this.onTouched(); };
}
CalendarComponent_1 = CalendarComponent;
Object.defineProperty(CalendarComponent.prototype, "period", {
get: function () {
return this._period;
},
set: function (period) {
if (!isSameMonth(this._period, period)) {
this._period = period;
this.update();
}
},
enumerable: true,
configurable: true
});
CalendarComponent.prototype.ngOnInit = function () {
this.update();
};
CalendarComponent.prototype.writeValue = function (date) {
this.current = date;
this.period = date || today();
};
CalendarComponent.prototype.setDisabledState = function (isDisabled) {
this.disabled = isDisabled;
};
CalendarComponent.prototype.select = function (date) {
this.current = date;
this.onChange(date);
this.selected.emit(date);
};
CalendarComponent.prototype.today = function () {
var now = new Date();
this.period = now;
this.select(now);
};
CalendarComponent.prototype.add = function () {
if (this.view === ViewType.date) {
this.period = addMonths(this.period, 1);
}
else if (this.view === ViewType.month) {
this.period = addYears(this.period, 1);
}
else {
this.period = addYears(this.period, 12);
}
};
CalendarComponent.prototype.sub = function () {
if (this.view === ViewType.date) {
this.period = subMonths(this.period, 1);
}
else if (this.view === ViewType.month) {
this.period = subYears(this.period, 1);
}
else {
this.period = subYears(this.period, 12);
}
};
CalendarComponent.prototype.update = function () {
var start = startOfWeek(new Date(getYear(this.period), getMonth(this.period), 1), { locale: this.config.locale.dfns });
var date = start;
this.weeks = [];
for (var i = 0; i < WEEKS_DISPLAYED; i++) {
this.weeks[i] = { days: [], date: date };
for (var j = 0; j < DAYS_IN_WEEK; j++) {
this.weeks[i].days[j] = addDays(date, j);
}
date = addWeeks(date, 1);
}
this.updated.emit({ start: start, end: date });
for (var i = 0; i < DATE_ROWS; i++) {
this.months[i] = [];
for (var j = 0; j < DATE_COLS; j++) {
this.months[i].push(new Date(getYear(this.period), i * DATE_COLS + j, 1));
}
}
for (var i = 0; i < DATE_ROWS; i++) {
this.years[i] = [];
for (var j = 0; j < DATE_COLS; j++) {
this.years[i].push(new Date(getYear(this.period) - 4 + i * DATE_COLS + j, i * DATE_COLS + j, 1));
}
}
};
var CalendarComponent_1;
CalendarComponent.ctorParameters = function () { return [
{ type: NGXLogger },
{ type: JunteUIConfig }
]; };
__decorate([
HostBinding('attr.host'),
__metadata("design:type", Object)
], CalendarComponent.prototype, "host", void 0);
__decorate([
PropertyApi({
description: 'Calendar features',
path: 'ui.feature',
options: [Feature.today]
}),
Input(),
__metadata("design:type", Array)
], CalendarComponent.prototype, "features", void 0);
__decorate([
ContentChildren(WeekMetricComponent),
__metadata("design:type", QueryList)
], CalendarComponent.prototype, "metrics", void 0);
__decorate([
ContentChild('calendarDayTemplate'),
__metadata("design:type", TemplateRef)
], CalendarComponent.prototype, "dayTemplate", void 0);
__decorate([
ContentChild('calendarMetricTemplate'),
__metadata("design:type", TemplateRef)
], CalendarComponent.prototype, "metricTemplate", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], CalendarComponent.prototype, "updated", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], CalendarComponent.prototype, "selected", void 0);
__decorate([
PropertyApi({
description: 'Set disabled state',
type: 'boolean',
default: 'false',
}),
HostBinding('attr.data-disabled'),
Input(),
__metadata("design:type", Object)
], CalendarComponent.prototype, "disabled", void 0);
__decorate([
PropertyApi({
description: 'Set current month for displaying',
type: 'Date'
}),
Input('month'),
__metadata("design:type", Date),
__metadata("design:paramtypes", [Date])
], CalendarComponent.prototype, "period", null);
__decorate([
HostListener('blur'),
__metadata("design:type", Object)
], CalendarComponent.prototype, "onBlur", void 0);
CalendarComponent = CalendarComponent_1 = __decorate([
Component({
selector: 'jnt-calendar',
template: "<jnt-stack child-of=\"jnt-calendar-host\" [align]=\"ui.align.stretch\">\n <table child-of=\"jnt-calendar-host\" >\n <thead child-of=\"jnt-calendar-host\" >\n <tr child-of=\"jnt-calendar-host\" >\n <td child-of=\"jnt-calendar-host\" >\n <jnt-button child-of=\"jnt-calendar-host\" data-arrow [icon]=\"ui.icons.chevronLeft\"\n [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n (click)=\"sub()\">\n </jnt-button>\n </td>\n <td child-of=\"jnt-calendar-host\" *ngIf=\"view === viewType.date\" (click)=\"view = viewType.month\" colspan=\"5\">\n <jnt-button child-of=\"jnt-calendar-host\" data-date [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n text=\"{{period | jntFormat: 'LLLL'}}, {{period | jntFormat: 'yyyy'}}\"></jnt-button>\n </td>\n <td child-of=\"jnt-calendar-host\" *ngIf=\"view === viewType.month\" (click)=\"view = viewType.year\" colspan=\"2\">\n <jnt-button child-of=\"jnt-calendar-host\" data-date [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n [width]=\"ui.width.fluid\"\n text=\"{{period | jntFormat: 'yyyy'}}\">\n </jnt-button>\n </td>\n <td child-of=\"jnt-calendar-host\" *ngIf=\"view === viewType.year\" colspan=\"2\" data-year>\n {{(period | jntGetYear) - 4}} - {{(period | jntGetYear) + 7}}\n </td>\n <td child-of=\"jnt-calendar-host\" >\n <jnt-button child-of=\"jnt-calendar-host\" data-arrow [icon]=\"ui.icons.chevronRight\"\n [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n (click)=\"add()\">\n </jnt-button>\n </td>\n <td child-of=\"jnt-calendar-host\" data-divider *ngIf=\"metrics.length\"></td>\n <td child-of=\"jnt-calendar-host\" data-metrics *ngIf=\"metrics.length\"\n [translate]=\"'label.metrics'\"\n [attr.colspan]=\"metrics.length\">\n Metrics\n </td>\n </tr>\n <tr child-of=\"jnt-calendar-host\" data-days *ngIf=\"view === viewType.date; else empty\">\n <th child-of=\"jnt-calendar-host\" *ngFor=\"let weekDay of [0,1,2,3,4,5,6]\">{{weekDay | jntWeekdayName:'x2'}}</th>\n\n <th child-of=\"jnt-calendar-host\" data-divider *ngIf=\"!!metrics.length\"></th>\n\n <th child-of=\"jnt-calendar-host\" data-metric *ngFor=\"let m of metrics\">\n {{m.title}}\n </th>\n </tr>\n\n <ng-template #empty>\n <tr child-of=\"jnt-calendar-host\" data-days>\n <th child-of=\"jnt-calendar-host\" *ngFor=\"let col of [1,2,3,4]\"></th>\n </tr>\n </ng-template>\n </thead>\n\n <tbody child-of=\"jnt-calendar-host\" >\n <ng-container *ngIf=\"view === viewType.date\">\n <tr child-of=\"jnt-calendar-host\" *ngFor=\"let w of weeks\"\n [attr.data-current-week]=\"(current | jntStartOfWeek) | jntIsEqual: (w.date | jntStartOfWeek)\">\n <td child-of=\"jnt-calendar-host\" data-day *ngFor=\"let d of w.days\"\n [attr.data-today]=\"d | jntIsToday\"\n [attr.data-current-month]=\"(d | jntStartOfMonth) | jntIsEqual: (period | jntStartOfMonth)\"\n [attr.data-selected-day]=\"(d | jntStartOfDay) | jntIsEqual: (current | jntStartOfDay)\"\n (click)=\"select(d)\" tabindex=\"0\">\n <ng-container *ngTemplateOutlet=\"!!dayTemplate ? dayTemplate: defaultDayTemplate;context:{date: d}\">\n </ng-container>\n </td>\n\n <td child-of=\"jnt-calendar-host\" data-divider *ngIf=\"!!metrics.length\"></td>\n\n <td child-of=\"jnt-calendar-host\" data-metric *ngFor=\"let m of metrics;let i = index;\">\n <ng-container *ngTemplateOutlet=\"metricTemplate;context:{metric: i, date: w.date}\">\n </ng-container>\n </td>\n </tr>\n </ng-container>\n\n <ng-container *ngIf=\"view === viewType.month\">\n <tr child-of=\"jnt-calendar-host\" *ngFor=\"let row of months\">\n <td child-of=\"jnt-calendar-host\" data-day data-day-extend *ngFor=\"let month of row\"\n [attr.data-current-month]=\"month | jntIsThisMonth\"\n [attr.data-selected-month]=\"(month | jntStartOfMonth) | jntIsEqual: (current | jntStartOfMonth)\"\n (click)=\"period = month; view = viewType.date\">\n {{month | jntFormat: 'LLL'}}\n </td>\n </tr>\n </ng-container>\n\n <ng-container *ngIf=\"view === viewType.year\">\n <tr child-of=\"jnt-calendar-host\" *ngFor=\"let row of years\">\n <td child-of=\"jnt-calendar-host\" data-day data-day-extend data-year *ngFor=\"let year of row\"\n [attr.data-current-year]=\"year | jntIsThisYear\"\n [attr.data-selected-year]=\"(year | jntStartOfYear) | jntIsEqual: (current | jntStartOfYear)\"\n (click)=\"period = year; view = viewType.month\">\n {{year | jntFormat: 'yyyy'}}\n </td>\n </tr>\n </ng-container>\n\n </tbody>\n </table>\n <jnt-stack child-of=\"jnt-calendar-host\" *ngIf=\"features | includes : ui.feature.today\" [align]=\"ui.align.center\">\n <jnt-button child-of=\"jnt-calendar-host\" [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n [icon]=\"ui.icons.today\"\n text=\"Today\"\n (click)=\"today()\">\n </jnt-button>\n </jnt-stack>\n</jnt-stack>\n\n<ng-template #defaultDayTemplate let-date=\"date\">\n <div child-of=\"jnt-calendar-host\" data-default>{{date | jntGetDate}}</div>\n</ng-template>",
providers: __spread([
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return CalendarComponent_1; }),
multi: true
}
], I18N_PROVIDERS)
}),
__metadata("design:paramtypes", [NGXLogger,
JunteUIConfig])
], CalendarComponent);
return CalendarComponent;
}());
export { CalendarComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2Zvcm1zL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxPQUFPLEVBQUUsU0FBUyxFQUNsQixRQUFRLEVBQ1IsUUFBUSxFQUNSLFFBQVEsRUFDUixPQUFPLEVBQ1AsV0FBVyxFQUNYLFdBQVcsRUFDWCxTQUFTLEVBQ1QsUUFBUSxFQUNULE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFM0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVuRSxJQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDMUIsSUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLElBQU0sU0FBUyxHQUFHLENBQUMs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QUFDO1lBQ1gsV0FBVyxFQUFFLG9CQUFvQjtZQUNqQyxJQUFJLEVBQUUsU0FBUztZQUNmLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLENBQUM7UUFDRCxXQUFXLENBQUMsb0JBQW9CLENBQUM7UUFDakMsS0FBSyxFQUFFOzt1REFDUztJQU9qQjtRQUxDLFdBQVcsQ0FBQztZQUNYLFdBQVcsRUFBRSxrQ0FBa0M7WUFDL0MsSUFBSSxFQUFFLE1BQU07U0FDYixDQUFDO1FBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQztrQ0FDSSxJQUFJO3lDQUFKLElBQUk7bURBS3RCO0lBVXFCO1FBQXJCLFlBQVksQ0FBQyxNQUFNLENBQUM7O3FEQUFpQztJQXJFM0MsaUJBQWlCO1FBWjdCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxjQUFjO1lBQ3hCLDh2TEFBMkM7WUFDM0MsU0FBUztnQkFDUDtvQkFDRSxPQUFPLEVBQUUsaUJBQWlCO29CQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxtQkFBaUIsRUFBakIsQ0FBaUIsQ0FBQztvQkFDaEQsS0FBSyxFQUFFLElBQUk7aUJBQ1o7ZUFDRSxjQUFjLENBQ2xCO1NBQ0YsQ0FBQzt5Q0F3RTRCLFNBQVM7WUFDVixhQUFhO09BeEU3QixpQkFBaUIsQ0FvSjdCO0lBQUQsd0JBQUM7Q0FBQSxBQXBKRCxJQW9KQztTQXBKWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGFkZERheXMsIGFkZE1vbnRocyxcbiAgYWRkV2Vla3MsXG4gIGFkZFllYXJzLFxuICBnZXRNb250aCxcbiAgZ2V0WWVhcixcbiAgaXNTYW1lTW9udGgsXG4gIHN0YXJ0T2ZXZWVrLFxuICBzdWJNb250aHMsXG4gIHN1YlllYXJzXG59IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IE5HWExvZ2dlciB9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHsgSnVudGVVSUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBQcm9wZXJ0eUFwaSB9IGZyb20gJy4uLy4uL2NvcmUvZGVjb3JhdG9ycy9hcGknO1xuaW1wb3J0IHsgRmVhdHVyZSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvZmVhdHVyZSc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvdWknO1xuaW1wb3J0IHsgSTE4Tl9QUk9WSURFUlMgfSBmcm9tICcuLi8uLi9jb3JlL2kxOG4vcHJvdmlkZXJzJztcbmltcG9ydCB7IFBlcmlvZCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdG9kYXkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFdlZWtNZXRyaWNDb21wb25lbnQgfSBmcm9tICcuL3dlZWsvd2Vlay1tZXRyaWMuY29tcG9uZW50JztcblxuY29uc3QgV0VFS1NfRElTUExBWUVEID0gNjtcbmNvbnN0IERBWVNfSU5fV0VFSyA9IDc7XG5jb25zdCBEQVRFX1JPV1MgPSAzO1xuY29uc3QgREFURV9DT0xTID0gNDtcblxuZW51bSBWaWV3VHlwZSB7XG4gIGRhdGUgPSAnZGF0ZScsXG4gIHllYXIgPSAneWVhcicsXG4gIG1vbnRoID0gJ21vbnRoJ1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdqbnQtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuZW5jYXBzdWxhdGVkLmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENhbGVuZGFyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICAuLi5JMThOX1BST1ZJREVSU1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhvc3QnKVxuICByZWFkb25seSBob3N0ID0gJ2pudC1jYWxlbmRhci1ob3N0JztcblxuICB1aSA9IFVJO1xuXG4gIHByaXZhdGUgX3BlcmlvZDogRGF0ZSA9IHRvZGF5KCk7XG5cbiAgY3VycmVudDogRGF0ZTtcblxuICB3ZWVrcyA9IFtdO1xuICBtb250aHMgPSBbXTtcbiAgeWVhcnMgPSBbXTtcbiAgdmlld1R5cGUgPSBWaWV3VHlwZTtcbiAgdmlldzogVmlld1R5cGUgPSBWaWV3VHlwZS5kYXRlO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdDYWxlbmRhciBmZWF0dXJlcycsXG4gICAgcGF0aDogJ3VpLmZlYXR1cmUnLFxuICAgIG9wdGlvbnM6IFtGZWF0dXJlLnRvZGF5XVxuICB9KVxuICBASW5wdXQoKVxuICBmZWF0dXJlczogRmVhdHVyZVtdID0gW107XG5cbiAgQENvbnRlbnRDaGlsZHJlbihXZWVrTWV0cmljQ29tcG9uZW50KVxuICBtZXRyaWNzOiBRdWVyeUxpc3Q8V2Vla01ldHJpY0NvbXBvbmVudD47XG5cbiAgQENvbnRlbnRDaGlsZCgnY2FsZW5kYXJEYXlUZW1wbGF0ZScpXG4gIGRheVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2NhbGVuZGFyTWV0cmljVGVtcGxhdGUnKVxuICBtZXRyaWNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAT3V0cHV0KClcbiAgdXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8UGVyaW9kPigpO1xuXG4gIEBPdXRwdXQoKVxuICBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnU2V0IGRpc2FibGVkIHN0YXRlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogJ2ZhbHNlJyxcbiAgfSlcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtZGlzYWJsZWQnKVxuICBASW5wdXQoKVxuICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTZXQgY3VycmVudCBtb250aCBmb3IgZGlzcGxheWluZycsXG4gICAgdHlwZTogJ0RhdGUnXG4gIH0pXG4gIEBJbnB1dCgnbW9udGgnKVxuICBzZXQgcGVyaW9kKHBlcmlvZDogRGF0ZSkge1xuICAgIGlmICghaXNTYW1lTW9udGgodGhpcy5fcGVyaW9kLCBwZXJpb2QpKSB7XG4gICAgICB0aGlzLl9wZXJpb2QgPSBwZXJpb2Q7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwZXJpb2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BlcmlvZDtcbiAgfVxuXG4gIG9uQ2hhbmdlOiAoZGF0ZTogRGF0ZSkgPT4gdm9pZCA9ICgpID0+IHRoaXMubG9nZ2VyLmRlYnVnKCd2YWx1ZSBhY2Nlc3NvciBpcyBub3QgcmVnaXN0ZXJlZCcpO1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB0aGlzLmxvZ2dlci5kZWJ1ZygndmFsdWUgYWNjZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgcmVnaXN0ZXJPbkNoYW5nZSA9IGZuID0+IHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgcmVnaXN0ZXJPblRvdWNoZWQgPSBmbiA9PiB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICBASG9zdExpc3RlbmVyKCdibHVyJykgb25CbHVyID0gKCkgPT4gdGhpcy5vblRvdWNoZWQoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyLFxuICAgICAgICAgICAgICBwdWJsaWMgY29uZmlnOiBKdW50ZVVJQ29uZmlnKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50ID0gZGF0ZTtcbiAgICB0aGlzLnBlcmlvZCA9IGRhdGUgfHwgdG9kYXkoKTtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgc2VsZWN0KGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLmN1cnJlbnQgPSBkYXRlO1xuICAgIHRoaXMub25DaGFuZ2UoZGF0ZSk7XG4gICAgdGhpcy5zZWxlY3RlZC5lbWl0KGRhdGUpO1xuICB9XG5cbiAgdG9kYXkoKSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLnBlcmlvZCA9IG5vdztcbiAgICB0aGlzLnNlbGVjdChub3cpO1xuICB9XG5cbiAgYWRkKCkge1xuICAgIGlmKHRoaXMudmlldyA9PT0gVmlld1R5cGUuZGF0ZSkge1xuICAgICAgdGhpcy5wZXJpb2QgPSBhZGRNb250aHModGhpcy5wZXJpb2QsIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy52aWV3ID09PSBWaWV3VHlwZS5tb250aCkge1xuICAgICAgdGhpcy5wZXJpb2QgPSBhZGRZZWFycyh0aGlzLnBlcmlvZCwgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wZXJpb2QgPSBhZGRZZWFycyh0aGlzLnBlcmlvZCwgMTIpXG4gICAgfVxuICB9XG5cbiAgc3ViKCkge1xuICAgIGlmKHRoaXMudmlldyA9PT0gVmlld1R5cGUuZGF0ZSkge1xuICAgICAgdGhpcy5wZXJpb2QgPSBzdWJNb250aHModGhpcy5wZXJpb2QsIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy52aWV3ID09PSBWaWV3VHlwZS5tb250aCkge1xuICAgICAgdGhpcy5wZXJpb2QgPSBzdWJZZWFycyh0aGlzLnBlcmlvZCwgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wZXJpb2QgPSBzdWJZZWFycyh0aGlzLnBlcmlvZCwgMTIpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGUoKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZShnZXRZZWFyKHRoaXMucGVyaW9kKSwgZ2V0TW9udGgodGhpcy5wZXJpb2QpLCAxKSxcbiAgICAgIHtsb2NhbGU6IHRoaXMuY29uZmlnLmxvY2FsZS5kZm5zfSk7XG4gICAgbGV0IGRhdGUgPSBzdGFydDtcbiAgICB0aGlzLndlZWtzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBXRUVLU19ESVNQTEFZRUQ7IGkrKykge1xuICAgICAgdGhpcy53ZWVrc1tpXSA9IHtkYXlzOiBbXSwgZGF0ZTogZGF0ZX07XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IERBWVNfSU5fV0VFSzsgaisrKSB7XG4gICAgICAgIHRoaXMud2Vla3NbaV0uZGF5c1tqXSA9IGFkZERheXMoZGF0ZSwgaik7XG4gICAgICB9XG4gICAgICBkYXRlID0gYWRkV2Vla3MoZGF0ZSwgMSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlZC5lbWl0KHtzdGFydDogc3RhcnQsIGVuZDogZGF0ZX0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEQVRFX1JPV1M7IGkrKykge1xuICAgICAgdGhpcy5tb250aHNbaV0gPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgREFURV9DT0xTOyBqKyspIHtcbiAgICAgICAgdGhpcy5tb250aHNbaV0ucHVzaChuZXcgRGF0ZShnZXRZZWFyKHRoaXMucGVyaW9kKSwgaSAqIERBVEVfQ09MUyArIGosIDEpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERBVEVfUk9XUzsgaSsrKSB7XG4gICAgICB0aGlzLnllYXJzW2ldID0gW107XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IERBVEVfQ09MUzsgaisrKSB7XG4gICAgICAgIHRoaXMueWVhcnNbaV0ucHVzaChuZXcgRGF0ZShnZXRZZWFyKHRoaXMucGVyaW9kKSAtIDQgKyBpICogREFURV9DT0xTICsgaiwgaSAqIERBVEVfQ09MUyArIGosIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==