UNPKG

ngx-infinite-scroller

Version:

Infinite bidirectional scroll directive for Angular 11

156 lines 22.9 kB
import { Directive, ElementRef, Input, Output, EventEmitter, Renderer2, Inject, PLATFORM_ID, } from '@angular/core'; import { isPlatformBrowser } from '@angular/common'; import { Subject, zip, fromEvent } from 'rxjs'; import { tap, map, pairwise, takeWhile, skipWhile, debounceTime } from 'rxjs/operators'; import { DirectiveStateService } from './directive-state.service'; import { InitialScrollPosition } from './enum/initial-scroll-position-type.enum'; import { DirectiveContext } from './directive-context'; import { ScrollingToTop } from './scrolling-strategy/scrolling-to-top'; import { ScrollingToBottom } from './scrolling-strategy/scrolling-to-bottom'; import { ScrollingToBoth } from './scrolling-strategy/scrolling-to-both'; import { ScrollHeightListener } from './scroll-height-listener/scroll-height-listener'; export class NgxInfiniteScrollerDirective extends DirectiveContext { constructor(platformId, el, renderer, state) { super(); this.platformId = platformId; this.el = el; this.renderer = renderer; this.state = state; this.strategy = 'scrollingToBottom'; this.initialScrollPosition = InitialScrollPosition.DEFAULT; this.scrollbarAnimationInterval = 100; this.scrollDebounceTimeAfterScrollHeightChanged = 50; this.scrollDebounceTimeAfterDOMMutationOnInit = 1000; this.scrollUpPercentilePositionTrigger = 2; this.scrollDownPercentilePositionTrigger = 98; this.onScrollUp = new EventEmitter(); this.onScrollDown = new EventEmitter(); this.scrollHeightChanged = new Subject(); this.domMutationEmitter = new Subject(); this.isBrowser = isPlatformBrowser(platformId); this.state.setup({ el: el, initMode: true, scrollStreamActive: true, previousScrollPositionpUpdated: false }); } get scrollPairChanged() { if (this.scrollChanged) { return this.scrollChanged.pipe(takeWhile(() => this.state.scrollStreamActive), map((e) => { return { scrollHeight: e.target.scrollHeight, scrollTop: e.target.scrollTop, clientHeight: e.target.clientHeight, }; }), pairwise(), debounceTime(this.scrollbarAnimationInterval)); } } get scrollDirectionChanged() { return this.scrollingStrategy.scrollDirectionChanged(this.scrollPairChanged); } get scrollRequestZoneChanged() { return this.scrollingStrategy.scrollRequestZoneChanged(this.scrollDirectionChanged).pipe(tap(() => { this.state.updatePreviousScrollTop(); this.state.updatePreviousScrollHeight(); this.state.previousScrollPositionpUpdated = false; this.scrollHeightListener.start(); })); } ngOnInit() { this.useStrategy(); this.useScrollHeightListener(); this.registerScrollEventHandler(); this.registerMutationObserver(); this.registerInitialScrollPostionHandler(); this.registerPreviousScrollPositionHandler(); } ngAfterViewInit() { this.registerScrollSpy(); } ngOnDestroy() { this.unregisterMutationObserver(); } scrollTo(position) { this.state.scrollStreamActive = false; this.renderer.setProperty(this.el.nativeElement, 'scrollTop', position); this.state.scrollStreamActive = true; } onScrollbarHeightChanged() { this.scrollHeightChanged.next(); } registerScrollEventHandler() { this.scrollChanged = fromEvent(this.el.nativeElement, 'scroll'); } registerMutationObserver() { if (this.isBrowser) { this.domMutationObserver = new MutationObserver((mutations) => { this.domMutationEmitter.next(mutations); }); const config = { attributes: true, childList: true, characterData: true }; this.domMutationObserver.observe(this.el.nativeElement, config); } } registerInitialScrollPostionHandler() { this.domMutationEmitter.pipe(takeWhile(() => this.state.initMode), debounceTime(this.scrollDebounceTimeAfterDOMMutationOnInit)).subscribe(() => { this.scrollingStrategy.setInitialScrollPosition(); this.state.initMode = false; }); } registerPreviousScrollPositionHandler() { zip(this.scrollRequestZoneChanged, this.scrollHeightChanged).pipe(skipWhile(() => this.state.initMode), debounceTime(this.scrollDebounceTimeAfterScrollHeightChanged)).subscribe(() => { this.scrollingStrategy.setPreviousScrollPosition(); this.state.previousScrollPositionpUpdated = true; }); } registerScrollSpy() { this.scrollRequestZoneChanged.subscribe(() => { this.scrollingStrategy.askForUpdate(); }); } unregisterMutationObserver() { if (this.domMutationObserver) { this.domMutationObserver.disconnect(); } } useStrategy() { switch (this.strategy) { case 'scrollingToBoth': this.scrollingStrategy = new ScrollingToBoth(this, this.state); break; case 'scrollingToTop': this.scrollingStrategy = new ScrollingToTop(this, this.state); break; case 'scrollingToBottom': default: this.scrollingStrategy = new ScrollingToBottom(this, this.state); break; } } useScrollHeightListener() { this.scrollHeightListener = new ScrollHeightListener(this, this.state); } } NgxInfiniteScrollerDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxInfiniteScroller]' },] } ]; NgxInfiniteScrollerDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: ElementRef }, { type: Renderer2 }, { type: DirectiveStateService } ]; NgxInfiniteScrollerDirective.propDecorators = { strategy: [{ type: Input }], initialScrollPosition: [{ type: Input }], scrollbarAnimationInterval: [{ type: Input }], scrollDebounceTimeAfterScrollHeightChanged: [{ type: Input }], scrollDebounceTimeAfterDOMMutationOnInit: [{ type: Input }], scrollUpPercentilePositionTrigger: [{ type: Input }], scrollDownPercentilePositionTrigger: [{ type: Input }], onScrollUp: [{ type: Output }], onScrollDown: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWluZmluaXRlLXNjcm9sbGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8iLCJzb3VyY2VzIjpbInNyYy9hcHAvbmd4LWluZmluaXRlLXNjcm9sbGVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUlULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRCxPQUFPLEVBQWMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUt2RixNQUFNLE9BQU8sNEJBQ1gsU0FBUSxnQkFBZ0I7SUEwRXhCLFlBRVUsVUFBZSxFQUNmLEVBQWMsRUFDZCxRQUFtQixFQUNuQixLQUE0QjtRQUVwQyxLQUFLLEVBQUUsQ0FBQztRQUxBLGVBQVUsR0FBVixV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LENBQUM7Z0JBQy9ELE1BQU07WUFDUixLQUFLLGdCQUFnQjtnQkFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlELE1BQU07WUFDUixLQUFLLG1CQUFtQixDQUFDO1lBQUM7Z0JBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pFLE1BQU07U0FDVDtJQUNILENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6RSxDQUFDOzs7WUE5TEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx1QkFBdUI7YUFDbEM7Ozs0Q0E2RUksTUFBTSxTQUFDLFdBQVc7WUExR3JCLFVBQVU7WUFJVixTQUFTO1lBV0YscUJBQXFCOzs7dUJBbUIzQixLQUFLO29DQUdMLEtBQUs7eUNBR0wsS0FBSzt5REFHTCxLQUFLO3VEQUdMLEtBQUs7Z0RBR0wsS0FBSztrREFHTCxLQUFLO3lCQUdMLE1BQU07MkJBR04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIEluamVjdCxcclxuICBQTEFURk9STV9JRCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIHppcCwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyB0YXAsIG1hcCwgcGFpcndpc2UsIHRha2VXaGlsZSwgc2tpcFdoaWxlLCBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBEaXJlY3RpdmVTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2RpcmVjdGl2ZS1zdGF0ZS5zZXJ2aWNlJztcclxuXHJcbmltcG9ydCB7IFNjcm9sbFBvc2l0aW9uIH0gZnJvbSAnLi9tb2RlbC9zY3JvbGwtcG9zaXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBJbml0aWFsU2Nyb2xsUG9zaXRpb24gfSBmcm9tICcuL2VudW0vaW5pdGlhbC1zY3JvbGwtcG9zaXRpb24tdHlwZS5lbnVtJztcclxuXHJcbmltcG9ydCB7IERpcmVjdGl2ZUNvbnRleHQgfSBmcm9tICcuL2RpcmVjdGl2ZS1jb250ZXh0JztcclxuaW1wb3J0IHsgU2Nyb2xsaW5nVG9Ub3AgfSBmcm9tICcuL3Njcm9sbGluZy1zdHJhdGVneS9zY3JvbGxpbmctdG8tdG9wJztcclxuaW1wb3J0IHsgU2Nyb2xsaW5nVG9Cb3R0b20gfSBmcm9tICcuL3Njcm9sbGluZy1zdHJhdGVneS9zY3JvbGxpbmctdG8tYm90dG9tJztcclxuaW1wb3J0IHsgU2Nyb2xsaW5nVG9Cb3RoIH0gZnJvbSAnLi9zY3JvbGxpbmctc3RyYXRlZ3kvc2Nyb2xsaW5nLXRvLWJvdGgnO1xyXG5cclxuaW1wb3J0IHsgU2Nyb2xsSGVpZ2h0TGlzdGVuZXIgfSBmcm9tICcuL3Njcm9sbC1oZWlnaHQtbGlzdGVuZXIvc2Nyb2xsLWhlaWdodC1saXN0ZW5lcic7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuZ3hJbmZpbml0ZVNjcm9sbGVyXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neEluZmluaXRlU2Nyb2xsZXJEaXJlY3RpdmVcclxuICBleHRlbmRzIERpcmVjdGl2ZUNvbnRleHRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc3RyYXRlZ3k6IHN0cmluZyA9ICdzY3JvbGxpbmdUb0JvdHRvbSc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGluaXRpYWxTY3JvbGxQb3NpdGlvbjogSW5pdGlhbFNjcm9sbFBvc2l0aW9uIHwgbnVtYmVyID0gSW5pdGlhbFNjcm9sbFBvc2l0aW9uLkRFRkFVTFQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNjcm9sbGJhckFuaW1hdGlvbkludGVydmFsID0gMTAwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzY3JvbGxEZWJvdW5jZVRpbWVBZnRlclNjcm9sbEhlaWdodENoYW5nZWQgPSA1MDtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2Nyb2xsRGVib3VuY2VUaW1lQWZ0ZXJET01NdXRhdGlvbk9uSW5pdCA9IDEwMDA7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNjcm9sbFVwUGVyY2VudGlsZVBvc2l0aW9uVHJpZ2dlciA9IDI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNjcm9sbERvd25QZXJjZW50aWxlUG9zaXRpb25UcmlnZ2VyID0gOTg7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvblNjcm9sbFVwOiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvblNjcm9sbERvd246IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGxIZWlnaHRMaXN0ZW5lcjogU2Nyb2xsSGVpZ2h0TGlzdGVuZXI7XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsSGVpZ2h0Q2hhbmdlZDogU3ViamVjdDxudWxsPiA9IG5ldyBTdWJqZWN0PG51bGw+KCk7XHJcblxyXG4gIHByaXZhdGUgZG9tTXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcclxuXHJcbiAgcHJpdmF0ZSBkb21NdXRhdGlvbkVtaXR0ZXI6IFN1YmplY3Q8TXV0YXRpb25SZWNvcmRbXT4gPSBuZXcgU3ViamVjdDxNdXRhdGlvblJlY29yZFtdPigpO1xyXG5cclxuICBwcml2YXRlIHNjcm9sbENoYW5nZWQ6IE9ic2VydmFibGU8RXZlbnQ+O1xyXG5cclxuICBwcml2YXRlIGdldCBzY3JvbGxQYWlyQ2hhbmdlZCgpOiBPYnNlcnZhYmxlPFNjcm9sbFBvc2l0aW9uW10+IHtcclxuICAgIGlmICh0aGlzLnNjcm9sbENoYW5nZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsQ2hhbmdlZC5waXBlKFxyXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLnN0YXRlLnNjcm9sbFN0cmVhbUFjdGl2ZSksXHJcbiAgICAgICAgbWFwKChlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiA8U2Nyb2xsUG9zaXRpb24+e1xyXG4gICAgICAgICAgICBzY3JvbGxIZWlnaHQ6IGUudGFyZ2V0LnNjcm9sbEhlaWdodCxcclxuICAgICAgICAgICAgc2Nyb2xsVG9wOiBlLnRhcmdldC5zY3JvbGxUb3AsXHJcbiAgICAgICAgICAgIGNsaWVudEhlaWdodDogZS50YXJnZXQuY2xpZW50SGVpZ2h0LFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBwYWlyd2lzZSgpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLnNjcm9sbGJhckFuaW1hdGlvbkludGVydmFsKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgc2Nyb2xsRGlyZWN0aW9uQ2hhbmdlZCgpOiBPYnNlcnZhYmxlPFNjcm9sbFBvc2l0aW9uW10+IHtcclxuICAgIHJldHVybiB0aGlzLnNjcm9sbGluZ1N0cmF0ZWd5LnNjcm9sbERpcmVjdGlvbkNoYW5nZWQodGhpcy5zY3JvbGxQYWlyQ2hhbmdlZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBzY3JvbGxSZXF1ZXN0Wm9uZUNoYW5nZWQoKTogT2JzZXJ2YWJsZTxTY3JvbGxQb3NpdGlvbltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zY3JvbGxpbmdTdHJhdGVneS5zY3JvbGxSZXF1ZXN0Wm9uZUNoYW5nZWQodGhpcy5zY3JvbGxEaXJlY3Rpb25DaGFuZ2VkKS5waXBlKFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlUHJldmlvdXNTY3JvbGxUb3AoKTtcclxuICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZVByZXZpb3VzU2Nyb2xsSGVpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZS5wcmV2aW91c1Njcm9sbFBvc2l0aW9ucFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNjcm9sbEhlaWdodExpc3RlbmVyLnN0YXJ0KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0Jyb3dzZXI6IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChQTEFURk9STV9JRClcclxuICAgIHByaXZhdGUgcGxhdGZvcm1JZDogYW55LFxyXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgc3RhdGU6IERpcmVjdGl2ZVN0YXRlU2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCk7XHJcbiAgICB0aGlzLnN0YXRlLnNldHVwKHtcclxuICAgICAgZWw6IGVsLFxyXG4gICAgICBpbml0TW9kZTogdHJ1ZSxcclxuICAgICAgc2Nyb2xsU3RyZWFtQWN0aXZlOiB0cnVlLFxyXG4gICAgICBwcmV2aW91c1Njcm9sbFBvc2l0aW9ucFVwZGF0ZWQ6IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMudXNlU3RyYXRlZ3koKTtcclxuICAgIHRoaXMudXNlU2Nyb2xsSGVpZ2h0TGlzdGVuZXIoKTtcclxuXHJcbiAgICB0aGlzLnJlZ2lzdGVyU2Nyb2xsRXZlbnRIYW5kbGVyKCk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcigpO1xyXG4gICAgdGhpcy5yZWdpc3RlckluaXRpYWxTY3JvbGxQb3N0aW9uSGFuZGxlcigpO1xyXG4gICAgdGhpcy5yZWdpc3RlclByZXZpb3VzU2Nyb2xsUG9zaXRpb25IYW5kbGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWdpc3RlclNjcm9sbFNweSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy51bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvKHBvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGUuc2Nyb2xsU3RyZWFtQWN0aXZlID0gZmFsc2U7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3Njcm9sbFRvcCcsIHBvc2l0aW9uKTtcclxuICAgIHRoaXMuc3RhdGUuc2Nyb2xsU3RyZWFtQWN0aXZlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNjcm9sbGJhckhlaWdodENoYW5nZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNjcm9sbEhlaWdodENoYW5nZWQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWdpc3RlclNjcm9sbEV2ZW50SGFuZGxlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2Nyb2xsQ2hhbmdlZCA9IGZyb21FdmVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVnaXN0ZXJNdXRhdGlvbk9ic2VydmVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7XHJcbiAgICAgIHRoaXMuZG9tTXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKFxyXG4gICAgICAgIChtdXRhdGlvbnM6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcclxuICAgICAgICAgIHRoaXMuZG9tTXV0YXRpb25FbWl0dGVyLm5leHQobXV0YXRpb25zKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlIH07XHJcbiAgICAgIHRoaXMuZG9tTXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgY29uZmlnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVnaXN0ZXJJbml0aWFsU2Nyb2xsUG9zdGlvbkhhbmRsZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRvbU11dGF0aW9uRW1pdHRlci5waXBlKFxyXG4gICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5zdGF0ZS5pbml0TW9kZSksXHJcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLnNjcm9sbERlYm91bmNlVGltZUFmdGVyRE9NTXV0YXRpb25PbkluaXQpXHJcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsaW5nU3RyYXRlZ3kuc2V0SW5pdGlhbFNjcm9sbFBvc2l0aW9uKCk7XHJcbiAgICAgIHRoaXMuc3RhdGUuaW5pdE1vZGUgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWdpc3RlclByZXZpb3VzU2Nyb2xsUG9zaXRpb25IYW5kbGVyKCk6IHZvaWQge1xyXG4gICAgemlwKFxyXG4gICAgICB0aGlzLnNjcm9sbFJlcXVlc3Rab25lQ2hhbmdlZCxcclxuICAgICAgdGhpcy5zY3JvbGxIZWlnaHRDaGFuZ2VkXHJcbiAgICApLnBpcGUoXHJcbiAgICAgIHNraXBXaGlsZSgoKSA9PiB0aGlzLnN0YXRlLmluaXRNb2RlKSxcclxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuc2Nyb2xsRGVib3VuY2VUaW1lQWZ0ZXJTY3JvbGxIZWlnaHRDaGFuZ2VkKVxyXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNjcm9sbGluZ1N0cmF0ZWd5LnNldFByZXZpb3VzU2Nyb2xsUG9zaXRpb24oKTtcclxuICAgICAgdGhpcy5zdGF0ZS5wcmV2aW91c1Njcm9sbFBvc2l0aW9ucFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZ2lzdGVyU2Nyb2xsU3B5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zY3JvbGxSZXF1ZXN0Wm9uZUNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5zY3JvbGxpbmdTdHJhdGVneS5hc2tGb3JVcGRhdGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyTXV0YXRpb25PYnNlcnZlcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRvbU11dGF0aW9uT2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5kb21NdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXNlU3RyYXRlZ3koKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuc3RyYXRlZ3kpIHtcclxuICAgICAgY2FzZSAnc2Nyb2xsaW5nVG9Cb3RoJzpcclxuICAgICAgICB0aGlzLnNjcm9sbGluZ1N0cmF0ZWd5ID0gbmV3IFNjcm9sbGluZ1RvQm90aCh0aGlzLCB0aGlzLnN0YXRlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnc2Nyb2xsaW5nVG9Ub3AnOlxyXG4gICAgICAgIHRoaXMuc2Nyb2xsaW5nU3RyYXRlZ3kgPSBuZXcgU2Nyb2xsaW5nVG9Ub3AodGhpcywgdGhpcy5zdGF0ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3Njcm9sbGluZ1RvQm90dG9tJzogZGVmYXVsdDpcclxuICAgICAgICB0aGlzLnNjcm9sbGluZ1N0cmF0ZWd5ID0gbmV3IFNjcm9sbGluZ1RvQm90dG9tKHRoaXMsIHRoaXMuc3RhdGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1c2VTY3JvbGxIZWlnaHRMaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2Nyb2xsSGVpZ2h0TGlzdGVuZXIgPSBuZXcgU2Nyb2xsSGVpZ2h0TGlzdGVuZXIodGhpcywgdGhpcy5zdGF0ZSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==