@kepler.gl/duckdb 3.3.0-alpha.0 → 3.3.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/cjs/adapters/duckdb-wasm-adapter.js +258 -0
  2. package/dist/{components → cjs/components}/index.js +1 -1
  3. package/dist/cjs/components/monaco-editor.js +174 -0
  4. package/dist/cjs/components/preview-data-panel.js +127 -0
  5. package/dist/cjs/components/schema-panel.js +170 -0
  6. package/dist/cjs/components/sql-panel.js +395 -0
  7. package/dist/cjs/components/tree.js +90 -0
  8. package/dist/{index.js → cjs/index.js} +1 -1
  9. package/dist/{plugin.js → cjs/plugin.js} +2 -2
  10. package/dist/cjs/processors/data-processor.js +353 -0
  11. package/dist/cjs/table/duckdb-table-utils.js +670 -0
  12. package/dist/cjs/table/duckdb-table.js +482 -0
  13. package/dist/{table → cjs/table}/index.js +1 -1
  14. package/dist/cjs/utils/perf.js +46 -0
  15. package/dist/esm/adapters/duckdb-wasm-adapter.js +251 -0
  16. package/dist/esm/components/index.js +9 -0
  17. package/dist/esm/components/monaco-editor.js +167 -0
  18. package/dist/esm/components/preview-data-panel.js +120 -0
  19. package/dist/esm/components/schema-panel.js +164 -0
  20. package/dist/esm/components/sql-panel.js +388 -0
  21. package/dist/esm/components/tree.js +82 -0
  22. package/dist/esm/index.js +9 -0
  23. package/dist/esm/plugin.js +22 -0
  24. package/dist/esm/processors/data-processor.js +342 -0
  25. package/dist/esm/table/duckdb-table-utils.js +645 -0
  26. package/dist/esm/table/duckdb-table.js +477 -0
  27. package/dist/esm/table/index.js +5 -0
  28. package/dist/esm/utils/perf.js +40 -0
  29. package/dist/table/duckdb-table-utils.d.ts +7 -0
  30. package/package.json +28 -24
  31. package/dist/adapters/duckdb-wasm-adapter.js +0 -259
  32. package/dist/components/monaco-editor.js +0 -175
  33. package/dist/components/preview-data-panel.js +0 -128
  34. package/dist/components/schema-panel.js +0 -171
  35. package/dist/components/sql-panel.js +0 -396
  36. package/dist/components/tree.js +0 -91
  37. package/dist/processors/data-processor.js +0 -353
  38. package/dist/table/duckdb-table-utils.js +0 -669
  39. package/dist/table/duckdb-table.js +0 -480
  40. package/dist/utils/perf.js +0 -46
