UNPKG

objection

Version:
777 lines (602 loc) 68.3 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _create = require('babel-runtime/core-js/object/create'); var _create2 = _interopRequireDefault(_create); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _EagerOperation2 = require('./EagerOperation'); var _EagerOperation3 = _interopRequireDefault(_EagerOperation2); var _ValidationError = require('../../model/ValidationError'); var _ValidationError2 = _interopRequireDefault(_ValidationError); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var columnInfo = (0, _create2.default)(null); var idLengthLimit = 63; var relationRecursionLimit = 64; var JoinEagerOperation = function (_EagerOperation) { (0, _inherits3.default)(JoinEagerOperation, _EagerOperation); function JoinEagerOperation(name, opt) { (0, _classCallCheck3.default)(this, JoinEagerOperation); var _this = (0, _possibleConstructorReturn3.default)(this, _EagerOperation.call(this, name, opt)); _this.allRelations = null; _this.rootModelClass = null; _this.pathInfo = (0, _create2.default)(null); _this.encodings = (0, _create2.default)(null); _this.decodings = (0, _create2.default)(null); _this.encIdx = 0; _this.opt = _lodash2.default.defaults(opt, { minimize: false, separator: ':', aliases: {} }); return _this; } JoinEagerOperation.prototype.clone = function clone() { var copy = _EagerOperation.prototype.clone.call(this); copy.allRelations = this.allRelations; copy.allModelClasses = this.allModelClasses; copy.rootModelClass = this.rootModelClass; copy.pathInfo = this.pathInfo; copy.encodings = this.encodings; copy.decodings = this.decodings; copy.encIdx = this.encIdx; return this; }; JoinEagerOperation.prototype.call = function call(builder, args) { var ret = _EagerOperation.prototype.call.call(this, builder, args); var ModelClass = builder.modelClass(); if (ret) { this.rootModelClass = ModelClass; this.allModelClasses = findAllModels(this.expression, ModelClass); this.allRelations = findAllRelations(this.expression, ModelClass); } return ret; }; JoinEagerOperation.prototype.onBeforeInternal = function onBeforeInternal(builder) { return fetchColumnInfo(builder, this.allModelClasses); }; JoinEagerOperation.prototype.onBeforeBuild = function onBeforeBuild(builder) { var builderClone = builder.clone(); builder.table(this.rootModelClass.tableName + ' as ' + this.rootModelClass.tableName); builder.findOptions({ callAfterGetDeeply: true }); this.build({ expr: this.expression, builder: builder, modelClass: builder.modelClass(), parentInfo: null, relation: null, path: '', selectFilter: function selectFilter(col) { return builderClone.hasSelection(col); } }); }; JoinEagerOperation.prototype.onRawResult = function onRawResult(builder, rows) { if (_lodash2.default.isEmpty(rows)) { return rows; } var keyInfoByPath = this.createKeyInfo(rows); var pathInfo = _lodash2.default.values(this.pathInfo); var tree = (0, _create2.default)(null); var stack = (0, _create2.default)(null); for (var i = 0, lr = rows.length; i < lr; ++i) { var row = rows[i]; var curBranch = tree; for (var j = 0, lp = pathInfo.length; j < lp; ++j) { var pInfo = pathInfo[j]; var id = pInfo.idGetter(row); if (!id) { continue; } if (pInfo.relation) { var parentModel = stack[pInfo.encParentPath]; curBranch = pInfo.getBranch(parentModel); if (!curBranch) { curBranch = pInfo.createBranch(parentModel); } } var model = pInfo.getModelFromBranch(curBranch, id); if (!model) { model = createModel(row, pInfo, keyInfoByPath); pInfo.setModelToBranch(curBranch, id, model); } stack[pInfo.encPath] = model; } } return this.finalize(pathInfo[0], _lodash2.default.values(tree)); }; JoinEagerOperation.prototype.createKeyInfo = function createKeyInfo(rows) { var keys = (0, _keys2.default)(rows[0]); var keyInfo = []; for (var i = 0, l = keys.length; i < l; ++i) { var key = keys[i]; var sepIdx = key.lastIndexOf(this.sep); if (sepIdx === -1) { var pInfo = this.pathInfo['']; var col = key; if (!pInfo.omitProps[col]) { keyInfo.push({ pInfo: pInfo, key: key, col: col }); } } else { var encPath = key.substr(0, sepIdx); var path = this.decode(encPath); var _col = key.substr(sepIdx + 1); var _pInfo = this.pathInfo[path]; if (!_pInfo.omitProps[_col]) { keyInfo.push({ pInfo: _pInfo, key: key, col: _col }); } } } return _lodash2.default.groupBy(keyInfo, function (kInfo) { return kInfo.pInfo.encPath; }); }; JoinEagerOperation.prototype.finalize = function finalize(pInfo, models) { var relNames = (0, _keys2.default)(pInfo.children); if (Array.isArray(models)) { for (var m = 0, lm = models.length; m < lm; ++m) { this.finalizeOne(pInfo, relNames, models[m]); } } else if (models) { this.finalizeOne(pInfo, relNames, models); } return models; }; JoinEagerOperation.prototype.finalizeOne = function finalizeOne(pInfo, relNames, model) { for (var r = 0, lr = relNames.length; r < lr; ++r) { var relName = relNames[r]; var branch = model[relName]; var childPathInfo = pInfo.children[relName]; var finalized = childPathInfo.finalizeBranch(branch, model); this.finalize(childPathInfo, finalized); } }; JoinEagerOperation.prototype.build = function build(_ref) { var _this2 = this; var expr = _ref.expr, builder = _ref.builder, selectFilter = _ref.selectFilter, modelClass = _ref.modelClass, relation = _ref.relation, path = _ref.path, parentInfo = _ref.parentInfo; var info = this.createPathInfo({ modelClass: modelClass, path: path, relation: relation, parentInfo: parentInfo }); this.pathInfo[path] = info; this.buildSelects({ builder: builder, selectFilter: selectFilter, modelClass: modelClass, relation: relation, info: info }); forEachExpr(expr, modelClass, function (childExpr, relation) { var nextPath = _this2.joinPath(path, relation.name); var encNextPath = _this2.encode(nextPath); var encJoinTablePath = relation.joinTable ? _this2.encode(joinTableForPath(nextPath)) : null; var filterQuery = createFilterQuery({ builder: builder, relation: relation, expr: childExpr }); var relatedJoinSelectQuery = createRelatedJoinFromQuery({ filterQuery: filterQuery, relation: relation, allRelations: _this2.allRelations }); relation.join(builder, { joinOperation: 'leftJoin', ownerTable: info.encPath, relatedTableAlias: encNextPath, joinTableAlias: encJoinTablePath, relatedJoinSelectQuery: relatedJoinSelectQuery }); // Apply relation.modify since it may also contains selections. Don't move this // to the createFilterQuery function because relatedJoinSelectQuery is cloned // From the return value of that function and we don't want relation.modify // to be called twice for it. filterQuery.modify(relation.modify); _this2.build({ expr: childExpr, builder: builder, modelClass: relation.relatedModelClass, relation: relation, parentInfo: info, path: nextPath, selectFilter: function selectFilter(col) { return filterQuery.hasSelection(col); } }); }); }; JoinEagerOperation.prototype.createPathInfo = function createPathInfo(_ref2) { var modelClass = _ref2.modelClass, path = _ref2.path, relation = _ref2.relation, parentInfo = _ref2.parentInfo; var encPath = this.encode(path); var info = void 0; if (relation && relation.isOneToOne()) { info = new OneToOnePathInfo(); } else { info = new PathInfo(); } info.path = path; info.encPath = encPath; info.parentPath = parentInfo && parentInfo.path; info.encParentPath = parentInfo && parentInfo.encPath; info.modelClass = modelClass; info.relation = relation; info.idGetter = this.createIdGetter(modelClass, encPath); if (parentInfo) { parentInfo.children[relation.name] = info; } return info; }; JoinEagerOperation.prototype.buildSelects = function buildSelects(_ref3) { var _this3 = this; var builder = _ref3.builder, selectFilter = _ref3.selectFilter, modelClass = _ref3.modelClass, relation = _ref3.relation, info = _ref3.info; var selects = []; var idCols = modelClass.getIdColumnArray(); var rootTable = this.rootModelClass.tableName; columnInfo[modelClass.tableName].columns.forEach(function (col) { var filterPassed = selectFilter(col); var isIdColumn = idCols.indexOf(col) !== -1; if (filterPassed || isIdColumn) { selects.push({ col: (info.encPath || rootTable) + '.' + col, alias: _this3.joinPath(info.encPath, col) }); if (!filterPassed) { info.omitProps[col] = true; } } }); if (relation && relation.joinTableExtras) { var joinTable = this.encode(joinTableForPath(info.path)); relation.joinTableExtras.forEach(function (extra) { if (selectFilter(extra.joinTableCol)) { selects.push({ col: joinTable + '.' + extra.joinTableCol, alias: _this3.joinPath(info.encPath, extra.aliasCol) }); } }); } var tooLongAliases = selects.filter(function (select) { return select.alias.length > idLengthLimit; }); if (tooLongAliases.length) { throw new _ValidationError2.default({ eager: 'identifier ' + tooLongAliases[0].alias + ' is over ' + idLengthLimit + ' characters long ' + 'and would be truncated by the database engine.' }); } builder.select(selects.map(function (select) { return select.col + ' as ' + select.alias; })); }; JoinEagerOperation.prototype.encode = function encode(path) { var _this4 = this; if (!this.opt.minimize) { var encPath = this.encodings[path]; if (!encPath) { var parts = path.split(this.sep); // Don't encode the root. if (!path) { encPath = path; } else { encPath = parts.map(function (part) { return _this4.opt.aliases[part] || part; }).join(this.sep); } this.encodings[path] = encPath; this.decodings[encPath] = path; } return encPath; } else { var _encPath = this.encodings[path]; if (!_encPath) { // Don't encode the root. if (!path) { _encPath = path; } else { _encPath = this.nextEncodedPath(); } this.encodings[path] = _encPath; this.decodings[_encPath] = path; } return _encPath; } }; JoinEagerOperation.prototype.decode = function decode(path) { return this.decodings[path]; }; JoinEagerOperation.prototype.nextEncodedPath = function nextEncodedPath() { return '_t' + ++this.encIdx; }; JoinEagerOperation.prototype.createIdGetter = function createIdGetter(modelClass, path) { var _this5 = this; var idCols = modelClass.getIdColumnArray().map(function (col) { return _this5.joinPath(path, col); }); if (idCols.length === 1) { return createSingleIdGetter(idCols); } else if (idCols.length === 2) { return createTwoIdGetter(idCols); } else if (idCols.length === 3) { return createThreeIdGetter(idCols); } else { return createNIdGetter(idCols); } }; JoinEagerOperation.prototype.joinPath = function joinPath(path, nextPart) { if (path) { return '' + path + this.sep + nextPart; } else { return nextPart; } }; (0, _createClass3.default)(JoinEagerOperation, [{ key: 'sep', get: function get() { return this.opt.separator; } }]); return JoinEagerOperation; }(_EagerOperation3.default); exports.default = JoinEagerOperation; function findAllModels(expr, modelClass) { var models = []; findAllModelsImpl(expr, modelClass, models); return _lodash2.default.uniqBy(models, 'tableName'); } function findAllModelsImpl(expr, modelClass, models) { models.push(modelClass); forEachExpr(expr, modelClass, function (childExpr, relation) { findAllModelsImpl(childExpr, relation.relatedModelClass, models); }); } function findAllRelations(expr, modelClass) { var relations = []; findAllRelationsImpl(expr, modelClass, relations); return _lodash2.default.uniqWith(relations, function (lhs, rhs) { return lhs === rhs; }); } function findAllRelationsImpl(expr, modelClass, relations) { forEachExpr(expr, modelClass, function (childExpr, relation) { relations.push(relation); findAllRelationsImpl(childExpr, relation.relatedModelClass, relations); }); } function fetchColumnInfo(builder, models) { var knex = builder.knex(); return _bluebird2.default.all(models.map(function (ModelClass) { var table = ModelClass.tableName; if (columnInfo[table]) { return columnInfo[table]; } else { columnInfo[table] = knex(table).columnInfo().then(function (info) { var result = { columns: (0, _keys2.default)(info) }; columnInfo[table] = result; return result; }); return columnInfo[table]; } })); } function forEachExpr(expr, modelClass, callback) { var relations = modelClass.getRelationArray(); if (expr.isAllRecursive() || expr.maxRecursionDepth() > relationRecursionLimit) { throw new _ValidationError2.default({ eager: 'recursion depth of eager expression ' + expr.toString() + ' too big for JoinEagerAlgorithm' }); } for (var i = 0, l = relations.length; i < l; ++i) { var relation = relations[i]; var childExpr = expr.childExpression(relation.name); if (childExpr) { callback(childExpr, relation, relation.name); } } } function createSingleIdGetter(idCols) { var idCol = idCols[0]; return function (row) { var val = row[idCol]; if (!val) { return null; } else { return val; } }; } function createTwoIdGetter(idCols) { var idCol1 = idCols[0]; var idCol2 = idCols[1]; return function (row) { var val1 = row[idCol1]; var val2 = row[idCol2]; if (!val1 || !val2) { return null; } else { return val1 + ',' + val2; } }; } function createThreeIdGetter(idCols) { var idCol1 = idCols[0]; var idCol2 = idCols[1]; var idCol3 = idCols[2]; return function (row) { var val1 = row[idCol1]; var val2 = row[idCol2]; var val3 = row[idCol3]; if (!val1 || !val2 || !val3) { return null; } else { return val1 + ',' + val2 + ',' + val3; } }; } function createNIdGetter(idCols) { return function (row) { var id = ''; for (var i = 0, l = idCols.length; i < l; ++i) { var val = row[idCols[i]]; if (!val) { return null; } id += (i > 0 ? ',' : '') + val; } return id; }; } function createFilterQuery(_ref4) { var builder = _ref4.builder, expr = _ref4.expr, relation = _ref4.relation; var filterQuery = relation.relatedModelClass.query().childQueryOf(builder); for (var i = 0, l = expr.args.length; i < l; ++i) { var filterName = expr.args[i]; var filter = expr.filters[filterName]; if (typeof filter !== 'function') { throw new _ValidationError2.default({ eager: 'could not find filter "' + filterName + '" for relation "' + relation.name + '"' }); } filter(filterQuery); } return filterQuery; } function createRelatedJoinFromQuery(_ref5) { var filterQuery = _ref5.filterQuery, relation = _ref5.relation, allRelations = _ref5.allRelations; var relatedJoinFromQuery = filterQuery.clone(); var allForeignKeys = findAllForeignKeysForModel({ modelClass: relation.relatedModelClass, allRelations: allRelations }); return relatedJoinFromQuery.select(allForeignKeys.filter(function (col) { return !relatedJoinFromQuery.hasSelection(col); })); } function findAllForeignKeysForModel(_ref6) { var modelClass = _ref6.modelClass, allRelations = _ref6.allRelations; var foreignKeys = modelClass.getIdColumnArray().slice(); allRelations.forEach(function (rel) { if (rel.relatedModelClass.tableName === modelClass.tableName) { rel.relatedCol.forEach(function (col) { return foreignKeys.push(col); }); } if (rel.ownerModelClass.tableName === modelClass.tableName) { rel.ownerCol.forEach(function (col) { return foreignKeys.push(col); }); } }); return _lodash2.default.uniq(foreignKeys); } function createModel(row, pInfo, keyInfoByPath) { var keyInfo = keyInfoByPath[pInfo.encPath]; var json = {}; for (var k = 0, lk = keyInfo.length; k < lk; ++k) { var kInfo = keyInfo[k]; json[kInfo.col] = row[kInfo.key]; } return pInfo.modelClass.fromDatabaseJson(json); } function joinTableForPath(path) { return path + '_join'; } var PathInfo = function () { function PathInfo() { (0, _classCallCheck3.default)(this, PathInfo); this.path = null; this.encPath = null; this.encParentPath = null; this.modelClass = null; this.relation = null; this.omitProps = (0, _create2.default)(null); this.children = (0, _create2.default)(null); this.idGetter = null; } PathInfo.prototype.createBranch = function createBranch(parentModel) { var branch = (0, _create2.default)(null); parentModel[this.relation.name] = branch; return branch; }; PathInfo.prototype.getBranch = function getBranch(parentModel) { return parentModel[this.relation.name]; }; PathInfo.prototype.getModelFromBranch = function getModelFromBranch(branch, id) { return branch[id]; }; PathInfo.prototype.setModelToBranch = function setModelToBranch(branch, id, model) { branch[id] = model; }; PathInfo.prototype.finalizeBranch = function finalizeBranch(branch, parentModel) { var relModels = _lodash2.default.values(branch); parentModel[this.relation.name] = relModels; return relModels; }; return PathInfo; }(); var OneToOnePathInfo = function (_PathInfo) { (0, _inherits3.default)(OneToOnePathInfo, _PathInfo); function OneToOnePathInfo() { (0, _classCallCheck3.default)(this, OneToOnePathInfo); return (0, _possibleConstructorReturn3.default)(this, _PathInfo.apply(this, arguments)); } OneToOnePathInfo.prototype.createBranch = function createBranch(parentModel) { return parentModel; }; OneToOnePathInfo.prototype.getBranch = function getBranch(parentModel) { return parentModel; }; OneToOnePathInfo.prototype.getModelFromBranch = function getModelFromBranch(branch, id) { return branch[this.relation.name]; }; OneToOnePathInfo.prototype.setModelToBranch = function setModelToBranch(branch, id, model) { branch[this.relation.name] = model; }; OneToOnePathInfo.prototype.finalizeBranch = function finalizeBranch(branch, parentModel) { parentModel[this.relation.name] = branch || null; return branch || null; }; return OneToOnePathInfo; }(PathInfo); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkpvaW5FYWdlck9wZXJhdGlvbi5qcyJdLCJuYW1lcyI6WyJjb2x1bW5JbmZvIiwiaWRMZW5ndGhMaW1pdCIsInJlbGF0aW9uUmVjdXJzaW9uTGltaXQiLCJKb2luRWFnZXJPcGVyYXRpb24iLCJuYW1lIiwib3B0IiwiYWxsUmVsYXRpb25zIiwicm9vdE1vZGVsQ2xhc3MiLCJwYXRoSW5mbyIsImVuY29kaW5ncyIsImRlY29kaW5ncyIsImVuY0lkeCIsImRlZmF1bHRzIiwibWluaW1pemUiLCJzZXBhcmF0b3IiLCJhbGlhc2VzIiwiY2xvbmUiLCJjb3B5IiwiYWxsTW9kZWxDbGFzc2VzIiwiY2FsbCIsImJ1aWxkZXIiLCJhcmdzIiwicmV0IiwiTW9kZWxDbGFzcyIsIm1vZGVsQ2xhc3MiLCJmaW5kQWxsTW9kZWxzIiwiZXhwcmVzc2lvbiIsImZpbmRBbGxSZWxhdGlvbnMiLCJvbkJlZm9yZUludGVybmFsIiwiZmV0Y2hDb2x1bW5JbmZvIiwib25CZWZvcmVCdWlsZCIsImJ1aWxkZXJDbG9uZSIsInRhYmxlIiwidGFibGVOYW1lIiwiZmluZE9wdGlvbnMiLCJjYWxsQWZ0ZXJHZXREZWVwbHkiLCJidWlsZCIsImV4cHIiLCJwYXJlbnRJbmZvIiwicmVsYXRpb24iLCJwYXRoIiwic2VsZWN0RmlsdGVyIiwiY29sIiwiaGFzU2VsZWN0aW9uIiwib25SYXdSZXN1bHQiLCJyb3dzIiwiaXNFbXB0eSIsImtleUluZm9CeVBhdGgiLCJjcmVhdGVLZXlJbmZvIiwidmFsdWVzIiwidHJlZSIsInN0YWNrIiwiaSIsImxyIiwibGVuZ3RoIiwicm93IiwiY3VyQnJhbmNoIiwiaiIsImxwIiwicEluZm8iLCJpZCIsImlkR2V0dGVyIiwicGFyZW50TW9kZWwiLCJlbmNQYXJlbnRQYXRoIiwiZ2V0QnJhbmNoIiwiY3JlYXRlQnJhbmNoIiwibW9kZWwiLCJnZXRNb2RlbEZyb21CcmFuY2giLCJjcmVhdGVNb2RlbCIsInNldE1vZGVsVG9CcmFuY2giLCJlbmNQYXRoIiwiZmluYWxpemUiLCJrZXlzIiwia2V5SW5mbyIsImwiLCJrZXkiLCJzZXBJZHgiLCJsYXN0SW5kZXhPZiIsInNlcCIsIm9taXRQcm9wcyIsInB1c2giLCJzdWJzdHIiLCJkZWNvZGUiLCJncm91cEJ5Iiwia0luZm8iLCJtb2RlbHMiLCJyZWxOYW1lcyIsImNoaWxkcmVuIiwiQXJyYXkiLCJpc0FycmF5IiwibSIsImxtIiwiZmluYWxpemVPbmUiLCJyIiwicmVsTmFtZSIsImJyYW5jaCIsImNoaWxkUGF0aEluZm8iLCJmaW5hbGl6ZWQiLCJmaW5hbGl6ZUJyYW5jaCIsImluZm8iLCJjcmVhdGVQYXRoSW5mbyIsImJ1aWxkU2VsZWN0cyIsImZvckVhY2hFeHByIiwiY2hpbGRFeHByIiwibmV4dFBhdGgiLCJqb2luUGF0aCIsImVuY05leHRQYXRoIiwiZW5jb2RlIiwiZW5jSm9pblRhYmxlUGF0aCIsImpvaW5UYWJsZSIsImpvaW5UYWJsZUZvclBhdGgiLCJmaWx0ZXJRdWVyeSIsImNyZWF0ZUZpbHRlclF1ZXJ5IiwicmVsYXRlZEpvaW5TZWxlY3RRdWVyeSIsImNyZWF0ZVJlbGF0ZWRKb2luRnJvbVF1ZXJ5Iiwiam9pbiIsImpvaW5PcGVyYXRpb24iLCJvd25lclRhYmxlIiwicmVsYXRlZFRhYmxlQWxpYXMiLCJqb2luVGFibGVBbGlhcyIsIm1vZGlmeSIsInJlbGF0ZWRNb2RlbENsYXNzIiwiaXNPbmVUb09uZSIsIk9uZVRvT25lUGF0aEluZm8iLCJQYXRoSW5mbyIsInBhcmVudFBhdGgiLCJjcmVhdGVJZEdldHRlciIsInNlbGVjdHMiLCJpZENvbHMiLCJnZXRJZENvbHVtbkFycmF5Iiwicm9vdFRhYmxlIiwiY29sdW1ucyIsImZvckVhY2giLCJmaWx0ZXJQYXNzZWQiLCJpc0lkQ29sdW1uIiwiaW5kZXhPZiIsImFsaWFzIiwiam9pblRhYmxlRXh0cmFzIiwiZXh0cmEiLCJqb2luVGFibGVDb2wiLCJhbGlhc0NvbCIsInRvb0xvbmdBbGlhc2VzIiwiZmlsdGVyIiwic2VsZWN0IiwiZWFnZXIiLCJtYXAiLCJwYXJ0cyIsInNwbGl0IiwicGFydCIsIm5leHRFbmNvZGVkUGF0aCIsImNyZWF0ZVNpbmdsZUlkR2V0dGVyIiwiY3JlYXRlVHdvSWRHZXR0ZXIiLCJjcmVhdGVUaHJlZUlkR2V0dGVyIiwiY3JlYXRlTklkR2V0dGVyIiwibmV4dFBhcnQiLCJmaW5kQWxsTW9kZWxzSW1wbCIsInVuaXFCeSIsInJlbGF0aW9ucyIsImZpbmRBbGxSZWxhdGlvbnNJbXBsIiwidW5pcVdpdGgiLCJsaHMiLCJyaHMiLCJrbmV4IiwiYWxsIiwidGhlbiIsInJlc3VsdCIsImNhbGxiYWNrIiwiZ2V0UmVsYXRpb25BcnJheSIsImlzQWxsUmVjdXJzaXZlIiwibWF4UmVjdXJzaW9uRGVwdGgiLCJ0b1N0cmluZyIsImNoaWxkRXhwcmVzc2lvbiIsImlkQ29sIiwidmFsIiwiaWRDb2wxIiwiaWRDb2wyIiwidmFsMSIsInZhbDIiLCJpZENvbDMiLCJ2YWwzIiwicXVlcnkiLCJjaGlsZFF1ZXJ5T2YiLCJmaWx0ZXJOYW1lIiwiZmlsdGVycyIsInJlbGF0ZWRKb2luRnJvbVF1ZXJ5IiwiYWxsRm9yZWlnbktleXMiLCJmaW5kQWxsRm9yZWlnbktleXNGb3JNb2RlbCIsImZvcmVpZ25LZXlzIiwic2xpY2UiLCJyZWwiLCJyZWxhdGVkQ29sIiwib3duZXJNb2RlbENsYXNzIiwib3duZXJDb2wiLCJ1bmlxIiwianNvbiIsImsiLCJsayIsImZyb21EYXRhYmFzZUpzb24iLCJyZWxNb2RlbHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsYUFBYSxzQkFBYyxJQUFkLENBQW5CO0FBQ0EsSUFBTUMsZ0JBQWdCLEVBQXRCO0FBQ0EsSUFBTUMseUJBQXlCLEVBQS9COztJQUVxQkMsa0I7OztBQUVuQiw4QkFBWUMsSUFBWixFQUFrQkMsR0FBbEIsRUFBdUI7QUFBQTs7QUFBQSwrREFDckIsMkJBQU1ELElBQU4sRUFBWUMsR0FBWixDQURxQjs7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aCc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgRWFnZXJPcGVyYXRpb24gZnJvbSAnLi9FYWdlck9wZXJhdGlvbic7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uLy4uL21vZGVsL1ZhbGlkYXRpb25FcnJvcic7XG5cbmNvbnN0IGNvbHVtbkluZm8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3QgaWRMZW5ndGhMaW1pdCA9IDYzO1xuY29uc3QgcmVsYXRpb25SZWN1cnNpb25MaW1pdCA9IDY0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKb2luRWFnZXJPcGVyYXRpb24gZXh0ZW5kcyBFYWdlck9wZXJhdGlvbiB7XG5cbiAgY29uc3RydWN0b3IobmFtZSwgb3B0KSB7XG4gICAgc3VwZXIobmFtZSwgb3B0KTtcblxuICAgIHRoaXMuYWxsUmVsYXRpb25zID0gbnVsbDtcbiAgICB0aGlzLnJvb3RNb2RlbENsYXNzID0gbnVsbDtcbiAgICB0aGlzLnBhdGhJbmZvID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLmVuY29kaW5ncyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5kZWNvZGluZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuZW5jSWR4ID0gMDtcbiAgICB0aGlzLm9wdCA9IF8uZGVmYXVsdHMob3B0LCB7XG4gICAgICBtaW5pbWl6ZTogZmFsc2UsXG4gICAgICBzZXBhcmF0b3I6ICc6JyxcbiAgICAgIGFsaWFzZXM6IHt9XG4gICAgfSk7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICBjb25zdCBjb3B5ID0gc3VwZXIuY2xvbmUoKTtcblxuICAgIGNvcHkuYWxsUmVsYXRpb25zID0gdGhpcy5hbGxSZWxhdGlvbnM7XG4gICAgY29weS5hbGxNb2RlbENsYXNzZXMgPSB0aGlzLmFsbE1vZGVsQ2xhc3NlcztcbiAgICBjb3B5LnJvb3RNb2RlbENsYXNzID0gdGhpcy5yb290TW9kZWxDbGFzcztcbiAgICBjb3B5LnBhdGhJbmZvID0gdGhpcy5wYXRoSW5mbztcbiAgICBjb3B5LmVuY29kaW5ncyA9IHRoaXMuZW5jb2RpbmdzO1xuICAgIGNvcHkuZGVjb2RpbmdzID0gdGhpcy5kZWNvZGluZ3M7XG4gICAgY29weS5lbmNJZHggPSB0aGlzLmVuY0lkeDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2FsbChidWlsZGVyLCBhcmdzKSB7XG4gICAgY29uc3QgcmV0ID0gc3VwZXIuY2FsbChidWlsZGVyLCBhcmdzKTtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gYnVpbGRlci5tb2RlbENsYXNzKCk7XG5cbiAgICBpZiAocmV0KSB7XG4gICAgICB0aGlzLnJvb3RNb2RlbENsYXNzID0gTW9kZWxDbGFzcztcbiAgICAgIHRoaXMuYWxsTW9kZWxDbGFzc2VzID0gZmluZEFsbE1vZGVscyh0aGlzLmV4cHJlc3Npb24sIE1vZGVsQ2xhc3MpO1xuICAgICAgdGhpcy5hbGxSZWxhdGlvbnMgPSBmaW5kQWxsUmVsYXRpb25zKHRoaXMuZXhwcmVzc2lvbiwgTW9kZWxDbGFzcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIG9uQmVmb3JlSW50ZXJuYWwoYnVpbGRlcikge1xuICAgIHJldHVybiBmZXRjaENvbHVtbkluZm8oYnVpbGRlciwgdGhpcy5hbGxNb2RlbENsYXNzZXMpO1xuICB9XG5cbiAgb25CZWZvcmVCdWlsZChidWlsZGVyKSB7XG4gICAgY29uc3QgYnVpbGRlckNsb25lID0gYnVpbGRlci5jbG9uZSgpO1xuXG4gICAgYnVpbGRlci50YWJsZShgJHt0aGlzLnJvb3RNb2RlbENsYXNzLnRhYmxlTmFtZX0gYXMgJHt0aGlzLnJvb3RNb2RlbENsYXNzLnRhYmxlTmFtZX1gKTtcbiAgICBidWlsZGVyLmZpbmRPcHRpb25zKHtjYWxsQWZ0ZXJHZXREZWVwbHk6IHRydWV9KTtcblxuICAgIHRoaXMuYnVpbGQoe1xuICAgICAgZXhwcjogdGhpcy5leHByZXNzaW9uLFxuICAgICAgYnVpbGRlcjogYnVpbGRlcixcbiAgICAgIG1vZGVsQ2xhc3M6IGJ1aWxkZXIubW9kZWxDbGFzcygpLFxuICAgICAgcGFyZW50SW5mbzogbnVsbCxcbiAgICAgIHJlbGF0aW9uOiBudWxsLFxuICAgICAgcGF0aDogJycsXG4gICAgICBzZWxlY3RGaWx0ZXI6IChjb2wpID0+IHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXJDbG9uZS5oYXNTZWxlY3Rpb24oY29sKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uUmF3UmVzdWx0KGJ1aWxkZXIsIHJvd3MpIHtcbiAgICBpZiAoXy5pc0VtcHR5KHJvd3MpKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICBjb25zdCBrZXlJbmZvQnlQYXRoID0gdGhpcy5jcmVhdGVLZXlJbmZvKHJvd3MpO1xuICAgIGNvbnN0IHBhdGhJbmZvID0gXy52YWx1ZXModGhpcy5wYXRoSW5mbyk7XG5cbiAgICBjb25zdCB0cmVlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBjb25zdCBzdGFjayA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbHIgPSByb3dzLmxlbmd0aDsgaSA8IGxyOyArK2kpIHtcbiAgICAgIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gICAgICBsZXQgY3VyQnJhbmNoID0gdHJlZTtcblxuICAgICAgZm9yIChsZXQgaiA9IDAsIGxwID0gcGF0aEluZm8ubGVuZ3RoOyBqIDwgbHA7ICsraikge1xuICAgICAgICBjb25zdCBwSW5mbyA9IHBhdGhJbmZvW2pdO1xuICAgICAgICBjb25zdCBpZCA9IHBJbmZvLmlkR2V0dGVyKHJvdyk7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBJbmZvLnJlbGF0aW9uKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50TW9kZWwgPSBzdGFja1twSW5mby5lbmNQYXJlbnRQYXRoXTtcblxuICAgICAgICAgIGN1ckJyYW5jaCA9IHBJbmZvLmdldEJyYW5jaChwYXJlbnRNb2RlbCk7XG5cbiAgICAgICAgICBpZiAoIWN1ckJyYW5jaCkge1xuICAgICAgICAgICAgY3VyQnJhbmNoID0gcEluZm8uY3JlYXRlQnJhbmNoKHBhcmVudE1vZGVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbW9kZWwgPSBwSW5mby5nZXRNb2RlbEZyb21CcmFuY2goY3VyQnJhbmNoLCBpZ