UNPKG

@seethelemurcricut/ngx-contextmenu

Version:

An Angular component to show a context menu on an arbitrary component

337 lines (336 loc) 37.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Overlay, ScrollStrategyOptions } from '@angular/cdk/overlay'; import { ComponentPortal } from '@angular/cdk/portal'; import { ElementRef, Injectable } from '@angular/core'; import { Subject, Subscription } from 'rxjs'; import { ContextMenuContentComponent } from './contextMenuContent.component'; /** * @record */ export function IContextMenuClickEvent() { } function IContextMenuClickEvent_tsickle_Closure_declarations() { /** @type {?|undefined} */ IContextMenuClickEvent.prototype.anchorElement; /** @type {?|undefined} */ IContextMenuClickEvent.prototype.contextMenu; /** @type {?|undefined} */ IContextMenuClickEvent.prototype.event; /** @type {?|undefined} */ IContextMenuClickEvent.prototype.parentContextMenu; /** @type {?} */ IContextMenuClickEvent.prototype.item; /** @type {?|undefined} */ IContextMenuClickEvent.prototype.activeMenuItemIndex; } /** * @record */ export function IContextMenuContext() { } function IContextMenuContext_tsickle_Closure_declarations() { /** @type {?} */ IContextMenuContext.prototype.menuItems; /** @type {?} */ IContextMenuContext.prototype.menuClass; } /** * @record */ export function CloseLeafMenuEvent() { } function CloseLeafMenuEvent_tsickle_Closure_declarations() { /** @type {?|undefined} */ CloseLeafMenuEvent.prototype.exceptRootMenu; /** @type {?|undefined} */ CloseLeafMenuEvent.prototype.event; } /** * @record */ export function OverlayRefWithContextMenu() { } function OverlayRefWithContextMenu_tsickle_Closure_declarations() { /** @type {?|undefined} */ OverlayRefWithContextMenu.prototype.contextMenu; } /** * @record */ export function CancelContextMenuEvent() { } function CancelContextMenuEvent_tsickle_Closure_declarations() { /** @type {?} */ CancelContextMenuEvent.prototype.eventType; /** @type {?|undefined} */ CancelContextMenuEvent.prototype.event; } /** * @record */ export function ExecuteContextMenuEvent() { } function ExecuteContextMenuEvent_tsickle_Closure_declarations() { /** @type {?} */ ExecuteContextMenuEvent.prototype.eventType; /** @type {?|undefined} */ ExecuteContextMenuEvent.prototype.event; /** @type {?} */ ExecuteContextMenuEvent.prototype.item; /** @type {?} */ ExecuteContextMenuEvent.prototype.menuItem; } var ContextMenuService = /** @class */ (function () { function ContextMenuService(overlay, scrollStrategy) { this.overlay = overlay; this.scrollStrategy = scrollStrategy; this.isDestroyingLeafMenu = false; this.show = new Subject(); this.triggerClose = new Subject(); this.close = new Subject(); this.overlays = []; this.fakeElement = { getBoundingClientRect: function () { return ({ bottom: 0, height: 0, left: 0, right: 0, top: 0, width: 0 }); } }; } /** * @param {?} context * @return {?} */ ContextMenuService.prototype.openContextMenu = /** * @param {?} context * @return {?} */ function (context) { var anchorElement = context.anchorElement, event = context.event, parentContextMenu = context.parentContextMenu; if (!parentContextMenu) { var /** @type {?} */ mouseEvent_1 = /** @type {?} */ (event); this.fakeElement.getBoundingClientRect = function () { return ({ bottom: mouseEvent_1.clientY, height: 0, left: mouseEvent_1.clientX, right: mouseEvent_1.clientX, top: mouseEvent_1.clientY, width: 0 }); }; this.closeAllContextMenus({ eventType: 'cancel', event: event }); var /** @type {?} */ positionStrategy = this.overlay .position() .connectedTo(new ElementRef(anchorElement || this.fakeElement), { originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'top' }) .withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'top' }) .withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'center' }) .withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'center' }) .withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' }) .withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'bottom' }); this.overlays = [ this.overlay.create({ positionStrategy: positionStrategy, panelClass: 'ngx-contextmenu', scrollStrategy: this.scrollStrategy.close() }) ]; this.attachContextMenu(this.overlays[0], context); } else { var /** @type {?} */ positionStrategy = this.overlay .position() .connectedTo(new ElementRef(event ? event.target : anchorElement), { originX: context.menuClass === 'sub-to-side' ? 'end' : 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'top' }) .withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'top' }) .withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'center' }) .withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'center' }) .withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' }) .withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'bottom' }); var /** @type {?} */ newOverlay = this.overlay.create({ positionStrategy: positionStrategy, panelClass: 'ngx-contextmenu', scrollStrategy: this.scrollStrategy.close() }); this.destroySubMenus(parentContextMenu); this.overlays = this.overlays.concat(newOverlay); this.attachContextMenu(newOverlay, context); } }; /** * @param {?} overlay * @param {?} context * @return {?} */ ContextMenuService.prototype.attachContextMenu = /** * @param {?} overlay * @param {?} context * @return {?} */ function (overlay, context) { var _this = this; var event = context.event, item = context.item, menuItems = context.menuItems, menuClass = context.menuClass; var /** @type {?} */ contextMenuContent = overlay.attach(new ComponentPortal(ContextMenuContentComponent)); contextMenuContent.instance.event = event; contextMenuContent.instance.item = item; contextMenuContent.instance.menuItems = menuItems; contextMenuContent.instance.overlay = overlay; contextMenuContent.instance.isLeaf = true; contextMenuContent.instance.menuClass = menuClass; (/** @type {?} */ (overlay)).contextMenu = contextMenuContent.instance; var /** @type {?} */ subscriptions = new Subscription(); subscriptions.add(contextMenuContent.instance.execute .asObservable() .subscribe(function (executeEvent) { return _this.closeAllContextMenus(tslib_1.__assign({ eventType: 'execute' }, executeEvent)); })); subscriptions.add(contextMenuContent.instance.closeAllMenus .asObservable() .subscribe(function (closeAllEvent) { return _this.closeAllContextMenus(tslib_1.__assign({ eventType: 'cancel' }, closeAllEvent)); })); subscriptions.add(contextMenuContent.instance.closeLeafMenu .asObservable() .subscribe(function (closeLeafMenuEvent) { return _this.destroyLeafMenu(closeLeafMenuEvent); })); subscriptions.add(contextMenuContent.instance.openSubMenu .asObservable() .subscribe(function (subMenuEvent) { _this.destroySubMenus(contextMenuContent.instance); if (!subMenuEvent.contextMenu) { contextMenuContent.instance.isLeaf = true; return; } contextMenuContent.instance.isLeaf = false; _this.show.next(subMenuEvent); })); contextMenuContent.onDestroy(function () { menuItems.forEach(function (menuItem) { return (menuItem.isActive = false); }); subscriptions.unsubscribe(); }); contextMenuContent.changeDetectorRef.detectChanges(); }; /** * @param {?} closeEvent * @return {?} */ ContextMenuService.prototype.closeAllContextMenus = /** * @param {?} closeEvent * @return {?} */ function (closeEvent) { if (this.overlays) { this.close.next(closeEvent); this.overlays.forEach(function (overlay, index) { overlay.detach(); overlay.dispose(); }); } this.overlays = []; }; /** * @return {?} */ ContextMenuService.prototype.getLastAttachedOverlay = /** * @return {?} */ function () { var /** @type {?} */ overlay = this.overlays[this.overlays.length - 1]; while (this.overlays.length > 1 && overlay && !overlay.hasAttached()) { overlay.detach(); overlay.dispose(); this.overlays = this.overlays.slice(0, -1); overlay = this.overlays[this.overlays.length - 1]; } return overlay; }; /** * @param {?=} __0 * @return {?} */ ContextMenuService.prototype.destroyLeafMenu = /** * @param {?=} __0 * @return {?} */ function (_a) { var _this = this; var _b = _a === void 0 ? {} : _a, exceptRootMenu = _b.exceptRootMenu, event = _b.event; if (this.isDestroyingLeafMenu) { return; } this.isDestroyingLeafMenu = true; setTimeout(function () { var /** @type {?} */ overlay = _this.getLastAttachedOverlay(); if (_this.overlays.length > 1 && overlay) { overlay.detach(); overlay.dispose(); } if (!exceptRootMenu && _this.overlays.length > 0 && overlay) { _this.close.next({ eventType: 'cancel', event: event }); overlay.detach(); overlay.dispose(); } var /** @type {?} */ newLeaf = _this.getLastAttachedOverlay(); if (newLeaf) { newLeaf.contextMenu.isLeaf = true; } _this.isDestroyingLeafMenu = false; }); }; /** * @param {?} contextMenu * @return {?} */ ContextMenuService.prototype.destroySubMenus = /** * @param {?} contextMenu * @return {?} */ function (contextMenu) { var /** @type {?} */ overlay = contextMenu.overlay; var /** @type {?} */ index = this.overlays.indexOf(overlay); this.overlays.slice(index + 1).forEach(function (subMenuOverlay) { subMenuOverlay.detach(); subMenuOverlay.dispose(); }); }; /** * @param {?} contextMenuContent * @return {?} */ ContextMenuService.prototype.isLeafMenu = /** * @param {?} contextMenuContent * @return {?} */ function (contextMenuContent) { var /** @type {?} */ overlay = this.getLastAttachedOverlay(); return contextMenuContent.overlay === overlay; }; ContextMenuService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ ContextMenuService.ctorParameters = function () { return [ { type: Overlay }, { type: ScrollStrategyOptions } ]; }; return ContextMenuService; }()); export { ContextMenuService }; function ContextMenuService_tsickle_Closure_declarations() { /** @type {?} */ ContextMenuService.prototype.isDestroyingLeafMenu; /** @type {?} */ ContextMenuService.prototype.show; /** @type {?} */ ContextMenuService.prototype.triggerClose; /** @type {?} */ ContextMenuService.prototype.close; /** @type {?} */ ContextMenuService.prototype.contextMenuContent; /** @type {?} */ ContextMenuService.prototype.overlays; /** @type {?} */ ContextMenuService.prototype.fakeElement; /** @type {?} */ ContextMenuService.prototype.overlay; /** @type {?} */ ContextMenuService.prototype.scrollStrategy; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dE1lbnUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZWV0aGVsZW11cmNyaWN1dC9uZ3gtY29udGV4dG1lbnUvIiwic291cmNlcyI6WyJsaWIvY29udGV4dE1lbnUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQWMscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFnQixVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTdDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF1RHpFLDRCQUFvQixPQUFnQixFQUFVLGNBQXFDO1FBQS9ELFlBQU8sR0FBUCxPQUFPLENBQVM7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7b0NBbkJyRCxLQUFLO29CQUVZLElBQUksT0FBTyxFQUEwQjs0QkFDeEIsSUFBSSxPQUFPLEVBQUU7cUJBQzFCLElBQUksT0FBTyxFQUFFO3dCQUczQixFQUFFOzJCQUNSO1lBQ3ZCLHFCQUFxQixFQUFFLGNBQWtCLE9BQUEsQ0FBQztnQkFDdEMsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsR0FBRyxFQUFFLENBQUM7Z0JBQ04sS0FBSyxFQUFFLENBQUM7YUFDWCxDQUFDLEVBUHVDLENBT3ZDO1NBQ0w7S0FFc0Y7Ozs7O0lBRWhGLDRDQUFlOzs7O2NBQUMsT0FBNEI7UUFDdkMsSUFBQSxxQ0FBYSxFQUFFLHFCQUFLLEVBQUUsNkNBQWlCLENBQWE7UUFFNUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDckIscUJBQU0sWUFBVSxxQkFBRyxLQUFtQixDQUFBLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsR0FBRyxjQUFrQixPQUFBLENBQUM7Z0JBQ3hELE1BQU0sRUFBRSxZQUFVLENBQUMsT0FBTztnQkFDMUIsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLFlBQVUsQ0FBQyxPQUFPO2dCQUN4QixLQUFLLEVBQUUsWUFBVSxDQUFDLE9BQU87Z0JBQ3pCLEdBQUcsRUFBRSxZQUFVLENBQUMsT0FBTztnQkFDdkIsS0FBSyxFQUFFLENBQUM7YUFDWCxDQUFDLEVBUHlELENBT3pELENBQUM7WUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssT0FBQSxFQUFFLENBQUMsQ0FBQztZQUMxRCxxQkFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTztpQkFDaEMsUUFBUSxFQUFFO2lCQUNWLFdBQVcsQ0FDUixJQUFJLFVBQVUsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUNqRCxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUNwQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUN6QztpQkFDQSxvQkFBb0IsQ0FDakIsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFDcEMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FDdkM7aUJBQ0Esb0JBQW9CLENBQ2pCLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQ3BDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQzVDO2lCQUNBLG9CQUFvQixDQUNqQixFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUNwQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUMxQztpQkFDQSxvQkFBb0IsQ0FDakIsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFDcEMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FDNUM7aUJBQ0Esb0JBQW9CLENBQ2pCLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQ3BDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQzFDLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxHQUFHO2dCQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO29CQUNoQixnQkFBZ0Isa0JBQUE7b0JBQ2hCLFVBQVUsRUFBRSxpQkFBaUI7b0JBQzdCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRTtpQkFDOUMsQ0FBQzthQUNMLENBQUM7WUFDRixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0oscUJBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU87aUJBQ2hDLFFBQVEsRUFBRTtpQkFDVixXQUFXLENBQ1IsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFDcEQsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLFNBQVMsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFDbEYsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FDekM7aUJBQ0Esb0JBQW9CLENBQ2pCLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQ3BDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQ3ZDO2lCQUNBLG9CQUFvQixDQUNqQixFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUNwQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUM1QztpQkFDQSxvQkFBb0IsQ0FDakIsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFDcEMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FDMUM7aUJBQ0Esb0JBQW9CLENBQ2pCLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQ3BDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQzVDO2lCQUNBLG9CQUFvQixDQUNqQixFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUNwQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUMxQyxDQUFDO1lBQ04scUJBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUNuQyxnQkFBZ0Isa0JBQUE7Z0JBQ2hCLFVBQVUsRUFBRSxpQkFBaUI7Z0JBQzdCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRTthQUM5QyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQy9DOzs7Ozs7O0lBR0UsOENBQWlCOzs7OztjQUFDLE9BQW1CLEVBQUUsT0FBNEI7O1FBQzlELElBQUEscUJBQUssRUFBRSxtQkFBSSxFQUFFLDZCQUFTLEVBQUUsNkJBQVMsQ0FBYTtRQUV0RCxxQkFBTSxrQkFBa0IsR0FBOEMsT0FBTyxDQUFDLE1BQU0sQ0FDaEYsSUFBSSxlQUFlLENBQUMsMkJBQTJCLENBQUMsQ0FDbkQsQ0FBQztRQUNGLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQzFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3hDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ2xELGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzlDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQzFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ2xELG1CQUE0QixPQUFPLEVBQUMsQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDO1FBRS9FLHFCQUFNLGFBQWEsR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2RCxhQUFhLENBQUMsR0FBRyxDQUNiLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxPQUFPO2FBQzlCLFlBQVksRUFBRTthQUNkLFNBQVMsQ0FBQyxVQUFDLFlBQVk7WUFDcEIsT0FBQSxLQUFJLENBQUMsb0JBQW9CLG9CQUFHLFNBQVMsRUFBRSxTQUFTLElBQUssWUFBWSxFQUFHO1FBQXBFLENBQW9FLENBQ3ZFLENBQ1IsQ0FBQztRQUNGLGFBQWEsQ0FBQyxHQUFHLENBQ2Isa0JBQWtCLENBQUMsUUFBUSxDQUFDLGFBQWE7YUFDcEMsWUFBWSxFQUFFO2FBQ2QsU0FBUyxDQUFDLFVBQUMsYUFBYTtZQUNyQixPQUFBLEtBQUksQ0FBQyxvQkFBb0Isb0JBQUcsU0FBUyxFQUFFLFFBQVEsSUFBSyxhQUFhLEVBQUc7UUFBcEUsQ0FBb0UsQ0FDdkUsQ0FDUixDQUFDO1FBQ0YsYUFBYSxDQUFDLEdBQUcsQ0FDYixrQkFBa0IsQ0FBQyxRQUFRLENBQUMsYUFBYTthQUNwQyxZQUFZLEVBQUU7YUFDZCxTQUFTLENBQUMsVUFBQyxrQkFBa0IsSUFBSyxPQUFBLEtBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsRUFBeEMsQ0FBd0MsQ0FBQyxDQUNuRixDQUFDO1FBQ0YsYUFBYSxDQUFDLEdBQUcsQ0FDYixrQkFBa0IsQ0FBQyxRQUFRLENBQUMsV0FBVzthQUNsQyxZQUFZLEVBQUU7YUFDZCxTQUFTLENBQUMsVUFBQyxZQUFpQztZQUN6QyxLQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUMxQyxNQUFNLENBQUM7YUFDVjtZQUNELGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQzNDLEtBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2hDLENBQUMsQ0FDVCxDQUFDO1FBQ0Ysa0JBQWtCLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBQyxRQUFRLElBQUssT0FBQSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEVBQTNCLENBQTJCLENBQUMsQ0FBQztZQUM3RCxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7Ozs7OztJQUdsRCxpREFBb0I7Ozs7Y0FBQyxVQUFpQztRQUN6RCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxLQUFLO2dCQUNqQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNyQixDQUFDLENBQUM7U0FDTjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDOzs7OztJQUdoQixtREFBc0I7Ozs7UUFDekIscUJBQUksT0FBTyxHQUFlLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDbkUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQzs7Ozs7O0lBR1osNENBQWU7Ozs7Y0FBQyxFQUFrRDs7WUFBbEQsNEJBQWtELEVBQWhELGtDQUFjLEVBQUUsZ0JBQUs7UUFDMUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztZQUM1QixNQUFNLENBQUM7U0FDVjtRQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFakMsVUFBVSxDQUFDO1lBQ1AscUJBQU0sT0FBTyxHQUFHLEtBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzlDLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNyQjtZQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxLQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxPQUFBLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNyQjtZQUVELHFCQUFNLE9BQU8sR0FBRyxLQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNWLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQzthQUNyQztZQUVELEtBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7U0FDckMsQ0FBQyxDQUFDOzs7Ozs7SUFHQSw0Q0FBZTs7OztjQUFDLFdBQXdDO1FBQzNELHFCQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQ3BDLHFCQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsY0FBYztZQUNsRCxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzVCLENBQUMsQ0FBQzs7Ozs7O0lBR0EsdUNBQVU7Ozs7Y0FBQyxrQkFBK0M7UUFDN0QscUJBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDOzs7Z0JBak9yRCxVQUFVOzs7O2dCQXpDRixPQUFPO2dCQUFjLHFCQUFxQjs7NkJBQW5EOztTQTBDYSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5UmVmLCBTY3JvbGxTdHJhdGVneU9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IENvbXBvbmVudFJlZiwgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9jb250ZXh0TWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi9jb250ZXh0TWVudS5pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb250ZXh0TWVudUNvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbnRleHRNZW51Q29udGVudC5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb250ZXh0TWVudUNsaWNrRXZlbnQge1xuICAgIGFuY2hvckVsZW1lbnQ/OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQ7XG4gICAgY29udGV4dE1lbnU/OiBDb250ZXh0TWVudUNvbXBvbmVudDtcbiAgICBldmVudD86IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50O1xuICAgIHBhcmVudENvbnRleHRNZW51PzogQ29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50O1xuICAgIGl0ZW06IGFueTtcbiAgICBhY3RpdmVNZW51SXRlbUluZGV4PzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBJQ29udGV4dE1lbnVDb250ZXh0IGV4dGVuZHMgSUNvbnRleHRNZW51Q2xpY2tFdmVudCB7XG4gICAgbWVudUl0ZW1zOiBDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmVbXTtcbiAgICBtZW51Q2xhc3M6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvc2VMZWFmTWVudUV2ZW50IHtcbiAgICBleGNlcHRSb290TWVudT86IGJvb2xlYW47XG4gICAgZXZlbnQ/OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcmxheVJlZldpdGhDb250ZXh0TWVudSBleHRlbmRzIE92ZXJsYXlSZWYge1xuICAgIGNvbnRleHRNZW51PzogQ29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbENvbnRleHRNZW51RXZlbnQge1xuICAgIGV2ZW50VHlwZTogJ2NhbmNlbCc7XG4gICAgZXZlbnQ/OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZUNvbnRleHRNZW51RXZlbnQge1xuICAgIGV2ZW50VHlwZTogJ2V4ZWN1dGUnO1xuICAgIGV2ZW50PzogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQ7XG4gICAgaXRlbTogYW55O1xuICAgIG1lbnVJdGVtOiBDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmU7XG59XG5leHBvcnQgdHlwZSBDbG9zZUNvbnRleHRNZW51RXZlbnQgPSBFeGVjdXRlQ29udGV4dE1lbnVFdmVudCB8IENhbmNlbENvbnRleHRNZW51RXZlbnQ7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb250ZXh0TWVudVNlcnZpY2Uge1xuICAgIHB1YmxpYyBpc0Rlc3Ryb3lpbmdMZWFmTWVudSA9IGZhbHNlO1xuXG4gICAgcHVibGljIHNob3c6IFN1YmplY3Q8SUNvbnRleHRNZW51Q2xpY2tFdmVudD4gPSBuZXcgU3ViamVjdDxJQ29udGV4dE1lbnVDbGlja0V2ZW50PigpO1xuICAgIHB1YmxpYyB0cmlnZ2VyQ2xvc2U6IFN1YmplY3Q8Q29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50PiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgcHVibGljIGNsb3NlOiBTdWJqZWN0PENsb3NlQ29udGV4dE1lbnVFdmVudD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgcHJpdmF0ZSBjb250ZXh0TWVudUNvbnRlbnQ6IENvbXBvbmVudFJlZjxDb250ZXh0TWVudUNvbnRlbnRDb21wb25lbnQ+O1xuICAgIHByaXZhdGUgb3ZlcmxheXM6IE92ZXJsYXlSZWZbXSA9IFtdO1xuICAgIHByaXZhdGUgZmFrZUVsZW1lbnQ6IGFueSA9IHtcbiAgICAgICAgZ2V0Qm91bmRpbmdDbGllbnRSZWN0OiAoKTogQ2xpZW50UmVjdCA9PiAoe1xuICAgICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgd2lkdGg6IDBcbiAgICAgICAgfSlcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LCBwcml2YXRlIHNjcm9sbFN0cmF0ZWd5OiBTY3JvbGxTdHJhdGVneU9wdGlvbnMpIHt9XG5cbiAgICBwdWJsaWMgb3BlbkNvbnRleHRNZW51KGNvbnRleHQ6IElDb250ZXh0TWVudUNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgeyBhbmNob3JFbGVtZW50LCBldmVudCwgcGFyZW50Q29udGV4dE1lbnUgfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgaWYgKCFwYXJlbnRDb250ZXh0TWVudSkge1xuICAgICAgICAgICAgY29uc3QgbW91c2VFdmVudCA9IGV2ZW50IGFzIE1vdXNlRXZlbnQ7XG4gICAgICAgICAgICB0aGlzLmZha2VFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9ICgpOiBDbGllbnRSZWN0ID0+ICh7XG4gICAgICAgICAgICAgICAgYm90dG9tOiBtb3VzZUV2ZW50LmNsaWVudFksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IG1vdXNlRXZlbnQuY2xpZW50WCxcbiAgICAgICAgICAgICAgICByaWdodDogbW91c2VFdmVudC5jbGllbnRYLFxuICAgICAgICAgICAgICAgIHRvcDogbW91c2VFdmVudC5jbGllbnRZLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDb250ZXh0TWVudXMoeyBldmVudFR5cGU6ICdjYW5jZWwnLCBldmVudCB9KTtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlcbiAgICAgICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgICAgIC5jb25uZWN0ZWRUbyhcbiAgICAgICAgICAgICAgICAgICAgbmV3IEVsZW1lbnRSZWYoYW5jaG9yRWxlbWVudCB8fCB0aGlzLmZha2VFbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCcgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAndG9wJyB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC53aXRoRmFsbGJhY2tQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2NlbnRlcicgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnY2VudGVyJyB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC53aXRoRmFsbGJhY2tQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnYm90dG9tJyB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheXMgPSBbXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICduZ3gtY29udGV4dG1lbnUnLFxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5zY3JvbGxTdHJhdGVneS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB0aGlzLmF0dGFjaENvbnRleHRNZW51KHRoaXMub3ZlcmxheXNbMF0sIGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVxuICAgICAgICAgICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgICAgICAgICAgLmNvbm5lY3RlZFRvKFxuICAgICAgICAgICAgICAgICAgICBuZXcgRWxlbWVudFJlZihldmVudCA/IGV2ZW50LnRhcmdldCA6IGFuY2hvckVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICB7IG9yaWdpblg6IGNvbnRleHQubWVudUNsYXNzID09PSAnc3ViLXRvLXNpZGUnID8gJ2VuZCcgOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCcgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAndG9wJyB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC53aXRoRmFsbGJhY2tQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2NlbnRlcicgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnY2VudGVyJyB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC53aXRoRmFsbGJhY2tQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnYm90dG9tJyB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld092ZXJsYXkgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICduZ3gtY29udGV4dG1lbnUnLFxuICAgICAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLnNjcm9sbFN0cmF0ZWd5LmNsb3NlKClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95U3ViTWVudXMocGFyZW50Q29udGV4dE1lbnUpO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5cyA9IHRoaXMub3ZlcmxheXMuY29uY2F0KG5ld092ZXJsYXkpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hDb250ZXh0TWVudShuZXdPdmVybGF5LCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhdHRhY2hDb250ZXh0TWVudShvdmVybGF5OiBPdmVybGF5UmVmLCBjb250ZXh0OiBJQ29udGV4dE1lbnVDb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnQsIGl0ZW0sIG1lbnVJdGVtcywgbWVudUNsYXNzIH0gPSBjb250ZXh0O1xuXG4gICAgICAgIGNvbnN0IGNvbnRleHRNZW51Q29udGVudDogQ29tcG9uZW50UmVmPENvbnRleHRNZW51Q29udGVudENvbXBvbmVudD4gPSBvdmVybGF5LmF0dGFjaChcbiAgICAgICAgICAgIG5ldyBDb21wb25lbnRQb3J0YWwoQ29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50KVxuICAgICAgICApO1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2UuZXZlbnQgPSBldmVudDtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50Lmluc3RhbmNlLml0ZW0gPSBpdGVtO1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2UubWVudUl0ZW1zID0gbWVudUl0ZW1zO1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2Uub3ZlcmxheSA9IG92ZXJsYXk7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudC5pbnN0YW5jZS5pc0xlYWYgPSB0cnVlO1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2UubWVudUNsYXNzID0gbWVudUNsYXNzO1xuICAgICAgICAoPE92ZXJsYXlSZWZXaXRoQ29udGV4dE1lbnU+b3ZlcmxheSkuY29udGV4dE1lbnUgPSBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2U7XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgICAgICBzdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIGNvbnRleHRNZW51Q29udGVudC5pbnN0YW5jZS5leGVjdXRlXG4gICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXhlY3V0ZUV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ29udGV4dE1lbnVzKHsgZXZlbnRUeXBlOiAnZXhlY3V0ZScsIC4uLmV4ZWN1dGVFdmVudCB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2UuY2xvc2VBbGxNZW51c1xuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNsb3NlQWxsRXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDb250ZXh0TWVudXMoeyBldmVudFR5cGU6ICdjYW5jZWwnLCAuLi5jbG9zZUFsbEV2ZW50IH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBzdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIGNvbnRleHRNZW51Q29udGVudC5pbnN0YW5jZS5jbG9zZUxlYWZNZW51XG4gICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoY2xvc2VMZWFmTWVudUV2ZW50KSA9PiB0aGlzLmRlc3Ryb3lMZWFmTWVudShjbG9zZUxlYWZNZW51RXZlbnQpKVxuICAgICAgICApO1xuICAgICAgICBzdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIGNvbnRleHRNZW51Q29udGVudC5pbnN0YW5jZS5vcGVuU3ViTWVudVxuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHN1Yk1lbnVFdmVudDogSUNvbnRleHRNZW51Q29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lTdWJNZW51cyhjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Yk1lbnVFdmVudC5jb250ZXh0TWVudSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dE1lbnVDb250ZW50Lmluc3RhbmNlLmlzTGVhZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dE1lbnVDb250ZW50Lmluc3RhbmNlLmlzTGVhZiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3cubmV4dChzdWJNZW51RXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudC5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgICAgICAgbWVudUl0ZW1zLmZvckVhY2goKG1lbnVJdGVtKSA9PiAobWVudUl0ZW0uaXNBY3RpdmUgPSBmYWxzZSkpO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50LmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2VBbGxDb250ZXh0TWVudXMoY2xvc2VFdmVudDogQ2xvc2VDb250ZXh0TWVudUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlzKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlLm5leHQoY2xvc2VFdmVudCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlzLmZvckVhY2goKG92ZXJsYXksIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgb3ZlcmxheS5kZXRhY2goKTtcbiAgICAgICAgICAgICAgICBvdmVybGF5LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3ZlcmxheXMgPSBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGFzdEF0dGFjaGVkT3ZlcmxheSgpOiBPdmVybGF5UmVmV2l0aENvbnRleHRNZW51IHtcbiAgICAgICAgbGV0IG92ZXJsYXk6IE92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXlzW3RoaXMub3ZlcmxheXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHdoaWxlICh0aGlzLm92ZXJsYXlzLmxlbmd0aCA+IDEgJiYgb3ZlcmxheSAmJiAhb3ZlcmxheS5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICAgICAgICBvdmVybGF5LmRldGFjaCgpO1xuICAgICAgICAgICAgb3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlzID0gdGhpcy5vdmVybGF5cy5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICBvdmVybGF5ID0gdGhpcy5vdmVybGF5c1t0aGlzLm92ZXJsYXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdmVybGF5O1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXN0cm95TGVhZk1lbnUoeyBleGNlcHRSb290TWVudSwgZXZlbnQgfTogQ2xvc2VMZWFmTWVudUV2ZW50ID0ge30pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZXN0cm95aW5nTGVhZk1lbnUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzRGVzdHJveWluZ0xlYWZNZW51ID0gdHJ1ZTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLmdldExhc3RBdHRhY2hlZE92ZXJsYXkoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlzLmxlbmd0aCA+IDEgJiYgb3ZlcmxheSkge1xuICAgICAgICAgICAgICAgIG92ZXJsYXkuZGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgb3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWV4Y2VwdFJvb3RNZW51ICYmIHRoaXMub3ZlcmxheXMubGVuZ3RoID4gMCAmJiBvdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZS5uZXh0KHsgZXZlbnRUeXBlOiAnY2FuY2VsJywgZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgb3ZlcmxheS5kZXRhY2goKTtcbiAgICAgICAgICAgICAgICBvdmVybGF5LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV3TGVhZiA9IHRoaXMuZ2V0TGFzdEF0dGFjaGVkT3ZlcmxheSgpO1xuICAgICAgICAgICAgaWYgKG5ld0xlYWYpIHtcbiAgICAgICAgICAgICAgICBuZXdMZWFmLmNvbnRleHRNZW51LmlzTGVhZiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNEZXN0cm95aW5nTGVhZk1lbnUgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3lTdWJNZW51cyhjb250ZXh0TWVudTogQ29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBjb250ZXh0TWVudS5vdmVybGF5O1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMub3ZlcmxheXMuaW5kZXhPZihvdmVybGF5KTtcbiAgICAgICAgdGhpcy5vdmVybGF5cy5zbGljZShpbmRleCArIDEpLmZvckVhY2goKHN1Yk1lbnVPdmVybGF5KSA9PiB7XG4gICAgICAgICAgICBzdWJNZW51T3ZlcmxheS5kZXRhY2goKTtcbiAgICAgICAgICAgIHN1Yk1lbnVPdmVybGF5LmRpc3Bvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzTGVhZk1lbnUoY29udGV4dE1lbnVDb250ZW50OiBDb250ZXh0TWVudUNvbnRlbnRDb21wb25lbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuZ2V0TGFzdEF0dGFjaGVkT3ZlcmxheSgpO1xuICAgICAgICByZXR1cm4gY29udGV4dE1lbnVDb250ZW50Lm92ZXJsYXkgPT09IG92ZXJsYXk7XG4gICAgfVxufVxuIl19