@@ -1,353 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.CSV_NULLS = exports.COLUMN_TYPES_PRIORITIES = void 0;
8
- exports.columnTypeToFieldType = columnTypeToFieldType;
9
- exports.consolidateFieldTypes = consolidateFieldTypes;
10
- exports.extendFieldsWithDuckDBColumnType = extendFieldsWithDuckDBColumnType;
11
- exports.fieldTypeToColumnType = fieldTypeToColumnType;
12
- exports.processCsvRowObject = processCsvRowObject;
13
- exports.processGeojson = processGeojson;
14
- exports.processKeplerglJSONforDuckDb = processKeplerglJSONforDuckDb;
15
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
16
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
18
- var _geojsonNormalize = _interopRequireDefault(require("@mapbox/geojson-normalize"));
19
- var _commonUtils = require("@kepler.gl/common-utils");
20
- var _constants = require("@kepler.gl/constants");
21
- var _processors = require("@kepler.gl/processors");
22
- var _utils = require("@kepler.gl/utils");
23
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
24
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
25
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
26
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
27
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
28
- // Copyright contributors to the kepler.gl project
29
- var CSV_NULLS = exports.CSV_NULLS = /^(null|NULL|Null|NaN|\/N||)$/;
30
- var COLUMN_TYPES = /*#__PURE__*/function (COLUMN_TYPES) {
31
- COLUMN_TYPES["GEOMETRY"] = "GEOMETRY";
32
- COLUMN_TYPES["BOOLEAN"] = "BOOLEAN";
33
- COLUMN_TYPES["INTEGER"] = "INTEGER";
34
- COLUMN_TYPES["FLOAT"] = "FLOAT";
35
- COLUMN_TYPES["TIME"] = "TIME";
36
- COLUMN_TYPES["DATE"] = "DATE";
37
- COLUMN_TYPES["TIMESTAMP"] = "TIMESTAMP";
38
- COLUMN_TYPES["VARCHAR"] = "VARCHAR";
39
- return COLUMN_TYPES;
40
- }(COLUMN_TYPES || {}); // https://duckdb.org/docs/data/csv/auto_detection.html#type-detection
41
- var COLUMN_TYPES_PRIORITIES = exports.COLUMN_TYPES_PRIORITIES = ['GEOMETRY', 'BOOLEAN', 'INTEGER', 'FLOAT', 'TIME', 'DATE', 'TIMESTAMP', 'VARCHAR'];
42
- function columnTypeToFieldType(columnType) {
43
- switch (columnType) {
44
- case COLUMN_TYPES.BOOLEAN:
45
- return _constants.ALL_FIELD_TYPES["boolean"];
46
- case COLUMN_TYPES.DATE:
47
- return _constants.ALL_FIELD_TYPES.date;
48
- case COLUMN_TYPES.INTEGER:
49
- return _constants.ALL_FIELD_TYPES.integer;
50
- case COLUMN_TYPES.FLOAT:
51
- return _constants.ALL_FIELD_TYPES.real;
52
- case COLUMN_TYPES.VARCHAR:
53
- return _constants.ALL_FIELD_TYPES.string;
54
- case COLUMN_TYPES.TIMESTAMP:
55
- return _constants.ALL_FIELD_TYPES.timestamp;
56
- case COLUMN_TYPES.GEOMETRY:
57
- return _constants.ALL_FIELD_TYPES.geojson;
58
- default:
59
- // is there any other type we didn't cover?
60
- console.warn("Unsupported DuckDB Column type: ".concat(columnType));
61
- return null;
62
- }
63
- }
64
- function fieldTypeToColumnType(fieldType) {
65
- switch (fieldType) {
66
- case _constants.ALL_FIELD_TYPES["boolean"]:
67
- return COLUMN_TYPES.BOOLEAN;
68
- case _constants.ALL_FIELD_TYPES.date:
69
- return COLUMN_TYPES.DATE;
70
- case _constants.ALL_FIELD_TYPES.integer:
71
- return COLUMN_TYPES.INTEGER;
72
- case _constants.ALL_FIELD_TYPES.real:
73
- return COLUMN_TYPES.FLOAT;
74
- case _constants.ALL_FIELD_TYPES.string:
75
- return COLUMN_TYPES.VARCHAR;
76
- case _constants.ALL_FIELD_TYPES.timestamp:
77
- return COLUMN_TYPES.TIMESTAMP;
78
- case _constants.ALL_FIELD_TYPES.geojson:
79
- return COLUMN_TYPES.GEOMETRY;
80
- default:
81
- // is there any other type we didn't cover?
82
- console.warn("Unsupported Field type for DuckDb: ".concat(fieldType));
83
- return null;
84
- }
85
- }
86
-
87
- /*
88
- * Process uploaded exported Keplergl json map.
89
- * We need to populate field with proper DuckDb compatible type.
90
- */
91
- // TODO: merge with logic from processCsvRowObject. Different formats: [[]] vs [{}]
92
- function processKeplerglJSONforDuckDb(_x) {
93
- return _processKeplerglJSONforDuckDb.apply(this, arguments);
94
- }
95
- /*
96
- * Process uploaded csv returned by loaders.gl as row object and string value
97
- */
98
- function _processKeplerglJSONforDuckDb() {
99
- _processKeplerglJSONforDuckDb = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(keplerJson) {
100
- var res, datasets, _iterator, _step, _loop2;
101
- return _regenerator["default"].wrap(function _callee$(_context2) {
102
- while (1) switch (_context2.prev = _context2.next) {
103
- case 0:
104
- res = (0, _processors.processKeplerglJSON)(keplerJson);
105
- datasets = (res === null || res === void 0 ? void 0 : res.datasets) || [];
106
- _iterator = _createForOfIteratorHelper(datasets);
107
- _context2.prev = 3;
108
- _loop2 = /*#__PURE__*/_regenerator["default"].mark(function _loop2() {
109
- var dataset, rowsAll, fieldsAll, header, sample, schema, fieldsUpd;
110
- return _regenerator["default"].wrap(function _loop2$(_context) {
111
- while (1) switch (_context.prev = _context.next) {
112
- case 0:
113
- dataset = _step.value;
114
- rowsAll = dataset.data.rows;
115
- fieldsAll = dataset.data.fields;
116
- header = fieldsAll.map(function (f) {
117
- return f.name;
118
- });
119
- sample = (0, _commonUtils.getSampleForTypeAnalyze)({
120
- fields: header,
121
- rows: rowsAll
122
- });
123
- if (!(sample.length > 0)) {
124
- _context.next = 11;
125
- break;
126
- }
127
- _context.next = 8;
128
- return sniffCsvSchema(sample);
129
- case 8:
130
- _context.t0 = _context.sent;
131
- _context.next = 12;
132
- break;
133
- case 11:
134
- _context.t0 = fieldsAll.reduce(function (acc, field) {
135
- acc[field.name] = fieldTypeToColumnType(field.type);
136
- return acc;
137
- }, {});
138
- case 12:
139
- schema = _context.t0;
140
- fieldsUpd = consolidateFieldTypes(dataset.data.fields, schema);
141
- dataset.data.fields = fieldsAll.map(function (f, i) {
142
- return _objectSpread(_objectSpread({}, fieldsUpd[i]), f);
143
- });
144
- case 15:
145
- case "end":
146
- return _context.stop();
147
- }
148
- }, _loop2);
149
- });
150
- _iterator.s();
151
- case 6:
152
- if ((_step = _iterator.n()).done) {
153
- _context2.next = 10;
154
- break;
155
- }
156
- return _context2.delegateYield(_loop2(), "t0", 8);
157
- case 8:
158
- _context2.next = 6;
159
- break;
160
- case 10:
161
- _context2.next = 15;
162
- break;
163
- case 12:
164
- _context2.prev = 12;
165
- _context2.t1 = _context2["catch"](3);
166
- _iterator.e(_context2.t1);
167
- case 15:
168
- _context2.prev = 15;
169
- _iterator.f();
170
- return _context2.finish(15);
171
- case 18:
172
- return _context2.abrupt("return", res);
173
- case 19:
174
- case "end":
175
- return _context2.stop();
176
- }
177
- }, _callee, null, [[3, 12, 15, 18]]);
178
- }));
179
- return _processKeplerglJSONforDuckDb.apply(this, arguments);
180
- }
181
- function processCsvRowObject(_x2) {
182
- return _processCsvRowObject.apply(this, arguments);
183
- }
184
- function _processCsvRowObject() {
185
- _processCsvRowObject = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(rawData) {
186
- var header, sample, schema, fieldsWAnalyzerType, fields;
187
- return _regenerator["default"].wrap(function _callee2$(_context3) {
188
- while (1) switch (_context3.prev = _context3.next) {
189
- case 0:
190
- if (!(!Array.isArray(rawData) || !rawData.length)) {
191
- _context3.next = 2;
192
- break;
193
- }
194
- return _context3.abrupt("return", {
195
- fields: [],
196
- rows: []
197
- });
198
- case 2:
199
- header = Object.keys(rawData[0]); // [lat, lng, value]
200
- // row object can still contain values like `Null` or `N/A`
201
- cleanUpFalsyCsvValue(rawData);
202
- sample = (0, _commonUtils.getSampleForTypeAnalyze)({
203
- fields: header,
204
- rows: rawData
205
- }); // add sample data to duckdb and get schema
206
- _context3.next = 7;
207
- return sniffCsvSchema(sample);
208
- case 7:
209
- schema = _context3.sent;
210
- fieldsWAnalyzerType = (0, _commonUtils.getFieldsFromData)(sample, header);
211
- fields = consolidateFieldTypes(fieldsWAnalyzerType, schema);
212
- return _context3.abrupt("return", {
213
- rows: rawData,
214
- fields: fields
215
- });
216
- case 11:
217
- case "end":
218
- return _context3.stop();
219
- }
220
- }, _callee2);
221
- }));
222
- return _processCsvRowObject.apply(this, arguments);
223
- }
224
- function cleanUpFalsyCsvValue(rows) {
225
- var re = new RegExp(CSV_NULLS, 'g');
226
- var _loop = function _loop(i) {
227
- Object.keys(rows[i]).forEach(function (key) {
228
- // here we parse empty data as null
229
- if (typeof rows[i][key] === 'string' && rows[i][key].match(re)) {
230
- rows[i][key] = null;
231
- }
232
- });
233
- };
234
- for (var i = 0; i < rows.length; i++) {
235
- _loop(i);
236
- }
237
- }
238
-
239
- // align type analyzer types with DuckDB csv auto detected column types
240
- function consolidateFieldTypes(fields, schema) {
241
- return fields.map(function (field) {
242
- var columnName = field.name;
243
- var detectedColumnType = schema[columnName];
244
-
245
- // TODO columnTypeToFieldType tranforms detected timestamps to string,
246
- // completely breaking time filter logic.
247
- // const fieldType = columnTypeToFieldType(detectedColumnType) || field.type;
248
-
249
- return _objectSpread(_objectSpread({}, field), {}, {
250
- // type: fieldType,
251
- duckDBColumnType: detectedColumnType
252
- });
253
- });
254
- }
255
- function toCSVRow(row) {
256
- return "".concat(row.map(function (r) {
257
- var rToStr = (0, _commonUtils.notNullorUndefined)(r) ? String(r).replace(/"/g, '\\"') : '';
258
- return rToStr.includes(',') ? "\"".concat(rToStr, "\"") : rToStr;
259
- }).join(','), "\n");
260
- }
261
-
262
- // Use DucckDB to detect csv column schema
263
- function sniffCsvSchema(_x3) {
264
- return _sniffCsvSchema.apply(this, arguments);
265
- }
266
- function _sniffCsvSchema() {
267
- _sniffCsvSchema = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(sample) {
268
- var headerRow, csvContent, db, c, fileName, result, schemaResult, columns, schema, i;
269
- return _regenerator["default"].wrap(function _callee3$(_context4) {
270
- while (1) switch (_context4.prev = _context4.next) {
271
- case 0:
272
- if (!(!Array.isArray(sample) || sample.length < 0)) {
273
- _context4.next = 2;
274
- break;
275
- }
276
- return _context4.abrupt("return");
277
- case 2:
278
- headerRow = toCSVRow(Object.keys(sample[0]));
279
- csvContent = sample.reduce(function (accu, row) {
280
- return "".concat(accu).concat(toCSVRow(Object.values(row)));
281
- }, headerRow);
282
- db = (0, _utils.getApplicationConfig)().database;
283
- if (db) {
284
- _context4.next = 8;
285
- break;
286
- }
287
- console.error('The database is not configured properly.');
288
- return _context4.abrupt("return");
289
- case 8:
290
- _context4.next = 10;
291
- return db.connect();
292
- case 10:
293
- c = _context4.sent;
294
- fileName = (0, _commonUtils.generateHashId)();
295
- _context4.next = 14;
296
- return db.registerFileText("".concat(fileName, "-").concat(_commonUtils.generateHashId, ".csv"), csvContent);
297
- case 14:
298
- _context4.next = 16;
299
- return c.query("\n FROM sniff_csv('".concat(fileName, "-").concat(_commonUtils.generateHashId, ".csv', \n sample_size = 500,\n auto_type_candidates = ['FLOAT', 'INTEGER', 'TIMESTAMP', 'DATE', 'TIME', 'VARCHAR', 'BOOLEAN']);\n "));
300
- case 16:
301
- result = _context4.sent;
302
- schemaResult = result.toArray().map(function (row) {
303
- return row.toJSON();
304
- });
305
- columns = schemaResult[0].Columns;
306
- schema = {};
307
- for (i = 0; i < columns.length; i++) {
308
- schema[columns.get(i).name] = columns.get(i).type;
309
- }
310
- return _context4.abrupt("return", schema);
311
- case 22:
312
- case "end":
313
- return _context4.stop();
314
- }
315
- }, _callee3);
316
- }));
317
- return _sniffCsvSchema.apply(this, arguments);
318
- }
319
- function processGeojson(rawData) {
320
- var normalizedGeojson = (0, _geojsonNormalize["default"])(rawData);
321
- if (!normalizedGeojson || !Array.isArray(normalizedGeojson.features)) {
322
- var error = new Error("Read File Failed: File is not a valid GeoJSON. Read more about [supported file format](".concat(_constants.GUIDES_FILE_FORMAT_DOC, ")"));
323
- throw error;
324
- }
325
-
326
- // @ts-expect-error Don't pass empty fields, as duck db outputs an empty dataset
327
- return {
328
- rows: normalizedGeojson
329
- // TODO get fields to preserve field names?
330
- // fields: []
331
- };
332
- }
333
-
334
- /**
335
- * A utility function to extend existing fields with native DuckDB column type.
336
- * @param fields Array of fields to extend.
337
- * @param typeOverrides An optional mapping of DuckDB column types to override.
338
- * @returns An array of fields with the DuckDB column type extended.
339
- */
340
- function extendFieldsWithDuckDBColumnType(fields, typeOverrides) {
341
- var schema = fields.reduce(function (acc, field) {
342
- acc[field.name] = fieldTypeToColumnType(field.type);
343
- return acc;
344
- }, {});
345
- var updatedFields = consolidateFieldTypes(fields, schema);
346
- updatedFields.forEach(function (field) {
347
- if (typeOverrides[field.duckDBColumnType]) {
348
- field.duckDBColumnType = typeOverrides[field.duckDBColumnType];
349
- }
350
- });
351
- return updatedFields;
352
- }
353
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2VvanNvbk5vcm1hbGl6ZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvbW1vblV0aWxzIiwiX2NvbnN0YW50cyIsIl9wcm9jZXNzb3JzIiwiX3V0aWxzIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJvd25LZXlzIiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiQ1NWX05VTExTIiwiZXhwb3J0cyIsIkNPTFVNTl9UWVBFUyIsIkNPTFVNTl9UWVBFU19QUklPUklUSUVTIiwiY29sdW1uVHlwZVRvRmllbGRUeXBlIiwiY29sdW1uVHlwZSIsIkJPT0xFQU4iLCJBTExfRklFTERfVFlQRVMiLCJEQVRFIiwiZGF0ZSIsIklOVEVHRVIiLCJpbnRlZ2VyIiwiRkxPQVQiLCJyZWFsIiwiVkFSQ0hBUiIsInN0cmluZyIsIlRJTUVTVEFNUCIsInRpbWVzdGFtcCIsIkdFT01FVFJZIiwiZ2VvanNvbiIsImNvbnNvbGUiLCJ3YXJuIiwiY29uY2F0IiwiZmllbGRUeXBlVG9Db2x1bW5UeXBlIiwiZmllbGRUeXBlIiwicHJvY2Vzc0tlcGxlcmdsSlNPTmZvckR1Y2tEYiIsIl94IiwiX3Byb2Nlc3NLZXBsZXJnbEpTT05mb3JEdWNrRGIiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImtlcGxlckpzb24iLCJyZXMiLCJkYXRhc2V0cyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiX2xvb3AyIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQyIiwicHJldiIsInByb2Nlc3NLZXBsZXJnbEpTT04iLCJkYXRhc2V0Iiwicm93c0FsbCIsImZpZWxkc0FsbCIsImhlYWRlciIsInNhbXBsZSIsInNjaGVtYSIsImZpZWxkc1VwZCIsIl9sb29wMiQiLCJfY29udGV4dCIsImRhdGEiLCJyb3dzIiwiZmllbGRzIiwibWFwIiwiZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emUiLCJzbmlmZkNzdlNjaGVtYSIsInQwIiwic2VudCIsInJlZHVjZSIsImFjYyIsImZpZWxkIiwidHlwZSIsImNvbnNvbGlkYXRlRmllbGRUeXBlcyIsImkiLCJzdG9wIiwiZGVsZWdhdGVZaWVsZCIsInQxIiwiZmluaXNoIiwiYWJydXB0IiwicHJvY2Vzc0NzdlJvd09iamVjdCIsIl94MiIsIl9wcm9jZXNzQ3N2Um93T2JqZWN0IiwiX2NhbGxlZTIiLCJyYXdEYXRhIiwiZmllbGRzV0FuYWx5emVyVHlwZSIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MyIsImNsZWFuVXBGYWxzeUNzdlZhbHVlIiwiZ2V0RmllbGRzRnJvbURhdGEiLCJyZSIsIlJlZ0V4cCIsIl9sb29wIiwia2V5IiwibWF0Y2giLCJjb2x1bW5OYW1lIiwiZGV0ZWN0ZWRDb2x1bW5UeXBlIiwiZHVja0RCQ29sdW1uVHlwZSIsInRvQ1NWUm93Iiwicm93IiwiclRvU3RyIiwibm90TnVsbG9yVW5kZWZpbmVkIiwiU3RyaW5nIiwicmVwbGFjZSIsImluY2x1ZGVzIiwiam9pbiIsIl94MyIsIl9zbmlmZkNzdlNjaGVtYSIsIl9jYWxsZWUzIiwiaGVhZGVyUm93IiwiY3N2Q29udGVudCIsImRiIiwiYyIsImZpbGVOYW1lIiwicmVzdWx0Iiwic2NoZW1hUmVzdWx0IiwiY29sdW1ucyIsIl9jYWxsZWUzJCIsIl9jb250ZXh0NCIsImFjY3UiLCJ2YWx1ZXMiLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsImRhdGFiYXNlIiwiZXJyb3IiLCJjb25uZWN0IiwiZ2VuZXJhdGVIYXNoSWQiLCJyZWdpc3RlckZpbGVUZXh0IiwicXVlcnkiLCJ0b0FycmF5IiwidG9KU09OIiwiQ29sdW1ucyIsImdldCIsInByb2Nlc3NHZW9qc29uIiwibm9ybWFsaXplZEdlb2pzb24iLCJub3JtYWxpemUiLCJmZWF0dXJlcyIsIkVycm9yIiwiR1VJREVTX0ZJTEVfRk9STUFUX0RPQyIsImV4dGVuZEZpZWxkc1dpdGhEdWNrREJDb2x1bW5UeXBlIiwidHlwZU92ZXJyaWRlcyIsInVwZGF0ZWRGaWVsZHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvY2Vzc29ycy9kYXRhLXByb2Nlc3Nvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgKiBhcyBhcnJvdyBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0IG5vcm1hbGl6ZSBmcm9tICdAbWFwYm94L2dlb2pzb24tbm9ybWFsaXplJztcblxuaW1wb3J0IHtcbiAgZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emUsXG4gIGdldEZpZWxkc0Zyb21EYXRhLFxuICBnZW5lcmF0ZUhhc2hJZCxcbiAgbm90TnVsbG9yVW5kZWZpbmVkXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbmltcG9ydCB7UHJvdG9EYXRhc2V0RmllbGR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIEdVSURFU19GSUxFX0ZPUk1BVF9ET0N9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7cHJvY2Vzc0tlcGxlcmdsSlNPTn0gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB7Z2V0QXBwbGljYXRpb25Db25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgQ1NWX05VTExTID0gL14obnVsbHxOVUxMfE51bGx8TmFOfFxcL058fCkkLztcblxudHlwZSBSb3dzQXNBcnJheSA9IGFueVtdW107XG50eXBlIFJvd3NBc09iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG50eXBlIFJvd0RhdGEgPSBSb3dzQXNBcnJheSB8IFJvd3NBc09iamVjdDtcblxuZXhwb3J0IHR5cGUgUHJvY2Vzc29yUmVzdWx0ID0ge1xuICBjb2xzPzogYXJyb3cuVmVjdG9yW107XG4gIHJvd3M6IFJvd0RhdGE7XG4gIGZpZWxkczogUHJvdG9EYXRhc2V0RmllbGRbXTtcbn07XG5cbmVudW0gQ09MVU1OX1RZUEVTIHtcbiAgR0VPTUVUUlkgPSAnR0VPTUVUUlknLFxuICBCT09MRUFOID0gJ0JPT0xFQU4nLFxuICBJTlRFR0VSID0gJ0lOVEVHRVInLFxuICBGTE9BVCA9ICdGTE9BVCcsXG4gIFRJTUUgPSAnVElNRScsXG4gIERBVEUgPSAnREFURScsXG4gIFRJTUVTVEFNUCA9ICdUSU1FU1RBTVAnLFxuICBWQVJDSEFSID0gJ1ZBUkNIQVInXG59XG4vLyBodHRwczovL2R1Y2tkYi5vcmcvZG9jcy9kYXRhL2Nzdi9hdXRvX2RldGVjdGlvbi5odG1sI3R5cGUtZGV0ZWN0aW9uXG5leHBvcnQgY29uc3QgQ09MVU1OX1RZUEVTX1BSSU9SSVRJRVMgPSBbXG4gICdHRU9NRVRSWScsXG4gICdCT09MRUFOJyxcbiAgJ0lOVEVHRVInLFxuICAnRkxPQVQnLFxuICAnVElNRScsXG4gICdEQVRFJyxcbiAgJ1RJTUVTVEFNUCcsXG4gICdWQVJDSEFSJ1xuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbHVtblR5cGVUb0ZpZWxkVHlwZShjb2x1bW5UeXBlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgc3dpdGNoIChjb2x1bW5UeXBlKSB7XG4gICAgY2FzZSBDT0xVTU5fVFlQRVMuQk9PTEVBTjpcbiAgICAgIHJldHVybiBBTExfRklFTERfVFlQRVMuYm9vbGVhbjtcbiAgICBjYXNlIENPTFVNTl9UWVBFUy5EQVRFOlxuICAgICAgcmV0dXJuIEFMTF9GSUVMRF9UWVBFUy5kYXRlO1xuICAgIGNhc2UgQ09MVU1OX1RZUEVTLklOVEVHRVI6XG4gICAgICByZXR1cm4gQUxMX0ZJRUxEX1RZUEVTLmludGVnZXI7XG4gICAgY2FzZSBDT0xVTU5fVFlQRVMuRkxPQVQ6XG4gICAgICByZXR1cm4gQUxMX0ZJRUxEX1RZUEVTLnJlYWw7XG4gICAgY2FzZSBDT0xVTU5fVFlQRVMuVkFSQ0hBUjpcbiAgICAgIHJldHVybiBBTExfRklFTERfVFlQRVMuc3RyaW5nO1xuICAgIGNhc2UgQ09MVU1OX1RZUEVTLlRJTUVTVEFNUDpcbiAgICAgIHJldHVybiBBTExfRklFTERfVFlQRVMudGltZXN0YW1wO1xuICAgIGNhc2UgQ09MVU1OX1RZUEVTLkdFT01FVFJZOlxuICAgICAgcmV0dXJuIEFMTF9GSUVMRF9UWVBFUy5nZW9qc29uO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBpcyB0aGVyZSBhbnkgb3RoZXIgdHlwZSB3ZSBkaWRuJ3QgY292ZXI/XG4gICAgICBjb25zb2xlLndhcm4oYFVuc3VwcG9ydGVkIER1Y2tEQiBDb2x1bW4gdHlwZTogJHtjb2x1bW5UeXBlfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkVHlwZVRvQ29sdW1uVHlwZShmaWVsZFR5cGU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmJvb2xlYW46XG4gICAgICByZXR1cm4gQ09MVU1OX1RZUEVTLkJPT0xFQU47XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMuZGF0ZTpcbiAgICAgIHJldHVybiBDT0xVTU5fVFlQRVMuREFURTtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyOlxuICAgICAgcmV0dXJuIENPTFVNTl9UWVBFUy5JTlRFR0VSO1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnJlYWw6XG4gICAgICByZXR1cm4gQ09MVU1OX1RZUEVTLkZMT0FUO1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZzpcbiAgICAgIHJldHVybiBDT0xVTU5fVFlQRVMuVkFSQ0hBUjtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXA6XG4gICAgICByZXR1cm4gQ09MVU1OX1RZUEVTLlRJTUVTVEFNUDtcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5nZW9qc29uOlxuICAgICAgcmV0dXJuIENPTFVNTl9UWVBFUy5HRU9NRVRSWTtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gaXMgdGhlcmUgYW55IG90aGVyIHR5cGUgd2UgZGlkbid0IGNvdmVyP1xuICAgICAgY29uc29sZS53YXJuKGBVbnN1cHBvcnRlZCBGaWVsZCB0eXBlIGZvciBEdWNrRGI6ICR7ZmllbGRUeXBlfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLypcbiAqIFByb2Nlc3MgdXBsb2FkZWQgZXhwb3J0ZWQgS2VwbGVyZ2wganNvbiBtYXAuXG4gKiBXZSBuZWVkIHRvIHBvcHVsYXRlIGZpZWxkIHdpdGggcHJvcGVyIER1Y2tEYiBjb21wYXRpYmxlIHR5cGUuXG4gKi9cbi8vIFRPRE86IG1lcmdlIHdpdGggbG9naWMgZnJvbSBwcm9jZXNzQ3N2Um93T2JqZWN0LiBEaWZmZXJlbnQgZm9ybWF0czogW1tdXSB2cyBbe31dXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0tlcGxlcmdsSlNPTmZvckR1Y2tEYihcbiAga2VwbGVySnNvblxuKTogUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBwcm9jZXNzS2VwbGVyZ2xKU09OPj4ge1xuICBjb25zdCByZXMgPSBwcm9jZXNzS2VwbGVyZ2xKU09OKGtlcGxlckpzb24pO1xuXG4gIGNvbnN0IGRhdGFzZXRzID0gcmVzPy5kYXRhc2V0cyB8fCBbXTtcbiAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzKSB7XG4gICAgY29uc3Qgcm93c0FsbCA9IGRhdGFzZXQuZGF0YS5yb3dzO1xuICAgIGNvbnN0IGZpZWxkc0FsbCA9IGRhdGFzZXQuZGF0YS5maWVsZHM7XG5cbiAgICBjb25zdCBoZWFkZXIgPSBmaWVsZHNBbGwubWFwKGYgPT4gZi5uYW1lKTtcbiAgICBjb25zdCBzYW1wbGUgPSBnZXRTYW1wbGVGb3JUeXBlQW5hbHl6ZSh7ZmllbGRzOiBoZWFkZXIsIHJvd3M6IHJvd3NBbGx9KTtcblxuICAgIGNvbnN0IHNjaGVtYSA9XG4gICAgICBzYW1wbGUubGVuZ3RoID4gMFxuICAgICAgICA/IGF3YWl0IHNuaWZmQ3N2U2NoZW1hKHNhbXBsZSlcbiAgICAgICAgOiBmaWVsZHNBbGwucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBhY2NbZmllbGQubmFtZV0gPSBmaWVsZFR5cGVUb0NvbHVtblR5cGUoZmllbGQudHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIHt9KTtcbiAgICBjb25zdCBmaWVsZHNVcGQgPSBjb25zb2xpZGF0ZUZpZWxkVHlwZXMoZGF0YXNldC5kYXRhLmZpZWxkcywgc2NoZW1hKTtcblxuICAgIGRhdGFzZXQuZGF0YS5maWVsZHMgPSBmaWVsZHNBbGwubWFwKChmLCBpKSA9PiB7XG4gICAgICByZXR1cm4gey4uLmZpZWxkc1VwZFtpXSwgLi4uZn07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG4vKlxuICogUHJvY2VzcyB1cGxvYWRlZCBjc3YgcmV0dXJuZWQgYnkgbG9hZGVycy5nbCBhcyByb3cgb2JqZWN0IGFuZCBzdHJpbmcgdmFsdWVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDc3ZSb3dPYmplY3QoXG4gIHJhd0RhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+W11cbik6IFByb21pc2U8UHJvY2Vzc29yUmVzdWx0PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyYXdEYXRhKSB8fCAhcmF3RGF0YS5sZW5ndGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiBbXSxcbiAgICAgIHJvd3M6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGhlYWRlciA9IE9iamVjdC5rZXlzKHJhd0RhdGFbMF0pOyAvLyBbbGF0LCBsbmcsIHZhbHVlXVxuXG4gIC8vIHJvdyBvYmplY3QgY2FuIHN0aWxsIGNvbnRhaW4gdmFsdWVzIGxpa2UgYE51bGxgIG9yIGBOL0FgXG4gIGNsZWFuVXBGYWxzeUNzdlZhbHVlKHJhd0RhdGEpO1xuICBjb25zdCBzYW1wbGUgPSBnZXRTYW1wbGVGb3JUeXBlQW5hbHl6ZSh7ZmllbGRzOiBoZWFkZXIsIHJvd3M6IHJhd0RhdGF9KTtcbiAgLy8gYWRkIHNhbXBsZSBkYXRhIHRvIGR1Y2tkYiBhbmQgZ2V0IHNjaGVtYVxuICBjb25zdCBzY2hlbWEgPSBhd2FpdCBzbmlmZkNzdlNjaGVtYShzYW1wbGUpO1xuXG4gIGNvbnN0IGZpZWxkc1dBbmFseXplclR5cGUgPSBnZXRGaWVsZHNGcm9tRGF0YShzYW1wbGUsIGhlYWRlcik7XG5cbiAgY29uc3QgZmllbGRzID0gY29uc29saWRhdGVGaWVsZFR5cGVzKGZpZWxkc1dBbmFseXplclR5cGUsIHNjaGVtYSk7XG5cbiAgcmV0dXJuIHtyb3dzOiByYXdEYXRhLCBmaWVsZHN9O1xufVxuXG5mdW5jdGlvbiBjbGVhblVwRmFsc3lDc3ZWYWx1ZShyb3dzOiBSb3dEYXRhKTogdm9pZCB7XG4gIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChDU1ZfTlVMTFMsICdnJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIE9iamVjdC5rZXlzKHJvd3NbaV0pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIC8vIGhlcmUgd2UgcGFyc2UgZW1wdHkgZGF0YSBhcyBudWxsXG4gICAgICBpZiAodHlwZW9mIHJvd3NbaV1ba2V5XSA9PT0gJ3N0cmluZycgJiYgKHJvd3NbaV1ba2V5XSBhcyBzdHJpbmcpLm1hdGNoKHJlKSkge1xuICAgICAgICByb3dzW2ldW2tleV0gPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8vIGFsaWduIHR5cGUgYW5hbHl6ZXIgdHlwZXMgd2l0aCBEdWNrREIgY3N2IGF1dG8gZGV0ZWN0ZWQgY29sdW1uIHR5cGVzXG5leHBvcnQgZnVuY3Rpb24gY29uc29saWRhdGVGaWVsZFR5cGVzKGZpZWxkcywgc2NoZW1hKSB7XG4gIHJldHVybiBmaWVsZHMubWFwKGZpZWxkID0+IHtcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gZmllbGQubmFtZTtcblxuICAgIGNvbnN0IGRldGVjdGVkQ29sdW1uVHlwZSA9IHNjaGVtYVtjb2x1bW5OYW1lXTtcblxuICAgIC8vIFRPRE8gY29sdW1uVHlwZVRvRmllbGRUeXBlIHRyYW5mb3JtcyBkZXRlY3RlZCB0aW1lc3RhbXBzIHRvIHN0cmluZyxcbiAgICAvLyBjb21wbGV0ZWx5IGJyZWFraW5nIHRpbWUgZmlsdGVyIGxvZ2ljLlxuICAgIC8vIGNvbnN0IGZpZWxkVHlwZSA9IGNvbHVtblR5cGVUb0ZpZWxkVHlwZShkZXRlY3RlZENvbHVtblR5cGUpIHx8IGZpZWxkLnR5cGU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmllbGQsXG4gICAgICAvLyB0eXBlOiBmaWVsZFR5cGUsXG4gICAgICBkdWNrREJDb2x1bW5UeXBlOiBkZXRlY3RlZENvbHVtblR5cGVcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9DU1ZSb3cocm93OiB1bmtub3duW10pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cm93XG4gICAgLm1hcChyID0+IHtcbiAgICAgIGNvbnN0IHJUb1N0ciA9IG5vdE51bGxvclVuZGVmaW5lZChyKSA/IFN0cmluZyhyKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykgOiAnJztcbiAgICAgIHJldHVybiByVG9TdHIuaW5jbHVkZXMoJywnKSA/IGBcIiR7clRvU3RyfVwiYCA6IHJUb1N0cjtcbiAgICB9KVxuICAgIC5qb2luKCcsJyl9XFxuYDtcbn1cblxuLy8gVXNlIER1Y2NrREIgdG8gZGV0ZWN0IGNzdiBjb2x1bW4gc2NoZW1hXG5hc3luYyBmdW5jdGlvbiBzbmlmZkNzdlNjaGVtYShzYW1wbGU6IFJvd0RhdGEpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHNhbXBsZSkgfHwgc2FtcGxlLmxlbmd0aCA8IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaGVhZGVyUm93ID0gdG9DU1ZSb3coT2JqZWN0LmtleXMoc2FtcGxlWzBdKSk7XG5cbiAgY29uc3QgY3N2Q29udGVudCA9IChzYW1wbGUgYXMgKGFueVtdIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW10pLnJlZHVjZShcbiAgICAoYWNjdTogc3RyaW5nLCByb3cpID0+IGAke2FjY3V9JHt0b0NTVlJvdyhPYmplY3QudmFsdWVzKHJvdykpfWAsXG4gICAgaGVhZGVyUm93XG4gICk7XG5cbiAgY29uc3QgZGIgPSBnZXRBcHBsaWNhdGlvbkNvbmZpZygpLmRhdGFiYXNlO1xuICBpZiAoIWRiKSB7XG4gICAgY29uc29sZS5lcnJvcignVGhlIGRhdGFiYXNlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjID0gYXdhaXQgZGIuY29ubmVjdCgpO1xuXG4gIGNvbnN0IGZpbGVOYW1lID0gZ2VuZXJhdGVIYXNoSWQoKTtcbiAgYXdhaXQgZGIucmVnaXN0ZXJGaWxlVGV4dChgJHtmaWxlTmFtZX0tJHtnZW5lcmF0ZUhhc2hJZH0uY3N2YCwgY3N2Q29udGVudCk7XG5cbiAgLy8gaHR0cHM6Ly9kdWNrZGIub3JnL2RvY3MvZGF0YS9jc3YvYXV0b19kZXRlY3Rpb24uaHRtbFxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjLnF1ZXJ5KGBcbiAgICAgICAgRlJPTSBzbmlmZl9jc3YoJyR7ZmlsZU5hbWV9LSR7Z2VuZXJhdGVIYXNoSWR9LmNzdicsIFxuICAgICAgICBzYW1wbGVfc2l6ZSA9IDUwMCxcbiAgICAgICAgYXV0b190eXBlX2NhbmRpZGF0ZXMgPSBbJ0ZMT0FUJywgJ0lOVEVHRVInLCAnVElNRVNUQU1QJywgJ0RBVEUnLCAnVElNRScsICdWQVJDSEFSJywgJ0JPT0xFQU4nXSk7XG4gICAgYCk7XG5cbiAgY29uc3Qgc2NoZW1hUmVzdWx0ID0gcmVzdWx0LnRvQXJyYXkoKS5tYXAocm93ID0+IHJvdy50b0pTT04oKSk7XG5cbiAgY29uc3QgY29sdW1ucyA9IHNjaGVtYVJlc3VsdFswXS5Db2x1bW5zO1xuICBjb25zdCBzY2hlbWEgPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgc2NoZW1hW2NvbHVtbnMuZ2V0KGkpLm5hbWVdID0gY29sdW1ucy5nZXQoaSkudHlwZTtcbiAgfVxuXG4gIHJldHVybiBzY2hlbWE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzR2VvanNvbihyYXdEYXRhOiB1bmtub3duKTogUHJvY2Vzc29yUmVzdWx0IHtcbiAgY29uc3Qgbm9ybWFsaXplZEdlb2pzb24gPSBub3JtYWxpemUocmF3RGF0YSk7XG5cbiAgaWYgKCFub3JtYWxpemVkR2VvanNvbiB8fCAhQXJyYXkuaXNBcnJheShub3JtYWxpemVkR2VvanNvbi5mZWF0dXJlcykpIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgIGBSZWFkIEZpbGUgRmFpbGVkOiBGaWxlIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04uIFJlYWQgbW9yZSBhYm91dCBbc3VwcG9ydGVkIGZpbGUgZm9ybWF0XSgke0dVSURFU19GSUxFX0ZPUk1BVF9ET0N9KWBcbiAgICApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBEb24ndCBwYXNzIGVtcHR5IGZpZWxkcywgYXMgZHVjayBkYiBvdXRwdXRzIGFuIGVtcHR5IGRhdGFzZXRcbiAgcmV0dXJuIHtcbiAgICByb3dzOiBub3JtYWxpemVkR2VvanNvblxuICAgIC8vIFRPRE8gZ2V0IGZpZWxkcyB0byBwcmVzZXJ2ZSBmaWVsZCBuYW1lcz9cbiAgICAvLyBmaWVsZHM6IFtdXG4gIH07XG59XG5cbi8qKlxuICogQSB1dGlsaXR5IGZ1bmN0aW9uIHRvIGV4dGVuZCBleGlzdGluZyBmaWVsZHMgd2l0aCBuYXRpdmUgRHVja0RCIGNvbHVtbiB0eXBlLlxuICogQHBhcmFtIGZpZWxkcyBBcnJheSBvZiBmaWVsZHMgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHR5cGVPdmVycmlkZXMgQW4gb3B0aW9uYWwgbWFwcGluZyBvZiBEdWNrREIgY29sdW1uIHR5cGVzIHRvIG92ZXJyaWRlLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZmllbGRzIHdpdGggdGhlIER1Y2tEQiBjb2x1bW4gdHlwZSBleHRlbmRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEZpZWxkc1dpdGhEdWNrREJDb2x1bW5UeXBlKFxuICBmaWVsZHM6IFByb3RvRGF0YXNldEZpZWxkW10sXG4gIHR5cGVPdmVycmlkZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbik6IFByb21pc2U8UHJvdG9EYXRhc2V0RmllbGRbXT4ge1xuICBjb25zdCBzY2hlbWEgPSBmaWVsZHMucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgYWNjW2ZpZWxkLm5hbWVdID0gZmllbGRUeXBlVG9Db2x1bW5UeXBlKGZpZWxkLnR5cGUpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcblxuICBjb25zdCB1cGRhdGVkRmllbGRzID0gY29uc29saWRhdGVGaWVsZFR5cGVzKGZpZWxkcywgc2NoZW1hKTtcbiAgdXBkYXRlZEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICBpZiAodHlwZU92ZXJyaWRlc1tmaWVsZC5kdWNrREJDb2x1bW5UeXBlXSkge1xuICAgICAgZmllbGQuZHVja0RCQ29sdW1uVHlwZSA9IHR5cGVPdmVycmlkZXNbZmllbGQuZHVja0RCQ29sdW1uVHlwZV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHVwZGF0ZWRGaWVsZHM7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQU9BLElBQUFFLFVBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUFzRCxTQUFBSywyQkFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEseUJBQUFDLE1BQUEsSUFBQUgsQ0FBQSxDQUFBRyxNQUFBLENBQUFDLFFBQUEsS0FBQUosQ0FBQSxxQkFBQUUsQ0FBQSxRQUFBRyxLQUFBLENBQUFDLE9BQUEsQ0FBQU4sQ0FBQSxNQUFBRSxDQUFBLEdBQUFLLDJCQUFBLENBQUFQLENBQUEsTUFBQUMsQ0FBQSxJQUFBRCxDQUFBLHVCQUFBQSxDQUFBLENBQUFRLE1BQUEsSUFBQU4sQ0FBQSxLQUFBRixDQUFBLEdBQUFFLENBQUEsT0FBQU8sRUFBQSxNQUFBQyxDQUFBLFlBQUFBLEVBQUEsZUFBQUMsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUEsRUFBQSxXQUFBSCxFQUFBLElBQUFULENBQUEsQ0FBQVEsTUFBQSxLQUFBSyxJQUFBLFdBQUFBLElBQUEsTUFBQUMsS0FBQSxFQUFBZCxDQUFBLENBQUFTLEVBQUEsVUFBQVIsQ0FBQSxXQUFBQSxFQUFBRCxDQUFBLFVBQUFBLENBQUEsS0FBQWUsQ0FBQSxFQUFBTCxDQUFBLGdCQUFBTSxTQUFBLGlKQUFBQyxDQUFBLEVBQUFDLENBQUEsT0FBQUMsQ0FBQSxnQkFBQVIsQ0FBQSxX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