UNPKG

ng2-right-click-menu

Version:
326 lines 25.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import { Overlay } from '@angular/cdk/overlay'; import { TemplatePortal } from '@angular/cdk/portal'; export class ShContextMenuService { /** * @param {?} overlay */ constructor(overlay) { this.overlay = overlay; this.activeOverlays = []; } /** * @param {?} ctxEvent * @return {?} */ openMenu(ctxEvent) { this.closeCurrentOverlays(); const { menu, mouseEvent, data } = ctxEvent; this.activeMenu = menu; this.anchorElement = this.createAnchorElement(); /** @type {?} */ const scrollStrategy = this.buildScrollStrategy(); /** @type {?} */ const positionStrategy = this.buildPositionStrategy(this.anchorElement, mouseEvent); this.attachContextToItems(menu, data); /** @type {?} */ const overlayRef = this.createAndAttachOverlay(positionStrategy, scrollStrategy, menu, true); this.attachOverlayRef(menu, overlayRef); this.registerDetachEvents(overlayRef); } /** * @param {?} ctxEvent * @return {?} */ openSubMenu(ctxEvent) { const { menu, mouseEvent, targetElement, data, parentMenu } = ctxEvent; mouseEvent.preventDefault(); mouseEvent.stopPropagation(); /** @type {?} */ const scrollStrategy = this.buildScrollStrategy(); /** @type {?} */ const positionStrategy = this.buildPositionStrategyForSubMenu(targetElement); /** @type {?} */ const overlayRef = this.createAndAttachOverlay(positionStrategy, scrollStrategy, menu, false); this.attachContextToItems(menu, data); this.attachThisContext(menu, parentMenu); this.attachOverlayRef(menu, overlayRef); } /** * @return {?} */ destroy() { this.closeCurrentOverlays(); this.subs.unsubscribe(); } /** * @return {?} */ ngOnDestroy() { this.destroy(); } /** * @param {?} menu * @return {?} */ closeSubMenus(menu) { /** @type {?} */ const itemsWithSubMenus = menu.menuItems.filter((/** * @param {?} i * @return {?} */ i => !!i.subMenu && !!i.subMenu.overlayRef)); if (itemsWithSubMenus.length) { itemsWithSubMenus.forEach((/** * @param {?} sm * @return {?} */ sm => this.closeSubMenus(sm.subMenu))); /** @type {?} */ const overlayRefs = itemsWithSubMenus.map((/** * @param {?} i * @return {?} */ i => i.subMenu.overlayRef)); overlayRefs.forEach((/** * @param {?} r * @return {?} */ r => r.dispose())); } } /** * @private * @param {?} overlayRef * @return {?} */ registerDetachEvents(overlayRef) { this.subs = overlayRef .backdropClick() .subscribe(this.closeCurrentOverlays.bind(this)); this.subs.add(overlayRef.detachments().subscribe(this.closeCurrentOverlays.bind(this))); } /** * @private * @param {?} positionStrategy * @param {?} scrollStrategy * @param {?} menu * @param {?=} hasBackdrop * @return {?} */ createAndAttachOverlay(positionStrategy, scrollStrategy, menu, hasBackdrop = true) { /** @type {?} */ const overlayRef = this.overlay.create({ positionStrategy, scrollStrategy, hasBackdrop: hasBackdrop, backdropClass: 'sh-backdrop' }); /* TODO: try passing the TemplatePortal context (data) and then injecting it to the *ngTemplateOutlet in the component template */ /** @type {?} */ const menuPortal = new TemplatePortal(menu.menuTemplate, menu.menuContainer); overlayRef.attach(menuPortal); this.activeOverlays.push(overlayRef); return overlayRef; } /** * @private * @return {?} */ buildScrollStrategy() { return this.overlay.scrollStrategies.reposition({ autoClose: true }); } /** * @private * @param {?} ele * @param {?} event * @return {?} */ buildPositionStrategy(ele, event) { const { x, y } = event; return this.overlay .position() .flexibleConnectedTo(ele) .withDefaultOffsetX(x) .withDefaultOffsetY(y) .withPositions(this.buildPositions()) .withFlexibleDimensions(false) .withPush(true); } /** * @private * @param {?} elm * @return {?} */ buildPositionStrategyForSubMenu(elm) { return this.overlay .position() .flexibleConnectedTo(elm) .withPositions(this.buildSubMenuPositions()) .withFlexibleDimensions(false) .withPush(true); } /** * @private * @return {?} */ closeCurrentOverlays() { if (this.anchorElement) { this.anchorElement.remove(); } this.activeOverlays.forEach((/** * @param {?} o * @return {?} */ o => { o.detach(); o.dispose(); })); this.activeOverlays = []; // TODO: create close subject and emit. // subscribe in component if (this.activeMenu) { this.activeMenu.close(); } } /** * @private * @param {?} menu * @param {?} data * @return {?} */ attachContextToItems(menu, data) { menu.menuItems.forEach((/** * @param {?} i * @return {?} */ i => (i.context.$implicit = data))); } /** * @private * @param {?} menu * @param {?} parentMenu * @return {?} */ attachThisContext(menu, parentMenu) { menu.thisContext = parentMenu.thisContext; } /** * @private * @param {?} menu * @param {?} overlayRef * @return {?} */ attachOverlayRef(menu, overlayRef) { menu.overlayRef = overlayRef; } /** * @private * @return {?} */ createAnchorElement() { /** @type {?} */ const div = document.createElement('div'); div.style.position = 'absolute'; div.style.top = '0'; div.style.bottom = '0'; div.style.left = '0'; div.style.right = '0'; document.body.appendChild(div); return div; } /** * @private * @return {?} */ buildSubMenuPositions() { return [ { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top' }, { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top' }, { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom' }, { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom' } ]; } /** * @private * @return {?} */ buildPositions() { return [ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'top' }, { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top' }, { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }, { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'bottom' } ]; } } ShContextMenuService.decorators = [ { type: Injectable } ]; /** @nocollapse */ ShContextMenuService.ctorParameters = () => [ { type: Overlay } ]; if (false) { /** @type {?} */ ShContextMenuService.prototype.activeOverlays; /** @type {?} */ ShContextMenuService.prototype.subs; /** @type {?} */ ShContextMenuService.prototype.activeMenu; /** @type {?} */ ShContextMenuService.prototype.anchorElement; /** * @type {?} * @private */ ShContextMenuService.prototype.overlay; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2gtY29udGV4dC1tZW51LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZzItcmlnaHQtY2xpY2stbWVudS8iLCJzb3VyY2VzIjpbImxpYi9zaC1jb250ZXh0LW1lbnUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFjLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUVsRSxPQUFPLEVBSU4sT0FBTyxFQUVQLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBU3JELE1BQU0sT0FBTyxvQkFBb0I7Ozs7SUFNaEMsWUFBb0IsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUxwQyxtQkFBYyxHQUFpQixFQUFFLENBQUM7SUFLSyxDQUFDOzs7OztJQUV4QyxRQUFRLENBQUMsUUFBNEI7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Y0FDdEIsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVE7UUFFM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzs7Y0FDMUMsY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRTs7Y0FDM0MsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUNsRCxJQUFJLENBQUMsYUFBYSxFQUNsQixVQUFVLENBQ1Y7UUFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztjQUVoQyxVQUFVLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUM3QyxnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLElBQUksRUFDSixJQUFJLENBQ0o7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXhD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Ozs7O0lBYVAsOENBQWtDOztJQUNsQyxvQ0FBbUI7O0lBQ25CLDBDQUFtQzs7SUFDbkMsNkNBQTJCOzs7OztJQUVmLHVDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2hDb250ZXh0TWVudUNvbXBvbmVudCB9IGZyb20gJy4vc2gtY29udGV4dC1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuXHRDb25uZWN0aW9uUG9zaXRpb25QYWlyLFxuXHRGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXG5cdEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3ksXG5cdE92ZXJsYXksXG5cdFNjcm9sbFN0cmF0ZWd5XG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1xuXHRTaENvbnRleHRNZW51RXZlbnQsXG5cdFNoQ29udGV4dFN1Yk1lbnVFdmVudFxufSBmcm9tICcuL3NoLWNvbnRleHQtbWVudS5tb2RlbHMnO1xuaW1wb3J0IHsgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTaENvbnRleHRNZW51U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cdGFjdGl2ZU92ZXJsYXlzOiBPdmVybGF5UmVmW10gPSBbXTtcblx0c3ViczogU3Vic2NyaXB0aW9uO1xuXHRhY3RpdmVNZW51OiBTaENvbnRleHRNZW51Q29tcG9uZW50O1xuXHRhbmNob3JFbGVtZW50OiBIVE1MRWxlbWVudDtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXkpIHt9XG5cblx0b3Blbk1lbnUoY3R4RXZlbnQ6IFNoQ29udGV4dE1lbnVFdmVudCkge1xuXHRcdHRoaXMuY2xvc2VDdXJyZW50T3ZlcmxheXMoKTtcblx0XHRjb25zdCB7IG1lbnUsIG1vdXNlRXZlbnQsIGRhdGEgfSA9IGN0eEV2ZW50O1xuXG5cdFx0dGhpcy5hY3RpdmVNZW51ID0gbWVudTtcblxuXHRcdHRoaXMuYW5jaG9yRWxlbWVudCA9IHRoaXMuY3JlYXRlQW5jaG9yRWxlbWVudCgpO1xuXHRcdGNvbnN0IHNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5idWlsZFNjcm9sbFN0cmF0ZWd5KCk7XG5cdFx0Y29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMuYnVpbGRQb3NpdGlvblN0cmF0ZWd5KFxuXHRcdFx0dGhpcy5hbmNob3JFbGVtZW50LFxuXHRcdFx0bW91c2VFdmVudFxuXHRcdCk7XG5cblx0XHR0aGlzLmF0dGFjaENvbnRleHRUb0l0ZW1zKG1lbnUsIGRhdGEpO1xuXG5cdFx0Y29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuY3JlYXRlQW5kQXR0YWNoT3ZlcmxheShcblx0XHRcdHBvc2l0aW9uU3RyYXRlZ3ksXG5cdFx0XHRzY3JvbGxTdHJhdGVneSxcblx0XHRcdG1lbnUsXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHR0aGlzLmF0dGFjaE92ZXJsYXlSZWYobWVudSwgb3ZlcmxheVJlZik7XG5cblx0XHR0aGlzLnJlZ2lzdGVyRGV0YWNoRXZlbnRzKG92ZXJsYXlSZWYpO1xuXHR9XG5cblx0b3BlblN1Yk1lbnUoY3R4RXZlbnQ6IFNoQ29udGV4dFN1Yk1lbnVFdmVudCk6IGFueSB7XG5cdFx0Y29uc3QgeyBtZW51LCBtb3VzZUV2ZW50LCB0YXJnZXRFbGVtZW50LCBkYXRhLCBwYXJlbnRNZW51IH0gPSBjdHhFdmVudDtcblxuXHRcdG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRtb3VzZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3Qgc2Nyb2xsU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkU2Nyb2xsU3RyYXRlZ3koKTtcblx0XHRjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5idWlsZFBvc2l0aW9uU3RyYXRlZ3lGb3JTdWJNZW51KFxuXHRcdFx0dGFyZ2V0RWxlbWVudFxuXHRcdCk7XG5cdFx0Y29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuY3JlYXRlQW5kQXR0YWNoT3ZlcmxheShcblx0XHRcdHBvc2l0aW9uU3RyYXRlZ3ksXG5cdFx0XHRzY3JvbGxTdHJhdGVneSxcblx0XHRcdG1lbnUsXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cblx0XHR0aGlzLmF0dGFjaENvbnRleHRUb0l0ZW1zKG1lbnUsIGRhdGEpO1xuXHRcdHRoaXMuYXR0YWNoVGhpc0NvbnRleHQobWVudSwgcGFyZW50TWVudSk7XG5cdFx0dGhpcy5hdHRhY2hPdmVybGF5UmVmKG1lbnUsIG92ZXJsYXlSZWYpO1xuXHR9XG5cblx0ZGVzdHJveSgpIHtcblx0XHR0aGlzLmNsb3NlQ3VycmVudE92ZXJsYXlzKCk7XG5cdFx0dGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG5cdH1cblxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcblx0XHR0aGlzLmRlc3Ryb3koKTtcblx0fVxuXG5cdGNsb3NlU3ViTWVudXMobWVudTogU2hDb250ZXh0TWVudUNvbXBvbmVudCkge1xuXHRcdGNvbnN0IGl0ZW1zV2l0aFN1Yk1lbnVzID0gbWVudS5tZW51SXRlbXMuZmlsdGVyKFxuXHRcdFx0aSA9PiAhIWkuc3ViTWVudSAmJiAhIWkuc3ViTWVudS5vdmVybGF5UmVmXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtc1dpdGhTdWJNZW51cy5sZW5ndGgpIHtcblx0XHRcdGl0ZW1zV2l0aFN1Yk1lbnVzLmZvckVhY2goc20gPT4gdGhpcy5jbG9zZVN1Yk1lbnVzKHNtLnN1Yk1lbnUpKTtcblxuXHRcdFx0Y29uc3Qgb3ZlcmxheVJlZnMgPSBpdGVtc1dpdGhTdWJNZW51cy5tYXAoaSA9PiBpLnN1Yk1lbnUub3ZlcmxheVJlZik7XG5cblx0XHRcdG92ZXJsYXlSZWZzLmZvckVhY2gociA9PiByLmRpc3Bvc2UoKSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3RlckRldGFjaEV2ZW50cyhvdmVybGF5UmVmOiBPdmVybGF5UmVmKSB7XG5cdFx0dGhpcy5zdWJzID0gb3ZlcmxheVJlZlxuXHRcdFx0LmJhY2tkcm9wQ2xpY2soKVxuXHRcdFx0LnN1YnNjcmliZSh0aGlzLmNsb3NlQ3VycmVudE92ZXJsYXlzLmJpbmQodGhpcykpO1xuXHRcdHRoaXMuc3Vicy5hZGQoXG5cdFx0XHRvdmVybGF5UmVmLmRldGFjaG1lbnRzKCkuc3Vic2NyaWJlKHRoaXMuY2xvc2VDdXJyZW50T3ZlcmxheXMuYmluZCh0aGlzKSlcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVBbmRBdHRhY2hPdmVybGF5KFxuXHRcdHBvc2l0aW9uU3RyYXRlZ3k6XG5cdFx0XHR8IEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3lcblx0XHRcdHwgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxuXHRcdHNjcm9sbFN0cmF0ZWd5OiBTY3JvbGxTdHJhdGVneSxcblx0XHRtZW51OiBTaENvbnRleHRNZW51Q29tcG9uZW50LFxuXHRcdGhhc0JhY2tkcm9wOiBib29sZWFuID0gdHJ1ZVxuXHQpIHtcblx0XHRjb25zdCBvdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG5cdFx0XHRwb3NpdGlvblN0cmF0ZWd5LFxuXHRcdFx0c2Nyb2xsU3RyYXRlZ3ksXG5cdFx0XHRoYXNCYWNrZHJvcDogaGFzQmFja2Ryb3AsXG5cdFx0XHRiYWNrZHJvcENsYXNzOiAnc2gtYmFja2Ryb3AnXG5cdFx0fSk7XG5cblx0XHQvKlxuICAgICBUT0RPOiB0cnkgcGFzc2luZyB0aGUgVGVtcGxhdGVQb3J0YWwgY29udGV4dCAoZGF0YSlcbiAgICAgYW5kIHRoZW4gaW5qZWN0aW5nIGl0IHRvIHRoZSAqbmdUZW1wbGF0ZU91dGxldCBpbiB0aGUgY29tcG9uZW50IHRlbXBsYXRlXG4gICAgKi9cblx0XHRjb25zdCBtZW51UG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKFxuXHRcdFx0bWVudS5tZW51VGVtcGxhdGUsXG5cdFx0XHRtZW51Lm1lbnVDb250YWluZXJcblx0XHQpO1xuXHRcdG92ZXJsYXlSZWYuYXR0YWNoKG1lbnVQb3J0YWwpO1xuXG5cdFx0dGhpcy5hY3RpdmVPdmVybGF5cy5wdXNoKG92ZXJsYXlSZWYpO1xuXG5cdFx0cmV0dXJuIG92ZXJsYXlSZWY7XG5cdH1cblxuXHRwcml2YXRlIGJ1aWxkU2Nyb2xsU3RyYXRlZ3koKTogU2Nyb2xsU3RyYXRlZ3kge1xuXHRcdHJldHVybiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKHsgYXV0b0Nsb3NlOiB0cnVlIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBidWlsZFBvc2l0aW9uU3RyYXRlZ3koXG5cdFx0ZWxlOiBIVE1MRWxlbWVudCxcblx0XHRldmVudDogTW91c2VFdmVudFxuXHQpOiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xuXHRcdGNvbnN0IHsgeCwgeSB9ID0gZXZlbnQ7XG5cblx0XHRyZXR1cm4gdGhpcy5vdmVybGF5XG5cdFx0XHQucG9zaXRpb24oKVxuXHRcdFx0LmZsZXhpYmxlQ29ubmVjdGVkVG8oZWxlKVxuXHRcdFx0LndpdGhEZWZhdWx0T2Zmc2V0WCh4KVxuXHRcdFx0LndpdGhEZWZhdWx0T2Zmc2V0WSh5KVxuXHRcdFx0LndpdGhQb3NpdGlvbnModGhpcy5idWlsZFBvc2l0aW9ucygpKVxuXHRcdFx0LndpdGhGbGV4aWJsZURpbWVuc2lvbnMoZmFsc2UpXG5cdFx0XHQud2l0aFB1c2godHJ1ZSk7XG5cdH1cblxuXHRwcml2YXRlIGJ1aWxkUG9zaXRpb25TdHJhdGVneUZvclN1Yk1lbnUoXG5cdFx0ZWxtOiBFbGVtZW50UmVmXG5cdCk6IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XG5cdFx0cmV0dXJuIHRoaXMub3ZlcmxheVxuXHRcdFx0LnBvc2l0aW9uKClcblx0XHRcdC5mbGV4aWJsZUNvbm5lY3RlZFRvKGVsbSlcblx0XHRcdC53aXRoUG9zaXRpb25zKHRoaXMuYnVpbGRTdWJNZW51UG9zaXRpb25zKCkpXG5cdFx0XHQud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcblx0XHRcdC53aXRoUHVzaCh0cnVlKTtcblx0fVxuXG5cdHByaXZhdGUgY2xvc2VDdXJyZW50T3ZlcmxheXMoKSB7XG5cdFx0aWYgKHRoaXMuYW5jaG9yRWxlbWVudCkge1xuXHRcdFx0dGhpcy5hbmNob3JFbGVtZW50LnJlbW92ZSgpO1xuXHRcdH1cblxuXHRcdHRoaXMuYWN0aXZlT3ZlcmxheXMuZm9yRWFjaChvID0+IHtcblx0XHRcdG8uZGV0YWNoKCk7XG5cdFx0XHRvLmRpc3Bvc2UoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuYWN0aXZlT3ZlcmxheXMgPSBbXTtcblxuXHRcdC8vIFRPRE86IGNyZWF0ZSBjbG9zZSBzdWJqZWN0IGFuZCBlbWl0LlxuXHRcdC8vIHN1YnNjcmliZSBpbiBjb21wb25lbnRcblx0XHRpZiAodGhpcy5hY3RpdmVNZW51KSB7XG5cdFx0XHR0aGlzLmFjdGl2ZU1lbnUuY2xvc2UoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGF0dGFjaENvbnRleHRUb0l0ZW1zKG1lbnU6IFNoQ29udGV4dE1lbnVDb21wb25lbnQsIGRhdGE6IGFueSkge1xuXHRcdG1lbnUubWVudUl0ZW1zLmZvckVhY2goaSA9PiAoaS5jb250ZXh0LiRpbXBsaWNpdCA9IGRhdGEpKTtcblx0fVxuXG5cdHByaXZhdGUgYXR0YWNoVGhpc0NvbnRleHQoXG5cdFx0bWVudTogU2hDb250ZXh0TWVudUNvbXBvbmVudCxcblx0XHRwYXJlbnRNZW51OiBTaENvbnRleHRNZW51Q29tcG9uZW50XG5cdCkge1xuXHRcdG1lbnUudGhpc0NvbnRleHQgPSBwYXJlbnRNZW51LnRoaXNDb250ZXh0O1xuXHR9XG5cblx0cHJpdmF0ZSBhdHRhY2hPdmVybGF5UmVmKFxuXHRcdG1lbnU6IFNoQ29udGV4dE1lbnVDb21wb25lbnQsXG5cdFx0b3ZlcmxheVJlZjogT3ZlcmxheVJlZlxuXHQpIHtcblx0XHRtZW51Lm92ZXJsYXlSZWYgPSBvdmVybGF5UmVmO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVBbmNob3JFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcblx0XHRjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdGRpdi5zdHlsZS50b3AgPSAnMCc7XG5cdFx0ZGl2LnN0eWxlLmJvdHRvbSA9ICcwJztcblx0XHRkaXYuc3R5bGUubGVmdCA9ICcwJztcblx0XHRkaXYuc3R5bGUucmlnaHQgPSAnMCc7XG5cblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG5cblx0XHRyZXR1cm4gZGl2O1xuXHR9XG5cblx0cHJpdmF0ZSBidWlsZFN1Yk1lbnVQb3NpdGlvbnMoKTogQ29ubmVjdGlvblBvc2l0aW9uUGFpcltdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRvcmlnaW5YOiAnZW5kJyxcblx0XHRcdFx0b3JpZ2luWTogJ3RvcCcsXG5cdFx0XHRcdG92ZXJsYXlYOiAnc3RhcnQnLFxuXHRcdFx0XHRvdmVybGF5WTogJ3RvcCdcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG9yaWdpblg6ICdzdGFydCcsXG5cdFx0XHRcdG9yaWdpblk6ICd0b3AnLFxuXHRcdFx0XHRvdmVybGF5WDogJ2VuZCcsXG5cdFx0XHRcdG92ZXJsYXlZOiAndG9wJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0b3JpZ2luWDogJ2VuZCcsXG5cdFx0XHRcdG9yaWdpblk6ICdib3R0b20nLFxuXHRcdFx0XHRvdmVybGF5WDogJ3N0YXJ0Jyxcblx0XHRcdFx0b3ZlcmxheVk6ICdib3R0b20nXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRvcmlnaW5YOiAnc3RhcnQnLFxuXHRcdFx0XHRvcmlnaW5ZOiAnYm90dG9tJyxcblx0XHRcdFx0b3ZlcmxheVg6ICdlbmQnLFxuXHRcdFx0XHRvdmVybGF5WTogJ2JvdHRvbSdcblx0XHRcdH1cblx0XHRdO1xuXHR9XG5cblx0cHJpdmF0ZSBidWlsZFBvc2l0aW9ucygpOiBDb25uZWN0aW9uUG9zaXRpb25QYWlyW10ge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdG9yaWdpblg6ICdzdGFydCcsXG5cdFx0XHRcdG9yaWdpblk6ICd0b3AnLFxuXHRcdFx0XHRvdmVybGF5WDogJ3N0YXJ0Jyxcblx0XHRcdFx0b3ZlcmxheVk6ICd0b3AnXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRvcmlnaW5YOiAnc3RhcnQnLFxuXHRcdFx0XHRvcmlnaW5ZOiAndG9wJyxcblx0XHRcdFx0b3ZlcmxheVg6ICdlbmQnLFxuXHRcdFx0XHRvdmVybGF5WTogJ3RvcCdcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG9yaWdpblg6ICdzdGFydCcsXG5cdFx0XHRcdG9yaWdpblk6ICd0b3AnLFxuXHRcdFx0XHRvdmVybGF5WDogJ3N0YXJ0Jyxcblx0XHRcdFx0b3ZlcmxheVk6ICdib3R0b20nXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRvcmlnaW5YOiAnc3RhcnQnLFxuXHRcdFx0XHRvcmlnaW5ZOiAndG9wJyxcblx0XHRcdFx0b3ZlcmxheVg6ICdlbmQnLFxuXHRcdFx0XHRvdmVybGF5WTogJ2JvdHRvbSdcblx0XHRcdH1cblx0XHRdO1xuXHR9XG59XG4iXX0=