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.
Files changed (190) hide show
  1. package/dist/src/actions/src/action-types.d.ts +2 -0
  2. package/dist/src/actions/src/ui-state-actions.d.ts +16 -0
  3. package/dist/src/ai-assistant/src/actions.d.ts +1 -1
  4. package/dist/src/ai-assistant/src/components/ai-assistant-component.d.ts +2 -1
  5. package/dist/src/ai-assistant/src/constants.d.ts +3 -3
  6. package/dist/src/ai-assistant/src/reducers/index.d.ts +1 -1
  7. package/dist/src/ai-assistant/src/tools/basemap-functions.d.ts +1 -1
  8. package/dist/src/ai-assistant/src/tools/filter-function.d.ts +1 -1
  9. package/dist/src/ai-assistant/src/tools/layer-creation-function.d.ts +1 -1
  10. package/dist/src/ai-assistant/src/tools/layer-style-function.d.ts +1 -1
  11. package/dist/src/ai-assistant/src/tools/loadurl-function.d.ts +1 -1
  12. package/dist/src/ai-assistant/src/tools/utils.d.ts +73 -0
  13. package/dist/src/components/src/common/data-table/index.d.ts +1 -1
  14. package/dist/src/components/src/common/data-table/option-dropdown.d.ts +3 -3
  15. package/dist/src/components/src/common/file-uploader/file-drop.d.ts +2 -2
  16. package/dist/src/components/src/kepler-gl.d.ts +5 -0
  17. package/dist/src/components/src/loading-indicator.d.ts +13 -0
  18. package/dist/src/components/src/map-container.d.ts +3 -0
  19. package/dist/src/constants/src/default-settings.d.ts +1 -0
  20. package/dist/src/duckdb/src/plugin.d.ts +1 -0
  21. package/dist/src/duckdb/src/table/duckdb-table-utils.d.ts +13 -0
  22. package/dist/src/duckdb/src/table/duckdb-table.d.ts +7 -2
  23. package/dist/src/reducers/src/ui-state-updaters.d.ts +10 -0
  24. package/dist/src/reducers/src/vis-state-updaters.d.ts +1 -0
  25. package/dist/src/reducers/src/vis-state.d.ts +4 -0
  26. package/dist/src/utils/src/application-config.d.ts +2 -0
  27. package/dist/src/utils/src/observe-dimensions.d.ts +2 -1
  28. package/package.json +5 -3
  29. package/src/actions/dist/action-types.d.ts +2 -0
  30. package/src/actions/dist/action-types.js +2 -1
  31. package/src/actions/dist/ui-state-actions.d.ts +16 -0
  32. package/src/actions/dist/ui-state-actions.js +17 -2
  33. package/src/actions/package.json +8 -8
  34. package/src/actions/src/action-types.ts +1 -0
  35. package/src/actions/src/ui-state-actions.ts +22 -0
  36. package/src/ai-assistant/README.md +76 -0
  37. package/src/ai-assistant/dist/actions.d.ts +1 -1
  38. package/src/ai-assistant/dist/actions.js +2 -2
  39. package/src/ai-assistant/dist/components/ai-assistant-component.d.ts +2 -1
  40. package/src/ai-assistant/dist/components/ai-assistant-component.js +64 -23
  41. package/src/ai-assistant/dist/components/ai-assistant-config.js +67 -54
  42. package/src/ai-assistant/dist/constants.d.ts +3 -3
  43. package/src/ai-assistant/dist/constants.js +4 -4
  44. package/src/ai-assistant/dist/reducers/index.d.ts +1 -1
  45. package/src/ai-assistant/dist/reducers/index.js +2 -2
  46. package/src/ai-assistant/dist/tools/basemap-functions.d.ts +1 -1
  47. package/src/ai-assistant/dist/tools/basemap-functions.js +1 -1
  48. package/src/ai-assistant/dist/tools/filter-function.d.ts +1 -1
  49. package/src/ai-assistant/dist/tools/filter-function.js +9 -6
  50. package/src/ai-assistant/dist/tools/layer-creation-function.d.ts +1 -1
  51. package/src/ai-assistant/dist/tools/layer-creation-function.js +1 -1
  52. package/src/ai-assistant/dist/tools/layer-style-function.d.ts +1 -1
  53. package/src/ai-assistant/dist/tools/layer-style-function.js +1 -1
  54. package/src/ai-assistant/dist/tools/loadurl-function.d.ts +1 -1
  55. package/src/ai-assistant/dist/tools/loadurl-function.js +1 -1
  56. package/src/ai-assistant/dist/tools/utils.d.ts +73 -0
  57. package/src/ai-assistant/dist/tools/utils.js +211 -3
  58. package/src/ai-assistant/package.json +13 -9
  59. package/src/ai-assistant/src/actions.ts +2 -2
  60. package/src/ai-assistant/src/components/ai-assistant-component.tsx +56 -23
  61. package/src/ai-assistant/src/components/ai-assistant-config.tsx +63 -46
  62. package/src/ai-assistant/src/config/models.json +32 -0
  63. package/src/ai-assistant/src/constants.ts +7 -2
  64. package/src/ai-assistant/src/reducers/index.ts +2 -2
  65. package/src/ai-assistant/src/tools/basemap-functions.tsx +1 -1
  66. package/src/ai-assistant/src/tools/filter-function.tsx +11 -7
  67. package/src/ai-assistant/src/tools/layer-creation-function.tsx +1 -1
  68. package/src/ai-assistant/src/tools/layer-style-function.tsx +1 -1
  69. package/src/ai-assistant/src/tools/loadurl-function.tsx +1 -1
  70. package/src/ai-assistant/src/tools/utils.ts +212 -2
  71. package/src/cloud-providers/package.json +2 -2
  72. package/src/common-utils/package.json +3 -3
  73. package/src/components/dist/common/data-table/header-cell.js +10 -10
  74. package/src/components/dist/common/data-table/index.d.ts +1 -1
  75. package/src/components/dist/common/data-table/index.js +1 -1
  76. package/src/components/dist/common/data-table/option-dropdown.d.ts +3 -3
  77. package/src/components/dist/common/data-table/option-dropdown.js +5 -5
  78. package/src/components/dist/common/file-uploader/file-drop.d.ts +2 -2
  79. package/src/components/dist/common/file-uploader/file-drop.js +1 -1
  80. package/src/components/dist/common/portaled.js +1 -1
  81. package/src/components/dist/editor/editor.js +1 -1
  82. package/src/components/dist/kepler-gl.d.ts +5 -0
  83. package/src/components/dist/kepler-gl.js +7 -2
  84. package/src/components/dist/loading-indicator.d.ts +13 -0
  85. package/src/components/dist/loading-indicator.js +40 -0
  86. package/src/components/dist/map-container.d.ts +3 -0
  87. package/src/components/dist/map-container.js +11 -3
  88. package/src/components/dist/modals/save-map-modal.js +4 -3
  89. package/src/components/package.json +15 -15
  90. package/src/components/src/common/data-table/header-cell.tsx +5 -3
  91. package/src/components/src/common/data-table/index.tsx +1 -1
  92. package/src/components/src/common/data-table/option-dropdown.tsx +7 -7
  93. package/src/components/src/common/file-uploader/file-drop.tsx +11 -11
  94. package/src/components/src/common/portaled.tsx +12 -12
  95. package/src/components/src/editor/editor.tsx +3 -3
  96. package/src/components/src/kepler-gl.tsx +7 -2
  97. package/src/components/src/loading-indicator.tsx +49 -0
  98. package/src/components/src/map-container.tsx +19 -1
  99. package/src/components/src/modals/save-map-modal.tsx +6 -2
  100. package/src/constants/dist/default-settings.d.ts +1 -0
  101. package/src/constants/dist/default-settings.js +13 -9
  102. package/src/constants/dist/keyevent.js +1 -1
  103. package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/72/80/7a7c561d7985e92aab7b9683e7baf5a0286b353a8f2609c4c71099f668d012be027929e4bbac937f9aa0c9a61be3bd4405136f582895f05aa0313c8efa42 +1 -0
  104. package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/8f/f6/b66955867599392dc69ff1db64419e83c087a82c2e3d4b6418d49ac6bc80e3200dd6c86cdfd4a2cf98ce573f71a5281b86ba3df8a7210e02544f63054191 +1 -0
  105. package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/bd/ba/47ea8fcb11ecd5cd47ad867052e58b1f7e0c8dc5f8918a36fe90eaf45981 +2 -0
  106. package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/f0/6e/aadf3c48345aa72e7b2fb92e8c9788d04986b55caf83daa3fbd749c37c44 +2 -0
  107. package/src/constants/package.json +2 -2
  108. package/src/constants/src/default-settings.ts +11 -5
  109. package/src/constants/src/keyevent.ts +2 -2
  110. package/src/constants/umd/keplergl.min.js +1 -1
  111. package/src/deckgl-arrow-layers/package.json +1 -1
  112. package/src/deckgl-layers/package.json +4 -4
  113. package/src/duckdb/dist/components/preview-data-panel.js +2 -11
  114. package/src/duckdb/dist/components/sql-panel.js +7 -3
  115. package/src/duckdb/dist/components/tree.js +5 -4
  116. package/src/duckdb/dist/plugin.d.ts +1 -0
  117. package/src/duckdb/dist/plugin.js +9 -2
  118. package/src/duckdb/dist/processors/data-processor.js +4 -5
  119. package/src/duckdb/dist/table/duckdb-table-utils.d.ts +13 -0
  120. package/src/duckdb/dist/table/duckdb-table-utils.js +110 -0
  121. package/src/duckdb/dist/table/duckdb-table.d.ts +7 -2
  122. package/src/duckdb/dist/table/duckdb-table.js +189 -44
  123. package/src/duckdb/package.json +6 -6
  124. package/src/duckdb/src/components/preview-data-panel.tsx +0 -5
  125. package/src/duckdb/src/components/sql-panel.tsx +4 -2
  126. package/src/duckdb/src/components/tree.tsx +5 -1
  127. package/src/duckdb/src/plugin.ts +8 -1
  128. package/src/duckdb/src/processors/data-processor.ts +3 -4
  129. package/src/duckdb/src/table/duckdb-table-utils.ts +106 -0
  130. package/src/duckdb/src/table/duckdb-table.ts +134 -33
  131. package/src/effects/package.json +5 -5
  132. package/src/layers/dist/icon-layer/icon-layer.js +1 -1
  133. package/src/layers/dist/index.d.ts +3 -0
  134. package/src/layers/dist/index.js +6 -7
  135. package/src/layers/dist/point-layer/point-layer.d.ts +1 -1
  136. package/src/layers/dist/point-layer/point-layer.js +8 -2
  137. package/src/layers/package.json +9 -9
  138. package/src/layers/src/icon-layer/icon-layer.ts +8 -10
  139. package/src/layers/src/index.ts +5 -5
  140. package/src/layers/src/point-layer/point-layer.ts +6 -1
  141. package/src/localization/package.json +1 -1
  142. package/src/processors/dist/data-processor.js +2 -4
  143. package/src/processors/package.json +7 -7
  144. package/src/processors/src/data-processor.ts +1 -3
  145. package/src/reducers/dist/ui-state-updaters.d.ts +10 -0
  146. package/src/reducers/dist/ui-state-updaters.js +22 -2
  147. package/src/reducers/dist/ui-state.js +2 -2
  148. package/src/reducers/dist/vis-state-updaters.d.ts +1 -0
  149. package/src/reducers/dist/vis-state-updaters.js +21 -5
  150. package/src/reducers/dist/vis-state.d.ts +4 -0
  151. package/src/reducers/package.json +16 -16
  152. package/src/reducers/src/ui-state-updaters.ts +24 -0
  153. package/src/reducers/src/ui-state.ts +3 -1
  154. package/src/reducers/src/vis-state-updaters.ts +24 -5
  155. package/src/schemas/dist/dataset-schema.js +38 -2
  156. package/src/schemas/package.json +8 -7
  157. package/src/schemas/src/dataset-schema.ts +43 -1
  158. package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/5f/aa/96c67b383dbcd2b95625113a5389c6078fd8a53e6fc73a054229709f2dac1e0a409e7117049485a569fbebf8434a319451842671398904bfe1a7f7b5991c +1 -0
  159. package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/af/aa/228fbff58007b23eea5eb6cc7d2da1f0af1d8a7024129a416ea88b4df0ad7afc7aec93b09f3dd42a98f1d6a6f4dce6b53204818da85ef5becc42f928a64d +1 -0
  160. package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/40/72/cac221d8459e6b743bc62ecdb370ed854b21ec30d3f7f4c06c7d1d7ffde2 +2 -0
  161. package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/c1/39/f7cd1d5947ec6e5d82bfa07041271344eb02f9e67bf5823acf2f22c2d01f +2 -0
  162. package/src/styles/package.json +2 -2
  163. package/src/styles/umd/keplergl.min.js +1 -1
  164. package/src/table/dist/dataset-utils.js +10 -4
  165. package/src/table/package.json +5 -5
  166. package/src/table/src/dataset-utils.ts +7 -1
  167. package/src/tasks/package.json +2 -2
  168. package/src/types/package.json +1 -1
  169. package/src/types/reducers.d.ts +2 -0
  170. package/src/utils/dist/application-config.d.ts +2 -0
  171. package/src/utils/dist/application-config.js +4 -2
  172. package/src/utils/dist/data-utils.js +14 -2
  173. package/src/utils/dist/dataset-utils.js +5 -3
  174. package/src/utils/dist/dom-to-image.js +1 -1
  175. package/src/utils/dist/dom-utils.js +1 -1
  176. package/src/utils/dist/map-style-utils/mapbox-gl-style-editor.js +7 -1
  177. package/src/utils/dist/observe-dimensions.d.ts +2 -1
  178. package/src/utils/dist/observe-dimensions.js +10 -4
  179. package/src/utils/dist/utils.js +1 -1
  180. package/src/utils/package.json +4 -4
  181. package/src/utils/src/application-config.ts +9 -1
  182. package/src/utils/src/data-utils.ts +13 -1
  183. package/src/utils/src/dataset-utils.ts +1 -1
  184. package/src/utils/src/dom-to-image.ts +5 -6
  185. package/src/utils/src/dom-utils.ts +15 -15
  186. package/src/utils/src/map-style-utils/mapbox-gl-style-editor.ts +6 -0
  187. package/src/utils/src/observe-dimensions.ts +9 -4
  188. package/src/utils/src/utils.ts +8 -8
  189. package/umd/keplergl.min.css +1 -1
  190. package/umd/keplergl.min.js +1499 -1428
@@ -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
- // TODO format geojson, all binary geogson columns should be tranformed to wkb
28
- const GEOMETRY_COLUMN = 'geom';
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<void> {
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<void> {
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
- // We need to transform the binary geometry column to proper wkb.
183
- // First check whether such a column exists, then query with ST_AsWKB.
184
- const dummyResult = await c.query(`
185
- SELECT * FROM '${tableName}' LIMIT 0;
186
- `);
187
- const hasBinaryGeoField = Boolean(
188
- dummyResult.schema.fields.find(
189
- f => f.name === GEOMETRY_COLUMN && arrow.DataType.isBinary(f.type)
190
- )
191
- );
192
-
193
- // TODO don't do this for all columns named 'geom', check whether it's a wkb and not something else!
194
- // query and transform geometry column to wkb
195
- const arrowResult = await c.query(
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
+ };
@@ -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-alpha.6",
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-alpha.6",
35
- "@kepler.gl/constants": "3.1.0-alpha.6",
36
- "@kepler.gl/types": "3.1.0-alpha.6",
37
- "@kepler.gl/utils": "3.1.0-alpha.6",
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';