ngx-suspense
Version:
This library is an experimetnal implementation of React Suspense for Angular.
165 lines • 19.8 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXN1c3BlbnNlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXN1c3BlbnNlLyIsInNvdXJjZXMiOlsibGliL25neC1zdXNwZW5zZS1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLGVBQWUsR0FJaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUNMLGFBQWEsRUFHYixlQUFlLEdBRWhCLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBU3hFLElBQWEsd0JBQXdCLGdDQUFyQyxNQUFhLHdCQUF3QjtJQUFyQztRQUNXLGdCQUFXLEdBQVcsR0FBRyxDQUFDO1FBUW5DLFNBQUksR0FBd0IsRUFBRSxDQUFDO1FBQy9CLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBRVYsNEJBQXVCLEdBQUcsSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekQsbUJBQWMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFtS3ZFLENBQUM7SUFqS0MsUUFBUTtRQUNOLElBQUksQ0FBQyxjQUFjO2FBQ2hCLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFD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RyxFQUFFLENBQUM7UUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNsQyxTQUFTO2FBQ1Y7WUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNsQixjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLE1BQU07YUFDUDtTQUNGO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztDQUNGLENBQUE7QUFoTFU7SUFBUixLQUFLLEVBQUU7NkRBQTJCO0FBQ0k7SUFBdEMsZUFBZSxDQUFDLG9CQUFvQixDQUFDOzJEQUVwQztBQUN5QztJQUExQyxlQUFlLENBQUMsMEJBQXdCLENBQUM7c0RBRXhDO0FBUFMsd0JBQXdCO0lBTHBDLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxjQUFjO1FBQ3hCLHVDQUFpRDtRQUNqRCxRQUFRLEVBQUUsTUFBTTtLQUNqQixDQUFDO0dBQ1csd0JBQXdCLENBaUxwQztTQWpMWSx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTmd4U3VzcGVuc2VDb21wb25lbnQgfSBmcm9tIFwiLi9uZ3gtc3VzcGVuc2UuY29tcG9uZW50XCI7XG5pbXBvcnQge1xuICBjb21iaW5lTGF0ZXN0LFxuICBTdWJzY3JpcHRpb24sXG4gIFN1YmplY3QsXG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGZpbHRlciwgc2tpcCwgcGFpcndpc2UsIHRhcCwgc3RhcnRXaXRoIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbnR5cGUgT1JERVJTID0gXCIqXCIgfCBcInRvZ2V0aGVyXCIgfCBcImZvcndhcmRzXCIgfCBcImJhY2t3YXJkc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiU3VzcGVuc2VMaXN0XCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vbmd4LXN1c3BlbnNlLWxpc3QuY29tcG9uZW50Lmh0bWxcIixcbiAgZXhwb3J0QXM6IFwibGlzdFwiLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hTdXNwZW5zZUxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSByZXZlYWxPcmRlcjogT1JERVJTID0gXCIqXCI7XG4gIEBDb250ZW50Q2hpbGRyZW4oTmd4U3VzcGVuc2VDb21wb25lbnQpIHNrZWxldG9uczogUXVlcnlMaXN0PFxuICAgIE5neFN1c3BlbnNlQ29tcG9uZW50XG4gID47XG4gIEBDb250ZW50Q2hpbGRyZW4oTmd4U3VzcGVuc2VMaXN0Q29tcG9uZW50KSBsaXN0OiBRdWVyeUxpc3Q8XG4gICAgTmd4U3VzcGVuc2VMaXN0Q29tcG9uZW50XG4gID47XG4gIGxvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzdWJzOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XG4gIGFsbEJyb2FkY2FzdGVycyA9IFtdO1xuICBhbGxMaXN0ZW5lcnMgPSBbXTtcblxuICBwcml2YXRlIGhhc1BhcmVudENvbnRyb2xTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xuICBwcml2YXRlIHBhcmVudENvbnRyb2wkID0gdGhpcy5oYXNQYXJlbnRDb250cm9sU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhcmVudENvbnRyb2wkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCh2YWwpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInJlbGVhc2VcIiwgdmFsKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmFsbEJyb2FkY2FzdGVycyA9IHRoaXMuc2tlbGV0b25zLm1hcCgocykgPT4gcy5sb2FkaW5nJCk7XG4gICAgdGhpcy5hbGxMaXN0ZW5lcnMgPSB0aGlzLnNrZWxldG9ucy5tYXAoKHMpID0+IHRoaXMuaGlkZVNrZWxldG9uTGlzdGVuZXIocykpO1xuICAgIHRoaXMucmV2ZWFsT3JkZXJPcGVyYXRvcih0aGlzLnJldmVhbE9yZGVyKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5yZXZlYWxPcmRlcikge1xuICAgICAgdGhpcy5yZXZlYWxPcmRlck9wZXJhdG9yKGNoYW5nZXMucmV2ZWFsT3JkZXIuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdWJzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zdWJzLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgdGhpcy5zdWJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkKG9yZGVyKSB7XG4gICAgdGhpcy5yZXZlYWxPcmRlck9wZXJhdG9yKG9yZGVyIHx8IHRoaXMucmV2ZWFsT3JkZXIpO1xuICB9XG5cbiAgc2hvdygpIHt9XG5cbiAgaGlkZSgpIHt9XG5cbiAgcHJpdmF0ZSByZXZlYWxPcmRlck9wZXJhdG9yKG9yZGVyOiBPUkRFUlMpIHtcbiAgICBpZiAodGhpcy5hbGxCcm9hZGNhc3RlcnMubGVuZ3RoID09PSAwIHx8IHRoaXMuYWxsTGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN1YnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnN1YnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgICB0aGlzLnN1YnMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgICAgY2FzZSBcInRvZ2V0aGVyXCI6IHtcbiAgICAgICAgY29uc3Qgc3ViID0gdGhpcy50b2dldGhlck9wZXJhdG9yKHRoaXMuYWxsQnJvYWRjYXN0ZXJzKShcbiAgICAgICAgICB0aGlzLmFsbExpc3RlbmVyc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnN1YnMucHVzaChzdWIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJmb3J3YXJkc1wiOiB7XG4gICAgICAgIGNvbnN0IHN1YnMgPSB0aGlzLmRvbU9yZGVyT3BlcmF0b3IodGhpcy5hbGxCcm9hZGNhc3RlcnMpKFxuICAgICAgICAgIHRoaXMuYWxsTGlzdGVuZXJzXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3VicyA9IHN1YnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImJhY2t3YXJkc1wiOiB7XG4gICAgICAgIGNvbnN0IGJyb2FkY2FzdGVycyA9IFsuLi50aGlzLmFsbEJyb2FkY2FzdGVyc10ucmV2ZXJzZSgpO1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBbLi4udGhpcy5hbGxMaXN0ZW5lcnNdLnJldmVyc2UoKTtcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuZG9tT3JkZXJPcGVyYXRvcihicm9hZGNhc3RlcnMpKGxpc3RlbmVycyk7XG4gICAgICAgIHRoaXMuc3VicyA9IHN1YnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcblxuICAgICAgLy8gbm90aGluZyBzaG91bGQgaGFwcGVuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoaWRlU2tlbGV0b25MaXN0ZW5lcihcbiAgICBza2VsZXRvbjogTmd4U3VzcGVuc2VDb21wb25lbnQgfCBOZ3hTdXNwZW5zZUxpc3RDb21wb25lbnRcbiAgKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNrZWxldG9uLmhpZGUoKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93U2tlbGV0b25MaXN0ZW5lcihcbiAgICBza2VsZXRvbjogTmd4U3VzcGVuc2VDb21wb25lbnQgfCBOZ3hTdXNwZW5zZUxpc3RDb21wb25lbnRcbiAgKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNrZWxldG9uLnNob3coKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dldGhlck9wZXJhdG9yKGJyb2FkY2FzdGVycykge1xuICAgIHRoaXMuc2tlbGV0b25zLmZvckVhY2goKHMpID0+IHRoaXMuc2hvd1NrZWxldG9uTGlzdGVuZXIocykoKSk7XG4gICAgcmV0dXJuIChsaXN0ZW5lcnMpID0+IHtcbiAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFsuLi5icm9hZGNhc3RlcnNdKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAvLyBza2lwIGRlZmF1bHRcbiAgICAgICAgICBza2lwKDEpLFxuICAgICAgICAgIC8vIGtlZXAgdHJhY2tpbmcgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICBwYWlyd2lzZSgpLFxuICAgICAgICAgIGZpbHRlcigoW2FyeTEsIGFyeTJdKSA9PiB7XG4gICAgICAgICAgICAvLyBhbnkgbG9hZGluZyBzdGF0ZSBpcyB0dXJlXG4gICAgICAgICAgICBjb25zdCBjb25kMSA9IGFyeTEuc29tZSgoYikgPT4gYik7XG4gICAgICAgICAgICAvLyBhbGwgbG9hZGluZyBzdGF0ZSBpcyBmYWxzZVxuICAgICAgICAgICAgY29uc3QgY29uZDIgPSAhYXJ5Mi5zb21lKChiKSA9PiBiKTtcbiAgICAgICAgICAgIC8vIHBhc3Mgb25seSB3aGVuIHByZXYgbG9hZGluZyBzdGF0ZSBpcyB0dXJlLCBjdXJyZW50IGlzIGZhbHNlXG4gICAgICAgICAgICByZXR1cm4gY29uZDEgJiYgY29uZDI7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoaGlkZTogYW55KSA9PiBoaWRlKCkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBkb21PcmRlck9wZXJhdG9yKGJyb2FkY2FzdGVycykge1xuICAgIHRoaXMuc2tlbGV0b25zLmZvckVhY2goKHMpID0+IHRoaXMuc2hvd1NrZWxldG9uTGlzdGVuZXIocykoKSk7XG4gICAgcmV0dXJuIChsaXN0ZW5lcnMpID0+IHtcbiAgICAgIGxldCBzdWJzID0gW107XG4gICAgICBsZXQgY2hlY2tzID0gWy4uLm5ldyBBcnJheShicm9hZGNhc3RlcnMubGVuZ3RoKV0uZmlsbChudWxsKTtcbiAgICAgIGJyb2FkY2FzdGVycy5mb3JFYWNoKChib3JhZGNhc3RlciwgaW5kZXgpID0+IHtcbiAgICAgICAgc3Vicy5wdXNoKFxuICAgICAgICAgIGJvcmFkY2FzdGVyXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgLy8gc2tpcCBkZWZhdWx0XG4gICAgICAgICAgICAgIHNraXAoMSksXG4gICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2tpbmcgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgICAgICAgZmlsdGVyKChbYjEsIGIyXSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHBhc3Mgb25seSB3aGVuIHByZXYgbG9hZGluZyBzdGF0ZSBpcyB0dXJlLCBjdXJyZW50IGlzIGZhbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGIxICYmICFiMjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBjaGVja3NbaW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXhlc1RvRmx1c2ggPSB0aGlzLmdldEZsdXNoSW5kZXhlcyhjaGVja3MpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpIG9mIGluZGV4ZXNUb0ZsdXNoKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzW2ldKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdWJzO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEZsdXNoSW5kZXhlcyhjaGVja3MpIHtcbiAgICBjb25zdCBpbmRleGVzVG9GbHVzaCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hlY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaW5kZXhlc1RvRmx1c2guaW5kZXhPZihpKSA+IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2sgPSBjaGVja3NbaV07XG4gICAgICBpZiAoY2hlY2sgIT09IG51bGwpIHtcbiAgICAgICAgaW5kZXhlc1RvRmx1c2gucHVzaChpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmRleGVzVG9GbHVzaDtcbiAgfVxufVxuIl19