@kepler.gl/duckdb 3.3.0-alpha.1 → 3.3.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/adapters/duckdb-wasm-adapter.js +258 -0
- package/dist/{components → cjs/components}/index.js +1 -1
- package/dist/cjs/components/monaco-editor.js +174 -0
- package/dist/cjs/components/preview-data-panel.js +127 -0
- package/dist/cjs/components/schema-panel.js +170 -0
- package/dist/cjs/components/sql-panel.js +395 -0
- package/dist/cjs/components/tree.js +90 -0
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/{plugin.js → cjs/plugin.js} +2 -2
- package/dist/cjs/processors/data-processor.js +353 -0
- package/dist/cjs/table/duckdb-table-utils.js +670 -0
- package/dist/cjs/table/duckdb-table.js +482 -0
- package/dist/{table → cjs/table}/index.js +1 -1
- package/dist/cjs/utils/perf.js +46 -0
- package/dist/esm/adapters/duckdb-wasm-adapter.js +251 -0
- package/dist/esm/components/index.js +9 -0
- package/dist/esm/components/monaco-editor.js +167 -0
- package/dist/esm/components/preview-data-panel.js +120 -0
- package/dist/esm/components/schema-panel.js +164 -0
- package/dist/esm/components/sql-panel.js +388 -0
- package/dist/esm/components/tree.js +82 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/plugin.js +22 -0
- package/dist/esm/processors/data-processor.js +342 -0
- package/dist/esm/table/duckdb-table-utils.js +645 -0
- package/dist/esm/table/duckdb-table.js +477 -0
- package/dist/esm/table/index.js +5 -0
- package/dist/esm/utils/perf.js +40 -0
- package/dist/table/duckdb-table-utils.d.ts +7 -0
- package/package.json +24 -21
- package/dist/adapters/duckdb-wasm-adapter.js +0 -259
- package/dist/components/monaco-editor.js +0 -175
- package/dist/components/preview-data-panel.js +0 -128
- package/dist/components/schema-panel.js +0 -171
- package/dist/components/sql-panel.js +0 -396
- package/dist/components/tree.js +0 -91
- package/dist/processors/data-processor.js +0 -353
- package/dist/table/duckdb-table-utils.js +0 -669
- package/dist/table/duckdb-table.js +0 -480
- package/dist/utils/perf.js +0 -46
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
3
|
+
import _taggedTemplateLiteral from "@babel/runtime/helpers/esm/taggedTemplateLiteral";
|
|
4
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4;
|
|
5
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
6
|
+
// SPDX-License-Identifier: MIT
|
|
7
|
+
// Copyright contributors to the kepler.gl project
|
|
8
|
+
|
|
9
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
10
|
+
import { useSelector } from 'react-redux';
|
|
11
|
+
import styled from 'styled-components';
|
|
12
|
+
import { LoadingSpinner, Icons } from '@kepler.gl/components';
|
|
13
|
+
import { arrowSchemaToFields } from '@kepler.gl/processors';
|
|
14
|
+
import { getApplicationConfig } from '@kepler.gl/utils';
|
|
15
|
+
import { Tree, DatasetNode, ColumnNode } from './tree';
|
|
16
|
+
import { getDuckDBColumnTypes, getDuckDBColumnTypesMap } from '../table/duckdb-table-utils';
|
|
17
|
+
|
|
18
|
+
// TODO note that demo state is available in demo-app, but not when add modules to dependencies in a custom map
|
|
19
|
+
|
|
20
|
+
var StyledSchemaPanel = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n color: ", ";\n font-size: 12px;\n padding: 12px;\n font-family: ", ";\n height: 100%;\n"])), function (props) {
|
|
21
|
+
return props.theme.textColor;
|
|
22
|
+
}, function (props) {
|
|
23
|
+
return props.theme.fontFamily;
|
|
24
|
+
});
|
|
25
|
+
var StyledLoadingSpinnerWrapper = styled.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n"])));
|
|
26
|
+
function getColumnSchema(_x, _x2) {
|
|
27
|
+
return _getColumnSchema.apply(this, arguments);
|
|
28
|
+
}
|
|
29
|
+
function _getColumnSchema() {
|
|
30
|
+
_getColumnSchema = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(connection, tableName) {
|
|
31
|
+
var columnResult, columnDescribe, keplerFields;
|
|
32
|
+
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
33
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
34
|
+
case 0:
|
|
35
|
+
_context2.next = 2;
|
|
36
|
+
return connection.query("Select * from '".concat(tableName, "' LIMIT 1;"));
|
|
37
|
+
case 2:
|
|
38
|
+
columnResult = _context2.sent;
|
|
39
|
+
_context2.next = 5;
|
|
40
|
+
return getDuckDBColumnTypes(connection, tableName);
|
|
41
|
+
case 5:
|
|
42
|
+
columnDescribe = _context2.sent;
|
|
43
|
+
keplerFields = arrowSchemaToFields(columnResult, getDuckDBColumnTypesMap(columnDescribe));
|
|
44
|
+
return _context2.abrupt("return", {
|
|
45
|
+
key: tableName,
|
|
46
|
+
object: {
|
|
47
|
+
type: 'dataset',
|
|
48
|
+
tableName: tableName
|
|
49
|
+
},
|
|
50
|
+
children: columnResult.schema.fields.map(function (field, fieldIndex) {
|
|
51
|
+
return {
|
|
52
|
+
key: field.name,
|
|
53
|
+
object: {
|
|
54
|
+
type: 'column',
|
|
55
|
+
name: field.name,
|
|
56
|
+
arrowType: field.type,
|
|
57
|
+
fieldType: keplerFields[fieldIndex].type
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
})
|
|
61
|
+
});
|
|
62
|
+
case 8:
|
|
63
|
+
case "end":
|
|
64
|
+
return _context2.stop();
|
|
65
|
+
}
|
|
66
|
+
}, _callee2);
|
|
67
|
+
}));
|
|
68
|
+
return _getColumnSchema.apply(this, arguments);
|
|
69
|
+
}
|
|
70
|
+
function getSchemaSuggestion(result) {
|
|
71
|
+
return result.reduce(function (accu, data) {
|
|
72
|
+
var columns = data.children.map(function (child) {
|
|
73
|
+
return {
|
|
74
|
+
column_name: child.key,
|
|
75
|
+
table_name: data.key
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
return accu.concat(columns);
|
|
79
|
+
}, []);
|
|
80
|
+
}
|
|
81
|
+
var StyledSchemaPanelDropMessage = styled.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\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"])));
|
|
82
|
+
var StyledAddIcon = styled(Icons.Add)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: inline;\n margin-top: -3px;\n"])));
|
|
83
|
+
export var SchemaPanelDropMessage = function SchemaPanelDropMessage() {
|
|
84
|
+
return /*#__PURE__*/React.createElement(StyledSchemaPanelDropMessage, null, /*#__PURE__*/React.createElement("div", {
|
|
85
|
+
className: "header"
|
|
86
|
+
}, /*#__PURE__*/React.createElement(StyledAddIcon, null), " Add files to DuckDB"), /*#__PURE__*/React.createElement("div", {
|
|
87
|
+
className: "bold"
|
|
88
|
+
}, "Supported formats: "), /*#__PURE__*/React.createElement("div", null, ".csv, .json, .geojson, .parquet, .arrow"), /*#__PURE__*/React.createElement("div", null, "Files you add will stay local to your browser."));
|
|
89
|
+
};
|
|
90
|
+
export var SchemaPanel = function SchemaPanel(_ref) {
|
|
91
|
+
var setTableSchema = _ref.setTableSchema,
|
|
92
|
+
droppedFile = _ref.droppedFile,
|
|
93
|
+
schemaUpdateTrigger = _ref.schemaUpdateTrigger;
|
|
94
|
+
var _useState = useState([]),
|
|
95
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
96
|
+
columnSchemas = _useState2[0],
|
|
97
|
+
setColumnSchemas = _useState2[1];
|
|
98
|
+
var datasets = useSelector(function (state) {
|
|
99
|
+
var _state$demo;
|
|
100
|
+
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;
|
|
101
|
+
});
|
|
102
|
+
var getTableSchema = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
103
|
+
var _tableResult$getChild, _ref3;
|
|
104
|
+
var db, c, tableResult, tableNames, result, tableSchema;
|
|
105
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
106
|
+
while (1) switch (_context.prev = _context.next) {
|
|
107
|
+
case 0:
|
|
108
|
+
db = getApplicationConfig().database;
|
|
109
|
+
if (db) {
|
|
110
|
+
_context.next = 4;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
console.error('The database is not configured properly.');
|
|
114
|
+
return _context.abrupt("return");
|
|
115
|
+
case 4:
|
|
116
|
+
_context.next = 6;
|
|
117
|
+
return db.connect();
|
|
118
|
+
case 6:
|
|
119
|
+
c = _context.sent;
|
|
120
|
+
_context.next = 9;
|
|
121
|
+
return c.query('SHOW TABLES;');
|
|
122
|
+
case 9:
|
|
123
|
+
tableResult = _context.sent;
|
|
124
|
+
tableNames = (_tableResult$getChild = tableResult.getChildAt(0)) === null || _tableResult$getChild === void 0 ? void 0 : _tableResult$getChild.toJSON();
|
|
125
|
+
_context.next = 13;
|
|
126
|
+
return Promise.all((_ref3 = tableNames || []) === null || _ref3 === void 0 ? void 0 : _ref3.map(function (name) {
|
|
127
|
+
return getColumnSchema(c, name);
|
|
128
|
+
}));
|
|
129
|
+
case 13:
|
|
130
|
+
result = _context.sent;
|
|
131
|
+
tableSchema = getSchemaSuggestion(result);
|
|
132
|
+
setColumnSchemas(result);
|
|
133
|
+
setTableSchema(tableSchema);
|
|
134
|
+
_context.next = 19;
|
|
135
|
+
return c.close();
|
|
136
|
+
case 19:
|
|
137
|
+
case "end":
|
|
138
|
+
return _context.stop();
|
|
139
|
+
}
|
|
140
|
+
}, _callee);
|
|
141
|
+
})), [setColumnSchemas, setTableSchema, schemaUpdateTrigger]);
|
|
142
|
+
useEffect(function () {
|
|
143
|
+
getTableSchema();
|
|
144
|
+
}, [datasets, droppedFile, getTableSchema]);
|
|
145
|
+
return /*#__PURE__*/React.createElement(StyledSchemaPanel, null, columnSchemas !== null && columnSchemas !== void 0 && columnSchemas.length ? columnSchemas.map(function (data) {
|
|
146
|
+
return /*#__PURE__*/React.createElement(Tree, {
|
|
147
|
+
key: data.key,
|
|
148
|
+
treeData: data,
|
|
149
|
+
renderNode: function renderNode(node) {
|
|
150
|
+
if (node.object.type === 'dataset') {
|
|
151
|
+
return /*#__PURE__*/React.createElement(DatasetNode, {
|
|
152
|
+
node: node
|
|
153
|
+
});
|
|
154
|
+
} else if (node.object.type === 'column') {
|
|
155
|
+
return /*#__PURE__*/React.createElement(ColumnNode, {
|
|
156
|
+
node: node
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}) : droppedFile ? /*#__PURE__*/React.createElement(StyledLoadingSpinnerWrapper, null, /*#__PURE__*/React.createElement(LoadingSpinner, null)) : /*#__PURE__*/React.createElement(SchemaPanelDropMessage, null));
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJ1c2VTZWxlY3RvciIsInN0eWxlZCIsIkxvYWRpbmdTcGlubmVyIiwiSWNvbnMiLCJhcnJvd1NjaGVtYVRvRmllbGRzIiwiZ2V0QXBwbGljYXRpb25Db25maWciLCJUcmVlIiwiRGF0YXNldE5vZGUiLCJDb2x1bW5Ob2RlIiwiZ2V0RHVja0RCQ29sdW1uVHlwZXMiLCJnZXREdWNrREJDb2x1bW5UeXBlc01hcCIsIlN0eWxlZFNjaGVtYVBhbmVsIiwiZGl2IiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbCIsInByb3BzIiwidGhlbWUiLCJ0ZXh0Q29sb3IiLCJmb250RmFtaWx5IiwiU3R5bGVkTG9hZGluZ1NwaW5uZXJXcmFwcGVyIiwiX3RlbXBsYXRlT2JqZWN0MiIsImdldENvbHVtblNjaGVtYSIsIl94IiwiX3gyIiwiX2dldENvbHVtblNjaGVtYSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUyIiwiY29ubmVjdGlvbiIsInRhYmxlTmFtZSIsImNvbHVtblJlc3VsdCIsImNvbHVtbkRlc2NyaWJlIiwia2VwbGVyRmllbGRzIiwid3JhcCIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInByZXYiLCJuZXh0IiwicXVlcnkiLCJjb25jYXQiLCJzZW50IiwiYWJydXB0Iiwia2V5Iiwib2JqZWN0IiwidHlwZSIsImNoaWxkcmVuIiwic2NoZW1hIiwiZmllbGRzIiwibWFwIiwiZmllbGQiLCJmaWVsZEluZGV4IiwibmFtZSIsImFycm93VHlwZSIsImZpZWxkVHlwZSIsInN0b3AiLCJnZXRTY2hlbWFTdWdnZXN0aW9uIiwicmVzdWx0IiwicmVkdWNlIiwiYWNjdSIsImRhdGEiLCJjb2x1bW5zIiwiY2hpbGQiLCJjb2x1bW5fbmFtZSIsInRhYmxlX25hbWUiLCJTdHlsZWRTY2hlbWFQYW5lbERyb3BNZXNzYWdlIiwiX3RlbXBsYXRlT2JqZWN0MyIsIlN0eWxlZEFkZEljb24iLCJBZGQiLCJfdGVtcGxhdGVPYmplY3Q0IiwiU2NoZW1hUGFuZWxEcm9wTWVzc2FnZSIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJTY2hlbWFQYW5lbCIsIl9yZWYiLCJzZXRUYWJsZVNjaGVtYSIsImRyb3BwZWRGaWxlIiwic2NoZW1hVXBkYXRlVHJpZ2dlciIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsImNvbHVtblNjaGVtYXMiLCJzZXRDb2x1bW5TY2hlbWFzIiwiZGF0YXNldHMiLCJzdGF0ZSIsIl9zdGF0ZSRkZW1vIiwiZGVtbyIsImtlcGxlckdsIiwidmlzU3RhdGUiLCJnZXRUYWJsZVNjaGVtYSIsIl9jYWxsZWUiLCJfdGFibGVSZXN1bHQkZ2V0Q2hpbGQiLCJfcmVmMyIsImRiIiwiYyIsInRhYmxlUmVzdWx0IiwidGFibGVOYW1lcyIsInRhYmxlU2NoZW1hIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsImRhdGFiYXNlIiwiY29uc29sZSIsImVycm9yIiwiY29ubmVjdCIsImdldENoaWxkQXQiLCJ0b0pTT04iLCJQcm9taXNlIiwiYWxsIiwiY2xvc2UiLCJsZW5ndGgiLCJ0cmVlRGF0YSIsInJlbmRlck5vZGUiLCJub2RlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2NoZW1hLXBhbmVsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VTZWxlY3Rvcn0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7TG9hZGluZ1NwaW5uZXIsIEljb25zfSBmcm9tICdAa2VwbGVyLmdsL2NvbXBvbmVudHMnO1xuaW1wb3J0IHthcnJvd1NjaGVtYVRvRmllbGRzfSBmcm9tICdAa2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuaW1wb3J0IHtWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcbmltcG9ydCB7Z2V0QXBwbGljYXRpb25Db25maWcsIERhdGFiYXNlQ29ubmVjdGlvbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7VHJlZSwgRGF0YXNldE5vZGUsIENvbHVtbk5vZGUsIFRyZWVOb2RlRGF0YX0gZnJvbSAnLi90cmVlJztcbmltcG9ydCB7Z2V0RHVja0RCQ29sdW1uVHlwZXMsIGdldER1Y2tEQkNvbHVtblR5cGVzTWFwfSBmcm9tICcuLi90YWJsZS9kdWNrZGItdGFibGUtdXRpbHMnO1xuXG4vLyBUT0RPIG5vdGUgdGhhdCBkZW1vIHN0YXRlIGlzIGF2YWlsYWJsZSBpbiBkZW1vLWFwcCwgYnV0IG5vdCB3aGVuIGFkZCBtb2R1bGVzIHRvIGRlcGVuZGVuY2llcyBpbiBhIGN1c3RvbSBtYXBcbnR5cGUgU3RhdGUgPSB7XG4gIGRlbW8/OiB7XG4gICAga2VwbGVyR2w6IHtcbiAgICAgIG1hcDoge1xuICAgICAgICB2aXNTdGF0ZTogVmlzU3RhdGU7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59O1xuXG5jb25zdCBTdHlsZWRTY2hlbWFQYW5lbCA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgcGFkZGluZzogMTJweDtcbiAgZm9udC1mYW1pbHk6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZm9udEZhbWlseX07XG4gIGhlaWdodDogMTAwJTtcbmA7XG5cbmNvbnN0IFN0eWxlZExvYWRpbmdTcGlubmVyV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBoZWlnaHQ6IDEwMCU7XG5gO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRDb2x1bW5TY2hlbWEoY29ubmVjdGlvbjogRGF0YWJhc2VDb25uZWN0aW9uLCB0YWJsZU5hbWU6IHN0cmluZykge1xuICBjb25zdCBjb2x1bW5SZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uLnF1ZXJ5KGBTZWxlY3QgKiBmcm9tICcke3RhYmxlTmFtZX0nIExJTUlUIDE7YCk7XG5cbiAgY29uc3QgY29sdW1uRGVzY3JpYmUgPSBhd2FpdCBnZXREdWNrREJDb2x1bW5UeXBlcyhjb25uZWN0aW9uLCB0YWJsZU5hbWUpO1xuICBjb25zdCBrZXBsZXJGaWVsZHMgPSBhcnJvd1NjaGVtYVRvRmllbGRzKGNvbHVtblJlc3VsdCwgZ2V0RHVja0RCQ29sdW1uVHlwZXNNYXAoY29sdW1uRGVzY3JpYmUpKTtcblxuICByZXR1cm4ge1xuICAgIGtleTogdGFibGVOYW1lLFxuICAgIG9iamVjdDoge1xuICAgICAgdHlwZTogJ2RhdGFzZXQnLFxuICAgICAgdGFibGVOYW1lOiB0YWJsZU5hbWVcbiAgICB9LFxuICAgIGNoaWxkcmVuOiBjb2x1bW5SZXN1bHQuc2NoZW1hLmZpZWxkcy5tYXAoKGZpZWxkLCBmaWVsZEluZGV4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6IGZpZWxkLm5hbWUsXG4gICAgICAgIG9iamVjdDoge1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW4nLFxuICAgICAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgYXJyb3dUeXBlOiBmaWVsZC50eXBlLFxuICAgICAgICAgIGZpZWxkVHlwZToga2VwbGVyRmllbGRzW2ZpZWxkSW5kZXhdLnR5cGVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KVxuICB9O1xufVxuXG5leHBvcnQgdHlwZSBTY2hlbWFTdWdnZXN0aW9uID0ge2NvbHVtbl9uYW1lOiBzdHJpbmc7IHRhYmxlX25hbWU6IHN0cmluZ307XG5cbmZ1bmN0aW9uIGdldFNjaGVtYVN1Z2dlc3Rpb24ocmVzdWx0OiB7a2V5OiBzdHJpbmc7IGNoaWxkcmVuOiB7a2V5OiBzdHJpbmd9W119W10pIHtcbiAgcmV0dXJuIHJlc3VsdC5yZWR1Y2UoKGFjY3UsIGRhdGEpID0+IHtcbiAgICBjb25zdCBjb2x1bW5zID0gZGF0YS5jaGlsZHJlbi5tYXAoY2hpbGQgPT4gKHtcbiAgICAgIGNvbHVtbl9uYW1lOiBjaGlsZC5rZXksXG4gICAgICB0YWJsZV9uYW1lOiBkYXRhLmtleVxuICAgIH0pKTtcbiAgICByZXR1cm4gYWNjdS5jb25jYXQoY29sdW1ucyk7XG4gIH0sIFtdIGFzIFNjaGVtYVN1Z2dlc3Rpb25bXSk7XG59XG5cbnR5cGUgU2NoZW1hUGFuZWxQcm9wcyA9IHtcbiAgc2V0VGFibGVTY2hlbWE6ICh0YWJsZVNjaGVtYTogU2NoZW1hU3VnZ2VzdGlvbltdKSA9PiB2b2lkO1xuICBkcm9wcGVkRmlsZTogRmlsZSB8IG51bGw7XG4gIHNjaGVtYVVwZGF0ZVRyaWdnZXI6IG51bWJlcjtcbn07XG5cbmNvbnN0IFN0eWxlZFNjaGVtYVBhbmVsRHJvcE1lc3NhZ2UgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG5cbiAgZGl2IHtcbiAgICBtYXJnaW46IDVweDtcbiAgfVxuICAuaGVhZGVyIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG4gIH1cbiAgLmJvbGQge1xuICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZEFkZEljb24gPSBzdHlsZWQoSWNvbnMuQWRkKWBcbiAgZGlzcGxheTogaW5saW5lO1xuICBtYXJnaW4tdG9wOiAtM3B4O1xuYDtcblxuZXhwb3J0IGNvbnN0IFNjaGVtYVBhbmVsRHJvcE1lc3NhZ2UgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPFN0eWxlZFNjaGVtYVBhbmVsRHJvcE1lc3NhZ2U+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImhlYWRlclwiPlxuICAgICAgICA8U3R5bGVkQWRkSWNvbiAvPiBBZGQgZmlsZXMgdG8gRHVja0RCXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9sZFwiPlN1cHBvcnRlZCBmb3JtYXRzOiA8L2Rpdj5cbiAgICAgIDxkaXY+LmNzdiwgLmpzb24sIC5nZW9qc29uLCAucGFycXVldCwgLmFycm93PC9kaXY+XG4gICAgICA8ZGl2PkZpbGVzIHlvdSBhZGQgd2lsbCBzdGF5IGxvY2FsIHRvIHlvdXIgYnJvd3Nlci48L2Rpdj5cbiAgICA8L1N0eWxlZFNjaGVtYVBhbmVsRHJvcE1lc3NhZ2U+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgU2NoZW1hUGFuZWwgPSAoe1xuICBzZXRUYWJsZVNjaGVtYSxcbiAgZHJvcHBlZEZpbGUsXG4gIHNjaGVtYVVwZGF0ZVRyaWdnZXJcbn06IFNjaGVtYVBhbmVsUHJvcHMpID0+IHtcbiAgY29uc3QgW2NvbHVtblNjaGVtYXMsIHNldENvbHVtblNjaGVtYXNdID0gdXNlU3RhdGU8VHJlZU5vZGVEYXRhPHt0eXBlOiBzdHJpbmd9PltdPihbXSk7XG4gIGNvbnN0IGRhdGFzZXRzID0gdXNlU2VsZWN0b3IoKHN0YXRlOiBTdGF0ZSkgPT4gc3RhdGU/LmRlbW8/LmtlcGxlckdsPy5tYXA/LnZpc1N0YXRlLmRhdGFzZXRzKTtcblxuICBjb25zdCBnZXRUYWJsZVNjaGVtYSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkYiA9IGdldEFwcGxpY2F0aW9uQ29uZmlnKCkuZGF0YWJhc2U7XG4gICAgaWYgKCFkYikge1xuICAgICAgY29uc29sZS5lcnJvcignVGhlIGRhdGFiYXNlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjID0gYXdhaXQgZGIuY29ubmVjdCgpO1xuXG4gICAgY29uc3QgdGFibGVSZXN1bHQgPSBhd2FpdCBjLnF1ZXJ5KCdTSE9XIFRBQkxFUzsnKTtcblxuICAgIGNvbnN0IHRhYmxlTmFtZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gdGFibGVSZXN1bHQuZ2V0Q2hpbGRBdCgwKT8udG9KU09OKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbCgodGFibGVOYW1lcyB8fCBbXSk/Lm1hcChuYW1lID0+IGdldENvbHVtblNjaGVtYShjLCBuYW1lKSkpO1xuICAgIGNvbnN0IHRhYmxlU2NoZW1hID0gZ2V0U2NoZW1hU3VnZ2VzdGlvbihyZXN1bHQpO1xuXG4gICAgc2V0Q29sdW1uU2NoZW1hcyhyZXN1bHQpO1xuICAgIHNldFRhYmxlU2NoZW1hKHRhYmxlU2NoZW1hKTtcbiAgICBhd2FpdCBjLmNsb3NlKCk7XG5cbiAgICAvLyBzY2hlbWFVcGRhdGVUcmlnZ2VyIGluZGljYXRlcyBwb3NzaWJsZSBjaGFuZ2UgaW4gRHVja0RCXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbc2V0Q29sdW1uU2NoZW1hcywgc2V0VGFibGVTY2hlbWEsIHNjaGVtYVVwZGF0ZVRyaWdnZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGdldFRhYmxlU2NoZW1hKCk7XG4gIH0sIFtkYXRhc2V0cywgZHJvcHBlZEZpbGUsIGdldFRhYmxlU2NoZW1hXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8U3R5bGVkU2NoZW1hUGFuZWw+XG4gICAgICB7Y29sdW1uU2NoZW1hcz8ubGVuZ3RoID8gKFxuICAgICAgICBjb2x1bW5TY2hlbWFzLm1hcChkYXRhID0+IChcbiAgICAgICAgICA8VHJlZVxuICAgICAgICAgICAga2V5PXtkYXRhLmtleX1cbiAgICAgICAgICAgIHRyZWVEYXRhPXtkYXRhfVxuICAgICAgICAgICAgcmVuZGVyTm9kZT17bm9kZSA9PiB7XG4gICAgICAgICAgICAgIGlmIChub2RlLm9iamVjdC50eXBlID09PSAnZGF0YXNldCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gPERhdGFzZXROb2RlIG5vZGU9e25vZGV9IC8+O1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUub2JqZWN0LnR5cGUgPT09ICdjb2x1bW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDxDb2x1bW5Ob2RlIG5vZGU9e25vZGV9IC8+O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICApKVxuICAgICAgKSA6IGRyb3BwZWRGaWxlID8gKFxuICAgICAgICA8U3R5bGVkTG9hZGluZ1NwaW5uZXJXcmFwcGVyPlxuICAgICAgICAgIDxMb2FkaW5nU3Bpbm5lciAvPlxuICAgICAgICA8L1N0eWxlZExvYWRpbmdTcGlubmVyV3JhcHBlcj5cbiAgICAgICkgOiAoXG4gICAgICAgIDxTY2hlbWFQYW5lbERyb3BNZXNzYWdlIC8+XG4gICAgICApfVxuICAgIDwvU3R5bGVkU2NoZW1hUGFuZWw+XG4gICk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7O0FBRUEsT0FBT0EsS0FBSyxJQUFHQyxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsUUFBUSxRQUFPLE9BQU87QUFDN0QsU0FBUUMsV0FBVyxRQUFPLGFBQWE7QUFDdkMsT0FBT0MsTUFBTSxNQUFNLG1CQUFtQjtBQUV0QyxTQUFRQyxjQUFjLEVBQUVDLEtBQUssUUFBTyx1QkFBdUI7QUFDM0QsU0FBUUMsbUJBQW1CLFFBQU8sdUJBQXVCO0FBRXpELFNBQVFDLG9CQUFvQixRQUEyQixrQkFBa0I7QUFFekUsU0FBUUMsSUFBSSxFQUFFQyxXQUFXLEVBQUVDLFVBQVUs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
|