ng2-right-click-menu
Version:
Right click context menu for Angular
326 lines • 25.5 kB
JavaScript
/**
* @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=