pretur.sync
Version:
Front-end back-end communication infrastructure
271 lines • 32.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
function buildResponder(options) {
var errorToBundle = options.errorToBundle, pool = options.pool, operator = options.operator, validator = options.validator, transact = options.transact;
return function responder(requests, context) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var responses, _i, requests_1, request, requestId, _a, tr, _b, data, count, error_1, error_2, _c, _d, error_3, error, transaction, _e, generatedIds, errors, error_4, batch, e, _f, _g, _h, action, id, type, failed, failReasons, batchTr, _j, _k, reqItem, action, type, itemId, _l, generatedIds, errors, error_5, error_6, _m, _o, resItem, _p, _q, error_7;
return tslib_1.__generator(this, function (_r) {
switch (_r.label) {
case 0:
if (!Array.isArray(requests) || requests.length === 0) {
return [2 /*return*/, []];
}
responses = [];
_i = 0, requests_1 = requests;
_r.label = 1;
case 1:
if (!(_i < requests_1.length)) return [3 /*break*/, 46];
request = requests_1[_i];
requestId = request.requestId;
_a = request.type;
switch (_a) {
case 'select': return [3 /*break*/, 2];
case 'operate': return [3 /*break*/, 10];
case 'mutate': return [3 /*break*/, 14];
case 'batchMutate': return [3 /*break*/, 25];
case 'validate': return [3 /*break*/, 41];
}
return [3 /*break*/, 45];
case 2:
_r.trys.push([2, 8, , 9]);
if (!transact || !pool) {
throw new Error('select requests require transact and pool to operate.');
}
return [4 /*yield*/, transact()];
case 3:
tr = _r.sent();
_r.label = 4;
case 4:
_r.trys.push([4, 6, , 7]);
return [4 /*yield*/, pool.resolve(tr, request.scope, request.model, request.query, context)];
case 5:
_b = _r.sent(), data = _b.data, count = _b.count;
tr.commit();
responses.push({ errors: [], count: count, data: data, requestId: requestId, type: 'select' });
return [3 /*break*/, 7];
case 6:
error_1 = _r.sent();
responses.push({
errors: [errorToBundle(error_1)],
count: 0,
data: [],
requestId: requestId,
type: 'select',
});
tr.rollback();
return [3 /*break*/, 7];
case 7: return [3 /*break*/, 9];
case 8:
error_2 = _r.sent();
responses.push({
count: 0,
data: [],
errors: [errorToBundle(error_2)],
requestId: requestId,
type: 'select',
});
return [3 /*break*/, 9];
case 9: return [3 /*break*/, 45];
case 10:
_r.trys.push([10, 12, , 13]);
if (!operator) {
throw new Error('operate requests require an operator.');
}
_d = (_c = responses).push;
return [4 /*yield*/, operator(request, context)];
case 11:
_d.apply(_c, [_r.sent()]);
return [3 /*break*/, 13];
case 12:
error_3 = _r.sent();
responses.push({
errors: [errorToBundle(error_3)],
name: request.name,
requestId: requestId,
type: 'operate',
});
return [3 /*break*/, 13];
case 13: return [3 /*break*/, 45];
case 14:
if (!transact || !pool) {
error = new Error('mutate requests require both transact and pool.');
responses.push({
action: request.action,
errors: [errorToBundle(error)],
requestId: requestId,
type: request.type,
});
return [3 /*break*/, 45];
}
return [4 /*yield*/, transact()];
case 15:
transaction = _r.sent();
_r.label = 16;
case 16:
_r.trys.push([16, 22, , 24]);
return [4 /*yield*/, pool.sync(transaction, request, context)];
case 17:
_e = _r.sent(), generatedIds = _e.generatedIds, errors = _e.errors;
if (!(errors.length > 0)) return [3 /*break*/, 19];
return [4 /*yield*/, transaction.rollback()];
case 18:
_r.sent();
responses.push({
action: request.action,
errors: errors,
requestId: requestId,
type: request.type,
});
return [3 /*break*/, 21];
case 19: return [4 /*yield*/, transaction.commit()];
case 20:
_r.sent();
responses.push({
action: request.action,
errors: [],
generatedIds: generatedIds,
requestId: requestId,
type: request.type,
});
_r.label = 21;
case 21: return [3 /*break*/, 24];
case 22:
error_4 = _r.sent();
return [4 /*yield*/, transaction.rollback()];
case 23:
_r.sent();
responses.push({
action: request.action,
errors: [errorToBundle(error_4)],
requestId: requestId,
type: request.type,
});
return [3 /*break*/, 24];
case 24: return [3 /*break*/, 45];
case 25:
batch = {
errors: [],
queue: [],
requestId: requestId,
type: request.type,
};
if (!transact || !pool) {
e = [errorToBundle(new Error('mutate requests require both transact and pool.'))];
for (_f = 0, _g = request.queue; _f < _g.length; _f++) {
_h = _g[_f], action = _h.action, id = _h.requestId, type = _h.type;
batch.queue.push({ action: action, errors: e, requestId: id, type: type });
}
responses.push(tslib_1.__assign({}, batch, { errors: e }));
return [3 /*break*/, 45];
}
failed = false;
failReasons = [];
return [4 /*yield*/, transact()];
case 26:
batchTr = _r.sent();
_r.label = 27;
case 27:
_r.trys.push([27, 36, , 38]);
_j = 0, _k = request.queue;
_r.label = 28;
case 28:
if (!(_j < _k.length)) return [3 /*break*/, 35];
reqItem = _k[_j];
action = reqItem.action, type = reqItem.type, itemId = reqItem.requestId;
if (!!failed) return [3 /*break*/, 33];
_r.label = 29;
case 29:
_r.trys.push([29, 31, , 32]);
return [4 /*yield*/, pool.sync(batchTr, reqItem, context)];
case 30:
_l = _r.sent(), generatedIds = _l.generatedIds, errors = _l.errors;
if (errors.length > 0) {
failed = true;
failReasons = errors;
batchTr.rollback();
batch.queue.push({ action: action, type: type, requestId: itemId, errors: errors });
}
else {
batch.queue.push({
action: action,
errors: errors,
generatedIds: generatedIds,
requestId: itemId,
type: type,
});
}
return [3 /*break*/, 32];
case 31:
error_5 = _r.sent();
failed = true;
failReasons = [errorToBundle(error_5)];
batchTr.rollback();
batch.queue.push({ action: action, errors: failReasons, requestId: itemId, type: type });
return [3 /*break*/, 32];
case 32: return [3 /*break*/, 34];
case 33:
batch.queue.push({
action: reqItem.action,
errors: failReasons,
requestId: reqItem.requestId,
type: reqItem.type,
});
_r.label = 34;
case 34:
_j++;
return [3 /*break*/, 28];
case 35: return [3 /*break*/, 38];
case 36:
error_6 = _r.sent();
return [4 /*yield*/, batchTr.rollback()];
case 37:
_r.sent();
for (_m = 0, _o = batch.queue; _m < _o.length; _m++) {
resItem = _o[_m];
resItem.errors = resItem.errors
? resItem.errors.concat([errorToBundle(error_6)]) : [errorToBundle(error_6)];
}
failed = true;
return [3 /*break*/, 38];
case 38:
if (!!failed) return [3 /*break*/, 40];
return [4 /*yield*/, batchTr.commit()];
case 39:
_r.sent();
_r.label = 40;
case 40:
responses.push(batch);
return [3 /*break*/, 45];
case 41:
_r.trys.push([41, 43, , 44]);
if (!validator) {
throw new Error('validate requests require a validator.');
}
_q = (_p = responses).push;
return [4 /*yield*/, validator(request, context)];
case 42:
_q.apply(_p, [_r.sent()]);
return [3 /*break*/, 44];
case 43:
error_7 = _r.sent();
responses.push({
errors: [errorToBundle(error_7)],
name: request.name,
requestId: requestId,
type: 'validate',
});
return [3 /*break*/, 44];
case 44: return [3 /*break*/, 45];
case 45:
_i++;
return [3 /*break*/, 1];
case 46: return [2 /*return*/, responses];
}
});
});
};
}
exports.buildResponder = buildResponder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3BvbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUErQ0Esd0JBQWtDLE9BQTRCO0lBQ3BELElBQUEscUNBQWEsRUFBRSxtQkFBSSxFQUFFLDJCQUFRLEVBQUUsNkJBQVMsRUFBRSwyQkFBUSxDQUFhO0lBRXZFLE1BQU0sQ0FBQyxtQkFBeUIsUUFBbUIsRUFBRSxPQUFhOzs7Ozs7d0JBQ2hFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3RELE1BQU0sZ0JBQUMsRUFBRSxFQUFDO3dCQUNaLENBQUM7d0JBRUssU0FBUyxHQUFlLEVBQUUsQ0FBQzs4QkFFSCxFQUFSLHFCQUFROzs7NkJBQVIsQ0FBQSxzQkFBUSxDQUFBO3dCQUFuQixPQUFPO3dCQUNWLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO3dCQUU1QixLQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUE7O2lDQUNiLFFBQVEsRUFBUixNQUFNLGtCQUFFO2lDQXFDUixTQUFTLEVBQVQsTUFBTSxtQkFBRztpQ0FlVCxRQUFRLEVBQVIsTUFBTSxtQkFBRTtpQ0EyQ1IsYUFBYSxFQUFiLE1BQU0sbUJBQU87aUNBMEViLFVBQVUsRUFBVixNQUFNLG1CQUFJOzs7Ozt3QkF2S1gsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOzRCQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7d0JBQzNFLENBQUM7d0JBQ1UscUJBQU0sUUFBUSxFQUFFLEVBQUE7O3dCQUFyQixFQUFFLEdBQUcsU0FBZ0I7Ozs7d0JBRUQscUJBQU0sSUFBSSxDQUFDLE9BQU8sQ0FDeEMsRUFBRSxFQUNGLE9BQU8sQ0FBQyxLQUFL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QUNULHFCQUFNLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBQTs7d0JBQXRCLFNBQXNCLENBQUM7Ozt3QkFHekIsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDdEIseUJBQU07Ozt3QkFHSixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7NEJBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO3dCQUM1RCxDQUFDO3dCQUNELEtBQUEsQ0FBQSxLQUFBLFNBQVMsQ0FBQSxDQUFDLElBQUksQ0FBQTt3QkFBQyxxQkFBTSxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFBOzt3QkFBaEQsY0FBZSxTQUFpQyxFQUFDLENBQUM7Ozs7d0JBRWxELFNBQVMsQ0FBQyxJQUFJLENBQUM7NEJBQ2IsTUFBTSxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQUssQ0FBQyxDQUFDOzRCQUM5QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7NEJBQ2xCLFNBQVMsV0FBQTs0QkFDVCxJQUFJLEVBQUUsVUFBVTt5QkFDakIsQ0FBQyxDQUFDOzs2QkFFTCx5QkFBTTs7d0JBM0xVLElBQVEsQ0FBQTs7NkJBK0w5QixzQkFBTyxTQUFTLEVBQUM7Ozs7S0FDbEIsQ0FBQztBQUNKLENBQUM7QUEzTUQsd0NBMk1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW1wdHlTcGVjIH0gZnJvbSAncHJldHVyLnNwZWMnO1xyXG5pbXBvcnQgeyBCdW5kbGUgfSBmcm9tICdwcmV0dXIuaTE4bic7XHJcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XHJcbmltcG9ydCB7IFJlcXVlc3QsIE9wZXJhdGVSZXF1ZXN0LCBWYWxpZGF0ZVJlcXVlc3QsIE11dGF0ZVJlcXVlc3QgfSBmcm9tICcuL3JlcXVlc3QnO1xyXG5pbXBvcnQge1xyXG4gIFJlc3BvbnNlLCBPcGVyYXRlUmVzcG9uc2UsIFZhbGlkYXRlUmVzcG9uc2UsIE11dGF0ZVJlc3BvbnNlLCBCYXRjaE11dGF0ZVJlc3BvbnNlLFxyXG59IGZyb20gJy4vcmVzcG9uc2UnO1xyXG5cclxuLy8gTWFudWFsbHkgaW1wb3J0IHNvbWUgdHlwZXMgdG8gZGVjb3VwbGUgdGhlIGxpYnJhcmlyZXNcclxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkxpa2Uge1xyXG4gIGNvbW1pdCgpOiBQcm9taXNlPHZvaWQ+O1xyXG4gIHJvbGxiYWNrKCk6IFByb21pc2U8dm9pZD47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZVJlc3VsdCB7XHJcbiAgZGF0YTogYW55W107XHJcbiAgY291bnQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTeW5jUmVzdWx0IHtcclxuICBlcnJvcnM6IEJ1bmRsZVtdO1xyXG4gIGdlbmVyYXRlZElkcz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQb29sTGlrZTxDPiB7XHJcbiAgcmVzb2x2ZShcclxuICAgIHRyYW5zYWN0aW9uOiBhbnksXHJcbiAgICBzY29wZTogc3RyaW5nLFxyXG4gICAgbW9kZWw6IHN0cmluZyxcclxuICAgIHF1ZXJ5OiBRdWVyeTxFbXB0eVNwZWM+LFxyXG4gICAgY29udGV4dD86IEMsXHJcbiAgKTogUHJvbWlzZTxSZXNvbHZlUmVzdWx0PjtcclxuICBzeW5jKFxyXG4gICAgdHJhbnNhY3Rpb246IGFueSxcclxuICAgIGl0ZW06IE11dGF0ZVJlcXVlc3QsXHJcbiAgICBjb250ZXh0PzogQyxcclxuICApOiBQcm9taXNlPFN5bmNSZXN1bHQ+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbmRlck9wdGlvbnM8Qz4ge1xyXG4gIGVycm9yVG9CdW5kbGU6IChlcnJvcjogRXJyb3IpID0+IEJ1bmRsZTtcclxuICBwb29sPzogUG9vbExpa2U8Qz47XHJcbiAgb3BlcmF0b3I/OiAocmVxdWVzdDogT3BlcmF0ZVJlcXVlc3QsIGNvbnRleHQ/OiBDKSA9PiBQcm9taXNlTGlrZTxPcGVyYXRlUmVzcG9uc2U+O1xyXG4gIHZhbGlkYXRvcj86IChyZXF1ZXN0OiBWYWxpZGF0ZVJlcXVlc3QsIGNvbnRleHQ/OiBDKSA9PiBQcm9taXNlTGlrZTxWYWxpZGF0ZVJlc3BvbnNlPjtcclxuICB0cmFuc2FjdD86ICgpID0+IFByb21pc2VMaWtlPFRyYW5zYWN0aW9uTGlrZT47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJlc3BvbmRlcjxDPihvcHRpb25zOiBSZXNwb25kZXJPcHRpb25zPEM+KSB7XHJcbiAgY29uc3QgeyBlcnJvclRvQnVuZGxlLCBwb29sLCBvcGVyYXRvciwgdmFsaWRhdG9yLCB0cmFuc2FjdCB9ID0gb3B0aW9ucztcclxuXHJcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlc3BvbmRlcihyZXF1ZXN0czogUmVxdWVzdFtdLCBjb250ZXh0PzogYW55KTogUHJvbWlzZTxSZXNwb25zZVtdPiB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVxdWVzdHMpIHx8IHJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2VzOiBSZXNwb25zZVtdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzKSB7XHJcbiAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJlcXVlc3QucmVxdWVzdElkO1xyXG5cclxuICAgICAgc3dpdGNoIChyZXF1ZXN0LnR5cGUpIHtcclxuICAgICAgICBjYXNlICdzZWxlY3QnOlxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCF0cmFuc2FjdCB8fCAhcG9vbCkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2VsZWN0IHJlcXVlc3RzIHJlcXVpcmUgdHJhbnNhY3QgYW5kIHBvb2wgdG8gb3BlcmF0ZS4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB0ciA9IGF3YWl0IHRyYW5zYWN0KCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBjb3VudCB9ID0gYXdhaXQgcG9vbC5yZXNvbHZlKFxyXG4gICAgICAgICAgICAgICAgdHIsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnNjb3BlLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdC5tb2RlbCxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3QucXVlcnksXHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgdHIuY29tbWl0KCk7XHJcbiAgICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goeyBlcnJvcnM6IFtdLCBjb3VudCwgZGF0YSwgcmVxdWVzdElkLCB0eXBlOiAnc2VsZWN0JyB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZXJyb3JzOiBbZXJyb3JUb0J1bmRsZShlcnJvcildLFxyXG4gICAgICAgICAgICAgICAgY291bnQ6IDAsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBbXSxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHRyLnJvbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBjb3VudDogMCxcclxuICAgICAgICAgICAgICBkYXRhOiBbXSxcclxuICAgICAgICAgICAgICBlcnJvcnM6IFtlcnJvclRvQnVuZGxlKGVycm9yKV0sXHJcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ29wZXJhdGUnOlxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCFvcGVyYXRvcikge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb3BlcmF0ZSByZXF1ZXN0cyByZXF1aXJlIGFuIG9wZXJhdG9yLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKGF3YWl0IG9wZXJhdG9yKHJlcXVlc3QsIGNvbnRleHQpKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBlcnJvcnM6IFtlcnJvclRvQnVuZGxlKGVycm9yKV0sXHJcbiAgICAgICAgICAgICAgbmFtZTogcmVxdWVzdC5uYW1lLFxyXG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgICB0eXBlOiAnb3BlcmF0ZScsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbXV0YXRlJzpcclxuICAgICAgICAgIGlmICghdHJhbnNhY3QgfHwgIXBvb2wpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ211dGF0ZSByZXF1ZXN0cyByZXF1aXJlIGJvdGggdHJhbnNhY3QgYW5kIHBvb2wuJyk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKDxNdXRhdGVSZXNwb25zZT57XHJcbiAgICAgICAgICAgICAgYWN0aW9uOiByZXF1ZXN0LmFjdGlvbixcclxuICAgICAgICAgICAgICBlcnJvcnM6IFtlcnJvclRvQnVuZGxlKGVycm9yKV0sXHJcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgIHR5cGU6IHJlcXVlc3QudHlwZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdHJhbnNhY3QoKTtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZ2VuZXJhdGVkSWRzLCBlcnJvcnMgfSA9IGF3YWl0IHBvb2wuc3luYyh0cmFuc2FjdGlvbiwgcmVxdWVzdCwgY29udGV4dCk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJvbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goPE11dGF0ZVJlc3BvbnNlPntcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogcmVxdWVzdC5hY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBlcnJvcnMsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiByZXF1ZXN0LnR5cGUsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdHJhbnNhY3Rpb24uY29tbWl0KCk7XHJcbiAgICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goPE11dGF0ZVJlc3BvbnNlPntcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogcmVxdWVzdC5hY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVkSWRzLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogcmVxdWVzdC50eXBlLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0cmFuc2FjdGlvbi5yb2xsYmFjaygpO1xyXG4gICAgICAgICAgICByZXNwb25zZXMucHVzaCg8TXV0YXRlUmVzcG9uc2U+e1xyXG4gICAgICAgICAgICAgIGFjdGlvbjogcmVxdWVzdC5hY3Rpb24sXHJcbiAgICAgICAgICAgICAgZXJyb3JzOiBbZXJyb3JUb0J1bmRsZShlcnJvcildLFxyXG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgICB0eXBlOiByZXF1ZXN0LnR5cGUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnYmF0Y2hNdXRhdGUnOlxyXG4gICAgICAgICAgY29uc3QgYmF0Y2g6IEJhdGNoTXV0YXRlUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgIGVycm9yczogW10sXHJcbiAgICAgICAgICAgIHF1ZXVlOiBbXSxcclxuICAgICAgICAgICAgcmVxdWVzdElkLFxyXG4gICAgICAgICAgICB0eXBlOiByZXF1ZXN0LnR5cGUsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmICghdHJhbnNhY3QgfHwgIXBvb2wpIHtcclxuICAgICAgICAgICAgY29uc3QgZSA9IFtlcnJvclRvQnVuZGxlKG5ldyBFcnJvcignbXV0YXRlIHJlcXVlc3RzIHJlcXVpcmUgYm90aCB0cmFuc2FjdCBhbmQgcG9vbC4nKSldO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGFjdGlvbiwgcmVxdWVzdElkOiBpZCwgdHlwZSB9IG9mIHJlcXVlc3QucXVldWUpIHtcclxuICAgICAgICAgICAgICBiYXRjaC5xdWV1ZS5wdXNoKDxNdXRhdGVSZXNwb25zZT57IGFjdGlvbiwgZXJyb3JzOiBlLCByZXF1ZXN0SWQ6IGlkLCB0eXBlIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXNwb25zZXMucHVzaCh7IC4uLmJhdGNoLCBlcnJvcnM6IGUgfSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcclxuICAgICAgICAgIGxldCBmYWlsUmVhc29uczogQnVuZGxlW10gPSBbXTtcclxuICAgICAgICAgIGNvbnN0IGJhdGNoVHIgPSBhd2FpdCB0cmFuc2FjdCgpO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCByZXFJdGVtIG9mIHJlcXVlc3QucXVldWUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB7IGFjdGlvbiwgdHlwZSwgcmVxdWVzdElkOiBpdGVtSWQgfSA9IHJlcUl0ZW07XHJcbiAgICAgICAgICAgICAgaWYgKCFmYWlsZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZ2VuZXJhdGVkSWRzLCBlcnJvcnMgfSA9IGF3YWl0IHBvb2wuc3luYyhiYXRjaFRyLCByZXFJdGVtLCBjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmYWlsUmVhc29ucyA9IGVycm9ycztcclxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRyLnJvbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2gucXVldWUucHVzaCh7IGFjdGlvbiwgdHlwZSwgcmVxdWVzdElkOiBpdGVtSWQsIGVycm9ycyB9KTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBiYXRjaC5xdWV1ZS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyxcclxuICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZElkcyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogaXRlbUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgZmFpbFJlYXNvbnMgPSBbZXJyb3JUb0J1bmRsZShlcnJvcildO1xyXG4gICAgICAgICAgICAgICAgICBiYXRjaFRyLnJvbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGJhdGNoLnF1ZXVlLnB1c2goeyBhY3Rpb24sIGVycm9yczogZmFpbFJlYXNvbnMsIHJlcXVlc3RJZDogaXRlbUlkLCB0eXBlIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBiYXRjaC5xdWV1ZS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiByZXFJdGVtLmFjdGlvbixcclxuICAgICAgICAgICAgICAgICAgZXJyb3JzOiBmYWlsUmVhc29ucyxcclxuICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiByZXFJdGVtLnJlcXVlc3RJZCxcclxuICAgICAgICAgICAgICAgICAgdHlwZTogcmVxSXRlbS50eXBlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgYXdhaXQgYmF0Y2hUci5yb2xsYmFjaygpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc0l0ZW0gb2YgYmF0Y2gucXVldWUpIHtcclxuICAgICAgICAgICAgICByZXNJdGVtLmVycm9ycyA9IHJlc0l0ZW0uZXJyb3JzXHJcbiAgICAgICAgICAgICAgICA/IFsuLi5yZXNJdGVtLmVycm9ycywgZXJyb3JUb0J1bmRsZShlcnJvcildXHJcbiAgICAgICAgICAgICAgICA6IFtlcnJvclRvQnVuZGxlKGVycm9yKV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIWZhaWxlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBiYXRjaFRyLmNvbW1pdCgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKGJhdGNoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3ZhbGlkYXRlJzpcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghdmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWxpZGF0ZSByZXF1ZXN0cyByZXF1aXJlIGEgdmFsaWRhdG9yLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKGF3YWl0IHZhbGlkYXRvcihyZXF1ZXN0LCBjb250ZXh0KSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXNwb25zZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgZXJyb3JzOiBbZXJyb3JUb0J1bmRsZShlcnJvcildLFxyXG4gICAgICAgICAgICAgIG5hbWU6IHJlcXVlc3QubmFtZSxcclxuICAgICAgICAgICAgICByZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgdHlwZTogJ3ZhbGlkYXRlJyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXNwb25zZXM7XHJcbiAgfTtcclxufVxyXG4iXX0=