UNPKG

ngx-pluto

Version:
694 lines 59.4 kB
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import { Component, Input, ViewContainerRef, Output, EventEmitter, ContentChild, forwardRef, ChangeDetectorRef, ChangeDetectionStrategy, Renderer2, ViewChild } from '@angular/core';
// import { OverlayService } from '../common';
import { NpDropdownItemDirective } from './dropdown-item.directive';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { OverlayService } from '../common/overlay.service';
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
/**
 * 下拉选择组件 - 支持单选和多选功能
 *
 * <example-url>https://stackblitz.com/edit/np-dropdown-sample?embed=1&file=src/app/app.component.html</example-url>
 *
 */
export class NpDropdown {
    //#endregion
    /**
     * @param {?} viewContainerRef
     * @param {?} overlayService
     * @param {?} cdf
     * @param {?} renderer2
     */
    constructor(viewContainerRef, overlayService, cdf, renderer2) {
        this.viewContainerRef = viewContainerRef;
        this.overlayService = overlayService;
        this.cdf = cdf;
        this.renderer2 = renderer2;
        this.emitChange = (/**
         * @param {?} _
         * @return {?}
         */
        (_) => { });
        /**
         * 是否禁用状态
         */
        this.disabled = false;
        /**
         * 全部下拉选项
         */
        this.items = [];
        /**
         * 选择时触发
         */
        this.onSelected = new EventEmitter();
        /**
         * 取消选择时触发
         */
        this.onDeselected = new EventEmitter();
        /**
         * 全选时触发
         */
        this.onSelectedAll = new EventEmitter();
        /**
         * 取消全选时触发
         */
        this.onDeselectedAll = new EventEmitter();
        this.originItems = [];
        /**
         * 多选下拉框
         */
        this.selectedItems = [];
        this.selectedBadgeItems = [];
        this.noneBadgeCount = 0;
        this._isCheckedAll = false;
    }
    //#region Getter
    /**
     * 单选下拉框
     * @return {?}
     */
    get selectedLabel() {
        this.checkItemExists();
        if (this.settings.single) {
            return this.selectedItem ? ((/** @type {?} */ (this.selectedItem))).label : this.settings.placeHolder;
        }
        return this.settings.placeHolder;
    }
    /**
     * @private
     * @return {?}
     */
    buildMultipleSelect() {
        if (this.settings.single) {
            return;
        }
        //#region selectedItems
        this.checkItemExists();
        /** @type {?} */
        let selectedItems = (/** @type {?} */ (this.selectedItem));
        if (selectedItems && selectedItems.length > 0) {
            this.selectedItems = [...selectedItems];
        }
        else {
            this.selectedItems = [{ id: -1, label: this.settings.placeHolder }];
        }
        //#endregion
        //#region selectedBadgeItems
        /** @type {?} */
        let items = [...this.selectedItems];
        items.splice(this.settings.badge);
        this.selectedBadgeItems = items;
        //#endregion
        this.noneBadgeCount = this.selectedItems.length - this.settings.badge;
        this.cdf.detectChanges();
    }
    /**
     * @return {?}
     */
    get isDropdownOpen() {
        return this.overlayService.isAttached();
    }
    /**
     * @return {?}
     */
    get isItemSelected() {
        if (this.settings.single) {
            return this.selectedLabel !== this.settings.placeHolder;
        }
        // Multiple dropdown
        if (this.selectedItems && this.selectedItems.length > 0) {
            return this.selectedItems[0].label !== this.settings.placeHolder;
        }
        return false;
    }
    /**
     * @return {?}
     */
    get isCheckedAll() {
        return this.items.length === this.selectedItem.length;
    }
    /**
     * @param {?} val
     * @return {?}
     */
    set isCheckedAll(val) {
        this._isCheckedAll = val;
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.init();
    }
    /**
     * @param {?} changes
     * @return {?}
     */
    ngOnChanges(changes) {
        /** @type {?} */
        let items = changes['items'];
        if (items && items.currentValue && items.currentValue.length >= 0) {
            this.originItems = [...items.currentValue];
        }
    }
    /**
     * @param {?} checked
     * @return {?}
     */
    onSelectAll(checked) {
        this.items.forEach((/**
         * @param {?} item
         * @return {?}
         */
        item => {
            item.checked = checked;
        }));
        this.selectedItem = checked ? [...this.items] : [];
        this.buildMultipleSelect();
        this.onSelectedAll.emit(this.selectedItem);
        this.emitChange(this.selectedItem);
    }
    /**
     * @param {?} item
     * @return {?}
     */
    onSelect(item) {
        if (this.settings.single) {
            this.selectedItem = item;
            this.onSelected.emit(item);
            this.emitChange(item);
            this.cdf.detectChanges();
            this.overlayService.close({ item: item });
            return;
        }
        //#region Multiple dropdown
        if (!this.selectedItem || !this.selectedItem.length) {
            this.selectedItem = [];
        }
        if (item.checked) {
            this.selectedItem.push(item);
        }
        else {
            this.selectedItem = this.selectedItem.filter((/**
             * @param {?} f
             * @return {?}
             */
            (f) => f.id !== item.id));
        }
        this.buildMultipleSelect();
        this.onSelected.emit(item);
        this.emitChange(this.selectedItem);
        //#endregion
    }
    /**
     * @param {?} val
     * @return {?}
     */
    onSearch(val) {
        if (!val) {
            this.clearSearch();
            return;
        }
        this.items = this.originItems.filter((/**
         * @param {?} f
         * @return {?}
         */
        f => f.label.indexOf(val) > -1));
    }
    /**
     * @param {?} item
     * @return {?}
     */
    isActive(item) {
        if (!this.selectedItem) {
            return false;
        }
        if (this.settings.single) {
            return item.id === ((/** @type {?} */ (this.selectedItem))).id;
        }
        // Multiple dropdown
        return this.selectedItem.find((/**
         * @param {?} f
         * @return {?}
         */
        f => f.id === item.id));
    }
    /**
     * @param {?} $event
     * @param {?} dropdownTpl
     * @param {?} origin
     * @return {?}
     */
    onOpenDropdown($event, dropdownTpl, origin) {
        $event.stopPropagation();
        if (this.disabled) {
            return;
        }
        if (this.isDropdownOpen) {
            this.overlayService.close(null);
            return;
        }
        this.overlayService.openDropdown(origin, dropdownTpl, this.viewContainerRef, null).subscribe((/**
         * @return {?}
         */
        () => {
            // close
        }));
        this.buildItemsCheckedStatus();
        setTimeout((/**
         * @return {?}
         */
        () => {
            this.scrollToSelectedItem();
        }), 100);
        // Tricky... Can't get inner element in np-input control, so we need set
        // style async after open dropdown
        setTimeout((/**
         * @return {?}
         */
        () => {
            if (!this.overlayService.overlayRef || !this.overlayService.overlayRef.overlayElement) {
                return;
            }
            /** @type {?} */
            let npInputWrapper = this.overlayService.overlayRef.overlayElement.getElementsByClassName('np-input-wrapper');
            /** @type {?} */
            let inputContainer = this.overlayService.overlayRef.overlayElement.getElementsByClassName('input-container');
            /** @type {?} */
            let npInput = this.overlayService.overlayRef.overlayElement.getElementsByClassName('np-input');
            if (npInputWrapper && npInputWrapper.length > 0) {
                this.renderer2.setStyle(npInputWrapper[0], 'width', '100%');
            }
            if (inputContainer && inputContainer.length > 0) {
                this.renderer2.setStyle(inputContainer[0], 'width', '100%');
            }
            if (npInput && npInput.length > 0) {
                this.renderer2.setStyle(npInput[0], 'width', this.settings.width + 'px');
                this.renderer2.setStyle(npInput[0], 'padding-left', '30px');
                this.renderer2.setStyle(npInput[0], 'border-top', 'none');
                this.renderer2.setStyle(npInput[0], 'border-left', 'none');
                this.renderer2.setStyle(npInput[0], 'border-right', 'none');
                this.renderer2.setStyle(npInput[0], 'box-shadow', 'none');
            }
        }), 0);
    }
    /**
     * @param {?} $event
     * @return {?}
     */
    onRemoveItems($event) {
        if (this.disabled) {
            return;
        }
        this.selectedItem = this.settings.single ? null : [];
        this.clearSearch();
        this.items.forEach((/**
         * @param {?} item
         * @return {?}
         */
        item => {
            item.checked = false;
        }));
        this.buildMultipleSelect();
        this.onDeselectedAll.emit(this.items);
        this.emitChange(this.selectedItem);
        $event.stopPropagation();
    }
    /**
     * @param {?} $event
     * @param {?} item
     * @return {?}
     */
    onRemoveItem($event, item) {
        if (this.disabled) {
            return;
        }
        this.selectedItem = this.selectedItem.filter((/**
         * @param {?} f
         * @return {?}
         */
        (f) => f.id !== item.id));
        this.clearSearch();
        item.checked = false;
        this.buildMultipleSelect();
        this.onDeselected.emit(item);
        this.emitChange(this.selectedItem);
        $event.stopPropagation();
    }
    //#region Implementation for ControlValueAccessor
    /**
     * @param {?} obj
     * @return {?}
     */
    writeValue(obj) {
        // 如果是多选下拉框,传入的selectedItem是null,为了防止报错直接return,必须传入空数组[]
        if (obj === null && !this.settings.single) {
            return;
        }
        this.selectedItem = obj;
        if (this.settings.single) {
            this.cdf.detectChanges();
        }
        else {
            this.selectedItem.forEach((/**
             * @param {?} item
             * @return {?}
             */
            item => {
                if (item.checked === undefined) {
                    item.checked = true;
                }
            }));
            this.buildMultipleSelect();
        }
    }
    /**
     * @param {?} fn
     * @return {?}
     */
    registerOnChange(fn) {
        this.emitChange = fn;
    }
    /**
     * @param {?} fn
     * @return {?}
     */
    registerOnTouched(fn) { }
    //#endregion
    //#region Private methods
    /**
     * @private
     * @return {?}
     */
    init() {
        this.originItems = [...this.items];
        /** @type {?} */
        let initSettings = {
            single: true,
            placeHolder: '请选择',
            width: 220,
            badge: 99999,
            isShowSearchBox: true,
            noData: '没有数据!',
            autoScrollTo: true
        };
        this.settings = Object.assign(initSettings, this.settings);
    }
    /**
     * @private
     * @return {?}
     */
    checkItemExists() {
        if (this.settings.single) {
            if (this.selectedItem && !this.originItems.find((/**
             * @param {?} f
             * @return {?}
             */
            f => f.id === ((/** @type {?} */ (this.selectedItem))).id))) {
                this.selectedItem = null;
            }
        }
        else {
            // Multiple dropdown
            if (this.selectedItem && this.selectedItem.length > 0) {
                /** @type {?} */
                let selectedItems = [];
                this.selectedItem.forEach((/**
                 * @param {?} item
                 * @return {?}
                 */
                (item) => {
                    if (this.originItems.find((/**
                     * @param {?} f
                     * @return {?}
                     */
                    f => f.id === item.id))) {
                        selectedItems.push(item);
                    }
                }));
                this.selectedItem = [];
                this.selectedItem = selectedItems;
            }
        }
    }
    /**
     * 清除查询并展示所有符合条件的items
     * @private
     * @return {?}
     */
    clearSearch() {
        this.searchToken = '';
        this.items = [...this.originItems];
        this.buildItemsCheckedStatus();
    }
    /**
     * @private
     * @return {?}
     */
    buildItemsCheckedStatus() {
        if (this.settings.single) {
            return;
        }
        this.items.forEach((/**
         * @param {?} item
         * @return {?}
         */
        item => {
            /** @type {?} */
            let selectedItem = this.selectedItem.find((/**
             * @param {?} f
             * @return {?}
             */
            f => f.id === item.id));
            item.checked = selectedItem ? true : false;
        }));
    }
    /**
     * @private
     * @return {?}
     */
    scrollToSelectedItem() {
        if (!this.settings.autoScrollTo) {
            return;
        }
        /** @type {?} */
        let item = this.settings.single ? ((/** @type {?} */ (this.selectedItem))) : (this.selectedItem && this.selectedItem[0]);
        if (item) {
            /** @type {?} */
            const selectedIndex = this.originItems.findIndex((/**
             * @param {?} f
             * @return {?}
             */
            f => f.id === item.id));
            this.viewPort.scrollToIndex(selectedIndex, 'smooth');
        }
    }
}
NpDropdown.decorators = [
    { type: Component, args: [{
                selector: `np-dropdown`,
                template: "<div class=\"np-dropdown-wrapper flex-wrap row-flex\">\r\n  <label class=\"select-lbl\" *ngIf=\"settings.lblName\">{{ settings.lblName }}</label>\r\n  <div class=\"selected-item-wrapper\" [style.width.px]=\"settings.width\" [ngClass]=\"{'disabled': disabled}\"\r\n    (click)=\"onOpenDropdown($event, dropdown, origin)\" #origin tabindex=\"-1\">\r\n    <!-- Single select -->\r\n    <ng-container *ngIf=\"settings.single\">\r\n      <span [ngClass]=\"{'placeholder': !isItemSelected}\">{{ selectedLabel }}</span>\r\n    </ng-container>\r\n\r\n    <!-- Multiple select -->\r\n    <ng-container *ngIf=\"!settings.single\">\r\n      <div class=\"mul-item-container\">\r\n        <ng-container *ngIf=\"!isItemSelected && selectedItems[0]\"><span\r\n            class=\"placeholder\">{{ selectedItems[0].label }}</span>\r\n        </ng-container>\r\n        <ng-container *ngIf=\"isItemSelected\">\r\n          <span class=\"mul-item\" *ngFor=\"let selectedItem of selectedBadgeItems; let i=index;\">\r\n            <ng-container>\r\n              <span>{{ selectedItem.label }}</span>&nbsp;&nbsp;\r\n              <i class=\"fas fa-times\" *ngIf=\"isItemSelected\" (click)=\"onRemoveItem($event, selectedItem)\"></i>\r\n            </ng-container>\r\n          </span>\r\n        </ng-container>\r\n      </div>\r\n    </ng-container>\r\n    <span class=\"none-badge-count\" *ngIf=\"noneBadgeCount > 0\">{{ '+' + noneBadgeCount }}</span>\r\n    <i class=\"fas fa-times\" *ngIf=\"!settings.isRequired && isItemSelected\" (click)=\"onRemoveItems($event)\"></i>\r\n    <i class=\"fas fa-caret-down\" *ngIf=\"!isDropdownOpen\"></i>\r\n    <i class=\"fas fa-caret-up\" *ngIf=\"isDropdownOpen\"></i>\r\n  </div>\r\n\r\n  <ng-template #dropdown>\r\n    <div class=\"np-dropdown-viewport flex-wrap col-flex\">\r\n      <div class=\"search-container\" *ngIf=\"settings.isShowSearchBox\">\r\n        <np-input class=\"search-input\" placeholder=\"\u67E5\u8BE2\" [(ngModel)]=\"searchToken\" (ngModelChange)=\"onSearch($event)\">\r\n        </np-input>\r\n        <i class=\"fas fa-search\"></i>\r\n      </div>\r\n      <np-checkbox class=\"select-all\" *ngIf=\"settings.isShowCheckedAll && !settings.single\" [(ngModel)]=\"isCheckedAll\"\r\n        (inputModelChange)=\"onSelectAll($event)\">\u5168\u9009\r\n      </np-checkbox>\r\n      <cdk-virtual-scroll-viewport itemSize=\"35\" [style.width.px]=\"settings.width\" #virtualScrollViewport>\r\n        <div *ngIf=\"!items || !items.length || items.length === 0\">{{ settings.noData }}</div>\r\n\r\n        <!-- Single select -->\r\n        <ng-container *ngIf=\"settings.single\">\r\n          <div *cdkVirtualFor=\"let item of items\" [class.active]=\"isActive(item)\" class=\"select-item\"\r\n            (click)=\"onSelect(item)\">\r\n            <ng-container *ngIf=\"!selectItemRef || !selectItemRef.template\">{{ item.label }}</ng-container>\r\n            <ng-container *ngIf=\"selectItemRef && selectItemRef.template\">\r\n              <ng-container *ngTemplateOutlet=\"selectItemRef.template; context: { item: item }\">\r\n              </ng-container>\r\n            </ng-container>\r\n          </div>\r\n        </ng-container>\r\n\r\n        <!-- Multiple select -->\r\n        <ng-container *ngIf=\"!settings.single\">\r\n          <div *cdkVirtualFor=\"let item of items\" [class.active]=\"isActive(item)\"\r\n            class=\"select-item flex-wrap row-flex\">\r\n            <np-checkbox [(ngModel)]=\"item.checked\" (inputModelChange)=\"onSelect(item)\">\r\n              <div style=\"width: 100%;\">\r\n                <ng-container *ngIf=\"!selectItemRef || !selectItemRef.template\">\r\n                  {{ item.label }}\r\n                </ng-container>\r\n                <ng-container *ngIf=\"selectItemRef && selectItemRef.template\">\r\n                  <ng-container *ngTemplateOutlet=\"selectItemRef.template; context: { item: item }\">\r\n                  </ng-container>\r\n                </ng-container>\r\n              </div>\r\n            </np-checkbox>\r\n          </div>\r\n        </ng-container>\r\n      </cdk-virtual-scroll-viewport>\r\n    </div>\r\n  </ng-template>\r\n</div>\r\n",
                changeDetection: ChangeDetectionStrategy.OnPush,
                host: {
                    '[class.disabled]': 'disabled === "true" || disabled === true'
                },
                providers: [
                    {
                        provide: NG_VALUE_ACCESSOR,
                        useExisting: forwardRef((/**
                         * @return {?}
                         */
                        () => NpDropdown)),
                        multi: true,
                    }
                ],
                styles: [".np-dropdown-wrapper{position:relative;align-items:baseline;display:inline-block}.np-dropdown-wrapper .select-lbl{margin-right:20px;font-size:13px;font-weight:700}.np-dropdown-wrapper .selected-item-wrapper{box-sizing:content-box;display:inline-block;min-width:80px;padding:7.5px 6px;cursor:pointer;border-radius:3px;border-width:1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0;font-size:13px}.np-dropdown-wrapper .selected-item-wrapper>.fas.fa-caret-down,.np-dropdown-wrapper .selected-item-wrapper>.fas.fa-caret-up{position:absolute;right:8px;line-height:20px}.np-dropdown-wrapper .selected-item-wrapper>.fas.fa-times{position:absolute;right:23px;line-height:20px;font-size:13px;padding:0 5px}.np-dropdown-wrapper .selected-item-wrapper>.none-badge-count{position:absolute;right:38px;line-height:20px;padding:0 5px}.np-dropdown-wrapper .selected-item-wrapper .mul-item-container{display:inline-block}.np-dropdown-wrapper .selected-item-wrapper .mul-item-container .mul-item{padding:2px 5px;margin-right:2px}.np-dropdown-wrapper .selected-item-wrapper .mul-item-container .mul-item .fas.fa-times{font-size:10px}.np-dropdown-viewport{min-width:80px;padding:0 6px;height:300px;border-radius:3px}.np-dropdown-viewport .search-container{display:flex;position:relative}.np-dropdown-viewport .search-container .fas.fa-search{position:absolute;left:12px;top:0;line-height:50px;font-size:14px}.np-dropdown-viewport .search-input{width:100%;margin-bottom:5px;margin-top:8px}.np-dropdown-viewport .search-input .input-container,.np-dropdown-viewport .search-input .np-input-wrapper,.np-dropdown-viewport .search-input input{width:100%!important}.np-dropdown-viewport .select-all{margin:6px}.np-dropdown-viewport>cdk-virtual-scroll-viewport{height:100%;margin-top:8px}.np-dropdown-viewport>cdk-virtual-scroll-viewport .select-item{height:28px;line-height:28px;padding:3px 6px;font-size:13px;cursor:pointer;align-items:center;margin-bottom:1px;box-sizing:content-box;white-space:nowrap}.np-dropdown-viewport>cdk-virtual-scroll-viewport .select-item>np-checkbox{margin-right:3px}.np-dropdown-viewport>cdk-virtual-scroll-viewport .select-item .np-checkbox-button-wrapper{margin:0!important}.np-dropdown-viewport>cdk-virtual-scroll-viewport .select-item .np-checkbox-button-wrapper span.input-helper{top:6px}"]
            }] }
];
/** @nocollapse */
NpDropdown.ctorParameters = () => [
    { type: ViewContainerRef },
    { type: OverlayService },
    { type: ChangeDetectorRef },
    { type: Renderer2 }
];
NpDropdown.propDecorators = {
    disabled: [{ type: Input }],
    settings: [{ type: Input }],
    items: [{ type: Input }],
    selectedItem: [{ type: Input }],
    onSelected: [{ type: Output }],
    onDeselected: [{ type: Output }],
    onSelectedAll: [{ type: Output }],
    onDeselectedAll: [{ type: Output }],
    selectItemRef: [{ type: ContentChild, args: [NpDropdownItemDirective,] }],
    viewPort: [{ type: ViewChild, args: ['virtualScrollViewport',] }]
};
if (false) {
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.emitChange;
    /**
     * 是否禁用状态
     * @type {?}
     */
    NpDropdown.prototype.disabled;
    /**
     * 下拉组件的基础设置,如是否单选等
     * @type {?}
     */
    NpDropdown.prototype.settings;
    /**
     * 全部下拉选项
     * @type {?}
     */
    NpDropdown.prototype.items;
    /**
     * 已选项 - 单选为一个对象, 多选则为一组数组
     * @type {?}
     */
    NpDropdown.prototype.selectedItem;
    /**
     * 选择时触发
     * @type {?}
     */
    NpDropdown.prototype.onSelected;
    /**
     * 取消选择时触发
     * @type {?}
     */
    NpDropdown.prototype.onDeselected;
    /**
     * 全选时触发
     * @type {?}
     */
    NpDropdown.prototype.onSelectedAll;
    /**
     * 取消全选时触发
     * @type {?}
     */
    NpDropdown.prototype.onDeselectedAll;
    /** @type {?} */
    NpDropdown.prototype.selectItemRef;
    /** @type {?} */
    NpDropdown.prototype.viewPort;
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.originItems;
    /**
     * 查询Token
     * @type {?}
     */
    NpDropdown.prototype.searchToken;
    /**
     * 多选下拉框
     * @type {?}
     */
    NpDropdown.prototype.selectedItems;
    /** @type {?} */
    NpDropdown.prototype.selectedBadgeItems;
    /** @type {?} */
    NpDropdown.prototype.noneBadgeCount;
    /** @type {?} */
    NpDropdown.prototype._isCheckedAll;
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.viewContainerRef;
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.overlayService;
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.cdf;
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.renderer2;
}
/**
 * @record
 */
