@orbit/record-cache
Version:
Orbit base classes used to access and maintain a set of records.
246 lines • 33.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SyncInverseTransformOperators = void 0;
const records_1 = require("@orbit/records");
const utils_1 = require("@orbit/utils");
exports.SyncInverseTransformOperators = {
addRecord(cache, operation,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
options) {
const op = operation;
const { type, id } = op.record;
const current = cache.getRecordSync(op.record);
if (current) {
if ((0, utils_1.eq)(current, op.record)) {
return;
}
else {
return {
op: 'updateRecord',
record: current
};
}
}
else {
return {
op: 'removeRecord',
record: { type, id }
};
}
},
updateRecord(cache, operation, options) {
const op = operation;
const currentRecord = cache.getRecordSync(op.record);
const replacement = op.record;
const { type, id } = replacement;
if (currentRecord) {
let result = { type, id };
let changed = false;
['attributes', 'keys'].forEach((grouping) => {
if (replacement[grouping]) {
Object.keys(replacement[grouping]).forEach((field) => {
let value = replacement[grouping][field];
let currentValue = (0, utils_1.deepGet)(currentRecord, [grouping, field]);
if (!(0, utils_1.eq)(value, currentValue)) {
changed = true;
(0, utils_1.deepSet)(result, [grouping, field], currentValue === undefined ? null : currentValue);
}
});
}
});
if (replacement.relationships) {
Object.keys(replacement.relationships).forEach((field) => {
let data = (0, utils_1.deepGet)(replacement, ['relationships', field, 'data']);
if (data !== undefined) {
let currentData = (0, utils_1.deepGet)(currentRecord, [
'relationships',
field,
'data'
]);
let relationshipChanged;
if (Array.isArray(data)) {
if (currentData) {
relationshipChanged = !(0, records_1.equalRecordIdentitySets)(currentData, data);
}
else {
relationshipChanged = true;
currentData = [];
}
}
else {
if (currentData) {
relationshipChanged = !(0, records_1.equalRecordIdentities)(currentData, data);
}
else {
relationshipChanged = true;
currentData = null;
}
}
if (relationshipChanged) {
changed = true;
(0, utils_1.deepSet)(result, ['relationships', field, 'data'], currentData);
}
}
});
}
if (changed) {
return {
op: 'updateRecord',
record: result
};
}
}
else {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new records_1.RecordNotFoundException(type, id);
}
else {
return {
op: 'removeRecord',
record: { type, id }
};
}
}
},
removeRecord(cache, operation, options) {
const op = operation;
const { record } = op;
const currentRecord = cache.getRecordSync(record);
if (currentRecord) {
return {
op: 'addRecord',
record: currentRecord
};
}
else {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new records_1.RecordNotFoundException(record.type, record.id);
}
}
},
replaceKey(cache, operation, options) {
const op = operation;
const { record, key } = op;
const currentRecord = cache.getRecordSync(record);
if (currentRecord === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new records_1.RecordNotFoundException(record.type, record.id);
}
}
const currentValue = currentRecord && (0, utils_1.deepGet)(currentRecord, ['keys', key]);
if (!(0, utils_1.eq)(currentValue, op.value)) {
const { type, id } = record;
return {
op: 'replaceKey',
record: { type, id },
key,
value: currentValue
};
}
},
replaceAttribute(cache, operation, options) {
const op = operation;
const { record, attribute } = op;
const currentRecord = cache.getRecordSync(record);
if (currentRecord === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new records_1.RecordNotFoundException(record.type, record.id);
}
}
const currentValue = currentRecord && (0, utils_1.deepGet)(currentRecord, ['attributes', attribute]);
if (!(0, utils_1.eq)(currentValue, op.value)) {
const { type, id } = record;
return {
op: 'replaceAttribute',
record: { type, id },
attribute,
value: currentValue
};
}
},
addToRelatedRecords(cache, operation, options) {
const op = operation;
const { record, relationship, relatedRecord } = op;
const currentRelatedRecords = cache.getRelatedRecordsSync(record, relationship);
if (currentRelatedRecords === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
if (cache.getRecordSync(record) === undefined) {
throw new records_1.RecordNotFoundException(record.type, record.id);
}
}
}
if (currentRelatedRecords === undefined ||
!(0, records_1.recordsInclude)(currentRelatedRecords, relatedRecord)) {
return {
op: 'removeFromRelatedRecords',
record,
relationship,
relatedRecord
};
}
},
removeFromRelatedRecords(cache, operation, options) {
const op = operation;
const { record, relationship, relatedRecord } = op;
const currentRelatedRecords = cache.getRelatedRecordsSync(record, relationship);
if (currentRelatedRecords === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
if (cache.getRecordSync(record) === undefined) {
throw new records_1.RecordNotFoundException(record.type, record.id);
}
}
}
if (currentRelatedRecords !== undefined &&
(0, records_1.recordsInclude)(currentRelatedRecords, relatedRecord)) {
return {
op: 'addToRelatedRecords',
record,
relationship,
relatedRecord
};
}
},
replaceRelatedRecords(cache, operation, options) {
const op = operation;
const { record, relationship, relatedRecords } = op;
const currentRelatedRecords = cache.getRelatedRecordsSync(record, relationship);
if (currentRelatedRecords === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
if (cache.getRecordSync(record) === undefined) {
throw new records_1.RecordNotFoundException(record.type, record.id);
}
}
}
if (currentRelatedRecords === undefined ||
!(0, records_1.equalRecordIdentitySets)(currentRelatedRecords, relatedRecords)) {
return {
op: 'replaceRelatedRecords',
record,
relationship,
relatedRecords: currentRelatedRecords || []
};
}
},
replaceRelatedRecord(cache, operation, options) {
const op = operation;
const { record, relationship, relatedRecord } = op;
const currentRelatedRecord = cache.getRelatedRecordSync(record, relationship);
if (currentRelatedRecord === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
if (cache.getRecordSync(record) === undefined) {
throw new records_1.RecordNotFoundException(record.type, record.id);
}
}
}
if (currentRelatedRecord === undefined ||
!(0, records_1.equalRecordIdentities)(currentRelatedRecord, relatedRecord)) {
return {
op: 'replaceRelatedRecord',
record,
relationship,
relatedRecord: currentRelatedRecord || null
};
}
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1pbnZlcnNlLXRyYW5zZm9ybS1vcGVyYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3BlcmF0b3JzL3N5bmMtaW52ZXJzZS10cmFuc2Zvcm0tb3BlcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDRDQWlCd0I7QUFDeEIsd0NBQTBEO0FBVzdDLFFBQUEsNkJBQTZCLEdBQXVDO0lBQy9FLFNBQVMsQ0FDUCxLQUF5QixFQUN6QixTQUEwQjtJQUMxQiw2REFBNkQ7SUFDN0QsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLEdBQUcsU0FBK0IsQ0FBQztRQUMzQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0MsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLElBQUEsVUFBRSxFQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzFCLE9BQU87YUFDUjtpQkFBTTtnQkFDTCxPQUFPO29CQUNMLEVBQUUsRUFBRSxjQUFjO29CQUNsQixNQUFNLEVBQUUsT0FBTztpQkFDaEIsQ0FBQzthQUNIO1NBQ0Y7YUFBTTtZQUNMLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLGNBQWM7Z0JBQ2xCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7YUFDckIsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FDVixLQUF5QixFQUN6QixTQUEwQixFQUMxQixPQUF3QjtRQUV4QixNQUFNLEVBQUUsR0FBRyxTQUFrQyxDQUFDO1FBQzlDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFzQixFQUFFLENBQUMs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QUUsb0JBQW9CLElBQUksSUFBSTthQUM1QyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnQG9yYml0L2RhdGEnO1xuaW1wb3J0IHtcbiAgQWRkUmVjb3JkT3BlcmF0aW9uLFxuICBBZGRUb1JlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uLFxuICBlcXVhbFJlY29yZElkZW50aXRpZXMsXG4gIGVxdWFsUmVjb3JkSWRlbnRpdHlTZXRzLFxuICBJbml0aWFsaXplZFJlY29yZCxcbiAgUmVjb3JkSWRlbnRpdHksXG4gIFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uLFxuICBSZWNvcmRPcGVyYXRpb24sXG4gIHJlY29yZHNJbmNsdWRlLFxuICBSZW1vdmVGcm9tUmVsYXRlZFJlY29yZHNPcGVyYXRpb24sXG4gIFJlbW92ZVJlY29yZE9wZXJhdGlvbixcbiAgUmVwbGFjZUF0dHJpYnV0ZU9wZXJhdGlvbixcbiAgUmVwbGFjZUtleU9wZXJhdGlvbixcbiAgUmVwbGFjZVJlbGF0ZWRSZWNvcmRPcGVyYXRpb24sXG4gIFJlcGxhY2VSZWxhdGVkUmVjb3Jkc09wZXJhdGlvbixcbiAgVXBkYXRlUmVjb3JkT3BlcmF0aW9uXG59IGZyb20gJ0BvcmJpdC9yZWNvcmRzJztcbmltcG9ydCB7IGRlZXBHZXQsIGRlZXBTZXQsIERpY3QsIGVxIH0gZnJvbSAnQG9yYml0L3V0aWxzJztcbmltcG9ydCB7IFN5bmNSZWNvcmRBY2Nlc3NvciB9IGZyb20gJy4uL3JlY29yZC1hY2Nlc3Nvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3luY0ludmVyc2VUcmFuc2Zvcm1PcGVyYXRvciB7XG4gIChcbiAgICBjYWNoZTogU3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBSZWNvcmRPcGVyYXRpb24gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBTeW5jSW52ZXJzZVRyYW5zZm9ybU9wZXJhdG9yczogRGljdDxTeW5jSW52ZXJzZVRyYW5zZm9ybU9wZXJhdG9yPiA9IHtcbiAgYWRkUmVjb3JkKFxuICAgIGNhY2hlOiBTeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBSZWNvcmRPcGVyYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIEFkZFJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHR5cGUsIGlkIH0gPSBvcC5yZWNvcmQ7XG4gICAgY29uc3QgY3VycmVudCA9IGNhY2hlLmdldFJlY29yZFN5bmMob3AucmVjb3JkKTtcblxuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICBpZiAoZXEoY3VycmVudCwgb3AucmVjb3JkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9wOiAndXBkYXRlUmVjb3JkJyxcbiAgICAgICAgICByZWNvcmQ6IGN1cnJlbnRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3A6ICdyZW1vdmVSZWNvcmQnLFxuICAgICAgICByZWNvcmQ6IHsgdHlwZSwgaWQgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgdXBkYXRlUmVjb3JkKFxuICAgIGNhY2hlOiBTeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24gYXMgVXBkYXRlUmVjb3JkT3BlcmF0aW9uO1xuICAgIGNvbnN0IGN1cnJlbnRSZWNvcmQgPSBjYWNoZS5nZXRSZWNvcmRTeW5jKG9wLnJlY29yZCk7XG4gICAgY29uc3QgcmVwbGFjZW1lbnQ6IEluaXRpYWxpemVkUmVjb3JkID0gb3AucmVjb3JkO1xuICAgIGNvbnN0IHsgdHlwZSwgaWQgfSA9IHJlcGxhY2VtZW50O1xuXG4gICAgaWYgKGN1cnJlbnRSZWNvcmQpIHtcbiAgICAgIGxldCByZXN1bHQgPSB7IHR5cGUsIGlkIH07XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICBbJ2F0dHJpYnV0ZXMnLCAna2V5cyddLmZvckVhY2goKGdyb3VwaW5nKSA9PiB7XG4gICAgICAgIGlmICgocmVwbGFjZW1lbnQgYXMgYW55KVtncm91cGluZ10pIHtcbiAgICAgICAgICBPYmplY3Qua2V5cygocmVwbGFjZW1lbnQgYXMgYW55KVtncm91cGluZ10pLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSAocmVwbGFjZW1lbnQgYXMgYW55KVtncm91cGluZ11bZmllbGRdO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRWYWx1ZSA9IGRlZXBHZXQoY3VycmVudFJlY29yZCwgW2dyb3VwaW5nLCBmaWVsZF0pO1xuICAgICAgICAgICAgaWYgKCFlcSh2YWx1ZSwgY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZGVlcFNldChcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgW2dyb3VwaW5nLCBmaWVsZF0sXG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VycmVudFZhbHVlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVwbGFjZW1lbnQucmVsYXRpb25zaGlwcykge1xuICAgICAgICBPYmplY3Qua2V5cyhyZXBsYWNlbWVudC5yZWxhdGlvbnNoaXBzKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIGxldCBkYXRhID0gZGVlcEdldChyZXBsYWNlbWVudCwgWydyZWxhdGlvbnNoaXBzJywgZmllbGQsICdkYXRhJ10pO1xuICAgICAgICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50RGF0YSA9IGRlZXBHZXQoY3VycmVudFJlY29yZCwgW1xuICAgICAgICAgICAgICAncmVsYXRpb25zaGlwcycsXG4gICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAnZGF0YSdcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgbGV0IHJlbGF0aW9uc2hpcENoYW5nZWQ7XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50RGF0YSkge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcENoYW5nZWQgPSAhZXF1YWxSZWNvcmRJZGVudGl0eVNldHMoXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YSxcbiAgICAgICAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhID0gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50RGF0YSkge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcENoYW5nZWQgPSAhZXF1YWxSZWNvcmRJZGVudGl0aWVzKGN1cnJlbnREYXRhLCBkYXRhKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0YSA9IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGRlZXBTZXQocmVzdWx0LCBbJ3JlbGF0aW9uc2hpcHMnLCBmaWVsZCwgJ2RhdGEnXSwgY3VycmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb3A6ICd1cGRhdGVSZWNvcmQnLFxuICAgICAgICAgIHJlY29yZDogcmVzdWx0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24odHlwZSwgaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcDogJ3JlbW92ZVJlY29yZCcsXG4gICAgICAgICAgcmVjb3JkOiB7IHR5cGUsIGlkIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcmVtb3ZlUmVjb3JkKFxuICAgIGNhY2hlOiBTeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24gYXMgUmVtb3ZlUmVjb3JkT3BlcmF0aW9uO1xuICAgIGNvbnN0IHsgcmVjb3JkIH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gY2FjaGUuZ2V0UmVjb3JkU3luYyhyZWNvcmQpO1xuXG4gICAgaWYgKGN1cnJlbnRSZWNvcmQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wOiAnYWRkUmVjb3JkJyxcbiAgICAgICAgcmVjb3JkOiBjdXJyZW50UmVjb3JkXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICByZXBsYWNlS2V5KFxuICAgIGNhY2hlOiBTeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFJlY29yZE9wZXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24gYXMgUmVwbGFjZUtleU9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwga2V5IH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gY2FjaGUuZ2V0UmVjb3JkU3luYyhyZWNvcmQpO1xuXG4gICAgaWYgKGN1cnJlbnRSZWNvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjdXJyZW50UmVjb3JkICYmIGRlZXBHZXQoY3VycmVudFJlY29yZCwgWydrZXlzJywga2V5XSk7XG5cbiAgICBpZiAoIWVxKGN1cnJlbnRWYWx1ZSwgb3AudmFsdWUpKSB7XG4gICAgICBjb25zdCB7IHR5cGUsIGlkIH0gPSByZWNvcmQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wOiAncmVwbGFjZUtleScsXG4gICAgICAgIHJlY29yZDogeyB0eXBlLCBpZCB9LFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiBjdXJyZW50VmFsdWVcbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIHJlcGxhY2VBdHRyaWJ1dGUoXG4gICAgY2FjaGU6IFN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUmVjb3JkT3BlcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBSZXBsYWNlQXR0cmlidXRlT3BlcmF0aW9uO1xuICAgIGNvbnN0IHsgcmVjb3JkLCBhdHRyaWJ1dGUgfSA9IG9wO1xuICAgIGNvbnN0IGN1cnJlbnRSZWNvcmQgPSBjYWNoZS5nZXRSZWNvcmRTeW5jKHJlY29yZCk7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9XG4gICAgICBjdXJyZW50UmVjb3JkICYmIGRlZXBHZXQoY3VycmVudFJlY29yZCwgWydhdHRyaWJ1dGVzJywgYXR0cmlidXRlXSk7XG5cbiAgICBpZiAoIWVxKGN1cnJlbnRWYWx1ZSwgb3AudmFsdWUpKSB7XG4gICAgICBjb25zdCB7IHR5cGUsIGlkIH0gPSByZWNvcmQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wOiAncmVwbGFjZUF0dHJpYnV0ZScsXG4gICAgICAgIHJlY29yZDogeyB0eXBlLCBpZCB9LFxuICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgIHZhbHVlOiBjdXJyZW50VmFsdWVcbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIGFkZFRvUmVsYXRlZFJlY29yZHMoXG4gICAgY2FjaGU6IFN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUmVjb3JkT3BlcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBBZGRUb1JlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uO1xuICAgIGNvbnN0IHsgcmVjb3JkLCByZWxhdGlvbnNoaXAsIHJlbGF0ZWRSZWNvcmQgfSA9IG9wO1xuICAgIGNvbnN0IGN1cnJlbnRSZWxhdGVkUmVjb3JkcyA9IGNhY2hlLmdldFJlbGF0ZWRSZWNvcmRzU3luYyhcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcFxuICAgICk7XG5cbiAgICBpZiAoY3VycmVudFJlbGF0ZWRSZWNvcmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICBpZiAoY2FjaGUuZ2V0UmVjb3JkU3luYyhyZWNvcmQpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjdXJyZW50UmVsYXRlZFJlY29yZHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIXJlY29yZHNJbmNsdWRlKGN1cnJlbnRSZWxhdGVkUmVjb3JkcywgcmVsYXRlZFJlY29yZClcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wOiAncmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzJyxcbiAgICAgICAgcmVjb3JkLFxuICAgICAgICByZWxhdGlvbnNoaXAsXG4gICAgICAgIHJlbGF0ZWRSZWNvcmRcbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIHJlbW92ZUZyb21SZWxhdGVkUmVjb3JkcyhcbiAgICBjYWNoZTogU3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBSZWNvcmRPcGVyYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlbW92ZUZyb21SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkIH0gPSBvcDtcbiAgICBjb25zdCBjdXJyZW50UmVsYXRlZFJlY29yZHMgPSBjYWNoZS5nZXRSZWxhdGVkUmVjb3Jkc1N5bmMoXG4gICAgICByZWNvcmQsXG4gICAgICByZWxhdGlvbnNoaXBcbiAgICApO1xuXG4gICAgaWYgKGN1cnJlbnRSZWxhdGVkUmVjb3JkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgaWYgKGNhY2hlLmdldFJlY29yZFN5bmMocmVjb3JkKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY3VycmVudFJlbGF0ZWRSZWNvcmRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlY29yZHNJbmNsdWRlKGN1cnJlbnRSZWxhdGVkUmVjb3JkcywgcmVsYXRlZFJlY29yZClcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wOiAnYWRkVG9SZWxhdGVkUmVjb3JkcycsXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgICByZWxhdGVkUmVjb3JkXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICByZXBsYWNlUmVsYXRlZFJlY29yZHMoXG4gICAgY2FjaGU6IFN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUmVjb3JkT3BlcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBSZXBsYWNlUmVsYXRlZFJlY29yZHNPcGVyYXRpb247XG4gICAgY29uc3QgeyByZWNvcmQsIHJlbGF0aW9uc2hpcCwgcmVsYXRlZFJlY29yZHMgfSA9IG9wO1xuICAgIGNvbnN0IGN1cnJlbnRSZWxhdGVkUmVjb3JkcyA9IGNhY2hlLmdldFJlbGF0ZWRSZWNvcmRzU3luYyhcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcFxuICAgICk7XG5cbiAgICBpZiAoY3VycmVudFJlbGF0ZWRSZWNvcmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICBpZiAoY2FjaGUuZ2V0UmVjb3JkU3luYyhyZWNvcmQpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjdXJyZW50UmVsYXRlZFJlY29yZHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIWVxdWFsUmVjb3JkSWRlbnRpdHlTZXRzKGN1cnJlbnRSZWxhdGVkUmVjb3JkcywgcmVsYXRlZFJlY29yZHMpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcDogJ3JlcGxhY2VSZWxhdGVkUmVjb3JkcycsXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgICByZWxhdGVkUmVjb3JkczogY3VycmVudFJlbGF0ZWRSZWNvcmRzIHx8IFtdXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICByZXBsYWNlUmVsYXRlZFJlY29yZChcbiAgICBjYWNoZTogU3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBSZWNvcmRPcGVyYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlcGxhY2VSZWxhdGVkUmVjb3JkT3BlcmF0aW9uO1xuICAgIGNvbnN0IHsgcmVjb3JkLCByZWxhdGlvbnNoaXAsIHJlbGF0ZWRSZWNvcmQgfSA9IG9wO1xuICAgIGNvbnN0IGN1cnJlbnRSZWxhdGVkUmVjb3JkID0gY2FjaGUuZ2V0UmVsYXRlZFJlY29yZFN5bmMoXG4gICAgICByZWNvcmQsXG4gICAgICByZWxhdGlvbnNoaXBcbiAgICApO1xuXG4gICAgaWYgKGN1cnJlbnRSZWxhdGVkUmVjb3JkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICBpZiAoY2FjaGUuZ2V0UmVjb3JkU3luYyhyZWNvcmQpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjdXJyZW50UmVsYXRlZFJlY29yZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhZXF1YWxSZWNvcmRJZGVudGl0aWVzKFxuICAgICAgICBjdXJyZW50UmVsYXRlZFJlY29yZCBhcyBSZWNvcmRJZGVudGl0eSxcbiAgICAgICAgcmVsYXRlZFJlY29yZCBhcyBSZWNvcmRJZGVudGl0eVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3A6ICdyZXBsYWNlUmVsYXRlZFJlY29yZCcsXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgICByZWxhdGVkUmVjb3JkOiBjdXJyZW50UmVsYXRlZFJlY29yZCB8fCBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcbiJdfQ==