UNPKG

@tangential/input-widgets

Version:

Input Widgets with persistable, dynamic configuration.

250 lines (248 loc) 24.2 kB
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Hacks } from '@tangential/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "@angular/material/form-field"; import * as i4 from "@angular/material/input"; import * as i5 from "./number-widget.component"; /** * Provider Expression that allows this widget to register as a ControlValueAccessor. * This allows it to support [(ngModel)]. * @docs-private */ export const TANJ_NUMBER_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NumberWidgetConfigureComponent), multi: true }; export class NumberWidgetConfigureChange { constructor(source, value) { this.source = source; this.value = value; } } export class NumberWidgetConfigureComponent { constructor(changeDetectorRef) { this.changeDetectorRef = changeDetectorRef; this.flex = ''; this.flexLayout = 'column'; this.flexLayoutAlign = 'start'; this.value = 0; this.valueChange = new EventEmitter(false); this.labelPosition = 'before'; this.disabled = false; /** * Configuration Fields */ this.label = ''; this.defaultValue = 0; this.max = 10; this.min = 0; this.step = 1; this.decimalPlaces = 0; this.labelChange = new EventEmitter(false); this.defaultValueChange = new EventEmitter(false); this.maxChange = new EventEmitter(false); this.minChange = new EventEmitter(false); this.stepChange = new EventEmitter(false); this.decimalPlacesChange = new EventEmitter(false); this.change = new EventEmitter(false); /** * Called when the spinner is blurred. Needed to properly implement ControlValueAccessor. * @docs-private */ this.onTouched = () => { }; this.controlValueAccessorChangeFn = (value) => { }; } ngOnInit() { Hacks.materialDesignPlaceholderText(this.changeDetectorRef); } ngOnChanges(changes) { } emitChangeEvent(value, label) { this.controlValueAccessorChangeFn(this.value); this.change.emit(new NumberWidgetConfigureChange(this, this.value)); if (value) { this.valueChange.emit(this.value); this.defaultValueChange.emit(this.defaultValue); } if (label) { this.labelChange.emit(this.label); } } /** * Boilerplate / required for Angular * */ writeValue(value) { this.value = value; } registerOnChange(fn) { this.controlValueAccessorChangeFn = fn; } registerOnTouched(fn) { this.onTouched = fn; } /** * Sets the input's disabled state. Implemented as a part of ControlValueAccessor. * @param isDisabled Whether the input should be disabled. */ setDisabledState(isDisabled) { this.disabled = isDisabled; } } NumberWidgetConfigureComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: NumberWidgetConfigureComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); NumberWidgetConfigureComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: NumberWidgetConfigureComponent, selector: "tanj-number-configure", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", label: "label", defaultValue: "defaultValue", max: "max", min: "min", step: "step", decimalPlaces: "decimalPlaces" }, outputs: { valueChange: "valueChange", labelChange: "labelChange", defaultValueChange: "defaultValueChange", maxChange: "maxChange", minChange: "minChange", stepChange: "stepChange", decimalPlacesChange: "decimalPlacesChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_NUMBER_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR], usesOnChanges: true, ngImport: i0, template: `<!-- --> <div class="tanj-input-template tanj-mode-configure" flex layout="column" layout-align="start"> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="text" maxlength="50" placeholder="Enter a label for this input" (change)="labelChange.emit(label)" [(ngModel)]="label"/> </mat-form-field> <ng-container *ngIf="label"> <tanj-number-widget [(value)]="defaultValue" (valueChange)="value = defaultValue; emitChangeEvent(true, false)" [defaultValue]="defaultValue" [max]="max" [min]="min" [step]="step" [decimalPlaces]="decimalPlaces" label="Default Value"></tanj-number-widget> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Min" (change)="minChange.emit(min)" [(ngModel)]="min"/> </mat-form-field> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Max" (change)="maxChange.emit(max)" [(ngModel)]="max"/> </mat-form-field> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Step" (change)="stepChange.emit(step)" [(ngModel)]="step"/> </mat-form-field> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Decimal Places" (change)="decimalPlacesChange.emit(decimalPlaces)" [(ngModel)]="decimalPlaces"/> </mat-form-field> </ng-container> </div> `, isInline: true, dependencies: [{ 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.NumberWidgetComponent, selector: "tanj-number-widget", inputs: ["value", "labelPosition", "disabled", "hideLabel", "onlyLabel", "label", "defaultValue", "max", "min", "step", "decimalPlaces", "tickInterval", "vertical"], outputs: ["valueChange", "change"] }], encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: NumberWidgetConfigureComponent, decorators: [{ type: Component, args: [{ selector: 'tanj-number-configure', template: `<!-- --> <div class="tanj-input-template tanj-mode-configure" flex layout="column" layout-align="start"> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="text" maxlength="50" placeholder="Enter a label for this input" (change)="labelChange.emit(label)" [(ngModel)]="label"/> </mat-form-field> <ng-container *ngIf="label"> <tanj-number-widget [(value)]="defaultValue" (valueChange)="value = defaultValue; emitChangeEvent(true, false)" [defaultValue]="defaultValue" [max]="max" [min]="min" [step]="step" [decimalPlaces]="decimalPlaces" label="Default Value"></tanj-number-widget> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Min" (change)="minChange.emit(min)" [(ngModel)]="min"/> </mat-form-field> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Max" (change)="maxChange.emit(max)" [(ngModel)]="max"/> </mat-form-field> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Step" (change)="stepChange.emit(step)" [(ngModel)]="step"/> </mat-form-field> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Decimal Places" (change)="decimalPlacesChange.emit(decimalPlaces)" [(ngModel)]="decimalPlaces"/> </mat-form-field> </ng-container> </div> `, providers: [TANJ_NUMBER_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR], encapsulation: ViewEncapsulation.None }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { flex: [{ type: HostBinding, args: ['attr.flex'] }], flexLayout: [{ type: HostBinding, args: ['attr.layout'] }], flexLayoutAlign: [{ type: HostBinding, args: ['attr.layout-align'] }], value: [{ type: Input }], valueChange: [{ type: Output }], labelPosition: [{ type: Input }], disabled: [{ type: Input }], label: [{ type: Input }], defaultValue: [{ type: Input }], max: [{ type: Input }], min: [{ type: Input }], step: [{ type: Input }], decimalPlaces: [{ type: Input }], labelChange: [{ type: Output }], defaultValueChange: [{ type: Output }], maxChange: [{ type: Output }], minChange: [{ type: Output }], stepChange: [{ type: Output }], decimalPlacesChange: [{ type: Output }], change: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLXdpZGdldC1jb25maWd1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ2VudGlhbC9pbnB1dC13aWRnZXRzL3NyYy9saWIvbnVtYmVyLXdpZGdldC9udW1iZXItd2lkZ2V0LWNvbmZpZ3VyZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFFTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUVMLGlCQUFpQixFQUNsQixNQUFNLGdCQUFnQixDQUFBO0FBQ3ZCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTs7Ozs7OztBQUd0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0RBQWdELEdBQVE7SUFDbkUsT0FBTyxFQUFNLGlCQUFpQjtJQUM5QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDhCQUE4QixDQUFDO0lBQzdELEtBQUssRUFBUSxJQUFJO0NBQ2xCLENBQUM7QUFFRixNQUFNLE9BQU8sMkJBQTJCO0lBQ3RDLFlBQW1CLE1BQXNDLEVBQVMsS0FBYTtRQUE1RCxXQUFNLEdBQU4sTUFBTSxDQUFnQztRQUFTLFVBQUssR0FBTCxLQUFLLENBQVE7SUFDL0UsQ0FBQztDQUNGO0FBMkRELE1BQU0sT0FBTyw4QkFBOEI7SUF3Q3pDLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBckM5QixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsZUFBVSxHQUFHLFFBQVEsQ0FBQztRQUNoQixvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUVuRCxVQUFLLEdBQVcsQ0FBQyxDQUFBO1FBQ2hCLGdCQUFXLEdBQXlCLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTVELGtCQUFhLEdBQWlDLFFBQVEsQ0FBQTtRQUN0RCxhQUFRLEdBQVksS0FBSyxDQUFBO1FBRWxDOztXQUVHO1FBQ00sVUFBSyxHQUFXLEVBQUUsQ0FBQTtRQUNsQixpQkFBWSxHQUFXLENBQUMsQ0FBQTtRQUN4QixRQUFHLEdBQVcsRUFBRSxDQUFBO1FBQ2hCLFFBQUcsR0FBVyxDQUFDLENBQUE7UUFDZixTQUFJLEdBQVcsQ0FBQyxDQUFBO1FBQ2hCLGtCQUFhLEdBQVcsQ0FBQyxDQUFBO1FBRXhCLGdCQUFXLEdBQXlCLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzNELHVCQUFrQixHQUF5QixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNsRSxjQUFTLEdBQXlCLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3pELGNBQVMsR0FBeUIsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDekQsZUFBVSxHQUF5QixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMxRCx3QkFBbUIsR0FBeUIsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFHbkUsV0FBTSxHQUFzQixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU3RDs7O1dBR0c7UUFDSCxjQUFTLEdBQWMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQ3hCLGlDQUE0QixHQUF5QixDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBRzNFLENBQUM7SUFFRCxRQUFRO1FBQ04sS0FBSyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFFRCxXQUFXLENBQUMsT0FBcUQ7SUFDakUsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFjLEVBQUUsS0FBYztRQUM1QyxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksMkJBQTJCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ25FLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1NBQ2hEO1FBQ0QsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDbEM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7SUFDcEIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLEVBQU87UUFDN0IsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRU0saUJBQWlCLENBQUMsRUFBTztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDN0IsQ0FBQzs7NEhBcEZVLDhCQUE4QjtnSEFBOUIsOEJBQThCLGduQkFIMUIsQ0FBQyxnREFBZ0QsQ0FBQywrQ0FuRGxEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQkFrREM7NEZBSUwsOEJBQThCO2tCQXhEMUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQU8sdUJBQXVCO29CQUN0QyxRQUFRLEVBQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQWtEQztvQkFDaEIsU0FBUyxFQUFNLENBQUMsZ0RBQWdELENBQUM7b0JBQ2pFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2lCQUN0Qzt3R0FJMkIsSUFBSTtzQkFBN0IsV0FBVzt1QkFBQyxXQUFXO2dCQUNJLFVBQVU7c0JBQXJDLFdBQVc7dUJBQUMsYUFBYTtnQkFDUSxlQUFlO3NCQUFoRCxXQUFXO3VCQUFDLG1CQUFtQjtnQkFFdkIsS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUUsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUdHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQge0hhY2tzfSBmcm9tICdAdGFuZ2VudGlhbC9jb3JlJ1xuXG5cbi8qKlxuICogUHJvdmlkZXIgRXhwcmVzc2lvbiB0aGF0IGFsbG93cyB0aGlzIHdpZGdldCB0byByZWdpc3RlciBhcyBhIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICogVGhpcyBhbGxvd3MgaXQgdG8gc3VwcG9ydCBbKG5nTW9kZWwpXS5cbiAqIEBkb2NzLXByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IFRBTkpfTlVNQkVSX1dJREdFVF9DT05GSUdfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiAgICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWJlcldpZGdldENvbmZpZ3VyZUNvbXBvbmVudCksXG4gIG11bHRpOiAgICAgICB0cnVlXG59O1xuXG5leHBvcnQgY2xhc3MgTnVtYmVyV2lkZ2V0Q29uZmlndXJlQ2hhbmdlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHNvdXJjZTogTnVtYmVyV2lkZ2V0Q29uZmlndXJlQ29tcG9uZW50LCBwdWJsaWMgdmFsdWU6IG51bWJlcikge1xuICB9XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAgICAgICd0YW5qLW51bWJlci1jb25maWd1cmUnLFxuICB0ZW1wbGF0ZTogICAgICBgPCEtLSAtLT5cbiAgPGRpdiBjbGFzcz1cInRhbmotaW5wdXQtdGVtcGxhdGUgdGFuai1tb2RlLWNvbmZpZ3VyZVwiIGZsZXggbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwic3RhcnRcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgZGl2aWRlckNvbG9yPVwiYWNjZW50XCI+XG4gICAgICA8aW5wdXQgbWF0SW5wdXQgY2xhc3M9XCJ0YW5qLWlucHV0XCIgdHlwZT1cInRleHRcIiBtYXhsZW5ndGg9XCI1MFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgYSBsYWJlbCBmb3IgdGhpcyBpbnB1dFwiXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJsYWJlbENoYW5nZS5lbWl0KGxhYmVsKVwiXG4gICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJsYWJlbFwiLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYWJlbFwiPlxuICAgICAgPHRhbmotbnVtYmVyLXdpZGdldCBbKHZhbHVlKV09XCJkZWZhdWx0VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsgZW1pdENoYW5nZUV2ZW50KHRydWUsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRWYWx1ZV09XCJkZWZhdWx0VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2RlY2ltYWxQbGFjZXNdPVwiZGVjaW1hbFBsYWNlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJEZWZhdWx0IFZhbHVlXCI+PC90YW5qLW51bWJlci13aWRnZXQ+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgZGl2aWRlckNvbG9yPVwiYWNjZW50XCI+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgY2xhc3M9XCJ0YW5qLWlucHV0XCJcbiAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJNaW5cIlxuICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJtaW5DaGFuZ2UuZW1pdChtaW4pXCJcbiAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWluXCIvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBkaXZpZGVyQ29sb3I9XCJhY2NlbnRcIj5cbiAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICBjbGFzcz1cInRhbmotaW5wdXRcIlxuICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk1heFwiXG4gICAgICAgICAgICAgICAoY2hhbmdlKT1cIm1heENoYW5nZS5lbWl0KG1heClcIlxuICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXhcIi8+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGRpdmlkZXJDb2xvcj1cImFjY2VudFwiPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgIGNsYXNzPVwidGFuai1pbnB1dFwiXG4gICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU3RlcFwiXG4gICAgICAgICAgICAgICAoY2hhbmdlKT1cInN0ZXBDaGFuZ2UuZW1pdChzdGVwKVwiXG4gICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0ZXBcIi8+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGRpdmlkZXJDb2xvcj1cImFjY2VudFwiPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgY2xhc3M9XCJ0YW5qLWlucHV0XCJcbiAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJEZWNpbWFsIFBsYWNlc1wiXG4gICAgICAgICAgICAgICAoY2hhbmdlKT1cImRlY2ltYWxQbGFjZXNDaGFuZ2UuZW1pdChkZWNpbWFsUGxhY2VzKVwiXG4gICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRlY2ltYWxQbGFjZXNcIi8+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gIDwvZGl2PlxuICAgICAgICAgICAgICAgICBgLFxuICBwcm92aWRlcnM6ICAgICBbVEFOSl9OVU1CRVJfV0lER0VUX0NPTkZJR19DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBOdW1iZXJXaWRnZXRDb25maWd1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmZsZXgnKSBmbGV4ID0gJyc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQnKSBmbGV4TGF5b3V0ID0gJ2NvbHVtbic7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQtYWxpZ24nKSBmbGV4TGF5b3V0QWxpZ24gPSAnc3RhcnQnO1xuXG4gIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgPSAwXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICdiZWxvdycgPSAnYmVmb3JlJ1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gRmllbGRzXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJydcbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwXG4gIEBJbnB1dCgpIG1heDogbnVtYmVyID0gMTBcbiAgQElucHV0KCkgbWluOiBudW1iZXIgPSAwXG4gIEBJbnB1dCgpIHN0ZXA6IG51bWJlciA9IDFcbiAgQElucHV0KCkgZGVjaW1hbFBsYWNlczogbnVtYmVyID0gMFxuXG4gIEBPdXRwdXQoKSBsYWJlbENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuICBAT3V0cHV0KCkgZGVmYXVsdFZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG4gIEBPdXRwdXQoKSBtYXhDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcbiAgQE91dHB1dCgpIG1pbkNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuICBAT3V0cHV0KCkgc3RlcENoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuICBAT3V0cHV0KCkgZGVjaW1hbFBsYWNlc0NoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG5cbiAgQE91dHB1dCgpIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgc3Bpbm5lciBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKiBAZG9jcy1wcml2YXRlXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHt9O1xuICBwcml2YXRlIGNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKHZhbHVlKSA9PiB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgSGFja3MubWF0ZXJpYWxEZXNpZ25QbGFjZWhvbGRlclRleHQodGhpcy5jaGFuZ2VEZXRlY3RvclJlZilcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgY29uZmlnOiBTaW1wbGVDaGFuZ2UsIGl2YWw6IFNpbXBsZUNoYW5nZSB9KSB7XG4gIH1cblxuICBlbWl0Q2hhbmdlRXZlbnQodmFsdWU6IGJvb2xlYW4sIGxhYmVsOiBib29sZWFuKSB7XG4gICAgdGhpcy5jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuKHRoaXMudmFsdWUpO1xuICAgIHRoaXMuY2hhbmdlLmVtaXQobmV3IE51bWJlcldpZGdldENvbmZpZ3VyZUNoYW5nZSh0aGlzLCB0aGlzLnZhbHVlKSlcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlQ2hhbmdlLmVtaXQodGhpcy5kZWZhdWx0VmFsdWUpXG4gICAgfVxuICAgIGlmIChsYWJlbCkge1xuICAgICAgdGhpcy5sYWJlbENoYW5nZS5lbWl0KHRoaXMubGFiZWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJvaWxlcnBsYXRlIC8gcmVxdWlyZWQgZm9yIEFuZ3VsYXJcbiAgICpcbiAgICovXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbnB1dCdzIGRpc2FibGVkIHN0YXRlLiBJbXBsZW1lbnRlZCBhcyBhIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIFdoZXRoZXIgdGhlIGlucHV0IHNob3VsZCBiZSBkaXNhYmxlZC5cbiAgICovXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG59XG4iXX0=