speckoloo
Version:
Domain entites inspired by Speck
1,017 lines (981 loc) • 28.9 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var cov_slr7a81u6 = function () {
var path = '/home/henrique/labs/speckoloo/src/build-schema.js',
hash = '2765f65855cd47bdf4b5619cf2c01da7d4e1fd81',
global = new Function('return this')(),
gcv = '__coverage__',
coverageData = {
path: '/home/henrique/labs/speckoloo/src/build-schema.js',
statementMap: {
'0': {
start: {
line: 5,
column: 24
},
end: {
line: 5,
column: 57
}
},
'1': {
start: {
line: 7,
column: 25
},
end: {
line: 14,
column: 5
}
},
'2': {
start: {
line: 9,
column: 52
},
end: {
line: 12,
column: 7
}
},
'3': {
start: {
line: 16,
column: 2
},
end: {
line: 19,
column: 3
}
},
'4': {
start: {
line: 23,
column: 2
},
end: {
line: 36,
column: 5
}
},
'5': {
start: {
line: 25,
column: 98
},
end: {
line: 34,
column: 7
}
},
'6': {
start: {
line: 45,
column: 6
},
end: {
line: 45,
column: 23
}
},
'7': {
start: {
line: 47,
column: 2
},
end: {
line: 49,
column: 3
}
},
'8': {
start: {
line: 48,
column: 4
},
end: {
line: 48,
column: 143
}
},
'9': {
start: {
line: 51,
column: 22
},
end: {
line: 53,
column: 43
}
},
'10': {
start: {
line: 55,
column: 20
},
end: {
line: 55,
column: 44
}
},
'11': {
start: {
line: 58,
column: 29
},
end: {
line: 58,
column: 53
}
},
'12': {
start: {
line: 59,
column: 25
},
end: {
line: 68,
column: 5
}
},
'13': {
start: {
line: 61,
column: 48
},
end: {
line: 66,
column: 7
}
},
'14': {
start: {
line: 70,
column: 29
},
end: {
line: 70,
column: 59
}
},
'15': {
start: {
line: 71,
column: 25
},
end: {
line: 80,
column: 5
}
},
'16': {
start: {
line: 73,
column: 30
},
end: {
line: 78,
column: 7
}
},
'17': {
start: {
line: 82,
column: 2
},
end: {
line: 96,
column: 5
}
},
'18': {
start: {
line: 85,
column: 8
},
end: {
line: 94,
column: 9
}
},
'19': {
start: {
line: 100,
column: 2
},
end: {
line: 102,
column: 3
}
},
'20': {
start: {
line: 101,
column: 4
},
end: {
line: 101,
column: 33
}
},
'21': {
start: {
line: 104,
column: 2
},
end: {
line: 104,
column: 15
}
},
'22': {
start: {
line: 108,
column: 2
},
end: {
line: 110,
column: 3
}
},
'23': {
start: {
line: 109,
column: 4
},
end: {
line: 109,
column: 33
}
},
'24': {
start: {
line: 112,
column: 2
},
end: {
line: 112,
column: 15
}
}
},
fnMap: {
'0': {
name: 'buildSchema',
decl: {
start: {
line: 4,
column: 24
},
end: {
line: 4,
column: 35
}
},
loc: {
start: {
line: 4,
column: 59
},
end: {
line: 20,
column: 1
}
},
line: 4
},
'1': {
name: '(anonymous_1)',
decl: {
start: {
line: 9,
column: 6
},
end: {
line: 9,
column: 7
}
},
loc: {
start: {
line: 9,
column: 52
},
end: {
line: 12,
column: 7
}
},
line: 9
},
'2': {
name: 'fillDefaultProperties',
decl: {
start: {
line: 22,
column: 9
},
end: {
line: 22,
column: 30
}
},
loc: {
start: {
line: 22,
column: 52
},
end: {
line: 37,
column: 1
}
},
line: 22
},
'3': {
name: '(anonymous_3)',
decl: {
start: {
line: 25,
column: 6
},
end: {
line: 25,
column: 7
}
},
loc: {
start: {
line: 25,
column: 98
},
end: {
line: 34,
column: 7
}
},
line: 25
},
'4': {
name: 'applyOperators',
decl: {
start: {
line: 39,
column: 9
},
end: {
line: 39,
column: 23
}
},
loc: {
start: {
line: 39,
column: 72
},
end: {
line: 97,
column: 1
}
},
line: 39
},
'5': {
name: '(anonymous_5)',
decl: {
start: {
line: 61,
column: 6
},
end: {
line: 61,
column: 7
}
},
loc: {
start: {
line: 61,
column: 48
},
end: {
line: 66,
column: 7
}
},
line: 61
},
'6': {
name: '(anonymous_6)',
decl: {
start: {
line: 73,
column: 6
},
end: {
line: 73,
column: 7
}
},
loc: {
start: {
line: 73,
column: 30
},
end: {
line: 78,
column: 7
}
},
line: 73
},
'7': {
name: '(anonymous_7)',
decl: {
start: {
line: 84,
column: 6
},
end: {
line: 84,
column: 7
}
},
loc: {
start: {
line: 85,
column: 8
},
end: {
line: 94,
column: 9
}
},
line: 85
},
'8': {
name: 'applyInclude',
decl: {
start: {
line: 99,
column: 9
},
end: {
line: 99,
column: 21
}
},
loc: {
start: {
line: 99,
column: 41
},
end: {
line: 105,
column: 1
}
},
line: 99
},
'9': {
name: 'applyExclude',
decl: {
start: {
line: 107,
column: 9
},
end: {
line: 107,
column: 21
}
},
loc: {
start: {
line: 107,
column: 41
},
end: {
line: 113,
column: 1
}
},
line: 107
}
},
branchMap: {
'0': {
loc: {
start: {
line: 32,
column: 21
},
end: {
line: 32,
column: 42
}
},
type: 'binary-expr',
locations: [{
start: {
line: 32,
column: 21
},
end: {
line: 32,
column: 30
}
}, {
start: {
line: 32,
column: 34
},
end: {
line: 32,
column: 42
}
}],
line: 32
},
'1': {
loc: {
start: {
line: 41,
column: 4
},
end: {
line: 41,
column: 17
}
},
type: 'default-arg',
locations: [{
start: {
line: 41,
column: 15
},
end: {
line: 41,
column: 17
}
}],
line: 41
},
'2': {
loc: {
start: {
line: 42,
column: 4
},
end: {
line: 42,
column: 17
}
},
type: 'default-arg',
locations: [{
start: {
line: 42,
column: 15
},
end: {
line: 42,
column: 17
}
}],
line: 42
},
'3': {
loc: {
start: {
line: 43,
column: 4
},
end: {
line: 43,
column: 14
}
},
type: 'default-arg',
locations: [{
start: {
line: 43,
column: 12
},
end: {
line: 43,
column: 14
}
}],
line: 43
},
'4': {
loc: {
start: {
line: 44,
column: 4
},
end: {
line: 44,
column: 16
}
},
type: 'default-arg',
locations: [{
start: {
line: 44,
column: 14
},
end: {
line: 44,
column: 16
}
}],
line: 44
},
'5': {
loc: {
start: {
line: 47,
column: 2
},
end: {
line: 49,
column: 3
}
},
type: 'if',
locations: [{
start: {
line: 47,
column: 2
},
end: {
line: 49,
column: 3
}
}, {
start: {
line: 47,
column: 2
},
end: {
line: 49,
column: 3
}
}],
line: 47
},
'6': {
loc: {
start: {
line: 47,
column: 6
},
end: {
line: 47,
column: 48
}
},
type: 'binary-expr',
locations: [{
start: {
line: 47,
column: 6
},
end: {
line: 47,
column: 25
}
}, {
start: {
line: 47,
column: 29
},
end: {
line: 47,
column: 48
}
}],
line: 47
},
'7': {
loc: {
start: {
line: 51,
column: 22
},
end: {
line: 53,
column: 43
}
},
type: 'cond-expr',
locations: [{
start: {
line: 52,
column: 6
},
end: {
line: 52,
column: 43
}
}, {
start: {
line: 53,
column: 6
},
end: {
line: 53,
column: 43
}
}],
line: 51
},
'8': {
loc: {
start: {
line: 100,
column: 2
},
end: {
line: 102,
column: 3
}
},
type: 'if',
locations: [{
start: {
line: 100,
column: 2
},
end: {
line: 102,
column: 3
}
}, {
start: {
line: 100,
column: 2
},
end: {
line: 102,
column: 3
}
}],
line: 100
},
'9': {
loc: {
start: {
line: 108,
column: 2
},
end: {
line: 110,
column: 3
}
},
type: 'if',
locations: [{
start: {
line: 108,
column: 2
},
end: {
line: 110,
column: 3
}
}, {
start: {
line: 108,
column: 2
},
end: {
line: 110,
column: 3
}
}],
line: 108
}
},
s: {
'0': 0,
'1': 0,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
'6': 0,
'7': 0,
'8': 0,
'9': 0,
'10': 0,
'11': 0,
'12': 0,
'13': 0,
'14': 0,
'15': 0,
'16': 0,
'17': 0,
'18': 0,
'19': 0,
'20': 0,
'21': 0,
'22': 0,
'23': 0,
'24': 0
},
f: {
'0': 0,
'1': 0,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
'6': 0,
'7': 0,
'8': 0,
'9': 0
},
b: {
'0': [0, 0],
'1': [0],
'2': [0],
'3': [0],
'4': [0],
'5': [0, 0],
'6': [0, 0],
'7': [0, 0],
'8': [0, 0],
'9': [0, 0]
},
_coverageSchema: '332fd63041d2c1bcb487cc26dd0d5f7d97098a6c'
},
coverage = global[gcv] || (global[gcv] = {});
if (coverage[path] && coverage[path].hash === hash) {
return coverage[path];
}
coverageData.hash = hash;
return coverage[path] = coverageData;
}();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.default = buildSchema;
var _defaultValidators = require('./default-validators');
var _common = require('./common');
function _objectEntries(obj) {
var entries = [];
var keys = Object.keys(obj);
for (var k = 0; k < keys.length; ++k) entries.push([keys[k], obj[keys[k]]]);
return entries;
}
function buildSchema(definition, contexts) {
cov_slr7a81u6.f[0]++;
const defaultSchema = (cov_slr7a81u6.s[0]++, fillDefaultProperties(definition));
const contextSchemas = (cov_slr7a81u6.s[1]++, _objectEntries(contexts).reduce((acc, [contextName, contextDefinition]) => {
cov_slr7a81u6.f[1]++;
cov_slr7a81u6.s[2]++;
return _extends({}, acc, {
[contextName]: applyOperators(contextDefinition, defaultSchema, contextName)
});
}, {}));
cov_slr7a81u6.s[3]++;
return _extends({
default: defaultSchema
}, contextSchemas);
}
function fillDefaultProperties(propertyDefinition) {
cov_slr7a81u6.f[2]++;
cov_slr7a81u6.s[4]++;
return _objectEntries(propertyDefinition).reduce((acc, [propertyName, { validator, factory, skippable, readOnly, default: _default }]) => {
cov_slr7a81u6.f[3]++;
cov_slr7a81u6.s[5]++;
return _extends({}, acc, {
[propertyName]: {
default: _default,
factory,
readOnly,
skippable: !!skippable,
validator: (cov_slr7a81u6.b[0][0]++, validator) || (cov_slr7a81u6.b[0][1]++, _defaultValidators.allowAny)
}
});
}, {});
}
function applyOperators(contextDefinition, defaultSchema, contextName) {
cov_slr7a81u6.f[4]++;
var _ref = (cov_slr7a81u6.s[6]++, contextDefinition),
_ref$$exclude = _ref.$exclude;
const $exclude = _ref$$exclude === undefined ? (cov_slr7a81u6.b[1][0]++, []) : _ref$$exclude;
var _ref$$include = _ref.$include;
const $include = _ref$$include === undefined ? (cov_slr7a81u6.b[2][0]++, []) : _ref$$include;
var _ref$$skip = _ref.$skip;
const $skip = _ref$$skip === undefined ? (cov_slr7a81u6.b[3][0]++, []) : _ref$$skip;
var _ref$$modify = _ref.$modify;
const $modify = _ref$$modify === undefined ? (cov_slr7a81u6.b[4][0]++, {}) : _ref$$modify;
cov_slr7a81u6.s[7]++;
if ((cov_slr7a81u6.b[6][0]++, $include.length > 0) && (cov_slr7a81u6.b[6][1]++, $exclude.length > 0)) {
cov_slr7a81u6.b[5][0]++;
cov_slr7a81u6.s[8]++;
process.emitWarning(`Both $include and $exclude operators were used in context ${contextName}. Beware that $include will take precedence.`);
} else {
cov_slr7a81u6.b[5][1]++;
}
const finalSchema = (cov_slr7a81u6.s[9]++, $include.length > 0 ? (cov_slr7a81u6.b[7][0]++, applyInclude($include, defaultSchema)) : (cov_slr7a81u6.b[7][1]++, applyExclude($exclude, defaultSchema)));
const finalKeys = (cov_slr7a81u6.s[10]++, Object.keys(finalSchema));
// @TODO: refactor this!
const validatorsToModify = (cov_slr7a81u6.s[11]++, (0, _common.pick)($modify, finalKeys));
const validatorPatch = (cov_slr7a81u6.s[12]++, _objectEntries(validatorsToModify).reduce((acc, [propertyName, newValidator]) => {
cov_slr7a81u6.f[5]++;
cov_slr7a81u6.s[13]++;
return _extends({}, acc, {
[propertyName]: {
validator: newValidator
}
});
}, {}));
const skippablesToModify = (cov_slr7a81u6.s[14]++, (0, _common.intersection)($skip, finalKeys));
const skippablePatch = (cov_slr7a81u6.s[15]++, skippablesToModify.reduce((acc, propertyName) => {
cov_slr7a81u6.f[6]++;
cov_slr7a81u6.s[16]++;
return _extends({}, acc, {
[propertyName]: {
skippable: true
}
});
}, {}));
cov_slr7a81u6.s[17]++;
return _objectEntries(finalSchema).reduce((acc, [key, definition]) => {
cov_slr7a81u6.f[7]++;
cov_slr7a81u6.s[18]++;
return Object.assign(acc, {
[key]: _extends({}, definition, validatorPatch[key], skippablePatch[key])
});
}, {});
}
function applyInclude($include, schema) {
cov_slr7a81u6.f[8]++;
cov_slr7a81u6.s[19]++;
if ($include.length > 0) {
cov_slr7a81u6.b[8][0]++;
cov_slr7a81u6.s[20]++;
return (0, _common.pick)(schema, $include);
} else {
cov_slr7a81u6.b[8][1]++;
}
cov_slr7a81u6.s[21]++;
return schema;
}
function applyExclude($exclude, schema) {
cov_slr7a81u6.f[9]++;
cov_slr7a81u6.s[22]++;
if ($exclude.length > 0) {
cov_slr7a81u6.b[9][0]++;
cov_slr7a81u6.s[23]++;
return (0, _common.omit)(schema, $exclude);
} else {
cov_slr7a81u6.b[9][1]++;
}
cov_slr7a81u6.s[24]++;
return schema;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZC1zY2hlbWEuanMiXSwibmFtZXMiOlsiYnVpbGRTY2hlbWEiLCJkZWZpbml0aW9uIiwiY29udGV4dHMiLCJkZWZhdWx0U2NoZW1hIiwiZmlsbERlZmF1bHRQcm9wZXJ0aWVzIiwiY29udGV4dFNjaGVtYXMiLCJyZWR1Y2UiLCJhY2MiLCJjb250ZXh0TmFtZSIsImNvbnRleHREZWZpbml0aW9uIiwiYXBwbHlPcGVyYXRvcnMiLCJkZWZhdWx0IiwicHJvcGVydHlEZWZpbml0aW9uIiwicHJvcGVydHlOYW1lIiwidmFsaWRhdG9yIiwiZmFjdG9yeSIsInNraXBwYWJsZSIsInJlYWRPbmx5IiwiX2RlZmF1bHQiLCIkZXhjbHVkZSIsIiRpbmNsdWRlIiwiJHNraXAiLCIkbW9kaWZ5IiwibGVuZ3RoIiwicHJvY2VzcyIsImVtaXRXYXJuaW5nIiwiZmluYWxTY2hlbWEiLCJhcHBseUluY2x1ZGUiLCJhcHBseUV4Y2x1ZGUiLCJmaW5hbEtleXMiLCJPYmplY3QiLCJrZXlzIiwidmFsaWRhdG9yc1RvTW9kaWZ5IiwidmFsaWRhdG9yUGF0Y2giLCJuZXdWYWxpZGF0b3IiLCJza2lwcGFibGVzVG9Nb2RpZnkiLCJza2lwcGFibGVQYXRjaCIsImtleSIsImFzc2lnbiIsInNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QWYsQ0FITDtBQURGLEtBRkY7QUFTQyxHQVpBLEVBYUgsRUFiRyxDQUFQO0FBZUQ7O0FBRUQsU0FBU1YsWUFBVCxDQUF1QlAsUUFBdkIsRUFBaUNtQixNQUFqQyxFQUF5QztBQUFBO0FBQUE7O0FBQ3ZDLE1BQUluQixTQUFTRyxNQUFULEdBQWtCLENBQXRCLEVBQXlCO0FBQUE7QUFBQTs7QUFDdkIsV0FBTyxrQkFBS2dCLE1BQUwsRUFBYW5CLFFBQWIsQ0FBUDtBQUNELEdBRkQ7QUFBQTtBQUFBOztBQUR1QztBQUt2QyxTQUFPbUIsTUFBUDtBQUNEOztBQUVELFNBQVNYLFlBQVQsQ0FBdUJULFFBQXZCLEVBQWlDb0IsTUFBakMsRUFBeUM7QUFBQTtBQUFBOztBQUN2QyxNQUFJcEIsU0FBU0ksTUFBVCxHQUFrQixDQUF0QixFQUF5QjtBQUFBO0FBQUE7O0FBQ3ZCLFdBQU8sa0JBQUtnQixNQUFMLEVBQWFwQixRQUFiLENBQVA7QUFDRCxHQUZEO0FBQUE7QUFBQTs7QUFEdUM7QUFLdkMsU0FBT29CLE1BQVA7QUFDRCIsImZpbGUiOiJidWlsZC1zY2hlbWEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbGxvd0FueSB9IGZyb20gJy4vZGVmYXVsdC12YWxpZGF0b3JzJ1xuaW1wb3J0IHsgb21pdCwgcGljaywgaW50ZXJzZWN0aW9uIH0gZnJvbSAnLi9jb21tb24nXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkU2NoZW1hIChkZWZpbml0aW9uLCBjb250ZXh0cykge1xuICBjb25zdCBkZWZhdWx0U2NoZW1hID0gZmlsbERlZmF1bHRQcm9wZXJ0aWVzKGRlZmluaXRpb24pXG5cbiAgY29uc3QgY29udGV4dFNjaGVtYXMgPSBPYmplY3QuZW50cmllcyhjb250ZXh0cylcbiAgICAucmVkdWNlKFxuICAgICAgKGFjYywgWyBjb250ZXh0TmFtZSwgY29udGV4dERlZmluaXRpb24gXSkgPT4gKHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICBbY29udGV4dE5hbWVdOiBhcHBseU9wZXJhdG9ycyhjb250ZXh0RGVmaW5pdGlvbiwgZGVmYXVsdFNjaGVtYSwgY29udGV4dE5hbWUpXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKVxuXG4gIHJldHVybiB7XG4gICAgZGVmYXVsdDogZGVmYXVsdFNjaGVtYSxcbiAgICAuLi5jb250ZXh0U2NoZW1hc1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbGxEZWZhdWx0UHJvcGVydGllcyAocHJvcGVydHlEZWZpbml0aW9uKSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhwcm9wZXJ0eURlZmluaXRpb24pXG4gICAgLnJlZHVjZShcbiAgICAgIChhY2MsIFsgcHJvcGVydHlOYW1lLCB7IHZhbGlkYXRvciwgZmFjdG9yeSwgc2tpcHBhYmxlLCByZWFkT25seSwgZGVmYXVsdDogX2RlZmF1bHQgfSBdKSA9PiAoe1xuICAgICAgICAuLi5hY2MsXG4gICAgICAgIFtwcm9wZXJ0eU5hbWVdOiB7XG4gICAgICAgICAgZGVmYXVsdDogX2RlZmF1bHQsXG4gICAgICAgICAgZmFjdG9yeSxcbiAgICAgICAgICByZWFkT25seSxcbiAgICAgICAgICBza2lwcGFibGU6ICEhc2tpcHBhYmxlLFxuICAgICAgICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yIHx8IGFsbG93QW55XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApXG59XG5cbmZ1bmN0aW9uIGFwcGx5T3BlcmF0b3JzIChjb250ZXh0RGVmaW5pdGlvbiwgZGVmYXVsdFNjaGVtYSwgY29udGV4dE5hbWUpIHtcbiAgY29uc3Qge1xuICAgICRleGNsdWRlID0gW10sXG4gICAgJGluY2x1ZGUgPSBbXSxcbiAgICAkc2tpcCA9IFtdLFxuICAgICRtb2RpZnkgPSB7fVxuICB9ID0gY29udGV4dERlZmluaXRpb25cblxuICBpZiAoJGluY2x1ZGUubGVuZ3RoID4gMCAmJiAkZXhjbHVkZS5sZW5ndGggPiAwKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhgQm90aCAkaW5jbHVkZSBhbmQgJGV4Y2x1ZGUgb3BlcmF0b3JzIHdlcmUgdXNlZCBpbiBjb250ZXh0ICR7Y29udGV4dE5hbWV9LiBCZXdhcmUgdGhhdCAkaW5jbHVkZSB3aWxsIHRha2UgcHJlY2VkZW5jZS5gKVxuICB9XG5cbiAgY29uc3QgZmluYWxTY2hlbWEgPSAkaW5jbHVkZS5sZW5ndGggPiAwXG4gICAgPyBhcHBseUluY2x1ZGUoJGluY2x1ZGUsIGRlZmF1bHRTY2hlbWEpXG4gICAgOiBhcHBseUV4Y2x1ZGUoJGV4Y2x1ZGUsIGRlZmF1bHRTY2hlbWEpXG5cbiAgY29uc3QgZmluYWxLZXlzID0gT2JqZWN0LmtleXMoZmluYWxTY2hlbWEpXG5cbiAgLy8gQFRPRE86IHJlZmFjdG9yIHRoaXMhXG4gIGNvbnN0IHZhbGlkYXRvcnNUb01vZGlmeSA9IHBpY2soJG1vZGlmeSwgZmluYWxLZXlzKVxuICBjb25zdCB2YWxpZGF0b3JQYXRjaCA9IE9iamVjdC5lbnRyaWVzKHZhbGlkYXRvcnNUb01vZGlmeSlcbiAgICAucmVkdWNlKFxuICAgICAgKGFjYywgWyBwcm9wZXJ0eU5hbWUsIG5ld1ZhbGlkYXRvciBdKSA9PiAoe1xuICAgICAgICAuLi5hY2MsXG4gICAgICAgIFtwcm9wZXJ0eU5hbWVdOiB7XG4gICAgICAgICAgdmFsaWRhdG9yOiBuZXdWYWxpZGF0b3JcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB7fVxuICAgIClcblxuICBjb25zdCBza2lwcGFibGVzVG9Nb2RpZnkgPSBpbnRlcnNlY3Rpb24oJHNraXAsIGZpbmFsS2V5cylcbiAgY29uc3Qgc2tpcHBhYmxlUGF0Y2ggPSBza2lwcGFibGVzVG9Nb2RpZnlcbiAgICAucmVkdWNlKFxuICAgICAgKGFjYywgcHJvcGVydHlOYW1lKSA9PiAoe1xuICAgICAgICAuLi5hY2MsXG4gICAgICAgIFtwcm9wZXJ0eU5hbWVdOiB7XG4gICAgICAgICAgc2tpcHBhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApXG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGZpbmFsU2NoZW1hKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoYWNjLCBbIGtleSwgZGVmaW5pdGlvbiBdKSA9PlxuICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIGFjYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBba2V5XToge1xuICAgICAgICAgICAgICAuLi5kZWZpbml0aW9uLFxuICAgICAgICAgICAgICAuLi52YWxpZGF0b3JQYXRjaFtrZXldLFxuICAgICAgICAgICAgICAuLi5za2lwcGFibGVQYXRjaFtrZXldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAge31cbiAgICApXG59XG5cbmZ1bmN0aW9uIGFwcGx5SW5jbHVkZSAoJGluY2x1ZGUsIHNjaGVtYSkge1xuICBpZiAoJGluY2x1ZGUubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwaWNrKHNjaGVtYSwgJGluY2x1ZGUpXG4gIH1cblxuICByZXR1cm4gc2NoZW1hXG59XG5cbmZ1bmN0aW9uIGFwcGx5RXhjbHVkZSAoJGV4Y2x1ZGUsIHNjaGVtYSkge1xuICBpZiAoJGV4Y2x1ZGUubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBvbWl0KHNjaGVtYSwgJGV4Y2x1ZGUpXG4gIH1cblxuICByZXR1cm4gc2NoZW1hXG59XG4iXX0=