UNPKG

rt-tab-carousel

Version:
157 lines 24.9 kB
import { Directive, Input, } from '@angular/core'; import { combineLatest, fromEvent, Observable, Subscription } from 'rxjs'; import { debounceTime, filter, first, startWith } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "../services/rt-carousel.service"; class RtCarouselContainerDirective { el; renderer; service; cd; scrollStep = 1; uuidCarousel; activeClass; antiBounce = 5; subscription = new Subscription(); firstDebounce = 1500; constructor(el, renderer, service, cd) { this.el = el; this.renderer = renderer; this.service = service; this.cd = cd; } _selectedTab; set selectedTab(value) { this._selectedTab = value; this.service.amountTabs(this.uuidCarousel).pipe(debounceTime(this.firstDebounce), first()).subscribe({ next: () => { this.firstDebounce = 0; this.service.selectTab(this.uuidCarousel, value); }, }); } ngOnInit() { this.renderer.setStyle(this.el.nativeElement, 'display', 'flex'); this.renderer.setStyle(this.el.nativeElement, 'overflow', 'auto'); this.renderer.setStyle(this.el.nativeElement, 'z-index', '10'); this.renderer.setStyle(this.el.nativeElement, 'padding', '0 2px'); this.renderer.setStyle(this.el.nativeElement, 'align-items', 'center'); this.renderer.setStyle(this.el.nativeElement, 'gap', '6px'); this.renderer.setStyle(this.el.nativeElement, 'scrollbar-width', 'none'); this.renderer.addClass(this.el.nativeElement, 'rt-tab-carousel-container'); this.subscription.add(this.service.amountTabs(this.uuidCarousel) .pipe(debounceTime(10)) .subscribe({ next: () => this.cd.detectChanges(), })); } ngAfterViewInit() { if (this.activeClass) { this.service.setActiveClassTab(this.uuidCarousel, this.activeClass); } this.service.setScrollStep(this.uuidCarousel, this.scrollStep); const style = this.renderer.createElement('style'); this.renderer.appendChild(this.el.nativeElement, style); style.innerHTML = `::-webkit-scrollbar { width: 0; height: 0 }`; this.service.amountTabs(this.uuidCarousel).pipe(debounceTime(1000), first()).subscribe({ next: () => { this.initIndexes(); }, }); const resize$ = fromEvent(window, 'resize').pipe(startWith(null)); const scroll$ = fromEvent(this.el.nativeElement, 'scroll').pipe(startWith(null)); const mutationObserver$ = this.createMutationObserverObservable(this.el.nativeElement).pipe(startWith(null)); this.subscription.add(combineLatest([resize$, scroll$, mutationObserver$]).subscribe({ next: () => { const currentItems = document.querySelectorAll(`.rt-carousel-tab-${this.uuidCarousel}`); const scrollLeft = this.el.nativeElement.scrollLeft; for (let i = 0; i < currentItems.length; i++) { const child = currentItems[i]; if (child.offsetLeft - scrollLeft - this.el.nativeElement.offsetLeft + this.antiBounce >= 0) { this.service.setLastVisibleIndex(this.uuidCarousel, i); break; } } for (let i = currentItems.length - 1; i >= 0; i--) { const child = currentItems[i]; if (this.el.nativeElement.offsetLeft + this.el.nativeElement.offsetWidth >= child.offsetLeft + child.offsetWidth - this.el.nativeElement.scrollLeft - this.antiBounce) { this.service.setLastVisibleIndexEnd(this.uuidCarousel, i); break; } } }, })); this.cd.detectChanges(); } initIndexes() { this.service .tabs(this.uuidCarousel) .pipe(filter(items => items && !!items.length), first()) .subscribe({ next: tabs => { const currentItems = document.querySelectorAll(`.rt-carousel-tab-${this.uuidCarousel}`); const scrollLeft = this.el.nativeElement.scrollLeft; const firstTab = tabs[0].nativeElement; const offsetLeft = firstTab.offsetLeft; if (offsetLeft >= scrollLeft) { this.service.setLastVisibleIndex(this.uuidCarousel, 0); } for (let i = currentItems.length - 1; i >= 0; i--) { const child = currentItems[i]; if (this.el.nativeElement.offsetLeft + this.el.nativeElement.offsetWidth >= child.offsetLeft + child.offsetWidth - this.el.nativeElement.scrollLeft - this.antiBounce) { this.service.setLastVisibleIndexEnd(this.uuidCarousel, i); break; } } }, }); } ngOnDestroy() { const tabs = document.querySelectorAll(`.rt-carousel-tab-${this.uuidCarousel}`); tabs.forEach(tab => { tab.removeEventListener('scroll', () => { }); tab.removeEventListener('click', () => { }); }); this.service.destroyCarousel(this.uuidCarousel); this.subscription.unsubscribe(); } createMutationObserverObservable(target) { return new Observable(observer => { const observerInstance = new MutationObserver(mutationsList => { observer.next(mutationsList); }); observerInstance.observe(target, { childList: true, subtree: true, }); return () => { observerInstance.disconnect(); }; }); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RtCarouselContainerDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.RtCarouselService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.2", type: RtCarouselContainerDirective, selector: "[rtCarouselContainer]", inputs: { scrollStep: "scrollStep", uuidCarousel: "uuidCarousel", activeClass: "activeClass", antiBounce: "antiBounce", selectedTab: "selectedTab" }, ngImport: i0 }); } export { RtCarouselContainerDirective }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RtCarouselContainerDirective, decorators: [{ type: Directive, args: [{ selector: '[rtCarouselContainer]', }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.RtCarouselService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { scrollStep: [{ type: Input }], uuidCarousel: [{ type: Input, args: [{ required: true }] }], activeClass: [{ type: Input }], antiBounce: [{ type: Input }], selectedTab: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnQtY2Fyb3VzZWwtY29udGFpbmVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3J0LXRhYi1jYXJvdXNlbC9zcmMvbGliL2RpcmVjdGl2ZXMvcnQtY2Fyb3VzZWwtY29udGFpbmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUVULEtBQUssR0FJUixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBR3RFLE1BR2EsNEJBQTRCO0lBU2pCO0lBQXdCO0lBQTZCO0lBQW9DO0lBUnBHLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDQyxZQUFZLENBQVU7SUFDdEMsV0FBVyxDQUFVO0lBQ3JCLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFUCxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMzQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBRTdCLFlBQW9CLEVBQWMsRUFBVSxRQUFtQixFQUFVLE9BQTBCLEVBQVUsRUFBcUI7UUFBOUcsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQUFVLE9BQUUsR0FBRixFQUFFLENBQW1CO0lBQ2xJLENBQUM7SUFFTyxZQUFZLENBQVU7SUFFOUIsSUFBYSxXQUFXLENBQUMsS0FBYTtRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUUxQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFlB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RyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxNQUFtQjtRQUN4RCxPQUFPLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDMUQsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztZQUNILGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQzdCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLE9BQU8sRUFBRSxJQUFJO2FBQ2hCLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxFQUFFO2dCQUNSLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt1R0E1SlEsNEJBQTRCOzJGQUE1Qiw0QkFBNEI7O1NBQTVCLDRCQUE0QjsyRkFBNUIsNEJBQTRCO2tCQUh4QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSx1QkFBdUI7aUJBQ3BDO3lMQUVZLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ21CLFlBQVk7c0JBQXBDLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO2dCQUNkLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFVTyxXQUFXO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgZmlyc3QsIHN0YXJ0V2l0aH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtSdENhcm91c2VsU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvcnQtY2Fyb3VzZWwuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3J0Q2Fyb3VzZWxDb250YWluZXJdJyxcbn0pXG5leHBvcnQgY2xhc3MgUnRDYXJvdXNlbENvbnRhaW5lckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKSBzY3JvbGxTdGVwID0gMTtcbiAgICBASW5wdXQoe3JlcXVpcmVkOiB0cnVlfSkgdXVpZENhcm91c2VsITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFjdGl2ZUNsYXNzPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFudGlCb3VuY2UgPSA1O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgcHJpdmF0ZSBmaXJzdERlYm91bmNlID0gMTUwMDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBzZXJ2aWNlOiBSdENhcm91c2VsU2VydmljZSwgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZWxlY3RlZFRhYj86IG51bWJlcjtcblxuICAgIEBJbnB1dCgpIHNldCBzZWxlY3RlZFRhYih2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFiID0gdmFsdWU7XG5cbiAgICAgICAgdGhpcy5zZXJ2aWNlLmFtb3VudFRhYnModGhpcy51dWlkQ2Fyb3VzZWwpLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZmlyc3REZWJvdW5jZSksIGZpcnN0KCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdERlYm91bmNlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2VsZWN0VGFiKHRoaXMudXVpZENhcm91c2VsLCB2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ2ZsZXgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvdmVyZmxvdycsICdhdXRvJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnei1pbmRleCcsICcxMCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3BhZGRpbmcnLCAnMCAycHgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdhbGlnbi1pdGVtcycsICdjZW50ZXInKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdnYXAnLCAnNnB4Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsYmFyLXdpZHRoJywgJ25vbmUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdydC10YWItY2Fyb3VzZWwtY29udGFpbmVyJyk7XG5cblxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UuYW1vdW50VGFicyh0aGlzLnV1aWRDYXJvdXNlbClcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTApKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB0aGlzLmNkLmRldGVjdENoYW5nZXMoKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2V0QWN0aXZlQ2xhc3NUYWIodGhpcy51dWlkQ2Fyb3VzZWwsIHRoaXMuYWN0aXZlQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VydmljZS5zZXRTY3JvbGxTdGVwKHRoaXMudXVpZENhcm91c2VsLCB0aGlzLnNjcm9sbFN0ZXApO1xuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHN0eWxlKTtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gYDo6LXdlYmtpdC1zY3JvbGxiYXIgeyB3aWR0aDogMDsgaGVpZ2h0OiAwIH1gO1xuXG5cbiAgICAgICAgdGhpcy5zZXJ2aWNlLmFtb3VudFRhYnModGhpcy51dWlkQ2Fyb3VzZWwpLnBpcGUoZGVib3VuY2VUaW1lKDEwMDApLCBmaXJzdCgpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEluZGV4ZXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgY29uc3QgcmVzaXplJCA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5waXBlKHN0YXJ0V2l0aChudWxsKSk7XG4gICAgICAgIGNvbnN0IHNjcm9sbCQgPSBmcm9tRXZlbnQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJykucGlwZShzdGFydFdpdGgobnVsbCkpO1xuXG5cbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciQgPSB0aGlzLmNyZWF0ZU11dGF0aW9uT2JzZXJ2ZXJPYnNlcnZhYmxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCkucGlwZShzdGFydFdpdGgobnVsbCkpO1xuXG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKGNvbWJpbmVMYXRlc3QoW3Jlc2l6ZSQsIHNjcm9sbCQsIG11dGF0aW9uT2JzZXJ2ZXIkXSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAucnQtY2Fyb3VzZWwtdGFiLSR7dGhpcy51dWlkQ2Fyb3VzZWx9YCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjdXJyZW50SXRlbXNbaV0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5vZmZzZXRMZWZ0IC0gc2Nyb2xsTGVmdCAtIHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0ICsgdGhpcy5hbnRpQm91bmNlID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5zZXRMYXN0VmlzaWJsZUluZGV4KHRoaXMudXVpZENhcm91c2VsLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGN1cnJlbnRJdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGN1cnJlbnRJdGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgKyB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPj1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm9mZnNldExlZnQgKyBjaGlsZC5vZmZzZXRXaWR0aCAtIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0IC0gdGhpcy5hbnRpQm91bmNlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnNldExhc3RWaXNpYmxlSW5kZXhFbmQodGhpcy51dWlkQ2Fyb3VzZWwsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KSk7XG5cblxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpbml0SW5kZXhlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlXG4gICAgICAgICAgICAudGFicyh0aGlzLnV1aWRDYXJvdXNlbClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihpdGVtcyA9PiBpdGVtcyAmJiAhIWl0ZW1zLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IHRhYnMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAucnQtY2Fyb3VzZWwtdGFiLSR7dGhpcy51dWlkQ2Fyb3VzZWx9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RUYWIgPSB0YWJzWzBdLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldExlZnQgPSBmaXJzdFRhYi5vZmZzZXRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0TGVmdCA+PSBzY3JvbGxMZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2V0TGFzdFZpc2libGVJbmRleCh0aGlzLnV1aWRDYXJvdXNlbCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gY3VycmVudEl0ZW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGN1cnJlbnRJdGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCArIHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm9mZnNldExlZnQgKyBjaGlsZC5vZmZzZXRXaWR0aCAtIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0IC0gdGhpcy5hbnRpQm91bmNlXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc2V0TGFzdFZpc2libGVJbmRleEVuZCh0aGlzLnV1aWRDYXJvdXNlbCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAucnQtY2Fyb3VzZWwtdGFiLSR7dGhpcy51dWlkQ2Fyb3VzZWx9YCk7XG4gICAgICAgIHRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICAgICAgdGFiLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGFiLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VydmljZS5kZXN0cm95Q2Fyb3VzZWwodGhpcy51dWlkQ2Fyb3VzZWwpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlTXV0YXRpb25PYnNlcnZlck9ic2VydmFibGUodGFyZ2V0OiBIVE1MRWxlbWVudCk6IE9ic2VydmFibGU8TXV0YXRpb25SZWNvcmRbXT4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJJbnN0YW5jZSA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9uc0xpc3QgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobXV0YXRpb25zTGlzdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVySW5zdGFuY2Uub2JzZXJ2ZSh0YXJnZXQsIHtcbiAgICAgICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlckluc3RhbmNlLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==