@orbit/record-cache
Version:
Orbit base classes used to access and maintain a set of records.
109 lines • 15.9 kB
JavaScript
var _a, _b;
import { Orbit } from '@orbit/core';
import { equalRecordIdentities } from '@orbit/records';
import { recordOperationChange } from './record-change';
const { assert } = Orbit;
export class LiveQuery {
constructor(settings) {
assert('Only single expression queries are supported on LiveQuery', !Array.isArray(settings.query.expressions));
this.debounce = settings.debounce;
this._query = settings.query;
}
_subscribe(onNext) {
const execute = this.debounce ? onceTick(onNext) : onNext;
const unsubscribePatch = this.cache.on('patch', (operation) => {
if (this.operationRelevantForQuery(operation)) {
execute();
}
});
const unsubscribeReset = this.cache.on('reset', () => {
execute();
});
function unsubscribe() {
cancelTick(execute);
unsubscribePatch();
unsubscribeReset();
}
return unsubscribe;
}
operationRelevantForQuery(operation) {
const change = recordOperationChange(operation);
const expression = this._query.expressions;
return this.queryExpressionRelevantForChange(expression, change);
}
queryExpressionRelevantForChange(expression, change) {
switch (expression.op) {
case 'findRecord':
return this.findRecordQueryExpressionRelevantForChange(expression, change);
case 'findRecords':
return this.findRecordsQueryExpressionRelevantForChange(expression, change);
case 'findRelatedRecord':
return this.findRelatedRecordQueryExpressionRelevantForChange(expression, change);
case 'findRelatedRecords':
return this.findRelatedRecordsQueryExpressionRelevantForChange(expression, change);
default:
return true;
}
}
findRecordQueryExpressionRelevantForChange(expression, change) {
return equalRecordIdentities(expression.record, change);
}
findRecordsQueryExpressionRelevantForChange(expression, change) {
if (expression.type) {
return expression.type === change.type;
}
else if (expression.records) {
for (let record of expression.records) {
if (record.type === change.type) {
return true;
}
}
return false;
}
return true;
}
findRelatedRecordQueryExpressionRelevantForChange(expression, change) {
return (equalRecordIdentities(expression.record, change) &&
(change.relationships.includes(expression.relationship) || change.remove));
}
findRelatedRecordsQueryExpressionRelevantForChange(expression, change) {
const relationshipDef = this.schema.getRelationship(expression.record.type, expression.relationship);
const type = relationshipDef === null || relationshipDef === void 0 ? void 0 : relationshipDef.type;
if (Array.isArray(type) && type.find((type) => type === change.type)) {
return true;
}
else if (type === change.type) {
return true;
}
return (equalRecordIdentities(expression.record, change) &&
(change.relationships.includes(expression.relationship) || change.remove));
}
}
const isNode = typeof ((_a = Orbit.globals.process) === null || _a === void 0 ? void 0 : _a.nextTick) === 'function';
let resolvedPromise;
const nextTick = isNode
? function (fn) {
if (!resolvedPromise) {
resolvedPromise = Promise.resolve();
}
resolvedPromise.then(() => {
Orbit.globals.process.nextTick(fn);
});
}
: (_b = Orbit.globals.setImmediate) !== null && _b !== void 0 ? _b : setTimeout;
function onceTick(fn) {
return function tick() {
if (!ticks.has(tick)) {
ticks.add(tick);
nextTick(() => {
fn();
cancelTick(tick);
});
}
};
}
function cancelTick(tick) {
ticks.delete(tick);
}
const ticks = new WeakSet();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1xdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saXZlLXF1ZXJ5L2xpdmUtcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQVcsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQU1MLHFCQUFxQixFQUl0QixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBT3pCLE1BQU0sT0FBZ0IsU0FBUztJQStCN0IsWUFBWSxRQUEyQjtRQUNyQyxNQUFNLENBQ0osMkRBQTJELEVBQzNELENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUMzQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBaENTLFVBQVUsQ0FBQyxNQUFrQjtRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUUxRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNwQyxPQUFPLEVBQ1AsQ0FBQyxTQUEwQixFQUFFLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzdDLE9BQU8sRUFBRSxDQUFDO2FBQ1g7UUFDSCxDQUFDLENBQ0YsQ0FBQztRQUVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNuRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxXQUFXO1lBQ2xCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLGdCQUFnQixFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFXRCx5QkFBeUIsQ0FBQyxTQUEwQjtRQUNsRCxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQW9DLENBQUM7UUFDcEUsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFUyxnQ0FBZ0MsQ0FDeEMsVUFBaUMsRUFDakMsTUFBb0I7UUFFcEIsUUFBUSxVQUFVLENBQUMsRUFBRSxFQUFFO1lBQ3JCLEtBQUssWUFBWTtnQkFDZixPQUFPLElBQUksQ0FBQywwQ0FBMEMsQ0FDcEQsVUFBd0IsRUFDeEIsTUFBTSxDQUNQLENBQUM7WUFDSixLQUFLLGFBQWE7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDLDJDQUEyQyxDQUNyRCxVQUF5QixFQUN6QixNQUFNLENBQ1AsQ0FBQztZQUNKLEtBQUssbUJBQW1CO2dCQUN0QixPQUFPLElBQUksQ0FBQyxpREFBaUQsQ0FDM0QsVUFBK0IsRUFDL0IsTUFBTSxDQUNQLENBQUM7WUFDSixLQUFLLG9CQUFvQjtnQkFDdkIsT0FBTyxJQUFJLENBQUMsa0RBQWtELENBQzVELFVBQWdDLEVBQ2hDLE1BQU0sQ0FDUCxDQUFDO1lBQ0o7Z0JBQ0UsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNILENBQUM7SUFFUywwQ0FBMEMsQ0FDbEQsVUFBc0IsRUFDdEIsTUFBb0I7UUFFcEIsT0FBTyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFUywyQ0FBMkMsQ0FDbkQsVUFBdUIsRUFDdkIsTUFBb0I7UUFFcEIsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ25CLE9BQU8sVUFBVSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDO1NBQ3hDO2FBQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFO1lBQzdCLEtBQUssSUFBSSxNQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRTtnQkFDckMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUU7b0JBQy9CLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2FBQ0Y7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRVMsaURBQWlELENBQ3pELFVBQTZCLEVBQzdCLE1BQW9CO1FBRXBCLE9BQU8sQ0FDTCxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztZQUNoRCxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQzFFLENBQUM7SUFDSixDQUFDO0lBRVMsa0RBQWtELENBQzFELFVBQThCLEVBQzlCLE1BQW9CO1FBRXBCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUNqRCxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksRUFDdEIsVUFBVSxDQUFDLFlBQVksQ0FDeEIsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLGVBQWUsYUFBZixlQUFlLHVCQUFmLGVBQWUsQ0FBRSxJQUFJLENBQUM7UUFFbkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEUsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNLElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sQ0FDTCxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztZQUNoRCxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQzFFLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUEsTUFBQSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sMENBQUUsUUFBUSxDQUFBLEtBQUssVUFBVSxDQUFDO0FBQ3JFLElBQUksZUFBOEIsQ0FBQztBQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNO0lBQ3JCLENBQUMsQ0FBQyxVQUFVLEVBQWM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNwQixlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3JDO1FBQ0QsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDeEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxNQUFBLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxtQ0FBSSxVQUFVLENBQUM7QUFFN0MsU0FBUyxRQUFRLENBQUMsRUFBYztJQUM5QixPQUFPLFNBQVMsSUFBSTtRQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBZ0I7SUFDbEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yYml0LCBFdmVudGVkIH0gZnJvbSAnQG9yYml0L2NvcmUnO1xuaW1wb3J0IHtcbiAgUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICBGaW5kUmVjb3JkLFxuICBGaW5kUmVjb3JkcyxcbiAgRmluZFJlbGF0ZWRSZWNvcmQsXG4gIEZpbmRSZWxhdGVkUmVjb3JkcyxcbiAgZXF1YWxSZWNvcmRJZGVudGl0aWVzLFxuICBSZWNvcmRRdWVyeSxcbiAgUmVjb3JkU2NoZW1hLFxuICBSZWNvcmRPcGVyYXRpb25cbn0gZnJvbSAnQG9yYml0L3JlY29yZHMnO1xuXG5pbXBvcnQgeyBSZWNvcmRDaGFuZ2UsIHJlY29yZE9wZXJhdGlvbkNoYW5nZSB9IGZyb20gJy4vcmVjb3JkLWNoYW5nZSc7XG5cbmNvbnN0IHsgYXNzZXJ0IH0gPSBPcmJpdDtcblxuZXhwb3J0IGludGVyZmFjZSBMaXZlUXVlcnlTZXR0aW5ncyB7XG4gIGRlYm91bmNlOiBib29sZWFuO1xuICBxdWVyeTogUmVjb3JkUXVlcnk7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMaXZlUXVlcnkge1xuICByZWFkb25seSBkZWJvdW5jZTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBjYWNoZSgpOiBFdmVudGVkO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHNjaGVtYSgpOiBSZWNvcmRTY2hlbWE7XG5cbiAgcHJvdGVjdGVkIF9xdWVyeTogUmVjb3JkUXVlcnk7XG4gIHByb3RlY3RlZCBfc3Vic2NyaWJlKG9uTmV4dDogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IGV4ZWN1dGUgPSB0aGlzLmRlYm91bmNlID8gb25jZVRpY2sob25OZXh0KSA6IG9uTmV4dDtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlUGF0Y2ggPSB0aGlzLmNhY2hlLm9uKFxuICAgICAgJ3BhdGNoJyxcbiAgICAgIChvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25SZWxldmFudEZvclF1ZXJ5KG9wZXJhdGlvbikpIHtcbiAgICAgICAgICBleGVjdXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgdW5zdWJzY3JpYmVSZXNldCA9IHRoaXMuY2FjaGUub24oJ3Jlc2V0JywgKCkgPT4ge1xuICAgICAgZXhlY3V0ZSgpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBjYW5jZWxUaWNrKGV4ZWN1dGUpO1xuICAgICAgdW5zdWJzY3JpYmVQYXRjaCgpO1xuICAgICAgdW5zdWJzY3JpYmVSZXNldCgpO1xuICAgIH1cblxuICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNldHRpbmdzOiBMaXZlUXVlcnlTZXR0aW5ncykge1xuICAgIGFzc2VydChcbiAgICAgICdPbmx5IHNpbmdsZSBleHByZXNzaW9uIHF1ZXJpZXMgYXJlIHN1cHBvcnRlZCBvbiBMaXZlUXVlcnknLFxuICAgICAgIUFycmF5LmlzQXJyYXkoc2V0dGluZ3MucXVlcnkuZXhwcmVzc2lvbnMpXG4gICAgKTtcbiAgICB0aGlzLmRlYm91bmNlID0gc2V0dGluZ3MuZGVib3VuY2U7XG4gICAgdGhpcy5fcXVlcnkgPSBzZXR0aW5ncy5xdWVyeTtcbiAgfVxuXG4gIG9wZXJhdGlvblJlbGV2YW50Rm9yUXVlcnkob3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBjaGFuZ2UgPSByZWNvcmRPcGVyYXRpb25DaGFuZ2Uob3BlcmF0aW9uKTtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5fcXVlcnkuZXhwcmVzc2lvbnMgYXMgUmVjb3JkUXVlcnlFeHByZXNzaW9uO1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5RXhwcmVzc2lvblJlbGV2YW50Rm9yQ2hhbmdlKGV4cHJlc3Npb24sIGNoYW5nZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcXVlcnlFeHByZXNzaW9uUmVsZXZhbnRGb3JDaGFuZ2UoXG4gICAgZXhwcmVzc2lvbjogUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICAgIGNoYW5nZTogUmVjb3JkQ2hhbmdlXG4gICk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAoZXhwcmVzc2lvbi5vcCkge1xuICAgICAgY2FzZSAnZmluZFJlY29yZCc6XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRSZWNvcmRRdWVyeUV4cHJlc3Npb25SZWxldmFudEZvckNoYW5nZShcbiAgICAgICAgICBleHByZXNzaW9uIGFzIEZpbmRSZWNvcmQsXG4gICAgICAgICAgY2hhbmdlXG4gICAgICAgICk7XG4gICAgICBjYXNlICdmaW5kUmVjb3Jkcyc6XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRSZWNvcmRzUXVlcnlFeHByZXNzaW9uUmVsZXZhbnRGb3JDaGFuZ2UoXG4gICAgICAgICAgZXhwcmVzc2lvbiBhcyBGaW5kUmVjb3JkcyxcbiAgICAgICAgICBjaGFuZ2VcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ2ZpbmRSZWxhdGVkUmVjb3JkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFJlbGF0ZWRSZWNvcmRRdWVyeUV4cHJlc3Npb25SZWxldmFudEZvckNoYW5nZShcbiAgICAgICAgICBleHByZXNzaW9uIGFzIEZpbmRSZWxhdGVkUmVjb3JkLFxuICAgICAgICAgIGNoYW5nZVxuICAgICAgICApO1xuICAgICAgY2FzZSAnZmluZFJlbGF0ZWRSZWNvcmRzJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFJlbGF0ZWRSZWNvcmRzUXVlcnlFeHByZXNzaW9uUmVsZXZhbnRGb3JDaGFuZ2UoXG4gICAgICAgICAgZXhwcmVzc2lvbiBhcyBGaW5kUmVsYXRlZFJlY29yZHMsXG4gICAgICAgICAgY2hhbmdlXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZmluZFJlY29yZFF1ZXJ5RXhwcmVzc2lvblJlbGV2YW50Rm9yQ2hhbmdlKFxuICAgIGV4cHJlc3Npb246IEZpbmRSZWNvcmQsXG4gICAgY2hhbmdlOiBSZWNvcmRDaGFuZ2VcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVxdWFsUmVjb3JkSWRlbnRpdGllcyhleHByZXNzaW9uLnJlY29yZCwgY2hhbmdlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kUmVjb3Jkc1F1ZXJ5RXhwcmVzc2lvblJlbGV2YW50Rm9yQ2hhbmdlKFxuICAgIGV4cHJlc3Npb246IEZpbmRSZWNvcmRzLFxuICAgIGNoYW5nZTogUmVjb3JkQ2hhbmdlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChleHByZXNzaW9uLnR5cGUpIHtcbiAgICAgIHJldHVybiBleHByZXNzaW9uLnR5cGUgPT09IGNoYW5nZS50eXBlO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5yZWNvcmRzKSB7XG4gICAgICBmb3IgKGxldCByZWNvcmQgb2YgZXhwcmVzc2lvbi5yZWNvcmRzKSB7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gY2hhbmdlLnR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kUmVsYXRlZFJlY29yZFF1ZXJ5RXhwcmVzc2lvblJlbGV2YW50Rm9yQ2hhbmdlKFxuICAgIGV4cHJlc3Npb246IEZpbmRSZWxhdGVkUmVjb3JkLFxuICAgIGNoYW5nZTogUmVjb3JkQ2hhbmdlXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBlcXVhbFJlY29yZElkZW50aXRpZXMoZXhwcmVzc2lvbi5yZWNvcmQsIGNoYW5nZSkgJiZcbiAgICAgIChjaGFuZ2UucmVsYXRpb25zaGlwcy5pbmNsdWRlcyhleHByZXNzaW9uLnJlbGF0aW9uc2hpcCkgfHwgY2hhbmdlLnJlbW92ZSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpbmRSZWxhdGVkUmVjb3Jkc1F1ZXJ5RXhwcmVzc2lvblJlbGV2YW50Rm9yQ2hhbmdlKFxuICAgIGV4cHJlc3Npb246IEZpbmRSZWxhdGVkUmVjb3JkcyxcbiAgICBjaGFuZ2U6IFJlY29yZENoYW5nZVxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBEZWYgPSB0aGlzLnNjaGVtYS5nZXRSZWxhdGlvbnNoaXAoXG4gICAgICBleHByZXNzaW9uLnJlY29yZC50eXBlLFxuICAgICAgZXhwcmVzc2lvbi5yZWxhdGlvbnNoaXBcbiAgICApO1xuICAgIGNvbnN0IHR5cGUgPSByZWxhdGlvbnNoaXBEZWY/LnR5cGU7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSAmJiB0eXBlLmZpbmQoKHR5cGUpID0+IHR5cGUgPT09IGNoYW5nZS50eXBlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBjaGFuZ2UudHlwZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIGVxdWFsUmVjb3JkSWRlbnRpdGllcyhleHByZXNzaW9uLnJlY29yZCwgY2hhbmdlKSAmJlxuICAgICAgKGNoYW5nZS5yZWxhdGlvbnNoaXBzLmluY2x1ZGVzKGV4cHJlc3Npb24ucmVsYXRpb25zaGlwKSB8fCBjaGFuZ2UucmVtb3ZlKVxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgaXNOb2RlID0gdHlwZW9mIE9yYml0Lmdsb2JhbHMucHJvY2Vzcz8ubmV4dFRpY2sgPT09ICdmdW5jdGlvbic7XG5sZXQgcmVzb2x2ZWRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuY29uc3QgbmV4dFRpY2sgPSBpc05vZGVcbiAgPyBmdW5jdGlvbiAoZm46ICgpID0+IHZvaWQpIHtcbiAgICAgIGlmICghcmVzb2x2ZWRQcm9taXNlKSB7XG4gICAgICAgIHJlc29sdmVkUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZWRQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICBPcmJpdC5nbG9iYWxzLnByb2Nlc3MubmV4dFRpY2soZm4pO1xuICAgICAgfSk7XG4gICAgfVxuICA6IE9yYml0Lmdsb2JhbHMuc2V0SW1tZWRpYXRlID8/IHNldFRpbWVvdXQ7XG5cbmZ1bmN0aW9uIG9uY2VUaWNrKGZuOiAoKSA9PiB2b2lkKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0aWNrKCkge1xuICAgIGlmICghdGlja3MuaGFzKHRpY2spKSB7XG4gICAgICB0aWNrcy5hZGQodGljayk7XG4gICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIGZuKCk7XG4gICAgICAgIGNhbmNlbFRpY2sodGljayk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFRpY2sodGljazogKCkgPT4gdm9pZCkge1xuICB0aWNrcy5kZWxldGUodGljayk7XG59XG5cbmNvbnN0IHRpY2tzID0gbmV3IFdlYWtTZXQoKTtcbiJdfQ==