@fundamental-ngx/core 0.46.0-rc.33 → 0.46.0-rc.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/multi-input/multi-input.component.mjs +7 -9
- package/fesm2022/fundamental-ngx-core-multi-input.mjs +6 -8
- package/fesm2022/fundamental-ngx-core-multi-input.mjs.map +1 -1
- package/fundamental-ngx-core-v0.46.0-rc.34.tgz +0 -0
- package/multi-input/multi-input.component.d.ts +2 -0
- package/package.json +3 -3
- package/schematics/add-dependencies/index.js +4 -4
- package/fundamental-ngx-core-v0.46.0-rc.33.tgz +0 -0
|
@@ -244,11 +244,9 @@ export class MultiInputComponent {
|
|
|
244
244
|
this._subscriptions.add(this._getViewModel()
|
|
245
245
|
.pipe(map((viewModel) => !viewModel.displayedOptions.some((c) => !c.isSelected)))
|
|
246
246
|
.subscribe((allItemsSelected) => this.allItemsSelectedChange.emit(allItemsSelected)));
|
|
247
|
-
|
|
248
|
-
this.
|
|
249
|
-
|
|
250
|
-
}));
|
|
251
|
-
}
|
|
247
|
+
this._subscriptions.add(this._language.subscribe(() => {
|
|
248
|
+
this._getAriaLabel();
|
|
249
|
+
}));
|
|
252
250
|
}
|
|
253
251
|
/** @hidden */
|
|
254
252
|
ngOnChanges(changes) {
|
|
@@ -627,7 +625,7 @@ export class MultiInputComponent {
|
|
|
627
625
|
/** @hidden */
|
|
628
626
|
async _getAriaLabel() {
|
|
629
627
|
const lang = await firstValueFrom(this._language);
|
|
630
|
-
this.
|
|
628
|
+
this._defaultAriaLabel = this._translationResolver.resolve(lang, 'coreMultiInput.multiInputAriaLabel');
|
|
631
629
|
}
|
|
632
630
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: MultiInputComponent, deps: [{ token: i1.ContentDensityObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i2.DynamicComponentService }, { token: i0.Injector }, { token: i0.ViewContainerRef }, { token: FD_LANGUAGE }, { token: i2.RtlService, optional: true }, { token: i2.FocusTrapService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
633
631
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.0", type: MultiInputComponent, isStandalone: true, selector: "fd-multi-input", inputs: { placeholder: "placeholder", disabled: "disabled", required: "required", compactCollapse: "compactCollapse", maxHeight: "maxHeight", glyph: "glyph", dropdownValues: "dropdownValues", openDropdownOnAddOnClicked: "openDropdownOnAddOnClicked", searchTerm: "searchTerm", inputId: "inputId", highlight: "highlight", selected: "selected", class: "class", filterFn: "filterFn", valueFn: "valueFn", displayFn: "displayFn", newTokenParseFn: "newTokenParseFn", newTokenValidateFn: "newTokenValidateFn", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", fillControlMode: "fillControlMode", state: "state", buttonFocusable: "buttonFocusable", allowNewTokens: "allowNewTokens", mobile: "mobile", showAllButton: "showAllButton", bodyMaxWidth: "bodyMaxWidth", mobileConfig: "mobileConfig", includes: "includes", itemTemplate: "itemTemplate", title: "title", byline: "byline", autoComplete: "autoComplete", open: "open", displayAddonButton: "displayAddonButton" }, outputs: { searchTermChange: "searchTermChange", selectedChange: "selectedChange", openChange: "openChange", addOnButtonClicked: "addOnButtonClicked", allItemsSelectedChange: "allItemsSelectedChange" }, host: { listeners: { "focusout": "_focusOut($event)" } }, providers: [
|
|
@@ -639,7 +637,7 @@ export class MultiInputComponent {
|
|
|
639
637
|
MenuKeyboardService,
|
|
640
638
|
registerFormItemControl(MultiInputComponent),
|
|
641
639
|
contentDensityObserverProviders()
|
|
642
|
-
], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["control"], descendants: true, read: TemplateRef }, { propertyName: "listTemplate", first: true, predicate: ["list"], descendants: true, read: TemplateRef }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true, read: ElementRef }, { propertyName: "tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"_viewModel$ | async as viewModel\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n *ngIf=\"mobile\"\n ></ng-container>\n\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container\n *ngTemplateOutlet=\"control; context: { displayAddonButton: displayAddonButton }\"\n ></ng-container>\n </form>\n </fd-popover-control>\n\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of viewModel.selectedOptions; trackBy: _trackBy\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, false, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"tokenizer._hideTokens()\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"viewModel.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngFor=\"let option of viewModel.displayedOptions; index as idx; trackBy: _trackBy\"\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option.value, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n\n <li\n *ngIf=\"showAllButton && viewModel.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight : _searchTermCtrl.value || '' : highlight\"\n ></span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}[class*=--compact] .fd-multi-input-tokenizer-custom:not([class*=\"--cozy\"]):not([class*=\"--condensed\"]),.is-compact .fd-multi-input-tokenizer-custom:not(.is-cozy):not(.is-condensed),.fd-multi-input-tokenizer-custom[class*=--compact],.fd-multi-input-tokenizer-custom.is-compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-multi-input-menu-overflow{max-width:37.5rem}.fd-input.fd-multi-input-tokenizer-input{min-width:4rem;margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: PopoverControlComponent, selector: "fd-popover-control" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "ngmodule", type: InputGroupModule }, { kind: "component", type: i4.InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: i4.InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "ngmodule", type: TokenModule }, { kind: "component", type: i5.TokenComponent, selector: "fd-token", inputs: ["disabled", "selected", "readOnly"], outputs: ["onCloseClick", "onRemove", "onTokenClick", "onTokenKeydown", "elementFocused"] }, { kind: "component", type: i5.TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "moreTerm", "open"], outputs: ["moreClickedEvent"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: FormControlComponent, selector: "[fd-form-control]", inputs: ["state", "type", "class", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: AutoCompleteDirective, selector: "[fdkAutoComplete]", inputs: ["options", "inputText", "enable", "matcher", "displayFn"], outputs: ["onComplete"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i6.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i6.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "unread", "byline"], outputs: ["keyDown"] }, { kind: "directive", type: i6.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "component", type: CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle", "undecorated"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SearchHighlightPipe, name: "highlight" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
640
|
+
], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["control"], descendants: true, read: TemplateRef }, { propertyName: "listTemplate", first: true, predicate: ["list"], descendants: true, read: TemplateRef }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true, read: ElementRef }, { propertyName: "tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"_viewModel$ | async as viewModel\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n *ngIf=\"mobile\"\n ></ng-container>\n\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container\n *ngTemplateOutlet=\"control; context: { displayAddonButton: displayAddonButton }\"\n ></ng-container>\n </form>\n </fd-popover-control>\n\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of viewModel.selectedOptions; trackBy: _trackBy\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, false, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [ariaLabel]=\"ariaLabel || _defaultAriaLabel\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"tokenizer._hideTokens()\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"viewModel.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngFor=\"let option of viewModel.displayedOptions; index as idx; trackBy: _trackBy\"\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option.value, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n\n <li\n *ngIf=\"showAllButton && viewModel.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight : _searchTermCtrl.value || '' : highlight\"\n ></span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}[class*=--compact] .fd-multi-input-tokenizer-custom:not([class*=\"--cozy\"]):not([class*=\"--condensed\"]),.is-compact .fd-multi-input-tokenizer-custom:not(.is-cozy):not(.is-condensed),.fd-multi-input-tokenizer-custom[class*=--compact],.fd-multi-input-tokenizer-custom.is-compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-multi-input-menu-overflow{max-width:37.5rem}.fd-input.fd-multi-input-tokenizer-input{min-width:4rem;margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: PopoverControlComponent, selector: "fd-popover-control" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "ngmodule", type: InputGroupModule }, { kind: "component", type: i4.InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: i4.InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "ngmodule", type: TokenModule }, { kind: "component", type: i5.TokenComponent, selector: "fd-token", inputs: ["disabled", "selected", "readOnly"], outputs: ["onCloseClick", "onRemove", "onTokenClick", "onTokenKeydown", "elementFocused"] }, { kind: "component", type: i5.TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "moreTerm", "open"], outputs: ["moreClickedEvent"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: FormControlComponent, selector: "[fd-form-control]", inputs: ["state", "type", "class", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: AutoCompleteDirective, selector: "[fdkAutoComplete]", inputs: ["options", "inputText", "enable", "matcher", "displayFn"], outputs: ["onComplete"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i6.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i6.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "unread", "byline"], outputs: ["keyDown"] }, { kind: "directive", type: i6.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "component", type: CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle", "undecorated"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SearchHighlightPipe, name: "highlight" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
643
641
|
}
|
|
644
642
|
__decorate([
|
|
645
643
|
applyCssClass,
|
|
@@ -676,7 +674,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
|
|
|
676
674
|
LinkComponent,
|
|
677
675
|
AsyncPipe,
|
|
678
676
|
SearchHighlightPipe
|
|
679
|
-
], template: "<ng-container *ngIf=\"_viewModel$ | async as viewModel\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n *ngIf=\"mobile\"\n ></ng-container>\n\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container\n *ngTemplateOutlet=\"control; context: { displayAddonButton: displayAddonButton }\"\n ></ng-container>\n </form>\n </fd-popover-control>\n\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of viewModel.selectedOptions; trackBy: _trackBy\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, false, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [
|
|
677
|
+
], template: "<ng-container *ngIf=\"_viewModel$ | async as viewModel\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n *ngIf=\"mobile\"\n ></ng-container>\n\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container\n *ngTemplateOutlet=\"control; context: { displayAddonButton: displayAddonButton }\"\n ></ng-container>\n </form>\n </fd-popover-control>\n\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of viewModel.selectedOptions; trackBy: _trackBy\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, false, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [ariaLabel]=\"ariaLabel || _defaultAriaLabel\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"tokenizer._hideTokens()\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"viewModel.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngFor=\"let option of viewModel.displayedOptions; index as idx; trackBy: _trackBy\"\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option.value, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n\n <li\n *ngIf=\"showAllButton && viewModel.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight : _searchTermCtrl.value || '' : highlight\"\n ></span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}[class*=--compact] .fd-multi-input-tokenizer-custom:not([class*=\"--cozy\"]):not([class*=\"--condensed\"]),.is-compact .fd-multi-input-tokenizer-custom:not(.is-cozy):not(.is-condensed),.fd-multi-input-tokenizer-custom[class*=--compact],.fd-multi-input-tokenizer-custom.is-compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-multi-input-menu-overflow{max-width:37.5rem}.fd-input.fd-multi-input-tokenizer-input{min-width:4rem;margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"] }]
|
|
680
678
|
}], ctorParameters: function () { return [{ type: i1.ContentDensityObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i2.DynamicComponentService }, { type: i0.Injector }, { type: i0.ViewContainerRef }, { type: i7.Observable, decorators: [{
|
|
681
679
|
type: Inject,
|
|
682
680
|
args: [FD_LANGUAGE]
|
|
@@ -786,4 +784,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
|
|
|
786
784
|
type: HostListener,
|
|
787
785
|
args: ['focusout', ['$event']]
|
|
788
786
|
}] } });
|
|
789
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktaW5wdXQvbXVsdGktaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktaW5wdXQvbXVsdGktaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RixPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hILE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdFLE9BQU8sRUFDSCxhQUFhLEVBQ2IscUJBQXFCLEVBRXJCLHVCQUF1QixFQUV2QixnQkFBZ0IsRUFDaEIsT0FBTyxFQUVQLGFBQWEsRUFD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QkFEZCxLQUFLO2dCQVFOLEtBQUs7c0JBREosS0FBSztnQkFRTixlQUFlO3NCQURkLEtBQUs7Z0JBS04sY0FBYztzQkFEYixLQUFLO2dCQUtOLE1BQU07c0JBREwsS0FBSztnQkFLTixhQUFhO3NCQURaLEtBQUs7Z0JBVU4sWUFBWTtzQkFEWCxLQUFLO2dCQWtCTixZQUFZO3NCQURYLEtBQUs7Z0JBUU4sUUFBUTtzQkFEUCxLQUFLO2dCQVFOLFlBQVk7c0JBRFgsS0FBSztnQkFPTixLQUFLO3NCQURKLEtBQUs7Z0JBS04sTUFBTTtzQkFETCxLQUFLO2dCQUtOLFlBQVk7c0JBRFgsS0FBSztnQkFLRyxnQkFBZ0I7c0JBRHhCLE1BQU07Z0JBS0UsY0FBYztzQkFEdEIsTUFBTTtnQkFLUCxJQUFJO3NCQURILEtBQUs7Z0JBS04sa0JBQWtCO3NCQURqQixLQUFLO2dCQUtHLFVBQVU7c0JBRGxCLE1BQU07Z0JBS0Usa0JBQWtCO3NCQUQxQixNQUFNO2dCQUtFLHNCQUFzQjtzQkFEOUIsTUFBTTtnQkFLUCxVQUFVO3NCQURULFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUszQixlQUFlO3NCQURkLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFLM0MsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBS3hDLGFBQWE7c0JBRFosU0FBUzt1QkFBQyxhQUFhO2dCQUt4QixrQkFBa0I7c0JBRGpCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUtyRCxTQUFTO3NCQURSLFNBQVM7dUJBQUMsa0JBQWtCO2dCQXFEN0Isc0JBQXNCLE1BY2QsU0FBUztzQkFEaEIsWUFBWTt1QkFBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBFTlRFUiwgRVNDQVBFLCBTUEFDRSwgVEFCLCBVUF9BUlJPVyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmaXJzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlyc3QsIG1hcCwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIGFwcGx5Q3NzQ2xhc3MsXG4gICAgQXV0b0NvbXBsZXRlRGlyZWN0aXZlLFxuICAgIENzc0NsYXNzQnVpbGRlcixcbiAgICBEeW5hbWljQ29tcG9uZW50U2VydmljZSxcbiAgICBGb2N1c0VzY2FwZURpcmVjdGlvbixcbiAgICBGb2N1c1RyYXBTZXJ2aWNlLFxuICAgIEtleVV0aWwsXG4gICAgTnVsbGFibGUsXG4gICAgUmFuZ2VTZWxlY3RvcixcbiAgICBSdGxTZXJ2aWNlLFxuICAgIFNlYXJjaEhpZ2hsaWdodFBpcGUsXG4gICAgdXVpZHY0XG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7IEZvcm1Db250cm9sQ29tcG9uZW50LCBGb3JtSXRlbUNvbnRyb2wsIHJlZ2lzdGVyRm9ybUl0ZW1Db250cm9sIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2Zvcm0nO1xuaW1wb3J0IHsgTGlzdENvbXBvbmVudCwgTGlzdE1vZHVsZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9saXN0JztcbmltcG9ydCB7IE1lbnVLZXlib2FyZFNlcnZpY2UgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbWVudSc7XG5pbXBvcnQgeyBNb2JpbGVNb2RlQ29uZmlnIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL21vYmlsZS1tb2RlJztcbmltcG9ydCB7IFBvcG92ZXJCb2R5Q29tcG9uZW50LCBQb3BvdmVyQ29tcG9uZW50LCBQb3BvdmVyQ29udHJvbENvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9wb3BvdmVyJztcbmltcG9ydCB7IFBvcG92ZXJGaWxsTW9kZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9zaGFyZWQnO1xuaW1wb3J0IHsgVG9rZW5pemVyQ29tcG9uZW50LCBUb2tlbk1vZHVsZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS90b2tlbic7XG5cbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybVN0YXRlcyB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL2Zvcm1zJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2NoZWNrYm94JztcbmltcG9ydCB7IENvbnRlbnREZW5zaXR5T2JzZXJ2ZXIsIGNvbnRlbnREZW5zaXR5T2JzZXJ2ZXJQcm92aWRlcnMgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvY29udGVudC1kZW5zaXR5JztcbmltcG9ydCB7IElucHV0R3JvdXBNb2R1bGUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvaW5wdXQtZ3JvdXAnO1xuaW1wb3J0IHsgTGlua0NvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9saW5rJztcbmltcG9ydCB7IEZEX0xBTkdVQUdFLCBGZExhbmd1YWdlLCBUcmFuc2xhdGlvblJlc29sdmVyIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9pMThuJztcbmltcG9ydCB7IE11bHRpSW5wdXRNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuL211bHRpLWlucHV0LW1vYmlsZS9tdWx0aS1pbnB1dC1tb2JpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpSW5wdXRNb2JpbGVNb2R1bGUgfSBmcm9tICcuL211bHRpLWlucHV0LW1vYmlsZS9tdWx0aS1pbnB1dC1tb2JpbGUubW9kdWxlJztcbmltcG9ydCB7IE1VTFRJX0lOUFVUX0NPTVBPTkVOVCwgTXVsdGlJbnB1dEludGVyZmFjZSB9IGZyb20gJy4vbXVsdGktaW5wdXQuaW50ZXJmYWNlJztcblxuZnVuY3Rpb24gaXNPcHRpb25JdGVtPEl0ZW1UeXBlID0gYW55LCBWYWx1ZVR5cGUgPSBhbnk+KGNhbmRpZGF0ZTogYW55KTogY2FuZGlkYXRlIGlzIF9PcHRpb25JdGVtPEl0ZW1UeXBlLCBWYWx1ZVR5cGU+IHtcbiAgICByZXR1cm4gaXNPcHRpb25JdGVtQmFzZTxWYWx1ZVR5cGU+KGNhbmRpZGF0ZSkgJiYgJ2l0ZW0nIGluIGNhbmRpZGF0ZTtcbn1cblxuZnVuY3Rpb24gaXNPcHRpb25JdGVtQmFzZTxWYWx1ZVR5cGUgPSBhbnk+KGNhbmRpZGF0ZTogYW55KTogY2FuZGlkYXRlIGlzIE9wdGlvbkl0ZW1CYXNlPFZhbHVlVHlwZT4ge1xuICAgIHJldHVybiB0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0JyAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgJ3ZhbHVlJyBpbiBjYW5kaWRhdGUgJiYgJ2xhYmVsJyBpbiBjYW5kaWRhdGU7XG59XG5cbi8qKlxuICogSW5wdXQgZmllbGQgd2l0aCBtdWx0aXBsZSBzZWxlY3Rpb24gZW5hYmxlZC4gU2hvdWxkIGJlIHVzZWQgd2hlbiBhIHVzZXIgY2FuIHNlbGVjdCBiZXR3ZWVuIGFcbiAqIGxpbWl0ZWQgbnVtYmVyIG9mIHByZS1kZWZpbmVkIG9wdGlvbnMgd2l0aCBhIGZpbHRlci1lbmFibGVkIGNvbnRleHQuXG4gKlxuICogU3VwcG9ydHMgQW5ndWxhciBGb3Jtcy5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1tdWx0aS1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tdWx0aS1pbnB1dC5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpSW5wdXRDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgTWVudUtleWJvYXJkU2VydmljZSxcbiAgICAgICAgcmVnaXN0ZXJGb3JtSXRlbUNvbnRyb2woTXVsdGlJbnB1dENvbXBvbmVudCksXG4gICAgICAgIGNvbnRlbnREZW5zaXR5T2JzZXJ2ZXJQcm92aWRlcnMoKVxuICAgIF0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdJZixcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICAgICAgUG9wb3ZlckNvbXBvbmVudCxcbiAgICAgICAgUG9wb3ZlckNvbnRyb2xDb21wb25lbnQsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBQb3BvdmVyQm9keUNvbXBvbmVudCxcbiAgICAgICAgSW5wdXRHcm91cE1vZHVsZSxcbiAgICAgICAgVG9rZW5Nb2R1bGUsXG4gICAgICAgIE5nRm9yLFxuICAgICAgICBGb3JtQ29udHJvbENvbXBvbmVudCxcbiAgICAgICAgQXV0b0NvbXBsZXRlRGlyZWN0aXZlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBMaXN0TW9kdWxlLFxuICAgICAgICBDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgTGlua0NvbXBvbmVudCxcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBTZWFyY2hIaWdobGlnaHRQaXBlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aUlucHV0Q29tcG9uZW50PEl0ZW1UeXBlID0gYW55LCBWYWx1ZVR5cGUgPSBhbnk+XG4gICAgaW1wbGVtZW50c1xuICAgICAgICBNdWx0aUlucHV0SW50ZXJmYWNlLFxuICAgICAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICAgICAgQ3NzQ2xhc3NCdWlsZGVyLFxuICAgICAgICBPbkluaXQsXG4gICAgICAgIE9uQ2hhbmdlcyxcbiAgICAgICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICAgICAgT25EZXN0cm95LFxuICAgICAgICBGb3JtSXRlbUNvbnRyb2xcbntcbiAgICAvKiogUGxhY2Vob2xkZXIgZm9yIHRoZSBpbnB1dCBmaWVsZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHBsYWNlaG9sZGVyID0gJyc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgaW5wdXQgaXMgZGlzYWJsZWQuICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqIElmIGl0IGlzIG1hbmRhdG9yeSBmaWVsZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgcmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRvIHVzZSBjb3p5IHZpc3VhbHMgYnV0IGNvbXBhY3QgY29sbGFwc2luZyBiZWhhdmlvci4gKi9cbiAgICBASW5wdXQoKVxuICAgIGNvbXBhY3RDb2xsYXBzZSA9IHRydWU7XG5cbiAgICAvKiogTWF4IGhlaWdodCBvZiB0aGUgcG9wb3Zlci4gQW55IG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpbGwgYmUgYWNjZXNzaWJsZSB0aHJvdWdoIHNjcm9sbGluZy4gKi9cbiAgICBASW5wdXQoKVxuICAgIG1heEhlaWdodCA9ICczMDBweCc7XG5cbiAgICAvKiogSWNvbiBvZiB0aGUgYnV0dG9uIG9uIHRoZSByaWdodCBvZiB0aGUgaW5wdXQgZmllbGQuICovXG4gICAgQElucHV0KClcbiAgICBnbHlwaCA9ICd2YWx1ZS1oZWxwJztcblxuICAgIC8qKiBWYWx1ZXMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB1bmZpbHRlcmVkIGRyb3Bkb3duLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZHJvcGRvd25WYWx1ZXM6IEFycmF5PEl0ZW1UeXBlIHwgX09wdGlvbkl0ZW08SXRlbVR5cGUsIFZhbHVlVHlwZT4+ID0gW107XG5cbiAgICAvKiogV2hldGhlciB0byBvcGVuIHRoZSBkcm9wZG93biB3aGVuIHRoZSBhZGRvbiBidXR0b24gaXMgY2xpY2tlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIG9wZW5Ecm9wZG93bk9uQWRkT25DbGlja2VkID0gdHJ1ZTtcblxuICAgIC8qKiBTZWFyY2ggdGVybSwgb3IgbW9yZSBzcGVjaWZpY2FsbHkgdGhlIHZhbHVlIG9mIHRoZSBpbm5lciBpbnB1dCBmaWVsZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzZWFyY2hUZXJtKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoVGVybUN0cmwuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cbiAgICBnZXQgc2VhcmNoVGVybSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoVGVybUN0cmwudmFsdWUgPz8gJyc7XG4gICAgfVxuXG4gICAgLyoqIElkIGF0dHJpYnV0ZSBmb3IgaW5wdXQgZWxlbWVudCBpbnNpZGUgTXVsdGlJbnB1dCBjb21wb25lbnQgKi9cbiAgICBASW5wdXQoKVxuICAgIGlucHV0SWQgPSAnJztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBzZWFyY2ggdGVybSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgaW4gcmVzdWx0cy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGhpZ2hsaWdodCA9IHRydWU7XG5cbiAgICAvKiogU2VsZWN0ZWQgZHJvcGRvd24gaXRlbXMuICovXG4gICAgQElucHV0KClcbiAgICBzZXQgc2VsZWN0ZWQodmFsdWVzOiBWYWx1ZVR5cGVbXSkge1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgICAgICB2YWx1ZXM/LmZvckVhY2goKGl0ZW0pID0+IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChpdGVtKSk7XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkKCk6IFZhbHVlVHlwZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkO1xuICAgIH1cblxuICAgIC8qKiB1c2VyJ3MgY3VzdG9tIGNsYXNzZXMgKi9cbiAgICBASW5wdXQoKVxuICAgIGNsYXNzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZnVuY3Rpb24uIEFjY2VwdHMgYW4gYXJyYXkgYW5kIGEgc3RyaW5nIGFzIGFyZ3VtZW50cywgYW5kIG91dHB1dHMgYW4gYXJyYXkuXG4gICAgICogQW4gYXJyb3cgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSAqdGhpcyoga2V5d29yZCBpbiB0aGUgY2FsbGluZyBjb21wb25lbnQuXG4gICAgICogU2VlIG11bHRpIGlucHV0IGV4YW1wbGVzIGZvciBkZXRhaWxzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZmlsdGVyRm4gPSB0aGlzLl9kZWZhdWx0RmlsdGVyO1xuXG4gICAgLyoqXG4gICAgICogVmFsdWUgZnVuY3Rpb24uIEFjY2VwdHMgYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlXG4gICAgICogaXRlbXMgcGFzc2VkIHRvIGRyb3Bkb3duVmFsdWVzIGFzIGFyZ3VtZW50LCBhbmQgb3V0cHV0cyBhbnkgcHJvcGVydHksIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgdmFsdWUuXG4gICAgICogQW4gYXJyb3cgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSAqdGhpcyoga2V5d29yZCBpbiB0aGUgY2FsbGluZyBjb21wb25lbnQuXG4gICAgICogU2VlIG11bHRpIGlucHV0IGV4YW1wbGVzIGZvciBkZXRhaWxzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdmFsdWVGbjogKGl0ZW06IEl0ZW1UeXBlKSA9PiBWYWx1ZVR5cGUgPSB0aGlzLl9kZWZhdWx0VmFsdWVGbjtcblxuICAgIC8qKlxuICAgICAqIERpc3BsYXkgZnVuY3Rpb24uIEFjY2VwdHMgYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlXG4gICAgICogaXRlbXMgcGFzc2VkIHRvIGRyb3Bkb3duVmFsdWVzIGFzIGFyZ3VtZW50LCBhbmQgb3V0cHV0cyBhIHN0cmluZy5cbiAgICAgKiBBbiBhcnJvdyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlICp0aGlzKiBrZXl3b3JkIGluIHRoZSBjYWxsaW5nIGNvbXBvbmVudC5cbiAgICAgKiBTZWUgbXVsdGkgaW5wdXQgZXhhbXBsZXMgZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5Rm46IChpdGVtOiBJdGVtVHlwZSkgPT4gc3RyaW5nID0gdGhpcy5fZGVmYXVsdERpc3BsYXkgYXMgdW5rbm93biBhcyAoaXRlbTogSXRlbVR5cGUpID0+IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGZ1bmN0aW9uLiBVc2VkIGZvciBzdWJtaXR0aW5nIG5ldyB0b2tlbnMuIEFjY2VwdHMgYSBzdHJpbmcgYnkgZGVmYXVsdC5cbiAgICAgKiBBbiBhcnJvdyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlICp0aGlzKiBrZXl3b3JkIGluIHRoZSBjYWxsaW5nIGNvbXBvbmVudC5cbiAgICAgKiBTZWUgbXVsdGkgaW5wdXQgZXhhbXBsZXMgZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBuZXdUb2tlblBhcnNlRm46IChzZWFyY2hUZXJtOiBzdHJpbmcpID0+IGFueSA9IHRoaXMuX2RlZmF1bHRQYXJzZTtcblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGZ1bmN0aW9uLiBVc2VkIHRvIGNoZWNrIGlmIG5ldyB0b2tlbiBjYW4gYmUgYWRkZWQgaW50byBsaXN0LlxuICAgICAqIFdvcmtzIG9ubHksIHdoZW4gYGFsbG93TmV3VG9rZW5zYCBvcHRpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG5ld1Rva2VuVmFsaWRhdGVGbiA9IHRoaXMuX2RlZmF1bHRUb2tlblZhbGlkYXRlO1xuXG4gICAgLyoqIGFyaWEtbGFiZWwgYXR0cmlidXRlIGJpbmRpbmcuICovXG4gICAgQElucHV0KClcbiAgICBhcmlhTGFiZWw6IE51bGxhYmxlPHN0cmluZz47XG5cbiAgICAvKiogYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZSBiaW5kaW5nLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXJpYUxhYmVsbGVkQnk6IE51bGxhYmxlPHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBQcmVzZXQgb3B0aW9ucyBmb3IgdGhlIFNlbGVjdCBib2R5IHdpZHRoLCB3aGF0ZXZlciBpcyBjaG9zZW4sIHRoZSBib2R5IGhhcyBhIDYwMHB4IGxpbWl0LlxuICAgICAqICogYGF0LWxlYXN0YCB3aWxsIGFwcGx5IGEgbWluaW11bSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC4gLSBEZWZhdWx0XG4gICAgICogKiBgZXF1YWxgIHdpbGwgYXBwbHkgYSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC5cbiAgICAgKiAqICdmaXQtY29udGVudCcgd2lsbCBhcHBseSB3aWR0aCBuZWVkZWQgdG8gcHJvcGVybHkgZGlzcGxheSBpdGVtcyBpbnNpZGUsIGluZGVwZW5kZW50IG9mIGNvbnRyb2wuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBmaWxsQ29udHJvbE1vZGU6IFBvcG92ZXJGaWxsTW9kZSA9ICdhdC1sZWFzdCc7XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXRlIG9mIHRoZSBmb3JtIGNvbnRyb2wgLSBhcHBsaWVzIGNzcyBjbGFzc2VzLlxuICAgICAqICBDYW4gYmUgYHN1Y2Nlc3NgLCBgZXJyb3JgLCBgd2FybmluZ2AsIGBpbmZvcm1hdGlvbmAgb3IgYmxhbmsgZm9yIGRlZmF1bHQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzdGF0ZT86IEZvcm1TdGF0ZXM7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIEFkZE9uIEJ1dHRvbiBzaG91bGQgYmUgZm9jdXNhYmxlXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgYnV0dG9uRm9jdXNhYmxlID0gdHJ1ZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBtdWx0aS1pbnB1dCBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIG5ldyB0b2tlbnMuICovXG4gICAgQElucHV0KClcbiAgICBhbGxvd05ld1Rva2VucyA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIG11bHRpLWlucHV0IHNob3VsZCBiZSBidWlsdCBvbiBtb2JpbGUgbW9kZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgbW9iaWxlID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0aGUgbXVsdGktaW5wdXQgc2hvdWxkIGhhdmUgc2hvdyBhbGwgYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0FsbEJ1dHRvbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBNYXggd2lkdGggb2YgbXVsdGkgaW5wdXQgYm9keS5cbiAgICAgKiBgbm9uZWAgd2lsbCBub3QgbGltaXQgd2lkdGggb2YgdGhlIGRyb3Bkb3duLlxuICAgICAqIGBjb250YWluZXJgIHdpbGwgbGltaXQgd2lkdGggb2YgdGhlIGRyb3Bkb3duIHRvIHRoZSB3aWR0aCBvZiB0aGUgbXVsdGktaW5wdXQgaXRzZWxmLlxuICAgICAqIGBudW1iZXJgIHdpbGwgbGltaXQgd2lkdGggb2YgdGhlIGRyb3Bkb3duIGJ5IHByb3ZpZGVkIG51bWJlciBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBib2R5TWF4V2lkdGg6ICdub25lJyB8ICdjb250YWluZXInIHwgbnVtYmVyID0gJ25vbmUnO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXQgX3BvcG92ZXJNYXhXaWR0aCgpOiBOdWxsYWJsZTxudW1iZXI+IHtcbiAgICAgICAgaWYgKHRoaXMuYm9keU1heFdpZHRoID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJvZHlNYXhXaWR0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJvZHlNYXhXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICB9XG5cbiAgICAvKiogTXVsdGkgSW5wdXQgTW9iaWxlIENvbmZpZ3VyYXRpb24sIGl0J3MgYXBwbGllZCBvbmx5LCB3aGVuIG1vYmlsZSBpcyBlbmFibGVkICovXG4gICAgQElucHV0KClcbiAgICBtb2JpbGVDb25maWc6IE1vYmlsZU1vZGVDb25maWcgPSB7IGhhc0Nsb3NlQnV0dG9uOiB0cnVlLCBhcHByb3ZlQnV0dG9uVGV4dDogJ1NlbGVjdCcgfTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gcmV0dXJuIHJlc3VsdHMgd2hlcmUgdGhlIGlucHV0IG1hdGNoZXMgdGhlIGVudGlyZSBzdHJpbmcuIEJ5IGRlZmF1bHQsIG9ubHkgcmVzdWx0cyB0aGF0IHN0YXJ0XG4gICAgICogd2l0aCB0aGUgaW5wdXQgc2VhcmNoIHRlcm0gd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGluY2x1ZGVzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGVtcGxhdGUgd2l0aCB3aGljaCB0byBkaXNwbGF5IHRoZSBpbmRpdmlkdWFsIGxpc3RlZCBpdGVtcy5cbiAgICAgKiBVc2UgaXQgYnkgcGFzc2luZyBhbiBuZy10ZW1wbGF0ZSB3aXRoIGltcGxpY2l0IGNvbnRlbnQuIFNlZSBleGFtcGxlcyBmb3IgbW9yZSBpbmZvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvb2x0aXAgZm9yIHRoZSBtdWx0aS1pbnB1dCBpY29uLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdGl0bGU6IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIGxpc3QgaXRlbSBvcHRpb25zIHNob3VsZCBiZSByZW5kZXJlZCBhcyBieWxpbmUuICovXG4gICAgQElucHV0KClcbiAgICBieWxpbmUgPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBhdXRvY29tcGxldGUgc2hvdWxkIGJlIGVuYWJsZWQ7IEVuYWJsZWQgYnkgZGVmYXVsdCAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXV0b0NvbXBsZXRlID0gdHJ1ZTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNlYXJjaCB0ZXJtIGNoYW5nZXMuIFVzZSAqJGV2ZW50KiB0byBhY2Nlc3MgdGhlIG5ldyB0ZXJtLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHNlYXJjaFRlcm1DaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3RlZCBpdGVtcyBjaGFuZ2UuIFVzZSAqJGV2ZW50KiB0byBhY2Nlc3MgdGhlIG5ldyBzZWxlY3RlZCBhcnJheS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBzZWxlY3RlZENoYW5nZTogRXZlbnRFbWl0dGVyPFZhbHVlVHlwZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8VmFsdWVUeXBlW10+KCk7XG5cbiAgICAvKiogV2hldGhlciBtdWx0aSBpbnB1dCBwb3BvdmVyIGJvZHkgc2hvdWxkIGJlIG9wZW5lZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgb3BlbiA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgdGhlIGFkZG9uIGJ1dHRvbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlBZGRvbkJ1dHRvbiA9IHRydWU7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCwgd2hlbiB0aGUgbXVsdGkgaW5wdXQncyBwb3BvdmVyIGJvZHkgaXMgb3BlbmVkIG9yIGNsb3NlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IG9wZW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKiBFbWl0cyBldmVudCB3aGVuIHRoZSBhZGRvbiBidXR0b24gaXMgY2xpY2tlZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBhZGRPbkJ1dHRvbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQsIHdoZW4gdGhlIG11bHRpIGlucHV0J3MgYWxsIGl0ZW0gY2hlY2tlZCBvciBub3QgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBhbGxJdGVtc1NlbGVjdGVkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoUG9wb3ZlckNvbXBvbmVudClcbiAgICBwb3BvdmVyUmVmOiBQb3BvdmVyQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdjb250cm9sJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIGNvbnRyb2xUZW1wbGF0ZTogVGVtcGxhdGVSZWY8eyBkaXNwbGF5QWRkb25CdXR0b246IGJvb2xlYW4gfT47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ2xpc3QnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgbGlzdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKExpc3RDb21wb25lbnQpXG4gICAgbGlzdENvbXBvbmVudDogTGlzdENvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXRFbGVtZW50JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgc2VhcmNoSW5wdXRFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKFRva2VuaXplckNvbXBvbmVudClcbiAgICB0b2tlbml6ZXI6IFRva2VuaXplckNvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVhZG9ubHkgb3B0aW9uSXRlbXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxfT3B0aW9uSXRlbTxJdGVtVHlwZSwgVmFsdWVUeXBlPltdPihbXSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9zZWFyY2hUZXJtQ3RybCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9zZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxWYWx1ZVR5cGU+KHRydWUpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBfdmlld01vZGVsJDogT2JzZXJ2YWJsZTxWaWV3TW9kZWw8SXRlbVR5cGUsIFZhbHVlVHlwZT4+ID0gdGhpcy5fZ2V0Vmlld01vZGVsKCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9kaXI6IHN0cmluZztcblxuICAgIC8qKiB0eXBlYWhlYWQgbWF0Y2hlciBmdW5jdGlvbiAqL1xuICAgIGdldCB0eXBlQWhlYWRNYXRjaGVyKCk6IChpdGVtOiBzdHJpbmcsIHNlYXJjaFRlcm06IHN0cmluZykgPT4gYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmluY2x1ZGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gKGl0ZW06IHN0cmluZywgc2VhcmNoVGVybTogc3RyaW5nKSA9PiBpdGVtLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoaXRlbTogc3RyaW5nLCBzZWFyY2hUZXJtOiBzdHJpbmcpID0+IGl0ZW0uc3RhcnRzV2l0aChzZWFyY2hUZXJtKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JhbmdlU2VsZWN0b3IgPSBuZXcgUmFuZ2VTZWxlY3RvcigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90cmFuc2xhdGlvblJlc29sdmVyID0gbmV3IFRyYW5zbGF0aW9uUmVzb2x2ZXIoKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHJlYWRvbmx5IF9jb250ZW50RGVuc2l0eU9ic2VydmVyOiBDb250ZW50RGVuc2l0eU9ic2VydmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5nZURldFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2R5bmFtaWNDb21wb25lbnRTZXJ2aWNlOiBEeW5hbWljQ29tcG9uZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBASW5qZWN0KEZEX0xBTkdVQUdFKSBwcml2YXRlIHJlYWRvbmx5IF9sYW5ndWFnZTogT2JzZXJ2YWJsZTxGZExhbmd1YWdlPixcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBfcnRsU2VydmljZTogUnRsU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBfZm9jdXNUcmFwU2VydmljZTogRm9jdXNUcmFwU2VydmljZVxuICAgICkge31cblxuICAgIC8qKiBAaGlkZGVuIENzc0NsYXNzQnVpbGRlciBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb25cbiAgICAgKiBmdW5jdGlvbiBtdXN0IHJldHVybiBzaW5nbGUgc3RyaW5nXG4gICAgICogZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIG9yZGVyIHdoaWNoIGNzcyBjbGFzc2VzIGFyZSBhcHBsaWVkXG4gICAgICovXG4gICAgQGFwcGx5Q3NzQ2xhc3NcbiAgICBidWlsZENvbXBvbmVudENzc0NsYXNzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpY29uIGZsaXAgbWF5IGJlIGFkZHJlc3NlZCBpbiBzdHlsZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICBpZiAodGhpcy5nbHlwaCA9PT0gJ3ZhbHVlLWhlbHAnICYmIHRoaXMuX2RpciA9PT0gJ3J0bCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGljb24gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2FwLWljb24tLXZhbHVlLWhlbHAnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvbi5zdHlsZS50cmFuc2Zvcm0gPSAnc2NhbGVYKC0xKSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gWydmZC1tdWx0aS1pbnB1dCcsICdmZC1tdWx0aS1pbnB1dC1jdXN0b20nLCB0aGlzLmNsYXNzXTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgWyckZXZlbnQnXSlcbiAgICBwcml2YXRlIF9mb2N1c091dChldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF90cmFja0J5ID0gKGluZGV4OiBudW1iZXIsIG9wdGlvbkl0ZW06IF9PcHRpb25JdGVtPEl0ZW1UeXBlLCBWYWx1ZVR5cGU+KTogVmFsdWVUeXBlID0+XG4gICAgICAgIHRoaXMudmFsdWVGbihvcHRpb25JdGVtPy5pdGVtKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHt9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLl9ydGxTZXJ2aWNlPy5ydGwuc3Vic2NyaWJlKChpc1J0bCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RpciA9IGlzUnRsID8gJ3J0bCcgOiAnbHRyJztcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQ29tcG9uZW50Q3NzQ2xhc3MoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlucHV0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRJZCA9IHV1aWR2NCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZUNoYW5nZXMucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKHNlYXJjaFRlcm0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm1DaGFuZ2UuZW1pdChzZWFyY2hUZXJtID8/ICcnKTtcbiAgICAgICAgICAgICAgICAvLyByZXNldHRpbmcgZXhpc3Rpbmcgc2VsZWN0aW9uIHN0YXRlLCBpZiBhbnlcbiAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIHRoaXMuX2dldFZpZXdNb2RlbCgpXG4gICAgICAgICAgICAgICAgLnBpcGUobWFwKCh2aWV3TW9kZWwpID0+ICF2aWV3TW9kZWwuZGlzcGxheWVkT3B0aW9ucy5zb21lKChjKSA9PiAhYy5pc1NlbGVjdGVkKSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoYWxsSXRlbXNTZWxlY3RlZCkgPT4gdGhpcy5hbGxJdGVtc1NlbGVjdGVkQ2hhbmdlLmVtaXQoYWxsSXRlbXNTZWxlY3RlZCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFyaWFMYWJlbCkge1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0QXJpYUxhYmVsKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuZHJvcGRvd25WYWx1ZXMgfHwgY2hhbmdlcy5zZWFyY2hUZXJtIHx8IGNoYW5nZXMudmFsdWVGbiB8fCBjaGFuZ2VzLmRpc3BsYXlGbikge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uSXRlbXMgPSAodGhpcy5kcm9wZG93blZhbHVlcyA/PyBbXSkubWFwKChpdGVtKSA9PiB0aGlzLl9nZXRPcHRpb25JdGVtKGl0ZW0pKTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uSXRlbXMkLm5leHQob3B0aW9uSXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPyB0aGlzLl9zZWFyY2hUZXJtQ3RybC5kaXNhYmxlKCkgOiB0aGlzLl9zZWFyY2hUZXJtQ3RybC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFVwTW9iaWxlTW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9rZW5pemVyLl9zaG93T3ZlcmZsb3dQb3BvdmVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHNlbGVjdGVkOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgd3JpdGVWYWx1ZShzZWxlY3RlZDogVmFsdWVUeXBlW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHBhc3NlZCB0byBsaXN0IGNvbXBvbmVudCAqL1xuICAgIGhhbmRsZUxpc3RGb2N1c0VzY2FwZShkaXJlY3Rpb246IEZvY3VzRXNjYXBlRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICd1cCcgJiYgIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9wZW5DaGFuZ2VIYW5kbGUob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcGVuICYmIHRoaXMub3BlbiAmJiAhdGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wZW4gIT09IG9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KG9wZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcblxuICAgICAgICBpZiAoIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3BvdmVyT3BlbkhhbmRsZShvcGVuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5vcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNldFNlYXJjaFRlcm0oKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUGFyZW50Rm9jdXNUcmFwKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVQYXJlbnRGb2N1c1RyYXAoKTtcblxuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9rZW5pemVyLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID1cbiAgICAgICAgICAgIHRoaXMudG9rZW5pemVyLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgdGhhdCBzZWxlY3RzIGFsbCBwb3NzaWJsZSBvcHRpb25zLiAqL1xuICAgIHNlbGVjdEFsbEl0ZW1zKHNlbGVjdEFsbDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoc2VsZWN0QWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5vcHRpb25JdGVtcyQuZ2V0VmFsdWUoKS5tYXAoKGMpID0+IGMudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9uIE1vYmlsZSBtb2RlIGNoYW5nZXMgYXJlIHByb3BhZ2F0ZWQgb25seSBvbiBhcHByb3ZlLlxuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vbkNoZWNrYm94S2V5dXAodmFsdWU6IGFueSwgZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBbU1BBQ0UsIEVOVEVSXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hlY2tib3hDbGljayh2YWx1ZSwgZXZlbnQsIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgYXN5bmMgX29uQ2hlY2tib3hDbGljayhcbiAgICAgICAgdmFsdWU6IGFueSxcbiAgICAgICAgZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50LFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBpc0xpc3RJdGVtID0gZmFsc2VcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdG9nZ2xlZFNlbGVjdGlvbiA9ICF0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHZhbHVlKTtcbiAgICAgICAgdGhpcy5fcmFuZ2VTZWxlY3Rvci5vblJhbmdlRWxlbWVudFRvZ2dsZWQoaW5kZXgsIGV2ZW50KTtcbiAgICAgICAgY29uc3Qgc3ViID0gdGhpcy5fdmlld01vZGVsJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgodm0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3IuYXBwbHlWYWx1ZVRvRWFjaEluUmFuZ2UoKGlkeCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVTZWxlY3QodG9nZ2xlZFNlbGVjdGlvbiwgdm0uZGlzcGxheWVkT3B0aW9uc1tpZHhdLnZhbHVlLCBmYWxzZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoc3ViKTtcbiAgICAgICAgaWYgKGlzTGlzdEl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHByb3BhZ2F0aW9uIG9uIHRoZSBjaGVja2JveCBzbyBldmVudCBkb2Vzbid0IHJlYWNoIHRoZSBsaXN0IGl0ZW1cbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25Ub2tlbkNsaWNrKHZhbHVlOiBhbnksIHJlc2V0U2VhcmNoOiBib29sZWFuLCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7IC8vIHByZXZlbnQgdGhpcyBmdW5jdGlvbiBmcm9tIGJlaW5nIGNhbGxlZCB0d2ljZSB3aGVuIGNoZWNrYm94IHVwZGF0ZXNcbiAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0KGZhbHNlLCB2YWx1ZSwgcmVzZXRTZWFyY2gsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2hhbmRsZVNlbGVjdChjaGVja2VkOiBhbnksIHZhbHVlOiBhbnksIHJlc2V0U2VhcmNoID0gdHJ1ZSwgZnJvbVRva2VuQ2xvc2VDbGljayA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGVuZ3RoID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoO1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmRlc2VsZWN0KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBwb3BvdmVyIHBsYWNlbWVudCB1cGRhdGVcbiAgICAgICAgaWYgKHRoaXMuX3Nob3VsZFBvcG92ZXJCZVVwZGF0ZWQocHJldmlvdXNMZW5ndGgsIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlclJlZi5yZWZyZXNoUG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzZXRTZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0U2VhcmNoVGVybSgpO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9uIE1vYmlsZSBtb2RlIGNoYW5nZXMgYXJlIHByb3BhZ2F0ZWQgb25seSBvbiBhcHByb3ZlLlxuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoZnJvbVRva2VuQ2xvc2VDbGljayk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaGFuZGxlSW5wdXRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRE9XTl9BUlJPVykgJiYgIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0Q29tcG9uZW50LnNldEl0ZW1BY3RpdmUoMCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgW0RPV05fQVJST1csIFVQX0FSUk9XLCBFTlRFUl0pKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5DaGFuZ2VIYW5kbGUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEVTQ0FQRSkpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFRBQikgJiYgdGhpcy5vcGVuKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saXN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0Q29tcG9uZW50LnNldEl0ZW1BY3RpdmUoMCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5VHlwZShldmVudCwgJ2FscGhhYmV0aWNhbCcpIHx8IEtleVV0aWwuaXNLZXlUeXBlKGV2ZW50LCAnbnVtZXJpYycpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3Blbikge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9zaG93QWxsQ2xpY2tlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3Nob3dBbGxLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgW1NQQUNFLCBFTlRFUl0pKSB7XG4gICAgICAgICAgICB0aGlzLl9zaG93QWxsQ2xpY2tlZChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vblN1Ym1pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHRoaXMuc2VhcmNoVGVybTtcbiAgICAgICAgaWYgKHNlYXJjaFRlcm0gPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNFeGlzdCA9IHRoaXMuX3NlbGVjdEZpcnN0RmlsdGVyZWQoc2VhcmNoVGVybSk7XG4gICAgICAgIGlmICghaXNFeGlzdCAmJiB0aGlzLmFsbG93TmV3VG9rZW5zICYmIHRoaXMubmV3VG9rZW5WYWxpZGF0ZUZuKHRoaXMuX3NlYXJjaFRlcm1DdHJsLnZhbHVlID8/ICcnKSkge1xuICAgICAgICAgICAgY29uc3QgbmV3VG9rZW4gPSB0aGlzLm5ld1Rva2VuUGFyc2VGbih0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZSA/PyAnJyk7XG4gICAgICAgICAgICB0aGlzLl9hZGROZXdUb2tlblRvRHJvcERvd25WYWx1ZXMobmV3VG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0KHRydWUsIG5ld1Rva2VuKTtcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaGFuZGxlQ29tcGxldGUoeyB0ZXJtIH0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXJtID0gdGVybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZGlhbG9nIGRpc21pc3NpbmcsIGNsb3NlcyBwb3BvdmVyIGFuZCBzZXRzIGJhY2t1cCBkYXRhLlxuICAgICAqL1xuICAgIGRpYWxvZ0Rpc21pc3Moc2VsZWN0ZWRCYWNrdXA6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2VhcmNoVGVybSgpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWRCYWNrdXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGRpYWxvZyBhcHByb3ZhbCwgY2xvc2VzIHBvcG92ZXIgYW5kIHByb3BhZ2F0ZXMgZGF0YSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIGRpYWxvZ0FwcHJvdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZSh0cnVlKTtcbiAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcmVzZXRTZWFyY2hUZXJtKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfbW9yZUNsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9hZGRPbkJ1dHRvbkNsaWNrZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWRkT25CdXR0b25DbGlja2VkLmVtaXQoZXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5vcGVuRHJvcGRvd25PbkFkZE9uQ2xpY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKCF0aGlzLm9wZW4pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3Blbikge1xuICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZGlzYWJsZVBhcmVudEZvY3VzVHJhcCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNUcmFwU2VydmljZT8ucGF1c2VDdXJyZW50Rm9jdXNUcmFwKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBlbmFibGVQYXJlbnRGb2N1c1RyYXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZvY3VzVHJhcFNlcnZpY2U/LnVucGF1c2VDdXJyZW50Rm9jdXNUcmFwKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9hZGROZXdUb2tlblRvRHJvcERvd25WYWx1ZXMobmV3VG9rZW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kcm9wZG93blZhbHVlcy5wdXNoKG5ld1Rva2VuKTtcbiAgICAgICAgY29uc3QgbmV3T3B0aW9uID0gdGhpcy5fZ2V0T3B0aW9uSXRlbShuZXdUb2tlbik7XG4gICAgICAgIHRoaXMub3B0aW9uSXRlbXMkLm5leHQoWy4uLnRoaXMub3B0aW9uSXRlbXMkLnZhbHVlLCBuZXdPcHRpb25dKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3NlbGVjdEZpcnN0RmlsdGVyZWQoc2VhcmNoVGVybTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJGbih0aGlzLmRyb3Bkb3duVmFsdWVzLCBzZWFyY2hUZXJtKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyZWQpICYmIGZpbHRlcmVkLmxlbmd0aCA+IDAgJiYgdGhpcy5hdXRvQ29tcGxldGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkl0ZW0gPSB0aGlzLl9nZXRPcHRpb25JdGVtKGZpbHRlcmVkWzBdKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVNlbGVjdCh0cnVlLCBvcHRpb25JdGVtLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEZpbHRlcihjb250ZW50QXJyYXk6IGFueVtdLCBzZWFyY2hUZXJtOiBzdHJpbmcgPSAnJyk6IGFueVtdIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoTG93ZXIgPSBzZWFyY2hUZXJtLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBjb250ZW50QXJyYXkuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXllZFZhbHVlID0gdGhpcy5kaXNwbGF5Rm4oaXRlbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVybSA9IHR5cGVvZiBkaXNwbGF5ZWRWYWx1ZSA9PT0gJ3N0cmluZycgPyBkaXNwbGF5ZWRWYWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpIDogJyc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlQWhlYWRNYXRjaGVyKHRlcm0sIHNlYXJjaExvd2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kZWZhdWx0VmFsdWVGbih2YWx1ZTogSXRlbVR5cGUgfCBWYWx1ZVR5cGUpOiBWYWx1ZVR5cGUge1xuICAgICAgICByZXR1cm4gdmFsdWUgYXMgVmFsdWVUeXBlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdERpc3BsYXkoc3RyOiBJdGVtVHlwZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPcHRpb25JdGVtQmFzZShzdHIpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyLmxhYmVsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kZWZhdWx0UGFyc2Uoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdFRva2VuVmFsaWRhdGUoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhc3RyO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfcG9wb3Zlck9wZW5IYW5kbGUob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLm9wZW4gPSBvcGVuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfcHJvcGFnYXRlQ2hhbmdlKGVtaXRJbk1vYmlsZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm1vYmlsZSB8fCBlbWl0SW5Nb2JpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gWy4uLnRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkXTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2Uoc2VsZWN0ZWQpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2hvdWxkUG9wb3ZlckJlVXBkYXRlZChwcmV2aW91c0xlbmd0aDogbnVtYmVyLCBjdXJyZW50TGVuZ3RoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICEhdGhpcy5wb3BvdmVyUmVmICYmXG4gICAgICAgICAgICAoKHByZXZpb3VzTGVuZ3RoID09PSAwICYmIGN1cnJlbnRMZW5ndGggPT09IDEpIHx8IChwcmV2aW91c0xlbmd0aCA9PT0gMSAmJiBjdXJyZW50TGVuZ3RoID09PSAwKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgYXN5bmMgX3NldFVwTW9iaWxlTW9kZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBNVUxUSV9JTlBVVF9DT01QT05FTlQsIHVzZVZhbHVlOiB0aGlzIH1dLFxuICAgICAgICAgICAgcGFyZW50OiB0aGlzLl9pbmplY3RvclxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9keW5hbWljQ29tcG9uZW50U2VydmljZS5jcmVhdGVEeW5hbWljTW9kdWxlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxpc3RUZW1wbGF0ZTogdGhpcy5saXN0VGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgY29udHJvbFRlbXBsYXRlOiB0aGlzLmNvbnRyb2xUZW1wbGF0ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE11bHRpSW5wdXRNb2JpbGVNb2R1bGUsXG4gICAgICAgICAgICBNdWx0aUlucHV0TW9iaWxlQ29tcG9uZW50LFxuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgICAgIGluamVjdG9yXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZXNldFNlYXJjaFRlcm0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldE9wdGlvbkl0ZW0oaXRlbTogSXRlbVR5cGUgfCBfT3B0aW9uSXRlbTxJdGVtVHlwZSwgVmFsdWVUeXBlPik6IF9PcHRpb25JdGVtPEl0ZW1UeXBlLCBWYWx1ZVR5cGU+IHtcbiAgICAgICAgaWYgKGlzT3B0aW9uSXRlbTxJdGVtVHlwZSwgVmFsdWVUeXBlPihpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBsYWJlbCwgdmFsdWUgfSA9IHRoaXMuX2dldFZhbHVlQW5kTGFiZWxPZkl0ZW0oaXRlbSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRWYWx1ZUFuZExhYmVsT2ZJdGVtKGl0ZW06IEl0ZW1UeXBlKTogT3B0aW9uSXRlbUJhc2U8VmFsdWVUeXBlPiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHREaXNwbGF5ID0gdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gIT09IG51bGwgPyBpdGVtW09iamVjdC5rZXlzKGl0ZW0pWzBdXSA6IGl0ZW07XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWVGbihpdGVtKSA/PyBkZWZhdWx0RGlzcGxheTtcbiAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5kaXNwbGF5Rm4oaXRlbSkgPz8gZGVmYXVsdERpc3BsYXk7XG4gICAgICAgIGlmIChpc09wdGlvbkl0ZW1CYXNlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZUZuID09PSB0aGlzLl9kZWZhdWx0VmFsdWVGbikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlGbiA9PT0gdGhpcy5fZGVmYXVsdERpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IGl0ZW0ubGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGFiZWwsIHZhbHVlIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRPcHRpb25JdGVtQnlWYWx1ZShcbiAgICAgICAgdmFsdWU6IFZhbHVlVHlwZSxcbiAgICAgICAgb3B0aW9uSXRlbXM6IF9PcHRpb25JdGVtPEl0ZW1UeXBlLCBWYWx1ZVR5cGU+W10gPSBbXVxuICAgICk6IF9PcHRpb25JdGVtPEl0ZW1UeXBlLCBWYWx1ZVR5cGU+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbkl0ZW1zLmZpbmQoKGMpID0+IGMudmFsdWUgPT09IHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldFZpZXdNb2RlbCgpOiBPYnNlcnZhYmxlPFZpZXdNb2RlbDxJdGVtVHlwZSwgVmFsdWVUeXBlPj4ge1xuICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5fc2VhcmNoVGVybUN0cmwudmFsdWUpKSxcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNoYW5nZWQucGlwZShzdGFydFdpdGgobnVsbCkpLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25JdGVtcyRcbiAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgIG1hcCgoWywgLCBvcHRpb25JdGVtc10pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQubWFwKFxuICAgICAgICAgICAgICAgICAgICAodikgPT4gdGhpcy5fZ2V0T3B0aW9uSXRlbUJ5VmFsdWUodiwgb3B0aW9uSXRlbXMpIHx8IHRoaXMuX2dldE9wdGlvbkl0ZW0odiBhcyBhbnkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAvLyBub3QgdXNpbmcgXCJzZWFyY2hUZXJtXCIgdmFsdWUgZnJvbSBjb21iaW5lTGF0ZXN0IGFzIGl0IHdpbGwgYmUgd3JvbmcgZm9yIGxhdGUgc3Vic2NyaWJlcnMsIGlmIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZSA/PyAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyRm4oXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbkl0ZW1zLm1hcCgoYykgPT4gYy5pdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoVGVybVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGxheWVkT3B0aW9ucyA9IChBcnJheS5pc0FycmF5KGZpbHRlcmVkKSA/IGZpbHRlcmVkIDogW10pLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0T3B0aW9uSXRlbShpdGVtKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZGlzcGxheWVkT3B0aW9ucy5mb3JFYWNoKChjKSA9PiAoYy5pc1NlbGVjdGVkID0gc2VsZWN0ZWQuZmluZEluZGV4KChkKSA9PiBkPy52YWx1ZSA9PT0gYy52YWx1ZSkgPiAtMSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHNlbGVjdGVkT3B0aW9uczogc2VsZWN0ZWQsIGRpc3BsYXllZE9wdGlvbnMgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRBcmlhTGFiZWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9sYW5ndWFnZSk7XG4gICAgICAgIHRoaXMuYXJpYUxhYmVsID0gdGhpcy5fdHJhbnNsYXRpb25SZXNvbHZlci5yZXNvbHZlKGxhbmcsICdjb3JlTXVsdGlJbnB1dC5tdWx0aUlucHV0QXJpYUxhYmVsJyk7XG4gICAgfVxufVxuXG5pbnRlcmZhY2UgX09wdGlvbkl0ZW08SXRlbVR5cGUgPSBhbnksIFZhbHVlVHlwZSA9IGFueT4gZXh0ZW5kcyBPcHRpb25JdGVtQmFzZTxWYWx1ZVR5cGU+IHtcbiAgICBpdGVtOiBJdGVtVHlwZTtcbiAgICBpc1NlbGVjdGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgT3B0aW9uSXRlbTxJdGVtVHlwZSA9IGFueSwgVmFsdWVUeXBlID0gYW55PiA9IE9taXQ8X09wdGlvbkl0ZW08SXRlbVR5cGUsIFZhbHVlVHlwZT4sICdpc1NlbGVjdGVkJz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uSXRlbUJhc2U8VmFsdWVUeXBlID0gYW55PiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogVmFsdWVUeXBlO1xufVxuXG5pbnRlcmZhY2UgVmlld01vZGVsPEl0ZW1UeXBlID0gYW55LCBWYWx1ZVR5cGUgPSBhbnk+IHtcbiAgICBzZWxlY3RlZE9wdGlvbnM6IF9PcHRpb25JdGVtPEl0ZW1UeXBlLCBWYWx1ZVR5cGU+W107XG4gICAgZGlzcGxheWVkT3B0aW9uczogX09wdGlvbkl0ZW08SXRlbVR5cGUsIFZhbHVlVHlwZT5bXTtcbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJfdmlld01vZGVsJCB8IGFzeW5jIGFzIHZpZXdNb2RlbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmZC1tdWx0aS1pbnB1dCBmZC1tdWx0aS1pbnB1dC1jdXN0b21cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZkLW11bHRpLWlucHV0LWZpZWxkXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZGlzcGxheUFkZG9uQnV0dG9uOiBkaXNwbGF5QWRkb25CdXR0b24gfVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJtb2JpbGVcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZmQtcG9wb3ZlclxuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxCb2R5Q2xhc3M9XCJmZC1wb3BvdmVyLWN1c3RvbS1saXN0XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgICAgIFtpc09wZW5dPVwib3BlblwiXG4gICAgICAgICAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJvcGVuQ2hhbmdlSGFuZGxlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCIhb3BlbiAmJiBvcGVuQ2hhbmdlSGFuZGxlKHRydWUpXCJcbiAgICAgICAgICAgICAgICBbdHJpZ2dlcnNdPVwiW11cIlxuICAgICAgICAgICAgICAgIFttYXhXaWR0aF09XCJfcG9wb3Zlck1heFdpZHRoXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtmaWxsQ29udHJvbE1vZGVdPVwiZmlsbENvbnRyb2xNb2RlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLW11bHRpLWlucHV0LXBvcG92ZXItY3VzdG9tXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtcG9wb3Zlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICA8Zm9ybSAoc3VibWl0KT1cIl9vblN1Ym1pdCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250cm9sOyBjb250ZXh0OiB7IGRpc3BsYXlBZGRvbkJ1dHRvbjogZGlzcGxheUFkZG9uQnV0dG9uIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgPC9mZC1wb3BvdmVyLWNvbnRyb2w+XG5cbiAgICAgICAgICAgICAgICA8ZmQtcG9wb3Zlci1ib2R5XG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFvcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZkLXBvcG92ZXJfX2JvZHktLWhpZGRlbl09XCIhdmlld01vZGVsLmRpc3BsYXllZE9wdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICAgIDwvZmQtcG9wb3Zlci1ib2R5PlxuICAgICAgICAgICAgPC9mZC1wb3BvdmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjY29udHJvbCBsZXQtc2hvd0FkZG9uQnV0dG9uPVwiZGlzcGxheUFkZG9uQnV0dG9uXCI+XG4gICAgICAgIDxmZC1pbnB1dC1ncm91cFxuICAgICAgICAgICAgY2xhc3M9XCJmZC1tdWx0aS1pbnB1dC1pbnB1dC1ncm91cC1jdXN0b21cIlxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcbiAgICAgICAgICAgIFtidXR0b25Gb2N1c2FibGVdPVwiYnV0dG9uRm9jdXNhYmxlXCJcbiAgICAgICAgICAgIFtidXR0b25dPVwic2hvd0FkZG9uQnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbaXNFeHBhbmRlZF09XCJvcGVuICYmICFtb2JpbGUgJiYgdmlld01vZGVsLmRpc3BsYXllZE9wdGlvbnMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICBbaXNDb250cm9sXT1cInRydWVcIlxuICAgICAgICAgICAgW2dseXBoXT1cInNob3dBZGRvbkJ1dHRvbiA/IGdseXBoIDogJydcIlxuICAgICAgICAgICAgW2ljb25UaXRsZV09XCJ0aXRsZVwiXG4gICAgICAgICAgICAoYWRkT25CdXR0b25DbGlja2VkKT1cIl9hZGRPbkJ1dHRvbkNsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxmZC10b2tlbml6ZXJcbiAgICAgICAgICAgICAgICAjdG9rZW5pemVyXG4gICAgICAgICAgICAgICAgW2NvbXBhY3RDb2xsYXBzZV09XCJjb21wYWN0Q29sbGFwc2VcIlxuICAgICAgICAgICAgICAgIFtvcGVuXT1cIm9wZW5cIlxuICAgICAgICAgICAgICAgIFt0b2tlbml6ZXJGb2N1c2FibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChtb3JlQ2xpY2tlZEV2ZW50KT1cIl9tb3JlQ2xpY2tlZCgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLW11bHRpLWlucHV0LXRva2VuaXplci1jdXN0b21cIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmZC10b2tlblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHZpZXdNb2RlbC5zZWxlY3RlZE9wdGlvbnM7IHRyYWNrQnk6IF90cmFja0J5XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2xvc2VDbGljayk9XCJfb25Ub2tlbkNsaWNrKG9wdGlvbi52YWx1ZSwgZmFsc2UsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAob25SZW1vdmUpPVwiX29uVG9rZW5DbGljayhvcHRpb24udmFsdWUsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIm9wdGlvbi5sYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2ZkLXRva2VuPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1pbnB1dCBmZC10b2tlbml6ZXJfX2lucHV0IGZkLW11bHRpLWlucHV0LXRva2VuaXplci1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIGZkLWZvcm0tY29udHJvbFxuICAgICAgICAgICAgICAgICAgICBmZC1pbnB1dC1ncm91cC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICBmZGtBdXRvQ29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwiX2hhbmRsZUNvbXBsZXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5Rm5dPVwiZGlzcGxheUZuXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdGNoZXJdPVwidHlwZUFoZWFkTWF0Y2hlclwiXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dFRleHRdPVwiX3NlYXJjaFRlcm1DdHJsLnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZHJvcGRvd25WYWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICBbZW5hYmxlXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIl9zZWFyY2hUZXJtQ3RybFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIl9oYW5kbGVJbnB1dEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImlucHV0SWRcIlxuICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwidG9rZW5pemVyLl9zaG93QWxsVG9rZW5zKClcIlxuICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJ0b2tlbml6ZXIuX2hpZGVUb2tlbnMoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZmQtdG9rZW5pemVyPlxuICAgICAgICA8L2ZkLWlucHV0LWdyb3VwPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2xpc3Q+XG4gICAgICAgIDx1bFxuICAgICAgICAgICAgKm5nSWY9XCJ2aWV3TW9kZWwuZGlzcGxheWVkT3B0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgZmQtbGlzdFxuICAgICAgICAgICAgY2xhc3M9XCJmZC1tdWx0aS1pbnB1dC1tZW51LW92ZXJmbG93XCJcbiAgICAgICAgICAgIFtzZWxlY3Rpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICBbbW9iaWxlTW9kZV09XCJtb2JpbGVcIlxuICAgICAgICAgICAgW3N0eWxlLm1heC1oZWlnaHRdPVwiIW1vYmlsZSA/IG1heEhlaWdodCA6ICdhdXRvJ1wiXG4gICAgICAgICAgICBbYnlsaW5lXT1cImJ5bGluZVwiXG4gICAgICAgICAgICAoZm9jdXNFc2NhcGVMaXN0KT1cImhhbmRsZUxpc3RGb2N1c0VzY2FwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiJzEwMCUnXCJcbiAgICAgICAgICAgIGFyaWEtbXVsdGlzZWxlY3RhYmxlPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygdmlld01vZGVsLmRpc3BsYXllZE9wdGlvbnM7IGluZGV4IGFzIGlkeDsgdHJhY2tCeTogX3RyYWNrQnlcIlxuICAgICAgICAgICAgICAgIGZkLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwib3B0aW9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiX29uQ2hlY2tib3hDbGljayhvcHRpb24udmFsdWUsICRldmVudCwgaWR4LCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgKGtleXVwKT1cIl9vbkNoZWNrYm94S2V5dXAob3B0aW9uLnZhbHVlLCAkZXZlbnQsIGlkeClcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCIhIW9wdGlvbi5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtY2hlY2tib3ggKGNsaWNrKT1cIl9vbkNoZWNrYm94Q2xpY2sob3B0aW9uLnZhbHVlLCAkZXZlbnQsIGlkeClcIiBbdmFsdWVdPVwib3B0aW9uLmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBUT0RPIC0tPlxuICAgICAgICAgICAgICAgIDwvZmQtY2hlY2tib3g+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1Tb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcHRpb246IG9wdGlvbiB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xpPlxuXG4gICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dBbGxCdXR0b24gJiYgdmlld01vZGVsLmRpc3BsYXllZE9wdGlvbnMubGVuZ3RoIDwgZHJvcGRvd25WYWx1ZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBmZC1saXN0LWl0ZW1cbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLW11bHRpLWlucHV0LXNob3ctYWxsXCJcbiAgICAgICAgICAgICAgICAoa2V5RG93bik9XCJfc2hvd0FsbEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9zaG93QWxsQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YSBmZC1saW5rIHRhYmluZGV4PVwiMFwiPlNob3cgQWxsICh7eyBkcm9wZG93blZhbHVlcy5sZW5ndGggfX0pPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlIGxldC1vcHRpb249XCJvcHRpb25cIiAjaXRlbVNvdXJjZT5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIWl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICBmZC1saXN0LXRpdGxlXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cIm9wdGlvbi5sYWJlbCB8IGhpZ2hsaWdodCA6IF9zZWFyY2hUZXJtQ3RybC52YWx1ZSB8fCAnJyA6IGhpZ2hsaWdodFwiXG4gICAgICAgID48L3NwYW4+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBvcHRpb24uaXRlbSB9XCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctY29udGFpbmVyPlxuIl19
|
|
787
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktaW5wdXQvbXVsdGktaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktaW5wdXQvbXVsdGktaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RixPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hILE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdFLE9BQU8sRUFDSCxhQUFhLEVBQ2IscUJBQXFCLEVBRXJCLHVCQUF1QixFQUV2QixnQkFBZ0IsRUFDaEIsT0FBTyxFQUVQLGFBQWEsRUFD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QWU7c0JBRGQsS0FBSztnQkFLTixjQUFjO3NCQURiLEtBQUs7Z0JBS04sTUFBTTtzQkFETCxLQUFLO2dCQUtOLGFBQWE7c0JBRFosS0FBSztnQkFVTixZQUFZO3NCQURYLEtBQUs7Z0JBa0JOLFlBQVk7c0JBRFgsS0FBSztnQkFRTixRQUFRO3NCQURQLEtBQUs7Z0JBUU4sWUFBWTtzQkFEWCxLQUFLO2dCQU9OLEtBQUs7c0JBREosS0FBSztnQkFLTixNQUFNO3NCQURMLEtBQUs7Z0JBS04sWUFBWTtzQkFEWCxLQUFLO2dCQUtHLGdCQUFnQjtzQkFEeEIsTUFBTTtnQkFLRSxjQUFjO3NCQUR0QixNQUFNO2dCQUtQLElBQUk7c0JBREgsS0FBSztnQkFLTixrQkFBa0I7c0JBRGpCLEtBQUs7Z0JBS0csVUFBVTtzQkFEbEIsTUFBTTtnQkFLRSxrQkFBa0I7c0JBRDFCLE1BQU07Z0JBS0Usc0JBQXNCO3NCQUQ5QixNQUFNO2dCQUtQLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBSzNCLGVBQWU7c0JBRGQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUszQyxZQUFZO3NCQURYLFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFLeEMsYUFBYTtzQkFEWixTQUFTO3VCQUFDLGFBQWE7Z0JBS3hCLGtCQUFrQjtzQkFEakIsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBS3JELFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBd0Q3QixzQkFBc0IsTUFjZCxTQUFTO3NCQURoQixZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IERPV05fQVJST1csIEVOVEVSLCBFU0NBUEUsIFNQQUNFLCBUQUIsIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaXJzdCwgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gICAgYXBwbHlDc3NDbGFzcyxcbiAgICBBdXRvQ29tcGxldGVEaXJlY3RpdmUsXG4gICAgQ3NzQ2xhc3NCdWlsZGVyLFxuICAgIER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxuICAgIEZvY3VzRXNjYXBlRGlyZWN0aW9uLFxuICAgIEZvY3VzVHJhcFNlcnZpY2UsXG4gICAgS2V5VXRpbCxcbiAgICBOdWxsYWJsZSxcbiAgICBSYW5nZVNlbGVjdG9yLFxuICAgIFJ0bFNlcnZpY2UsXG4gICAgU2VhcmNoSGlnaGxpZ2h0UGlwZSxcbiAgICB1dWlkdjRcbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2xDb21wb25lbnQsIEZvcm1JdGVtQ29udHJvbCwgcmVnaXN0ZXJGb3JtSXRlbUNvbnRyb2wgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvZm9ybSc7XG5pbXBvcnQgeyBMaXN0Q29tcG9uZW50LCBMaXN0TW9kdWxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2xpc3QnO1xuaW1wb3J0IHsgTWVudUtleWJvYXJkU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9tZW51JztcbmltcG9ydCB7IE1vYmlsZU1vZGVDb25maWcgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbW9iaWxlLW1vZGUnO1xuaW1wb3J0IHsgUG9wb3ZlckJvZHlDb21wb25lbnQsIFBvcG92ZXJDb21wb25lbnQsIFBvcG92ZXJDb250cm9sQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3BvcG92ZXInO1xuaW1wb3J0IHsgUG9wb3ZlckZpbGxNb2RlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3NoYXJlZCc7XG5pbXBvcnQgeyBUb2tlbml6ZXJDb21wb25lbnQsIFRva2VuTW9kdWxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3Rva2VuJztcblxuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtU3RhdGVzIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvZm9ybXMnO1xuaW1wb3J0IHsgQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvY2hlY2tib3gnO1xuaW1wb3J0IHsgQ29udGVudERlbnNpdHlPYnNlcnZlciwgY29udGVudERlbnNpdHlPYnNlcnZlclByb3ZpZGVycyB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9jb250ZW50LWRlbnNpdHknO1xuaW1wb3J0IHsgSW5wdXRHcm91cE1vZHVsZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9pbnB1dC1ncm91cCc7XG5pbXBvcnQgeyBMaW5rQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2xpbmsnO1xuaW1wb3J0IHsgRkRfTEFOR1VBR0UsIEZkTGFuZ3VhZ2UsIFRyYW5zbGF0aW9uUmVzb2x2ZXIgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2kxOG4nO1xuaW1wb3J0IHsgTXVsdGlJbnB1dE1vYmlsZUNvbXBvbmVudCB9IGZyb20gJy4vbXVsdGktaW5wdXQtbW9iaWxlL211bHRpLWlucHV0LW1vYmlsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTXVsdGlJbnB1dE1vYmlsZU1vZHVsZSB9IGZyb20gJy4vbXVsdGktaW5wdXQtbW9iaWxlL211bHRpLWlucHV0LW1vYmlsZS5tb2R1bGUnO1xuaW1wb3J0IHsgTVVMVElfSU5QVVRfQ09NUE9ORU5ULCBNdWx0aUlucHV0SW50ZXJmYWNlIH0gZnJvbSAnLi9tdWx0aS1pbnB1dC5pbnRlcmZhY2UnO1xuXG5mdW5jdGlvbiBpc09wdGlvbkl0ZW08SXRlbVR5cGUgPSBhbnksIFZhbHVlVHlwZSA9IGFueT4oY2FuZGlkYXRlOiBhbnkpOiBjYW5kaWRhdGUgaXMgX09wdGlvbkl0ZW08SXRlbVR5cGUsIFZhbHVlVHlwZT4ge1xuICAgIHJldHVybiBpc09wdGlvbkl0ZW1CYXNlPFZhbHVlVHlwZT4oY2FuZGlkYXRlKSAmJiAnaXRlbScgaW4gY2FuZGlkYXRlO1xufVxuXG5mdW5jdGlvbiBpc09wdGlvbkl0ZW1CYXNlPFZhbHVlVHlwZSA9IGFueT4oY2FuZGlkYXRlOiBhbnkpOiBjYW5kaWRhdGUgaXMgT3B0aW9uSXRlbUJhc2U8VmFsdWVUeXBlPiB7XG4gICAgcmV0dXJuIHR5cGVvZiBjYW5kaWRhdGUgPT09ICdvYmplY3QnICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiAndmFsdWUnIGluIGNhbmRpZGF0ZSAmJiAnbGFiZWwnIGluIGNhbmRpZGF0ZTtcbn1cblxuLyoqXG4gKiBJbnB1dCBmaWVsZCB3aXRoIG11bHRpcGxlIHNlbGVjdGlvbiBlbmFibGVkLiBTaG91bGQgYmUgdXNlZCB3aGVuIGEgdXNlciBjYW4gc2VsZWN0IGJldHdlZW4gYVxuICogbGltaXRlZCBudW1iZXIgb2YgcHJlLWRlZmluZWQgb3B0aW9ucyB3aXRoIGEgZmlsdGVyLWVuYWJsZWQgY29udGV4dC5cbiAqXG4gKiBTdXBwb3J0cyBBbmd1bGFyIEZvcm1zLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLW11bHRpLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL211bHRpLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlJbnB1dENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBNZW51S2V5Ym9hcmRTZXJ2aWNlLFxuICAgICAgICByZWdpc3RlckZvcm1JdGVtQ29udHJvbChNdWx0aUlucHV0Q29tcG9uZW50KSxcbiAgICAgICAgY29udGVudERlbnNpdHlPYnNlcnZlclByb3ZpZGVycygpXG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBQb3BvdmVyQ29tcG9uZW50LFxuICAgICAgICBQb3BvdmVyQ29udHJvbENvbXBvbmVudCxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFBvcG92ZXJCb2R5Q29tcG9uZW50LFxuICAgICAgICBJbnB1dEdyb3VwTW9kdWxlLFxuICAgICAgICBUb2tlbk1vZHVsZSxcbiAgICAgICAgTmdGb3IsXG4gICAgICAgIEZvcm1Db250cm9sQ29tcG9uZW50LFxuICAgICAgICBBdXRvQ29tcGxldGVEaXJlY3RpdmUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIExpc3RNb2R1bGUsXG4gICAgICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBMaW5rQ29tcG9uZW50LFxuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIFNlYXJjaEhpZ2hsaWdodFBpcGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpSW5wdXRDb21wb25lbnQ8SXRlbVR5cGUgPSBhbnksIFZhbHVlVHlwZSA9IGFueT5cbiAgICBpbXBsZW1lbnRzXG4gICAgICAgIE11bHRpSW5wdXRJbnRlcmZhY2UsXG4gICAgICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgICAgICBDc3NDbGFzc0J1aWxkZXIsXG4gICAgICAgIE9uSW5pdCxcbiAgICAgICAgT25DaGFuZ2VzLFxuICAgICAgICBBZnRlclZpZXdJbml0LFxuICAgICAgICBPbkRlc3Ryb3ksXG4gICAgICAgIEZvcm1JdGVtQ29udHJvbFxue1xuICAgIC8qKiBQbGFjZWhvbGRlciBmb3IgdGhlIGlucHV0IGZpZWxkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcGxhY2Vob2xkZXIgPSAnJztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBpbnB1dCBpcyBkaXNhYmxlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKiogSWYgaXQgaXMgbWFuZGF0b3J5IGZpZWxkICovXG4gICAgQElucHV0KClcbiAgICByZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdG8gdXNlIGNvenkgdmlzdWFscyBidXQgY29tcGFjdCBjb2xsYXBzaW5nIGJlaGF2aW9yLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29tcGFjdENvbGxhcHNlID0gdHJ1ZTtcblxuICAgIC8qKiBNYXggaGVpZ2h0IG9mIHRoZSBwb3BvdmVyLiBBbnkgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2lsbCBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggc2Nyb2xsaW5nLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4SGVpZ2h0ID0gJzMwMHB4JztcblxuICAgIC8qKiBJY29uIG9mIHRoZSBidXR0b24gb24gdGhlIHJpZ2h0IG9mIHRoZSBpbnB1dCBmaWVsZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdseXBoID0gJ3ZhbHVlLWhlbHAnO1xuXG4gICAgLyoqIFZhbHVlcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHVuZmlsdGVyZWQgZHJvcGRvd24uICovXG4gICAgQElucHV0KClcbiAgICBkcm9wZG93blZhbHVlczogQXJyYXk8SXRlbVR5cGUgfCBfT3B0aW9uSXRlbTxJdGVtVHlwZSwgVmFsdWVUeXBlPj4gPSBbXTtcblxuICAgIC8qKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGRyb3Bkb3duIHdoZW4gdGhlIGFkZG9uIGJ1dHRvbiBpcyBjbGlja2VkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgb3BlbkRyb3Bkb3duT25BZGRPbkNsaWNrZWQgPSB0cnVlO1xuXG4gICAgLyoqIFNlYXJjaCB0ZXJtLCBvciBtb3JlIHNwZWNpZmljYWxseSB0aGUgdmFsdWUgb2YgdGhlIGlubmVyIGlucHV0IGZpZWxkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNlYXJjaFRlcm0odmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIGdldCBzZWFyY2hUZXJtKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZSA/PyAnJztcbiAgICB9XG5cbiAgICAvKiogSWQgYXR0cmlidXRlIGZvciBpbnB1dCBlbGVtZW50IGluc2lkZSBNdWx0aUlucHV0IGNvbXBvbmVudCAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW5wdXRJZCA9ICcnO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHNlYXJjaCB0ZXJtIHNob3VsZCBiZSBoaWdobGlnaHRlZCBpbiByZXN1bHRzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlnaGxpZ2h0ID0gdHJ1ZTtcblxuICAgIC8qKiBTZWxlY3RlZCBkcm9wZG93biBpdGVtcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzZWxlY3RlZCh2YWx1ZXM6IFZhbHVlVHlwZVtdKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgICAgIHZhbHVlcz8uZm9yRWFjaCgoaXRlbSkgPT4gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KGl0ZW0pKTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0ZWQoKTogVmFsdWVUeXBlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqIHVzZXIncyBjdXN0b20gY2xhc3NlcyAqL1xuICAgIEBJbnB1dCgpXG4gICAgY2xhc3M6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEZpbHRlciBmdW5jdGlvbi4gQWNjZXB0cyBhbiBhcnJheSBhbmQgYSBzdHJpbmcgYXMgYXJndW1lbnRzLCBhbmQgb3V0cHV0cyBhbiBhcnJheS5cbiAgICAgKiBBbiBhcnJvdyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlICp0aGlzKiBrZXl3b3JkIGluIHRoZSBjYWxsaW5nIGNvbXBvbmVudC5cbiAgICAgKiBTZWUgbXVsdGkgaW5wdXQgZXhhbXBsZXMgZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBmaWx0ZXJGbiA9IHRoaXMuX2RlZmF1bHRGaWx0ZXI7XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZSBmdW5jdGlvbi4gQWNjZXB0cyBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGVcbiAgICAgKiBpdGVtcyBwYXNzZWQgdG8gZHJvcGRvd25WYWx1ZXMgYXMgYXJndW1lbnQsIGFuZCBvdXRwdXRzIGFueSBwcm9wZXJ0eSwgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB2YWx1ZS5cbiAgICAgKiBBbiBhcnJvdyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlICp0aGlzKiBrZXl3b3JkIGluIHRoZSBjYWxsaW5nIGNvbXBvbmVudC5cbiAgICAgKiBTZWUgbXVsdGkgaW5wdXQgZXhhbXBsZXMgZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB2YWx1ZUZuOiAoaXRlbTogSXRlbVR5cGUpID0+IFZhbHVlVHlwZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZUZuO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGxheSBmdW5jdGlvbi4gQWNjZXB0cyBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGVcbiAgICAgKiBpdGVtcyBwYXNzZWQgdG8gZHJvcGRvd25WYWx1ZXMgYXMgYXJndW1lbnQsIGFuZCBvdXRwdXRzIGEgc3RyaW5nLlxuICAgICAqIEFuIGFycm93IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgKnRoaXMqIGtleXdvcmQgaW4gdGhlIGNhbGxpbmcgY29tcG9uZW50LlxuICAgICAqIFNlZSBtdWx0aSBpbnB1dCBleGFtcGxlcyBmb3IgZGV0YWlscy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlGbjogKGl0ZW06IEl0ZW1UeXBlKSA9PiBzdHJpbmcgPSB0aGlzLl9kZWZhdWx0RGlzcGxheSBhcyB1bmtub3duIGFzIChpdGVtOiBJdGVtVHlwZSkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2UgZnVuY3Rpb24uIFVzZWQgZm9yIHN1Ym1pdHRpbmcgbmV3IHRva2Vucy4gQWNjZXB0cyBhIHN0cmluZyBieSBkZWZhdWx0LlxuICAgICAqIEFuIGFycm93IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgKnRoaXMqIGtleXdvcmQgaW4gdGhlIGNhbGxpbmcgY29tcG9uZW50LlxuICAgICAqIFNlZSBtdWx0aSBpbnB1dCBleGFtcGxlcyBmb3IgZGV0YWlscy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG5ld1Rva2VuUGFyc2VGbjogKHNlYXJjaFRlcm06IHN0cmluZykgPT4gYW55ID0gdGhpcy5fZGVmYXVsdFBhcnNlO1xuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgZnVuY3Rpb24uIFVzZWQgdG8gY2hlY2sgaWYgbmV3IHRva2VuIGNhbiBiZSBhZGRlZCBpbnRvIGxpc3QuXG4gICAgICogV29ya3Mgb25seSwgd2hlbiBgYWxsb3dOZXdUb2tlbnNgIG9wdGlvbiBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgbmV3VG9rZW5WYWxpZGF0ZUZuID0gdGhpcy5fZGVmYXVsdFRva2VuVmFsaWRhdGU7XG5cbiAgICAvKiogYXJpYS1sYWJlbCBhdHRyaWJ1dGUgYmluZGluZy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFyaWFMYWJlbDogTnVsbGFibGU8c3RyaW5nPjtcblxuICAgIC8qKiBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlIGJpbmRpbmcuICovXG4gICAgQElucHV0KClcbiAgICBhcmlhTGFiZWxsZWRCeTogTnVsbGFibGU8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIFByZXNldCBvcHRpb25zIGZvciB0aGUgU2VsZWN0IGJvZHkgd2lkdGgsIHdoYXRldmVyIGlzIGNob3NlbiwgdGhlIGJvZHkgaGFzIGEgNjAwcHggbGltaXQuXG4gICAgICogKiBgYXQtbGVhc3RgIHdpbGwgYXBwbHkgYSBtaW5pbXVtIHdpZHRoIHRvIHRoZSBib2R5IGVxdWl2YWxlbnQgdG8gdGhlIHdpZHRoIG9mIHRoZSBjb250cm9sLiAtIERlZmF1bHRcbiAgICAgKiAqIGBlcXVhbGAgd2lsbCBhcHBseSBhIHdpZHRoIHRvIHRoZSBib2R5IGVxdWl2YWxlbnQgdG8gdGhlIHdpZHRoIG9mIHRoZSBjb250cm9sLlxuICAgICAqICogJ2ZpdC1jb250ZW50JyB3aWxsIGFwcGx5IHdpZHRoIG5lZWRlZCB0byBwcm9wZXJseSBkaXNwbGF5IGl0ZW1zIGluc2lkZSwgaW5kZXBlbmRlbnQgb2YgY29udHJvbC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGZpbGxDb250cm9sTW9kZTogUG9wb3ZlckZpbGxNb2RlID0gJ2F0LWxlYXN0JztcblxuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUgb2YgdGhlIGZvcm0gY29udHJvbCAtIGFwcGxpZXMgY3NzIGNsYXNzZXMuXG4gICAgICogIENhbiBiZSBgc3VjY2Vzc2AsIGBlcnJvcmAsIGB3YXJuaW5nYCwgYGluZm9ybWF0aW9uYCBvciBibGFuayBmb3IgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHN0YXRlPzogRm9ybVN0YXRlcztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgQWRkT24gQnV0dG9uIHNob3VsZCBiZSBmb2N1c2FibGVcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBidXR0b25Gb2N1c2FibGUgPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIG11bHRpLWlucHV0IGFsbG93cyB0aGUgY3JlYXRpb24gb2YgbmV3IHRva2Vucy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFsbG93TmV3VG9rZW5zID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0aGUgbXVsdGktaW5wdXQgc2hvdWxkIGJlIGJ1aWx0IG9uIG1vYmlsZSBtb2RlICovXG4gICAgQElucHV0KClcbiAgICBtb2JpbGUgPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBtdWx0aS1pbnB1dCBzaG91bGQgaGF2ZSBzaG93IGFsbCBidXR0b24uICovXG4gICAgQElucHV0KClcbiAgICBzaG93QWxsQnV0dG9uID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIE1heCB3aWR0aCBvZiBtdWx0aSBpbnB1dCBib2R5LlxuICAgICAqIGBub25lYCB3aWxsIG5vdCBsaW1pdCB3aWR0aCBvZiB0aGUgZHJvcGRvd24uXG4gICAgICogYGNvbnRhaW5lcmAgd2lsbCBsaW1pdCB3aWR0aCBvZiB0aGUgZHJvcGRvd24gdG8gdGhlIHdpZHRoIG9mIHRoZSBtdWx0aS1pbnB1dCBpdHNlbGYuXG4gICAgICogYG51bWJlcmAgd2lsbCBsaW1pdCB3aWR0aCBvZiB0aGUgZHJvcGRvd24gYnkgcHJvdmlkZWQgbnVtYmVyIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGJvZHlNYXhXaWR0aDogJ25vbmUnIHwgJ2NvbnRhaW5lcicgfCBudW1iZXIgPSAnbm9uZSc7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGdldCBfcG9wb3Zlck1heFdpZHRoKCk6IE51bGxhYmxlPG51bWJlcj4ge1xuICAgICAgICBpZiAodGhpcy5ib2R5TWF4V2lkdGggPT09ICdub25lJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYm9keU1heFdpZHRoID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYm9keU1heFdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIH1cblxuICAgIC8qKiBNdWx0aSBJbnB1dCBNb2JpbGUgQ29uZmlndXJhdGlvbiwgaXQncyBhcHBsaWVkIG9ubHksIHdoZW4gbW9iaWxlIGlzIGVuYWJsZWQgKi9cbiAgICBASW5wdXQoKVxuICAgIG1vYmlsZUNvbmZpZzogTW9iaWxlTW9kZUNvbmZpZyA9IHsgaGFzQ2xvc2VCdXR0b246IHRydWUsIGFwcHJvdmVCdXR0b25UZXh0OiAnU2VsZWN0JyB9O1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byByZXR1cm4gcmVzdWx0cyB3aGVyZSB0aGUgaW5wdXQgbWF0Y2hlcyB0aGUgZW50aXJlIHN0cmluZy4gQnkgZGVmYXVsdCwgb25seSByZXN1bHRzIHRoYXQgc3RhcnRcbiAgICAgKiB3aXRoIHRoZSBpbnB1dCBzZWFyY2ggdGVybSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW5jbHVkZXMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZW1wbGF0ZSB3aXRoIHdoaWNoIHRvIGRpc3BsYXkgdGhlIGluZGl2aWR1YWwgbGlzdGVkIGl0ZW1zLlxuICAgICAqIFVzZSBpdCBieSBwYXNzaW5nIGFuIG5nLXRlbXBsYXRlIHdpdGggaW1wbGljaXQgY29udGVudC4gU2VlIGV4YW1wbGVzIGZvciBtb3JlIGluZm8uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG9vbHRpcCBmb3IgdGhlIG11bHRpLWlucHV0IGljb24uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB0aXRsZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgbGlzdCBpdGVtIG9wdGlvbnMgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGJ5bGluZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGJ5bGluZSA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGF1dG9jb21wbGV0ZSBzaG91bGQgYmUgZW5hYmxlZDsgRW5hYmxlZCBieSBkZWZhdWx0ICovXG4gICAgQElucHV0KClcbiAgICBhdXRvQ29tcGxldGUgPSB0cnVlO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VhcmNoIHRlcm0gY2hhbmdlcy4gVXNlICokZXZlbnQqIHRvIGFjY2VzcyB0aGUgbmV3IHRlcm0uICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VhcmNoVGVybUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdGVkIGl0ZW1zIGNoYW5nZS4gVXNlICokZXZlbnQqIHRvIGFjY2VzcyB0aGUgbmV3IHNlbGVjdGVkIGFycmF5LiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHNlbGVjdGVkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VmFsdWVUeXBlW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxWYWx1ZVR5cGVbXT4oKTtcblxuICAgIC8qKiBXaGV0aGVyIG11bHRpIGlucHV0IHBvcG92ZXIgYm9keSBzaG91bGQgYmUgb3BlbmVkICovXG4gICAgQElucHV0KClcbiAgICBvcGVuID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSB0aGUgYWRkb24gYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzcGxheUFkZG9uQnV0dG9uID0gdHJ1ZTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkLCB3aGVuIHRoZSBtdWx0aSBpbnB1dCdzIHBvcG92ZXIgYm9keSBpcyBvcGVuZWQgb3IgY2xvc2VkICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgb3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqIEVtaXRzIGV2ZW50IHdoZW4gdGhlIGFkZG9uIGJ1dHRvbiBpcyBjbGlja2VkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IGFkZE9uQnV0dG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCwgd2hlbiB0aGUgbXVsdGkgaW5wdXQncyBhbGwgaXRlbSBjaGVja2VkIG9yIG5vdCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IGFsbEl0ZW1zU2VsZWN0ZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZChQb3BvdmVyQ29tcG9uZW50KVxuICAgIHBvcG92ZXJSZWY6IFBvcG92ZXJDb21wb25lbnQ7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRyb2wnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgY29udHJvbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx7IGRpc3BsYXlBZGRvbkJ1dHRvbjogYm9vbGVhbiB9PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnbGlzdCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBsaXN0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoTGlzdENvbXBvbmVudClcbiAgICBsaXN0Q29tcG9uZW50OiBMaXN0Q29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dEVsZW1lbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBzZWFyY2hJbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoVG9rZW5pemVyQ29tcG9uZW50KVxuICAgIHRva2VuaXplcjogVG9rZW5pemVyQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZGVmYXVsdEFyaWFMYWJlbDogTnVsbGFibGU8c3RyaW5nPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVhZG9ubHkgb3B0aW9uSXRlbXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxfT3B0aW9uSXRlbTxJdGVtVHlwZSwgVmFsdWVUeXBlPltdPihbXSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9zZWFyY2hUZXJtQ3RybCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9zZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxWYWx1ZVR5cGU+KHRydWUpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBfdmlld01vZGVsJDogT2JzZXJ2YWJsZTxWaWV3TW9kZWw8SXRlbVR5cGUsIFZhbHVlVHlwZT4+ID0gdGhpcy5fZ2V0Vmlld01vZGVsKCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9kaXI6IHN0cmluZztcblxuICAgIC8qKiB0eXBlYWhlYWQgbWF0Y2hlciBmdW5jdGlvbiAqL1xuICAgIGdldCB0eXBlQWhlYWRNYXRjaGVyKCk6IChpdGVtOiBzdHJpbmcsIHNlYXJjaFRlcm06IHN0cmluZykgPT4gYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmluY2x1ZGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gKGl0ZW06IHN0cmluZywgc2VhcmNoVGVybTogc3RyaW5nKSA9PiBpdGVtLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoaXRlbTogc3RyaW5nLCBzZWFyY2hUZXJtOiBzdHJpbmcpID0+IGl0ZW0uc3RhcnRzV2l0aChzZWFyY2hUZXJtKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JhbmdlU2VsZWN0b3IgPSBuZXcgUmFuZ2VTZWxlY3RvcigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90cmFuc2xhdGlvblJlc29sdmVyID0gbmV3IFRyYW5zbGF0aW9uUmVzb2x2ZXIoKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHJlYWRvbmx5IF9jb250ZW50RGVuc2l0eU9ic2VydmVyOiBDb250ZW50RGVuc2l0eU9ic2VydmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5nZURldFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2R5bmFtaWNDb21wb25lbnRTZXJ2aWNlOiBEeW5hbWljQ29tcG9uZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBASW5qZWN0KEZEX0xBTkdVQUdFKSBwcml2YXRlIHJlYWRvbmx5IF9sYW5ndWFnZTogT2JzZXJ2YWJsZTxGZExhbmd1YWdlPixcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBfcnRsU2VydmljZTogUnRsU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBfZm9jdXNUcmFwU2VydmljZTogRm9jdXNUcmFwU2VydmljZVxuICAgICkge31cblxuICAgIC8qKiBAaGlkZGVuIENzc0NsYXNzQnVpbGRlciBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb25cbiAgICAgKiBmdW5jdGlvbiBtdXN0IHJldHVybiBzaW5nbGUgc3RyaW5nXG4gICAgICogZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIG9yZGVyIHdoaWNoIGNzcyBjbGFzc2VzIGFyZSBhcHBsaWVkXG4gICAgICovXG4gICAgQGFwcGx5Q3NzQ2xhc3NcbiAgICBidWlsZENvbXBvbmVudENzc0NsYXNzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpY29uIGZsaXAgbWF5IGJlIGFkZHJlc3NlZCBpbiBzdHlsZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICBpZiAodGhpcy5nbHlwaCA9PT0gJ3ZhbHVlLWhlbHAnICYmIHRoaXMuX2RpciA9PT0gJ3J0bCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGljb24gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2FwLWljb24tLXZhbHVlLWhlbHAnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvbi5zdHlsZS50cmFuc2Zvcm0gPSAnc2NhbGVYKC0xKSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gWydmZC1tdWx0aS1pbnB1dCcsICdmZC1tdWx0aS1pbnB1dC1jdXN0b20nLCB0aGlzLmNsYXNzXTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgWyckZXZlbnQnXSlcbiAgICBwcml2YXRlIF9mb2N1c091dChldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF90cmFja0J5ID0gKGluZGV4OiBudW1iZXIsIG9wdGlvbkl0ZW06IF9PcHRpb25JdGVtPEl0ZW1UeXBlLCBWYWx1ZVR5cGU+KTogVmFsdWVUeXBlID0+XG4gICAgICAgIHRoaXMudmFsdWVGbihvcHRpb25JdGVtPy5pdGVtKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHt9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLl9ydGxTZXJ2aWNlPy5ydGwuc3Vic2NyaWJlKChpc1J0bCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RpciA9IGlzUnRsID8gJ3J0bCcgOiAnbHRyJztcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQ29tcG9uZW50Q3NzQ2xhc3MoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlucHV0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRJZCA9IHV1aWR2NCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZUNoYW5nZXMucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKHNlYXJjaFRlcm0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm1DaGFuZ2UuZW1pdChzZWFyY2hUZXJtID8/ICcnKTtcbiAgICAgICAgICAgICAgICAvLyByZXNldHRpbmcgZXhpc3Rpbmcgc2VsZWN0aW9uIHN0YXRlLCBpZiBhbnlcbiAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIHRoaXMuX2dldFZpZXdNb2RlbCgpXG4gICAgICAgICAgICAgICAgLnBpcGUobWFwKCh2aWV3TW9kZWwpID0+ICF2aWV3TW9kZWwuZGlzcGxheWVkT3B0aW9ucy5zb21lKChjKSA9PiAhYy5pc1NlbGVjdGVkKSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoYWxsSXRlbXNTZWxlY3RlZCkgPT4gdGhpcy5hbGxJdGVtc1NlbGVjdGVkQ2hhbmdlLmVtaXQoYWxsSXRlbXNTZWxlY3RlZCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLl9sYW5ndWFnZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2dldEFyaWFMYWJlbCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuZHJvcGRvd25WYWx1ZXMgfHwgY2hhbmdlcy5zZWFyY2hUZXJtIHx8IGNoYW5nZXMudmFsdWVGbiB8fCBjaGFuZ2VzLmRpc3BsYXlGbikge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uSXRlbXMgPSAodGhpcy5kcm9wZG93blZhbHVlcyA/PyBbXSkubWFwKChpdGVtKSA9PiB0aGlzLl9nZXRPcHRpb25JdGVtKGl0ZW0pKTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uSXRlbXMkLm5leHQob3B0aW9uSXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPyB0aGlzLl9zZWFyY2hUZXJtQ3RybC5kaXNhYmxlKCkgOiB0aGlzLl9zZWFyY2hUZXJtQ3RybC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFVwTW9iaWxlTW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9rZW5pemVyLl9zaG93T3ZlcmZsb3dQb3BvdmVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHNlbGVjdGVkOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgd3JpdGVWYWx1ZShzZWxlY3RlZDogVmFsdWVUeXBlW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHBhc3NlZCB0byBsaXN0IGNvbXBvbmVudCAqL1xuICAgIGhhbmRsZUxpc3RGb2N1c0VzY2FwZShkaXJlY3Rpb246IEZvY3VzRXNjYXBlRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICd1cCcgJiYgIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9wZW5DaGFuZ2VIYW5kbGUob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcGVuICYmIHRoaXMub3BlbiAmJiAhdGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wZW4gIT09IG9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KG9wZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcblxuICAgICAgICBpZiAoIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3BvdmVyT3BlbkhhbmRsZShvcGVuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5vcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNldFNlYXJjaFRlcm0oKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUGFyZW50Rm9jdXNUcmFwKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVQYXJlbnRGb2N1c1RyYXAoKTtcblxuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9rZW5pemVyLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID1cbiAgICAgICAgICAgIHRoaXMudG9rZW5pemVyLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgdGhhdCBzZWxlY3RzIGFsbCBwb3NzaWJsZSBvcHRpb25zLiAqL1xuICAgIHNlbGVjdEFsbEl0ZW1zKHNlbGVjdEFsbDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoc2VsZWN0QWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5vcHRpb25JdGVtcyQuZ2V0VmFsdWUoKS5tYXAoKGMpID0+IGMudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9uIE1vYmlsZSBtb2RlIGNoYW5nZXMgYXJlIHByb3BhZ2F0ZWQgb25seSBvbiBhcHByb3ZlLlxuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vbkNoZWNrYm94S2V5dXAodmFsdWU6IGFueSwgZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBbU1BBQ0UsIEVOVEVSXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hlY2tib3hDbGljayh2YWx1ZSwgZXZlbnQsIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgYXN5bmMgX29uQ2hlY2tib3hDbGljayhcbiAgICAgICAgdmFsdWU6IGFueSxcbiAgICAgICAgZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50LFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBpc0xpc3RJdGVtID0gZmFsc2VcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdG9nZ2xlZFNlbGVjdGlvbiA9ICF0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHZhbHVlKTtcbiAgICAgICAgdGhpcy5fcmFuZ2VTZWxlY3Rvci5vblJhbmdlRWxlbWVudFRvZ2dsZWQoaW5kZXgsIGV2ZW50KTtcbiAgICAgICAgY29uc3Qgc3ViID0gdGhpcy5fdmlld01vZGVsJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgodm0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3IuYXBwbHlWYWx1ZVRvRWFjaEluUmFuZ2UoKGlkeCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVTZWxlY3QodG9nZ2xlZFNlbGVjdGlvbiwgdm0uZGlzcGxheWVkT3B0aW9uc1tpZHhdLnZhbHVlLCBmYWxzZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoc3ViKTtcbiAgICAgICAgaWYgKGlzTGlzdEl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHByb3BhZ2F0aW9uIG9uIHRoZSBjaGVja2JveCBzbyBldmVudCBkb2Vzbid0IHJlYWNoIHRoZSBsaXN0IGl0ZW1cbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25Ub2tlbkNsaWNrKHZhbHVlOiBhbnksIHJlc2V0U2VhcmNoOiBib29sZWFuLCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7IC8vIHByZXZlbnQgdGhpcyBmdW5jdGlvbiBmcm9tIGJlaW5nIGNhbGxlZCB0d2ljZSB3aGVuIGNoZWNrYm94IHVwZGF0ZXNcbiAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0KGZhbHNlLCB2YWx1ZSwgcmVzZXRTZWFyY2gsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2hhbmRsZVNlbGVjdChjaGVja2VkOiBhbnksIHZhbHVlOiBhbnksIHJlc2V0U2VhcmNoID0gdHJ1ZSwgZnJvbVRva2VuQ2xvc2VDbGljayA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGVuZ3RoID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoO1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmRlc2VsZWN0KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBwb3BvdmVyIHBsYWNlbWVudCB1cGRhdGVcbiAgICAgICAgaWYgKHRoaXMuX3Nob3VsZFBvcG92ZXJCZVVwZGF0ZWQocHJldmlvdXNMZW5ndGgsIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlclJlZi5yZWZyZXNoUG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzZXRTZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0U2VhcmNoVGVybSgpO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9uIE1vYmlsZSBtb2RlIGNoYW5nZXMgYXJlIHByb3BhZ2F0ZWQgb25seSBvbiBhcHByb3ZlLlxuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoZnJvbVRva2VuQ2xvc2VDbGljayk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaGFuZGxlSW5wdXRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRE9XTl9BUlJPVykgJiYgIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0Q29tcG9uZW50LnNldEl0ZW1BY3RpdmUoMCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgW0RPV05fQVJST1csIFVQX0FSUk9XLCBFTlRFUl0pKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5DaGFuZ2VIYW5kbGUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEVTQ0FQRSkpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFRBQikgJiYgdGhpcy5vcGVuKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saXN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0Q29tcG9uZW50LnNldEl0ZW1BY3RpdmUoMCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5VHlwZShldmVudCwgJ2FscGhhYmV0aWNhbCcpIHx8IEtleVV0aWwuaXNLZXlUeXBlKGV2ZW50LCAnbnVtZXJpYycpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3Blbikge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9zaG93QWxsQ2xpY2tlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3Nob3dBbGxLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgW1NQQUNFLCBFTlRFUl0pKSB7XG4gICAgICAgICAgICB0aGlzLl9zaG93QWxsQ2xpY2tlZChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vblN1Ym1pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHRoaXMuc2VhcmNoVGVybTtcbiAgICAgICAgaWYgKHNlYXJjaFRlcm0gPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNFeGlzdCA9IHRoaXMuX3NlbGVjdEZpcnN0RmlsdGVyZWQoc2VhcmNoVGVybSk7XG4gICAgICAgIGlmICghaXNFeGlzdCAmJiB0aGlzLmFsbG93TmV3VG9rZW5zICYmIHRoaXMubmV3VG9rZW5WYWxpZGF0ZUZuKHRoaXMuX3NlYXJjaFRlcm1DdHJsLnZhbHVlID8/ICcnKSkge1xuICAgICAgICAgICAgY29uc3QgbmV3VG9rZW4gPSB0aGlzLm5ld1Rva2VuUGFyc2VGbih0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZSA/PyAnJyk7XG4gICAgICAgICAgICB0aGlzLl9hZGROZXdUb2tlblRvRHJvcERvd25WYWx1ZXMobmV3VG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0KHRydWUsIG5ld1Rva2VuKTtcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaGFuZGxlQ29tcGxldGUoeyB0ZXJtIH0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXJtID0gdGVybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZGlhbG9nIGRpc21pc3NpbmcsIGNsb3NlcyBwb3BvdmVyIGFuZCBzZXRzIGJhY2t1cCBkYXRhLlxuICAgICAqL1xuICAgIGRpYWxvZ0Rpc21pc3Moc2VsZWN0ZWRCYWNrdXA6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2VhcmNoVGVybSgpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWRCYWNrdXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGRpYWxvZyBhcHByb3ZhbCwgY2xvc2VzIHBvcG92ZXIgYW5kIHByb3BhZ2F0ZXMgZGF0YSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIGRpYWxvZ0FwcHJvdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZSh0cnVlKTtcbiAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcmVzZXRTZWFyY2hUZXJtKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfbW9yZUNsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9hZGRPbkJ1dHRvbkNsaWNrZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWRkT25CdXR0b25DbGlja2VkLmVtaXQoZXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5vcGVuRHJvcGRvd25PbkFkZE9uQ2xpY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKCF0aGlzLm9wZW4pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3Blbikge1xuICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZGlzYWJsZVBhcmVudEZvY3VzVHJhcCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNUcmFwU2VydmljZT8ucGF1c2VDdXJyZW50Rm9jdXNUcmFwKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBlbmFibGVQYXJlbnRGb2N1c1RyYXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZvY3VzVHJhcFNlcnZpY2U/LnVucGF1c2VDdXJyZW50Rm9jdXNUcmFwKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9hZGROZXdUb2tlblRvRHJvcERvd25WYWx1ZXMobmV3VG9rZW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kcm9wZG93blZhbHVlcy5wdXNoKG5ld1Rva2VuKTtcbiAgICAgICAgY29uc3QgbmV3T3B0aW9uID0gdGhpcy5fZ2V0T3B0aW9uSXRlbShuZXdUb2tlbik7XG4gICAgICAgIHRoaXMub3B0aW9uSXRlbXMkLm5leHQoWy4uLnRoaXMub3B0aW9uSXRlbXMkLnZhbHVlLCBuZXdPcHRpb25dKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3NlbGVjdEZpcnN0RmlsdGVyZWQoc2VhcmNoVGVybTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJGbih0aGlzLmRyb3Bkb3duVmFsdWVzLCBzZWFyY2hUZXJtKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyZWQpICYmIGZpbHRlcmVkLmxlbmd0aCA+IDAgJiYgdGhpcy5hdXRvQ29tcGxldGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkl0ZW0gPSB0aGlzLl9nZXRPcHRpb25JdGVtKGZpbHRlcmVkWzBdKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVNlbGVjdCh0cnVlLCBvcHRpb25JdGVtLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEZpbHRlcihjb250ZW50QXJyYXk6IGFueVtdLCBzZWFyY2hUZXJtOiBzdHJpbmcgPSAnJyk6IGFueVtdIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoTG93ZXIgPSBzZWFyY2hUZXJtLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBjb250ZW50QXJyYXkuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXllZFZhbHVlID0gdGhpcy5kaXNwbGF5Rm4oaXRlbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVybSA9IHR5cGVvZiBkaXNwbGF5ZWRWYWx1ZSA9PT0gJ3N0cmluZycgPyBkaXNwbGF5ZWRWYWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpIDogJyc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlQWhlYWRNYXRjaGVyKHRlcm0sIHNlYXJjaExvd2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kZWZhdWx0VmFsdWVGbih2YWx1ZTogSXRlbVR5cGUgfCBWYWx1ZVR5cGUpOiBWYWx1ZVR5cGUge1xuICAgICAgICByZXR1cm4gdmFsdWUgYXMgVmFsdWVUeXBlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdERpc3BsYXkoc3RyOiBJdGVtVHlwZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPcHRpb25JdGVtQmFzZShzdHIpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyLmxhYmVsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kZWZhdWx0UGFyc2Uoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdFRva2VuVmFsaWRhdGUoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhc3RyO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfcG9wb3Zlck9wZW5IYW5kbGUob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLm9wZW4gPSBvcGVuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfcHJvcGFnYXRlQ2hhbmdlKGVtaXRJbk1vYmlsZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm1vYmlsZSB8fCBlbWl0SW5Nb2JpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gWy4uLnRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkXTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2Uoc2VsZWN0ZWQpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2hvdWxkUG9wb3ZlckJlVXBkYXRlZChwcmV2aW91c0xlbmd0aDogbnVtYmVyLCBjdXJyZW50TGVuZ3RoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICEhdGhpcy5wb3BvdmVyUmVmICYmXG4gICAgICAgICAgICAoKHByZXZpb3VzTGVuZ3RoID09PSAwICYmIGN1cnJlbnRMZW5ndGggPT09IDEpIHx8IChwcmV2aW91c0xlbmd0aCA9PT0gMSAmJiBjdXJyZW50TGVuZ3RoID09PSAwKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgYXN5bmMgX3NldFVwTW9iaWxlTW9kZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBNVUxUSV9JTlBVVF9DT01QT05FTlQsIHVzZVZhbHVlOiB0aGlzIH1dLFxuICAgICAgICAgICAgcGFyZW50OiB0aGlzLl9pbmplY3RvclxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9keW5hbWljQ29tcG9uZW50U2VydmljZS5jcmVhdGVEeW5hbWljTW9kdWxlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxpc3RUZW1wbGF0ZTogdGhpcy5saXN0VGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgY29udHJvbFRlbXBsYXRlOiB0aGlzLmNvbnRyb2xUZW1wbGF0ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE11bHRpSW5wdXRNb2JpbGVNb2R1bGUsXG4gICAgICAgICAgICBNdWx0aUlucHV0TW9iaWxlQ29tcG9uZW50LFxuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgICAgIGluamVjdG9yXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZXNldFNlYXJjaFRlcm0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldE9wdGlvbkl0ZW0oaXRlbTogSXRlbVR5cGUgfCBfT3B0aW9uSXRlbTxJdGVtVHlwZSwgVmFsdWVUeXBlPik6IF9PcHRpb25JdGVtPEl0ZW1UeXBlLCBWYWx1ZVR5cGU+IHtcbiAgICAgICAgaWYgKGlzT3B0aW9uSXRlbTxJdGVtVHlwZSwgVmFsdWVUeXBlPihpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBsYWJlbCwgdmFsdWUgfSA9IHRoaXMuX2dldFZhbHVlQW5kTGFiZWxPZkl0ZW0oaXRlbSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRWYWx1ZUFuZExhYmVsT2ZJdGVtKGl0ZW06IEl0ZW1UeXBlKTogT3B0aW9uSXRlbUJhc2U8VmFsdWVUeXBlPiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHREaXNwbGF5ID0gdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gIT09IG51bGwgPyBpdGVtW09iamVjdC5rZXlzKGl0ZW0pWzBdXSA6IGl0ZW07XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWVGbihpdGVtKSA/PyBkZWZhdWx0RGlzcGxheTtcbiAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5kaXNwbGF5Rm4oaXRlbSkgPz8gZGVmYXVsdERpc3BsYXk7XG4gICAgICAgIGlmIChpc09wdGlvbkl0ZW1CYXNlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZUZuID09PSB0aGlzLl9kZWZhdWx0VmFsdWVGbikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlGbiA9PT0gdGhpcy5fZGVmYXVsdERpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IGl0ZW0ubGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGFiZWwsIHZhbHVlIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRPcHRpb25JdGVtQnlWYWx1ZShcbiAgICAgICAgdmFsdWU6IFZhbHVlVHlwZSxcbiAgICAgICAgb3B0aW9uSXRlbXM6IF9PcHRpb25JdGVtPEl0ZW1UeXBlLCBWYWx1ZVR5cGU+W10gPSBbXVxuICAgICk6IF9PcHRpb25JdGVtPEl0ZW1UeXBlLCBWYWx1ZVR5cGU+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbkl0ZW1zLmZpbmQoKGMpID0+IGMudmFsdWUgPT09IHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldFZpZXdNb2RlbCgpOiBPYnNlcnZhYmxlPFZpZXdNb2RlbDxJdGVtVHlwZSwgVmFsdWVUeXBlPj4ge1xuICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5fc2VhcmNoVGVybUN0cmwudmFsdWUpKSxcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNoYW5nZWQucGlwZShzdGFydFdpdGgobnVsbCkpLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25JdGVtcyRcbiAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgIG1hcCgoWywgLCBvcHRpb25JdGVtc10pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQubWFwKFxuICAgICAgICAgICAgICAgICAgICAodikgPT4gdGhpcy5fZ2V0T3B0aW9uSXRlbUJ5VmFsdWUodiwgb3B0aW9uSXRlbXMpIHx8IHRoaXMuX2dldE9wdGlvbkl0ZW0odiBhcyBhbnkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAvLyBub3QgdXNpbmcgXCJzZWFyY2hUZXJtXCIgdmFsdWUgZnJvbSBjb21iaW5lTGF0ZXN0IGFzIGl0IHdpbGwgYmUgd3JvbmcgZm9yIGxhdGUgc3Vic2NyaWJlcnMsIGlmIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZSA/PyAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyRm4oXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbkl0ZW1zLm1hcCgoYykgPT4gYy5pdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoVGVybVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGxheWVkT3B0aW9ucyA9IChBcnJheS5pc0FycmF5KGZpbHRlcmVkKSA/IGZpbHRlcmVkIDogW10pLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0T3B0aW9uSXRlbShpdGVtKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZGlzcGxheWVkT3B0aW9ucy5mb3JFYWNoKChjKSA9PiAoYy5pc1NlbGVjdGVkID0gc2VsZWN0ZWQuZmluZEluZGV4KChkKSA9PiBkPy52YWx1ZSA9PT0gYy52YWx1ZSkgPiAtMSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHNlbGVjdGVkT3B0aW9uczogc2VsZWN0ZWQsIGRpc3BsYXllZE9wdGlvbnMgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRBcmlhTGFiZWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9sYW5ndWFnZSk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRBcmlhTGFiZWwgPSB0aGlzLl90cmFuc2xhdGlvblJlc29sdmVyLnJlc29sdmUobGFuZywgJ2NvcmVNdWx0aUlucHV0Lm11bHRpSW5wdXRBcmlhTGFiZWwnKTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBfT3B0aW9uSXRlbTxJdGVtVHlwZSA9IGFueSwgVmFsdWVUeXBlID0gYW55PiBleHRlbmRzIE9wdGlvbkl0ZW1CYXNlPFZhbHVlVHlwZT4ge1xuICAgIGl0ZW06IEl0ZW1UeXBlO1xuICAgIGlzU2VsZWN0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBPcHRpb25JdGVtPEl0ZW1UeXBlID0gYW55LCBWYWx1ZVR5cGUgPSBhbnk+ID0gT21pdDxfT3B0aW9uSXRlbTxJdGVtVHlwZSwgVmFsdWVUeXBlPiwgJ2lzU2VsZWN0ZWQnPjtcblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25JdGVtQmFzZTxWYWx1ZVR5cGUgPSBhbnk+IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHZhbHVlOiBWYWx1ZVR5cGU7XG59XG5cbmludGVyZmFjZSBWaWV3TW9kZWw8SXRlbVR5cGUgPSBhbnksIFZhbHVlVHlwZSA9IGFueT4ge1xuICAgIHNlbGVjdGVkT3B0aW9uczogX09wdGlvbkl0ZW08SXRlbVR5cGUsIFZhbHVlVHlwZT5bXTtcbiAgICBkaXNwbGF5ZWRPcHRpb25zOiBfT3B0aW9uSXRlbTxJdGVtVHlwZSwgVmFsdWVUeXBlPltdO1xufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIl92aWV3TW9kZWwkIHwgYXN5bmMgYXMgdmlld01vZGVsXCI+XG4gICAgPGRpdiBjbGFzcz1cImZkLW11bHRpLWlucHV0IGZkLW11bHRpLWlucHV0LWN1c3RvbVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmQtbXVsdGktaW5wdXQtZmllbGRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBkaXNwbGF5QWRkb25CdXR0b246IGRpc3BsYXlBZGRvbkJ1dHRvbiB9XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm1vYmlsZVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxmZC1wb3BvdmVyXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbEJvZHlDbGFzcz1cImZkLXBvcG92ZXItY3VzdG9tLWxpc3RcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIW1vYmlsZVwiXG4gICAgICAgICAgICAgICAgW2lzT3Blbl09XCJvcGVuXCJcbiAgICAgICAgICAgICAgICAoaXNPcGVuQ2hhbmdlKT1cIm9wZW5DaGFuZ2VIYW5kbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGlucHV0KT1cIiFvcGVuICYmIG9wZW5DaGFuZ2VIYW5kbGUodHJ1ZSlcIlxuICAgICAgICAgICAgICAgIFt0cmlnZ2Vyc109XCJbXVwiXG4gICAgICAgICAgICAgICAgW21heFdpZHRoXT1cIl9wb3BvdmVyTWF4V2lkdGhcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2ZpbGxDb250cm9sTW9kZV09XCJmaWxsQ29udHJvbE1vZGVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtbXVsdGktaW5wdXQtcG9wb3Zlci1jdXN0b21cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmZC1wb3BvdmVyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtIChzdWJtaXQpPVwiX29uU3VibWl0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRyb2w7IGNvbnRleHQ6IHsgZGlzcGxheUFkZG9uQnV0dG9uOiBkaXNwbGF5QWRkb25CdXR0b24gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L2ZkLXBvcG92ZXItY29udHJvbD5cblxuICAgICAgICAgICAgICAgIDxmZC1wb3BvdmVyLWJvZHlcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIW9wZW5cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmQtcG9wb3Zlcl9fYm9keS0taGlkZGVuXT1cIiF2aWV3TW9kZWwuZGlzcGxheWVkT3B0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3RcIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPC9mZC1wb3BvdmVyLWJvZHk+XG4gICAgICAgICAgICA8L2ZkLXBvcG92ZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlICNjb250cm9sIGxldC1zaG93QWRkb25CdXR0b249XCJkaXNwbGF5QWRkb25CdXR0b25cIj5cbiAgICAgICAgPGZkLWlucHV0LWdyb3VwXG4gICAgICAgICAgICBjbGFzcz1cImZkLW11bHRpLWlucHV0LWlucHV0LWdyb3VwLWN1c3RvbVwiXG4gICAgICAgICAgICBbc3RhdGVdPVwic3RhdGVcIlxuICAgICAgICAgICAgW2J1dHRvbkZvY3VzYWJsZV09XCJidXR0b25Gb2N1c2FibGVcIlxuICAgICAgICAgICAgW2J1dHRvbl09XCJzaG93QWRkb25CdXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtpc0V4cGFuZGVkXT1cIm9wZW4gJiYgIW1vYmlsZSAmJiB2aWV3TW9kZWwuZGlzcGxheWVkT3B0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgIFtpc0NvbnRyb2xdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZ2x5cGhdPVwic2hvd0FkZG9uQnV0dG9uID8gZ2x5cGggOiAnJ1wiXG4gICAgICAgICAgICBbaWNvblRpdGxlXT1cInRpdGxlXCJcbiAgICAgICAgICAgIChhZGRPbkJ1dHRvbkNsaWNrZWQpPVwiX2FkZE9uQnV0dG9uQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGZkLXRva2VuaXplclxuICAgICAgICAgICAgICAgICN0b2tlbml6ZXJcbiAgICAgICAgICAgICAgICBbY29tcGFjdENvbGxhcHNlXT1cImNvbXBhY3RDb2xsYXBzZVwiXG4gICAgICAgICAgICAgICAgW29wZW5dPVwib3BlblwiXG4gICAgICAgICAgICAgICAgW3Rva2VuaXplckZvY3VzYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgKG1vcmVDbGlja2VkRXZlbnQpPVwiX21vcmVDbGlja2VkKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtbXVsdGktaW5wdXQtdG9rZW5pemVyLWN1c3RvbVwiXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZkLXRva2VuXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygdmlld01vZGVsLnNlbGVjdGVkT3B0aW9uczsgdHJhY2tCeTogX3RyYWNrQnlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAob25DbG9zZUNsaWNrKT1cIl9vblRva2VuQ2xpY2sob3B0aW9uLnZhbHVlLCBmYWxzZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChvblJlbW92ZSk9XCJfb25Ub2tlbkNsaWNrKG9wdGlvbi52YWx1ZSwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwib3B0aW9uLmxhYmVsXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZmQtdG9rZW4+XG5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWlucHV0IGZkLXRva2VuaXplcl9faW5wdXQgZmQtbXVsdGktaW5wdXQtdG9rZW5pemVyLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgZmQtZm9ybS1jb250cm9sXG4gICAgICAgICAgICAgICAgICAgIGZkLWlucHV0LWdyb3VwLWlucHV0XG4gICAgICAgICAgICAgICAgICAgIGZka0F1dG9Db21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICAob25Db21wbGV0ZSk9XCJfaGFuZGxlQ29tcGxldGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICNzZWFyY2hJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGbl09XCJkaXNwbGF5Rm5cIlxuICAgICAgICAgICAgICAgICAgICBbbWF0Y2hlcl09XCJ0eXBlQWhlYWRNYXRjaGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2lucHV0VGV4dF09XCJfc2VhcmNoVGVybUN0cmwudmFsdWUgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJkcm9wZG93blZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtlbmFibGVdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGVcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiX3NlYXJjaFRlcm1DdHJsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiYXJpYUxhYmVsIHx8IF9kZWZhdWx0QXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbGxlZEJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiX2hhbmRsZUlucHV0S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiaW5wdXRJZFwiXG4gICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJ0b2tlbml6ZXIuX3Nob3dBbGxUb2tlbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cInRva2VuaXplci5faGlkZVRva2VucygpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9mZC10b2tlbml6ZXI+XG4gICAgICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbGlzdD5cbiAgICAgICAgPHVsXG4gICAgICAgICAgICAqbmdJZj1cInZpZXdNb2RlbC5kaXNwbGF5ZWRPcHRpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICBmZC1saXN0XG4gICAgICAgICAgICBjbGFzcz1cImZkLW11bHRpLWlucHV0LW1lbnUtb3ZlcmZsb3dcIlxuICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFttb2JpbGVNb2RlXT1cIm1vYmlsZVwiXG4gICAgICAgICAgICBbc3R5bGUubWF4LWhlaWdodF09XCIhbW9iaWxlID8gbWF4SGVpZ2h0IDogJ2F1dG8nXCJcbiAgICAgICAgICAgIFtieWxpbmVdPVwiYnlsaW5lXCJcbiAgICAgICAgICAgIChmb2N1c0VzY2FwZUxpc3QpPVwiaGFuZGxlTGlzdEZvY3VzRXNjYXBlKCRldmVudClcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCInMTAwJSdcIlxuICAgICAgICAgICAgYXJpYS1tdWx0aXNlbGVjdGFibGU9XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiB2aWV3TW9kZWwuZGlzcGxheWVkT3B0aW9uczsgaW5kZXggYXMgaWR4OyB0cmFja0J5OiBfdHJhY2tCeVwiXG4gICAgICAgICAgICAgICAgZmQtbGlzdC1pdGVtXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJvcHRpb24ubGFiZWxcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJfb25DaGVja2JveENsaWNrKG9wdGlvbi52YWx1ZSwgJGV2ZW50LCBpZHgsIHRydWUpXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiX29uQ2hlY2tib3hLZXl1cChvcHRpb24udmFsdWUsICRldmVudCwgaWR4KVwiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIiEhb3B0aW9uLmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmZC1jaGVja2JveCAoY2xpY2spPVwiX29uQ2hlY2tib3hDbGljayhvcHRpb24udmFsdWUsICRldmVudCwgaWR4KVwiIFt2YWx1ZV09XCJvcHRpb24uaXNTZWxlY3RlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRPRE8gLS0+XG4gICAgICAgICAgICAgICAgPC9mZC1jaGVja2JveD5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG9wdGlvbjogb3B0aW9uIH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0FsbEJ1dHRvbiAmJiB2aWV3TW9kZWwuZGlzcGxheWVkT3B0aW9ucy5sZW5ndGggPCBkcm9wZG93blZhbHVlcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIGZkLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtbXVsdGktaW5wdXQtc2hvdy1hbGxcIlxuICAgICAgICAgICAgICAgIChrZXlEb3duKT1cIl9zaG93QWxsS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiX3Nob3dBbGxDbGlja2VkKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxhIGZkLWxpbmsgdGFiaW5kZXg9XCIwXCI+U2hvdyBBbGwgKHt7IGRyb3Bkb3duVmFsdWVzLmxlbmd0aCB9fSk8L2E+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgbGV0LW9wdGlvbj1cIm9wdGlvblwiICNpdGVtU291cmNlPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCIhaXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgIGZkLWxpc3QtdGl0bGVcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwib3B0aW9uLmxhYmVsIHwgaGlnaGxpZ2h0IDogX3NlYXJjaFRlcm1DdHJsLnZhbHVlIHx8ICcnIDogaGlnaGxpZ2h0XCJcbiAgICAgICAgPjwvc3Bhbj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9wdGlvbi5pdGVtIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
|
|
@@ -358,11 +358,9 @@ class MultiInputComponent {
|
|
|
358
358
|
this._subscriptions.add(this._getViewModel()
|
|
359
359
|
.pipe(map((viewModel) => !viewModel.displayedOptions.some((c) => !c.isSelected)))
|
|
360
360
|
.subscribe((allItemsSelected) => this.allItemsSelectedChange.emit(allItemsSelected)));
|
|
361
|
-
|
|
362
|
-
this.
|
|
363
|
-
|
|
364
|
-
}));
|
|
365
|
-
}
|
|
361
|
+
this._subscriptions.add(this._language.subscribe(() => {
|
|
362
|
+
this._getAriaLabel();
|
|
363
|
+
}));
|
|
366
364
|
}
|
|
367
365
|
/** @hidden */
|
|
368
366
|
ngOnChanges(changes) {
|
|
@@ -741,7 +739,7 @@ class MultiInputComponent {
|
|
|
741
739
|
/** @hidden */
|
|
742
740
|
async _getAriaLabel() {
|
|
743
741
|
const lang = await firstValueFrom(this._language);
|
|
744
|
-
this.
|
|
742
|
+
this._defaultAriaLabel = this._translationResolver.resolve(lang, 'coreMultiInput.multiInputAriaLabel');
|
|
745
743
|
}
|
|
746
744
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: MultiInputComponent, deps: [{ token: i1$1.ContentDensityObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i2$1.DynamicComponentService }, { token: i0.Injector }, { token: i0.ViewContainerRef }, { token: FD_LANGUAGE }, { token: i2$1.RtlService, optional: true }, { token: i2$1.FocusTrapService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
747
745
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.0", type: MultiInputComponent, isStandalone: true, selector: "fd-multi-input", inputs: { placeholder: "placeholder", disabled: "disabled", required: "required", compactCollapse: "compactCollapse", maxHeight: "maxHeight", glyph: "glyph", dropdownValues: "dropdownValues", openDropdownOnAddOnClicked: "openDropdownOnAddOnClicked", searchTerm: "searchTerm", inputId: "inputId", highlight: "highlight", selected: "selected", class: "class", filterFn: "filterFn", valueFn: "valueFn", displayFn: "displayFn", newTokenParseFn: "newTokenParseFn", newTokenValidateFn: "newTokenValidateFn", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", fillControlMode: "fillControlMode", state: "state", buttonFocusable: "buttonFocusable", allowNewTokens: "allowNewTokens", mobile: "mobile", showAllButton: "showAllButton", bodyMaxWidth: "bodyMaxWidth", mobileConfig: "mobileConfig", includes: "includes", itemTemplate: "itemTemplate", title: "title", byline: "byline", autoComplete: "autoComplete", open: "open", displayAddonButton: "displayAddonButton" }, outputs: { searchTermChange: "searchTermChange", selectedChange: "selectedChange", openChange: "openChange", addOnButtonClicked: "addOnButtonClicked", allItemsSelectedChange: "allItemsSelectedChange" }, host: { listeners: { "focusout": "_focusOut($event)" } }, providers: [
|
|
@@ -753,7 +751,7 @@ class MultiInputComponent {
|
|
|
753
751
|
MenuKeyboardService,
|
|
754
752
|
registerFormItemControl(MultiInputComponent),
|
|
755
753
|
contentDensityObserverProviders()
|
|
756
|
-
], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["control"], descendants: true, read: TemplateRef }, { propertyName: "listTemplate", first: true, predicate: ["list"], descendants: true, read: TemplateRef }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true, read: ElementRef }, { propertyName: "tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"_viewModel$ | async as viewModel\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n *ngIf=\"mobile\"\n ></ng-container>\n\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container\n *ngTemplateOutlet=\"control; context: { displayAddonButton: displayAddonButton }\"\n ></ng-container>\n </form>\n </fd-popover-control>\n\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of viewModel.selectedOptions; trackBy: _trackBy\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, false, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"tokenizer._hideTokens()\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"viewModel.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngFor=\"let option of viewModel.displayedOptions; index as idx; trackBy: _trackBy\"\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option.value, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n\n <li\n *ngIf=\"showAllButton && viewModel.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight : _searchTermCtrl.value || '' : highlight\"\n ></span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}[class*=--compact] .fd-multi-input-tokenizer-custom:not([class*=\"--cozy\"]):not([class*=\"--condensed\"]),.is-compact .fd-multi-input-tokenizer-custom:not(.is-cozy):not(.is-condensed),.fd-multi-input-tokenizer-custom[class*=--compact],.fd-multi-input-tokenizer-custom.is-compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-multi-input-menu-overflow{max-width:37.5rem}.fd-input.fd-multi-input-tokenizer-input{min-width:4rem;margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: PopoverControlComponent, selector: "fd-popover-control" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3$1.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: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "ngmodule", type: InputGroupModule }, { kind: "component", type: i4.InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: i4.InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "ngmodule", type: TokenModule }, { kind: "component", type: i5$1.TokenComponent, selector: "fd-token", inputs: ["disabled", "selected", "readOnly"], outputs: ["onCloseClick", "onRemove", "onTokenClick", "onTokenKeydown", "elementFocused"] }, { kind: "component", type: i5$1.TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "moreTerm", "open"], outputs: ["moreClickedEvent"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: FormControlComponent, selector: "[fd-form-control]", inputs: ["state", "type", "class", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: AutoCompleteDirective, selector: "[fdkAutoComplete]", inputs: ["options", "inputText", "enable", "matcher", "displayFn"], outputs: ["onComplete"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i6.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i6.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "unread", "byline"], outputs: ["keyDown"] }, { kind: "directive", type: i6.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "component", type: CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle", "undecorated"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SearchHighlightPipe, name: "highlight" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
754
|
+
], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["control"], descendants: true, read: TemplateRef }, { propertyName: "listTemplate", first: true, predicate: ["list"], descendants: true, read: TemplateRef }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true, read: ElementRef }, { propertyName: "tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"_viewModel$ | async as viewModel\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n *ngIf=\"mobile\"\n ></ng-container>\n\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container\n *ngTemplateOutlet=\"control; context: { displayAddonButton: displayAddonButton }\"\n ></ng-container>\n </form>\n </fd-popover-control>\n\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of viewModel.selectedOptions; trackBy: _trackBy\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, false, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [ariaLabel]=\"ariaLabel || _defaultAriaLabel\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"tokenizer._hideTokens()\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"viewModel.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngFor=\"let option of viewModel.displayedOptions; index as idx; trackBy: _trackBy\"\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option.value, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n\n <li\n *ngIf=\"showAllButton && viewModel.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight : _searchTermCtrl.value || '' : highlight\"\n ></span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}[class*=--compact] .fd-multi-input-tokenizer-custom:not([class*=\"--cozy\"]):not([class*=\"--condensed\"]),.is-compact .fd-multi-input-tokenizer-custom:not(.is-cozy):not(.is-condensed),.fd-multi-input-tokenizer-custom[class*=--compact],.fd-multi-input-tokenizer-custom.is-compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-multi-input-menu-overflow{max-width:37.5rem}.fd-input.fd-multi-input-tokenizer-input{min-width:4rem;margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: PopoverControlComponent, selector: "fd-popover-control" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3$1.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: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "ngmodule", type: InputGroupModule }, { kind: "component", type: i4.InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: i4.InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "ngmodule", type: TokenModule }, { kind: "component", type: i5$1.TokenComponent, selector: "fd-token", inputs: ["disabled", "selected", "readOnly"], outputs: ["onCloseClick", "onRemove", "onTokenClick", "onTokenKeydown", "elementFocused"] }, { kind: "component", type: i5$1.TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "moreTerm", "open"], outputs: ["moreClickedEvent"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: FormControlComponent, selector: "[fd-form-control]", inputs: ["state", "type", "class", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: AutoCompleteDirective, selector: "[fdkAutoComplete]", inputs: ["options", "inputText", "enable", "matcher", "displayFn"], outputs: ["onComplete"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i6.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i6.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "unread", "byline"], outputs: ["keyDown"] }, { kind: "directive", type: i6.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "component", type: CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle", "undecorated"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SearchHighlightPipe, name: "highlight" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
757
755
|
}
|
|
758
756
|
__decorate([
|
|
759
757
|
applyCssClass,
|
|
@@ -790,7 +788,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
|
|
|
790
788
|
LinkComponent,
|
|
791
789
|
AsyncPipe,
|
|
792
790
|
SearchHighlightPipe
|
|
793
|
-
], template: "<ng-container *ngIf=\"_viewModel$ | async as viewModel\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n *ngIf=\"mobile\"\n ></ng-container>\n\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container\n *ngTemplateOutlet=\"control; context: { displayAddonButton: displayAddonButton }\"\n ></ng-container>\n </form>\n </fd-popover-control>\n\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of viewModel.selectedOptions; trackBy: _trackBy\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, false, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [
|
|
791
|
+
], template: "<ng-container *ngIf=\"_viewModel$ | async as viewModel\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n *ngIf=\"mobile\"\n ></ng-container>\n\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container\n *ngTemplateOutlet=\"control; context: { displayAddonButton: displayAddonButton }\"\n ></ng-container>\n </form>\n </fd-popover-control>\n\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of viewModel.selectedOptions; trackBy: _trackBy\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, false, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [ariaLabel]=\"ariaLabel || _defaultAriaLabel\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"tokenizer._hideTokens()\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"viewModel.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngFor=\"let option of viewModel.displayedOptions; index as idx; trackBy: _trackBy\"\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option.value, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n\n <li\n *ngIf=\"showAllButton && viewModel.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight : _searchTermCtrl.value || '' : highlight\"\n ></span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}[class*=--compact] .fd-multi-input-tokenizer-custom:not([class*=\"--cozy\"]):not([class*=\"--condensed\"]),.is-compact .fd-multi-input-tokenizer-custom:not(.is-cozy):not(.is-condensed),.fd-multi-input-tokenizer-custom[class*=--compact],.fd-multi-input-tokenizer-custom.is-compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-multi-input-menu-overflow{max-width:37.5rem}.fd-input.fd-multi-input-tokenizer-input{min-width:4rem;margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"] }]
|
|
794
792
|
}], ctorParameters: function () { return [{ type: i1$1.ContentDensityObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i2$1.DynamicComponentService }, { type: i0.Injector }, { type: i0.ViewContainerRef }, { type: i7.Observable, decorators: [{
|
|
795
793
|
type: Inject,
|
|
796
794
|
args: [FD_LANGUAGE]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fundamental-ngx-core-multi-input.mjs","sources":["../../../../libs/core/src/lib/multi-input/multi-input.interface.ts","../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.component.ts","../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.component.html","../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.module.ts","../../../../libs/core/src/lib/multi-input/multi-input.component.ts","../../../../libs/core/src/lib/multi-input/multi-input.component.html","../../../../libs/core/src/lib/multi-input/multi-input.module.ts","../../../../libs/core/src/lib/multi-input/fundamental-ngx-core-multi-input.ts"],"sourcesContent":["import { EventEmitter, InjectionToken } from '@angular/core';\nimport { MobileMode } from '@fundamental-ngx/core/mobile-mode';\n\nexport const MULTI_INPUT_COMPONENT = new InjectionToken<string[]>('MultiInputComponent');\n\n/**\n * Multi Input Interface to have typing and avoid circular dependency between\n * MultiInputComponent <==> MultiInputMobileComponent\n */\nexport interface MultiInputInterface extends MobileMode {\n selected: any[];\n openChange: EventEmitter<boolean>;\n allItemsSelectedChange: EventEmitter<boolean>;\n\n dialogApprove(): void;\n\n selectAllItems(selectAll: boolean): void;\n\n dialogDismiss(selectedBackup: any[]): void;\n}\n","import { CdkScrollable } from '@angular/cdk/overlay';\nimport { NgIf, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Inject,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { Nullable, TemplateDirective } from '@fundamental-ngx/cdk/utils';\nimport { BarModule } from '@fundamental-ngx/core/bar';\nimport { ButtonModule } from '@fundamental-ngx/core/button';\nimport { DialogModule, DialogService } from '@fundamental-ngx/core/dialog';\nimport {\n MOBILE_MODE_CONFIG,\n MobileModeBase,\n MobileModeConfigToken,\n MobileModeControl\n} from '@fundamental-ngx/core/mobile-mode';\nimport { ScrollbarDirective } from '@fundamental-ngx/core/scrollbar';\nimport { TitleComponent } from '@fundamental-ngx/core/title';\nimport { takeUntil } from 'rxjs/operators';\nimport { MULTI_INPUT_COMPONENT, MultiInputInterface } from '../multi-input.interface';\n\n@Component({\n selector: 'fd-multi-input-mobile',\n templateUrl: './multi-input-mobile.component.html',\n styleUrls: ['./multi-input-mobile.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [\n DialogModule,\n NgIf,\n TitleComponent,\n TemplateDirective,\n BarModule,\n NgTemplateOutlet,\n ButtonModule,\n CdkScrollable,\n ScrollbarDirective\n ]\n})\nexport class MultiInputMobileComponent extends MobileModeBase<MultiInputInterface> implements OnInit, OnDestroy {\n /** @hidden */\n allItemsSelected: boolean;\n\n /** @hidden */\n @ViewChild('dialogTemplate') dialogTemplate: TemplateRef<any>;\n\n /** @hidden\n * For internal usage\n * Control element, which will be rendered inside dialog.\n * List element, which will be rendered inside dialog.\n */\n childContent: Nullable<{\n listTemplate: TemplateRef<any>;\n controlTemplate: TemplateRef<any>;\n }> = null;\n\n /** @hidden */\n private _selectedBackup: any[];\n\n /** @hidden */\n constructor(\n elementRef: ElementRef,\n dialogService: DialogService,\n @Inject(MULTI_INPUT_COMPONENT) multiInputComponent: MultiInputInterface,\n @Optional() @Inject(MOBILE_MODE_CONFIG) mobileModes: MobileModeConfigToken[]\n ) {\n super(elementRef, dialogService, multiInputComponent, MobileModeControl.MULTI_INPUT, mobileModes);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this._listenOnMultiInputOpenChange();\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n super.onDestroy();\n }\n\n /** Throw select all event, it's handled by multi input component */\n selectAll(selectAll: boolean): void {\n this._component.selectAllItems(!selectAll);\n }\n\n /** @hidden */\n handleDismiss(): void {\n this.dialogRef.dismiss();\n this._component.dialogDismiss(this._selectedBackup);\n }\n\n /** @hidden */\n handleApprove(): void {\n this.dialogRef.close();\n this._component.dialogApprove();\n }\n\n /** @hidden */\n private _toggleDialog(open: boolean): void {\n if (!open) {\n return;\n }\n\n this._selectedBackup = this._component.selected?.length ? [...this._component.selected] : [];\n if (!this._dialogService.hasOpenDialogs()) {\n this._open();\n }\n }\n\n /** @hidden */\n private _listenOnMultiInputOpenChange(): void {\n this._component.openChange.pipe(takeUntil(this._onDestroy$)).subscribe((isOpen) => this._toggleDialog(isOpen));\n this._component.allItemsSelectedChange\n .pipe(takeUntil(this._onDestroy$))\n .subscribe((allItemsSelected) => (this.allItemsSelected = allItemsSelected));\n }\n\n /** @hidden */\n private _open(): void {\n this.dialogRef = this._dialogService.open(this.dialogTemplate, {\n mobile: true,\n disablePaddings: true,\n ...this.dialogConfig,\n backdropClickCloseable: false,\n escKeyCloseable: false,\n container: this._elementRef.nativeElement\n });\n }\n}\n","<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <h1 fd-title *ngIf=\"mobileConfig?.title\">{{ mobileConfig.title }}</h1>\n <button\n fd-dialog-close-button\n [mobile]=\"true\"\n *ngIf=\"mobileConfig?.hasCloseButton\"\n (click)=\"handleDismiss()\"\n ></button>\n <ng-template fdkTemplate=\"subheader\">\n <div fd-bar-middle>\n <fd-bar-element class=\"custom-multi-input-mobile-control-element\">\n <ng-container\n *ngTemplateOutlet=\"\n childContent?.controlTemplate || null;\n context: { displayAddonButton: false }\n \"\n ></ng-container>\n </fd-bar-element>\n <fd-bar-element class=\"custom-multi-input-select-all-bar-element\">\n <button\n fd-button\n glyph=\"multiselect-all\"\n [fdType]=\"allItemsSelected ? 'emphasized' : 'transparent'\"\n (click)=\"selectAll(allItemsSelected)\"\n ></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"childContent?.listTemplate || null\"></ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer>\n <fd-button-bar\n *ngIf=\"mobileConfig?.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig.approveButtonText!\"\n (click)=\"handleApprove()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig?.cancelButtonText\"\n [label]=\"mobileConfig.cancelButtonText!\"\n (click)=\"handleDismiss()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { MultiInputMobileComponent } from './multi-input-mobile.component';\n\n@NgModule({\n imports: [MultiInputMobileComponent],\n exports: [MultiInputMobileComponent]\n})\nexport class MultiInputMobileModule {}\n","import { SelectionModel } from '@angular/cdk/collections';\nimport { DOWN_ARROW, ENTER, ESCAPE, SPACE, TAB, UP_ARROW } from '@angular/cdk/keycodes';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n Inject,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { ControlValueAccessor, FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport { BehaviorSubject, combineLatest, firstValueFrom, Observable, Subscription } from 'rxjs';\nimport { distinctUntilChanged, first, map, startWith } from 'rxjs/operators';\n\nimport {\n applyCssClass,\n AutoCompleteDirective,\n CssClassBuilder,\n DynamicComponentService,\n FocusEscapeDirection,\n FocusTrapService,\n KeyUtil,\n Nullable,\n RangeSelector,\n RtlService,\n SearchHighlightPipe,\n uuidv4\n} from '@fundamental-ngx/cdk/utils';\nimport { FormControlComponent, FormItemControl, registerFormItemControl } from '@fundamental-ngx/core/form';\nimport { ListComponent, ListModule } from '@fundamental-ngx/core/list';\nimport { MenuKeyboardService } from '@fundamental-ngx/core/menu';\nimport { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode';\nimport { PopoverBodyComponent, PopoverComponent, PopoverControlComponent } from '@fundamental-ngx/core/popover';\nimport { PopoverFillMode } from '@fundamental-ngx/core/shared';\nimport { TokenizerComponent, TokenModule } from '@fundamental-ngx/core/token';\n\nimport { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';\nimport { FormStates } from '@fundamental-ngx/cdk/forms';\nimport { CheckboxComponent } from '@fundamental-ngx/core/checkbox';\nimport { ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\nimport { InputGroupModule } from '@fundamental-ngx/core/input-group';\nimport { LinkComponent } from '@fundamental-ngx/core/link';\nimport { FD_LANGUAGE, FdLanguage, TranslationResolver } from '@fundamental-ngx/i18n';\nimport { MultiInputMobileComponent } from './multi-input-mobile/multi-input-mobile.component';\nimport { MultiInputMobileModule } from './multi-input-mobile/multi-input-mobile.module';\nimport { MULTI_INPUT_COMPONENT, MultiInputInterface } from './multi-input.interface';\n\nfunction isOptionItem<ItemType = any, ValueType = any>(candidate: any): candidate is _OptionItem<ItemType, ValueType> {\n return isOptionItemBase<ValueType>(candidate) && 'item' in candidate;\n}\n\nfunction isOptionItemBase<ValueType = any>(candidate: any): candidate is OptionItemBase<ValueType> {\n return typeof candidate === 'object' && candidate !== null && 'value' in candidate && 'label' in candidate;\n}\n\n/**\n * Input field with multiple selection enabled. Should be used when a user can select between a\n * limited number of pre-defined options with a filter-enabled context.\n *\n * Supports Angular Forms.\n */\n@Component({\n selector: 'fd-multi-input',\n templateUrl: './multi-input.component.html',\n styleUrls: ['./multi-input.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MultiInputComponent),\n multi: true\n },\n MenuKeyboardService,\n registerFormItemControl(MultiInputComponent),\n contentDensityObserverProviders()\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n NgIf,\n NgTemplateOutlet,\n PopoverComponent,\n PopoverControlComponent,\n FormsModule,\n PopoverBodyComponent,\n InputGroupModule,\n TokenModule,\n NgFor,\n FormControlComponent,\n AutoCompleteDirective,\n ReactiveFormsModule,\n ListModule,\n CheckboxComponent,\n LinkComponent,\n AsyncPipe,\n SearchHighlightPipe\n ]\n})\nexport class MultiInputComponent<ItemType = any, ValueType = any>\n implements\n MultiInputInterface,\n ControlValueAccessor,\n CssClassBuilder,\n OnInit,\n OnChanges,\n AfterViewInit,\n OnDestroy,\n FormItemControl\n{\n /** Placeholder for the input field. */\n @Input()\n placeholder = '';\n\n /** Whether the input is disabled. */\n @Input()\n disabled = false;\n\n /** If it is mandatory field */\n @Input()\n required = false;\n\n /** Whether to use cozy visuals but compact collapsing behavior. */\n @Input()\n compactCollapse = true;\n\n /** Max height of the popover. Any overflowing elements will be accessible through scrolling. */\n @Input()\n maxHeight = '300px';\n\n /** Icon of the button on the right of the input field. */\n @Input()\n glyph = 'value-help';\n\n /** Values to be displayed in the unfiltered dropdown. */\n @Input()\n dropdownValues: Array<ItemType | _OptionItem<ItemType, ValueType>> = [];\n\n /** Whether to open the dropdown when the addon button is clicked. */\n @Input()\n openDropdownOnAddOnClicked = true;\n\n /** Search term, or more specifically the value of the inner input field. */\n @Input()\n set searchTerm(value: string) {\n this._searchTermCtrl.setValue(value);\n }\n get searchTerm(): string {\n return this._searchTermCtrl.value ?? '';\n }\n\n /** Id attribute for input element inside MultiInput component */\n @Input()\n inputId = '';\n\n /** Whether the search term should be highlighted in results. */\n @Input()\n highlight = true;\n\n /** Selected dropdown items. */\n @Input()\n set selected(values: ValueType[]) {\n this._selectionModel.clear();\n values?.forEach((item) => this._selectionModel.select(item));\n }\n\n get selected(): ValueType[] {\n return this._selectionModel.selected;\n }\n\n /** user's custom classes */\n @Input()\n class: string;\n\n /**\n * Filter function. Accepts an array and a string as arguments, and outputs an array.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n filterFn = this._defaultFilter;\n\n /**\n * Value function. Accepts an object of the same type as the\n * items passed to dropdownValues as argument, and outputs any property, that should be used as value.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n valueFn: (item: ItemType) => ValueType = this._defaultValueFn;\n\n /**\n * Display function. Accepts an object of the same type as the\n * items passed to dropdownValues as argument, and outputs a string.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n displayFn: (item: ItemType) => string = this._defaultDisplay as unknown as (item: ItemType) => string;\n\n /**\n * Parse function. Used for submitting new tokens. Accepts a string by default.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n newTokenParseFn: (searchTerm: string) => any = this._defaultParse;\n\n /**\n * Validate function. Used to check if new token can be added into list.\n * Works only, when `allowNewTokens` option is enabled.\n */\n @Input()\n newTokenValidateFn = this._defaultTokenValidate;\n\n /** aria-label attribute binding. */\n @Input()\n ariaLabel: Nullable<string>;\n\n /** aria-labelledby attribute binding. */\n @Input()\n ariaLabelledBy: Nullable<string>;\n\n /**\n * Preset options for the Select body width, whatever is chosen, the body has a 600px limit.\n * * `at-least` will apply a minimum width to the body equivalent to the width of the control. - Default\n * * `equal` will apply a width to the body equivalent to the width of the control.\n * * 'fit-content' will apply width needed to properly display items inside, independent of control.\n */\n @Input()\n fillControlMode: PopoverFillMode = 'at-least';\n\n /**\n * The state of the form control - applies css classes.\n * Can be `success`, `error`, `warning`, `information` or blank for default.\n */\n @Input()\n state?: FormStates;\n\n /**\n * Whether AddOn Button should be focusable\n * @default true\n */\n @Input()\n buttonFocusable = true;\n\n /** Whether the multi-input allows the creation of new tokens. */\n @Input()\n allowNewTokens = false;\n\n /** Whether the multi-input should be built on mobile mode */\n @Input()\n mobile = false;\n\n /** Whether the multi-input should have show all button. */\n @Input()\n showAllButton = true;\n\n /**\n * Max width of multi input body.\n * `none` will not limit width of the dropdown.\n * `container` will limit width of the dropdown to the width of the multi-input itself.\n * `number` will limit width of the dropdown by provided number in pixels.\n */\n @Input()\n bodyMaxWidth: 'none' | 'container' | number = 'none';\n\n /** @hidden */\n get _popoverMaxWidth(): Nullable<number> {\n if (this.bodyMaxWidth === 'none') {\n return null;\n }\n\n if (typeof this.bodyMaxWidth === 'number') {\n return this.bodyMaxWidth;\n }\n\n return this.elementRef.nativeElement.getBoundingClientRect().width;\n }\n\n /** Multi Input Mobile Configuration, it's applied only, when mobile is enabled */\n @Input()\n mobileConfig: MobileModeConfig = { hasCloseButton: true, approveButtonText: 'Select' };\n\n /**\n * Whether to return results where the input matches the entire string. By default, only results that start\n * with the input search term will be returned.\n */\n @Input()\n includes = false;\n\n /**\n * The template with which to display the individual listed items.\n * Use it by passing an ng-template with implicit content. See examples for more info.\n */\n @Input()\n itemTemplate: TemplateRef<any>;\n\n /**\n * The tooltip for the multi-input icon.\n */\n @Input()\n title: string;\n\n /** Whether list item options should be rendered as byline. */\n @Input()\n byline = false;\n\n /** Whether the autocomplete should be enabled; Enabled by default */\n @Input()\n autoComplete = true;\n\n /** Event emitted when the search term changes. Use *$event* to access the new term. */\n @Output()\n readonly searchTermChange: EventEmitter<string> = new EventEmitter<string>();\n\n /** Event emitted when the selected items change. Use *$event* to access the new selected array. */\n @Output()\n readonly selectedChange: EventEmitter<ValueType[]> = new EventEmitter<ValueType[]>();\n\n /** Whether multi input popover body should be opened */\n @Input()\n open = false;\n\n /** Whether or not to display the addon button. */\n @Input()\n displayAddonButton = true;\n\n /** Event emitted, when the multi input's popover body is opened or closed */\n @Output()\n readonly openChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** Emits event when the addon button is clicked. */\n @Output()\n readonly addOnButtonClicked: EventEmitter<Event> = new EventEmitter<Event>();\n\n /** Event emitted, when the multi input's all item checked or not */\n @Output()\n readonly allItemsSelectedChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** @hidden */\n @ViewChild(PopoverComponent)\n popoverRef: PopoverComponent;\n\n /** @hidden */\n @ViewChild('control', { read: TemplateRef })\n controlTemplate: TemplateRef<{ displayAddonButton: boolean }>;\n\n /** @hidden */\n @ViewChild('list', { read: TemplateRef })\n listTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild(ListComponent)\n listComponent: ListComponent;\n\n /** @hidden */\n @ViewChild('searchInputElement', { read: ElementRef })\n searchInputElement: ElementRef<HTMLInputElement>;\n\n /** @hidden */\n @ViewChild(TokenizerComponent)\n tokenizer: TokenizerComponent;\n\n /** @hidden */\n readonly optionItems$ = new BehaviorSubject<_OptionItem<ItemType, ValueType>[]>([]);\n\n /** @hidden */\n readonly _searchTermCtrl = new FormControl('');\n\n /** @hidden */\n readonly _selectionModel = new SelectionModel<ValueType>(true);\n\n /** @hidden */\n readonly _viewModel$: Observable<ViewModel<ItemType, ValueType>> = this._getViewModel();\n\n /** @hidden */\n _dir: string;\n\n /** typeahead matcher function */\n get typeAheadMatcher(): (item: string, searchTerm: string) => boolean {\n if (this.includes) {\n return (item: string, searchTerm: string) => item.includes(searchTerm);\n }\n return (item: string, searchTerm: string) => item.startsWith(searchTerm);\n }\n\n /** @hidden */\n private _subscriptions = new Subscription();\n\n /** @hidden */\n private readonly _rangeSelector = new RangeSelector();\n\n /** @hidden */\n private readonly _translationResolver = new TranslationResolver();\n\n /** @hidden */\n constructor(\n readonly _contentDensityObserver: ContentDensityObserver,\n public readonly elementRef: ElementRef<HTMLElement>,\n private readonly _changeDetRef: ChangeDetectorRef,\n private readonly _dynamicComponentService: DynamicComponentService,\n private readonly _injector: Injector,\n private readonly _viewContainerRef: ViewContainerRef,\n @Inject(FD_LANGUAGE) private readonly _language: Observable<FdLanguage>,\n @Optional() private readonly _rtlService: RtlService,\n @Optional() private readonly _focusTrapService: FocusTrapService\n ) {}\n\n /** @hidden CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n @applyCssClass\n buildComponentCssClass(): string[] {\n // TODO: this icon flip may be addressed in styles in the future\n if (this.glyph === 'value-help' && this._dir === 'rtl') {\n const icon = this.elementRef.nativeElement.querySelector('.sap-icon--value-help') as HTMLElement;\n if (icon) {\n icon.style.transform = 'scaleX(-1)';\n }\n }\n\n return ['fd-multi-input', 'fd-multi-input-custom', this.class];\n }\n\n /** @hidden */\n @HostListener('focusout', ['$event'])\n private _focusOut(event: FocusEvent): void {\n if (!this.elementRef.nativeElement.contains(event.relatedTarget as Node)) {\n this.onTouched();\n }\n }\n\n /** @hidden */\n _trackBy = (index: number, optionItem: _OptionItem<ItemType, ValueType>): ValueType =>\n this.valueFn(optionItem?.item);\n\n /** @hidden */\n onChange: (value: any) => void = () => {};\n\n /** @hidden */\n onTouched = (): void => {};\n\n /** @hidden */\n ngOnInit(): void {\n this.buildComponentCssClass();\n\n this._subscriptions.add(\n this._rtlService?.rtl.subscribe((isRtl) => {\n this._dir = isRtl ? 'rtl' : 'ltr';\n this.buildComponentCssClass();\n })\n );\n\n if (!this.inputId) {\n this.inputId = uuidv4();\n }\n\n this._subscriptions.add(\n this._searchTermCtrl.valueChanges.pipe(distinctUntilChanged()).subscribe((searchTerm) => {\n this.searchTermChange.emit(searchTerm ?? '');\n // resetting existing selection state, if any\n this._rangeSelector.reset();\n })\n );\n this._subscriptions.add(\n this._getViewModel()\n .pipe(map((viewModel) => !viewModel.displayedOptions.some((c) => !c.isSelected)))\n .subscribe((allItemsSelected) => this.allItemsSelectedChange.emit(allItemsSelected))\n );\n\n if (!this.ariaLabel) {\n this._subscriptions.add(\n this._language.subscribe(() => {\n this._getAriaLabel();\n })\n );\n }\n }\n\n /** @hidden */\n ngOnChanges(changes: SimpleChanges): void {\n this.buildComponentCssClass();\n\n if (changes.dropdownValues || changes.searchTerm || changes.valueFn || changes.displayFn) {\n const optionItems = (this.dropdownValues ?? []).map((item) => this._getOptionItem(item));\n this.optionItems$.next(optionItems);\n this._changeDetRef.markForCheck();\n }\n\n if (changes.disabled) {\n this.disabled ? this._searchTermCtrl.disable() : this._searchTermCtrl.enable();\n }\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n if (this.mobile) {\n this._setUpMobileMode();\n }\n this.tokenizer._showOverflowPopover = false;\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n /** @hidden */\n registerOnChange(fn: (selected: any[]) => void): void {\n this.onChange = fn;\n }\n\n /** @hidden */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @hidden */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n if (isDisabled) {\n this.elementRef.nativeElement.style.pointerEvents = 'none';\n } else {\n this.elementRef.nativeElement.style.pointerEvents = 'auto';\n }\n\n this._changeDetRef.detectChanges();\n }\n\n /** @hidden */\n writeValue(selected: ValueType[]): void {\n this.selected = selected;\n\n this._changeDetRef.markForCheck();\n }\n\n /** Method passed to list component */\n handleListFocusEscape(direction: FocusEscapeDirection): void {\n if (direction === 'up' && !this.mobile) {\n this.searchInputElement.nativeElement.focus();\n }\n }\n\n /** @hidden */\n openChangeHandle(open: boolean): void {\n if (this.disabled) {\n return;\n }\n\n if (!open && this.open && !this.mobile) {\n this.searchInputElement.nativeElement.focus();\n }\n\n if (this.open !== open) {\n this.openChange.emit(open);\n }\n\n this.open = open;\n\n if (!this.mobile) {\n this._popoverOpenHandle(open);\n }\n\n if (!this.open) {\n this._resetSearchTerm();\n this.enableParentFocusTrap();\n } else {\n this.disableParentFocusTrap();\n\n this.searchInputElement?.nativeElement.focus();\n }\n\n this.tokenizer.tokenizerInnerEl.nativeElement.scrollLeft =\n this.tokenizer.tokenizerInnerEl.nativeElement.scrollWidth;\n\n this._changeDetRef.detectChanges();\n }\n\n /** Method that selects all possible options. */\n selectAllItems(selectAll: boolean): void {\n if (selectAll) {\n this.selected = this.optionItems$.getValue().map((c) => c.value);\n } else {\n this.selected = [];\n }\n // On Mobile mode changes are propagated only on approve.\n this._propagateChange();\n }\n\n /** @hidden */\n _onCheckboxKeyup(value: any, event: KeyboardEvent, index: number): void {\n if (KeyUtil.isKeyCode(event, [SPACE, ENTER])) {\n this._onCheckboxClick(value, event, index);\n }\n }\n\n /** @hidden */\n async _onCheckboxClick(\n value: any,\n event: MouseEvent | KeyboardEvent,\n index: number,\n isListItem = false\n ): Promise<void> {\n const toggledSelection = !this._selectionModel.isSelected(value);\n this._rangeSelector.onRangeElementToggled(index, event);\n const sub = this._viewModel$.pipe(first()).subscribe((vm) => {\n this._rangeSelector.applyValueToEachInRange((idx) =>\n this._handleSelect(toggledSelection, vm.displayedOptions[idx].value, false)\n );\n this._changeDetRef.detectChanges();\n });\n this._subscriptions.add(sub);\n if (isListItem) {\n this.openChangeHandle(false);\n } else {\n // stop propagation on the checkbox so event doesn't reach the list item\n event.stopPropagation();\n }\n }\n\n /** @hidden */\n _onTokenClick(value: any, resetSearch: boolean, event?: MouseEvent): void {\n event?.preventDefault(); // prevent this function from being called twice when checkbox updates\n this._handleSelect(false, value, resetSearch, true);\n }\n\n /** @hidden */\n _handleSelect(checked: any, value: any, resetSearch = true, fromTokenCloseClick = false): void {\n const previousLength = this._selectionModel.selected.length;\n if (checked) {\n this._selectionModel.select(value);\n } else {\n this._selectionModel.deselect(value);\n }\n\n // Handle popover placement update\n if (this._shouldPopoverBeUpdated(previousLength, this._selectionModel.selected.length)) {\n this.popoverRef.refreshPosition();\n }\n if (resetSearch) {\n this._resetSearchTerm();\n this.searchInputElement.nativeElement.focus();\n }\n\n if (this._selectionModel.selected.length === 0) {\n this.searchInputElement.nativeElement.focus();\n this._changeDetRef.detectChanges();\n }\n\n // On Mobile mode changes are propagated only on approve.\n this._propagateChange(fromTokenCloseClick);\n }\n\n /** @hidden */\n _handleInputKeydown(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, DOWN_ARROW) && !this.mobile) {\n if (event.altKey) {\n this.openChangeHandle(true);\n }\n\n if (this.listComponent) {\n this.listComponent.setItemActive(0);\n event.preventDefault();\n }\n } else if (KeyUtil.isKeyCode(event, [DOWN_ARROW, UP_ARROW, ENTER])) {\n this.openChangeHandle(true);\n } else if (KeyUtil.isKeyCode(event, ESCAPE)) {\n this.openChangeHandle(false);\n } else if (KeyUtil.isKeyCode(event, TAB) && this.open) {\n if (this.listComponent) {\n this.listComponent.setItemActive(0);\n event.preventDefault();\n }\n } else if (KeyUtil.isKeyType(event, 'alphabetical') || KeyUtil.isKeyType(event, 'numeric')) {\n if (!this.open) {\n this.openChangeHandle(true);\n this.searchInputElement.nativeElement.focus();\n }\n }\n }\n\n /** @hidden */\n _showAllClicked(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this._searchTermCtrl.setValue('');\n this.searchInputElement.nativeElement.focus();\n }\n\n /** @hidden */\n _showAllKeyDown(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, [SPACE, ENTER])) {\n this._showAllClicked(event);\n }\n }\n\n /** @hidden */\n _onSubmit(): void {\n const searchTerm = this.searchTerm;\n if (searchTerm === '') {\n return;\n }\n const isExist = this._selectFirstFiltered(searchTerm);\n if (!isExist && this.allowNewTokens && this.newTokenValidateFn(this._searchTermCtrl.value ?? '')) {\n const newToken = this.newTokenParseFn(this._searchTermCtrl.value ?? '');\n this._addNewTokenToDropDownValues(newToken);\n this._handleSelect(true, newToken);\n this._searchTermCtrl.setValue('');\n this.open = false;\n }\n }\n\n /** @hidden */\n _handleComplete({ term }): void {\n this.searchTerm = term;\n }\n\n /**\n * Handle dialog dismissing, closes popover and sets backup data.\n */\n dialogDismiss(selectedBackup: any[]): void {\n this.openChangeHandle(false);\n this._resetSearchTerm();\n this.selected = selectedBackup;\n }\n\n /**\n * Handle dialog approval, closes popover and propagates data changes.\n */\n dialogApprove(): void {\n this._propagateChange(true);\n this.openChangeHandle(false);\n this._resetSearchTerm();\n }\n\n /** @hidden */\n _moreClicked(): void {\n this.openChangeHandle(true);\n }\n\n /** @hidden */\n _addOnButtonClicked(event: Event): void {\n this.addOnButtonClicked.emit(event);\n if (this.openDropdownOnAddOnClicked) {\n this.openChangeHandle(!this.open);\n } else if (this.open) {\n this.openChangeHandle(false);\n }\n }\n\n /** @hidden */\n disableParentFocusTrap(): void {\n this._focusTrapService?.pauseCurrentFocusTrap();\n }\n\n /** @hidden */\n enableParentFocusTrap(): void {\n this._focusTrapService?.unpauseCurrentFocusTrap();\n }\n\n /** @hidden */\n private _addNewTokenToDropDownValues(newToken): void {\n this.dropdownValues.push(newToken);\n const newOption = this._getOptionItem(newToken);\n this.optionItems$.next([...this.optionItems$.value, newOption]);\n }\n\n /** @hidden */\n private _selectFirstFiltered(searchTerm: string): boolean {\n const filtered = this.filterFn(this.dropdownValues, searchTerm);\n if (Array.isArray(filtered) && filtered.length > 0 && this.autoComplete) {\n const optionItem = this._getOptionItem(filtered[0]);\n this._handleSelect(true, optionItem.value);\n this._searchTermCtrl.setValue('');\n this.open = false;\n return true;\n }\n return false;\n }\n\n /** @hidden */\n private _defaultFilter(contentArray: any[], searchTerm: string = ''): any[] {\n const searchLower = searchTerm.toLocaleLowerCase();\n return contentArray.filter((item) => {\n if (item) {\n const displayedValue = this.displayFn(item);\n const term = typeof displayedValue === 'string' ? displayedValue.toLocaleLowerCase() : '';\n\n return this.typeAheadMatcher(term, searchLower);\n }\n });\n }\n\n /** @hidden */\n private _defaultValueFn(value: ItemType | ValueType): ValueType {\n return value as ValueType;\n }\n\n /** @hidden */\n private _defaultDisplay(str: ItemType): string | undefined {\n if (typeof str === 'string') {\n return str;\n }\n if (isOptionItemBase(str)) {\n return str.label;\n }\n }\n\n /** @hidden */\n private _defaultParse(str: string): string {\n return str;\n }\n\n /** @hidden */\n private _defaultTokenValidate(str: string): boolean {\n return !!str;\n }\n\n /** @hidden */\n private _popoverOpenHandle(open: boolean): void {\n this.open = open;\n }\n\n /** @hidden */\n private _propagateChange(emitInMobile?: boolean): void {\n if (!this.mobile || emitInMobile) {\n const selected = [...this._selectionModel.selected];\n this.onChange(selected);\n this.selectedChange.emit(selected);\n }\n }\n\n /** @hidden */\n private _shouldPopoverBeUpdated(previousLength: number, currentLength: number): boolean {\n return (\n !!this.popoverRef &&\n ((previousLength === 0 && currentLength === 1) || (previousLength === 1 && currentLength === 0))\n );\n }\n\n /** @hidden */\n private async _setUpMobileMode(): Promise<void> {\n const injector = Injector.create({\n providers: [{ provide: MULTI_INPUT_COMPONENT, useValue: this }],\n parent: this._injector\n });\n\n await this._dynamicComponentService.createDynamicModule(\n {\n listTemplate: this.listTemplate,\n controlTemplate: this.controlTemplate\n },\n MultiInputMobileModule,\n MultiInputMobileComponent,\n this._viewContainerRef,\n injector\n );\n }\n\n /** @hidden */\n private _resetSearchTerm(): void {\n this._searchTermCtrl.setValue('');\n this._changeDetRef.detectChanges();\n }\n\n /** @hidden */\n private _getOptionItem(item: ItemType | _OptionItem<ItemType, ValueType>): _OptionItem<ItemType, ValueType> {\n if (isOptionItem<ItemType, ValueType>(item)) {\n return item;\n }\n const { label, value } = this._getValueAndLabelOfItem(item);\n return {\n item,\n label,\n value,\n isSelected: false\n };\n }\n\n /** @hidden */\n private _getValueAndLabelOfItem(item: ItemType): OptionItemBase<ValueType> {\n const defaultDisplay = typeof item === 'object' && item !== null ? item[Object.keys(item)[0]] : item;\n let value = this.valueFn(item) ?? defaultDisplay;\n let label = this.displayFn(item) ?? defaultDisplay;\n if (isOptionItemBase(item)) {\n if (this.valueFn === this._defaultValueFn) {\n value = item.value;\n }\n if (this.displayFn === this._defaultDisplay) {\n label = item.label;\n }\n }\n return { label, value };\n }\n\n /** @hidden */\n private _getOptionItemByValue(\n value: ValueType,\n optionItems: _OptionItem<ItemType, ValueType>[] = []\n ): _OptionItem<ItemType, ValueType> | undefined {\n return optionItems.find((c) => c.value === value);\n }\n\n /** @hidden */\n private _getViewModel(): Observable<ViewModel<ItemType, ValueType>> {\n return combineLatest([\n this._searchTermCtrl.valueChanges.pipe(startWith(this._searchTermCtrl.value)),\n this._selectionModel.changed.pipe(startWith(null)),\n this.optionItems$\n ]).pipe(\n map(([, , optionItems]) => {\n const selected = this.selected.map(\n (v) => this._getOptionItemByValue(v, optionItems) || this._getOptionItem(v as any)\n );\n // not using \"searchTerm\" value from combineLatest as it will be wrong for late subscribers, if any\n const searchTerm = this._searchTermCtrl.value ?? '';\n const filtered = this.filterFn(\n optionItems.map((c) => c.item),\n searchTerm\n );\n const displayedOptions = (Array.isArray(filtered) ? filtered : []).map((item) =>\n this._getOptionItem(item)\n );\n displayedOptions.forEach((c) => (c.isSelected = selected.findIndex((d) => d?.value === c.value) > -1));\n return { selectedOptions: selected, displayedOptions };\n })\n );\n }\n\n /** @hidden */\n private async _getAriaLabel(): Promise<void> {\n const lang = await firstValueFrom(this._language);\n this.ariaLabel = this._translationResolver.resolve(lang, 'coreMultiInput.multiInputAriaLabel');\n }\n}\n\ninterface _OptionItem<ItemType = any, ValueType = any> extends OptionItemBase<ValueType> {\n item: ItemType;\n isSelected?: boolean;\n}\n\nexport type OptionItem<ItemType = any, ValueType = any> = Omit<_OptionItem<ItemType, ValueType>, 'isSelected'>;\n\nexport interface OptionItemBase<ValueType = any> {\n label: string;\n value: ValueType;\n}\n\ninterface ViewModel<ItemType = any, ValueType = any> {\n selectedOptions: _OptionItem<ItemType, ValueType>[];\n displayedOptions: _OptionItem<ItemType, ValueType>[];\n}\n","<ng-container *ngIf=\"_viewModel$ | async as viewModel\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n *ngIf=\"mobile\"\n ></ng-container>\n\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container\n *ngTemplateOutlet=\"control; context: { displayAddonButton: displayAddonButton }\"\n ></ng-container>\n </form>\n </fd-popover-control>\n\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of viewModel.selectedOptions; trackBy: _trackBy\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, false, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"tokenizer._hideTokens()\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"viewModel.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngFor=\"let option of viewModel.displayedOptions; index as idx; trackBy: _trackBy\"\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option.value, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n\n <li\n *ngIf=\"showAllButton && viewModel.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight : _searchTermCtrl.value || '' : highlight\"\n ></span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { ContentDensityModule } from '@fundamental-ngx/core/content-density';\nimport { MultiInputComponent } from './multi-input.component';\n\n@NgModule({\n imports: [ContentDensityModule, MultiInputComponent],\n exports: [MultiInputComponent, ContentDensityModule]\n})\nexport class MultiInputModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4","i2","i3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fundamental-ngx-core-multi-input.mjs","sources":["../../../../libs/core/src/lib/multi-input/multi-input.interface.ts","../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.component.ts","../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.component.html","../../../../libs/core/src/lib/multi-input/multi-input-mobile/multi-input-mobile.module.ts","../../../../libs/core/src/lib/multi-input/multi-input.component.ts","../../../../libs/core/src/lib/multi-input/multi-input.component.html","../../../../libs/core/src/lib/multi-input/multi-input.module.ts","../../../../libs/core/src/lib/multi-input/fundamental-ngx-core-multi-input.ts"],"sourcesContent":["import { EventEmitter, InjectionToken } from '@angular/core';\nimport { MobileMode } from '@fundamental-ngx/core/mobile-mode';\n\nexport const MULTI_INPUT_COMPONENT = new InjectionToken<string[]>('MultiInputComponent');\n\n/**\n * Multi Input Interface to have typing and avoid circular dependency between\n * MultiInputComponent <==> MultiInputMobileComponent\n */\nexport interface MultiInputInterface extends MobileMode {\n selected: any[];\n openChange: EventEmitter<boolean>;\n allItemsSelectedChange: EventEmitter<boolean>;\n\n dialogApprove(): void;\n\n selectAllItems(selectAll: boolean): void;\n\n dialogDismiss(selectedBackup: any[]): void;\n}\n","import { CdkScrollable } from '@angular/cdk/overlay';\nimport { NgIf, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Inject,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { Nullable, TemplateDirective } from '@fundamental-ngx/cdk/utils';\nimport { BarModule } from '@fundamental-ngx/core/bar';\nimport { ButtonModule } from '@fundamental-ngx/core/button';\nimport { DialogModule, DialogService } from '@fundamental-ngx/core/dialog';\nimport {\n MOBILE_MODE_CONFIG,\n MobileModeBase,\n MobileModeConfigToken,\n MobileModeControl\n} from '@fundamental-ngx/core/mobile-mode';\nimport { ScrollbarDirective } from '@fundamental-ngx/core/scrollbar';\nimport { TitleComponent } from '@fundamental-ngx/core/title';\nimport { takeUntil } from 'rxjs/operators';\nimport { MULTI_INPUT_COMPONENT, MultiInputInterface } from '../multi-input.interface';\n\n@Component({\n selector: 'fd-multi-input-mobile',\n templateUrl: './multi-input-mobile.component.html',\n styleUrls: ['./multi-input-mobile.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [\n DialogModule,\n NgIf,\n TitleComponent,\n TemplateDirective,\n BarModule,\n NgTemplateOutlet,\n ButtonModule,\n CdkScrollable,\n ScrollbarDirective\n ]\n})\nexport class MultiInputMobileComponent extends MobileModeBase<MultiInputInterface> implements OnInit, OnDestroy {\n /** @hidden */\n allItemsSelected: boolean;\n\n /** @hidden */\n @ViewChild('dialogTemplate') dialogTemplate: TemplateRef<any>;\n\n /** @hidden\n * For internal usage\n * Control element, which will be rendered inside dialog.\n * List element, which will be rendered inside dialog.\n */\n childContent: Nullable<{\n listTemplate: TemplateRef<any>;\n controlTemplate: TemplateRef<any>;\n }> = null;\n\n /** @hidden */\n private _selectedBackup: any[];\n\n /** @hidden */\n constructor(\n elementRef: ElementRef,\n dialogService: DialogService,\n @Inject(MULTI_INPUT_COMPONENT) multiInputComponent: MultiInputInterface,\n @Optional() @Inject(MOBILE_MODE_CONFIG) mobileModes: MobileModeConfigToken[]\n ) {\n super(elementRef, dialogService, multiInputComponent, MobileModeControl.MULTI_INPUT, mobileModes);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this._listenOnMultiInputOpenChange();\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n super.onDestroy();\n }\n\n /** Throw select all event, it's handled by multi input component */\n selectAll(selectAll: boolean): void {\n this._component.selectAllItems(!selectAll);\n }\n\n /** @hidden */\n handleDismiss(): void {\n this.dialogRef.dismiss();\n this._component.dialogDismiss(this._selectedBackup);\n }\n\n /** @hidden */\n handleApprove(): void {\n this.dialogRef.close();\n this._component.dialogApprove();\n }\n\n /** @hidden */\n private _toggleDialog(open: boolean): void {\n if (!open) {\n return;\n }\n\n this._selectedBackup = this._component.selected?.length ? [...this._component.selected] : [];\n if (!this._dialogService.hasOpenDialogs()) {\n this._open();\n }\n }\n\n /** @hidden */\n private _listenOnMultiInputOpenChange(): void {\n this._component.openChange.pipe(takeUntil(this._onDestroy$)).subscribe((isOpen) => this._toggleDialog(isOpen));\n this._component.allItemsSelectedChange\n .pipe(takeUntil(this._onDestroy$))\n .subscribe((allItemsSelected) => (this.allItemsSelected = allItemsSelected));\n }\n\n /** @hidden */\n private _open(): void {\n this.dialogRef = this._dialogService.open(this.dialogTemplate, {\n mobile: true,\n disablePaddings: true,\n ...this.dialogConfig,\n backdropClickCloseable: false,\n escKeyCloseable: false,\n container: this._elementRef.nativeElement\n });\n }\n}\n","<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <h1 fd-title *ngIf=\"mobileConfig?.title\">{{ mobileConfig.title }}</h1>\n <button\n fd-dialog-close-button\n [mobile]=\"true\"\n *ngIf=\"mobileConfig?.hasCloseButton\"\n (click)=\"handleDismiss()\"\n ></button>\n <ng-template fdkTemplate=\"subheader\">\n <div fd-bar-middle>\n <fd-bar-element class=\"custom-multi-input-mobile-control-element\">\n <ng-container\n *ngTemplateOutlet=\"\n childContent?.controlTemplate || null;\n context: { displayAddonButton: false }\n \"\n ></ng-container>\n </fd-bar-element>\n <fd-bar-element class=\"custom-multi-input-select-all-bar-element\">\n <button\n fd-button\n glyph=\"multiselect-all\"\n [fdType]=\"allItemsSelected ? 'emphasized' : 'transparent'\"\n (click)=\"selectAll(allItemsSelected)\"\n ></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"childContent?.listTemplate || null\"></ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer>\n <fd-button-bar\n *ngIf=\"mobileConfig?.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig.approveButtonText!\"\n (click)=\"handleApprove()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig?.cancelButtonText\"\n [label]=\"mobileConfig.cancelButtonText!\"\n (click)=\"handleDismiss()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { MultiInputMobileComponent } from './multi-input-mobile.component';\n\n@NgModule({\n imports: [MultiInputMobileComponent],\n exports: [MultiInputMobileComponent]\n})\nexport class MultiInputMobileModule {}\n","import { SelectionModel } from '@angular/cdk/collections';\nimport { DOWN_ARROW, ENTER, ESCAPE, SPACE, TAB, UP_ARROW } from '@angular/cdk/keycodes';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n Inject,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { ControlValueAccessor, FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport { BehaviorSubject, combineLatest, firstValueFrom, Observable, Subscription } from 'rxjs';\nimport { distinctUntilChanged, first, map, startWith } from 'rxjs/operators';\n\nimport {\n applyCssClass,\n AutoCompleteDirective,\n CssClassBuilder,\n DynamicComponentService,\n FocusEscapeDirection,\n FocusTrapService,\n KeyUtil,\n Nullable,\n RangeSelector,\n RtlService,\n SearchHighlightPipe,\n uuidv4\n} from '@fundamental-ngx/cdk/utils';\nimport { FormControlComponent, FormItemControl, registerFormItemControl } from '@fundamental-ngx/core/form';\nimport { ListComponent, ListModule } from '@fundamental-ngx/core/list';\nimport { MenuKeyboardService } from '@fundamental-ngx/core/menu';\nimport { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode';\nimport { PopoverBodyComponent, PopoverComponent, PopoverControlComponent } from '@fundamental-ngx/core/popover';\nimport { PopoverFillMode } from '@fundamental-ngx/core/shared';\nimport { TokenizerComponent, TokenModule } from '@fundamental-ngx/core/token';\n\nimport { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';\nimport { FormStates } from '@fundamental-ngx/cdk/forms';\nimport { CheckboxComponent } from '@fundamental-ngx/core/checkbox';\nimport { ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\nimport { InputGroupModule } from '@fundamental-ngx/core/input-group';\nimport { LinkComponent } from '@fundamental-ngx/core/link';\nimport { FD_LANGUAGE, FdLanguage, TranslationResolver } from '@fundamental-ngx/i18n';\nimport { MultiInputMobileComponent } from './multi-input-mobile/multi-input-mobile.component';\nimport { MultiInputMobileModule } from './multi-input-mobile/multi-input-mobile.module';\nimport { MULTI_INPUT_COMPONENT, MultiInputInterface } from './multi-input.interface';\n\nfunction isOptionItem<ItemType = any, ValueType = any>(candidate: any): candidate is _OptionItem<ItemType, ValueType> {\n return isOptionItemBase<ValueType>(candidate) && 'item' in candidate;\n}\n\nfunction isOptionItemBase<ValueType = any>(candidate: any): candidate is OptionItemBase<ValueType> {\n return typeof candidate === 'object' && candidate !== null && 'value' in candidate && 'label' in candidate;\n}\n\n/**\n * Input field with multiple selection enabled. Should be used when a user can select between a\n * limited number of pre-defined options with a filter-enabled context.\n *\n * Supports Angular Forms.\n */\n@Component({\n selector: 'fd-multi-input',\n templateUrl: './multi-input.component.html',\n styleUrls: ['./multi-input.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MultiInputComponent),\n multi: true\n },\n MenuKeyboardService,\n registerFormItemControl(MultiInputComponent),\n contentDensityObserverProviders()\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n NgIf,\n NgTemplateOutlet,\n PopoverComponent,\n PopoverControlComponent,\n FormsModule,\n PopoverBodyComponent,\n InputGroupModule,\n TokenModule,\n NgFor,\n FormControlComponent,\n AutoCompleteDirective,\n ReactiveFormsModule,\n ListModule,\n CheckboxComponent,\n LinkComponent,\n AsyncPipe,\n SearchHighlightPipe\n ]\n})\nexport class MultiInputComponent<ItemType = any, ValueType = any>\n implements\n MultiInputInterface,\n ControlValueAccessor,\n CssClassBuilder,\n OnInit,\n OnChanges,\n AfterViewInit,\n OnDestroy,\n FormItemControl\n{\n /** Placeholder for the input field. */\n @Input()\n placeholder = '';\n\n /** Whether the input is disabled. */\n @Input()\n disabled = false;\n\n /** If it is mandatory field */\n @Input()\n required = false;\n\n /** Whether to use cozy visuals but compact collapsing behavior. */\n @Input()\n compactCollapse = true;\n\n /** Max height of the popover. Any overflowing elements will be accessible through scrolling. */\n @Input()\n maxHeight = '300px';\n\n /** Icon of the button on the right of the input field. */\n @Input()\n glyph = 'value-help';\n\n /** Values to be displayed in the unfiltered dropdown. */\n @Input()\n dropdownValues: Array<ItemType | _OptionItem<ItemType, ValueType>> = [];\n\n /** Whether to open the dropdown when the addon button is clicked. */\n @Input()\n openDropdownOnAddOnClicked = true;\n\n /** Search term, or more specifically the value of the inner input field. */\n @Input()\n set searchTerm(value: string) {\n this._searchTermCtrl.setValue(value);\n }\n get searchTerm(): string {\n return this._searchTermCtrl.value ?? '';\n }\n\n /** Id attribute for input element inside MultiInput component */\n @Input()\n inputId = '';\n\n /** Whether the search term should be highlighted in results. */\n @Input()\n highlight = true;\n\n /** Selected dropdown items. */\n @Input()\n set selected(values: ValueType[]) {\n this._selectionModel.clear();\n values?.forEach((item) => this._selectionModel.select(item));\n }\n\n get selected(): ValueType[] {\n return this._selectionModel.selected;\n }\n\n /** user's custom classes */\n @Input()\n class: string;\n\n /**\n * Filter function. Accepts an array and a string as arguments, and outputs an array.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n filterFn = this._defaultFilter;\n\n /**\n * Value function. Accepts an object of the same type as the\n * items passed to dropdownValues as argument, and outputs any property, that should be used as value.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n valueFn: (item: ItemType) => ValueType = this._defaultValueFn;\n\n /**\n * Display function. Accepts an object of the same type as the\n * items passed to dropdownValues as argument, and outputs a string.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n displayFn: (item: ItemType) => string = this._defaultDisplay as unknown as (item: ItemType) => string;\n\n /**\n * Parse function. Used for submitting new tokens. Accepts a string by default.\n * An arrow function can be used to access the *this* keyword in the calling component.\n * See multi input examples for details.\n */\n @Input()\n newTokenParseFn: (searchTerm: string) => any = this._defaultParse;\n\n /**\n * Validate function. Used to check if new token can be added into list.\n * Works only, when `allowNewTokens` option is enabled.\n */\n @Input()\n newTokenValidateFn = this._defaultTokenValidate;\n\n /** aria-label attribute binding. */\n @Input()\n ariaLabel: Nullable<string>;\n\n /** aria-labelledby attribute binding. */\n @Input()\n ariaLabelledBy: Nullable<string>;\n\n /**\n * Preset options for the Select body width, whatever is chosen, the body has a 600px limit.\n * * `at-least` will apply a minimum width to the body equivalent to the width of the control. - Default\n * * `equal` will apply a width to the body equivalent to the width of the control.\n * * 'fit-content' will apply width needed to properly display items inside, independent of control.\n */\n @Input()\n fillControlMode: PopoverFillMode = 'at-least';\n\n /**\n * The state of the form control - applies css classes.\n * Can be `success`, `error`, `warning`, `information` or blank for default.\n */\n @Input()\n state?: FormStates;\n\n /**\n * Whether AddOn Button should be focusable\n * @default true\n */\n @Input()\n buttonFocusable = true;\n\n /** Whether the multi-input allows the creation of new tokens. */\n @Input()\n allowNewTokens = false;\n\n /** Whether the multi-input should be built on mobile mode */\n @Input()\n mobile = false;\n\n /** Whether the multi-input should have show all button. */\n @Input()\n showAllButton = true;\n\n /**\n * Max width of multi input body.\n * `none` will not limit width of the dropdown.\n * `container` will limit width of the dropdown to the width of the multi-input itself.\n * `number` will limit width of the dropdown by provided number in pixels.\n */\n @Input()\n bodyMaxWidth: 'none' | 'container' | number = 'none';\n\n /** @hidden */\n get _popoverMaxWidth(): Nullable<number> {\n if (this.bodyMaxWidth === 'none') {\n return null;\n }\n\n if (typeof this.bodyMaxWidth === 'number') {\n return this.bodyMaxWidth;\n }\n\n return this.elementRef.nativeElement.getBoundingClientRect().width;\n }\n\n /** Multi Input Mobile Configuration, it's applied only, when mobile is enabled */\n @Input()\n mobileConfig: MobileModeConfig = { hasCloseButton: true, approveButtonText: 'Select' };\n\n /**\n * Whether to return results where the input matches the entire string. By default, only results that start\n * with the input search term will be returned.\n */\n @Input()\n includes = false;\n\n /**\n * The template with which to display the individual listed items.\n * Use it by passing an ng-template with implicit content. See examples for more info.\n */\n @Input()\n itemTemplate: TemplateRef<any>;\n\n /**\n * The tooltip for the multi-input icon.\n */\n @Input()\n title: string;\n\n /** Whether list item options should be rendered as byline. */\n @Input()\n byline = false;\n\n /** Whether the autocomplete should be enabled; Enabled by default */\n @Input()\n autoComplete = true;\n\n /** Event emitted when the search term changes. Use *$event* to access the new term. */\n @Output()\n readonly searchTermChange: EventEmitter<string> = new EventEmitter<string>();\n\n /** Event emitted when the selected items change. Use *$event* to access the new selected array. */\n @Output()\n readonly selectedChange: EventEmitter<ValueType[]> = new EventEmitter<ValueType[]>();\n\n /** Whether multi input popover body should be opened */\n @Input()\n open = false;\n\n /** Whether or not to display the addon button. */\n @Input()\n displayAddonButton = true;\n\n /** Event emitted, when the multi input's popover body is opened or closed */\n @Output()\n readonly openChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** Emits event when the addon button is clicked. */\n @Output()\n readonly addOnButtonClicked: EventEmitter<Event> = new EventEmitter<Event>();\n\n /** Event emitted, when the multi input's all item checked or not */\n @Output()\n readonly allItemsSelectedChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** @hidden */\n @ViewChild(PopoverComponent)\n popoverRef: PopoverComponent;\n\n /** @hidden */\n @ViewChild('control', { read: TemplateRef })\n controlTemplate: TemplateRef<{ displayAddonButton: boolean }>;\n\n /** @hidden */\n @ViewChild('list', { read: TemplateRef })\n listTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild(ListComponent)\n listComponent: ListComponent;\n\n /** @hidden */\n @ViewChild('searchInputElement', { read: ElementRef })\n searchInputElement: ElementRef<HTMLInputElement>;\n\n /** @hidden */\n @ViewChild(TokenizerComponent)\n tokenizer: TokenizerComponent;\n\n /** @hidden */\n _defaultAriaLabel: Nullable<string>;\n\n /** @hidden */\n readonly optionItems$ = new BehaviorSubject<_OptionItem<ItemType, ValueType>[]>([]);\n\n /** @hidden */\n readonly _searchTermCtrl = new FormControl('');\n\n /** @hidden */\n readonly _selectionModel = new SelectionModel<ValueType>(true);\n\n /** @hidden */\n readonly _viewModel$: Observable<ViewModel<ItemType, ValueType>> = this._getViewModel();\n\n /** @hidden */\n _dir: string;\n\n /** typeahead matcher function */\n get typeAheadMatcher(): (item: string, searchTerm: string) => boolean {\n if (this.includes) {\n return (item: string, searchTerm: string) => item.includes(searchTerm);\n }\n return (item: string, searchTerm: string) => item.startsWith(searchTerm);\n }\n\n /** @hidden */\n private _subscriptions = new Subscription();\n\n /** @hidden */\n private readonly _rangeSelector = new RangeSelector();\n\n /** @hidden */\n private readonly _translationResolver = new TranslationResolver();\n\n /** @hidden */\n constructor(\n readonly _contentDensityObserver: ContentDensityObserver,\n public readonly elementRef: ElementRef<HTMLElement>,\n private readonly _changeDetRef: ChangeDetectorRef,\n private readonly _dynamicComponentService: DynamicComponentService,\n private readonly _injector: Injector,\n private readonly _viewContainerRef: ViewContainerRef,\n @Inject(FD_LANGUAGE) private readonly _language: Observable<FdLanguage>,\n @Optional() private readonly _rtlService: RtlService,\n @Optional() private readonly _focusTrapService: FocusTrapService\n ) {}\n\n /** @hidden CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n @applyCssClass\n buildComponentCssClass(): string[] {\n // TODO: this icon flip may be addressed in styles in the future\n if (this.glyph === 'value-help' && this._dir === 'rtl') {\n const icon = this.elementRef.nativeElement.querySelector('.sap-icon--value-help') as HTMLElement;\n if (icon) {\n icon.style.transform = 'scaleX(-1)';\n }\n }\n\n return ['fd-multi-input', 'fd-multi-input-custom', this.class];\n }\n\n /** @hidden */\n @HostListener('focusout', ['$event'])\n private _focusOut(event: FocusEvent): void {\n if (!this.elementRef.nativeElement.contains(event.relatedTarget as Node)) {\n this.onTouched();\n }\n }\n\n /** @hidden */\n _trackBy = (index: number, optionItem: _OptionItem<ItemType, ValueType>): ValueType =>\n this.valueFn(optionItem?.item);\n\n /** @hidden */\n onChange: (value: any) => void = () => {};\n\n /** @hidden */\n onTouched = (): void => {};\n\n /** @hidden */\n ngOnInit(): void {\n this.buildComponentCssClass();\n\n this._subscriptions.add(\n this._rtlService?.rtl.subscribe((isRtl) => {\n this._dir = isRtl ? 'rtl' : 'ltr';\n this.buildComponentCssClass();\n })\n );\n\n if (!this.inputId) {\n this.inputId = uuidv4();\n }\n\n this._subscriptions.add(\n this._searchTermCtrl.valueChanges.pipe(distinctUntilChanged()).subscribe((searchTerm) => {\n this.searchTermChange.emit(searchTerm ?? '');\n // resetting existing selection state, if any\n this._rangeSelector.reset();\n })\n );\n this._subscriptions.add(\n this._getViewModel()\n .pipe(map((viewModel) => !viewModel.displayedOptions.some((c) => !c.isSelected)))\n .subscribe((allItemsSelected) => this.allItemsSelectedChange.emit(allItemsSelected))\n );\n\n this._subscriptions.add(\n this._language.subscribe(() => {\n this._getAriaLabel();\n })\n );\n }\n\n /** @hidden */\n ngOnChanges(changes: SimpleChanges): void {\n this.buildComponentCssClass();\n\n if (changes.dropdownValues || changes.searchTerm || changes.valueFn || changes.displayFn) {\n const optionItems = (this.dropdownValues ?? []).map((item) => this._getOptionItem(item));\n this.optionItems$.next(optionItems);\n this._changeDetRef.markForCheck();\n }\n\n if (changes.disabled) {\n this.disabled ? this._searchTermCtrl.disable() : this._searchTermCtrl.enable();\n }\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n if (this.mobile) {\n this._setUpMobileMode();\n }\n this.tokenizer._showOverflowPopover = false;\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n /** @hidden */\n registerOnChange(fn: (selected: any[]) => void): void {\n this.onChange = fn;\n }\n\n /** @hidden */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @hidden */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n if (isDisabled) {\n this.elementRef.nativeElement.style.pointerEvents = 'none';\n } else {\n this.elementRef.nativeElement.style.pointerEvents = 'auto';\n }\n\n this._changeDetRef.detectChanges();\n }\n\n /** @hidden */\n writeValue(selected: ValueType[]): void {\n this.selected = selected;\n\n this._changeDetRef.markForCheck();\n }\n\n /** Method passed to list component */\n handleListFocusEscape(direction: FocusEscapeDirection): void {\n if (direction === 'up' && !this.mobile) {\n this.searchInputElement.nativeElement.focus();\n }\n }\n\n /** @hidden */\n openChangeHandle(open: boolean): void {\n if (this.disabled) {\n return;\n }\n\n if (!open && this.open && !this.mobile) {\n this.searchInputElement.nativeElement.focus();\n }\n\n if (this.open !== open) {\n this.openChange.emit(open);\n }\n\n this.open = open;\n\n if (!this.mobile) {\n this._popoverOpenHandle(open);\n }\n\n if (!this.open) {\n this._resetSearchTerm();\n this.enableParentFocusTrap();\n } else {\n this.disableParentFocusTrap();\n\n this.searchInputElement?.nativeElement.focus();\n }\n\n this.tokenizer.tokenizerInnerEl.nativeElement.scrollLeft =\n this.tokenizer.tokenizerInnerEl.nativeElement.scrollWidth;\n\n this._changeDetRef.detectChanges();\n }\n\n /** Method that selects all possible options. */\n selectAllItems(selectAll: boolean): void {\n if (selectAll) {\n this.selected = this.optionItems$.getValue().map((c) => c.value);\n } else {\n this.selected = [];\n }\n // On Mobile mode changes are propagated only on approve.\n this._propagateChange();\n }\n\n /** @hidden */\n _onCheckboxKeyup(value: any, event: KeyboardEvent, index: number): void {\n if (KeyUtil.isKeyCode(event, [SPACE, ENTER])) {\n this._onCheckboxClick(value, event, index);\n }\n }\n\n /** @hidden */\n async _onCheckboxClick(\n value: any,\n event: MouseEvent | KeyboardEvent,\n index: number,\n isListItem = false\n ): Promise<void> {\n const toggledSelection = !this._selectionModel.isSelected(value);\n this._rangeSelector.onRangeElementToggled(index, event);\n const sub = this._viewModel$.pipe(first()).subscribe((vm) => {\n this._rangeSelector.applyValueToEachInRange((idx) =>\n this._handleSelect(toggledSelection, vm.displayedOptions[idx].value, false)\n );\n this._changeDetRef.detectChanges();\n });\n this._subscriptions.add(sub);\n if (isListItem) {\n this.openChangeHandle(false);\n } else {\n // stop propagation on the checkbox so event doesn't reach the list item\n event.stopPropagation();\n }\n }\n\n /** @hidden */\n _onTokenClick(value: any, resetSearch: boolean, event?: MouseEvent): void {\n event?.preventDefault(); // prevent this function from being called twice when checkbox updates\n this._handleSelect(false, value, resetSearch, true);\n }\n\n /** @hidden */\n _handleSelect(checked: any, value: any, resetSearch = true, fromTokenCloseClick = false): void {\n const previousLength = this._selectionModel.selected.length;\n if (checked) {\n this._selectionModel.select(value);\n } else {\n this._selectionModel.deselect(value);\n }\n\n // Handle popover placement update\n if (this._shouldPopoverBeUpdated(previousLength, this._selectionModel.selected.length)) {\n this.popoverRef.refreshPosition();\n }\n if (resetSearch) {\n this._resetSearchTerm();\n this.searchInputElement.nativeElement.focus();\n }\n\n if (this._selectionModel.selected.length === 0) {\n this.searchInputElement.nativeElement.focus();\n this._changeDetRef.detectChanges();\n }\n\n // On Mobile mode changes are propagated only on approve.\n this._propagateChange(fromTokenCloseClick);\n }\n\n /** @hidden */\n _handleInputKeydown(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, DOWN_ARROW) && !this.mobile) {\n if (event.altKey) {\n this.openChangeHandle(true);\n }\n\n if (this.listComponent) {\n this.listComponent.setItemActive(0);\n event.preventDefault();\n }\n } else if (KeyUtil.isKeyCode(event, [DOWN_ARROW, UP_ARROW, ENTER])) {\n this.openChangeHandle(true);\n } else if (KeyUtil.isKeyCode(event, ESCAPE)) {\n this.openChangeHandle(false);\n } else if (KeyUtil.isKeyCode(event, TAB) && this.open) {\n if (this.listComponent) {\n this.listComponent.setItemActive(0);\n event.preventDefault();\n }\n } else if (KeyUtil.isKeyType(event, 'alphabetical') || KeyUtil.isKeyType(event, 'numeric')) {\n if (!this.open) {\n this.openChangeHandle(true);\n this.searchInputElement.nativeElement.focus();\n }\n }\n }\n\n /** @hidden */\n _showAllClicked(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this._searchTermCtrl.setValue('');\n this.searchInputElement.nativeElement.focus();\n }\n\n /** @hidden */\n _showAllKeyDown(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, [SPACE, ENTER])) {\n this._showAllClicked(event);\n }\n }\n\n /** @hidden */\n _onSubmit(): void {\n const searchTerm = this.searchTerm;\n if (searchTerm === '') {\n return;\n }\n const isExist = this._selectFirstFiltered(searchTerm);\n if (!isExist && this.allowNewTokens && this.newTokenValidateFn(this._searchTermCtrl.value ?? '')) {\n const newToken = this.newTokenParseFn(this._searchTermCtrl.value ?? '');\n this._addNewTokenToDropDownValues(newToken);\n this._handleSelect(true, newToken);\n this._searchTermCtrl.setValue('');\n this.open = false;\n }\n }\n\n /** @hidden */\n _handleComplete({ term }): void {\n this.searchTerm = term;\n }\n\n /**\n * Handle dialog dismissing, closes popover and sets backup data.\n */\n dialogDismiss(selectedBackup: any[]): void {\n this.openChangeHandle(false);\n this._resetSearchTerm();\n this.selected = selectedBackup;\n }\n\n /**\n * Handle dialog approval, closes popover and propagates data changes.\n */\n dialogApprove(): void {\n this._propagateChange(true);\n this.openChangeHandle(false);\n this._resetSearchTerm();\n }\n\n /** @hidden */\n _moreClicked(): void {\n this.openChangeHandle(true);\n }\n\n /** @hidden */\n _addOnButtonClicked(event: Event): void {\n this.addOnButtonClicked.emit(event);\n if (this.openDropdownOnAddOnClicked) {\n this.openChangeHandle(!this.open);\n } else if (this.open) {\n this.openChangeHandle(false);\n }\n }\n\n /** @hidden */\n disableParentFocusTrap(): void {\n this._focusTrapService?.pauseCurrentFocusTrap();\n }\n\n /** @hidden */\n enableParentFocusTrap(): void {\n this._focusTrapService?.unpauseCurrentFocusTrap();\n }\n\n /** @hidden */\n private _addNewTokenToDropDownValues(newToken): void {\n this.dropdownValues.push(newToken);\n const newOption = this._getOptionItem(newToken);\n this.optionItems$.next([...this.optionItems$.value, newOption]);\n }\n\n /** @hidden */\n private _selectFirstFiltered(searchTerm: string): boolean {\n const filtered = this.filterFn(this.dropdownValues, searchTerm);\n if (Array.isArray(filtered) && filtered.length > 0 && this.autoComplete) {\n const optionItem = this._getOptionItem(filtered[0]);\n this._handleSelect(true, optionItem.value);\n this._searchTermCtrl.setValue('');\n this.open = false;\n return true;\n }\n return false;\n }\n\n /** @hidden */\n private _defaultFilter(contentArray: any[], searchTerm: string = ''): any[] {\n const searchLower = searchTerm.toLocaleLowerCase();\n return contentArray.filter((item) => {\n if (item) {\n const displayedValue = this.displayFn(item);\n const term = typeof displayedValue === 'string' ? displayedValue.toLocaleLowerCase() : '';\n\n return this.typeAheadMatcher(term, searchLower);\n }\n });\n }\n\n /** @hidden */\n private _defaultValueFn(value: ItemType | ValueType): ValueType {\n return value as ValueType;\n }\n\n /** @hidden */\n private _defaultDisplay(str: ItemType): string | undefined {\n if (typeof str === 'string') {\n return str;\n }\n if (isOptionItemBase(str)) {\n return str.label;\n }\n }\n\n /** @hidden */\n private _defaultParse(str: string): string {\n return str;\n }\n\n /** @hidden */\n private _defaultTokenValidate(str: string): boolean {\n return !!str;\n }\n\n /** @hidden */\n private _popoverOpenHandle(open: boolean): void {\n this.open = open;\n }\n\n /** @hidden */\n private _propagateChange(emitInMobile?: boolean): void {\n if (!this.mobile || emitInMobile) {\n const selected = [...this._selectionModel.selected];\n this.onChange(selected);\n this.selectedChange.emit(selected);\n }\n }\n\n /** @hidden */\n private _shouldPopoverBeUpdated(previousLength: number, currentLength: number): boolean {\n return (\n !!this.popoverRef &&\n ((previousLength === 0 && currentLength === 1) || (previousLength === 1 && currentLength === 0))\n );\n }\n\n /** @hidden */\n private async _setUpMobileMode(): Promise<void> {\n const injector = Injector.create({\n providers: [{ provide: MULTI_INPUT_COMPONENT, useValue: this }],\n parent: this._injector\n });\n\n await this._dynamicComponentService.createDynamicModule(\n {\n listTemplate: this.listTemplate,\n controlTemplate: this.controlTemplate\n },\n MultiInputMobileModule,\n MultiInputMobileComponent,\n this._viewContainerRef,\n injector\n );\n }\n\n /** @hidden */\n private _resetSearchTerm(): void {\n this._searchTermCtrl.setValue('');\n this._changeDetRef.detectChanges();\n }\n\n /** @hidden */\n private _getOptionItem(item: ItemType | _OptionItem<ItemType, ValueType>): _OptionItem<ItemType, ValueType> {\n if (isOptionItem<ItemType, ValueType>(item)) {\n return item;\n }\n const { label, value } = this._getValueAndLabelOfItem(item);\n return {\n item,\n label,\n value,\n isSelected: false\n };\n }\n\n /** @hidden */\n private _getValueAndLabelOfItem(item: ItemType): OptionItemBase<ValueType> {\n const defaultDisplay = typeof item === 'object' && item !== null ? item[Object.keys(item)[0]] : item;\n let value = this.valueFn(item) ?? defaultDisplay;\n let label = this.displayFn(item) ?? defaultDisplay;\n if (isOptionItemBase(item)) {\n if (this.valueFn === this._defaultValueFn) {\n value = item.value;\n }\n if (this.displayFn === this._defaultDisplay) {\n label = item.label;\n }\n }\n return { label, value };\n }\n\n /** @hidden */\n private _getOptionItemByValue(\n value: ValueType,\n optionItems: _OptionItem<ItemType, ValueType>[] = []\n ): _OptionItem<ItemType, ValueType> | undefined {\n return optionItems.find((c) => c.value === value);\n }\n\n /** @hidden */\n private _getViewModel(): Observable<ViewModel<ItemType, ValueType>> {\n return combineLatest([\n this._searchTermCtrl.valueChanges.pipe(startWith(this._searchTermCtrl.value)),\n this._selectionModel.changed.pipe(startWith(null)),\n this.optionItems$\n ]).pipe(\n map(([, , optionItems]) => {\n const selected = this.selected.map(\n (v) => this._getOptionItemByValue(v, optionItems) || this._getOptionItem(v as any)\n );\n // not using \"searchTerm\" value from combineLatest as it will be wrong for late subscribers, if any\n const searchTerm = this._searchTermCtrl.value ?? '';\n const filtered = this.filterFn(\n optionItems.map((c) => c.item),\n searchTerm\n );\n const displayedOptions = (Array.isArray(filtered) ? filtered : []).map((item) =>\n this._getOptionItem(item)\n );\n displayedOptions.forEach((c) => (c.isSelected = selected.findIndex((d) => d?.value === c.value) > -1));\n return { selectedOptions: selected, displayedOptions };\n })\n );\n }\n\n /** @hidden */\n private async _getAriaLabel(): Promise<void> {\n const lang = await firstValueFrom(this._language);\n this._defaultAriaLabel = this._translationResolver.resolve(lang, 'coreMultiInput.multiInputAriaLabel');\n }\n}\n\ninterface _OptionItem<ItemType = any, ValueType = any> extends OptionItemBase<ValueType> {\n item: ItemType;\n isSelected?: boolean;\n}\n\nexport type OptionItem<ItemType = any, ValueType = any> = Omit<_OptionItem<ItemType, ValueType>, 'isSelected'>;\n\nexport interface OptionItemBase<ValueType = any> {\n label: string;\n value: ValueType;\n}\n\ninterface ViewModel<ItemType = any, ValueType = any> {\n selectedOptions: _OptionItem<ItemType, ValueType>[];\n displayedOptions: _OptionItem<ItemType, ValueType>[];\n}\n","<ng-container *ngIf=\"_viewModel$ | async as viewModel\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n *ngIf=\"mobile\"\n ></ng-container>\n\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container\n *ngTemplateOutlet=\"control; context: { displayAddonButton: displayAddonButton }\"\n ></ng-container>\n </form>\n </fd-popover-control>\n\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of viewModel.selectedOptions; trackBy: _trackBy\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, false, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [ariaLabel]=\"ariaLabel || _defaultAriaLabel\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"tokenizer._hideTokens()\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"viewModel.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngFor=\"let option of viewModel.displayedOptions; index as idx; trackBy: _trackBy\"\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option.value, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n\n <li\n *ngIf=\"showAllButton && viewModel.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight : _searchTermCtrl.value || '' : highlight\"\n ></span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { ContentDensityModule } from '@fundamental-ngx/core/content-density';\nimport { MultiInputComponent } from './multi-input.component';\n\n@NgModule({\n imports: [ContentDensityModule, MultiInputComponent],\n exports: [MultiInputComponent, ContentDensityModule]\n})\nexport class MultiInputModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4","i2","i3"],"mappings":"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"}
|
|
Binary file
|
|
@@ -174,6 +174,8 @@ export declare class MultiInputComponent<ItemType = any, ValueType = any> implem
|
|
|
174
174
|
/** @hidden */
|
|
175
175
|
tokenizer: TokenizerComponent;
|
|
176
176
|
/** @hidden */
|
|
177
|
+
_defaultAriaLabel: Nullable<string>;
|
|
178
|
+
/** @hidden */
|
|
177
179
|
readonly optionItems$: BehaviorSubject<_OptionItem<ItemType, ValueType>[]>;
|
|
178
180
|
/** @hidden */
|
|
179
181
|
readonly _searchTermCtrl: FormControl<string | null>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fundamental-ngx/core",
|
|
3
|
-
"version": "0.46.0-rc.
|
|
3
|
+
"version": "0.46.0-rc.34",
|
|
4
4
|
"schematics": "./schematics/collection.json",
|
|
5
5
|
"ng-update": {
|
|
6
6
|
"migrations": "./schematics/migrations.json"
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"rxjs": "^7.8.0"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@fundamental-ngx/cdk": "0.46.0-rc.
|
|
32
|
-
"@fundamental-ngx/i18n": "0.46.0-rc.
|
|
31
|
+
"@fundamental-ngx/cdk": "0.46.0-rc.34",
|
|
32
|
+
"@fundamental-ngx/i18n": "0.46.0-rc.34",
|
|
33
33
|
"compare-versions": "^6.0.0",
|
|
34
34
|
"fast-deep-equal": "3.1.3",
|
|
35
35
|
"focus-trap": "^7.1.0",
|
|
@@ -54,21 +54,21 @@ function addExternalLibraries(options) {
|
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
56
|
if (!(0, package_utils_1.hasPackage)(tree, '@fundamental-ngx/i18n') ||
|
|
57
|
-
(0, package_utils_1.checkPackageVersion)(tree, '@fundamental-ngx/i18n', '0.46.0-rc.
|
|
57
|
+
(0, package_utils_1.checkPackageVersion)(tree, '@fundamental-ngx/i18n', '0.46.0-rc.34', '<')) {
|
|
58
58
|
dependencies.push({
|
|
59
59
|
type: dependencies_1.NodeDependencyType.Default,
|
|
60
60
|
// Will be replaced with the real version during sync-version script run
|
|
61
|
-
version: `0.46.0-rc.
|
|
61
|
+
version: `0.46.0-rc.34`,
|
|
62
62
|
name: '@fundamental-ngx/i18n',
|
|
63
63
|
overwrite: true
|
|
64
64
|
});
|
|
65
65
|
}
|
|
66
66
|
if (!(0, package_utils_1.hasPackage)(tree, '@fundamental-ngx/cdk') ||
|
|
67
|
-
(0, package_utils_1.checkPackageVersion)(tree, '@fundamental-ngx/cdk', '0.46.0-rc.
|
|
67
|
+
(0, package_utils_1.checkPackageVersion)(tree, '@fundamental-ngx/cdk', '0.46.0-rc.34', '<')) {
|
|
68
68
|
dependencies.push({
|
|
69
69
|
type: dependencies_1.NodeDependencyType.Default,
|
|
70
70
|
// Will be replaced with the real version during sync-version script run
|
|
71
|
-
version: `0.46.0-rc.
|
|
71
|
+
version: `0.46.0-rc.34`,
|
|
72
72
|
name: '@fundamental-ngx/cdk',
|
|
73
73
|
overwrite: true
|
|
74
74
|
});
|
|
Binary file
|