UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

143 lines 33.9 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Component, ElementRef, EventEmitter, forwardRef, HostBinding, Input, Output, Renderer2, ViewChild, ViewEncapsulation, } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import _debounce from "lodash/debounce"; import _isEmpty from "lodash/isEmpty"; import _isNil from "lodash/isNil"; import _toString from "lodash/toString"; import { BaseSelect } from "./base-select"; import { LoggerService } from "../../services/log-service"; import { UtilService } from "../../services/util.service"; import { NuiFormFieldControl } from "../form-field/public-api"; import { MenuComponent } from "../menu"; import * as i0 from "@angular/core"; import * as i1 from "../../services/util.service"; import * as i2 from "../../services/log-service"; import * as i3 from "@angular/common"; import * as i4 from "../menu/menu-item/menu-action/menu-action.component"; import * as i5 from "../menu/menu/menu.component"; import * as i6 from "../menu/menu-item/menu-group/menu-group.component"; // <example-url>./../examples/index.html#/select</example-url> /** * @deprecated in v11 - Use SelectV2Component instead - Removal: NUI-5796 */ export class SelectComponent extends BaseSelect { get isJustified() { return this.justified; } get isInline() { return this.inline; } constructor(utilService, renderer, elRef, logger) { super(utilService); this.renderer = renderer; this.elRef = elRef; this.logger = logger; /** * Input that indicates text which is displayed if "isRemoveValueEnabled" set to true */ this.removeValueText = "Unspecified"; /** * Callback event that provides split-button behavior and interaction. */ this.secondaryAction = new EventEmitter(); this.debouncedBlur = _debounce(() => { this.handleBlur(); }, 300); this.logger.warn("<nui-select> is deprecated as of Nova v11. Please use <nui-select-v2> instead."); } ngOnInit() { super.ngOnInit(); this.unsubscriber = this.renderer.listen(this.elRef.nativeElement, "focusout", () => { // Blur is debounced cause when you click on menu item blur is triggered twice: from textbox and when popup is closed. this.debouncedBlur(); }); } ngOnChanges(changes) { super.ngOnChanges(changes); } displayPlaceholder() { return !_isNil(this.placeholder) && _isEmpty(this.getSelectedItem()); } displayedValue() { return this.displayPlaceholder() ? this.placeholder : _toString(this.getDisplayValueFormatted(this.getSelectedItem())); } handleBlur() { this.select(this.selectedItem); } getWidth() { // when appendToBody=true popup goes to body, so it's out of nui-select and it's width needs to be set explicitly return this.appendToBody || this.isJustified ? this.elRef.nativeElement.getBoundingClientRect().width + "px" : ""; } ngOnDestroy() { if (this.unsubscriber) { this.unsubscriber(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectComponent, deps: [{ token: i1.UtilService }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i2.LoggerService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SelectComponent, selector: "nui-select", inputs: { appendToBody: "appendToBody", removeValueText: "removeValueText" }, outputs: { secondaryAction: "secondaryAction" }, host: { properties: { "class.nui-select--justified": "this.isJustified", "class.nui-select--inline": "this.isInline" }, classAttribute: "nui-select" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectComponent), multi: true, }, { provide: NuiFormFieldControl, useExisting: forwardRef(() => SelectComponent), multi: true, }, ], viewQueries: [{ propertyName: "menu", first: true, predicate: ["menu"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"nui-select__layout-block\"\n [class.placeholder-displayed]=\"displayPlaceholder()\"\n [class.custom-template]=\"customTemplate\"\n [class.disabled]=\"isDisabled\"\n>\n <ng-container *ngIf=\"itemsSource; else transclusionContent\">\n <nui-menu\n #menu\n [class.has-error]=\"isInErrorState\"\n [title]=\"displayedValue()\"\n [isDisabled]=\"isDisabled\"\n [appendToBody]=\"appendToBody\"\n [widthOfPopup]=\"getWidth()\"\n [contextClass]=\"\n (justified ? 'nui-select--justified ' : '') +\n 'nui-select-popup-host'\n \"\n [attr.aria-label]=\"ariaLabel\"\n >\n <nui-menu-action\n *ngIf=\"isRemoveValueEnabled\"\n (actionDone)=\"select(null)\"\n >\n {{ removeValueText }}\n </nui-menu-action>\n <ng-container *ngFor=\"let item of itemsSource\">\n <nui-menu-action\n *ngIf=\"!item.items\"\n [class.item-selected]=\"isItemSelected(item)\"\n (actionDone)=\"select(item)\"\n >\n <ng-container *ngIf=\"!customTemplate\">{{\n getItemDisplay(item)\n }}</ng-container>\n <ng-container\n [ngTemplateOutlet]=\"customTemplate\"\n [ngTemplateOutletContext]=\"{ context: item }\"\n >\n </ng-container>\n </nui-menu-action>\n <nui-menu-group *ngIf=\"item.items\" [header]=\"item.header\">\n <nui-menu-action\n *ngFor=\"let groupedItem of item.items\"\n [class.item-selected]=\"isItemSelected(groupedItem)\"\n (actionDone)=\"select(groupedItem)\"\n >\n {{ getItemDisplay(groupedItem) }}\n </nui-menu-action>\n </nui-menu-group>\n </ng-container>\n </nui-menu>\n </ng-container>\n <ng-template #transclusionContent>\n <ng-content></ng-content>\n </ng-template>\n</div>\n", styles: [".nui .nui-select--inline .nui-select__layout-block{display:inline-flex}.nui .nui-select .nui-button.menu-button{color:var(--nui-color-text-default,#111);min-width:100px;justify-content:space-between;padding-right:6px}.nui .nui-select .nui-button.menu-button.is-empty{justify-content:flex-end}.nui .nui-select .nui-button.menu-button:hover,.nui .nui-select .nui-button.menu-button:focus,.nui .nui-select .nui-button.menu-button:active,.nui .nui-select .nui-button.menu-button:active:hover{color:var(--nui-color-text-default,#111);transform:none;outline:none}.nui .nui-select .placeholder-displayed .nui-button.menu-button{color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));font-weight:400}.nui .nui-select .placeholder-displayed .nui-button.menu-button:hover,.nui .nui-select .placeholder-displayed .nui-button.menu-button:focus,.nui .nui-select .placeholder-displayed .nui-button.menu-button:active{color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6))}.nui .nui-select .disabled .nui-button.menu-button{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3));cursor:not-allowed}.nui .nui-select .disabled .nui-button.menu-button .nui-icon path,.nui .nui-select .disabled .nui-button.menu-button .nui-icon polygon{fill:var(--nui-color-icon-disabled,rgba(17, 17, 17, .3))}.nui .nui-select .disabled .nui-button.menu-button:hover,.nui .nui-select .disabled .nui-button.menu-button:focus,.nui .nui-select .disabled .nui-button.menu-button:active{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3));border-color:var(--nui-color-line-default,#d9d9d9);background-color:var(--nui-color-bg-transparent,transparent);box-shadow:none}.nui .nui-select .nui-menu-item .nui-menu-item__action{color:var(--nui-color-text-default,#111)}.nui .nui-select .nui-menu-item.item-selected .nui-menu-item__action{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111);font-weight:600}.nui .nui-select .nui-menu-item.item-selected .nui-menu-item__action:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui .nui-select .custom-template .nui-popup .nui-popup__area{width:auto}.nui .nui-select .nui-popup .nui-popup__area [popupAreaContent]{padding:0}.nui .nui-select .nui-popup .nui-popup__area{width:100%;min-width:160px;max-width:400px;height:100%;overflow-y:auto}.nui .nui-select .nui-select__menu{max-height:300px;overflow-y:auto;max-width:400px}.nui .nui-select .has-error .nui-button.menu-button{border-color:var(--nui-color-line-critical,#dd2c00)}.nui .nui-select .has-error .nui-button.menu-button:hover,.nui .nui-select .has-error .nui-button.menu-button:focus,.nui .nui-select .has-error .nui-button.menu-button:active{border-color:var(--nui-color-line-critical,#dd2c00)}.nui .nui-select--justified .custom-template .nui-popup .nui-popup__area{max-width:none;width:100%}.nui .nui-select--justified nui-menu{display:flex}.nui .nui-select--justified nui-menu .nui-popup{flex-grow:1;width:100%}.nui .nui-select--justified nui-menu .nui-popup-container{flex-grow:1;width:100%}.nui .nui-select--justified nui-menu .nui-popup-container .nui-popup__area{max-width:none}.nui .nui-select--justified nui-menu .nui-popup__content{width:100%}.nui .nui-select--justified nui-menu .nui-popup__content .menu-button{display:flex;flex-grow:1;max-width:none}@-moz-document url-prefix(){.nui .nui-select .nui-menu-item{padding-right:0}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.MenuActionComponent, selector: "nui-menu-action", inputs: ["icon", "type"] }, { kind: "component", type: i5.MenuComponent, selector: "nui-menu", inputs: ["widthOfPopup", "contextClass", "appendToBody", "ariaLabel", "title", "size", "displayStyle", "isDisabled", "icon", "itemsSource"], outputs: ["blurred"] }, { kind: "component", type: i6.MenuGroupComponent, selector: "nui-menu-group", inputs: ["header"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectComponent, decorators: [{ type: Component, args: [{ selector: "nui-select", host: { class: "nui-select" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectComponent), multi: true, }, { provide: NuiFormFieldControl, useExisting: forwardRef(() => SelectComponent), multi: true, }, ], encapsulation: ViewEncapsulation.None, template: "<div\n class=\"nui-select__layout-block\"\n [class.placeholder-displayed]=\"displayPlaceholder()\"\n [class.custom-template]=\"customTemplate\"\n [class.disabled]=\"isDisabled\"\n>\n <ng-container *ngIf=\"itemsSource; else transclusionContent\">\n <nui-menu\n #menu\n [class.has-error]=\"isInErrorState\"\n [title]=\"displayedValue()\"\n [isDisabled]=\"isDisabled\"\n [appendToBody]=\"appendToBody\"\n [widthOfPopup]=\"getWidth()\"\n [contextClass]=\"\n (justified ? 'nui-select--justified ' : '') +\n 'nui-select-popup-host'\n \"\n [attr.aria-label]=\"ariaLabel\"\n >\n <nui-menu-action\n *ngIf=\"isRemoveValueEnabled\"\n (actionDone)=\"select(null)\"\n >\n {{ removeValueText }}\n </nui-menu-action>\n <ng-container *ngFor=\"let item of itemsSource\">\n <nui-menu-action\n *ngIf=\"!item.items\"\n [class.item-selected]=\"isItemSelected(item)\"\n (actionDone)=\"select(item)\"\n >\n <ng-container *ngIf=\"!customTemplate\">{{\n getItemDisplay(item)\n }}</ng-container>\n <ng-container\n [ngTemplateOutlet]=\"customTemplate\"\n [ngTemplateOutletContext]=\"{ context: item }\"\n >\n </ng-container>\n </nui-menu-action>\n <nui-menu-group *ngIf=\"item.items\" [header]=\"item.header\">\n <nui-menu-action\n *ngFor=\"let groupedItem of item.items\"\n [class.item-selected]=\"isItemSelected(groupedItem)\"\n (actionDone)=\"select(groupedItem)\"\n >\n {{ getItemDisplay(groupedItem) }}\n </nui-menu-action>\n </nui-menu-group>\n </ng-container>\n </nui-menu>\n </ng-container>\n <ng-template #transclusionContent>\n <ng-content></ng-content>\n </ng-template>\n</div>\n", styles: [".nui .nui-select--inline .nui-select__layout-block{display:inline-flex}.nui .nui-select .nui-button.menu-button{color:var(--nui-color-text-default,#111);min-width:100px;justify-content:space-between;padding-right:6px}.nui .nui-select .nui-button.menu-button.is-empty{justify-content:flex-end}.nui .nui-select .nui-button.menu-button:hover,.nui .nui-select .nui-button.menu-button:focus,.nui .nui-select .nui-button.menu-button:active,.nui .nui-select .nui-button.menu-button:active:hover{color:var(--nui-color-text-default,#111);transform:none;outline:none}.nui .nui-select .placeholder-displayed .nui-button.menu-button{color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));font-weight:400}.nui .nui-select .placeholder-displayed .nui-button.menu-button:hover,.nui .nui-select .placeholder-displayed .nui-button.menu-button:focus,.nui .nui-select .placeholder-displayed .nui-button.menu-button:active{color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6))}.nui .nui-select .disabled .nui-button.menu-button{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3));cursor:not-allowed}.nui .nui-select .disabled .nui-button.menu-button .nui-icon path,.nui .nui-select .disabled .nui-button.menu-button .nui-icon polygon{fill:var(--nui-color-icon-disabled,rgba(17, 17, 17, .3))}.nui .nui-select .disabled .nui-button.menu-button:hover,.nui .nui-select .disabled .nui-button.menu-button:focus,.nui .nui-select .disabled .nui-button.menu-button:active{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3));border-color:var(--nui-color-line-default,#d9d9d9);background-color:var(--nui-color-bg-transparent,transparent);box-shadow:none}.nui .nui-select .nui-menu-item .nui-menu-item__action{color:var(--nui-color-text-default,#111)}.nui .nui-select .nui-menu-item.item-selected .nui-menu-item__action{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111);font-weight:600}.nui .nui-select .nui-menu-item.item-selected .nui-menu-item__action:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui .nui-select .custom-template .nui-popup .nui-popup__area{width:auto}.nui .nui-select .nui-popup .nui-popup__area [popupAreaContent]{padding:0}.nui .nui-select .nui-popup .nui-popup__area{width:100%;min-width:160px;max-width:400px;height:100%;overflow-y:auto}.nui .nui-select .nui-select__menu{max-height:300px;overflow-y:auto;max-width:400px}.nui .nui-select .has-error .nui-button.menu-button{border-color:var(--nui-color-line-critical,#dd2c00)}.nui .nui-select .has-error .nui-button.menu-button:hover,.nui .nui-select .has-error .nui-button.menu-button:focus,.nui .nui-select .has-error .nui-button.menu-button:active{border-color:var(--nui-color-line-critical,#dd2c00)}.nui .nui-select--justified .custom-template .nui-popup .nui-popup__area{max-width:none;width:100%}.nui .nui-select--justified nui-menu{display:flex}.nui .nui-select--justified nui-menu .nui-popup{flex-grow:1;width:100%}.nui .nui-select--justified nui-menu .nui-popup-container{flex-grow:1;width:100%}.nui .nui-select--justified nui-menu .nui-popup-container .nui-popup__area{max-width:none}.nui .nui-select--justified nui-menu .nui-popup__content{width:100%}.nui .nui-select--justified nui-menu .nui-popup__content .menu-button{display:flex;flex-grow:1;max-width:none}@-moz-document url-prefix(){.nui .nui-select .nui-menu-item{padding-right:0}}\n"] }] }], ctorParameters: () => [{ type: i1.UtilService }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i2.LoggerService }], propDecorators: { appendToBody: [{ type: Input }], removeValueText: [{ type: Input }], secondaryAction: [{ type: Output }], isJustified: [{ type: HostBinding, args: ["class.nui-select--justified"] }], isInline: [{ type: HostBinding, args: ["class.nui-select--inline"] }], menu: [{ type: ViewChild, args: ["menu"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFJTCxNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsT0FBTyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFDO0FBQ2xDLE9BQU8sU0FBUyxNQUFNLGlCQUFpQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSww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QUNKLG9LQ25FTCxtdkVBeURBOzs0RkRjYSxlQUFlO2tCQW5CM0IsU0FBUzsrQkFDSSxZQUFZLFFBQ2hCLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxhQUVsQjt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQzs0QkFDOUMsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7d0JBQ0Q7NEJBQ0ksT0FBTyxFQUFFLG1CQUFtQjs0QkFDNUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7NEJBQzlDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKLGlCQUVjLGlCQUFpQixDQUFDLElBQUk7NkpBUzVCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csZUFBZTtzQkFBdkIsS0FBSztnQkFLSSxlQUFlO3NCQUF4QixNQUFNO2dCQU9ILFdBQVc7c0JBRGQsV0FBVzt1QkFBQyw2QkFBNkI7Z0JBTXRDLFFBQVE7c0JBRFgsV0FBVzt1QkFBQywwQkFBMEI7Z0JBS2IsSUFBSTtzQkFBN0IsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgX2RlYm91bmNlIGZyb20gXCJsb2Rhc2gvZGVib3VuY2VcIjtcbmltcG9ydCBfaXNFbXB0eSBmcm9tIFwibG9kYXNoL2lzRW1wdHlcIjtcbmltcG9ydCBfaXNOaWwgZnJvbSBcImxvZGFzaC9pc05pbFwiO1xuaW1wb3J0IF90b1N0cmluZyBmcm9tIFwibG9kYXNoL3RvU3RyaW5nXCI7XG5cbmltcG9ydCB7IEJhc2VTZWxlY3QgfSBmcm9tIFwiLi9iYXNlLXNlbGVjdFwiO1xuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9sb2ctc2VydmljZVwiO1xuaW1wb3J0IHsgVXRpbFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvdXRpbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOdWlGb3JtRmllbGRDb250cm9sIH0gZnJvbSBcIi4uL2Zvcm0tZmllbGQvcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgTWVudUNvbXBvbmVudCB9IGZyb20gXCIuLi9tZW51XCI7XG5cbi8vIDxleGFtcGxlLXVybD4uLy4uL2V4YW1wbGVzL2luZGV4Lmh0bWwjL3NlbGVjdDwvZXhhbXBsZS11cmw+XG4vKipcbiAqIEBkZXByZWNhdGVkIGluIHYxMSAtIFVzZSBTZWxlY3RWMkNvbXBvbmVudCBpbnN0ZWFkIC0gUmVtb3ZhbDogTlVJLTU3OTZcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLXNlbGVjdFwiLFxuICAgIGhvc3Q6IHsgY2xhc3M6IFwibnVpLXNlbGVjdFwiIH0sXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9zZWxlY3QuY29tcG9uZW50Lmh0bWxcIixcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTZWxlY3RDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE51aUZvcm1GaWVsZENvbnRyb2wsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTZWxlY3RDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBzdHlsZVVybHM6IFtcIi4vc2VsZWN0LmNvbXBvbmVudC5sZXNzXCJdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudFxuICAgIGV4dGVuZHMgQmFzZVNlbGVjdFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveVxue1xuICAgIC8qKlxuICAgICAqIEEgdmFsdWUgdGhhdCB0ZWxscyBwb3B1cCB0byBiZSBhdHRhY2hlZCByaWdodCBhZnRlciBpdCdzIHBhcmVudCBkZWNsYXJhdGlvbiBvciBpbiA8Ym9keT5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBhcHBlbmRUb0JvZHk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJbnB1dCB0aGF0IGluZGljYXRlcyB0ZXh0IHdoaWNoIGlzIGRpc3BsYXllZCBpZiBcImlzUmVtb3ZlVmFsdWVFbmFibGVkXCIgc2V0IHRvIHRydWVcbiAgICAgKi9cbiAgICBASW5wdXQoKSByZW1vdmVWYWx1ZVRleHQ6IHN0cmluZyA9IFwiVW5zcGVjaWZpZWRcIjtcblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIGV2ZW50IHRoYXQgcHJvdmlkZXMgc3BsaXQtYnV0dG9uIGJlaGF2aW9yIGFuZCBpbnRlcmFjdGlvbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgc2Vjb25kYXJ5QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBwcml2YXRlIGRlYm91bmNlZEJsdXIgPSBfZGVib3VuY2UoKCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUJsdXIoKTtcbiAgICB9LCAzMDApO1xuXG4gICAgQEhvc3RCaW5kaW5nKFwiY2xhc3MubnVpLXNlbGVjdC0tanVzdGlmaWVkXCIpXG4gICAgZ2V0IGlzSnVzdGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5qdXN0aWZpZWQ7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKFwiY2xhc3MubnVpLXNlbGVjdC0taW5saW5lXCIpXG4gICAgZ2V0IGlzSW5saW5lKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmxpbmU7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZChcIm1lbnVcIikgcHVibGljIG1lbnU6IE1lbnVDb21wb25lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIHB1YmxpYyBlbFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIodXRpbFNlcnZpY2UpO1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgXCI8bnVpLXNlbGVjdD4gaXMgZGVwcmVjYXRlZCBhcyBvZiBOb3ZhIHYxMS4gUGxlYXNlIHVzZSA8bnVpLXNlbGVjdC12Mj4gaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgdW5zdWJzY3JpYmVyOiAoKSA9PiB2b2lkO1xuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKFxuICAgICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgXCJmb2N1c291dFwiLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEJsdXIgaXMgZGVib3VuY2VkIGNhdXNlIHdoZW4geW91IGNsaWNrIG9uIG1lbnUgaXRlbSBibHVyIGlzIHRyaWdnZXJlZCB0d2ljZTogZnJvbSB0ZXh0Ym94IGFuZCB3aGVuIHBvcHVwIGlzIGNsb3NlZC5cbiAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlZEJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcGxheVBsYWNlaG9sZGVyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIV9pc05pbCh0aGlzLnBsYWNlaG9sZGVyKSAmJiBfaXNFbXB0eSh0aGlzLmdldFNlbGVjdGVkSXRlbSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcGxheWVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheVBsYWNlaG9sZGVyKClcbiAgICAgICAgICAgID8gdGhpcy5wbGFjZWhvbGRlclxuICAgICAgICAgICAgOiBfdG9TdHJpbmcodGhpcy5nZXREaXNwbGF5VmFsdWVGb3JtYXR0ZWQodGhpcy5nZXRTZWxlY3RlZEl0ZW0oKSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLnNlbGVjdGVkSXRlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFdpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIC8vIHdoZW4gYXBwZW5kVG9Cb2R5PXRydWUgcG9wdXAgZ29lcyB0byBib2R5LCBzbyBpdCdzIG91dCBvZiBudWktc2VsZWN0IGFuZCBpdCdzIHdpZHRoIG5lZWRzIHRvIGJlIHNldCBleHBsaWNpdGx5XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGVuZFRvQm9keSB8fCB0aGlzLmlzSnVzdGlmaWVkXG4gICAgICAgICAgICA/IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCArIFwicHhcIlxuICAgICAgICAgICAgOiBcIlwiO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudW5zdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlcigpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwibnVpLXNlbGVjdF9fbGF5b3V0LWJsb2NrXCJcbiAgICBbY2xhc3MucGxhY2Vob2xkZXItZGlzcGxheWVkXT1cImRpc3BsYXlQbGFjZWhvbGRlcigpXCJcbiAgICBbY2xhc3MuY3VzdG9tLXRlbXBsYXRlXT1cImN1c3RvbVRlbXBsYXRlXCJcbiAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1zU291cmNlOyBlbHNlIHRyYW5zY2x1c2lvbkNvbnRlbnRcIj5cbiAgICAgICAgPG51aS1tZW51XG4gICAgICAgICAgICAjbWVudVxuICAgICAgICAgICAgW2NsYXNzLmhhcy1lcnJvcl09XCJpc0luRXJyb3JTdGF0ZVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiZGlzcGxheWVkVmFsdWUoKVwiXG4gICAgICAgICAgICBbaXNEaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgICAgICAgICAgIFthcHBlbmRUb0JvZHldPVwiYXBwZW5kVG9Cb2R5XCJcbiAgICAgICAgICAgIFt3aWR0aE9mUG9wdXBdPVwiZ2V0V2lkdGgoKVwiXG4gICAgICAgICAgICBbY29udGV4dENsYXNzXT1cIlxuICAgICAgICAgICAgICAgIChqdXN0aWZpZWQgPyAnbnVpLXNlbGVjdC0tanVzdGlmaWVkICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICdudWktc2VsZWN0LXBvcHVwLWhvc3QnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bnVpLW1lbnUtYWN0aW9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc1JlbW92ZVZhbHVlRW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgKGFjdGlvbkRvbmUpPVwic2VsZWN0KG51bGwpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyByZW1vdmVWYWx1ZVRleHQgfX1cbiAgICAgICAgICAgIDwvbnVpLW1lbnUtYWN0aW9uPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1NvdXJjZVwiPlxuICAgICAgICAgICAgICAgIDxudWktbWVudS1hY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXRlbS5pdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pdGVtLXNlbGVjdGVkXT1cImlzSXRlbVNlbGVjdGVkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGFjdGlvbkRvbmUpPVwic2VsZWN0KGl0ZW0pXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tVGVtcGxhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SXRlbURpc3BsYXkoaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY29udGV4dDogaXRlbSB9XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L251aS1tZW51LWFjdGlvbj5cbiAgICAgICAgICAgICAgICA8bnVpLW1lbnUtZ3JvdXAgKm5nSWY9XCJpdGVtLml0ZW1zXCIgW2hlYWRlcl09XCJpdGVtLmhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bnVpLW1lbnUtYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXBlZEl0ZW0gb2YgaXRlbS5pdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXRlbS1zZWxlY3RlZF09XCJpc0l0ZW1TZWxlY3RlZChncm91cGVkSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbkRvbmUpPVwic2VsZWN0KGdyb3VwZWRJdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEl0ZW1EaXNwbGF5KGdyb3VwZWRJdGVtKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L251aS1tZW51LWFjdGlvbj5cbiAgICAgICAgICAgICAgICA8L251aS1tZW51LWdyb3VwPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbnVpLW1lbnU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICN0cmFuc2NsdXNpb25Db250ZW50PlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19