UNPKG

@stratio/egeo

Version:
419 lines 35.4 kB
/** * @fileoverview added by tsickle * Generated from: lib/st-two-list-selection/st-two-list-selection.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * © 2017 Stratio Big Data Inc., Sucursal en España. * * This software is licensed under the Apache License, Version 2.0. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the terms of the License for more details. * * SPDX-License-Identifier: Apache-2.0. */ import { EventEmitter } from '@angular/core'; import * as _ from 'lodash'; import { StFilterList } from '../pipes/search-filter/search-filter.pipe'; export class StTwoListSelection { /** * @param {?} _cd */ constructor(_cd) { this._cd = _cd; // Work Lists this.copyAllElement = []; this.copySelectedElements = []; this.allSearch = ''; this.hasCheckboxAllList = false; this.hasCheckboxSelectedList = false; this.numItemsSelectedAll = new EventEmitter(); this.numItemsSelectedSelected = new EventEmitter(); this.searchBy = 'name'; this.searchOverAll = new EventEmitter(); this.searchOverSelected = new EventEmitter(); this.selectedSearch = ''; } // Check selected element /** * @param {?} selection * @return {?} */ onSelectAllElement(selection) { if (this.hasCheckboxAllList && selection.itemAll) { this.copyAllElement = this.applySelectAll(this.copyAllElement, this.allSearch, selection.selected); selection.selected = !selection.selected; } else { if (this.canSelect(selection, this.copyAllElement)) { selection.selected = !selection.selected; } } this.copyAllElement = _.cloneDeep(this.copyAllElement); if (this.copyAllElement) { this.numItemsSelectedAll.emit(this.getNumItemsSelected(this.copyAllElement)); } } // Check selected element /** * @param {?} selection * @return {?} */ onSelectSelectedElement(selection) { if (this.hasCheckboxSelectedList && selection.itemAll) { this.copySelectedElements = this.applySelectAll(this.copySelectedElements, this.selectedSearch, selection.selected); selection.selected = !selection.selected; } else { if (this.canSelect(selection, this.copySelectedElements)) { selection.selected = !selection.selected; } } this.copySelectedElements = _.cloneDeep(this.copySelectedElements); if (this.copySelectedElements) { this.numItemsSelectedSelected.emit(this.getNumItemsSelected(this.copySelectedElements)); } } // Update search filter /** * @param {?} search * @return {?} */ onSearchOverAll(search) { this.allSearch = search.text; this.searchOverAll.emit(this.allSearch); } // Update search filter /** * @param {?} search * @return {?} */ onSearchOverSelected(search) { this.selectedSearch = search.text; this.searchOverSelected.emit(this.selectedSearch); } // Move from all to selected /** * @param {?} event * @return {?} */ onMoveToSelected(event) { /** @type {?} */ let ids = this.getIdsToMove(this.copyAllElement); /** @type {?} */ let result = this.moveIdsFromAllToSelected(this.originalAll, this.originalSelected, ids); this.emitter.emit(result); if (this.itemAll) this.itemAll.selected = false; } // Remove from selected /** * @param {?} event * @return {?} */ onMoveToAll(event) { /** @type {?} */ let ids = this.getIdsToMove(this.copySelectedElements); /** @type {?} */ let result = this.removeIdsFromSelected(this.originalSelected, ids); this.emitter.emit(result); if (this.itemAll) this.itemAll.selected = false; } // Move all to selected /** * @param {?} event * @return {?} */ onMoveAllToSelected(event) { this.emitter.emit(_.cloneDeep(this.originalAll.filter((/** * @param {?} elem * @return {?} */ (elem) => !elem.disabled)))); } // Remove All from selected /** * @param {?} event * @return {?} */ onMoveAllToAll(event) { this.emitter.emit([]); } /** * @param {?} all * @param {?} selected * @param {?} changeEmitter * @param {?} sorted * @param {?=} hasCheckboxAllList * @param {?=} hasCheckboxSelectedList * @param {?=} itemAll * @return {?} */ init(all, selected, changeEmitter, sorted, hasCheckboxAllList = false, hasCheckboxSelectedList = false, itemAll = (/** @type {?} */ (null))) { this.emitter = changeEmitter; this.sortLists = sorted; this.originalAll = all; this.originalSelected = selected; this.generateWorkLists(); this.hasCheckboxAllList = hasCheckboxAllList; this.hasCheckboxSelectedList = hasCheckboxSelectedList; this.itemAll = itemAll; } /** * @param {?} changes * @param {?} allList * @param {?} selectedList * @return {?} */ checkChanges(changes, allList, selectedList) { if (changes[allList] !== undefined) { this.originalAll = changes[allList].currentValue; } if (changes[selectedList] !== undefined) { this.originalSelected = changes[selectedList].currentValue; } if (changes[allList] !== undefined || changes[selectedList] !== undefined) { this.generateWorkLists(); } } /** * @private * @param {?} twoList * @param {?} elemSearched * @param {?} allSelected * @return {?} */ applySelectAll(twoList, elemSearched, allSelected) { /** @type {?} */ let filterPipe = new StFilterList(); /** @type {?} */ let filteredBySearch = filterPipe.transform(twoList, 'name', elemSearched); if (elemSearched) { twoList.forEach((/** * @param {?} elem * @return {?} */ (elem) => { if (!elem.disabled) { elem.selected = false; if (filteredBySearch.find((/** * @param {?} filtered * @return {?} */ filtered => filtered.name === elem.name)) !== undefined) { elem.selected = !allSelected; } } })); this._cd.markForCheck(); } else { twoList = _.cloneDeep(this.changeSelectedItemList(twoList, !allSelected)); } return twoList; } /** * @private * @param {?} list * @param {?} selected * @return {?} */ changeSelectedItemList(list, selected) { return _.cloneDeep(list).map((/** * @param {?} elem * @return {?} */ (elem) => { elem.selected = (!elem.disabled) ? selected : elem.selected; return elem; })); } /** * @private * @param {?} list * @return {?} */ getNumItemsSelected(list) { /** @type {?} */ const reducer = (/** * @param {?} accumulator * @param {?} currentValue * @return {?} */ (accumulator, currentValue) => { return (currentValue.selected) ? accumulator + 1 : accumulator + 0; }); return list.reduce(reducer, 0); } /** * @private * @return {?} */ generateWorkLists() { this.copyAllElement = this.copyLists(this.originalAll, this.copyAllElement, this.originalSelected); this.copySelectedElements = this.copyLists(this.originalSelected, this.copySelectedElements); if (this.sortLists !== undefined && (this.sortLists === 'id' || this.sortLists === 'name')) { this.copyAllElement = this.orderListBy(this.copyAllElement, this.sortLists); this.copySelectedElements = this.orderListBy(this.copySelectedElements, this.sortLists); } } /** * @private * @param {?} newValue * @param {?} prevState * @param {?=} without * @return {?} */ copyLists(newValue, prevState, without) { /** @type {?} */ let list = _.cloneDeep(newValue); if (without && without.length > 0) { list = _.differenceBy(list, without, 'id'); } /** @type {?} */ let selected = this.getIdsToMove(prevState); this.searchAndSelect(list, selected); return list; } /** * @private * @param {?} list * @param {?} selected * @return {?} */ searchAndSelect(list, selected) { /** @type {?} */ let i = 0; /** @type {?} */ let actualIndex = -1; while (selected.length > 0 && i < list.length) { actualIndex = selected.indexOf(list[i].id); if (actualIndex > -1) { list[i].selected = true; selected.splice(actualIndex, 1); actualIndex = -1; } i++; } } /** * @private * @param {?} list * @return {?} */ getIdsToMove(list) { return list.reduce((/** * @param {?} prev * @param {?} curr * @return {?} */ (prev, curr) => { if (curr.selected) { curr.selected = false; prev.push(curr.id); } return prev; }), []); } /** * @private * @param {?} all * @param {?} selected * @param {?} ids * @return {?} */ moveIdsFromAllToSelected(all, selected, ids) { /** @type {?} */ let items = all.filter((/** * @param {?} item * @return {?} */ (item) => _.includes(ids, item.id))); return _.xorBy(selected, _.cloneDeep(items), 'id'); } /** * @private * @param {?} selected * @param {?} ids * @return {?} */ removeIdsFromSelected(selected, ids) { return selected.reduce((/** * @param {?} prev * @param {?} curr * @return {?} */ (prev, curr) => { if (!_.includes(ids, curr.id)) { prev.push(_.clone(curr)); } return prev; }), []); } /** * @private * @param {?} list * @param {?} by * @return {?} */ orderListBy(list, by) { return _.sortBy(list, by); } /** * @private * @param {?} selection * @param {?} list * @return {?} */ canSelect(selection, list) { return selection && !selection.disabled && list !== undefined && list.length > 0; } } if (false) { /** @type {?} */ StTwoListSelection.prototype.originalAll; /** @type {?} */ StTwoListSelection.prototype.originalSelected; /** @type {?} */ StTwoListSelection.prototype.copyAllElement; /** @type {?} */ StTwoListSelection.prototype.copySelectedElements; /** @type {?} */ StTwoListSelection.prototype.allSearch; /** @type {?} */ StTwoListSelection.prototype.hasCheckboxAllList; /** @type {?} */ StTwoListSelection.prototype.hasCheckboxSelectedList; /** @type {?} */ StTwoListSelection.prototype.itemAll; /** @type {?} */ StTwoListSelection.prototype.numItemsSelectedAll; /** @type {?} */ StTwoListSelection.prototype.numItemsSelectedSelected; /** @type {?} */ StTwoListSelection.prototype.searchBy; /** @type {?} */ StTwoListSelection.prototype.searchOverAll; /** @type {?} */ StTwoListSelection.prototype.searchOverSelected; /** @type {?} */ StTwoListSelection.prototype.selectedSearch; /** * @type {?} * @private */ StTwoListSelection.prototype.emitter; /** * @type {?} * @private */ StTwoListSelection.prototype.sortLists; /** * @type {?} * @private */ StTwoListSelection.prototype._cd; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdHdvLWxpc3Qtc2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0cmF0aW8vZWdlby8iLCJzb3VyY2VzIjpbImxpYi9zdC10d28tbGlzdC1zZWxlY3Rpb24vc3QtdHdvLWxpc3Qtc2VsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVVBLE9BQU8sRUFBcUIsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUc1QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFLekUsTUFBTSxPQUFPLGtCQUFrQjs7OztJQXdCNUIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7O1FBakJuQyxtQkFBYyxHQUFTLEVBQUUsQ0FBQztRQUMxQix5QkFBb0IsR0FBUyxFQUFFLENBQUM7UUFFaEMsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2Qix1QkFBa0IsR0FBYSxLQUFLLENBQUM7UUFDckMsNEJBQXVCLEdBQWEsS0FBSyxDQUFDO1FBRTFDLHdCQUFtQixHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3ZFLDZCQUF3QixHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzVFLGFBQVEsR0FBVyxNQUFNLENBQUM7UUFDMUIsa0JBQWEsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNqRSx1QkFBa0IsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN0RSxtQkFBYyxHQUFXLEVBQUUsQ0FBQztJQUtXLENBQUM7Ozs7OztJQUcvQyxrQkFBa0IsQ0FBQyxTQUFvQztRQUNwRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLEVB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SSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDM0I7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNmLENBQUMsR0FBRSxFQUFFLENBQUMsQ0FBQztJQUNWLENBQUM7Ozs7Ozs7SUFFTyxXQUFXLENBQUMsSUFBVSxFQUFFLEVBQVU7UUFDdkMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDOzs7Ozs7O0lBRU8sU0FBUyxDQUFDLFNBQW9DLEVBQUUsSUFBVTtRQUMvRCxPQUFPLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNwRixDQUFDO0NBQ0g7OztJQXZORSx5Q0FBeUI7O0lBQ3pCLDhDQUE4Qjs7SUFHOUIsNENBQWlDOztJQUNqQyxrREFBdUM7O0lBRXZDLHVDQUE4Qjs7SUFDOUIsZ0RBQTRDOztJQUM1QyxxREFBaUQ7O0lBQ2pELHFDQUEyQzs7SUFDM0MsaURBQThFOztJQUM5RSxzREFBbUY7O0lBQ25GLHNDQUFpQzs7SUFDakMsMkNBQXdFOztJQUN4RSxnREFBNkU7O0lBQzdFLDRDQUFtQzs7Ozs7SUFFbkMscUNBQW9DOzs7OztJQUNwQyx1Q0FBOEM7Ozs7O0lBRWxDLGlDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiDCqSAyMDE3IFN0cmF0aW8gQmlnIERhdGEgSW5jLiwgU3VjdXJzYWwgZW4gRXNwYcOxYS5cbiAqXG4gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZO1xuICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiAqIFNlZSB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMC5cbiAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIEV2ZW50RW1pdHRlciwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBTdFR3b0xpc3RTZWxlY3Rpb25FbGVtZW50IH0gZnJvbSAnLi9zdC10d28tbGlzdC1zZWxlY3Rpb24ubW9kZWwnO1xuaW1wb3J0IHsgU3RGaWx0ZXJMaXN0IH0gZnJvbSAnLi4vcGlwZXMvc2VhcmNoLWZpbHRlci9zZWFyY2gtZmlsdGVyLnBpcGUnO1xuXG5leHBvcnQgdHlwZSBMaXN0ID0gU3RUd29MaXN0U2VsZWN0aW9uRWxlbWVudFtdO1xuZXhwb3J0IHR5cGUgSWRMaXN0ID0gQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcblxuZXhwb3J0IGNsYXNzIFN0VHdvTGlzdFNlbGVjdGlvbiB7XG5cbiAgIC8vIE9yaWdpbmFsIExpc3RzXG4gICBwdWJsaWMgb3JpZ2luYWxBbGw6IExpc3Q7XG4gICBwdWJsaWMgb3JpZ2luYWxTZWxlY3RlZDogTGlzdDtcblxuICAgLy8gV29yayBMaXN0c1xuICAgcHVibGljIGNvcHlBbGxFbGVtZW50OiBMaXN0ID0gW107XG4gICBwdWJsaWMgY29weVNlbGVjdGVkRWxlbWVudHM6IExpc3QgPSBbXTtcblxuICAgcHVibGljIGFsbFNlYXJjaDogc3RyaW5nID0gJyc7XG4gICBwdWJsaWMgaGFzQ2hlY2tib3hBbGxMaXN0PzogYm9vbGVhbiA9IGZhbHNlO1xuICAgcHVibGljIGhhc0NoZWNrYm94U2VsZWN0ZWRMaXN0PzogYm9vbGVhbiA9IGZhbHNlO1xuICAgcHVibGljIGl0ZW1BbGw/OiBTdFR3b0xpc3RTZWxlY3Rpb25FbGVtZW50O1xuICAgcHVibGljIG51bUl0ZW1zU2VsZWN0ZWRBbGw6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gICBwdWJsaWMgbnVtSXRlbXNTZWxlY3RlZFNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAgcHVibGljIHNlYXJjaEJ5OiBzdHJpbmcgPSAnbmFtZSc7XG4gICBwdWJsaWMgc2VhcmNoT3ZlckFsbDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgIHB1YmxpYyBzZWFyY2hPdmVyU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gICBwdWJsaWMgc2VsZWN0ZWRTZWFyY2g6IHN0cmluZyA9ICcnO1xuXG4gICBwcml2YXRlIGVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxMaXN0PjtcbiAgIHByaXZhdGUgc29ydExpc3RzOiAnaWQnIHwgJ25hbWUnIHwgJ25vdE9yZGVyJztcblxuICAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgLy8gQ2hlY2sgc2VsZWN0ZWQgZWxlbWVudFxuICAgb25TZWxlY3RBbGxFbGVtZW50KHNlbGVjdGlvbjogU3RUd29MaXN0U2VsZWN0aW9uRWxlbWVudCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaGFzQ2hlY2tib3hBbGxMaXN0ICYmIHNlbGVjdGlvbi5pdGVtQWxsKSB7XG4gICAgICAgICB0aGlzLmNvcHlBbGxFbGVtZW50ID0gdGhpcy5hcHBseVNlbGVjdEFsbCh0aGlzLmNvcHlBbGxFbGVtZW50LCB0aGlzLmFsbFNlYXJjaCwgc2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgICAgICAgIHNlbGVjdGlvbi5zZWxlY3RlZCA9ICFzZWxlY3Rpb24uc2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgaWYgKHRoaXMuY2FuU2VsZWN0KHNlbGVjdGlvbiwgdGhpcy5jb3B5QWxsRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5zZWxlY3RlZCA9ICFzZWxlY3Rpb24uc2VsZWN0ZWQ7XG4gICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNvcHlBbGxFbGVtZW50ID0gXy5jbG9uZURlZXAodGhpcy5jb3B5QWxsRWxlbWVudCk7XG4gICAgICBpZiAodGhpcy5jb3B5QWxsRWxlbWVudCkge1xuICAgICAgICAgdGhpcy5udW1JdGVtc1NlbGVjdGVkQWxsLmVtaXQodGhpcy5nZXROdW1JdGVtc1NlbGVjdGVkKHRoaXMuY29weUFsbEVsZW1lbnQpKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLy8gQ2hlY2sgc2VsZWN0ZWQgZWxlbWVudFxuICAgb25TZWxlY3RTZWxlY3RlZEVsZW1lbnQoc2VsZWN0aW9uOiBTdFR3b0xpc3RTZWxlY3Rpb25FbGVtZW50KTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5oYXNDaGVja2JveFNlbGVjdGVkTGlzdCAmJiBzZWxlY3Rpb24uaXRlbUFsbCkge1xuICAgICAgICAgdGhpcy5jb3B5U2VsZWN0ZWRFbGVtZW50cyA9ICB0aGlzLmFwcGx5U2VsZWN0QWxsKHRoaXMuY29weVNlbGVjdGVkRWxlbWVudHMsIHRoaXMuc2VsZWN0ZWRTZWFyY2gsIHNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gICAgICAgICBzZWxlY3Rpb24uc2VsZWN0ZWQgPSAhc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGlmICh0aGlzLmNhblNlbGVjdChzZWxlY3Rpb24sIHRoaXMuY29weVNlbGVjdGVkRWxlbWVudHMpKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb24uc2VsZWN0ZWQgPSAhc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jb3B5U2VsZWN0ZWRFbGVtZW50cyA9IF8uY2xvbmVEZWVwKHRoaXMuY29weVNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgaWYgKHRoaXMuY29weVNlbGVjdGVkRWxlbWVudHMpIHtcbiAgICAgICAgIHRoaXMubnVtSXRlbXNTZWxlY3RlZFNlbGVjdGVkLmVtaXQodGhpcy5nZXROdW1JdGVtc1NlbGVjdGVkKHRoaXMuY29weVNlbGVjdGVkRWxlbWVudHMpKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLy8gVXBkYXRlIHNlYXJjaCBmaWx0ZXJcbiAgIG9uU2VhcmNoT3ZlckFsbChzZWFyY2g6IHsgdGV4dDogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgIHRoaXMuYWxsU2VhcmNoID0gc2VhcmNoLnRleHQ7XG4gICAgICB0aGlzLnNlYXJjaE92ZXJBbGwuZW1pdCh0aGlzLmFsbFNlYXJjaCk7XG4gICB9XG5cbiAgIC8vIFVwZGF0ZSBzZWFyY2ggZmlsdGVyXG4gICBvblNlYXJjaE92ZXJTZWxlY3RlZChzZWFyY2g6IHsgdGV4dDogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZWFyY2ggPSBzZWFyY2gudGV4dDtcbiAgICAgIHRoaXMuc2VhcmNoT3ZlclNlbGVjdGVkLmVtaXQodGhpcy5zZWxlY3RlZFNlYXJjaCk7XG4gICB9XG5cbiAgIC8vIE1vdmUgZnJvbSBhbGwgdG8gc2VsZWN0ZWRcbiAgIG9uTW92ZVRvU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICBsZXQgaWRzOiBJZExpc3QgPSB0aGlzLmdldElkc1RvTW92ZSh0aGlzLmNvcHlBbGxFbGVtZW50KTtcbiAgICAgIGxldCByZXN1bHQ6IExpc3QgPSB0aGlzLm1vdmVJZHNGcm9tQWxsVG9TZWxlY3RlZCh0aGlzLm9yaWdpbmFsQWxsLCB0aGlzLm9yaWdpbmFsU2VsZWN0ZWQsIGlkcyk7XG4gICAgICB0aGlzLmVtaXR0ZXIuZW1pdChyZXN1bHQpO1xuICAgICAgaWYgKHRoaXMuaXRlbUFsbCkgdGhpcy5pdGVtQWxsLnNlbGVjdGVkID0gZmFsc2U7XG4gICB9XG5cbiAgIC8vIFJlbW92ZSBmcm9tIHNlbGVjdGVkXG4gICBvbk1vdmVUb0FsbChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgIGxldCBpZHM6IElkTGlzdCA9IHRoaXMuZ2V0SWRzVG9Nb3ZlKHRoaXMuY29weVNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgbGV0IHJlc3VsdDogTGlzdCA9IHRoaXMucmVtb3ZlSWRzRnJvbVNlbGVjdGVkKHRoaXMub3JpZ2luYWxTZWxlY3RlZCwgaWRzKTtcbiAgICAgIHRoaXMuZW1pdHRlci5lbWl0KHJlc3VsdCk7XG4gICAgICBpZiAodGhpcy5pdGVtQWxsKSB0aGlzLml0ZW1BbGwuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgIH1cblxuICAgLy8gTW92ZSBhbGwgdG8gc2VsZWN0ZWRcbiAgIG9uTW92ZUFsbFRvU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICB0aGlzLmVtaXR0ZXIuZW1pdChfLmNsb25lRGVlcCh0aGlzLm9yaWdpbmFsQWxsLmZpbHRlcigoZWxlbSkgPT4gIWVsZW0uZGlzYWJsZWQpKSk7XG4gICB9XG5cbiAgIC8vIFJlbW92ZSBBbGwgZnJvbSBzZWxlY3RlZFxuICAgb25Nb3ZlQWxsVG9BbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICB0aGlzLmVtaXR0ZXIuZW1pdChbXSk7XG4gICB9XG5cbiAgIGluaXQoYWxsOiBMaXN0LCBzZWxlY3RlZDogTGlzdCwgY2hhbmdlRW1pdHRlcjogRXZlbnRFbWl0dGVyPExpc3Q+LCBzb3J0ZWQ6ICdpZCcgfCAnbmFtZScgfCAnbm90T3JkZXInLFxuICAgICAgaGFzQ2hlY2tib3hBbGxMaXN0OiBib29sZWFuID0gZmFsc2UsIGhhc0NoZWNrYm94U2VsZWN0ZWRMaXN0OiBib29sZWFuID0gZmFsc2UsIGl0ZW1BbGw6IFN0VHdvTGlzdFNlbGVjdGlvbkVsZW1lbnQgPSA8YW55Pm51bGwpOiB2b2lkIHtcbiAgICAgIHRoaXMuZW1pdHRlciA9IGNoYW5nZUVtaXR0ZXI7XG4gICAgICB0aGlzLnNvcnRMaXN0cyA9IHNvcnRlZDtcbiAgICAgIHRoaXMub3JpZ2luYWxBbGwgPSBhbGw7XG4gICAgICB0aGlzLm9yaWdpbmFsU2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIHRoaXMuZ2VuZXJhdGVXb3JrTGlzdHMoKTtcbiAgICAgIHRoaXMuaGFzQ2hlY2tib3hBbGxMaXN0ID0gaGFzQ2hlY2tib3hBbGxMaXN0O1xuICAgICAgdGhpcy5oYXNDaGVja2JveFNlbGVjdGVkTGlzdCA9IGhhc0NoZWNrYm94U2VsZWN0ZWRMaXN0O1xuICAgICAgdGhpcy5pdGVtQWxsID0gaXRlbUFsbDtcbiAgIH1cblxuICAgY2hlY2tDaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMsIGFsbExpc3Q6IHN0cmluZywgc2VsZWN0ZWRMaXN0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGlmIChjaGFuZ2VzW2FsbExpc3RdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMub3JpZ2luYWxBbGwgPSBjaGFuZ2VzW2FsbExpc3RdLmN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2VzW3NlbGVjdGVkTGlzdF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhpcy5vcmlnaW5hbFNlbGVjdGVkID0gY2hhbmdlc1tzZWxlY3RlZExpc3RdLmN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2VzW2FsbExpc3RdICE9PSB1bmRlZmluZWQgfHwgY2hhbmdlc1tzZWxlY3RlZExpc3RdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuZ2VuZXJhdGVXb3JrTGlzdHMoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSBhcHBseVNlbGVjdEFsbCh0d29MaXN0OiBTdFR3b0xpc3RTZWxlY3Rpb25FbGVtZW50W10sIGVsZW1TZWFyY2hlZDogc3RyaW5nLCBhbGxTZWxlY3RlZDogYm9vbGVhbik6IFN0VHdvTGlzdFNlbGVjdGlvbkVsZW1lbnRbXSB7XG4gICAgICBsZXQgZmlsdGVyUGlwZSA9IG5ldyBTdEZpbHRlckxpc3QoKTtcbiAgICAgIGxldCBmaWx0ZXJlZEJ5U2VhcmNoID0gZmlsdGVyUGlwZS50cmFuc2Zvcm0odHdvTGlzdCwgJ25hbWUnLCBlbGVtU2VhcmNoZWQpO1xuICAgICAgaWYgKGVsZW1TZWFyY2hlZCkge1xuICAgICAgICAgdHdvTGlzdC5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWVsZW0uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZEJ5U2VhcmNoLmZpbmQoZmlsdGVyZWQgPT4gZmlsdGVyZWQubmFtZSA9PT0gZWxlbS5uYW1lKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtLnNlbGVjdGVkID0gIWFsbFNlbGVjdGVkO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgfSk7XG4gICAgICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0d29MaXN0ID0gXy5jbG9uZURlZXAodGhpcy5jaGFuZ2VTZWxlY3RlZEl0ZW1MaXN0KHR3b0xpc3QsICFhbGxTZWxlY3RlZCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR3b0xpc3Q7XG4gICB9XG5cbiAgIHByaXZhdGUgY2hhbmdlU2VsZWN0ZWRJdGVtTGlzdChsaXN0OiBTdFR3b0xpc3RTZWxlY3Rpb25FbGVtZW50W10sIHNlbGVjdGVkOiBib29sZWFuKTogU3RUd29MaXN0U2VsZWN0aW9uRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBfLmNsb25lRGVlcChsaXN0KS5tYXAoKGVsZW0pID0+IHtcbiAgICAgICAgIGVsZW0uc2VsZWN0ZWQgPSAoIWVsZW0uZGlzYWJsZWQpID8gc2VsZWN0ZWQgOiBlbGVtLnNlbGVjdGVkO1xuICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICB9KTtcbiAgIH1cblxuICAgcHJpdmF0ZSBnZXROdW1JdGVtc1NlbGVjdGVkKGxpc3Q6IExpc3QpOiBudW1iZXIge1xuICAgICAgY29uc3QgcmVkdWNlciA9IChhY2N1bXVsYXRvcjogbnVtYmVyLCBjdXJyZW50VmFsdWU6IFN0VHdvTGlzdFNlbGVjdGlvbkVsZW1lbnQpID0+IHtcbiAgICAgICAgIHJldHVybiAoY3VycmVudFZhbHVlLnNlbGVjdGVkKSA/IGFjY3VtdWxhdG9yICsgMSA6IGFjY3VtdWxhdG9yICsgMDtcbiAgICAgIH07XG4gICAgICByZXR1cm4gbGlzdC5yZWR1Y2UocmVkdWNlciwgMCk7XG4gICB9XG5cbiAgIHByaXZhdGUgZ2VuZXJhdGVXb3JrTGlzdHMoKTogdm9pZCB7XG4gICAgICB0aGlzLmNvcHlBbGxFbGVtZW50ID0gdGhpcy5jb3B5TGlzdHModGhpcy5vcmlnaW5hbEFsbCwgdGhpcy5jb3B5QWxsRWxlbWVudCwgdGhpcy5vcmlnaW5hbFNlbGVjdGVkKTtcbiAgICAgIHRoaXMuY29weVNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLmNvcHlMaXN0cyh0aGlzLm9yaWdpbmFsU2VsZWN0ZWQsIHRoaXMuY29weVNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgaWYgKHRoaXMuc29ydExpc3RzICE9PSB1bmRlZmluZWQgJiYgKHRoaXMuc29ydExpc3RzID09PSAnaWQnIHx8IHRoaXMuc29ydExpc3RzID09PSAnbmFtZScpKSB7XG4gICAgICAgICB0aGlzLmNvcHlBbGxFbGVtZW50ID0gdGhpcy5vcmRlckxpc3RCeSh0aGlzLmNvcHlBbGxFbGVtZW50LCB0aGlzLnNvcnRMaXN0cyk7XG4gICAgICAgICB0aGlzLmNvcHlTZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5vcmRlckxpc3RCeSh0aGlzLmNvcHlTZWxlY3RlZEVsZW1lbnRzLCB0aGlzLnNvcnRMaXN0cyk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgY29weUxpc3RzKG5ld1ZhbHVlOiBMaXN0LCBwcmV2U3RhdGU6IExpc3QsIHdpdGhvdXQ/OiBMaXN0KTogTGlzdCB7XG4gICAgICBsZXQgbGlzdDogTGlzdCA9IF8uY2xvbmVEZWVwKG5ld1ZhbHVlKTtcbiAgICAgIGlmICh3aXRob3V0ICYmIHdpdGhvdXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgbGlzdCA9IF8uZGlmZmVyZW5jZUJ5KGxpc3QsIHdpdGhvdXQsICdpZCcpO1xuICAgICAgfVxuXG4gICAgICBsZXQgc2VsZWN0ZWQ6IElkTGlzdCA9IHRoaXMuZ2V0SWRzVG9Nb3ZlKHByZXZTdGF0ZSk7XG4gICAgICB0aGlzLnNlYXJjaEFuZFNlbGVjdChsaXN0LCBzZWxlY3RlZCk7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgIH1cblxuICAgcHJpdmF0ZSBzZWFyY2hBbmRTZWxlY3QobGlzdDogTGlzdCwgc2VsZWN0ZWQ6IElkTGlzdCk6IHZvaWQge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgbGV0IGFjdHVhbEluZGV4ID0gLTE7XG4gICAgICB3aGlsZSAoc2VsZWN0ZWQubGVuZ3RoID4gMCAmJiBpIDwgbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgIGFjdHVhbEluZGV4ID0gc2VsZWN0ZWQuaW5kZXhPZihsaXN0W2ldLmlkKTtcbiAgICAgICAgIGlmIChhY3R1YWxJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBsaXN0W2ldLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHNlbGVjdGVkLnNwbGljZShhY3R1YWxJbmRleCwgMSk7XG4gICAgICAgICAgICBhY3R1YWxJbmRleCA9IC0xO1xuICAgICAgICAgfVxuICAgICAgICAgaSsrO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGdldElkc1RvTW92ZShsaXN0OiBMaXN0KTogSWRMaXN0IHtcbiAgICAgIHJldHVybiBsaXN0LnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgaWYgKGN1cnIuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGN1cnIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHByZXYucHVzaChjdXJyLmlkKTtcbiAgICAgICAgIH1cbiAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwgW10pO1xuICAgfVxuXG4gICBwcml2YXRlIG1vdmVJZHNGcm9tQWxsVG9TZWxlY3RlZChhbGw6IExpc3QsIHNlbGVjdGVkOiBMaXN0LCBpZHM6IElkTGlzdCk6IExpc3Qge1xuICAgICAgbGV0IGl0ZW1zOiBMaXN0ID0gYWxsLmZpbHRlcigoaXRlbSkgPT4gXy5pbmNsdWRlcyhpZHMsIGl0ZW0uaWQpKTtcbiAgICAgIHJldHVybiBfLnhvckJ5KHNlbGVjdGVkLCBfLmNsb25lRGVlcChpdGVtcyksICdpZCcpO1xuICAgfVxuXG4gICBwcml2YXRlIHJlbW92ZUlkc0Zyb21TZWxlY3RlZChzZWxlY3RlZDogTGlzdCwgaWRzOiBJZExpc3QpOiBMaXN0IHtcbiAgICAgIHJldHVybiBzZWxlY3RlZC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgIGlmICghXy5pbmNsdWRlcyhpZHMsIGN1cnIuaWQpKSB7XG4gICAgICAgICAgICBwcmV2LnB1c2goXy5jbG9uZShjdXJyKSk7XG4gICAgICAgICB9XG4gICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIFtdKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBvcmRlckxpc3RCeShsaXN0OiBMaXN0LCBieTogc3RyaW5nKTogTGlzdCB7XG4gICAgICByZXR1cm4gXy5zb3J0QnkobGlzdCwgYnkpO1xuICAgfVxuXG4gICBwcml2YXRlIGNhblNlbGVjdChzZWxlY3Rpb246IFN0VHdvTGlzdFNlbGVjdGlvbkVsZW1lbnQsIGxpc3Q6IExpc3QpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBzZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5kaXNhYmxlZCAmJiBsaXN0ICE9PSB1bmRlZmluZWQgJiYgbGlzdC5sZW5ndGggPiAwO1xuICAgfVxufVxuIl19