ddata-ui-input
Version:
DData UI Input module, components, models & services
168 lines • 27.7 kB
JavaScript
import { EventEmitter } from '@angular/core';
// tslint:disable: deprecation
import { Component, Input, ViewChild, Output } from '@angular/core';
import { BaseModel, DdataCoreModule } from 'ddata-core';
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 "@angular/forms";
export class DdataInputComponent {
constructor() {
this.helperService = DdataCoreModule.InjectorInstance.get(InputHelperService);
// tslint:disable: variable-name
this._field = '';
this._title = '';
this._label = '';
this._placeholder = '';
this._prepend = '';
this._append = '';
this._max = '';
this._isRequired = false;
this._model = new BaseModel();
this.disabled = false;
this.isViewOnly = false;
this.type = 'text';
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.viewOnlyClass = 'form-control border-0 bg-light';
this.wrapperClass = 'd-flex flex-wrap';
this.showLabel = true;
this.autoFocus = false;
this.enableCharacterCounter = false;
this.enableWordCounter = false;
this.maxLength = 255;
this.maxWords = 7;
this.wordCounterWarningMessage = '';
this.changed = new EventEmitter();
this.maxLengthReached = new EventEmitter();
this.random = this.helperService.randChars();
this.displayWordCounterWarning = false;
}
set model(value) {
// prevent undefined
if (!value) {
console.error('The input-box component get undefined model');
return;
}
this._model = value;
if (!this._model.fields) {
console.error(`Your ${this._model.model_name}'s 'fields' field is`, this._model.fields);
return;
}
if (!this._model.fields[this._field]) {
console.error(`The ${this._model.model_name}'s ${this._field} field is `, this._model.fields[this._field]);
return;
}
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() {
}
ngAfterViewInit() {
if (this.autoFocus) {
this.inputBox.nativeElement.focus();
}
}
validateField() {
const isValid = this.helperService.validateField(this._model, this._field);
if (isValid) {
this.changed.emit(this._model);
}
}
setWordCounterWarning(value) {
this.displayWordCounterWarning = value;
}
}
DdataInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
DdataInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DdataInputComponent, selector: "dd-input", inputs: { model: "model", field: "field", append: "append", prepend: "prepend", labelText: "labelText", disabled: "disabled", isViewOnly: "isViewOnly", type: "type", inputClass: "inputClass", labelClass: "labelClass", inputBlockClass: "inputBlockClass", inputBlockExtraClass: "inputBlockExtraClass", viewOnlyClass: "viewOnlyClass", wrapperClass: "wrapperClass", showLabel: "showLabel", autoFocus: "autoFocus", enableCharacterCounter: "enableCharacterCounter", enableWordCounter: "enableWordCounter", maxLength: "maxLength", maxWords: "maxWords", wordCounterWarningMessage: "wordCounterWarningMessage" }, outputs: { changed: "changed", maxLengthReached: "maxLengthReached" }, 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=\"_isRequired\"> *</span>\n </label>\n <div [class]=\"inputBlockClass\" [ngClass]=\"showLabel ? inputBlockExtraClass : ''\">\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 <input\n [class.invalid]=\"model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [(ngModel)]=\"model[_field]\"\n [id]=\"_field + '_' + random\"\n [attr.name]=\"_field + '_' + random\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [disabled]=\"disabled\"\n [type]=\"type\"\n [autocomplete]=\"random\"\n (keyup)=\"validateField()\"\n #inputBox>\n <ng-container *ngIf=\"enableCharacterCounter\">\n <character-counter [currentLength]=\"model[_field]?.length || 0\" [maxLength]=\"maxLength\"></character-counter>\n </ng-container>\n <ng-container *ngIf=\"enableWordCounter\">\n <app-word-counter\n [currentLength]=\"model[_field]\"\n [maxLength]=\"maxWords\"\n (maxLentghReached)=\"showWordCounterWarning = $event\"\n ></app-word-counter>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"isViewOnly\">\n <div\n [id]=\"_field + '_' + random\"\n [class]=\"viewOnlyClass\"\n [attr.name]=\"_field + '_' + random\"\n [title]=\"_title\">\n {{ model[_field] }}\n </div>\n </ng-container>\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n <div *ngIf=\"displayWordCounterWarning && wordCounterWarningMessage !== ''\" class=\"d-flex pb-2\">\n <div class=\"col-12 col-md-7 offset-md-3 bg-warning p-2 rounded\">\n {{ wordCounterWarningMessage }}\n </div>\n </div>\n</div>\n", styles: [".autocomplete-list-container{position:absolute;display:inline-block;top:100%;width:100%;transition:all .2s}.autocomplete-spinner-place{top:calc(100% + 40px);transition:all .2s}.autocomplete-list{position:absolute;border:1px solid #d4d4d4;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0;box-shadow:0 5px 10px #0000004d}.autocomplete-list-item{padding:10px;cursor:pointer;background-color:#fff;border-bottom:1px solid #d4d4d4}.autocomplete-list-item:hover{background-color:#e9e9e9}.active{background-color:#1e90ff!important;color:#fff}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataInputComponent, decorators: [{
type: Component,
args: [{ selector: 'dd-input', template: "<div [class]=\"wrapperClass\">\n <label [class]=\"labelClass\" [for]=\"_field + '_' + random\" *ngIf=\"showLabel\">\n {{ _label }}:\n <span *ngIf=\"_isRequired\"> *</span>\n </label>\n <div [class]=\"inputBlockClass\" [ngClass]=\"showLabel ? inputBlockExtraClass : ''\">\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 <input\n [class.invalid]=\"model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [(ngModel)]=\"model[_field]\"\n [id]=\"_field + '_' + random\"\n [attr.name]=\"_field + '_' + random\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [disabled]=\"disabled\"\n [type]=\"type\"\n [autocomplete]=\"random\"\n (keyup)=\"validateField()\"\n #inputBox>\n <ng-container *ngIf=\"enableCharacterCounter\">\n <character-counter [currentLength]=\"model[_field]?.length || 0\" [maxLength]=\"maxLength\"></character-counter>\n </ng-container>\n <ng-container *ngIf=\"enableWordCounter\">\n <app-word-counter\n [currentLength]=\"model[_field]\"\n [maxLength]=\"maxWords\"\n (maxLentghReached)=\"showWordCounterWarning = $event\"\n ></app-word-counter>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"isViewOnly\">\n <div\n [id]=\"_field + '_' + random\"\n [class]=\"viewOnlyClass\"\n [attr.name]=\"_field + '_' + random\"\n [title]=\"_title\">\n {{ model[_field] }}\n </div>\n </ng-container>\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n <div *ngIf=\"displayWordCounterWarning && wordCounterWarningMessage !== ''\" class=\"d-flex pb-2\">\n <div class=\"col-12 col-md-7 offset-md-3 bg-warning p-2 rounded\">\n {{ wordCounterWarningMessage }}\n </div>\n </div>\n</div>\n", styles: [".autocomplete-list-container{position:absolute;display:inline-block;top:100%;width:100%;transition:all .2s}.autocomplete-spinner-place{top:calc(100% + 40px);transition:all .2s}.autocomplete-list{position:absolute;border:1px solid #d4d4d4;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0;box-shadow:0 5px 10px #0000004d}.autocomplete-list-item{padding:10px;cursor:pointer;background-color:#fff;border-bottom:1px solid #d4d4d4}.autocomplete-list-item:hover{background-color:#e9e9e9}.active{background-color:#1e90ff!important;color:#fff}\n"] }]
}], ctorParameters: function () { return []; }, propDecorators: { model: [{
type: Input
}], field: [{
type: Input
}], append: [{
type: Input
}], prepend: [{
type: Input
}], labelText: [{
type: Input
}], disabled: [{
type: Input
}], isViewOnly: [{
type: Input
}], type: [{
type: Input
}], inputClass: [{
type: Input
}], labelClass: [{
type: Input
}], inputBlockClass: [{
type: Input
}], inputBlockExtraClass: [{
type: Input
}], viewOnlyClass: [{
type: Input
}], wrapperClass: [{
type: Input
}], showLabel: [{
type: Input
}], autoFocus: [{
type: Input
}], enableCharacterCounter: [{
type: Input
}], enableWordCounter: [{
type: Input
}], maxLength: [{
type: Input
}], maxWords: [{
type: Input
}], wordCounterWarningMessage: [{
type: Input
}], changed: [{
type: Output
}], maxLengthReached: [{
type: Output
}], inputBox: [{
type: ViewChild,
args: ['inputBox']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGRhdGEtdWktaW5wdXQvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RkYXRhLXVpLWlucHV0L3NyYy9saWIvY29tcG9uZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLDhCQUE4QjtBQUM5QixPQUFPLEVBQWlCLFNBQVMsRUFBYyxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQXVDLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0RBQWtELENBQUM7Ozs7QUFPdEYsTUFBTSxPQUFPLG1CQUFtQjtJQXlHOUI7UUF4R0Esa0JBQWEsR0FBZ0MsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBOEIsa0JBQWtCLENBQUMsQ0FBQztRQUVuSSxnQ0FBZ0M7UUFDaEMsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1YsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsV0FBTSxHQUFtRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBa0VoRSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxLQUFLLENBQUM7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bnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4vLyB0c2xpbnQ6ZGlzYWJsZTogZGVwcmVjYXRpb25cbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhc2VNb2RlbEludGVyZmFjZSwgRmllbGRzSW50ZXJmYWNlLCBCYXNlTW9kZWwsIERkYXRhQ29yZU1vZHVsZSB9IGZyb20gJ2RkYXRhLWNvcmUnO1xuaW1wb3J0IHsgSW5wdXRIZWxwZXJTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaW5wdXQvaGVscGVyL2lucHV0LWhlbHBlci1zZXJ2aWNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbnB1dEhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbnB1dC9oZWxwZXIvaW5wdXQtaGVscGVyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZC1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGRhdGFJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIGhlbHBlclNlcnZpY2U6IElucHV0SGVscGVyU2VydmljZUludGVyZmFjZSA9IERkYXRhQ29yZU1vZHVsZS5JbmplY3Rvckluc3RhbmNlLmdldDxJbnB1dEhlbHBlclNlcnZpY2VJbnRlcmZhY2U+KElucHV0SGVscGVyU2VydmljZSk7XG5cbiAgLy8gdHNsaW50OmRpc2FibGU6IHZhcmlhYmxlLW5hbWVcbiAgX2ZpZWxkID0gJyc7XG4gIF90aXRsZSA9ICcnO1xuICBfbGFiZWwgPSAnJztcbiAgX3BsYWNlaG9sZGVyID0gJyc7XG4gIF9wcmVwZW5kID0gJyc7XG4gIF9hcHBlbmQgPSAnJztcbiAgX21heCA9ICcnO1xuICBfaXNSZXF1aXJlZCA9IGZhbHNlO1xuICBfbW9kZWw6IEJhc2VNb2RlbEludGVyZmFjZTxhbnk+ICYgRmllbGRzSW50ZXJmYWNlPGFueT4gPSBuZXcgQmFzZU1vZGVsKCk7XG5cbiAgQElucHV0KCkgc2V0IG1vZGVsKHZhbHVlOiBCYXNlTW9kZWxJbnRlcmZhY2U8YW55PiAmIEZpZWxkc0ludGVyZmFjZTxhbnk+IHwgbnVsbCkge1xuICAgIC8vIHByZXZlbnQgdW5kZWZpbmVkXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgY29uc29sZS5lcnJvcignVGhlIGlucHV0LWJveCBjb21wb25lbnQgZ2V0IHVuZGVmaW5lZCBtb2RlbCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX21vZGVsID0gdmFsdWU7XG5cbiAgICBpZiAoIXRoaXMuX21vZGVsLmZpZWxkcykge1xuICAgICAgY29uc29sZS5lcnJvcihgWW91ciAke3RoaXMuX21vZGVsLm1vZGVsX25hbWV9J3MgJ2ZpZWxkcycgZmllbGQgaXNgLCB0aGlzLl9tb2RlbC5maWVsZHMpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tb2RlbC5maWVsZHNbdGhpcy5fZmllbGRdKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBUaGUgJHt0aGlzLl9tb2RlbC5tb2RlbF9uYW1lfSdzICR7dGhpcy5fZmllbGR9IGZpZWxkIGlzIGAsIHRoaXMuX21vZGVsLmZpZWxkc1t0aGlzLl9maWVsZF0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEhdGhpcy5fbW9kZWwgJiYgISF0aGlzLl9tb2RlbC5maWVsZHNbdGhpcy5fZmllbGRdKSB7XG4gICAgICB0aGlzLl90aXRsZSA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRUaXRsZSh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0UGxhY2Vob2xkZXIodGhpcy5fbW9kZWwsIHRoaXMuX2ZpZWxkKTtcbiAgICAgIHRoaXMuX3ByZXBlbmQgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0UHJlcGVuZCh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgICAgdGhpcy5fYXBwZW5kID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldEFwcGVuZCh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgICAgdGhpcy5fbGFiZWwgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0TGFiZWwodGhpcy5fbW9kZWwsIHRoaXMuX2ZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoISF0aGlzLl9tb2RlbCAmJiAhIXRoaXMuX21vZGVsLnZhbGlkYXRpb25SdWxlc1t0aGlzLl9maWVsZF0pIHtcbiAgICAgIHRoaXMuX2lzUmVxdWlyZWQgPSB0aGlzLmhlbHBlclNlcnZpY2UuaXNSZXF1aXJlZCh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgIH1cbiAgfVxuICBnZXQgbW9kZWwoKTogQmFzZU1vZGVsSW50ZXJmYWNlPGFueT4gJiBGaWVsZHNJbnRlcmZhY2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICB9XG4gIEBJbnB1dCgpIHNldCBmaWVsZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFsdWUgPSAnaXNWYWxpZCc7XG4gICAgfVxuXG4gICAgdGhpcy5fZmllbGQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKSBzZXQgYXBwZW5kKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuX2FwcGVuZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHNldCBwcmVwZW5kKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuX3ByZXBlbmQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKSBzZXQgbGFiZWxUZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuX2xhYmVsID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgaXNWaWV3T25seSA9IGZhbHNlO1xuICBASW5wdXQoKSB0eXBlID0gJ3RleHQnO1xuICBASW5wdXQoKSBpbnB1dENsYXNzID0gJ2Zvcm0tY29udHJvbCc7XG4gIEBJbnB1dCgpIGxhYmVsQ2xhc3MgPSAnY29sLTEyIGNvbC1tZC0zIHB4LTAgY29sLWZvcm0tbGFiZWwnO1xuICBASW5wdXQoKSBpbnB1dEJsb2NrQ2xhc3MgPSAnY29sLTEyIGQtZmxleCBweC0wJztcbiAgQElucHV0KCkgaW5wdXRCbG9ja0V4dHJhQ2xhc3MgPSAnY29sLW1kLTknO1xuICBASW5wdXQoKSB2aWV3T25seUNsYXNzID0gJ2Zvcm0tY29udHJvbCBib3JkZXItMCBiZy1saWdodCc7XG4gIEBJbnB1dCgpIHdyYXBwZXJDbGFzcyA9ICdkLWZsZXggZmxleC13cmFwJztcbiAgQElucHV0KCkgc2hvd0xhYmVsID0gdHJ1ZTtcbiAgQElucHV0KCkgYXV0b0ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVuYWJsZUNoYXJhY3RlckNvdW50ZXIgPSBmYWxzZTtcbiAgQElucHV0KCkgZW5hYmxlV29yZENvdW50ZXIgPSBmYWxzZTtcbiAgQElucHV0KCkgbWF4TGVuZ3RoID0gMjU1O1xuICBASW5wdXQoKSBtYXhXb3JkcyA9IDc7XG4gIEBJbnB1dCgpIHdvcmRDb3VudGVyV2FybmluZ01lc3NhZ2UgPSAnJztcblxuICBAT3V0cHV0KCkgY2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG1heExlbmd0aFJlYWNoZWQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdpbnB1dEJveCcpIGlucHV0Qm94OiBFbGVtZW50UmVmO1xuXG4gIHJhbmRvbTogc3RyaW5nID0gdGhpcy5oZWxwZXJTZXJ2aWNlLnJhbmRDaGFycygpO1xuXG4gIGRpc3BsYXlXb3JkQ291bnRlcldhcm5pbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9Gb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEJveC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVGaWVsZCgpOiB2b2lkIHtcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy5oZWxwZXJTZXJ2aWNlLnZhbGlkYXRlRmllbGQodGhpcy5fbW9kZWwsIHRoaXMuX2ZpZWxkKTtcblxuICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICB0aGlzLmNoYW5nZWQuZW1pdCh0aGlzLl9tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgc2V0V29yZENvdW50ZXJXYXJuaW5nKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5V29yZENvdW50ZXJXYXJuaW5nID0gdmFsdWU7XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cIndyYXBwZXJDbGFzc1wiPlxuICA8bGFiZWwgW2NsYXNzXT1cImxhYmVsQ2xhc3NcIiBbZm9yXT1cIl9maWVsZCArICdfJyArIHJhbmRvbVwiICpuZ0lmPVwic2hvd0xhYmVsXCI+XG4gICAge3sgX2xhYmVsIH19OlxuICAgIDxzcGFuICpuZ0lmPVwiX2lzUmVxdWlyZWRcIj4gKjwvc3Bhbj5cbiAgPC9sYWJlbD5cbiAgPGRpdiBbY2xhc3NdPVwiaW5wdXRCbG9ja0NsYXNzXCIgW25nQ2xhc3NdPVwic2hvd0xhYmVsID8gaW5wdXRCbG9ja0V4dHJhQ2xhc3MgOiAnJ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1wcmVwZW5kXCIgKm5nSWY9XCIgX3ByZXBlbmQgIT0gJycgXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPnt7IF9wcmVwZW5kIH19PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVmlld09ubHlcIj5cbiAgICAgIDxpbnB1dFxuICAgICAgICBbY2xhc3MuaW52YWxpZF09XCJtb2RlbC52YWxpZGF0aW9uRXJyb3JzLmluY2x1ZGVzKF9maWVsZClcIlxuICAgICAgICBbY2xhc3NdPVwiaW5wdXRDbGFzc1wiXG4gICAgICAgIFsobmdNb2RlbCldPVwibW9kZWxbX2ZpZWxkXVwiXG4gICAgICAgIFtpZF09XCJfZmllbGQgKyAnXycgKyByYW5kb21cIlxuICAgICAgICBbYXR0ci5uYW1lXT1cIl9maWVsZCArICdfJyArIHJhbmRvbVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJfcGxhY2Vob2xkZXJcIlxuICAgICAgICBbdGl0bGVdPVwiX3RpdGxlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW3R5cGVdPVwidHlwZVwiXG4gICAgICAgIFthdXRvY29tcGxldGVdPVwicmFuZG9tXCJcbiAgICAgICAgKGtleXVwKT1cInZhbGlkYXRlRmllbGQoKVwiXG4gICAgICAgICNpbnB1dEJveD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVuYWJsZUNoYXJhY3RlckNvdW50ZXJcIj5cbiAgICAgICAgICA8Y2hhcmFjdGVyLWNvdW50ZXIgW2N1cnJlbnRMZW5ndGhdPVwibW9kZWxbX2ZpZWxkXT8ubGVuZ3RoIHx8IDBcIiBbbWF4TGVuZ3RoXT1cIm1heExlbmd0aFwiPjwvY2hhcmFjdGVyLWNvdW50ZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlV29yZENvdW50ZXJcIj5cbiAgICAgICAgICA8YXBwLXdvcmQtY291bnRlclxuICAgICAgICAgIFtjdXJyZW50TGVuZ3RoXT1cIm1vZGVsW19maWVsZF1cIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwibWF4V29yZHNcIlxuICAgICAgICAgIChtYXhMZW50Z2hSZWFjaGVkKT1cInNob3dXb3JkQ291bnRlcldhcm5pbmcgPSAkZXZlbnRcIlxuICAgICAgICA+PC9hcHAtd29yZC1jb3VudGVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ZpZXdPbmx5XCI+XG4gICAgICA8ZGl2XG4gICAgICAgIFtpZF09XCJfZmllbGQgKyAnXycgKyByYW5kb21cIlxuICAgICAgICBbY2xhc3NdPVwidmlld09ubHlDbGFzc1wiXG4gICAgICAgIFthdHRyLm5hbWVdPVwiX2ZpZWxkICsgJ18nICsgcmFuZG9tXCJcbiAgICAgICAgW3RpdGxlXT1cIl90aXRsZVwiPlxuICAgICAgICAgIHt7IG1vZGVsW19maWVsZF0gfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIiAqbmdJZj1cIl9hcHBlbmQgIT0gJydcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+e3sgX2FwcGVuZCB9fTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImRpc3BsYXlXb3JkQ291bnRlcldhcm5pbmcgJiYgd29yZENvdW50ZXJXYXJuaW5nTWVzc2FnZSAhPT0gJydcIiBjbGFzcz1cImQtZmxleCBwYi0yXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNyBvZmZzZXQtbWQtMyBiZy13YXJuaW5nIHAtMiByb3VuZGVkXCI+XG4gICAgICB7eyB3b3JkQ291bnRlcldhcm5pbmdNZXNzYWdlIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=