@taiga-ui/kit
Version:
Taiga UI Angular main components kit
135 lines • 21.3 kB
JavaScript
import { computed, Directive, effect, inject, Input, isSignal, signal, untracked, } from '@angular/core';
import { tuiAsControl, TuiControl } from '@taiga-ui/cdk/classes';
import { TUI_ALLOW_SIGNAL_WRITES, TUI_STRICT_MATCHER } from '@taiga-ui/cdk/constants';
import { tuiAsOptionContent } from '@taiga-ui/core/components/data-list';
import { tuiAsTextfieldAccessor, tuiInjectAuxiliary, TuiTextfieldComponent, TuiTextfieldDirective, TuiWithTextfield, } from '@taiga-ui/core/components/textfield';
import { TuiDropdownDirective, tuiDropdownEnabled, tuiDropdownOpen, } from '@taiga-ui/core/directives/dropdown';
import { TUI_ITEMS_HANDLERS } from '@taiga-ui/core/directives/items-handlers';
import { TuiSelectOption } from '@taiga-ui/kit/components/select';
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/core/components/textfield";
class TuiComboBox extends TuiControl {
constructor() {
super(...arguments);
this.host = inject(TuiTextfieldComponent);
this.textfield = inject(TuiTextfieldDirective);
this.open = tuiDropdownOpen();
this.dropdownEnabled = tuiDropdownEnabled(this.interactive);
this.dropdown = inject(TuiDropdownDirective);
this.handlers = inject(TUI_ITEMS_HANDLERS);
this.matcher = signal(TUI_STRICT_MATCHER);
this.strict = signal(true);
this.datalist = tuiInjectAuxiliary((x) => x !== this && 'options' in x && isSignal(x.options));
this.options = computed(() => this.datalist()
?.options?.() // TODO(v5): remove optional call `?.()`
.filter((x) => !this.handlers.disabledItemHandler()(x)) ?? []);
this.nonStrictControlEffect = effect(() => {
if (!this.options().length &&
!this.strict() &&
this.stringify(this.value()) !== this.textfield.value()) {
this.onChange(this.textfield.value() || null);
}
}, TUI_ALLOW_SIGNAL_WRITES);
this.matchingEffect = effect(() => {
const options = this.options();
const matcher = this.matcher();
if (!options.length || !matcher) {
return;
}
const textfieldValue = this.textfield.value();
const selectedOption = options.find((x) => matcher(x, textfieldValue, this.handlers.stringify()));
const value = untracked(() => this.value());
const unchanged = this.stringify(value) === textfieldValue;
const fallback = this.strict() || !textfieldValue ? null : textfieldValue;
this.onChange(selectedOption ??
/**
* Don't clear already not-null form control value on new `this.options()` array.
* Otherwise, `ComboBox` becomes incompatible with virtual scroll
* (which displays large lists of elements by only rendering the items that fit on-screen).
* Users can still able to patch form value with `null` on new items if they wish the such behavior.
*/
(unchanged ? value : fallback));
}, TUI_ALLOW_SIGNAL_WRITES);
this.newValueEffect = effect(() => {
const stringified = this.stringify(this.value());
this.textfield.value.update((x) => stringified || x);
}, TUI_ALLOW_SIGNAL_WRITES);
this.blurEffect = effect(() => {
const incomplete = untracked(() => this.strict() && this.value() === null);
if (!this.host.focused() && incomplete) {
this.textfield.value.set('');
}
}, TUI_ALLOW_SIGNAL_WRITES);
}
// TODO(v5): use signal input
set strictSetter(x) {
this.strict.set(x);
}
// TODO(v5): use signal input
set matcherSetter(x) {
this.matcher.set(x);
}
setValue(value) {
this.textfield.setValue(value);
this.onChange(value);
if (!value) {
this.toggleDropdown(true);
}
}
writeValue(value) {
super.writeValue(value);
this.textfield.value.set(this.stringify(value));
}
toggleDropdown(open = !this.open()) {
if (this.dropdownEnabled() && this.dropdown._content()) {
this.open.set(open);
}
}
keydownEnter(event) {
if (!this.open()) {
return;
}
event.preventDefault();
const options = this.options();
if (options.length === 1 && options[0]) {
this.setValue(options[0]);
this.toggleDropdown(false);
}
}
stringify(value) {
return value != null ? this.handlers.stringify()(value) : '';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiComboBox, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiComboBox, isStandalone: true, selector: "input[tuiComboBox]", inputs: { strictSetter: ["strict", "strictSetter"], matcherSetter: ["matcher", "matcherSetter"] }, host: { listeners: { "click": "toggleDropdown()", "input": "toggleDropdown(true)", "keydown.enter": "keydownEnter($event)" }, properties: { "disabled": "disabled()" } }, providers: [
tuiAsOptionContent(TuiSelectOption),
tuiAsTextfieldAccessor(TuiComboBox),
tuiAsControl(TuiComboBox),
], usesInheritance: true, hostDirectives: [{ directive: i1.TuiWithTextfield }], ngImport: i0 }); }
}
export { TuiComboBox };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiComboBox, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: 'input[tuiComboBox]',
providers: [
tuiAsOptionContent(TuiSelectOption),
tuiAsTextfieldAccessor(TuiComboBox),
tuiAsControl(TuiComboBox),
],
hostDirectives: [TuiWithTextfield],
host: {
'[disabled]': 'disabled()',
'(click)': 'toggleDropdown()',
'(input)': 'toggleDropdown(true)',
'(keydown.enter)': 'keydownEnter($event)',
},
}]
}], propDecorators: { strictSetter: [{
type: Input,
args: ['strict']
}], matcherSetter: [{
type: Input,
args: ['matcher']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8tYm94LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL2NvbWJvLWJveC9jb21iby1ib3guZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFHcEYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFFdkUsT0FBTyxFQUNILHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixnQkFBZ0IsR0FDbkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQ0gsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixlQUFlLEdBQ2xCLE1BQU0sb0NBQW9DLENBQUM7QUFFNUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDNUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDOzs7QUFFaEUsTUFnQmEsV0FDVCxTQUFRLFVBQTZCO0lBakJ6Qzs7UUFvQnFCLFNBQUksR0FBNkIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0QsY0FBUyxHQUE2QixNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNwRSxTQUFJLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFDekIsb0JBQWUsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkQsYUFBUSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3hDLGFBQVEsR0FBaUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFcEUsWUFBTyxHQUFHLE1BQU0sQ0FBNkIsa0JBQWtCLENBQUMsQ0FBQztRQUNqRSxXQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLGFBQVEsR0FBRyxrQkFBa0IsQ0FDMUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUM3RCxDQUFDO1FBRWUsWUFBTyxHQUFHLFFBQVEsQ0FDL0IsR0FBRyxFQUFFLENBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNYLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyx3Q0FBd0M7YUFDckQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FDeEUsQ0FBQztRQUVpQiwyQkFBc0IsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ3BELElBQ0ksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTTtnQkFDdEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFDekQ7Z0JBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO2FBQ2pEO1FBQ0wsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFVCxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUUvQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDN0IsT0FBTzthQUNWO1lBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDdEMsT0FBTyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUN4RCxDQUFDO1lBQ0YsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssY0FBYyxDQUFDO1lBQzNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7WUFFMUUsSUFBSSxDQUFDLFFBQVEsQ0FDVCxjQUFjO2dCQUNWOzs7OzttQkFLRztnQkFDSCxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FDckMsQ0FBQztRQUNOLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBRVQsbUJBQWMsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFVCxlQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUN4QyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUUzRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxVQUFVLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNoQztRQUNMLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0tBb0QvQjtJQWxERyw2QkFBNkI7SUFDN0IsSUFDVyxZQUFZLENBQUMsQ0FBVTtRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLElBQ1csYUFBYSxDQUFDLENBQTZCO1FBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBZTtRQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztJQUVlLFVBQVUsQ0FBQyxLQUF3QjtRQUMvQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVTLGNBQWMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ3hDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7SUFDTCxDQUFDO0lBRVMsWUFBWSxDQUFDLEtBQW9CO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDZCxPQUFPO1NBQ1Y7UUFFRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRS9CLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFTyxTQUFTLENBQUMsS0FBeUI7UUFDdkMsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDakUsQ0FBQzsrR0E3SFEsV0FBVzttR0FBWCxXQUFXLDhVQWJUO1lBQ1Asa0JBQWtCLENBQUMsZUFBZSxDQUFDO1lBQ25DLHNCQUFzQixDQUFDLFdBQVcsQ0FBQztZQUNuQyxZQUFZLENBQUMsV0FBVyxDQUFDO1NBQzVCOztTQVNRLFdBQVc7NEZBQVgsV0FBVztrQkFoQnZCLFNBQVM7bUJBQUM7b0JBQ1AsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFNBQVMsRUFBRTt3QkFDUCxrQkFBa0IsQ0FBQyxlQUFlLENBQUM7d0JBQ25DLHNCQUFzQixhQUFhO3dCQUNuQyxZQUFZLGFBQWE7cUJBQzVCO29CQUNELGNBQWMsRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUNsQyxJQUFJLEVBQUU7d0JBQ0YsWUFBWSxFQUFFLFlBQVk7d0JBQzFCLFNBQVMsRUFBRSxrQkFBa0I7d0JBQzdCLFNBQVMsRUFBRSxzQkFBc0I7d0JBQ2pDLGlCQUFpQixFQUFFLHNCQUFzQjtxQkFDNUM7aUJBQ0o7OEJBK0VjLFlBQVk7c0JBRHRCLEtBQUs7dUJBQUMsUUFBUTtnQkFPSixhQUFhO3NCQUR2QixLQUFLO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIGNvbXB1dGVkLFxuICAgIERpcmVjdGl2ZSxcbiAgICBlZmZlY3QsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIGlzU2lnbmFsLFxuICAgIHNpZ25hbCxcbiAgICB1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0dWlBc0NvbnRyb2wsIFR1aUNvbnRyb2x9IGZyb20gJ0B0YWlnYS11aS9jZGsvY2xhc3Nlcyc7XG5pbXBvcnQge1RVSV9BTExPV19TSUdOQUxfV1JJVEVTLCBUVUlfU1RSSUNUX01BVENIRVJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHtUdWlTdHJpbmdNYXRjaGVyfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3R5cGVzJztcbmltcG9ydCB0eXBlIHtUdWlEYXRhTGlzdEFjY2Vzc29yfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2RhdGEtbGlzdCc7XG5pbXBvcnQge3R1aUFzT3B0aW9uQ29udGVudH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9kYXRhLWxpc3QnO1xuaW1wb3J0IHR5cGUge1R1aVRleHRmaWVsZEFjY2Vzc29yfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL3RleHRmaWVsZCc7XG5pbXBvcnQge1xuICAgIHR1aUFzVGV4dGZpZWxkQWNjZXNzb3IsXG4gICAgdHVpSW5qZWN0QXV4aWxpYXJ5LFxuICAgIFR1aVRleHRmaWVsZENvbXBvbmVudCxcbiAgICBUdWlUZXh0ZmllbGREaXJlY3RpdmUsXG4gICAgVHVpV2l0aFRleHRmaWVsZCxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy90ZXh0ZmllbGQnO1xuaW1wb3J0IHtcbiAgICBUdWlEcm9wZG93bkRpcmVjdGl2ZSxcbiAgICB0dWlEcm9wZG93bkVuYWJsZWQsXG4gICAgdHVpRHJvcGRvd25PcGVuLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2Ryb3Bkb3duJztcbmltcG9ydCB0eXBlIHtUdWlJdGVtc0hhbmRsZXJzfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2l0ZW1zLWhhbmRsZXJzJztcbmltcG9ydCB7VFVJX0lURU1TX0hBTkRMRVJTfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2l0ZW1zLWhhbmRsZXJzJztcbmltcG9ydCB7VHVpU2VsZWN0T3B0aW9ufSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvc2VsZWN0JztcblxuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ2lucHV0W3R1aUNvbWJvQm94XScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHR1aUFzT3B0aW9uQ29udGVudChUdWlTZWxlY3RPcHRpb24pLFxuICAgICAgICB0dWlBc1RleHRmaWVsZEFjY2Vzc29yKFR1aUNvbWJvQm94KSxcbiAgICAgICAgdHVpQXNDb250cm9sKFR1aUNvbWJvQm94KSxcbiAgICBdLFxuICAgIGhvc3REaXJlY3RpdmVzOiBbVHVpV2l0aFRleHRmaWVsZF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2Rpc2FibGVkXSc6ICdkaXNhYmxlZCgpJyxcbiAgICAgICAgJyhjbGljayknOiAndG9nZ2xlRHJvcGRvd24oKScsXG4gICAgICAgICcoaW5wdXQpJzogJ3RvZ2dsZURyb3Bkb3duKHRydWUpJyxcbiAgICAgICAgJyhrZXlkb3duLmVudGVyKSc6ICdrZXlkb3duRW50ZXIoJGV2ZW50KScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpQ29tYm9Cb3g8VD5cbiAgICBleHRlbmRzIFR1aUNvbnRyb2w8VCB8IHN0cmluZyB8IG51bGw+XG4gICAgaW1wbGVtZW50cyBUdWlUZXh0ZmllbGRBY2Nlc3NvcjxUPlxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogVHVpVGV4dGZpZWxkQ29tcG9uZW50PFQ+ID0gaW5qZWN0KFR1aVRleHRmaWVsZENvbXBvbmVudCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZXh0ZmllbGQ6IFR1aVRleHRmaWVsZERpcmVjdGl2ZTxUPiA9IGluamVjdChUdWlUZXh0ZmllbGREaXJlY3RpdmUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3BlbiA9IHR1aURyb3Bkb3duT3BlbigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZHJvcGRvd25FbmFibGVkID0gdHVpRHJvcGRvd25FbmFibGVkKHRoaXMuaW50ZXJhY3RpdmUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZHJvcGRvd24gPSBpbmplY3QoVHVpRHJvcGRvd25EaXJlY3RpdmUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IFR1aUl0ZW1zSGFuZGxlcnM8VCB8IHN0cmluZz4gPSBpbmplY3QoVFVJX0lURU1TX0hBTkRMRVJTKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF0Y2hlciA9IHNpZ25hbDxUdWlTdHJpbmdNYXRjaGVyPFQ+IHwgbnVsbD4oVFVJX1NUUklDVF9NQVRDSEVSKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmljdCA9IHNpZ25hbCh0cnVlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGFsaXN0ID0gdHVpSW5qZWN0QXV4aWxpYXJ5PFR1aURhdGFMaXN0QWNjZXNzb3I8VD4+KFxuICAgICAgICAoeCkgPT4geCAhPT0gdGhpcyAmJiAnb3B0aW9ucycgaW4geCAmJiBpc1NpZ25hbCh4Lm9wdGlvbnMpLFxuICAgICk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnMgPSBjb21wdXRlZChcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHRoaXMuZGF0YWxpc3QoKVxuICAgICAgICAgICAgICAgID8ub3B0aW9ucz8uKCkgLy8gVE9ETyh2NSk6IHJlbW92ZSBvcHRpb25hbCBjYWxsIGA/LigpYFxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+ICF0aGlzLmhhbmRsZXJzLmRpc2FibGVkSXRlbUhhbmRsZXIoKSh4KSkgPz8gW10sXG4gICAgKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBub25TdHJpY3RDb250cm9sRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMub3B0aW9ucygpLmxlbmd0aCAmJlxuICAgICAgICAgICAgIXRoaXMuc3RyaWN0KCkgJiZcbiAgICAgICAgICAgIHRoaXMuc3RyaW5naWZ5KHRoaXMudmFsdWUoKSkgIT09IHRoaXMudGV4dGZpZWxkLnZhbHVlKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGV4dGZpZWxkLnZhbHVlKCkgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9LCBUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUyk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF0Y2hpbmdFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoZXIgPSB0aGlzLm1hdGNoZXIoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoIHx8ICFtYXRjaGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0ZmllbGRWYWx1ZSA9IHRoaXMudGV4dGZpZWxkLnZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gb3B0aW9ucy5maW5kKCh4KSA9PlxuICAgICAgICAgICAgbWF0Y2hlcih4LCB0ZXh0ZmllbGRWYWx1ZSwgdGhpcy5oYW5kbGVycy5zdHJpbmdpZnkoKSksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdW50cmFja2VkKCgpID0+IHRoaXMudmFsdWUoKSk7XG4gICAgICAgIGNvbnN0IHVuY2hhbmdlZCA9IHRoaXMuc3RyaW5naWZ5KHZhbHVlKSA9PT0gdGV4dGZpZWxkVmFsdWU7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrID0gdGhpcy5zdHJpY3QoKSB8fCAhdGV4dGZpZWxkVmFsdWUgPyBudWxsIDogdGV4dGZpZWxkVmFsdWU7XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShcbiAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uID8/XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogRG9uJ3QgY2xlYXIgYWxyZWFkeSBub3QtbnVsbCBmb3JtIGNvbnRyb2wgdmFsdWUgb24gbmV3IGB0aGlzLm9wdGlvbnMoKWAgYXJyYXkuXG4gICAgICAgICAgICAgICAgICogT3RoZXJ3aXNlLCBgQ29tYm9Cb3hgIGJlY29tZXMgaW5jb21wYXRpYmxlIHdpdGggdmlydHVhbCBzY3JvbGxcbiAgICAgICAgICAgICAgICAgKiAod2hpY2ggZGlzcGxheXMgbGFyZ2UgbGlzdHMgb2YgZWxlbWVudHMgYnkgb25seSByZW5kZXJpbmcgdGhlIGl0ZW1zIHRoYXQgZml0IG9uLXNjcmVlbikuXG4gICAgICAgICAgICAgICAgICogVXNlcnMgY2FuIHN0aWxsIGFibGUgdG8gcGF0Y2ggZm9ybSB2YWx1ZSB3aXRoIGBudWxsYCBvbiBuZXcgaXRlbXMgaWYgdGhleSB3aXNoIHRoZSBzdWNoIGJlaGF2aW9yLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICh1bmNoYW5nZWQgPyB2YWx1ZSA6IGZhbGxiYWNrKSxcbiAgICAgICAgKTtcbiAgICB9LCBUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUyk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV3VmFsdWVFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHRoaXMuc3RyaW5naWZ5KHRoaXMudmFsdWUoKSk7XG5cbiAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUudXBkYXRlKCh4KSA9PiBzdHJpbmdpZmllZCB8fCB4KTtcbiAgICB9LCBUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUyk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmx1ckVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluY29tcGxldGUgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5zdHJpY3QoKSAmJiB0aGlzLnZhbHVlKCkgPT09IG51bGwpO1xuXG4gICAgICAgIGlmICghdGhpcy5ob3N0LmZvY3VzZWQoKSAmJiBpbmNvbXBsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRmaWVsZC52YWx1ZS5zZXQoJycpO1xuICAgICAgICB9XG4gICAgfSwgVFVJX0FMTE9XX1NJR05BTF9XUklURVMpO1xuXG4gICAgLy8gVE9ETyh2NSk6IHVzZSBzaWduYWwgaW5wdXRcbiAgICBASW5wdXQoJ3N0cmljdCcpXG4gICAgcHVibGljIHNldCBzdHJpY3RTZXR0ZXIoeDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnN0cmljdC5zZXQoeCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyh2NSk6IHVzZSBzaWduYWwgaW5wdXRcbiAgICBASW5wdXQoJ21hdGNoZXInKVxuICAgIHB1YmxpYyBzZXQgbWF0Y2hlclNldHRlcih4OiBUdWlTdHJpbmdNYXRjaGVyPFQ+IHwgbnVsbCkge1xuICAgICAgICB0aGlzLm1hdGNoZXIuc2V0KHgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRWYWx1ZSh2YWx1ZTogVCB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50ZXh0ZmllbGQuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdyaXRlVmFsdWUodmFsdWU6IFQgfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLnRleHRmaWVsZC52YWx1ZS5zZXQodGhpcy5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlRHJvcGRvd24ob3BlbiA9ICF0aGlzLm9wZW4oKSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kcm9wZG93bkVuYWJsZWQoKSAmJiB0aGlzLmRyb3Bkb3duLl9jb250ZW50KCkpIHtcbiAgICAgICAgICAgIHRoaXMub3Blbi5zZXQob3Blbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQga2V5ZG93bkVudGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiBvcHRpb25zWzBdKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKG9wdGlvbnNbMF0pO1xuICAgICAgICAgICAgdGhpcy50b2dnbGVEcm9wZG93bihmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0cmluZ2lmeSh2YWx1ZT86IFQgfCBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB0aGlzLmhhbmRsZXJzLnN0cmluZ2lmeSgpKHZhbHVlKSA6ICcnO1xuICAgIH1cbn1cbiJdfQ==