@kepler.gl/reducers 3.3.0-alpha.1 → 3.3.0-alpha.11

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 (86) hide show
  1. package/dist/cjs/combined-updaters.js +491 -0
  2. package/dist/cjs/composer-helpers.js +101 -0
  3. package/dist/cjs/composers.js +22 -0
  4. package/dist/cjs/core.js +105 -0
  5. package/dist/cjs/data-utils.js +53 -0
  6. package/dist/cjs/export-utils.js +91 -0
  7. package/dist/{index.js → cjs/index.js} +2 -3
  8. package/dist/cjs/interaction-utils.js +115 -0
  9. package/dist/cjs/layer-utils.js +635 -0
  10. package/dist/cjs/map-state-updaters.js +658 -0
  11. package/dist/cjs/map-state.js +35 -0
  12. package/dist/cjs/map-style-updaters.js +659 -0
  13. package/dist/cjs/map-style.js +33 -0
  14. package/dist/cjs/merger-handler.js +105 -0
  15. package/dist/cjs/middleware.js +25 -0
  16. package/dist/cjs/provider-state-updaters.js +464 -0
  17. package/dist/cjs/provider-state.js +34 -0
  18. package/dist/cjs/root.js +207 -0
  19. package/dist/cjs/ui-state-updaters.js +922 -0
  20. package/dist/cjs/ui-state.js +36 -0
  21. package/dist/cjs/vis-state-merger.js +1215 -0
  22. package/dist/cjs/vis-state-selectors.js +48 -0
  23. package/dist/cjs/vis-state-updaters.js +5150 -0
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/combined-updaters.d.ts +19 -2
  26. package/dist/composers.d.ts +2 -0
  27. package/dist/esm/combined-updaters.js +484 -0
  28. package/dist/esm/composer-helpers.js +85 -0
  29. package/dist/esm/composers.js +14 -0
  30. package/dist/esm/core.js +101 -0
  31. package/dist/esm/data-utils.js +47 -0
  32. package/dist/esm/export-utils.js +86 -0
  33. package/dist/esm/index.js +62 -0
  34. package/dist/esm/interaction-utils.js +106 -0
  35. package/dist/esm/layer-utils.js +602 -0
  36. package/dist/esm/map-state-updaters.js +650 -0
  37. package/dist/esm/map-state.js +29 -0
  38. package/dist/esm/map-style-updaters.js +652 -0
  39. package/dist/esm/map-style.js +27 -0
  40. package/dist/esm/merger-handler.js +96 -0
  41. package/dist/esm/middleware.js +17 -0
  42. package/dist/esm/provider-state-updaters.js +458 -0
  43. package/dist/esm/provider-state.js +28 -0
  44. package/dist/esm/root.js +201 -0
  45. package/dist/esm/ui-state-updaters.js +917 -0
  46. package/dist/esm/ui-state.js +30 -0
  47. package/dist/esm/vis-state-merger.js +1182 -0
  48. package/dist/esm/vis-state-selectors.js +42 -0
  49. package/dist/esm/vis-state-updaters.js +5057 -0
  50. package/dist/esm/vis-state.js +29 -0
  51. package/dist/interaction-utils.d.ts +1 -1
  52. package/dist/layer-utils.d.ts +23 -5
  53. package/dist/map-state-updaters.d.ts +26 -21
  54. package/dist/map-state.d.ts +2 -78
  55. package/dist/map-style-updaters.d.ts +1 -3
  56. package/dist/middleware.d.ts +2 -2
  57. package/dist/root.d.ts +1 -1
  58. package/dist/ui-state-updaters.d.ts +17 -2
  59. package/dist/vis-state-merger.d.ts +7 -0
  60. package/dist/vis-state-selectors.d.ts +88 -5
  61. package/dist/vis-state-updaters.d.ts +127 -4
  62. package/dist/vis-state.d.ts +8 -4
  63. package/package.json +37 -32
  64. package/dist/combined-updaters.js +0 -363
  65. package/dist/composer-helpers.js +0 -101
  66. package/dist/composers.js +0 -23
  67. package/dist/core.js +0 -105
  68. package/dist/data-utils.js +0 -53
  69. package/dist/export-utils.js +0 -91
  70. package/dist/interaction-utils.js +0 -105
  71. package/dist/layer-utils.js +0 -376
  72. package/dist/map-state-updaters.js +0 -438
  73. package/dist/map-state.js +0 -35
  74. package/dist/map-style-updaters.js +0 -661
  75. package/dist/map-style.js +0 -34
  76. package/dist/merger-handler.js +0 -105
  77. package/dist/middleware.js +0 -27
  78. package/dist/provider-state-updaters.js +0 -466
  79. package/dist/provider-state.js +0 -35
  80. package/dist/root.js +0 -207
  81. package/dist/ui-state-updaters.js +0 -887
  82. package/dist/ui-state.js +0 -37
  83. package/dist/vis-state-merger.js +0 -1032
  84. package/dist/vis-state-selectors.js +0 -30
  85. package/dist/vis-state-updaters.js +0 -3859
  86. package/dist/vis-state.js +0 -36
