UNPKG

ngx-suspense

Version:

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

183 lines 21.9 kB
import { __decorate, __read, __spread, __values } 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"; var NgxSuspenseListComponent = /** @class */ (function () { function NgxSuspenseListComponent() { this.revealOrder = "*"; this.subs = []; this.allBroadcasters = []; this.allListeners = []; this.hasParentControlSubject = new BehaviorSubject(undefined); this.parentControl$ = this.hasParentControlSubject.asObservable(); } NgxSuspenseListComponent_1 = NgxSuspenseListComponent; NgxSuspenseListComponent.prototype.ngOnInit = function () { this.parentControl$ .pipe(tap(function (val) { console.log("release", val); })) .subscribe(); }; NgxSuspenseListComponent.prototype.ngAfterContentInit = function () { var _this = this; this.allBroadcasters = this.skeletons.map(function (s) { return s.loading$; }); this.allListeners = this.skeletons.map(function (s) { return _this.hideSkeletonListener(s); }); this.revealOrderOperator(this.revealOrder); }; NgxSuspenseListComponent.prototype.ngOnChanges = function (changes) { if (changes.revealOrder) { this.revealOrderOperator(changes.revealOrder.currentValue); } }; NgxSuspenseListComponent.prototype.ngOnDestroy = function () { if (this.subs.length) { this.subs.forEach(function (sub) { return sub.unsubscribe(); }); this.subs.length = 0; } }; NgxSuspenseListComponent.prototype.reload = function (order) { this.revealOrderOperator(order || this.revealOrder); }; NgxSuspenseListComponent.prototype.show = function () { }; NgxSuspenseListComponent.prototype.hide = function () { }; NgxSuspenseListComponent.prototype.revealOrderOperator = function (order) { if (this.allBroadcasters.length === 0 || this.allListeners.length === 0) { return; } if (this.subs.length) { this.subs.forEach(function (sub) { return sub.unsubscribe(); }); this.subs.length = 0; } switch (order) { case "together": { var sub = this.togetherOperator(this.allBroadcasters)(this.allListeners); this.subs.push(sub); break; } case "forwards": { var subs = this.domOrderOperator(this.allBroadcasters)(this.allListeners); this.subs = subs; break; } case "backwards": { var broadcasters = __spread(this.allBroadcasters).reverse(); var listeners = __spread(this.allListeners).reverse(); var subs = this.domOrderOperator(broadcasters)(listeners); this.subs = subs; break; } default: // nothing should happen } }; NgxSuspenseListComponent.prototype.hideSkeletonListener = function (skeleton) { return function () { skeleton.hide(); }; }; NgxSuspenseListComponent.prototype.showSkeletonListener = function (skeleton) { return function () { skeleton.show(); }; }; NgxSuspenseListComponent.prototype.togetherOperator = function (broadcasters) { var _this = this; this.skeletons.forEach(function (s) { return _this.showSkeletonListener(s)(); }); return function (listeners) { return combineLatest(__spread(broadcasters)) .pipe( // skip default skip(1), // keep tracking previous value pairwise(), filter(function (_a) { var _b = __read(_a, 2), ary1 = _b[0], ary2 = _b[1]; // any loading state is ture var cond1 = ary1.some(function (b) { return b; }); // all loading state is false var cond2 = !ary2.some(function (b) { return b; }); // pass only when prev loading state is ture, current is false return cond1 && cond2; })) .subscribe(function () { listeners.forEach(function (hide) { return hide(); }); }); }; }; NgxSuspenseListComponent.prototype.domOrderOperator = function (broadcasters) { var _this = this; this.skeletons.forEach(function (s) { return _this.showSkeletonListener(s)(); }); return function (listeners) { var subs = []; var checks = __spread(new Array(broadcasters.length)).fill(null); broadcasters.forEach(function (boradcaster, index) { subs.push(boradcaster .pipe( // skip default skip(1), // keep tracking previous value pairwise(), filter(function (_a) { var _b = __read(_a, 2), b1 = _b[0], b2 = _b[1]; // pass only when prev loading state is ture, current is false return b1 && !b2; })) .subscribe(function () { var e_1, _a; checks[index] = true; var indexesToFlush = _this.getFlushIndexes(checks); try { for (var indexesToFlush_1 = __values(indexesToFlush), indexesToFlush_1_1 = indexesToFlush_1.next(); !indexesToFlush_1_1.done; indexesToFlush_1_1 = indexesToFlush_1.next()) { var i = indexesToFlush_1_1.value; listeners[i](); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (indexesToFlush_1_1 && !indexesToFlush_1_1.done && (_a = indexesToFlush_1.return)) _a.call(indexesToFlush_1); } finally { if (e_1) throw e_1.error; } } })); }); return subs; }; }; NgxSuspenseListComponent.prototype.getFlushIndexes = function (checks) { var indexesToFlush = []; for (var i = 0; i < checks.length; i++) { if (indexesToFlush.indexOf(i) > -1) { continue; } var check = checks[i]; if (check !== null) { indexesToFlush.push(i); } else { break; } } return indexesToFlush; }; var NgxSuspenseListComponent_1; __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); return NgxSuspenseListComponent; }()); export { NgxSuspenseListComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXN1c3BlbnNlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXN1c3BlbnNlLyIsInNvdXJjZXMiOlsibGliL25neC1zdXNwZW5zZS1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBRUwsZUFBZSxHQUloQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsYUFBYSxFQUdiLGVBQWUsR0FFaEIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEU7SUFBQTtRQUNXLGdCQUFXLEdBQVcsR0FBRyxDQUFDO1FBUW5DLFNBQUksR0FBd0IsRUFBRSxDQUFDO1FBQy9CLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBRVYsNEJBQXVCLEdBQUcsSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekQsbUJBQWMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFtS3ZFLENBQUM7aUNBakxZLHdCQUF3QjtJQWdCbkMsMkNBQVEsR0FBUjtRQUNFLElBQUksQ0FBQyxjQUFjO2FBQ2hCLElBQUksQ0FDSCxHQUFHLENBQUMsVUFBQyxHQUFHO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQscURBQWtCLEdBQWxCO1FBQUEsaUJBSUM7UUFIQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQUMs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QUM7UUFDZCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sa0RBQWUsR0FBdkIsVUFBd0IsTUFBTTtRQUM1QixJQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNsQyxTQUFTO2FBQ1Y7WUFDRCxJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNsQixjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLE1BQU07YUFDUDtTQUNGO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQzs7SUEvS1E7UUFBUixLQUFLLEVBQUU7aUVBQTJCO0lBQ0k7UUFBdEMsZUFBZSxDQUFDLG9CQUFvQixDQUFDOytEQUVwQztJQUN5QztRQUExQyxlQUFlLENBQUMsMEJBQXdCLENBQUM7MERBRXhDO0lBUFMsd0JBQXdCO1FBTHBDLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxjQUFjO1lBQ3hCLHVDQUFpRDtZQUNqRCxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDO09BQ1csd0JBQXdCLENBaUxwQztJQUFELCtCQUFDO0NBQUEsQUFqTEQsSUFpTEM7U0FqTFksd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5neFN1c3BlbnNlQ29tcG9uZW50IH0gZnJvbSBcIi4vbmd4LXN1c3BlbnNlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgY29tYmluZUxhdGVzdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBTdWJqZWN0LFxuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG59IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBmaWx0ZXIsIHNraXAsIHBhaXJ3aXNlLCB0YXAsIHN0YXJ0V2l0aCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG50eXBlIE9SREVSUyA9IFwiKlwiIHwgXCJ0b2dldGhlclwiIHwgXCJmb3J3YXJkc1wiIHwgXCJiYWNrd2FyZHNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIlN1c3BlbnNlTGlzdFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL25neC1zdXNwZW5zZS1saXN0LmNvbXBvbmVudC5odG1sXCIsXG4gIGV4cG9ydEFzOiBcImxpc3RcIixcbn0pXG5leHBvcnQgY2xhc3MgTmd4U3VzcGVuc2VMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcmV2ZWFsT3JkZXI6IE9SREVSUyA9IFwiKlwiO1xuICBAQ29udGVudENoaWxkcmVuKE5neFN1c3BlbnNlQ29tcG9uZW50KSBza2VsZXRvbnM6IFF1ZXJ5TGlzdDxcbiAgICBOZ3hTdXNwZW5zZUNvbXBvbmVudFxuICA+O1xuICBAQ29udGVudENoaWxkcmVuKE5neFN1c3BlbnNlTGlzdENvbXBvbmVudCkgbGlzdDogUXVlcnlMaXN0PFxuICAgIE5neFN1c3BlbnNlTGlzdENvbXBvbmVudFxuICA+O1xuICBsb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgc3ViczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuICBhbGxCcm9hZGNhc3RlcnMgPSBbXTtcbiAgYWxsTGlzdGVuZXJzID0gW107XG5cbiAgcHJpdmF0ZSBoYXNQYXJlbnRDb250cm9sU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBwYXJlbnRDb250cm9sJCA9IHRoaXMuaGFzUGFyZW50Q29udHJvbFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5wYXJlbnRDb250cm9sJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgodmFsKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJyZWxlYXNlXCIsIHZhbCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5hbGxCcm9hZGNhc3RlcnMgPSB0aGlzLnNrZWxldG9ucy5tYXAoKHMpID0+IHMubG9hZGluZyQpO1xuICAgIHRoaXMuYWxsTGlzdGVuZXJzID0gdGhpcy5za2VsZXRvbnMubWFwKChzKSA9PiB0aGlzLmhpZGVTa2VsZXRvbkxpc3RlbmVyKHMpKTtcbiAgICB0aGlzLnJldmVhbE9yZGVyT3BlcmF0b3IodGhpcy5yZXZlYWxPcmRlcik7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMucmV2ZWFsT3JkZXIpIHtcbiAgICAgIHRoaXMucmV2ZWFsT3JkZXJPcGVyYXRvcihjaGFuZ2VzLnJldmVhbE9yZGVyLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3Vicy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzdWIpID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICAgIHRoaXMuc3Vicy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJlbG9hZChvcmRlcikge1xuICAgIHRoaXMucmV2ZWFsT3JkZXJPcGVyYXRvcihvcmRlciB8fCB0aGlzLnJldmVhbE9yZGVyKTtcbiAgfVxuXG4gIHNob3coKSB7fVxuXG4gIGhpZGUoKSB7fVxuXG4gIHByaXZhdGUgcmV2ZWFsT3JkZXJPcGVyYXRvcihvcmRlcjogT1JERVJTKSB7XG4gICAgaWYgKHRoaXMuYWxsQnJvYWRjYXN0ZXJzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmFsbExpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdWJzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zdWJzLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgdGhpcy5zdWJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICAgIGNhc2UgXCJ0b2dldGhlclwiOiB7XG4gICAgICAgIGNvbnN0IHN1YiA9IHRoaXMudG9nZXRoZXJPcGVyYXRvcih0aGlzLmFsbEJyb2FkY2FzdGVycykoXG4gICAgICAgICAgdGhpcy5hbGxMaXN0ZW5lcnNcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdWJzLnB1c2goc3ViKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZm9yd2FyZHNcIjoge1xuICAgICAgICBjb25zdCBzdWJzID0gdGhpcy5kb21PcmRlck9wZXJhdG9yKHRoaXMuYWxsQnJvYWRjYXN0ZXJzKShcbiAgICAgICAgICB0aGlzLmFsbExpc3RlbmVyc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnN1YnMgPSBzdWJzO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJiYWNrd2FyZHNcIjoge1xuICAgICAgICBjb25zdCBicm9hZGNhc3RlcnMgPSBbLi4udGhpcy5hbGxCcm9hZGNhc3RlcnNdLnJldmVyc2UoKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gWy4uLnRoaXMuYWxsTGlzdGVuZXJzXS5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IHN1YnMgPSB0aGlzLmRvbU9yZGVyT3BlcmF0b3IoYnJvYWRjYXN0ZXJzKShsaXN0ZW5lcnMpO1xuICAgICAgICB0aGlzLnN1YnMgPSBzdWJzO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG5cbiAgICAgIC8vIG5vdGhpbmcgc2hvdWxkIGhhcHBlblxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGlkZVNrZWxldG9uTGlzdGVuZXIoXG4gICAgc2tlbGV0b246IE5neFN1c3BlbnNlQ29tcG9uZW50IHwgTmd4U3VzcGVuc2VMaXN0Q29tcG9uZW50XG4gICkge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBza2VsZXRvbi5oaWRlKCk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1NrZWxldG9uTGlzdGVuZXIoXG4gICAgc2tlbGV0b246IE5neFN1c3BlbnNlQ29tcG9uZW50IHwgTmd4U3VzcGVuc2VMaXN0Q29tcG9uZW50XG4gICkge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBza2VsZXRvbi5zaG93KCk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdG9nZXRoZXJPcGVyYXRvcihicm9hZGNhc3RlcnMpIHtcbiAgICB0aGlzLnNrZWxldG9ucy5mb3JFYWNoKChzKSA9PiB0aGlzLnNob3dTa2VsZXRvbkxpc3RlbmVyKHMpKCkpO1xuICAgIHJldHVybiAobGlzdGVuZXJzKSA9PiB7XG4gICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbLi4uYnJvYWRjYXN0ZXJzXSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gc2tpcCBkZWZhdWx0XG4gICAgICAgICAgc2tpcCgxKSxcbiAgICAgICAgICAvLyBrZWVwIHRyYWNraW5nIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgICBmaWx0ZXIoKFthcnkxLCBhcnkyXSkgPT4ge1xuICAgICAgICAgICAgLy8gYW55IGxvYWRpbmcgc3RhdGUgaXMgdHVyZVxuICAgICAgICAgICAgY29uc3QgY29uZDEgPSBhcnkxLnNvbWUoKGIpID0+IGIpO1xuICAgICAgICAgICAgLy8gYWxsIGxvYWRpbmcgc3RhdGUgaXMgZmFsc2VcbiAgICAgICAgICAgIGNvbnN0IGNvbmQyID0gIWFyeTIuc29tZSgoYikgPT4gYik7XG4gICAgICAgICAgICAvLyBwYXNzIG9ubHkgd2hlbiBwcmV2IGxvYWRpbmcgc3RhdGUgaXMgdHVyZSwgY3VycmVudCBpcyBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuIGNvbmQxICYmIGNvbmQyO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGhpZGU6IGFueSkgPT4gaGlkZSgpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZG9tT3JkZXJPcGVyYXRvcihicm9hZGNhc3RlcnMpIHtcbiAgICB0aGlzLnNrZWxldG9ucy5mb3JFYWNoKChzKSA9PiB0aGlzLnNob3dTa2VsZXRvbkxpc3RlbmVyKHMpKCkpO1xuICAgIHJldHVybiAobGlzdGVuZXJzKSA9PiB7XG4gICAgICBsZXQgc3VicyA9IFtdO1xuICAgICAgbGV0IGNoZWNrcyA9IFsuLi5uZXcgQXJyYXkoYnJvYWRjYXN0ZXJzLmxlbmd0aCldLmZpbGwobnVsbCk7XG4gICAgICBicm9hZGNhc3RlcnMuZm9yRWFjaCgoYm9yYWRjYXN0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgIHN1YnMucHVzaChcbiAgICAgICAgICBib3JhZGNhc3RlclxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIC8vIHNraXAgZGVmYXVsdFxuICAgICAgICAgICAgICBza2lwKDEpLFxuICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNraW5nIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgICAgIHBhaXJ3aXNlKCksXG4gICAgICAgICAgICAgIGZpbHRlcigoW2IxLCBiMl0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBwYXNzIG9ubHkgd2hlbiBwcmV2IGxvYWRpbmcgc3RhdGUgaXMgdHVyZSwgY3VycmVudCBpcyBmYWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBiMSAmJiAhYjI7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ZXNUb0ZsdXNoID0gdGhpcy5nZXRGbHVzaEluZGV4ZXMoY2hlY2tzKTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSBvZiBpbmRleGVzVG9GbHVzaCkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyc1tpXSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3VicztcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGbHVzaEluZGV4ZXMoY2hlY2tzKSB7XG4gICAgY29uc3QgaW5kZXhlc1RvRmx1c2ggPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGluZGV4ZXNUb0ZsdXNoLmluZGV4T2YoaSkgPiAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoZWNrID0gY2hlY2tzW2ldO1xuICAgICAgaWYgKGNoZWNrICE9PSBudWxsKSB7XG4gICAgICAgIGluZGV4ZXNUb0ZsdXNoLnB1c2goaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXhlc1RvRmx1c2g7XG4gIH1cbn1cbiJdfQ==