truly-ui
Version:
Web Components for Desktop Applications.
131 lines (129 loc) • 22.4 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { Component, Output, EventEmitter, Input, } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../i18n/i18n.service";
import * as i2 from "@angular/common";
import * as i3 from "../navigator/navigator";
import * as i4 from "../button/button";
import * as i5 from "./parts/calendar-days/calendar-days";
import * as i6 from "./parts/calendar-months/calendar-months";
import * as i7 from "./parts/calendar-years/calendar-years";
export class TlCalendar {
constructor(i18nService) {
this.i18nService = i18nService;
this.date = new Date();
this.holidays = [];
this.width = '260px';
this.todayButton = true;
this.borders = false;
this.height = '260px';
this.selectDay = new EventEmitter();
this.today = new EventEmitter();
this.doubleClick = new EventEmitter();
this.selectedPanel = 'days';
this.todayDescription = this.i18nService.getLocale().Calendar.today;
this.dayOfWeek = this.i18nService.getLocale().Calendar.dayOfWeek;
}
ngOnInit() {
}
get typeNavigator() {
switch (this.selectedPanel) {
case 'days':
return 'monthyear';
case 'months':
return 'year';
case 'years':
return 'rangeyear';
}
}
onSelectMonth($event) {
this.selectedPanel = 'days';
this.date = $event;
}
onClickNavigator($event) {
this.currentRange = $event.rangeYear;
switch (this.selectedPanel) {
case 'days':
this.selectedPanel = 'months';
break;
case 'months':
this.selectedPanel = 'years';
}
}
getObjectDate() {
return {
day: this.date.getDate(),
month: this.date.getMonth(),
year: this.date.getFullYear(),
fullDate: this.date
};
}
clickToday() {
this.selectedPanel = 'days';
this.date = new Date();
this.today.emit(this.getObjectDate());
}
onSelectDay($event) {
this.date = $event;
this.selectDay.emit(this.getObjectDate());
}
onSelectYear($event) {
this.selectedPanel = 'months';
this.date = $event;
}
onClickPrevious($event) {
this.currentRange = $event.rangeYear;
if (this.selectedPanel !== 'years') {
this.date = $event.fullDate;
}
}
onClickNext($event) {
this.currentRange = $event.rangeYear;
if (this.selectedPanel !== 'years') {
this.date = $event.fullDate;
}
}
}
/** @nocollapse */ TlCalendar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlCalendar, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlCalendar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlCalendar, selector: "tl-calendar", inputs: { date: "date", holidays: "holidays", width: "width", todayButton: "todayButton", borders: "borders", height: "height" }, outputs: { selectDay: "selectDay", today: "today", doubleClick: "doubleClick" }, ngImport: i0, template: "<div class=\"ui-wrapper-calendar\">\n <div class=\"ui-table-calendar\" [style.height]=\"height\" [style.width]=\"width\">\n <div class=\"ui-calendar-header\">\n <tl-navigator\n [date]=\"date\"\n [withBorder]=\"false\"\n (clickPrevious)=\"onClickPrevious($event)\"\n (clickNavigator)=\"onClickNavigator($event)\"\n (clickNext)=\"onClickNext($event)\"\n [width]=\"todayButton ? 'calc(' + width + ' / 2 - 20px)' : 'calc(' + width + ' - 80px)'\"\n [type]=\"typeNavigator\">\n </tl-navigator>\n <tl-button (click)=\"clickToday()\"\n style=\"margin-left: 5px;\"\n [outline]=\"true\"\n *ngIf=\"todayButton\"\n [text]=\"todayDescription\"\n [color]=\"'primary'\">\n </tl-button>\n </div>\n <div class=\"ui-calendar-week\">\n <ng-container *ngIf=\"selectedPanel === 'days'\">\n <span class=\"ui-header-item\" *ngFor=\"let item of dayOfWeek\">{{item}}</span>\n </ng-container>\n </div>\n <div class=\"ui-calendar-body\" [style.height]=\"'calc(' + height + ' - 80px)'\">\n <tl-days *ngIf=\"selectedPanel === 'days'\"\n (selectDay)=\"onSelectDay($event)\"\n [borders]=\"borders\"\n [holidays]=\"holidays\"\n [currentDate]=\"date\">\n </tl-days>\n <tl-months *ngIf=\"selectedPanel === 'months'\"\n (selectMonth)=\"onSelectMonth($event)\"\n [currentDate]=\"date\">\n </tl-months>\n <tl-years *ngIf=\"selectedPanel === 'years'\"\n (selectYear)=\"onSelectYear($event)\"\n [currentRange]=\"currentRange\"\n [currentDate]=\"date\">\n </tl-years>\n </div>\n </div>\n</div>\n", styles: [".ui-table-calendar{position:relative;display:flex;align-items:flex-start;justify-content:flex-start;flex-flow:column}.ui-table-calendar>.ui-calendar-header{display:flex;align-items:center;padding:10px;width:100%;height:50px;box-sizing:border-box;justify-content:space-between}.ui-table-calendar>.ui-calendar-week{height:25px;display:flex;align-items:center;justify-content:center;width:100%}.ui-table-calendar>.ui-calendar-week>.ui-header-item{width:100%;font-variant:all-petite-caps;font-size:1em;font-weight:600;padding:0 4px;text-align:center}.ui-table-calendar>.ui-calendar-body{display:flex;align-items:center;justify-content:center;width:100%;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.TlNavigator, selector: "tl-navigator", inputs: ["width", "height", "type", "date", "range", "withBorder", "color"], outputs: ["clickPrevious", "clickNext", "clickNavigator"] }, { kind: "component", type: i4.TlButton, selector: "tl-button", inputs: ["text", "iconAddonBefore", "iconAddonAfter", "iconBeforeText", "iconAfterText", "height", "width", "disabled", "flatBorder", "colorIconBefore", "colorIconAfter", "template", "outline", "color", "loaderColor", "isLoading", "indexShortcut", "textLoading"], outputs: ["selected"] }, { kind: "component", type: i5.TlCalendarDays, selector: "tl-days", inputs: ["currentDate", "holidays", "borders", "width", "height"], outputs: ["selectDay", "doubleClick"] }, { kind: "component", type: i6.TlCalendarMonths, selector: "tl-months", inputs: ["currentDate"], outputs: ["selectMonth"] }, { kind: "component", type: i7.TlCalendarYears, selector: "tl-years", inputs: ["currentDate", "currentRange"], outputs: ["selectYear"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlCalendar, decorators: [{
type: Component,
args: [{ selector: 'tl-calendar', template: "<div class=\"ui-wrapper-calendar\">\n <div class=\"ui-table-calendar\" [style.height]=\"height\" [style.width]=\"width\">\n <div class=\"ui-calendar-header\">\n <tl-navigator\n [date]=\"date\"\n [withBorder]=\"false\"\n (clickPrevious)=\"onClickPrevious($event)\"\n (clickNavigator)=\"onClickNavigator($event)\"\n (clickNext)=\"onClickNext($event)\"\n [width]=\"todayButton ? 'calc(' + width + ' / 2 - 20px)' : 'calc(' + width + ' - 80px)'\"\n [type]=\"typeNavigator\">\n </tl-navigator>\n <tl-button (click)=\"clickToday()\"\n style=\"margin-left: 5px;\"\n [outline]=\"true\"\n *ngIf=\"todayButton\"\n [text]=\"todayDescription\"\n [color]=\"'primary'\">\n </tl-button>\n </div>\n <div class=\"ui-calendar-week\">\n <ng-container *ngIf=\"selectedPanel === 'days'\">\n <span class=\"ui-header-item\" *ngFor=\"let item of dayOfWeek\">{{item}}</span>\n </ng-container>\n </div>\n <div class=\"ui-calendar-body\" [style.height]=\"'calc(' + height + ' - 80px)'\">\n <tl-days *ngIf=\"selectedPanel === 'days'\"\n (selectDay)=\"onSelectDay($event)\"\n [borders]=\"borders\"\n [holidays]=\"holidays\"\n [currentDate]=\"date\">\n </tl-days>\n <tl-months *ngIf=\"selectedPanel === 'months'\"\n (selectMonth)=\"onSelectMonth($event)\"\n [currentDate]=\"date\">\n </tl-months>\n <tl-years *ngIf=\"selectedPanel === 'years'\"\n (selectYear)=\"onSelectYear($event)\"\n [currentRange]=\"currentRange\"\n [currentDate]=\"date\">\n </tl-years>\n </div>\n </div>\n</div>\n", styles: [".ui-table-calendar{position:relative;display:flex;align-items:flex-start;justify-content:flex-start;flex-flow:column}.ui-table-calendar>.ui-calendar-header{display:flex;align-items:center;padding:10px;width:100%;height:50px;box-sizing:border-box;justify-content:space-between}.ui-table-calendar>.ui-calendar-week{height:25px;display:flex;align-items:center;justify-content:center;width:100%}.ui-table-calendar>.ui-calendar-week>.ui-header-item{width:100%;font-variant:all-petite-caps;font-size:1em;font-weight:600;padding:0 4px;text-align:center}.ui-table-calendar>.ui-calendar-body{display:flex;align-items:center;justify-content:center;width:100%;overflow:hidden}\n"] }]
}], ctorParameters: function () { return [{ type: i1.I18nService }]; }, propDecorators: { date: [{
type: Input
}], holidays: [{
type: Input
}], width: [{
type: Input
}], todayButton: [{
type: Input
}], borders: [{
type: Input
}], height: [{
type: Input
}], selectDay: [{
type: Output
}], today: [{
type: Output
}], doubleClick: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9jYWxlbmRhci9jYWxlbmRhci50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2NhbGVuZGFyL2NhbGVuZGFyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsT0FBTyxFQUNMLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLFlBQVksRUFBRSxLQUFLLEdBQ3BCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFnQnZCLE1BQU0sT0FBTyxVQUFVO0lBNEJyQixZQUFvQixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQTFCbkMsU0FBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFFbEIsYUFBUSxHQUEyQixFQUFFLENBQUM7UUFFdEMsVUFBSyxHQUFHLE9BQU8sQ0FBQztRQUVoQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWhCLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFFaEIsY0FBUyxHQUFxQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWpFLFVBQUssR0FBcUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU3RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFcEMsa0JBQWEsR0FBZ0MsTUFBTSxDQUFDO1FBSXBELHFCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUUvRCxjQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO0lBR25FLENBQUM7SUFFRCxRQUFRO0lBQ1IsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLFFBQVEsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUMxQixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxXQUFXLENBQUM7WUFDckIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLEtBQUssT0FBTztnQkFDVixPQUFPLFdBQVcsQ0FBQztTQUN0QjtJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsTUFBTTtRQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBTTtRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDckMsUUFBUSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQzFCLEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztnQkFDOUIsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN4QixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFNO1FBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBTTtRQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQU07UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxPQUFPLEVBQUU7WUFDbEMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFNO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssT0FBTyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztTQUM3QjtJQUNILENBQUM7OzJIQWxHVSxVQUFVOytHQUFWLFVBQVUsc1FDeEN2Qiw4d0RBNENBOzRGREphLFVBQVU7a0JBTHRCLFNBQVM7K0JBQ0UsYUFBYTtrR0FNZCxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsS0FBSztzQkFBZCxNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIE1JVCBMaWNlbnNlXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTkgVGVtYWluZm8gU29mdHdhcmVcblxuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7XG4gIENvbXBvbmVudCwgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtJMThuU2VydmljZX0gZnJvbSAnLi4vaTE4bi9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHtDYWxlbmRhckhvbGlkYXl9IGZyb20gJy4vaW50ZXJmYWNlcy9jYWxlbmRhci1ob2xpZGF5LmludGVyZmFjZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0RGF0ZUNhbGVuZGFyIHtcbiAgZGF5OiBudW1iZXI7XG4gIG1vbnRoOiBudW1iZXI7XG4gIHllYXI6IG51bWJlcjtcbiAgZnVsbERhdGU6IERhdGU7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RsLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRsQ2FsZW5kYXIgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGRhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gIEBJbnB1dCgpIGhvbGlkYXlzOiBBcnJheTxDYWxlbmRhckhvbGlkYXk+ID0gW107XG5cbiAgQElucHV0KCkgd2lkdGggPSAnMjYwcHgnO1xuXG4gIEBJbnB1dCgpIHRvZGF5QnV0dG9uID0gdHJ1ZTtcblxuICBASW5wdXQoKSBib3JkZXJzID0gZmFsc2U7XG5cbiAgQElucHV0KCkgaGVpZ2h0ID0gJzI2MHB4JztcblxuICBAT3V0cHV0KCkgc2VsZWN0RGF5OiBFdmVudEVtaXR0ZXI8T2JqZWN0RGF0ZUNhbGVuZGFyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgdG9kYXk6IEV2ZW50RW1pdHRlcjxPYmplY3REYXRlQ2FsZW5kYXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBkb3VibGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgc2VsZWN0ZWRQYW5lbDogJ2RheXMnIHwgJ21vbnRocycgfCAneWVhcnMnID0gJ2RheXMnO1xuXG4gIHB1YmxpYyBjdXJyZW50UmFuZ2U7XG5cbiAgcHVibGljIHRvZGF5RGVzY3JpcHRpb24gPSB0aGlzLmkxOG5TZXJ2aWNlLmdldExvY2FsZSgpLkNhbGVuZGFyLnRvZGF5O1xuXG4gIHB1YmxpYyBkYXlPZldlZWsgPSB0aGlzLmkxOG5TZXJ2aWNlLmdldExvY2FsZSgpLkNhbGVuZGFyLmRheU9mV2VlaztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gIH1cblxuICBnZXQgdHlwZU5hdmlnYXRvcigpIHtcbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRQYW5lbCkge1xuICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIHJldHVybiAnbW9udGh5ZWFyJztcbiAgICAgIGNhc2UgJ21vbnRocyc6XG4gICAgICAgIHJldHVybiAneWVhcic7XG4gICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIHJldHVybiAncmFuZ2V5ZWFyJztcbiAgICB9XG4gIH1cblxuICBvblNlbGVjdE1vbnRoKCRldmVudCkge1xuICAgIHRoaXMuc2VsZWN0ZWRQYW5lbCA9ICdkYXlzJztcbiAgICB0aGlzLmRhdGUgPSAkZXZlbnQ7XG4gIH1cblxuICBvbkNsaWNrTmF2aWdhdG9yKCRldmVudCkge1xuICAgIHRoaXMuY3VycmVudFJhbmdlID0gJGV2ZW50LnJhbmdlWWVhcjtcbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRQYW5lbCkge1xuICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQYW5lbCA9ICdtb250aHMnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vbnRocyc6XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQYW5lbCA9ICd5ZWFycyc7XG4gICAgfVxuICB9XG5cbiAgZ2V0T2JqZWN0RGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGF5OiB0aGlzLmRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgbW9udGg6IHRoaXMuZGF0ZS5nZXRNb250aCgpLFxuICAgICAgeWVhcjogdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBmdWxsRGF0ZTogdGhpcy5kYXRlXG4gICAgfTtcbiAgfVxuXG4gIGNsaWNrVG9kYXkoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFBhbmVsID0gJ2RheXMnO1xuICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy50b2RheS5lbWl0KHRoaXMuZ2V0T2JqZWN0RGF0ZSgpKTtcbiAgfVxuXG4gIG9uU2VsZWN0RGF5KCRldmVudCkge1xuICAgIHRoaXMuZGF0ZSA9ICRldmVudDtcbiAgICB0aGlzLnNlbGVjdERheS5lbWl0KHRoaXMuZ2V0T2JqZWN0RGF0ZSgpKTtcbiAgfVxuXG4gIG9uU2VsZWN0WWVhcigkZXZlbnQpIHtcbiAgICB0aGlzLnNlbGVjdGVkUGFuZWwgPSAnbW9udGhzJztcbiAgICB0aGlzLmRhdGUgPSAkZXZlbnQ7XG4gIH1cblxuICBvbkNsaWNrUHJldmlvdXMoJGV2ZW50KSB7XG4gICAgdGhpcy5jdXJyZW50UmFuZ2UgPSAkZXZlbnQucmFuZ2VZZWFyO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkUGFuZWwgIT09ICd5ZWFycycpIHtcbiAgICAgIHRoaXMuZGF0ZSA9ICRldmVudC5mdWxsRGF0ZTtcbiAgICB9XG4gIH1cblxuICBvbkNsaWNrTmV4dCgkZXZlbnQpIHtcbiAgICB0aGlzLmN1cnJlbnRSYW5nZSA9ICRldmVudC5yYW5nZVllYXI7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRQYW5lbCAhPT0gJ3llYXJzJykge1xuICAgICAgdGhpcy5kYXRlID0gJGV2ZW50LmZ1bGxEYXRlO1xuICAgIH1cbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwidWktd3JhcHBlci1jYWxlbmRhclwiPlxuICA8ZGl2IGNsYXNzPVwidWktdGFibGUtY2FsZW5kYXJcIiBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFwiIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ1aS1jYWxlbmRhci1oZWFkZXJcIj5cbiAgICAgIDx0bC1uYXZpZ2F0b3JcbiAgICAgICAgW2RhdGVdPVwiZGF0ZVwiXG4gICAgICAgIFt3aXRoQm9yZGVyXT1cImZhbHNlXCJcbiAgICAgICAgKGNsaWNrUHJldmlvdXMpPVwib25DbGlja1ByZXZpb3VzKCRldmVudClcIlxuICAgICAgICAoY2xpY2tOYXZpZ2F0b3IpPVwib25DbGlja05hdmlnYXRvcigkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrTmV4dCk9XCJvbkNsaWNrTmV4dCgkZXZlbnQpXCJcbiAgICAgICAgW3dpZHRoXT1cInRvZGF5QnV0dG9uID8gJ2NhbGMoJyArIHdpZHRoICsgJyAvIDIgLSAyMHB4KScgOiAnY2FsYygnICsgd2lkdGggKyAnIC0gODBweCknXCJcbiAgICAgICAgW3R5cGVdPVwidHlwZU5hdmlnYXRvclwiPlxuICAgICAgPC90bC1uYXZpZ2F0b3I+XG4gICAgICA8dGwtYnV0dG9uIChjbGljayk9XCJjbGlja1RvZGF5KClcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgW291dGxpbmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICpuZ0lmPVwidG9kYXlCdXR0b25cIlxuICAgICAgICAgICAgICAgICBbdGV4dF09XCJ0b2RheURlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgW2NvbG9yXT1cIidwcmltYXJ5J1wiPlxuICAgICAgPC90bC1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInVpLWNhbGVuZGFyLXdlZWtcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFBhbmVsID09PSAnZGF5cydcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1oZWFkZXItaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRheU9mV2Vla1wiPnt7aXRlbX19PC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInVpLWNhbGVuZGFyLWJvZHlcIiBbc3R5bGUuaGVpZ2h0XT1cIidjYWxjKCcgKyBoZWlnaHQgKyAnIC0gODBweCknXCI+XG4gICAgICA8dGwtZGF5cyAqbmdJZj1cInNlbGVjdGVkUGFuZWwgPT09ICdkYXlzJ1wiXG4gICAgICAgICAgICAgICAoc2VsZWN0RGF5KT1cIm9uU2VsZWN0RGF5KCRldmVudClcIlxuICAgICAgICAgICAgICAgW2JvcmRlcnNdPVwiYm9yZGVyc1wiXG4gICAgICAgICAgICAgICBbaG9saWRheXNdPVwiaG9saWRheXNcIlxuICAgICAgICAgICAgICAgW2N1cnJlbnREYXRlXT1cImRhdGVcIj5cbiAgICAgIDwvdGwtZGF5cz5cbiAgICAgIDx0bC1tb250aHMgKm5nSWY9XCJzZWxlY3RlZFBhbmVsID09PSAnbW9udGhzJ1wiXG4gICAgICAgICAgICAgICAgIChzZWxlY3RNb250aCk9XCJvblNlbGVjdE1vbnRoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICBbY3VycmVudERhdGVdPVwiZGF0ZVwiPlxuICAgICAgPC90bC1tb250aHM+XG4gICAgICA8dGwteWVhcnMgKm5nSWY9XCJzZWxlY3RlZFBhbmVsID09PSAneWVhcnMnXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0WWVhcik9XCJvblNlbGVjdFllYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2N1cnJlbnRSYW5nZV09XCJjdXJyZW50UmFuZ2VcIlxuICAgICAgICAgICAgICAgIFtjdXJyZW50RGF0ZV09XCJkYXRlXCI+XG4gICAgICA8L3RsLXllYXJzPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19