UNPKG

speckoloo

Version:
1,571 lines (1,515 loc) 42.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var cov_2ewyhc2fha = function () { var path = '/home/henrique/labs/speckoloo/src/factory.js', hash = '6fe2ea14a1c04c470f6cf8adb44d4cd6677e77d1', global = new Function('return this')(), gcv = '__coverage__', coverageData = { path: '/home/henrique/labs/speckoloo/src/factory.js', statementMap: { '0': { start: { line: 6, column: 29 }, end: { line: 6, column: 38 } }, '1': { start: { line: 8, column: 34 }, end: { line: 48, column: 1 } }, '2': { start: { line: 9, column: 28 }, end: { line: 16, column: 5 } }, '3': { start: { line: 11, column: 40 }, end: { line: 14, column: 7 } }, '4': { start: { line: 18, column: 2 }, end: { line: 47, column: 3 } }, '5': { start: { line: 31, column: 8 }, end: { line: 31, column: 49 } }, '6': { start: { line: 33, column: 8 }, end: { line: 33, column: 43 } }, '7': { start: { line: 35, column: 8 }, end: { line: 35, column: 50 } }, '8': { start: { line: 40, column: 8 }, end: { line: 40, column: 49 } }, '9': { start: { line: 42, column: 8 }, end: { line: 42, column: 43 } }, '10': { start: { line: 44, column: 8 }, end: { line: 44, column: 52 } }, '11': { start: { line: 51, column: 2 }, end: { line: 53, column: 3 } }, '12': { start: { line: 52, column: 4 }, end: { line: 52, column: 51 } }, '13': { start: { line: 57, column: 2 }, end: { line: 59, column: 3 } }, '14': { start: { line: 58, column: 4 }, end: { line: 58, column: 10 } }, '15': { start: { line: 61, column: 2 }, end: { line: 64, column: 21 } }, '16': { start: { line: 62, column: 4 }, end: { line: 64, column: 21 } }, '17': { start: { line: 68, column: 2 }, end: { line: 94, column: 5 } }, '18': { start: { line: 71, column: 29 }, end: { line: 71, column: 70 } }, '19': { start: { line: 72, column: 8 }, end: { line: 74, column: 21 } }, '20': { start: { line: 76, column: 31 }, end: { line: 80, column: 9 } }, '21': { start: { line: 77, column: 19 }, end: { line: 77, column: 42 } }, '22': { start: { line: 82, column: 33 }, end: { line: 84, column: 14 } }, '23': { start: { line: 83, column: 31 }, end: { line: 83, column: 72 } }, '24': { start: { line: 86, column: 8 }, end: { line: 91, column: 9 } }, '25': { start: { line: 98, column: 59 }, end: { line: 98, column: 75 } }, '26': { start: { line: 100, column: 17 }, end: { line: 100, column: 51 } }, '27': { start: { line: 102, column: 24 }, end: { line: 108, column: 10 } }, '28': { start: { line: 104, column: 6 }, end: { line: 106, column: 7 } }, '29': { start: { line: 105, column: 8 }, end: { line: 105, column: 66 } }, '30': { start: { line: 107, column: 6 }, end: { line: 107, column: 16 } }, '31': { start: { line: 110, column: 21 }, end: { line: 110, column: 44 } }, '32': { start: { line: 111, column: 20 }, end: { line: 111, column: 84 } }, '33': { start: { line: 113, column: 18 }, end: { line: 135, column: 3 } }, '34': { start: { line: 117, column: 28 }, end: { line: 119, column: 21 } }, '35': { start: { line: 121, column: 4 }, end: { line: 121, column: 57 } }, '36': { start: { line: 123, column: 24 }, end: { line: 125, column: 57 } }, '37': { start: { line: 127, column: 21 }, end: { line: 130, column: 5 } }, '38': { start: { line: 132, column: 4 }, end: { line: 134, column: 6 } }, '39': { start: { line: 137, column: 2 }, end: { line: 137, column: 16 } } }, fnMap: { '0': { name: '(anonymous_0)', decl: { start: { line: 8, column: 34 }, end: { line: 8, column: 35 } }, loc: { start: { line: 8, column: 55 }, end: { line: 48, column: 1 } }, line: 8 }, '1': { name: '(anonymous_1)', decl: { start: { line: 11, column: 6 }, end: { line: 11, column: 7 } }, loc: { start: { line: 11, column: 40 }, end: { line: 14, column: 7 } }, line: 11 }, '2': { name: '(anonymous_2)', decl: { start: { line: 24, column: 13 }, end: { line: 24, column: 14 } }, loc: { start: { line: 24, column: 55 }, end: { line: 36, column: 7 } }, line: 24 }, '3': { name: '(anonymous_3)', decl: { start: { line: 39, column: 13 }, end: { line: 39, column: 14 } }, loc: { start: { line: 39, column: 55 }, end: { line: 45, column: 7 } }, line: 39 }, '4': { name: 'checkContext', decl: { start: { line: 50, column: 9 }, end: { line: 50, column: 21 } }, loc: { start: { line: 50, column: 40 }, end: { line: 54, column: 1 } }, line: 50 }, '5': { name: 'nestedFactoryWrapper', decl: { start: { line: 56, column: 9 }, end: { line: 56, column: 29 } }, loc: { start: { line: 56, column: 40 }, end: { line: 65, column: 1 } }, line: 56 }, '6': { name: '(anonymous_6)', decl: { start: { line: 61, column: 9 }, end: { line: 61, column: 10 } }, loc: { start: { line: 62, column: 4 }, end: { line: 64, column: 21 } }, line: 62 }, '7': { name: 'buildEntityPropertyDescriptors', decl: { start: { line: 67, column: 9 }, end: { line: 67, column: 39 } }, loc: { start: { line: 67, column: 69 }, end: { line: 95, column: 1 } }, line: 67 }, '8': { name: '(anonymous_8)', decl: { start: { line: 70, column: 6 }, end: { line: 70, column: 7 } }, loc: { start: { line: 70, column: 47 }, end: { line: 92, column: 7 } }, line: 70 }, '9': { name: '(anonymous_9)', decl: { start: { line: 97, column: 15 }, end: { line: 97, column: 16 } }, loc: { start: { line: 97, column: 35 }, end: { line: 138, column: 1 } }, line: 97 }, '10': { name: '(anonymous_10)', decl: { start: { line: 103, column: 12 }, end: { line: 103, column: 13 } }, loc: { start: { line: 103, column: 44 }, end: { line: 108, column: 5 } }, line: 103 }, '11': { name: '(anonymous_11)', decl: { start: { line: 113, column: 18 }, end: { line: 113, column: 19 } }, loc: { start: { line: 113, column: 89 }, end: { line: 135, column: 3 } }, line: 113 } }, branchMap: { '0': { loc: { start: { line: 24, column: 23 }, end: { line: 24, column: 53 } }, type: 'default-arg', locations: [{ start: { line: 24, column: 33 }, end: { line: 24, column: 53 } }], line: 24 }, '1': { loc: { start: { line: 31, column: 18 }, end: { line: 31, column: 49 } }, type: 'binary-expr', locations: [{ start: { line: 31, column: 18 }, end: { line: 31, column: 25 } }, { start: { line: 31, column: 29 }, end: { line: 31, column: 49 } }], line: 31 }, '2': { loc: { start: { line: 39, column: 23 }, end: { line: 39, column: 53 } }, type: 'default-arg', locations: [{ start: { line: 39, column: 33 }, end: { line: 39, column: 53 } }], line: 39 }, '3': { loc: { start: { line: 40, column: 18 }, end: { line: 40, column: 49 } }, type: 'binary-expr', locations: [{ start: { line: 40, column: 18 }, end: { line: 40, column: 25 } }, { start: { line: 40, column: 29 }, end: { line: 40, column: 49 } }], line: 40 }, '4': { loc: { start: { line: 51, column: 2 }, end: { line: 53, column: 3 } }, type: 'if', locations: [{ start: { line: 51, column: 2 }, end: { line: 53, column: 3 } }, { start: { line: 51, column: 2 }, end: { line: 53, column: 3 } }], line: 51 }, '5': { loc: { start: { line: 57, column: 2 }, end: { line: 59, column: 3 } }, type: 'if', locations: [{ start: { line: 57, column: 2 }, end: { line: 59, column: 3 } }, { start: { line: 57, column: 2 }, end: { line: 59, column: 3 } }], line: 57 }, '6': { loc: { start: { line: 62, column: 4 }, end: { line: 64, column: 21 } }, type: 'cond-expr', locations: [{ start: { line: 63, column: 8 }, end: { line: 63, column: 17 } }, { start: { line: 64, column: 8 }, end: { line: 64, column: 21 } }], line: 62 }, '7': { loc: { start: { line: 71, column: 29 }, end: { line: 71, column: 70 } }, type: 'binary-expr', locations: [{ start: { line: 71, column: 29 }, end: { line: 71, column: 58 } }, { start: { line: 71, column: 62 }, end: { line: 71, column: 70 } }], line: 71 }, '8': { loc: { start: { line: 72, column: 27 }, end: { line: 74, column: 21 } }, type: 'cond-expr', locations: [{ start: { line: 73, column: 12 }, end: { line: 73, column: 42 } }, { start: { line: 74, column: 12 }, end: { line: 74, column: 21 } }], line: 72 }, '9': { loc: { start: { line: 82, column: 33 }, end: { line: 84, column: 14 } }, type: 'cond-expr', locations: [{ start: { line: 83, column: 12 }, end: { line: 83, column: 76 } }, { start: { line: 84, column: 12 }, end: { line: 84, column: 14 } }], line: 82 }, '10': { loc: { start: { line: 98, column: 10 }, end: { line: 98, column: 23 } }, type: 'default-arg', locations: [{ start: { line: 98, column: 21 }, end: { line: 98, column: 23 } }], line: 98 }, '11': { loc: { start: { line: 98, column: 25 }, end: { line: 98, column: 39 } }, type: 'default-arg', locations: [{ start: { line: 98, column: 37 }, end: { line: 98, column: 39 } }], line: 98 }, '12': { loc: { start: { line: 104, column: 6 }, end: { line: 106, column: 7 } }, type: 'if', locations: [{ start: { line: 104, column: 6 }, end: { line: 106, column: 7 } }, { start: { line: 104, column: 6 }, end: { line: 106, column: 7 } }], line: 104 }, '13': { loc: { start: { line: 113, column: 19 }, end: { line: 113, column: 28 } }, type: 'default-arg', locations: [{ start: { line: 113, column: 26 }, end: { line: 113, column: 28 } }], line: 113 }, '14': { loc: { start: { line: 113, column: 30 }, end: { line: 113, column: 84 } }, type: 'default-arg', locations: [{ start: { line: 113, column: 59 }, end: { line: 113, column: 84 } }], line: 113 }, '15': { loc: { start: { line: 113, column: 32 }, end: { line: 113, column: 54 } }, type: 'default-arg', locations: [{ start: { line: 113, column: 49 }, end: { line: 113, column: 54 } }], line: 113 }, '16': { loc: { start: { line: 117, column: 28 }, end: { line: 119, column: 21 } }, type: 'cond-expr', locations: [{ start: { line: 118, column: 8 }, end: { line: 118, column: 10 } }, { start: { line: 119, column: 8 }, end: { line: 119, column: 21 } }], line: 117 }, '17': { loc: { start: { line: 121, column: 46 }, end: { line: 121, column: 56 } }, type: 'binary-expr', locations: [{ start: { line: 121, column: 46 }, end: { line: 121, column: 50 } }, { start: { line: 121, column: 54 }, end: { line: 121, column: 56 } }], line: 121 }, '18': { loc: { start: { line: 123, column: 24 }, end: { line: 125, column: 57 } }, type: 'cond-expr', locations: [{ start: { line: 124, column: 8 }, end: { line: 124, column: 10 } }, { start: { line: 125, column: 8 }, end: { line: 125, column: 57 } }], line: 123 } }, 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, '25': 0, '26': 0, '27': 0, '28': 0, '29': 0, '30': 0, '31': 0, '32': 0, '33': 0, '34': 0, '35': 0, '36': 0, '37': 0, '38': 0, '39': 0 }, f: { '0': 0, '1': 0, '2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0, '10': 0, '11': 0 }, b: { '0': [0], '1': [0, 0], '2': [0], '3': [0, 0], '4': [0, 0], '5': [0, 0], '6': [0, 0], '7': [0, 0], '8': [0, 0], '9': [0, 0], '10': [0], '11': [0], '12': [0, 0], '13': [0], '14': [0], '15': [0], '16': [0, 0], '17': [0, 0], '18': [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; }; var _common = require('./common'); var _validate = require('./validate'); var _validate2 = _interopRequireDefault(_validate); var _toJson = require('./to-json'); var _toJson2 = _interopRequireDefault(_toJson); var _buildSchema = require('./build-schema'); var _buildSchema2 = _interopRequireDefault(_buildSchema); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } const DEFAULT_CONTEXT_NAME = (cov_2ewyhc2fha.s[0]++, 'default'); cov_2ewyhc2fha.s[1]++; const buildPrototypeDescriptors = (schema, methods) => { cov_2ewyhc2fha.f[0]++; const methodDescriptors = (cov_2ewyhc2fha.s[2]++, _objectEntries(methods).reduce((acc, [methodName, method]) => { cov_2ewyhc2fha.f[1]++; cov_2ewyhc2fha.s[3]++; return _extends({}, acc, { [methodName]: { value: method } }); }, {})); cov_2ewyhc2fha.s[4]++; return _extends({}, methodDescriptors, { $schema: { value: schema }, toJSON: { value: function value(context = (cov_2ewyhc2fha.b[0][0]++, DEFAULT_CONTEXT_NAME)) { cov_2ewyhc2fha.f[2]++; cov_2ewyhc2fha.s[5]++; /** * Handles the case when calling `JSON.stringify` directly on the entity. * In this case, `toJSON` is called with an empty string as first argument. * * @see { @link https://mzl.la/2hgTyXG } */ context = (cov_2ewyhc2fha.b[1][0]++, context) || (cov_2ewyhc2fha.b[1][1]++, DEFAULT_CONTEXT_NAME); cov_2ewyhc2fha.s[6]++; checkContext(this.$schema, context); cov_2ewyhc2fha.s[7]++; return (0, _toJson2.default)(this.$schema[context], this); } }, validate: { value: function value(context = (cov_2ewyhc2fha.b[2][0]++, DEFAULT_CONTEXT_NAME)) { cov_2ewyhc2fha.f[3]++; cov_2ewyhc2fha.s[8]++; context = (cov_2ewyhc2fha.b[3][0]++, context) || (cov_2ewyhc2fha.b[3][1]++, DEFAULT_CONTEXT_NAME); cov_2ewyhc2fha.s[9]++; checkContext(this.$schema, context); cov_2ewyhc2fha.s[10]++; return (0, _validate2.default)(this.$schema[context], this); } } }); }; function checkContext(schema, context) { cov_2ewyhc2fha.f[4]++; cov_2ewyhc2fha.s[11]++; if (schema[context] === undefined) { cov_2ewyhc2fha.b[4][0]++; cov_2ewyhc2fha.s[12]++; throw new Error(`Invalid context "${context}"`); } else { cov_2ewyhc2fha.b[4][1]++; } } function nestedFactoryWrapper(factory) { cov_2ewyhc2fha.f[5]++; cov_2ewyhc2fha.s[13]++; if (factory === undefined) { cov_2ewyhc2fha.b[5][0]++; cov_2ewyhc2fha.s[14]++; return; } else { cov_2ewyhc2fha.b[5][1]++; } cov_2ewyhc2fha.s[15]++; return data => { cov_2ewyhc2fha.f[6]++; cov_2ewyhc2fha.s[16]++; return (0, _common.isUndefinedOrNull)(data) ? (cov_2ewyhc2fha.b[6][0]++, undefined) : (cov_2ewyhc2fha.b[6][1]++, factory(data)); }; } function buildEntityPropertyDescriptors(allowedData, defaultSchema) { cov_2ewyhc2fha.f[7]++; cov_2ewyhc2fha.s[17]++; return _objectEntries(defaultSchema).reduce((acc, [key, { factory, readOnly }]) => { cov_2ewyhc2fha.f[8]++; const finalFactory = (cov_2ewyhc2fha.s[18]++, (cov_2ewyhc2fha.b[7][0]++, nestedFactoryWrapper(factory)) || (cov_2ewyhc2fha.b[7][1]++, _common.identity)); cov_2ewyhc2fha.s[19]++; allowedData[key] = allowedData[key] ? (cov_2ewyhc2fha.b[8][0]++, finalFactory(allowedData[key])) : (cov_2ewyhc2fha.b[8][1]++, undefined); const baseDescriptor = (cov_2ewyhc2fha.s[20]++, { get() { cov_2ewyhc2fha.s[21]++; return allowedData[key]; }, enumerable: true, configurable: true }); const setterDescriptor = (cov_2ewyhc2fha.s[22]++, !readOnly ? (cov_2ewyhc2fha.b[9][0]++, { set(newValue) { cov_2ewyhc2fha.s[23]++; allowedData[key] = finalFactory(newValue); } }) : (cov_2ewyhc2fha.b[9][1]++, {})); cov_2ewyhc2fha.s[24]++; return Object.assign(acc, { [key]: Object.assign(baseDescriptor, setterDescriptor) }); }, {}); } exports.default = schemaDefinition => { cov_2ewyhc2fha.f[9]++; var _ref = (cov_2ewyhc2fha.s[25]++, schemaDefinition), _ref$$methods = _ref.$methods; const $methods = _ref$$methods === undefined ? (cov_2ewyhc2fha.b[10][0]++, {}) : _ref$$methods; var _ref$$contexts = _ref.$contexts; const $contexts = _ref$$contexts === undefined ? (cov_2ewyhc2fha.b[11][0]++, {}) : _ref$$contexts, definition = _objectWithoutProperties(_ref, ['$methods', '$contexts']); const schema = (cov_2ewyhc2fha.s[26]++, (0, _buildSchema2.default)(definition, $contexts)); const defaultValues = (cov_2ewyhc2fha.s[27]++, _objectEntries(definition).reduce((acc, [propertyName, def]) => { cov_2ewyhc2fha.f[10]++; cov_2ewyhc2fha.s[28]++; if (def.default) { cov_2ewyhc2fha.b[12][0]++; cov_2ewyhc2fha.s[29]++; return Object.assign(acc, { [propertyName]: def.default }); } else { cov_2ewyhc2fha.b[12][1]++; } cov_2ewyhc2fha.s[30]++; return acc; }, {})); const schemaKeys = (cov_2ewyhc2fha.s[31]++, Object.keys(definition)); const prototype = (cov_2ewyhc2fha.s[32]++, Object.create(null, buildPrototypeDescriptors(schema, $methods))); cov_2ewyhc2fha.s[33]++; const factory = (data = (cov_2ewyhc2fha.b[13][0]++, {}), { ignoreDefaults = (cov_2ewyhc2fha.b[15][0]++, false) } = (cov_2ewyhc2fha.b[14][0]++, { ignoreDefaults: false })) => { cov_2ewyhc2fha.f[11]++; /** * The line bellow also covers the case when data is `null`. */ const currentDefaults = (cov_2ewyhc2fha.s[34]++, ignoreDefaults ? (cov_2ewyhc2fha.b[16][0]++, {}) : (cov_2ewyhc2fha.b[16][1]++, defaultValues)); cov_2ewyhc2fha.s[35]++; data = Object.assign({}, currentDefaults, (cov_2ewyhc2fha.b[17][0]++, data) || (cov_2ewyhc2fha.b[17][1]++, {})); const allowedData = (cov_2ewyhc2fha.s[36]++, Object.keys(data).length === 0 ? (cov_2ewyhc2fha.b[18][0]++, {}) : (cov_2ewyhc2fha.b[18][1]++, (0, _common.omitBy)((0, _common.pick)(data, schemaKeys), _common.isUndefinedOrNull))); const instance = (cov_2ewyhc2fha.s[37]++, Object.create(prototype, buildEntityPropertyDescriptors(allowedData, schema.default))); cov_2ewyhc2fha.s[38]++; return Object.defineProperty(instance, 'constructor', { value: factory }); }; cov_2ewyhc2fha.s[39]++; return factory; }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfQ09OVEVYVF9OQU1FIiwiYnVpbGRQcm90b3R5cGVEZXNjcmlwdG9ycyIsInNjaGVtYSIsIm1ldGhvZHMiLCJtZXRob2REZXNjcmlwdG9ycyIsInJlZHVjZSIsImFjYyIsIm1ldGhvZE5hbWUiLCJtZXRob2QiLCJ2YWx1ZSIsIiRzY2hlbWEiLCJ0b0pTT04iLCJjb250ZXh0IiwiY2hlY2tDb250ZXh0IiwidmFsaWRhdGUiLCJ1bmRlZmluZWQiLCJFcnJvciIsIm5lc3RlZEZhY3RvcnlXcmFwcGVyIiwiZmFjdG9yeSIsImRhdGEiLCJidWlsZEVudGl0eVByb3BlcnR5RGVzY3JpcHRvcnMiLCJhbGxvd2VkRGF0YSIsImRlZmF1bHRTY2hlbWEiLCJrZXkiLCJyZWFkT25seSIsImZpbmFsRmFjdG9yeSIsImJhc2VEZXNjcmlwdG9yIiwiZ2V0IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsInNldHRlckRlc2NyaXB0b3IiLCJzZXQiLCJuZXdWYWx1ZSIsIk9iamVjdCIsImFzc2lnbiIsInNjaGVtYURlZmluaXRpb24iLCIkbWV0aG9kcyIsIiRjb250ZXh0cyIsImRlZmluaXRpb24iLCJkZWZhdWx0VmFsdWVzIiwicHJvcGVydHlOYW1lIiwiZGVmIiwiZGVmYXVsdCIsInNjaGVtYUtleXMiLCJrZXlzIiwicHJvdG90eXBlIiwiY3JlYXRlIiwiaWdub3JlRGVmYXVsdHMiLCJjdXJyZW50RGVmYXVsdHMiLCJsZW5ndGgiLCJpbnN0YW5jZSIsImRlZmluZVByb3BlcnR5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUF3Q2pDLFNBQU9BLE9BQVA7QUFDRCxDIiwiZmlsZSI6ImZhY3RvcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwaWNrLCBvbWl0QnksIGlkZW50aXR5LCBpc1VuZGVmaW5lZE9yTnVsbCB9IGZyb20gJy4vY29tbW9uJ1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUnXG5pbXBvcnQgdG9KU09OIGZyb20gJy4vdG8tanNvbidcbmltcG9ydCBidWlsZFNjaGVtYSBmcm9tICcuL2J1aWxkLXNjaGVtYSdcblxuY29uc3QgREVGQVVMVF9DT05URVhUX05BTUUgPSAnZGVmYXVsdCdcblxuY29uc3QgYnVpbGRQcm90b3R5cGVEZXNjcmlwdG9ycyA9IChzY2hlbWEsIG1ldGhvZHMpID0+IHtcbiAgY29uc3QgbWV0aG9kRGVzY3JpcHRvcnMgPSBPYmplY3QuZW50cmllcyhtZXRob2RzKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoYWNjLCBbIG1ldGhvZE5hbWUsIG1ldGhvZCBdKSA9PiAoe1xuICAgICAgICAuLi5hY2MsXG4gICAgICAgIFttZXRob2ROYW1lXTogeyB2YWx1ZTogbWV0aG9kIH1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5tZXRob2REZXNjcmlwdG9ycyxcbiAgICAkc2NoZW1hOiB7XG4gICAgICB2YWx1ZTogc2NoZW1hXG4gICAgfSxcbiAgICB0b0pTT046IHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoY29udGV4dCA9IERFRkFVTFRfQ09OVEVYVF9OQU1FKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIHRoZSBjYXNlIHdoZW4gY2FsbGluZyBgSlNPTi5zdHJpbmdpZnlgIGRpcmVjdGx5IG9uIHRoZSBlbnRpdHkuXG4gICAgICAgICAqIEluIHRoaXMgY2FzZSwgYHRvSlNPTmAgaXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgc3RyaW5nIGFzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHsgQGxpbmsgaHR0cHM6Ly9temwubGEvMmhnVHlYRyB9XG4gICAgICAgICAqL1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dCB8fCBERUZBVUxUX0NPTlRFWFRfTkFNRVxuXG4gICAgICAgIGNoZWNrQ29udGV4dCh0aGlzLiRzY2hlbWEsIGNvbnRleHQpXG5cbiAgICAgICAgcmV0dXJuIHRvSlNPTih0aGlzLiRzY2hlbWFbY29udGV4dF0sIHRoaXMpXG4gICAgICB9XG4gICAgfSxcbiAgICB2YWxpZGF0ZToge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIChjb250ZXh0ID0gREVGQVVMVF9DT05URVhUX05BTUUpIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgREVGQVVMVF9DT05URVhUX05BTUVcblxuICAgICAgICBjaGVja0NvbnRleHQodGhpcy4kc2NoZW1hLCBjb250ZXh0KVxuXG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLiRzY2hlbWFbY29udGV4dF0sIHRoaXMpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ29udGV4dCAoc2NoZW1hLCBjb250ZXh0KSB7XG4gIGlmIChzY2hlbWFbY29udGV4dF0gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250ZXh0IFwiJHtjb250ZXh0fVwiYClcbiAgfVxufVxuXG5mdW5jdGlvbiBuZXN0ZWRGYWN0b3J5V3JhcHBlciAoZmFjdG9yeSkge1xuICBpZiAoZmFjdG9yeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICByZXR1cm4gZGF0YSA9PlxuICAgIGlzVW5kZWZpbmVkT3JOdWxsKGRhdGEpXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBmYWN0b3J5KGRhdGEpXG59XG5cbmZ1bmN0aW9uIGJ1aWxkRW50aXR5UHJvcGVydHlEZXNjcmlwdG9ycyAoYWxsb3dlZERhdGEsIGRlZmF1bHRTY2hlbWEpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRlZmF1bHRTY2hlbWEpXG4gICAgLnJlZHVjZShcbiAgICAgIChhY2MsIFsga2V5LCB7IGZhY3RvcnksIHJlYWRPbmx5IH0gXSkgPT4ge1xuICAgICAgICBjb25zdCBmaW5hbEZhY3RvcnkgPSBuZXN0ZWRGYWN0b3J5V3JhcHBlcihmYWN0b3J5KSB8fCBpZGVudGl0eVxuICAgICAgICBhbGxvd2VkRGF0YVtrZXldID0gYWxsb3dlZERhdGFba2V5XVxuICAgICAgICAgID8gZmluYWxGYWN0b3J5KGFsbG93ZWREYXRhW2tleV0pXG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgICBjb25zdCBiYXNlRGVzY3JpcHRvciA9IHtcbiAgICAgICAgICBnZXQgKCkgeyByZXR1cm4gYWxsb3dlZERhdGFba2V5XSB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXR0ZXJEZXNjcmlwdG9yID0gIXJlYWRPbmx5XG4gICAgICAgICAgPyB7IHNldCAobmV3VmFsdWUpIHsgYWxsb3dlZERhdGFba2V5XSA9IGZpbmFsRmFjdG9yeShuZXdWYWx1ZSkgfSB9XG4gICAgICAgICAgOiB7fVxuXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIGFjYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBba2V5XTogT2JqZWN0LmFzc2lnbihiYXNlRGVzY3JpcHRvciwgc2V0dGVyRGVzY3JpcHRvcilcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICB7fVxuICAgIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2NoZW1hRGVmaW5pdGlvbiA9PiB7XG4gIGNvbnN0IHsgJG1ldGhvZHMgPSB7fSwgJGNvbnRleHRzID0ge30sIC4uLmRlZmluaXRpb24gfSA9IHNjaGVtYURlZmluaXRpb25cblxuICBjb25zdCBzY2hlbWEgPSBidWlsZFNjaGVtYShkZWZpbml0aW9uLCAkY29udGV4dHMpXG5cbiAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb24pXG4gICAgLnJlZHVjZSgoYWNjLCBbIHByb3BlcnR5TmFtZSwgZGVmIF0pID0+IHtcbiAgICAgIGlmIChkZWYuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW3Byb3BlcnR5TmFtZV06IGRlZi5kZWZhdWx0IH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwge30pXG5cbiAgY29uc3Qgc2NoZW1hS2V5cyA9IE9iamVjdC5rZXlzKGRlZmluaXRpb24pXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCwgYnVpbGRQcm90b3R5cGVEZXNjcmlwdG9ycyhzY2hlbWEsICRtZXRob2RzKSlcblxuICBjb25zdCBmYWN0b3J5ID0gKGRhdGEgPSB7fSwgeyBpZ25vcmVEZWZhdWx0cyA9IGZhbHNlIH0gPSB7IGlnbm9yZURlZmF1bHRzOiBmYWxzZSB9KSA9PiB7XG4gICAgLyoqXG4gICAgICogVGhlIGxpbmUgYmVsbG93IGFsc28gY292ZXJzIHRoZSBjYXNlIHdoZW4gZGF0YSBpcyBgbnVsbGAuXG4gICAgICovXG4gICAgY29uc3QgY3VycmVudERlZmF1bHRzID0gaWdub3JlRGVmYXVsdHNcbiAgICAgID8ge31cbiAgICAgIDogZGVmYXVsdFZhbHVlc1xuXG4gICAgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnREZWZhdWx0cywgZGF0YSB8fCB7fSlcblxuICAgIGNvbnN0IGFsbG93ZWREYXRhID0gT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwXG4gICAgICA/IHt9XG4gICAgICA6IG9taXRCeShwaWNrKGRhdGEsIHNjaGVtYUtleXMpLCBpc1VuZGVmaW5lZE9yTnVsbClcblxuICAgIGNvbnN0IGluc3RhbmNlID0gT2JqZWN0LmNyZWF0ZShcbiAgICAgIHByb3RvdHlwZSxcbiAgICAgIGJ1aWxkRW50aXR5UHJvcGVydHlEZXNjcmlwdG9ycyhhbGxvd2VkRGF0YSwgc2NoZW1hLmRlZmF1bHQpXG4gICAgKVxuXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwgJ2NvbnN0cnVjdG9yJywge1xuICAgICAgdmFsdWU6IGZhY3RvcnlcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGZhY3Rvcnlcbn1cbiJdfQ==