@nova-ui/bits
Version:
SolarWinds Nova Framework
320 lines • 58.9 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { LiveAnnouncer } from "@angular/cdk/a11y";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, forwardRef, Input, Output, QueryList, ViewEncapsulation, } from "@angular/core";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import includes from "lodash/includes";
import isEqual from "lodash/isEqual";
import { NuiFormFieldControl } from "../../form-field/public-api";
import { BaseSelectV2 } from "../base-select-v2";
import { NUI_SELECT_V2_OPTION_PARENT_COMPONENT } from "../constants";
import { MarkAsSelectedItemDirective } from "../mark-as-selected-item.directive";
import { OptionKeyControlService } from "../option-key-control.service";
import { SelectedItemsKeyControlService } from "../selected-items-key-control.service";
import * as i0 from "@angular/core";
import * as i1 from "../option-key-control.service";
import * as i2 from "../selected-items-key-control.service";
import * as i3 from "@angular/cdk/a11y";
import * as i4 from "@angular/forms";
import * as i5 from "../../button/button.component";
import * as i6 from "../../tooltip/tooltip.directive";
import * as i7 from "@angular/common";
import * as i8 from "../../overlay/overlay-component/overlay.component";
// <example-url>./../examples/index.html#/combobox-v2</example-url>
// Will be renamed in scope of the NUI-5797
export class ComboboxV2Component extends BaseSelectV2 {
/** Grabs and init keyboard navigation service for the "Selected Items" */
set selectedItems(elems) {
this.selectedItemsKeyControlService.initSelectedItemsKeyManager(elems, this);
}
constructor(elRef, optionKeyControlService, cdRef, selectedItemsKeyControlService, liveAnnouncer) {
super(optionKeyControlService, cdRef, elRef, liveAnnouncer);
this.selectedItemsKeyControlService = selectedItemsKeyControlService;
this.liveAnnouncer = liveAnnouncer;
/** Function that maps an Option's control value to its display value */
this.displayWith = null;
/** Whether the control for removing value enabled */
this.isRemoveValueEnabled = true;
/** Whether to populate the remainder of the text being typed */
this.isTypeaheadEnabled = true;
/** Emits event whether options are presented after filtering */
this.searchEmpty = new EventEmitter(false);
/** Emits event whether the typed text is unique among presented options */
this.canCreateOption = new EventEmitter(false);
}
ngAfterContentInit() {
this.clearValueButtonTooltip = this.multiselect
? $localize `Remove all`
: $localize `Remove`;
// applying changes to content immediately after it was initialized (checked)
// causes "Expression has changed after it was checked" error
setTimeout(() => {
super.ngAfterContentInit();
if (!this.multiselect) {
this.setInputValue(this.getLastSelectedOption()?.value);
}
this.cdRef.markForCheck();
});
// options may be received after value changes, that's why
// we check "selectedOptions" to be set per "value" again in "handleValueChange"
this.optionsChanged().subscribe(() => {
this.filterItems(this.inputValue.toString());
// We need the active option to always stay visible during the options filtering.
this.optionKeyControlService.scrollToActiveItem({
block: "start",
behavior: "smooth",
});
this.cdRef.markForCheck();
});
}
ngAfterViewInit() {
super.ngAfterViewInit();
if (!this.multiselect) {
this.dropdown.hide$.subscribe(() => {
const lastSelectedOption = this.getLastSelectedOption();
if (lastSelectedOption) {
this.setInputValue(lastSelectedOption.value);
this.filterItems(this.inputValue.toString());
this.cdRef.markForCheck();
}
});
}
}
ngOnChanges(changes) {
super.ngOnChanges(changes);
}
/** Handles behavior on mouseup event */
onMouseUp(target) {
this.mouseDown = false;
if (!this.manualDropdownControl) {
if (target !== this.inputElement.nativeElement &&
!this.dropdown.showing) {
this.inputElement.nativeElement.focus();
return;
}
this.toggleDropdown();
}
}
/** Handles behavior on keydown event */
onKeyDown(event) {
super.onKeyDown(event);
this.selectedItemsKeyControlService.onKeydown(event);
if (this.selectedItemsKeyControlService.isSelectedItemsActive()) {
this.optionKeyControlService.resetActiveItem();
}
else if (this.optionKeyControlService.getActiveItemIndex() === -1) {
this.optionKeyControlService.setFirstItemActive();
}
}
/** Toggles dropdown and removes focus from Selected Items */
toggleDropdown() {
super.toggleDropdown();
this.selectedItemsKeyControlService.deactivateSelectedItems();
}
/** Selects specific option and set its value to the model */
selectOption(option) {
if (option.outfiltered || option.isDisabled) {
return;
}
super.selectOption(option);
this.setInputValue(option.value);
this.filterItems();
if (this.multiselect) {
this.optionKeyControlService.setFirstItemActive();
}
this.cdRef.markForCheck();
}
/**
* @param {OptionValueType} item Deselect using value
* @param {number} item Deselect using index in multiselect values array
* Deselects item from Selected Items by index or value
*/
deselectItem(item) {
let option;
if (typeof item === "number" && this.multiselect) {
const value = this.value[item];
option = this.options.find((o) => isEqual(o.value, value));
}
else {
option = this.options.find((o) => isEqual(o.value, item));
}
if (option) {
this.removeSelected(option);
this.filterItems();
this.optionKeyControlService.setFirstItemActive();
}
}
/** Handles behavior on Input value change */
handleInput(inputValue) {
if (!inputValue && !this.multiselect) {
this.clearValue();
return;
}
this.filterItems(inputValue.toString());
if (!this.manualDropdownControl) {
this.showDropdown();
}
this.valueChanged.emit(inputValue);
}
/** Selects text in Input */
selectTextInInput() {
if (!this.isDropdownOpen) {
return;
}
setTimeout(() => this.inputElement.nativeElement.select());
}
/** Sets value to the model */
writeValue(value) {
super.writeValue(value);
this.setInputValue(value);
this.cdRef.markForCheck();
}
/** Clears up Combobox to the initial value */
clearValue(event, keepDropdown) {
if (!this.isDisabled) {
this.selectedOptions = [];
this.onTouched();
this.setInputValue("");
this.removeSelected();
event?.stopPropagation(); // To avoid triggering dropdown open/close
this.filterItems();
this.optionKeyControlService.setFirstItemActive();
if (!keepDropdown && !this.manualDropdownControl) {
this.dropdown.hide();
}
}
}
/*
* Calls to ngOnDestroy do not automatically get propagated to base classes.
* This can lead to memory leaks.
* This is a safe guard for preventing memory leaks in derived classes.
*/
ngOnDestroy() {
super.ngOnDestroy();
}
handleValueChange(value) {
if (this.multiselect) {
this.selectedOptions.forEach((selectedOption) => (selectedOption.outfiltered = false));
}
super.handleValueChange(value);
}
setInputValue(value) {
const inputValueToSet = this.multiselect ? "" : value;
const toDisplay = this.displayWith
? this.displayWith(inputValueToSet)
: inputValueToSet;
// Simply falling back to an empty string if the display value is falsy does not work properly.
// The display value can also be the number zero and shouldn't fall back to an empty string.
this.inputValue = toDisplay || "";
this.valueChanged.emit(this.inputValue);
}
filterItems(searchValue) {
if (this.isTypeaheadEnabled) {
let filterValue = searchValue?.toString().toLowerCase() || "";
if (!this.multiselect) {
// if inputValue is the same as selectedOption, search for "" to display all the options
filterValue =
this.getLastSelectedOption()?.viewValue.toLowerCase() ===
filterValue
? ""
: filterValue;
}
this.options.forEach((option) => {
const optionName = option.viewValue.toLowerCase();
option.outfiltered = !includes(optionName, filterValue);
});
if (this.multiselect) {
this.selectedOptions.forEach((selectedOption) => (selectedOption.outfiltered = true));
}
this.emitSearchResults();
}
}
emitSearchResults() {
const allOutfiltered = !this.options.some((option) => !option.outfiltered);
this.searchEmpty.emit(allOutfiltered);
this.canCreateOption.emit(this.isInputValueUnique());
}
isInputValueUnique() {
const optionName = (option) => option?.viewValue.toLowerCase();
const inputValue = this.inputValue.toString().toLowerCase();
return Boolean(this.inputValue &&
!this.options.find((option) => optionName(option) === inputValue));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ComboboxV2Component, deps: [{ token: i0.ElementRef }, { token: i1.OptionKeyControlService }, { token: i0.ChangeDetectorRef }, { token: i2.SelectedItemsKeyControlService }, { token: i3.LiveAnnouncer }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ComboboxV2Component, selector: "nui-combobox-v2", inputs: { displayWith: "displayWith", isRemoveValueEnabled: "isRemoveValueEnabled", isTypeaheadEnabled: "isTypeaheadEnabled" }, outputs: { searchEmpty: "searchEmpty", canCreateOption: "canCreateOption" }, host: { attributes: { "role": "combobox", "aria-haspopup": "listbox", "aria-owns": "nui-overlay" }, properties: { "attr.aria-expanded": "isDropdownOpen || false" }, classAttribute: "nui-combobox-v2" }, providers: [
OptionKeyControlService,
SelectedItemsKeyControlService,
{
provide: NUI_SELECT_V2_OPTION_PARENT_COMPONENT,
useExisting: ComboboxV2Component,
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => ComboboxV2Component),
multi: true,
},
{
provide: NuiFormFieldControl,
useExisting: forwardRef(() => ComboboxV2Component),
multi: true,
},
], queries: [{ propertyName: "selectedItems", predicate: MarkAsSelectedItemDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"w-100 d-flex flex-wrap align-items-center pt-2\"\n [attr.role]=\"multiselect && selectedOptions.length ? 'list' : null\"\n>\n <ng-content select=\"[selectedItems]\"></ng-content>\n\n <input\n class=\"nui-combobox-v2__input pb-2\"\n type=\"text\"\n [attr.aria-label]=\"ariaLabel || 'input'\"\n [class.has-error]=\"isInErrorState\"\n [disabled]=\"isDisabled\"\n [(ngModel)]=\"inputValue\"\n [placeholder]=\"placeholder\"\n (input)=\"handleInput(input.value)\"\n (keydown)=\"onKeyDown($event)\"\n (click)=\"selectTextInInput()\"\n #input\n />\n</div>\n<button\n tabindex=\"0\"\n *ngIf=\"isRemoveValueEnabled && (selectedOptions[0] || inputValue)\"\n nui-button\n class=\"nui-combobox-v2__remove-value action\"\n (click)=\"clearValue($event)\"\n [isEmpty]=\"true\"\n icon=\"remove\"\n type=\"button\"\n [nuiTooltip]=\"clearValueButtonTooltip\"\n [class.disabled]=\"isDisabled\"\n [disabled]=\"isDisabled\"\n></button>\n<button\n tabindex=\"-1\"\n class=\"nui-combobox-v2__toggle action\"\n nui-button\n type=\"button\"\n [isEmpty]=\"true\"\n icon=\"caret-down\"\n [class.rotate]=\"isDropdownOpen\"\n [class.disabled]=\"isDisabled\"\n [disabled]=\"isDisabled\"\n (click)=\"selectTextInInput()\"\n></button>\n<nui-overlay\n roleAttr=\"listbox\"\n [toggleReference]=\"elRef.nativeElement\"\n [viewportMargin]=\"popupViewportMargin\"\n [overlayConfig]=\"overlayConfig\"\n>\n <ng-content></ng-content>\n</nui-overlay>\n", styles: [".nui-combobox-v2{border-color:var(--nui-color-line-default,#d9d9d9);border-width:1px;border-style:solid;border-radius:3px;background:var(--nui-color-bg-content,#fff);box-shadow:inset 0 1px 1px #00000013;display:flex;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;color:var(--nui-color-text-default,#111);min-height:28px;line-height:23px;min-width:100px;font-size:13px}.nui-combobox-v2:hover{border-color:var(--nui-color-line-default-hover,#b3b3b3)}.nui-combobox-v2:focus-within,.nui-combobox-v2:focus{border-color:var(--nui-color-line-active,#0079aa);outline:none}.nui-combobox-v2.error,.nui-combobox-v2.has-error{border-color:var(--nui-color-line-critical,#dd2c00)}.nui-combobox-v2.error:hover,.nui-combobox-v2.has-error:hover,.nui-combobox-v2.error:focus,.nui-combobox-v2.has-error:focus,.nui-combobox-v2.error:active,.nui-combobox-v2.has-error:active{border-color:var(--nui-color-line-critical,#dd2c00)}.nui-combobox-v2.disabled,.nui-combobox-v2[disabled]{background:var(--nui-color-disabled-secondary,#e8e8e8);border-color:transparent;cursor:not-allowed}.nui-combobox-v2.disabled:hover,.nui-combobox-v2[disabled]:hover{background:var(--nui-color-disabled-secondary,#e8e8e8);border-color:transparent}.nui-combobox-v2[readonly]{color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));background:var(--nui-color-disabled-secondary,#e8e8e8);border-color:transparent;cursor:default}.nui-combobox-v2[readonly]:hover,.nui-combobox-v2[readonly]:focus,.nui-combobox-v2[readonly]:active{color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));background:var(--nui-color-disabled-secondary,#e8e8e8);border-color:transparent}.nui-combobox-v2.disabled{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.nui-combobox-v2__input{flex:1;outline:none;box-sizing:border-box;border:none;background-color:transparent;background-image:none;min-height:23px;height:23px;resize:vertical;padding:0 10px;overflow-y:hidden;cursor:text;width:inherit;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}.nui-combobox-v2__input[disabled]{cursor:not-allowed}.nui-combobox-v2__input[disabled]::placeholder{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3))}.nui-combobox-v2__input::placeholder{color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));font-size:13px;font-weight:400;margin-right:5px;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}.nui-combobox-v2__remove-value.nui-button.action{border:none;border-radius:0;border-right:1px solid;border-right-color:var(--nui-color-line-default,#d9d9d9);min-height:28px;max-height:28px;align-self:center}.nui-combobox-v2__remove-value.nui-button.action:hover,.nui-combobox-v2__remove-value.nui-button.action:focus,.nui-combobox-v2__remove-value.nui-button.action:active{border-right:1px solid;border-right-color:var(--nui-color-line-default,#d9d9d9)}.nui-combobox-v2__remove-value.nui-button.action:focus{border-radius:3px;outline:none;z-index:500;box-shadow:inset 0 0 0 2px #00c4d280}.nui-combobox-v2__toggle.nui-button.action{min-height:28px;max-height:28px;align-self:center}.nui-combobox-v2__toggle.nui-button.action.rotate nui-icon{transform:rotate(180deg)}\n"], dependencies: [{ kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.ButtonComponent, selector: "[nui-button]", inputs: ["displayStyle", "icon", "iconColor", "iconRight", "isBusy", "isEmpty", "ariaLabel", "isRepeat", "size"] }, { kind: "directive", type: i6.TooltipDirective, selector: "[nuiTooltip]", inputs: ["tooltipPlacement", "nuiTooltipDisabled", "nuiTooltipEllipsis", "nuiTooltip"], exportAs: ["nuiTooltip"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.OverlayComponent, selector: "nui-overlay", inputs: ["overlayConfig", "toggleReference", "viewportMargin", "customContainer", "roleAttr"], outputs: ["clickOutside"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ComboboxV2Component, decorators: [{
type: Component,
args: [{ selector: "nui-combobox-v2", providers: [
OptionKeyControlService,
SelectedItemsKeyControlService,
{
provide: NUI_SELECT_V2_OPTION_PARENT_COMPONENT,
useExisting: ComboboxV2Component,
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => ComboboxV2Component),
multi: true,
},
{
provide: NuiFormFieldControl,
useExisting: forwardRef(() => ComboboxV2Component),
multi: true,
},
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
class: "nui-combobox-v2",
role: "combobox",
"[attr.aria-expanded]": "isDropdownOpen || false",
"aria-haspopup": "listbox",
"aria-owns": "nui-overlay",
}, template: "<div\n class=\"w-100 d-flex flex-wrap align-items-center pt-2\"\n [attr.role]=\"multiselect && selectedOptions.length ? 'list' : null\"\n>\n <ng-content select=\"[selectedItems]\"></ng-content>\n\n <input\n class=\"nui-combobox-v2__input pb-2\"\n type=\"text\"\n [attr.aria-label]=\"ariaLabel || 'input'\"\n [class.has-error]=\"isInErrorState\"\n [disabled]=\"isDisabled\"\n [(ngModel)]=\"inputValue\"\n [placeholder]=\"placeholder\"\n (input)=\"handleInput(input.value)\"\n (keydown)=\"onKeyDown($event)\"\n (click)=\"selectTextInInput()\"\n #input\n />\n</div>\n<button\n tabindex=\"0\"\n *ngIf=\"isRemoveValueEnabled && (selectedOptions[0] || inputValue)\"\n nui-button\n class=\"nui-combobox-v2__remove-value action\"\n (click)=\"clearValue($event)\"\n [isEmpty]=\"true\"\n icon=\"remove\"\n type=\"button\"\n [nuiTooltip]=\"clearValueButtonTooltip\"\n [class.disabled]=\"isDisabled\"\n [disabled]=\"isDisabled\"\n></button>\n<button\n tabindex=\"-1\"\n class=\"nui-combobox-v2__toggle action\"\n nui-button\n type=\"button\"\n [isEmpty]=\"true\"\n icon=\"caret-down\"\n [class.rotate]=\"isDropdownOpen\"\n [class.disabled]=\"isDisabled\"\n [disabled]=\"isDisabled\"\n (click)=\"selectTextInInput()\"\n></button>\n<nui-overlay\n roleAttr=\"listbox\"\n [toggleReference]=\"elRef.nativeElement\"\n [viewportMargin]=\"popupViewportMargin\"\n [overlayConfig]=\"overlayConfig\"\n>\n <ng-content></ng-content>\n</nui-overlay>\n", styles: [".nui-combobox-v2{border-color:var(--nui-color-line-default,#d9d9d9);border-width:1px;border-style:solid;border-radius:3px;background:var(--nui-color-bg-content,#fff);box-shadow:inset 0 1px 1px #00000013;display:flex;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;color:var(--nui-color-text-default,#111);min-height:28px;line-height:23px;min-width:100px;font-size:13px}.nui-combobox-v2:hover{border-color:var(--nui-color-line-default-hover,#b3b3b3)}.nui-combobox-v2:focus-within,.nui-combobox-v2:focus{border-color:var(--nui-color-line-active,#0079aa);outline:none}.nui-combobox-v2.error,.nui-combobox-v2.has-error{border-color:var(--nui-color-line-critical,#dd2c00)}.nui-combobox-v2.error:hover,.nui-combobox-v2.has-error:hover,.nui-combobox-v2.error:focus,.nui-combobox-v2.has-error:focus,.nui-combobox-v2.error:active,.nui-combobox-v2.has-error:active{border-color:var(--nui-color-line-critical,#dd2c00)}.nui-combobox-v2.disabled,.nui-combobox-v2[disabled]{background:var(--nui-color-disabled-secondary,#e8e8e8);border-color:transparent;cursor:not-allowed}.nui-combobox-v2.disabled:hover,.nui-combobox-v2[disabled]:hover{background:var(--nui-color-disabled-secondary,#e8e8e8);border-color:transparent}.nui-combobox-v2[readonly]{color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));background:var(--nui-color-disabled-secondary,#e8e8e8);border-color:transparent;cursor:default}.nui-combobox-v2[readonly]:hover,.nui-combobox-v2[readonly]:focus,.nui-combobox-v2[readonly]:active{color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));background:var(--nui-color-disabled-secondary,#e8e8e8);border-color:transparent}.nui-combobox-v2.disabled{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.nui-combobox-v2__input{flex:1;outline:none;box-sizing:border-box;border:none;background-color:transparent;background-image:none;min-height:23px;height:23px;resize:vertical;padding:0 10px;overflow-y:hidden;cursor:text;width:inherit;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}.nui-combobox-v2__input[disabled]{cursor:not-allowed}.nui-combobox-v2__input[disabled]::placeholder{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3))}.nui-combobox-v2__input::placeholder{color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));font-size:13px;font-weight:400;margin-right:5px;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}.nui-combobox-v2__remove-value.nui-button.action{border:none;border-radius:0;border-right:1px solid;border-right-color:var(--nui-color-line-default,#d9d9d9);min-height:28px;max-height:28px;align-self:center}.nui-combobox-v2__remove-value.nui-button.action:hover,.nui-combobox-v2__remove-value.nui-button.action:focus,.nui-combobox-v2__remove-value.nui-button.action:active{border-right:1px solid;border-right-color:var(--nui-color-line-default,#d9d9d9)}.nui-combobox-v2__remove-value.nui-button.action:focus{border-radius:3px;outline:none;z-index:500;box-shadow:inset 0 0 0 2px #00c4d280}.nui-combobox-v2__toggle.nui-button.action{min-height:28px;max-height:28px;align-self:center}.nui-combobox-v2__toggle.nui-button.action.rotate nui-icon{transform:rotate(180deg)}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.OptionKeyControlService }, { type: i0.ChangeDetectorRef }, { type: i2.SelectedItemsKeyControlService }, { type: i3.LiveAnnouncer }], propDecorators: { displayWith: [{
type: Input
}], isRemoveValueEnabled: [{
type: Input
}], isTypeaheadEnabled: [{
type: Input
}], searchEmpty: [{
type: Output
}], canCreateOption: [{
type: Output
}], selectedItems: [{
type: ContentChildren,
args: [MarkAsSelectedItemDirective, { descendants: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3gtdjIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZWxlY3QtdjIvY29tYm9ib3gtdjIvY29tYm9ib3gtdjIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZWxlY3QtdjIvY29tYm9ib3gtdjIvY29tYm9ib3gtdjIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBR0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUVULGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLHFDQUFxQyxFQUFF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eUJBQ25DO3dCQUNEOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDOzRCQUNsRCxLQUFLLEVBQUUsSUFBSTt5QkFDZDt3QkFDRDs0QkFDSSxPQUFPLEVBQUUsbUJBQW1COzRCQUM1QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQzs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0osbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0YsS0FBSyxFQUFFLGlCQUFpQjt3QkFDeEIsSUFBSSxFQUFFLFVBQVU7d0JBQ2hCLHNCQUFzQixFQUFFLHlCQUF5Qjt3QkFDakQsZUFBZSxFQUFFLFNBQVM7d0JBQzFCLFdBQVcsRUFBRSxhQUFhO3FCQUM3Qjs4TkFTZSxXQUFXO3NCQUExQixLQUFLO2dCQUdVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFHVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBR1csV0FBVztzQkFBM0IsTUFBTTtnQkFHVSxlQUFlO3NCQUEvQixNQUFNO2dCQUlILGFBQWE7c0JBRGhCLGVBQWU7dUJBQUMsMkJBQTJCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IExpdmVBbm5vdW5jZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2ExMXlcIjtcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgaW5jbHVkZXMgZnJvbSBcImxvZGFzaC9pbmNsdWRlc1wiO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSBcImxvZGFzaC9pc0VxdWFsXCI7XG5cbmltcG9ydCB7IE51aUZvcm1GaWVsZENvbnRyb2wgfSBmcm9tIFwiLi4vLi4vZm9ybS1maWVsZC9wdWJsaWMtYXBpXCI7XG5pbXBvcnQgeyBJT3B0aW9uVmFsdWVPYmplY3QsIE9wdGlvblZhbHVlVHlwZSB9IGZyb20gXCIuLi8uLi9vdmVybGF5L3R5cGVzXCI7XG5pbXBvcnQgeyBCYXNlU2VsZWN0VjIgfSBmcm9tIFwiLi4vYmFzZS1zZWxlY3QtdjJcIjtcbmltcG9ydCB7IE5VSV9TRUxFQ1RfVjJfT1BUSU9OX1BBUkVOVF9DT01QT05FTlQgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNYXJrQXNTZWxlY3RlZEl0ZW1EaXJlY3RpdmUgfSBmcm9tIFwiLi4vbWFyay1hcy1zZWxlY3RlZC1pdGVtLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgU2VsZWN0VjJPcHRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vb3B0aW9uL3NlbGVjdC12Mi1vcHRpb24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBPcHRpb25LZXlDb250cm9sU2VydmljZSB9IGZyb20gXCIuLi9vcHRpb24ta2V5LWNvbnRyb2wuc2VydmljZVwiO1xuaW1wb3J0IHsgU2VsZWN0ZWRJdGVtc0tleUNvbnRyb2xTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlbGVjdGVkLWl0ZW1zLWtleS1jb250cm9sLnNlcnZpY2VcIjtcbmltcG9ydCB7IElucHV0VmFsdWVUeXBlcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vLyA8ZXhhbXBsZS11cmw+Li8uLi9leGFtcGxlcy9pbmRleC5odG1sIy9jb21ib2JveC12MjwvZXhhbXBsZS11cmw+XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51aS1jb21ib2JveC12MlwiLFxuICAgIHRlbXBsYXRlVXJsOiBcImNvbWJvYm94LXYyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCJjb21ib2JveC12Mi5jb21wb25lbnQubGVzc1wiXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgT3B0aW9uS2V5Q29udHJvbFNlcnZpY2UsXG4gICAgICAgIFNlbGVjdGVkSXRlbXNLZXlDb250cm9sU2VydmljZSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTlVJX1NFTEVDVF9WMl9PUFRJT05fUEFSRU5UX0NPTVBPTkVOVCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBDb21ib2JveFYyQ29tcG9uZW50LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbWJvYm94VjJDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE51aUZvcm1GaWVsZENvbnRyb2wsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21ib2JveFYyQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiBcIm51aS1jb21ib2JveC12MlwiLFxuICAgICAgICByb2xlOiBcImNvbWJvYm94XCIsXG4gICAgICAgIFwiW2F0dHIuYXJpYS1leHBhbmRlZF1cIjogXCJpc0Ryb3Bkb3duT3BlbiB8fCBmYWxzZVwiLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJsaXN0Ym94XCIsXG4gICAgICAgIFwiYXJpYS1vd25zXCI6IFwibnVpLW92ZXJsYXlcIixcbiAgICB9LFxufSlcblxuLy8gV2lsbCBiZSByZW5hbWVkIGluIHNjb3BlIG9mIHRoZSBOVUktNTc5N1xuZXhwb3J0IGNsYXNzIENvbWJvYm94VjJDb21wb25lbnRcbiAgICBleHRlbmRzIEJhc2VTZWxlY3RWMlxuICAgIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXRcbntcbiAgICAvKiogRnVuY3Rpb24gdGhhdCBtYXBzIGFuIE9wdGlvbidzIGNvbnRyb2wgdmFsdWUgdG8gaXRzIGRpc3BsYXkgdmFsdWUgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzcGxheVdpdGg6ICgodmFsdWU6IGFueSkgPT4gc3RyaW5nKSB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbnRyb2wgZm9yIHJlbW92aW5nIHZhbHVlIGVuYWJsZWQgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaXNSZW1vdmVWYWx1ZUVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdG8gcG9wdWxhdGUgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGV4dCBiZWluZyB0eXBlZCAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpc1R5cGVhaGVhZEVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIEVtaXRzIGV2ZW50IHdoZXRoZXIgb3B0aW9ucyBhcmUgcHJlc2VudGVkIGFmdGVyIGZpbHRlcmluZyAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgc2VhcmNoRW1wdHkgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBFbWl0cyBldmVudCB3aGV0aGVyIHRoZSB0eXBlZCB0ZXh0IGlzIHVuaXF1ZSBhbW9uZyBwcmVzZW50ZWQgb3B0aW9ucyAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgY2FuQ3JlYXRlT3B0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogR3JhYnMgYW5kIGluaXQga2V5Ym9hcmQgbmF2aWdhdGlvbiBzZXJ2aWNlIGZvciB0aGUgXCJTZWxlY3RlZCBJdGVtc1wiICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihNYXJrQXNTZWxlY3RlZEl0ZW1EaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBzZXQgc2VsZWN0ZWRJdGVtcyhlbGVtczogUXVlcnlMaXN0PE1hcmtBc1NlbGVjdGVkSXRlbURpcmVjdGl2ZT4pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zS2V5Q29udHJvbFNlcnZpY2UuaW5pdFNlbGVjdGVkSXRlbXNLZXlNYW5hZ2VyKFxuICAgICAgICAgICAgZWxlbXMsXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIFZhbHVlIG9mIHRoZSBDb21ib2JveCBJbnB1dCAqL1xuICAgIHB1YmxpYyBpbnB1dFZhbHVlOiBzdHJpbmcgfCBudW1iZXI7XG5cbiAgICAvKiogVGV4dCBvZiB0aGUgQ2xlYXIgQnV0dG9uIHRvb2x0aXAgKi9cbiAgICBwdWJsaWMgY2xlYXJWYWx1ZUJ1dHRvblRvb2x0aXA6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgb3B0aW9uS2V5Q29udHJvbFNlcnZpY2U6IE9wdGlvbktleUNvbnRyb2xTZXJ2aWNlPFNlbGVjdFYyT3B0aW9uQ29tcG9uZW50PixcbiAgICAgICAgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHNlbGVjdGVkSXRlbXNLZXlDb250cm9sU2VydmljZTogU2VsZWN0ZWRJdGVtc0tleUNvbnRyb2xTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgbGl2ZUFubm91bmNlcjogTGl2ZUFubm91bmNlclxuICAgICkge1xuICAgICAgICBzdXBlcihvcHRpb25LZXlDb250cm9sU2VydmljZSwgY2RSZWYsIGVsUmVmLCBsaXZlQW5ub3VuY2VyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyVmFsdWVCdXR0b25Ub29sdGlwID0gdGhpcy5tdWx0aXNlbGVjdFxuICAgICAgICAgICAgPyAkbG9jYWxpemVgUmVtb3ZlIGFsbGBcbiAgICAgICAgICAgIDogJGxvY2FsaXplYFJlbW92ZWA7XG4gICAgICAgIC8vIGFwcGx5aW5nIGNoYW5nZXMgdG8gY29udGVudCBpbW1lZGlhdGVseSBhZnRlciBpdCB3YXMgaW5pdGlhbGl6ZWQgKGNoZWNrZWQpXG4gICAgICAgIC8vIGNhdXNlcyBcIkV4cHJlc3Npb24gaGFzIGNoYW5nZWQgYWZ0ZXIgaXQgd2FzIGNoZWNrZWRcIiBlcnJvclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5nZXRMYXN0U2VsZWN0ZWRPcHRpb24oKT8udmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBvcHRpb25zIG1heSBiZSByZWNlaXZlZCBhZnRlciB2YWx1ZSBjaGFuZ2VzLCB0aGF0J3Mgd2h5XG4gICAgICAgIC8vIHdlIGNoZWNrIFwic2VsZWN0ZWRPcHRpb25zXCIgdG8gYmUgc2V0IHBlciBcInZhbHVlXCIgYWdhaW4gaW4gXCJoYW5kbGVWYWx1ZUNoYW5nZVwiXG4gICAgICAgIHRoaXMub3B0aW9uc0NoYW5nZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJdGVtcyh0aGlzLmlucHV0VmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRoZSBhY3RpdmUgb3B0aW9uIHRvIGFsd2F5cyBzdGF5IHZpc2libGUgZHVyaW5nIHRoZSBvcHRpb25zIGZpbHRlcmluZy5cbiAgICAgICAgICAgIHRoaXMub3B0aW9uS2V5Q29udHJvbFNlcnZpY2Uuc2Nyb2xsVG9BY3RpdmVJdGVtKHtcbiAgICAgICAgICAgICAgICBibG9jazogXCJzdGFydFwiLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiBcInNtb290aFwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmhpZGUkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFNlbGVjdGVkT3B0aW9uID0gdGhpcy5nZXRMYXN0U2VsZWN0ZWRPcHRpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZShsYXN0U2VsZWN0ZWRPcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckl0ZW1zKHRoaXMuaW5wdXRWYWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgIH1cblxuICAgIC8qKiBIYW5kbGVzIGJlaGF2aW9yIG9uIG1vdXNldXAgZXZlbnQgKi9cbiAgICBwdWJsaWMgb25Nb3VzZVVwKHRhcmdldDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb3VzZURvd24gPSBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLm1hbnVhbERyb3Bkb3duQ29udHJvbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRhcmdldCAhPT0gdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmRyb3Bkb3duLnNob3dpbmdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyBiZWhhdmlvciBvbiBrZXlkb3duIGV2ZW50ICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBzdXBlci5vbktleURvd24oZXZlbnQpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNLZXlDb250cm9sU2VydmljZS5vbktleWRvd24oZXZlbnQpO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbXNLZXlDb250cm9sU2VydmljZS5pc1NlbGVjdGVkSXRlbXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25LZXlDb250cm9sU2VydmljZS5yZXNldEFjdGl2ZUl0ZW0oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbktleUNvbnRyb2xTZXJ2aWNlLmdldEFjdGl2ZUl0ZW1JbmRleCgpID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25LZXlDb250cm9sU2VydmljZS5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUb2dnbGVzIGRyb3Bkb3duIGFuZCByZW1vdmVzIGZvY3VzIGZyb20gU2VsZWN0ZWQgSXRlbXMgKi9cbiAgICBwdWJsaWMgdG9nZ2xlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0tleUNvbnRyb2xTZXJ2aWNlLmRlYWN0aXZhdGVTZWxlY3RlZEl0ZW1zKCk7XG4gICAgfVxuXG4gICAgLyoqIFNlbGVjdHMgc3BlY2lmaWMgb3B0aW9uIGFuZCBzZXQgaXRzIHZhbHVlIHRvIHRoZSBtb2RlbCAqL1xuICAgIHB1YmxpYyBzZWxlY3RPcHRpb24ob3B0aW9uOiBTZWxlY3RWMk9wdGlvbkNvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICBpZiAob3B0aW9uLm91dGZpbHRlcmVkIHx8IG9wdGlvbi5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci5zZWxlY3RPcHRpb24ob3B0aW9uKTtcblxuICAgICAgICB0aGlzLnNldElucHV0VmFsdWUob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbktleUNvbnRyb2xTZXJ2aWNlLnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtPcHRpb25WYWx1ZVR5cGV9IGl0ZW0gICBEZXNlbGVjdCB1c2luZyB2YWx1ZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gaXRlbSAgICAgICAgICAgIERlc2VsZWN0IHVzaW5nIGluZGV4IGluIG11bHRpc2VsZWN0IHZhbHVlcyBhcnJheVxuICAgICAqIERlc2VsZWN0cyBpdGVtIGZyb20gU2VsZWN0ZWQgSXRlbXMgYnkgaW5kZXggb3IgdmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxl