@orbit/record-cache
Version:
Orbit base classes used to access and maintain a set of records.
182 lines • 25.1 kB
JavaScript
import { objectValues } from '@orbit/utils';
import { deserializeRecordIdentity, serializeRecordIdentity } from '@orbit/records';
import { SyncRecordCache } from './sync-record-cache';
function serializeRecordRelationshipIdentity(rri) {
return `${serializeRecordIdentity(rri.record)}::${rri.relationship}`;
}
function deserializeRecordRelationshipIdentity(rri) {
const [record, relationship] = rri.split('::');
return { record: deserializeRecordIdentity(record), relationship };
}
export class SimpleRecordTransformBuffer extends SyncRecordCache {
constructor(settings) {
super(settings);
this.resetState();
}
resetState() {
this._state = {
records: {},
inverseRelationships: {}
};
}
startTrackingChanges() {
this._delta = {
records: {},
inverseRelationships: {}
};
}
stopTrackingChanges() {
var _a, _b, _c, _d;
if (this._delta === undefined) {
throw new Error(`Changes are not being tracked. Call 'startTrackingChanges' before 'stopTrackingChanges'`);
}
let { records, inverseRelationships } = this._delta;
let changeset = {};
for (let rid of Object.keys(records)) {
let rv = records[rid];
if (rv === null) {
changeset.removeRecords = (_a = changeset.removeRecords) !== null && _a !== void 0 ? _a : [];
changeset.removeRecords.push(deserializeRecordIdentity(rid));
}
else {
changeset.setRecords = (_b = changeset.setRecords) !== null && _b !== void 0 ? _b : [];
changeset.setRecords.push(rv);
}
}
for (let rid of Object.keys(inverseRelationships)) {
let relatedRecord = deserializeRecordIdentity(rid);
let rels = inverseRelationships[rid];
for (let rel of Object.keys(rels)) {
let rv = rels[rel];
let { record, relationship } = deserializeRecordRelationshipIdentity(rel);
let rri = { relatedRecord, record, relationship };
if (rv === null) {
changeset.removeInverseRelationships =
(_c = changeset.removeInverseRelationships) !== null && _c !== void 0 ? _c : [];
changeset.removeInverseRelationships.push(rri);
}
else {
changeset.addInverseRelationships =
(_d = changeset.addInverseRelationships) !== null && _d !== void 0 ? _d : [];
changeset.addInverseRelationships.push(rri);
}
}
}
this._delta = undefined;
return changeset;
}
getRecordSync(identity) {
var _a;
return (_a = this._state.records[serializeRecordIdentity(identity)]) !== null && _a !== void 0 ? _a : undefined;
}
getRecordsSync(typeOrIdentities) {
if (typeof typeOrIdentities === 'string') {
return objectValues(this._state.records[typeOrIdentities]);
}
else if (Array.isArray(typeOrIdentities)) {
const records = [];
const identities = typeOrIdentities;
for (let i of identities) {
let record = this.getRecordSync(i);
if (record) {
records.push(record);
}
}
return records;
}
else {
throw new Error('typeOrIdentities must be specified in getRecordsSync');
}
}
setRecordSync(record) {
this._state.records[serializeRecordIdentity(record)] = record;
if (this._delta) {
this._delta.records[serializeRecordIdentity(record)] = record;
}
}
setRecordsSync(records) {
records.forEach((record) => this.setRecordSync(record));
}
removeRecordSync(recordIdentity) {
const record = this.getRecordSync(recordIdentity);
if (record) {
delete this._state.records[serializeRecordIdentity(record)];
if (this._delta) {
this._delta.records[serializeRecordIdentity(record)] = null;
}
return record;
}
else {
return undefined;
}
}
removeRecordsSync(recordIdentities) {
const records = [];
for (let recordIdentity of recordIdentities) {
let record = this.getRecordSync(recordIdentity);
if (record) {
records.push(record);
delete this._state.records[serializeRecordIdentity(record)];
if (this._delta) {
this._delta.records[serializeRecordIdentity(record)] = null;
}
}
}
return records;
}
getInverseRelationshipsSync(recordIdentityOrIdentities) {
if (Array.isArray(recordIdentityOrIdentities)) {
let relationships = [];
recordIdentityOrIdentities.forEach((record) => {
Array.prototype.push(relationships, this._getInverseRelationshipsSync(record));
});
return relationships;
}
else {
return this._getInverseRelationshipsSync(recordIdentityOrIdentities);
}
}
addInverseRelationshipsSync(relationships) {
var _a, _b;
for (let relationship of relationships) {
const ri = serializeRecordIdentity(relationship.relatedRecord);
const rri = serializeRecordRelationshipIdentity(relationship);
const rels = (_a = this._state.inverseRelationships[ri]) !== null && _a !== void 0 ? _a : {};
rels[rri] = relationship;
this._state.inverseRelationships[ri] = rels;
if (this._delta) {
const rels = (_b = this._delta.inverseRelationships[ri]) !== null && _b !== void 0 ? _b : {};
rels[rri] = relationship;
this._delta.inverseRelationships[ri] = rels;
}
}
}
removeInverseRelationshipsSync(relationships) {
var _a;
for (let relationship of relationships) {
const ri = serializeRecordIdentity(relationship.relatedRecord);
const rri = serializeRecordRelationshipIdentity(relationship);
const rels = this._state.inverseRelationships[ri];
if (rels) {
rels[rri] = null;
if (this._delta) {
const rels = (_a = this._delta.inverseRelationships[ri]) !== null && _a !== void 0 ? _a : {};
rels[rri] = null;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// Protected methods
/////////////////////////////////////////////////////////////////////////////
_getInverseRelationshipsSync(recordIdentity) {
let relationships = this._state.inverseRelationships[serializeRecordIdentity(recordIdentity)];
if (relationships) {
return objectValues(relationships).filter((r) => r !== null);
}
else {
return [];
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXJlY29yZC10cmFuc2Zvcm0tYnVmZmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpbXBsZS1yZWNvcmQtdHJhbnNmb3JtLWJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVEsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFDTCx5QkFBeUIsRUFHekIsdUJBQXVCLEVBQ3hCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLGVBQWUsRUFBMkIsTUFBTSxxQkFBcUIsQ0FBQztBQUcvRSxTQUFTLG1DQUFtQyxDQUMxQyxHQUErQjtJQUUvQixPQUFPLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUN2RSxDQUFDO0FBRUQsU0FBUyxxQ0FBcUMsQ0FDNUMsR0FBVztJQUVYLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ3JFLENBQUM7QUFPRCxNQUFNLE9BQU8sMkJBQ1gsU0FBUSxlQUFlO0lBS3ZCLFlBQVksUUFBaUM7UUFDM0MsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixPQUFPLEVBQUUsRUFBRTtZQUNYLG9CQUFvQixFQUFFLEVBQUU7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU8sRUFBRSxFQUFFO1lBQ1gsb0JBQW9CLEVBQUUsRUFBRTtTQUN6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QixDQUFDLEVBQUUsQ0FBQyxtQ0FBSSxFQUFFLENBQUM7b0JBQ3hELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7aUJBQ2xCO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFRCw2RUFBNkU7SUFDN0Usb0JBQW9CO0lBQ3BCLDZFQUE2RTtJQUVuRSw0QkFBNEIsQ0FDcEMsY0FBOEI7UUFFOUIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDbEQsdUJBQXVCLENBQUMsY0FBYyxDQUFDLENBQ3hDLENBQUM7UUFDRixJQUFJLGFBQWEsRUFBRTtZQUNqQixPQUFPLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUM5RDthQUFNO1lBQ0wsT0FBTyxFQUFFLENBQUM7U0FDWDtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpY3QsIG9iamVjdFZhbHVlcyB9IGZyb20gJ0BvcmJpdC91dGlscyc7XG5pbXBvcnQge1xuICBkZXNlcmlhbGl6ZVJlY29yZElkZW50aXR5LFxuICBJbml0aWFsaXplZFJlY29yZCxcbiAgUmVjb3JkSWRlbnRpdHksXG4gIHNlcmlhbGl6ZVJlY29yZElkZW50aXR5XG59IGZyb20gJ0BvcmJpdC9yZWNvcmRzJztcbmltcG9ydCB7IFJlY29yZENoYW5nZXNldCwgUmVjb3JkUmVsYXRpb25zaGlwSWRlbnRpdHkgfSBmcm9tICcuL3JlY29yZC1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBTeW5jUmVjb3JkQ2FjaGUsIFN5bmNSZWNvcmRDYWNoZVNldHRpbmdzIH0gZnJvbSAnLi9zeW5jLXJlY29yZC1jYWNoZSc7XG5pbXBvcnQgeyBSZWNvcmRUcmFuc2Zvcm1CdWZmZXIgfSBmcm9tICcuL3JlY29yZC10cmFuc2Zvcm0tYnVmZmVyJztcblxuZnVuY3Rpb24gc2VyaWFsaXplUmVjb3JkUmVsYXRpb25zaGlwSWRlbnRpdHkoXG4gIHJyaTogUmVjb3JkUmVsYXRpb25zaGlwSWRlbnRpdHlcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzZXJpYWxpemVSZWNvcmRJZGVudGl0eShycmkucmVjb3JkKX06OiR7cnJpLnJlbGF0aW9uc2hpcH1gO1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZVJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5KFxuICBycmk6IHN0cmluZ1xuKTogeyByZWNvcmQ6IFJlY29yZElkZW50aXR5OyByZWxhdGlvbnNoaXA6IHN0cmluZyB9IHtcbiAgY29uc3QgW3JlY29yZCwgcmVsYXRpb25zaGlwXSA9IHJyaS5zcGxpdCgnOjonKTtcbiAgcmV0dXJuIHsgcmVjb3JkOiBkZXNlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCksIHJlbGF0aW9uc2hpcCB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsZVJlY29yZFRyYW5zZm9ybUJ1ZmZlclN0YXRlIHtcbiAgcmVjb3JkczogRGljdDxJbml0aWFsaXplZFJlY29yZCB8IG51bGw+O1xuICBpbnZlcnNlUmVsYXRpb25zaGlwczogRGljdDxEaWN0PFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5IHwgbnVsbD4+O1xufVxuXG5leHBvcnQgY2xhc3MgU2ltcGxlUmVjb3JkVHJhbnNmb3JtQnVmZmVyXG4gIGV4dGVuZHMgU3luY1JlY29yZENhY2hlXG4gIGltcGxlbWVudHMgUmVjb3JkVHJhbnNmb3JtQnVmZmVyIHtcbiAgcHJvdGVjdGVkIF9zdGF0ZSE6IFNpbXBsZVJlY29yZFRyYW5zZm9ybUJ1ZmZlclN0YXRlO1xuICBwcm90ZWN0ZWQgX2RlbHRhPzogU2ltcGxlUmVjb3JkVHJhbnNmb3JtQnVmZmVyU3RhdGU7XG5cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IFN5bmNSZWNvcmRDYWNoZVNldHRpbmdzKSB7XG4gICAgc3VwZXIoc2V0dGluZ3MpO1xuICAgIHRoaXMucmVzZXRTdGF0ZSgpO1xuICB9XG5cbiAgcmVzZXRTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0ZSA9IHtcbiAgICAgIHJlY29yZHM6IHt9LFxuICAgICAgaW52ZXJzZVJlbGF0aW9uc2hpcHM6IHt9XG4gICAgfTtcbiAgfVxuXG4gIHN0YXJ0VHJhY2tpbmdDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuX2RlbHRhID0ge1xuICAgICAgcmVjb3Jkczoge30sXG4gICAgICBpbnZlcnNlUmVsYXRpb25zaGlwczoge31cbiAgICB9O1xuICB9XG5cbiAgc3RvcFRyYWNraW5nQ2hhbmdlcygpOiBSZWNvcmRDaGFuZ2VzZXQge1xuICAgIGlmICh0aGlzLl9kZWx0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDaGFuZ2VzIGFyZSBub3QgYmVpbmcgdHJhY2tlZC4gQ2FsbCAnc3RhcnRUcmFja2luZ0NoYW5nZXMnIGJlZm9yZSAnc3RvcFRyYWNraW5nQ2hhbmdlcydgXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCB7IHJlY29yZHMsIGludmVyc2VSZWxhdGlvbnNoaXBzIH0gPSB0aGlzLl9kZWx0YTtcbiAgICBsZXQgY2hhbmdlc2V0OiBSZWNvcmRDaGFuZ2VzZXQgPSB7fTtcblxuICAgIGZvciAobGV0IHJpZCBvZiBPYmplY3Qua2V5cyhyZWNvcmRzKSkge1xuICAgICAgbGV0IHJ2ID0gcmVjb3Jkc1tyaWRdO1xuICAgICAgaWYgKHJ2ID09PSBudWxsKSB7XG4gICAgICAgIGNoYW5nZXNldC5yZW1vdmVSZWNvcmRzID0gY2hhbmdlc2V0LnJlbW92ZVJlY29yZHMgPz8gW107XG4gICAgICAgIGNoYW5nZXNldC5yZW1vdmVSZWNvcmRzLnB1c2goZGVzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyaWQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoYW5nZXNldC5zZXRSZWNvcmRzID0gY2hhbmdlc2V0LnNldFJlY29yZHMgPz8gW107XG4gICAgICAgIGNoYW5nZXNldC5zZXRSZWNvcmRzLnB1c2gocnYpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IHJpZCBvZiBPYmplY3Qua2V5cyhpbnZlcnNlUmVsYXRpb25zaGlwcykpIHtcbiAgICAgIGxldCByZWxhdGVkUmVjb3JkID0gZGVzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyaWQpO1xuICAgICAgbGV0IHJlbHMgPSBpbnZlcnNlUmVsYXRpb25zaGlwc1tyaWRdO1xuICAgICAgZm9yIChsZXQgcmVsIG9mIE9iamVjdC5rZXlzKHJlbHMpKSB7XG4gICAgICAgIGxldCBydiA9IHJlbHNbcmVsXTtcbiAgICAgICAgbGV0IHsgcmVjb3JkLCByZWxhdGlvbnNoaXAgfSA9IGRlc2VyaWFsaXplUmVjb3JkUmVsYXRpb25zaGlwSWRlbnRpdHkoXG4gICAgICAgICAgcmVsXG4gICAgICAgICk7XG4gICAgICAgIGxldCBycmkgPSB7IHJlbGF0ZWRSZWNvcmQsIHJlY29yZCwgcmVsYXRpb25zaGlwIH07XG4gICAgICAgIGlmIChydiA9PT0gbnVsbCkge1xuICAgICAgICAgIGNoYW5nZXNldC5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwcyA9XG4gICAgICAgICAgICBjaGFuZ2VzZXQucmVtb3ZlSW52ZXJzZVJlbGF0aW9uc2hpcHMgPz8gW107XG4gICAgICAgICAgY2hhbmdlc2V0LnJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXBzLnB1c2gocnJpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VzZXQuYWRkSW52ZXJzZVJlbGF0aW9uc2hpcHMgPVxuICAgICAgICAgICAgY2hhbmdlc2V0LmFkZEludmVyc2VSZWxhdGlvbnNoaXBzID8/IFtdO1xuICAgICAgICAgIGNoYW5nZXNldC5hZGRJbnZlcnNlUmVsYXRpb25zaGlwcy5wdXNoKHJyaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9kZWx0YSA9IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiBjaGFuZ2VzZXQ7XG4gIH1cblxuICBnZXRSZWNvcmRTeW5jKGlkZW50aXR5OiBSZWNvcmRJZGVudGl0eSk6IEluaXRpYWxpemVkUmVjb3JkIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUucmVjb3Jkc1tzZXJpYWxpemVSZWNvcmRJZGVudGl0eShpZGVudGl0eSldID8/IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFJlY29yZHNTeW5jKFxuICAgIHR5cGVPcklkZW50aXRpZXM/OiBzdHJpbmcgfCBSZWNvcmRJZGVudGl0eVtdXG4gICk6IEluaXRpYWxpemVkUmVjb3JkW10ge1xuICAgIGlmICh0eXBlb2YgdHlwZU9ySWRlbnRpdGllcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBvYmplY3RWYWx1ZXModGhpcy5fc3RhdGUucmVjb3Jkc1t0eXBlT3JJZGVudGl0aWVzXSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHR5cGVPcklkZW50aXRpZXMpKSB7XG4gICAgICBjb25zdCByZWNvcmRzOiBJbml0aWFsaXplZFJlY29yZFtdID0gW107XG4gICAgICBjb25zdCBpZGVudGl0aWVzOiBSZWNvcmRJZGVudGl0eVtdID0gdHlwZU9ySWRlbnRpdGllcztcbiAgICAgIGZvciAobGV0IGkgb2YgaWRlbnRpdGllcykge1xuICAgICAgICBsZXQgcmVjb3JkID0gdGhpcy5nZXRSZWNvcmRTeW5jKGkpO1xuICAgICAgICBpZiAocmVjb3JkKSB7XG4gICAgICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZWNvcmRzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGVPcklkZW50aXRpZXMgbXVzdCBiZSBzcGVjaWZpZWQgaW4gZ2V0UmVjb3Jkc1N5bmMnKTtcbiAgICB9XG4gIH1cblxuICBzZXRSZWNvcmRTeW5jKHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0ZS5yZWNvcmRzW3NlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCldID0gcmVjb3JkO1xuICAgIGlmICh0aGlzLl9kZWx0YSkge1xuICAgICAgdGhpcy5fZGVsdGEucmVjb3Jkc1tzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyZWNvcmQpXSA9IHJlY29yZDtcbiAgICB9XG4gIH1cblxuICBzZXRSZWNvcmRzU3luYyhyZWNvcmRzOiBJbml0aWFsaXplZFJlY29yZFtdKTogdm9pZCB7XG4gICAgcmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQpID0+IHRoaXMuc2V0UmVjb3JkU3luYyhyZWNvcmQpKTtcbiAgfVxuXG4gIHJlbW92ZVJlY29yZFN5bmMoXG4gICAgcmVjb3JkSWRlbnRpdHk6IFJlY29yZElkZW50aXR5XG4gICk6IEluaXRpYWxpemVkUmVjb3JkIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmdldFJlY29yZFN5bmMocmVjb3JkSWRlbnRpdHkpO1xuICAgIGlmIChyZWNvcmQpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZS5yZWNvcmRzW3NlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCldO1xuICAgICAgaWYgKHRoaXMuX2RlbHRhKSB7XG4gICAgICAgIHRoaXMuX2RlbHRhLnJlY29yZHNbc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmVjb3JkKV0gPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICByZW1vdmVSZWNvcmRzU3luYyhyZWNvcmRJZGVudGl0aWVzOiBSZWNvcmRJZGVudGl0eVtdKTogSW5pdGlhbGl6ZWRSZWNvcmRbXSB7XG4gICAgY29uc3QgcmVjb3JkcyA9IFtdO1xuICAgIGZvciAobGV0IHJlY29yZElkZW50aXR5IG9mIHJlY29yZElkZW50aXRpZXMpIHtcbiAgICAgIGxldCByZWNvcmQgPSB0aGlzLmdldFJlY29yZFN5bmMocmVjb3JkSWRlbnRpdHkpO1xuICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXRlLnJlY29yZHNbc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmVjb3JkKV07XG4gICAgICAgIGlmICh0aGlzLl9kZWx0YSkge1xuICAgICAgICAgIHRoaXMuX2RlbHRhLnJlY29yZHNbc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmVjb3JkKV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHNTeW5jKFxuICAgIHJlY29yZElkZW50aXR5T3JJZGVudGl0aWVzOiBSZWNvcmRJZGVudGl0eSB8IFJlY29yZElkZW50aXR5W11cbiAgKTogUmVjb3JkUmVsYXRpb25zaGlwSWRlbnRpdHlbXSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjb3JkSWRlbnRpdHlPcklkZW50aXRpZXMpKSB7XG4gICAgICBsZXQgcmVsYXRpb25zaGlwczogUmVjb3JkUmVsYXRpb25zaGlwSWRlbnRpdHlbXSA9IFtdO1xuICAgICAgcmVjb3JkSWRlbnRpdHlPcklkZW50aXRpZXMuZm9yRWFjaCgocmVjb3JkKSA9PiB7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoKFxuICAgICAgICAgIHJlbGF0aW9uc2hpcHMsXG4gICAgICAgICAgdGhpcy5fZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHNTeW5jKHJlY29yZClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRJbnZlcnNlUmVsYXRpb25zaGlwc1N5bmMocmVjb3JkSWRlbnRpdHlPcklkZW50aXRpZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFkZEludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhcbiAgICByZWxhdGlvbnNoaXBzOiBSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eVtdXG4gICk6IHZvaWQge1xuICAgIGZvciAobGV0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByaSA9IHNlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlbGF0aW9uc2hpcC5yZWxhdGVkUmVjb3JkKTtcbiAgICAgIGNvbnN0IHJyaSA9IHNlcmlhbGl6ZVJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5KHJlbGF0aW9uc2hpcCk7XG4gICAgICBjb25zdCByZWxzID0gdGhpcy5fc3RhdGUuaW52ZXJzZVJlbGF0aW9uc2hpcHNbcmldID8/IHt9O1xuICAgICAgcmVsc1tycmldID0gcmVsYXRpb25zaGlwO1xuICAgICAgdGhpcy5fc3RhdGUuaW52ZXJzZVJlbGF0aW9uc2hpcHNbcmldID0gcmVscztcbiAgICAgIGlmICh0aGlzLl9kZWx0YSkge1xuICAgICAgICBjb25zdCByZWxzID0gdGhpcy5fZGVsdGEuaW52ZXJzZVJlbGF0aW9uc2hpcHNbcmldID8/IHt9O1xuICAgICAgICByZWxzW3JyaV0gPSByZWxhdGlvbnNoaXA7XG4gICAgICAgIHRoaXMuX2RlbHRhLmludmVyc2VSZWxhdGlvbnNoaXBzW3JpXSA9IHJlbHM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlSW52ZXJzZVJlbGF0aW9uc2hpcHNTeW5jKFxuICAgIHJlbGF0aW9uc2hpcHM6IFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5W11cbiAgKTogdm9pZCB7XG4gICAgZm9yIChsZXQgcmVsYXRpb25zaGlwIG9mIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGNvbnN0IHJpID0gc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmVsYXRpb25zaGlwLnJlbGF0ZWRSZWNvcmQpO1xuICAgICAgY29uc3QgcnJpID0gc2VyaWFsaXplUmVjb3JkUmVsYXRpb25zaGlwSWRlbnRpdHkocmVsYXRpb25zaGlwKTtcbiAgICAgIGNvbnN0IHJlbHMgPSB0aGlzLl9zdGF0ZS5pbnZlcnNlUmVsYXRpb25zaGlwc1tyaV07XG5cbiAgICAgIGlmIChyZWxzKSB7XG4gICAgICAgIHJlbHNbcnJpXSA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl9kZWx0YSkge1xuICAgICAgICAgIGNvbnN0IHJlbHMgPSB0aGlzLl9kZWx0YS5pbnZlcnNlUmVsYXRpb25zaGlwc1tyaV0gPz8ge307XG4gICAgICAgICAgcmVsc1tycmldID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIFByb3RlY3RlZCBtZXRob2RzXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgcHJvdGVjdGVkIF9nZXRJbnZlcnNlUmVsYXRpb25zaGlwc1N5bmMoXG4gICAgcmVjb3JkSWRlbnRpdHk6IFJlY29yZElkZW50aXR5XG4gICk6IFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5W10ge1xuICAgIGxldCByZWxhdGlvbnNoaXBzID0gdGhpcy5fc3RhdGUuaW52ZXJzZVJlbGF0aW9uc2hpcHNbXG4gICAgICBzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyZWNvcmRJZGVudGl0eSlcbiAgICBdO1xuICAgIGlmIChyZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gb2JqZWN0VmFsdWVzKHJlbGF0aW9uc2hpcHMpLmZpbHRlcigocikgPT4gciAhPT0gbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==