UNPKG

kepler.gl

Version:

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

171 lines (169 loc) 28 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.SchemaPanelDropMessage = exports.SchemaPanel = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _reactRedux = require("react-redux"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _components = require("@kepler.gl/components"); var _processors = require("@kepler.gl/processors"); var _utils = require("@kepler.gl/utils"); var _tree = require("./tree"); var _duckdbTableUtils = require("../table/duckdb-table-utils"); var _templateObject, _templateObject2, _templateObject3, _templateObject4; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project 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; } // TODO note that demo state is available in demo-app, but not when add modules to dependencies in a custom map var StyledSchemaPanel = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 12px;\n padding: 12px;\n font-family: ", ";\n height: 100%;\n"])), function (props) { return props.theme.textColor; }, function (props) { return props.theme.fontFamily; }); var StyledLoadingSpinnerWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n"]))); function getColumnSchema(_x, _x2) { return _getColumnSchema.apply(this, arguments); } function _getColumnSchema() { _getColumnSchema = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(connection, tableName) { var columnResult, columnDescribe, keplerFields; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return connection.query("Select * from '".concat(tableName, "' LIMIT 1;")); case 2: columnResult = _context2.sent; _context2.next = 5; return (0, _duckdbTableUtils.getDuckDBColumnTypes)(connection, tableName); case 5: columnDescribe = _context2.sent; keplerFields = (0, _processors.arrowSchemaToFields)(columnResult, (0, _duckdbTableUtils.getDuckDBColumnTypesMap)(columnDescribe)); return _context2.abrupt("return", { key: tableName, object: { type: 'dataset', tableName: tableName }, children: columnResult.schema.fields.map(function (field, fieldIndex) { return { key: field.name, object: { type: 'column', name: field.name, arrowType: field.type, fieldType: keplerFields[fieldIndex].type } }; }) }); case 8: case "end": return _context2.stop(); } }, _callee2); })); return _getColumnSchema.apply(this, arguments); } function getSchemaSuggestion(result) { return result.reduce(function (accu, data) { var columns = data.children.map(function (child) { return { column_name: child.key, table_name: data.key }; }); return accu.concat(columns); }, []); } var StyledSchemaPanelDropMessage = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n flex-direction: column;\n text-align: center;\n\n div {\n margin: 5px;\n }\n .header {\n font-size: 15px;\n }\n .bold {\n font-weight: 700;\n }\n"]))); var StyledAddIcon = (0, _styledComponents["default"])(_components.Icons.Add)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: inline;\n margin-top: -3px;\n"]))); var SchemaPanelDropMessage = exports.SchemaPanelDropMessage = function SchemaPanelDropMessage() { return /*#__PURE__*/_react["default"].createElement(StyledSchemaPanelDropMessage, null, /*#__PURE__*/_react["default"].createElement("div", { className: "header" }, /*#__PURE__*/_react["default"].createElement(StyledAddIcon, null), " Add files to DuckDB"), /*#__PURE__*/_react["default"].createElement("div", { className: "bold" }, "Supported formats: "), /*#__PURE__*/_react["default"].createElement("div", null, ".csv, .json, .geojson, .parquet, .arrow"), /*#__PURE__*/_react["default"].createElement("div", null, "Files you add will stay local to your browser.")); }; var SchemaPanel = exports.SchemaPanel = function SchemaPanel(_ref) { var setTableSchema = _ref.setTableSchema, droppedFile = _ref.droppedFile, schemaUpdateTrigger = _ref.schemaUpdateTrigger; var _useState = (0, _react.useState)([]), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), columnSchemas = _useState2[0], setColumnSchemas = _useState2[1]; var datasets = (0, _reactRedux.useSelector)(function (state) { var _state$demo; return state === null || state === void 0 || (_state$demo = state.demo) === null || _state$demo === void 0 || (_state$demo = _state$demo.keplerGl) === null || _state$demo === void 0 || (_state$demo = _state$demo.map) === null || _state$demo === void 0 ? void 0 : _state$demo.visState.datasets; }); var getTableSchema = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var _tableResult$getChild, _ref3; var db, c, tableResult, tableNames, result, tableSchema; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: db = (0, _utils.getApplicationConfig)().database; if (db) { _context.next = 4; break; } console.error('The database is not configured properly.'); return _context.abrupt("return"); case 4: _context.next = 6; return db.connect(); case 6: c = _context.sent; _context.next = 9; return c.query('SHOW TABLES;'); case 9: tableResult = _context.sent; tableNames = (_tableResult$getChild = tableResult.getChildAt(0)) === null || _tableResult$getChild === void 0 ? void 0 : _tableResult$getChild.toJSON(); _context.next = 13; return Promise.all((_ref3 = tableNames || []) === null || _ref3 === void 0 ? void 0 : _ref3.map(function (name) { return getColumnSchema(c, name); })); case 13: result = _context.sent; tableSchema = getSchemaSuggestion(result); setColumnSchemas(result); setTableSchema(tableSchema); _context.next = 19; return c.close(); case 19: case "end": return _context.stop(); } }, _callee); })), [setColumnSchemas, setTableSchema, schemaUpdateTrigger]); (0, _react.useEffect)(function () { getTableSchema(); }, [datasets, droppedFile, getTableSchema]); return /*#__PURE__*/_react["default"].createElement(StyledSchemaPanel, null, columnSchemas !== null && columnSchemas !== void 0 && columnSchemas.length ? columnSchemas.map(function (data) { return /*#__PURE__*/_react["default"].createElement(_tree.Tree, { key: data.key, treeData: data, renderNode: function renderNode(node) { if (node.object.type === 'dataset') { return /*#__PURE__*/_react["default"].createElement(_tree.DatasetNode, { node: node }); } else if (node.object.type === 'column') { return /*#__PURE__*/_react["default"].createElement(_tree.ColumnNode, { node: node }); } return null; } }); }) : droppedFile ? /*#__PURE__*/_react["default"].createElement(StyledLoadingSpinnerWrapper, null, /*#__PURE__*/_react["default"].createElement(_components.LoadingSpinner, null)) : /*#__PURE__*/_react["default"].createElement(SchemaPanelDropMessage, null)); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RSZWR1eCIsIl9zdHlsZWRDb21wb25lbnRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb21wb25lbnRzIiwiX3Byb2Nlc3NvcnMiLCJfdXRpbHMiLCJfdHJlZSIsIl9kdWNrZGJUYWJsZVV0aWxzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiU3R5bGVkU2NoZW1hUGFuZWwiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJ0ZXh0Q29sb3IiLCJmb250RmFtaWx5IiwiU3R5bGVkTG9hZGluZ1NwaW5uZXJXcmFwcGVyIiwiZ2V0Q29sdW1uU2NoZW1hIiwiX3giLCJfeDIiLCJfZ2V0Q29sdW1uU2NoZW1hIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZTIiLCJjb25uZWN0aW9uIiwidGFibGVOYW1lIiwiY29sdW1uUmVzdWx0IiwiY29sdW1uRGVzY3JpYmUiLCJrZXBsZXJGaWVsZHMiLCJ3cmFwIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwicHJldiIsIm5leHQiLCJxdWVyeSIsImNvbmNhdCIsInNlbnQiLCJnZXREdWNrREJDb2x1bW5UeXBlcyIsImFycm93U2NoZW1hVG9GaWVsZHMiLCJnZXREdWNrREJDb2x1bW5UeXBlc01hcCIsImFicnVwdCIsImtleSIsIm9iamVjdCIsInR5cGUiLCJjaGlsZHJlbiIsInNjaGVtYSIsImZpZWxkcyIsIm1hcCIsImZpZWxkIiwiZmllbGRJbmRleCIsIm5hbWUiLCJhcnJvd1R5cGUiLCJmaWVsZFR5cGUiLCJzdG9wIiwiZ2V0U2NoZW1hU3VnZ2VzdGlvbiIsInJlc3VsdCIsInJlZHVjZSIsImFjY3UiLCJkYXRhIiwiY29sdW1ucyIsImNoaWxkIiwiY29sdW1uX25hbWUiLCJ0YWJsZV9uYW1lIiwiU3R5bGVkU2NoZW1hUGFuZWxEcm9wTWVzc2FnZSIsIlN0eWxlZEFkZEljb24iLCJJY29ucyIsIkFkZCIsIlNjaGVtYVBhbmVsRHJvcE1lc3NhZ2UiLCJleHBvcnRzIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIlNjaGVtYVBhbmVsIiwiX3JlZiIsInNldFRhYmxlU2NoZW1hIiwiZHJvcHBlZEZpbGUiLCJzY2hlbWFVcGRhdGVUcmlnZ2VyIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwiY29sdW1uU2NoZW1hcyIsInNldENvbHVtblNjaGVtYXMiLCJkYXRhc2V0cyIsInVzZVNlbGVjdG9yIiwic3RhdGUiLCJfc3RhdGUkZGVtbyIsImRlbW8iLCJrZXBsZXJHbCIsInZpc1N0YXRlIiwiZ2V0VGFibGVTY2hlbWEiLCJ1c2VDYWxsYmFjayIsIl9jYWxsZWUiLCJfdGFibGVSZXN1bHQkZ2V0Q2hpbGQiLCJfcmVmMyIsImRiIiwiYyIsInRhYmxlUmVzdWx0IiwidGFibGVOYW1lcyIsInRhYmxlU2NoZW1hIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwiZGF0YWJhc2UiLCJjb25zb2xlIiwiZXJyb3IiLCJjb25uZWN0IiwiZ2V0Q2hpbGRBdCIsInRvSlNPTiIsIlByb21pc2UiLCJhbGwiLCJjbG9zZSIsInVzZUVmZmVjdCIsImxlbmd0aCIsIlRyZWUiLCJ0cmVlRGF0YSIsInJlbmRlck5vZGUiLCJub2RlIiwiRGF0YXNldE5vZGUiLCJDb2x1bW5Ob2RlIiwiTG9hZGluZ1NwaW5uZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9zY2hlbWEtcGFuZWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtMb2FkaW5nU3Bpbm5lciwgSWNvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvY29tcG9uZW50cyc7XG5pbXBvcnQge2Fycm93U2NoZW1hVG9GaWVsZHN9IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5pbXBvcnQge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtnZXRBcHBsaWNhdGlvbkNvbmZpZywgRGF0YWJhc2VDb25uZWN0aW9ufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuaW1wb3J0IHtUcmVlLCBEYXRhc2V0Tm9kZSwgQ29sdW1uTm9kZSwgVHJlZU5vZGVEYXRhfSBmcm9tICcuL3RyZWUnO1xuaW1wb3J0IHtnZXREdWNrREJDb2x1bW5UeXBlcywgZ2V0RHVja0RCQ29sdW1uVHlwZXNNYXB9IGZyb20gJy4uL3RhYmxlL2R1Y2tkYi10YWJsZS11dGlscyc7XG5cbi8vIFRPRE8gbm90ZSB0aGF0IGRlbW8gc3RhdGUgaXMgYXZhaWxhYmxlIGluIGRlbW8tYXBwLCBidXQgbm90IHdoZW4gYWRkIG1vZHVsZXMgdG8gZGVwZW5kZW5jaWVzIGluIGEgY3VzdG9tIG1hcFxudHlwZSBTdGF0ZSA9IHtcbiAgZGVtbz86IHtcbiAgICBrZXBsZXJHbDoge1xuICAgICAgbWFwOiB7XG4gICAgICAgIHZpc1N0YXRlOiBWaXNTdGF0ZTtcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn07XG5cbmNvbnN0IFN0eWxlZFNjaGVtYVBhbmVsID0gc3R5bGVkLmRpdmBcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBwYWRkaW5nOiAxMnB4O1xuICBmb250LWZhbWlseTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5mb250RmFtaWx5fTtcbiAgaGVpZ2h0OiAxMDAlO1xuYDtcblxuY29uc3QgU3R5bGVkTG9hZGluZ1NwaW5uZXJXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGhlaWdodDogMTAwJTtcbmA7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENvbHVtblNjaGVtYShjb25uZWN0aW9uOiBEYXRhYmFzZUNvbm5lY3Rpb24sIHRhYmxlTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbHVtblJlc3VsdCA9IGF3YWl0IGNvbm5lY3Rpb24ucXVlcnkoYFNlbGVjdCAqIGZyb20gJyR7dGFibGVOYW1lfScgTElNSVQgMTtgKTtcblxuICBjb25zdCBjb2x1bW5EZXNjcmliZSA9IGF3YWl0IGdldER1Y2tEQkNvbHVtblR5cGVzKGNvbm5lY3Rpb24sIHRhYmxlTmFtZSk7XG4gIGNvbnN0IGtlcGxlckZpZWxkcyA9IGFycm93U2NoZW1hVG9GaWVsZHMoY29sdW1uUmVzdWx0LCBnZXREdWNrREJDb2x1bW5UeXBlc01hcChjb2x1bW5EZXNjcmliZSkpO1xuXG4gIHJldHVybiB7XG4gICAga2V5OiB0YWJsZU5hbWUsXG4gICAgb2JqZWN0OiB7XG4gICAgICB0eXBlOiAnZGF0YXNldCcsXG4gICAgICB0YWJsZU5hbWU6IHRhYmxlTmFtZVxuICAgIH0sXG4gICAgY2hpbGRyZW46IGNvbHVtblJlc3VsdC5zY2hlbWEuZmllbGRzLm1hcCgoZmllbGQsIGZpZWxkSW5kZXgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogZmllbGQubmFtZSxcbiAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgdHlwZTogJ2NvbHVtbicsXG4gICAgICAgICAgbmFtZTogZmllbGQubmFtZSxcbiAgICAgICAgICBhcnJvd1R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgZmllbGRUeXBlOiBrZXBsZXJGaWVsZHNbZmllbGRJbmRleF0udHlwZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pXG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFNjaGVtYVN1Z2dlc3Rpb24gPSB7Y29sdW1uX25hbWU6IHN0cmluZzsgdGFibGVfbmFtZTogc3RyaW5nfTtcblxuZnVuY3Rpb24gZ2V0U2NoZW1hU3VnZ2VzdGlvbihyZXN1bHQ6IHtrZXk6IHN0cmluZzsgY2hpbGRyZW46IHtrZXk6IHN0cmluZ31bXX1bXSkge1xuICByZXR1cm4gcmVzdWx0LnJlZHVjZSgoYWNjdSwgZGF0YSkgPT4ge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBkYXRhLmNoaWxkcmVuLm1hcChjaGlsZCA9PiAoe1xuICAgICAgY29sdW1uX25hbWU6IGNoaWxkLmtleSxcbiAgICAgIHRhYmxlX25hbWU6IGRhdGEua2V5XG4gICAgfSkpO1xuICAgIHJldHVybiBhY2N1LmNvbmNhdChjb2x1bW5zKTtcbiAgfSwgW10gYXMgU2NoZW1hU3VnZ2VzdGlvbltdKTtcbn1cblxudHlwZSBTY2hlbWFQYW5lbFByb3BzID0ge1xuICBzZXRUYWJsZVNjaGVtYTogKHRhYmxlU2NoZW1hOiBTY2hlbWFTdWdnZXN0aW9uW10pID0+IHZvaWQ7XG4gIGRyb3BwZWRGaWxlOiBGaWxlIHwgbnVsbDtcbiAgc2NoZW1hVXBkYXRlVHJpZ2dlcjogbnVtYmVyO1xufTtcblxuY29uc3QgU3R5bGVkU2NoZW1hUGFuZWxEcm9wTWVzc2FnZSA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcblxuICBkaXYge1xuICAgIG1hcmdpbjogNXB4O1xuICB9XG4gIC5oZWFkZXIge1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgfVxuICAuYm9sZCB7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkQWRkSWNvbiA9IHN0eWxlZChJY29ucy5BZGQpYFxuICBkaXNwbGF5OiBpbmxpbmU7XG4gIG1hcmdpbi10b3A6IC0zcHg7XG5gO1xuXG5leHBvcnQgY29uc3QgU2NoZW1hUGFuZWxEcm9wTWVzc2FnZSA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8U3R5bGVkU2NoZW1hUGFuZWxEcm9wTWVzc2FnZT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGVhZGVyXCI+XG4gICAgICAgIDxTdHlsZWRBZGRJY29uIC8+IEFkZCBmaWxlcyB0byBEdWNrREJcbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJib2xkXCI+U3VwcG9ydGVkIGZvcm1hdHM6IDwvZGl2PlxuICAgICAgPGRpdj4uY3N2LCAuanNvbiwgLmdlb2pzb24sIC5wYXJxdWV0LCAuYXJyb3c8L2Rpdj5cbiAgICAgIDxkaXY+RmlsZXMgeW91IGFkZCB3aWxsIHN0YXkgbG9jYWwgdG8geW91ciBicm93c2VyLjwvZGl2PlxuICAgIDwvU3R5bGVkU2NoZW1hUGFuZWxEcm9wTWVzc2FnZT5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTY2hlbWFQYW5lbCA9ICh7XG4gIHNldFRhYmxlU2NoZW1hLFxuICBkcm9wcGVkRmlsZSxcbiAgc2NoZW1hVXBkYXRlVHJpZ2dlclxufTogU2NoZW1hUGFuZWxQcm9wcykgPT4ge1xuICBjb25zdCBbY29sdW1uU2NoZW1hcywgc2V0Q29sdW1uU2NoZW1hc10gPSB1c2VTdGF0ZTxUcmVlTm9kZURhdGE8e3R5cGU6IHN0cmluZ30+W10+KFtdKTtcbiAgY29uc3QgZGF0YXNldHMgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZT8uZGVtbz8ua2VwbGVyR2w/Lm1hcD8udmlzU3RhdGUuZGF0YXNldHMpO1xuXG4gIGNvbnN0IGdldFRhYmxlU2NoZW1hID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRiID0gZ2V0QXBwbGljYXRpb25Db25maWcoKS5kYXRhYmFzZTtcbiAgICBpZiAoIWRiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgZGF0YWJhc2UgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGMgPSBhd2FpdCBkYi5jb25uZWN0KCk7XG5cbiAgICBjb25zdCB0YWJsZVJlc3VsdCA9IGF3YWl0IGMucXVlcnkoJ1NIT1cgVEFCTEVTOycpO1xuXG4gICAgY29uc3QgdGFibGVOYW1lczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSB0YWJsZVJlc3VsdC5nZXRDaGlsZEF0KDApPy50b0pTT04oKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKCh0YWJsZU5hbWVzIHx8IFtdKT8ubWFwKG5hbWUgPT4gZ2V0Q29sdW1uU2NoZW1hKGMsIG5hbWUpKSk7XG4gICAgY29uc3QgdGFibGVTY2hlbWEgPSBnZXRTY2hlbWFTdWdnZXN0aW9uKHJlc3VsdCk7XG5cbiAgICBzZXRDb2x1bW5TY2hlbWFzKHJlc3VsdCk7XG4gICAgc2V0VGFibGVTY2hlbWEodGFibGVTY2hlbWEpO1xuICAgIGF3YWl0IGMuY2xvc2UoKTtcblxuICAgIC8vIHNjaGVtYVVwZGF0ZVRyaWdnZXIgaW5kaWNhdGVzIHBvc3NpYmxlIGNoYW5nZSBpbiBEdWNrREJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtzZXRDb2x1bW5TY2hlbWFzLCBzZXRUYWJsZVNjaGVtYSwgc2NoZW1hVXBkYXRlVHJpZ2dlcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZ2V0VGFibGVTY2hlbWEoKTtcbiAgfSwgW2RhdGFzZXRzLCBkcm9wcGVkRmlsZSwgZ2V0VGFibGVTY2hlbWFdKTtcblxuICByZXR1cm4gKFxuICAgIDxTdHlsZWRTY2hlbWFQYW5lbD5cbiAgICAgIHtjb2x1bW5TY2hlbWFzPy5sZW5ndGggPyAoXG4gICAgICAgIGNvbHVtblNjaGVtYXMubWFwKGRhdGEgPT4gKFxuICAgICAgICAgIDxUcmVlXG4gICAgICAgICAgICBrZXk9e2RhdGEua2V5fVxuICAgICAgICAgICAgdHJlZURhdGE9e2RhdGF9XG4gICAgICAgICAgICByZW5kZXJOb2RlPXtub2RlID0+IHtcbiAgICAgICAgICAgICAgaWYgKG5vZGUub2JqZWN0LnR5cGUgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiA8RGF0YXNldE5vZGUgbm9kZT17bm9kZX0gLz47XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5vYmplY3QudHlwZSA9PT0gJ2NvbHVtbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gPENvbHVtbk5vZGUgbm9kZT17bm9kZX0gLz47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgICkpXG4gICAgICApIDogZHJvcHBlZEZpbGUgPyAoXG4gICAgICAgIDxTdHlsZWRMb2FkaW5nU3Bpbm5lcldyYXBwZXI+XG4gICAgICAgICAgPExvYWRpbmdTcGlubmVyIC8+XG4gICAgICAgIDwvU3R5bGVkTG9hZGluZ1NwaW5uZXJXcmFwcGVyPlxuICAgICAgKSA6IChcbiAgICAgICAgPFNjaGVtYVBhbmVsRHJvcE1lc3NhZ2UgLz5cbiAgICAgICl9XG4gICAgPC9TdHlsZWRTY2hlbWFQYW5lbD5cbiAgKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFFQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxXQUFBLEdBQUFMLE9BQUE7QUFFQSxJQUFBTSxNQUFBLEdBQUFOLE9BQUE7QUFFQSxJQUFBTyxLQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxpQkFBQSxHQUFBUixPQUFBO0FBQTBGLElBQUFTLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFiMUY7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBZix3QkFBQWUsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLGdCQUFBSyxPQUFBLENBQUFMLENBQUEsMEJBQUFBLENBQUEsc0JBQUFBLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMs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