ngx-ui-hero
Version:
Simple, fast and reliable utilities for Angular.
167 lines • 34.4 kB
JavaScript
import { Component, EventEmitter, Inject, Input, Optional, Output, ViewChild } from '@angular/core';
import { NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgModel } from '@angular/forms';
import { ElementBase } from '../../base/element-base';
import { INPUT_FORMS_CONFIG } from '../../input-forms-config.constants';
import { INPUT_MONTH_YEAR_LANGUAGES } from './input-month-year.constants';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "../../../ui/directives/click-outside.directive";
import * as i4 from "ngx-bootstrap/tooltip";
import * as i5 from "../input-validations/input-validations.component";
let identifier = 0;
export class InputMonthYearComponent extends ElementBase {
constructor(validators, asyncValidators, config) {
super(validators, asyncValidators, config);
this.config = config;
this.placeholder = 'Select...';
this.language = 'en';
this.format = 'MMM/yyyy';
this.onChange = new EventEmitter();
this.displayMode = EnumDisplayMode.Month;
this.identifier = `input-month-year-${identifier++}`;
}
ngOnInit() {
if (this.config.monthYear) {
Object.assign(this, this.config.monthYear);
}
this.init();
}
ngDoCheck() {
this.handleInitialValue();
}
ToggleDropDown(event, value) {
if ((value == false && !this.showDropdown) || (value == undefined && this.disabled))
return;
this.displayMode = EnumDisplayMode.Month;
this.handleSelectedYear();
if (value == undefined) {
if (this.showDropdown) {
this.setComboTouched();
}
this.showDropdown = !this.showDropdown;
}
else {
if (!value && this.showDropdown) {
this.setComboTouched();
}
this.showDropdown = value;
}
}
IncrementSelectedYear() {
if (this.disabled)
return;
this.selectedYear++;
}
DecrementSelectedYear() {
if (this.disabled)
return;
this.selectedYear--;
}
GetMonthAvaiable(index) {
if (!this.monthsAvailable || (this.monthsAvailable && this.monthsAvailable.filter(x => x.year == this.selectedYear).length == 0) || (this.monthsAvailable && this.monthsAvailable.filter(x => x.year == this.selectedYear).length > 0 && !this.monthsAvailable.filter(x => x.year == this.selectedYear)[0].monthsAvaiable[index].value))
return true;
else
return false;
}
SelectMonth(month) {
if (this.disabled) {
this.showDropdown = false;
return;
}
if (!this.GetMonthAvaiable(month)) {
return;
}
let newDate = new Date(this.selectedYear, month, 1, 0, 0, 0, 0);
this.value = newDate;
this.showDropdown = false;
this.setComboTouched();
this.onChange.emit(this.value);
}
Clear(event) {
this.value = null;
this.comboTouched = true;
this.showDropdown = false;
this.onChange.emit(this.value);
event.stopPropagation();
}
OnComboPressed(event) {
if (event.keyCode == 13) {
this.ToggleDropDown(null);
event.preventDefault();
}
}
init() {
this.initLanguageDefinitions();
}
initLanguageDefinitions() {
this.languageDefinitions = INPUT_MONTH_YEAR_LANGUAGES.get(this.language);
}
handleSelectedYear() {
if (this.value) {
this.selectedYear = this.value.getFullYear();
}
else {
this.selectedYear = new Date().getFullYear();
}
}
handleInitialValue() {
if (this.value && (typeof this.value == "string" || this.value instanceof String)) {
let data = new Date(this.value);
data.setHours(0);
data.setMinutes(0);
data.setSeconds(0);
data.setMilliseconds(0);
this.writeValue(data);
}
}
setComboTouched() {
this.comboTouched = true;
}
}
InputMonthYearComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputMonthYearComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputMonthYearComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputMonthYearComponent, selector: "input-month-year", inputs: { placeholder: "placeholder", language: "language", format: "format", monthsAvailable: "monthsAvailable" }, outputs: { onChange: "onChange" }, providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: InputMonthYearComponent,
multi: true
}], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [id]=\"identifier\" class=\"ui-month-year\">\n <label *ngIf=\"label\">\n {{label}}\n <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n </label>\n\n <input type=\"date\" class=\"d-none\" [(ngModel)]=\"value\" />\n <div class=\"combobox d-flex align-items-center justify-content-between\" \n [ngClass]=\"{\n 'has-validations': showValidations,\n 'open': showDropdown, \n 'disabled': disabled,\n 'is-valid': !showDropdown && !disabled && comboTouched && !(invalid | async),\n 'is-invalid': !showDropdown && !disabled && comboTouched && (invalid | async)\n }\"\n (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n <span *ngIf=\"!value\">{{placeholder}}</span>\n <span *ngIf=\"value\">{{value | date:format}}</span>\n\n <i class=\"fa fa-times btn-clear-selection ml-auto\" *ngIf=\"value && !disabled\" (click)=\"Clear($event)\"></i>\n <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showDropdown, 'fa-caret-up': showDropdown}\"></i>\n </div>\n\n <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\">\n <div class=\"months-container\" *ngIf=\"displayMode == 0\">\n <div class=\"toolbar d-flex align-items-center justify-content-between\">\n <button class=\"btn btn-light\" (click)=\"DecrementSelectedYear()\"><i class=\"fa fa-chevron-left\"></i></button>\n <button class=\"btn btn-light\">{{selectedYear}}</button>\n <button class=\"btn btn-light\" (click)=\"IncrementSelectedYear()\"><i class=\"fa fa-chevron-right\"></i></button>\n </div>\n\n <ul class=\"d-flex flex-wrap\">\n <li *ngFor=\"let item of languageDefinitions.months; let i = index;\" \n (click)=\"SelectMonth(i)\"\n [ngClass]=\"{'selected': value?.getMonth() == i && GetMonthAvaiable(i),\n 'disabled': !GetMonthAvaiable(i) }\">\n {{item | slice:0:3}}\n </li>\n </ul>\n </div>\n </div>\n</div>\n\n<input-validations\n *ngIf=\"showValidations && !disabled && comboTouched && (invalid | async)\"\n [messages]=\"failures | async\">\n</input-validations>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-month-year{position:relative}.ui-month-year *{-webkit-user-select:none;user-select:none}.ui-month-year>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:6px}.ui-month-year>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-month-year>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-month-year>.combobox>i.fa-times{color:#9b9b9b;cursor:pointer}.ui-month-year>.combobox.open{border-radius:6px 6px 6px 0}.ui-month-year>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-month-year>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-month-year>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-month-year>.combobox.has-validations.is-valid{border-color:#28a745}.ui-month-year>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-month-year>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 6px 6px;position:absolute;top:71px;left:0;width:250px;z-index:20;margin-top:-1px}.ui-month-year>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-month-year>.dropdown-options ul{margin:0;padding:5px 4px 5px 5px}.ui-month-year>.dropdown-options ul li{list-style:none;width:33.33%;height:25%;padding:10px;text-align:center;border-radius:4px}.ui-month-year>.dropdown-options ul li>span{cursor:pointer}.ui-month-year>.dropdown-options ul li.selected{color:#007bff;font-weight:600}.ui-month-year>.dropdown-options ul li.disabled{color:#dedede;text-decoration:line-through}.ui-month-year>.dropdown-options ul li:hover{background-color:#007bff;color:#fff;cursor:pointer}.btn-clear-selection{cursor:pointer;color:#495057!important;padding:8px 10px;margin-top:-5px!important;margin-bottom:-5px!important;border-radius:3px}.btn-clear-selection:hover{background-color:#e7e7e7}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i5.InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputMonthYearComponent, decorators: [{
type: Component,
args: [{ selector: 'input-month-year', providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: InputMonthYearComponent,
multi: true
}], template: "<div [id]=\"identifier\" class=\"ui-month-year\">\n <label *ngIf=\"label\">\n {{label}}\n <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n </label>\n\n <input type=\"date\" class=\"d-none\" [(ngModel)]=\"value\" />\n <div class=\"combobox d-flex align-items-center justify-content-between\" \n [ngClass]=\"{\n 'has-validations': showValidations,\n 'open': showDropdown, \n 'disabled': disabled,\n 'is-valid': !showDropdown && !disabled && comboTouched && !(invalid | async),\n 'is-invalid': !showDropdown && !disabled && comboTouched && (invalid | async)\n }\"\n (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n <span *ngIf=\"!value\">{{placeholder}}</span>\n <span *ngIf=\"value\">{{value | date:format}}</span>\n\n <i class=\"fa fa-times btn-clear-selection ml-auto\" *ngIf=\"value && !disabled\" (click)=\"Clear($event)\"></i>\n <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showDropdown, 'fa-caret-up': showDropdown}\"></i>\n </div>\n\n <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\">\n <div class=\"months-container\" *ngIf=\"displayMode == 0\">\n <div class=\"toolbar d-flex align-items-center justify-content-between\">\n <button class=\"btn btn-light\" (click)=\"DecrementSelectedYear()\"><i class=\"fa fa-chevron-left\"></i></button>\n <button class=\"btn btn-light\">{{selectedYear}}</button>\n <button class=\"btn btn-light\" (click)=\"IncrementSelectedYear()\"><i class=\"fa fa-chevron-right\"></i></button>\n </div>\n\n <ul class=\"d-flex flex-wrap\">\n <li *ngFor=\"let item of languageDefinitions.months; let i = index;\" \n (click)=\"SelectMonth(i)\"\n [ngClass]=\"{'selected': value?.getMonth() == i && GetMonthAvaiable(i),\n 'disabled': !GetMonthAvaiable(i) }\">\n {{item | slice:0:3}}\n </li>\n </ul>\n </div>\n </div>\n</div>\n\n<input-validations\n *ngIf=\"showValidations && !disabled && comboTouched && (invalid | async)\"\n [messages]=\"failures | async\">\n</input-validations>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-month-year{position:relative}.ui-month-year *{-webkit-user-select:none;user-select:none}.ui-month-year>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:6px}.ui-month-year>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-month-year>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-month-year>.combobox>i.fa-times{color:#9b9b9b;cursor:pointer}.ui-month-year>.combobox.open{border-radius:6px 6px 6px 0}.ui-month-year>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-month-year>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-month-year>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-month-year>.combobox.has-validations.is-valid{border-color:#28a745}.ui-month-year>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-month-year>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 6px 6px;position:absolute;top:71px;left:0;width:250px;z-index:20;margin-top:-1px}.ui-month-year>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-month-year>.dropdown-options ul{margin:0;padding:5px 4px 5px 5px}.ui-month-year>.dropdown-options ul li{list-style:none;width:33.33%;height:25%;padding:10px;text-align:center;border-radius:4px}.ui-month-year>.dropdown-options ul li>span{cursor:pointer}.ui-month-year>.dropdown-options ul li.selected{color:#007bff;font-weight:600}.ui-month-year>.dropdown-options ul li.disabled{color:#dedede;text-decoration:line-through}.ui-month-year>.dropdown-options ul li:hover{background-color:#007bff;color:#fff;cursor:pointer}.btn-clear-selection{cursor:pointer;color:#495057!important;padding:8px 10px;margin-top:-5px!important;margin-bottom:-5px!important;border-radius:3px}.btn-clear-selection:hover{background-color:#e7e7e7}\n"] }]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NG_VALIDATORS]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NG_ASYNC_VALIDATORS]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [INPUT_FORMS_CONFIG]
}] }]; }, propDecorators: { placeholder: [{
type: Input
}], language: [{
type: Input
}], format: [{
type: Input
}], monthsAvailable: [{
type: Input
}], model: [{
type: ViewChild,
args: [NgModel, { static: true }]
}], onChange: [{
type: Output
}] } });
export var EnumDisplayMode;
(function (EnumDisplayMode) {
EnumDisplayMode[EnumDisplayMode["Month"] = 0] = "Month";
EnumDisplayMode[EnumDisplayMode["Year"] = 1] = "Year";
})(EnumDisplayMode || (EnumDisplayMode = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbW9udGgteWVhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdWktaGVyby9zcmMvbGliL2lucHV0LWZvcm1zL2NvbXBvbmVudHMvaW5wdXQtbW9udGgteWVhci9pbnB1dC1tb250aC15ZWFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC11aS1oZXJvL3NyYy9saWIvaW5wdXQtZm9ybXMvY29tcG9uZW50cy9pbnB1dC1tb250aC15ZWFyL2lucHV0LW1vbnRoLXllYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQVcsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEksT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7QUFJMUUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBWW5CLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxXQUFpQjtJQWlCNUQsWUFDcUMsVUFBMEIsRUFDcEIsZUFBb0MsRUFDeEMsTUFBd0I7UUFFN0QsS0FBSyxDQUFDLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFGTixXQUFNLEdBQU4sTUFBTSxDQUFrQjtRQW5CdEQsZ0JBQVcsR0FBWSxXQUFXLENBQUM7UUFDbkMsYUFBUSxHQUFZLElBQUks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QUFJLE1BQU07MkJBQUMsYUFBYTs7MEJBQ2hDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1COzswQkFDdEMsTUFBTTsyQkFBRSxrQkFBa0I7NENBbkJwQixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQzhCLEtBQUs7c0JBQXhDLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDeEIsUUFBUTtzQkFBakIsTUFBTTs7QUFnSVQsTUFBTSxDQUFOLElBQVksZUFFWDtBQUZELFdBQVksZUFBZTtJQUN6Qix1REFBSyxDQUFBO0lBQUUscURBQUksQ0FBQTtBQUNiLENBQUMsRUFGVyxlQUFlLEtBQWYsZUFBZSxRQUUxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRG9DaGVjaywgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfQVNZTkNfVkFMSURBVE9SUywgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEVsZW1lbnRCYXNlIH0gZnJvbSAnLi4vLi4vYmFzZS9lbGVtZW50LWJhc2UnO1xuaW1wb3J0IHsgQXN5bmNWYWxpZGF0b3JBcnJheSwgVmFsaWRhdG9yQXJyYXkgfSBmcm9tICcuLi8uLi9iYXNlL3ZhbGlkYXRlJztcbmltcG9ydCB7IElucHV0Rm9ybXNDb25maWcgfSBmcm9tICcuLi8uLi9pbnB1dC1mb3Jtcy1jb25maWcnO1xuaW1wb3J0IHsgSU5QVVRfRk9STVNfQ09ORklHIH0gZnJvbSAnLi4vLi4vaW5wdXQtZm9ybXMtY29uZmlnLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBJTlBVVF9NT05USF9ZRUFSX0xBTkdVQUdFUyB9IGZyb20gJy4vaW5wdXQtbW9udGgteWVhci5jb25zdGFudHMnO1xuaW1wb3J0IHsgSW5wdXRNb250aFllYXJMYW5ndWFnZSB9IGZyb20gJy4vaW5wdXQtbW9udGgteWVhci5sYW5ndWFnZSc7XG5pbXBvcnQgeyBNb250aFllYXJBdmFpYWJsZU1vZGVsIH0gZnJvbSAnLi9tb250aC15ZWFyLWF2YWlhYmxlJztcblxubGV0IGlkZW50aWZpZXIgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpbnB1dC1tb250aC15ZWFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LW1vbnRoLXllYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbnB1dC1tb250aC15ZWFyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3tcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogSW5wdXRNb250aFllYXJDb21wb25lbnQsXG4gICAgbXVsdGk6IHRydWVcbiAgfV1cbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRNb250aFllYXJDb21wb25lbnQgZXh0ZW5kcyBFbGVtZW50QmFzZTxEYXRlPiBpbXBsZW1lbnRzIE9uSW5pdCwgRG9DaGVjayB7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyPzogc3RyaW5nID0gJ1NlbGVjdC4uLic7XG4gIEBJbnB1dCgpIGxhbmd1YWdlPzogc3RyaW5nID0gJ2VuJztcbiAgQElucHV0KCkgZm9ybWF0Pzogc3RyaW5nID0gJ01NTS95eXl5JztcbiAgQElucHV0KCkgbW9udGhzQXZhaWxhYmxlPzogQXJyYXk8TW9udGhZZWFyQXZhaWFibGVNb2RlbD47XG4gIEBWaWV3Q2hpbGQoTmdNb2RlbCwge3N0YXRpYzogdHJ1ZX0pIG1vZGVsOiBOZ01vZGVsO1xuICBAT3V0cHV0KCkgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG5cbiAgbGFuZ3VhZ2VEZWZpbml0aW9uczogSW5wdXRNb250aFllYXJMYW5ndWFnZTtcbiAgY29tYm9Ub3VjaGVkOiBib29sZWFuO1xuICBzaG93RHJvcGRvd246IGJvb2xlYW47XG4gIGludGVybmFsTW9kZWw6IERhdGU7XG4gIHNlbGVjdGVkWWVhcjogbnVtYmVyO1xuICBkaXNwbGF5TW9kZTogRW51bURpc3BsYXlNb2RlID0gRW51bURpc3BsYXlNb2RlLk1vbnRoO1xuXG4gIHB1YmxpYyBpZGVudGlmaWVyID0gYGlucHV0LW1vbnRoLXllYXItJHtpZGVudGlmaWVyKyt9YDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHZhbGlkYXRvcnM6IFZhbGlkYXRvckFycmF5LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykgYXN5bmNWYWxpZGF0b3JzOiBBc3luY1ZhbGlkYXRvckFycmF5LFxuICAgIEBJbmplY3QoIElOUFVUX0ZPUk1TX0NPTkZJRyApIHB1YmxpYyBjb25maWc6IElucHV0Rm9ybXNDb25maWcsXG4gICkge1xuICAgIHN1cGVyKHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycywgY29uZmlnKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tb250aFllYXIpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgdGhpcy5jb25maWcubW9udGhZZWFyKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVJbml0aWFsVmFsdWUoKTtcbiAgfVxuXG4gIFRvZ2dsZURyb3BEb3duKGV2ZW50OiBNb3VzZUV2ZW50LCB2YWx1ZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoKHZhbHVlID09IGZhbHNlICYmICF0aGlzLnNob3dEcm9wZG93bikgfHwgKHZhbHVlID09IHVuZGVmaW5lZCAmJiB0aGlzLmRpc2FibGVkKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5kaXNwbGF5TW9kZSA9IEVudW1EaXNwbGF5TW9kZS5Nb250aDtcbiAgICB0aGlzLmhhbmRsZVNlbGVjdGVkWWVhcigpO1xuXG4gICAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCkgeyBcbiAgICAgIGlmICh0aGlzLnNob3dEcm9wZG93bikge1xuICAgICAgICB0aGlzLnNldENvbWJvVG91Y2hlZCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9ICF0aGlzLnNob3dEcm9wZG93bjsgICAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF2YWx1ZSAmJiB0aGlzLnNob3dEcm9wZG93bikge1xuICAgICAgICB0aGlzLnNldENvbWJvVG91Y2hlZCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIEluY3JlbWVudFNlbGVjdGVkWWVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2VsZWN0ZWRZZWFyKys7XG4gIH1cbiAgRGVjcmVtZW50U2VsZWN0ZWRZZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3RlZFllYXItLTtcbiAgfVxuXG4gIEdldE1vbnRoQXZhaWFibGUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5tb250aHNBdmFpbGFibGUgfHwgKHRoaXMubW9udGhzQXZhaWxhYmxlICYmIHRoaXMubW9udGhzQXZhaWxhYmxlLmZpbHRlcih4ID0+IHgueWVhciA9PSB0aGlzLnNlbGVjdGVkWWVhcikubGVuZ3RoID09IDApIHx8ICh0aGlzLm1vbnRoc0F2YWlsYWJsZSAmJiB0aGlzLm1vbnRoc0F2YWlsYWJsZS5maWx0ZXIoeCA9PiB4LnllYXIgPT0gdGhpcy5zZWxlY3RlZFllYXIpLmxlbmd0aCA+IDAgJiYgIXRoaXMubW9udGhzQXZhaWxhYmxlLmZpbHRlcih4ID0+IHgueWVhciA9PSB0aGlzLnNlbGVjdGVkWWVhcilbMF0ubW9udGhzQXZhaWFibGVbaW5kZXhdLnZhbHVlKSkgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBlbHNlIFxuICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gIH1cblxuICBTZWxlY3RNb250aChtb250aDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKCF0aGlzLkdldE1vbnRoQXZhaWFibGUobW9udGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZFllYXIsIG1vbnRoLCAxLCAwLCAwLCAwLCAwKTtcbiAgICB0aGlzLnZhbHVlID0gbmV3RGF0ZTtcbiAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xuICAgIHRoaXMuc2V0Q29tYm9Ub3VjaGVkKCk7XG5cbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gIH1cbiAgQ2xlYXIoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIHRoaXMuY29tYm9Ub3VjaGVkID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG4gIE9uQ29tYm9QcmVzc2VkKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMTMpIHtcbiAgICAgIHRoaXMuVG9nZ2xlRHJvcERvd24obnVsbCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRMYW5ndWFnZURlZmluaXRpb25zKCk7XG4gIH1cbiAgcHJpdmF0ZSBpbml0TGFuZ3VhZ2VEZWZpbml0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmxhbmd1YWdlRGVmaW5pdGlvbnMgPSBJTlBVVF9NT05USF9ZRUFSX0xBTkdVQUdFUy5nZXQodGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlbGVjdGVkWWVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFllYXIgPSB0aGlzLnZhbHVlLmdldEZ1bGxZZWFyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGhhbmRsZUluaXRpYWxWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52YWx1ZSAmJiAodHlwZW9mIHRoaXMudmFsdWUgPT0gXCJzdHJpbmdcIiB8fCB0aGlzLnZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkge1xuICAgICAgbGV0IGRhdGEgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgIGRhdGEuc2V0SG91cnMoMCk7XG4gICAgICBkYXRhLnNldE1pbnV0ZXMoMCk7XG4gICAgICBkYXRhLnNldFNlY29uZHMoMCk7XG4gICAgICBkYXRhLnNldE1pbGxpc2Vjb25kcygwKTtcblxuICAgICAgdGhpcy53cml0ZVZhbHVlKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29tYm9Ub3VjaGVkKCk6IHZvaWQge1xuICAgIHRoaXMuY29tYm9Ub3VjaGVkID0gdHJ1ZTtcbiAgfVxufVxuXG5leHBvcnQgZW51bSBFbnVtRGlzcGxheU1vZGUge1xuICBNb250aCwgWWVhciBcbn1cbiIsIjxkaXYgW2lkXT1cImlkZW50aWZpZXJcIiBjbGFzcz1cInVpLW1vbnRoLXllYXJcIj5cbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIj5cbiAgICB7e2xhYmVsfX1cbiAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLXN5bWJvbFwiICpuZ0lmPVwiaXNSZXF1aXJlZFwiPiAqPC9zcGFuPlxuICAgIDxpIGNsYXNzPVwiZmEgZmEtcXVlc3Rpb24tY2lyY2xlIG1sLTJcIiB0b29sdGlwPVwie3toZWxwfX1cIiBjb250YWluZXI9XCJib2R5XCIgKm5nSWY9XCJoZWxwXCI+PC9pPlxuICA8L2xhYmVsPlxuXG4gIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZC1ub25lXCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIC8+XG4gIDxkaXYgY2xhc3M9XCJjb21ib2JveCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCIgXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdoYXMtdmFsaWRhdGlvbnMnOiBzaG93VmFsaWRhdGlvbnMsXG4gICAgICAgICdvcGVuJzogc2hvd0Ryb3Bkb3duLCBcbiAgICAgICAgJ2Rpc2FibGVkJzogZGlzYWJsZWQsXG4gICAgICAgICdpcy12YWxpZCc6ICFzaG93RHJvcGRvd24gJiYgIWRpc2FibGVkICYmIGNvbWJvVG91Y2hlZCAmJiAhKGludmFsaWQgfCBhc3luYyksXG4gICAgICAgICdpcy1pbnZhbGlkJzogIXNob3dEcm9wZG93biAmJiAhZGlzYWJsZWQgJiYgY29tYm9Ub3VjaGVkICYmIChpbnZhbGlkIHwgYXN5bmMpXG4gICAgICB9XCJcbiAgICAgIChjbGljayk9XCJUb2dnbGVEcm9wRG93bigkZXZlbnQpXCIgKGtleXVwKT1cIk9uQ29tYm9QcmVzc2VkKCRldmVudClcIiB0YWJpbmRleD1cIjBcIj5cblxuICAgICAgPHNwYW4gKm5nSWY9XCIhdmFsdWVcIj57e3BsYWNlaG9sZGVyfX08L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cInZhbHVlXCI+e3t2YWx1ZSB8IGRhdGU6Zm9ybWF0fX08L3NwYW4+XG5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXMgYnRuLWNsZWFyLXNlbGVjdGlvbiBtbC1hdXRvXCIgKm5nSWY9XCJ2YWx1ZSAmJiAhZGlzYWJsZWRcIiAoY2xpY2spPVwiQ2xlYXIoJGV2ZW50KVwiPjwvaT5cbiAgICAgIDxpIGNsYXNzPVwiZmFcIiBbbmdDbGFzc109XCJ7J2ZhLWNhcmV0LWRvd24nOiAhc2hvd0Ryb3Bkb3duLCAnZmEtY2FyZXQtdXAnOiBzaG93RHJvcGRvd259XCI+PC9pPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tb3B0aW9ucyBzaGFkb3cgZmFkZUluRG93blwiICpuZ0lmPVwic2hvd0Ryb3Bkb3duXCIgKGNsaWNrT3V0c2lkZSk9XCJUb2dnbGVEcm9wRG93bigkZXZlbnQsIGZhbHNlKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtb250aHMtY29udGFpbmVyXCIgKm5nSWY9XCJkaXNwbGF5TW9kZSA9PSAwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgKGNsaWNrKT1cIkRlY3JlbWVudFNlbGVjdGVkWWVhcigpXCI+PGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWxlZnRcIj48L2k+PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCI+e3tzZWxlY3RlZFllYXJ9fTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIChjbGljayk9XCJJbmNyZW1lbnRTZWxlY3RlZFllYXIoKVwiPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodFwiPjwvaT48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8dWwgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwXCI+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsYW5ndWFnZURlZmluaXRpb25zLm1vbnRoczsgbGV0IGkgPSBpbmRleDtcIiBcbiAgICAgICAgICAoY2xpY2spPVwiU2VsZWN0TW9udGgoaSlcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQnOiB2YWx1ZT8uZ2V0TW9udGgoKSA9PSBpICYmIEdldE1vbnRoQXZhaWFibGUoaSksXG4gICAgICAgICAgICAgICAgICAgICAgJ2Rpc2FibGVkJzogIUdldE1vbnRoQXZhaWFibGUoaSkgfVwiPlxuICAgICAgICAgIHt7aXRlbSB8IHNsaWNlOjA6M319XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48aW5wdXQtdmFsaWRhdGlvbnNcbiAgKm5nSWY9XCJzaG93VmFsaWRhdGlvbnMgJiYgIWRpc2FibGVkICYmIGNvbWJvVG91Y2hlZCAmJiAoaW52YWxpZCB8IGFzeW5jKVwiXG4gIFttZXNzYWdlc109XCJmYWlsdXJlcyB8IGFzeW5jXCI+XG48L2lucHV0LXZhbGlkYXRpb25zPlxuXG48c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJkZXNjcmlwdGlvblwiPnt7ZGVzY3JpcHRpb259fTwvc21hbGw+XG4iXX0=