UNPKG

ngx-suspense

Version:

This library is an experimetnal implementation of React Suspense for Angular.

165 lines 19.8 kB
var NgxSuspenseListComponent_1; import { __decorate } from "tslib"; import { Component, Input, ContentChildren, } from "@angular/core"; import { NgxSuspenseComponent } from "./ngx-suspense.component"; import { combineLatest, BehaviorSubject, } from "rxjs"; import { filter, skip, pairwise, tap } from "rxjs/operators"; let NgxSuspenseListComponent = NgxSuspenseListComponent_1 = class NgxSuspenseListComponent { constructor() { this.revealOrder = "*"; this.subs = []; this.allBroadcasters = []; this.allListeners = []; this.hasParentControlSubject = new BehaviorSubject(undefined); this.parentControl$ = this.hasParentControlSubject.asObservable(); } ngOnInit() { this.parentControl$ .pipe(tap((val) => { console.log("release", val); })) .subscribe(); } ngAfterContentInit() { this.allBroadcasters = this.skeletons.map((s) => s.loading$); this.allListeners = this.skeletons.map((s) => this.hideSkeletonListener(s)); this.revealOrderOperator(this.revealOrder); } ngOnChanges(changes) { if (changes.revealOrder) { this.revealOrderOperator(changes.revealOrder.currentValue); } } ngOnDestroy() { if (this.subs.length) { this.subs.forEach((sub) => sub.unsubscribe()); this.subs.length = 0; } } reload(order) { this.revealOrderOperator(order || this.revealOrder); } show() { } hide() { } revealOrderOperator(order) { if (this.allBroadcasters.length === 0 || this.allListeners.length === 0) { return; } if (this.subs.length) { this.subs.forEach((sub) => sub.unsubscribe()); this.subs.length = 0; } switch (order) { case "together": { const sub = this.togetherOperator(this.allBroadcasters)(this.allListeners); this.subs.push(sub); break; } case "forwards": { const subs = this.domOrderOperator(this.allBroadcasters)(this.allListeners); this.subs = subs; break; } case "backwards": { const broadcasters = [...this.allBroadcasters].reverse(); const listeners = [...this.allListeners].reverse(); const subs = this.domOrderOperator(broadcasters)(listeners); this.subs = subs; break; } default: // nothing should happen } } hideSkeletonListener(skeleton) { return () => { skeleton.hide(); }; } showSkeletonListener(skeleton) { return () => { skeleton.show(); }; } togetherOperator(broadcasters) { this.skeletons.forEach((s) => this.showSkeletonListener(s)()); return (listeners) => { return combineLatest([...broadcasters]) .pipe( // skip default skip(1), // keep tracking previous value pairwise(), filter(([ary1, ary2]) => { // any loading state is ture const cond1 = ary1.some((b) => b); // all loading state is false const cond2 = !ary2.some((b) => b); // pass only when prev loading state is ture, current is false return cond1 && cond2; })) .subscribe(() => { listeners.forEach((hide) => hide()); }); }; } domOrderOperator(broadcasters) { this.skeletons.forEach((s) => this.showSkeletonListener(s)()); return (listeners) => { let subs = []; let checks = [...new Array(broadcasters.length)].fill(null); broadcasters.forEach((boradcaster, index) => { subs.push(boradcaster .pipe( // skip default skip(1), // keep tracking previous value pairwise(), filter(([b1, b2]) => { // pass only when prev loading state is ture, current is false return b1 && !b2; })) .subscribe(() => { checks[index] = true; const indexesToFlush = this.getFlushIndexes(checks); for (let i of indexesToFlush) { listeners[i](); } })); }); return subs; }; } getFlushIndexes(checks) { const indexesToFlush = []; for (let i = 0; i < checks.length; i++) { if (indexesToFlush.indexOf(i) > -1) { continue; } const check = checks[i]; if (check !== null) { indexesToFlush.push(i); } else { break; } } return indexesToFlush; } }; __decorate([ Input() ], NgxSuspenseListComponent.prototype, "revealOrder", void 0); __decorate([ ContentChildren(NgxSuspenseComponent) ], NgxSuspenseListComponent.prototype, "skeletons", void 0); __decorate([ ContentChildren(NgxSuspenseListComponent_1) ], NgxSuspenseListComponent.prototype, "list", void 0); NgxSuspenseListComponent = NgxSuspenseListComponent_1 = __decorate([ Component({ selector: "SuspenseList", template: "<ng-content></ng-content>\n", exportAs: "list" }) ], NgxSuspenseListComponent); export { NgxSuspenseListComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXN1c3BlbnNlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXN1c3BlbnNlLyIsInNvdXJjZXMiOlsibGliL25neC1zdXNwZW5zZS1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLGVBQWUsR0FJaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUNMLGFBQWEsRUFHYixlQUFlLEdBRWhCLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBU3hFLElBQWEsd0JBQXdCLGdDQUFyQyxNQUFhLHdCQUF3QjtJQUFyQztRQUNXLGdCQUFXLEdBQVcsR0FBRyxDQUFDO1FBUW5DLFNBQUksR0FBd0IsRUFBRSxDQUFDO1FBQy9CLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBRVYsNEJBQXVCLEdBQUcsSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekQsbUJBQWMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFtS3ZFLENBQUM7SUFqS0MsUUFBUTtRQUNOLElBQUksQ0FBQyxjQUFjO2FBQ2hCLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLO1FBQ1YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELElBQUksS0FBSSxDQUFDO0lBRVQsSUFBSSxLQUFJLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFhO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2RSxPQUFPO1NBQ1I7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDdEI7UUFDRCxRQUFRLEtBQUssRUFBRTtZQUNiLEtBQUssVUFBVSxDQUFDLENBQUM7Z0JBQ2YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FDckQsSUFBSSxDQUFDLFlBQVksQ0FDbEIsQ0FBQztnQkFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTthQUNQO1lBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQztnQkFDZixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUN0RCxJQUFJLENBQUMsWUFBWSxDQUNsQixDQUFDO2dCQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixNQUFNO2FBQ1A7WUFDRCxLQUFLLFdBQVcsQ0FBQyxDQUFDO2dCQUNoQixNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixNQUFNO2FBQ1A7WUFDRCxRQUFRO1lBRVIsd0JBQXdCO1NBQ3pCO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUMxQixRQUF5RDtRQUV6RCxPQUFPLEdBQUcsRUFBRTtZQUNWLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sb0JBQW9CLENBQzFCLFFBQXlEO1FBRXpELE9BQU8sR0FBRyxFQUFFO1lBQ1YsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxZQUFZO1FBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNuQixPQUFPLGFBQWEsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7aUJBQ3BDLElBQUk7WUFDSCxlQUFlO1lBQ2YsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNQLCtCQUErQjtZQUMvQixRQUFRLEVBQUUsRUFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUN0Qiw0QkFBNEI7Z0JBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyw2QkFBNkI7Z0JBQzdCLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLDhEQUE4RDtnQkFDOUQsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxDQUNIO2lCQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxZQUFZO1FBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNuQixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7WUFDZCxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVELFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQ1AsV0FBVztxQkFDUixJQUFJO2dCQUNILGVBQWU7Z0JBQ2YsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDUCwrQkFBK0I7Z0JBQy9CLFFBQVEsRUFBRSxFQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2xCLDhEQUE4RDtvQkFDOUQsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxDQUNIO3FCQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDckIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDcEQsS0FBSyxJQUFJLENBQUMsSUFBSSxjQUFjLEVBQUU7d0JBQzVCLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3FCQUNoQjtnQkFDSCxDQUFDLENBQUMsQ0FDTCxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBTTtRQUM1QixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNsQyxTQUFTO2FBQ1Y7WUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNsQixjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLE1BQU07YUFDUDtTQUNGO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztDQUNGLENBQUE7QUFoTFU7SUFBUixLQUFLLEVBQUU7NkRBQTJCO0FBQ0k7SUFBdEMsZUFBZSxDQUFDLG9CQUFvQixDQUFDOzJEQUVwQztBQUN5QztJQUExQyxlQUFlLENBQUMsMEJBQXdCLENBQUM7c0RBRXhDO0FBUFMsd0JBQXdCO0lBTHBDLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxjQUFjO1FBQ3hCLHVDQUFpRDtRQUNqRCxRQUFRLEVBQUUsTUFBTTtLQUNqQixDQUFDO0dBQ1csd0JBQXdCLENBaUxwQztTQWpMWSx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTmd4U3VzcGVuc2VDb21wb25lbnQgfSBmcm9tIFwiLi9uZ3gtc3VzcGVuc2UuY29tcG9uZW50XCI7XG5pbXBvcnQge1xuICBjb21iaW5lTGF0ZXN0LFxuICBTdWJzY3JpcHRpb24sXG4gIFN1YmplY3QsXG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGZpbHRlciwgc2tpcCwgcGFpcndpc2UsIHRhcCwgc3RhcnRXaXRoIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbnR5cGUgT1JERVJTID0gXCIqXCIgfCBcInRvZ2V0aGVyXCIgfCBcImZvcndhcmRzXCIgfCBcImJhY2t3YXJkc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiU3VzcGVuc2VMaXN0XCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vbmd4LXN1c3BlbnNlLWxpc3QuY29tcG9uZW50Lmh0bWxcIixcbiAgZXhwb3J0QXM6IFwibGlzdFwiLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hTdXNwZW5zZUxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSByZXZlYWxPcmRlcjogT1JERVJTID0gXCIqXCI7XG4gIEBDb250ZW50Q2hpbGRyZW4oTmd4U3VzcGVuc2VDb21wb25lbnQpIHNrZWxldG9uczogUXVlcnlMaXN0PFxuICAgIE5neFN1c3BlbnNlQ29tcG9uZW50XG4gID47XG4gIEBDb250ZW50Q2hpbGRyZW4oTmd4U3VzcGVuc2VMaXN0Q29tcG9uZW50KSBsaXN0OiBRdWVyeUxpc3Q8XG4gICAgTmd4U3VzcGVuc2VMaXN0Q29tcG9uZW50XG4gID47XG4gIGxvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzdWJzOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XG4gIGFsbEJyb2FkY2FzdGVycyA9IFtdO1xuICBhbGxMaXN0ZW5lcnMgPSBbXTtcblxuICBwcml2YXRlIGhhc1BhcmVudENvbnRyb2xTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xuICBwcml2YXRlIHBhcmVudENvbnRyb2wkID0gdGhpcy5oYXNQYXJlbnRDb250cm9sU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhcmVudENvbnRyb2wkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCh2YWwpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInJlbGVhc2VcIiwgdmFsKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmFsbEJyb2FkY2FzdGVycyA9IHRoaXMuc2tlbGV0b25zLm1hcCgocykgPT4gcy5sb2FkaW5nJCk7XG4gICAgdGhpcy5hbGxMaXN0ZW5lcnMgPSB0aGlzLnNrZWxldG9ucy5tYXAoKHMpID0+IHRoaXMuaGlkZVNrZWxldG9uTGlzdGVuZXIocykpO1xuICAgIHRoaXMucmV2ZWFsT3JkZXJPcGVyYXRvcih0aGlzLnJldmVhbE9yZGVyKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5yZXZlYWxPcmRlcikge1xuICAgICAgdGhpcy5yZXZlYWxPcmRlck9wZXJhdG9yKGNoYW5nZXMucmV2ZWFsT3JkZXIuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdWJzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zdWJzLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgdGhpcy5zdWJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkKG9yZGVyKSB7XG4gICAgdGhpcy5yZXZlYWxPcmRlck9wZXJhdG9yKG9yZGVyIHx8IHRoaXMucmV2ZWFsT3JkZXIpO1xuICB9XG5cbiAgc2hvdygpIHt9XG5cbiAgaGlkZSgpIHt9XG5cbiAgcHJpdmF0ZSByZXZlYWxPcmRlck9wZXJhdG9yKG9yZGVyOiBPUkRFUlMpIHtcbiAgICBpZiAodGhpcy5hbGxCcm9hZGNhc3RlcnMubGVuZ3RoID09PSAwIHx8IHRoaXMuYWxsTGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN1YnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnN1YnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgICB0aGlzLnN1YnMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgICAgY2FzZSBcInRvZ2V0aGVyXCI6IHtcbiAgICAgICAgY29uc3Qgc3ViID0gdGhpcy50b2dldGhlck9wZXJhdG9yKHRoaXMuYWxsQnJvYWRjYXN0ZXJzKShcbiAgICAgICAgICB0aGlzLmFsbExpc3RlbmVyc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnN1YnMucHVzaChzdWIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJmb3J3YXJkc1wiOiB7XG4gICAgICAgIGNvbnN0IHN1YnMgPSB0aGlzLmRvbU9yZGVyT3BlcmF0b3IodGhpcy5hbGxCcm9hZGNhc3RlcnMpKFxuICAgICAgICAgIHRoaXMuYWxsTGlzdGVuZXJzXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3VicyA9IHN1YnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImJhY2t3YXJkc1wiOiB7XG4gICAgICAgIGNvbnN0IGJyb2FkY2FzdGVycyA9IFsuLi50aGlzLmFsbEJyb2FkY2FzdGVyc10ucmV2ZXJzZSgpO1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBbLi4udGhpcy5hbGxMaXN0ZW5lcnNdLnJldmVyc2UoKTtcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuZG9tT3JkZXJPcGVyYXRvcihicm9hZGNhc3RlcnMpKGxpc3RlbmVycyk7XG4gICAgICAgIHRoaXMuc3VicyA9IHN1YnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcblxuICAgICAgLy8gbm90aGluZyBzaG91bGQgaGFwcGVuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoaWRlU2tlbGV0b25MaXN0ZW5lcihcbiAgICBza2VsZXRvbjogTmd4U3VzcGVuc2VDb21wb25lbnQgfCBOZ3hTdXNwZW5zZUxpc3RDb21wb25lbnRcbiAgKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNrZWxldG9uLmhpZGUoKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93U2tlbGV0b25MaXN0ZW5lcihcbiAgICBza2VsZXRvbjogTmd4U3VzcGVuc2VDb21wb25lbnQgfCBOZ3hTdXNwZW5zZUxpc3RDb21wb25lbnRcbiAgKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNrZWxldG9uLnNob3coKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dldGhlck9wZXJhdG9yKGJyb2FkY2FzdGVycykge1xuICAgIHRoaXMuc2tlbGV0b25zLmZvckVhY2goKHMpID0+IHRoaXMuc2hvd1NrZWxldG9uTGlzdGVuZXIocykoKSk7XG4gICAgcmV0dXJuIChsaXN0ZW5lcnMpID0+IHtcbiAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFsuLi5icm9hZGNhc3RlcnNdKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAvLyBza2lwIGRlZmF1bHRcbiAgICAgICAgICBza2lwKDEpLFxuICAgICAgICAgIC8vIGtlZXAgdHJhY2tpbmcgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICBwYWlyd2lzZSgpLFxuICAgICAgICAgIGZpbHRlcigoW2FyeTEsIGFyeTJdKSA9PiB7XG4gICAgICAgICAgICAvLyBhbnkgbG9hZGluZyBzdGF0ZSBpcyB0dXJlXG4gICAgICAgICAgICBjb25zdCBjb25kMSA9IGFyeTEuc29tZSgoYikgPT4gYik7XG4gICAgICAgICAgICAvLyBhbGwgbG9hZGluZyBzdGF0ZSBpcyBmYWxzZVxuICAgICAgICAgICAgY29uc3QgY29uZDIgPSAhYXJ5Mi5zb21lKChiKSA9PiBiKTtcbiAgICAgICAgICAgIC8vIHBhc3Mgb25seSB3aGVuIHByZXYgbG9hZGluZyBzdGF0ZSBpcyB0dXJlLCBjdXJyZW50IGlzIGZhbHNlXG4gICAgICAgICAgICByZXR1cm4gY29uZDEgJiYgY29uZDI7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoaGlkZTogYW55KSA9PiBoaWRlKCkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBkb21PcmRlck9wZXJhdG9yKGJyb2FkY2FzdGVycykge1xuICAgIHRoaXMuc2tlbGV0b25zLmZvckVhY2goKHMpID0+IHRoaXMuc2hvd1NrZWxldG9uTGlzdGVuZXIocykoKSk7XG4gICAgcmV0dXJuIChsaXN0ZW5lcnMpID0+IHtcbiAgICAgIGxldCBzdWJzID0gW107XG4gICAgICBsZXQgY2hlY2tzID0gWy4uLm5ldyBBcnJheShicm9hZGNhc3RlcnMubGVuZ3RoKV0uZmlsbChudWxsKTtcbiAgICAgIGJyb2FkY2FzdGVycy5mb3JFYWNoKChib3JhZGNhc3RlciwgaW5kZXgpID0+IHtcbiAgICAgICAgc3Vicy5wdXNoKFxuICAgICAgICAgIGJvcmFkY2FzdGVyXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgLy8gc2tpcCBkZWZhdWx0XG4gICAgICAgICAgICAgIHNraXAoMSksXG4gICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2tpbmcgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgICAgICAgZmlsdGVyKChbYjEsIGIyXSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHBhc3Mgb25seSB3aGVuIHByZXYgbG9hZGluZyBzdGF0ZSBpcyB0dXJlLCBjdXJyZW50IGlzIGZhbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGIxICYmICFiMjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBjaGVja3NbaW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXhlc1RvRmx1c2ggPSB0aGlzLmdldEZsdXNoSW5kZXhlcyhjaGVja3MpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpIG9mIGluZGV4ZXNUb0ZsdXNoKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzW2ldKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdWJzO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEZsdXNoSW5kZXhlcyhjaGVja3MpIHtcbiAgICBjb25zdCBpbmRleGVzVG9GbHVzaCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hlY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaW5kZXhlc1RvRmx1c2guaW5kZXhPZihpKSA+IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2sgPSBjaGVja3NbaV07XG4gICAgICBpZiAoY2hlY2sgIT09IG51bGwpIHtcbiAgICAgICAgaW5kZXhlc1RvRmx1c2gucHVzaChpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmRleGVzVG9GbHVzaDtcbiAgfVxufVxuIl19