@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
443 lines • 41.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: multi-auto-complete.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, TemplateRef, ElementRef, EventEmitter, ViewChild, ChangeDetectorRef, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { of } from 'rxjs';
import { AutoCompleteDirective } from '@duoduo-oba/ng-devui/auto-complete';
var MultiAutoCompleteComponent = /** @class */ (function () {
function MultiAutoCompleteComponent(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
/*
overview: border none multiline single
*/
this.overview = 'border';
// 提示文字
this.placeholder = '请输入关键字'; // placeholder
// placeholder
this.disabled = false;
this.autoSubmit = new EventEmitter(); // 失焦自动提交
this.multiItems = [];
this.multipleLabelClassNameSuffix = this.overview;
this.inputEdit = false;
this.multipleLabelClassNameConfig = {
'border': {
'focus': 'border',
'blur': 'border'
},
'none': {
'focus': 'border',
'blur': 'none'
},
'multiline': {
'focus': 'multiline',
'blur': 'multiline'
},
'single': {
'focus': 'single-focus',
'blur': 'single'
}
};
this.clonePlaceholder = this.placeholder;
this.placement = 'bottom-left';
this.onChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { return null; });
this.onTouched = (/**
* @return {?}
*/
function () { return null; });
this.formatter = (/**
* @param {?} item
* @return {?}
*/
function (item) { return item ? (item.label || item.toString()) : ''; });
this.valueParser = (/**
* @param {?} item
* @return {?}
*/
function (item) { return item; });
this.id = MultiAutoCompleteComponent.ID_SEED++;
}
Object.defineProperty(MultiAutoCompleteComponent.prototype, "placeholderView", {
get: /**
* @return {?}
*/
function () {
if (this.multiItems.length > 0) {
return '';
}
else {
return this.placeholder;
}
},
enumerable: true,
configurable: true
});
/**
* @param {?} obj
* @return {?}
*/
MultiAutoCompleteComponent.prototype.writeValue = /**
* @param {?} obj
* @return {?}
*/
function (obj) {
/** @type {?} */
var value = obj || [];
this.multiItems = value;
if (this.overview === 'single') {
this.inputEdit = this.multiItems.length === 0;
}
this.setSinglePlaceholder();
this.changeDetectorRef.markForCheck();
};
/**
* @return {?}
*/
MultiAutoCompleteComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
if (this.source && !this.searchFn) {
this.searchFn = (/**
* @param {?} term
* @return {?}
*/
function (term) {
return of(_this.source
.filter((/**
* @param {?} lang
* @return {?}
*/
function (lang) { return _this.multiItems.indexOf(lang) === -1 && lang.toLowerCase().indexOf(term.toLowerCase()) !== -1; })));
});
}
};
/**
* @param {?} changes
* @return {?}
*/
MultiAutoCompleteComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes && changes['overview']) {
this.multipleLabelClassNameSuffix = changes['overview'].currentValue;
}
if (changes && changes['placeholder']) {
this.clonePlaceholder = changes['placeholder'].currentValue;
}
};
/**
* @param {?} fn
* @return {?}
*/
MultiAutoCompleteComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
MultiAutoCompleteComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @param {?} $event
* @return {?}
*/
MultiAutoCompleteComponent.prototype.singleClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.inputEdit = true;
};
/**
* @param {?=} item
* @return {?}
*/
MultiAutoCompleteComponent.prototype.onMultipleSearch = /**
* @param {?=} item
* @return {?}
*/
function (item) {
if (this.overview !== 'single' && item) {
/** @type {?} */
var inArray = false;
for (var i = 0; i < this.multiItems.length; i++) {
if (item.label) {
if (item.label === this.multiItems[i].label) {
inArray = true;
break;
}
}
else {
if (item === this.multiItems[i]) {
inArray = true;
break;
}
}
}
if (!inArray) {
this.multiItems.push(item);
}
else {
this.multiItems = this.multiItems.filter((/**
* @param {?} data
* @return {?}
*/
function (data) {
if (data.label) {
return data.label !== item.label;
}
else {
return data !== item;
}
}));
}
}
else if (this.overview === 'single' && item) {
this.multiItems = [];
this.multiItems.push(item);
this.inputEdit = false;
this.multipleLabelClassNameSuffix = this.multipleLabelClassNameConfig[this.overview]['blur'];
}
this.setSinglePlaceholder();
this.autoSubmit.emit(this.multiItems);
this.onChange(this.multiItems);
this.inputValue = null;
this.multiAutoCompleteInputElement.nativeElement.value = '';
};
/**
* @param {?} label
* @return {?}
*/
MultiAutoCompleteComponent.prototype.removeLabel = /**
* @param {?} label
* @return {?}
*/
function (label) {
if (this.multiItems.indexOf(label) !== -1) {
this.multiItems = this.multiItems.filter((/**
* @param {?} item
* @return {?}
*/
function (item) { return item !== label; }));
}
this.setSinglePlaceholder();
this.autoSubmit.emit(this.multiItems);
this.onChange(this.multiItems);
};
/**
* @param {?} $event
* @return {?}
*/
MultiAutoCompleteComponent.prototype.getInputFocusFlag = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var _this = this;
this.inputEdit = this.multiItems.length === 0 || $event.focus;
this.popupRef = $event.popupRef;
this.setSinglePlaceholder();
if ($event.focus) {
this.multipleLabelClassNameSuffix = this.multipleLabelClassNameConfig[this.overview]['focus'];
setTimeout((/**
* @return {?}
*/
function () {
_this.multiAutoCompleteInputElement.nativeElement.focus();
}), 0);
}
else {
this.multipleLabelClassNameSuffix = this.multipleLabelClassNameConfig[this.overview]['blur'];
this.inputValue = null;
this.multiAutoCompleteInputElement.nativeElement.value = '';
this.autoSubmit.emit(this.multiItems);
}
};
/**
* @param {?} $event
* @param {?} inputValue
* @return {?}
*/
MultiAutoCompleteComponent.prototype.onBackspaceKeyUp = /**
* @param {?} $event
* @param {?} inputValue
* @return {?}
*/
function ($event, inputValue) {
if (this.multiItems.length > 0 && !inputValue) {
this.multiItems.pop();
}
this.setSinglePlaceholder();
this.autoSubmit.emit(this.multiItems);
this.onChange(this.multiItems);
};
/**
* @return {?}
*/
MultiAutoCompleteComponent.prototype.setSinglePlaceholder = /**
* @return {?}
*/
function () {
if (this.overview === 'single') {
if (this.multiItems && this.multiItems.length > 0) {
this.placeholder = '';
}
else {
this.placeholder = this.clonePlaceholder;
}
}
};
MultiAutoCompleteComponent.ID_SEED = 0;
MultiAutoCompleteComponent.decorators = [
{ type: Component, args: [{
selector: 'd-multi-auto-complete',
template: "<div class=\"form-group multi-auto-complete\">\r\n <label\r\n for=\"multiple-label-auto-complete-{{ id }}\"\r\n class=\"multiple-label-auto-complete multiple-label-auto-complete-{{ multipleLabelClassNameSuffix }}\"\r\n [ngClass]=\"{ 'multiple-label-auto-complete-disabled': disabled }\"\r\n >\r\n <ul *ngIf=\"overview !== 'single'\">\r\n <li *ngFor=\"let item of multiItems\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"disabled || (overview === 'none' && !inputEdit) ? transparentTemplate : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n item: item,\r\n formatter: formatter,\r\n parent: multiItems\r\n }\"\r\n ></ng-template>\r\n </li>\r\n <li *ngIf=\"!disabled\">\r\n <input\r\n #multiAutoCompleteInput\r\n id=\"multiple-label-auto-complete-{{ id }}\"\r\n type=\"text\"\r\n name=\"autoCompleteControl\"\r\n class=\"auto-complete-control\"\r\n [placeholder]=\"placeholderView\"\r\n [tipsText]=\"tipsText\"\r\n [latestSource]=\"latestSource\"\r\n (selectValue)=\"onMultipleSearch($event)\"\r\n (transInputFocusEmit)=\"getInputFocusFlag($event)\"\r\n (keydown.backspace)=\"onBackspaceKeyUp($event, inputValue)\"\r\n [formatter]=\"formatter\"\r\n [valueParser]=\"valueParser\"\r\n [itemTemplate]=\"itemTemplate\"\r\n [noResultItemTemplate]=\"noResultItemTemplate\"\r\n [cssClass]=\"cssClass\"\r\n [overview]=\"overview\"\r\n [disabled]=\"disabled\"\r\n [(ngModel)]=\"inputValue\"\r\n [delay]=\"delay\"\r\n dAutoComplete\r\n [searchFn]=\"searchFn\"\r\n />\r\n </li>\r\n </ul>\r\n\r\n <!--\u5355\u9009\u6A21\u677F-->\r\n <ul *ngIf=\"overview === 'single'\" title=\"{{ formatter(multiItems[0]) }}\" (click)=\"singleClick($event)\">\r\n <li *ngFor=\"let item of multiItems\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"transparentTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n item: item,\r\n formatter: formatter,\r\n parent: multiItems\r\n }\"\r\n ></ng-template>\r\n </li>\r\n <li *ngIf=\"!disabled && inputEdit\">\r\n <input\r\n #multiAutoCompleteInput\r\n id=\"multiple-label-auto-complete-{{ id }}\"\r\n type=\"text\"\r\n name=\"autoCompleteControl\"\r\n class=\"auto-complete-control\"\r\n [placeholder]=\"placeholder\"\r\n [tipsText]=\"tipsText\"\r\n [latestSource]=\"latestSource\"\r\n (selectValue)=\"onMultipleSearch($event)\"\r\n (transInputFocusEmit)=\"getInputFocusFlag($event)\"\r\n (keydown.backspace)=\"onBackspaceKeyUp($event, inputValue)\"\r\n [formatter]=\"formatter\"\r\n [valueParser]=\"valueParser\"\r\n [itemTemplate]=\"itemTemplate\"\r\n [noResultItemTemplate]=\"noResultItemTemplate\"\r\n [cssClass]=\"cssClass\"\r\n [overview]=\"overview\"\r\n [disabled]=\"disabled\"\r\n [(ngModel)]=\"inputValue\"\r\n [delay]=\"delay\"\r\n dAutoComplete\r\n [searchFn]=\"searchFn\"\r\n />\r\n </li>\r\n </ul>\r\n </label>\r\n</div>\r\n\r\n<!--\u9EC4\u5E95\u6A21\u677F-->\r\n<ng-template #defaultTemplate let-item=\"item\" let-formatter=\"formatter\">\r\n <span class=\"label-item\">\r\n <span class=\"label label-text\">{{ formatter(item) }}</span\r\n ><span class=\"label label-close\" (click)=\"removeLabel(item)\">×</span></span\r\n >\r\n</ng-template>\r\n\r\n<!--\u65E0\u5E95\u8272\u6A21\u677F-->\r\n<ng-template #transparentTemplate let-item=\"item\" let-formatter=\"formatter\" let-parent=\"parent\">\r\n <span class=\"label label-text\">{{ formatter(item) }}{{ parent.length > 1 ? ';' : '' }}</span>\r\n</ng-template>\r\n",
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return MultiAutoCompleteComponent; })),
multi: true
}],
styles: [".form-group label{cursor:pointer;font-size:14px;margin-bottom:0;width:100%}.multiple-label-auto-complete{padding:0;font-weight:400}.multiple-label-auto-complete ul{display:block;list-style:none;background-color:#fff;border-radius:1px;padding:5px 5px 0}.multiple-label-auto-complete-border ul,.multiple-label-auto-complete-multiline ul,.multiple-label-auto-complete-single ul,.multiple-label-auto-complete-single-focus ul{border:1px solid #adb0b8}.multiple-label-auto-complete-border ul:active,.multiple-label-auto-complete-border ul:hover,.multiple-label-auto-complete-multiline ul:active,.multiple-label-auto-complete-multiline ul:hover,.multiple-label-auto-complete-single ul:active,.multiple-label-auto-complete-single ul:hover,.multiple-label-auto-complete-single-focus ul:active,.multiple-label-auto-complete-single-focus ul:hover{border-color:#344899}.multiple-label-auto-complete-single ul,.multiple-label-auto-complete-single-focus ul{overflow:hidden}.multiple-label-auto-complete-multiline ul{height:60px;overflow:auto}.multiple-label-auto-complete-none ul{border:1px solid transparent}.multiple-label-auto-complete-none ul:active,.multiple-label-auto-complete-none ul:hover{border-color:transparent}.multiple-label-auto-complete-disabled ul{cursor:default}.multiple-label-auto-complete-disabled ul:active,.multiple-label-auto-complete-disabled ul:hover{border-color:#adb0b8}.multiple-label-auto-complete ul::-ms-expand{border:0;background-color:transparent}::-ms-clear,::-ms-reveal{display:none}.multiple-label-auto-complete ul li{display:inline-block;position:relative;margin-right:5px;margin-bottom:5px}.multiple-label-auto-complete-none ul li{margin-right:0}.multiple-label-auto-complete-multiline ul li,.multiple-label-auto-complete-single ul li,.multiple-label-auto-complete-single-focus ul li{position:static}.multiple-label-auto-complete-single ul li,.multiple-label-auto-complete-single-focus ul li{float:left;width:100%}.multiple-label-auto-complete-single-focus ul li:first-child{max-width:calc(100% - 5px);margin-right:0;width:auto}.multiple-label-auto-complete-single-focus ul li:last-child{width:5px;margin-right:0;margin-left:0}.multiple-label-auto-complete ul li .label-close,.multiple-label-auto-complete ul li .label-text{border-radius:0;font-size:14px;padding:1px 2px;color:#252b3a;font-weight:400;background-color:#eef0f5}.multiple-label-auto-complete ul li .label-close{cursor:pointer}.multiple-label-auto-complete-disabled ul li .label-text,.multiple-label-auto-complete-none ul li .label-text,.multiple-label-auto-complete-single ul li .label-text,.multiple-label-auto-complete-single-focus ul li .label-text{background-color:transparent}.multiple-label-auto-complete-single ul li .label-text{width:100%;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;height:20px;line-height:20px}.multiple-label-auto-complete-single-focus ul li .label-text{width:100%;direction:rtl;text-align:left;display:block;height:20px;line-height:20px}.multiple-label-auto-complete .auto-complete-control{height:20px;border:none;outline:0;background:#fff;color:#252b3a;position:relative}.multiple-label-auto-complete .auto-complete-control:focus,.multiple-label-auto-complete .auto-complete-control:hover{border:none;outline:0}.multiple-label-auto-complete-none .auto-complete-control{width:0}:host label{color:inherit}:host ::ng-deep .multiple-label-auto-complete-border ul li .dropdown-menu{margin-top:6px}:host ::ng-deep .multiple-label-auto-complete-multiline ul li .dropdown-menu{margin-top:0;width:170px}:host-context(d-data-table) .multiple-label-auto-complete-single ul,:host-context(d-data-table) .multiple-label-auto-complete-single ul li .auto-complete-control{border-color:transparent;background-color:transparent}:host-context(d-data-table) .multiple-label-auto-complete-single ul{padding-left:0}"]
}] }
];
/** @nocollapse */
MultiAutoCompleteComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef }
]; };
MultiAutoCompleteComponent.propDecorators = {
cssClass: [{ type: Input }],
overview: [{ type: Input }],
tipsText: [{ type: Input }],
placeholder: [{ type: Input }],
disabled: [{ type: Input }],
source: [{ type: Input }],
latestSource: [{ type: Input }],
isOpen: [{ type: Input }],
term: [{ type: Input }],
itemTemplate: [{ type: Input }],
noResultItemTemplate: [{ type: Input }],
dropdown: [{ type: Input }],
minLength: [{ type: Input }],
delay: [{ type: Input }],
searchFn: [{ type: Input }],
formatter: [{ type: Input }],
valueParser: [{ type: Input }],
autoSubmit: [{ type: Output }],
multiAutoCompleteInputElement: [{ type: ViewChild, args: ['multiAutoCompleteInput', { static: false },] }],
autoCompleteDirective: [{ type: ViewChild, args: [AutoCompleteDirective, { static: false },] }]
};
return MultiAutoCompleteComponent;
}());
export { MultiAutoCompleteComponent };
if (false) {
/** @type {?} */
MultiAutoCompleteComponent.ID_SEED;
/** @type {?} */
MultiAutoCompleteComponent.prototype.cssClass;
/** @type {?} */
MultiAutoCompleteComponent.prototype.overview;
/** @type {?} */
MultiAutoCompleteComponent.prototype.tipsText;
/** @type {?} */
MultiAutoCompleteComponent.prototype.placeholder;
/** @type {?} */
MultiAutoCompleteComponent.prototype.disabled;
/** @type {?} */
MultiAutoCompleteComponent.prototype.source;
/** @type {?} */
MultiAutoCompleteComponent.prototype.latestSource;
/** @type {?} */
MultiAutoCompleteComponent.prototype.isOpen;
/** @type {?} */
MultiAutoCompleteComponent.prototype.term;
/** @type {?} */
MultiAutoCompleteComponent.prototype.itemTemplate;
/** @type {?} */
MultiAutoCompleteComponent.prototype.noResultItemTemplate;
/** @type {?} */
MultiAutoCompleteComponent.prototype.dropdown;
/** @type {?} */
MultiAutoCompleteComponent.prototype.minLength;
/** @type {?} */
MultiAutoCompleteComponent.prototype.delay;
/** @type {?} */
MultiAutoCompleteComponent.prototype.searchFn;
/** @type {?} */
MultiAutoCompleteComponent.prototype.formatter;
/** @type {?} */
MultiAutoCompleteComponent.prototype.valueParser;
/** @type {?} */
MultiAutoCompleteComponent.prototype.autoSubmit;
/** @type {?} */
MultiAutoCompleteComponent.prototype.multiAutoCompleteInputElement;
/** @type {?} */
MultiAutoCompleteComponent.prototype.autoCompleteDirective;
/** @type {?} */
MultiAutoCompleteComponent.prototype.multiItems;
/** @type {?} */
MultiAutoCompleteComponent.prototype.inputValue;
/** @type {?} */
MultiAutoCompleteComponent.prototype.multipleLabelClassNameSuffix;
/** @type {?} */
MultiAutoCompleteComponent.prototype.inputEdit;
/** @type {?} */
MultiAutoCompleteComponent.prototype.multipleLabelClassNameConfig;
/** @type {?} */
MultiAutoCompleteComponent.prototype.id;
/** @type {?} */
MultiAutoCompleteComponent.prototype.clonePlaceholder;
/**
* @type {?}
* @private
*/
MultiAutoCompleteComponent.prototype.popupRef;
/**
* @type {?}
* @private
*/
MultiAutoCompleteComponent.prototype.value;
/**
* @type {?}
* @private
*/
MultiAutoCompleteComponent.prototype.placement;
/**
* @type {?}
* @private
*/
MultiAutoCompleteComponent.prototype.onChange;
/**
* @type {?}
* @private
*/
MultiAutoCompleteComponent.prototype.onTouched;
/**
* @type {?}
* @private
*/
MultiAutoCompleteComponent.prototype.changeDetectorRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9tdWx0aS1hdXRvLWNvbXBsZXRlLyIsInNvdXJjZXMiOlsibXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBRVosU0FBUyxFQUNULGlCQUFpQixFQUNqQixVQUFVLEVBSVgsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUE4QixxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTNGO0lBMkVFLG9DQUNVLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1COzs7O1FBNURyQyxhQUFRLEdBQUcsUUFBUSxDQUFDOztRQUVwQixnQkFBVyxHQUFHLFFBQVEsQ0FBQyxDQUFDLGNBQWM7O1FBQ3RDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFhaEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUMsQ0FBQyxTQUFTO1FBSXpELGVBQVUsR0FBVSxFQUFFLENBQUM7UUFFdkIsaUNBQTRCLEdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNyRCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGlDQUE0QixHQUFRO1lBQ2xDLFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsUUFBUTtnQkFDakIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sT0FBTyxFQUFFLFFBQVE7Z0JBQ2pCLE1BQU0sRUFBRSxNQUFNO2FBQ2Y7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsT0FBTyxFQUFF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d0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO3dDQUNyRCxTQUFTLFNBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOztJQTRLckQsaUNBQUM7Q0FBQSxBQS9NRCxJQStNQztTQXJNWSwwQkFBMEI7OztJQUNyQyxtQ0FBbUI7O0lBQ25CLDhDQUEwQjs7SUFJMUIsOENBQTZCOztJQUM3Qiw4Q0FBMEI7O0lBQzFCLGlEQUFnQzs7SUFDaEMsOENBQTBCOztJQUMxQiw0Q0FBdUI7O0lBQ3ZCLGtEQUE2Qjs7SUFDN0IsNENBQXlCOztJQUN6QiwwQ0FBc0I7O0lBQ3RCLGtEQUF3Qzs7SUFDeEMsMERBQWdEOztJQUNoRCw4Q0FBMkI7O0lBQzNCLCtDQUEyQjs7SUFDM0IsMkNBQXVCOztJQUN2Qiw4Q0FBdUQ7O0lBQ3ZELCtDQUEwQzs7SUFDMUMsaURBQXlDOztJQUN6QyxnREFBK0M7O0lBRS9DLG1FQUFrRzs7SUFDbEcsMkRBQWtHOztJQUNsRyxnREFBdUI7O0lBQ3ZCLGdEQUFnQjs7SUFDaEIsa0VBQXFEOztJQUNyRCwrQ0FBa0I7O0lBQ2xCLGtFQWlCRTs7SUFDRix3Q0FBVzs7SUFDWCxzREFBNEM7Ozs7O0lBUzVDLDhDQUEyRDs7Ozs7SUFDM0QsMkNBQW1COzs7OztJQUNuQiwrQ0FBa0M7Ozs7O0lBRWxDLDhDQUFvQzs7Ozs7SUFDcEMsK0NBQStCOzs7OztJQUc3Qix1REFBNEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBmb3J3YXJkUmVmLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IG9mLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEF1dG9Db21wbGV0ZVBvcHVwQ29tcG9uZW50LCBBdXRvQ29tcGxldGVEaXJlY3RpdmUgfSBmcm9tICduZy1kZXZ1aS9hdXRvLWNvbXBsZXRlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZC1tdWx0aS1hdXRvLWNvbXBsZXRlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ211bHRpLWF1dG8tY29tcGxldGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpQXV0b0NvbXBsZXRlQ29tcG9uZW50KSxcclxuICAgIG11bHRpOiB0cnVlXHJcbiAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE11bHRpQXV0b0NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBzdGF0aWMgSURfU0VFRCA9IDA7XHJcbiAgQElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZztcclxuICAvKlxyXG4gIG92ZXJ2aWV3OiBib3JkZXIgbm9uZSBtdWx0aWxpbmUgc2luZ2xlXHJcbiAgKi9cclxuICBASW5wdXQoKSBvdmVydmlldyA9ICdib3JkZXInO1xyXG4gIEBJbnB1dCgpIHRpcHNUZXh0OiBzdHJpbmc7IC8vIOaPkOekuuaWh+Wtl1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ+ivt+i+k+WFpeWFs+mUruWtlyc7IC8vIHBsYWNlaG9sZGVyXHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBzb3VyY2U6IGFueVtdO1xyXG4gIEBJbnB1dCgpIGxhdGVzdFNvdXJjZTogYW55W107IC8vIOacgOi/kei+k+WFpVxyXG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbjtcclxuICBASW5wdXQoKSB0ZXJtOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIG5vUmVzdWx0SXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIGRyb3Bkb3duOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIG1pbkxlbmd0aDogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGRlbGF5OiBudW1iZXI7XHJcbiAgQElucHV0KCkgc2VhcmNoRm46ICh0ZXJtOiBzdHJpbmcpID0+IE9ic2VydmFibGU8YW55W10+O1xyXG4gIEBJbnB1dCgpIGZvcm1hdHRlcjogKGl0ZW06IGFueSkgPT4gc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHZhbHVlUGFyc2VyOiAoaXRlbTogYW55KSA9PiBhbnk7XHJcbiAgQE91dHB1dCgpIGF1dG9TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTsgLy8g5aSx54Sm6Ieq5Yqo5o+Q5LqkXHJcblxyXG4gIEBWaWV3Q2hpbGQoJ211bHRpQXV0b0NvbXBsZXRlSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgbXVsdGlBdXRvQ29tcGxldGVJbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChBdXRvQ29tcGxldGVEaXJlY3RpdmUsIHsgc3RhdGljOiBmYWxzZSB9KSBhdXRvQ29tcGxldGVEaXJlY3RpdmU6IEF1dG9Db21wbGV0ZURpcmVjdGl2ZTtcclxuICBtdWx0aUl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gIGlucHV0VmFsdWU6IGFueTtcclxuICBtdWx0aXBsZUxhYmVsQ2xhc3NOYW1lU3VmZml4OiBzdHJpbmcgPSB0aGlzLm92ZXJ2aWV3O1xyXG4gIGlucHV0RWRpdCA9IGZhbHNlO1xyXG4gIG11bHRpcGxlTGFiZWxDbGFzc05hbWVDb25maWc6IGFueSA9IHtcclxuICAgICdib3JkZXInOiB7XHJcbiAgICAgICdmb2N1cyc6ICdib3JkZXInLFxyXG4gICAgICAnYmx1cic6ICdib3JkZXInXHJcbiAgICB9LFxyXG4gICAgJ25vbmUnOiB7XHJcbiAgICAgICdmb2N1cyc6ICdib3JkZXInLFxyXG4gICAgICAnYmx1cic6ICdub25lJ1xyXG4gICAgfSxcclxuICAgICdtdWx0aWxpbmUnOiB7XHJcbiAgICAgICdmb2N1cyc6ICdtdWx0aWxpbmUnLFxyXG4gICAgICAnYmx1cic6ICdtdWx0aWxpbmUnXHJcbiAgICB9LFxyXG4gICAgJ3NpbmdsZSc6IHtcclxuICAgICAgJ2ZvY3VzJzogJ3NpbmdsZS1mb2N1cycsXHJcbiAgICAgICdibHVyJzogJ3NpbmdsZSdcclxuICAgIH1cclxuICB9O1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgY2xvbmVQbGFjZWhvbGRlcjogc3RyaW5nID0gdGhpcy5wbGFjZWhvbGRlcjtcclxuICBnZXQgcGxhY2Vob2xkZXJWaWV3KCkge1xyXG4gICAgaWYgKHRoaXMubXVsdGlJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwb3B1cFJlZjogQ29tcG9uZW50UmVmPEF1dG9Db21wbGV0ZVBvcHVwQ29tcG9uZW50PjtcclxuICBwcml2YXRlIHZhbHVlOiBhbnk7XHJcbiAgcHJpdmF0ZSBwbGFjZW1lbnQgPSAnYm90dG9tLWxlZnQnO1xyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlID0gKF86IGFueSkgPT4gbnVsbDtcclxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIHRoaXMuZm9ybWF0dGVyID0gKGl0ZW0pID0+IGl0ZW0gPyAoaXRlbS5sYWJlbCB8fCBpdGVtLnRvU3RyaW5nKCkpIDogJyc7XHJcbiAgICB0aGlzLnZhbHVlUGFyc2VyID0gKGl0ZW0pID0+IGl0ZW07XHJcbiAgICB0aGlzLmlkID0gTXVsdGlBdXRvQ29tcGxldGVDb21wb25lbnQuSURfU0VFRCsrO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWUgPSBvYmogfHwgW107XHJcbiAgICB0aGlzLm11bHRpSXRlbXMgPSB2YWx1ZTtcclxuICAgIGlmICh0aGlzLm92ZXJ2aWV3ID09PSAnc2luZ2xlJykge1xyXG4gICAgICB0aGlzLmlucHV0RWRpdCA9IHRoaXMubXVsdGlJdGVtcy5sZW5ndGggPT09IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFNpbmdsZVBsYWNlaG9sZGVyKCk7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5zb3VyY2UgJiYgIXRoaXMuc2VhcmNoRm4pIHtcclxuICAgICAgdGhpcy5zZWFyY2hGbiA9ICh0ZXJtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMuc291cmNlXHJcbiAgICAgICAgICAuZmlsdGVyKGxhbmcgPT4gdGhpcy5tdWx0aUl0ZW1zLmluZGV4T2YobGFuZykgPT09IC0xICYmIGxhbmcudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRlcm0udG9Mb3dlckNhc2UoKSkgIT09IC0xKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzWydvdmVydmlldyddKSB7XHJcbiAgICAgIHRoaXMubXVsdGlwbGVMYWJlbENsYXNzTmFtZVN1ZmZpeCA9IGNoYW5nZXNbJ292ZXJ2aWV3J10uY3VycmVudFZhbHVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlc1sncGxhY2Vob2xkZXInXSkge1xyXG4gICAgICB0aGlzLmNsb25lUGxhY2Vob2xkZXIgPSBjaGFuZ2VzWydwbGFjZWhvbGRlciddLmN1cnJlbnRWYWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHNpbmdsZUNsaWNrKCRldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmlucHV0RWRpdCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBvbk11bHRpcGxlU2VhcmNoKGl0ZW0/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm92ZXJ2aWV3ICE9PSAnc2luZ2xlJyAmJiBpdGVtKSB7XHJcbiAgICAgIGxldCBpbkFycmF5ID0gZmFsc2U7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tdWx0aUl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0ubGFiZWwpIHtcclxuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSB0aGlzLm11bHRpSXRlbXNbaV0ubGFiZWwpIHtcclxuICAgICAgICAgICAgaW5BcnJheSA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5tdWx0aUl0ZW1zW2ldKSB7XHJcbiAgICAgICAgICAgIGluQXJyYXkgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpbkFycmF5KSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aUl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aUl0ZW1zID0gdGhpcy5tdWx0aUl0ZW1zLmZpbHRlcihkYXRhID0+IHtcclxuICAgICAgICAgIGlmIChkYXRhLmxhYmVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmxhYmVsICE9PSBpdGVtLmxhYmVsO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEgIT09IGl0ZW07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5vdmVydmlldyA9PT0gJ3NpbmdsZScgJiYgaXRlbSkge1xyXG4gICAgICB0aGlzLm11bHRpSXRlbXMgPSBbXTtcclxuICAgICAgdGhpcy5tdWx0aUl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgIHRoaXMuaW5wdXRFZGl0ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubXVsdGlwbGVMYWJlbENsYXNzTmFtZVN1ZmZpeCA9IHRoaXMubXVsdGlwbGVMYWJlbENsYXNzTmFtZUNvbmZpZ1t0aGlzLm92ZXJ2aWV3XVsnYmx1ciddO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRTaW5nbGVQbGFjZWhvbGRlcigpO1xyXG4gICAgdGhpcy5hdXRvU3VibWl0LmVtaXQodGhpcy5tdWx0aUl0ZW1zKTtcclxuICAgIHRoaXMub25DaGFuZ2UodGhpcy5tdWx0aUl0ZW1zKTtcclxuICAgIHRoaXMuaW5wdXRWYWx1ZSA9IG51bGw7XHJcbiAgICB0aGlzLm11bHRpQXV0b0NvbXBsZXRlSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYWJlbChsYWJlbDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5tdWx0aUl0ZW1zLmluZGV4T2YobGFiZWwpICE9PSAtMSkge1xyXG4gICAgICB0aGlzLm11bHRpSXRlbXMgPSB0aGlzLm11bHRpSXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gbGFiZWwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRTaW5nbGVQbGFjZWhvbGRlcigpO1xyXG4gICAgdGhpcy5hdXRvU3VibWl0LmVtaXQodGhpcy5tdWx0aUl0ZW1zKTtcclxuICAgIHRoaXMub25DaGFuZ2UodGhpcy5tdWx0aUl0ZW1zKTtcclxuICB9XHJcblxyXG4gIGdldElucHV0Rm9jdXNGbGFnKCRldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmlucHV0RWRpdCA9IHRoaXMubXVsdGlJdGVtcy5sZW5ndGggPT09IDAgfHwgJGV2ZW50LmZvY3VzO1xyXG4gICAgdGhpcy5wb3B1cFJlZiA9ICRldmVudC5wb3B1cFJlZjtcclxuICAgIHRoaXMuc2V0U2luZ2xlUGxhY2Vob2xkZXIoKTtcclxuICAgIGlmICgkZXZlbnQuZm9jdXMpIHtcclxuICAgICAgdGhpcy5tdWx0aXBsZUxhYmVsQ2xhc3NOYW1lU3VmZml4ID0gdGhpcy5tdWx0aXBsZUxhYmVsQ2xhc3NOYW1lQ29uZmlnW3RoaXMub3ZlcnZpZXddWydmb2N1cyddO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgLy8g6L+Z6YeM6ZyA6KaB562J5b6F5LiA5Lya5omN6IO96IGa54SmXHJcbiAgICAgICAgdGhpcy5tdWx0aUF1dG9Db21wbGV0ZUlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tdWx0aXBsZUxhYmVsQ2xhc3NOYW1lU3VmZml4ID0gdGhpcy5tdWx0aXBsZUxhYmVsQ2xhc3NOYW1lQ29uZmlnW3RoaXMub3ZlcnZpZXddWydibHVyJ107XHJcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IG51bGw7XHJcbiAgICAgIHRoaXMubXVsdGlBdXRvQ29tcGxldGVJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICB0aGlzLmF1dG9TdWJtaXQuZW1pdCh0aGlzLm11bHRpSXRlbXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25CYWNrc3BhY2VLZXlVcCgkZXZlbnQ6IGFueSwgaW5wdXRWYWx1ZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5tdWx0aUl0ZW1zLmxlbmd0aCA+IDAgJiYgIWlucHV0VmFsdWUpIHtcclxuICAgICAgdGhpcy5tdWx0aUl0ZW1zLnBvcCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRTaW5nbGVQbGFjZWhvbGRlcigpO1xyXG4gICAgdGhpcy5hdXRvU3VibWl0LmVtaXQodGhpcy5tdWx0aUl0ZW1zKTtcclxuICAgIHRoaXMub25DaGFuZ2UodGhpcy5tdWx0aUl0ZW1zKTtcclxuICB9XHJcblxyXG4gIHNldFNpbmdsZVBsYWNlaG9sZGVyKCkge1xyXG4gICAgaWYgKHRoaXMub3ZlcnZpZXcgPT09ICdzaW5nbGUnKSB7XHJcbiAgICAgIGlmICh0aGlzLm11bHRpSXRlbXMgJiYgdGhpcy5tdWx0aUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gJyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IHRoaXMuY2xvbmVQbGFjZWhvbGRlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=