kepler.gl 3.1.0-alpha.6 → 3.1.0
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/src/actions/src/action-types.d.ts +2 -0
- package/dist/src/actions/src/ui-state-actions.d.ts +16 -0
- package/dist/src/ai-assistant/src/actions.d.ts +1 -1
- package/dist/src/ai-assistant/src/components/ai-assistant-component.d.ts +2 -1
- package/dist/src/ai-assistant/src/constants.d.ts +3 -3
- package/dist/src/ai-assistant/src/reducers/index.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/basemap-functions.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/filter-function.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/layer-creation-function.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/layer-style-function.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/loadurl-function.d.ts +1 -1
- package/dist/src/ai-assistant/src/tools/utils.d.ts +73 -0
- package/dist/src/components/src/common/data-table/index.d.ts +1 -1
- package/dist/src/components/src/common/data-table/option-dropdown.d.ts +3 -3
- package/dist/src/components/src/common/file-uploader/file-drop.d.ts +2 -2
- package/dist/src/components/src/kepler-gl.d.ts +5 -0
- package/dist/src/components/src/loading-indicator.d.ts +13 -0
- package/dist/src/components/src/map-container.d.ts +3 -0
- package/dist/src/constants/src/default-settings.d.ts +1 -0
- package/dist/src/duckdb/src/plugin.d.ts +1 -0
- package/dist/src/duckdb/src/table/duckdb-table-utils.d.ts +13 -0
- package/dist/src/duckdb/src/table/duckdb-table.d.ts +7 -2
- package/dist/src/reducers/src/ui-state-updaters.d.ts +10 -0
- package/dist/src/reducers/src/vis-state-updaters.d.ts +1 -0
- package/dist/src/reducers/src/vis-state.d.ts +4 -0
- package/dist/src/utils/src/application-config.d.ts +2 -0
- package/dist/src/utils/src/observe-dimensions.d.ts +2 -1
- package/package.json +5 -3
- package/src/actions/dist/action-types.d.ts +2 -0
- package/src/actions/dist/action-types.js +2 -1
- package/src/actions/dist/ui-state-actions.d.ts +16 -0
- package/src/actions/dist/ui-state-actions.js +17 -2
- package/src/actions/package.json +8 -8
- package/src/actions/src/action-types.ts +1 -0
- package/src/actions/src/ui-state-actions.ts +22 -0
- package/src/ai-assistant/README.md +76 -0
- package/src/ai-assistant/dist/actions.d.ts +1 -1
- package/src/ai-assistant/dist/actions.js +2 -2
- package/src/ai-assistant/dist/components/ai-assistant-component.d.ts +2 -1
- package/src/ai-assistant/dist/components/ai-assistant-component.js +64 -23
- package/src/ai-assistant/dist/components/ai-assistant-config.js +67 -54
- package/src/ai-assistant/dist/constants.d.ts +3 -3
- package/src/ai-assistant/dist/constants.js +4 -4
- package/src/ai-assistant/dist/reducers/index.d.ts +1 -1
- package/src/ai-assistant/dist/reducers/index.js +2 -2
- package/src/ai-assistant/dist/tools/basemap-functions.d.ts +1 -1
- package/src/ai-assistant/dist/tools/basemap-functions.js +1 -1
- package/src/ai-assistant/dist/tools/filter-function.d.ts +1 -1
- package/src/ai-assistant/dist/tools/filter-function.js +9 -6
- package/src/ai-assistant/dist/tools/layer-creation-function.d.ts +1 -1
- package/src/ai-assistant/dist/tools/layer-creation-function.js +1 -1
- package/src/ai-assistant/dist/tools/layer-style-function.d.ts +1 -1
- package/src/ai-assistant/dist/tools/layer-style-function.js +1 -1
- package/src/ai-assistant/dist/tools/loadurl-function.d.ts +1 -1
- package/src/ai-assistant/dist/tools/loadurl-function.js +1 -1
- package/src/ai-assistant/dist/tools/utils.d.ts +73 -0
- package/src/ai-assistant/dist/tools/utils.js +211 -3
- package/src/ai-assistant/package.json +13 -9
- package/src/ai-assistant/src/actions.ts +2 -2
- package/src/ai-assistant/src/components/ai-assistant-component.tsx +56 -23
- package/src/ai-assistant/src/components/ai-assistant-config.tsx +63 -46
- package/src/ai-assistant/src/config/models.json +32 -0
- package/src/ai-assistant/src/constants.ts +7 -2
- package/src/ai-assistant/src/reducers/index.ts +2 -2
- package/src/ai-assistant/src/tools/basemap-functions.tsx +1 -1
- package/src/ai-assistant/src/tools/filter-function.tsx +11 -7
- package/src/ai-assistant/src/tools/layer-creation-function.tsx +1 -1
- package/src/ai-assistant/src/tools/layer-style-function.tsx +1 -1
- package/src/ai-assistant/src/tools/loadurl-function.tsx +1 -1
- package/src/ai-assistant/src/tools/utils.ts +212 -2
- package/src/cloud-providers/package.json +2 -2
- package/src/common-utils/package.json +3 -3
- package/src/components/dist/common/data-table/header-cell.js +10 -10
- package/src/components/dist/common/data-table/index.d.ts +1 -1
- package/src/components/dist/common/data-table/index.js +1 -1
- package/src/components/dist/common/data-table/option-dropdown.d.ts +3 -3
- package/src/components/dist/common/data-table/option-dropdown.js +5 -5
- package/src/components/dist/common/file-uploader/file-drop.d.ts +2 -2
- package/src/components/dist/common/file-uploader/file-drop.js +1 -1
- package/src/components/dist/common/portaled.js +1 -1
- package/src/components/dist/editor/editor.js +1 -1
- package/src/components/dist/kepler-gl.d.ts +5 -0
- package/src/components/dist/kepler-gl.js +7 -2
- package/src/components/dist/loading-indicator.d.ts +13 -0
- package/src/components/dist/loading-indicator.js +40 -0
- package/src/components/dist/map-container.d.ts +3 -0
- package/src/components/dist/map-container.js +11 -3
- package/src/components/dist/modals/save-map-modal.js +4 -3
- package/src/components/package.json +15 -15
- package/src/components/src/common/data-table/header-cell.tsx +5 -3
- package/src/components/src/common/data-table/index.tsx +1 -1
- package/src/components/src/common/data-table/option-dropdown.tsx +7 -7
- package/src/components/src/common/file-uploader/file-drop.tsx +11 -11
- package/src/components/src/common/portaled.tsx +12 -12
- package/src/components/src/editor/editor.tsx +3 -3
- package/src/components/src/kepler-gl.tsx +7 -2
- package/src/components/src/loading-indicator.tsx +49 -0
- package/src/components/src/map-container.tsx +19 -1
- package/src/components/src/modals/save-map-modal.tsx +6 -2
- package/src/constants/dist/default-settings.d.ts +1 -0
- package/src/constants/dist/default-settings.js +13 -9
- package/src/constants/dist/keyevent.js +1 -1
- package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/72/80/7a7c561d7985e92aab7b9683e7baf5a0286b353a8f2609c4c71099f668d012be027929e4bbac937f9aa0c9a61be3bd4405136f582895f05aa0313c8efa42 +1 -0
- package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/8f/f6/b66955867599392dc69ff1db64419e83c087a82c2e3d4b6418d49ac6bc80e3200dd6c86cdfd4a2cf98ce573f71a5281b86ba3df8a7210e02544f63054191 +1 -0
- package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/bd/ba/47ea8fcb11ecd5cd47ad867052e58b1f7e0c8dc5f8918a36fe90eaf45981 +2 -0
- package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/f0/6e/aadf3c48345aa72e7b2fb92e8c9788d04986b55caf83daa3fbd749c37c44 +2 -0
- package/src/constants/package.json +2 -2
- package/src/constants/src/default-settings.ts +11 -5
- package/src/constants/src/keyevent.ts +2 -2
- package/src/constants/umd/keplergl.min.js +1 -1
- package/src/deckgl-arrow-layers/package.json +1 -1
- package/src/deckgl-layers/package.json +4 -4
- package/src/duckdb/dist/components/preview-data-panel.js +2 -11
- package/src/duckdb/dist/components/sql-panel.js +7 -3
- package/src/duckdb/dist/components/tree.js +5 -4
- package/src/duckdb/dist/plugin.d.ts +1 -0
- package/src/duckdb/dist/plugin.js +9 -2
- package/src/duckdb/dist/processors/data-processor.js +4 -5
- package/src/duckdb/dist/table/duckdb-table-utils.d.ts +13 -0
- package/src/duckdb/dist/table/duckdb-table-utils.js +110 -0
- package/src/duckdb/dist/table/duckdb-table.d.ts +7 -2
- package/src/duckdb/dist/table/duckdb-table.js +189 -44
- package/src/duckdb/package.json +6 -6
- package/src/duckdb/src/components/preview-data-panel.tsx +0 -5
- package/src/duckdb/src/components/sql-panel.tsx +4 -2
- package/src/duckdb/src/components/tree.tsx +5 -1
- package/src/duckdb/src/plugin.ts +8 -1
- package/src/duckdb/src/processors/data-processor.ts +3 -4
- package/src/duckdb/src/table/duckdb-table-utils.ts +106 -0
- package/src/duckdb/src/table/duckdb-table.ts +134 -33
- package/src/effects/package.json +5 -5
- package/src/layers/dist/icon-layer/icon-layer.js +1 -1
- package/src/layers/dist/index.d.ts +3 -0
- package/src/layers/dist/index.js +6 -7
- package/src/layers/dist/point-layer/point-layer.d.ts +1 -1
- package/src/layers/dist/point-layer/point-layer.js +8 -2
- package/src/layers/package.json +9 -9
- package/src/layers/src/icon-layer/icon-layer.ts +8 -10
- package/src/layers/src/index.ts +5 -5
- package/src/layers/src/point-layer/point-layer.ts +6 -1
- package/src/localization/package.json +1 -1
- package/src/processors/dist/data-processor.js +2 -4
- package/src/processors/package.json +7 -7
- package/src/processors/src/data-processor.ts +1 -3
- package/src/reducers/dist/ui-state-updaters.d.ts +10 -0
- package/src/reducers/dist/ui-state-updaters.js +22 -2
- package/src/reducers/dist/ui-state.js +2 -2
- package/src/reducers/dist/vis-state-updaters.d.ts +1 -0
- package/src/reducers/dist/vis-state-updaters.js +21 -5
- package/src/reducers/dist/vis-state.d.ts +4 -0
- package/src/reducers/package.json +16 -16
- package/src/reducers/src/ui-state-updaters.ts +24 -0
- package/src/reducers/src/ui-state.ts +3 -1
- package/src/reducers/src/vis-state-updaters.ts +24 -5
- package/src/schemas/dist/dataset-schema.js +38 -2
- package/src/schemas/package.json +8 -7
- package/src/schemas/src/dataset-schema.ts +43 -1
- package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/5f/aa/96c67b383dbcd2b95625113a5389c6078fd8a53e6fc73a054229709f2dac1e0a409e7117049485a569fbebf8434a319451842671398904bfe1a7f7b5991c +1 -0
- package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/af/aa/228fbff58007b23eea5eb6cc7d2da1f0af1d8a7024129a416ea88b4df0ad7afc7aec93b09f3dd42a98f1d6a6f4dce6b53204818da85ef5becc42f928a64d +1 -0
- package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/40/72/cac221d8459e6b743bc62ecdb370ed854b21ec30d3f7f4c06c7d1d7ffde2 +2 -0
- package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/c1/39/f7cd1d5947ec6e5d82bfa07041271344eb02f9e67bf5823acf2f22c2d01f +2 -0
- package/src/styles/package.json +2 -2
- package/src/styles/umd/keplergl.min.js +1 -1
- package/src/table/dist/dataset-utils.js +10 -4
- package/src/table/package.json +5 -5
- package/src/table/src/dataset-utils.ts +7 -1
- package/src/tasks/package.json +2 -2
- package/src/types/package.json +1 -1
- package/src/types/reducers.d.ts +2 -0
- package/src/utils/dist/application-config.d.ts +2 -0
- package/src/utils/dist/application-config.js +4 -2
- package/src/utils/dist/data-utils.js +14 -2
- package/src/utils/dist/dataset-utils.js +5 -3
- package/src/utils/dist/dom-to-image.js +1 -1
- package/src/utils/dist/dom-utils.js +1 -1
- package/src/utils/dist/map-style-utils/mapbox-gl-style-editor.js +7 -1
- package/src/utils/dist/observe-dimensions.d.ts +2 -1
- package/src/utils/dist/observe-dimensions.js +10 -4
- package/src/utils/dist/utils.js +1 -1
- package/src/utils/package.json +4 -4
- package/src/utils/src/application-config.ts +9 -1
- package/src/utils/src/data-utils.ts +13 -1
- package/src/utils/src/dataset-utils.ts +1 -1
- package/src/utils/src/dom-to-image.ts +5 -6
- package/src/utils/src/dom-utils.ts +15 -15
- package/src/utils/src/map-style-utils/mapbox-gl-style-editor.ts +6 -0
- package/src/utils/src/observe-dimensions.ts +9 -4
- package/src/utils/src/utils.ts +8 -8
- package/umd/keplergl.min.css +1 -1
- package/umd/keplergl.min.js +1499 -1428
package/src/duckdb/src/plugin.ts
CHANGED
|
@@ -4,8 +4,15 @@
|
|
|
4
4
|
import {initializeDuckDb} from './init';
|
|
5
5
|
|
|
6
6
|
export const keplerGlDuckDBPlugin = {
|
|
7
|
+
name: 'duckdb',
|
|
7
8
|
async init() {
|
|
8
|
-
await initializeDuckDb(
|
|
9
|
+
await initializeDuckDb({
|
|
10
|
+
config: {
|
|
11
|
+
query: {
|
|
12
|
+
castBigIntToDouble: true
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
9
16
|
console.log('kepler.gl DuckDB Plugin initialized');
|
|
10
17
|
}
|
|
11
18
|
};
|
|
@@ -243,13 +243,12 @@ export function processGeojson(rawData: unknown): ProcessorResult {
|
|
|
243
243
|
`Read File Failed: File is not a valid GeoJSON. Read more about [supported file format](${GUIDES_FILE_FORMAT_DOC})`
|
|
244
244
|
);
|
|
245
245
|
throw error;
|
|
246
|
-
// fail to normalize geojson
|
|
247
246
|
}
|
|
248
|
-
// console.log(normalizedGeojson);
|
|
249
247
|
|
|
248
|
+
// @ts-expect-error Don't pass empty fields, as duck db outputs an empty dataset
|
|
250
249
|
return {
|
|
251
|
-
rows: normalizedGeojson
|
|
250
|
+
rows: normalizedGeojson
|
|
252
251
|
// TODO get fields to preserve field names?
|
|
253
|
-
fields: []
|
|
252
|
+
// fields: []
|
|
254
253
|
};
|
|
255
254
|
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright contributors to the kepler.gl project
|
|
3
|
+
|
|
4
|
+
// loaders.gl
|
|
5
|
+
// SPDX-License-Identifier: MIT
|
|
6
|
+
// Copyright (c) vis.gl contributors
|
|
7
|
+
|
|
8
|
+
// Copied from loaders.gl/geoarrow
|
|
9
|
+
|
|
10
|
+
// TODO: Remove once Kepler.gl is upgraded to loaders.gl 4.4+
|
|
11
|
+
|
|
12
|
+
import {DataType} from 'apache-arrow/type';
|
|
13
|
+
|
|
14
|
+
/** Checks whether the given Apache Arrow JS type is a Point data type */
|
|
15
|
+
export function isGeoArrowPoint(type: DataType) {
|
|
16
|
+
if (DataType.isFixedSizeList(type)) {
|
|
17
|
+
// Check list size
|
|
18
|
+
if (![2, 3, 4].includes(type.listSize)) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Check child of FixedSizeList is floating type
|
|
23
|
+
if (!DataType.isFloat(type.children[0])) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Checks whether the given Apache Arrow JS type is a Point data type */
|
|
34
|
+
export function isGeoArrowLineString(type: DataType) {
|
|
35
|
+
// Check the outer type is a List
|
|
36
|
+
if (!DataType.isList(type)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Check the child is a point type
|
|
41
|
+
if (!isGeoArrowPoint(type.children[0].type)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Checks whether the given Apache Arrow JS type is a Polygon data type */
|
|
49
|
+
export function isGeoArrowPolygon(type: DataType) {
|
|
50
|
+
// Check the outer vector is a List
|
|
51
|
+
if (!DataType.isList(type)) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Check the child is a linestring vector
|
|
56
|
+
if (!isGeoArrowLineString(type.children[0].type)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Checks whether the given Apache Arrow JS type is a Polygon data type */
|
|
64
|
+
export function isGeoArrowMultiPoint(type: DataType) {
|
|
65
|
+
// Check the outer vector is a List
|
|
66
|
+
if (!DataType.isList(type)) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Check the child is a point vector
|
|
71
|
+
if (!isGeoArrowPoint(type.children[0].type)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Checks whether the given Apache Arrow JS type is a Polygon data type */
|
|
79
|
+
export function isGeoArrowMultiLineString(type: DataType) {
|
|
80
|
+
// Check the outer vector is a List
|
|
81
|
+
if (!DataType.isList(type)) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Check the child is a linestring vector
|
|
86
|
+
if (!isGeoArrowLineString(type.children[0].type)) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Checks whether the given Apache Arrow JS type is a Polygon data type */
|
|
94
|
+
export function isGeoArrowMultiPolygon(type: DataType) {
|
|
95
|
+
// Check the outer vector is a List
|
|
96
|
+
if (!DataType.isList(type)) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Check the child is a polygon vector
|
|
101
|
+
if (!isGeoArrowPolygon(type.children[0].type)) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
@@ -24,8 +24,38 @@ import {
|
|
|
24
24
|
ProcessorResult
|
|
25
25
|
} from '../processors/data-processor';
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
import {
|
|
28
|
+
isGeoArrowPoint,
|
|
29
|
+
isGeoArrowLineString,
|
|
30
|
+
isGeoArrowPolygon,
|
|
31
|
+
isGeoArrowMultiPoint,
|
|
32
|
+
isGeoArrowMultiLineString,
|
|
33
|
+
isGeoArrowMultiPolygon
|
|
34
|
+
} from './duckdb-table-utils';
|
|
35
|
+
|
|
36
|
+
// TODO use files from disk or url directly, without parsing by loaders and then ingection into DeckDb
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Default DuckDb geometry columns created by ST_READ
|
|
40
|
+
*/
|
|
41
|
+
const DUCKDB_GEOM_COLUMN = 'geom';
|
|
42
|
+
const DUCKDB_WKB_COLUMN = 'wkb_geometry';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
Default column name for processed geojson in Kepler.
|
|
46
|
+
Use this name to rename default 'geom' column from DuckDb
|
|
47
|
+
in order to support Kepler maps saved before introduction of DuckDb plugin.
|
|
48
|
+
*/
|
|
49
|
+
const KEPLER_GEOM_FROM_GEOJSON_COLUMN = '_geojson';
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Names of columns that most likely contain binary wkb geometry
|
|
53
|
+
*/
|
|
54
|
+
const SUGGESTED_GEOM_COLUMNS = {
|
|
55
|
+
[KEPLER_GEOM_FROM_GEOJSON_COLUMN]: true,
|
|
56
|
+
[DUCKDB_GEOM_COLUMN]: true,
|
|
57
|
+
geometry: true
|
|
58
|
+
};
|
|
29
59
|
|
|
30
60
|
type ImportDataToDuckProps = {
|
|
31
61
|
data: ProcessorResult;
|
|
@@ -33,6 +63,13 @@ type ImportDataToDuckProps = {
|
|
|
33
63
|
c: AsyncDuckDBConnection;
|
|
34
64
|
};
|
|
35
65
|
|
|
66
|
+
type ImportDataToDuckResult = {
|
|
67
|
+
// DuckDb drops geoarrow metadata, so try to preserve someting
|
|
68
|
+
addWKBMetadata?: Record<string, boolean>;
|
|
69
|
+
// Use fields from arrow table even if fields are provided
|
|
70
|
+
useNewFields?: boolean;
|
|
71
|
+
};
|
|
72
|
+
|
|
36
73
|
/**
|
|
37
74
|
* Creates an arrow table from arrow vectors and fields.
|
|
38
75
|
* @param columns An array of arrow vectors.
|
|
@@ -101,7 +138,7 @@ export class KeplerGlDuckDbTable extends KeplerTable {
|
|
|
101
138
|
}
|
|
102
139
|
}
|
|
103
140
|
|
|
104
|
-
async importGeoJsonData({data, db, c}: ImportDataToDuckProps): Promise<
|
|
141
|
+
async importGeoJsonData({data, db, c}: ImportDataToDuckProps): Promise<ImportDataToDuckResult> {
|
|
105
142
|
try {
|
|
106
143
|
const {rows} = data;
|
|
107
144
|
await db.registerFileText(this.id, JSON.stringify(rows));
|
|
@@ -111,15 +148,20 @@ export class KeplerGlDuckDbTable extends KeplerTable {
|
|
|
111
148
|
load spatial;
|
|
112
149
|
CREATE TABLE '${this.label}' AS
|
|
113
150
|
SELECT *
|
|
114
|
-
FROM ST_READ('${this.id}');
|
|
151
|
+
FROM ST_READ('${this.id}', keep_wkb = TRUE);
|
|
152
|
+
ALTER TABLE '${this.label}' RENAME '${DUCKDB_WKB_COLUMN}' TO '${KEPLER_GEOM_FROM_GEOJSON_COLUMN}';
|
|
115
153
|
`;
|
|
116
154
|
await c.query(createTableSql);
|
|
117
155
|
} catch (error) {
|
|
118
156
|
console.error('importGeoJsonData', error);
|
|
119
157
|
}
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
addWKBMetadata: {[KEPLER_GEOM_FROM_GEOJSON_COLUMN]: true}
|
|
161
|
+
};
|
|
120
162
|
}
|
|
121
163
|
|
|
122
|
-
async importArrowData({data, db, c}: ImportDataToDuckProps): Promise<
|
|
164
|
+
async importArrowData({data, db, c}: ImportDataToDuckProps): Promise<ImportDataToDuckResult> {
|
|
123
165
|
try {
|
|
124
166
|
// 1) data.rows contains an arrow table created by Add to Map data from DuckDb query.
|
|
125
167
|
// 2) arrow table is in cols & fields when a file is dragged & dropped into Add Data To Map dialog.
|
|
@@ -139,6 +181,12 @@ export class KeplerGlDuckDbTable extends KeplerTable {
|
|
|
139
181
|
// 1) Arrow Type with extension name: geoarrow.point and format: +w:2 is not currently supported in DuckDB.
|
|
140
182
|
console.error('importArrowData', error);
|
|
141
183
|
}
|
|
184
|
+
|
|
185
|
+
return {
|
|
186
|
+
addWKBMetadata: {...SUGGESTED_GEOM_COLUMNS},
|
|
187
|
+
// use metadata from arrow table
|
|
188
|
+
useNewFields: true
|
|
189
|
+
};
|
|
142
190
|
}
|
|
143
191
|
|
|
144
192
|
/**
|
|
@@ -165,12 +213,13 @@ export class KeplerGlDuckDbTable extends KeplerTable {
|
|
|
165
213
|
}
|
|
166
214
|
}
|
|
167
215
|
|
|
216
|
+
let importDetails: ImportDataToDuckResult | undefined;
|
|
168
217
|
if (format === DATASET_FORMATS.row) {
|
|
169
218
|
await this.importRowData({data, db, c});
|
|
170
219
|
} else if (format === DATASET_FORMATS.geojson) {
|
|
171
|
-
await this.importGeoJsonData({data, db, c});
|
|
220
|
+
importDetails = await this.importGeoJsonData({data, db, c});
|
|
172
221
|
} else if (format === DATASET_FORMATS.arrow) {
|
|
173
|
-
await this.importArrowData({data, db, c});
|
|
222
|
+
importDetails = await this.importArrowData({data, db, c});
|
|
174
223
|
} else {
|
|
175
224
|
console.error('Unrecognized format', format);
|
|
176
225
|
}
|
|
@@ -179,32 +228,20 @@ export class KeplerGlDuckDbTable extends KeplerTable {
|
|
|
179
228
|
let cols: arrow.Vector[] = [];
|
|
180
229
|
|
|
181
230
|
try {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
);
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
`SELECT * ${
|
|
197
|
-
hasBinaryGeoField
|
|
198
|
-
? `EXCLUDE ${GEOMETRY_COLUMN}, ST_AsWKB(${GEOMETRY_COLUMN}) as ${GEOMETRY_COLUMN}`
|
|
199
|
-
: ''
|
|
200
|
-
} FROM '${tableName}';`
|
|
201
|
-
);
|
|
202
|
-
const geoField = arrowResult.schema.fields.find(
|
|
203
|
-
f => f.name === GEOMETRY_COLUMN && arrow.DataType.isBinary(f.type)
|
|
204
|
-
);
|
|
205
|
-
geoField?.metadata.set('ARROW:extension:name', 'geoarrow.wkb');
|
|
206
|
-
|
|
207
|
-
fields = data.fields ?? arrowSchemaToFields(arrowResult.schema);
|
|
231
|
+
const {addWKBMetadata = {}, useNewFields = false} = importDetails || {};
|
|
232
|
+
|
|
233
|
+
// Try to figure out whether geometry should be transformed by ST_AsWKB
|
|
234
|
+
// TODO if canCastST_asWKB contains any keys then add ST_AsWKB to the following query
|
|
235
|
+
const canCastST_asWKB = await tryST_AsWKB({tableName, c});
|
|
236
|
+
|
|
237
|
+
const getArrowQuery = `SELECT * FROM '${tableName}';`;
|
|
238
|
+
const arrowResult = await c.query(getArrowQuery);
|
|
239
|
+
|
|
240
|
+
restoreGeoarrowMetadata(arrowResult, canCastST_asWKB, addWKBMetadata);
|
|
241
|
+
|
|
242
|
+
fields = useNewFields
|
|
243
|
+
? arrowSchemaToFields(arrowResult.schema)
|
|
244
|
+
: data.fields ?? arrowSchemaToFields(arrowResult.schema);
|
|
208
245
|
cols = [...Array(arrowResult.numCols).keys()]
|
|
209
246
|
.map(i => arrowResult.getChildAt(i))
|
|
210
247
|
.filter(col => col) as arrow.Vector[];
|
|
@@ -263,4 +300,68 @@ export class KeplerGlDuckDbTable extends KeplerTable {
|
|
|
263
300
|
}
|
|
264
301
|
return {processor, format};
|
|
265
302
|
};
|
|
303
|
+
|
|
304
|
+
static getInputDataValidator = function () {
|
|
305
|
+
return d => d;
|
|
306
|
+
};
|
|
266
307
|
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Try to restore geoarrow metadata lost during DuckDb ingestion.
|
|
311
|
+
* Note that this function can generate wrong geometry types.
|
|
312
|
+
* @param arrowTable Arrow table to update.
|
|
313
|
+
* @param canCastST_asWKB A map with fields that are likely in DeckDB's internal WBK format.
|
|
314
|
+
* @param addWKBMetadata A map with field names that usually used to store WKB geometry.
|
|
315
|
+
*/
|
|
316
|
+
const restoreGeoarrowMetadata = async (
|
|
317
|
+
arrowTable: arrow.Table,
|
|
318
|
+
canCastST_asWKB: Record<string, boolean>,
|
|
319
|
+
addWKBMetadata: Record<string, boolean>
|
|
320
|
+
) => {
|
|
321
|
+
arrowTable.schema.fields.forEach(f => {
|
|
322
|
+
if (arrow.DataType.isBinary(f.type) && (addWKBMetadata[f.name] || canCastST_asWKB[f.name])) {
|
|
323
|
+
f.metadata.set('ARROW:extension:name', 'geoarrow.wkb');
|
|
324
|
+
} else if (isGeoArrowPoint(f.type)) {
|
|
325
|
+
f.metadata.set('ARROW:extension:name', 'geoarrow.point');
|
|
326
|
+
} else if (isGeoArrowLineString(f.type)) {
|
|
327
|
+
f.metadata.set('ARROW:extension:name', 'geoarrow.linestring');
|
|
328
|
+
} else if (isGeoArrowPolygon(f.type)) {
|
|
329
|
+
f.metadata.set('ARROW:extension:name', 'geoarrow.polygon');
|
|
330
|
+
} else if (isGeoArrowMultiPoint(f.type)) {
|
|
331
|
+
f.metadata.set('ARROW:extension:name', 'geoarrow.multipoint');
|
|
332
|
+
} else if (isGeoArrowMultiLineString(f.type)) {
|
|
333
|
+
f.metadata.set('ARROW:extension:name', 'geoarrow.multilinestring');
|
|
334
|
+
} else if (isGeoArrowMultiPolygon(f.type)) {
|
|
335
|
+
f.metadata.set('ARROW:extension:name', 'geoarrow.multipolygon');
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* For all binary columns tries to transform geometry from DuckDB's internal format into proper WKB.
|
|
342
|
+
* @param props
|
|
343
|
+
* @returns A map of fields that should be transformed to valid WKB.
|
|
344
|
+
*/
|
|
345
|
+
const tryST_AsWKB = async (props: {tableName: string; c: AsyncDuckDBConnection}) => {
|
|
346
|
+
const {c, tableName} = props;
|
|
347
|
+
|
|
348
|
+
const resultWithSchema = await c.query(`
|
|
349
|
+
SELECT * FROM '${tableName}' LIMIT 0;
|
|
350
|
+
`);
|
|
351
|
+
const binaryColumns = resultWithSchema.schema.fields.filter(f => arrow.DataType.isBinary(f.type));
|
|
352
|
+
|
|
353
|
+
const canCastST_asWKB: Record<string, boolean> = {};
|
|
354
|
+
for (const column of binaryColumns) {
|
|
355
|
+
try {
|
|
356
|
+
const columnName = column.name;
|
|
357
|
+
const query = `SELECT * EXCLUDE ${columnName}, ST_AsWKB(${columnName}) as ${columnName} FROM '${tableName}' LIMIT 1;`;
|
|
358
|
+
await c.query(query);
|
|
359
|
+
|
|
360
|
+
canCastST_asWKB[column.name] = true;
|
|
361
|
+
} catch (error) {
|
|
362
|
+
canCastST_asWKB[column.name] = false;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
return canCastST_asWKB;
|
|
367
|
+
};
|
package/src/effects/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kepler.gl/effects",
|
|
3
3
|
"author": "Shan He <shan@uber.com>",
|
|
4
|
-
"version": "3.1.0
|
|
4
|
+
"version": "3.1.0",
|
|
5
5
|
"description": "kepler.gl viaual effects",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"main": "dist/index.js",
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@deck.gl/core": "^8.9.27",
|
|
34
|
-
"@kepler.gl/common-utils": "3.1.0
|
|
35
|
-
"@kepler.gl/constants": "3.1.0
|
|
36
|
-
"@kepler.gl/types": "3.1.0
|
|
37
|
-
"@kepler.gl/utils": "3.1.0
|
|
34
|
+
"@kepler.gl/common-utils": "3.1.0",
|
|
35
|
+
"@kepler.gl/constants": "3.1.0",
|
|
36
|
+
"@kepler.gl/types": "3.1.0",
|
|
37
|
+
"@kepler.gl/utils": "3.1.0",
|
|
38
38
|
"@luma.gl/core": "^8.5.20",
|
|
39
39
|
"@luma.gl/shadertools": "^8.5.20",
|
|
40
40
|
"moment-timezone": "^0.5.35",
|
|
@@ -379,4 +379,4 @@ var IconLayer = exports["default"] = /*#__PURE__*/function (_Layer) {
|
|
|
379
379
|
}
|
|
380
380
|
}]);
|
|
381
381
|
}(_baseLayer["default"]);
|
|
382
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZXh0ZW5zaW9ucyIsIl9jb25zdGFudHMiLCJfZGVja2dsTGF5ZXJzIiwiX2ljb25MYXllckljb24iLCJfY29uc3RhbnRzMiIsIl9pY29uSW5mb01vZGFsIiwiX2Jhc2VMYXllciIsIl9sYXllclV0aWxzIiwiX3V0aWxzIiwiX2xheWVyVGV4dExhYmVsIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImNhbGwiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwiYnJ1c2hpbmdFeHRlbnNpb24iLCJCcnVzaGluZ0V4dGVuc2lvbiIsIlNWR19JQ09OX1VSTCIsImV4cG9ydHMiLCJjb25jYXQiLCJLRVBMRVJfVU5GT0xERURfQlVDS0VUIiwiaWNvblBvc0FjY2Vzc29yIiwiX3JlZiIsImxhdCIsImxuZyIsImFsdGl0dWRlIiwiZGMiLCJkIiwidmFsdWVBdCIsImluZGV4IiwiZmllbGRJZHgiLCJpY29uQWNjZXNzb3IiLCJfcmVmMiIsImljb24iLCJpY29uUmVxdWlyZWRDb2x1bW5zIiwiaWNvbk9wdGlvbmFsQ29sdW1ucyIsInBvaW50VmlzQ29uZmlncyIsInJhZGl1cyIsImZpeGVkUmFkaXVzIiwib3BhY2l0eSIsImNvbG9yUmFuZ2UiLCJyYWRpdXNSYW5nZSIsImJpbGxib2FyZCIsImZsYXR0ZXJJY29uUG9zaXRpb25zIiwibWVzaCIsImNlbGxzIiwicmVkdWNlIiwicHJldiIsImNlbGwiLCJwb3NpdGlvbnMiLCJJY29uTGF5ZXIiLCJfTGF5ZXIiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsInJlZ2lzdGVyVmlzQ29uZmlnIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsImRhdGFDb250YWluZXIiLCJjb25maWciLCJjb2x1bW5zIiwiZ2V0SWNvbkFjY2Vzc29yIiwiX2xheWVySW5mb01vZGFsIiwiSWNvbkluZm9Nb2RhbEZhY3RvcnkiLCJzdmdJY29ucyIsImljb25HZW9tZXRyeSIsImlzVGVzdCIsInNldFN2Z0ljb25zIiwiZ2V0U3ZnSWNvbnMiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsImdldCIsImRlZmF1bHRQb2ludENvbHVtblBhaXJzIiwiSWNvbkxheWVySWNvbiIsImNvbG9yIiwiYWNjZXNzb3IiLCJkZWZhdWx0VmFsdWUiLCJzaXplIiwicHJvcGVydHkiLCJyYW5nZSIsImNoYW5uZWxTY2FsZVR5cGUiLCJpZCIsInRlbXBsYXRlIiwibW9kYWxQcm9wcyIsInRpdGxlIiwidmFsdWUiLCJfdGhpczIiLCJmZXRjaENvbmZpZyIsIm1ldGhvZCIsIm1vZGUiLCJjYWNoZSIsIndpbmRvdyIsImZldGNoIiwic3ZnSWNvblVybCIsInRoZW4iLCJyZXNwb25zZSIsImpzb24iLCJwYXJzZWQiLCJ1bmRlZmluZWQiLCJhY2N1IiwiY3VyciIsImdldEZpbHRlcmVkSXRlbUNvdW50IiwiZmlsdGVyZWRJdGVtQ291bnQiLCJ2YWx1ZXMiLCJ0b3RhbCIsIk51bWJlciIsImlzRmluaXRlIiwiY2FsY3VsYXRlRGF0YUF0dHJpYnV0ZSIsIl9yZWYzIiwiZ2V0UG9zaXRpb24iLCJmaWx0ZXJlZEluZGV4IiwiZ2V0SWNvbiIsImRhdGEiLCJpIiwicm93SW5kZXgiLCJwb3MiLCJldmVyeSIsImZvcm1hdExheWVyRGF0YSIsImRhdGFzZXRzIiwib2xkTGF5ZXJEYXRhIiwiZGF0YUlkIiwidGV4dExhYmVsIiwiX2RhdGFzZXRzJHRoaXMkY29uZmlnIiwiZ3B1RmlsdGVyIiwiX3RoaXMkdXBkYXRlRGF0YSIsInVwZGF0ZURhdGEiLCJ0cmlnZ2VyQ2hhbmdlZCIsInRleHRMYWJlbHMiLCJmb3JtYXRUZXh0TGFiZWxEYXRhIiwiYWNjZXNzb3JzIiwiZ2V0QXR0cmlidXRlQWNjZXNzb3JzIiwiZ2V0RmlsdGVyVmFsdWUiLCJmaWx0ZXJWYWx1ZUFjY2Vzc29yIiwidXBkYXRlTGF5ZXJNZXRhIiwiZGF0YXNldCIsImJvdW5kcyIsImdldFBvaW50c0JvdW5kcyIsInVwZGF0ZU1ldGEiLCJyZW5kZXJMYXllciIsIm9wdHMiLCJfdGhpcyRjb25maWckY29sdW1ucyQiLCJfdGhpczMiLCJvYmplY3RIb3ZlcmVkIiwibWFwU3RhdGUiLCJpbnRlcmFjdGlvbkNvbmZpZyIsInJhZGl1c1NjYWxlIiwiZ2V0UmFkaXVzU2NhbGVCeVpvb20iLCJsYXllclByb3BzIiwidmlzQ29uZmlnIiwicmFkaXVzTWF4UGl4ZWxzIiwidXBkYXRlVHJpZ2dlcnMiLCJmaWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzIiwiZ2V0VmlzdWFsQ2hhbm5lbFVwZGF0ZVRyaWdnZXJzIiwiZGVmYXVsdExheWVyUHJvcHMiLCJnZXREZWZhdWx0RGVja0xheWVyUHJvcHMiLCJicnVzaGluZ1Byb3BzIiwiZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyIsImdldFBpeGVsT2Zmc2V0IiwiZ2V0VGV4dE9mZnNldEJ5UmFkaXVzIiwiZ2V0UmFkaXVzIiwiZXh0ZW5zaW9ucyIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJzaGFyZWRQcm9wcyIsImZpbHRlclJhbmdlIiwibGFiZWxMYXllcnMiLCJyZW5kZXJUZXh0TGFiZWxMYXllciIsImhvdmVyZWRPYmplY3QiLCJoYXNIb3ZlcmVkT2JqZWN0IiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsImN1bGxGYWNlIiwiR0wiLCJGUk9OVCIsIlN2Z0ljb25MYXllciIsImdldEljb25HZW9tZXRyeSIsIl90aGlzMyRpY29uR2VvbWV0cnkiLCJnZXREZWZhdWx0SG92ZXJMYXllclByb3BzIiwidmlzaWJsZSIsImdldEZpbGxDb2xvciIsImhpZ2hsaWdodENvbG9yIiwiX3RoaXMzJGljb25HZW9tZXRyeTIiLCJmaW5kRGVmYXVsdExheWVyUHJvcHMiLCJfcmVmNCIsIl9yZWY0JGZpZWxkUGFpcnMiLCJmaWVsZFBhaXJzIiwiX3JlZjQkZmllbGRzIiwiZmllbGRzIiwibm90Rm91bmQiLCJpY29uRmllbGRzIiwiX3JlZjUiLCJuYW1lIiwicmVwbGFjZSIsInRyaW0iLCJzcGxpdCIsInNvbWUiLCJzZWciLCJJQ09OX0ZJRUxEUyIsImluY2x1ZGVzIiwicHRQYWlyIiwiYXNzaWduUG9pbnRQYWlyVG9MYXllckNvbHVtbiIsIm1hcCIsImljb25GaWVsZCIsImxhYmVsIiwiaXNWaXNpYmxlIiwiTGF5ZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaWNvbi1sYXllci9pY29uLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQge0JydXNoaW5nRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcbmltcG9ydCBHTCBmcm9tICdAbHVtYS5nbC9jb25zdGFudHMnO1xuXG5pbXBvcnQge1N2Z0ljb25MYXllcn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtbGF5ZXJzJztcbmltcG9ydCBJY29uTGF5ZXJJY29uIGZyb20gJy4vaWNvbi1sYXllci1pY29uJztcbmltcG9ydCB7SUNPTl9GSUVMRFMsIEtFUExFUl9VTkZPTERFRF9CVUNLRVR9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCBJY29uSW5mb01vZGFsRmFjdG9yeSBmcm9tICcuL2ljb24taW5mby1tb2RhbCc7XG5pbXBvcnQgTGF5ZXIsIHtMYXllckJhc2VDb25maWcsIExheWVyQmFzZUNvbmZpZ1BhcnRpYWx9IGZyb20gJy4uL2Jhc2UtbGF5ZXInO1xuaW1wb3J0IHthc3NpZ25Qb2ludFBhaXJUb0xheWVyQ29sdW1ufSBmcm9tICcuLi9sYXllci11dGlscyc7XG5pbXBvcnQge2lzVGVzdH0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2dldFRleHRPZmZzZXRCeVJhZGl1cywgZm9ybWF0VGV4dExhYmVsRGF0YX0gZnJvbSAnLi4vbGF5ZXItdGV4dC1sYWJlbCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgS2VwbGVyVGFibGV9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtEYXRhQ29udGFpbmVySW50ZXJmYWNlfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7XG4gIENvbG9yUmFuZ2UsXG4gIFZpc0NvbmZpZ0Jvb2xlYW4sXG4gIFZpc0NvbmZpZ0NvbG9yUmFuZ2UsXG4gIFZpc0NvbmZpZ051bWJlcixcbiAgVmlzQ29uZmlnUmFuZ2UsXG4gIE1lcmdlLFxuICBMYXllckNvbHVtblxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgSWNvbkxheWVyQ29sdW1uc0NvbmZpZyA9IHtcbiAgbGF0OiBMYXllckNvbHVtbjtcbiAgbG5nOiBMYXllckNvbHVtbjtcbiAgYWx0aXR1ZGU6IExheWVyQ29sdW1uO1xuICBpY29uOiBMYXllckNvbHVtbjtcbn07XG5cbnR5cGUgSWNvbkdlb21ldHJ5ID0gb2JqZWN0IHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgSWNvbkxheWVyVmlzQ29uZmlnU2V0dGluZ3MgPSB7XG4gIHJhZGl1czogVmlzQ29uZmlnTnVtYmVyO1xuICBmaXhlZFJhZGl1czogVmlzQ29uZmlnQm9vbGVhbjtcbiAgb3BhY2l0eTogVmlzQ29uZmlnTnVtYmVyO1xuICBjb2xvclJhbmdlOiBWaXNDb25maWdDb2xvclJhbmdlO1xuICByYWRpdXNSYW5nZTogVmlzQ29uZmlnUmFuZ2U7XG59O1xuXG5leHBvcnQgdHlwZSBJY29uTGF5ZXJWaXNDb25maWcgPSB7XG4gIHJhZGl1czogbnVtYmVyO1xuICBmaXhlZFJhZGl1czogYm9vbGVhbjtcbiAgb3BhY2l0eTogbnVtYmVyO1xuICBjb2xvclJhbmdlOiBDb2xvclJhbmdlO1xuICByYWRpdXNSYW5nZTogW251bWJlciwgbnVtYmVyXTtcbiAgYmlsbGJvYXJkOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgSWNvbkxheWVyQ29uZmlnID0gTWVyZ2U8XG4gIExheWVyQmFzZUNvbmZpZyxcbiAge2NvbHVtbnM6IEljb25MYXllckNvbHVtbnNDb25maWc7IHZpc0NvbmZpZzogSWNvbkxheWVyVmlzQ29uZmlnfVxuPjtcblxuZXhwb3J0IHR5cGUgSWNvbkxheWVyRGF0YSA9IHtpbmRleDogbnVtYmVyOyBpY29uOiBzdHJpbmd9O1xuXG5jb25zdCBicnVzaGluZ0V4dGVuc2lvbiA9IG5ldyBCcnVzaGluZ0V4dGVuc2lvbigpO1xuXG5leHBvcnQgY29uc3QgU1ZHX0lDT05fVVJMID0gYCR7S0VQTEVSX1VORk9MREVEX0JVQ0tFVH0vaWNvbnMvc3ZnLWljb25zLmpzb25gO1xuXG5leHBvcnQgY29uc3QgaWNvblBvc0FjY2Vzc29yID1cbiAgKHtsYXQsIGxuZywgYWx0aXR1ZGV9OiBJY29uTGF5ZXJDb2x1bW5zQ29uZmlnKSA9PlxuICAoZGM6IERhdGFDb250YWluZXJJbnRlcmZhY2UpID0+XG4gIGQgPT5cbiAgICBbXG4gICAgICBkYy52YWx1ZUF0KGQuaW5kZXgsIGxuZy5maWVsZElkeCksXG4gICAgICBkYy52YWx1ZUF0KGQuaW5kZXgsIGxhdC5maWVsZElkeCksXG4gICAgICBhbHRpdHVkZT8uZmllbGRJZHggPiAtMSA/IGRjLnZhbHVlQXQoZC5pbmRleCwgYWx0aXR1ZGUuZmllbGRJZHgpIDogMFxuICAgIF07XG5cbmV4cG9ydCBjb25zdCBpY29uQWNjZXNzb3IgPVxuICAoe2ljb259OiBJY29uTGF5ZXJDb2x1bW5zQ29uZmlnKSA9PlxuICAoZGM6IERhdGFDb250YWluZXJJbnRlcmZhY2UpID0+XG4gIGQgPT5cbiAgICBkYy52YWx1ZUF0KGQuaW5kZXgsIGljb24uZmllbGRJZHgpO1xuXG5leHBvcnQgY29uc3QgaWNvblJlcXVpcmVkQ29sdW1uczogWydsYXQnLCAnbG5nJywgJ2ljb24nXSA9IFsnbGF0JywgJ2xuZycsICdpY29uJ107XG5leHBvcnQgY29uc3QgaWNvbk9wdGlvbmFsQ29sdW1uczogWydhbHRpdHVkZSddID0gWydhbHRpdHVkZSddO1xuXG5leHBvcnQgY29uc3QgcG9pbnRWaXNDb25maWdzOiB7XG4gIHJhZGl1czogJ3JhZGl1cyc7XG4gIGZpeGVkUmFkaXVzOiAnZml4ZWRSYWRpdXMnO1xuICBvcGFjaXR5OiAnb3BhY2l0eSc7XG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJztcbiAgcmFkaXVzUmFuZ2U6ICdyYWRpdXNSYW5nZSc7XG4gIGJpbGxib2FyZDogJ2JpbGxib2FyZCc7XG59ID0ge1xuICByYWRpdXM6ICdyYWRpdXMnLFxuICBmaXhlZFJhZGl1czogJ2ZpeGVkUmFkaXVzJyxcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBjb2xvclJhbmdlOiAnY29sb3JSYW5nZScsXG4gIHJhZGl1c1JhbmdlOiAncmFkaXVzUmFuZ2UnLFxuICBiaWxsYm9hcmQ6ICdiaWxsYm9hcmQnXG59O1xuXG5mdW5jdGlvbiBmbGF0dGVySWNvblBvc2l0aW9ucyhpY29uKSB7XG4gIC8vIGhhZCB0byBmbGlwIHksIHNpbmNlIEBsdW1hIG1vZGFsIGhhcyBjaGFuZ2VkXG4gIHJldHVybiBpY29uLm1lc2guY2VsbHMucmVkdWNlKChwcmV2LCBjZWxsKSA9PiB7XG4gICAgY2VsbC5mb3JFYWNoKHAgPT4ge1xuICAgICAgcHJldi5wdXNoKFxuICAgICAgICAuLi5baWNvbi5tZXNoLnBvc2l0aW9uc1twXVswXSwgLWljb24ubWVzaC5wb3NpdGlvbnNbcF1bMV0sIGljb24ubWVzaC5wb3NpdGlvbnNbcF1bMl1dXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiBwcmV2O1xuICB9LCBbXSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEljb25MYXllciBleHRlbmRzIExheWVyIHtcbiAgZ2V0SWNvbkFjY2Vzc29yOiAoZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT4gKGQ6IGFueSkgPT4gYW55O1xuICBfbGF5ZXJJbmZvTW9kYWw6ICgpID0+IEpTWC5FbGVtZW50O1xuICBpY29uR2VvbWV0cnk6IEljb25HZW9tZXRyeTtcblxuICBkZWNsYXJlIHZpc0NvbmZpZ1NldHRpbmdzOiBJY29uTGF5ZXJWaXNDb25maWdTZXR0aW5ncztcbiAgZGVjbGFyZSBjb25maWc6IEljb25MYXllckNvbmZpZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm9wczoge1xuICAgICAgaWQ/OiBzdHJpbmc7XG4gICAgICBpY29uR2VvbWV0cnk/OiBJY29uR2VvbWV0cnk7XG4gICAgICBzdmdJY29ucz86IGFueVtdO1xuICAgIH0gJiBMYXllckJhc2VDb25maWdQYXJ0aWFsXG4gICkge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMucmVnaXN0ZXJWaXNDb25maWcocG9pbnRWaXNDb25maWdzKTtcbiAgICB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IgPSAoZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT5cbiAgICAgIGljb25Qb3NBY2Nlc3Nvcih0aGlzLmNvbmZpZy5jb2x1bW5zKShkYXRhQ29udGFpbmVyKTtcbiAgICB0aGlzLmdldEljb25BY2Nlc3NvciA9IGRhdGFDb250YWluZXIgPT4gaWNvbkFjY2Vzc29yKHRoaXMuY29uZmlnLmNvbHVtbnMpKGRhdGFDb250YWluZXIpO1xuXG4gICAgdGhpcy5fbGF5ZXJJbmZvTW9kYWwgPSBJY29uSW5mb01vZGFsRmFjdG9yeShwcm9wcy5zdmdJY29ucyk7XG4gICAgdGhpcy5pY29uR2VvbWV0cnkgPSBwcm9wcy5pY29uR2VvbWV0cnkgfHwgbnVsbDtcblxuICAgIGlmIChpc1Rlc3QoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHJvcHMuc3ZnSWNvbnMpIHtcbiAgICAgIC8vIGlmIHN2ZyBpY29ucyBhcmUgcGFzc2VkIGluIHRoZW4gYnlwYXNzIGZldGNoaW5nIG9mIHJlbW90ZSBzdmcgaWNvbnNcbiAgICAgIHRoaXMuc2V0U3ZnSWNvbnMocHJvcHMuc3ZnSWNvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBwcmVwYXJlIGxheWVyIGluZm8gbW9kYWwgYW5kIGZldGNoIHJlbW90ZSBzdmcgaWNvbnNcbiAgICAgIHRoaXMuZ2V0U3ZnSWNvbnMoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc3ZnSWNvblVybCgpIHtcbiAgICByZXR1cm4gU1ZHX0lDT05fVVJMO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogJ2ljb24nIHtcbiAgICByZXR1cm4gJ2ljb24nO1xuICB9XG5cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBpY29uUmVxdWlyZWRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IG9wdGlvbmFsQ29sdW1ucygpIHtcbiAgICByZXR1cm4gaWNvbk9wdGlvbmFsQ29sdW1ucztcbiAgfVxuXG4gIGdldCBjb2x1bW5QYWlycygpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0UG9pbnRDb2x1bW5QYWlycztcbiAgfVxuXG4gIGdldCBsYXllckljb24oKSB7XG4gICAgcmV0dXJuIEljb25MYXllckljb247XG4gIH1cblxuICBnZXQgdmlzdWFsQ2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiB7XG4gICAgICAgIC4uLnN1cGVyLnZpc3VhbENoYW5uZWxzLmNvbG9yLFxuICAgICAgICBhY2Nlc3NvcjogJ2dldEZpbGxDb2xvcicsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29uZmlnID0+IGNvbmZpZy5jb2xvclxuICAgICAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgLi4uc3VwZXIudmlzdWFsQ2hhbm5lbHMuc2l6ZSxcbiAgICAgICAgcHJvcGVydHk6ICdyYWRpdXMnLFxuICAgICAgICByYW5nZTogJ3JhZGl1c1JhbmdlJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogJ3JhZGl1cycsXG4gICAgICAgIGFjY2Vzc29yOiAnZ2V0UmFkaXVzJyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAxXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGdldCBsYXllckluZm9Nb2RhbCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdpY29uSW5mbycsXG4gICAgICB0ZW1wbGF0ZTogdGhpcy5fbGF5ZXJJbmZvTW9kYWwsXG4gICAgICBtb2RhbFByb3BzOiB7XG4gICAgICAgIHRpdGxlOiAnbW9kYWwuaWNvbkluZm8udGl0bGUnXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGdldFN2Z0ljb25zKCkge1xuICAgIGNvbnN0IGZldGNoQ29uZmlnID0ge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgIGNhY2hlOiAnbm8tY2FjaGUnXG4gICAgfTtcblxuICAgIGlmICh3aW5kb3cuZmV0Y2ggJiYgdGhpcy5zdmdJY29uVXJsKSB7XG4gICAgICB3aW5kb3dcbiAgICAgICAgLmZldGNoKHRoaXMuc3ZnSWNvblVybCwgZmV0Y2hDb25maWcpXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgICAgLnRoZW4oKHBhcnNlZDoge3N2Z0ljb25zPzogYW55W119ID0ge30pID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN2Z0ljb25zKHBhcnNlZC5zdmdJY29ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHNldFN2Z0ljb25zKHN2Z0ljb25zOiBhbnlbXSA9IFtdKSB7XG4gICAgdGhpcy5pY29uR2VvbWV0cnkgPSBzdmdJY29ucy5yZWR1Y2UoXG4gICAgICAoYWNjdSwgY3VycikgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2N1cnIuaWRdOiBmbGF0dGVySWNvblBvc2l0aW9ucyhjdXJyKVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG5cbiAgICB0aGlzLl9sYXllckluZm9Nb2RhbCA9IEljb25JbmZvTW9kYWxGYWN0b3J5KHN2Z0ljb25zKTtcbiAgfVxuXG4gIHN0YXRpYyBmaW5kRGVmYXVsdExheWVyUHJvcHMoe2ZpZWxkUGFpcnMgPSBbXSwgZmllbGRzID0gW119OiBLZXBsZXJUYWJsZSkge1xuICAgIGNvbnN0IG5vdEZvdW5kID0ge3Byb3BzOiBbXX07XG4gICAgaWYgKCFmaWVsZFBhaXJzLmxlbmd0aCB8fCAhZmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5vdEZvdW5kO1xuICAgIH1cblxuICAgIGNvbnN0IGljb25GaWVsZHMgPSBmaWVsZHMuZmlsdGVyKCh7bmFtZX0pID0+XG4gICAgICBuYW1lXG4gICAgICAgIC5yZXBsYWNlKC9bXywuXSsvZywgJyAnKVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgIC5zb21lKHNlZyA9PiBJQ09OX0ZJRUxEUy5pY29uLnNvbWUodCA9PiB0LmluY2x1ZGVzKHNlZykpKVxuICAgICk7XG5cbiAgICBpZiAoIWljb25GaWVsZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbm90Rm91bmQ7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGljb24gbGF5ZXJzIGZvciBmaXJzdCBwb2ludCBwYWlyXG4gICAgY29uc3QgcHRQYWlyID0gZmllbGRQYWlyc1swXTtcbiAgICBjb25zdCBjb2x1bW5zID0gYXNzaWduUG9pbnRQYWlyVG9MYXllckNvbHVtbihwdFBhaXIsIHRydWUpO1xuXG4gICAgY29uc3QgcHJvcHMgPSBpY29uRmllbGRzLm1hcChpY29uRmllbGQgPT4gKHtcbiAgICAgIGxhYmVsOiBpY29uRmllbGQubmFtZS5yZXBsYWNlKC9bXywuXSsvZywgJyAnKS50cmltKCksXG4gICAgICBjb2x1bW5zOiB7XG4gICAgICAgIC4uLmNvbHVtbnMsXG4gICAgICAgIGljb246IHtcbiAgICAgICAgICB2YWx1ZTogaWNvbkZpZWxkLm5hbWUsXG4gICAgICAgICAgZmllbGRJZHg6IGljb25GaWVsZC5maWVsZElkeFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaXNWaXNpYmxlOiB0cnVlXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHtwcm9wc307XG4gIH1cblxuICBnZXRGaWx0ZXJlZEl0ZW1Db3VudCgpIHtcbiAgICAvLyB1c2UgdG90YWxcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5maWx0ZXJlZEl0ZW1Db3VudCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmZpbHRlcmVkSXRlbUNvdW50KS5yZWR1Y2UoXG4gICAgICAgICh0b3RhbCwgY3VycikgPT4gKE51bWJlci5pc0Zpbml0ZShjdXJyKSA/IHRvdGFsICsgY3VyciA6IHRvdGFsKSxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUoe2RhdGFDb250YWluZXIsIGZpbHRlcmVkSW5kZXh9OiBLZXBsZXJUYWJsZSwgZ2V0UG9zaXRpb24pIHtcbiAgICBjb25zdCBnZXRJY29uID0gdGhpcy5nZXRJY29uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcik7XG4gICAgY29uc3QgZGF0YTogSWNvbkxheWVyRGF0YVtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcmVkSW5kZXgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZmlsdGVyZWRJbmRleFtpXTtcbiAgICAgIGNvbnN0IHJvd0luZGV4ID0ge2luZGV4fTtcbiAgICAgIGNvbnN0IHBvcyA9IGdldFBvc2l0aW9uKHJvd0luZGV4KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRJY29uKHJvd0luZGV4KTtcblxuICAgICAgLy8gaWYgZG9lc24ndCBoYXZlIHBvaW50IGxhdCBvciBsbmcsIGRvIG5vdCBhZGQgdGhlIHBvaW50XG4gICAgICAvLyBkZWNrLmdsIGNhbid0IGhhbmRsZSBwb3NpdGlvbiA9IG51bGxcbiAgICAgIGlmIChwb3MuZXZlcnkoTnVtYmVyLmlzRmluaXRlKSAmJiB0eXBlb2YgaWNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpY29uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZm9ybWF0TGF5ZXJEYXRhKGRhdGFzZXRzLCBvbGRMYXllckRhdGEpIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGF0YUlkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHt0ZXh0TGFiZWx9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3Qge2dwdUZpbHRlciwgZGF0YUNvbnRhaW5lcn0gPSBkYXRhc2V0c1t0aGlzLmNvbmZpZy5kYXRhSWRdO1xuXG4gICAgY29uc3QgZ2V0UG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcik7XG5cbiAgICBjb25zdCB7ZGF0YSwgdHJpZ2dlckNoYW5nZWR9ID0gdGhpcy51cGRhdGVEYXRhKGRhdGFzZXRzLCBvbGRMYXllckRhdGEpO1xuXG4gICAgLy8gZ2V0IGFsbCBkaXN0aW5jdCBjaGFyYWN0ZXJzIGluIHRoZSB0ZXh0IGxhYmVsc1xuICAgIGNvbnN0IHRleHRMYWJlbHMgPSBmb3JtYXRUZXh0TGFiZWxEYXRhKHtcbiAgICAgIHRleHRMYWJlbCxcbiAgICAgIHRyaWdnZXJDaGFuZ2VkLFxuICAgICAgb2xkTGF5ZXJEYXRhLFxuICAgICAgZGF0YSxcbiAgICAgIGRhdGFDb250YWluZXJcbiAgICB9KTtcblxuICAgIGNvbnN0IGFjY2Vzc29ycyA9IHRoaXMuZ2V0QXR0cmlidXRlQWNjZXNzb3JzKHtkYXRhQ29udGFpbmVyfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YSxcbiAgICAgIGdldFBvc2l0aW9uLFxuICAgICAgZ2V0RmlsdGVyVmFsdWU6IGdwdUZpbHRlci5maWx0ZXJWYWx1ZUFjY2Vzc29yKGRhdGFDb250YWluZXIpKCksXG4gICAgICB0ZXh0TGFiZWxzLFxuICAgICAgLi4uYWNjZXNzb3JzXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyTWV0YShkYXRhc2V0OiBLZXBsZXJUYWJsZSwgZ2V0UG9zaXRpb24pIHtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lcn0gPSBkYXRhc2V0O1xuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0UG9pbnRzQm91bmRzKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kc30pO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIob3B0cykge1xuICAgIGNvbnN0IHtkYXRhLCBncHVGaWx0ZXIsIG9iamVjdEhvdmVyZWQsIG1hcFN0YXRlLCBpbnRlcmFjdGlvbkNvbmZpZ30gPSBvcHRzO1xuXG4gICAgY29uc3QgcmFkaXVzU2NhbGUgPSB0aGlzLmdldFJhZGl1c1NjYWxlQnlab29tKG1hcFN0YXRlKTtcblxuICAgIGNvbnN0IGxheWVyUHJvcHMgPSB7XG4gICAgICByYWRpdXNTY2FsZSxcbiAgICAgIGJpbGxib2FyZDogdGhpcy5jb25maWcudmlzQ29uZmlnLmJpbGxib2FyZCxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy52aXNDb25maWcuZml4ZWRSYWRpdXMgPyB7fSA6IHtyYWRpdXNNYXhQaXhlbHM6IDUwMH0pXG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge1xuICAgICAgZ2V0UG9zaXRpb246IHRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBnZXRGaWx0ZXJWYWx1ZTogZ3B1RmlsdGVyLmZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnMsXG4gICAgICAuLi50aGlzLmdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycygpXG4gICAgfTtcblxuICAgIGNvbnN0IGRlZmF1bHRMYXllclByb3BzID0gdGhpcy5nZXREZWZhdWx0RGVja0xheWVyUHJvcHMob3B0cyk7XG4gICAgY29uc3QgYnJ1c2hpbmdQcm9wcyA9IHRoaXMuZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyhpbnRlcmFjdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgZ2V0UGl4ZWxPZmZzZXQgPSBnZXRUZXh0T2Zmc2V0QnlSYWRpdXMocmFkaXVzU2NhbGUsIGRhdGEuZ2V0UmFkaXVzLCBtYXBTdGF0ZSk7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IFsuLi5kZWZhdWx0TGF5ZXJQcm9wcy5leHRlbnNpb25zLCBicnVzaGluZ0V4dGVuc2lvbl07XG5cbiAgICAvLyBzaGFyZWQgUHJvcHMgYmV0d2VlbiBsYXllciBhbmQgbGFiZWwgbGF5ZXJcbiAgICBjb25zdCBzaGFyZWRQcm9wcyA9IHtcbiAgICAgIGdldEZpbHRlclZhbHVlOiBkYXRhLmdldEZpbHRlclZhbHVlLFxuICAgICAgZXh0ZW5zaW9ucyxcbiAgICAgIGZpbHRlclJhbmdlOiBkZWZhdWx0TGF5ZXJQcm9wcy5maWx0ZXJSYW5nZSxcbiAgICAgIC4uLmJydXNoaW5nUHJvcHNcbiAgICB9O1xuXG4gICAgY29uc3QgbGFiZWxMYXllcnMgPSBbXG4gICAgICAuLi50aGlzLnJlbmRlclRleHRMYWJlbExheWVyKFxuICAgICAgICB7XG4gICAgICAgICAgZ2V0UG9zaXRpb246IGRhdGEuZ2V0UG9zaXRpb24sXG4gICAgICAgICAgc2hhcmVkUHJvcHMsXG4gICAgICAgICAgZ2V0UGl4ZWxPZmZzZXQsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcnNcbiAgICAgICAgfSxcbiAgICAgICAgb3B0c1xuICAgICAgKVxuICAgIF07XG4gICAgY29uc3QgaG92ZXJlZE9iamVjdCA9IHRoaXMuaGFzSG92ZXJlZE9iamVjdChvYmplY3RIb3ZlcmVkKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICAvLyBpY29ucyB3aWxsIGJlIGZsYXQgb24gdGhlIG1hcCB3aGVuIHRoZSBhbHRpdHVkZSBjb2x1bW4gaXMgbm90IHVzZWRcbiAgICAgIGRlcHRoVGVzdDogdGhpcy5jb25maWcuY29sdW1ucy5hbHRpdHVkZT8uZmllbGRJZHggPiAtMSxcbiAgICAgIGN1bGxGYWNlOiBHTC5GUk9OVFxuICAgIH07XG5cbiAgICByZXR1cm4gIXRoaXMuaWNvbkdlb21ldHJ5XG4gICAgICA/IFtdXG4gICAgICA6IFtcbiAgICAgICAgICBuZXcgU3ZnSWNvbkxheWVyKHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRMYXllclByb3BzLFxuICAgICAgICAgICAgLi4uYnJ1c2hpbmdQcm9wcyxcbiAgICAgICAgICAgIC4uLmxheWVyUHJvcHMsXG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIGdldEljb25HZW9tZXRyeTogaWQgPT4gdGhpcy5pY29uR2VvbWV0cnk/LltpZF0sXG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0cmlnZ2Vyc1xuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgICAgICBleHRlbnNpb25zXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgICAvLyBob3ZlciBsYXllclxuICAgICAgICAgIC4uLihob3ZlcmVkT2JqZWN0XG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFN2Z0ljb25MYXllclByb3BzIG5lZWRzIGdldEljb24gRmllbGRcbiAgICAgICAgICAgICAgICBuZXcgU3ZnSWNvbkxheWVyKHtcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcygpLFxuICAgICAgICAgICAgICAgICAgLi4ubGF5ZXJQcm9wcyxcbiAgICAgICAgICAgICAgICAgIHZpc2libGU6IGRlZmF1bHRMYXllclByb3BzLnZpc2libGUsXG4gICAgICAgICAgICAgICAgICBkYXRhOiBbaG92ZXJlZE9iamVjdF0sXG4gICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgZ2V0UG9zaXRpb246IGRhdGEuZ2V0UG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICBnZXRSYWRpdXM6IGRhdGEuZ2V0UmFkaXVzLFxuICAgICAgICAgICAgICAgICAgZ2V0RmlsbENvbG9yOiB0aGlzLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICAgICAgICAgICAgICAgIGdldEljb25HZW9tZXRyeTogaWQgPT4gdGhpcy5pY29uR2VvbWV0cnk/LltpZF1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdKSxcblxuICAgICAgICAgIC8vIHRleHQgbGFiZWwgbGF5ZXJcbiAgICAgICAgICAuLi5sYWJlbExheWVyc1xuICAgICAgICBdO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLGFBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGNBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLFdBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGNBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLFVBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtB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
|
|
382
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZXh0ZW5zaW9ucyIsIl9jb25zdGFudHMiLCJfZGVja2dsTGF5ZXJzIiwiX2ljb25MYXllckljb24iLCJfY29uc3RhbnRzMiIsIl9pY29uSW5mb01vZGFsIiwiX2Jhc2VMYXllciIsIl9sYXllclV0aWxzIiwiX3V0aWxzIiwiX2xheWVyVGV4dExhYmVsIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImNhbGwiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwiYnJ1c2hpbmdFeHRlbnNpb24iLCJCcnVzaGluZ0V4dGVuc2lvbiIsIlNWR19JQ09OX1VSTCIsImV4cG9ydHMiLCJjb25jYXQiLCJLRVBMRVJfVU5GT0xERURfQlVDS0VUIiwiaWNvblBvc0FjY2Vzc29yIiwiX3JlZiIsImxhdCIsImxuZyIsImFsdGl0dWRlIiwiZGMiLCJkIiwidmFsdWVBdCIsImluZGV4IiwiZmllbGRJZHgiLCJpY29uQWNjZXNzb3IiLCJfcmVmMiIsImljb24iLCJpY29uUmVxdWlyZWRDb2x1bW5zIiwiaWNvbk9wdGlvbmFsQ29sdW1ucyIsInBvaW50VmlzQ29uZmlncyIsInJhZGl1cyIsImZpeGVkUmFkaXVzIiwib3BhY2l0eSIsImNvbG9yUmFuZ2UiLCJyYWRpdXNSYW5nZSIsImJpbGxib2FyZCIsImZsYXR0ZXJJY29uUG9zaXRpb25zIiwibWVzaCIsImNlbGxzIiwicmVkdWNlIiwicHJldiIsImNlbGwiLCJwb3NpdGlvbnMiLCJJY29uTGF5ZXIiLCJfTGF5ZXIiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsInJlZ2lzdGVyVmlzQ29uZmlnIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsImRhdGFDb250YWluZXIiLCJjb25maWciLCJjb2x1bW5zIiwiZ2V0SWNvbkFjY2Vzc29yIiwiX2xheWVySW5mb01vZGFsIiwiSWNvbkluZm9Nb2RhbEZhY3RvcnkiLCJzdmdJY29ucyIsImljb25HZW9tZXRyeSIsImlzVGVzdCIsInNldFN2Z0ljb25zIiwiZ2V0U3ZnSWNvbnMiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsImdldCIsImRlZmF1bHRQb2ludENvbHVtblBhaXJzIiwiSWNvbkxheWVySWNvbiIsImNvbG9yIiwiYWNjZXNzb3IiLCJkZWZhdWx0VmFsdWUiLCJzaXplIiwicHJvcGVydHkiLCJyYW5nZSIsImNoYW5uZWxTY2FsZVR5cGUiLCJpZCIsInRlbXBsYXRlIiwibW9kYWxQcm9wcyIsInRpdGxlIiwidmFsdWUiLCJfdGhpczIiLCJmZXRjaENvbmZpZyIsIm1ldGhvZCIsIm1vZGUiLCJjYWNoZSIsIldpbmRvdyIsImZldGNoIiwic3ZnSWNvblVybCIsInRoZW4iLCJyZXNwb25zZSIsImpzb24iLCJwYXJzZWQiLCJ1bmRlZmluZWQiLCJhY2N1IiwiY3VyciIsImdldEZpbHRlcmVkSXRlbUNvdW50IiwiZmlsdGVyZWRJdGVtQ291bnQiLCJ2YWx1ZXMiLCJ0b3RhbCIsIk51bWJlciIsImlzRmluaXRlIiwiY2FsY3VsYXRlRGF0YUF0dHJpYnV0ZSIsIl9yZWYzIiwiZ2V0UG9zaXRpb24iLCJmaWx0ZXJlZEluZGV4IiwiZ2V0SWNvbiIsImRhdGEiLCJpIiwicm93SW5kZXgiLCJwb3MiLCJldmVyeSIsImZvcm1hdExheWVyRGF0YSIsImRhdGFzZXRzIiwib2xkTGF5ZXJEYXRhIiwiZGF0YUlkIiwidGV4dExhYmVsIiwiX2RhdGFzZXRzJHRoaXMkY29uZmlnIiwiZ3B1RmlsdGVyIiwiX3RoaXMkdXBkYXRlRGF0YSIsInVwZGF0ZURhdGEiLCJ0cmlnZ2VyQ2hhbmdlZCIsInRleHRMYWJlbHMiLCJmb3JtYXRUZXh0TGFiZWxEYXRhIiwiYWNjZXNzb3JzIiwiZ2V0QXR0cmlidXRlQWNjZXNzb3JzIiwiZ2V0RmlsdGVyVmFsdWUiLCJmaWx0ZXJWYWx1ZUFjY2Vzc29yIiwidXBkYXRlTGF5ZXJNZXRhIiwiZGF0YXNldCIsImJvdW5kcyIsImdldFBvaW50c0JvdW5kcyIsInVwZGF0ZU1ldGEiLCJyZW5kZXJMYXllciIsIm9wdHMiLCJfdGhpcyRjb25maWckY29sdW1ucyQiLCJfdGhpczMiLCJvYmplY3RIb3ZlcmVkIiwibWFwU3RhdGUiLCJpbnRlcmFjdGlvbkNvbmZpZyIsInJhZGl1c1NjYWxlIiwiZ2V0UmFkaXVzU2NhbGVCeVpvb20iLCJsYXllclByb3BzIiwidmlzQ29uZmlnIiwicmFkaXVzTWF4UGl4ZWxzIiwidXBkYXRlVHJpZ2dlcnMiLCJmaWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzIiwiZ2V0VmlzdWFsQ2hhbm5lbFVwZGF0ZVRyaWdnZXJzIiwiZGVmYXVsdExheWVyUHJvcHMiLCJnZXREZWZhdWx0RGVja0xheWVyUHJvcHMiLCJicnVzaGluZ1Byb3BzIiwiZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyIsImdldFBpeGVsT2Zmc2V0IiwiZ2V0VGV4dE9mZnNldEJ5UmFkaXVzIiwiZ2V0UmFkaXVzIiwiZXh0ZW5zaW9ucyIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJzaGFyZWRQcm9wcyIsImZpbHRlclJhbmdlIiwibGFiZWxMYXllcnMiLCJyZW5kZXJUZXh0TGFiZWxMYXllciIsImhvdmVyZWRPYmplY3QiLCJoYXNIb3ZlcmVkT2JqZWN0IiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsImN1bGxGYWNlIiwiR0wiLCJGUk9OVCIsIlN2Z0ljb25MYXllciIsImdldEljb25HZW9tZXRyeSIsIl90aGlzMyRpY29uR2VvbWV0cnkiLCJnZXREZWZhdWx0SG92ZXJMYXllclByb3BzIiwidmlzaWJsZSIsImdldEZpbGxDb2xvciIsImhpZ2hsaWdodENvbG9yIiwiX3RoaXMzJGljb25HZW9tZXRyeTIiLCJmaW5kRGVmYXVsdExheWVyUHJvcHMiLCJfcmVmNCIsIl9yZWY0JGZpZWxkUGFpcnMiLCJmaWVsZFBhaXJzIiwiX3JlZjQkZmllbGRzIiwiZmllbGRzIiwibm90Rm91bmQiLCJpY29uRmllbGRzIiwiX3JlZjUiLCJuYW1lIiwicmVwbGFjZSIsInRyaW0iLCJzcGxpdCIsInNvbWUiLCJzZWciLCJJQ09OX0ZJRUxEUyIsImluY2x1ZGVzIiwicHRQYWlyIiwiYXNzaWduUG9pbnRQYWlyVG9MYXllckNvbHVtbiIsIm1hcCIsImljb25GaWVsZCIsImxhYmVsIiwiaXNWaXNpYmxlIiwiTGF5ZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaWNvbi1sYXllci9pY29uLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBXaW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQge0JydXNoaW5nRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcbmltcG9ydCBHTCBmcm9tICdAbHVtYS5nbC9jb25zdGFudHMnO1xuXG5pbXBvcnQge1N2Z0ljb25MYXllcn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtbGF5ZXJzJztcbmltcG9ydCBJY29uTGF5ZXJJY29uIGZyb20gJy4vaWNvbi1sYXllci1pY29uJztcbmltcG9ydCB7SUNPTl9GSUVMRFMsIEtFUExFUl9VTkZPTERFRF9CVUNLRVR9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCBJY29uSW5mb01vZGFsRmFjdG9yeSBmcm9tICcuL2ljb24taW5mby1tb2RhbCc7XG5pbXBvcnQgTGF5ZXIsIHtMYXllckJhc2VDb25maWcsIExheWVyQmFzZUNvbmZpZ1BhcnRpYWx9IGZyb20gJy4uL2Jhc2UtbGF5ZXInO1xuaW1wb3J0IHthc3NpZ25Qb2ludFBhaXJUb0xheWVyQ29sdW1ufSBmcm9tICcuLi9sYXllci11dGlscyc7XG5pbXBvcnQge2lzVGVzdH0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2dldFRleHRPZmZzZXRCeVJhZGl1cywgZm9ybWF0VGV4dExhYmVsRGF0YX0gZnJvbSAnLi4vbGF5ZXItdGV4dC1sYWJlbCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgS2VwbGVyVGFibGV9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtEYXRhQ29udGFpbmVySW50ZXJmYWNlfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7XG4gIENvbG9yUmFuZ2UsXG4gIFZpc0NvbmZpZ0Jvb2xlYW4sXG4gIFZpc0NvbmZpZ0NvbG9yUmFuZ2UsXG4gIFZpc0NvbmZpZ051bWJlcixcbiAgVmlzQ29uZmlnUmFuZ2UsXG4gIE1lcmdlLFxuICBMYXllckNvbHVtblxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgSWNvbkxheWVyQ29sdW1uc0NvbmZpZyA9IHtcbiAgbGF0OiBMYXllckNvbHVtbjtcbiAgbG5nOiBMYXllckNvbHVtbjtcbiAgYWx0aXR1ZGU6IExheWVyQ29sdW1uO1xuICBpY29uOiBMYXllckNvbHVtbjtcbn07XG5cbnR5cGUgSWNvbkdlb21ldHJ5ID0gb2JqZWN0IHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgSWNvbkxheWVyVmlzQ29uZmlnU2V0dGluZ3MgPSB7XG4gIHJhZGl1czogVmlzQ29uZmlnTnVtYmVyO1xuICBmaXhlZFJhZGl1czogVmlzQ29uZmlnQm9vbGVhbjtcbiAgb3BhY2l0eTogVmlzQ29uZmlnTnVtYmVyO1xuICBjb2xvclJhbmdlOiBWaXNDb25maWdDb2xvclJhbmdlO1xuICByYWRpdXNSYW5nZTogVmlzQ29uZmlnUmFuZ2U7XG59O1xuXG5leHBvcnQgdHlwZSBJY29uTGF5ZXJWaXNDb25maWcgPSB7XG4gIHJhZGl1czogbnVtYmVyO1xuICBmaXhlZFJhZGl1czogYm9vbGVhbjtcbiAgb3BhY2l0eTogbnVtYmVyO1xuICBjb2xvclJhbmdlOiBDb2xvclJhbmdlO1xuICByYWRpdXNSYW5nZTogW251bWJlciwgbnVtYmVyXTtcbiAgYmlsbGJvYXJkOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgSWNvbkxheWVyQ29uZmlnID0gTWVyZ2U8XG4gIExheWVyQmFzZUNvbmZpZyxcbiAge2NvbHVtbnM6IEljb25MYXllckNvbHVtbnNDb25maWc7IHZpc0NvbmZpZzogSWNvbkxheWVyVmlzQ29uZmlnfVxuPjtcblxuZXhwb3J0IHR5cGUgSWNvbkxheWVyRGF0YSA9IHtpbmRleDogbnVtYmVyOyBpY29uOiBzdHJpbmd9O1xuXG5jb25zdCBicnVzaGluZ0V4dGVuc2lvbiA9IG5ldyBCcnVzaGluZ0V4dGVuc2lvbigpO1xuXG5leHBvcnQgY29uc3QgU1ZHX0lDT05fVVJMID0gYCR7S0VQTEVSX1VORk9MREVEX0JVQ0tFVH0vaWNvbnMvc3ZnLWljb25zLmpzb25gO1xuXG5leHBvcnQgY29uc3QgaWNvblBvc0FjY2Vzc29yID1cbiAgKHtsYXQsIGxuZywgYWx0aXR1ZGV9OiBJY29uTGF5ZXJDb2x1bW5zQ29uZmlnKSA9PlxuICAoZGM6IERhdGFDb250YWluZXJJbnRlcmZhY2UpID0+XG4gIGQgPT4gW1xuICAgIGRjLnZhbHVlQXQoZC5pbmRleCwgbG5nLmZpZWxkSWR4KSxcbiAgICBkYy52YWx1ZUF0KGQuaW5kZXgsIGxhdC5maWVsZElkeCksXG4gICAgYWx0aXR1ZGU/LmZpZWxkSWR4ID4gLTEgPyBkYy52YWx1ZUF0KGQuaW5kZXgsIGFsdGl0dWRlLmZpZWxkSWR4KSA6IDBcbiAgXTtcblxuZXhwb3J0IGNvbnN0IGljb25BY2Nlc3NvciA9XG4gICh7aWNvbn06IEljb25MYXllckNvbHVtbnNDb25maWcpID0+XG4gIChkYzogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT5cbiAgZCA9PlxuICAgIGRjLnZhbHVlQXQoZC5pbmRleCwgaWNvbi5maWVsZElkeCk7XG5cbmV4cG9ydCBjb25zdCBpY29uUmVxdWlyZWRDb2x1bW5zOiBbJ2xhdCcsICdsbmcnLCAnaWNvbiddID0gWydsYXQnLCAnbG5nJywgJ2ljb24nXTtcbmV4cG9ydCBjb25zdCBpY29uT3B0aW9uYWxDb2x1bW5zOiBbJ2FsdGl0dWRlJ10gPSBbJ2FsdGl0dWRlJ107XG5cbmV4cG9ydCBjb25zdCBwb2ludFZpc0NvbmZpZ3M6IHtcbiAgcmFkaXVzOiAncmFkaXVzJztcbiAgZml4ZWRSYWRpdXM6ICdmaXhlZFJhZGl1cyc7XG4gIG9wYWNpdHk6ICdvcGFjaXR5JztcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnO1xuICByYWRpdXNSYW5nZTogJ3JhZGl1c1JhbmdlJztcbiAgYmlsbGJvYXJkOiAnYmlsbGJvYXJkJztcbn0gPSB7XG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIGZpeGVkUmFkaXVzOiAnZml4ZWRSYWRpdXMnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgcmFkaXVzUmFuZ2U6ICdyYWRpdXNSYW5nZScsXG4gIGJpbGxib2FyZDogJ2JpbGxib2FyZCdcbn07XG5cbmZ1bmN0aW9uIGZsYXR0ZXJJY29uUG9zaXRpb25zKGljb24pIHtcbiAgLy8gaGFkIHRvIGZsaXAgeSwgc2luY2UgQGx1bWEgbW9kYWwgaGFzIGNoYW5nZWRcbiAgcmV0dXJuIGljb24ubWVzaC5jZWxscy5yZWR1Y2UoKHByZXYsIGNlbGwpID0+IHtcbiAgICBjZWxsLmZvckVhY2gocCA9PiB7XG4gICAgICBwcmV2LnB1c2goXG4gICAgICAgIC4uLltpY29uLm1lc2gucG9zaXRpb25zW3BdWzBdLCAtaWNvbi5tZXNoLnBvc2l0aW9uc1twXVsxXSwgaWNvbi5tZXNoLnBvc2l0aW9uc1twXVsyXV1cbiAgICAgICk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZXY7XG4gIH0sIFtdKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSWNvbkxheWVyIGV4dGVuZHMgTGF5ZXIge1xuICBnZXRJY29uQWNjZXNzb3I6IChkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PiAoZDogYW55KSA9PiBhbnk7XG4gIF9sYXllckluZm9Nb2RhbDogKCkgPT4gSlNYLkVsZW1lbnQ7XG4gIGljb25HZW9tZXRyeTogSWNvbkdlb21ldHJ5O1xuXG4gIGRlY2xhcmUgdmlzQ29uZmlnU2V0dGluZ3M6IEljb25MYXllclZpc0NvbmZpZ1NldHRpbmdzO1xuICBkZWNsYXJlIGNvbmZpZzogSWNvbkxheWVyQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3BzOiB7XG4gICAgICBpZD86IHN0cmluZztcbiAgICAgIGljb25HZW9tZXRyeT86IEljb25HZW9tZXRyeTtcbiAgICAgIHN2Z0ljb25zPzogYW55W107XG4gICAgfSAmIExheWVyQmFzZUNvbmZpZ1BhcnRpYWxcbiAgKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5yZWdpc3RlclZpc0NvbmZpZyhwb2ludFZpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvciA9IChkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PlxuICAgICAgaWNvblBvc0FjY2Vzc29yKHRoaXMuY29uZmlnLmNvbHVtbnMpKGRhdGFDb250YWluZXIpO1xuICAgIHRoaXMuZ2V0SWNvbkFjY2Vzc29yID0gZGF0YUNvbnRhaW5lciA9PiBpY29uQWNjZXNzb3IodGhpcy5jb25maWcuY29sdW1ucykoZGF0YUNvbnRhaW5lcik7XG5cbiAgICB0aGlzLl9sYXllckluZm9Nb2RhbCA9IEljb25JbmZvTW9kYWxGYWN0b3J5KHByb3BzLnN2Z0ljb25zKTtcbiAgICB0aGlzLmljb25HZW9tZXRyeSA9IHByb3BzLmljb25HZW9tZXRyeSB8fCBudWxsO1xuXG4gICAgaWYgKGlzVGVzdCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwcm9wcy5zdmdJY29ucykge1xuICAgICAgLy8gaWYgc3ZnIGljb25zIGFyZSBwYXNzZWQgaW4gdGhlbiBieXBhc3MgZmV0Y2hpbmcgb2YgcmVtb3RlIHN2ZyBpY29uc1xuICAgICAgdGhpcy5zZXRTdmdJY29ucyhwcm9wcy5zdmdJY29ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHByZXBhcmUgbGF5ZXIgaW5mbyBtb2RhbCBhbmQgZmV0Y2ggcmVtb3RlIHN2ZyBpY29uc1xuICAgICAgdGhpcy5nZXRTdmdJY29ucygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzdmdJY29uVXJsKCkge1xuICAgIHJldHVybiBTVkdfSUNPTl9VUkw7XG4gIH1cblxuICBnZXQgdHlwZSgpOiAnaWNvbicge1xuICAgIHJldHVybiAnaWNvbic7XG4gIH1cblxuICBnZXQgcmVxdWlyZWRMYXllckNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIGljb25SZXF1aXJlZENvbHVtbnM7XG4gIH1cblxuICBnZXQgb3B0aW9uYWxDb2x1bW5zKCkge1xuICAgIHJldHVybiBpY29uT3B0aW9uYWxDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQb2ludENvbHVtblBhaXJzO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gSWNvbkxheWVySWNvbjtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IHtcbiAgICAgICAgLi4uc3VwZXIudmlzdWFsQ2hhbm5lbHMuY29sb3IsXG4gICAgICAgIGFjY2Vzc29yOiAnZ2V0RmlsbENvbG9yJyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb25maWcgPT4gY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscy5zaXplLFxuICAgICAgICBwcm9wZXJ0eTogJ3JhZGl1cycsXG4gICAgICAgIHJhbmdlOiAncmFkaXVzUmFuZ2UnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiAncmFkaXVzJyxcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRSYWRpdXMnLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IDFcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZ2V0IGxheWVySW5mb01vZGFsKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogJ2ljb25JbmZvJyxcbiAgICAgIHRlbXBsYXRlOiB0aGlzLl9sYXllckluZm9Nb2RhbCxcbiAgICAgIG1vZGFsUHJvcHM6IHtcbiAgICAgICAgdGl0bGU6ICdtb2RhbC5pY29uSW5mby50aXRsZSdcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZ2V0U3ZnSWNvbnMoKSB7XG4gICAgY29uc3QgZmV0Y2hDb25maWcgPSB7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgY2FjaGU6ICduby1jYWNoZSdcbiAgICB9O1xuXG4gICAgaWYgKFdpbmRvdy5mZXRjaCAmJiB0aGlzLnN2Z0ljb25VcmwpIHtcbiAgICAgIFdpbmRvdy5mZXRjaCh0aGlzLnN2Z0ljb25VcmwsIGZldGNoQ29uZmlnKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAgIC50aGVuKChwYXJzZWQ6IHtzdmdJY29ucz86IGFueVtdfSA9IHt9KSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRTdmdJY29ucyhwYXJzZWQuc3ZnSWNvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZXRTdmdJY29ucyhzdmdJY29uczogYW55W10gPSBbXSkge1xuICAgIHRoaXMuaWNvbkdlb21ldHJ5ID0gc3ZnSWNvbnMucmVkdWNlKFxuICAgICAgKGFjY3UsIGN1cnIpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtjdXJyLmlkXTogZmxhdHRlckljb25Qb3NpdGlvbnMoY3VycilcbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuXG4gICAgdGhpcy5fbGF5ZXJJbmZvTW9kYWwgPSBJY29uSW5mb01vZGFsRmFjdG9yeShzdmdJY29ucyk7XG4gIH1cblxuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKHtmaWVsZFBhaXJzID0gW10sIGZpZWxkcyA9IFtdfTogS2VwbGVyVGFibGUpIHtcbiAgICBjb25zdCBub3RGb3VuZCA9IHtwcm9wczogW119O1xuICAgIGlmICghZmllbGRQYWlycy5sZW5ndGggfHwgIWZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBub3RGb3VuZDtcbiAgICB9XG5cbiAgICBjb25zdCBpY29uRmllbGRzID0gZmllbGRzLmZpbHRlcigoe25hbWV9KSA9PlxuICAgICAgbmFtZVxuICAgICAgICAucmVwbGFjZSgvW18sLl0rL2csICcgJylcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuc3BsaXQoJyAnKVxuICAgICAgICAuc29tZShzZWcgPT4gSUNPTl9GSUVMRFMuaWNvbi5zb21lKHQgPT4gdC5pbmNsdWRlcyhzZWcpKSlcbiAgICApO1xuXG4gICAgaWYgKCFpY29uRmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5vdEZvdW5kO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBpY29uIGxheWVycyBmb3IgZmlyc3QgcG9pbnQgcGFpclxuICAgIGNvbnN0IHB0UGFpciA9IGZpZWxkUGFpcnNbMF07XG4gICAgY29uc3QgY29sdW1ucyA9IGFzc2lnblBvaW50UGFpclRvTGF5ZXJDb2x1bW4ocHRQYWlyLCB0cnVlKTtcblxuICAgIGNvbnN0IHByb3BzID0gaWNvbkZpZWxkcy5tYXAoaWNvbkZpZWxkID0+ICh7XG4gICAgICBsYWJlbDogaWNvbkZpZWxkLm5hbWUucmVwbGFjZSgvW18sLl0rL2csICcgJykudHJpbSgpLFxuICAgICAgY29sdW1uczoge1xuICAgICAgICAuLi5jb2x1bW5zLFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgdmFsdWU6IGljb25GaWVsZC5uYW1lLFxuICAgICAgICAgIGZpZWxkSWR4OiBpY29uRmllbGQuZmllbGRJZHhcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZVxuICAgIH0pKTtcblxuICAgIHJldHVybiB7cHJvcHN9O1xuICB9XG5cbiAgZ2V0RmlsdGVyZWRJdGVtQ291bnQoKSB7XG4gICAgLy8gdXNlIHRvdGFsXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWRJdGVtQ291bnQpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5maWx0ZXJlZEl0ZW1Db3VudCkucmVkdWNlKFxuICAgICAgICAodG90YWwsIGN1cnIpID0+IChOdW1iZXIuaXNGaW5pdGUoY3VycikgPyB0b3RhbCArIGN1cnIgOiB0b3RhbCksXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjYWxjdWxhdGVEYXRhQXR0cmlidXRlKHtkYXRhQ29udGFpbmVyLCBmaWx0ZXJlZEluZGV4fTogS2VwbGVyVGFibGUsIGdldFBvc2l0aW9uKSB7XG4gICAgY29uc3QgZ2V0SWNvbiA9IHRoaXMuZ2V0SWNvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpO1xuICAgIGNvbnN0IGRhdGE6IEljb25MYXllckRhdGFbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJlZEluZGV4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGZpbHRlcmVkSW5kZXhbaV07XG4gICAgICBjb25zdCByb3dJbmRleCA9IHtpbmRleH07XG4gICAgICBjb25zdCBwb3MgPSBnZXRQb3NpdGlvbihyb3dJbmRleCk7XG4gICAgICBjb25zdCBpY29uID0gZ2V0SWNvbihyb3dJbmRleCk7XG5cbiAgICAgIC8vIGlmIGRvZXNuJ3QgaGF2ZSBwb2ludCBsYXQgb3IgbG5nLCBkbyBub3QgYWRkIHRoZSBwb2ludFxuICAgICAgLy8gZGVjay5nbCBjYW4ndCBoYW5kbGUgcG9zaXRpb24gPSBudWxsXG4gICAgICBpZiAocG9zLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSkgJiYgdHlwZW9mIGljb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaWNvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGZvcm1hdExheWVyRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmRhdGFJZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCB7dGV4dExhYmVsfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHtncHVGaWx0ZXIsIGRhdGFDb250YWluZXJ9ID0gZGF0YXNldHNbdGhpcy5jb25maWcuZGF0YUlkXTtcblxuICAgIGNvbnN0IGdldFBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpO1xuXG4gICAgY29uc3Qge2RhdGEsIHRyaWdnZXJDaGFuZ2VkfSA9IHRoaXMudXBkYXRlRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKTtcblxuICAgIC8vIGdldCBhbGwgZGlzdGluY3QgY2hhcmFjdGVycyBpbiB0aGUgdGV4dCBsYWJlbHNcbiAgICBjb25zdCB0ZXh0TGFiZWxzID0gZm9ybWF0VGV4dExhYmVsRGF0YSh7XG4gICAgICB0ZXh0TGFiZWwsXG4gICAgICB0cmlnZ2VyQ2hhbmdlZCxcbiAgICAgIG9sZExheWVyRGF0YSxcbiAgICAgIGRhdGEsXG4gICAgICBkYXRhQ29udGFpbmVyXG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSB0aGlzLmdldEF0dHJpYnV0ZUFjY2Vzc29ycyh7ZGF0YUNvbnRhaW5lcn0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGEsXG4gICAgICBnZXRQb3NpdGlvbixcbiAgICAgIGdldEZpbHRlclZhbHVlOiBncHVGaWx0ZXIuZmlsdGVyVmFsdWVBY2Nlc3NvcihkYXRhQ29udGFpbmVyKSgpLFxuICAgICAgdGV4dExhYmVscyxcbiAgICAgIC4uLmFjY2Vzc29yc1xuICAgIH07XG4gIH1cblxuICB1cGRhdGVMYXllck1ldGEoZGF0YXNldDogS2VwbGVyVGFibGUsIGdldFBvc2l0aW9uKSB7XG4gICAgY29uc3Qge2RhdGFDb250YWluZXJ9ID0gZGF0YXNldDtcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldFBvaW50c0JvdW5kcyhkYXRhQ29udGFpbmVyLCBnZXRQb3NpdGlvbik7XG4gICAgdGhpcy51cGRhdGVNZXRhKHtib3VuZHN9KTtcbiAgfVxuXG4gIHJlbmRlckxheWVyKG9wdHMpIHtcbiAgICBjb25zdCB7ZGF0YSwgZ3B1RmlsdGVyLCBvYmplY3RIb3ZlcmVkLCBtYXBTdGF0ZSwgaW50ZXJhY3Rpb25Db25maWd9ID0gb3B0cztcblxuICAgIGNvbnN0IHJhZGl1c1NjYWxlID0gdGhpcy5nZXRSYWRpdXNTY2FsZUJ5Wm9vbShtYXBTdGF0ZSk7XG5cbiAgICBjb25zdCBsYXllclByb3BzID0ge1xuICAgICAgcmFkaXVzU2NhbGUsXG4gICAgICBiaWxsYm9hcmQ6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5iaWxsYm9hcmQsXG4gICAgICAuLi4odGhpcy5jb25maWcudmlzQ29uZmlnLmZpeGVkUmFkaXVzID8ge30gOiB7cmFkaXVzTWF4UGl4ZWxzOiA1MDB9KVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIGdldFBvc2l0aW9uOiB0aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgZ2V0RmlsdGVyVmFsdWU6IGdwdUZpbHRlci5maWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzLFxuICAgICAgLi4udGhpcy5nZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMoKVxuICAgIH07XG5cbiAgICBjb25zdCBkZWZhdWx0TGF5ZXJQcm9wcyA9IHRoaXMuZ2V0RGVmYXVsdERlY2tMYXllclByb3BzKG9wdHMpO1xuICAgIGNvbnN0IGJydXNoaW5nUHJvcHMgPSB0aGlzLmdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMoaW50ZXJhY3Rpb25Db25maWcpO1xuICAgIGNvbnN0IGdldFBpeGVsT2Zmc2V0ID0gZ2V0VGV4dE9mZnNldEJ5UmFkaXVzKHJhZGl1c1NjYWxlLCBkYXRhLmdldFJhZGl1cywgbWFwU3RhdGUpO1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbLi4uZGVmYXVsdExheWVyUHJvcHMuZXh0ZW5zaW9ucywgYnJ1c2hpbmdFeHRlbnNpb25dO1xuXG4gICAgLy8gc2hhcmVkIFByb3BzIGJldHdlZW4gbGF5ZXIgYW5kIGxhYmVsIGxheWVyXG4gICAgY29uc3Qgc2hhcmVkUHJvcHMgPSB7XG4gICAgICBnZXRGaWx0ZXJWYWx1ZTogZGF0YS5nZXRGaWx0ZXJWYWx1ZSxcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICBmaWx0ZXJSYW5nZTogZGVmYXVsdExheWVyUHJvcHMuZmlsdGVyUmFuZ2UsXG4gICAgICAuLi5icnVzaGluZ1Byb3BzXG4gICAgfTtcblxuICAgIGNvbnN0IGxhYmVsTGF5ZXJzID0gW1xuICAgICAgLi4udGhpcy5yZW5kZXJUZXh0TGFiZWxMYXllcihcbiAgICAgICAge1xuICAgICAgICAgIGdldFBvc2l0aW9uOiBkYXRhLmdldFBvc2l0aW9uLFxuICAgICAgICAgIHNoYXJlZFByb3BzLFxuICAgICAgICAgIGdldFBpeGVsT2Zmc2V0LFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzXG4gICAgICAgIH0sXG4gICAgICAgIG9wdHNcbiAgICAgIClcbiAgICBdO1xuICAgIGNvbnN0IGhvdmVyZWRPYmplY3QgPSB0aGlzLmhhc0hvdmVyZWRPYmplY3Qob2JqZWN0SG92ZXJlZCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgLy8gaWNvbnMgd2lsbCBiZSBmbGF0IG9uIHRoZSBtYXAgd2hlbiB0aGUgYWx0aXR1ZGUgY29sdW1uIGlzIG5vdCB1c2VkXG4gICAgICBkZXB0aFRlc3Q6IHRoaXMuY29uZmlnLmNvbHVtbnMuYWx0aXR1ZGU/LmZpZWxkSWR4ID4gLTEsXG4gICAgICBjdWxsRmFjZTogR0wuRlJPTlRcbiAgICB9O1xuXG4gICAgcmV0dXJuICF0aGlzLmljb25HZW9tZXRyeVxuICAgICAgPyBbXVxuICAgICAgOiBbXG4gICAgICAgICAgbmV3IFN2Z0ljb25MYXllcih7XG4gICAgICAgICAgICAuLi5kZWZhdWx0TGF5ZXJQcm9wcyxcbiAgICAgICAgICAgIC4uLmJydXNoaW5nUHJvcHMsXG4gICAgICAgICAgICAuLi5sYXllclByb3BzLFxuICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgICBnZXRJY29uR2VvbWV0cnk6IGlkID0+IHRoaXMuaWNvbkdlb21ldHJ5Py5baWRdLFxuXG4gICAgICAgICAgICAvLyB1cGRhdGUgdHJpZ2dlcnNcbiAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzLFxuICAgICAgICAgICAgZXh0ZW5zaW9uc1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgLy8gaG92ZXIgbGF5ZXJcbiAgICAgICAgICAuLi4oaG92ZXJlZE9iamVjdFxuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBTdmdJY29uTGF5ZXJQcm9wcyBuZWVkcyBnZXRJY29uIEZpZWxkXG4gICAgICAgICAgICAgICAgbmV3IFN2Z0ljb25MYXllcih7XG4gICAgICAgICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRIb3ZlckxheWVyUHJvcHMoKSxcbiAgICAgICAgICAgICAgICAgIC4uLmxheWVyUHJvcHMsXG4gICAgICAgICAgICAgICAgICB2aXNpYmxlOiBkZWZhdWx0TGF5ZXJQcm9wcy52aXNpYmxlLFxuICAgICAgICAgICAgICAgICAgZGF0YTogW2hvdmVyZWRPYmplY3RdLFxuICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIGdldFBvc2l0aW9uOiBkYXRhLmdldFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgZ2V0UmFkaXVzOiBkYXRhLmdldFJhZGl1cyxcbiAgICAgICAgICAgICAgICAgIGdldEZpbGxDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAgICAgICAgICAgICBnZXRJY29uR2VvbWV0cnk6IGlkID0+IHRoaXMuaWNvbkdlb21ldHJ5Py5baWRdXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSksXG5cbiAgICAgICAgICAvLyB0ZXh0IGxhYmVsIGxheWVyXG4gICAgICAgICAgLi4ubGFiZWxMYXllcnNcbiAgICAgICAgXTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBRyxhQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxjQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxXQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxjQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxVQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxXQUFBLEdBQUFSLE9B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
|
|
@@ -21,6 +21,7 @@ import { default as S2GeometryLayer } from './s2-geometry-layer/s2-geometry-laye
|
|
|
21
21
|
export { defaultElevation as s2DefaultElevation } from './s2-geometry-layer/s2-geometry-layer';
|
|
22
22
|
export { getS2Center } from './s2-geometry-layer/s2-utils';
|
|
23
23
|
export { default as AggregationLayer } from './aggregation-layer';
|
|
24
|
+
import { default as VectorTileLayer } from './vector-tile/vector-tile-layer';
|
|
24
25
|
export { default as VectorTileIcon } from './vector-tile/vector-tile-icon';
|
|
25
26
|
export { default as VectorTileLayer } from './vector-tile/vector-tile-layer';
|
|
26
27
|
export { parseGeoJsonRawFeature } from './geojson-layer/geojson-utils';
|
|
@@ -40,6 +41,7 @@ export declare const KeplerGlLayers: {
|
|
|
40
41
|
ScenegraphLayer: typeof ScenegraphLayer;
|
|
41
42
|
TripLayer: typeof TripLayer;
|
|
42
43
|
S2GeometryLayer: typeof S2GeometryLayer;
|
|
44
|
+
VectorTileLayer: typeof VectorTileLayer;
|
|
43
45
|
};
|
|
44
46
|
export declare type LayerClassesType = typeof LayerClasses;
|
|
45
47
|
export declare const LayerClasses: {
|
|
@@ -56,6 +58,7 @@ export declare const LayerClasses: {
|
|
|
56
58
|
"3D": typeof ScenegraphLayer;
|
|
57
59
|
trip: typeof TripLayer;
|
|
58
60
|
s2: typeof S2GeometryLayer;
|
|
61
|
+
vectorTile: typeof VectorTileLayer;
|
|
59
62
|
};
|
|
60
63
|
export * from './mapbox-utils';
|
|
61
64
|
export * from './h3-hexagon-layer';
|