UNPKG

computed-types

Version:

Runtime validation types for TypeScript.

165 lines (136 loc) 20.4 kB
"use strict"; exports.__esModule = true; exports.either = either; exports.merge = merge; exports.optional = optional; exports.strictOptional = strictOptional; var _compiler = _interopRequireDefault(require("./compiler")); var _utils = require("./utils"); var _switch = require("./switch"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function either(...candidates) { if (!candidates.length) { throw new RangeError(`Expecting at least one argument`); } const validators = candidates.map(schema => (0, _compiler.default)(schema)); const switchKey = (0, _switch.findSwitchKey)(...candidates); if (switchKey) { return (0, _switch.generateSwitch)(switchKey, validators); } return (...args) => { let i = 0; const next = () => { const validator = validators[i++]; let res; try { // eslint-disable-next-line @typescript-eslint/no-explicit-any res = validator(...args); } catch (e) { if (i >= candidates.length) { throw e; } return next(); } if (!(0, _utils.isPromiseLike)(res)) { return res; } return res.then(null, e => { if (i >= candidates.length) { throw e; } return next(); }); }; return next(); }; } // export function merge<A, B, C, D, E, F, G>( // ...args: [A, B, C, D, E, F, G] // ): FunctionType< // SchemaReturnType< // A & B & C & D & E & F & G, // SchemaResolveType<A> & // SchemaResolveType<B> & // SchemaResolveType<C> & // SchemaResolveType<D> & // SchemaResolveType<E> & // SchemaResolveType<F> & // SchemaResolveType<G> // >, // MergeSchemaParameters< // SchemaParameters<A> & // SchemaParameters<B> & // SchemaParameters<C> & // SchemaParameters<D> & // SchemaParameters<E> & // SchemaParameters<F> & // SchemaParameters<G> // > // >; // export function merge<A, B, C, D, E, F, G, H>( // ...args: [A, B, C, D, E, F, G, H] // ): FunctionType< // SchemaReturnType< // A & B & C & D & E & F & G & H, // SchemaResolveType<A> & // SchemaResolveType<B> & // SchemaResolveType<C> & // SchemaResolveType<D> & // SchemaResolveType<E> & // SchemaResolveType<F> & // SchemaResolveType<G> & // SchemaResolveType<H> // >, // MergeSchemaParameters< // SchemaParameters<A> & // SchemaParameters<B> & // SchemaParameters<C> & // SchemaParameters<D> & // SchemaParameters<E> & // SchemaParameters<F> & // SchemaParameters<G> & // SchemaParameters<H> // > // >; function merge(...args) { if (!args.length) { throw new RangeError(`Expecting at least one argument`); } const validators = args.map(schema => (0, _compiler.default)(schema)); const validatorsCount = validators.length; if (validatorsCount === 1) { return validators[0]; } return (...args) => { let isAsync; const res = []; for (let i = 0; i < validatorsCount; i += 1) { const ret = validators[i](...args); if ((0, _utils.isPromiseLike)(ret)) { isAsync = true; } res.push(ret); } if (!isAsync) { return (0, _utils.deepConcat)(...res); } return Promise.all(res).then(resolved => (0, _utils.deepConcat)(...resolved)); }; } function optional(validator, defaultValue) { return (...args) => { if (args[0] == null || args[0] === '') { return defaultValue; } return validator(...args); }; } function strictOptional(validator, defaultValue) { return (...args) => { if (args[0] === undefined) { return defaultValue; } return validator(...args); }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvbG9naWMudHMiXSwibmFtZXMiOlsiZWl0aGVyIiwiY2FuZGlkYXRlcyIsImxlbmd0aCIsIlJhbmdlRXJyb3IiLCJ2YWxpZGF0b3JzIiwibWFwIiwic2NoZW1hIiwic3dpdGNoS2V5IiwiYXJncyIsImkiLCJuZXh0IiwidmFsaWRhdG9yIiwicmVzIiwiZSIsInRoZW4iLCJtZXJnZSIsInZhbGlkYXRvcnNDb3VudCIsImlzQXN5bmMiLCJyZXQiLCJwdXNoIiwiUHJvbWlzZSIsImFsbCIsInJlc29sdmVkIiwib3B0aW9uYWwiLCJkZWZhdWx0VmFsdWUiLCJzdHJpY3RPcHRpb25hbCIsInVuZGVmaW5lZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFPQTs7QUFDQTs7QUFDQTs7OztBQTZHTyxTQUFTQSxNQUFULENBQ0wsR0FBR0MsVUFERSxFQUtMO0FBQ0EsTUFBSSxDQUFDQSxVQUFVLENBQUNDLE1BQWhCLEVBQXdCO0FBQ3RCLFVBQU0sSUFBSUMsVUFBSixDQUFnQixpQ0FBaEIsQ0FBTjtBQUNEOztBQUVELFFBQU1DLFVBQVUsR0FBR0gsVUFBVSxDQUFDSSxHQUFYLENBQWdCQyxNQUFELElBQVksdUJBQVNBLE1BQVQsQ0FBM0IsQ0FBbkI7QUFFQSxRQUFNQyxTQUFTLEdBQUcsMkJBQWMsR0FBR04sVUFBakIsQ0FBbEI7O0FBQ0EsTUFBSU0sU0FBSixFQUFlO0FBQ2IsV0FBTyw0QkFBZUEsU0FBZixFQUEwQkgsVUFBMUIsQ0FBUDtBQUlEOztBQUVELFNBQVEsQ0FBQyxHQUFHSSxJQUFKLEtBQWlDO0FBQ3ZDLFFBQUlDLENBQUMsR0FBRyxDQUFSOztBQUVBLFVBQU1DLElBQUksR0FBRyxNQUFlO0FBQzFCLFlBQU1DLFNBQVMsR0FBR1AsVUFBVSxDQUFDSyxDQUFDLEVBQUYsQ0FBNUI7QUFFQSxVQUFJRyxHQUFKOztBQUNBLFVBQUk7QUFDRjtBQUNBQSxRQUFBQSxHQUFHLEdBQUdELFNBQVMsQ0FBQyxHQUFJSCxJQUFMLENBQWY7QUFD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SUFBSSxDQUFDLENBQUQsQ0FBSixLQUFZa0IsU0FBaEIsRUFBMkI7QUFDekIsYUFBT0YsWUFBUDtBQUNEOztBQUVELFdBQU9iLFNBQVMsQ0FBQyxHQUFHSCxJQUFKLENBQWhCO0FBQ0QsR0FSRDtBQVNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgTWVyZ2VTY2hlbWFQYXJhbWV0ZXJzLFxuICBTY2hlbWFQYXJhbWV0ZXJzLFxuICBTY2hlbWFSZXNvbHZlVHlwZSxcbiAgU2NoZW1hUmV0dXJuVHlwZSxcbn0gZnJvbSAnLi9pbyc7XG5pbXBvcnQgRnVuY3Rpb25UeXBlIGZyb20gJy4vRnVuY3Rpb25UeXBlJztcbmltcG9ydCBjb21waWxlciBmcm9tICcuL2NvbXBpbGVyJztcbmltcG9ydCB7IGRlZXBDb25jYXQsIGlzUHJvbWlzZUxpa2UgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGZpbmRTd2l0Y2hLZXksIGdlbmVyYXRlU3dpdGNoIH0gZnJvbSAnLi9zd2l0Y2gnO1xuXG5leHBvcnQgZnVuY3Rpb24gZWl0aGVyPEE+KFxuICAuLi5jYW5kaWRhdGVzOiBbQV1cbik6IEZ1bmN0aW9uVHlwZTxTY2hlbWFSZXR1cm5UeXBlPEE+LCBTY2hlbWFQYXJhbWV0ZXJzPEE+PjtcbmV4cG9ydCBmdW5jdGlvbiBlaXRoZXI8QSwgQj4oXG4gIC4uLmNhbmRpZGF0ZXM6IFtBLCBCXVxuKTogRnVuY3Rpb25UeXBlPFxuICBTY2hlbWFSZXR1cm5UeXBlPEE+IHwgU2NoZW1hUmV0dXJuVHlwZTxCPixcbiAgTWVyZ2VTY2hlbWFQYXJhbWV0ZXJzPFNjaGVtYVBhcmFtZXRlcnM8QT4gfCBTY2hlbWFQYXJhbWV0ZXJzPEI+PlxuPjtcbmV4cG9ydCBmdW5jdGlvbiBlaXRoZXI8QSwgQiwgQz4oXG4gIC4uLmNhbmRpZGF0ZXM6IFtBLCBCLCBDXVxuKTogRnVuY3Rpb25UeXBlPFxuICBTY2hlbWFSZXR1cm5UeXBlPEE+IHwgU2NoZW1hUmV0dXJuVHlwZTxCPiB8IFNjaGVtYVJldHVyblR5cGU8Qz4sXG4gIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxcbiAgICBTY2hlbWFQYXJhbWV0ZXJzPEE+IHwgU2NoZW1hUGFyYW1ldGVyczxCPiB8IFNjaGVtYVBhcmFtZXRlcnM8Qz5cbiAgPlxuPjtcbmV4cG9ydCBmdW5jdGlvbiBlaXRoZXI8QSwgQiwgQywgRD4oXG4gIC4uLmNhbmRpZGF0ZXM6IFtBLCBCLCBDLCBEXVxuKTogRnVuY3Rpb25UeXBlPFxuICB8IFNjaGVtYVJldHVyblR5cGU8QT5cbiAgfCBTY2hlbWFSZXR1cm5UeXBlPEI+XG4gIHwgU2NoZW1hUmV0dXJuVHlwZTxDPlxuICB8IFNjaGVtYVJldHVyblR5cGU8RD4sXG4gIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxcbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8QT5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8Qj5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8Qz5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8RD5cbiAgPlxuPjtcbmV4cG9ydCBmdW5jdGlvbiBlaXRoZXI8QSwgQiwgQywgRCwgRT4oXG4gIC4uLmNhbmRpZGF0ZXM6IFtBLCBCLCBDLCBELCBFXVxuKTogRnVuY3Rpb25UeXBlPFxuICB8IFNjaGVtYVJldHVyblR5cGU8QT5cbiAgfCBTY2hlbWFSZXR1cm5UeXBlPEI+XG4gIHwgU2NoZW1hUmV0dXJuVHlwZTxDPlxuICB8IFNjaGVtYVJldHVyblR5cGU8RD5cbiAgfCBTY2hlbWFSZXR1cm5UeXBlPEU+LFxuICBNZXJnZVNjaGVtYVBhcmFtZXRlcnM8XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEE+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEI+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEM+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEQ+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEU+XG4gID5cbj47XG5leHBvcnQgZnVuY3Rpb24gZWl0aGVyPEEsIEIsIEMsIEQsIEUsIEY+KFxuICAuLi5jYW5kaWRhdGVzOiBbQSwgQiwgQywgRCwgRSwgRl1cbik6IEZ1bmN0aW9uVHlwZTxcbiAgfCBTY2hlbWFSZXR1cm5UeXBlPEE+XG4gIHwgU2NoZW1hUmV0dXJuVHlwZTxCPlxuICB8IFNjaGVtYVJldHVyblR5cGU8Qz5cbiAgfCBTY2hlbWFSZXR1cm5UeXBlPEQ+XG4gIHwgU2NoZW1hUmV0dXJuVHlwZTxFPlxuICB8IFNjaGVtYVJldHVyblR5cGU8Rj4sXG4gIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxcbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8QT5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8Qj5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8Qz5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8RD5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8RT5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8Rj5cbiAgPlxuPjtcbmV4cG9ydCBmdW5jdGlvbiBlaXRoZXI8QSwgQiwgQywgRCwgRSwgRiwgRz4oXG4gIC4uLmNhbmRpZGF0ZXM6IFtBLCBCLCBDLCBELCBFLCBGLCBHXVxuKTogRnVuY3Rpb25UeXBlPFxuICB8IFNjaGVtYVJldHVyblR5cGU8QT5cbiAgfCBTY2hlbWFSZXR1cm5UeXBlPEI+XG4gIHwgU2NoZW1hUmV0dXJuVHlwZTxDPlxuICB8IFNjaGVtYVJldHVyblR5cGU8RD5cbiAgfCBTY2hlbWFSZXR1cm5UeXBlPEU+XG4gIHwgU2NoZW1hUmV0dXJuVHlwZTxGPlxuICB8IFNjaGVtYVJldHVyblR5cGU8Rz4sXG4gIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxcbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8QT5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8Qj5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8Qz5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8RD5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8RT5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8Rj5cbiAgICB8IFNjaGVtYVBhcmFtZXRlcnM8Rz5cbiAgPlxuPjtcbmV4cG9ydCBmdW5jdGlvbiBlaXRoZXI8QSwgQiwgQywgRCwgRSwgRiwgRywgSD4oXG4gIC4uLmNhbmRpZGF0ZXM6IFtBLCBCLCBDLCBELCBFLCBGLCBHLCBIXVxuKTogRnVuY3Rpb25UeXBlPFxuICB8IFNjaGVtYVJldHVyblR5cGU8QT5cbiAgfCBTY2hlbWFSZXR1cm5UeXBlPEI+XG4gIHwgU2NoZW1hUmV0dXJuVHlwZTxDPlxuICB8IFNjaGVtYVJldHVyblR5cGU8RD5cbiAgfCBTY2hlbWFSZXR1cm5UeXBlPEU+XG4gIHwgU2NoZW1hUmV0dXJuVHlwZTxGPlxuICB8IFNjaGVtYVJldHVyblR5cGU8Rz5cbiAgfCBTY2hlbWFSZXR1cm5UeXBlPEg+LFxuICBNZXJnZVNjaGVtYVBhcmFtZXRlcnM8XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEE+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEI+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEM+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEQ+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEU+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEY+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEc+XG4gICAgfCBTY2hlbWFQYXJhbWV0ZXJzPEg+XG4gID5cbj47XG5leHBvcnQgZnVuY3Rpb24gZWl0aGVyPEEsIFM+KFxuICAuLi5jYW5kaWRhdGVzOiBbQSwgLi4uU1tdXVxuKTogRnVuY3Rpb25UeXBlPFxuICBTY2hlbWFSZXR1cm5UeXBlPEE+IHwgU2NoZW1hUmV0dXJuVHlwZTxTPixcbiAgU2NoZW1hUGFyYW1ldGVyczxBIHwgUz5cbj4ge1xuICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEV4cGVjdGluZyBhdCBsZWFzdCBvbmUgYXJndW1lbnRgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbGlkYXRvcnMgPSBjYW5kaWRhdGVzLm1hcCgoc2NoZW1hKSA9PiBjb21waWxlcihzY2hlbWEpKTtcblxuICBjb25zdCBzd2l0Y2hLZXkgPSBmaW5kU3dpdGNoS2V5KC4uLmNhbmRpZGF0ZXMpO1xuICBpZiAoc3dpdGNoS2V5KSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlU3dpdGNoKHN3aXRjaEtleSwgdmFsaWRhdG9ycykgYXMgRnVuY3Rpb25UeXBlPFxuICAgICAgU2NoZW1hUmV0dXJuVHlwZTxBPiB8IFNjaGVtYVJldHVyblR5cGU8Uz4sXG4gICAgICBTY2hlbWFQYXJhbWV0ZXJzPEEgfCBTPlxuICAgID47XG4gIH1cblxuICByZXR1cm4gKCguLi5hcmdzOiB1bmtub3duW10pOiB1bmtub3duID0+IHtcbiAgICBsZXQgaSA9IDA7XG5cbiAgICBjb25zdCBuZXh0ID0gKCk6IHVua25vd24gPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gdmFsaWRhdG9yc1tpKytdO1xuXG4gICAgICBsZXQgcmVzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcmVzID0gdmFsaWRhdG9yKC4uLihhcmdzIGFzIGFueSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaSA+PSBjYW5kaWRhdGVzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzUHJvbWlzZUxpa2UocmVzKSkge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzLnRoZW4obnVsbCwgKGUpID0+IHtcbiAgICAgICAgaWYgKGkgPj0gY2FuZGlkYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV4dCgpO1xuICB9KSBhcyBGdW5jdGlvblR5cGU8XG4gICAgU2NoZW1hUmV0dXJuVHlwZTxBPiB8IFNjaGVtYVJldHVyblR5cGU8Uz4sXG4gICAgU2NoZW1hUGFyYW1ldGVyczxBIHwgUz5cbiAgPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlPEE+KFxuICAuLi5hcmdzOiBbQV1cbik6IEZ1bmN0aW9uVHlwZTxcbiAgU2NoZW1hUmV0dXJuVHlwZTxBPixcbiAgTWVyZ2VTY2hlbWFQYXJhbWV0ZXJzPFNjaGVtYVBhcmFtZXRlcnM8QT4+XG4+O1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlPEEsIEI+KFxuICAuLi5hcmdzOiBbQSwgQl1cbik6IEZ1bmN0aW9uVHlwZTxcbiAgU2NoZW1hUmV0dXJuVHlwZTxBICYgQiwgU2NoZW1hUmVzb2x2ZVR5cGU8QT4gJiBTY2hlbWFSZXNvbHZlVHlwZTxCPj4sXG4gIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxTY2hlbWFQYXJhbWV0ZXJzPEE+ICYgU2NoZW1hUGFyYW1ldGVyczxCPj5cbj47XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2U8QSwgQiwgQz4oXG4gIC4uLmFyZ3M6IFtBLCBCLCBDXVxuKTogRnVuY3Rpb25UeXBlPFxuICBTY2hlbWFSZXR1cm5UeXBlPFxuICAgIEEgJiBCICYgQyxcbiAgICBTY2hlbWFSZXNvbHZlVHlwZTxBPiAmIFNjaGVtYVJlc29sdmVUeXBlPEI+ICYgU2NoZW1hUmVzb2x2ZVR5cGU8Qz5cbiAgPixcbiAgTWVyZ2VTY2hlbWFQYXJhbWV0ZXJzPFxuICAgIFNjaGVtYVBhcmFtZXRlcnM8QT4gJiBTY2hlbWFQYXJhbWV0ZXJzPEI+ICYgU2NoZW1hUGFyYW1ldGVyczxDPlxuICA+XG4+O1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlPEEsIEIsIEMsIEQ+KFxuICAuLi5hcmdzOiBbQSwgQiwgQywgRF1cbik6IEZ1bmN0aW9uVHlwZTxcbiAgU2NoZW1hUmV0dXJuVHlwZTxcbiAgICBBICYgQiAmIEMgJiBELFxuICAgIFNjaGVtYVJlc29sdmVUeXBlPEE+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEI+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEM+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEQ+XG4gID4sXG4gIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxcbiAgICBTY2hlbWFQYXJhbWV0ZXJzPEE+ICZcbiAgICAgIFNjaGVtYVBhcmFtZXRlcnM8Qj4gJlxuICAgICAgU2NoZW1hUGFyYW1ldGVyczxDPiAmXG4gICAgICBTY2hlbWFQYXJhbWV0ZXJzPEQ+XG4gID5cbj47XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2U8QSwgQiwgQywgRCwgRT4oXG4gIC4uLmFyZ3M6IFtBLCBCLCBDLCBELCBFXVxuKTogRnVuY3Rpb25UeXBlPFxuICBTY2hlbWFSZXR1cm5UeXBlPFxuICAgIEEgJiBCICYgQyAmIEQgJiBFLFxuICAgIFNjaGVtYVJlc29sdmVUeXBlPEE+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEI+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEM+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEQ+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEU+XG4gID4sXG4gIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxcbiAgICBTY2hlbWFQYXJhbWV0ZXJzPEE+ICZcbiAgICAgIFNjaGVtYVBhcmFtZXRlcnM8Qj4gJlxuICAgICAgU2NoZW1hUGFyYW1ldGVyczxDPiAmXG4gICAgICBTY2hlbWFQYXJhbWV0ZXJzPEQ+ICZcbiAgICAgIFNjaGVtYVBhcmFtZXRlcnM8RT5cbiAgPlxuPjtcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZTxBLCBCLCBDLCBELCBFLCBGPihcbiAgLi4uYXJnczogW0EsIEIsIEMsIEQsIEUsIEZdXG4pOiBGdW5jdGlvblR5cGU8XG4gIFNjaGVtYVJldHVyblR5cGU8XG4gICAgQSAmIEIgJiBDICYgRCAmIEUgJiBGLFxuICAgIFNjaGVtYVJlc29sdmVUeXBlPEE+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEI+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEM+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEQ+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEU+ICZcbiAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEY+XG4gID4sXG4gIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxcbiAgICBTY2hlbWFQYXJhbWV0ZXJzPEE+ICZcbiAgICAgIFNjaGVtYVBhcmFtZXRlcnM8Qj4gJlxuICAgICAgU2NoZW1hUGFyYW1ldGVyczxDPiAmXG4gICAgICBTY2hlbWFQYXJhbWV0ZXJzPEQ+ICZcbiAgICAgIFNjaGVtYVBhcmFtZXRlcnM8RT4gJlxuICAgICAgU2NoZW1hUGFyYW1ldGVyczxGPlxuICA+XG4+O1xuLy8gZXhwb3J0IGZ1bmN0aW9uIG1lcmdlPEEsIEIsIEMsIEQsIEUsIEYsIEc+KFxuLy8gICAuLi5hcmdzOiBbQSwgQiwgQywgRCwgRSwgRiwgR11cbi8vICk6IEZ1bmN0aW9uVHlwZTxcbi8vICAgU2NoZW1hUmV0dXJuVHlwZTxcbi8vICAgICBBICYgQiAmIEMgJiBEICYgRSAmIEYgJiBHLFxuLy8gICAgIFNjaGVtYVJlc29sdmVUeXBlPEE+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEI+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEM+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEQ+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEU+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEY+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEc+XG4vLyAgID4sXG4vLyAgIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxcbi8vICAgICBTY2hlbWFQYXJhbWV0ZXJzPEE+ICZcbi8vICAgICAgIFNjaGVtYVBhcmFtZXRlcnM8Qj4gJlxuLy8gICAgICAgU2NoZW1hUGFyYW1ldGVyczxDPiAmXG4vLyAgICAgICBTY2hlbWFQYXJhbWV0ZXJzPEQ+ICZcbi8vICAgICAgIFNjaGVtYVBhcmFtZXRlcnM8RT4gJlxuLy8gICAgICAgU2NoZW1hUGFyYW1ldGVyczxGPiAmXG4vLyAgICAgICBTY2hlbWFQYXJhbWV0ZXJzPEc+XG4vLyAgID5cbi8vID47XG4vLyBleHBvcnQgZnVuY3Rpb24gbWVyZ2U8QSwgQiwgQywgRCwgRSwgRiwgRywgSD4oXG4vLyAgIC4uLmFyZ3M6IFtBLCBCLCBDLCBELCBFLCBGLCBHLCBIXVxuLy8gKTogRnVuY3Rpb25UeXBlPFxuLy8gICBTY2hlbWFSZXR1cm5UeXBlPFxuLy8gICAgIEEgJiBCICYgQyAmIEQgJiBFICYgRiAmIEcgJiBILFxuLy8gICAgIFNjaGVtYVJlc29sdmVUeXBlPEE+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEI+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEM+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEQ+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEU+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEY+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEc+ICZcbi8vICAgICAgIFNjaGVtYVJlc29sdmVUeXBlPEg+XG4vLyAgID4sXG4vLyAgIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxcbi8vICAgICBTY2hlbWFQYXJhbWV0ZXJzPEE+ICZcbi8vICAgICAgIFNjaGVtYVBhcmFtZXRlcnM8Qj4gJlxuLy8gICAgICAgU2NoZW1hUGFyYW1ldGVyczxDPiAmXG4vLyAgICAgICBTY2hlbWFQYXJhbWV0ZXJzPEQ+ICZcbi8vICAgICAgIFNjaGVtYVBhcmFtZXRlcnM8RT4gJlxuLy8gICAgICAgU2NoZW1hUGFyYW1ldGVyczxGPiAmXG4vLyAgICAgICBTY2hlbWFQYXJhbWV0ZXJzPEc+ICZcbi8vICAgICAgIFNjaGVtYVBhcmFtZXRlcnM8SD5cbi8vICAgPlxuLy8gPjtcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZSguLi5hcmdzOiBbdW5rbm93biwgLi4udW5rbm93bltdXSk6IEZ1bmN0aW9uVHlwZSB7XG4gIGlmICghYXJncy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRXhwZWN0aW5nIGF0IGxlYXN0IG9uZSBhcmd1bWVudGApO1xuICB9XG5cbiAgY29uc3QgdmFsaWRhdG9ycyA9IGFyZ3MubWFwKChzY2hlbWEpID0+IGNvbXBpbGVyPHVua25vd24+KHNjaGVtYSkpO1xuICBjb25zdCB2YWxpZGF0b3JzQ291bnQgPSB2YWxpZGF0b3JzLmxlbmd0aDtcblxuICBpZiAodmFsaWRhdG9yc0NvdW50ID09PSAxKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvcnNbMF07XG4gIH1cblxuICByZXR1cm4gKC4uLmFyZ3M6IHVua25vd25bXSk6IHVua25vd24gPT4ge1xuICAgIGxldCBpc0FzeW5jO1xuICAgIGNvbnN0IHJlcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0b3JzQ291bnQ7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcmV0ID0gdmFsaWRhdG9yc1tpXSguLi4oYXJncyBhcyBbdW5rbm93bl0pKTtcbiAgICAgIGlmIChpc1Byb21pc2VMaWtlKHJldCkpIHtcbiAgICAgICAgaXNBc3luYyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJlcy5wdXNoKHJldCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0FzeW5jKSB7XG4gICAgICByZXR1cm4gZGVlcENvbmNhdCguLi4ocmVzIGFzIFt1bmtub3duLCB1bmtub3duW11dKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHJlcykudGhlbigocmVzb2x2ZWQpID0+XG4gICAgICBkZWVwQ29uY2F0KC4uLihyZXNvbHZlZCBhcyBbdW5rbm93bl0pKSxcbiAgICApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWw8RiBleHRlbmRzIEZ1bmN0aW9uVHlwZSwgUiA9IHVuZGVmaW5lZD4oXG4gIHZhbGlkYXRvcjogRixcbiAgZGVmYXVsdFZhbHVlPzogUixcbik6IEZ1bmN0aW9uVHlwZTxcbiAgUmV0dXJuVHlwZTxGPiB8IFIsXG4gIE1lcmdlU2NoZW1hUGFyYW1ldGVyczxQYXJhbWV0ZXJzPEY+IHwgWyh1bmRlZmluZWQgfCBudWxsKT9dPlxuPiB7XG4gIHJldHVybiAoXG4gICAgLi4uYXJnczogTWVyZ2VTY2hlbWFQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8Rj4gfCBbKHVuZGVmaW5lZCB8IG51bGwpP10+XG4gICk6IFJldHVyblR5cGU8Rj4gfCBSID0+IHtcbiAgICBpZiAoYXJnc1swXSA9PSBudWxsIHx8IGFyZ3NbMF0gPT09ICcnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlIGFzIFI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvciguLi5hcmdzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmljdE9wdGlvbmFsPEYgZXh0ZW5kcyBGdW5jdGlvblR5cGUsIFIgPSB1bmRlZmluZWQ+KFxuICB2YWxpZGF0b3I6IEYsXG4gIGRlZmF1bHRWYWx1ZT86IFIsXG4pOiBGdW5jdGlvblR5cGU8XG4gIFJldHVyblR5cGU8Rj4gfCBSLFxuICBNZXJnZVNjaGVtYVBhcmFtZXRlcnM8UGFyYW1ldGVyczxGPiB8IFt1bmRlZmluZWQ/XT5cbj4ge1xuICByZXR1cm4gKFxuICAgIC4uLmFyZ3M6IE1lcmdlU2NoZW1hUGFyYW1ldGVyczxQYXJhbWV0ZXJzPEY+IHwgWyh1bmRlZmluZWQgfCBudWxsKT9dPlxuICApOiBSZXR1cm5UeXBlPEY+IHwgUiA9PiB7XG4gICAgaWYgKGFyZ3NbMF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZSBhcyBSO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IoLi4uYXJncyk7XG4gIH07XG59XG4iXX0=