UNPKG

ngx-split-view

Version:

A resizable flex-box split layout component for Angular

223 lines 25.3 kB
import { __decorate } from "tslib"; import { AfterContentInit, Component, ContentChildren, Directive, Input, OnChanges, OnDestroy, QueryList, SimpleChanges, ViewContainerRef, HostBinding, Output, EventEmitter, ContentChild, TemplateRef, ChangeDetectionStrategy, } from '@angular/core'; import { Subject, Subscription } from 'rxjs'; import { map, mergeAll, startWith, switchMap } from 'rxjs/operators'; import Split from 'split.js'; let SplitPaneDirective = class SplitPaneDirective { constructor(viewContainerRef) { this.viewContainerRef = viewContainerRef; this.splitRatio = 1; this.minSize = 100; this.sizeChanges = new Subject(); this.minSizeChanges = new Subject(); } ngOnChanges(changes) { if (changes.splitRatio) { this.sizeChanges.next(); } if (changes.minSize) { this.minSizeChanges.next(); } } }; SplitPaneDirective.ctorParameters = () => [ { type: ViewContainerRef } ]; __decorate([ Input() ], SplitPaneDirective.prototype, "splitRatio", void 0); __decorate([ Input() ], SplitPaneDirective.prototype, "minSize", void 0); SplitPaneDirective = __decorate([ Directive({ // tslint:disable-next-line: directive-selector selector: '[splitPane]' }) ], SplitPaneDirective); export { SplitPaneDirective }; let SplitViewGutterDirective = class SplitViewGutterDirective { constructor(template) { this.template = template; } }; SplitViewGutterDirective.ctorParameters = () => [ { type: TemplateRef } ]; SplitViewGutterDirective = __decorate([ Directive({ // tslint:disable-next-line: directive-selector selector: '[gutterTemplate]' }) ], SplitViewGutterDirective); export { SplitViewGutterDirective }; let SplitViewComponent = class SplitViewComponent { constructor(viewContainerRef) { this.viewContainerRef = viewContainerRef; this.dragging = new EventEmitter(); this.dragStart = new EventEmitter(); this.dragEnd = new EventEmitter(); this.expandToMin = false; this.gutterSize = 10; this.gutterAlign = 'center'; this.snapOffset = 30; this.dragInterval = 1; this.direction = 'horizontal'; this.subscriptions = new Subscription(); } get isHorizontal() { return this.direction === 'horizontal'; } get isVertical() { return this.direction === 'vertical'; } ngOnChanges(changes) { if (changes.direction || changes.gutterSize || changes.gutterAlign || changes.snapOffset || changes.dragInterval || changes.expandToMin) { this.refresh(); } } ngAfterContentInit() { const splitPaneChanges = this.splitPanes.changes .pipe(startWith(this.splitPanes)); const childrenChanges = splitPaneChanges .subscribe(() => this.refresh()); const sizeChanges = splitPaneChanges .pipe(switchMap(() => this.splitPanes.map(p => p.sizeChanges)), mergeAll()) .subscribe(() => { var _a; return (_a = this.split) === null || _a === void 0 ? void 0 : _a.setSizes(this.getSizes()); }); const dragEndEvents = this.dragEnd .pipe(map(event => event.sizes)) .subscribe(sizes => { const panes = this.splitPanes.toArray(); for (let i = 0; i < panes.length; i++) { panes[i].splitRatio = sizes[i]; } }); this.subscriptions.add(childrenChanges); this.subscriptions.add(sizeChanges); this.subscriptions.add(dragEndEvents); } ngOnDestroy() { this.subscriptions.unsubscribe(); this.destroySplit(); } refresh() { this.destroySplit(); if (!this.splitPanes || this.splitPanes.length === 0) { return; } const panes = new Array(); const minSizes = new Array(); this.splitPanes.forEach(d => { panes.push(d.viewContainerRef.element.nativeElement); minSizes.push(d.minSize); }); const splitOptions = { sizes: this.getSizes(), minSize: minSizes, expandToMin: this.expandToMin, gutterSize: this.gutterSize, gutterAlign: this.gutterAlign, snapOffset: this.snapOffset, dragInterval: this.dragInterval, direction: this.direction, elementStyle: (dimension, size, gutterSize) => ({ flexBasis: 'calc(' + size + '% - ' + gutterSize + 'px)' }), gutterStyle: (dimension, gutterSize) => ({ flexBasis: gutterSize + 'px' }), onDrag: (sizes) => { if (this.dragging.observers.length > 0) { this.dragging.emit({ source: this, sizes }); } }, onDragStart: (sizes) => this.dragStart.emit({ source: this, sizes }), onDragEnd: (sizes) => this.dragEnd.emit({ source: this, sizes }) }; if (this.gutterDef) { splitOptions.gutter = (index, direction) => { const view = this.viewContainerRef.createEmbeddedView(this.gutterDef.template); const elements = view.rootNodes.filter(e => e instanceof HTMLElement); if (elements.length !== 1) { throw new Error('Gutter template must contain exactly one element'); } return elements[0]; }; } this.split = Split(panes, splitOptions); } destroySplit() { if (!this.split) { return; } this.viewContainerRef.clear(); this.split.destroy(false, !!this.gutterDef); this.split = undefined; } getSizes() { const panes = new Array(); const ratios = new Array(); let totalSize = 0; this.splitPanes.forEach(d => { panes.push(d.viewContainerRef.element.nativeElement); const sanitizedSize = d.splitRatio >= 0 ? d.splitRatio : 0; ratios.push(sanitizedSize); totalSize += sanitizedSize; }); return ratios.map(size => (size / totalSize) * 100); } }; SplitViewComponent.ctorParameters = () => [ { type: ViewContainerRef } ]; __decorate([ Output() ], SplitViewComponent.prototype, "dragging", void 0); __decorate([ Output() ], SplitViewComponent.prototype, "dragStart", void 0); __decorate([ Output() ], SplitViewComponent.prototype, "dragEnd", void 0); __decorate([ Input() ], SplitViewComponent.prototype, "expandToMin", void 0); __decorate([ Input() ], SplitViewComponent.prototype, "gutterSize", void 0); __decorate([ Input() ], SplitViewComponent.prototype, "gutterAlign", void 0); __decorate([ Input() ], SplitViewComponent.prototype, "snapOffset", void 0); __decorate([ Input() ], SplitViewComponent.prototype, "dragInterval", void 0); __decorate([ Input() ], SplitViewComponent.prototype, "direction", void 0); __decorate([ ContentChildren(SplitPaneDirective) ], SplitViewComponent.prototype, "splitPanes", void 0); __decorate([ ContentChild(SplitViewGutterDirective, { static: true }) ], SplitViewComponent.prototype, "gutterDef", void 0); __decorate([ HostBinding('class.split-view-horizontal') ], SplitViewComponent.prototype, "isHorizontal", null); __decorate([ HostBinding('class.split-view-vertical') ], SplitViewComponent.prototype, "isVertical", null); SplitViewComponent = __decorate([ Component({ // tslint:disable-next-line: component-selector selector: 'split-view', template: '<ng-content select="[splitPane]"></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:flex}:host.split-view-horizontal{flex-direction:row}:host.split-view-vertical{flex-direction:column}::ng-deep .gutter.gutter-horizontal{cursor:col-resize}::ng-deep .gutter.gutter-vertical{cursor:row-resize}"] }) ], SplitViewComponent); export { SplitViewComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BsaXQtdmlldy8iLCJzb3VyY2VzIjpbImxpYi9zcGxpdC12aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLHVCQUF1QixHQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxLQUFLLE1BQU0sVUFBVSxDQUFDO0FBZTdCLElBQWEsa0JBQWtCLEdBQS9CLE1BQWEsa0JBQWtCO0lBTzdCLFlBQTRCLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBTnJELGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixZQUFPLEdBQUcsR0FBRyxDQUFDO1FBRXZCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNsQyxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFHckMsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN6QjtRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzVC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LGdEQUFnRDtRQUUxRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7S0FDaEQsQ0FBQztHQUNXLGtCQUFrQixDQXNKOUI7U0F0Slksa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ29udGVudENoaWxkLFxuICBUZW1wbGF0ZVJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIG1lcmdlQWxsLCBzdGFydFdpdGgsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBTcGxpdCBmcm9tICdzcGxpdC5qcyc7XG5cbmV4cG9ydCB0eXBlIFNwbGl0RGlyZWN0aW9uID0gJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcblxuZXhwb3J0IHR5cGUgR3V0dGVyQWxpZ25tZW50ID0gJ3N0YXJ0JyB8ICdlbmQnIHwgJ2NlbnRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJhZ0V2ZW50IHtcbiAgcmVhZG9ubHkgc291cmNlOiBTcGxpdFZpZXdDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNpemVzOiBSZWFkb25seUFycmF5PG51bWJlcj47XG59XG5cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tzcGxpdFBhbmVdJ1xufSlcbmV4cG9ydCBjbGFzcyBTcGxpdFBhbmVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBzcGxpdFJhdGlvID0gMTtcbiAgQElucHV0KCkgbWluU2l6ZSA9IDEwMDtcblxuICBzaXplQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIG1pblNpemVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLnNwbGl0UmF0aW8pIHtcbiAgICAgIHRoaXMuc2l6ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm1pblNpemUpIHtcbiAgICAgIHRoaXMubWluU2l6ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbZ3V0dGVyVGVtcGxhdGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBTcGxpdFZpZXdHdXR0ZXJEaXJlY3RpdmUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdzcGxpdC12aWV3JyxcbiAgdGVtcGxhdGU6ICc8bmctY29udGVudCBzZWxlY3Q9XCJbc3BsaXRQYW5lXVwiPjwvbmctY29udGVudD4nLFxuICBzdHlsZVVybHM6IFsnLi9zcGxpdC12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFNwbGl0Vmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcblxuICBAT3V0cHV0KCkgZHJhZ2dpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZHJhZ0VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBJbnB1dCgpIGV4cGFuZFRvTWluID0gZmFsc2U7XG4gIEBJbnB1dCgpIGd1dHRlclNpemUgPSAxMDtcbiAgQElucHV0KCkgZ3V0dGVyQWxpZ246IEd1dHRlckFsaWdubWVudCA9ICdjZW50ZXInO1xuICBASW5wdXQoKSBzbmFwT2Zmc2V0ID0gMzA7XG4gIEBJbnB1dCgpIGRyYWdJbnRlcnZhbCA9IDE7XG4gIEBJbnB1dCgpIGRpcmVjdGlvbjogU3BsaXREaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCc7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTcGxpdFBhbmVEaXJlY3RpdmUpIHNwbGl0UGFuZXM6IFF1ZXJ5TGlzdDxTcGxpdFBhbmVEaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkKFNwbGl0Vmlld0d1dHRlckRpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgZ3V0dGVyRGVmOiBTcGxpdFZpZXdHdXR0ZXJEaXJlY3RpdmU7XG5cbiAgcHJpdmF0ZSBzcGxpdDogU3BsaXQuSW5zdGFuY2U7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc3BsaXQtdmlldy1ob3Jpem9udGFsJylcbiAgZ2V0IGlzSG9yaXpvbnRhbCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCc7IH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNwbGl0LXZpZXctdmVydGljYWwnKVxuICBnZXQgaXNWZXJ0aWNhbCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZGlyZWN0aW9uID09PSAndmVydGljYWwnOyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmRpcmVjdGlvbiB8fFxuICAgICAgY2hhbmdlcy5ndXR0ZXJTaXplIHx8XG4gICAgICBjaGFuZ2VzLmd1dHRlckFsaWduIHx8XG4gICAgICBjaGFuZ2VzLnNuYXBPZmZzZXQgfHxcbiAgICAgIGNoYW5nZXMuZHJhZ0ludGVydmFsIHx8XG4gICAgICBjaGFuZ2VzLmV4cGFuZFRvTWluKSB7XG5cbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBzcGxpdFBhbmVDaGFuZ2VzID0gdGhpcy5zcGxpdFBhbmVzLmNoYW5nZXNcbiAgICAgIC5waXBlKHN0YXJ0V2l0aCh0aGlzLnNwbGl0UGFuZXMpKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuQ2hhbmdlcyA9IHNwbGl0UGFuZUNoYW5nZXNcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xuXG4gICAgY29uc3Qgc2l6ZUNoYW5nZXMgPSBzcGxpdFBhbmVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc3BsaXRQYW5lcy5tYXAocCA9PiBwLnNpemVDaGFuZ2VzKSksXG4gICAgICAgIG1lcmdlQWxsKCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3BsaXQ/LnNldFNpemVzKHRoaXMuZ2V0U2l6ZXMoKSkpO1xuXG4gICAgY29uc3QgZHJhZ0VuZEV2ZW50cyA9IHRoaXMuZHJhZ0VuZFxuICAgICAgLnBpcGUobWFwKGV2ZW50ID0+IGV2ZW50LnNpemVzKSlcbiAgICAgIC5zdWJzY3JpYmUoc2l6ZXMgPT4ge1xuICAgICAgICBjb25zdCBwYW5lcyA9IHRoaXMuc3BsaXRQYW5lcy50b0FycmF5KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFuZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBwYW5lc1tpXS5zcGxpdFJhdGlvID0gc2l6ZXNbaV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChjaGlsZHJlbkNoYW5nZXMpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc2l6ZUNoYW5nZXMpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoZHJhZ0VuZEV2ZW50cyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRlc3Ryb3lTcGxpdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveVNwbGl0KCk7XG5cbiAgICBpZiAoIXRoaXMuc3BsaXRQYW5lcyB8fCB0aGlzLnNwbGl0UGFuZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFuZXMgPSBuZXcgQXJyYXk8SFRNTEVsZW1lbnQ+KCk7XG4gICAgY29uc3QgbWluU2l6ZXMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gICAgdGhpcy5zcGxpdFBhbmVzLmZvckVhY2goZCA9PiB7XG4gICAgICBwYW5lcy5wdXNoKGQudmlld0NvbnRhaW5lclJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgbWluU2l6ZXMucHVzaChkLm1pblNpemUpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3BsaXRPcHRpb25zOiBTcGxpdC5PcHRpb25zID0ge1xuICAgICAgc2l6ZXM6IHRoaXMuZ2V0U2l6ZXMoKSxcbiAgICAgIG1pblNpemU6IG1pblNpemVzLFxuICAgICAgZXhwYW5kVG9NaW46IHRoaXMuZXhwYW5kVG9NaW4sXG4gICAgICBndXR0ZXJTaXplOiB0aGlzLmd1dHRlclNpemUsXG4gICAgICBndXR0ZXJBbGlnbjogdGhpcy5ndXR0ZXJBbGlnbixcbiAgICAgIHNuYXBPZmZzZXQ6IHRoaXMuc25hcE9mZnNldCxcbiAgICAgIGRyYWdJbnRlcnZhbDogdGhpcy5kcmFnSW50ZXJ2YWwsXG4gICAgICBkaXJlY3Rpb246IHRoaXMuZGlyZWN0aW9uLFxuICAgICAgZWxlbWVudFN0eWxlOiAoZGltZW5zaW9uLCBzaXplLCBndXR0ZXJTaXplKSA9PiAoe1xuICAgICAgICBmbGV4QmFzaXM6ICdjYWxjKCcgKyBzaXplICsgJyUgLSAnICsgZ3V0dGVyU2l6ZSArICdweCknXG4gICAgICB9KSxcbiAgICAgIGd1dHRlclN0eWxlOiAoZGltZW5zaW9uLCBndXR0ZXJTaXplKSA9PiAoe1xuICAgICAgICBmbGV4QmFzaXM6IGd1dHRlclNpemUgKyAncHgnXG4gICAgICB9KSxcbiAgICAgIG9uRHJhZzogKHNpemVzKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnaW5nLm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5kcmFnZ2luZy5lbWl0KHsgc291cmNlOiB0aGlzLCBzaXplcyB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uRHJhZ1N0YXJ0OiAoc2l6ZXMpID0+IHRoaXMuZHJhZ1N0YXJ0LmVtaXQoeyBzb3VyY2U6IHRoaXMsIHNpemVzIH0pLFxuICAgICAgb25EcmFnRW5kOiAoc2l6ZXMpID0+IHRoaXMuZHJhZ0VuZC5lbWl0KHsgc291cmNlOiB0aGlzLCBzaXplcyB9KVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5ndXR0ZXJEZWYpIHtcbiAgICAgIHNwbGl0T3B0aW9ucy5ndXR0ZXIgPSAoaW5kZXgsIGRpcmVjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLmd1dHRlckRlZi50ZW1wbGF0ZSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdmlldy5yb290Tm9kZXMuZmlsdGVyKGUgPT4gZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR3V0dGVyIHRlbXBsYXRlIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBlbGVtZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzWzBdO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnNwbGl0ID0gU3BsaXQocGFuZXMsIHNwbGl0T3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lTcGxpdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3BsaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcbiAgICB0aGlzLnNwbGl0LmRlc3Ryb3koZmFsc2UsICEhdGhpcy5ndXR0ZXJEZWYpO1xuICAgIHRoaXMuc3BsaXQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldFNpemVzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBwYW5lcyA9IG5ldyBBcnJheTxIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCByYXRpb3MgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgIGxldCB0b3RhbFNpemUgPSAwO1xuXG4gICAgdGhpcy5zcGxpdFBhbmVzLmZvckVhY2goZCA9PiB7XG4gICAgICBwYW5lcy5wdXNoKGQudmlld0NvbnRhaW5lclJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBzYW5pdGl6ZWRTaXplID0gZC5zcGxpdFJhdGlvID49IDAgPyBkLnNwbGl0UmF0aW8gOiAwO1xuICAgICAgcmF0aW9zLnB1c2goc2FuaXRpemVkU2l6ZSk7XG4gICAgICB0b3RhbFNpemUgKz0gc2FuaXRpemVkU2l6ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiByYXRpb3MubWFwKHNpemUgPT4gKHNpemUgLyB0b3RhbFNpemUpICogMTAwKTtcbiAgfVxufVxuIl19