UNPKG

angular-duo-pane

Version:

A library for Angular projects to easily add a two pane view for desktops, foldables and dual screen devices.

247 lines 31.1 kB
import { __decorate } from "tslib"; import { ComponentFactoryResolver, ComponentRef, Directive, EventEmitter, Input, Output, TemplateRef, ViewContainerRef } from '@angular/core'; import { DuoPaneComponent } from '../components/duo-pane/duo-pane.component'; import { DuoPaneInformationService } from '../services/duo-pane-information.service'; import { Segment } from '../models/Segment'; var DuoPaneDirective = /** @class */ (function () { function DuoPaneDirective(componentfactoryResolver, templateRef, viewContainer, dualScreenInformationService) { var _this = this; this.componentfactoryResolver = componentfactoryResolver; this.templateRef = templateRef; this.viewContainer = viewContainer; this.dualScreenInformationService = dualScreenInformationService; this.secondaryPaneTemplateRef = null; this.EnsureSecondaryPaneVisible = false; /* Variables set to control two pane if only one window segment is available-*/ this.TwoPaneMinWidthSingleSegment = 0; this.TwoPaneMinHeightSingleSegment = 0; this.TwoPaneSpanningModeSingleSegment = 'none'; this.PrimaryPanePercentageSingleSegment = 50; this.paneFactory = this.componentfactoryResolver.resolveComponentFactory(DuoPaneComponent); this.primaryPaneRef = null; this.secondaryPaneRef = null; this.secondaryPaneVisibilityHandler = new EventEmitter(); this.secondaryPaneVisible = undefined; dualScreenInformationService.addEventListener('change', function () { _this.updateView(); }); this.updateView(); } Object.defineProperty(DuoPaneDirective.prototype, "primaryPanePercentageSingleSegment", { get: function () { return this.PrimaryPanePercentageSingleSegment; }, set: function (value) { if (typeof value === 'string') { var fractionValue = Number(value); if (!isNaN(fractionValue) && fractionValue >= 0 && fractionValue <= 100) { this.PrimaryPanePercentageSingleSegment = fractionValue; this.updateView(); } } else if (typeof value === 'number') { if (value >= 0 && value <= 100) { this.PrimaryPanePercentageSingleSegment = value; this.updateView(); } } }, enumerable: true, configurable: true }); Object.defineProperty(DuoPaneDirective.prototype, "secondaryPane", { set: function (secondaryPane) { this.secondaryPaneTemplateRef = secondaryPane; this.destroySecondaryPaneRef(); this.updateView(); }, enumerable: true, configurable: true }); DuoPaneDirective.prototype.destroySecondaryPaneRef = function () { if (this.secondaryPaneRef) { var secondaryPaneIndex = this.viewContainer.indexOf(this.secondaryPaneRef.hostView); if (secondaryPaneIndex >= 0) { this.viewContainer.remove(secondaryPaneIndex); } this.secondaryPaneRef.destroy(); this.secondaryPaneRef = null; } }; DuoPaneDirective.prototype.destroyPrimaryPaneRef = function () { if (this.primaryPaneRef) { var primaryPaneIndex = this.viewContainer.indexOf(this.primaryPaneRef.hostView); if (primaryPaneIndex >= 0) { this.viewContainer.remove(primaryPaneIndex); } this.primaryPaneRef.destroy(); this.primaryPaneRef = null; } }; Object.defineProperty(DuoPaneDirective.prototype, "ensureSecondaryPaneVisible", { set: function (value) { this.EnsureSecondaryPaneVisible = value; this.updateView(); }, enumerable: true, configurable: true }); Object.defineProperty(DuoPaneDirective.prototype, "twoPaneMinWidthSingleSegment", { set: function (minWidth) { if (typeof minWidth === 'string') { var minWidthValue = Number(minWidth); if (minWidthValue >= 0 && !isNaN(minWidthValue)) { this.TwoPaneMinWidthSingleSegment = minWidthValue; this.updateView(); } } else if (typeof minWidth === 'number' && minWidth >= 0) { this.TwoPaneMinWidthSingleSegment = minWidth; this.updateView(); } }, enumerable: true, configurable: true }); Object.defineProperty(DuoPaneDirective.prototype, "twoPaneMinHeightSingleSegment", { set: function (minHeight) { if (typeof minHeight === 'string') { var minHeightValue = Number(minHeight); if (minHeightValue >= 0 && !isNaN(minHeightValue)) { this.TwoPaneMinHeightSingleSegment = minHeightValue; this.updateView(); } } else if (typeof minHeight === 'number' && minHeight >= 0) { this.TwoPaneMinHeightSingleSegment = minHeight; this.updateView(); } }, enumerable: true, configurable: true }); Object.defineProperty(DuoPaneDirective.prototype, "twoPaneSpanningModeSingleSegment", { set: function (spanningMode) { if (spanningMode) { this.TwoPaneSpanningModeSingleSegment = spanningMode; this.updateView(); } }, enumerable: true, configurable: true }); DuoPaneDirective.prototype.emitSecondaryPaneVisibility = function (visible) { if (this.secondaryPaneVisible === undefined || this.secondaryPaneVisible === null || visible !== this.secondaryPaneVisible) { this.secondaryPaneVisible = visible; this.secondaryPaneVisibilityHandler.emit(visible); } }; DuoPaneDirective.prototype.updateView = function () { /*this.viewContainer.createEmbeddedView(this.templateRef); if(this.secondaryPaneTemplateRef != null) { this.viewContainer.createEmbeddedView(this.secondaryPaneTemplateRef); }*/ var windowSegements = this.dualScreenInformationService.windowSegments; if (windowSegements.length > 0) { if (windowSegements.length > 1) { this.renderDualPanes(this.dualScreenInformationService.getTwoLargestSegments()); } else if (windowSegements[0].height >= this.TwoPaneMinHeightSingleSegment && windowSegements[0].width >= this.TwoPaneMinWidthSingleSegment && this.TwoPaneSpanningModeSingleSegment !== 'none') { this.renderBothPanes(windowSegements[0]); } else { if (this.EnsureSecondaryPaneVisible) { this.destroyPrimaryPaneRef(); this.renderSecondaryPane(windowSegements[0]); } else { this.destroySecondaryPaneRef(); this.renderPrimaryPane(windowSegements[0]); this.emitSecondaryPaneVisibility(false); } } } }; DuoPaneDirective.prototype.renderBothPanes = function (windowSegment) { var primarySegment; var secondarySegment; if (this.TwoPaneSpanningModeSingleSegment === 'single-fold-horizontal') { var fraction = this.PrimaryPanePercentageSingleSegment / 100; primarySegment = new Segment(windowSegment.width, windowSegment.height * fraction, 0, 0); secondarySegment = new Segment(windowSegment.width, windowSegment.height * (1 - fraction), windowSegment.height * fraction, 0); } else if (this.TwoPaneSpanningModeSingleSegment === 'single-fold-vertical') { var fraction = this.PrimaryPanePercentageSingleSegment / 100; primarySegment = new Segment(windowSegment.width * fraction, windowSegment.height, 0, 0); secondarySegment = new Segment(windowSegment.width * (1 - fraction), windowSegment.height, 0, windowSegment.width * fraction); } else { return; } this.renderDualPanes([primarySegment, secondarySegment]); }; DuoPaneDirective.prototype.renderDualPanes = function (windowSegments) { if (windowSegments.length > 0) { this.renderPrimaryPane(windowSegments[0]); } if (windowSegments.length > 1) { this.renderSecondaryPane(windowSegments[1]); } }; DuoPaneDirective.prototype.renderPrimaryPane = function (segment) { // const paneFactory = this.componentfactoryResolver.resolveComponentFactory(PrimaryPaneComponent); if (!this.primaryPaneRef) { this.primaryPaneRef = this.viewContainer.createComponent(this.paneFactory); } this.primaryPaneRef.instance.segment = segment; this.primaryPaneRef.instance.contentTemplateRef = this.templateRef; }; DuoPaneDirective.prototype.renderSecondaryPane = function (segment) { if (this.secondaryPaneTemplateRef !== null && this.secondaryPaneTemplateRef !== undefined) { // const paneFactory = this.componentfactoryResolver.resolveComponentFactory(PrimaryPaneComponent); if (!this.secondaryPaneRef) { this.secondaryPaneRef = this.viewContainer.createComponent(this.paneFactory); } this.secondaryPaneRef.instance.segment = segment; this.secondaryPaneRef.instance.contentTemplateRef = this.secondaryPaneTemplateRef; this.emitSecondaryPaneVisibility(true); } }; DuoPaneDirective.ctorParameters = function () { return [ { type: ComponentFactoryResolver }, { type: TemplateRef }, { type: ViewContainerRef }, { type: DuoPaneInformationService } ]; }; __decorate([ Input() ], DuoPaneDirective.prototype, "primaryPanePercentageSingleSegment", null); __decorate([ Output() ], DuoPaneDirective.prototype, "secondaryPaneVisibilityHandler", void 0); __decorate([ Input() ], DuoPaneDirective.prototype, "secondaryPane", null); __decorate([ Input() ], DuoPaneDirective.prototype, "ensureSecondaryPaneVisible", null); __decorate([ Input() ], DuoPaneDirective.prototype, "twoPaneMinWidthSingleSegment", null); __decorate([ Input() ], DuoPaneDirective.prototype, "twoPaneMinHeightSingleSegment", null); __decorate([ Input() ], DuoPaneDirective.prototype, "twoPaneSpanningModeSingleSegment", null); DuoPaneDirective = __decorate([ Directive({ selector: '[duoPane]' }) ], DuoPaneDirective); return DuoPaneDirective; }()); export { DuoPaneDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVvLXBhbmUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1kdW8tcGFuZS8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2R1by1wYW5lLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlJLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBR3JGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUs1QztJQW1DRSwwQkFDVSx3QkFBa0QsRUFDbEQsV0FBNkIsRUFDN0IsYUFBK0IsRUFDL0IsNEJBQXVEO1FBSmpFLGlCQVdDO1FBVlMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFDN0Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLGlDQUE0QixHQUE1Qiw0QkFBNEIsQ0FBMkI7UUFyQ3pELDZCQUF3QixHQUFxQixJQUFJLENBQUM7UUFDbEQsK0JBQTBCLEdBQUcsS0FBSyxDQUFDO1FBRTNDLCtFQUErRTtRQUN2RSxpQ0FBNEIsR0FBRyxDQUFDLENBQUM7UUFDakMsa0NBQTZCLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLHFDQUFnQyxHQUFHLE1BQU0sQ0FBQztRQUMxQyx1Q0FBa0MsR0FBRyxFQUFFLENBQUM7UUFxQi9CLGdCQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDL0YsbUJBQWMsR0FBbUMsSUFBSSxDQUFDO1FBQ3RELHFCQUFnQixHQUFtQyxJQUFJLENBQUM7UUFnQi9DLG1DQUE4QixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFJdEUseUJBQW9CLEdBQVksU0FBUyxDQUFDO1FBWmhELDRCQUE0QixDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtZQUN0RCxLQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFcEIsQ0FBQztJQXBDRCxzQkFBVyxnRUFBa0M7YUFBN0M7WUFDRSxPQUFPLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztRQUNqRCxDQUFDO2FBQ1EsVUFBOEMsS0FBYTtZQUNsRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDN0IsSUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsSUFBSSxDQUFDLElBQUksYUFBYSxJQUFJLEdBQUcsRUFBRTtvQkFDdkUsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLGFBQWEsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2lCQUVuQjthQUVGO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUNwQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLEtBQUssQ0FBQztvQkFDaEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2lCQUVuQjthQUNGO1FBQ0gsQ0FBQzs7O09BakJBO0lBNENRLHNCQUFJLDJDQUFhO2FBQWpCLFVBQWtCLGFBQStCO1lBQ3hELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxhQUFhLENBQUM7WUFDOUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7OztPQUFBO0lBRU8sa0RBQXVCLEdBQS9CO1FBQ0UsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEYsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDL0M7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFTyxnREFBcUIsR0FBN0I7UUFDRSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xGLElBQUksZ0JBQWdCLElBQUksQ0FBQyxFQUFFO2dCQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFUSxzQkFBSSx3REFBMEI7YUFBOUIsVUFBK0IsS0FBYztZQUNwRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDOzs7T0FBQTtJQUVRLHNCQUFJLDBEQUE0QjthQUFoQyxVQUFpQyxRQUFnQjtZQUN4RCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtnQkFDaEMsSUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUU7b0JBQy9DLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxhQUFhLENBQUM7b0JBQ2xELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFFbkI7YUFDRjtpQkFBTSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO2dCQUN4RCxJQUFJLENBQUMsNEJBQTRCLEdBQUcsUUFBUSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDbkI7UUFFSCxDQUFDOzs7T0FBQTtJQUVRLHNCQUFJLDJEQUE2QjthQUFqQyxVQUFrQyxTQUFpQjtZQUMxRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtnQkFDakMsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUU7b0JBQ2pELElBQUksQ0FBQyw2QkFBNkIsR0FBRyxjQUFjLENBQUM7b0JBQ3BELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFFbkI7YUFDRjtpQkFBTSxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFO2dCQUMxRCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsU0FBUyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDbkI7UUFDSCxDQUFDOzs7T0FBQTtJQUlRLHNCQUFJLDhEQUFnQzthQUFwQyxVQUFxQyxZQUEwQjtZQUN0RSxJQUFJLFlBQVksRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLFlBQVksQ0FBQztnQkFDckQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQ25CO1FBQ0gsQ0FBQzs7O09BQUE7SUFFTyxzREFBMkIsR0FBbkMsVUFBb0MsT0FBZ0I7UUFDbEQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUMxSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDO1lBQ3BDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkQ7SUFDSCxDQUFDO0lBSU8scUNBQVUsR0FBbEI7UUFFRTs7O1dBR0c7UUFDSCxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsY0FBYyxDQUFDO1FBQ3pFLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDOUIsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFFOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO2FBRWpGO2lCQUFNLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsNkJBQTZCO21CQUNyRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyw0QkFBNEI7bUJBQzdELElBQUksQ0FBQyxnQ0FBZ0MsS0FBSyxNQUFNLEVBQUU7Z0JBQ3JELElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUM7aUJBQU07Z0JBQ0wsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzlDO3FCQUFNO29CQUVMLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDekM7YUFDRjtTQUNGO0lBRUgsQ0FBQztJQUVPLDBDQUFlLEdBQXZCLFVBQXdCLGFBQXVCO1FBQzdDLElBQUksY0FBd0IsQ0FBQztRQUM3QixJQUFJLGdCQUEwQixDQUFDO1FBQy9CLElBQUksSUFBSSxDQUFDLGdDQUFnQyxLQUFLLHdCQUF3QixFQUFFO1lBQ3RFLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxHQUFHLENBQUM7WUFDL0QsY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBRSxhQUFhLENBQUMsTUFBTSxHQUFHLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNoSTthQUFNLElBQUksSUFBSSxDQUFDLGdDQUFnQyxLQUFLLHNCQUFzQixFQUFFO1lBQzNFLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxHQUFHLENBQUM7WUFDL0QsY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQztTQUMvSDthQUFNO1lBQ0wsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFFM0QsQ0FBQztJQUVPLDBDQUFlLEdBQXZCLFVBQXdCLGNBQTBCO1FBQ2hELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNDO1FBRUQsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDO0lBRU8sNENBQWlCLEdBQXpCLFVBQTBCLE9BQWlCO1FBQ3pDLG1HQUFtRztRQUNuRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUU1RTtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUVyRSxDQUFDO0lBRU8sOENBQW1CLEdBQTNCLFVBQTRCLE9BQWlCO1FBQzNDLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssU0FBUyxFQUFFO1lBQ3pGLG1HQUFtRztZQUNuRyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzlFO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ2pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQ2xGLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7O2dCQXRMbUMsd0JBQXdCO2dCQUNyQyxXQUFXO2dCQUNULGdCQUFnQjtnQkFDRCx5QkFBeUI7O0lBMUJ4RDtRQUFSLEtBQUssRUFBRTs4RUFnQlA7SUFtQlM7UUFBVCxNQUFNLEVBQUU7NEVBQXFFO0lBUXJFO1FBQVIsS0FBSyxFQUFFO3lEQUlQO0lBd0JRO1FBQVIsS0FBSyxFQUFFO3NFQUdQO0lBRVE7UUFBUixLQUFLLEVBQUU7d0VBYVA7SUFFUTtRQUFSLEtBQUssRUFBRTt5RUFZUDtJQUlRO1FBQVIsS0FBSyxFQUFFOzRFQUtQO0lBN0hVLGdCQUFnQjtRQUg1QixTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsV0FBVztTQUN0QixDQUFDO09BQ1csZ0JBQWdCLENBOE41QjtJQUFELHVCQUFDO0NBQUEsQUE5TkQsSUE4TkM7U0E5TlksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDb21wb25lbnRSZWYsIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHVvUGFuZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZHVvLXBhbmUvZHVvLXBhbmUuY29tcG9uZW50JztcbmltcG9ydCB7IER1b1BhbmVJbmZvcm1hdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kdW8tcGFuZS1pbmZvcm1hdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFNwYW5uaW5nTW9kZSB9IGZyb20gJy4uL21vZGVscy9TcGFubmluZ01vZGUnO1xuaW1wb3J0IHsgSVNlZ21lbnQgfSBmcm9tICcuLi9tb2RlbHMvSVNlZ21lbnQnO1xuaW1wb3J0IHsgU2VnbWVudCB9IGZyb20gJy4uL21vZGVscy9TZWdtZW50JztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2R1b1BhbmVdJ1xufSlcbmV4cG9ydCBjbGFzcyBEdW9QYW5lRGlyZWN0aXZlIHtcblxuICBwcml2YXRlIHNlY29uZGFyeVBhbmVUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG4gIHByaXZhdGUgRW5zdXJlU2Vjb25kYXJ5UGFuZVZpc2libGUgPSBmYWxzZTtcblxuICAvKiBWYXJpYWJsZXMgc2V0IHRvIGNvbnRyb2wgdHdvIHBhbmUgaWYgb25seSBvbmUgd2luZG93IHNlZ21lbnQgaXMgYXZhaWxhYmxlLSovXG4gIHByaXZhdGUgVHdvUGFuZU1pbldpZHRoU2luZ2xlU2VnbWVudCA9IDA7XG4gIHByaXZhdGUgVHdvUGFuZU1pbkhlaWdodFNpbmdsZVNlZ21lbnQgPSAwO1xuICBwcml2YXRlIFR3b1BhbmVTcGFubmluZ01vZGVTaW5nbGVTZWdtZW50ID0gJ25vbmUnO1xuICBwcml2YXRlIFByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQgPSA1MDtcbiAgcHVibGljIGdldCBwcmltYXJ5UGFuZVBlcmNlbnRhZ2VTaW5nbGVTZWdtZW50KCkge1xuICAgIHJldHVybiB0aGlzLlByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQ7XG4gIH1cbiAgQElucHV0KCkgcHVibGljIHNldCBwcmltYXJ5UGFuZVBlcmNlbnRhZ2VTaW5nbGVTZWdtZW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZnJhY3Rpb25WYWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAoIWlzTmFOKGZyYWN0aW9uVmFsdWUpICYmIGZyYWN0aW9uVmFsdWUgPj0gMCAmJiBmcmFjdGlvblZhbHVlIDw9IDEwMCkge1xuICAgICAgICB0aGlzLlByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQgPSBmcmFjdGlvblZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcblxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMDApIHtcbiAgICAgICAgdGhpcy5QcmltYXJ5UGFuZVBlcmNlbnRhZ2VTaW5nbGVTZWdtZW50ID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFuZUZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudGZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShEdW9QYW5lQ29tcG9uZW50KTtcbiAgcHJpdmF0ZSBwcmltYXJ5UGFuZVJlZjogQ29tcG9uZW50UmVmPER1b1BhbmVDb21wb25lbnQ+ID0gbnVsbDtcbiAgcHJpdmF0ZSBzZWNvbmRhcnlQYW5lUmVmOiBDb21wb25lbnRSZWY8RHVvUGFuZUNvbXBvbmVudD4gPSBudWxsO1xuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb21wb25lbnRmYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGR1YWxTY3JlZW5JbmZvcm1hdGlvblNlcnZpY2U6IER1b1BhbmVJbmZvcm1hdGlvblNlcnZpY2UpIHtcbiAgICBkdWFsU2NyZWVuSW5mb3JtYXRpb25TZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XG5cbiAgfVxuXG4gIEBPdXRwdXQoKSBwdWJsaWMgc2Vjb25kYXJ5UGFuZVZpc2liaWxpdHlIYW5kbGVyID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG5cblxuICBwcml2YXRlIHNlY29uZGFyeVBhbmVWaXNpYmxlOiBib29sZWFuID0gdW5kZWZpbmVkO1xuXG5cblxuICBASW5wdXQoKSBzZXQgc2Vjb25kYXJ5UGFuZShzZWNvbmRhcnlQYW5lOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgdGhpcy5zZWNvbmRhcnlQYW5lVGVtcGxhdGVSZWYgPSBzZWNvbmRhcnlQYW5lO1xuICAgIHRoaXMuZGVzdHJveVNlY29uZGFyeVBhbmVSZWYoKTtcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVNlY29uZGFyeVBhbmVSZWYoKSB7XG4gICAgaWYgKHRoaXMuc2Vjb25kYXJ5UGFuZVJlZikge1xuICAgICAgY29uc3Qgc2Vjb25kYXJ5UGFuZUluZGV4ID0gdGhpcy52aWV3Q29udGFpbmVyLmluZGV4T2YodGhpcy5zZWNvbmRhcnlQYW5lUmVmLmhvc3RWaWV3KTtcbiAgICAgIGlmIChzZWNvbmRhcnlQYW5lSW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIucmVtb3ZlKHNlY29uZGFyeVBhbmVJbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlY29uZGFyeVBhbmVSZWYuZGVzdHJveSgpO1xuICAgICAgdGhpcy5zZWNvbmRhcnlQYW5lUmVmID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lQcmltYXJ5UGFuZVJlZigpIHtcbiAgICBpZiAodGhpcy5wcmltYXJ5UGFuZVJlZikge1xuICAgICAgY29uc3QgcHJpbWFyeVBhbmVJbmRleCA9IHRoaXMudmlld0NvbnRhaW5lci5pbmRleE9mKHRoaXMucHJpbWFyeVBhbmVSZWYuaG9zdFZpZXcpO1xuICAgICAgaWYgKHByaW1hcnlQYW5lSW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIucmVtb3ZlKHByaW1hcnlQYW5lSW5kZXgpO1xuICAgICAgfVxuICAgICAgdGhpcy5wcmltYXJ5UGFuZVJlZi5kZXN0cm95KCk7XG4gICAgICB0aGlzLnByaW1hcnlQYW5lUmVmID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZW5zdXJlU2Vjb25kYXJ5UGFuZVZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLkVuc3VyZVNlY29uZGFyeVBhbmVWaXNpYmxlID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdHdvUGFuZU1pbldpZHRoU2luZ2xlU2VnbWVudChtaW5XaWR0aDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBtaW5XaWR0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IG1pbldpZHRoVmFsdWUgPSBOdW1iZXIobWluV2lkdGgpO1xuICAgICAgaWYgKG1pbldpZHRoVmFsdWUgPj0gMCAmJiAhaXNOYU4obWluV2lkdGhWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5Ud29QYW5lTWluV2lkdGhTaW5nbGVTZWdtZW50ID0gbWluV2lkdGhWYWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG5cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaW5XaWR0aCA9PT0gJ251bWJlcicgJiYgbWluV2lkdGggPj0gMCkge1xuICAgICAgdGhpcy5Ud29QYW5lTWluV2lkdGhTaW5nbGVTZWdtZW50ID0gbWluV2lkdGg7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICB9XG5cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0d29QYW5lTWluSGVpZ2h0U2luZ2xlU2VnbWVudChtaW5IZWlnaHQ6IG51bWJlcikge1xuICAgIGlmICh0eXBlb2YgbWluSGVpZ2h0ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbWluSGVpZ2h0VmFsdWUgPSBOdW1iZXIobWluSGVpZ2h0KTtcbiAgICAgIGlmIChtaW5IZWlnaHRWYWx1ZSA+PSAwICYmICFpc05hTihtaW5IZWlnaHRWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5Ud29QYW5lTWluSGVpZ2h0U2luZ2xlU2VnbWVudCA9IG1pbkhlaWdodFZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1pbkhlaWdodCA9PT0gJ251bWJlcicgJiYgbWluSGVpZ2h0ID49IDApIHtcbiAgICAgIHRoaXMuVHdvUGFuZU1pbkhlaWdodFNpbmdsZVNlZ21lbnQgPSBtaW5IZWlnaHQ7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICB9XG4gIH1cblxuXG5cbiAgQElucHV0KCkgc2V0IHR3b1BhbmVTcGFubmluZ01vZGVTaW5nbGVTZWdtZW50KHNwYW5uaW5nTW9kZTogU3Bhbm5pbmdNb2RlKSB7XG4gICAgaWYgKHNwYW5uaW5nTW9kZSkge1xuICAgICAgdGhpcy5Ud29QYW5lU3Bhbm5pbmdNb2RlU2luZ2xlU2VnbWVudCA9IHNwYW5uaW5nTW9kZTtcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlY29uZGFyeVBhbmVWaXNpYmlsaXR5KHZpc2libGU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5zZWNvbmRhcnlQYW5lVmlzaWJsZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuc2Vjb25kYXJ5UGFuZVZpc2libGUgPT09IG51bGwgfHwgdmlzaWJsZSAhPT0gdGhpcy5zZWNvbmRhcnlQYW5lVmlzaWJsZSkge1xuICAgICAgdGhpcy5zZWNvbmRhcnlQYW5lVmlzaWJsZSA9IHZpc2libGU7XG4gICAgICB0aGlzLnNlY29uZGFyeVBhbmVWaXNpYmlsaXR5SGFuZGxlci5lbWl0KHZpc2libGUpO1xuICAgIH1cbiAgfVxuXG5cblxuICBwcml2YXRlIHVwZGF0ZVZpZXcoKSB7XG5cbiAgICAvKnRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZik7XG4gICAgaWYodGhpcy5zZWNvbmRhcnlQYW5lVGVtcGxhdGVSZWYgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuc2Vjb25kYXJ5UGFuZVRlbXBsYXRlUmVmKTtcbiAgICB9Ki9cbiAgICBjb25zdCB3aW5kb3dTZWdlbWVudHMgPSB0aGlzLmR1YWxTY3JlZW5JbmZvcm1hdGlvblNlcnZpY2Uud2luZG93U2VnbWVudHM7XG4gICAgaWYgKHdpbmRvd1NlZ2VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAod2luZG93U2VnZW1lbnRzLmxlbmd0aCA+IDEpIHtcblxuICAgICAgICB0aGlzLnJlbmRlckR1YWxQYW5lcyh0aGlzLmR1YWxTY3JlZW5JbmZvcm1hdGlvblNlcnZpY2UuZ2V0VHdvTGFyZ2VzdFNlZ21lbnRzKCkpO1xuXG4gICAgICB9IGVsc2UgaWYgKHdpbmRvd1NlZ2VtZW50c1swXS5oZWlnaHQgPj0gdGhpcy5Ud29QYW5lTWluSGVpZ2h0U2luZ2xlU2VnbWVudFxuICAgICAgICAmJiB3aW5kb3dTZWdlbWVudHNbMF0ud2lkdGggPj0gdGhpcy5Ud29QYW5lTWluV2lkdGhTaW5nbGVTZWdtZW50XG4gICAgICAgICYmIHRoaXMuVHdvUGFuZVNwYW5uaW5nTW9kZVNpbmdsZVNlZ21lbnQgIT09ICdub25lJykge1xuICAgICAgICB0aGlzLnJlbmRlckJvdGhQYW5lcyh3aW5kb3dTZWdlbWVudHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuRW5zdXJlU2Vjb25kYXJ5UGFuZVZpc2libGUpIHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3lQcmltYXJ5UGFuZVJlZigpO1xuICAgICAgICAgIHRoaXMucmVuZGVyU2Vjb25kYXJ5UGFuZSh3aW5kb3dTZWdlbWVudHNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgdGhpcy5kZXN0cm95U2Vjb25kYXJ5UGFuZVJlZigpO1xuICAgICAgICAgIHRoaXMucmVuZGVyUHJpbWFyeVBhbmUod2luZG93U2VnZW1lbnRzWzBdKTtcbiAgICAgICAgICB0aGlzLmVtaXRTZWNvbmRhcnlQYW5lVmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQm90aFBhbmVzKHdpbmRvd1NlZ21lbnQ6IElTZWdtZW50KSB7XG4gICAgbGV0IHByaW1hcnlTZWdtZW50OiBJU2VnbWVudDtcbiAgICBsZXQgc2Vjb25kYXJ5U2VnbWVudDogSVNlZ21lbnQ7XG4gICAgaWYgKHRoaXMuVHdvUGFuZVNwYW5uaW5nTW9kZVNpbmdsZVNlZ21lbnQgPT09ICdzaW5nbGUtZm9sZC1ob3Jpem9udGFsJykge1xuICAgICAgY29uc3QgZnJhY3Rpb24gPSB0aGlzLlByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQgLyAxMDA7XG4gICAgICBwcmltYXJ5U2VnbWVudCA9IG5ldyBTZWdtZW50KHdpbmRvd1NlZ21lbnQud2lkdGgsIHdpbmRvd1NlZ21lbnQuaGVpZ2h0ICogZnJhY3Rpb24sIDAsIDApO1xuICAgICAgc2Vjb25kYXJ5U2VnbWVudCA9IG5ldyBTZWdtZW50KHdpbmRvd1NlZ21lbnQud2lkdGgsIHdpbmRvd1NlZ21lbnQuaGVpZ2h0ICogKDEgLSBmcmFjdGlvbiksIHdpbmRvd1NlZ21lbnQuaGVpZ2h0ICogZnJhY3Rpb24sIDApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5Ud29QYW5lU3Bhbm5pbmdNb2RlU2luZ2xlU2VnbWVudCA9PT0gJ3NpbmdsZS1mb2xkLXZlcnRpY2FsJykge1xuICAgICAgY29uc3QgZnJhY3Rpb24gPSB0aGlzLlByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQgLyAxMDA7XG4gICAgICBwcmltYXJ5U2VnbWVudCA9IG5ldyBTZWdtZW50KHdpbmRvd1NlZ21lbnQud2lkdGggKiBmcmFjdGlvbiwgd2luZG93U2VnbWVudC5oZWlnaHQsIDAsIDApO1xuICAgICAgc2Vjb25kYXJ5U2VnbWVudCA9IG5ldyBTZWdtZW50KHdpbmRvd1NlZ21lbnQud2lkdGggKiAoMSAtIGZyYWN0aW9uKSwgd2luZG93U2VnbWVudC5oZWlnaHQsIDAsIHdpbmRvd1NlZ21lbnQud2lkdGggKiBmcmFjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlckR1YWxQYW5lcyhbcHJpbWFyeVNlZ21lbnQsIHNlY29uZGFyeVNlZ21lbnRdKTtcblxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJEdWFsUGFuZXMod2luZG93U2VnbWVudHM6IElTZWdtZW50W10pIHtcbiAgICBpZiAod2luZG93U2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yZW5kZXJQcmltYXJ5UGFuZSh3aW5kb3dTZWdtZW50c1swXSk7XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvd1NlZ21lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMucmVuZGVyU2Vjb25kYXJ5UGFuZSh3aW5kb3dTZWdtZW50c1sxXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJQcmltYXJ5UGFuZShzZWdtZW50OiBJU2VnbWVudCkge1xuICAgIC8vIGNvbnN0IHBhbmVGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRmYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUHJpbWFyeVBhbmVDb21wb25lbnQpO1xuICAgIGlmICghdGhpcy5wcmltYXJ5UGFuZVJlZikge1xuICAgICAgdGhpcy5wcmltYXJ5UGFuZVJlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodGhpcy5wYW5lRmFjdG9yeSk7XG5cbiAgICB9XG5cbiAgICB0aGlzLnByaW1hcnlQYW5lUmVmLmluc3RhbmNlLnNlZ21lbnQgPSBzZWdtZW50O1xuICAgIHRoaXMucHJpbWFyeVBhbmVSZWYuaW5zdGFuY2UuY29udGVudFRlbXBsYXRlUmVmID0gdGhpcy50ZW1wbGF0ZVJlZjtcblxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJTZWNvbmRhcnlQYW5lKHNlZ21lbnQ6IElTZWdtZW50KSB7XG4gICAgaWYgKHRoaXMuc2Vjb25kYXJ5UGFuZVRlbXBsYXRlUmVmICE9PSBudWxsICYmIHRoaXMuc2Vjb25kYXJ5UGFuZVRlbXBsYXRlUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGNvbnN0IHBhbmVGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRmYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUHJpbWFyeVBhbmVDb21wb25lbnQpO1xuICAgICAgaWYgKCF0aGlzLnNlY29uZGFyeVBhbmVSZWYpIHtcbiAgICAgICAgdGhpcy5zZWNvbmRhcnlQYW5lUmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudCh0aGlzLnBhbmVGYWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2Vjb25kYXJ5UGFuZVJlZi5pbnN0YW5jZS5zZWdtZW50ID0gc2VnbWVudDtcbiAgICAgIHRoaXMuc2Vjb25kYXJ5UGFuZVJlZi5pbnN0YW5jZS5jb250ZW50VGVtcGxhdGVSZWYgPSB0aGlzLnNlY29uZGFyeVBhbmVUZW1wbGF0ZVJlZjtcbiAgICAgIHRoaXMuZW1pdFNlY29uZGFyeVBhbmVWaXNpYmlsaXR5KHRydWUpO1xuICAgIH1cbiAgfVxuXG5cblxufVxuIl19