UNPKG

db-sql-toolkit

Version:

Helps with SQL statements, database migration, and bulk execution.

259 lines (257 loc) 45.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.bulkExecuteCommand = bulkExecuteCommand; exports.bulkGetCount = bulkGetCount; exports.bulkGetRows = bulkGetRows; exports.bulkInsertEntities = bulkInsertEntities; var _Database = require("./Database"); function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } /** * Inserts data into a database in as few operations as possible. * @param database The database. * @param entities The collection of data to insert. * @param param2 A tuple consisting of the "INSERT INTO" SQL statement a function to get the parameters for one entity. The number of parameters must be equal for all entities. */ function bulkInsertEntities(_x, _x2) { return _bulkInsertEntities.apply(this, arguments); } /** * Executes a statement in as few operations as possible. * @param database The database. * @param executeParams A tuple consisting of the SQL statement, the parameters of the "WHERE" clause, and the parameters of the "IN" clause. */ function _bulkInsertEntities() { _bulkInsertEntities = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(database, entities) { var _len, bulkStatements, _key, _i, _bulkStatements, _bulkStatements$_i, statement, getParameters, paramsPerEntity, chunkSize, parametersStatement, chunkEntities, chunk, promises, values, valueStatement, fullStatement, _args = arguments; return _regenerator().w(function (_context) { while (1) switch (_context.n) { case 0: if (entities[0]) { _context.n = 1; break; } return _context.a(2); case 1: for (_len = _args.length, bulkStatements = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { bulkStatements[_key - 2] = _args[_key]; } _i = 0, _bulkStatements = bulkStatements; case 2: if (!(_i < _bulkStatements.length)) { _context.n = 4; break; } _bulkStatements$_i = _bulkStatements[_i], statement = _bulkStatements$_i.statement, getParameters = _bulkStatements$_i.getParameters; ensurePlaceholderCount(statement, 1); paramsPerEntity = getParameters(entities[0]).length; chunkSize = Math.floor(database.MaxVariableNumber / paramsPerEntity); parametersStatement = Array.from({ length: paramsPerEntity }).fill("?").join(","); chunkEntities = _toConsumableArray(entities); chunk = void 0; promises = []; while (chunkEntities.length > 0) { chunk = chunkEntities.splice(0, chunkSize); values = chunk.flatMap(getParameters); valueStatement = Array.from({ length: chunk.length }).fill(parametersStatement).join("),("); fullStatement = statement.replace("?", valueStatement); promises.push(database.executeSqlCommand(fullStatement, values)); } // biome-ignore lint/nursery/noAwaitInLoop: We need to keep the order. _context.n = 3; return Promise.all(promises); case 3: _i++; _context.n = 2; break; case 4: return _context.a(2); } }, _callee); })); return _bulkInsertEntities.apply(this, arguments); } function bulkExecuteCommand(_x3, _x4) { return _bulkExecuteCommand.apply(this, arguments); } /** * Loads data from a database in as few operations as possible. * @param database The database. * @param executeParams The tuple consisting of the SQL statement, the parameters of the "WHERE" clause, and the parameters of the "IN" clause. */ function _bulkExecuteCommand() { _bulkExecuteCommand = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(database, executeParams) { return _regenerator().w(function (_context2) { while (1) switch (_context2.n) { case 0: _context2.n = 1; return bulkDo(database, executeParams, database.executeSqlCommand); case 1: return _context2.a(2); } }, _callee2); })); return _bulkExecuteCommand.apply(this, arguments); } function bulkGetRows(_x5, _x6) { return _bulkGetRows.apply(this, arguments); } /** * Gets the total count of rows from a database in as few operations as possible. * @param database The database. * @param executeParams The tuple consisting of the SQL statement, the parameters of the "WHERE" clause, and the parameters of the "IN" clause. * @returns The total count of rows. * @example * ```ts * const priorities = ["1", "2", "3"]; * const statement = sql` * SELECT COUNT(*) * FROM process * WHERE * priority IN (${priorities}) * `; * const count = await bulkGetCount(database, statement) * ``` */ function _bulkGetRows() { _bulkGetRows = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(database, executeParams) { var results; return _regenerator().w(function (_context3) { while (1) switch (_context3.n) { case 0: _context3.n = 1; return bulkDo(database, executeParams, database.getRows); case 1: results = _context3.v; return _context3.a(2, results.flat()); } }, _callee3); })); return _bulkGetRows.apply(this, arguments); } function bulkGetCount(_x7, _x8) { return _bulkGetCount.apply(this, arguments); } function _bulkGetCount() { _bulkGetCount = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(database, executeParams) { var results, totalCount, _iterator, _step, _rows$0$countProperty, _rows$, rows; return _regenerator().w(function (_context4) { while (1) switch (_context4.n) { case 0: _context4.n = 1; return bulkDo(database, executeParams, database.getRows); case 1: results = _context4.v; totalCount = 0; _iterator = _createForOfIteratorHelper(results); try { for (_iterator.s(); !(_step = _iterator.n()).done;) { rows = _step.value; totalCount += (_rows$0$countProperty = (_rows$ = rows[0]) === null || _rows$ === void 0 ? void 0 : _rows$[_Database.countPropertyName]) !== null && _rows$0$countProperty !== void 0 ? _rows$0$countProperty : 0; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return _context4.a(2, totalCount); } }, _callee4); })); return _bulkGetCount.apply(this, arguments); } function bulkDo(_x9, _x0, _x1) { return _bulkDo.apply(this, arguments); } function _bulkDo() { _bulkDo = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(database, _ref, op) { var statement, parameters, bulkParameters, bulkParametersIndex, parameterPlaceholderIndex, statementToLastPlaceholder, statementFromLastPlaceholder, keysBeforeBulkKeys, keysAfterBulkKeys, chunkSize, allBulkKeys, promises, chunkBulkKeys, parametersStatement, fullStatement, results; return _regenerator().w(function (_context5) { while (1) switch (_context5.n) { case 0: statement = _ref.statement, parameters = _ref.parameters, bulkParameters = _ref.bulkParameters, bulkParametersIndex = _ref.bulkParametersIndex; if (!(bulkParameters.length === 0)) { _context5.n = 1; break; } return _context5.a(2, []); case 1: ensurePlaceholderCount(statement, parameters.length + 1); parameterPlaceholderIndex = findNthPlaceholder(statement, bulkParametersIndex); statementToLastPlaceholder = statement.slice(0, parameterPlaceholderIndex); statementFromLastPlaceholder = statement.slice(parameterPlaceholderIndex + 1); keysBeforeBulkKeys = parameters.slice(0, bulkParametersIndex); keysAfterBulkKeys = parameters.slice(bulkParametersIndex); chunkSize = database.MaxVariableNumber - parameters.length; allBulkKeys = _toConsumableArray(bulkParameters); promises = []; while (allBulkKeys.length > 0) { chunkBulkKeys = allBulkKeys.splice(0, chunkSize); parametersStatement = Array.from({ length: chunkBulkKeys.length }).fill("?").join(","); fullStatement = "".concat(statementToLastPlaceholder).concat(parametersStatement).concat(statementFromLastPlaceholder); promises.push(op(fullStatement, [].concat(_toConsumableArray(keysBeforeBulkKeys), _toConsumableArray(chunkBulkKeys), _toConsumableArray(keysAfterBulkKeys)))); } _context5.n = 2; return Promise.all(promises); case 2: results = _context5.v; return _context5.a(2, results); } }, _callee5); })); return _bulkDo.apply(this, arguments); } function ensurePlaceholderCount(statement, expectedCount) { var _statement$match$leng, _statement$match; var placeholderCount = (_statement$match$leng = (_statement$match = statement.match(/\?/g)) === null || _statement$match === void 0 ? void 0 : _statement$match.length) !== null && _statement$match$leng !== void 0 ? _statement$match$leng : 0; if (placeholderCount !== expectedCount) { throw new Error("The number of placeholders does not match the parameters."); } } function findNthPlaceholder(statement, placeholderIndex) { var position = 0; var currentIndex = -1; for (var i = 0; i <= placeholderIndex; i++) { currentIndex = statement.indexOf("?", position); if (currentIndex === -1) { return -1; } position = currentIndex + 1; } return currentIndex; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfRGF0YWJhc2UiLCJyZXF1aXJlIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX3JlZ2VuZXJhdG9yIiwidG9TdHJpbmdUYWciLCJpIiwiYyIsInByb3RvdHlwZSIsIkdlbmVyYXRvciIsIk9iamVjdCIsImNyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJwIiwieSIsIkciLCJ2IiwiZCIsImJpbmQiLCJsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJkaXNwbGF5TmFtZSIsInciLCJtIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJfaW52b2tlIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiYnVsa0luc2VydEVudGl0aWVzIiwiX3giLCJfeDIiLCJfYnVsa0luc2VydEVudGl0aWVzIiwiX2NhbGxlZSIsImRhdGFiYXNlIiwiZW50aXRpZXMiLCJfbGVuIiwiYnVsa1N0YXRlbWVudHMiLCJfa2V5IiwiX2kiLCJfYnVsa1N0YXRlbWVudHMiLCJfYnVsa1N0YXRlbWVudHMkX2kiLCJzdGF0ZW1lbnQiLCJnZXRQYXJhbWV0ZXJzIiwicGFyYW1zUGVyRW50aXR5IiwiY2h1bmtTaXplIiwicGFyYW1ldGVyc1N0YXRlbWVudCIsImNodW5rRW50aXRpZXMiLCJjaHVuayIsInByb21pc2VzIiwidmFsdWVzIiwidmFsdWVTdGF0ZW1lbnQiLCJmdWxsU3RhdGVtZW50IiwiX2FyZ3MiLCJfY29udGV4dCIsImVuc3VyZVBsYWNlaG9sZGVyQ291bnQiLCJNYXRoIiwiZmxvb3IiLCJNYXhWYXJpYWJsZU51bWJlciIsImZpbGwiLCJqb2luIiwic3BsaWNlIiwiZmxhdE1hcCIsInJlcGxhY2UiLCJwdXNoIiwiZXhlY3V0ZVNxbENvbW1hbmQiLCJhbGwiLCJidWxrRXhlY3V0ZUNvbW1hbmQiLCJfeDMiLCJfeDQiLCJfYnVsa0V4ZWN1dGVDb21tYW5kIiwiX2NhbGxlZTIiLCJleGVjdXRlUGFyYW1zIiwiX2NvbnRleHQyIiwiYnVsa0RvIiwiYnVsa0dldFJvd3MiLCJfeDUiLCJfeDYiLCJfYnVsa0dldFJvd3MiLCJfY2FsbGVlMyIsInJlc3VsdHMiLCJfY29udGV4dDMiLCJnZXRSb3dzIiwiZmxhdCIsImJ1bGtHZXRDb3VudCIsIl94NyIsIl94OCIsIl9idWxrR2V0Q291bnQiLCJfY2FsbGVlNCIsInRvdGFsQ291bnQiLCJfaXRlcmF0b3IiLCJfc3RlcCIsIl9yb3dzJDAkY291bnRQcm9wZXJ0eSIsIl9yb3dzJCIsInJvd3MiLCJfY29udGV4dDQiLCJjb3VudFByb3BlcnR5TmFtZSIsImVyciIsIl94OSIsIl94MCIsIl94MSIsIl9idWxrRG8iLCJfY2FsbGVlNSIsIl9yZWYiLCJvcCIsInBhcmFtZXRlcnMiLCJidWxrUGFyYW1ldGVycyIsImJ1bGtQYXJhbWV0ZXJzSW5kZXgiLCJwYXJhbWV0ZXJQbGFjZWhvbGRlckluZGV4Iiwic3RhdGVtZW50VG9MYXN0UGxhY2Vob2xkZXIiLCJzdGF0ZW1lbnRGcm9tTGFzdFBsYWNlaG9sZGVyIiwia2V5c0JlZm9yZUJ1bGtLZXlzIiwia2V5c0FmdGVyQnVsa0tleXMiLCJhbGxCdWxrS2V5cyIsImNodW5rQnVsa0tleXMiLCJfY29udGV4dDUiLCJmaW5kTnRoUGxhY2Vob2xkZXIiLCJjb25jYXQiLCJleHBlY3RlZENvdW50IiwiX3N0YXRlbWVudCRtYXRjaCRsZW5nIiwiX3N0YXRlbWVudCRtYXRjaCIsInBsYWNlaG9sZGVyQ291bnQiLCJtYXRjaCIsIkVycm9yIiwicGxhY2Vob2xkZXJJbmRleCIsInBvc2l0aW9uIiwiY3VycmVudEluZGV4IiwiaW5kZXhPZiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9idWxrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQ291bnRSb3csIGNvdW50UHJvcGVydHlOYW1lLCB0eXBlIERhdGFiYXNlIH0gZnJvbSBcIi4vRGF0YWJhc2VcIjtcbmltcG9ydCB0eXBlIHsgRGVmYXVsdFBhcmFtVHlwZSB9IGZyb20gXCIuL3NxbFwiO1xuXG5pbnRlcmZhY2UgQnVsa1N0YXRlbWVudFBhcmFtczxURGF0YSwgVFBhcmFtID0gRGVmYXVsdFBhcmFtVHlwZT4ge1xuXHRzdGF0ZW1lbnQ6IHN0cmluZztcblx0Z2V0UGFyYW1ldGVyczogKGRhdGE6IFREYXRhKSA9PiBUUGFyYW1bXTtcbn1cblxuaW50ZXJmYWNlIEJ1bGtFeGVjdXRlU3RhdGVtZW50UGFyYW1zPFRQYXJhbSA9IERlZmF1bHRQYXJhbVR5cGU+IHtcblx0c3RhdGVtZW50OiBzdHJpbmc7XG5cdHBhcmFtZXRlcnM6IFRQYXJhbVtdO1xuXHRidWxrUGFyYW1ldGVyczogVFBhcmFtW107XG5cdGJ1bGtQYXJhbWV0ZXJzSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGRhdGEgaW50byBhIGRhdGFiYXNlIGluIGFzIGZldyBvcGVyYXRpb25zIGFzIHBvc3NpYmxlLlxuICogQHBhcmFtIGRhdGFiYXNlIFRoZSBkYXRhYmFzZS5cbiAqIEBwYXJhbSBlbnRpdGllcyBUaGUgY29sbGVjdGlvbiBvZiBkYXRhIHRvIGluc2VydC5cbiAqIEBwYXJhbSBwYXJhbTIgQSB0dXBsZSBjb25zaXN0aW5nIG9mIHRoZSBcIklOU0VSVCBJTlRPXCIgU1FMIHN0YXRlbWVudCBhIGZ1bmN0aW9uIHRvIGdldCB0aGUgcGFyYW1ldGVycyBmb3Igb25lIGVudGl0eS4gVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIG11c3QgYmUgZXF1YWwgZm9yIGFsbCBlbnRpdGllcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVsa0luc2VydEVudGl0aWVzPFREYXRhLCBUUGFyYW0gPSBEZWZhdWx0UGFyYW1UeXBlPihcblx0ZGF0YWJhc2U6IERhdGFiYXNlPFRQYXJhbT4sXG5cdGVudGl0aWVzOiBURGF0YVtdLFxuXHQuLi5idWxrU3RhdGVtZW50czogQnVsa1N0YXRlbWVudFBhcmFtczxURGF0YSwgVFBhcmFtPltdXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKCFlbnRpdGllc1swXSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGZvciAoY29uc3QgeyBzdGF0ZW1lbnQsIGdldFBhcmFtZXRlcnMgfSBvZiBidWxrU3RhdGVtZW50cykge1xuXHRcdGVuc3VyZVBsYWNlaG9sZGVyQ291bnQoc3RhdGVtZW50LCAxKTtcblxuXHRcdGNvbnN0IHBhcmFtc1BlckVudGl0eSA9IGdldFBhcmFtZXRlcnMoZW50aXRpZXNbMF0pLmxlbmd0aDtcblx0XHRjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKGRhdGFiYXNlLk1heFZhcmlhYmxlTnVtYmVyIC8gcGFyYW1zUGVyRW50aXR5KTtcblx0XHRjb25zdCBwYXJhbWV0ZXJzU3RhdGVtZW50ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogcGFyYW1zUGVyRW50aXR5IH0pLmZpbGwoXCI/XCIpLmpvaW4oXCIsXCIpO1xuXG5cdFx0Y29uc3QgY2h1bmtFbnRpdGllcyA9IFsuLi5lbnRpdGllc107XG5cblx0XHRsZXQgY2h1bms6IFREYXRhW107XG5cdFx0Y29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG5cdFx0d2hpbGUgKGNodW5rRW50aXRpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y2h1bmsgPSBjaHVua0VudGl0aWVzLnNwbGljZSgwLCBjaHVua1NpemUpO1xuXG5cdFx0XHRjb25zdCB2YWx1ZXMgPSBjaHVuay5mbGF0TWFwKGdldFBhcmFtZXRlcnMpO1xuXHRcdFx0Y29uc3QgdmFsdWVTdGF0ZW1lbnQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjaHVuay5sZW5ndGggfSkuZmlsbChwYXJhbWV0ZXJzU3RhdGVtZW50KS5qb2luKFwiKSwoXCIpO1xuXG5cdFx0XHRjb25zdCBmdWxsU3RhdGVtZW50ID0gc3RhdGVtZW50LnJlcGxhY2UoXCI/XCIsIHZhbHVlU3RhdGVtZW50KTtcblxuXHRcdFx0cHJvbWlzZXMucHVzaChkYXRhYmFzZS5leGVjdXRlU3FsQ29tbWFuZChmdWxsU3RhdGVtZW50LCB2YWx1ZXMpKTtcblx0XHR9XG5cblx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9udXJzZXJ5L25vQXdhaXRJbkxvb3A6IFdlIG5lZWQgdG8ga2VlcCB0aGUgb3JkZXIuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuXHR9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBzdGF0ZW1lbnQgaW4gYXMgZmV3IG9wZXJhdGlvbnMgYXMgcG9zc2libGUuXG4gKiBAcGFyYW0gZGF0YWJhc2UgVGhlIGRhdGFiYXNlLlxuICogQHBhcmFtIGV4ZWN1dGVQYXJhbXMgQSB0dXBsZSBjb25zaXN0aW5nIG9mIHRoZSBTUUwgc3RhdGVtZW50LCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgXCJXSEVSRVwiIGNsYXVzZSwgYW5kIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBcIklOXCIgY2xhdXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWxrRXhlY3V0ZUNvbW1hbmQ8VFBhcmFtID0gRGVmYXVsdFBhcmFtVHlwZT4oXG5cdGRhdGFiYXNlOiBEYXRhYmFzZTxUUGFyYW0+LFxuXHRleGVjdXRlUGFyYW1zOiBCdWxrRXhlY3V0ZVN0YXRlbWVudFBhcmFtczxUUGFyYW0+LFxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGF3YWl0IGJ1bGtEbyhkYXRhYmFzZSwgZXhlY3V0ZVBhcmFtcywgZGF0YWJhc2UuZXhlY3V0ZVNxbENvbW1hbmQpO1xufVxuXG4vKipcbiAqIExvYWRzIGRhdGEgZnJvbSBhIGRhdGFiYXNlIGluIGFzIGZldyBvcGVyYXRpb25zIGFzIHBvc3NpYmxlLlxuICogQHBhcmFtIGRhdGFiYXNlIFRoZSBkYXRhYmFzZS5cbiAqIEBwYXJhbSBleGVjdXRlUGFyYW1zIFRoZSB0dXBsZSBjb25zaXN0aW5nIG9mIHRoZSBTUUwgc3RhdGVtZW50LCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgXCJXSEVSRVwiIGNsYXVzZSwgYW5kIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBcIklOXCIgY2xhdXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWxrR2V0Um93czxURGF0YSwgVFBhcmFtID0gRGVmYXVsdFBhcmFtVHlwZT4oXG5cdGRhdGFiYXNlOiBEYXRhYmFzZTxUUGFyYW0+LFxuXHRleGVjdXRlUGFyYW1zOiBCdWxrRXhlY3V0ZVN0YXRlbWVudFBhcmFtczxUUGFyYW0+LFxuKTogUHJvbWlzZTxURGF0YVtdPiB7XG5cdGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBidWxrRG88VERhdGFbXSwgVFBhcmFtPihkYXRhYmFzZSwgZXhlY3V0ZVBhcmFtcywgZGF0YWJhc2UuZ2V0Um93cyk7XG5cblx0cmV0dXJuIHJlc3VsdHMuZmxhdCgpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHRvdGFsIGNvdW50IG9mIHJvd3MgZnJvbSBhIGRhdGFiYXNlIGluIGFzIGZldyBvcGVyYXRpb25zIGFzIHBvc3NpYmxlLlxuICogQHBhcmFtIGRhdGFiYXNlIFRoZSBkYXRhYmFzZS5cbiAqIEBwYXJhbSBleGVjdXRlUGFyYW1zIFRoZSB0dXBsZSBjb25zaXN0aW5nIG9mIHRoZSBTUUwgc3RhdGVtZW50LCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgXCJXSEVSRVwiIGNsYXVzZSwgYW5kIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBcIklOXCIgY2xhdXNlLlxuICogQHJldHVybnMgVGhlIHRvdGFsIGNvdW50IG9mIHJvd3MuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHByaW9yaXRpZXMgPSBbXCIxXCIsIFwiMlwiLCBcIjNcIl07XG4gKiBjb25zdCBzdGF0ZW1lbnQgPSBzcWxgXG4gKiAgIFNFTEVDVCBDT1VOVCgqKVxuICogICBGUk9NIHByb2Nlc3NcbiAqICAgV0hFUkVcbiAqICAgICBwcmlvcml0eSBJTiAoJHtwcmlvcml0aWVzfSlcbiAqIGA7XG4gKiBjb25zdCBjb3VudCA9IGF3YWl0IGJ1bGtHZXRDb3VudChkYXRhYmFzZSwgc3RhdGVtZW50KVxuICogYGBgXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1bGtHZXRDb3VudDxUUGFyYW0gPSBEZWZhdWx0UGFyYW1UeXBlPihcblx0ZGF0YWJhc2U6IERhdGFiYXNlPFRQYXJhbT4sXG5cdGV4ZWN1dGVQYXJhbXM6IEJ1bGtFeGVjdXRlU3RhdGVtZW50UGFyYW1zPFRQYXJhbT4sXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuXHRjb25zdCByZXN1bHRzID0gYXdhaXQgYnVsa0RvPENvdW50Um93W10sIFRQYXJhbT4oZGF0YWJhc2UsIGV4ZWN1dGVQYXJhbXMsIGRhdGFiYXNlLmdldFJvd3MpO1xuXG5cdGxldCB0b3RhbENvdW50ID0gMDtcblxuXHRmb3IgKGNvbnN0IHJvd3Mgb2YgcmVzdWx0cykge1xuXHRcdHRvdGFsQ291bnQgKz0gcm93c1swXT8uW2NvdW50UHJvcGVydHlOYW1lXSA/PyAwO1xuXHR9XG5cblx0cmV0dXJuIHRvdGFsQ291bnQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1bGtEbzxURGF0YSwgVFBhcmFtPihcblx0ZGF0YWJhc2U6IERhdGFiYXNlPFRQYXJhbT4sXG5cdHsgc3RhdGVtZW50LCBwYXJhbWV0ZXJzLCBidWxrUGFyYW1ldGVycywgYnVsa1BhcmFtZXRlcnNJbmRleCB9OiBCdWxrRXhlY3V0ZVN0YXRlbWVudFBhcmFtczxUUGFyYW0+LFxuXHRvcDogKHN0YXRlbWVudDogc3RyaW5nLCBwYXJhbWV0ZXJzOiBUUGFyYW1bXSkgPT4gUHJvbWlzZTxURGF0YT4sXG4pOiBQcm9taXNlPFREYXRhW10+IHtcblx0aWYgKGJ1bGtQYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdGVuc3VyZVBsYWNlaG9sZGVyQ291bnQoc3RhdGVtZW50LCBwYXJhbWV0ZXJzLmxlbmd0aCArIDEpO1xuXG5cdGNvbnN0IHBhcmFtZXRlclBsYWNlaG9sZGVySW5kZXggPSBmaW5kTnRoUGxhY2Vob2xkZXIoc3RhdGVtZW50LCBidWxrUGFyYW1ldGVyc0luZGV4KTtcblx0Y29uc3Qgc3RhdGVtZW50VG9MYXN0UGxhY2Vob2xkZXIgPSBzdGF0ZW1lbnQuc2xpY2UoMCwgcGFyYW1ldGVyUGxhY2Vob2xkZXJJbmRleCk7XG5cdGNvbnN0IHN0YXRlbWVudEZyb21MYXN0UGxhY2Vob2xkZXIgPSBzdGF0ZW1lbnQuc2xpY2UocGFyYW1ldGVyUGxhY2Vob2xkZXJJbmRleCArIDEpO1xuXHRjb25zdCBrZXlzQmVmb3JlQnVsa0tleXMgPSBwYXJhbWV0ZXJzLnNsaWNlKDAsIGJ1bGtQYXJhbWV0ZXJzSW5kZXgpO1xuXHRjb25zdCBrZXlzQWZ0ZXJCdWxrS2V5cyA9IHBhcmFtZXRlcnMuc2xpY2UoYnVsa1BhcmFtZXRlcnNJbmRleCk7XG5cblx0Y29uc3QgY2h1bmtTaXplID0gZGF0YWJhc2UuTWF4VmFyaWFibGVOdW1iZXIgLSBwYXJhbWV0ZXJzLmxlbmd0aDtcblx0Y29uc3QgYWxsQnVsa0tleXMgPSBbLi4uYnVsa1BhcmFtZXRlcnNdIGFzIFRQYXJhbVtdO1xuXG5cdGNvbnN0IHByb21pc2VzOiBQcm9taXNlPFREYXRhPltdID0gW107XG5cblx0d2hpbGUgKGFsbEJ1bGtLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBjaHVua0J1bGtLZXlzID0gYWxsQnVsa0tleXMuc3BsaWNlKDAsIGNodW5rU2l6ZSk7XG5cdFx0Y29uc3QgcGFyYW1ldGVyc1N0YXRlbWVudCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNodW5rQnVsa0tleXMubGVuZ3RoIH0pLmZpbGwoXCI/XCIpLmpvaW4oXCIsXCIpO1xuXHRcdGNvbnN0IGZ1bGxTdGF0ZW1lbnQgPSBgJHtzdGF0ZW1lbnRUb0xhc3RQbGFjZWhvbGRlcn0ke3BhcmFtZXRlcnNTdGF0ZW1lbnR9JHtzdGF0ZW1lbnRGcm9tTGFzdFBsYWNlaG9sZGVyfWA7XG5cblx0XHRwcm9taXNlcy5wdXNoKG9wKGZ1bGxTdGF0ZW1lbnQsIFsuLi5rZXlzQmVmb3JlQnVsa0tleXMsIC4uLmNodW5rQnVsa0tleXMsIC4uLmtleXNBZnRlckJ1bGtLZXlzXSkpO1xuXHR9XG5cblx0Y29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gZW5zdXJlUGxhY2Vob2xkZXJDb3VudChzdGF0ZW1lbnQ6IHN0cmluZywgZXhwZWN0ZWRDb3VudDogbnVtYmVyKTogdm9pZCB7XG5cdGNvbnN0IHBsYWNlaG9sZGVyQ291bnQgPSBzdGF0ZW1lbnQubWF0Y2goL1xcPy9ndSk/Lmxlbmd0aCA/PyAwO1xuXG5cdGlmIChwbGFjZWhvbGRlckNvdW50ICE9PSBleHBlY3RlZENvdW50KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIG51bWJlciBvZiBwbGFjZWhvbGRlcnMgZG9lcyBub3QgbWF0Y2ggdGhlIHBhcmFtZXRlcnMuXCIpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGZpbmROdGhQbGFjZWhvbGRlcihzdGF0ZW1lbnQ6IHN0cmluZywgcGxhY2Vob2xkZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcblx0bGV0IHBvc2l0aW9uID0gMDtcblx0bGV0IGN1cnJlbnRJbmRleCA9IC0xO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDw9IHBsYWNlaG9sZGVySW5kZXg7IGkrKykge1xuXHRcdGN1cnJlbnRJbmRleCA9IHN0YXRlbWVudC5pbmRleE9mKFwiP1wiLCBwb3NpdGlvbik7XG5cblx0XHRpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblxuXHRcdHBvc2l0aW9uID0gY3VycmVudEluZGV4ICsgMTtcblx0fVxuXG5cdHJldHVybiBjdXJyZW50SW5kZXg7XG59XG5cbmV4cG9ydCB0eXBlIHsgQnVsa0V4ZWN1dGVTdGF0ZW1lbnRQYXJhbXMsIEJ1bGtTdGF0ZW1lbnRQYXJhbXMgfTtcblxuZXhwb3J0IHsgYnVsa0V4ZWN1dGVDb21tYW5kLCBidWxrR2V0Q291bnQsIGJ1bGtHZXRSb3dzLCBidWxrSW5zZXJ0RW50aXRpZXMgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQTZFLFNBQUFDLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLENBQUEsR0FBQUssMkJBQUEsQ0FBQVAsQ0FBQSxNQUFBQyxDQUFBLElBQUFELENBQUEsdUJBQUFBLENBQUEsQ0FBQVEsTUFBQSxJQUFBTixDQUFBLEtBQUFGLENBQUEsR0FBQUUsQ0FBQSxPQUFBTyxFQUFBLE1BQUFDLENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFBLFdBQUFILEVBQUEsSUFBQVQsQ0FBQSxDQUFBUSxNQUFBLEtBQUFLLElBQUEsV0FBQUEsSUFBQSxNQUFBQyxLQUFBLEVBQUFkLENBQUEsQ0FBQVMsRUFBQSxVQUFBUixDQUFBLFdBQUFBLEVB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