UNPKG

ng-devui

Version:

DevUI components based on Angular

261 lines 38.2 kB
import { Injectable, isDevMode } from '@angular/core'; import { DDGridStack, Utils } from 'gridstack'; import { DDElement } from 'gridstack/dist/dd-element'; import * as i0 from "@angular/core"; export class GridStackService { constructor() { this._itemRemoving = (el, remove) => { const node = el ? el.gridstackNode : undefined; if (!node || !node.grid) { return; } remove ? (node._isAboutToRemove = true) : delete node._isAboutToRemove; remove ? el.classList.add('grid-stack-item-removing') : el.classList.remove('grid-stack-item-removing'); }; } getDD() { return DDGridStack.get(); } static cleanDragIn(el) { if (el.classList.contains('ui-draggable')) { DDGridStack.get().draggable(el, 'destroy'); } } static isDraggable(el) { return Boolean(el.classList.contains('ui-draggable')); } static isDroppable(el) { return Boolean(el.classList.contains('ui-droppable')); } static enableDrag(el) { if (!GridStackService.isDraggable(el)) { return; } DDGridStack.get().draggable(el, 'enable'); } static disableDrag(el) { if (!GridStackService.isDraggable(el)) { return; } DDGridStack.get().draggable(el, 'disable'); } static enableDrop(el) { if (!GridStackService.isDroppable(el)) { return; } DDGridStack.get().droppable(el, 'enable'); } static disableDrop(el) { if (!GridStackService.isDroppable(el)) { return; } DDGridStack.get().droppable(el, 'disable'); } resetAcceptWidget(dashboard) { if (!this.gridStack) { if (isDevMode()) { console.warn('call resetAcceptWidget after gridStack init'); } return; } if (this.gridStack.opts.staticGrid || !this.gridStack.opts.acceptWidgets) { return; } if (!this.getDD().isDroppable(this.gridStack.el)) { const that = this.gridStack; this.getDD().droppable(that.el, { accept: (el) => { const node = el.gridstackNode; // set accept drop to true on ourself (which we ignore) so we don't get "can't drop" icon in HTML5 mode while moving if (node && node.grid === that) { return true; } if (!that.opts.acceptWidgets) { return false; } // check for accept method or class matching let canAccept = true; if (typeof that.opts.acceptWidgets === 'function') { canAccept = that.opts.acceptWidgets(el); } else { const selector = that.opts.acceptWidgets === true ? '.grid-stack-item' : that.opts.acceptWidgets; canAccept = el.matches(selector); } // finally check to make sure we actually have space left #1571 if (canAccept && node && that.opts.maxRow) { const n = { w: node.w, h: node.h, minW: node.minW, minH: node.minH }; // only width/height matters and autoPosition canAccept = that.engine.willItFit(n); } return canAccept; }, }); } this.getDD() .off(this.gridStack.el, 'dropout') .on(this.gridStack.el, 'dropout', (event, el, helper) => { // 覆盖这个方法是因为 float模式下 dropout影响了原来的布局 const that = this.gridStack; const node = el.gridstackNode; if (!node.grid || node.grid === that) { that._leave(el, helper); } this.getDD().off(el, 'drag'); return false; }) .off(this.gridStack.el, 'drop') .on(this.gridStack.el, 'drop', (event, el, helper) => { // 覆盖这个方法是因为 drop的情况不想让它放进去而是只发射通知 const that = this.gridStack; const node = el.gridstackNode; if (node && node.grid === that && !node._isExternal) { return false; } const wasAdded = !!that.placeholder.parentElement; that.placeholder.remove(); const origNode = el._gridstackNodeOrig; delete el._gridstackNodeOrig; if (!node) { return false; } if (wasAdded) { that.engine.cleanupNode(node); // 好像没用 node.grid = that; } if (helper !== el) { helper.remove(); el.gridstackNode = origNode; // original item (left behind) is re-stored to pre dragging as the node now has drop info } else { Utils.removePositioningStyles(el); } this.getDD().off(el, 'drag'); that.engine.removeNode(node); that._updateContainerHeight(); dashboard.handleDragInNode(node, origNode, this.dragInWidget); }); } resetRemoveDrop(dashboard) { if (!this.gridStack) { if (isDevMode()) { console.warn('call resetDragDrop after gridStack init'); } return; } if (!(!this.gridStack.opts.staticGrid && typeof this.gridStack.opts.removable === 'string')) { return; } const trashZone = document.querySelector(this.gridStack.opts.removable); if (!trashZone) { return; } if (this.getDD().isDroppable(trashZone)) { // 清理掉了dropover和dropout 直接重新绑定对应的逻辑 this.getDD().off(trashZone, 'dropover').off(trashZone, 'dropout'); } } /* 设置新的可拖入的widget */ setupDragIn(el, widget, helper, notify) { const _ddElement = DDElement.init(el); _ddElement.setupDraggable({ ...widget.targetDashboard.finalOption.dragInOptions, ...{ helper: helper || widget.targetDashboard.finalOption.dragInOptions.helper, handle: this.gridStack.opts.handle }, ...{ start: () => { this.dragInWidget = widget; if (notify) { notify('dragStart')(); } }, stop: () => { // TODO: 升级gridstack@6.0.0后drop内dragInWidget一直为undefined ,因此删掉了 this.dragInWidget = undefined; if (notify) { notify('dragStop')(); } }, }, }); } destroyDragIn(el) { this.getDD().draggable(el, 'destroy'); } /* 设置自定义的回收站 */ setupRemoveDropArea(trashZone, dashboard, trash) { if (!this.gridStack) { if (isDevMode()) { console.warn('call setupRemoveDropArea after gridStack init'); } return; } const trashEl = trashZone; this.getDD() .droppable(trashEl, this.gridStack.opts.removableOptions) .on(trashEl, 'dropover', (event, el) => this._itemRemoving(el, true)) .on(trashEl, 'dropout', (event, el) => this._itemRemoving(el, false)); } /* 清理自定义的回收站 */ destroyRemoveDropAreas(trashZone) { if (!this.gridStack) { console.warn('call destroyRemoveDropAreas after gridStack init'); return; } const that = this.gridStack; if (!this.getDD().isDroppable(trashZone)) { return; } this.getDD().off(trashZone, 'dropover').off(trashZone, 'dropout').off(trashZone, 'drop'); } // 设置背景 updateBackgroundGridBlock() { if (this.gridStack) { if (!this.lastStyleSheet) { this.lastStyleSheet = Utils.createStylesheet(`d-dashboard-${this.gridStack.opts._styleSheetClass}`, this.gridStack.el.parentElement); } else { this.lastStyleSheet.removeRule(0); } const column = this.gridStack.opts.column; const margin = this.gridStack.opts.margin; const marginUnit = this.gridStack.opts.marginUnit; const cellHeight = this.gridStack.opts.cellHeight; const cellHeightUnit = this.gridStack.opts.cellHeightUnit; const prefix = `.${this.gridStack.opts._styleSheetClass}`; if (!this.lastStyleSheet) { return; } Utils.addCSSRule(this.lastStyleSheet, `${prefix}.d-dashboard-show-grid-block::before`, ` background-image: linear-gradient(#fff 0, #fff ${margin * 2}${marginUnit}, transparent ${margin * 2}${marginUnit}, transparent 100%), linear-gradient(90deg, #fff 0, #fff ${margin * 2}${marginUnit}, transparent ${margin * 2}${marginUnit}, transparent 100%), linear-gradient(#f8f8f8 0 , #f8f8f8 100%); background-image: linear-gradient(var(--devui-base-bg, #fff) 0, var(--devui-base-bg, #fff) ${margin * 2}${marginUnit}, transparent ${margin * 2}${marginUnit}, transparent 100%), linear-gradient(90deg, var(--devui-base-bg, #fff) 0, var(--devui-base-bg, #fff) ${margin * 2}${marginUnit}, transparent ${margin * 2}${marginUnit}, transparent 100%), linear-gradient(var(--devui-area, #f8f8f8) 0 , var(--devui-area, #f8f8f8) 100%); background-size: ${100 / column}% ${cellHeight}${cellHeightUnit}; background-position: -${margin}${marginUnit} -${margin}${marginUnit}; `); this.lastColumn = column; } } setBackgroundGridBlockIfColumnChange() { if (this.gridStack?.opts?.column !== this.lastColumn) { this.updateBackgroundGridBlock(); } } removeBackgroundGridBlockStyleSheet() { if (this.lastStyleSheet) { Utils.removeStylesheet(`d-dashboard-${this.gridStack.opts._class}`); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridStackService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridStackService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridStackService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1zdGFjay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvZGFzaGJvYXJkL2dyaWQtc3RhY2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFpRCxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUt0RCxNQUFNLE9BQU8sZ0JBQWdCO0lBRDdCO1FBOENFLGtCQUFhLEdBQUcsQ0FBQyxFQUF1QixFQUFFLE1BQWUsRUFBRSxFQUFFO1lBQzNELE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQy9DLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFFLElBQVksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBUSxJQUFZLENBQUMsZ0JBQWdCLENBQUM7WUFDekYsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzFHLENBQUMsQ0FBQztLQWlPSDtJQS9RQyxLQUFLO1FBQ0gsT0FBTyxXQUFXLENBQUMsR0FBRyxFQUFpQixDQUFDO0lBQzFDLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQWU7UUFDaEMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3pDLFdBQVcsQ0FBQyxHQUFHLEVBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBZTtRQUNoQyxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQWU7UUFDaEMsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFlO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPO1FBQ1QsQ0FBQztRQUNBLFdBQVcsQ0FBQyxHQUFHLEVBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFlO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPO1FBQ1QsQ0FBQztRQUNBLFdBQVcsQ0FBQyxHQUFHLEVBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFlO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPO1FBQ1QsQ0FBQztRQUNBLFdBQVcsQ0FBQyxHQUFHLEVBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFlO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPO1FBQ1QsQ0FBQztRQUNBLFdBQVcsQ0FBQyxHQUFHLEVBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBU0QsaUJBQWlCLENBQUMsU0FBNkI7UUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkNBQTZDLENBQUMsQ0FBQztZQUM5RCxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pFLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUM5QixNQUFNLEVBQUUsQ0FBQyxFQUF1QixFQUFFLEVBQUU7b0JBQ2xDLE1BQU0sSUFBSSxHQUFrQixFQUFFLENBQUMsYUFBYSxDQUFDO29CQUM3QyxvSEFBb0g7b0JBQ3BILElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7d0JBQy9CLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQzdCLE9BQU8sS0FBSyxDQUFDO29CQUNmLENBQUM7b0JBQ0QsNENBQTRDO29CQUM1QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBQ3JCLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxVQUFVLEVBQUUsQ0FBQzt3QkFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMxQyxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUF3QixDQUFDO3dCQUM3RyxTQUFTLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDbkMsQ0FBQztvQkFDRCwrREFBK0Q7b0JBQy9ELElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUMxQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyw2Q0FBNkM7d0JBQ25ILFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkMsQ0FBQztvQkFDRCxPQUFPLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFO2FBQ1QsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQzthQUNqQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQXVCLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0UscUNBQXFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFRLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0IsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7YUFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDO2FBQzlCLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBdUIsRUFBRSxNQUEyQixFQUFFLEVBQUU7WUFDN0Ysa0NBQWtDO1lBQ2xDLE1BQU0sSUFBSSxHQUFRLElBQUksQ0FBQyxTQUFTLENBQUM7WUFFakMsTUFBTSxJQUFJLEdBQWtCLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDN0MsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBRSxJQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzdELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztZQUNsRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRTFCLE1BQU0sUUFBUSxHQUFJLEVBQVUsQ0FBQyxrQkFBa0IsQ0FBQztZQUNoRCxPQUFRLEVBQVUsQ0FBQyxrQkFBa0IsQ0FBQztZQUV0QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU87Z0JBQ3RDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ25CLENBQUM7WUFFRCxJQUFJLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixFQUFFLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxDQUFDLHlGQUF5RjtZQUN4SCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU3QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUU5QixTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0QsZUFBZSxDQUFDLFNBQTZCO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM1RixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFnQixDQUFDO1FBQ3ZGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFDRCxvQkFBb0I7SUFDcEIsV0FBVyxDQUNULEVBQWUsRUFDZixNQUF1QyxFQUN2QyxNQUErQyxFQUMvQyxNQUFzRDtRQUV0RCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLFVBQVUsQ0FBQyxjQUFjLENBQUM7WUFDeEIsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxhQUFhO1lBQ25ELEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNwSCxHQUFHO2dCQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ1YsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7b0JBQzNCLElBQUksTUFBTSxFQUFFLENBQUM7d0JBQ1gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxJQUFJLEVBQUUsR0FBRyxFQUFFO29CQUNULDhGQUE4RjtvQkFDOUYsSUFBSSxNQUFNLEVBQUUsQ0FBQzt3QkFDWCxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsQ0FBQztnQkFDSCxDQUFDO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsYUFBYSxDQUFDLEVBQWU7UUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELGVBQWU7SUFDZixtQkFBbUIsQ0FBQyxTQUFzQixFQUFFLFNBQTZCLEVBQUUsS0FBc0M7UUFDL0csSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssRUFBRTthQUNULFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7YUFDeEQsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNwRSxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELGVBQWU7SUFDZixzQkFBc0IsQ0FBQyxTQUFzQjtRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztZQUNqRSxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsT0FBTztJQUNQLHlCQUF5QjtRQUN2QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDMUMsZUFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFZLENBQUMsZ0JBQWdCLEVBQUUsRUFDOUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUNoQyxDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFnQixDQUFDO1lBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQWdCLENBQUM7WUFDcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2xELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQW9CLENBQUM7WUFDNUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzFELE1BQU0sTUFBTSxHQUFHLElBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QixPQUFPO1lBQ1QsQ0FBQztZQUVELEtBQUssQ0FBQyxVQUFVLENBQ2QsSUFBSSxDQUFDLGNBQWMsRUFDbkIsR0FBRyxNQUFNLHNDQUFzQyxFQUMvQzs7dUNBRStCLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVTt3QkFDdEMsTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVOzhDQUNELE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVTt3QkFDN0MsTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVOzs7bUZBR29DLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVTt3QkFDbEYsTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVOzBGQUMyQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLFVBQVU7d0JBQ3pGLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVTs7eUJBRXRCLEdBQUcsR0FBRyxNQUFNLEtBQUssVUFBVSxHQUFHLGNBQWM7OEJBQ3ZDLE1BQU0sR0FBRyxVQUFVLEtBQUssTUFBTSxHQUFHLFVBQVU7T0FDbEUsQ0FDQSxDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxvQ0FBb0M7UUFDbEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsbUNBQW1DO1FBQ2pDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLENBQUM7SUFDSCxDQUFDOytHQXBSVSxnQkFBZ0I7bUhBQWhCLGdCQUFnQjs7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEREdyaWRTdGFjaywgR3JpZEl0ZW1IVE1MRWxlbWVudCwgR3JpZFN0YWNrLCBHcmlkU3RhY2tOb2RlLCBVdGlscyB9IGZyb20gJ2dyaWRzdGFjayc7XHJcbmltcG9ydCB7IERERWxlbWVudCB9IGZyb20gJ2dyaWRzdGFjay9kaXN0L2RkLWVsZW1lbnQnO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICcuL2Rhc2hib2FyZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRMaWJyYXJ5VHJhc2hEaXJlY3RpdmUgfSBmcm9tICcuL3dpZGdldC1saWJyYXJ5L2xpYnJhcnktdHJhc2guZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRGFzaGJvYXJkTGlicmFyeVdpZGdldERpcmVjdGl2ZSB9IGZyb20gJy4vd2lkZ2V0LWxpYnJhcnkvbGlicmFyeS13aWRnZXQuZGlyZWN0aXZlJztcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgR3JpZFN0YWNrU2VydmljZSB7XHJcbiAgZ3JpZFN0YWNrOiBHcmlkU3RhY2s7XHJcbiAgZHJhZ0luV2lkZ2V0OiBEYXNoYm9hcmRMaWJyYXJ5V2lkZ2V0RGlyZWN0aXZlO1xyXG4gIGxhc3RDb2x1bW46IG51bWJlcjtcclxuICBsYXN0U3R5bGVTaGVldDogQ1NTU3R5bGVTaGVldDtcclxuXHJcbiAgZ2V0REQoKSB7XHJcbiAgICByZXR1cm4gRERHcmlkU3RhY2suZ2V0KCkgYXMgRERHcmlkU3RhY2s7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY2xlYW5EcmFnSW4oZWw6IEhUTUxFbGVtZW50KSB7XHJcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCd1aS1kcmFnZ2FibGUnKSkge1xyXG4gICAgICAoRERHcmlkU3RhY2suZ2V0KCkgYXMgRERHcmlkU3RhY2spLmRyYWdnYWJsZShlbCwgJ2Rlc3Ryb3knKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhdGljIGlzRHJhZ2dhYmxlKGVsOiBIVE1MRWxlbWVudCkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCd1aS1kcmFnZ2FibGUnKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBpc0Ryb3BwYWJsZShlbDogSFRNTEVsZW1lbnQpIHtcclxuICAgIHJldHVybiBCb29sZWFuKGVsLmNsYXNzTGlzdC5jb250YWlucygndWktZHJvcHBhYmxlJykpO1xyXG4gIH1cclxuICBzdGF0aWMgZW5hYmxlRHJhZyhlbDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGlmICghR3JpZFN0YWNrU2VydmljZS5pc0RyYWdnYWJsZShlbCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgKERER3JpZFN0YWNrLmdldCgpIGFzIERER3JpZFN0YWNrKS5kcmFnZ2FibGUoZWwsICdlbmFibGUnKTtcclxuICB9XHJcbiAgc3RhdGljIGRpc2FibGVEcmFnKGVsOiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKCFHcmlkU3RhY2tTZXJ2aWNlLmlzRHJhZ2dhYmxlKGVsKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAoRERHcmlkU3RhY2suZ2V0KCkgYXMgRERHcmlkU3RhY2spLmRyYWdnYWJsZShlbCwgJ2Rpc2FibGUnKTtcclxuICB9XHJcbiAgc3RhdGljIGVuYWJsZURyb3AoZWw6IEhUTUxFbGVtZW50KSB7XHJcbiAgICBpZiAoIUdyaWRTdGFja1NlcnZpY2UuaXNEcm9wcGFibGUoZWwpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIChEREdyaWRTdGFjay5nZXQoKSBhcyBEREdyaWRTdGFjaykuZHJvcHBhYmxlKGVsLCAnZW5hYmxlJyk7XHJcbiAgfVxyXG4gIHN0YXRpYyBkaXNhYmxlRHJvcChlbDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGlmICghR3JpZFN0YWNrU2VydmljZS5pc0Ryb3BwYWJsZShlbCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgKERER3JpZFN0YWNrLmdldCgpIGFzIERER3JpZFN0YWNrKS5kcm9wcGFibGUoZWwsICdkaXNhYmxlJyk7XHJcbiAgfVxyXG4gIF9pdGVtUmVtb3ZpbmcgPSAoZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQsIHJlbW92ZTogYm9vbGVhbikgPT4ge1xyXG4gICAgY29uc3Qgbm9kZSA9IGVsID8gZWwuZ3JpZHN0YWNrTm9kZSA6IHVuZGVmaW5lZDtcclxuICAgIGlmICghbm9kZSB8fCAhbm9kZS5ncmlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHJlbW92ZSA/ICgobm9kZSBhcyBhbnkpLl9pc0Fib3V0VG9SZW1vdmUgPSB0cnVlKSA6IGRlbGV0ZSAobm9kZSBhcyBhbnkpLl9pc0Fib3V0VG9SZW1vdmU7XHJcbiAgICByZW1vdmUgPyBlbC5jbGFzc0xpc3QuYWRkKCdncmlkLXN0YWNrLWl0ZW0tcmVtb3ZpbmcnKSA6IGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2dyaWQtc3RhY2staXRlbS1yZW1vdmluZycpO1xyXG4gIH07XHJcbiAgcmVzZXRBY2NlcHRXaWRnZXQoZGFzaGJvYXJkOiBEYXNoYm9hcmRDb21wb25lbnQpIHtcclxuICAgIGlmICghdGhpcy5ncmlkU3RhY2spIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdjYWxsIHJlc2V0QWNjZXB0V2lkZ2V0IGFmdGVyIGdyaWRTdGFjayBpbml0Jyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZ3JpZFN0YWNrLm9wdHMuc3RhdGljR3JpZCB8fCAhdGhpcy5ncmlkU3RhY2sub3B0cy5hY2NlcHRXaWRnZXRzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5nZXRERCgpLmlzRHJvcHBhYmxlKHRoaXMuZ3JpZFN0YWNrLmVsKSkge1xyXG4gICAgICBjb25zdCB0aGF0ID0gdGhpcy5ncmlkU3RhY2s7XHJcbiAgICAgIHRoaXMuZ2V0REQoKS5kcm9wcGFibGUodGhhdC5lbCwge1xyXG4gICAgICAgIGFjY2VwdDogKGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBub2RlOiBHcmlkU3RhY2tOb2RlID0gZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICAgIC8vIHNldCBhY2NlcHQgZHJvcCB0byB0cnVlIG9uIG91cnNlbGYgKHdoaWNoIHdlIGlnbm9yZSkgc28gd2UgZG9uJ3QgZ2V0IFwiY2FuJ3QgZHJvcFwiIGljb24gaW4gSFRNTDUgbW9kZSB3aGlsZSBtb3ZpbmdcclxuICAgICAgICAgIGlmIChub2RlICYmIG5vZGUuZ3JpZCA9PT0gdGhhdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghdGhhdC5vcHRzLmFjY2VwdFdpZGdldHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gY2hlY2sgZm9yIGFjY2VwdCBtZXRob2Qgb3IgY2xhc3MgbWF0Y2hpbmdcclxuICAgICAgICAgIGxldCBjYW5BY2NlcHQgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGF0Lm9wdHMuYWNjZXB0V2lkZ2V0cyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjYW5BY2NlcHQgPSB0aGF0Lm9wdHMuYWNjZXB0V2lkZ2V0cyhlbCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoYXQub3B0cy5hY2NlcHRXaWRnZXRzID09PSB0cnVlID8gJy5ncmlkLXN0YWNrLWl0ZW0nIDogKHRoYXQub3B0cy5hY2NlcHRXaWRnZXRzIGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgIGNhbkFjY2VwdCA9IGVsLm1hdGNoZXMoc2VsZWN0b3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZmluYWxseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgaGF2ZSBzcGFjZSBsZWZ0ICMxNTcxXHJcbiAgICAgICAgICBpZiAoY2FuQWNjZXB0ICYmIG5vZGUgJiYgdGhhdC5vcHRzLm1heFJvdykge1xyXG4gICAgICAgICAgICBjb25zdCBuID0geyB3OiBub2RlLncsIGg6IG5vZGUuaCwgbWluVzogbm9kZS5taW5XLCBtaW5IOiBub2RlLm1pbkggfTsgLy8gb25seSB3aWR0aC9oZWlnaHQgbWF0dGVycyBhbmQgYXV0b1Bvc2l0aW9uXHJcbiAgICAgICAgICAgIGNhbkFjY2VwdCA9IHRoYXQuZW5naW5lLndpbGxJdEZpdChuKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBjYW5BY2NlcHQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdldEREKClcclxuICAgICAgLm9mZih0aGlzLmdyaWRTdGFjay5lbCwgJ2Ryb3BvdXQnKVxyXG4gICAgICAub24odGhpcy5ncmlkU3RhY2suZWwsICdkcm9wb3V0JywgKGV2ZW50LCBlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCwgaGVscGVyKSA9PiB7XHJcbiAgICAgICAgLy8g6KaG55uW6L+Z5Liq5pa55rOV5piv5Zug5Li6IGZsb2F05qih5byP5LiLIGRyb3BvdXTlvbHlk43kuobljp/mnaXnmoTluIPlsYBcclxuICAgICAgICBjb25zdCB0aGF0OiBhbnkgPSB0aGlzLmdyaWRTdGFjaztcclxuICAgICAgICBjb25zdCBub2RlID0gZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICBpZiAoIW5vZGUuZ3JpZCB8fCBub2RlLmdyaWQgPT09IHRoYXQpIHtcclxuICAgICAgICAgIHRoYXQuX2xlYXZlKGVsLCBoZWxwZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldEREKCkub2ZmKGVsLCAnZHJhZycpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfSlcclxuICAgICAgLm9mZih0aGlzLmdyaWRTdGFjay5lbCwgJ2Ryb3AnKVxyXG4gICAgICAub24odGhpcy5ncmlkU3RhY2suZWwsICdkcm9wJywgKGV2ZW50LCBlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCwgaGVscGVyOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgLy8g6KaG55uW6L+Z5Liq5pa55rOV5piv5Zug5Li6IGRyb3DnmoTmg4XlhrXkuI3mg7PorqnlroPmlL7ov5vljrvogIzmmK/lj6rlj5HlsITpgJrnn6VcclxuICAgICAgICBjb25zdCB0aGF0OiBhbnkgPSB0aGlzLmdyaWRTdGFjaztcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZTogR3JpZFN0YWNrTm9kZSA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5ncmlkID09PSB0aGF0ICYmICEobm9kZSBhcyBhbnkpLl9pc0V4dGVybmFsKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB3YXNBZGRlZCA9ICEhdGhhdC5wbGFjZWhvbGRlci5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHRoYXQucGxhY2Vob2xkZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdOb2RlID0gKGVsIGFzIGFueSkuX2dyaWRzdGFja05vZGVPcmlnO1xyXG4gICAgICAgIGRlbGV0ZSAoZWwgYXMgYW55KS5fZ3JpZHN0YWNrTm9kZU9yaWc7XHJcblxyXG4gICAgICAgIGlmICghbm9kZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAod2FzQWRkZWQpIHtcclxuICAgICAgICAgIHRoYXQuZW5naW5lLmNsZWFudXBOb2RlKG5vZGUpOyAvLyDlpb3lg4/msqHnlKhcclxuICAgICAgICAgIG5vZGUuZ3JpZCA9IHRoYXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaGVscGVyICE9PSBlbCkge1xyXG4gICAgICAgICAgaGVscGVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgZWwuZ3JpZHN0YWNrTm9kZSA9IG9yaWdOb2RlOyAvLyBvcmlnaW5hbCBpdGVtIChsZWZ0IGJlaGluZCkgaXMgcmUtc3RvcmVkIHRvIHByZSBkcmFnZ2luZyBhcyB0aGUgbm9kZSBub3cgaGFzIGRyb3AgaW5mb1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBVdGlscy5yZW1vdmVQb3NpdGlvbmluZ1N0eWxlcyhlbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdldEREKCkub2ZmKGVsLCAnZHJhZycpO1xyXG4gICAgICAgIHRoYXQuZW5naW5lLnJlbW92ZU5vZGUobm9kZSk7XHJcblxyXG4gICAgICAgIHRoYXQuX3VwZGF0ZUNvbnRhaW5lckhlaWdodCgpO1xyXG5cclxuICAgICAgICBkYXNoYm9hcmQuaGFuZGxlRHJhZ0luTm9kZShub2RlLCBvcmlnTm9kZSwgdGhpcy5kcmFnSW5XaWRnZXQpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgcmVzZXRSZW1vdmVEcm9wKGRhc2hib2FyZDogRGFzaGJvYXJkQ29tcG9uZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZFN0YWNrKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignY2FsbCByZXNldERyYWdEcm9wIGFmdGVyIGdyaWRTdGFjayBpbml0Jyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCEoIXRoaXMuZ3JpZFN0YWNrLm9wdHMuc3RhdGljR3JpZCAmJiB0eXBlb2YgdGhpcy5ncmlkU3RhY2sub3B0cy5yZW1vdmFibGUgPT09ICdzdHJpbmcnKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB0cmFzaFpvbmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ3JpZFN0YWNrLm9wdHMucmVtb3ZhYmxlKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghdHJhc2hab25lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmdldEREKCkuaXNEcm9wcGFibGUodHJhc2hab25lKSkge1xyXG4gICAgICAvLyDmuIXnkIbmjonkuoZkcm9wb3ZlcuWSjGRyb3BvdXQg55u05o6l6YeN5paw57uR5a6a5a+55bqU55qE6YC76L6RXHJcbiAgICAgIHRoaXMuZ2V0REQoKS5vZmYodHJhc2hab25lLCAnZHJvcG92ZXInKS5vZmYodHJhc2hab25lLCAnZHJvcG91dCcpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKiDorr7nva7mlrDnmoTlj6/mi5blhaXnmoR3aWRnZXQgKi9cclxuICBzZXR1cERyYWdJbihcclxuICAgIGVsOiBIVE1MRWxlbWVudCxcclxuICAgIHdpZGdldDogRGFzaGJvYXJkTGlicmFyeVdpZGdldERpcmVjdGl2ZSxcclxuICAgIGhlbHBlcj86ICgoZXZlbnQ6IGFueSkgPT4gSFRNTEVsZW1lbnQpIHwgc3RyaW5nLFxyXG4gICAgbm90aWZ5PzogKGV2ZW50VHlwZTogc3RyaW5nKSA9PiAoLi4uYXJnczogYW55KSA9PiB2b2lkXHJcbiAgKSB7XHJcbiAgICBjb25zdCBfZGRFbGVtZW50ID0gRERFbGVtZW50LmluaXQoZWwpO1xyXG4gICAgX2RkRWxlbWVudC5zZXR1cERyYWdnYWJsZSh7XHJcbiAgICAgIC4uLndpZGdldC50YXJnZXREYXNoYm9hcmQuZmluYWxPcHRpb24uZHJhZ0luT3B0aW9ucyxcclxuICAgICAgLi4ueyBoZWxwZXI6IGhlbHBlciB8fCB3aWRnZXQudGFyZ2V0RGFzaGJvYXJkLmZpbmFsT3B0aW9uLmRyYWdJbk9wdGlvbnMuaGVscGVyLCBoYW5kbGU6IHRoaXMuZ3JpZFN0YWNrLm9wdHMuaGFuZGxlIH0sXHJcbiAgICAgIC4uLntcclxuICAgICAgICBzdGFydDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kcmFnSW5XaWRnZXQgPSB3aWRnZXQ7XHJcbiAgICAgICAgICBpZiAobm90aWZ5KSB7XHJcbiAgICAgICAgICAgIG5vdGlmeSgnZHJhZ1N0YXJ0JykoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHN0b3A6ICgpID0+IHtcclxuICAgICAgICAgIC8vIFRPRE86IOWNh+e6p2dyaWRzdGFja0A2LjAuMOWQjmRyb3DlhoVkcmFnSW5XaWRnZXTkuIDnm7TkuLp1bmRlZmluZWQgLOWboOatpOWIoOaOieS6hiB0aGlzLmRyYWdJbldpZGdldCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIGlmIChub3RpZnkpIHtcclxuICAgICAgICAgICAgbm90aWZ5KCdkcmFnU3RvcCcpKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBkZXN0cm95RHJhZ0luKGVsOiBIVE1MRWxlbWVudCkge1xyXG4gICAgdGhpcy5nZXRERCgpLmRyYWdnYWJsZShlbCwgJ2Rlc3Ryb3knKTtcclxuICB9XHJcblxyXG4gIC8qIOiuvue9ruiHquWumuS5ieeahOWbnuaUtuermSAqL1xyXG4gIHNldHVwUmVtb3ZlRHJvcEFyZWEodHJhc2hab25lOiBIVE1MRWxlbWVudCwgZGFzaGJvYXJkOiBEYXNoYm9hcmRDb21wb25lbnQsIHRyYXNoPzogRGFzaGJvYXJkTGlicmFyeVRyYXNoRGlyZWN0aXZlKSB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZFN0YWNrKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignY2FsbCBzZXR1cFJlbW92ZURyb3BBcmVhIGFmdGVyIGdyaWRTdGFjayBpbml0Jyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdHJhc2hFbCA9IHRyYXNoWm9uZTtcclxuICAgIHRoaXMuZ2V0REQoKVxyXG4gICAgICAuZHJvcHBhYmxlKHRyYXNoRWwsIHRoaXMuZ3JpZFN0YWNrLm9wdHMucmVtb3ZhYmxlT3B0aW9ucylcclxuICAgICAgLm9uKHRyYXNoRWwsICdkcm9wb3ZlcicsIChldmVudCwgZWwpID0+IHRoaXMuX2l0ZW1SZW1vdmluZyhlbCwgdHJ1ZSkpXHJcbiAgICAgIC5vbih0cmFzaEVsLCAnZHJvcG91dCcsIChldmVudCwgZWwpID0+IHRoaXMuX2l0ZW1SZW1vdmluZyhlbCwgZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIC8qIOa4heeQhuiHquWumuS5ieeahOWbnuaUtuermSAqL1xyXG4gIGRlc3Ryb3lSZW1vdmVEcm9wQXJlYXModHJhc2hab25lOiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKCF0aGlzLmdyaWRTdGFjaykge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ2NhbGwgZGVzdHJveVJlbW92ZURyb3BBcmVhcyBhZnRlciBncmlkU3RhY2sgaW5pdCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB0aGF0ID0gdGhpcy5ncmlkU3RhY2s7XHJcbiAgICBpZiAoIXRoaXMuZ2V0REQoKS5pc0Ryb3BwYWJsZSh0cmFzaFpvbmUpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0REQoKS5vZmYodHJhc2hab25lLCAnZHJvcG92ZXInKS5vZmYodHJhc2hab25lLCAnZHJvcG91dCcpLm9mZih0cmFzaFpvbmUsICdkcm9wJyk7XHJcbiAgfVxyXG5cclxuICAvLyDorr7nva7og4zmma9cclxuICB1cGRhdGVCYWNrZ3JvdW5kR3JpZEJsb2NrKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZFN0YWNrKSB7XHJcbiAgICAgIGlmICghdGhpcy5sYXN0U3R5bGVTaGVldCkge1xyXG4gICAgICAgIHRoaXMubGFzdFN0eWxlU2hlZXQgPSBVdGlscy5jcmVhdGVTdHlsZXNoZWV0KFxyXG4gICAgICAgICAgYGQtZGFzaGJvYXJkLSR7KHRoaXMuZ3JpZFN0YWNrLm9wdHMgYXMgYW55KS5fc3R5bGVTaGVldENsYXNzfWAsXHJcbiAgICAgICAgICB0aGlzLmdyaWRTdGFjay5lbC5wYXJlbnRFbGVtZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmxhc3RTdHlsZVNoZWV0LnJlbW92ZVJ1bGUoMCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkU3RhY2sub3B0cy5jb2x1bW4gYXMgbnVtYmVyO1xyXG4gICAgICBjb25zdCBtYXJnaW4gPSB0aGlzLmdyaWRTdGFjay5vcHRzLm1hcmdpbiBhcyBudW1iZXI7XHJcbiAgICAgIGNvbnN0IG1hcmdpblVuaXQgPSB0aGlzLmdyaWRTdGFjay5vcHRzLm1hcmdpblVuaXQ7XHJcbiAgICAgIGNvbnN0IGNlbGxIZWlnaHQgPSB0aGlzLmdyaWRTdGFjay5vcHRzLmNlbGxIZWlnaHQgYXMgbnVtYmVyO1xyXG4gICAgICBjb25zdCBjZWxsSGVpZ2h0VW5pdCA9IHRoaXMuZ3JpZFN0YWNrLm9wdHMuY2VsbEhlaWdodFVuaXQ7XHJcbiAgICAgIGNvbnN0IHByZWZpeCA9IGAuJHsodGhpcy5ncmlkU3RhY2sub3B0cyBhcyBhbnkpLl9zdHlsZVNoZWV0Q2xhc3N9YDtcclxuICAgICAgaWYgKCF0aGlzLmxhc3RTdHlsZVNoZWV0KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBVdGlscy5hZGRDU1NSdWxlKFxyXG4gICAgICAgIHRoaXMubGFzdFN0eWxlU2hlZXQsXHJcbiAgICAgICAgYCR7cHJlZml4fS5kLWRhc2hib2FyZC1zaG93LWdyaWQtYmxvY2s6OmJlZm9yZWAsXHJcbiAgICAgICAgYFxyXG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOlxyXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZmZmIDAsICNmZmYgJHttYXJnaW4gKiAyfSR7bWFyZ2luVW5pdH0sXHJcbiAgICAgICAgICB0cmFuc3BhcmVudCAke21hcmdpbiAqIDJ9JHttYXJnaW5Vbml0fSwgdHJhbnNwYXJlbnQgMTAwJSksXHJcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjZmZmIDAsICNmZmYgJHttYXJnaW4gKiAyfSR7bWFyZ2luVW5pdH0sXHJcbiAgICAgICAgICB0cmFuc3BhcmVudCAke21hcmdpbiAqIDJ9JHttYXJnaW5Vbml0fSwgdHJhbnNwYXJlbnQgMTAwJSksXHJcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNmOGY4ZjggMCAsICNmOGY4ZjggMTAwJSk7XHJcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6XHJcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KHZhcigtLWRldnVpLWJhc2UtYmcsICNmZmYpIDAsIHZhcigtLWRldnVpLWJhc2UtYmcsICNmZmYpICR7bWFyZ2luICogMn0ke21hcmdpblVuaXR9LFxyXG4gICAgICAgICAgdHJhbnNwYXJlbnQgJHttYXJnaW4gKiAyfSR7bWFyZ2luVW5pdH0sIHRyYW5zcGFyZW50IDEwMCUpLFxyXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCg5MGRlZywgdmFyKC0tZGV2dWktYmFzZS1iZywgI2ZmZikgMCwgdmFyKC0tZGV2dWktYmFzZS1iZywgI2ZmZikgJHttYXJnaW4gKiAyfSR7bWFyZ2luVW5pdH0sXHJcbiAgICAgICAgICB0cmFuc3BhcmVudCAke21hcmdpbiAqIDJ9JHttYXJnaW5Vbml0fSwgdHJhbnNwYXJlbnQgMTAwJSksXHJcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KHZhcigtLWRldnVpLWFyZWEsICNmOGY4ZjgpIDAgLCB2YXIoLS1kZXZ1aS1hcmVhLCAjZjhmOGY4KSAxMDAlKTtcclxuICAgICAgYmFja2dyb3VuZC1zaXplOiAkezEwMCAvIGNvbHVtbn0lICR7Y2VsbEhlaWdodH0ke2NlbGxIZWlnaHRVbml0fTtcclxuICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLSR7bWFyZ2lufSR7bWFyZ2luVW5pdH0gLSR7bWFyZ2lufSR7bWFyZ2luVW5pdH07XHJcbiAgICAgIGBcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5sYXN0Q29sdW1uID0gY29sdW1uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0QmFja2dyb3VuZEdyaWRCbG9ja0lmQ29sdW1uQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZFN0YWNrPy5vcHRzPy5jb2x1bW4gIT09IHRoaXMubGFzdENvbHVtbikge1xyXG4gICAgICB0aGlzLnVwZGF0ZUJhY2tncm91bmRHcmlkQmxvY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUJhY2tncm91bmRHcmlkQmxvY2tTdHlsZVNoZWV0KCkge1xyXG4gICAgaWYgKHRoaXMubGFzdFN0eWxlU2hlZXQpIHtcclxuICAgICAgVXRpbHMucmVtb3ZlU3R5bGVzaGVldChgZC1kYXNoYm9hcmQtJHsodGhpcy5ncmlkU3RhY2sub3B0cyBhcyBhbnkpLl9jbGFzc31gKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19