pretur.clay
Version:
Client-side immutability helper
182 lines • 26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var Set_1 = require("./Set");
var clay_1 = require("./clay");
function buildApplyMutations(requester) {
return function (mutations) { return applyMutations(requester, mutations); };
}
exports.buildApplyMutations = buildApplyMutations;
function applyMutations(requester, mutations) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var promises, _i, mutations_1, mutation, results, applied, _a, results_1, result;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
if (mutations.length === 0) {
return [2 /*return*/, { results: [], applied: false }];
}
requester.batchMutateStart();
promises = [];
for (_i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) {
mutation = mutations_1[_i];
if (mutation.type !== 'mutate') {
continue;
}
switch (mutation.action) {
case 'insert':
promises.push(requester.insert(mutation));
break;
case 'update':
promises.push(requester.update(mutation));
break;
case 'remove':
promises.push(requester.remove(mutation));
break;
}
}
requester.batchMutateEnd();
return [4 /*yield*/, Promise.all(promises)];
case 1:
results = _b.sent();
applied = true;
for (_a = 0, results_1 = results; _a < results_1.length; _a++) {
result = results_1[_a];
if (result.errors.length > 0) {
applied = false;
break;
}
}
return [2 /*return*/, { results: results, applied: applied }];
}
});
});
}
exports.applyMutations = applyMutations;
function buildMutationsExtractor(specPool) {
function extractInsertData(clay, scope, model) {
if (clay instanceof Set_1.Set) {
var items = [];
for (var _i = 0, _a = clay.items; _i < _a.length; _i++) {
var item = _a[_i];
items.push(extractInsertData(item, scope, model));
}
return items;
}
var data = {};
var spec = specPool[scope][model];
var nonAutoIncrementedAttributes = spec.attributes
.filter(function (attrib) { return !attrib.autoIncrement; })
.map(function (attrib) { return attrib.name; });
for (var _b = 0, nonAutoIncrementedAttributes_1 = nonAutoIncrementedAttributes; _b < nonAutoIncrementedAttributes_1.length; _b++) {
var attribute = nonAutoIncrementedAttributes_1[_b];
var value = clay.fields[attribute];
if (value) {
data[attribute] = clay_1.toPlain(value);
}
}
var targetRelations = spec.relations
.filter(function (_a) {
var type = _a.type;
return type === 'SUBCLASS' ||
type === 'MASTER' ||
type === 'DETAIL' ||
type === 'MANY_TO_MANY' ||
type === 'INJECTIVE';
});
for (var _c = 0, targetRelations_1 = targetRelations; _c < targetRelations_1.length; _c++) {
var relation = targetRelations_1[_c];
if (clay.fields[relation.alias]) {
data[relation.alias] = extractInsertData(clay.fields[relation.alias], relation.target.scope, relation.target.model);
}
}
return data;
}
function extractUpdateData(record, scope, model) {
var spec = specPool[scope][model];
var primaries = spec.attributes.filter(function (attrib) { return attrib.primary; }).map(function (attrib) { return attrib.name; });
var data = {};
for (var _i = 0, primaries_1 = primaries; _i < primaries_1.length; _i++) {
var primary = primaries_1[_i];
data[primary] = clay_1.toPlain(record.fields[primary]);
}
var mutables = spec.attributes
.filter(function (attrib) { return attrib.mutable; })
.map(function (attrib) { return attrib.name; });
for (var _a = 0, mutables_1 = mutables; _a < mutables_1.length; _a++) {
var mutable = mutables_1[_a];
var attribute = record.fields[mutable];
if (attribute && attribute.modified) {
data[mutable] = clay_1.toPlain(attribute);
}
}
return data;
}
function extractRemoveIdentifiers(record, scope, model) {
var spec = specPool[scope][model];
var primaries = spec.attributes.filter(function (attrib) { return attrib.primary; }).map(function (attrib) { return attrib.name; });
var identifiers = {};
for (var _i = 0, primaries_2 = primaries; _i < primaries_2.length; _i++) {
var primary = primaries_2[_i];
identifiers[primary] = clay_1.toPlain(record.fields[primary]);
}
return identifiers;
}
function getMutations(clay, scope, model) {
var requests = [];
var spec = specPool[scope][model];
if (clay instanceof Set_1.Set) {
for (var _i = 0, _a = clay.items; _i < _a.length; _i++) {
var item = _a[_i];
requests.push.apply(requests, getMutations(item, scope, model));
}
}
else {
if (clay.state === 'removed') {
requests.push({
action: 'remove',
identifiers: extractRemoveIdentifiers(clay, scope, model),
scope: scope,
model: model,
type: 'mutate',
});
}
else if (clay.state === 'new') {
requests.push({
action: 'insert',
data: extractInsertData(clay, scope, model),
scope: scope,
model: model,
type: 'mutate',
});
}
else {
var updates = extractUpdateData(clay, scope, model);
if (Object.keys(updates).length > 1) {
requests.push({
scope: scope,
model: model,
data: updates,
action: 'update',
type: 'mutate',
});
}
for (var _b = 0, _c = spec.relations; _b < _c.length; _b++) {
var relation = _c[_b];
if (clay.fields[relation.alias]) {
requests.push.apply(requests, getMutations(clay.fields[relation.alias], relation.target.scope, relation.target.model));
}
}
}
}
return requests;
}
return {
extractInsertData: extractInsertData,
extractRemoveIdentifiers: extractRemoveIdentifiers,
extractUpdateData: extractUpdateData,
getMutations: getMutations,
};
}
exports.buildMutationsExtractor = buildMutationsExtractor;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0YXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL211dGF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSw2QkFBNEI7QUFFNUIsK0JBQWlDO0FBT2pDLDZCQUNFLFNBQW9CO0lBRXBCLE1BQU0sQ0FBQyxVQUFBLFNBQVMsSUFBSSxPQUFBLGNBQWMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQXBDLENBQW9DLENBQUM7QUFDM0QsQ0FBQztBQUpELGtEQUlDO0FBRUQsd0JBQ0UsU0FBb0IsRUFDcEIsU0FBK0I7Ozs7OztvQkFFL0IsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMzQixNQUFNLGdCQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUM7b0JBQ3pDLENBQUM7b0JBRUQsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBRXZCLFFBQVEsR0FBaUMsRUFBRSxDQUFDO29CQUVsRCxHQUFHLENBQUMsT0FBNEIsRUFBVCx1QkFBUyxFQUFULHVCQUFTLEVBQVQsSUFBUzt3QkFBckIsUUFBUTt3QkFDakIsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDOzRCQUMvQixRQUFRLENBQUM7d0JBQ1gsQ0FBQzt3QkFFRCxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs0QkFDeEIsS0FBSyxRQUFRO2dDQUNYLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBTSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dDQUMvQyxLQUFLLENBQUM7NEJBQ1IsS0FBSyxRQUFRO2dDQUNYLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBTSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dDQUMvQyxLQUFLLENB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QyxDQUFDLENBQUMsQ0FBQztvQkFDcEMsUUFBUSxDQUFDLElBQUksQ0FBbUI7d0JBQzlCLEtBQUssT0FBQTt3QkFDTCxLQUFLLE9BQUE7d0JBQ0wsSUFBSSxFQUFFLE9BQU87d0JBQ2IsTUFBTSxFQUFFLFFBQVE7d0JBQ2hCLElBQUksRUFBRSxRQUFRO3FCQUNmLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUVELEdBQUcsQ0FBQyxDQUFtQixVQUFjLEVBQWQsS0FBQSxJQUFJLENBQUMsU0FBUyxFQUFkLGNBQWMsRUFBZCxJQUFjO29CQUFoQyxJQUFNLFFBQVEsU0FBQTtvQkFDakIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNoQyxRQUFRLENBQUMsSUFBSSxPQUFiLFFBQVEsRUFBUyxZQUFZLENBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUMzQixRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFDckIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ3RCLEVBQUU7b0JBQ0wsQ0FBQztpQkFDRjtZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDO1FBQ0wsaUJBQWlCLG1CQUFBO1FBQ2pCLHdCQUF3QiwwQkFBQTtRQUN4QixpQkFBaUIsbUJBQUE7UUFDakIsWUFBWSxjQUFBO0tBQ2IsQ0FBQztBQUNKLENBQUM7QUE3S0QsMERBNktDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BlY1R5cGUsIE1vZGVsLCBTcGVjUG9vbCB9IGZyb20gJ3ByZXR1ci5zcGVjJztcclxuaW1wb3J0IHsgTXV0YXRlUmVxdWVzdCwgUmVxdWVzdGVyLCBNdXRhdGVSZXN1bHQgfSBmcm9tICdwcmV0dXIuc3luYyc7XHJcbmltcG9ydCB7IFNldCB9IGZyb20gJy4vU2V0JztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi9SZWNvcmQnO1xyXG5pbXBvcnQgeyB0b1BsYWluIH0gZnJvbSAnLi9jbGF5JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlNdXRhdGlvbnNSZXN1bHQge1xyXG4gIHJlc3VsdHM6IE11dGF0ZVJlc3VsdDxhbnk+W107XHJcbiAgYXBwbGllZDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXBwbHlNdXRhdGlvbnMoXHJcbiAgcmVxdWVzdGVyOiBSZXF1ZXN0ZXIsXHJcbik6IChtdXRhdGlvbnM6IE11dGF0ZVJlcXVlc3Q8YW55PltdKSA9PiBQcm9taXNlPEFwcGx5TXV0YXRpb25zUmVzdWx0PiB7XHJcbiAgcmV0dXJuIG11dGF0aW9ucyA9PiBhcHBseU11dGF0aW9ucyhyZXF1ZXN0ZXIsIG11dGF0aW9ucyk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU11dGF0aW9ucyhcclxuICByZXF1ZXN0ZXI6IFJlcXVlc3RlcixcclxuICBtdXRhdGlvbnM6IE11dGF0ZVJlcXVlc3Q8YW55PltdLFxyXG4pOiBQcm9taXNlPEFwcGx5TXV0YXRpb25zUmVzdWx0PiB7XHJcbiAgaWYgKG11dGF0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiB7IHJlc3VsdHM6IFtdLCBhcHBsaWVkOiBmYWxzZSB9O1xyXG4gIH1cclxuXHJcbiAgcmVxdWVzdGVyLmJhdGNoTXV0YXRlU3RhcnQoKTtcclxuXHJcbiAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8TXV0YXRlUmVzdWx0PGFueT4+W10gPSBbXTtcclxuXHJcbiAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMpIHtcclxuICAgIGlmIChtdXRhdGlvbi50eXBlICE9PSAnbXV0YXRlJykge1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKG11dGF0aW9uLmFjdGlvbikge1xyXG4gICAgICBjYXNlICdpbnNlcnQnOlxyXG4gICAgICAgIHByb21pc2VzLnB1c2gocmVxdWVzdGVyLmluc2VydDxhbnk+KG11dGF0aW9uKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3VwZGF0ZSc6XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChyZXF1ZXN0ZXIudXBkYXRlPGFueT4obXV0YXRpb24pKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmVtb3ZlJzpcclxuICAgICAgICBwcm9taXNlcy5wdXNoKHJlcXVlc3Rlci5yZW1vdmU8YW55PihtdXRhdGlvbikpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVxdWVzdGVyLmJhdGNoTXV0YXRlRW5kKCk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XHJcbiAgbGV0IGFwcGxpZWQgPSB0cnVlO1xyXG5cclxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XHJcbiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFwcGxpZWQgPSBmYWxzZTtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyByZXN1bHRzLCBhcHBsaWVkIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTXV0YXRpb25zRXh0cmFjdG9yIHtcclxuICBleHRyYWN0SW5zZXJ0RGF0YTxUIGV4dGVuZHMgU3BlY1R5cGU+KFxyXG4gICAgY2xheTogUmVjb3JkPFQ+LFxyXG4gICAgc2NvcGU6IHN0cmluZyxcclxuICAgIG1vZGVsOiBUWyduYW1lJ10sXHJcbiAgKTogUGFydGlhbDxNb2RlbDxUPj47XHJcbiAgZXh0cmFjdEluc2VydERhdGE8VCBleHRlbmRzIFNwZWNUeXBlPihcclxuICAgIGNsYXk6IFNldDxUPixcclxuICAgIHNjb3BlOiBzdHJpbmcsXHJcbiAgICBtb2RlbDogVFsnbmFtZSddLFxyXG4gICk6IFBhcnRpYWw8TW9kZWw8VD4+W107XHJcblxyXG4gIGV4dHJhY3RVcGRhdGVEYXRhPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICByZWNvcmQ6IFJlY29yZDxUPixcclxuICAgIHNjb3BlOiBzdHJpbmcsXHJcbiAgICBtb2RlbDogVFsnbmFtZSddLFxyXG4gICk6IFBhcnRpYWw8VFsnZmllbGRzJ10+O1xyXG5cclxuICBleHRyYWN0UmVtb3ZlSWRlbnRpZmllcnM8VCBleHRlbmRzIFNwZWNUeXBlPihcclxuICAgIHJlY29yZDogUmVjb3JkPFQ+LFxyXG4gICAgc2NvcGU6IHN0cmluZyxcclxuICAgIG1vZGVsOiBUWyduYW1lJ10sXHJcbiAgKTogUGFydGlhbDxUWydmaWVsZHMnXT47XHJcblxyXG4gIGdldE11dGF0aW9uczxUIGV4dGVuZHMgU3BlY1R5cGU+KFxyXG4gICAgY2xheTogU2V0PFQ+IHwgUmVjb3JkPFQ+LFxyXG4gICAgc2NvcGU6IHN0cmluZyxcclxuICAgIG1vZGVsOiBUWyduYW1lJ10sXHJcbiAgKTogTXV0YXRlUmVxdWVzdDxhbnk+W107XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZE11dGF0aW9uc0V4dHJhY3RvcihcclxuICBzcGVjUG9vbDogU3BlY1Bvb2wsXHJcbik6IE11dGF0aW9uc0V4dHJhY3RvciB7XHJcbiAgZnVuY3Rpb24gZXh0cmFjdEluc2VydERhdGE8VCBleHRlbmRzIFNwZWNUeXBlPihcclxuICAgIGNsYXk6IFJlY29yZDxUPixcclxuICAgIHNjb3BlOiBzdHJpbmcsXHJcbiAgICBtb2RlbDogVFsnbmFtZSddLFxyXG4gICk6IFBhcnRpYWw8TW9kZWw8VD4+O1xyXG4gIGZ1bmN0aW9uIGV4dHJhY3RJbnNlcnREYXRhPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICBjbGF5OiBTZXQ8VD4sXHJcbiAgICBzY29wZTogc3RyaW5nLFxyXG4gICAgbW9kZWw6IFRbJ25hbWUnXSxcclxuICApOiBQYXJ0aWFsPE1vZGVsPFQ+PltdO1xyXG4gIGZ1bmN0aW9uIGV4dHJhY3RJbnNlcnREYXRhPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICBjbGF5OiBSZWNvcmQ8VD4gfCBTZXQ8VD4sXHJcbiAgICBzY29wZTogc3RyaW5nLFxyXG4gICAgbW9kZWw6IFRbJ25hbWUnXSxcclxuICApOiBQYXJ0aWFsPE1vZGVsPFQ+PiB8IFBhcnRpYWw8TW9kZWw8VD4+W10ge1xyXG4gICAgaWYgKGNsYXkgaW5zdGFuY2VvZiBTZXQpIHtcclxuICAgICAgY29uc3QgaXRlbXM6IFBhcnRpYWw8TW9kZWw8VD4+W10gPSBbXTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjbGF5Lml0ZW1zKSB7XHJcbiAgICAgICAgaXRlbXMucHVzaChleHRyYWN0SW5zZXJ0RGF0YShpdGVtLCBzY29wZSwgbW9kZWwpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9O1xyXG4gICAgY29uc3Qgc3BlYyA9IHNwZWNQb29sW3Njb3BlXVttb2RlbF07XHJcblxyXG4gICAgY29uc3Qgbm9uQXV0b0luY3JlbWVudGVkQXR0cmlidXRlcyA9IDwoa2V5b2YgVFsnZmllbGRzJ10pW10+c3BlYy5hdHRyaWJ1dGVzXHJcbiAgICAgIC5maWx0ZXIoYXR0cmliID0+ICFhdHRyaWIuYXV0b0luY3JlbWVudClcclxuICAgICAgLm1hcChhdHRyaWIgPT4gYXR0cmliLm5hbWUpO1xyXG5cclxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIG5vbkF1dG9JbmNyZW1lbnRlZEF0dHJpYnV0ZXMpIHtcclxuICAgICAgY29uc3QgdmFsdWUgPSBjbGF5LmZpZWxkc1thdHRyaWJ1dGVdO1xyXG4gICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICBkYXRhW2F0dHJpYnV0ZV0gPSA8YW55PnRvUGxhaW4odmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0UmVsYXRpb25zID0gc3BlYy5yZWxhdGlvbnNcclxuICAgICAgLmZpbHRlcigoeyB0eXBlIH0pID0+XHJcbiAgICAgICAgdHlwZSA9PT0gJ1NVQkNMQVNTJyB8fFxyXG4gICAgICAgIHR5cGUgPT09ICdNQVNURVInIHx8XHJcbiAgICAgICAgdHlwZSA9PT0gJ0RFVEFJTCcgfHxcclxuICAgICAgICB0eXBlID09PSAnTUFOWV9UT19NQU5ZJyB8fFxyXG4gICAgICAgIHR5cGUgPT09ICdJTkpFQ1RJVkUnLFxyXG4gICAgKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHRhcmdldFJlbGF0aW9ucykge1xyXG4gICAgICBpZiAoY2xheS5maWVsZHNbcmVsYXRpb24uYWxpYXNdKSB7XHJcbiAgICAgICAgZGF0YVtyZWxhdGlvbi5hbGlhc10gPSA8YW55PmV4dHJhY3RJbnNlcnREYXRhKFxyXG4gICAgICAgICAgY2xheS5maWVsZHNbcmVsYXRpb24uYWxpYXNdLFxyXG4gICAgICAgICAgcmVsYXRpb24udGFyZ2V0LnNjb3BlLFxyXG4gICAgICAgICAgcmVsYXRpb24udGFyZ2V0Lm1vZGVsLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGV4dHJhY3RVcGRhdGVEYXRhPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICByZWNvcmQ6IFJlY29yZDxUPixcclxuICAgIHNjb3BlOiBzdHJpbmcsXHJcbiAgICBtb2RlbDogVFsnbmFtZSddLFxyXG4gICk6IFBhcnRpYWw8VFsnZmllbGRzJ10+IHtcclxuICAgIGNvbnN0IHNwZWMgPSBzcGVjUG9vbFtzY29wZV1bbW9kZWxdO1xyXG5cclxuICAgIGNvbnN0IHByaW1hcmllcyA9IHNwZWMuYXR0cmlidXRlcy5maWx0ZXIoYXR0cmliID0+IGF0dHJpYi5wcmltYXJ5KS5tYXAoYXR0cmliID0+IGF0dHJpYi5uYW1lKTtcclxuXHJcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHByaW1hcnkgb2YgcHJpbWFyaWVzKSB7XHJcbiAgICAgIGRhdGFbcHJpbWFyeV0gPSB0b1BsYWluKHJlY29yZC5maWVsZHNbcHJpbWFyeV0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG11dGFibGVzID0gc3BlYy5hdHRyaWJ1dGVzXHJcbiAgICAgIC5maWx0ZXIoYXR0cmliID0+IGF0dHJpYi5tdXRhYmxlKVxyXG4gICAgICAubWFwKGF0dHJpYiA9PiBhdHRyaWIubmFtZSk7XHJcblxyXG4gICAgZm9yIChjb25zdCBtdXRhYmxlIG9mIG11dGFibGVzKSB7XHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHJlY29yZC5maWVsZHNbbXV0YWJsZV07XHJcbiAgICAgIGlmIChhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLm1vZGlmaWVkKSB7XHJcbiAgICAgICAgZGF0YVttdXRhYmxlXSA9IHRvUGxhaW4oYXR0cmlidXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZXh0cmFjdFJlbW92ZUlkZW50aWZpZXJzPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICByZWNvcmQ6IFJlY29yZDxUPixcclxuICAgIHNjb3BlOiBzdHJpbmcsXHJcbiAgICBtb2RlbDogVFsnbmFtZSddLFxyXG4gICk6IFBhcnRpYWw8VFsnZmllbGRzJ10+IHtcclxuICAgIGNvbnN0IHNwZWMgPSBzcGVjUG9vbFtzY29wZV1bbW9kZWxdO1xyXG5cclxuICAgIGNvbnN0IHByaW1hcmllcyA9IHNwZWMuYXR0cmlidXRlcy5maWx0ZXIoYXR0cmliID0+IGF0dHJpYi5wcmltYXJ5KS5tYXAoYXR0cmliID0+IGF0dHJpYi5uYW1lKTtcclxuXHJcbiAgICBjb25zdCBpZGVudGlmaWVyczogYW55ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBwcmltYXJ5IG9mIHByaW1hcmllcykge1xyXG4gICAgICBpZGVudGlmaWVyc1twcmltYXJ5XSA9IHRvUGxhaW4ocmVjb3JkLmZpZWxkc1twcmltYXJ5XSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlkZW50aWZpZXJzO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0TXV0YXRpb25zPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICBjbGF5OiBTZXQ8VD4gfCBSZWNvcmQ8VD4sXHJcbiAgICBzY29wZTogc3RyaW5nLFxyXG4gICAgbW9kZWw6IFRbJ25hbWUnXSxcclxuICApOiBNdXRhdGVSZXF1ZXN0PFQ+W10ge1xyXG4gICAgY29uc3QgcmVxdWVzdHM6IE11dGF0ZVJlcXVlc3Q8VD5bXSA9IFtdO1xyXG4gICAgY29uc3Qgc3BlYyA9IHNwZWNQb29sW3Njb3BlXVttb2RlbF07XHJcblxyXG4gICAgaWYgKGNsYXkgaW5zdGFuY2VvZiBTZXQpIHtcclxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNsYXkuaXRlbXMpIHtcclxuICAgICAgICByZXF1ZXN0cy5wdXNoKC4uLmdldE11dGF0aW9ucyhpdGVtLCBzY29wZSwgbW9kZWwpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGNsYXkuc3RhdGUgPT09ICdyZW1vdmVkJykge1xyXG4gICAgICAgIHJlcXVlc3RzLnB1c2goPE11dGF0ZVJlcXVlc3Q8VD4+e1xyXG4gICAgICAgICAgYWN0aW9uOiAncmVtb3ZlJyxcclxuICAgICAgICAgIGlkZW50aWZpZXJzOiBleHRyYWN0UmVtb3ZlSWRlbnRpZmllcnMoY2xheSwgc2NvcGUsIG1vZGVsKSxcclxuICAgICAgICAgIHNjb3BlLFxyXG4gICAgICAgICAgbW9kZWwsXHJcbiAgICAgICAgICB0eXBlOiAnbXV0YXRlJyxcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmIChjbGF5LnN0YXRlID09PSAnbmV3Jykge1xyXG4gICAgICAgIHJlcXVlc3RzLnB1c2goPE11dGF0ZVJlcXVlc3Q8VD4+e1xyXG4gICAgICAgICAgYWN0aW9uOiAnaW5zZXJ0JyxcclxuICAgICAgICAgIGRhdGE6IGV4dHJhY3RJbnNlcnREYXRhKGNsYXksIHNjb3BlLCBtb2RlbCksXHJcbiAgICAgICAgICBzY29wZSxcclxuICAgICAgICAgIG1vZGVsLFxyXG4gICAgICAgICAgdHlwZTogJ211dGF0ZScsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgdXBkYXRlcyA9IGV4dHJhY3RVcGRhdGVEYXRhKGNsYXksIHNjb3BlLCBtb2RlbCk7XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHVwZGF0ZXMpLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgIHJlcXVlc3RzLnB1c2goPE11dGF0ZVJlcXVlc3Q8VD4+e1xyXG4gICAgICAgICAgICBzY29wZSxcclxuICAgICAgICAgICAgbW9kZWwsXHJcbiAgICAgICAgICAgIGRhdGE6IHVwZGF0ZXMsXHJcbiAgICAgICAgICAgIGFjdGlvbjogJ3VwZGF0ZScsXHJcbiAgICAgICAgICAgIHR5cGU6ICdtdXRhdGUnLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHNwZWMucmVsYXRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoY2xheS5maWVsZHNbcmVsYXRpb24uYWxpYXNdKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RzLnB1c2goLi4uZ2V0TXV0YXRpb25zKFxyXG4gICAgICAgICAgICAgIGNsYXkuZmllbGRzW3JlbGF0aW9uLmFsaWFzXSxcclxuICAgICAgICAgICAgICByZWxhdGlvbi50YXJnZXQuc2NvcGUsXHJcbiAgICAgICAgICAgICAgcmVsYXRpb24udGFyZ2V0Lm1vZGVsLFxyXG4gICAgICAgICAgICApKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVxdWVzdHM7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZXh0cmFjdEluc2VydERhdGEsXHJcbiAgICBleHRyYWN0UmVtb3ZlSWRlbnRpZmllcnMsXHJcbiAgICBleHRyYWN0VXBkYXRlRGF0YSxcclxuICAgIGdldE11dGF0aW9ucyxcclxuICB9O1xyXG59XHJcbiJdfQ==