@@ -0,0 +1,1182 @@
1
+ import _typeof from "@babel/runtime/helpers/esm/typeof";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
4
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
5
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
6
+ var _excluded = ["enabled"];
7
+ 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; } } }; }
8
+ 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; } }
9
+ 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; }
10
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
11
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
12
+ 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; }
13
+ 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) { _defineProperty(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; }
14
+ // SPDX-License-Identifier: MIT
15
+ // Copyright contributors to the kepler.gl project
16
+
17
+ import uniq from 'es-toolkit/compat/uniq';
18
+ import pick from 'es-toolkit/compat/pick';
19
+ import flattenDeep from 'es-toolkit/compat/flattenDeep';
20
+ import deepmerge from 'deepmerge';
21
+ import { arrayInsert, getInitialMapLayersForSplitMap, applyFiltersToDatasets, validateFiltersUpdateDatasets, findById, aggregate, isPlainObject } from '@kepler.gl/utils';
22
+ import { createEffect } from '@kepler.gl/effects';
23
+ import { notNullorUndefined } from '@kepler.gl/common-utils';
24
+ import { AGGREGATION_TYPES, LAYER_BLENDINGS, OVERLAY_BLENDINGS, isAnnotationKind, INITIAL_ANNOTATION_LINE_COLOR, INITIAL_ANNOTATION_LINE_WIDTH } from '@kepler.gl/constants';
25
+ import { CURRENT_VERSION } from '@kepler.gl/schemas';
26
+ import { assignGpuChannels, resetFilterGpuMode } from '@kepler.gl/table';
27
+ import { getLayerOrderFromLayers } from './layer-utils';
28
+
29
+ /**
30
+ * Merge loaded filters with current state, if no fields or data are loaded
31
+ * save it for later
32
+ *
33
+ */
34
+ export function mergeFilters(state, filtersToMerge, fromConfig) {
35
+ var preserveFilterOrder = fromConfig ? filtersToMerge === null || filtersToMerge === void 0 ? void 0 : filtersToMerge.map(function (l) {
36
+ return l.id;
37
+ }) : state.preserveFilterOrder;
38
+ if (!Array.isArray(filtersToMerge) || !filtersToMerge.length) {
39
+ return state;
40
+ }
41
+ var _validateFiltersUpdat = validateFiltersUpdateDatasets(state, filtersToMerge),
42
+ validated = _validateFiltersUpdat.validated,
43
+ failed = _validateFiltersUpdat.failed,
44
+ updatedDatasets = _validateFiltersUpdat.updatedDatasets;
45
+ var updatedFilters = insertItemBasedOnPreservedOrder(state.filters, validated, preserveFilterOrder);
46
+
47
+ // merge filter with existing
48
+ updatedFilters = resetFilterGpuMode(updatedFilters);
49
+ updatedFilters = assignGpuChannels(updatedFilters);
50
+ // filter data
51
+ var datasetsToFilter = uniq(flattenDeep(validated.map(function (f) {
52
+ return f.dataId;
53
+ })));
54
+ var filtered = applyFiltersToDatasets(datasetsToFilter, updatedDatasets, updatedFilters, state.layers);
55
+ return _objectSpread(_objectSpread({}, state), {}, {
56
+ filters: updatedFilters,
57
+ datasets: filtered,
58
+ preserveFilterOrder: preserveFilterOrder,
59
+ filterToBeMerged: [].concat(_toConsumableArray(state.filterToBeMerged), _toConsumableArray(failed))
60
+ });
61
+ }
62
+
63
+ // replace dataId in saved Filter
64
+ export function replaceFilterDatasetIds(savedFilter, dataId, dataIdToUse) {
65
+ var replaced = [];
66
+ savedFilter.forEach(function (filter) {
67
+ if (filter.dataId.includes(dataId)) {
68
+ var _filter$plotType;
69
+ var newDataId = filter.dataId.map(function (d) {
70
+ return d === dataId ? dataIdToUse : d;
71
+ });
72
+ var plotType;
73
+ // TODO: more generic approach to save plotType.colorsByDataId
74
+ if ((_filter$plotType = filter.plotType) !== null && _filter$plotType !== void 0 && (_filter$plotType = _filter$plotType.colorsByDataId) !== null && _filter$plotType !== void 0 && _filter$plotType[dataId]) {
75
+ var _filter$plotType2;
76
+ // replace colorByDataId in filter.plotType
77
+ var _ref = ((_filter$plotType2 = filter.plotType) === null || _filter$plotType2 === void 0 ? void 0 : _filter$plotType2.colorsByDataId) || {},
78
+ color = _ref[dataId],
79
+ rest = _objectWithoutProperties(_ref, [dataId].map(_toPropertyKey));
80
+ plotType = _objectSpread(_objectSpread({}, filter.plotType), {}, {
81
+ colorsByDataId: _objectSpread(_objectSpread({}, rest), {}, _defineProperty({}, dataIdToUse, color))
82
+ });
83
+ }
84
+ replaced.push(_objectSpread(_objectSpread({}, filter), {}, {
85
+ dataId: newDataId
86
+ }, plotType ? {
87
+ plotType: plotType
88
+ } : {}));
89
+ }
90
+ });
91
+ return replaced.length ? replaced : null;
92
+ }
93
+ export function isSavedLayerConfigV1(layerConfig) {
94
+ // exported layer configuration contains visualChannels property
95
+ return layerConfig === null || layerConfig === void 0 ? void 0 : layerConfig.visualChannels;
96
+ }
97
+ export function parseLayerConfig(schema, layerConfig) {
98
+ var _schema$parseSavedCon;
99
+ // assume the layer config is current version
100
+ var savedConfig = {
101
+ version: CURRENT_VERSION,
102
+ config: {
103
+ visState: {
104
+ layers: [layerConfig],
105
+ layerOrder: [layerConfig.id]
106
+ }
107
+ }
108
+ };
109
+ return (_schema$parseSavedCon = schema.parseSavedConfig(savedConfig)) === null || _schema$parseSavedCon === void 0 || (_schema$parseSavedCon = _schema$parseSavedCon.visState) === null || _schema$parseSavedCon === void 0 || (_schema$parseSavedCon = _schema$parseSavedCon.layers) === null || _schema$parseSavedCon === void 0 ? void 0 : _schema$parseSavedCon[0];
110
+ }
111
+ function insertItemBasedOnPreservedOrder(currentItems, items) {
112
+ var preservedOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
113
+ var defaultStart = arguments.length > 3 ? arguments[3] : undefined;
114
+ var newItems = _toConsumableArray(currentItems);
115
+ var _iterator = _createForOfIteratorHelper(items),
116
+ _step;
117
+ try {
118
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
119
+ var item = _step.value;
120
+ var expectedIdx = preservedOrder.indexOf(item.id);
121
+ // insertAt the end by default
122
+ var insertAt = defaultStart ? 0 : newItems.length;
123
+ if (expectedIdx > 0) {
124
+ // look for layer to insert after
125
+ var i = expectedIdx + 1;
126
+ var preceedIdx = -1;
127
+ var _loop = function _loop() {
128
+ // keep looking for preceed layer that is already loaded
129
+ var preceedItemId = preservedOrder[i - 1];
130
+ preceedIdx = newItems.findIndex(function (d) {
131
+ return d.id === preceedItemId;
132
+ });
133
+ };
134
+ while (i-- > 0 && preceedIdx < 0) {
135
+ _loop();
136
+ }
137
+ if (preceedIdx > -1) {
138
+ // if found
139
+ insertAt = preceedIdx + 1;
140
+ }
141
+ }
142
+ newItems = arrayInsert(newItems, insertAt, item);
143
+ }
144
+ } catch (err) {
145
+ _iterator.e(err);
146
+ } finally {
147
+ _iterator.f();
148
+ }
149
+ return newItems;
150
+ }
151
+ export function createLayerFromConfig(state, layerConfig) {
152
+ // check if the layer config is parsed
153
+ var parsedLayerConfig = isSavedLayerConfigV1(layerConfig) ? parseLayerConfig(state.schema, layerConfig) : layerConfig;
154
+ if (!parsedLayerConfig) {
155
+ return null;
156
+ }
157
+ // first validate config against dataset
158
+ var _validateLayersByData = validateLayersByDatasets(state.datasets, state.layerClasses, [parsedLayerConfig], {
159
+ allowEmptyColumn: true
160
+ }),
161
+ validated = _validateLayersByData.validated,
162
+ failed = _validateLayersByData.failed;
163
+ if (failed !== null && failed !== void 0 && failed.length || !validated.length) {
164
+ // failed
165
+ return null;
166
+ }
167
+ var newLayer = validated[0];
168
+ newLayer.updateLayerDomain(state.datasets);
169
+ return newLayer;
170
+ }
171
+
172
+ /**
173
+ * Get loaded filter from state
174
+ */
175
+ export function serializeFilter(newFilter, schema) {
176
+ var _serializedVisState$f;
177
+ var serializedVisState = serializeVisState({
178
+ filters: [newFilter]
179
+ }, schema);
180
+ return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$f = serializedVisState.filters) === null || _serializedVisState$f === void 0 ? void 0 : _serializedVisState$f[0];
181
+ }
182
+
183
+ /**
184
+ * Get loaded layer from state
185
+ */
186
+ export function serializeLayer(newLayer, schema) {
187
+ var _serializedVisState$l;
188
+ var serializedVisState = serializeVisState({
189
+ layers: [newLayer],
190
+ layerOrder: [newLayer.id]
191
+ }, schema);
192
+ return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$l = serializedVisState.layers) === null || _serializedVisState$l === void 0 ? void 0 : _serializedVisState$l[0];
193
+ }
194
+
195
+ /**
196
+ * Get loaded effect from state
197
+ */
198
+ export function serializeEffect(newEffect, schema) {
199
+ var _serializedVisState$e;
200
+ var serializedVisState = serializeVisState({
201
+ effects: [newEffect],
202
+ effectOrder: [newEffect.id]
203
+ }, schema);
204
+ return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$e = serializedVisState.effects) === null || _serializedVisState$e === void 0 ? void 0 : _serializedVisState$e[0];
205
+ }
206
+
207
+ /**
208
+ * Get vis state config
209
+ */
210
+ export function serializeVisState(visState, schema) {
211
+ var _schema$parseSavedCon2;
212
+ var savedState = schema.getConfigToSave({
213
+ visState: visState
214
+ });
215
+ return savedState ? (_schema$parseSavedCon2 = schema.parseSavedConfig(savedState)) === null || _schema$parseSavedCon2 === void 0 ? void 0 : _schema$parseSavedCon2.visState : undefined;
216
+ }
217
+ /**
218
+ * Merge layers from de-serialized state, if no fields or data are loaded
219
+ * save it for later
220
+ *
221
+ */
222
+ export function mergeLayers(state) {
223
+ var layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
224
+ var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
225
+ var preserveLayerOrder = fromConfig ? getLayerOrderFromLayers(layersToMerge) : state.preserveLayerOrder;
226
+ if (!Array.isArray(layersToMerge) || !layersToMerge.length) {
227
+ return state;
228
+ }
229
+ // don't merge layer if dataset is being merged
230
+ var unmerged = [];
231
+ var toMerge = [];
232
+ layersToMerge.forEach(function (l) {
233
+ var _l$config;
234
+ if (l !== null && l !== void 0 && (_l$config = l.config) !== null && _l$config !== void 0 && _l$config.dataId && state.isMergingDatasets[l.config.dataId]) {
235
+ unmerged.push(l);
236
+ } else {
237
+ toMerge.push(l);
238
+ }
239
+ });
240
+ var _validateLayersByData2 = validateLayersByDatasets(state.datasets, state.layerClasses, toMerge),
241
+ mergedLayer = _validateLayersByData2.validated,
242
+ failed = _validateLayersByData2.failed;
243
+ unmerged.push.apply(unmerged, _toConsumableArray(failed));
244
+ // put new layers in front of current layers
245
+ var _insertLayerAtRightOr = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder, preserveLayerOrder),
246
+ newLayerOrder = _insertLayerAtRightOr.newLayerOrder,
247
+ newLayers = _insertLayerAtRightOr.newLayers;
248
+ var mergedState = _objectSpread(_objectSpread({}, state), {}, {
249
+ layers: newLayers,
250
+ layerOrder: newLayerOrder,
251
+ preserveLayerOrder: preserveLayerOrder,
252
+ layerToBeMerged: [].concat(_toConsumableArray(state.layerToBeMerged), unmerged)
253
+ });
254
+
255
+ // Apply pending layerOrder with groups if layers are now available
256
+ if (mergedState.layerOrderToBeMerged && mergedState.layers.length > 0) {
257
+ var savedOrder = mergedState.layerOrderToBeMerged;
258
+ mergedState = mergeLayerOrder(mergedState, savedOrder);
259
+ // Keep savedLayerOrder available for future deferred layers
260
+ if (mergedState.layerToBeMerged.length > 0) {
261
+ mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
262
+ layerOrderToBeMerged: savedOrder
263
+ });
264
+ }
265
+ }
266
+ return mergedState;
267
+ }
268
+ export function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
269
+ var preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
270
+ if (!(layersToInsert !== null && layersToInsert !== void 0 && layersToInsert.length)) {
271
+ return {
272
+ newLayers: currentLayers,
273
+ newLayerOrder: currentOrder
274
+ };
275
+ }
276
+ var currentLayerQueue = currentOrder.filter(function (entry) {
277
+ return typeof entry === 'string';
278
+ }).map(function (id) {
279
+ return findById(id)(currentLayers);
280
+ }).filter(function (layer) {
281
+ return Boolean(layer);
282
+ });
283
+ var newLayers = currentLayers.concat(layersToInsert);
284
+ var newLayerOrderQueue = insertItemBasedOnPreservedOrder(currentLayerQueue, layersToInsert, preservedOrder, true);
285
+ var newFlatLayerOrder = getLayerOrderFromLayers(newLayerOrderQueue);
286
+
287
+ // If no groups exist in current order, just use the new flat order
288
+ var hasGroups = currentOrder.some(function (entry) {
289
+ return isPlainObject(entry);
290
+ });
291
+ if (!hasGroups) {
292
+ return {
293
+ newLayerOrder: newFlatLayerOrder,
294
+ newLayers: newLayers
295
+ };
296
+ }
297
+
298
+ // Rebuild layerOrder preserving groups in their relative positions.
299
+ // Replace each string entry with its updated position from newFlatLayerOrder,
300
+ // and keep groups as-is.
301
+ var existingFlatIds = new Set(currentOrder.filter(function (entry) {
302
+ return typeof entry === 'string';
303
+ }));
304
+ var newInsertedIds = newFlatLayerOrder.filter(function (id) {
305
+ return !existingFlatIds.has(id);
306
+ });
307
+
308
+ // Rebuild: walk through currentOrder, replace string entries with their
309
+ // new position equivalents from newFlatLayerOrder, then append any newly inserted layers
310
+ var result = [];
311
+ var flatQueue = _toConsumableArray(newFlatLayerOrder.filter(function (id) {
312
+ return existingFlatIds.has(id);
313
+ }));
314
+ var flatIdx = 0;
315
+ var _iterator2 = _createForOfIteratorHelper(currentOrder),
316
+ _step2;
317
+ try {
318
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
319
+ var entry = _step2.value;
320
+ if (isPlainObject(entry)) {
321
+ result.push(entry);
322
+ } else {
323
+ // Replace with corresponding entry from reordered flat list
324
+ if (flatIdx < flatQueue.length) {
325
+ result.push(flatQueue[flatIdx]);
326
+ flatIdx++;
327
+ }
328
+ }
329
+ }
330
+
331
+ // Append any newly inserted layers at the front (they are new)
332
+ } catch (err) {
333
+ _iterator2.e(err);
334
+ } finally {
335
+ _iterator2.f();
336
+ }
337
+ return {
338
+ newLayerOrder: [].concat(_toConsumableArray(newInsertedIds), result),
339
+ newLayers: newLayers
340
+ };
341
+ }
342
+
343
+ /**
344
+ * Merge saved layerOrder with current state to restore layer groups.
345
+ * Called after layers have been merged. If the saved config contains a layerOrder
346
+ * with groups, this replaces the flat layerOrder with the saved hierarchical one,
347
+ * filtering out any layer IDs that don't exist in the current state.
348
+ */
349
+ export function mergeLayerOrder(state, savedLayerOrder, fromConfig) {
350
+ if (!savedLayerOrder || !Array.isArray(savedLayerOrder) || savedLayerOrder.length === 0) {
351
+ return state;
352
+ }
353
+
354
+ // Check if the saved layerOrder contains any groups
355
+ var hasGroups = savedLayerOrder.some(function (entry) {
356
+ return isPlainObject(entry);
357
+ });
358
+ if (!hasGroups) {
359
+ // No groups - the layer merger already handled ordering via preserveLayerOrder
360
+ return state;
361
+ }
362
+
363
+ // If layers haven't been merged yet, store for later
364
+ if (state.layers.length === 0) {
365
+ return _objectSpread(_objectSpread({}, state), {}, {
366
+ layerOrderToBeMerged: savedLayerOrder
367
+ });
368
+ }
369
+
370
+ // Build a set of valid layer IDs from current state
371
+ var validLayerIds = new Set(state.layers.map(function (l) {
372
+ return l.id;
373
+ }));
374
+
375
+ // Recursively filter the saved layerOrder to only include valid layers
376
+ function filterLayerOrder(order) {
377
+ var result = [];
378
+ var _iterator3 = _createForOfIteratorHelper(order),
379
+ _step3;
380
+ try {
381
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
382
+ var entry = _step3.value;
383
+ if (isPlainObject(entry)) {
384
+ var group = entry;
385
+ var filteredGroupOrder = filterLayerOrder(group.layerOrder);
386
+ // Keep the group even if empty (user may want the empty group)
387
+ result.push(_objectSpread(_objectSpread({}, group), {}, {
388
+ layerOrder: filteredGroupOrder
389
+ }));
390
+ } else if (typeof entry === 'string' && validLayerIds.has(entry)) {
391
+ result.push(entry);
392
+ }
393
+ }
394
+ } catch (err) {
395
+ _iterator3.e(err);
396
+ } finally {
397
+ _iterator3.f();
398
+ }
399
+ return result;
400
+ }
401
+ var restoredLayerOrder = filterLayerOrder(savedLayerOrder);
402
+
403
+ // Find any layers in the current state that aren't in the restored order
404
+ // (could happen if layers were added between save and load)
405
+ var layerIdsInRestored = new Set();
406
+ function collectIds(order) {
407
+ var _iterator4 = _createForOfIteratorHelper(order),
408
+ _step4;
409
+ try {
410
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
411
+ var entry = _step4.value;
412
+ if (isPlainObject(entry)) {
413
+ collectIds(entry.layerOrder);
414
+ } else if (typeof entry === 'string') {
415
+ layerIdsInRestored.add(entry);
416
+ }
417
+ }
418
+ } catch (err) {
419
+ _iterator4.e(err);
420
+ } finally {
421
+ _iterator4.f();
422
+ }
423
+ }
424
+ collectIds(restoredLayerOrder);
425
+
426
+ // Add any missing layers at the top
427
+ var missingLayers = state.layers.filter(function (l) {
428
+ return !layerIdsInRestored.has(l.id);
429
+ }).map(function (l) {
430
+ return l.id;
431
+ });
432
+ return _objectSpread(_objectSpread({}, state), {}, {
433
+ layerOrder: [].concat(_toConsumableArray(missingLayers), _toConsumableArray(restoredLayerOrder)),
434
+ layerOrderToBeMerged: null
435
+ });
436
+ }
437
+
438
+ /**
439
+ * Merge interactions with saved config
440
+ *
441
+ */
442
+ export function mergeInteractions(state, interactionToBeMerged) {
443
+ var merged = {};
444
+ var unmerged = {};
445
+ if (interactionToBeMerged) {
446
+ Object.keys(interactionToBeMerged).forEach(function (key) {
447
+ if (!state.interactionConfig[key]) {
448
+ return;
449
+ }
450
+ var currentConfig = key === 'tooltip' || key === 'brush' || key === 'geocoder' ? state.interactionConfig[key].config : null;
451
+ var _ref2 = interactionToBeMerged[key] || {},
452
+ enabled = _ref2.enabled,
453
+ configSaved = _objectWithoutProperties(_ref2, _excluded);
454
+ var configToMerge = configSaved;
455
+ if (key === 'tooltip') {
456
+ var _mergeInteractionTool = mergeInteractionTooltipConfig(state, configSaved),
457
+ mergedTooltip = _mergeInteractionTool.mergedTooltip,
458
+ unmergedTooltip = _mergeInteractionTool.unmergedTooltip;
459
+
460
+ // merge new dataset tooltips with original dataset tooltips
461
+ configToMerge = {
462
+ fieldsToShow: _objectSpread(_objectSpread({}, currentConfig.fieldsToShow), mergedTooltip)
463
+ };
464
+ if (Object.keys(unmergedTooltip).length) {
465
+ // @ts-expect-error
466
+ unmerged.tooltip = {
467
+ fieldsToShow: unmergedTooltip,
468
+ enabled: Boolean(enabled)
469
+ };
470
+ }
471
+ }
472
+ merged[key] = _objectSpread(_objectSpread({}, state.interactionConfig[key]), {}, {
473
+ enabled: Boolean(enabled)
474
+ }, currentConfig ? {
475
+ config: pick(_objectSpread(_objectSpread({}, currentConfig), configToMerge), Object.keys(currentConfig))
476
+ } : {});
477
+ });
478
+ }
479
+ var nextState = _objectSpread(_objectSpread({}, state), {}, {
480
+ interactionConfig: _objectSpread(_objectSpread({}, state.interactionConfig), merged),
481
+ interactionToBeMerged: savedUnmergedInteraction(state, unmerged)
482
+ });
483
+ return nextState;
484
+ }
485
+ function combineInteractionConfigs(configs) {
486
+ var combined = _objectSpread({}, configs[0]);
487
+ // handle each property key of an `InteractionConfig`, e.g. tooltip, geocoder, brush, coordinate
488
+ // by combining values for each among all passed in configs
489
+ var _loop2 = function _loop2(key) {
490
+ var toBeCombinedProps = configs.map(function (c) {
491
+ return c[key];
492
+ });
493
+
494
+ // all of these have an enabled boolean
495
+ combined[key] = {
496
+ // are any of the configs' enabled values true?
497
+ enabled: toBeCombinedProps.some(function (p) {
498
+ return p === null || p === void 0 ? void 0 : p.enabled;
499
+ })
500
+ };
501
+ if (key === 'tooltip') {
502
+ // are any of the configs' compareMode values true?
503
+ combined[key].compareMode = toBeCombinedProps.some(function (p) {
504
+ return p === null || p === void 0 ? void 0 : p.compareMode;
505
+ });
506
+
507
+ // return the compare type mode, it will be either absolute or relative
508
+ combined[key].compareType = getValueWithHighestOccurrence(toBeCombinedProps.map(function (p) {
509
+ return p.compareType;
510
+ }));
511
+
512
+ // combine fieldsToShow among all dataset ids
513
+ combined[key].fieldsToShow = toBeCombinedProps.map(function (p) {
514
+ return p.fieldsToShow;
515
+ }).reduce(function (acc, nextFieldsToShow) {
516
+ var _loop3 = function _loop3(nextDataIdKey) {
517
+ var nextTooltipFields = nextFieldsToShow[nextDataIdKey];
518
+ if (!acc[nextDataIdKey]) {
519
+ // if the dataset id is not present in the accumulator
520
+ // then add it with its tooltip fields
521
+ acc[nextDataIdKey] = nextTooltipFields;
522
+ } else {
523
+ // otherwise the dataset id is already present in the accumulator
524
+ // so only add the next tooltip fields for this dataset's array if they are not already present,
525
+ // using the tooltipField.name property for uniqueness
526
+ nextTooltipFields.forEach(function (nextTF) {
527
+ if (!acc[nextDataIdKey].find(function (_ref3) {
528
+ var name = _ref3.name;
529
+ return nextTF.name === name;
530
+ })) {
531
+ acc[nextDataIdKey].push(nextTF);
532
+ }
533
+ });
534
+ }
535
+ };
536
+ for (var nextDataIdKey in nextFieldsToShow) {
537
+ _loop3(nextDataIdKey);
538
+ }
539
+ return acc;
540
+ }, {});
541
+ }
542
+ if (key === 'brush') {
543
+ var _aggregate;
544
+ // keep the biggest brush size
545
+ combined[key].size = (_aggregate = aggregate(toBeCombinedProps, AGGREGATION_TYPES.maximum, function (p) {
546
+ return p.size;
547
+ })) !== null && _aggregate !== void 0 ? _aggregate : null;
548
+ }
549
+ if (key === 'geocoder') {
550
+ combined[key].limitSearch = toBeCombinedProps.some(function (p) {
551
+ return p === null || p === void 0 ? void 0 : p.limitSearch;
552
+ });
553
+ }
554
+ };
555
+ for (var key in combined) {
556
+ _loop2(key);
557
+ }
558
+ return combined;
559
+ }
560
+ function savedUnmergedInteraction(state, unmerged) {
561
+ var _unmerged$tooltip, _unmerged$tooltip2, _state$interactionToB, _unmerged$tooltip3;
562
+ if (!(unmerged !== null && unmerged !== void 0 && (_unmerged$tooltip = unmerged.tooltip) !== null && _unmerged$tooltip !== void 0 && _unmerged$tooltip.fieldsToShow)) {
563
+ return state.interactionToBeMerged;
564
+ }
565
+ return {
566
+ tooltip: _objectSpread(_objectSpread(_objectSpread({}, state.interactionToBeMerged.tooltip), typeof (unmerged === null || unmerged === void 0 || (_unmerged$tooltip2 = unmerged.tooltip) === null || _unmerged$tooltip2 === void 0 ? void 0 : _unmerged$tooltip2.enabled) === 'boolean' ? {
567
+ enabled: unmerged.tooltip.enabled
568
+ } : {}), {}, {
569
+ fieldsToShow: _objectSpread(_objectSpread({}, (_state$interactionToB = state.interactionToBeMerged) === null || _state$interactionToB === void 0 || (_state$interactionToB = _state$interactionToB.tooltip) === null || _state$interactionToB === void 0 ? void 0 : _state$interactionToB.fieldsToShow), unmerged === null || unmerged === void 0 || (_unmerged$tooltip3 = unmerged.tooltip) === null || _unmerged$tooltip3 === void 0 ? void 0 : _unmerged$tooltip3.fieldsToShow)
570
+ })
571
+ };
572
+ }
573
+ function replaceInteractionDatasetIds(interactionConfig, dataId, dataIdToReplace) {
574
+ var _interactionConfig$to;
575
+ if (interactionConfig !== null && interactionConfig !== void 0 && (_interactionConfig$to = interactionConfig.tooltip) !== null && _interactionConfig$to !== void 0 && _interactionConfig$to.fieldsToShow[dataId]) {
576
+ var _interactionConfig$to2;
577
+ return _objectSpread(_objectSpread({}, interactionConfig), {}, {
578
+ tooltip: _objectSpread(_objectSpread({}, interactionConfig.tooltip), {}, {
579
+ fieldsToShow: _defineProperty({}, dataIdToReplace, interactionConfig === null || interactionConfig === void 0 || (_interactionConfig$to2 = interactionConfig.tooltip) === null || _interactionConfig$to2 === void 0 ? void 0 : _interactionConfig$to2.fieldsToShow[dataId])
580
+ })
581
+ });
582
+ }
583
+ return null;
584
+ }
585
+
586
+ /**
587
+ * Merge splitMaps config with current visStete.
588
+ * 1. if current map is split, but splitMap DOESNOT contain maps
589
+ * : don't merge anything
590
+ * 2. if current map is NOT split, but splitMaps contain maps
591
+ * : add to splitMaps, and add current layers to splitMaps
592
+ */
593
+ export function mergeSplitMaps(state) {
594
+ var splitMaps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
595
+ var merged = _toConsumableArray(state.splitMaps);
596
+ var unmerged = [];
597
+ splitMaps.forEach(function (sm, i) {
598
+ var entries = Object.entries(sm.layers);
599
+ if (entries.length > 0) {
600
+ entries.forEach(function (_ref4) {
601
+ var _ref5 = _slicedToArray(_ref4, 2),
602
+ id = _ref5[0],
603
+ value = _ref5[1];
604
+ // check if layer exists
605
+ var pushTo = state.layers.find(function (l) {
606
+ return l.id === id;
607
+ }) ? merged : unmerged;
608
+
609
+ // create map panel if current map is not split
610
+ pushTo[i] = pushTo[i] || _objectSpread(_objectSpread({}, sm), {}, {
611
+ layers: pushTo === merged ? getInitialMapLayersForSplitMap(state.layers) : []
612
+ });
613
+ pushTo[i].layers = _objectSpread(_objectSpread({}, pushTo[i].layers), {}, _defineProperty({}, id, value));
614
+ });
615
+ } else {
616
+ // We are merging if there are no layers in both split map
617
+ merged.push(sm);
618
+ }
619
+ });
620
+ return _objectSpread(_objectSpread({}, state), {}, {
621
+ splitMaps: merged,
622
+ splitMapsToBeMerged: [].concat(_toConsumableArray(state.splitMapsToBeMerged), unmerged)
623
+ });
624
+ }
625
+
626
+ /**
627
+ * Merge effects with saved config
628
+ */
629
+ export function mergeEffects(state, effects, fromConfig) {
630
+ var newEffects = [].concat(_toConsumableArray(state.effects), _toConsumableArray((effects || []).map(function (effect) {
631
+ return fromConfig ? createEffect(deepmerge.all([effect, {
632
+ // collapse all panels when loading effects
633
+ isConfigActive: false
634
+ }])) : effect;
635
+ }).filter(function (effect) {
636
+ return Boolean(effect && effect.isValidToSave());
637
+ })));
638
+ return _objectSpread(_objectSpread({}, state), {}, {
639
+ effects: newEffects,
640
+ effectOrder: newEffects.map(function (effect) {
641
+ return effect.id;
642
+ })
643
+ });
644
+ }
645
+
646
+ /**
647
+ * Merge annotations with saved config
648
+ */
649
+ export function mergeAnnotations(state, annotations) {
650
+ if (!annotations || !annotations.length) {
651
+ return state;
652
+ }
653
+ var existingIds = new Set(state.annotations.map(function (a) {
654
+ return a.id;
655
+ }));
656
+ var validAnnotations = annotations.filter(function (a) {
657
+ return a && a.id && !existingIds.has(a.id) && isAnnotationKind(a.kind) && Array.isArray(a.anchorPoint) && a.anchorPoint.length === 2;
658
+ }).map(function (a) {
659
+ return _objectSpread({
660
+ isVisible: true,
661
+ autoSize: true,
662
+ autoSizeY: true,
663
+ label: '',
664
+ lineColor: INITIAL_ANNOTATION_LINE_COLOR,
665
+ lineWidth: INITIAL_ANNOTATION_LINE_WIDTH,
666
+ textWidth: 0,
667
+ textHeight: 0
668
+ }, a);
669
+ });
670
+ if (!validAnnotations.length) {
671
+ return state;
672
+ }
673
+ return _objectSpread(_objectSpread({}, state), {}, {
674
+ annotations: [].concat(_toConsumableArray(state.annotations), _toConsumableArray(validAnnotations))
675
+ });
676
+ }
677
+
678
+ /**
679
+ * Merge interactionConfig.tooltip with saved config,
680
+ * validate fieldsToShow
681
+ *
682
+ * @param state
683
+ * @param tooltipConfig
684
+ * @return - {mergedTooltip: {}, unmergedTooltip: {}}
685
+ */
686
+ export function mergeInteractionTooltipConfig(state) {
687
+ var tooltipConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
688
+ var unmergedTooltip = {};
689
+ var mergedTooltip = {};
690
+ if (!tooltipConfig || !tooltipConfig.fieldsToShow || !Object.keys(tooltipConfig.fieldsToShow).length) {
691
+ return {
692
+ mergedTooltip: mergedTooltip,
693
+ unmergedTooltip: unmergedTooltip
694
+ };
695
+ }
696
+ var _loop4 = function _loop4() {
697
+ if (!state.datasets[dataId] || state.isMergingDatasets[dataId]) {
698
+ // is not yet loaded
699
+ unmergedTooltip[dataId] = tooltipConfig.fieldsToShow[dataId];
700
+ } else {
701
+ // if dataset is loaded
702
+ var allFields = state.datasets[dataId].fields.map(function (d) {
703
+ return d.name;
704
+ });
705
+ var foundFieldsToShow = tooltipConfig.fieldsToShow[dataId].filter(function (field) {
706
+ return allFields.includes(field.name);
707
+ });
708
+ mergedTooltip[dataId] = foundFieldsToShow;
709
+ }
710
+ };
711
+ for (var dataId in tooltipConfig.fieldsToShow) {
712
+ _loop4();
713
+ }
714
+ return {
715
+ mergedTooltip: mergedTooltip,
716
+ unmergedTooltip: unmergedTooltip
717
+ };
718
+ }
719
+ /**
720
+ * Merge layerBlending with saved
721
+ *
722
+ */
723
+ export function mergeLayerBlending(state, layerBlending) {
724
+ if (layerBlending && LAYER_BLENDINGS[layerBlending]) {
725
+ return _objectSpread(_objectSpread({}, state), {}, {
726
+ layerBlending: layerBlending
727
+ });
728
+ }
729
+ return state;
730
+ }
731
+
732
+ /**
733
+ * Combines multiple layer blending configs into a single string
734
+ * by returning the one with the highest occurrence
735
+ */
736
+ function combineLayerBlendingConfigs(configs) {
737
+ // return the mode of the layer blending type
738
+ return getValueWithHighestOccurrence(configs);
739
+ }
740
+
741
+ /**
742
+ * Merge overlayBlending with saved
743
+ */
744
+ export function mergeOverlayBlending(state, overlayBlending) {
745
+ if (overlayBlending && OVERLAY_BLENDINGS[overlayBlending]) {
746
+ return _objectSpread(_objectSpread({}, state), {}, {
747
+ overlayBlending: overlayBlending
748
+ });
749
+ }
750
+ return state;
751
+ }
752
+
753
+ /**
754
+ * Combines multiple overlay blending configs into a single string
755
+ * by returning the one with the highest occurrence
756
+ **/
757
+ function combineOverlayBlendingConfigs(configs) {
758
+ // return the mode of the overlay blending type
759
+ return getValueWithHighestOccurrence(configs);
760
+ }
761
+
762
+ /**
763
+ * Merge animation config
764
+ */
765
+ export function mergeAnimationConfig(state, animation) {
766
+ if (animation && animation.currentTime) {
767
+ return _objectSpread(_objectSpread({}, state), {}, {
768
+ animationConfig: _objectSpread(_objectSpread(_objectSpread({}, state.animationConfig), animation), {}, {
769
+ domain: null
770
+ })
771
+ });
772
+ }
773
+ return state;
774
+ }
775
+ function combineAnimationConfigs(configs) {
776
+ var _aggregate2, _aggregate3;
777
+ // get the smallest values of currentTime and speed among all configs
778
+ return {
779
+ currentTime: (_aggregate2 = aggregate(configs, AGGREGATION_TYPES.minimum, function (c) {
780
+ return c.currentTime;
781
+ })) !== null && _aggregate2 !== void 0 ? _aggregate2 : null,
782
+ speed: (_aggregate3 = aggregate(configs, AGGREGATION_TYPES.minimum, function (c) {
783
+ return c.speed;
784
+ })) !== null && _aggregate3 !== void 0 ? _aggregate3 : null
785
+ };
786
+ }
787
+
788
+ /**
789
+ * Validate saved layer columns with new data,
790
+ * update fieldIdx based on new fields
791
+ *
792
+ * @param fields
793
+ * @param savedCols
794
+ * @param emptyCols
795
+ * @param options
796
+ * @return - validated columns or null
797
+ */
798
+
799
+ export function validateSavedLayerColumns(fields) {
800
+ var savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
801
+ var emptyCols = arguments.length > 2 ? arguments[2] : undefined;
802
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
803
+ // Prepare columns for the validator
804
+ var columns = {};
805
+ var _loop5 = function _loop5() {
806
+ var key = _Object$keys[_i];
807
+ columns[key] = _objectSpread({}, emptyCols[key]);
808
+ var saved = savedCols[key];
809
+ if (saved) {
810
+ var fieldIdx = fields.findIndex(function (_ref6) {
811
+ var name = _ref6.name;
812
+ return name === saved;
813
+ });
814
+ if (fieldIdx > -1) {
815
+ // update found columns
816
+ columns[key].fieldIdx = fieldIdx;
817
+ columns[key].value = saved;
818
+ }
819
+ }
820
+ };
821
+ for (var _i = 0, _Object$keys = Object.keys(emptyCols); _i < _Object$keys.length; _i++) {
822
+ _loop5();
823
+ }
824
+
825
+ // find actual column fieldIdx, in case it has changed
826
+ var allColFound = Object.keys(columns).every(function (key) {
827
+ return validateColumn(columns[key], columns, fields);
828
+ });
829
+ var rv = allColFound ? columns : null;
830
+ if (options.throwOnError) {
831
+ var requiredColumns = Object.keys(emptyCols).filter(function (k) {
832
+ return !emptyCols[k].optional;
833
+ });
834
+ var missingColumns = requiredColumns.filter(function (k) {
835
+ return !(columns !== null && columns !== void 0 && columns[k].value);
836
+ });
837
+ if (missingColumns.length) {
838
+ throw new Error("Layer has missing or invalid columns: ".concat(missingColumns.join(', ')));
839
+ }
840
+ var configColumns = Object.keys(savedCols);
841
+ var invalidColumns = configColumns.filter(function (k) {
842
+ var _columns$k;
843
+ return !(columns !== null && columns !== void 0 && (_columns$k = columns[k]) !== null && _columns$k !== void 0 && _columns$k.value);
844
+ });
845
+ if (invalidColumns.length) {
846
+ throw new Error("Layer has invalid columns: ".concat(invalidColumns.join(', ')));
847
+ }
848
+ }
849
+ return rv;
850
+ }
851
+
852
+ /**
853
+ * Validate layer column
854
+ */
855
+ export function validateColumn(column, columns, allFields) {
856
+ if (column.optional || column.value) {
857
+ return true;
858
+ }
859
+ if (column.validator) {
860
+ return column.validator(column, columns, allFields);
861
+ }
862
+ return false;
863
+ }
864
+
865
+ /**
866
+ * Validate saved text label config with new data
867
+ * refer to vis-state-schema.js TextLabelSchemaV1
868
+ *
869
+ * @param {Array<Object>} fields
870
+ * @param {Object} savedTextLabel
871
+ * @param {Object} options
872
+ * @return {Object} - validated textlabel
873
+ */
874
+ export function validateSavedTextLabel(fields, _ref7, savedTextLabel) {
875
+ var _ref8 = _slicedToArray(_ref7, 1),
876
+ layerTextLabel = _ref8[0];
877
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
878
+ var savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel];
879
+
880
+ // validate field
881
+ return savedTextLabels.map(function (textLabel) {
882
+ var field = textLabel.field ? fields.find(function (fd) {
883
+ return Object.keys(textLabel.field).every(function (key) {
884
+ return textLabel.field[key] === fd[key];
885
+ });
886
+ }) : null;
887
+ if (field === undefined && options.throwOnError) {
888
+ throw new Error("Layer has invalid text label field: ".concat(JSON.stringify(textLabel.field)));
889
+ }
890
+ return Object.keys(layerTextLabel).reduce(function (accu, key) {
891
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, key, key === 'field' ? field : textLabel[key] || layerTextLabel[key]));
892
+ }, {});
893
+ });
894
+ }
895
+
896
+ /**
897
+ * Saved visual channel field/scale may live in any of:
898
+ * - `config[key]` after schema parse (VisualChannelSchemaV1 folds channels into config)
899
+ * - `visualChannels[key]` as a sibling of `config` (unparsed addDataToMap payload)
900
+ * - `config.visualChannels[key]` (common mistake of nesting visualChannels inside config)
901
+ *
902
+ * Without this lookup, programmatic GeoJSON strokeColorField never binds and
903
+ * strokeColorDomain stays at the default `[0, 1]` (kepler.gl #3061).
904
+ */
905
+ function getSavedVisualChannelValue(savedLayer, key) {
906
+ var config = savedLayer.config;
907
+ if (config && config[key] !== undefined) {
908
+ return config[key];
909
+ }
910
+ var channels = savedLayer.visualChannels || config && config.visualChannels;
911
+ if (channels && _typeof(channels) === 'object' && channels[key] !== undefined) {
912
+ return channels[key];
913
+ }
914
+ return undefined;
915
+ }
916
+
917
+ /**
918
+ * Validate saved visual channels config with new data,
919
+ * refer to vis-state-schema.js VisualChannelSchemaV1
920
+ */
921
+ export function validateSavedVisualChannels(fields, newLayer, savedLayer) {
922
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
923
+ Object.values(newLayer.visualChannels).forEach(function (_ref9) {
924
+ var field = _ref9.field,
925
+ scale = _ref9.scale,
926
+ key = _ref9.key;
927
+ var savedField = getSavedVisualChannelValue(savedLayer, field);
928
+ var savedScale = getSavedVisualChannelValue(savedLayer, scale);
929
+ var foundField;
930
+ if (savedField !== null && savedField !== void 0 && savedField.name) {
931
+ foundField = fields.find(function (fd) {
932
+ return fd.name === savedField.name;
933
+ });
934
+ }
935
+ var foundChannel = _objectSpread(_objectSpread({}, foundField ? _defineProperty({}, field, foundField) : {}), savedScale ? _defineProperty({}, scale, savedScale) : {});
936
+ if (Object.keys(foundChannel).length) {
937
+ newLayer.updateLayerConfig(foundChannel);
938
+ }
939
+ newLayer.validateVisualChannel(key);
940
+ if (options.throwOnError) {
941
+ var _newLayer$config$fiel;
942
+ var fieldName = savedField === null || savedField === void 0 ? void 0 : savedField.name;
943
+ if (fieldName && fieldName !== ((_newLayer$config$fiel = newLayer.config[field]) === null || _newLayer$config$fiel === void 0 ? void 0 : _newLayer$config$fiel.name)) {
944
+ throw new Error("Layer has invalid visual channel field: ".concat(field));
945
+ }
946
+ }
947
+ });
948
+ return newLayer;
949
+ }
950
+ export function validateLayersByDatasets(datasets, layerClasses) {
951
+ var layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
952
+ var options = arguments.length > 3 ? arguments[3] : undefined;
953
+ var validated = [];
954
+ var failed = [];
955
+ layers.forEach(function (layer) {
956
+ var _layer$config;
957
+ var validateLayer = null;
958
+ if (layer !== null && layer !== void 0 && (_layer$config = layer.config) !== null && _layer$config !== void 0 && _layer$config.dataId) {
959
+ if (datasets[layer.config.dataId]) {
960
+ // datasets are already loaded
961
+ validateLayer = validateLayerWithData(datasets[layer.config.dataId], layer, layerClasses, options);
962
+ }
963
+ }
964
+ if (validateLayer) {
965
+ validated.push(validateLayer);
966
+ } else {
967
+ // datasets not yet loaded
968
+ failed.push(layer);
969
+ }
970
+ });
971
+ return {
972
+ validated: validated,
973
+ failed: failed
974
+ };
975
+ }
976
+
977
+ /**
978
+ * Get required columns for validation based on column mode
979
+ */
980
+ function _getColumnConfigForValidation(newLayer) {
981
+ // find column fieldIdx
982
+ var columnConfig = newLayer.getLayerColumns();
983
+ // if columnMode is defined, find column mode config
984
+ var colModeConfig = newLayer.config.columnMode ? (newLayer.supportedColumnModes || []).find(function (colMode) {
985
+ return colMode.key === newLayer.config.columnMode;
986
+ }) : null;
987
+ if (colModeConfig) {
988
+ // only validate columns in column mode
989
+ columnConfig = [].concat(_toConsumableArray(colModeConfig.requiredColumns || []), _toConsumableArray(colModeConfig.optionalColumns || [])).reduce(function (accu, key) {
990
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, key, columnConfig[key]));
991
+ }, {});
992
+ }
993
+ return columnConfig;
994
+ }
995
+
996
+ /**
997
+ * Validate saved layer config with new data,
998
+ * update fieldIdx based on new fields
999
+ */
1000
+ // eslint-disable-next-line complexity
1001
+ export function validateLayerWithData(dataset, savedLayer, layerClasses) {
1002
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
1003
+ var fields = dataset.fields,
1004
+ dataId = dataset.id;
1005
+ var type = savedLayer.type;
1006
+ var throwOnError = options.throwOnError;
1007
+ // layer doesnt have a valid type
1008
+ if (!type || !Object.prototype.hasOwnProperty.call(layerClasses, type) || !savedLayer.config) {
1009
+ if (throwOnError) {
1010
+ throw new Error("Layer has invalid type \"".concat(type, "\" or config is missing"));
1011
+ }
1012
+ return null;
1013
+ }
1014
+ var newLayer = new layerClasses[type]({
1015
+ id: savedLayer.id,
1016
+ dataId: dataId,
1017
+ label: savedLayer.config.label,
1018
+ color: savedLayer.config.color,
1019
+ isVisible: savedLayer.config.isVisible,
1020
+ hidden: savedLayer.config.hidden,
1021
+ columnMode: savedLayer.config.columnMode,
1022
+ highlightColor: savedLayer.config.highlightColor
1023
+ });
1024
+ var columnConfig = _getColumnConfigForValidation(newLayer);
1025
+ if (Object.keys(columnConfig)) {
1026
+ var columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig, options);
1027
+ if (columns) {
1028
+ newLayer.updateLayerConfig({
1029
+ columns: _objectSpread(_objectSpread({}, newLayer.config.columns), columns)
1030
+ });
1031
+ } else if (!options.allowEmptyColumn) {
1032
+ return null;
1033
+ }
1034
+ }
1035
+ var textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel, options) : newLayer.config.textLabel;
1036
+
1037
+ // copy visConfig over to emptyLayer to make sure it has all the props
1038
+ var copiedVisConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
1039
+ shallowCopy: ['colorRange', 'strokeColorRange']
1040
+ });
1041
+
1042
+ // call layer methods to validate visConfig when switching dataset
1043
+ var visConfig = newLayer.validateVisConfig ? newLayer.validateVisConfig(dataset, copiedVisConfig) : copiedVisConfig;
1044
+ newLayer.updateLayerConfig({
1045
+ visConfig: visConfig,
1046
+ textLabel: textLabel
1047
+ });
1048
+
1049
+ // visual channel field is saved to be {name, type}
1050
+ // find visual channel field by matching both name and type
1051
+ // refer to vis-state-schema.js VisualChannelSchemaV1
1052
+ newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer, options);
1053
+ if (throwOnError) {
1054
+ if (!newLayer.isValidToSave()) {
1055
+ throw new Error("Layer is not valid to save: ".concat(newLayer.id));
1056
+ }
1057
+ }
1058
+ return newLayer;
1059
+ }
1060
+ export function mergeEditor(state, savedEditor) {
1061
+ var _savedEditor$visible;
1062
+ if (!savedEditor) {
1063
+ return state;
1064
+ }
1065
+ return _objectSpread(_objectSpread({}, state), {}, {
1066
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
1067
+ features: [].concat(_toConsumableArray(state.editor.features), _toConsumableArray(savedEditor.features || [])),
1068
+ // if savedEditor.visible is undefined keep state.editor.visible
1069
+ visible: (_savedEditor$visible = savedEditor.visible) !== null && _savedEditor$visible !== void 0 ? _savedEditor$visible : state.editor.visible
1070
+ })
1071
+ });
1072
+ }
1073
+ function combineEditorConfigs(configs) {
1074
+ return configs.reduce(function (acc, nextConfig) {
1075
+ return _objectSpread(_objectSpread({}, acc), {}, {
1076
+ features: [].concat(_toConsumableArray(acc.features), _toConsumableArray(nextConfig.features || []))
1077
+ });
1078
+ }, {
1079
+ // start with:
1080
+ // - empty array for features accumulation
1081
+ // - and are any of the configs' visible values true?
1082
+ features: [],
1083
+ visible: configs.some(function (c) {
1084
+ return c === null || c === void 0 ? void 0 : c.visible;
1085
+ })
1086
+ });
1087
+ }
1088
+
1089
+ /**
1090
+ * Validate saved layer config with new data,
1091
+ * update fieldIdx based on new fields
1092
+ */
1093
+ export function mergeDatasetsByOrder(state, newDataEntries) {
1094
+ var merged = _objectSpread(_objectSpread({}, state.datasets), newDataEntries);
1095
+ if (Array.isArray(state.preserveDatasetOrder)) {
1096
+ // preserveDatasetOrder might not include the new datasets
1097
+ var newDatasetIds = Object.keys(merged).filter(function (id) {
1098
+ var _state$preserveDatase;
1099
+ return !((_state$preserveDatase = state.preserveDatasetOrder) !== null && _state$preserveDatase !== void 0 && _state$preserveDatase.includes(id));
1100
+ });
1101
+ return [].concat(_toConsumableArray(state.preserveDatasetOrder), _toConsumableArray(newDatasetIds)).reduce(function (accu, dataId) {
1102
+ return _objectSpread(_objectSpread({}, accu), merged[dataId] ? _defineProperty({}, dataId, merged[dataId]) : {});
1103
+ }, {});
1104
+ }
1105
+ return merged;
1106
+ }
1107
+
1108
+ /**
1109
+ * Simliar purpose to aggregation utils `getMode` function,
1110
+ * but returns the mode in the same value type without coercing to a string.
1111
+ * It ignores `undefined` or `null` values, but returns `null` if no mode could be calculated.
1112
+ */
1113
+ function getValueWithHighestOccurrence(arr) {
1114
+ var _ref11;
1115
+ var tallys = new Map();
1116
+ arr.forEach(function (value) {
1117
+ if (notNullorUndefined(value)) {
1118
+ if (!tallys.has(value)) {
1119
+ tallys.set(value, 1);
1120
+ } else {
1121
+ tallys.set(value, tallys.get(value) + 1);
1122
+ }
1123
+ }
1124
+ });
1125
+ // return the value with the highest total occurrence count
1126
+ if (tallys.size === 0) {
1127
+ return null;
1128
+ }
1129
+ return (_ref11 = _toConsumableArray(tallys.entries())) === null || _ref11 === void 0 ? void 0 : _ref11.reduce(function (acc, next) {
1130
+ return next[1] > acc[1] ? next : acc;
1131
+ })[0];
1132
+ }
1133
+ export var VIS_STATE_MERGERS = [{
1134
+ merge: mergeLayers,
1135
+ prop: 'layers',
1136
+ toMergeProp: 'layerToBeMerged',
1137
+ preserveOrder: 'preserveLayerOrder'
1138
+ }, {
1139
+ merge: mergeLayerOrder,
1140
+ prop: 'layerOrder'
1141
+ }, {
1142
+ merge: mergeFilters,
1143
+ prop: 'filters',
1144
+ toMergeProp: 'filterToBeMerged',
1145
+ preserveOrder: 'preserveFilterOrder',
1146
+ replaceParentDatasetIds: replaceFilterDatasetIds
1147
+ }, {
1148
+ merge: mergeEffects,
1149
+ prop: 'effects'
1150
+ }, {
1151
+ merge: mergeAnnotations,
1152
+ prop: 'annotations',
1153
+ toMergeProp: 'annotationsToBeMerged'
1154
+ }, {
1155
+ merge: mergeInteractions,
1156
+ prop: 'interactionConfig',
1157
+ toMergeProp: 'interactionToBeMerged',
1158
+ replaceParentDatasetIds: replaceInteractionDatasetIds,
1159
+ saveUnmerged: savedUnmergedInteraction,
1160
+ combineConfigs: combineInteractionConfigs
1161
+ }, {
1162
+ merge: mergeLayerBlending,
1163
+ prop: 'layerBlending',
1164
+ combineConfigs: combineLayerBlendingConfigs
1165
+ }, {
1166
+ merge: mergeOverlayBlending,
1167
+ prop: 'overlayBlending',
1168
+ combineConfigs: combineOverlayBlendingConfigs
1169
+ }, {
1170
+ merge: mergeSplitMaps,
1171
+ prop: 'splitMaps',
1172
+ toMergeProp: 'splitMapsToBeMerged'
1173
+ }, {
1174
+ merge: mergeAnimationConfig,
1175
+ prop: 'animationConfig',
1176
+ combineConfigs: combineAnimationConfigs
1177
+ }, {
1178
+ merge: mergeEditor,
1179
+ prop: 'editor',
1180
+ combineConfigs: combineEditorConfigs
1181
+ }];
1182
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1bmlxIiwicGljayIsImZsYXR0ZW5EZWVwIiwiZGVlcG1lcmdlIiwiYXJyYXlJbnNlcnQiLCJnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAiLCJhcHBseUZpbHRlcnNUb0RhdGFzZXRzIiwidmFsaWRhdGVGaWx0ZXJzVXBkYXRlRGF0YXNldHMiLCJmaW5kQnlJZCIsImFnZ3JlZ2F0ZSIsImlzUGxhaW5PYmplY3QiLCJjcmVhdGVFZmZlY3QiLCJub3ROdWxsb3JVbmRlZmluZWQiLCJBR0dSRUdBVElPTl9UWVBFUyIsIkxBWUVSX0JMRU5ESU5HUyIsIk9WRVJMQVlfQkxFTkRJTkdTIiwiaXNBbm5vdGF0aW9uS2luZCIsIklOSVRJQUxfQU5OT1RBVElPTl9MSU5FX0NPTE9SIiwiSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfV0lEVEgiLCJDVVJSRU5UX1ZFUlNJT04iLCJhc3NpZ25HcHVDaGFubmVscyIsInJlc2V0RmlsdGVyR3B1TW9kZSIsImdldExheWVyT3JkZXJGcm9tTGF5ZXJzIiwibWVyZ2VGaWx0ZXJzIiwic3RhdGUiLCJmaWx0ZXJzVG9NZXJnZSIsImZyb21Db25maWciLCJwcmVzZXJ2ZUZpbHRlck9yZGVyIiwibWFwIiwibCIsImlkIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiX3ZhbGlkYXRlRmlsdGVyc1VwZGF0IiwidmFsaWRhdGVkIiwiZmFpbGVkIiwidXBkYXRlZERhdGFzZXRzIiwidXBkYXRlZEZpbHRlcnMiLCJpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyIiwiZmlsdGVycyIsImRhdGFzZXRzVG9GaWx0ZXIiLCJmIiwiZGF0YUlkIiwiZmlsdGVyZWQiLCJsYXllcnMiLCJfb2JqZWN0U3ByZWFkIiwiZGF0YXNldHMiLCJmaWx0ZXJUb0JlTWVyZ2VkIiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5IiwicmVwbGFjZUZpbHRlckRhdGFzZXRJZHMiLCJzYXZlZEZpbHRlciIsImRhdGFJZFRvVXNlIiwicmVwbGFjZWQiLCJmb3JFYWNoIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJfZmlsdGVyJHBsb3RUeXBlIiwibmV3RGF0YUlkIiwiZCIsInBsb3RUeXBlIiwiY29sb3JzQnlEYXRhSWQiLCJfZmlsdGVyJHBsb3RUeXBlMiIsIl9yZWYiLCJjb2xvciIsInJlc3QiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsIl9kZWZpbmVQcm9wZXJ0eSIsInB1c2giLCJpc1NhdmVkTGF5ZXJDb25maWdWMSIsImxheWVyQ29uZmlnIiwidmlzdWFsQ2hhbm5lbHMiLCJwYXJzZUxheWVyQ29uZmlnIiwic2NoZW1hIiwiX3NjaGVtYSRwYXJzZVNhdmVkQ29uIiwic2F2ZWRDb25maWciLCJ2ZXJzaW9uIiwiY29uZmlnIiwidmlzU3RhdGUiLCJsYXllck9yZGVyIiwicGFyc2VTYXZlZENvbmZpZyIsImN1cnJlbnRJdGVtcyIsIml0ZW1zIiwicHJlc2VydmVkT3JkZXIiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJkZWZhdWx0U3RhcnQiLCJuZXdJdGVtcyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJzIiwibiIsImRvbmUiLCJpdGVtIiwidmFsdWUiLCJleHBlY3RlZElkeCIsImluZGV4T2YiLCJpbnNlcnRBdCIsImkiLCJwcmVjZWVkSWR4IiwiX2xvb3AiLCJwcmVjZWVkSXRlbUlkIiwiZmluZEluZGV4IiwiZXJyIiwiZSIsImNyZWF0ZUxheWVyRnJvbUNvbmZpZyIsInBhcnNlZExheWVyQ29uZmlnIiwiX3ZhbGlkYXRlTGF5ZXJzQnlEYXRhIiwidmFsaWRhdGVMYXllcnNCeURhdGFzZXRzIiwibGF5ZXJDbGFzc2VzIiwiYWxsb3dFbXB0eUNvbHVtbiIsIm5ld0xheWVyIiwidXBkYXRlTGF5ZXJEb21haW4iLCJzZXJpYWxpemVGaWx0ZXIiLCJuZXdGaWx0ZXIiLCJfc2VyaWFsaXplZFZpc1N0YXRlJGYiLCJzZXJpYWxpemVkVmlzU3RhdGUiLCJzZXJpYWxpemVWaXNTdGF0ZSIsInNlcmlhbGl6ZUxheWVyIiwiX3NlcmlhbGl6ZWRWaXNTdGF0ZSRsIiwic2VyaWFsaXplRWZmZWN0IiwibmV3RWZmZWN0IiwiX3NlcmlhbGl6ZWRWaXNTdGF0ZSRlIiwiZWZmZWN0cyIsImVmZmVjdE9yZGVyIiwiX3NjaGVtYSRwYXJzZVNhdmVkQ29uMiIsInNhdmVkU3RhdGUiLCJnZXRDb25maWdUb1NhdmUiLCJtZXJnZUxheWVycyIsImxheWVyc1RvTWVyZ2UiLCJwcmVzZXJ2ZUxheWVyT3JkZXIiLCJ1bm1lcmdlZCIsInRvTWVyZ2UiLCJfbCRjb25maWciLCJpc01lcmdpbmdEYXRhc2V0cyIsIl92YWxpZGF0ZUxheWVyc0J5RGF0YTIiLCJtZXJnZWRMYXllciIsImFwcGx5IiwiX2luc2VydExheWVyQXRSaWdodE9yIiwiaW5zZXJ0TGF5ZXJBdFJpZ2h0T3JkZXIiLCJuZXdMYXllck9yZGVyIiwibmV3TGF5ZXJzIiwibWVyZ2VkU3RhdGUiLCJsYXllclRvQmVNZXJnZWQiLCJsYXllck9yZGVyVG9CZU1lcmdlZCIsInNhdmVkT3JkZXIiLCJtZXJnZUxheWVyT3JkZXIiLCJjdXJyZW50TGF5ZXJzIiwibGF5ZXJzVG9JbnNlcnQiLCJjdXJyZW50T3JkZXIiLCJjdXJyZW50TGF5ZXJRdWV1ZSIsImVudHJ5IiwibGF5ZXIiLCJCb29sZWFuIiwibmV3TGF5ZXJPcmRlclF1ZXVlIiwibmV3RmxhdExheWVyT3JkZXIiLCJoYXNHcm91cHMiLCJzb21lIiwiZXhpc3RpbmdGbGF0SWRzIiwiU2V0IiwibmV3SW5zZXJ0ZWRJZHMiLCJoYXMiLCJyZXN1bHQiLCJmbGF0UXVldWUiLCJmbGF0SWR4IiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsInNhdmVkTGF5ZXJPcmRlciIsInZhbGlkTGF5ZXJJZHMiLCJmaWx0ZXJMYXllck9yZGVyIiwib3JkZXIiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiZ3JvdXAiLCJmaWx0ZXJlZEdyb3VwT3JkZXIiLCJyZXN0b3JlZExheWVyT3JkZXIiLCJsYXllcklkc0luUmVzdG9yZWQiLCJjb2xsZWN0SWRzIiwiX2l0ZXJhdG9yNCIsIl9zdGVwNCIsImFkZCIsIm1pc3NpbmdMYXllcnMiLCJtZXJnZUludGVyYWN0aW9ucyIsImludGVyYWN0aW9uVG9CZU1lcmdlZCIsIm1lcmdlZCIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImN1cnJlbnRDb25maWciLCJfcmVmMiIsImVuYWJsZWQiLCJjb25maWdTYXZlZCIsIl9leGNsdWRlZCIsImNvbmZpZ1RvTWVyZ2UiLCJfbWVyZ2VJbnRlcmFjdGlvblRvb2wiLCJtZXJnZUludGVyYWN0aW9uVG9vbHRpcENvbmZpZyIsIm1lcmdlZFRvb2x0aXAiLCJ1bm1lcmdlZFRvb2x0aXAiLCJmaWVsZHNUb1Nob3ciLCJ0b29sdGlwIiwibmV4dFN0YXRlIiwic2F2ZWRVbm1lcmdlZEludGVyYWN0aW9uIiwiY29tYmluZUludGVyYWN0aW9uQ29uZmlncyIsImNvbmZpZ3MiLCJjb21iaW5lZCIsIl9sb29wMiIsInRvQmVDb21iaW5lZFByb3BzIiwiYyIsInAiLCJjb21wYXJlTW9kZSIsImNvbXBhcmVUeXBlIiwiZ2V0VmFsdWVXaXRoSGlnaGVzdE9jY3VycmVuY2UiLCJyZWR1Y2UiLCJhY2MiLCJuZXh0RmllbGRzVG9TaG93IiwiX2xvb3AzIiwibmV4dERhdGFJZEtleSIsIm5leHRUb29sdGlwRmllbGRzIiwibmV4dFRGIiwiZmluZCIsIl9yZWYzIiwibmFtZSIsIl9hZ2dyZWdhdGUiLCJzaXplIiwibWF4aW11bSIsImxpbWl0U2VhcmNoIiwiX3VubWVyZ2VkJHRvb2x0aXAiLCJfdW5tZXJnZWQkdG9vbHRpcDIiLCJfc3RhdGUkaW50ZXJhY3Rpb25Ub0IiLCJfdW5tZXJnZWQkdG9vbHRpcDMiLCJyZXBsYWNlSW50ZXJhY3Rpb25EYXRhc2V0SWRzIiwiZGF0YUlkVG9SZXBsYWNlIiwiX2ludGVyYWN0aW9uQ29uZmlnJHRvIiwiX2ludGVyYWN0aW9uQ29uZmlnJHRvMiIsIm1lcmdlU3BsaXRNYXBzIiwic3BsaXRNYXBzIiwic20iLCJlbnRyaWVzIiwiX3JlZjQiLCJfcmVmNSIsIl9zbGljZWRUb0FycmF5IiwicHVzaFRvIiwic3BsaXRNYXBzVG9CZU1lcmdlZCIsIm1lcmdlRWZmZWN0cyIsIm5ld0VmZmVjdHMiLCJlZmZlY3QiLCJhbGwiLCJpc0NvbmZpZ0FjdGl2ZSIsImlzVmFsaWRUb1NhdmUiLCJtZXJnZUFubm90YXRpb25zIiwiYW5ub3RhdGlvbnMiLCJleGlzdGluZ0lkcyIsImEiLCJ2YWxpZEFubm90YXRpb25zIiwia2luZCIsImFuY2hvclBvaW50IiwiaXNWaXNpYmxlIiwiYXV0b1NpemUiLCJhdXRvU2l6ZVkiLCJsYWJlbCIsImxpbmVDb2xvciIsImxpbmVXaWR0aCIsInRleHRXaWR0aCIsInRleHRIZWlnaHQiLCJ0b29sdGlwQ29uZmlnIiwiX2xvb3A0IiwiYWxsRmllbGRzIiwiZmllbGRzIiwiZm91bmRGaWVsZHNUb1Nob3ciLCJmaWVsZCIsIm1lcmdlTGF5ZXJCbGVuZGluZyIsImxheWVyQmxlbmRpbmciLCJjb21iaW5lTGF5ZXJCbGVuZGluZ0NvbmZpZ3MiLCJtZXJnZU92ZXJsYXlCbGVuZGluZyIsIm92ZXJsYXlCbGVuZGluZyIsImNvbWJpbmVPdmVybGF5QmxlbmRpbmdDb25maWdzIiwibWVyZ2VBbmltYXRpb25Db25maWciLCJhbmltYXRpb24iLCJjdXJyZW50VGltZSIsImFuaW1hdGlvbkNvbmZpZyIsImRvbWFpbiIsImNvbWJpbmVBbmltYXRpb25Db25maWdzIiwiX2FnZ3JlZ2F0ZTIiLCJfYWdncmVnYXRlMyIsIm1pbmltdW0iLCJzcGVlZCIsInZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMiLCJzYXZlZENvbHMiLCJlbXB0eUNvbHMiLCJvcHRpb25zIiwiY29sdW1ucyIsIl9sb29wNSIsIl9PYmplY3Qka2V5cyIsIl9pIiwic2F2ZWQiLCJmaWVsZElkeCIsIl9yZWY2IiwiYWxsQ29sRm91bmQiLCJldmVyeSIsInZhbGlkYXRlQ29sdW1uIiwicnYiLCJ0aHJvd09uRXJyb3IiLCJyZXF1aXJlZENvbHVtbnMiLCJrIiwib3B0aW9uYWwiLCJtaXNzaW5nQ29sdW1ucyIsIkVycm9yIiwiam9pbiIsImNvbmZpZ0NvbHVtbnMiLCJpbnZhbGlkQ29sdW1ucyIsIl9jb2x1bW5zJGsiLCJjb2x1bW4iLCJ2YWxpZGF0b3IiLCJ2YWxpZGF0ZVNhdmVkVGV4dExhYmVsIiwiX3JlZjciLCJzYXZlZFRleHRMYWJlbCIsIl9yZWY4IiwibGF5ZXJUZXh0TGFiZWwiLCJzYXZlZFRleHRMYWJlbHMiLCJ0ZXh0TGFiZWwiLCJmZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJhY2N1IiwiZ2V0U2F2ZWRWaXN1YWxDaGFubmVsVmFsdWUiLCJzYXZlZExheWVyIiwiY2hhbm5lbHMiLCJfdHlwZW9mIiwidmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzIiwidmFsdWVzIiwiX3JlZjkiLCJzY2FsZSIsInNhdmVkRmllbGQiLCJzYXZlZFNjYWxlIiwiZm91bmRGaWVsZCIsImZvdW5kQ2hhbm5lbCIsInVwZGF0ZUxheWVyQ29uZmlnIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwiX25ld0xheWVyJGNvbmZpZyRmaWVsIiwiZmllbGROYW1lIiwiX2xheWVyJGNvbmZpZyIsInZhbGlkYXRlTGF5ZXIiLCJ2YWxpZGF0ZUxheWVyV2l0aERhdGEiLCJfZ2V0Q29sdW1uQ29uZmlnRm9yVmFsaWRhdGlvbiIsImNvbHVtbkNvbmZpZyIsImdldExheWVyQ29sdW1ucyIsImNvbE1vZGVDb25maWciLCJjb2x1bW5Nb2RlIiwic3VwcG9ydGVkQ29sdW1uTW9kZXMiLCJjb2xNb2RlIiwib3B0aW9uYWxDb2x1bW5zIiwiZGF0YXNldCIsInR5cGUiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJoaWRkZW4iLCJoaWdobGlnaHRDb2xvciIsImNvcGllZFZpc0NvbmZpZyIsImNvcHlMYXllckNvbmZpZyIsInZpc0NvbmZpZyIsInNoYWxsb3dDb3B5IiwidmFsaWRhdGVWaXNDb25maWciLCJtZXJnZUVkaXRvciIsInNhdmVkRWRpdG9yIiwiX3NhdmVkRWRpdG9yJHZpc2libGUiLCJlZGl0b3IiLCJmZWF0dXJlcyIsInZpc2libGUiLCJjb21iaW5lRWRpdG9yQ29uZmlncyIsIm5leHRDb25maWciLCJtZXJnZURhdGFzZXRzQnlPcmRlciIsIm5ld0RhdGFFbnRyaWVzIiwicHJlc2VydmVEYXRhc2V0T3JkZXIiLCJuZXdEYXRhc2V0SWRzIiwiX3N0YXRlJHByZXNlcnZlRGF0YXNlIiwiYXJyIiwiX3JlZjExIiwidGFsbHlzIiwiTWFwIiwic2V0IiwiZ2V0IiwibmV4dCIsIlZJU19TVEFURV9NRVJHRVJTIiwibWVyZ2UiLCJwcm9wIiwidG9NZXJnZVByb3AiLCJwcmVzZXJ2ZU9yZGVyIiwicmVwbGFjZVBhcmVudERhdGFzZXRJZHMiLCJzYXZlVW5tZXJnZWQiLCJjb21iaW5lQ29uZmlncyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92aXMtc3RhdGUtbWVyZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB1bmlxIGZyb20gJ2VzLXRvb2xraXQvY29tcGF0L3VuaXEnO1xuaW1wb3J0IHBpY2sgZnJvbSAnZXMtdG9vbGtpdC9jb21wYXQvcGljayc7XG5pbXBvcnQgZmxhdHRlbkRlZXAgZnJvbSAnZXMtdG9vbGtpdC9jb21wYXQvZmxhdHRlbkRlZXAnO1xuaW1wb3J0IGRlZXBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHtcbiAgYXJyYXlJbnNlcnQsXG4gIGdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcCxcbiAgYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyxcbiAgdmFsaWRhdGVGaWx0ZXJzVXBkYXRlRGF0YXNldHMsXG4gIGZpbmRCeUlkLFxuICBhZ2dyZWdhdGUsXG4gIGlzUGxhaW5PYmplY3Rcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7Y3JlYXRlRWZmZWN0fSBmcm9tICdAa2VwbGVyLmdsL2VmZmVjdHMnO1xuaW1wb3J0IHtub3ROdWxsb3JVbmRlZmluZWR9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbmltcG9ydCB7XG4gIEFHR1JFR0FUSU9OX1RZUEVTLFxuICBMQVlFUl9CTEVORElOR1MsXG4gIE9WRVJMQVlfQkxFTkRJTkdTLFxuICBpc0Fubm90YXRpb25LaW5kLFxuICBJTklUSUFMX0FOTk9UQVRJT05fTElORV9DT0xPUixcbiAgSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfV0lEVEhcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtDVVJSRU5UX1ZFUlNJT04sIFZpc1N0YXRlLCBWaXNTdGF0ZU1lcmdlcnMsIEtlcGxlckdMU2NoZW1hQ2xhc3N9IGZyb20gJ0BrZXBsZXIuZ2wvc2NoZW1hcyc7XG5cbmltcG9ydCB7XG4gIFBhcnNlZExheWVyLFxuICBQYXJzZWRWaXNTdGF0ZSxcbiAgU2F2ZWRJbnRlcmFjdGlvbkNvbmZpZyxcbiAgVG9vbHRpcEluZm8sXG4gIFNhdmVkRWRpdG9yLFxuICBQYXJzZWRDb25maWcsXG4gIEZpbHRlcixcbiAgRWZmZWN0IGFzIEVmZmVjdFR5cGUsXG4gIFBhcnNlZEVmZmVjdCxcbiAgTGF5ZXJDb2x1bW5zLFxuICBMYXllckNvbHVtbixcbiAgUGFyc2VkRmlsdGVyLFxuICBOZXN0ZWRQYXJ0aWFsLFxuICBTYXZlZEFuaW1hdGlvbkNvbmZpZyxcbiAgTGF5ZXJPcmRlcixcbiAgTGF5ZXJPcmRlckdyb3VwXG59IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZSwgRGF0YXNldHMsIGFzc2lnbkdwdUNoYW5uZWxzLCByZXNldEZpbHRlckdwdU1vZGV9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuXG5pbXBvcnQge2dldExheWVyT3JkZXJGcm9tTGF5ZXJzfSBmcm9tICcuL2xheWVyLXV0aWxzJztcblxuLyoqXG4gKiBNZXJnZSBsb2FkZWQgZmlsdGVycyB3aXRoIGN1cnJlbnQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VGaWx0ZXJzPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBmaWx0ZXJzVG9NZXJnZTogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnZmlsdGVycyddLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGNvbnN0IHByZXNlcnZlRmlsdGVyT3JkZXIgPSBmcm9tQ29uZmlnXG4gICAgPyBmaWx0ZXJzVG9NZXJnZT8ubWFwKGwgPT4gbC5pZClcbiAgICA6IHN0YXRlLnByZXNlcnZlRmlsdGVyT3JkZXI7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnNUb01lcmdlKSB8fCAhZmlsdGVyc1RvTWVyZ2UubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge3ZhbGlkYXRlZCwgZmFpbGVkLCB1cGRhdGVkRGF0YXNldHN9ID0gdmFsaWRhdGVGaWx0ZXJzVXBkYXRlRGF0YXNldHMoc3RhdGUsIGZpbHRlcnNUb01lcmdlKTtcbiAgbGV0IHVwZGF0ZWRGaWx0ZXJzID0gaW5zZXJ0SXRlbUJhc2VkT25QcmVzZXJ2ZWRPcmRlcihcbiAgICBzdGF0ZS5maWx0ZXJzLFxuICAgIHZhbGlkYXRlZCxcbiAgICBwcmVzZXJ2ZUZpbHRlck9yZGVyXG4gICk7XG5cbiAgLy8gbWVyZ2UgZmlsdGVyIHdpdGggZXhpc3RpbmdcbiAgdXBkYXRlZEZpbHRlcnMgPSByZXNldEZpbHRlckdwdU1vZGUodXBkYXRlZEZpbHRlcnMpO1xuICB1cGRhdGVkRmlsdGVycyA9IGFzc2lnbkdwdUNoYW5uZWxzKHVwZGF0ZWRGaWx0ZXJzKTtcbiAgLy8gZmlsdGVyIGRhdGFcbiAgY29uc3QgZGF0YXNldHNUb0ZpbHRlciA9IHVuaXEoZmxhdHRlbkRlZXAodmFsaWRhdGVkLm1hcChmID0+IGYuZGF0YUlkKSkpO1xuXG4gIGNvbnN0IGZpbHRlcmVkID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgICBkYXRhc2V0c1RvRmlsdGVyLFxuICAgIHVwZGF0ZWREYXRhc2V0cyxcbiAgICB1cGRhdGVkRmlsdGVycyxcbiAgICBzdGF0ZS5sYXllcnNcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IHVwZGF0ZWRGaWx0ZXJzLFxuICAgIGRhdGFzZXRzOiBmaWx0ZXJlZCxcbiAgICBwcmVzZXJ2ZUZpbHRlck9yZGVyLFxuICAgIGZpbHRlclRvQmVNZXJnZWQ6IFsuLi5zdGF0ZS5maWx0ZXJUb0JlTWVyZ2VkLCAuLi5mYWlsZWRdXG4gIH07XG59XG5cbi8vIHJlcGxhY2UgZGF0YUlkIGluIHNhdmVkIEZpbHRlclxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VGaWx0ZXJEYXRhc2V0SWRzKFxuICBzYXZlZEZpbHRlcjogRmlsdGVyW10sXG4gIGRhdGFJZDogc3RyaW5nLFxuICBkYXRhSWRUb1VzZTogc3RyaW5nXG4pIHtcbiAgY29uc3QgcmVwbGFjZWQ6IEZpbHRlcltdID0gW107XG4gIHNhdmVkRmlsdGVyLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICBpZiAoZmlsdGVyLmRhdGFJZC5pbmNsdWRlcyhkYXRhSWQpKSB7XG4gICAgICBjb25zdCBuZXdEYXRhSWQgPSBmaWx0ZXIuZGF0YUlkLm1hcChkID0+IChkID09PSBkYXRhSWQgPyBkYXRhSWRUb1VzZSA6IGQpKTtcbiAgICAgIGxldCBwbG90VHlwZTtcbiAgICAgIC8vIFRPRE86IG1vcmUgZ2VuZXJpYyBhcHByb2FjaCB0byBzYXZlIHBsb3RUeXBlLmNvbG9yc0J5RGF0YUlkXG4gICAgICBpZiAoZmlsdGVyLnBsb3RUeXBlPy5jb2xvcnNCeURhdGFJZD8uW2RhdGFJZF0pIHtcbiAgICAgICAgLy8gcmVwbGFjZSBjb2xvckJ5RGF0YUlkIGluIGZpbHRlci5wbG90VHlwZVxuICAgICAgICBjb25zdCB7W2RhdGFJZF06IGNvbG9yLCAuLi5yZXN0fSA9IGZpbHRlci5wbG90VHlwZT8uY29sb3JzQnlEYXRhSWQgfHwge307XG4gICAgICAgIHBsb3RUeXBlID0ge1xuICAgICAgICAgIC4uLmZpbHRlci5wbG90VHlwZSxcbiAgICAgICAgICBjb2xvcnNCeURhdGFJZDoge1xuICAgICAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgICAgIFtkYXRhSWRUb1VzZV06IGNvbG9yXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmVwbGFjZWQucHVzaCh7XG4gICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgZGF0YUlkOiBuZXdEYXRhSWQsXG4gICAgICAgIC4uLihwbG90VHlwZSA/IHtwbG90VHlwZX0gOiB7fSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXBsYWNlZC5sZW5ndGggPyByZXBsYWNlZCA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NhdmVkTGF5ZXJDb25maWdWMShsYXllckNvbmZpZzogYW55KTogYm9vbGVhbiB7XG4gIC8vIGV4cG9ydGVkIGxheWVyIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgdmlzdWFsQ2hhbm5lbHMgcHJvcGVydHlcbiAgcmV0dXJuIGxheWVyQ29uZmlnPy52aXN1YWxDaGFubmVscztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJDb25maWcoXG4gIHNjaGVtYTogS2VwbGVyR0xTY2hlbWFDbGFzcyxcbiAgbGF5ZXJDb25maWc6IGFueVxuKTogUGFyc2VkTGF5ZXIgfCB1bmRlZmluZWQge1xuICAvLyBhc3N1bWUgdGhlIGxheWVyIGNvbmZpZyBpcyBjdXJyZW50IHZlcnNpb25cbiAgY29uc3Qgc2F2ZWRDb25maWcgPSB7XG4gICAgdmVyc2lvbjogQ1VSUkVOVF9WRVJTSU9OLFxuICAgIGNvbmZpZzoge1xuICAgICAgdmlzU3RhdGU6IHtsYXllcnM6IFtsYXllckNvbmZpZ10sIGxheWVyT3JkZXI6IFtsYXllckNvbmZpZy5pZF19XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzY2hlbWEucGFyc2VTYXZlZENvbmZpZyhzYXZlZENvbmZpZyk/LnZpc1N0YXRlPy5sYXllcnM/LlswXTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0SXRlbUJhc2VkT25QcmVzZXJ2ZWRPcmRlcihcbiAgY3VycmVudEl0ZW1zOiBGaWx0ZXJbXSxcbiAgaXRlbXM6IEZpbHRlcltdLFxuICBwcmVzZXJ2ZWRPcmRlcjogYW55W10gPSBbXSxcbiAgZGVmYXVsdFN0YXJ0PzogYm9vbGVhblxuKSB7XG4gIGxldCBuZXdJdGVtcyA9IFsuLi5jdXJyZW50SXRlbXNdO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGNvbnN0IGV4cGVjdGVkSWR4ID0gcHJlc2VydmVkT3JkZXIuaW5kZXhPZihpdGVtLmlkKTtcbiAgICAvLyBpbnNlcnRBdCB0aGUgZW5kIGJ5IGRlZmF1bHRcbiAgICBsZXQgaW5zZXJ0QXQgPSBkZWZhdWx0U3RhcnQgPyAwIDogbmV3SXRlbXMubGVuZ3RoO1xuICAgIGlmIChleHBlY3RlZElkeCA+IDApIHtcbiAgICAgIC8vIGxvb2sgZm9yIGxheWVyIHRvIGluc2VydCBhZnRlclxuICAgICAgbGV0IGkgPSBleHBlY3RlZElkeCArIDE7XG4gICAgICBsZXQgcHJlY2VlZElkeCA9IC0xO1xuICAgICAgd2hpbGUgKGktLSA+IDAgJiYgcHJlY2VlZElkeCA8IDApIHtcbiAgICAgICAgLy8ga2VlcCBsb29raW5nIGZvciBwcmVjZWVkIGxheWVyIHRoYXQgaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgY29uc3QgcHJlY2VlZEl0ZW1JZCA9IHByZXNlcnZlZE9yZGVyW2kgLSAxXTtcbiAgICAgICAgcHJlY2VlZElkeCA9IG5ld0l0ZW1zLmZpbmRJbmRleChkID0+IGQuaWQgPT09IHByZWNlZWRJdGVtSWQpO1xuICAgICAgfVxuICAgICAgaWYgKHByZWNlZWRJZHggPiAtMSkge1xuICAgICAgICAvLyBpZiBmb3VuZFxuICAgICAgICBpbnNlcnRBdCA9IHByZWNlZWRJZHggKyAxO1xuICAgICAgfVxuICAgIH1cbiAgICBuZXdJdGVtcyA9IGFycmF5SW5zZXJ0KG5ld0l0ZW1zLCBpbnNlcnRBdCwgaXRlbSk7XG4gIH1cbiAgcmV0dXJuIG5ld0l0ZW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlOiBWaXNTdGF0ZSwgbGF5ZXJDb25maWc6IGFueSk6IExheWVyIHwgbnVsbCB7XG4gIC8vIGNoZWNrIGlmIHRoZSBsYXllciBjb25maWcgaXMgcGFyc2VkXG4gIGNvbnN0IHBhcnNlZExheWVyQ29uZmlnID0gaXNTYXZlZExheWVyQ29uZmlnVjEobGF5ZXJDb25maWcpXG4gICAgPyBwYXJzZUxheWVyQ29uZmlnKHN0YXRlLnNjaGVtYSwgbGF5ZXJDb25maWcpXG4gICAgOiBsYXllckNvbmZpZztcblxuICBpZiAoIXBhcnNlZExheWVyQ29uZmlnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gZmlyc3QgdmFsaWRhdGUgY29uZmlnIGFnYWluc3QgZGF0YXNldFxuICBjb25zdCB7dmFsaWRhdGVkLCBmYWlsZWR9ID0gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICAgIHN0YXRlLmRhdGFzZXRzLFxuICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICBbcGFyc2VkTGF5ZXJDb25maWddLFxuICAgIHthbGxvd0VtcHR5Q29sdW1uOiB0cnVlfVxuICApO1xuXG4gIGlmIChmYWlsZWQ/Lmxlbmd0aCB8fCAhdmFsaWRhdGVkLmxlbmd0aCkge1xuICAgIC8vIGZhaWxlZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbmV3TGF5ZXIgPSB2YWxpZGF0ZWRbMF07XG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG4vKipcbiAqIEdldCBsb2FkZWQgZmlsdGVyIGZyb20gc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUZpbHRlcihcbiAgbmV3RmlsdGVyOiBGaWx0ZXIsXG4gIHNjaGVtYTogS2VwbGVyR0xTY2hlbWFDbGFzc1xuKTogUGFyc2VkRmlsdGVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VyaWFsaXplZFZpc1N0YXRlID0gc2VyaWFsaXplVmlzU3RhdGUoe2ZpbHRlcnM6IFtuZXdGaWx0ZXJdfSwgc2NoZW1hKTtcbiAgcmV0dXJuIHNlcmlhbGl6ZWRWaXNTdGF0ZT8uZmlsdGVycz8uWzBdO1xufVxuXG4vKipcbiAqIEdldCBsb2FkZWQgbGF5ZXIgZnJvbSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTGF5ZXIoXG4gIG5ld0xheWVyOiBMYXllcixcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRMYXllciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRWaXNTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKFxuICAgIHtsYXllcnM6IFtuZXdMYXllcl0sIGxheWVyT3JkZXI6IFtuZXdMYXllci5pZF19LFxuICAgIHNjaGVtYVxuICApO1xuICByZXR1cm4gc2VyaWFsaXplZFZpc1N0YXRlPy5sYXllcnM/LlswXTtcbn1cblxuLyoqXG4gKiBHZXQgbG9hZGVkIGVmZmVjdCBmcm9tIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFZmZlY3QoXG4gIG5ld0VmZmVjdDogRWZmZWN0VHlwZSxcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRFZmZlY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZXJpYWxpemVkVmlzU3RhdGUgPSBzZXJpYWxpemVWaXNTdGF0ZShcbiAgICB7ZWZmZWN0czogW25ld0VmZmVjdF0sIGVmZmVjdE9yZGVyOiBbbmV3RWZmZWN0LmlkXX0sXG4gICAgc2NoZW1hXG4gICk7XG4gIHJldHVybiBzZXJpYWxpemVkVmlzU3RhdGU/LmVmZmVjdHM/LlswXTtcbn1cblxuLyoqXG4gKiBHZXQgdmlzIHN0YXRlIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVmlzU3RhdGUoXG4gIHZpc1N0YXRlOiBQYXJ0aWFsPFZpc1N0YXRlPixcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRWaXNTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNhdmVkU3RhdGUgPSBzY2hlbWEuZ2V0Q29uZmlnVG9TYXZlKHtcbiAgICB2aXNTdGF0ZVxuICB9KTtcbiAgcmV0dXJuIHNhdmVkU3RhdGUgPyBzY2hlbWEucGFyc2VTYXZlZENvbmZpZyhzYXZlZFN0YXRlKT8udmlzU3RhdGUgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIE1lcmdlIGxheWVycyBmcm9tIGRlLXNlcmlhbGl6ZWQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllcnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGxheWVyc1RvTWVyZ2U6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgcHJlc2VydmVMYXllck9yZGVyID0gZnJvbUNvbmZpZ1xuICAgID8gZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMobGF5ZXJzVG9NZXJnZSlcbiAgICA6IHN0YXRlLnByZXNlcnZlTGF5ZXJPcmRlcjtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxheWVyc1RvTWVyZ2UpIHx8ICFsYXllcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBkb24ndCBtZXJnZSBsYXllciBpZiBkYXRhc2V0IGlzIGJlaW5nIG1lcmdlZFxuICBjb25zdCB1bm1lcmdlZDogUGFyc2VkTGF5ZXJbXSA9IFtdO1xuICBjb25zdCB0b01lcmdlOiBQYXJzZWRMYXllcltdID0gW107XG4gIGxheWVyc1RvTWVyZ2UuZm9yRWFjaCgobDogUGFyc2VkTGF5ZXIpID0+IHtcbiAgICBpZiAobD8uY29uZmlnPy5kYXRhSWQgJiYgc3RhdGUuaXNNZXJnaW5nRGF0YXNldHNbbC5jb25maWcuZGF0YUlkXSkge1xuICAgICAgdW5tZXJnZWQucHVzaChsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9NZXJnZS5wdXNoKGwpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3Qge3ZhbGlkYXRlZDogbWVyZ2VkTGF5ZXIsIGZhaWxlZH0gPSB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gICAgc3RhdGUuZGF0YXNldHMsXG4gICAgc3RhdGUubGF5ZXJDbGFzc2VzLFxuICAgIHRvTWVyZ2VcbiAgKTtcbiAgdW5tZXJnZWQucHVzaCguLi5mYWlsZWQpO1xuICAvLyBwdXQgbmV3IGxheWVycyBpbiBmcm9udCBvZiBjdXJyZW50IGxheWVyc1xuICBjb25zdCB7bmV3TGF5ZXJPcmRlciwgbmV3TGF5ZXJzfSA9IGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICAgIHN0YXRlLmxheWVycyxcbiAgICBtZXJnZWRMYXllcixcbiAgICBzdGF0ZS5sYXllck9yZGVyLFxuICAgIHByZXNlcnZlTGF5ZXJPcmRlclxuICApO1xuXG4gIGxldCBtZXJnZWRTdGF0ZTogUyA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyLFxuICAgIHByZXNlcnZlTGF5ZXJPcmRlcixcbiAgICBsYXllclRvQmVNZXJnZWQ6IFsuLi5zdGF0ZS5sYXllclRvQmVNZXJnZWQsIC4uLnVubWVyZ2VkXVxuICB9O1xuXG4gIC8vIEFwcGx5IHBlbmRpbmcgbGF5ZXJPcmRlciB3aXRoIGdyb3VwcyBpZiBsYXllcnMgYXJlIG5vdyBhdmFpbGFibGVcbiAgaWYgKG1lcmdlZFN0YXRlLmxheWVyT3JkZXJUb0JlTWVyZ2VkICYmIG1lcmdlZFN0YXRlLmxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgc2F2ZWRPcmRlciA9IG1lcmdlZFN0YXRlLmxheWVyT3JkZXJUb0JlTWVyZ2VkO1xuICAgIG1lcmdlZFN0YXRlID0gbWVyZ2VMYXllck9yZGVyKG1lcmdlZFN0YXRlLCBzYXZlZE9yZGVyKTtcbiAgICAvLyBLZWVwIHNhdmVkTGF5ZXJPcmRlciBhdmFpbGFibGUgZm9yIGZ1dHVyZSBkZWZlcnJlZCBsYXllcnNcbiAgICBpZiAobWVyZ2VkU3RhdGUubGF5ZXJUb0JlTWVyZ2VkLmxlbmd0aCA+IDApIHtcbiAgICAgIG1lcmdlZFN0YXRlID0gey4uLm1lcmdlZFN0YXRlLCBsYXllck9yZGVyVG9CZU1lcmdlZDogc2F2ZWRPcmRlcn07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlZFN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TGF5ZXJBdFJpZ2h0T3JkZXIoXG4gIGN1cnJlbnRMYXllcnMsXG4gIGxheWVyc1RvSW5zZXJ0LFxuICBjdXJyZW50T3JkZXIsXG4gIHByZXNlcnZlZE9yZGVyOiBzdHJpbmdbXSA9IFtdXG4pIHtcbiAgaWYgKCFsYXllcnNUb0luc2VydD8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtuZXdMYXllcnM6IGN1cnJlbnRMYXllcnMsIG5ld0xheWVyT3JkZXI6IGN1cnJlbnRPcmRlcn07XG4gIH1cblxuICBjb25zdCBjdXJyZW50TGF5ZXJRdWV1ZSA9IGN1cnJlbnRPcmRlclxuICAgIC5maWx0ZXIoZW50cnkgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJylcbiAgICAubWFwKGlkID0+IGZpbmRCeUlkKGlkKShjdXJyZW50TGF5ZXJzKSlcbiAgICAuZmlsdGVyKGxheWVyID0+IEJvb2xlYW4obGF5ZXIpKTtcbiAgY29uc3QgbmV3TGF5ZXJzID0gY3VycmVudExheWVycy5jb25jYXQobGF5ZXJzVG9JbnNlcnQpO1xuICBjb25zdCBuZXdMYXllck9yZGVyUXVldWUgPSBpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyKFxuICAgIGN1cnJlbnRMYXllclF1ZXVlLFxuICAgIGxheWVyc1RvSW5zZXJ0LFxuICAgIHByZXNlcnZlZE9yZGVyLFxuICAgIHRydWVcbiAgKTtcblxuICBjb25zdCBuZXdGbGF0TGF5ZXJPcmRlciA9IGdldExheWVyT3JkZXJGcm9tTGF5ZXJzKG5ld0xheWVyT3JkZXJRdWV1ZSk7XG5cbiAgLy8gSWYgbm8gZ3JvdXBzIGV4aXN0IGluIGN1cnJlbnQgb3JkZXIsIGp1c3QgdXNlIHRoZSBuZXcgZmxhdCBvcmRlclxuICBjb25zdCBoYXNHcm91cHMgPSBjdXJyZW50T3JkZXIuc29tZShlbnRyeSA9PiBpc1BsYWluT2JqZWN0KGVudHJ5KSk7XG4gIGlmICghaGFzR3JvdXBzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ld0xheWVyT3JkZXI6IG5ld0ZsYXRMYXllck9yZGVyLFxuICAgICAgbmV3TGF5ZXJzXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJlYnVpbGQgbGF5ZXJPcmRlciBwcmVzZXJ2aW5nIGdyb3VwcyBpbiB0aGVpciByZWxhdGl2ZSBwb3NpdGlvbnMuXG4gIC8vIFJlcGxhY2UgZWFjaCBzdHJpbmcgZW50cnkgd2l0aCBpdHMgdXBkYXRlZCBwb3NpdGlvbiBmcm9tIG5ld0ZsYXRMYXllck9yZGVyLFxuICAvLyBhbmQga2VlcCBncm91cHMgYXMtaXMuXG4gIGNvbnN0IGV4aXN0aW5nRmxhdElkcyA9IG5ldyBTZXQoXG4gICAgY3VycmVudE9yZGVyLmZpbHRlcihlbnRyeSA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSBhcyBzdHJpbmdbXVxuICApO1xuICBjb25zdCBuZXdJbnNlcnRlZElkcyA9IG5ld0ZsYXRMYXllck9yZGVyLmZpbHRlcihpZCA9PiAhZXhpc3RpbmdGbGF0SWRzLmhhcyhpZCkpO1xuXG4gIC8vIFJlYnVpbGQ6IHdhbGsgdGhyb3VnaCBjdXJyZW50T3JkZXIsIHJlcGxhY2Ugc3RyaW5nIGVudHJpZXMgd2l0aCB0aGVpclxuICAvLyBuZXcgcG9zaXRpb24gZXF1aXZhbGVudHMgZnJvbSBuZXdGbGF0TGF5ZXJPcmRlciwgdGhlbiBhcHBlbmQgYW55IG5ld2x5IGluc2VydGVkIGxheWVyc1xuICBjb25zdCByZXN1bHQ6IExheWVyT3JkZXIgPSBbXTtcbiAgY29uc3QgZmxhdFF1ZXVlID0gWy4uLm5ld0ZsYXRMYXllck9yZGVyLmZpbHRlcihpZCA9PiBleGlzdGluZ0ZsYXRJZHMuaGFzKGlkKSldO1xuICBsZXQgZmxhdElkeCA9IDA7XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBjdXJyZW50T3JkZXIpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGVudHJ5IGFzIExheWVyT3JkZXJHcm91cCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlcGxhY2Ugd2l0aCBjb3JyZXNwb25kaW5nIGVudHJ5IGZyb20gcmVvcmRlcmVkIGZsYXQgbGlzdFxuICAgICAgaWYgKGZsYXRJZHggPCBmbGF0UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGZsYXRRdWV1ZVtmbGF0SWR4XSk7XG4gICAgICAgIGZsYXRJZHgrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgYW55IG5ld2x5IGluc2VydGVkIGxheWVycyBhdCB0aGUgZnJvbnQgKHRoZXkgYXJlIG5ldylcbiAgcmV0dXJuIHtcbiAgICBuZXdMYXllck9yZGVyOiBbLi4ubmV3SW5zZXJ0ZWRJZHMsIC4uLnJlc3VsdF0sXG4gICAgbmV3TGF5ZXJzXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2Ugc2F2ZWQgbGF5ZXJPcmRlciB3aXRoIGN1cnJlbnQgc3RhdGUgdG8gcmVzdG9yZSBsYXllciBncm91cHMuXG4gKiBDYWxsZWQgYWZ0ZXIgbGF5ZXJzIGhhdmUgYmVlbiBtZXJnZWQuIElmIHRoZSBzYXZlZCBjb25maWcgY29udGFpbnMgYSBsYXllck9yZGVyXG4gKiB3aXRoIGdyb3VwcywgdGhpcyByZXBsYWNlcyB0aGUgZmxhdCBsYXllck9yZGVyIHdpdGggdGhlIHNhdmVkIGhpZXJhcmNoaWNhbCBvbmUsXG4gKiBmaWx0ZXJpbmcgb3V0IGFueSBsYXllciBJRHMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTGF5ZXJPcmRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgc2F2ZWRMYXllck9yZGVyPzogYW55W10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgaWYgKCFzYXZlZExheWVyT3JkZXIgfHwgIUFycmF5LmlzQXJyYXkoc2F2ZWRMYXllck9yZGVyKSB8fCBzYXZlZExheWVyT3JkZXIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHNhdmVkIGxheWVyT3JkZXIgY29udGFpbnMgYW55IGdyb3Vwc1xuICBjb25zdCBoYXNHcm91cHMgPSBzYXZlZExheWVyT3JkZXIuc29tZShlbnRyeSA9PiBpc1BsYWluT2JqZWN0KGVudHJ5KSk7XG4gIGlmICghaGFzR3JvdXBzKSB7XG4gICAgLy8gTm8gZ3JvdXBzIC0gdGhlIGxheWVyIG1lcmdlciBhbHJlYWR5IGhhbmRsZWQgb3JkZXJpbmcgdmlhIHByZXNlcnZlTGF5ZXJPcmRlclxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8vIElmIGxheWVycyBoYXZlbid0IGJlZW4gbWVyZ2VkIHlldCwgc3RvcmUgZm9yIGxhdGVyXG4gIGlmIChzdGF0ZS5sYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJPcmRlclRvQmVNZXJnZWQ6IHNhdmVkTGF5ZXJPcmRlclxuICAgIH07XG4gIH1cblxuICAvLyBCdWlsZCBhIHNldCBvZiB2YWxpZCBsYXllciBJRHMgZnJvbSBjdXJyZW50IHN0YXRlXG4gIGNvbnN0IHZhbGlkTGF5ZXJJZHMgPSBuZXcgU2V0KHN0YXRlLmxheWVycy5tYXAobCA9PiBsLmlkKSk7XG5cbiAgLy8gUmVjdXJzaXZlbHkgZmlsdGVyIHRoZSBzYXZlZCBsYXllck9yZGVyIHRvIG9ubHkgaW5jbHVkZSB2YWxpZCBsYXllcnNcbiAgZnVuY3Rpb24gZmlsdGVyTGF5ZXJPcmRlcihvcmRlcjogYW55W10pOiBMYXllck9yZGVyIHtcbiAgICBjb25zdCByZXN1bHQ6IExheWVyT3JkZXIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG9yZGVyKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBlbnRyeSBhcyBMYXllck9yZGVyR3JvdXA7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkR3JvdXBPcmRlciA9IGZpbHRlckxheWVyT3JkZXIoZ3JvdXAubGF5ZXJPcmRlcik7XG4gICAgICAgIC8vIEtlZXAgdGhlIGdyb3VwIGV2ZW4gaWYgZW1wdHkgKHVzZXIgbWF5IHdhbnQgdGhlIGVtcHR5IGdyb3VwKVxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgbGF5ZXJPcmRlcjogZmlsdGVyZWRHcm91cE9yZGVyXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnICYmIHZhbGlkTGF5ZXJJZHMuaGFzKGVudHJ5KSkge1xuICAgICAgICByZXN1bHQucHVzaChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjb25zdCByZXN0b3JlZExheWVyT3JkZXIgPSBmaWx0ZXJMYXllck9yZGVyKHNhdmVkTGF5ZXJPcmRlcik7XG5cbiAgLy8gRmluZCBhbnkgbGF5ZXJzIGluIHRoZSBjdXJyZW50IHN0YXRlIHRoYXQgYXJlbid0IGluIHRoZSByZXN0b3JlZCBvcmRlclxuICAvLyAoY291bGQgaGFwcGVuIGlmIGxheWVycyB3ZXJlIGFkZGVkIGJldHdlZW4gc2F2ZSBhbmQgbG9hZClcbiAgY29uc3QgbGF5ZXJJZHNJblJlc3RvcmVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZ1bmN0aW9uIGNvbGxlY3RJZHMob3JkZXI6IGFueVtdKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBvcmRlcikge1xuICAgICAgaWYgKGlzUGxhaW5PYmplY3QoZW50cnkpKSB7XG4gICAgICAgIGNvbGxlY3RJZHMoKGVudHJ5IGFzIExheWVyT3JkZXJHcm91cCkubGF5ZXJPcmRlcik7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbGF5ZXJJZHNJblJlc3RvcmVkLmFkZChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbGxlY3RJZHMocmVzdG9yZWRMYXllck9yZGVyKTtcblxuICAvLyBBZGQgYW55IG1pc3NpbmcgbGF5ZXJzIGF0IHRoZSB0b3BcbiAgY29uc3QgbWlzc2luZ0xheWVycyA9IHN0YXRlLmxheWVycy5maWx0ZXIobCA9PiAhbGF5ZXJJZHNJblJlc3RvcmVkLmhhcyhsLmlkKSkubWFwKGwgPT4gbC5pZCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllck9yZGVyOiBbLi4ubWlzc2luZ0xheWVycywgLi4ucmVzdG9yZWRMYXllck9yZGVyXSxcbiAgICBsYXllck9yZGVyVG9CZU1lcmdlZDogbnVsbFxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9ucyB3aXRoIHNhdmVkIGNvbmZpZ1xuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSW50ZXJhY3Rpb25zPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBpbnRlcmFjdGlvblRvQmVNZXJnZWQ6IFBhcnRpYWw8U2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz4gfCB1bmRlZmluZWRcbik6IFMge1xuICBjb25zdCBtZXJnZWQ6IE5lc3RlZFBhcnRpYWw8U2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz4gPSB7fTtcbiAgY29uc3QgdW5tZXJnZWQ6IFBhcnRpYWw8U2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz4gPSB7fTtcblxuICBpZiAoaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkKSB7XG4gICAgKE9iamVjdC5rZXlzKGludGVyYWN0aW9uVG9CZU1lcmdlZCkgYXMgQXJyYXk8a2V5b2YgU2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz4pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICghc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPVxuICAgICAgICBrZXkgPT09ICd0b29sdGlwJyB8fCBrZXkgPT09ICdicnVzaCcgfHwga2V5ID09PSAnZ2VvY29kZXInXG4gICAgICAgICAgPyBzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1trZXldLmNvbmZpZ1xuICAgICAgICAgIDogbnVsbDtcblxuICAgICAgY29uc3Qge2VuYWJsZWQsIC4uLmNvbmZpZ1NhdmVkfSA9IGludGVyYWN0aW9uVG9CZU1lcmdlZFtrZXldIHx8IHt9O1xuXG4gICAgICBsZXQgY29uZmlnVG9NZXJnZSA9IGNvbmZpZ1NhdmVkO1xuXG4gICAgICBpZiAoa2V5ID09PSAndG9vbHRpcCcpIHtcbiAgICAgICAgY29uc3Qge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH0gPSBtZXJnZUludGVyYWN0aW9uVG9vbHRpcENvbmZpZyhcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb25maWdTYXZlZCBhcyBTYXZlZEludGVyYWN0aW9uQ29uZmlnWyd0b29sdGlwJ11cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBtZXJnZSBuZXcgZGF0YXNldCB0b29sdGlwcyB3aXRoIG9yaWdpbmFsIGRhdGFzZXQgdG9vbHRpcHNcbiAgICAgICAgY29uZmlnVG9NZXJnZSA9IHtcbiAgICAgICAgICBmaWVsZHNUb1Nob3c6IHtcbiAgICAgICAgICAgIC4uLihjdXJyZW50Q29uZmlnIGFzIFRvb2x0aXBJbmZvWydjb25maWcnXSkuZmllbGRzVG9TaG93LFxuICAgICAgICAgICAgLi4ubWVyZ2VkVG9vbHRpcFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXModW5tZXJnZWRUb29sdGlwKS5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgdW5tZXJnZWQudG9vbHRpcCA9IHtmaWVsZHNUb1Nob3c6IHVubWVyZ2VkVG9vbHRpcCwgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKX07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWVyZ2VkW2tleV0gPSB7XG4gICAgICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0sXG4gICAgICAgIGVuYWJsZWQ6IEJvb2xlYW4oZW5hYmxlZCksXG4gICAgICAgIC4uLihjdXJyZW50Q29uZmlnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvbmZpZzogcGljayhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5jdXJyZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgLi4uY29uZmlnVG9NZXJnZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY3VycmVudENvbmZpZylcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnOiB7XG4gICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgIC4uLm1lcmdlZFxuICAgIH0sXG4gICAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiBzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb24oc3RhdGUsIHVubWVyZ2VkKVxuICB9O1xuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lSW50ZXJhY3Rpb25Db25maWdzKGNvbmZpZ3M6IFNhdmVkSW50ZXJhY3Rpb25Db25maWdbXSk6IFNhdmVkSW50ZXJhY3Rpb25Db25maWcge1xuICBjb25zdCBjb21iaW5lZCA9IHsuLi5jb25maWdzWzBdfTtcbiAgLy8gaGFuZGxlIGVhY2ggcHJvcGVydHkga2V5IG9mIGFuIGBJbnRlcmFjdGlvbkNvbmZpZ2AsIGUuZy4gdG9vbHRpcCwgZ2VvY29kZXIsIGJydXNoLCBjb29yZGluYXRlXG4gIC8vIGJ5IGNvbWJpbmluZyB2YWx1ZXMgZm9yIGVhY2ggYW1vbmcgYWxsIHBhc3NlZCBpbiBjb25maWdzXG5cbiAgZm9yIChjb25zdCBrZXkgaW4gY29tYmluZWQpIHtcbiAgICBjb25zdCB0b0JlQ29tYmluZWRQcm9wcyA9IGNvbmZpZ3MubWFwKGMgPT4gY1trZXldKTtcblxuICAgIC8vIGFsbCBvZiB0aGVzZSBoYXZlIGFuIGVuYWJsZWQgYm9vbGVhblxuICAgIGNvbWJpbmVkW2tleV0gPSB7XG4gICAgICAvLyBhcmUgYW55IG9mIHRoZSBjb25maWdzJyBlbmFibGVkIHZhbHVlcyB0cnVlP1xuICAgICAgZW5hYmxlZDogdG9CZUNvbWJpbmVkUHJvcHMuc29tZShwID0+IHA/LmVuYWJsZWQpXG4gICAgfTtcblxuICAgIGlmIChrZXkgPT09ICd0b29sdGlwJykge1xuICAgICAgLy8gYXJlIGFueSBvZiB0aGUgY29uZmlncycgY29tcGFyZU1vZGUgdmFsdWVzIHRydWU/XG4gICAgICBjb21iaW5lZFtrZXldLmNvbXBhcmVNb2RlID0gdG9CZUNvbWJpbmVkUHJvcHMuc29tZShwID0+IHA/LmNvbXBhcmVNb2RlKTtcblxuICAgICAgLy8gcmV0dXJuIHRoZSBjb21wYXJlIHR5cGUgbW9kZSwgaXQgd2lsbCBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmVcbiAgICAgIGNvbWJpbmVkW2tleV0uY29tcGFyZVR5cGUgPSBnZXRWYWx1ZVdpdGhIaWdoZXN0T2NjdXJyZW5jZShcbiAgICAgICAgdG9CZUNvbWJpbmVkUHJvcHMubWFwKHAgPT4gcC5jb21wYXJlVHlwZSlcbiAgICAgICk7XG5cbiAgICAgIC8vIGNvbWJpbmUgZmllbGRzVG9TaG93IGFtb25nIGFsbCBkYXRhc2V0IGlkc1xuICAgICAgY29tYmluZWRba2V5XS5maWVsZHNUb1Nob3cgPSB0b0JlQ29tYmluZWRQcm9wc1xuICAgICAgICAubWFwKHAgPT4gcC5maWVsZHNUb1Nob3cpXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgbmV4dEZpZWxkc1RvU2hvdykgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgbmV4dERhdGFJZEtleSBpbiBuZXh0RmllbGRzVG9TaG93KSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0VG9vbHRpcEZpZWxkcyA9IG5leHRGaWVsZHNUb1Nob3dbbmV4dERhdGFJZEtleV07XG4gICAgICAgICAgICBpZiAoIWFjY1tuZXh0RGF0YUlkS2V5XSkge1xuICAgICAgICAgICAgICAvLyBpZiB0aGUgZGF0YXNldCBpZCBpcyBub3QgcHJlc2VudCBpbiB0aGUgYWNjdW11bGF0b3JcbiAgICAgICAgICAgICAgLy8gdGhlbiBhZGQgaXQgd2l0aCBpdHMgdG9vbHRpcCBmaWVsZHNcbiAgICAgICAgICAgICAgYWNjW25leHREYXRhSWRLZXldID0gbmV4dFRvb2x0aXBGaWVsZHM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGRhdGFzZXQgaWQgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBhY2N1bXVsYXRvclxuICAgICAgICAgICAgICAvLyBzbyBvbmx5IGFkZCB0aGUgbmV4dCB0b29sdGlwIGZpZWxkcyBmb3IgdGhpcyBkYXRhc2V0J3MgYXJyYXkgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgcHJlc2VudCxcbiAgICAgICAgICAgICAgLy8gdXNpbmcgdGhlIHRvb2x0aXBGaWVsZC5uYW1lIHByb3BlcnR5IGZvciB1bmlxdWVuZXNzXG4gICAgICAgICAgICAgIG5leHRUb29sdGlwRmllbGRzLmZvckVhY2gobmV4dFRGID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFjY1tuZXh0RGF0YUlkS2V5XS5maW5kKCh7bmFtZX0pID0+IG5leHRURi5uYW1lID09PSBuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgYWNjW25leHREYXRhSWRLZXldLnB1c2gobmV4dFRGKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ2JydXNoJykge1xuICAgICAgLy8ga2VlcCB0aGUgYmlnZ2VzdCBicnVzaCBzaXplXG4gICAgICBjb21iaW5lZFtrZXldLnNpemUgPVxuICAgICAgICBhZ2dyZWdhdGUodG9CZUNvbWJpbmVkUHJvcHMsIEFHR1JFR0FUSU9OX1RZUEVTLm1heGltdW0sIHAgPT4gcC5zaXplKSA/PyBudWxsO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdnZW9jb2RlcicpIHtcbiAgICAgIGNvbWJpbmVkW2tleV0ubGltaXRTZWFyY2ggPSB0b0JlQ29tYmluZWRQcm9wcy5zb21lKHAgPT4gcD8ubGltaXRTZWFyY2gpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb21iaW5lZDtcbn1cblxuZnVuY3Rpb24gc2F2ZWRVbm1lcmdlZEludGVyYWN0aW9uPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICB1bm1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPlxuKSB7XG4gIGlmICghdW5tZXJnZWQ/LnRvb2x0aXA/LmZpZWxkc1RvU2hvdykge1xuICAgIHJldHVybiBzdGF0ZS5pbnRlcmFjdGlvblRvQmVNZXJnZWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b29sdGlwOiB7XG4gICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvblRvQmVNZXJnZWQudG9vbHRpcCxcbiAgICAgIC4uLih0eXBlb2YgdW5tZXJnZWQ/LnRvb2x0aXA/LmVuYWJsZWQgPT09ICdib29sZWFuJ1xuICAgICAgICA/IHtlbmFibGVkOiB1bm1lcmdlZC50b29sdGlwLmVuYWJsZWR9XG4gICAgICAgIDoge30pLFxuICAgICAgZmllbGRzVG9TaG93OiB7XG4gICAgICAgIC4uLnN0YXRlLmludGVyYWN0aW9uVG9CZU1lcmdlZD8udG9vbHRpcD8uZmllbGRzVG9TaG93LFxuICAgICAgICAuLi51bm1lcmdlZD8udG9vbHRpcD8uZmllbGRzVG9TaG93XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiByZXBsYWNlSW50ZXJhY3Rpb25EYXRhc2V0SWRzKGludGVyYWN0aW9uQ29uZmlnLCBkYXRhSWQ6IHN0cmluZywgZGF0YUlkVG9SZXBsYWNlOiBzdHJpbmcpIHtcbiAgaWYgKGludGVyYWN0aW9uQ29uZmlnPy50b29sdGlwPy5maWVsZHNUb1Nob3dbZGF0YUlkXSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5pbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgIHRvb2x0aXA6IHtcbiAgICAgICAgLi4uaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcCxcbiAgICAgICAgZmllbGRzVG9TaG93OiB7XG4gICAgICAgICAgW2RhdGFJZFRvUmVwbGFjZV06IGludGVyYWN0aW9uQ29uZmlnPy50b29sdGlwPy5maWVsZHNUb1Nob3dbZGF0YUlkXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBNZXJnZSBzcGxpdE1hcHMgY29uZmlnIHdpdGggY3VycmVudCB2aXNTdGV0ZS5cbiAqIDEuIGlmIGN1cnJlbnQgbWFwIGlzIHNwbGl0LCBidXQgc3BsaXRNYXAgRE9FU05PVCBjb250YWluIG1hcHNcbiAqICAgIDogZG9uJ3QgbWVyZ2UgYW55dGhpbmdcbiAqIDIuIGlmIGN1cnJlbnQgbWFwIGlzIE5PVCBzcGxpdCwgYnV0IHNwbGl0TWFwcyBjb250YWluIG1hcHNcbiAqICAgIDogYWRkIHRvIHNwbGl0TWFwcywgYW5kIGFkZCBjdXJyZW50IGxheWVycyB0byBzcGxpdE1hcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU3BsaXRNYXBzPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBzcGxpdE1hcHM6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ3NwbGl0TWFwcyddID0gW11cbik6IFMge1xuICBjb25zdCBtZXJnZWQgPSBbLi4uc3RhdGUuc3BsaXRNYXBzXTtcbiAgY29uc3QgdW5tZXJnZWQgPSBbXTtcbiAgc3BsaXRNYXBzLmZvckVhY2goKHNtLCBpKSA9PiB7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHNtLmxheWVycyk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgZW50cmllcy5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgICAgICAvLyBjaGVjayBpZiBsYXllciBleGlzdHNcbiAgICAgICAgY29uc3QgcHVzaFRvID0gc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBpZCkgPyBtZXJnZWQgOiB1bm1lcmdlZDtcblxuICAgICAgICAvLyBjcmVhdGUgbWFwIHBhbmVsIGlmIGN1cnJlbnQgbWFwIGlzIG5vdCBzcGxpdFxuICAgICAgICBwdXNoVG9baV0gPSBwdXNoVG9baV0gfHwge1xuICAgICAgICAgIC8vIGtlZXAgaWRcbiAgICAgICAgICAuLi5zbSxcbiAgICAgICAgICBsYXllcnM6IHB1c2hUbyA9PT0gbWVyZ2VkID8gZ2V0SW5pdGlhbE1hcExheWVyc0ZvclNwbGl0TWFwKHN0YXRlLmxheWVycykgOiBbXVxuICAgICAgICB9O1xuICAgICAgICBwdXNoVG9baV0ubGF5ZXJzID0ge1xuICAgICAgICAgIC4uLnB1c2hUb1tpXS5sYXllcnMsXG4gICAgICAgICAgW2lkXTogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBhcmUgbWVyZ2luZyBpZiB0aGVyZSBhcmUgbm8gbGF5ZXJzIGluIGJvdGggc3BsaXQgbWFwXG4gICAgICBtZXJnZWQucHVzaChzbSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHNwbGl0TWFwczogbWVyZ2VkLFxuICAgIHNwbGl0TWFwc1RvQmVNZXJnZWQ6IFsuLi5zdGF0ZS5zcGxpdE1hcHNUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBlZmZlY3RzIHdpdGggc2F2ZWQgY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUVmZmVjdHM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGVmZmVjdHM6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2VmZmVjdHMnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBjb25zdCBuZXdFZmZlY3RzID0gW1xuICAgIC4uLnN0YXRlLmVmZmVjdHMsXG4gICAgLi4uKGVmZmVjdHMgfHwgW10pXG4gICAgICAubWFwKGVmZmVjdCA9PiB7XG4gICAgICAgIHJldHVybiBmcm9tQ29uZmlnXG4gICAgICAgICAgPyBjcmVhdGVFZmZlY3QoXG4gICAgICAgICAgICAgIGRlZXBtZXJnZS5hbGwoW1xuICAgICAgICAgICAgICAgIGVmZmVjdCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAvLyBjb2xsYXBzZSBhbGwgcGFuZWxzIHdoZW4gbG9hZGluZyBlZmZlY3RzXG4gICAgICAgICAgICAgICAgICBpc0NvbmZpZ0FjdGl2ZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiAoZWZmZWN0IGFzIEVmZmVjdFR5cGUpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoZWZmZWN0ID0+IHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZWZmZWN0ICYmIGVmZmVjdC5pc1ZhbGlkVG9TYXZlKCkpO1xuICAgICAgfSlcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZmZlY3RzOiBuZXdFZmZlY3RzLFxuICAgIGVmZmVjdE9yZGVyOiBuZXdFZmZlY3RzLm1hcChlZmZlY3QgPT4gZWZmZWN0LmlkKVxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGFubm90YXRpb25zIHdpdGggc2F2ZWQgY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFubm90YXRpb25zPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMsIGFubm90YXRpb25zOiBhbnlbXSk6IFMge1xuICBpZiAoIWFubm90YXRpb25zIHx8ICFhbm5vdGF0aW9ucy5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHN0YXRlLmFubm90YXRpb25zLm1hcChhID0+IGEuaWQpKTtcbiAgY29uc3QgdmFsaWRBbm5vdGF0aW9ucyA9IGFubm90YXRpb25zXG4gICAgLmZpbHRlcihcbiAgICAgIGEgPT5cbiAgICAgICAgYSAmJlxuICAgICAgICBhLmlkICYmXG4gICAgICAgICFleGlzdGluZ0lkcy5oYXMoYS5pZCkgJiZcbiAgICAgICAgaXNBbm5vdGF0aW9uS2luZChhLmtpbmQpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoYS5hbmNob3JQb2ludCkgJiZcbiAgICAgICAgYS5hbmNob3JQb2ludC5sZW5ndGggPT09IDJcbiAgICApXG4gICAgLm1hcChhID0+ICh7XG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBhdXRvU2l6ZTogdHJ1ZSxcbiAgICAgIGF1dG9TaXplWTogdHJ1ZSxcbiAgICAgIGxhYmVsOiAnJyxcbiAgICAgIGxpbmVDb2xvcjogSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfQ09MT1IsXG4gICAgICBsaW5lV2lkdGg6IElOSVRJQUxfQU5OT1RBVElPTl9MSU5FX1dJRFRILFxuICAgICAgdGV4dFdpZHRoOiAwLFxuICAgICAgdGV4dEhlaWdodDogMCxcbiAgICAgIC4uLmFcbiAgICB9KSk7XG4gIGlmICghdmFsaWRBbm5vdGF0aW9ucy5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbm5vdGF0aW9uczogWy4uLnN0YXRlLmFubm90YXRpb25zLCAuLi52YWxpZEFubm90YXRpb25zXVxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAgd2l0aCBzYXZlZCBjb25maWcsXG4gKiB2YWxpZGF0ZSBmaWVsZHNUb1Nob3dcbiAqXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSB0b29sdGlwQ29uZmlnXG4gKiBAcmV0dXJuIC0ge21lcmdlZFRvb2x0aXA6IHt9LCB1bm1lcmdlZFRvb2x0aXA6IHt9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgdG9vbHRpcENvbmZpZzogUGljazxUb29sdGlwSW5mb1snY29uZmlnJ10sICdmaWVsZHNUb1Nob3cnPiB8IG51bGwgPSBudWxsXG4pIHtcbiAgY29uc3QgdW5tZXJnZWRUb29sdGlwOiBUb29sdGlwSW5mb1snY29uZmlnJ11bJ2ZpZWxkc1RvU2hvdyddID0ge307XG4gIGNvbnN0IG1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcblxuICBpZiAoXG4gICAgIXRvb2x0aXBDb25maWcgfHxcbiAgICAhdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cgfHxcbiAgICAhT2JqZWN0LmtleXModG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cpLmxlbmd0aFxuICApIHtcbiAgICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFJZCBpbiB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykge1xuICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXSB8fCBzdGF0ZS5pc01lcmdpbmdEYXRhc2V0c1tkYXRhSWRdKSB7XG4gICAgICAvLyBpcyBub3QgeWV0IGxvYWRlZFxuICAgICAgdW5tZXJnZWRUb29sdGlwW2RhdGFJZF0gPSB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBkYXRhc2V0IGlzIGxvYWRlZFxuICAgICAgY29uc3QgYWxsRmllbGRzID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5maWVsZHMubWFwKGQgPT4gZC5uYW1lKTtcbiAgICAgIGNvbnN0IGZvdW5kRmllbGRzVG9TaG93ID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXS5maWx0ZXIoZmllbGQgPT5cbiAgICAgICAgYWxsRmllbGRzLmluY2x1ZGVzKGZpZWxkLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBtZXJnZWRUb29sdGlwW2RhdGFJZF0gPSBmb3VuZEZpZWxkc1RvU2hvdztcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG59XG4vKipcbiAqIE1lcmdlIGxheWVyQmxlbmRpbmcgd2l0aCBzYXZlZFxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTGF5ZXJCbGVuZGluZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgbGF5ZXJCbGVuZGluZzogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJCbGVuZGluZyddXG4pOiBTIHtcbiAgaWYgKGxheWVyQmxlbmRpbmcgJiYgTEFZRVJfQkxFTkRJTkdTW2xheWVyQmxlbmRpbmddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJCbGVuZGluZ1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogQ29tYmluZXMgbXVsdGlwbGUgbGF5ZXIgYmxlbmRpbmcgY29uZmlncyBpbnRvIGEgc2luZ2xlIHN0cmluZ1xuICogYnkgcmV0dXJuaW5nIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCBvY2N1cnJlbmNlXG4gKi9cbmZ1bmN0aW9uIGNvbWJpbmVMYXllckJsZW5kaW5nQ29uZmlncyhjb25maWdzOiBzdHJpbmdbXSk6IHN0cmluZyB8IG51bGwge1xuICAvLyByZXR1cm4gdGhlIG1vZGUgb2YgdGhlIGxheWVyIGJsZW5kaW5nIHR5cGVcbiAgcmV0dXJuIGdldFZhbHVlV2l0aEhpZ2hlc3RPY2N1cnJlbmNlKGNvbmZpZ3MpO1xufVxuXG4vKipcbiAqIE1lcmdlIG92ZXJsYXlCbGVuZGluZyB3aXRoIHNhdmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU92ZXJsYXlCbGVuZGluZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgb3ZlcmxheUJsZW5kaW5nOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydvdmVybGF5QmxlbmRpbmcnXVxuKTogUyB7XG4gIGlmIChvdmVybGF5QmxlbmRpbmcgJiYgT1ZFUkxBWV9CTEVORElOR1Nbb3ZlcmxheUJsZW5kaW5nXSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIG92ZXJsYXlCbGVuZGluZ1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogQ29tYmluZXMgbXVsdGlwbGUgb3ZlcmxheSBibGVuZGluZyBjb25maWdzIGludG8gYSBzaW5nbGUgc3RyaW5nXG4gKiBieSByZXR1cm5pbmcgdGhlIG9uZSB3aXRoIHRoZSBoaWdoZXN0IG9jY3VycmVuY2VcbiAqKi9cbmZ1bmN0aW9uIGNvbWJpbmVPdmVybGF5QmxlbmRpbmdDb25maWdzKGNvbmZpZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHwgbnVsbCB7XG4gIC8vIHJldHVybiB0aGUgbW9kZSBvZiB0aGUgb3ZlcmxheSBibGVuZGluZyB0eXBlXG4gIHJldHVybiBnZXRWYWx1ZVdpdGhIaWdoZXN0T2NjdXJyZW5jZShjb25maWdzKTtcbn1cblxuLyoqXG4gKiBNZXJnZSBhbmltYXRpb24gY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFuaW1hdGlvbkNvbmZpZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYW5pbWF0aW9uOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydhbmltYXRpb25Db25maWcnXVxuKTogUyB7XG4gIGlmIChhbmltYXRpb24gJiYgYW5pbWF0aW9uLmN1cnJlbnRUaW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgLi4uYW5pbWF0aW9uLFxuICAgICAgICBkb21haW46IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lQW5pbWF0aW9uQ29uZmlncyhjb25maWdzOiBTYXZlZEFuaW1hdGlvbkNvbmZpZ1tdKTogU2F2ZWRBbmltYXRpb25Db25maWcge1xuICAvLyBnZXQgdGhlIHNtYWxsZXN0IHZhbHVlcyBvZiBjdXJyZW50VGltZSBhbmQgc3BlZWQgYW1vbmcgYWxsIGNvbmZpZ3NcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50VGltZTogYWdncmVnYXRlKGNvbmZpZ3MsIEFHR1JFR0FUSU9OX1RZUEVTLm1pbmltdW0sIGMgPT4gYy5jdXJyZW50VGltZSkgPz8gbnVsbCxcbiAgICBzcGVlZDogYWdncmVnYXRlKGNvbmZpZ3MsIEFHR1JFR0FUSU9OX1RZUEVTLm1pbmltdW0sIGMgPT4gYy5zcGVlZCkgPz8gbnVsbFxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbHVtbnMgd2l0aCBuZXcgZGF0YSxcbiAqIHVwZGF0ZSBmaWVsZElkeCBiYXNlZCBvbiBuZXcgZmllbGRzXG4gKlxuICogQHBhcmFtIGZpZWxkc1xuICogQHBhcmFtIHNhdmVkQ29sc1xuICogQHBhcmFtIGVtcHR5Q29sc1xuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm4gLSB2YWxpZGF0ZWQgY29sdW1ucyBvciBudWxsXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoXG4gIGZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddLFxuICBzYXZlZENvbHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH0gPSB7fSxcbiAgZW1wdHlDb2xzOiBMYXllckNvbHVtbnMsXG4gIG9wdGlvbnM6IHt0aHJvd09uRXJyb3I/OiBib29sZWFufSA9IHt9XG4pIHtcbiAgLy8gUHJlcGFyZSBjb2x1bW5zIGZvciB0aGUgdmFsaWRhdG9yXG4gIGNvbnN0IGNvbHVtbnM6IHR5cGVvZiBlbXB0eUNvbHMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW1wdHlDb2xzKSkge1xuICAgIGNvbHVtbnNba2V5XSA9IHsuLi5lbXB0eUNvbHNba2V5XX07XG5cbiAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29sc1trZXldO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KCh7bmFtZX0pID0+IG5hbWUgPT09IHNhdmVkKTtcblxuICAgICAgaWYgKGZpZWxkSWR4ID4gLTEpIHtcbiAgICAgICAgLy8gdXBkYXRlIGZvdW5kIGNvbHVtbnNcbiAgICAgICAgY29sdW1uc1trZXldLmZpZWxkSWR4ID0gZmllbGRJZHg7XG4gICAgICAgIGNvbHVtbnNba2V5XS52YWx1ZSA9IHNhdmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgYWN0dWFsIGNvbHVtbiBmaWVsZElkeCwgaW4gY2FzZSBpdCBoYXMgY2hhbmdlZFxuICBjb25zdCBhbGxDb2xGb3VuZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpLmV2ZXJ5KGtleSA9PlxuICAgIHZhbGlkYXRlQ29sdW1uKGNvbHVtbnNba2V5XSwgY29sdW1ucywgZmllbGRzKVxuICApO1xuXG4gIGNvbnN0IHJ2ID0gYWxsQ29sRm91bmQgPyBjb2x1bW5zIDogbnVsbDtcbiAgaWYgKG9wdGlvbnMudGhyb3dPbkVycm9yKSB7XG4gICAgY29uc3QgcmVxdWlyZWRDb2x1bW5zID0gT2JqZWN0LmtleXMoZW1wdHlDb2xzKS5maWx0ZXIoayA9PiAhZW1wdHlDb2xzW2tdLm9wdGlvbmFsKTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IHJlcXVpcmVkQ29sdW1ucy5maWx0ZXIoayA9PiAhY29sdW1ucz8uW2tdLnZhbHVlKTtcbiAgICBpZiAobWlzc2luZ0NvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgY29sdW1uczogJHttaXNzaW5nQ29sdW1ucy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb25maWdDb2x1bW5zID0gT2JqZWN0LmtleXMoc2F2ZWRDb2xzKTtcbiAgICBjb25zdCBpbnZhbGlkQ29sdW1ucyA9IGNvbmZpZ0NvbHVtbnMuZmlsdGVyKGsgPT4gIWNvbHVtbnM/LltrXT8udmFsdWUpO1xuICAgIGlmIChpbnZhbGlkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgY29sdW1uczogJHtpbnZhbGlkQ29sdW1ucy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydjtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBsYXllciBjb2x1bW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29sdW1uKFxuICBjb2x1bW46IExheWVyQ29sdW1uICYge3ZhbGlkYXRvcj86IHR5cGVvZiB2YWxpZGF0ZUNvbHVtbn0sXG4gIGNvbHVtbnM6IExheWVyQ29sdW1ucyxcbiAgYWxsRmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ11cbik6IGJvb2xlYW4ge1xuICBpZiAoY29sdW1uLm9wdGlvbmFsIHx8IGNvbHVtbi52YWx1ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChjb2x1bW4udmFsaWRhdG9yKSB7XG4gICAgcmV0dXJuIGNvbHVtbi52YWxpZGF0b3IoY29sdW1uLCBjb2x1bW5zLCBhbGxGaWVsZHMpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCB0ZXh0IGxhYmVsIGNvbmZpZyB3aXRoIG5ldyBkYXRhXG4gKiByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFRleHRMYWJlbFNjaGVtYVYxXG4gKlxuICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBmaWVsZHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzYXZlZFRleHRMYWJlbFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gLSB2YWxpZGF0ZWQgdGV4dGxhYmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVGV4dExhYmVsKFxuICBmaWVsZHMsXG4gIFtsYXllclRleHRMYWJlbF0sXG4gIHNhdmVkVGV4dExhYmVsLFxuICBvcHRpb25zOiB7dGhyb3dPbkVycm9yPzogYm9vbGVhbn0gPSB7fVxuKSB7XG4gIGNvbnN0IHNhdmVkVGV4dExhYmVscyA9IEFycmF5LmlzQXJyYXkoc2F2ZWRUZXh0TGFiZWwpID8gc2F2ZWRUZXh0TGFiZWwgOiBbc2F2ZWRUZXh0TGFiZWxdO1xuXG4gIC8vIHZhbGlkYXRlIGZpZWxkXG4gIHJldHVybiBzYXZlZFRleHRMYWJlbHMubWFwKHRleHRMYWJlbCA9PiB7XG4gICAgY29uc3QgZmllbGQgPSB0ZXh0TGFiZWwuZmllbGRcbiAgICAgID8gZmllbGRzLmZpbmQoZmQgPT5cbiAgICAgICAgICBPYmplY3Qua2V5cyh0ZXh0TGFiZWwuZmllbGQpLmV2ZXJ5KGtleSA9PiB0ZXh0TGFiZWwuZmllbGRba2V5XSA9PT0gZmRba2V5XSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgdGV4dCBsYWJlbCBmaWVsZDogJHtKU09OLnN0cmluZ2lmeSh0ZXh0TGFiZWwuZmllbGQpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhsYXllclRleHRMYWJlbCkucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGtleSA9PT0gJ2ZpZWxkJyA/IGZpZWxkIDogdGV4dExhYmVsW2tleV0gfHwgbGF5ZXJUZXh0TGFiZWxba2V5XVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNhdmVkIHZpc3VhbCBjaGFubmVsIGZpZWxkL3NjYWxlIG1heSBsaXZlIGluIGFueSBvZjpcbiAqIC0gYGNvbmZpZ1trZXldYCBhZnRlciBzY2hlbWEgcGFyc2UgKFZpc3VhbENoYW5uZWxTY2hlbWFWMSBmb2xkcyBjaGFubmVscyBpbnRvIGNvbmZpZylcbiAqIC0gYHZpc3VhbENoYW5uZWxzW2tleV1gIGFzIGEgc2libGluZyBvZiBgY29uZmlnYCAodW5wYXJzZWQgYWRkRGF0YVRvTWFwIHBheWxvYWQpXG4gKiAtIGBjb25maWcudmlzdWFsQ2hhbm5lbHNba2V5XWAgKGNvbW1vbiBtaXN0YWtlIG9mIG5lc3RpbmcgdmlzdWFsQ2hhbm5lbHMgaW5zaWRlIGNvbmZpZylcbiAqXG4gKiBXaXRob3V0IHRoaXMgbG9va3VwLCBwcm9ncmFtbWF0aWMgR2VvSlNPTiBzdHJva2VDb2xvckZpZWxkIG5ldmVyIGJpbmRzIGFuZFxuICogc3Ryb2tlQ29sb3JEb21haW4gc3RheXMgYXQgdGhlIGRlZmF1bHQgYFswLCAxXWAgKGtlcGxlci5nbCAjMzA2MSkuXG4gKi9cbmZ1bmN0aW9uIGdldFNhdmVkVmlzdWFsQ2hhbm5lbFZhbHVlKHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLCBrZXk6IHN0cmluZyk6IGFueSB7XG4gIGNvbnN0IGNvbmZpZyA9IHNhdmVkTGF5ZXIuY29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIGlmIChjb25maWcgJiYgY29uZmlnW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb25maWdba2V5XTtcbiAgfVxuICBjb25zdCBjaGFubmVscyA9XG4gICAgKHNhdmVkTGF5ZXIgYXMge3Zpc3VhbENoYW5uZWxzPzogUmVjb3JkPHN0cmluZywgYW55Pn0pLnZpc3VhbENoYW5uZWxzIHx8XG4gICAgKGNvbmZpZyAmJiBjb25maWcudmlzdWFsQ2hhbm5lbHMpO1xuICBpZiAoY2hhbm5lbHMgJiYgdHlwZW9mIGNoYW5uZWxzID09PSAnb2JqZWN0JyAmJiBjaGFubmVsc1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2hhbm5lbHNba2V5XTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIHZpc3VhbCBjaGFubmVscyBjb25maWcgd2l0aCBuZXcgZGF0YSxcbiAqIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVmlzdWFsQ2hhbm5lbHMoXG4gIGZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddLFxuICBuZXdMYXllcjogTGF5ZXIsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBvcHRpb25zOiB7dGhyb3dPbkVycm9yPzogYm9vbGVhbn0gPSB7fVxuKTogbnVsbCB8IExheWVyIHtcbiAgT2JqZWN0LnZhbHVlcyhuZXdMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaCgoe2ZpZWxkLCBzY2FsZSwga2V5fSkgPT4ge1xuICAgIGNvbnN0IHNhdmVkRmllbGQgPSBnZXRTYXZlZFZpc3VhbENoYW5uZWxWYWx1ZShzYXZlZExheWVyLCBmaWVsZCk7XG4gICAgY29uc3Qgc2F2ZWRTY2FsZSA9IGdldFNhdmVkVmlzdWFsQ2hhbm5lbFZhbHVlKHNhdmVkTGF5ZXIsIHNjYWxlKTtcbiAgICBsZXQgZm91bmRGaWVsZDtcbiAgICBpZiAoc2F2ZWRGaWVsZD8ubmFtZSkge1xuICAgICAgZm91bmRGaWVsZCA9IGZpZWxkcy5maW5kKGZkID0+IGZkLm5hbWUgPT09IHNhdmVkRmllbGQubmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgZm91bmRDaGFubmVsID0ge1xuICAgICAgLi4uKGZvdW5kRmllbGQgPyB7W2ZpZWxkXTogZm91bmRGaWVsZH0gOiB7fSksXG4gICAgICAuLi4oc2F2ZWRTY2FsZSA/IHtbc2NhbGVdOiBzYXZlZFNjYWxlfSA6IHt9KVxuICAgIH07XG4gICAgaWYgKE9iamVjdC5rZXlzKGZvdW5kQ2hhbm5lbCkubGVuZ3RoKSB7XG4gICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyhmb3VuZENoYW5uZWwpO1xuICAgIH1cblxuICAgIG5ld0xheWVyLnZhbGlkYXRlVmlzdWFsQ2hhbm5lbChrZXkpO1xuICAgIGlmIChvcHRpb25zLnRocm93T25FcnJvcikge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gc2F2ZWRGaWVsZD8ubmFtZTtcbiAgICAgIGlmIChmaWVsZE5hbWUgJiYgZmllbGROYW1lICE9PSBuZXdMYXllci5jb25maWdbZmllbGRdPy5uYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgdmlzdWFsIGNoYW5uZWwgZmllbGQ6ICR7ZmllbGR9YCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG50eXBlIFZhbGlkYXRlTGF5ZXJPcHRpb24gPSB7XG4gIGFsbG93RW1wdHlDb2x1bW4/OiBib29sZWFuO1xuICB0aHJvd09uRXJyb3I/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhcbiAgZGF0YXNldHM6IERhdGFzZXRzLFxuICBsYXllckNsYXNzZXM6IFZpc1N0YXRlWydsYXllckNsYXNzZXMnXSxcbiAgbGF5ZXJzOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydsYXllcnMnXSA9IFtdLFxuICBvcHRpb25zPzogVmFsaWRhdGVMYXllck9wdGlvblxuKSB7XG4gIGNvbnN0IHZhbGlkYXRlZDogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBmYWlsZWQ6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW107XG5cbiAgbGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgIGxldCB2YWxpZGF0ZUxheWVyOiBMYXllciB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKGxheWVyPy5jb25maWc/LmRhdGFJZCkge1xuICAgICAgaWYgKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdKSB7XG4gICAgICAgIC8vIGRhdGFzZXRzIGFyZSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB2YWxpZGF0ZUxheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKFxuICAgICAgICAgIGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdLFxuICAgICAgICAgIGxheWVyLFxuICAgICAgICAgIGxheWVyQ2xhc3NlcyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlTGF5ZXIpIHtcbiAgICAgIHZhbGlkYXRlZC5wdXNoKHZhbGlkYXRlTGF5ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkYXRhc2V0cyBub3QgeWV0IGxvYWRlZFxuICAgICAgZmFpbGVkLnB1c2gobGF5ZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHt2YWxpZGF0ZWQsIGZhaWxlZH07XG59XG5cbi8qKlxuICogR2V0IHJlcXVpcmVkIGNvbHVtbnMgZm9yIHZhbGlkYXRpb24gYmFzZWQgb24gY29sdW1uIG1vZGVcbiAqL1xuZnVuY3Rpb24gX2dldENvbHVtbkNvbmZpZ0ZvclZhbGlkYXRpb24obmV3TGF5ZXIpIHtcbiAgLy8gZmluZCBjb2x1bW4gZmllbGRJZHhcbiAgbGV0IGNvbHVtbkNvbmZpZyA9IG5ld0xheWVyLmdldExheWVyQ29sdW1ucygpO1xuICAvLyBpZiBjb2x1bW5Nb2RlIGlzIGRlZmluZWQsIGZpbmQgY29sdW1uIG1vZGUgY29uZmlnXG4gIGNvbnN0IGNvbE1vZGVDb25maWcgPSBuZXdMYXllci5jb25maWcuY29sdW1uTW9kZVxuICAgID8gKG5ld0xheWVyLnN1cHBvcnRlZENvbHVtbk1vZGVzIHx8IFtdKS5maW5kKFxuICAgICAgICBjb2xNb2RlID0+IGNvbE1vZGUua2V5ID09PSBuZXdMYXllci5jb25maWcuY29sdW1uTW9kZVxuICAgICAgKVxuICAgIDogbnVsbDtcblxuICBpZiAoY29sTW9kZUNvbmZpZykge1xuICAgIC8vIG9ubHkgdmFsaWRhdGUgY29sdW1ucyBpbiBjb2x1bW4gbW9kZVxuICAgIGNvbHVtbkNvbmZpZyA9IFtcbiAgICAgIC4uLihjb2xNb2RlQ29uZmlnLnJlcXVpcmVkQ29sdW1ucyB8fCBbXSksXG4gICAgICAuLi4oY29sTW9kZUNvbmZpZy5vcHRpb25hbENvbHVtbnMgfHwgW10pXG4gICAgXS5yZWR1Y2UoXG4gICAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XTogY29sdW1uQ29uZmlnW2tleV1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGNvbHVtbkNvbmZpZztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCBsYXllciBjb25maWcgd2l0aCBuZXcgZGF0YSxcbiAqIHVwZGF0ZSBmaWVsZElkeCBiYXNlZCBvbiBuZXcgZmllbGRzXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcldpdGhEYXRhKFxuICBkYXRhc2V0OiBLZXBsZXJUYWJsZSxcbiAgc2F2ZWRMYXllcjogUGFyc2VkTGF5ZXIsXG4gIGxheWVyQ2xhc3NlczogVmlzU3RhdGVbJ2xheWVyQ2xhc3NlcyddLFxuICBvcHRpb25zOiBWYWxpZGF0ZUxheWVyT3B0aW9uID0ge31cbik6IExheWVyIHwgbnVsbCB7XG4gIGNvbnN0IHtmaWVsZHMsIGlkOiBkYXRhSWR9ID0gZGF0YXNldDtcbiAgY29uc3Qge3R5cGV9ID0gc2F2ZWRMYXllcjtcbiAgY29uc3Qge3Rocm93T25FcnJvcn0gPSBvcHRpb25zO1xuICAvLyBsYXllciBkb2VzbnQgaGF2ZSBhIHZhbGlkIHR5cGVcbiAgaWYgKCF0eXBlIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobGF5ZXJDbGFzc2VzLCB0eXBlKSB8fCAhc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICBpZiAodGhyb3dPbkVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBpbnZhbGlkIHR5cGUgXCIke3R5cGV9XCIgb3IgY29uZmlnIGlzIG1pc3NpbmdgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgbmV3TGF5ZXIgPSBuZXcgbGF5ZXJDbGFzc2VzW3R5cGVdKHtcbiAgICBpZDogc2F2ZWRMYXllci5pZCxcbiAgICBkYXRhSWQsXG4gICAgbGFiZWw6IHNhdmVkTGF5ZXIuY29uZmlnLmxhYmVsLFxuICAgIGNvbG9yOiBzYXZlZExheWVyLmNvbmZpZy5jb2xvcixcbiAgICBpc1Zpc2libGU6IHNhdmVkTGF5ZXIuY29uZmlnLmlzVmlzaWJsZSxcbiAgICBoaWRkZW46IHNhdmVkTGF5ZXIuY29uZmlnLmhpZGRlbixcbiAgICBjb2x1bW5Nb2RlOiBzYXZlZExheWVyLmNvbmZpZy5jb2x1bW5Nb2RlLFxuICAgIGhpZ2hsaWdodENvbG9yOiBzYXZlZExheWVyLmNvbmZpZy5oaWdobGlnaHRDb2xvclxuICB9KTtcblxuICBjb25zdCBjb2x1bW5Db25maWcgPSBfZ2V0Q29sdW1uQ29uZmlnRm9yVmFsaWRhdGlvbihuZXdMYXllcik7XG5cbiAgaWYgKE9iamVjdC5rZXlzKGNvbHVtbkNvbmZpZykpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdmFsaWRhdGVTYXZlZExheWVyQ29sdW1ucyhcbiAgICAgIGZpZWxkcyxcbiAgICAgIHNhdmVkTGF5ZXIuY29uZmlnLmNvbHVtbnMsXG4gICAgICBjb2x1bW5Db25maWcsXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICBpZiAoY29sdW1ucykge1xuICAgICAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgICBjb2x1bW5zOiB7XG4gICAgICAgICAgLi4ubmV3TGF5ZXIuY29uZmlnLmNvbHVtbnMsXG4gICAgICAgICAgLi4uY29sdW1uc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFvcHRpb25zLmFsbG93RW1wdHlDb2x1bW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRleHRMYWJlbCA9XG4gICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsICYmIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWxcbiAgICAgID8gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChcbiAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbCxcbiAgICAgICAgICBzYXZlZExheWVyLmNvbmZpZy50ZXh0TGFiZWwsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApXG4gICAgICA6IG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWw7XG5cbiAgLy8gY29weSB2aXNDb25maWcgb3ZlciB0byBlbXB0eUxheWVyIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYWxsIHRoZSBwcm9wc1xuICBjb25zdCBjb3BpZWRWaXNDb25maWcgPSBuZXdMYXllci5jb3B5TGF5ZXJDb25maWcoXG4gICAgbmV3TGF5ZXIuY29uZmlnLnZpc0NvbmZpZyxcbiAgICBzYXZlZExheWVyLmNvbmZpZy52aXNDb25maWcgfHwge30sXG4gICAge1xuICAgICAgc2hhbGxvd0NvcHk6IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ11cbiAgICB9XG4gICk7XG5cbiAgLy8gY2FsbCBsYXllciBtZXRob2RzIHRvIHZhbGlkYXRlIHZpc0NvbmZpZyB3aGVuIHN3aXRjaGluZyBkYXRhc2V0XG4gIGNvbnN0IHZpc0NvbmZpZyA9IG5ld0xheWVyLnZhbGlkYXRlVmlzQ29uZmlnXG4gICAgPyBuZXdMYXllci52YWxpZGF0ZVZpc0NvbmZpZyhkYXRhc2V0LCBjb3BpZWRWaXNDb25maWcpXG4gICAgOiBjb3BpZWRWaXNDb25maWc7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIHZpc0NvbmZpZyxcbiAgICB0ZXh0TGFiZWxcbiAgfSk7XG5cbiAgLy8gdmlzdWFsIGNoYW5uZWwgZmllbGQgaXMgc2F2ZWQgdG8gYmUge25hbWUsIHR5cGV9XG4gIC8vIGZpbmQgdmlzdWFsIGNoYW5uZWwgZmllbGQgYnkgbWF0Y2hpbmcgYm90aCBuYW1lIGFuZCB0eXBlXG4gIC8vIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gIG5ld0xheWVyID0gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKGZpZWxkcywgbmV3TGF5ZXIsIHNhdmVkTGF5ZXIsIG9wdGlvbnMpO1xuXG4gIGlmICh0aHJvd09uRXJyb3IpIHtcbiAgICBpZiAoIW5ld0xheWVyLmlzVmFsaWRUb1NhdmUoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBpcyBub3QgdmFsaWQgdG8gc2F2ZTogJHtuZXdMYXllci5pZH1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUVkaXRvcjxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBzYXZlZEVkaXRvcjogU2F2ZWRFZGl0b3IpIHtcbiAgaWYgKCFzYXZlZEVkaXRvcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjoge1xuICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgZmVhdHVyZXM6IFsuLi5zdGF0ZS5lZGl0b3IuZmVhdHVyZXMsIC4uLihzYXZlZEVkaXRvci5mZWF0dXJlcyB8fCBbXSldLFxuICAgICAgLy8gaWYgc2F2ZWRFZGl0b3IudmlzaWJsZSBpcyB1bmRlZmluZWQga2VlcCBzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgICAgdmlzaWJsZTogc2F2ZWRFZGl0b3IudmlzaWJsZSA/PyBzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tYmluZUVkaXRvckNvbmZpZ3MoY29uZmlnczogU2F2ZWRFZGl0b3JbXSk6IFNhdmVkRWRpdG9yIHtcbiAgcmV0dXJuIGNvbmZpZ3MucmVkdWNlKFxuICAgIChhY2MsIG5leHRDb25maWcpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjYyxcbiAgICAgICAgZmVhdHVyZXM6IFsuLi5hY2MuZmVhdHVyZXMsIC4uLihuZXh0Q29uZmlnLmZlYXR1cmVzIHx8IFtdKV1cbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBzdGFydCB3aXRoOlxuICAgICAgLy8gLSBlbXB0eSBhcnJheSBmb3IgZmVhdHVyZXMgYWNjdW11bGF0aW9uXG4gICAgICAvLyAtIGFuZCBhcmUgYW55IG9mIHRoZSBjb25maWdzJyB2aXNpYmxlIHZhbHVlcyB0cnVlP1xuICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgdmlzaWJsZTogY29uZmlncy5zb21lKGMgPT4gYz8udmlzaWJsZSlcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEYXRhc2V0c0J5T3JkZXIoc3RhdGU6IFZpc1N0YXRlLCBuZXdEYXRhRW50cmllczogRGF0YXNldHMpOiBEYXRhc2V0cyB7XG4gIGNvbnN0IG1lcmdlZCA9IHtcbiAgICAuLi5zdGF0ZS5kYXRhc2V0cyxcbiAgICAuLi5uZXdEYXRhRW50cmllc1xuICB9O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyKSkge1xuICAgIC8vIHByZXNlcnZlRGF0YXNldE9yZGVyICBtaWdodCBub3QgaW5jbHVkZSB0aGUgIG5ldyBkYXRhc2V0c1xuICAgIGNvbnN0IG5ld0RhdGFzZXRJZHMgPSBPYmplY3Qua2V5cyhtZXJnZWQpLmZpbHRlcihcbiAgICAgIGlkID0+ICFzdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlcj8uaW5jbHVkZXMoaWQpXG4gICAgKTtcbiAgICByZXR1cm4gWy4uLnN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyLCAuLi5uZXdEYXRhc2V0SWRzXS5yZWR1Y2UoXG4gICAgICAoYWNjdSwgZGF0YUlkKSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICAuLi4obWVyZ2VkW2RhdGFJZF0gPyB7W2RhdGFJZF06IG1lcmdlZFtkYXRhSWRdfSA6IHt9KVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vKipcbiAqIFNpbWxpYXIgcHVycG9zZSB0byBhZ2dyZWdhdGlvbiB1dGlscyBgZ2V0TW9kZWAgZnVuY3Rpb24sXG4gKiBidXQgcmV0dXJucyB0aGUgbW9kZSBpbiB0aGUgc2FtZSB2YWx1ZSB0eXBlIHdpdGhvdXQgY29lcmNpbmcgdG8gYSBzdHJpbmcuXG4gKiBJdCBpZ25vcmVzIGB1bmRlZmluZWRgIG9yIGBudWxsYCB2YWx1ZXMsIGJ1dCByZXR1cm5zIGBudWxsYCBpZiBubyBtb2RlIGNvdWxkIGJlIGNhbGN1bGF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlV2l0aEhpZ2hlc3RPY2N1cnJlbmNlPFQ+KGFycjogVFtdKTogVCB8IG51bGwge1xuICBjb25zdCB0YWxseXMgPSBuZXcgTWFwKCk7XG4gIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICBpZiAobm90TnVsbG9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgaWYgKCF0YWxseXMuaGFzKHZhbHVlKSkge1xuICAgICAgICB0YWxseXMuc2V0KHZhbHVlLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhbGx5cy5zZXQodmFsdWUsIHRhbGx5cy5nZXQodmFsdWUpICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgLy8gcmV0dXJuIHRoZSB2YWx1ZSB3aXRoIHRoZSBoaWdoZXN0IHRvdGFsIG9jY3VycmVuY2UgY291bnRcbiAgaWYgKHRhbGx5cy5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIFsuLi50YWxseXMuZW50cmllcygpXT8ucmVkdWNlKChhY2MsIG5leHQpID0+IChuZXh0WzFdID4gYWNjWzFdID8gbmV4dCA6IGFjYykpWzBdO1xufVxuXG5leHBvcnQgY29uc3QgVklTX1NUQVRFX01FUkdFUlM6IFZpc1N0YXRlTWVyZ2Vyczxhbnk+ID0gW1xuICB7XG4gICAgbWVyZ2U6IG1lcmdlTGF5ZXJzLFxuICAgIHByb3A6ICdsYXllcnMnLFxuICAgIHRvTWVyZ2VQcm9wOiAnbGF5ZXJUb0JlTWVyZ2VkJyxcbiAgICBwcmVzZXJ2ZU9yZGVyOiAncHJlc2VydmVMYXllck9yZGVyJ1xuICB9LFxuICB7XG4gICAgbWVyZ2U6IG1lcmdlTGF5ZXJPcmRlcixcbiAgICBwcm9wOiAnbGF5ZXJPcmRlcidcbiAgfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZUZpbHRlcnMsXG4gICAgcHJvcDogJ2ZpbHRlcnMnLFxuICAgIHRvTWVyZ2VQcm9wOiAnZmlsdGVyVG9CZU1lcmdlZCcsXG4gICAgcHJlc2VydmVPcmRlcjogJ3ByZXNlcnZlRmlsdGVyT3JkZXInLFxuICAgIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzOiByZXBsYWNlRmlsdGVyRGF0YXNldElkc1xuICB9LFxuICB7XG4gICAgbWVyZ2U6IG1lcmdlRWZmZWN0cyxcbiAgICBwcm9wOiAnZWZmZWN0cydcbiAgfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZUFubm90YXRpb25zLFxuICAgIHByb3A6ICdhbm5vdGF0aW9ucycsXG4gICAgdG9NZXJnZVByb3A6ICdhbm5vdGF0aW9uc1RvQmVNZXJnZWQnXG4gIH0sXG4gIHtcbiAgICBtZXJnZTogbWVyZ2VJbnRlcmFjdGlvbnMsXG4gICAgcHJvcDogJ2ludGVyYWN0aW9uQ29uZmlnJyxcbiAgICB0b01lcmdlUHJvcDogJ2ludGVyYWN0aW9uVG9CZU1lcmdlZCcsXG4gICAgcmVwbGFjZVBhcmVudERhdGFzZXRJZHM6IHJlcGxhY2VJbnRlcmFjdGlvbkRhdGFzZXRJZHMsXG4gICAgc2F2ZVVubWVyZ2VkOiBzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb24sXG4gICAgY29tYmluZUNvbmZpZ3M6IGNvbWJpbmVJbnRlcmFjdGlvbkNvbmZpZ3NcbiAgfSxcbiAge21lcmdlOiBtZXJnZUxheWVyQmxlbmRpbmcsIHByb3A6ICdsYXllckJsZW5kaW5nJywgY29tYmluZUNvbmZpZ3M6IGNvbWJpbmVMYXllckJsZW5kaW5nQ29uZmlnc30sXG4gIHtcbiAgICBtZXJnZTogbWVyZ2VPdmVybGF5QmxlbmRpbmcsXG4gICAgcHJvcDogJ292ZXJsYXlCbGVuZGluZycsXG4gICAgY29tYmluZUNvbmZpZ3M6IGNvbWJpbmVPdmVybGF5QmxlbmRpbmdDb25maWdzXG4gIH0sXG4gIHttZXJnZTogbWVyZ2VTcGxpdE1hcHMsIHByb3A6ICdzcGxpdE1hcHMnLCB0b01lcmdlUHJvcDogJ3NwbGl0TWFwc1RvQmVNZXJnZWQnfSxcbiAge21lcmdlOiBtZXJnZUFuaW1hdGlvbkNvbmZpZywgcHJvcDogJ2FuaW1hdGlvbkNvbmZpZycsIGNvbWJpbmVDb25maWdzOiBjb21iaW5lQW5pbWF0aW9uQ29uZmlnc30sXG4gIHttZXJnZTogbWVyZ2VFZGl0b3IsIHByb3A6ICdlZGl0b3InLCBjb21iaW5lQ29uZmlnczogY29tYmluZUVkaXRvckNvbmZpZ3N9XG5dO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQSxPQUFPQSxJQUFJLE1BQU0sd0JBQXdCO0FBQ3pDLE9BQU9DLElBQUksTUFBTSx3QkFBd0I7QUFDekMsT0FBT0MsV0FBVyxNQUFNLCtCQUErQjtBQUN2RCxPQUFPQyxTQUFTLE1BQU0sV0FBVztBQUNqQyxTQUNFQyxXQUFXLEVBQ1hDLDhCQUE4QixFQUM5QkMsc0JBQXNCLEVBQ3RCQyw2QkFBNkIsRUFDN0JDLFFBQVEsRUFDUkMsU0FBUyxFQUNUQyxhQUFhLFFBQ1Isa0JBQWtCO0FBR3pCLFNBQVFDLFlBQVksUUFBTyxvQkFBb0I7QUFDL0MsU0FBUUMsa0JBQWtCLFFBQU8seUJBQXlCO0FBQzFELFNBQ0VDLGlCQUFpQixFQUNqQkMsZUFBZSxFQUNmQyxpQkFBaUIsRUFDakJDLGdCQUFnQixFQUNoQkMsNkJBQTZCLEVBQzdCQyw2QkFBNkIsUUFDeEIsc0JBQXNCO0FBQzdCLFNBQVFDLGVBQWUsUUFBdUQsb0JBQW9CO0FBb0JsRyxTQUErQkMsaUJBQWlC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