UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

253 lines (247 loc) 37.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getQueryTool = getQueryTool; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _react = _interopRequireWildcard(require("react")); var _reactRedux = require("react-redux"); var _actions = require("@kepler.gl/actions"); var _duckdb = require("@openassistant/duckdb"); var _utils = require("./utils"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } 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 _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 _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 ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project function getQueryTool(datasets, layers) { // context for query tools var getValues = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(datasetName, variableName) { var values; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: values = (0, _utils.getValuesFromDataset)(datasets, layers, datasetName, variableName); return _context.abrupt("return", values); case 2: case "end": return _context.stop(); } }, _callee); })); return function getValues(_x, _x2) { return _ref.apply(this, arguments); }; }(); // customize a filterDataset tool from localQuery tool var filterDataset = _objectSpread(_objectSpread({}, _duckdb.localQuery), {}, { description: "filter the user dataset by using a select SQL query in duckdb and save the result as a new dataset. Please note:\n1. REQUIRED: In the SQL query, please use a sub-query to add an auto-increment column 'row_index' to the original dataset.\n2. The SQL query should return the selected row_index values.\n3. Please only use the variable user mentioned for variableNames.\nFor example: 'SELECT row_index FROM (SELECT row_number() OVER () AS row_index, * FROM dataset_name) WHERE Count > 0'\n", context: _objectSpread(_objectSpread({}, _duckdb.localQuery.context), {}, { getValues: getValues }), component: FilterDatasetComponent }); // customize a generic query tool from localQuery tool var genericQuery = _objectSpread(_objectSpread({}, _duckdb.localQuery), {}, { description: "execute a generic select SQL query in duckdb to answer user's question. Please note:\n1. This tool is NOT for filtering the user dataset.\n2. This tool does NOT support geometry column and geometric operations.\n3. The variableNames should not be empty. If it is not provided, then pick a variable name from the dataset.\n4. There is no need to add a sub-query to add an auto-increment column 'row_index' to the original dataset.\n", context: _objectSpread(_objectSpread({}, _duckdb.localQuery.context), {}, { getValues: getValues }) }); return { filterDataset: filterDataset, genericQuery: genericQuery }; } function FilterDatasetComponent(_ref2) { var columnData = _ref2.columnData, datasetName = _ref2.datasetName, sql = _ref2.sql, dbTableName = _ref2.dbTableName, filteredDatasetName = _ref2.filteredDatasetName; var datasets = (0, _reactRedux.useSelector)(function (state) { return state.demo.keplerGl.map.visState.datasets; }); var layers = (0, _reactRedux.useSelector)(function (state) { return state.demo.keplerGl.map.visState.layers; }); var queryInProgress = (0, _react.useRef)(null); var dispatch = (0, _reactRedux.useDispatch)(); var _useState = (0, _react.useState)(null), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), error = _useState2[0], setError = _useState2[1]; (0, _react.useEffect)(function () { // check if the filteredDatasetName is already in the datasets var newDatasetId = Object.keys(datasets).find(function (dataId) { return datasets[dataId].label === filteredDatasetName; }); // if the filteredDatasetName is already in the datasets, return if (newDatasetId) return; var query = /*#__PURE__*/function () { var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() { return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: if (!queryInProgress.current) { _context3.next = 3; break; } _context3.next = 3; return queryInProgress.current; case 3: // Create a new promise for this query queryInProgress.current = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() { var duckDB, safeDbTableName, conn, arrowResult, result, filteredDataset; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; _context2.next = 3; return (0, _duckdb.getDuckDB)(); case 3: duckDB = _context2.sent; if (duckDB) { _context2.next = 6; break; } throw new Error('DuckDB instance is not initialized'); case 6: if (!(columnData && dbTableName && sql)) { _context2.next = 21; break; } // use double quotes for the table name safeDbTableName = "".concat(dbTableName); // connect to the database _context2.next = 10; return duckDB.connect(); case 10: conn = _context2.sent; _context2.next = 13; return conn.query(sql); case 13: arrowResult = _context2.sent; // convert the arrow result to a json array result = arrowResult.toArray().map(function (row) { return row.toJSON(); }); // delete the table from the database _context2.next = 17; return conn.query("DROP TABLE ".concat(safeDbTableName)); case 17: _context2.next = 19; return conn.close(); case 19: // filter the dataset with the query result filteredDataset = filterDataset(datasets, layers, datasetName, result, filteredDatasetName); if (filteredDataset) { // add the new dataset to the map dispatch((0, _actions.addDataToMap)({ datasets: [filteredDataset], options: { autoCreateLayers: true, centerMap: false } })); } case 21: _context2.next = 27; break; case 23: _context2.prev = 23; _context2.t0 = _context2["catch"](0); console.error(_context2.t0); setError(_context2.t0 instanceof Error ? _context2.t0.message : 'Unknown error occurred'); case 27: _context2.prev = 27; queryInProgress.current = null; return _context2.finish(27); case 30: case "end": return _context2.stop(); } }, _callee2, null, [[0, 23, 27, 30]]); }))(); // Wait for the query to complete _context3.next = 6; return queryInProgress.current; case 6: case "end": return _context3.stop(); } }, _callee3); })); return function query() { return _ref3.apply(this, arguments); }; }(); query(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return error ? /*#__PURE__*/_react["default"].createElement("div", { style: { color: 'red', fontSize: '8px' } }, error) : null; } function filterDataset(datasets, layers, datasetName, filteredRows, filteredDatasetName) { // find datasetId from datasets var datasetId = Object.keys(datasets).find(function (dataId) { return datasets[dataId].label === datasetName; }); if (!datasetId) return; // filter the original dataset var originalDataset = datasets[datasetId]; var fields = originalDataset.fields; var rows; if (originalDataset.type === 'vector-tile') { var columnData = []; var _iterator = _createForOfIteratorHelper(fields), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var field = _step.value; // get the values from the vector tile layer var values = (0, _utils.getValuesFromVectorTileLayer)(datasetId, layers, field); columnData.push(values); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } rows = filteredRows.map(function (rowIndex) { return columnData.map(function (column) { return column[Number(rowIndex['row_index']) - 1]; }); }); } else { rows = filteredRows.map(function (rowIndex) { return fields.map(function (field) { return originalDataset.getValue(field.name, Number(rowIndex['row_index']) - 1); }); }); } // create a new dataset with the filtered data var newDataset = { info: { id: filteredDatasetName, label: filteredDatasetName }, data: { fields: fields, rows: rows } }; return newDataset; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RSZWR1eCIsIl9hY3Rpb25zIiwiX2R1Y2tkYiIsIl91dGlscyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImdldFF1ZXJ5VG9vbCIsImRhdGFzZXRzIiwibGF5ZXJzIiwiZ2V0VmFsdWVzIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiZGF0YXNldE5hbWUiLCJ2YXJpYWJsZU5hbWUiLCJ2YWx1ZXMiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJnZXRWYWx1ZXNGcm9tRGF0YXNldCIsImFicnVwdCIsInN0b3AiLCJfeCIsIl94MiIsImZpbHRlckRhdGFzZXQiLCJsb2NhbFF1ZXJ5IiwiZGVzY3JpcHRpb24iLCJjb250ZXh0IiwiY29tcG9uZW50IiwiRmlsdGVyRGF0YXNldENvbXBvbmVudCIsImdlbmVyaWNRdWVyeSIsIl9yZWYyIiwiY29sdW1uRGF0YSIsInNxbCIsImRiVGFibGVOYW1lIiwiZmlsdGVyZWREYXRhc2V0TmFtZSIsInVzZVNlbGVjdG9yIiwic3RhdGUiLCJkZW1vIiwia2VwbGVyR2wiLCJtYXAiLCJ2aXNTdGF0ZSIsInF1ZXJ5SW5Qcm9ncmVzcyIsInVzZVJlZiIsImRpc3BhdGNoIiwidXNlRGlzcGF0Y2giLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJlcnJvciIsInNldEVycm9yIiwidXNlRWZmZWN0IiwibmV3RGF0YXNldElkIiwiZmluZCIsImRhdGFJZCIsImxhYmVsIiwicXVlcnkiLCJfcmVmMyIsIl9jYWxsZWUzIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiY3VycmVudCIsIl9jYWxsZWUyIiwiZHVja0RCIiwic2FmZURiVGFibGVOYW1lIiwiY29ubiIsImFycm93UmVzdWx0IiwicmVzdWx0IiwiZmlsdGVyZWREYXRhc2V0IiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiZ2V0RHVja0RCIiwic2VudCIsIkVycm9yIiwiY29uY2F0IiwiY29ubmVjdCIsInRvQXJyYXkiLCJyb3ciLCJ0b0pTT04iLCJjbG9zZSIsImFkZERhdGFUb01hcCIsIm9wdGlvbnMiLCJhdXRvQ3JlYXRlTGF5ZXJzIiwiY2VudGVyTWFwIiwidDAiLCJjb25zb2xlIiwibWVzc2FnZSIsImZpbmlzaCIsImNyZWF0ZUVsZW1lbnQiLCJzdHlsZSIsImNvbG9yIiwiZm9udFNpemUiLCJmaWx0ZXJlZFJvd3MiLCJkYXRhc2V0SWQiLCJvcmlnaW5hbERhdGFzZXQiLCJmaWVsZHMiLCJyb3dzIiwidHlwZSIsIl9pdGVyYXRvciIsIl9zdGVwIiwiZmllbGQiLCJnZXRWYWx1ZXNGcm9tVmVjdG9yVGlsZUxheWVyIiwiZXJyIiwicm93SW5kZXgiLCJjb2x1bW4iLCJOdW1iZXIiLCJnZXRWYWx1ZSIsIm5ld0RhdGFzZXQiLCJpbmZvIiwiaWQiLCJkYXRhIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL3F1ZXJ5LXRvb2wudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VEaXNwYXRjaCwgdXNlU2VsZWN0b3J9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHthZGREYXRhVG9NYXB9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge2dldER1Y2tEQiwgbG9jYWxRdWVyeSwgTG9jYWxRdWVyeVRvb2x9IGZyb20gJ0BvcGVuYXNzaXN0YW50L2R1Y2tkYic7XG5cbmltcG9ydCB7Z2V0VmFsdWVzRnJvbURhdGFzZXQsIGdldFZhbHVlc0Zyb21WZWN0b3JUaWxlTGF5ZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtTdGF0ZX0gZnJvbSAnLi4vY29tcG9uZW50cy9haS1hc3Npc3RhbnQtbWFuYWdlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeVRvb2woZGF0YXNldHM6IERhdGFzZXRzLCBsYXllcnM6IExheWVyW10pIHtcbiAgLy8gY29udGV4dCBmb3IgcXVlcnkgdG9vbHNcbiAgY29uc3QgZ2V0VmFsdWVzID0gYXN5bmMgKGRhdGFzZXROYW1lOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gZ2V0VmFsdWVzRnJvbURhdGFzZXQoZGF0YXNldHMsIGxheWVycywgZGF0YXNldE5hbWUsIHZhcmlhYmxlTmFtZSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfTtcblxuICAvLyBjdXN0b21pemUgYSBmaWx0ZXJEYXRhc2V0IHRvb2wgZnJvbSBsb2NhbFF1ZXJ5IHRvb2xcbiAgY29uc3QgZmlsdGVyRGF0YXNldDogTG9jYWxRdWVyeVRvb2wgPSB7XG4gICAgLi4ubG9jYWxRdWVyeSxcbiAgICBkZXNjcmlwdGlvbjogYGZpbHRlciB0aGUgdXNlciBkYXRhc2V0IGJ5IHVzaW5nIGEgc2VsZWN0IFNRTCBxdWVyeSBpbiBkdWNrZGIgYW5kIHNhdmUgdGhlIHJlc3VsdCBhcyBhIG5ldyBkYXRhc2V0LiBQbGVhc2Ugbm90ZTpcbjEuIFJFUVVJUkVEOiBJbiB0aGUgU1FMIHF1ZXJ5LCBwbGVhc2UgdXNlIGEgc3ViLXF1ZXJ5IHRvIGFkZCBhbiBhdXRvLWluY3JlbWVudCBjb2x1bW4gJ3Jvd19pbmRleCcgdG8gdGhlIG9yaWdpbmFsIGRhdGFzZXQuXG4yLiBUaGUgU1FMIHF1ZXJ5IHNob3VsZCByZXR1cm4gdGhlIHNlbGVjdGVkIHJvd19pbmRleCB2YWx1ZXMuXG4zLiBQbGVhc2Ugb25seSB1c2UgdGhlIHZhcmlhYmxlIHVzZXIgbWVudGlvbmVkIGZvciB2YXJpYWJsZU5hbWVzLlxuRm9yIGV4YW1wbGU6ICdTRUxFQ1Qgcm93X2luZGV4ICBGUk9NIChTRUxFQ1Qgcm93X251bWJlcigpIE9WRVIgKCkgQVMgcm93X2luZGV4LCAqIEZST00gZGF0YXNldF9uYW1lKSBXSEVSRSBDb3VudCA+IDAnXG5gLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmxvY2FsUXVlcnkuY29udGV4dCxcbiAgICAgIGdldFZhbHVlc1xuICAgIH0sXG4gICAgY29tcG9uZW50OiBGaWx0ZXJEYXRhc2V0Q29tcG9uZW50XG4gIH07XG5cbiAgLy8gY3VzdG9taXplIGEgZ2VuZXJpYyBxdWVyeSB0b29sIGZyb20gbG9jYWxRdWVyeSB0b29sXG4gIGNvbnN0IGdlbmVyaWNRdWVyeTogTG9jYWxRdWVyeVRvb2wgPSB7XG4gICAgLi4ubG9jYWxRdWVyeSxcbiAgICBkZXNjcmlwdGlvbjogYGV4ZWN1dGUgYSBnZW5lcmljIHNlbGVjdCBTUUwgcXVlcnkgaW4gZHVja2RiIHRvIGFuc3dlciB1c2VyJ3MgcXVlc3Rpb24uIFBsZWFzZSBub3RlOlxuMS4gVGhpcyB0b29sIGlzIE5PVCBmb3IgZmlsdGVyaW5nIHRoZSB1c2VyIGRhdGFzZXQuXG4yLiBUaGlzIHRvb2wgZG9lcyBOT1Qgc3VwcG9ydCBnZW9tZXRyeSBjb2x1bW4gYW5kIGdlb21ldHJpYyBvcGVyYXRpb25zLlxuMy4gVGhlIHZhcmlhYmxlTmFtZXMgc2hvdWxkIG5vdCBiZSBlbXB0eS4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHBpY2sgYSB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIGRhdGFzZXQuXG40LiBUaGVyZSBpcyBubyBuZWVkIHRvIGFkZCBhIHN1Yi1xdWVyeSB0byBhZGQgYW4gYXV0by1pbmNyZW1lbnQgY29sdW1uICdyb3dfaW5kZXgnIHRvIHRoZSBvcmlnaW5hbCBkYXRhc2V0LlxuYCxcbiAgICBjb250ZXh0OiB7XG4gICAgICAuLi5sb2NhbFF1ZXJ5LmNvbnRleHQsXG4gICAgICBnZXRWYWx1ZXNcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBmaWx0ZXJEYXRhc2V0LFxuICAgIGdlbmVyaWNRdWVyeVxuICB9O1xufVxuXG5mdW5jdGlvbiBGaWx0ZXJEYXRhc2V0Q29tcG9uZW50KHtjb2x1bW5EYXRhLCBkYXRhc2V0TmFtZSwgc3FsLCBkYlRhYmxlTmFtZSwgZmlsdGVyZWREYXRhc2V0TmFtZX0pIHtcbiAgY29uc3QgZGF0YXNldHMgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZS5kZW1vLmtlcGxlckdsLm1hcC52aXNTdGF0ZS5kYXRhc2V0cyk7XG4gIGNvbnN0IGxheWVycyA9IHVzZVNlbGVjdG9yKChzdGF0ZTogU3RhdGUpID0+IHN0YXRlLmRlbW8ua2VwbGVyR2wubWFwLnZpc1N0YXRlLmxheWVycyk7XG4gIGNvbnN0IHF1ZXJ5SW5Qcm9ncmVzcyA9IHVzZVJlZjxQcm9taXNlPHZvaWQ+IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gY2hlY2sgaWYgdGhlIGZpbHRlcmVkRGF0YXNldE5hbWUgaXMgYWxyZWFkeSBpbiB0aGUgZGF0YXNldHNcbiAgICBjb25zdCBuZXdEYXRhc2V0SWQgPSBPYmplY3Qua2V5cyhkYXRhc2V0cykuZmluZChcbiAgICAgIGRhdGFJZCA9PiBkYXRhc2V0c1tkYXRhSWRdLmxhYmVsID09PSBmaWx0ZXJlZERhdGFzZXROYW1lXG4gICAgKTtcbiAgICAvLyBpZiB0aGUgZmlsdGVyZWREYXRhc2V0TmFtZSBpcyBhbHJlYWR5IGluIHRoZSBkYXRhc2V0cywgcmV0dXJuXG4gICAgaWYgKG5ld0RhdGFzZXRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcXVlcnkgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJZiBhIHF1ZXJ5IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlXG4gICAgICBpZiAocXVlcnlJblByb2dyZXNzLmN1cnJlbnQpIHtcbiAgICAgICAgYXdhaXQgcXVlcnlJblByb2dyZXNzLmN1cnJlbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBwcm9taXNlIGZvciB0aGlzIHF1ZXJ5XG4gICAgICBxdWVyeUluUHJvZ3Jlc3MuY3VycmVudCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZHVja0RCID0gYXdhaXQgZ2V0RHVja0RCKCk7XG4gICAgICAgICAgaWYgKCFkdWNrREIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRHVja0RCIGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29sdW1uRGF0YSAmJiBkYlRhYmxlTmFtZSAmJiBzcWwpIHtcbiAgICAgICAgICAgIC8vIHVzZSBkb3VibGUgcXVvdGVzIGZvciB0aGUgdGFibGUgbmFtZVxuICAgICAgICAgICAgY29uc3Qgc2FmZURiVGFibGVOYW1lID0gYCR7ZGJUYWJsZU5hbWV9YDtcblxuICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2VcbiAgICAgICAgICAgIGNvbnN0IGNvbm4gPSBhd2FpdCBkdWNrREIuY29ubmVjdCgpO1xuXG4gICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBwcm92aWRlZCBTUUwgcXVlcnlcbiAgICAgICAgICAgIGNvbnN0IGFycm93UmVzdWx0ID0gYXdhaXQgY29ubi5xdWVyeShzcWwpO1xuXG4gICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSBhcnJvdyByZXN1bHQgdG8gYSBqc29uIGFycmF5XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhcnJvd1Jlc3VsdC50b0FycmF5KCkubWFwKHJvdyA9PiByb3cudG9KU09OKCkpO1xuXG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRhYmxlIGZyb20gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICBhd2FpdCBjb25uLnF1ZXJ5KGBEUk9QIFRBQkxFICR7c2FmZURiVGFibGVOYW1lfWApO1xuXG4gICAgICAgICAgICAvLyBjbG9zZSB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgYXdhaXQgY29ubi5jbG9zZSgpO1xuXG4gICAgICAgICAgICAvLyBmaWx0ZXIgdGhlIGRhdGFzZXQgd2l0aCB0aGUgcXVlcnkgcmVzdWx0XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZERhdGFzZXQgPSBmaWx0ZXJEYXRhc2V0KFxuICAgICAgICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgICAgICAgbGF5ZXJzLFxuICAgICAgICAgICAgICBkYXRhc2V0TmFtZSxcbiAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICBmaWx0ZXJlZERhdGFzZXROYW1lXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZmlsdGVyZWREYXRhc2V0KSB7XG4gICAgICAgICAgICAgIC8vIGFkZCB0aGUgbmV3IGRhdGFzZXQgdG8gdGhlIG1hcFxuICAgICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBhZGREYXRhVG9NYXAoe1xuICAgICAgICAgICAgICAgICAgZGF0YXNldHM6IFtmaWx0ZXJlZERhdGFzZXRdLFxuICAgICAgICAgICAgICAgICAgb3B0aW9uczoge2F1dG9DcmVhdGVMYXllcnM6IHRydWUsIGNlbnRlck1hcDogZmFsc2V9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgc2V0RXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvciBvY2N1cnJlZCcpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHF1ZXJ5SW5Qcm9ncmVzcy5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgLy8gV2FpdCBmb3IgdGhlIHF1ZXJ5IHRvIGNvbXBsZXRlXG4gICAgICBhd2FpdCBxdWVyeUluUHJvZ3Jlc3MuY3VycmVudDtcbiAgICB9O1xuXG4gICAgcXVlcnkoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICByZXR1cm4gZXJyb3IgPyA8ZGl2IHN0eWxlPXt7Y29sb3I6ICdyZWQnLCBmb250U2l6ZTogJzhweCd9fT57ZXJyb3J9PC9kaXY+IDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRGF0YXNldChcbiAgZGF0YXNldHM6IERhdGFzZXRzLFxuICBsYXllcnM6IExheWVyW10sXG4gIGRhdGFzZXROYW1lOiBzdHJpbmcsXG4gIGZpbHRlcmVkUm93czogUmVjb3JkPHN0cmluZywgbnVtYmVyPltdLFxuICBmaWx0ZXJlZERhdGFzZXROYW1lOiBzdHJpbmdcbikge1xuICAvLyBmaW5kIGRhdGFzZXRJZCBmcm9tIGRhdGFzZXRzXG4gIGNvbnN0IGRhdGFzZXRJZCA9IE9iamVjdC5rZXlzKGRhdGFzZXRzKS5maW5kKGRhdGFJZCA9PiBkYXRhc2V0c1tkYXRhSWRdLmxhYmVsID09PSBkYXRhc2V0TmFtZSk7XG4gIGlmICghZGF0YXNldElkKSByZXR1cm47XG5cbiAgLy8gZmlsdGVyIHRoZSBvcmlnaW5hbCBkYXRhc2V0XG4gIGNvbnN0IG9yaWdpbmFsRGF0YXNldCA9IGRhdGFzZXRzW2RhdGFzZXRJZF07XG5cbiAgY29uc3QgZmllbGRzID0gb3JpZ2luYWxEYXRhc2V0LmZpZWxkcztcblxuICBsZXQgcm93czogdW5rbm93bltdW107XG5cbiAgaWYgKG9yaWdpbmFsRGF0YXNldC50eXBlID09PSAndmVjdG9yLXRpbGUnKSB7XG4gICAgY29uc3QgY29sdW1uRGF0YTogdW5rbm93bltdW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgLy8gZ2V0IHRoZSB2YWx1ZXMgZnJvbSB0aGUgdmVjdG9yIHRpbGUgbGF5ZXJcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGdldFZhbHVlc0Zyb21WZWN0b3JUaWxlTGF5ZXIoZGF0YXNldElkLCBsYXllcnMsIGZpZWxkKTtcbiAgICAgIGNvbHVtbkRhdGEucHVzaCh2YWx1ZXMpO1xuICAgIH1cbiAgICByb3dzID0gZmlsdGVyZWRSb3dzLm1hcChyb3dJbmRleCA9PlxuICAgICAgY29sdW1uRGF0YS5tYXAoY29sdW1uID0+IGNvbHVtbltOdW1iZXIocm93SW5kZXhbJ3Jvd19pbmRleCddKSAtIDFdKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcm93cyA9IGZpbHRlcmVkUm93cy5tYXAocm93SW5kZXggPT5cbiAgICAgIGZpZWxkcy5tYXAoZmllbGQgPT4gb3JpZ2luYWxEYXRhc2V0LmdldFZhbHVlKGZpZWxkLm5hbWUsIE51bWJlcihyb3dJbmRleFsncm93X2luZGV4J10pIC0gMSkpXG4gICAgKTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBhIG5ldyBkYXRhc2V0IHdpdGggdGhlIGZpbHRlcmVkIGRhdGFcbiAgY29uc3QgbmV3RGF0YXNldDogUHJvdG9EYXRhc2V0ID0ge1xuICAgIGluZm86IHtcbiAgICAgIGlkOiBmaWx0ZXJlZERhdGFzZXROYW1lLFxuICAgICAgbGFiZWw6IGZpbHRlcmVkRGF0YXNldE5hbWVcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgIGZpZWxkcyxcbiAgICAgIHJvd3NcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIG5ld0RhdGFzZXQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUlBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUEyRSxTQUFBSyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FB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