UNPKG

ddata-ui-input

Version:

DData UI Input module, components, models & services

183 lines 26.7 kB
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { faCalendar } from '@fortawesome/free-solid-svg-icons'; import { BaseModel, DdataCoreModule } from 'ddata-core'; import * as moment from 'moment'; import { InputHelperService } from '../../services/input/helper/input-helper.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@fortawesome/angular-fontawesome"; import * as i3 from "@ng-bootstrap/ng-bootstrap"; export class DdataInputDateComponent { constructor(changeDetector) { this.changeDetector = changeDetector; this.helperService = DdataCoreModule.InjectorInstance.get(InputHelperService); // tslint:disable: variable-name this._field = ''; this._title = ''; this._label = ''; this._placeholder = ''; this._prepend = ''; this._append = ''; this._isRequired = false; this._model = new BaseModel(); this._moment = moment; this.disabled = false; this.inputClass = 'form-control'; this.labelClass = 'col-12 col-md-3 px-0 col-form-label'; this.inputBlockClass = 'col-12 d-flex px-0'; this.inputBlockExtraClass = 'col-md-9'; this.showLabel = true; this.autoFocus = false; this.isViewOnly = false; this.viewOnlyClass = 'form-control border-0 bg-light'; this.buttonClass = 'input-group-prepend btn btn-light mb-0'; this.wrapperClass = 'd-flex flex-wrap'; this.format = 'YYYY-MM-DD'; this.separator = '-'; this.labelApply = 'OK'; this.labelCancel = 'Cancel'; this.position = 'center'; this.direction = 'down'; this.showIcon = true; this.autoApply = true; this.singleDatePicker = true; this.changed = new EventEmitter(); this.icon = { calendar: faCalendar, }; this.random = this.helperService.randChars(); this.selectedValue = !!this.model[this._field] ? this.model[this._field] : ''; } set moment(value) { if (!value) { value = moment; } this._moment = value; } set model(value) { if (!value) { value = new BaseModel(); } this._model = value; if (!!this._model && !!this._model.fields[this._field]) { this._title = this.helperService.getTitle(this._model, this._field); this._placeholder = this.helperService.getPlaceholder(this._model, this._field); this._prepend = this.helperService.getPrepend(this._model, this._field); this._append = this.helperService.getAppend(this._model, this._field); this._label = this.helperService.getLabel(this._model, this._field); } if (!!this._model && !!this._model.validationRules[this._field]) { this._isRequired = this.helperService.isRequired(this._model, this._field); } } get model() { return this._model; } set field(value) { if (value === 'undefined') { value = 'isValid'; } this._field = value; } set append(value) { if (value === 'undefined') { value = ''; } this._append = value; } set prepend(value) { if (value === 'undefined') { value = ''; } this._prepend = value; } set labelText(value) { if (value === 'undefined') { value = ''; } this._label = value; } ngOnInit() { if (!!this.model[this._field]) { this.selectedValue = this.model[this._field]; } if (this.autoFocus) { this.inputBox.nativeElement.focus(); } } change(value) { this.selectedValue = value.year + '-' + value.month.toString().padStart(2, '0') + '-' + value.day.toString().padStart(2, '0'); this.model[this._field] = this.selectedValue; const isValid = this.helperService.validateField(this._model, this._field); if (isValid) { this.changed.emit(this._model); } } typeChange(event) { this._model[this._field] = event.target.value; } } DdataInputDateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataInputDateComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); DdataInputDateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DdataInputDateComponent, selector: "dd-input-date", inputs: { moment: "moment", model: "model", field: "field", append: "append", prepend: "prepend", labelText: "labelText", disabled: "disabled", inputClass: "inputClass", labelClass: "labelClass", inputBlockClass: "inputBlockClass", inputBlockExtraClass: "inputBlockExtraClass", showLabel: "showLabel", autoFocus: "autoFocus", isViewOnly: "isViewOnly", viewOnlyClass: "viewOnlyClass", buttonClass: "buttonClass", wrapperClass: "wrapperClass", format: "format", separator: "separator", labelApply: "labelApply", labelCancel: "labelCancel", position: "position", direction: "direction", showIcon: "showIcon", autoApply: "autoApply", singleDatePicker: "singleDatePicker" }, outputs: { changed: "changed" }, viewQueries: [{ propertyName: "inputBox", first: true, predicate: ["inputBox"], descendants: true }], ngImport: i0, template: "<div [class]=\"wrapperClass\">\n <label [class]=\"labelClass\" [for]=\"_field + '_' + random\" *ngIf=\"showLabel\">\n {{ _label }}:\n <span *ngIf=\"_is_required\"> *</span>\n </label>\n\n <div [class]=\"inputBlockClass\" [ngClass]=\"showLabel ? inputBlockExtraClass : ''\">\n\n <div class=\"input-group-prepend\" *ngIf=\" _prepend != '' \">\n <div class=\"input-group-text\">{{ _prepend }}</div>\n </div>\n\n <ng-container *ngIf=\"!isViewOnly\">\n\n <input\n [class.invalid]=\"model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [disabled]=\"disabled\"\n [id]=\"_field + '_' + random\"\n [name]=\"_field + '_' + random\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [value]=\"model[_field]\"\n (dateSelect)=\"change($event)\"\n type=\"text\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (click)=\"d.toggle()\"\n (change)=\"typeChange($event)\">\n\n </ng-container>\n\n <ng-container *ngIf=\"isViewOnly\">\n <div [class]=\"viewOnlyClass\">{{ model[_field] }}</div>\n </ng-container>\n\n <label [class]=\"buttonClass\" *ngIf=\"!disabled && showIcon\" [for]=\"_field + '_' + random\">\n <fa-icon [icon]=\"icon.calendar\"></fa-icon>\n </label>\n\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n\n</div>\n", styles: [":host{position:relative;flex:1 1 auto}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataInputDateComponent, decorators: [{ type: Component, args: [{ selector: 'dd-input-date', template: "<div [class]=\"wrapperClass\">\n <label [class]=\"labelClass\" [for]=\"_field + '_' + random\" *ngIf=\"showLabel\">\n {{ _label }}:\n <span *ngIf=\"_is_required\"> *</span>\n </label>\n\n <div [class]=\"inputBlockClass\" [ngClass]=\"showLabel ? inputBlockExtraClass : ''\">\n\n <div class=\"input-group-prepend\" *ngIf=\" _prepend != '' \">\n <div class=\"input-group-text\">{{ _prepend }}</div>\n </div>\n\n <ng-container *ngIf=\"!isViewOnly\">\n\n <input\n [class.invalid]=\"model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [disabled]=\"disabled\"\n [id]=\"_field + '_' + random\"\n [name]=\"_field + '_' + random\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [value]=\"model[_field]\"\n (dateSelect)=\"change($event)\"\n type=\"text\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (click)=\"d.toggle()\"\n (change)=\"typeChange($event)\">\n\n </ng-container>\n\n <ng-container *ngIf=\"isViewOnly\">\n <div [class]=\"viewOnlyClass\">{{ model[_field] }}</div>\n </ng-container>\n\n <label [class]=\"buttonClass\" *ngIf=\"!disabled && showIcon\" [for]=\"_field + '_' + random\">\n <fa-icon [icon]=\"icon.calendar\"></fa-icon>\n </label>\n\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n\n</div>\n", styles: [":host{position:relative;flex:1 1 auto}\n"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { moment: [{ type: Input }], model: [{ type: Input }], field: [{ type: Input }], append: [{ type: Input }], prepend: [{ type: Input }], labelText: [{ type: Input }], disabled: [{ type: Input }], inputClass: [{ type: Input }], labelClass: [{ type: Input }], inputBlockClass: [{ type: Input }], inputBlockExtraClass: [{ type: Input }], showLabel: [{ type: Input }], autoFocus: [{ type: Input }], isViewOnly: [{ type: Input }], viewOnlyClass: [{ type: Input }], buttonClass: [{ type: Input }], wrapperClass: [{ type: Input }], format: [{ type: Input }], separator: [{ type: Input }], labelApply: [{ type: Input }], labelCancel: [{ type: Input }], position: [{ type: Input }], direction: [{ type: Input }], showIcon: [{ type: Input }], autoApply: [{ type: Input }], singleDatePicker: [{ type: Input }], changed: [{ type: Output }], inputBox: [{ type: ViewChild, args: ['inputBox'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZGF0YS11aS1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvZGF0ZS9kYXRlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RkYXRhLXVpLWlucHV0L3NyYy9saWIvY29tcG9uZW50cy9kYXRlL2RhdGUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRCxPQUFPLEVBQUUsU0FBUyxFQUFzQixlQUFlLEVBQW1CLE1BQU0sWUFBWSxDQUFDO0FBQzdGLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7OztBQU90RixNQUFNLE9BQU8sdUJBQXVCO0lBc0dsQyxZQUNVLGNBQWlDO1FBQWpDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQXRHM0Msa0JBQWEsR0FBZ0MsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBOEIsa0JBQWtCLENBQUMsQ0FBQztRQUVuSSxnQ0FBZ0M7UUFDaEMsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixXQUFNLEdBQW1ELElBQUksU0FB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QixLQUFLO2dCQU9PLFNBQVM7c0JBQXJCLEtBQUs7Z0JBT0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVJLE9BQU87c0JBQWhCLE1BQU07Z0JBRWdCLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZhQ2FsZW5kYXIgfSBmcm9tICdAZm9ydGF3ZXNvbWUvZnJlZS1zb2xpZC1zdmctaWNvbnMnO1xuaW1wb3J0IHsgTmdiRGF0ZSwgTmdiSW5wdXREYXRlcGlja2VyIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgQmFzZU1vZGVsLCBCYXNlTW9kZWxJbnRlcmZhY2UsIERkYXRhQ29yZU1vZHVsZSwgRmllbGRzSW50ZXJmYWNlIH0gZnJvbSAnZGRhdGEtY29yZSc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IElucHV0SGVscGVyU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2lucHV0L2hlbHBlci9pbnB1dC1oZWxwZXItc2VydmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW5wdXRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaW5wdXQvaGVscGVyL2lucHV0LWhlbHBlci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGQtaW5wdXQtZGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1pbnB1dC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERkYXRhSW5wdXREYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgaGVscGVyU2VydmljZTogSW5wdXRIZWxwZXJTZXJ2aWNlSW50ZXJmYWNlID0gRGRhdGFDb3JlTW9kdWxlLkluamVjdG9ySW5zdGFuY2UuZ2V0PElucHV0SGVscGVyU2VydmljZUludGVyZmFjZT4oSW5wdXRIZWxwZXJTZXJ2aWNlKTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZTogdmFyaWFibGUtbmFtZVxuICBfZmllbGQgPSAnJztcbiAgX3RpdGxlID0gJyc7XG4gIF9sYWJlbCA9ICcnO1xuICBfcGxhY2Vob2xkZXIgPSAnJztcbiAgX3ByZXBlbmQgPSAnJztcbiAgX2FwcGVuZCA9ICcnO1xuICBfaXNSZXF1aXJlZCA9IGZhbHNlO1xuICBfbW9kZWw6IEJhc2VNb2RlbEludGVyZmFjZTxhbnk+ICYgRmllbGRzSW50ZXJmYWNlPGFueT4gPSBuZXcgQmFzZU1vZGVsKCk7XG4gIF9tb21lbnQgPSBtb21lbnQ7XG5cbiAgQElucHV0KCkgc2V0IG1vbWVudCh2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdmFsdWUgPSBtb21lbnQ7XG4gICAgfVxuXG4gICAgdGhpcy5fbW9tZW50ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KCkgc2V0IG1vZGVsKHZhbHVlOiBCYXNlTW9kZWxJbnRlcmZhY2U8YW55PiAmIEZpZWxkc0ludGVyZmFjZTxhbnk+IHwgbnVsbCkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gbmV3IEJhc2VNb2RlbCgpO1xuICAgIH1cblxuICAgIHRoaXMuX21vZGVsID0gdmFsdWU7XG5cbiAgICBpZiAoISF0aGlzLl9tb2RlbCAmJiAhIXRoaXMuX21vZGVsLmZpZWxkc1t0aGlzLl9maWVsZF0pIHtcbiAgICAgIHRoaXMuX3RpdGxlID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldFRpdGxlKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRQbGFjZWhvbGRlcih0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgICAgdGhpcy5fcHJlcGVuZCA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRQcmVwZW5kKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9hcHBlbmQgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0QXBwZW5kKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9sYWJlbCA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRMYWJlbCh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgIH1cblxuICAgIGlmICghIXRoaXMuX21vZGVsICYmICEhdGhpcy5fbW9kZWwudmFsaWRhdGlvblJ1bGVzW3RoaXMuX2ZpZWxkXSkge1xuICAgICAgdGhpcy5faXNSZXF1aXJlZCA9IHRoaXMuaGVscGVyU2VydmljZS5pc1JlcXVpcmVkKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgfVxuICB9XG4gIGdldCBtb2RlbCgpOiBCYXNlTW9kZWxJbnRlcmZhY2U8YW55PiAmIEZpZWxkc0ludGVyZmFjZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gIH1cbiAgQElucHV0KCkgc2V0IGZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YWx1ZSA9ICdpc1ZhbGlkJztcbiAgICB9XG5cbiAgICB0aGlzLl9maWVsZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHNldCBhcHBlbmQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fYXBwZW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KCkgc2V0IHByZXBlbmQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJlcGVuZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHNldCBsYWJlbFRleHQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fbGFiZWwgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBpbnB1dENsYXNzID0gJ2Zvcm0tY29udHJvbCc7XG4gIEBJbnB1dCgpIGxhYmVsQ2xhc3MgPSAnY29sLTEyIGNvbC1tZC0zIHB4LTAgY29sLWZvcm0tbGFiZWwnO1xuICBASW5wdXQoKSBpbnB1dEJsb2NrQ2xhc3MgPSAnY29sLTEyIGQtZmxleCBweC0wJztcbiAgQElucHV0KCkgaW5wdXRCbG9ja0V4dHJhQ2xhc3MgPSAnY29sLW1kLTknO1xuICBASW5wdXQoKSBzaG93TGFiZWwgPSB0cnVlO1xuICBASW5wdXQoKSBhdXRvRm9jdXMgPSBmYWxzZTtcbiAgQElucHV0KCkgaXNWaWV3T25seSA9IGZhbHNlO1xuICBASW5wdXQoKSB2aWV3T25seUNsYXNzID0gJ2Zvcm0tY29udHJvbCBib3JkZXItMCBiZy1saWdodCc7XG4gIEBJbnB1dCgpIGJ1dHRvbkNsYXNzID0gJ2lucHV0LWdyb3VwLXByZXBlbmQgYnRuIGJ0bi1saWdodCBtYi0wJztcbiAgQElucHV0KCkgd3JhcHBlckNsYXNzID0gJ2QtZmxleCBmbGV4LXdyYXAnO1xuICBASW5wdXQoKSBmb3JtYXQgPSAnWVlZWS1NTS1ERCc7XG4gIEBJbnB1dCgpIHNlcGFyYXRvciA9ICctJztcbiAgQElucHV0KCkgbGFiZWxBcHBseSA9ICdPSyc7XG4gIEBJbnB1dCgpIGxhYmVsQ2FuY2VsID0gJ0NhbmNlbCc7XG4gIEBJbnB1dCgpIHBvc2l0aW9uOiAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCcgPSAnY2VudGVyJztcbiAgQElucHV0KCkgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nID0gJ2Rvd24nO1xuICBASW5wdXQoKSBzaG93SWNvbiA9IHRydWU7XG4gIEBJbnB1dCgpIGF1dG9BcHBseSA9IHRydWU7XG4gIEBJbnB1dCgpIHNpbmdsZURhdGVQaWNrZXIgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QmFzZU1vZGVsSW50ZXJmYWNlPGFueT4gJiBGaWVsZHNJbnRlcmZhY2U8YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXRCb3gnKSBpbnB1dEJveDogRWxlbWVudFJlZjtcblxuICBpY29uID0ge1xuICAgIGNhbGVuZGFyOiBmYUNhbGVuZGFyLFxuICB9O1xuICByYW5kb206IHN0cmluZyA9IHRoaXMuaGVscGVyU2VydmljZS5yYW5kQ2hhcnMoKTtcbiAgc2VsZWN0ZWRWYWx1ZSA9ICEhdGhpcy5tb2RlbFt0aGlzLl9maWVsZF0gPyB0aGlzLm1vZGVsW3RoaXMuX2ZpZWxkXSA6ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghIXRoaXMubW9kZWxbdGhpcy5fZmllbGRdKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB0aGlzLm1vZGVsW3RoaXMuX2ZpZWxkXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hdXRvRm9jdXMpIHtcbiAgICAgIHRoaXMuaW5wdXRCb3gubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG5cbiAgY2hhbmdlKHZhbHVlOiBOZ2JEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdmFsdWUueWVhciArICctJyArIHZhbHVlLm1vbnRoLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSArICctJyArIHZhbHVlLmRheS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgICB0aGlzLm1vZGVsW3RoaXMuX2ZpZWxkXSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcblxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLmhlbHBlclNlcnZpY2UudmFsaWRhdGVGaWVsZCh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuXG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KHRoaXMuX21vZGVsKTtcbiAgICB9XG4gIH1cblxuICB0eXBlQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlbFt0aGlzLl9maWVsZF0gPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cIndyYXBwZXJDbGFzc1wiPlxuICA8bGFiZWwgW2NsYXNzXT1cImxhYmVsQ2xhc3NcIiBbZm9yXT1cIl9maWVsZCArICdfJyArIHJhbmRvbVwiICpuZ0lmPVwic2hvd0xhYmVsXCI+XG4gICAge3sgX2xhYmVsIH19OlxuICAgIDxzcGFuICpuZ0lmPVwiX2lzX3JlcXVpcmVkXCI+ICo8L3NwYW4+XG4gIDwvbGFiZWw+XG5cbiAgPGRpdiBbY2xhc3NdPVwiaW5wdXRCbG9ja0NsYXNzXCIgW25nQ2xhc3NdPVwic2hvd0xhYmVsID8gaW5wdXRCbG9ja0V4dHJhQ2xhc3MgOiAnJ1wiPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXByZXBlbmRcIiAqbmdJZj1cIiBfcHJlcGVuZCAhPSAnJyBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+e3sgX3ByZXBlbmQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNWaWV3T25seVwiPlxuXG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIFtjbGFzcy5pbnZhbGlkXT1cIm1vZGVsLnZhbGlkYXRpb25FcnJvcnMuaW5jbHVkZXMoX2ZpZWxkKVwiXG4gICAgICAgICAgW2NsYXNzXT1cImlucHV0Q2xhc3NcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgW2lkXT1cIl9maWVsZCArICdfJyArIHJhbmRvbVwiXG4gICAgICAgICAgW25hbWVdPVwiX2ZpZWxkICsgJ18nICsgcmFuZG9tXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiX3BsYWNlaG9sZGVyXCJcbiAgICAgICAgICBbdGl0bGVdPVwiX3RpdGxlXCJcbiAgICAgICAgICBbdmFsdWVdPVwibW9kZWxbX2ZpZWxkXVwiXG4gICAgICAgICAgKGRhdGVTZWxlY3QpPVwiY2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBuZ2JEYXRlcGlja2VyXG4gICAgICAgICAgI2Q9XCJuZ2JEYXRlcGlja2VyXCJcbiAgICAgICAgICAoY2xpY2spPVwiZC50b2dnbGUoKVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ0eXBlQ2hhbmdlKCRldmVudClcIj5cblxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVmlld09ubHlcIj5cbiAgICAgIDxkaXYgW2NsYXNzXT1cInZpZXdPbmx5Q2xhc3NcIj57eyBtb2RlbFtfZmllbGRdIH19PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bGFiZWwgW2NsYXNzXT1cImJ1dHRvbkNsYXNzXCIgKm5nSWY9XCIhZGlzYWJsZWQgJiYgc2hvd0ljb25cIiBbZm9yXT1cIl9maWVsZCArICdfJyArIHJhbmRvbVwiPlxuICAgICAgPGZhLWljb24gW2ljb25dPVwiaWNvbi5jYWxlbmRhclwiPjwvZmEtaWNvbj5cbiAgICA8L2xhYmVsPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiICpuZ0lmPVwiX2FwcGVuZCAhPSAnJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIj57eyBfYXBwZW5kIH19PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48L2Rpdj5cbiJdfQ==