UNPKG

@tangential/input-widgets

Version:

Input Widgets with persistable, dynamic configuration.

197 lines 19.9 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"; /** * Provider Expression that allows this widget to register as a ControlValueAccessor. * This allows it to support [(ngModel)]. * @docs-private */ export const TANJ_NUMBER_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NumberWidgetComponent), multi: true }; export class NumberWidgetChange { constructor(source, value) { this.source = source; this.value = value; } } export class NumberWidgetComponent { constructor(changeDetectorRef) { this.changeDetectorRef = changeDetectorRef; // turn this into a class this.flex = ''; this.flexLayout = 'column'; this.flexLayoutAlign = 'start'; this.value = 0; this.valueChange = new EventEmitter(false); this.labelPosition = 'before'; this.disabled = false; this.hideLabel = false; this.onlyLabel = false; /** * Configuration Fields */ this.label = ''; this.defaultValue = 0; this.max = 5; this.min = 0; this.step = 1; this.decimalPlaces = 1; this.tickInterval = 10; this.vertical = false; /* end Configuration Fields */ this.change = new EventEmitter(false); this.onTouched = () => { }; this.controlValueAccessorChangeFn = (value) => { }; } ngOnInit() { Hacks.materialDesignPlaceholderText(this.changeDetectorRef); } ngOnChanges(changes) { } handleValueChange(value) { if (!this.disabled) { this.value = value; this.valueChange.emit(this.value); this.emitChangeEvent(); } } /** * Boilerplate / required for Angular * */ emitChangeEvent() { this.controlValueAccessorChangeFn(this.value); this.change.emit(new NumberWidgetChange(this, this.value)); } 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; } } NumberWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: NumberWidgetComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); NumberWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: NumberWidgetComponent, selector: "tanj-number-widget", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", hideLabel: "hideLabel", onlyLabel: "onlyLabel", label: "label", defaultValue: "defaultValue", max: "max", min: "min", step: "step", decimalPlaces: "decimalPlaces", tickInterval: "tickInterval", vertical: "vertical" }, outputs: { valueChange: "valueChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_NUMBER_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR], usesOnChanges: true, ngImport: i0, template: `<!-- --> <div flex class="tanj-input-template tanj-mode-edit" [ngClass]="{'tanj-disabled': disabled}" layout="row" layout-align="start center"> <span *ngIf="!hideLabel && labelPosition == 'before'" class="tanj-label tanj-before">{{label}}</span> <div flex class="tanj-widget-input" layout="column" layout-align="center start"> <div flex *ngIf="!onlyLabel" class="tanj-widget-input" layout="row" layout-align="start"> <mat-form-field flex class="tanj-number-input-field tanj-widget-input" dividerColor="accent" layout="row" layout-align="start"> <input flex matInput class="tanj-input" type="number" max="{{max}}" [disabled]="disabled" [step]="step" (change)="valueChange.emit(value)" [(ngModel)]="value"/> </mat-form-field> </div> <span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span> </div> <span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after">{{label}}</span> </div> `, isInline: true, 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.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.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { 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"] }], encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: NumberWidgetComponent, decorators: [{ type: Component, args: [{ selector: 'tanj-number-widget', template: `<!-- --> <div flex class="tanj-input-template tanj-mode-edit" [ngClass]="{'tanj-disabled': disabled}" layout="row" layout-align="start center"> <span *ngIf="!hideLabel && labelPosition == 'before'" class="tanj-label tanj-before">{{label}}</span> <div flex class="tanj-widget-input" layout="column" layout-align="center start"> <div flex *ngIf="!onlyLabel" class="tanj-widget-input" layout="row" layout-align="start"> <mat-form-field flex class="tanj-number-input-field tanj-widget-input" dividerColor="accent" layout="row" layout-align="start"> <input flex matInput class="tanj-input" type="number" max="{{max}}" [disabled]="disabled" [step]="step" (change)="valueChange.emit(value)" [(ngModel)]="value"/> </mat-form-field> </div> <span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span> </div> <span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after">{{label}}</span> </div> `, providers: [TANJ_NUMBER_WIDGET_VIEW_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 }], hideLabel: [{ type: Input }], onlyLabel: [{ type: Input }], label: [{ type: Input }], defaultValue: [{ type: Input }], max: [{ type: Input }], min: [{ type: Input }], step: [{ type: Input }], decimalPlaces: [{ type: Input }], tickInterval: [{ type: Input }], vertical: [{ type: Input }], change: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nZW50aWFsL2lucHV0LXdpZGdldHMvc3JjL2xpYi9udW1iZXItd2lkZ2V0L251bWJlci13aWRnZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN0RSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sa0JBQWtCLENBQUE7Ozs7OztBQUd0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sOENBQThDLEdBQVE7SUFDakUsT0FBTyxFQUFNLGlCQUFpQjtJQUM5QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDO0lBQ3BELEtBQUssRUFBUSxJQUFJO0NBQ2xCLENBQUM7QUFFRixNQUFNLE9BQU8sa0JBQWtCO0lBRTdCLFlBQW1CLE1BQTZCLEVBQVMsS0FBYTtRQUFuRCxXQUFNLEdBQU4sTUFBTSxDQUF1QjtRQUFTLFVBQUssR0FBTCxLQUFLLENBQVE7SUFDdEUsQ0FBQztDQUNGO0FBcUNELE1BQU0sT0FBTyxxQkFBcUI7SUFpQ2hDLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBL0J4RCx5QkFBeUI7UUFDQyxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsZUFBVSxHQUFHLFFBQVEsQ0FBQztRQUNoQixvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUVuRCxVQUFLLEdBQVcsQ0FBQyxDQUFBO1FBQ2hCLGdCQUFXLEdBQXlCLElBQUks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UztzQkFBakIsS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFHSSxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7SGFja3N9IGZyb20gJ0B0YW5nZW50aWFsL2NvcmUnXG5cblxuLyoqXG4gKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIHRoaXMgd2lkZ2V0IHRvIHJlZ2lzdGVyIGFzIGEgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gKiBUaGlzIGFsbG93cyBpdCB0byBzdXBwb3J0IFsobmdNb2RlbCldLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgVEFOSl9OVU1CRVJfV0lER0VUX1ZJRVdfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiAgICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWJlcldpZGdldENvbXBvbmVudCksXG4gIG11bHRpOiAgICAgICB0cnVlXG59O1xuXG5leHBvcnQgY2xhc3MgTnVtYmVyV2lkZ2V0Q2hhbmdlIHtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc291cmNlOiBOdW1iZXJXaWRnZXRDb21wb25lbnQsIHB1YmxpYyB2YWx1ZTogbnVtYmVyKSB7XG4gIH1cbn1cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICAgICAgJ3RhbmotbnVtYmVyLXdpZGdldCcsXG4gIHRlbXBsYXRlOiAgICAgIGA8IS0tIC0tPlxuICA8ZGl2IGZsZXggY2xhc3M9XCJ0YW5qLWlucHV0LXRlbXBsYXRlIHRhbmotbW9kZS1lZGl0XCJcbiAgICAgICBbbmdDbGFzc109XCJ7J3RhbmotZGlzYWJsZWQnOiBkaXNhYmxlZH1cIlxuICAgICAgIGxheW91dD1cInJvd1wiXG4gICAgICAgbGF5b3V0LWFsaWduPVwic3RhcnQgY2VudGVyXCI+XG4gICAgPHNwYW4gKm5nSWY9XCIhaGlkZUxhYmVsICYmIGxhYmVsUG9zaXRpb24gPT0gJ2JlZm9yZSdcIiBjbGFzcz1cInRhbmotbGFiZWwgdGFuai1iZWZvcmVcIj57e2xhYmVsfX08L3NwYW4+XG4gICAgPGRpdiBmbGV4IGNsYXNzPVwidGFuai13aWRnZXQtaW5wdXRcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJjZW50ZXIgc3RhcnRcIj5cbiAgICAgIDxkaXYgZmxleCAqbmdJZj1cIiFvbmx5TGFiZWxcIiBjbGFzcz1cInRhbmotd2lkZ2V0LWlucHV0XCIgbGF5b3V0PVwicm93XCIgbGF5b3V0LWFsaWduPVwic3RhcnRcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhbmotbnVtYmVyLWlucHV0LWZpZWxkIHRhbmotd2lkZ2V0LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGVyQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dD1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LWFsaWduPVwic3RhcnRcIj5cbiAgICAgICAgICA8aW5wdXQgZmxleFxuICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRhbmotaW5wdXRcIlxuICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgbWF4PVwie3ttYXh9fVwiXG4gICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gKm5nSWY9XCIhaGlkZUxhYmVsICYmIGxhYmVsUG9zaXRpb24gPT0gJ2JlbG93J1wiIGNsYXNzPVwidGFuai1sYWJlbCB0YW5qLWJlbG93XCI+e3tsYWJlbH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxzcGFuICpuZ0lmPVwiIWhpZGVMYWJlbCAmJiBsYWJlbFBvc2l0aW9uID09ICdhZnRlcidcIiBjbGFzcz1cInRhbmotbGFiZWwgdGFuai1hZnRlclwiPnt7bGFiZWx9fTwvc3Bhbj5cbiAgPC9kaXY+XG4gICAgICAgICAgICAgICAgIGAsXG4gIHByb3ZpZGVyczogICAgIFtUQU5KX05VTUJFUl9XSURHRVRfVklFV19DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBOdW1iZXJXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzLCBPbkluaXQge1xuXG4gIC8vIHR1cm4gdGhpcyBpbnRvIGEgY2xhc3NcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmZsZXgnKSBmbGV4ID0gJyc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQnKSBmbGV4TGF5b3V0ID0gJ2NvbHVtbic7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQtYWxpZ24nKSBmbGV4TGF5b3V0QWxpZ24gPSAnc3RhcnQnO1xuXG4gIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgPSAwXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICdiZWxvdycgPSAnYmVmb3JlJ1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIGhpZGVMYWJlbDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIG9ubHlMYWJlbDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gRmllbGRzXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJydcbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwXG4gIEBJbnB1dCgpIG1heDogbnVtYmVyID0gNVxuICBASW5wdXQoKSBtaW46IG51bWJlciA9IDBcbiAgQElucHV0KCkgc3RlcDogbnVtYmVyID0gMVxuICBASW5wdXQoKSBkZWNpbWFsUGxhY2VzOiBudW1iZXIgPSAxXG4gIEBJbnB1dCgpIHRpY2tJbnRlcnZhbDogbnVtYmVyID0gMTBcbiAgQElucHV0KCkgdmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZVxuICAvKiBlbmQgQ29uZmlndXJhdGlvbiBGaWVsZHMgKi9cblxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7IH07XG4gIHByaXZhdGUgY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbjogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAodmFsdWUpID0+IHsgfTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICB9XG5cblxuICBuZ09uSW5pdCgpIHtcbiAgICBIYWNrcy5tYXRlcmlhbERlc2lnblBsYWNlaG9sZGVyVGV4dCh0aGlzLmNoYW5nZURldGVjdG9yUmVmKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICB9XG5cbiAgaGFuZGxlVmFsdWVDaGFuZ2UodmFsdWU6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSlcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQm9pbGVycGxhdGUgLyByZXF1aXJlZCBmb3IgQW5ndWxhclxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlRXZlbnQoKSB7XG4gICAgdGhpcy5jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuKHRoaXMudmFsdWUpO1xuICAgIHRoaXMuY2hhbmdlLmVtaXQobmV3IE51bWJlcldpZGdldENoYW5nZSh0aGlzLCB0aGlzLnZhbHVlKSlcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbnB1dCdzIGRpc2FibGVkIHN0YXRlLiBJbXBsZW1lbnRlZCBhcyBhIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIFdoZXRoZXIgdGhlIGlucHV0IHNob3VsZCBiZSBkaXNhYmxlZC5cbiAgICovXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG59XG4iXX0=