@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.
Files changed (40) hide show
  1. package/dist/cjs/adapters/duckdb-wasm-adapter.js +258 -0
  2. package/dist/{components → cjs/components}/index.js +1 -1
  3. package/dist/cjs/components/monaco-editor.js +174 -0
  4. package/dist/cjs/components/preview-data-panel.js +127 -0
  5. package/dist/cjs/components/schema-panel.js +170 -0
  6. package/dist/cjs/components/sql-panel.js +395 -0
  7. package/dist/cjs/components/tree.js +90 -0
  8. package/dist/{index.js → cjs/index.js} +1 -1
  9. package/dist/{plugin.js → cjs/plugin.js} +2 -2
  10. package/dist/cjs/processors/data-processor.js +353 -0
  11. package/dist/cjs/table/duckdb-table-utils.js +670 -0
  12. package/dist/cjs/table/duckdb-table.js +482 -0
  13. package/dist/{table → cjs/table}/index.js +1 -1
  14. package/dist/cjs/utils/perf.js +46 -0
  15. package/dist/esm/adapters/duckdb-wasm-adapter.js +251 -0
  16. package/dist/esm/components/index.js +9 -0
  17. package/dist/esm/components/monaco-editor.js +167 -0
  18. package/dist/esm/components/preview-data-panel.js +120 -0
  19. package/dist/esm/components/schema-panel.js +164 -0
  20. package/dist/esm/components/sql-panel.js +388 -0
  21. package/dist/esm/components/tree.js +82 -0
  22. package/dist/esm/index.js +9 -0
  23. package/dist/esm/plugin.js +22 -0
  24. package/dist/esm/processors/data-processor.js +342 -0
  25. package/dist/esm/table/duckdb-table-utils.js +645 -0
  26. package/dist/esm/table/duckdb-table.js +477 -0
  27. package/dist/esm/table/index.js +5 -0
  28. package/dist/esm/utils/perf.js +40 -0
  29. package/dist/table/duckdb-table-utils.d.ts +7 -0
  30. package/package.json +24 -21
  31. package/dist/adapters/duckdb-wasm-adapter.js +0 -259
  32. package/dist/components/monaco-editor.js +0 -175
  33. package/dist/components/preview-data-panel.js +0 -128
  34. package/dist/components/schema-panel.js +0 -171
  35. package/dist/components/sql-panel.js +0 -396
  36. package/dist/components/tree.js +0 -91
  37. package/dist/processors/data-processor.js +0 -353
  38. package/dist/table/duckdb-table-utils.js +0 -669
  39. package/dist/table/duckdb-table.js +0 -480
  40. 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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