@doku-dev/doku-fragment
Version:
A new Angular UI library that moving away from Bootstrap and built from scratch.
137 lines • 21.1 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, EventEmitter, Host, HostBinding, Input, Optional, Output, Self, ViewEncapsulation, } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { BehaviorSubject, Subject, delay, distinctUntilChanged, skip, takeUntil } from 'rxjs';
import { DOKU_FORM_FIELD_ACCESSOR, DokuFormFieldModule, } from '../form-field';
import { DokuInput } from '../input';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../form-field";
import * as i3 from "../form-field/form-field.component";
import * as i4 from "../form-field/directives/field-prefix.directive";
export class DokuColorPicker {
/**
* Value of the color picker in hexadecimal format.
* @default ''
*/
get value() {
return this._value || '';
}
set value(hexColor) {
this._value = hexColor || '';
this.value$.next(this._value);
}
constructor(cdr, ngControl, formField) {
this.cdr = cdr;
this.ngControl = ngControl;
this.formField = formField;
/**
* Whether to disable the color picker.
* @default false
*/
this.disabled = false;
/**
* Whether color picker is readonly.
* @default false
*/
this.readonly = false;
this._value = '';
/**
* An event emitted when value changes.
*/
this.valueChange = new EventEmitter();
this.classes = ['d-color-picker'];
this.value$ = new BehaviorSubject(this.value);
this.destroy$ = new Subject();
this.fieldOptions = { withoutInputStyle: true };
if (ngControl) {
this.ngControl.valueAccessor = this;
}
}
registerOnDisable(fn) {
this.onDisable = fn;
}
registerOnReadonly(fn) {
this.onReadonly = fn;
}
registerOnValidate(fn) {
this.onValidate = fn;
}
writeValue(value) {
this.value = value;
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
ngOnInit() {
this.value$
.pipe(skip(1), distinctUntilChanged(), takeUntil(this.destroy$))
.subscribe((value) => {
this.valueChange.emit(value);
this.onChange?.(value);
this.cdr.detectChanges();
});
this.ngControl?.statusChanges
?.pipe(distinctUntilChanged(), delay(0), takeUntil(this.destroy$))
.subscribe((status) => {
if (status === 'VALID') {
this.onValidate?.('valid');
}
else if (status === 'INVALID') {
this.onValidate?.('invalid');
}
else {
this.onValidate?.();
}
this.cdr.detectChanges();
});
}
ngOnChanges(changes) {
if (changes['disabled']?.previousValue !== changes['disabled']?.currentValue) {
this.onDisable?.(!!this.disabled);
}
if (changes['readonly']?.previousValue !== changes['readonly']?.currentValue) {
this.onReadonly?.(!!this.readonly);
}
}
ngOnDestroy() {
this.destroy$.next(true);
this.destroy$.unsubscribe();
}
onColorChange(event) {
this.value = event.target.value;
this.onTouched?.();
}
}
DokuColorPicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuColorPicker, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NgControl, optional: true, self: true }, { token: i2.DokuFormField, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Component });
DokuColorPicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DokuColorPicker, isStandalone: true, selector: "doku-color-picker", inputs: { disabled: "disabled", readonly: "readonly", value: "value" }, outputs: { valueChange: "valueChange" }, host: { properties: { "class": "this.classes" } }, providers: [{ provide: DOKU_FORM_FIELD_ACCESSOR, useExisting: DokuColorPicker }], exportAs: ["dokuColorPicker"], usesOnChanges: true, ngImport: i0, template: "<doku-form-field\n [isErrorState]=\"formField?.['isError']\"\n [isSuccessState]=\"formField?.['isSuccess']\"\n [showSuccessBehavior]=\"!!formField?.['showSuccessBehavior']\"\n>\n <input\n type=\"text\"\n doku-input\n [(ngModel)]=\"value\"\n (input)=\"onColorChange($event)\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [maxlength]=\"7\"\n />\n <doku-form-field doku-field-prefix appearance=\"border-block-inside\" class=\"d-color-picker-prefix\">\n <input\n type=\"color\"\n class=\"d-color-picker-input-color\"\n [(ngModel)]=\"value\"\n (input)=\"onColorChange($event)\"\n [disabled]=\"disabled || readonly\"\n [readonly]=\"readonly\"\n />\n </doku-form-field>\n</doku-form-field>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DokuFormFieldModule }, { kind: "component", type: i3.DokuFormField, selector: "doku-form-field", inputs: ["showSuccessBehavior", "isErrorState", "isSuccessState"], exportAs: ["dokuFormField"] }, { kind: "directive", type: i4.DokuFieldPrefix, selector: "[doku-field-prefix]", inputs: ["appearance", "useBackgroundColor"], exportAs: ["dokuFieldPrefix"] }, { kind: "directive", type: DokuInput, selector: "input[doku-input], textarea[doku-input]", inputs: ["disabled", "readonly"], exportAs: ["dokuInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuColorPicker, decorators: [{
type: Component,
args: [{ selector: 'doku-color-picker', exportAs: 'dokuColorPicker', standalone: true, imports: [CommonModule, DokuFormFieldModule, DokuInput, ReactiveFormsModule, FormsModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: DOKU_FORM_FIELD_ACCESSOR, useExisting: DokuColorPicker }], template: "<doku-form-field\n [isErrorState]=\"formField?.['isError']\"\n [isSuccessState]=\"formField?.['isSuccess']\"\n [showSuccessBehavior]=\"!!formField?.['showSuccessBehavior']\"\n>\n <input\n type=\"text\"\n doku-input\n [(ngModel)]=\"value\"\n (input)=\"onColorChange($event)\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [maxlength]=\"7\"\n />\n <doku-form-field doku-field-prefix appearance=\"border-block-inside\" class=\"d-color-picker-prefix\">\n <input\n type=\"color\"\n class=\"d-color-picker-input-color\"\n [(ngModel)]=\"value\"\n (input)=\"onColorChange($event)\"\n [disabled]=\"disabled || readonly\"\n [readonly]=\"readonly\"\n />\n </doku-form-field>\n</doku-form-field>\n" }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NgControl, decorators: [{
type: Optional
}, {
type: Self
}] }, { type: i2.DokuFormField, decorators: [{
type: Optional
}, {
type: Host
}] }]; }, propDecorators: { disabled: [{
type: Input
}], readonly: [{
type: Input
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], classes: [{
type: HostBinding,
args: ['class']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rva3UtZnJhZ21lbnQvc3JjL2xpYi9jb2xvci1waWNrZXIvY29sb3ItcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rva3UtZnJhZ21lbnQvc3JjL2xpYi9jb2xvci1waWNrZXIvY29sb3ItcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQVcsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osSUFBSSxFQUNKLFdBQVcsRUFDWCxLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBRUosaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFhLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUYsT0FBTyxFQUNMLHdCQUF3QixFQUl4QixtQkFBbUIsR0FFcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7O0FBWXJDLE1BQU0sT0FBTyxlQUFlO0lBZTFCOzs7T0FHRztJQUNILElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLFFBQW1DO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMs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aUJBRTFFLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxXQUFXLGlCQUFpQixFQUFFLENBQUM7OzBCQTRDN0UsUUFBUTs7MEJBQUksSUFBSTs7MEJBQ2hCLFFBQVE7OzBCQUFJLElBQUk7NENBcENWLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsUUFBUTtzQkFBaEIsS0FBSztnQkFPRixLQUFLO3NCQURSLEtBQUs7Z0JBYUksV0FBVztzQkFBcEIsTUFBTTtnQkFHWSxPQUFPO3NCQUR6QixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUsIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTZWxmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5nQ29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgZGVsYXksIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBza2lwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERPS1VfRk9STV9GSUVMRF9BQ0NFU1NPUixcbiAgRG9rdUZvcm1GaWVsZCxcbiAgRG9rdUZvcm1GaWVsZEFjY2Vzc29yLFxuICBEb2t1Rm9ybUZpZWxkQWNjZXNzb3JWYWxpZGF0ZVZhbHVlLFxuICBEb2t1Rm9ybUZpZWxkTW9kdWxlLFxuICBEb2t1Rm9ybUZpZWxkT3B0aW9ucyxcbn0gZnJvbSAnLi4vZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBEb2t1SW5wdXQgfSBmcm9tICcuLi9pbnB1dCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rva3UtY29sb3ItcGlja2VyJyxcbiAgZXhwb3J0QXM6ICdkb2t1Q29sb3JQaWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEb2t1Rm9ybUZpZWxkTW9kdWxlLCBEb2t1SW5wdXQsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbG9yLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IERPS1VfRk9STV9GSUVMRF9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IERva3VDb2xvclBpY2tlciB9XSxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdUNvbG9yUGlja2VyXG4gIGltcGxlbWVudHMgRG9rdUZvcm1GaWVsZEFjY2Vzc29yLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xue1xuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBjb2xvciBwaWNrZXIuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNvbG9yIHBpY2tlciBpcyByZWFkb25seS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIHRoZSBjb2xvciBwaWNrZXIgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LlxuICAgKiBAZGVmYXVsdCAnJ1xuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlIHx8ICcnO1xuICB9XG4gIHNldCB2YWx1ZShoZXhDb2xvcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3ZhbHVlID0gaGV4Q29sb3IgfHwgJyc7XG4gICAgdGhpcy52YWx1ZSQubmV4dCh0aGlzLl92YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICAvKipcbiAgICogQW4gZXZlbnQgZW1pdHRlZCB3aGVuIHZhbHVlIGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsYXNzZXM6IE5nQ2xhc3NbJ25nQ2xhc3MnXSA9IFsnZC1jb2xvci1waWNrZXInXTtcblxuICBwcml2YXRlIHZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodGhpcy52YWx1ZSk7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHByaXZhdGUgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBwcm90ZWN0ZWQgZm9ybUZpZWxkPzogRG9rdUZvcm1GaWVsZFxuICApIHtcbiAgICBpZiAobmdDb250cm9sKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBmaWVsZE9wdGlvbnM/OiBEb2t1Rm9ybUZpZWxkT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHsgd2l0aG91dElucHV0U3R5bGU6IHRydWUgfTtcbiAgb25EaXNhYmxlPzogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIG9uUmVhZG9ubHk/OiAoKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgb25WYWxpZGF0ZT86ICgodmFsdWU/OiBEb2t1Rm9ybUZpZWxkQWNjZXNzb3JWYWxpZGF0ZVZhbHVlIHwgdW5kZWZpbmVkKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcmVnaXN0ZXJPbkRpc2FibGUoZm46ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25EaXNhYmxlID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblJlYWRvbmx5KGZuOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uUmVhZG9ubHkgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVmFsaWRhdGU/KGZuOiAodmFsdWU/OiBEb2t1Rm9ybUZpZWxkQWNjZXNzb3JWYWxpZGF0ZVZhbHVlIHwgdW5kZWZpbmVkKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblZhbGlkYXRlID0gZm47XG4gIH1cblxuICBvbkNoYW5nZT86ICh2YWx1ZTogYW55KSA9PiB2b2lkO1xuICBvblRvdWNoZWQ/OiAoKSA9PiB2b2lkO1xuICB3cml0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlJFxuICAgICAgLnBpcGUoc2tpcCgxKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZT8uKHZhbHVlKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLm5nQ29udHJvbD8uc3RhdHVzQ2hhbmdlc1xuICAgICAgPy5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlbGF5KDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChzdGF0dXMpID0+IHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ1ZBTElEJykge1xuICAgICAgICAgIHRoaXMub25WYWxpZGF0ZT8uKCd2YWxpZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ0lOVkFMSUQnKSB7XG4gICAgICAgICAgdGhpcy5vblZhbGlkYXRlPy4oJ2ludmFsaWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uVmFsaWRhdGU/LigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkaXNhYmxlZCddPy5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VzWydkaXNhYmxlZCddPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMub25EaXNhYmxlPy4oISF0aGlzLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sncmVhZG9ubHknXT8ucHJldmlvdXNWYWx1ZSAhPT0gY2hhbmdlc1sncmVhZG9ubHknXT8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLm9uUmVhZG9ubHk/LighIXRoaXMucmVhZG9ubHkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Db2xvckNoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLm9uVG91Y2hlZD8uKCk7XG4gIH1cbn1cbiIsIjxkb2t1LWZvcm0tZmllbGRcbiAgW2lzRXJyb3JTdGF0ZV09XCJmb3JtRmllbGQ/LlsnaXNFcnJvciddXCJcbiAgW2lzU3VjY2Vzc1N0YXRlXT1cImZvcm1GaWVsZD8uWydpc1N1Y2Nlc3MnXVwiXG4gIFtzaG93U3VjY2Vzc0JlaGF2aW9yXT1cIiEhZm9ybUZpZWxkPy5bJ3Nob3dTdWNjZXNzQmVoYXZpb3InXVwiXG4+XG4gIDxpbnB1dFxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBkb2t1LWlucHV0XG4gICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgKGlucHV0KT1cIm9uQ29sb3JDaGFuZ2UoJGV2ZW50KVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIFttYXhsZW5ndGhdPVwiN1wiXG4gIC8+XG4gIDxkb2t1LWZvcm0tZmllbGQgZG9rdS1maWVsZC1wcmVmaXggYXBwZWFyYW5jZT1cImJvcmRlci1ibG9jay1pbnNpZGVcIiBjbGFzcz1cImQtY29sb3ItcGlja2VyLXByZWZpeFwiPlxuICAgIDxpbnB1dFxuICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgIGNsYXNzPVwiZC1jb2xvci1waWNrZXItaW5wdXQtY29sb3JcIlxuICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgICAoaW5wdXQpPVwib25Db2xvckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seVwiXG4gICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIC8+XG4gIDwvZG9rdS1mb3JtLWZpZWxkPlxuPC9kb2t1LWZvcm0tZmllbGQ+XG4iXX0=