export function NpDropdownSettings() { }
if (false) {
    /**
     * Left side label name
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.lblName;
    /**
     * Set if it is single dropdown, default is true - single dropdown
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.single;
    /**
     * Check if it is required. if not, show remove icon, otherwise hide the remove icon
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.isRequired;
    /**
     * Placeholder for dropdown
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.placeHolder;
    /**
     * Set the width of dropdown, default is 220, unit px
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.width;
    /**
     * Display badge count, default is 99999
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.badge;
    /**
     * 是否展示全选按钮
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.isShowCheckedAll;
    /**
     * 是否默认全选
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.isCheckedAll;
    /**
     * 没有数据时展示的文案,默认为‘没有数据!’
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.noData;
    /**
     * 是否显示搜索框,默认展示
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.isShowSearchBox;
    /**
     * 当下拉框有已选项,单选时,打开下拉框会自动滚动到已选项;当为多选时,打开下拉框会自动滚动到已选项的第一项;默认打开为true
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.autoScrollTo;
}
/**
 * @record
 */
export function NpDropdownItem() { }
if (false) {
    /** @type {?} */
    NpDropdownItem.prototype.id;
    /** @type {?} */
    NpDropdownItem.prototype.label;
    /* Skipping unhandled member: [key: string]: any;*/
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZHJvcGRvd24vZHJvcGRvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFlLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBaUIsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFek4sT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7OztBQXVCbEUsTUFBTSxPQUFPLFVBQVU7Ozs7Ozs7O0lBc0dyQixZQUFvQixnQkFBa0MsRUFDNUMsY0FBOEIsRUFDOUIsR0FBc0IsRUFDdEIsU0FBb0I7UUFIVixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQzVDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBeEd0QixlQUFVOzs7O1FBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBQzs7OztRQUc1QixhQUFRLEdBQVEsS0FBSyxDQUFDOzs7O1FBTXRCLFVBQUssR0FBMEIsRUFBRSxDQUFDOzs7O1FBTWpDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBMEMsQ0FBQzs7OztRQUV4RSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUEwQyxDQUFDOzs7O1FBRTFFLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQTBDLENBQUM7Ozs7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O0lBQy9DLG9DQUEyQjs7SUE2QzNCLG1DQUErQjs7Ozs7SUFVbkIsc0NBQTBDOzs7OztJQUNwRCxvQ0FBc0M7Ozs7O0lBQ3RDLHlCQUE4Qjs7Ozs7SUFDOUIsK0JBQTRCOzs7OztBQWdRaEMsd0NBaUNDOzs7Ozs7SUEvQkMscUNBQWlCOzs7OztJQUdqQixvQ0FBaUI7Ozs7O0lBR2pCLHdDQUFxQjs7Ozs7SUFHckIseUNBQXFCOzs7OztJQUdyQixtQ0FBZTs7Ozs7SUFHZixtQ0FBZTs7Ozs7SUFHZiw4Q0FBMkI7Ozs7O0lBRzNCLDBDQUF1Qjs7Ozs7SUFHdkIsb0NBQWdCOzs7OztJQUdoQiw2Q0FBMEI7Ozs7O0lBRzFCLDBDQUF1Qjs7Ozs7QUFHekIsb0NBSUM7OztJQUhDLDRCQUFvQjs7SUFDcEIsK0JBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29udGVudENoaWxkLCBmb3J3YXJkUmVmLCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIFJlbmRlcmVyMiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbi8vIGltcG9ydCB7IE92ZXJsYXlTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uJztcclxuaW1wb3J0IHsgTnBEcm9wZG93bkl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL2Ryb3Bkb3duLWl0ZW0uZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPdmVybGF5U2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9vdmVybGF5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcclxuXHJcbi8qKlxyXG4gKiDkuIvmi4npgInmi6nnu4Tku7YgLSDmlK/mjIHljZXpgInlkozlpJrpgInlip/og71cclxuICogXHJcbiAqIDxleGFtcGxlLXVybD5odHRwczovL3N0YWNrYmxpdHouY29tL2VkaXQvbnAtZHJvcGRvd24tc2FtcGxlP2VtYmVkPTEmZmlsZT1zcmMvYXBwL2FwcC5jb21wb25lbnQuaHRtbDwvZXhhbXBsZS11cmw+XHJcbiAqIFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IGBucC1kcm9wZG93bmAsXHJcbiAgdGVtcGxhdGVVcmw6ICdkcm9wZG93bi5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnZHJvcGRvd24uc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGhvc3Q6IHtcclxuICAgICdbY2xhc3MuZGlzYWJsZWRdJzogJ2Rpc2FibGVkID09PSBcInRydWVcIiB8fCBkaXNhYmxlZCA9PT0gdHJ1ZSdcclxuICB9LFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBEcm9wZG93biksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE5wRHJvcGRvd24gaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBwcml2YXRlIGVtaXRDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gIC8qKuaYr+WQpuemgeeUqOeKtuaAgSAqL1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBhbnkgPSBmYWxzZTtcclxuXHJcbiAgLyoq5LiL5ouJ57uE5Lu255qE5Z+656GA6K6+572u77yM5aaC5piv5ZCm5Y2V6YCJ562JICovXHJcbiAgQElucHV0KCkgc2V0dGluZ3M6IE5wRHJvcGRvd25TZXR0aW5ncztcclxuXHJcbiAgLyoq5YWo6YOo5LiL5ouJ6YCJ6aG5ICovXHJcbiAgQElucHV0KCkgaXRlbXM6IEFycmF5PE5wRHJvcGRvd25JdGVtPiA9IFtdO1xyXG5cclxuICAvKirlt7LpgInpobkgLSDljZXpgInkuLrkuIDkuKrlr7nosaHvvIwg5aSa6YCJ5YiZ5Li65LiA57uE5pWw57uEICovXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtOiBOcERyb3Bkb3duSXRlbSB8IEFycmF5PE5wRHJvcGRvd25JdGVtPjtcclxuXHJcbiAgLyoq6YCJ5oup5pe26Kem5Y+RICovXHJcbiAgQE91dHB1dCgpIG9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE5wRHJvcGRvd25JdGVtIHwgQXJyYXk8TnBEcm9wZG93bkl0ZW0+PigpO1xyXG4gIC8qKuWPlua2iOmAieaLqeaXtuinpuWPkSAqL1xyXG4gIEBPdXRwdXQoKSBvbkRlc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE5wRHJvcGRvd25JdGVtIHwgQXJyYXk8TnBEcm9wZG93bkl0ZW0+PigpO1xyXG4gIC8qKuWFqOmAieaXtuinpuWPkSAqL1xyXG4gIEBPdXRwdXQoKSBvblNlbGVjdGVkQWxsID0gbmV3IEV2ZW50RW1pdHRlcjxOcERyb3Bkb3duSXRlbSB8IEFycmF5PE5wRHJvcGRvd25JdGVtPj4oKTtcclxuICAvKirlj5bmtojlhajpgInml7bop6blj5EgKi9cclxuICBAT3V0cHV0KCkgb25EZXNlbGVjdGVkQWxsID0gbmV3IEV2ZW50RW1pdHRlcjxOcERyb3Bkb3duSXRlbSB8IEFycmF5PE5wRHJvcGRvd25JdGVtPj4oKTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChOcERyb3Bkb3duSXRlbURpcmVjdGl2ZSkgc2VsZWN0SXRlbVJlZjogTnBEcm9wZG93bkl0ZW1EaXJlY3RpdmU7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZpcnR1YWxTY3JvbGxWaWV3cG9ydCcpIHZpZXdQb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XHJcblxyXG4gIHByaXZhdGUgb3JpZ2luSXRlbXM6IEFycmF5PE5wRHJvcGRvd25JdGVtPiA9IFtdO1xyXG4gIC8qKuafpeivolRva2VuICovXHJcbiAgc2VhcmNoVG9rZW46IHN0cmluZztcclxuXHJcbiAgLy8jcmVnaW9uIEdldHRlclxyXG4gIC8qKuWNlemAieS4i+aLieahhiAqL1xyXG4gIGdldCBzZWxlY3RlZExhYmVsKCkge1xyXG4gICAgdGhpcy5jaGVja0l0ZW1FeGlzdHMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaW5nbGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtID8gKHRoaXMuc2VsZWN0ZWRJdGVtIGFzIE5wRHJvcGRvd25JdGVtKS5sYWJlbCA6IHRoaXMuc2V0dGluZ3MucGxhY2VIb2xkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MucGxhY2VIb2xkZXI7XHJcbiAgfVxyXG5cclxuICAvKirlpJrpgInkuIvmi4nmoYYgKi9cclxuICBzZWxlY3RlZEl0ZW1zOiBBcnJheTxOcERyb3Bkb3duSXRlbT4gPSBbXTtcclxuICBzZWxlY3RlZEJhZGdlSXRlbXM6IEFycmF5PE5wRHJvcGRvd25JdGVtPiA9IFtdO1xyXG4gIG5vbmVCYWRnZUNvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICBwcml2YXRlIGJ1aWxkTXVsdGlwbGVTZWxlY3QoKSB7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaW5nbGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBzZWxlY3RlZEl0ZW1zXHJcbiAgICB0aGlzLmNoZWNrSXRlbUV4aXN0cygpO1xyXG4gICAgbGV0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbSBhcyBBcnJheTxOcERyb3Bkb3duSXRlbT47XHJcbiAgICBpZiAoc2VsZWN0ZWRJdGVtcyAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gWy4uLnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW3sgaWQ6IC0xLCBsYWJlbDogdGhpcy5zZXR0aW5ncy5wbGFjZUhvbGRlciB9XTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBzZWxlY3RlZEJhZGdlSXRlbXNcclxuICAgIGxldCBpdGVtcyA9IFsuLi50aGlzLnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgaXRlbXMuc3BsaWNlKHRoaXMuc2V0dGluZ3MuYmFkZ2UpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEJhZGdlSXRlbXMgPSBpdGVtcztcclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHRoaXMubm9uZUJhZGdlQ291bnQgPSB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gdGhpcy5zZXR0aW5ncy5iYWRnZTtcclxuXHJcbiAgICB0aGlzLmNkZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNEcm9wZG93bk9wZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vdmVybGF5U2VydmljZS5pc0F0dGFjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNJdGVtU2VsZWN0ZWQoKSB7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaW5nbGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMYWJlbCAhPT0gdGhpcy5zZXR0aW5ncy5wbGFjZUhvbGRlcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNdWx0aXBsZSBkcm9wZG93blxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcyAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zWzBdLmxhYmVsICE9PSB0aGlzLnNldHRpbmdzLnBsYWNlSG9sZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIF9pc0NoZWNrZWRBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBnZXQgaXNDaGVja2VkQWxsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoID09PSB0aGlzLnNlbGVjdGVkSXRlbS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBzZXQgaXNDaGVja2VkQWxsKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNDaGVja2VkQWxsID0gdmFsO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgcHJpdmF0ZSBvdmVybGF5U2VydmljZTogT3ZlcmxheVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGxldCBpdGVtcyA9IGNoYW5nZXNbJ2l0ZW1zJ107XHJcbiAgICBpZiAoaXRlbXMgJiYgaXRlbXMuY3VycmVudFZhbHVlICYmIGl0ZW1zLmN1cnJlbnRWYWx1ZS5sZW5ndGggPj0gMCkge1xyXG4gICAgICB0aGlzLm9yaWdpbkl0ZW1zID0gWy4uLml0ZW1zLmN1cnJlbnRWYWx1ZV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdEFsbChjaGVja2VkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IGNoZWNrZWQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGNoZWNrZWQgPyBbLi4udGhpcy5pdGVtc10gOiBbXTtcclxuICAgIHRoaXMuYnVpbGRNdWx0aXBsZVNlbGVjdCgpO1xyXG4gICAgdGhpcy5vblNlbGVjdGVkQWxsLmVtaXQodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0KGl0ZW06IE5wRHJvcGRvd25JdGVtKSB7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaW5nbGUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xyXG4gICAgICB0aGlzLm9uU2VsZWN0ZWQuZW1pdChpdGVtKTtcclxuICAgICAgdGhpcy5lbWl0Q2hhbmdlKGl0ZW0pO1xyXG4gICAgICB0aGlzLmNkZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNsb3NlKHsgaXRlbTogaXRlbSB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBNdWx0aXBsZSBkcm9wZG93blxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkSXRlbSB8fCAhdGhpcy5zZWxlY3RlZEl0ZW0ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGl0ZW0uY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbS5wdXNoKGl0ZW0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5maWx0ZXIoKGY6IE5wRHJvcGRvd25JdGVtKSA9PiBmLmlkICE9PSBpdGVtLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJ1aWxkTXVsdGlwbGVTZWxlY3QoKTtcclxuICAgIHRoaXMub25TZWxlY3RlZC5lbWl0KGl0ZW0pO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxuXHJcbiAgb25TZWFyY2godmFsOiBhbnkpIHtcclxuICAgIGlmICghdmFsKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXRlbXMgPSB0aGlzLm9yaWdpbkl0ZW1zLmZpbHRlcihmID0+IGYubGFiZWwuaW5kZXhPZih2YWwpID4gLTEpO1xyXG4gIH1cclxuXHJcbiAgaXNBY3RpdmUoaXRlbTogTnBEcm9wZG93bkl0ZW0pIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNldHRpbmdzLnNpbmdsZSkge1xyXG4gICAgICByZXR1cm4gaXRlbS5pZCA9PT0gKHRoaXMuc2VsZWN0ZWRJdGVtIGFzIE5wRHJvcGRvd25JdGVtKS5pZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNdWx0aXBsZSBkcm9wZG93blxyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtLmZpbmQoZiA9PiBmLmlkID09PSBpdGVtLmlkKTtcclxuICB9XHJcblxyXG4gIG9uT3BlbkRyb3Bkb3duKCRldmVudDogTW91c2VFdmVudCwgZHJvcGRvd25UcGw6IFRlbXBsYXRlUmVmPGFueT4sIG9yaWdpbjogSFRNTEVsZW1lbnQpIHtcclxuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEcm9wZG93bk9wZW4pIHtcclxuICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5jbG9zZShudWxsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3ZlcmxheVNlcnZpY2Uub3BlbkRyb3Bkb3duKG9yaWdpbiwgZHJvcGRvd25UcGwsIHRoaXMudmlld0NvbnRhaW5lclJlZiwgbnVsbCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgLy8gY2xvc2VcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYnVpbGRJdGVtc0NoZWNrZWRTdGF0dXMoKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWRJdGVtKCk7XHJcbiAgICB9LCAxMDApO1xyXG5cclxuICAgIC8vIFRyaWNreS4uLiBDYW4ndCBnZXQgaW5uZXIgZWxlbWVudCBpbiBucC1pbnB1dCBjb250cm9sLCBzbyB3ZSBuZWVkIHNldFxyXG4gICAgLy8gc3R5bGUgYXN5bmMgYWZ0ZXIgb3BlbiBkcm9wZG93blxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5vdmVybGF5U2VydmljZS5vdmVybGF5UmVmIHx8ICF0aGlzLm92ZXJsYXlTZXJ2aWNlLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBucElucHV0V3JhcHBlciA9IHRoaXMub3ZlcmxheVNlcnZpY2Uub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCducC1pbnB1dC13cmFwcGVyJyk7XHJcbiAgICAgIGxldCBpbnB1dENvbnRhaW5lciA9IHRoaXMub3ZlcmxheVNlcnZpY2Uub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1jb250YWluZXInKTtcclxuICAgICAgbGV0IG5wSW5wdXQgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbnAtaW5wdXQnKTtcclxuICAgICAgaWYgKG5wSW5wdXRXcmFwcGVyICYmIG5wSW5wdXRXcmFwcGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZShucElucHV0V3JhcHBlclswXSwgJ3dpZHRoJywgJzEwMCUnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlucHV0Q29udGFpbmVyICYmIGlucHV0Q29udGFpbmVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZShpbnB1dENvbnRhaW5lclswXSwgJ3dpZHRoJywgJzEwMCUnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5wSW5wdXQgJiYgbnBJbnB1dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlcjIuc2V0U3R5bGUobnBJbnB1dFswXSwgJ3dpZHRoJywgdGhpcy5zZXR0aW5ncy53aWR0aCArICdweCcpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKG5wSW5wdXRbMF0sICdwYWRkaW5nLWxlZnQnLCAnMzBweCcpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKG5wSW5wdXRbMF0sICdib3JkZXItdG9wJywgJ25vbmUnKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZShucElucHV0WzBdLCAnYm9yZGVyLWxlZnQnLCAnbm9uZScpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKG5wSW5wdXRbMF0sICdib3JkZXItcmlnaHQnLCAnbm9uZScpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKG5wSW5wdXRbMF0sICdib3gtc2hhZG93JywgJ25vbmUnKTtcclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBvblJlbW92ZUl0ZW1zKCRldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5zZXR0aW5ncy5zaW5nbGUgPyBudWxsIDogW107XHJcbiAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5idWlsZE11bHRpcGxlU2VsZWN0KCk7XHJcbiAgICB0aGlzLm9uRGVzZWxlY3RlZEFsbC5lbWl0KHRoaXMuaXRlbXMpO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIG9uUmVtb3ZlSXRlbSgkZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IE5wRHJvcGRvd25JdGVtKSB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5maWx0ZXIoKGY6IE5wRHJvcGRvd25JdGVtKSA9PiBmLmlkICE9PSBpdGVtLmlkKTtcclxuICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuXHJcbiAgICBpdGVtLmNoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmJ1aWxkTXVsdGlwbGVTZWxlY3QoKTtcclxuICAgIHRoaXMub25EZXNlbGVjdGVkLmVtaXQoaXRlbSk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIEltcGxlbWVudGF0aW9uIGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIOWmguaenOaYr+WkmumAieS4i+aLieahhu+8jOS8oOWFpeeahHNlbGVjdGVkSXRlbeaYr251bGzvvIzkuLrkuobpmLLmraLmiqXplJnnm7TmjqVyZXR1cm7vvIzlv4XpobvkvKDlhaXnqbrmlbDnu4RbXVxyXG4gICAgaWYgKG9iaiA9PT0gbnVsbCAmJiAhdGhpcy5zZXR0aW5ncy5zaW5nbGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gb2JqO1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3Muc2luZ2xlKSB7XHJcbiAgICAgIHRoaXMuY2RmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uY2hlY2tlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBpdGVtLmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuYnVpbGRNdWx0aXBsZVNlbGVjdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gUHJpdmF0ZSBtZXRob2RzXHJcbiAgcHJpdmF0ZSBpbml0KCkge1xyXG4gICAgdGhpcy5vcmlnaW5JdGVtcyA9IFsuLi50aGlzLml0ZW1zXTtcclxuICAgIGxldCBpbml0U2V0dGluZ3M6IE5wRHJvcGRvd25TZXR0aW5ncyA9IHtcclxuICAgICAgc2luZ2xlOiB0cnVlLFxyXG4gICAgICBwbGFjZUhvbGRlcjogJ+ivt+mAieaLqScsXHJcbiAgICAgIHdpZHRoOiAyMjAsXHJcbiAgICAgIGJhZGdlOiA5OTk5OSxcclxuICAgICAgaXNTaG93U2VhcmNoQm94OiB0cnVlLFxyXG4gICAgICBub0RhdGE6ICfmsqHmnInmlbDmja7vvIEnLFxyXG4gICAgICBhdXRvU2Nyb2xsVG86IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oaW5pdFNldHRpbmdzLCB0aGlzLnNldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tJdGVtRXhpc3RzKCkge1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3Muc2luZ2xlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbSAmJiAhdGhpcy5vcmlnaW5JdGVtcy5maW5kKGYgPT4gZi5pZCA9PT0gKHRoaXMuc2VsZWN0ZWRJdGVtIGFzIE5wRHJvcGRvd25JdGVtKS5pZCkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE11bHRpcGxlIGRyb3Bkb3duXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbSAmJiB0aGlzLnNlbGVjdGVkSXRlbS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbS5mb3JFYWNoKChpdGVtOiBOcERyb3Bkb3duSXRlbSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMub3JpZ2luSXRlbXMuZmluZChmID0+IGYuaWQgPT09IGl0ZW0uaWQpKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBbXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHNlbGVjdGVkSXRlbXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOa4hemZpOafpeivouW5tuWxleekuuaJgOacieespuWQiOadoeS7tueahGl0ZW1zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGVhclNlYXJjaCgpIHtcclxuICAgIHRoaXMuc2VhcmNoVG9rZW4gPSAnJztcclxuICAgIHRoaXMuaXRlbXMgPSBbLi4udGhpcy5vcmlnaW5JdGVtc107XHJcblxyXG4gICAgdGhpcy5idWlsZEl0ZW1zQ2hlY2tlZFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZEl0ZW1zQ2hlY2tlZFN0YXR1cygpIHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLnNpbmdsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBsZXQgc2VsZWN0ZWRJdGVtID0gdGhpcy5zZWxlY3RlZEl0ZW0uZmluZChmID0+IGYuaWQgPT09IGl0ZW0uaWQpO1xyXG4gICAgICBpdGVtLmNoZWNrZWQgPSBzZWxlY3RlZEl0ZW0gPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsVG9TZWxlY3RlZEl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuYXV0b1Njcm9sbFRvKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaXRlbSA9IHRoaXMuc2V0dGluZ3Muc2luZ2xlID8gKHRoaXMuc2VsZWN0ZWRJdGVtIGFzIE5wRHJvcGRvd25JdGVtKSA6ICh0aGlzLnNlbGVjdGVkSXRlbSAmJiB0aGlzLnNlbGVjdGVkSXRlbVswXSk7XHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy5vcmlnaW5JdGVtcy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBpdGVtLmlkKTtcclxuICAgICAgdGhpcy52aWV3UG9ydC5zY3JvbGxUb0luZGV4KHNlbGVjdGVkSW5kZXgsICdzbW9vdGgnKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTnBEcm9wZG93blNldHRpbmdzIHtcclxuICAvKipMZWZ0IHNpZGUgbGFiZWwgbmFtZSAqL1xyXG4gIGxibE5hbWU/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlNldCBpZiBpdCBpcyBzaW5nbGUgZHJvcGRvd24sIGRlZmF1bHQgaXMgdHJ1ZSAtIHNpbmdsZSBkcm9wZG93biAqL1xyXG4gIHNpbmdsZT86IGJvb2xlYW47XHJcblxyXG4gIC8qKkNoZWNrIGlmIGl0IGlzIHJlcXVpcmVkLiBpZiBub3QsIHNob3cgcmVtb3ZlIGljb24sIG90aGVyd2lzZSBoaWRlIHRoZSByZW1vdmUgaWNvbiAqL1xyXG4gIGlzUmVxdWlyZWQ/OiBib29sZWFuO1xyXG5cclxuICAvKipQbGFjZWhvbGRlciBmb3IgZHJvcGRvd24gKi9cclxuICBwbGFjZUhvbGRlcj86IHN0cmluZztcclxuXHJcbiAgLyoqU2V0IHRoZSB3aWR0aCBvZiBkcm9wZG93biwgZGVmYXVsdCBpcyAyMjAsIHVuaXQgcHggKi9cclxuICB3aWR0aD86IG51bWJlcjtcclxuXHJcbiAgLyoqRGlzcGxheSBiYWRnZSBjb3VudCwgZGVmYXVsdCBpcyA5OTk5OSAqL1xyXG4gIGJhZGdlPzogbnVtYmVyO1xyXG5cclxuICAvKirmmK/lkKblsZXnpLrlhajpgInmjInpkq4gKi9cclxuICBpc1Nob3dDaGVja2VkQWxsPzogYm9vbGVhbjtcclxuXHJcbiAgLyoq5piv5ZCm6buY6K6k5YWo6YCJICovXHJcbiAgaXNDaGVja2VkQWxsPzogYm9vbGVhbjtcclxuXHJcbiAgLyoq5rKh5pyJ5pWw5o2u5pe25bGV56S655qE5paH5qGI77yM6buY6K6k5Li64oCY5rKh5pyJ5pWw5o2u77yB4oCZICovXHJcbiAgbm9EYXRhPzogc3RyaW5nO1xyXG5cclxuICAvKirmmK/lkKbmmL7npLrmkJzntKLmoYbvvIzpu5jorqTlsZXnpLogKi9cclxuICBpc1Nob3dTZWFyY2hCb3g/OiBib29sZWFuO1xyXG5cclxuICAvKirlvZPkuIvmi4nmoYbmnInlt7LpgInpobnvvIzljZXpgInml7bvvIzmiZPlvIDkuIvmi4nmoYbkvJroh6rliqjmu5rliqjliLDlt7LpgInpobnvvJvlvZPkuLrlpJrpgInml7bvvIzmiZPlvIDkuIvmi4nmoYbkvJroh6rliqjmu5rliqjliLDlt7LpgInpobnnmoTnrKzkuIDpobnvvJvpu5jorqTmiZPlvIDkuLp0cnVlICovXHJcbiAgYXV0b1Njcm9sbFRvPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOcERyb3Bkb3duSXRlbSB7XHJcbiAgaWQ6IHN0cmluZyB8IG51bWJlcjtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIFtrZXk6IHN0cmluZ106IGFueTtcclxufVxyXG5cclxuXHJcbiJdfQ==