UNPKG

material-dynamic-table

Version:

Dynamic table component for angular built on top of angular material table. It offers sorting, pagination, filtering per column and the ability to specify content types and components used for displaying them.

85 lines 13.6 kB
/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { Directive } from '@angular/core'; import { fromEvent, merge, Subject } from 'rxjs'; import { filter, map, mapTo, pairwise, startWith, take, takeUntil } from 'rxjs/operators'; import { closest } from './closest'; import { HEADER_CELL_SELECTOR, RESIZE_OVERLAY_SELECTOR } from './selectors'; import * as i0 from "@angular/core"; const HOVER_OR_ACTIVE_CLASS = 'cdk-column-resize-hover-or-active'; const WITH_RESIZED_COLUMN_CLASS = 'cdk-column-resize-with-resized-column'; let nextId = 0; /** * Base class for ColumnResize directives which attach to mat-table elements to * provide common events and services for column resizing. */ export class ColumnResize { constructor() { this.destroyed = new Subject(); /** Unique ID for this table instance. */ this.selectorId = `${++nextId}`; } ngAfterViewInit() { this.elementRef.nativeElement.classList.add(this.getUniqueCssClass()); this._listenForRowHoverEvents(); this._listenForResizeActivity(); this._listenForHoverActivity(); } ngOnDestroy() { this.destroyed.next(); this.destroyed.complete(); } /** Gets the unique CSS class name for this table instance. */ getUniqueCssClass() { return `cdk-column-resize-${this.selectorId}`; } /** Called when a column in the table is resized. Applies a css class to the table element. */ setResized() { this.elementRef.nativeElement.classList.add(WITH_RESIZED_COLUMN_CLASS); } getTableHeight() { return this.elementRef.nativeElement.offsetHeight; } _listenForRowHoverEvents() { this.ngZone.runOutsideAngular(() => { const element = this.elementRef.nativeElement; fromEvent(element, 'mouseover') .pipe(map(event => closest(event.target, HEADER_CELL_SELECTOR)), takeUntil(this.destroyed)) .subscribe(this.eventDispatcher.headerCellHovered); fromEvent(element, 'mouseleave') .pipe(filter(event => !!event.relatedTarget && !event.relatedTarget.matches(RESIZE_OVERLAY_SELECTOR)), mapTo(null), takeUntil(this.destroyed)) .subscribe(this.eventDispatcher.headerCellHovered); }); } _listenForResizeActivity() { merge(this.eventDispatcher.overlayHandleActiveForCell.pipe(mapTo(undefined)), this.notifier.triggerResize.pipe(mapTo(undefined)), this.notifier.resizeCompleted.pipe(mapTo(undefined))) .pipe(take(1), takeUntil(this.destroyed)) .subscribe(() => { this.setResized(); }); } _listenForHoverActivity() { this.eventDispatcher.headerRowHoveredOrActiveDistinct .pipe(startWith(null), pairwise(), takeUntil(this.destroyed)) .subscribe(([previousRow, hoveredRow]) => { if (hoveredRow) { hoveredRow.classList.add(HOVER_OR_ACTIVE_CLASS); } if (previousRow) { previousRow.classList.remove(HOVER_OR_ACTIVE_CLASS); } }); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ColumnResize, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: ColumnResize, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ColumnResize, decorators: [{ type: Directive }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLXJlc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsLWR5bmFtaWMtdGFibGUvc3JjL2xpYi9jb2x1bW4tcmVzaXplL2NvbHVtbi1yZXNpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFpQixTQUFTLEVBQWlDLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUdwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBRzVFLE1BQU0scUJBQXFCLEdBQUcsbUNBQW1DLENBQUM7QUFDbEUsTUFBTSx5QkFBeUIsR0FBRyx1Q0FBdUMsQ0FBQztBQUUxRSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFFZjs7O0dBR0c7QUFFSCxNQUFNLE9BQWdCLFlBQVk7SUFEbEM7UUFFcUIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFZbkQseUNBQXlDO1FBQ3RCLGVBQVUsR0FBRyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FnRi9DO0lBM0VDLGVBQWU7UUFDYixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELDhEQUE4RDtJQUM5RCxpQkFBaUI7UUFDZixPQUFPLHFCQUFxQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELDhGQUE4RjtJQUM5RixVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWMsQ0FBQyxZQUFZLENBQUM7SUFDckQsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWMsQ0FBQztZQUUvQyxTQUFTLENBQWEsT0FBTyxFQUFFLFdBQVcsQ0FBQztpQkFDeEMsSUFBSSxDQUNILEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUMsRUFDekQsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7aUJBQ0EsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNyRCxTQUFTLENBQWEsT0FBTyxFQUFFLFlBQVksQ0FBQztpQkFDekMsSUFBSSxDQUNILE1BQU0sQ0FDSixLQUFLLENBQUMsRUFBRSxDQUNOLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYTtnQkFDckIsQ0FBRSxLQUFLLENBQUMsYUFBeUIsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FDckUsRUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQ1gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7aUJBQ0EsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsS0FBSyxDQUNILElBQUksQ0FBQyxlQUFlLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUN0RSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FDckQ7YUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDeEMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQ0FBZ0M7YUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzVELFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7a0lBN0ZtQixZQUFZO3NIQUFaLFlBQVk7OzRGQUFaLFlBQVk7a0JBRGpDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICpcclxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcclxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgTmdab25lLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgbWFwVG8sIHBhaXJ3aXNlLCBzdGFydFdpdGgsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IGNsb3Nlc3QgfSBmcm9tICcuL2Nsb3Nlc3QnO1xyXG5cclxuaW1wb3J0IHsgQ29sdW1uUmVzaXplTm90aWZpZXIsIENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlIH0gZnJvbSAnLi9jb2x1bW4tcmVzaXplLW5vdGlmaWVyJztcclxuaW1wb3J0IHsgSEVBREVSX0NFTExfU0VMRUNUT1IsIFJFU0laRV9PVkVSTEFZX1NFTEVDVE9SIH0gZnJvbSAnLi9zZWxlY3RvcnMnO1xyXG5pbXBvcnQgeyBIZWFkZXJSb3dFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuL2V2ZW50LWRpc3BhdGNoZXInO1xyXG5cclxuY29uc3QgSE9WRVJfT1JfQUNUSVZFX0NMQVNTID0gJ2Nkay1jb2x1bW4tcmVzaXplLWhvdmVyLW9yLWFjdGl2ZSc7XHJcbmNvbnN0IFdJVEhfUkVTSVpFRF9DT0xVTU5fQ0xBU1MgPSAnY2RrLWNvbHVtbi1yZXNpemUtd2l0aC1yZXNpemVkLWNvbHVtbic7XHJcblxyXG5sZXQgbmV4dElkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBDb2x1bW5SZXNpemUgZGlyZWN0aXZlcyB3aGljaCBhdHRhY2ggdG8gbWF0LXRhYmxlIGVsZW1lbnRzIHRvXHJcbiAqIHByb3ZpZGUgY29tbW9uIGV2ZW50cyBhbmQgc2VydmljZXMgZm9yIGNvbHVtbiByZXNpemluZy5cclxuICovXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sdW1uUmVzaXplIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgLyogUHVibGljbHkgYWNjZXNzaWJsZSBpbnRlcmZhY2UgZm9yIHRyaWdnZXJpbmcgYW5kIGJlaW5nIG5vdGlmaWVkIG9mIHJlc2l6ZXMuICovXHJcbiAgYWJzdHJhY3QgcmVhZG9ubHkgY29sdW1uUmVzaXplTm90aWZpZXI6IENvbHVtblJlc2l6ZU5vdGlmaWVyO1xyXG5cclxuICAvKiBFbGVtZW50UmVmIHRoYXQgdGhpcyBkaXJlY3RpdmUgaXMgYXR0YWNoZWQgdG8uIEV4cG9zZWQgRm9yIHVzZSBieSBjb2x1bW4tbGV2ZWwgZGlyZWN0aXZlcyAqL1xyXG4gIGFic3RyYWN0IHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgZXZlbnREaXNwYXRjaGVyOiBIZWFkZXJSb3dFdmVudERpc3BhdGNoZXI7XHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IG5nWm9uZTogTmdab25lO1xyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBub3RpZmllcjogQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2U7XHJcblxyXG4gIC8qKiBVbmlxdWUgSUQgZm9yIHRoaXMgdGFibGUgaW5zdGFuY2UuICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdG9ySWQgPSBgJHsrK25leHRJZH1gO1xyXG5cclxuICAvKiogVGhlIGlkIGF0dHJpYnV0ZSBvZiB0aGUgdGFibGUsIGlmIHNwZWNpZmllZC4gKi9cclxuICBpZD86IHN0cmluZztcclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQhLmNsYXNzTGlzdC5hZGQodGhpcy5nZXRVbmlxdWVDc3NDbGFzcygpKTtcclxuXHJcbiAgICB0aGlzLl9saXN0ZW5Gb3JSb3dIb3ZlckV2ZW50cygpO1xyXG4gICAgdGhpcy5fbGlzdGVuRm9yUmVzaXplQWN0aXZpdHkoKTtcclxuICAgIHRoaXMuX2xpc3RlbkZvckhvdmVyQWN0aXZpdHkoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95ZWQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBHZXRzIHRoZSB1bmlxdWUgQ1NTIGNsYXNzIG5hbWUgZm9yIHRoaXMgdGFibGUgaW5zdGFuY2UuICovXHJcbiAgZ2V0VW5pcXVlQ3NzQ2xhc3MoKSB7XHJcbiAgICByZXR1cm4gYGNkay1jb2x1bW4tcmVzaXplLSR7dGhpcy5zZWxlY3RvcklkfWA7XHJcbiAgfVxyXG5cclxuICAvKiogQ2FsbGVkIHdoZW4gYSBjb2x1bW4gaW4gdGhlIHRhYmxlIGlzIHJlc2l6ZWQuIEFwcGxpZXMgYSBjc3MgY2xhc3MgdG8gdGhlIHRhYmxlIGVsZW1lbnQuICovXHJcbiAgc2V0UmVzaXplZCgpIHtcclxuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IS5jbGFzc0xpc3QuYWRkKFdJVEhfUkVTSVpFRF9DT0xVTU5fQ0xBU1MpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGFibGVIZWlnaHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQhLm9mZnNldEhlaWdodDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xpc3RlbkZvclJvd0hvdmVyRXZlbnRzKCkge1xyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQhO1xyXG5cclxuICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGVsZW1lbnQsICdtb3VzZW92ZXInKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgbWFwKGV2ZW50ID0+IGNsb3Nlc3QoZXZlbnQudGFyZ2V0LCBIRUFERVJfQ0VMTF9TRUxFQ1RPUikpLFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSxcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLmV2ZW50RGlzcGF0Y2hlci5oZWFkZXJDZWxsSG92ZXJlZCk7XHJcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50PihlbGVtZW50LCAnbW91c2VsZWF2ZScpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgICAgISFldmVudC5yZWxhdGVkVGFyZ2V0ICYmXHJcbiAgICAgICAgICAgICAgIShldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEVsZW1lbnQpLm1hdGNoZXMoUkVTSVpFX09WRVJMQVlfU0VMRUNUT1IpLFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIG1hcFRvKG51bGwpLFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSxcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLmV2ZW50RGlzcGF0Y2hlci5oZWFkZXJDZWxsSG92ZXJlZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xpc3RlbkZvclJlc2l6ZUFjdGl2aXR5KCkge1xyXG4gICAgbWVyZ2UoXHJcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLm92ZXJsYXlIYW5kbGVBY3RpdmVGb3JDZWxsLnBpcGUobWFwVG8odW5kZWZpbmVkKSksXHJcbiAgICAgIHRoaXMubm90aWZpZXIudHJpZ2dlclJlc2l6ZS5waXBlKG1hcFRvKHVuZGVmaW5lZCkpLFxyXG4gICAgICB0aGlzLm5vdGlmaWVyLnJlc2l6ZUNvbXBsZXRlZC5waXBlKG1hcFRvKHVuZGVmaW5lZCkpLFxyXG4gICAgKVxyXG4gICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLnNldFJlc2l6ZWQoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9saXN0ZW5Gb3JIb3ZlckFjdGl2aXR5KCkge1xyXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuaGVhZGVyUm93SG92ZXJlZE9yQWN0aXZlRGlzdGluY3RcclxuICAgICAgLnBpcGUoc3RhcnRXaXRoKG51bGwpLCBwYWlyd2lzZSgpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChbcHJldmlvdXNSb3csIGhvdmVyZWRSb3ddKSA9PiB7XHJcbiAgICAgICAgaWYgKGhvdmVyZWRSb3cpIHtcclxuICAgICAgICAgIGhvdmVyZWRSb3cuY2xhc3NMaXN0LmFkZChIT1ZFUl9PUl9BQ1RJVkVfQ0xBU1MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJldmlvdXNSb3cpIHtcclxuICAgICAgICAgIHByZXZpb3VzUm93LmNsYXNzTGlzdC5yZW1vdmUoSE9WRVJfT1JfQUNUSVZFX0NMQVNTKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=