@kepler.gl/reducers 3.1.0-alpha.1 → 3.1.0-alpha.3

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 (49) hide show
  1. package/dist/combined-updaters.d.ts +79 -0
  2. package/dist/combined-updaters.js +358 -0
  3. package/dist/composer-helpers.d.ts +24 -0
  4. package/dist/composer-helpers.js +101 -0
  5. package/dist/composers.d.ts +18 -0
  6. package/dist/composers.js +23 -0
  7. package/dist/core.d.ts +64 -0
  8. package/dist/core.js +105 -0
  9. package/dist/data-utils.d.ts +12 -0
  10. package/dist/data-utils.js +57 -0
  11. package/dist/export-utils.d.ts +21 -0
  12. package/dist/export-utils.js +91 -0
  13. package/dist/index.d.ts +35 -0
  14. package/dist/index.js +342 -0
  15. package/dist/interaction-utils.d.ts +29 -0
  16. package/dist/interaction-utils.js +105 -0
  17. package/dist/layer-utils.d.ts +96 -0
  18. package/dist/layer-utils.js +310 -0
  19. package/dist/map-state-updaters.d.ts +93 -0
  20. package/dist/map-state-updaters.js +432 -0
  21. package/dist/map-state.d.ts +75 -0
  22. package/dist/map-state.js +35 -0
  23. package/dist/map-style-updaters.d.ts +179 -0
  24. package/dist/map-style-updaters.js +656 -0
  25. package/dist/map-style.d.ts +4 -0
  26. package/dist/map-style.js +34 -0
  27. package/dist/merger-handler.d.ts +10 -0
  28. package/dist/merger-handler.js +105 -0
  29. package/dist/middleware.d.ts +8 -0
  30. package/dist/middleware.js +27 -0
  31. package/dist/provider-state-updaters.d.ts +35 -0
  32. package/dist/provider-state-updaters.js +348 -0
  33. package/dist/provider-state.d.ts +4 -0
  34. package/dist/provider-state.js +35 -0
  35. package/dist/root.d.ts +24 -0
  36. package/dist/root.js +206 -0
  37. package/dist/ui-state-updaters.d.ts +362 -0
  38. package/dist/ui-state-updaters.js +762 -0
  39. package/dist/ui-state.d.ts +3 -0
  40. package/dist/ui-state.js +37 -0
  41. package/dist/vis-state-merger.d.ts +143 -0
  42. package/dist/vis-state-merger.js +812 -0
  43. package/dist/vis-state-selectors.d.ts +10 -0
  44. package/dist/vis-state-selectors.js +30 -0
  45. package/dist/vis-state-updaters.d.ts +546 -0
  46. package/dist/vis-state-updaters.js +3338 -0
  47. package/dist/vis-state.d.ts +155 -0
  48. package/dist/vis-state.js +36 -0
  49. package/package.json +23 -17
@@ -0,0 +1,812 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.VIS_STATE_MERGERS = void 0;
8
+ exports.createLayerFromConfig = createLayerFromConfig;
9
+ exports.insertLayerAtRightOrder = insertLayerAtRightOrder;
10
+ exports.isSavedLayerConfigV1 = isSavedLayerConfigV1;
11
+ exports.mergeAnimationConfig = mergeAnimationConfig;
12
+ exports.mergeDatasetsByOrder = mergeDatasetsByOrder;
13
+ exports.mergeEditor = mergeEditor;
14
+ exports.mergeEffects = mergeEffects;
15
+ exports.mergeFilters = mergeFilters;
16
+ exports.mergeInteractionTooltipConfig = mergeInteractionTooltipConfig;
17
+ exports.mergeInteractions = mergeInteractions;
18
+ exports.mergeLayerBlending = mergeLayerBlending;
19
+ exports.mergeLayers = mergeLayers;
20
+ exports.mergeOverlayBlending = mergeOverlayBlending;
21
+ exports.mergeSplitMaps = mergeSplitMaps;
22
+ exports.parseLayerConfig = parseLayerConfig;
23
+ exports.replaceFilterDatasetIds = replaceFilterDatasetIds;
24
+ exports.serializeEffect = serializeEffect;
25
+ exports.serializeLayer = serializeLayer;
26
+ exports.serializeVisState = serializeVisState;
27
+ exports.validateColumn = validateColumn;
28
+ exports.validateLayerWithData = validateLayerWithData;
29
+ exports.validateLayersByDatasets = validateLayersByDatasets;
30
+ exports.validateSavedLayerColumns = validateSavedLayerColumns;
31
+ exports.validateSavedTextLabel = validateSavedTextLabel;
32
+ exports.validateSavedVisualChannels = validateSavedVisualChannels;
33
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
34
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
35
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
36
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
37
+ var _lodash = _interopRequireDefault(require("lodash.uniq"));
38
+ var _lodash2 = _interopRequireDefault(require("lodash.pick"));
39
+ var _lodash3 = _interopRequireDefault(require("lodash.flattendeep"));
40
+ var _deepmerge = _interopRequireDefault(require("deepmerge"));
41
+ var _utils = require("@kepler.gl/utils");
42
+ var _effects = require("@kepler.gl/effects");
43
+ var _constants = require("@kepler.gl/constants");
44
+ var _schemas = require("@kepler.gl/schemas");
45
+ var _table = require("@kepler.gl/table");
46
+ var _layerUtils = require("./layer-utils");
47
+ var _excluded = ["enabled"];
48
+ 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; } } }; }
49
+ 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; } }
50
+ 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; }
51
+ 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; }
52
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
53
+ // Copyright contributors to the kepler.gl project
54
+ /**
55
+ * Merge loaded filters with current state, if no fields or data are loaded
56
+ * save it for later
57
+ *
58
+ */
59
+ function mergeFilters(state, filtersToMerge, fromConfig) {
60
+ var preserveFilterOrder = fromConfig ? filtersToMerge === null || filtersToMerge === void 0 ? void 0 : filtersToMerge.map(function (l) {
61
+ return l.id;
62
+ }) : state.preserveFilterOrder;
63
+ if (!Array.isArray(filtersToMerge) || !filtersToMerge.length) {
64
+ return state;
65
+ }
66
+ var _validateFiltersUpdat = (0, _utils.validateFiltersUpdateDatasets)(state, filtersToMerge),
67
+ validated = _validateFiltersUpdat.validated,
68
+ failed = _validateFiltersUpdat.failed,
69
+ updatedDatasets = _validateFiltersUpdat.updatedDatasets;
70
+ var updatedFilters = insertItemBasedOnPreservedOrder(state.filters, validated, preserveFilterOrder);
71
+
72
+ // merge filter with existing
73
+ updatedFilters = (0, _table.resetFilterGpuMode)(updatedFilters);
74
+ updatedFilters = (0, _table.assignGpuChannels)(updatedFilters);
75
+ // filter data
76
+ var datasetsToFilter = (0, _lodash["default"])((0, _lodash3["default"])(validated.map(function (f) {
77
+ return f.dataId;
78
+ })));
79
+ var filtered = (0, _utils.applyFiltersToDatasets)(datasetsToFilter, updatedDatasets, updatedFilters, state.layers);
80
+ return _objectSpread(_objectSpread({}, state), {}, {
81
+ filters: updatedFilters,
82
+ datasets: filtered,
83
+ preserveFilterOrder: preserveFilterOrder,
84
+ filterToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.filterToBeMerged), (0, _toConsumableArray2["default"])(failed))
85
+ });
86
+ }
87
+
88
+ // replace dataId in saved Filter
89
+ function replaceFilterDatasetIds(savedFilter, dataId, dataIdToUse) {
90
+ var replaced = [];
91
+ savedFilter.forEach(function (filter) {
92
+ if (filter.dataId.includes(dataId)) {
93
+ var newDataId = filter.dataId.map(function (d) {
94
+ return d === dataId ? dataIdToUse : d;
95
+ });
96
+ replaced.push(_objectSpread(_objectSpread({}, filter), {}, {
97
+ dataId: newDataId
98
+ }));
99
+ }
100
+ });
101
+ return replaced.length ? replaced : null;
102
+ }
103
+ function isSavedLayerConfigV1(layerConfig) {
104
+ // exported layer configuration contains visualChannels property
105
+ return layerConfig === null || layerConfig === void 0 ? void 0 : layerConfig.visualChannels;
106
+ }
107
+ function parseLayerConfig(schema, layerConfig) {
108
+ var _schema$parseSavedCon;
109
+ // assume the layer config is current version
110
+ var savedConfig = {
111
+ version: _schemas.CURRENT_VERSION,
112
+ config: {
113
+ visState: {
114
+ layers: [layerConfig],
115
+ layerOrder: [layerConfig.id]
116
+ }
117
+ }
118
+ };
119
+ 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];
120
+ }
121
+ function insertItemBasedOnPreservedOrder(currentItems, items) {
122
+ var preservedOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
123
+ var defaultStart = arguments.length > 3 ? arguments[3] : undefined;
124
+ var newItems = (0, _toConsumableArray2["default"])(currentItems);
125
+ var _iterator = _createForOfIteratorHelper(items),
126
+ _step;
127
+ try {
128
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
129
+ var item = _step.value;
130
+ var expectedIdx = preservedOrder.indexOf(item.id);
131
+ // insertAt the end by default
132
+ var insertAt = defaultStart ? 0 : newItems.length;
133
+ if (expectedIdx > 0) {
134
+ // look for layer to insert after
135
+ var i = expectedIdx + 1;
136
+ var preceedIdx = -1;
137
+ var _loop = function _loop() {
138
+ // keep looking for preceed layer that is already loaded
139
+ var preceedItemId = preservedOrder[i - 1];
140
+ preceedIdx = newItems.findIndex(function (d) {
141
+ return d.id === preceedItemId;
142
+ });
143
+ };
144
+ while (i-- > 0 && preceedIdx < 0) {
145
+ _loop();
146
+ }
147
+ if (preceedIdx > -1) {
148
+ // if found
149
+ insertAt = preceedIdx + 1;
150
+ }
151
+ }
152
+ newItems = (0, _utils.arrayInsert)(newItems, insertAt, item);
153
+ }
154
+ } catch (err) {
155
+ _iterator.e(err);
156
+ } finally {
157
+ _iterator.f();
158
+ }
159
+ return newItems;
160
+ }
161
+ function createLayerFromConfig(state, layerConfig) {
162
+ // check if the layer config is parsed
163
+ var parsedLayerConfig = isSavedLayerConfigV1(layerConfig) ? parseLayerConfig(state.schema, layerConfig) : layerConfig;
164
+ if (!parsedLayerConfig) {
165
+ return null;
166
+ }
167
+ // first validate config against dataset
168
+ var _validateLayersByData = validateLayersByDatasets(state.datasets, state.layerClasses, [parsedLayerConfig], {
169
+ allowEmptyColumn: true
170
+ }),
171
+ validated = _validateLayersByData.validated,
172
+ failed = _validateLayersByData.failed;
173
+ if (failed !== null && failed !== void 0 && failed.length || !validated.length) {
174
+ // failed
175
+ return null;
176
+ }
177
+ var newLayer = validated[0];
178
+ newLayer.updateLayerDomain(state.datasets);
179
+ return newLayer;
180
+ }
181
+
182
+ /**
183
+ * Get loaded layer from state
184
+ */
185
+ function serializeLayer(newLayer, schema) {
186
+ var _serializedVisState$l;
187
+ var serializedVisState = serializeVisState({
188
+ layers: [newLayer],
189
+ layerOrder: [newLayer.id]
190
+ }, schema);
191
+ return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$l = serializedVisState.layers) === null || _serializedVisState$l === void 0 ? void 0 : _serializedVisState$l[0];
192
+ }
193
+
194
+ /**
195
+ * Get loaded effect from state
196
+ */
197
+ function serializeEffect(newEffect, schema) {
198
+ var _serializedVisState$e;
199
+ var serializedVisState = serializeVisState({
200
+ effects: [newEffect],
201
+ effectOrder: [newEffect.id]
202
+ }, schema);
203
+ return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$e = serializedVisState.effects) === null || _serializedVisState$e === void 0 ? void 0 : _serializedVisState$e[0];
204
+ }
205
+
206
+ /**
207
+ * Get vis state config
208
+ */
209
+ function serializeVisState(visState, schema) {
210
+ var _schema$parseSavedCon2;
211
+ var savedState = schema.getConfigToSave({
212
+ visState: visState
213
+ });
214
+ return savedState ? (_schema$parseSavedCon2 = schema.parseSavedConfig(savedState)) === null || _schema$parseSavedCon2 === void 0 ? void 0 : _schema$parseSavedCon2.visState : undefined;
215
+ }
216
+ /**
217
+ * Merge layers from de-serialized state, if no fields or data are loaded
218
+ * save it for later
219
+ *
220
+ */
221
+ function mergeLayers(state) {
222
+ var layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
223
+ var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
224
+ var preserveLayerOrder = fromConfig ? (0, _layerUtils.getLayerOrderFromLayers)(layersToMerge) : state.preserveLayerOrder;
225
+ if (!Array.isArray(layersToMerge) || !layersToMerge.length) {
226
+ return state;
227
+ }
228
+ // don't merge layer if dataset is being merged
229
+ var unmerged = [];
230
+ var toMerge = [];
231
+ layersToMerge.forEach(function (l) {
232
+ var _l$config;
233
+ if (l !== null && l !== void 0 && (_l$config = l.config) !== null && _l$config !== void 0 && _l$config.dataId && state.isMergingDatasets[l.config.dataId]) {
234
+ unmerged.push(l);
235
+ } else {
236
+ toMerge.push(l);
237
+ }
238
+ });
239
+ var _validateLayersByData2 = validateLayersByDatasets(state.datasets, state.layerClasses, toMerge),
240
+ mergedLayer = _validateLayersByData2.validated,
241
+ failed = _validateLayersByData2.failed;
242
+ unmerged.push.apply(unmerged, (0, _toConsumableArray2["default"])(failed));
243
+ // put new layers in front of current layers
244
+ var _insertLayerAtRightOr = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder, preserveLayerOrder),
245
+ newLayerOrder = _insertLayerAtRightOr.newLayerOrder,
246
+ newLayers = _insertLayerAtRightOr.newLayers;
247
+ return _objectSpread(_objectSpread({}, state), {}, {
248
+ layers: newLayers,
249
+ layerOrder: newLayerOrder,
250
+ preserveLayerOrder: preserveLayerOrder,
251
+ layerToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.layerToBeMerged), unmerged)
252
+ });
253
+ }
254
+ function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
255
+ var preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
256
+ if (!(layersToInsert !== null && layersToInsert !== void 0 && layersToInsert.length)) {
257
+ return {
258
+ newLayers: currentLayers,
259
+ newLayerOrder: currentOrder
260
+ };
261
+ }
262
+ // perservedOrder ['a', 'b', 'c'];
263
+ // layerOrder ['a', 'b', 'c']
264
+ var currentLayerQueue = currentOrder.map(function (id) {
265
+ return (0, _utils.findById)(id)(currentLayers);
266
+ }).filter(function (layer) {
267
+ return Boolean(layer);
268
+ });
269
+ var newLayers = currentLayers.concat(layersToInsert);
270
+ var newLayerOrderQueue = insertItemBasedOnPreservedOrder(currentLayerQueue, layersToInsert, preservedOrder, true);
271
+
272
+ // reconstruct layerOrder after insert
273
+ var newLayerOrder = (0, _layerUtils.getLayerOrderFromLayers)(newLayerOrderQueue);
274
+ return {
275
+ newLayerOrder: newLayerOrder,
276
+ newLayers: newLayers
277
+ };
278
+ }
279
+
280
+ /**
281
+ * Merge interactions with saved config
282
+ *
283
+ */
284
+ function mergeInteractions(state, interactionToBeMerged) {
285
+ var merged = {};
286
+ var unmerged = {};
287
+ if (interactionToBeMerged) {
288
+ Object.keys(interactionToBeMerged).forEach(function (key) {
289
+ if (!state.interactionConfig[key]) {
290
+ return;
291
+ }
292
+ var currentConfig = key === 'tooltip' || key === 'brush' ? state.interactionConfig[key].config : null;
293
+ var _ref = interactionToBeMerged[key] || {},
294
+ enabled = _ref.enabled,
295
+ configSaved = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
296
+ var configToMerge = configSaved;
297
+ if (key === 'tooltip') {
298
+ var _mergeInteractionTool = mergeInteractionTooltipConfig(state, configSaved),
299
+ mergedTooltip = _mergeInteractionTool.mergedTooltip,
300
+ unmergedTooltip = _mergeInteractionTool.unmergedTooltip;
301
+
302
+ // merge new dataset tooltips with original dataset tooltips
303
+ configToMerge = {
304
+ fieldsToShow: _objectSpread(_objectSpread({}, currentConfig.fieldsToShow), mergedTooltip)
305
+ };
306
+ if (Object.keys(unmergedTooltip).length) {
307
+ // @ts-expect-error
308
+ unmerged.tooltip = {
309
+ fieldsToShow: unmergedTooltip,
310
+ enabled: Boolean(enabled)
311
+ };
312
+ }
313
+ }
314
+ merged[key] = _objectSpread(_objectSpread({}, state.interactionConfig[key]), {}, {
315
+ enabled: Boolean(enabled)
316
+ }, currentConfig ? {
317
+ config: (0, _lodash2["default"])(_objectSpread(_objectSpread({}, currentConfig), configToMerge), Object.keys(currentConfig))
318
+ } : {});
319
+ });
320
+ }
321
+ var nextState = _objectSpread(_objectSpread({}, state), {}, {
322
+ interactionConfig: _objectSpread(_objectSpread({}, state.interactionConfig), merged),
323
+ interactionToBeMerged: savedUnmergedInteraction(state, unmerged)
324
+ });
325
+ return nextState;
326
+ }
327
+ function savedUnmergedInteraction(state, unmerged) {
328
+ var _unmerged$tooltip, _unmerged$tooltip2, _state$interactionToB, _unmerged$tooltip3;
329
+ if (!(unmerged !== null && unmerged !== void 0 && (_unmerged$tooltip = unmerged.tooltip) !== null && _unmerged$tooltip !== void 0 && _unmerged$tooltip.fieldsToShow)) {
330
+ return state.interactionToBeMerged;
331
+ }
332
+ return {
333
+ 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' ? {
334
+ enabled: unmerged.tooltip.enabled
335
+ } : {}), {}, {
336
+ 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)
337
+ })
338
+ };
339
+ }
340
+ function replaceInteractionDatasetIds(interactionConfig, dataId, dataIdToReplace) {
341
+ var _interactionConfig$to;
342
+ if (interactionConfig !== null && interactionConfig !== void 0 && (_interactionConfig$to = interactionConfig.tooltip) !== null && _interactionConfig$to !== void 0 && _interactionConfig$to.fieldsToShow[dataId]) {
343
+ var _interactionConfig$to2;
344
+ return _objectSpread(_objectSpread({}, interactionConfig), {}, {
345
+ tooltip: _objectSpread(_objectSpread({}, interactionConfig.tooltip), {}, {
346
+ fieldsToShow: (0, _defineProperty2["default"])({}, dataIdToReplace, interactionConfig === null || interactionConfig === void 0 || (_interactionConfig$to2 = interactionConfig.tooltip) === null || _interactionConfig$to2 === void 0 ? void 0 : _interactionConfig$to2.fieldsToShow[dataId])
347
+ })
348
+ });
349
+ }
350
+ return null;
351
+ }
352
+ /**
353
+ * Merge splitMaps config with current visStete.
354
+ * 1. if current map is split, but splitMap DOESNOT contain maps
355
+ * : don't merge anything
356
+ * 2. if current map is NOT split, but splitMaps contain maps
357
+ * : add to splitMaps, and add current layers to splitMaps
358
+ */
359
+ function mergeSplitMaps(state) {
360
+ var splitMaps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
361
+ var merged = (0, _toConsumableArray2["default"])(state.splitMaps);
362
+ var unmerged = [];
363
+ splitMaps.forEach(function (sm, i) {
364
+ var entries = Object.entries(sm.layers);
365
+ if (entries.length > 0) {
366
+ entries.forEach(function (_ref2) {
367
+ var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
368
+ id = _ref3[0],
369
+ value = _ref3[1];
370
+ // check if layer exists
371
+ var pushTo = state.layers.find(function (l) {
372
+ return l.id === id;
373
+ }) ? merged : unmerged;
374
+
375
+ // create map panel if current map is not split
376
+ pushTo[i] = pushTo[i] || _objectSpread(_objectSpread({}, sm), {}, {
377
+ layers: pushTo === merged ? (0, _utils.getInitialMapLayersForSplitMap)(state.layers) : []
378
+ });
379
+ pushTo[i].layers = _objectSpread(_objectSpread({}, pushTo[i].layers), {}, (0, _defineProperty2["default"])({}, id, value));
380
+ });
381
+ } else {
382
+ // We are merging if there are no layers in both split map
383
+ merged.push(sm);
384
+ }
385
+ });
386
+ return _objectSpread(_objectSpread({}, state), {}, {
387
+ splitMaps: merged,
388
+ splitMapsToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.splitMapsToBeMerged), unmerged)
389
+ });
390
+ }
391
+
392
+ /**
393
+ * Merge effects with saved config
394
+ */
395
+ function mergeEffects(state, effects, fromConfig) {
396
+ var newEffects = [].concat((0, _toConsumableArray2["default"])(state.effects), (0, _toConsumableArray2["default"])((effects || []).map(function (effect) {
397
+ return fromConfig ? (0, _effects.createEffect)(_deepmerge["default"].all([effect, {
398
+ // collapse all panels when loading effects
399
+ isConfigActive: false
400
+ }])) : effect;
401
+ }).filter(function (effect) {
402
+ return Boolean(effect && effect.isValidToSave());
403
+ })));
404
+ return _objectSpread(_objectSpread({}, state), {}, {
405
+ effects: newEffects,
406
+ effectOrder: newEffects.map(function (effect) {
407
+ return effect.id;
408
+ })
409
+ });
410
+ }
411
+
412
+ /**
413
+ * Merge interactionConfig.tooltip with saved config,
414
+ * validate fieldsToShow
415
+ *
416
+ * @param state
417
+ * @param tooltipConfig
418
+ * @return - {mergedTooltip: {}, unmergedTooltip: {}}
419
+ */
420
+ function mergeInteractionTooltipConfig(state) {
421
+ var tooltipConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
422
+ var unmergedTooltip = {};
423
+ var mergedTooltip = {};
424
+ if (!tooltipConfig || !tooltipConfig.fieldsToShow || !Object.keys(tooltipConfig.fieldsToShow).length) {
425
+ return {
426
+ mergedTooltip: mergedTooltip,
427
+ unmergedTooltip: unmergedTooltip
428
+ };
429
+ }
430
+ var _loop2 = function _loop2() {
431
+ if (!state.datasets[dataId] || state.isMergingDatasets[dataId]) {
432
+ // is not yet loaded
433
+ unmergedTooltip[dataId] = tooltipConfig.fieldsToShow[dataId];
434
+ } else {
435
+ // if dataset is loaded
436
+ var allFields = state.datasets[dataId].fields.map(function (d) {
437
+ return d.name;
438
+ });
439
+ var foundFieldsToShow = tooltipConfig.fieldsToShow[dataId].filter(function (field) {
440
+ return allFields.includes(field.name);
441
+ });
442
+ mergedTooltip[dataId] = foundFieldsToShow;
443
+ }
444
+ };
445
+ for (var dataId in tooltipConfig.fieldsToShow) {
446
+ _loop2();
447
+ }
448
+ return {
449
+ mergedTooltip: mergedTooltip,
450
+ unmergedTooltip: unmergedTooltip
451
+ };
452
+ }
453
+ /**
454
+ * Merge layerBlending with saved
455
+ *
456
+ */
457
+ function mergeLayerBlending(state, layerBlending) {
458
+ if (layerBlending && _constants.LAYER_BLENDINGS[layerBlending]) {
459
+ return _objectSpread(_objectSpread({}, state), {}, {
460
+ layerBlending: layerBlending
461
+ });
462
+ }
463
+ return state;
464
+ }
465
+
466
+ /**
467
+ * Merge overlayBlending with saved
468
+ */
469
+ function mergeOverlayBlending(state, overlayBlending) {
470
+ if (overlayBlending && _constants.OVERLAY_BLENDINGS[overlayBlending]) {
471
+ return _objectSpread(_objectSpread({}, state), {}, {
472
+ overlayBlending: overlayBlending
473
+ });
474
+ }
475
+ return state;
476
+ }
477
+
478
+ /**
479
+ * Merge animation config
480
+ */
481
+ function mergeAnimationConfig(state, animation) {
482
+ if (animation && animation.currentTime) {
483
+ return _objectSpread(_objectSpread({}, state), {}, {
484
+ animationConfig: _objectSpread(_objectSpread(_objectSpread({}, state.animationConfig), animation), {}, {
485
+ domain: null
486
+ })
487
+ });
488
+ }
489
+ return state;
490
+ }
491
+
492
+ /**
493
+ * Validate saved layer columns with new data,
494
+ * update fieldIdx based on new fields
495
+ *
496
+ * @param fields
497
+ * @param savedCols
498
+ * @param emptyCols
499
+ * @param options
500
+ * @return - validated columns or null
501
+ */
502
+
503
+ function validateSavedLayerColumns(fields) {
504
+ var savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
505
+ var emptyCols = arguments.length > 2 ? arguments[2] : undefined;
506
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
507
+ // Prepare columns for the validator
508
+ var columns = {};
509
+ var _loop3 = function _loop3() {
510
+ var key = _Object$keys[_i];
511
+ columns[key] = _objectSpread({}, emptyCols[key]);
512
+ var saved = savedCols[key];
513
+ if (saved) {
514
+ var fieldIdx = fields.findIndex(function (_ref4) {
515
+ var name = _ref4.name;
516
+ return name === saved;
517
+ });
518
+ if (fieldIdx > -1) {
519
+ // update found columns
520
+ columns[key].fieldIdx = fieldIdx;
521
+ columns[key].value = saved;
522
+ }
523
+ }
524
+ };
525
+ for (var _i = 0, _Object$keys = Object.keys(emptyCols); _i < _Object$keys.length; _i++) {
526
+ _loop3();
527
+ }
528
+
529
+ // find actual column fieldIdx, in case it has changed
530
+ var allColFound = Object.keys(columns).every(function (key) {
531
+ return validateColumn(columns[key], columns, fields);
532
+ });
533
+ var rv = allColFound ? columns : null;
534
+ if (options.throwOnError) {
535
+ var requiredColumns = Object.keys(emptyCols).filter(function (k) {
536
+ return !emptyCols[k].optional;
537
+ });
538
+ var missingColumns = requiredColumns.filter(function (k) {
539
+ return !(columns !== null && columns !== void 0 && columns[k].value);
540
+ });
541
+ if (missingColumns.length) {
542
+ throw new Error("Layer has missing or invalid columns: ".concat(missingColumns.join(', ')));
543
+ }
544
+ var configColumns = Object.keys(savedCols);
545
+ var invalidColumns = configColumns.filter(function (k) {
546
+ var _columns$k;
547
+ return !(columns !== null && columns !== void 0 && (_columns$k = columns[k]) !== null && _columns$k !== void 0 && _columns$k.value);
548
+ });
549
+ if (invalidColumns.length) {
550
+ throw new Error("Layer has invalid columns: ".concat(invalidColumns.join(', ')));
551
+ }
552
+ }
553
+ return rv;
554
+ }
555
+
556
+ /**
557
+ * Validate layer column
558
+ */
559
+ function validateColumn(column, columns, allFields) {
560
+ if (column.optional || column.value) {
561
+ return true;
562
+ }
563
+ if (column.validator) {
564
+ return column.validator(column, columns, allFields);
565
+ }
566
+ return false;
567
+ }
568
+
569
+ /**
570
+ * Validate saved text label config with new data
571
+ * refer to vis-state-schema.js TextLabelSchemaV1
572
+ *
573
+ * @param {Array<Object>} fields
574
+ * @param {Object} savedTextLabel
575
+ * @param {Object} options
576
+ * @return {Object} - validated textlabel
577
+ */
578
+ function validateSavedTextLabel(fields, _ref5, savedTextLabel) {
579
+ var _ref6 = (0, _slicedToArray2["default"])(_ref5, 1),
580
+ layerTextLabel = _ref6[0];
581
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
582
+ var savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel];
583
+
584
+ // validate field
585
+ return savedTextLabels.map(function (textLabel) {
586
+ var field = textLabel.field ? fields.find(function (fd) {
587
+ return Object.keys(textLabel.field).every(function (key) {
588
+ return textLabel.field[key] === fd[key];
589
+ });
590
+ }) : null;
591
+ if (field === undefined && options.throwOnError) {
592
+ throw new Error("Layer has invalid text label field: ".concat(JSON.stringify(textLabel.field)));
593
+ }
594
+ return Object.keys(layerTextLabel).reduce(function (accu, key) {
595
+ return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, key === 'field' ? field : textLabel[key] || layerTextLabel[key]));
596
+ }, {});
597
+ });
598
+ }
599
+
600
+ /**
601
+ * Validate saved visual channels config with new data,
602
+ * refer to vis-state-schema.js VisualChannelSchemaV1
603
+ */
604
+ function validateSavedVisualChannels(fields, newLayer, savedLayer) {
605
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
606
+ Object.values(newLayer.visualChannels).forEach(function (_ref7) {
607
+ var field = _ref7.field,
608
+ scale = _ref7.scale,
609
+ key = _ref7.key;
610
+ var foundField;
611
+ if (savedLayer.config) {
612
+ if (savedLayer.config[field]) {
613
+ foundField = fields.find(function (fd) {
614
+ return savedLayer.config && fd.name === savedLayer.config[field].name;
615
+ });
616
+ }
617
+ var foundChannel = _objectSpread(_objectSpread({}, foundField ? (0, _defineProperty2["default"])({}, field, foundField) : {}), savedLayer.config[scale] ? (0, _defineProperty2["default"])({}, scale, savedLayer.config[scale]) : {});
618
+ if (Object.keys(foundChannel).length) {
619
+ newLayer.updateLayerConfig(foundChannel);
620
+ }
621
+ newLayer.validateVisualChannel(key);
622
+ if (options.throwOnError) {
623
+ var _savedLayer$config, _newLayer$config$fiel;
624
+ var fieldName = (_savedLayer$config = savedLayer.config) === null || _savedLayer$config === void 0 || (_savedLayer$config = _savedLayer$config[field]) === null || _savedLayer$config === void 0 ? void 0 : _savedLayer$config.name;
625
+ if (fieldName && fieldName !== ((_newLayer$config$fiel = newLayer.config[field]) === null || _newLayer$config$fiel === void 0 ? void 0 : _newLayer$config$fiel.name)) {
626
+ throw new Error("Layer has invalid visual channel field: ".concat(field));
627
+ }
628
+ }
629
+ }
630
+ });
631
+ return newLayer;
632
+ }
633
+ function validateLayersByDatasets(datasets, layerClasses) {
634
+ var layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
635
+ var options = arguments.length > 3 ? arguments[3] : undefined;
636
+ var validated = [];
637
+ var failed = [];
638
+ layers.forEach(function (layer) {
639
+ var _layer$config;
640
+ var validateLayer = null;
641
+ if (layer !== null && layer !== void 0 && (_layer$config = layer.config) !== null && _layer$config !== void 0 && _layer$config.dataId) {
642
+ if (datasets[layer.config.dataId]) {
643
+ // datasets are already loaded
644
+ validateLayer = validateLayerWithData(datasets[layer.config.dataId], layer, layerClasses, options);
645
+ }
646
+ }
647
+ if (validateLayer) {
648
+ validated.push(validateLayer);
649
+ } else {
650
+ // datasets not yet loaded
651
+ failed.push(layer);
652
+ }
653
+ });
654
+ return {
655
+ validated: validated,
656
+ failed: failed
657
+ };
658
+ }
659
+
660
+ /**
661
+ * Get required columns for validation based on column mode
662
+ */
663
+ function _getColumnConfigForValidation(newLayer) {
664
+ // find column fieldIdx
665
+ var columnConfig = newLayer.getLayerColumns();
666
+ // if columnMode is defined, find column mode config
667
+ var colModeConfig = newLayer.config.columnMode ? (newLayer.supportedColumnModes || []).find(function (colMode) {
668
+ return colMode.key === newLayer.config.columnMode;
669
+ }) : null;
670
+ if (colModeConfig) {
671
+ // only validate columns in column mode
672
+ columnConfig = [].concat((0, _toConsumableArray2["default"])(colModeConfig.requiredColumns || []), (0, _toConsumableArray2["default"])(colModeConfig.optionalColumns || [])).reduce(function (accu, key) {
673
+ return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, columnConfig[key]));
674
+ }, {});
675
+ }
676
+ return columnConfig;
677
+ }
678
+
679
+ /**
680
+ * Validate saved layer config with new data,
681
+ * update fieldIdx based on new fields
682
+ */
683
+ // eslint-disable-next-line complexity
684
+ function validateLayerWithData(dataset, savedLayer, layerClasses) {
685
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
686
+ var fields = dataset.fields,
687
+ dataId = dataset.id;
688
+ var type = savedLayer.type;
689
+ var throwOnError = options.throwOnError;
690
+ // layer doesnt have a valid type
691
+ if (!type || !Object.prototype.hasOwnProperty.call(layerClasses, type) || !savedLayer.config) {
692
+ if (throwOnError) {
693
+ throw new Error("Layer has invalid type \"".concat(type, "\" or config is missing"));
694
+ }
695
+ return null;
696
+ }
697
+ var newLayer = new layerClasses[type]({
698
+ id: savedLayer.id,
699
+ dataId: dataId,
700
+ label: savedLayer.config.label,
701
+ color: savedLayer.config.color,
702
+ isVisible: savedLayer.config.isVisible,
703
+ hidden: savedLayer.config.hidden,
704
+ columnMode: savedLayer.config.columnMode,
705
+ highlightColor: savedLayer.config.highlightColor
706
+ });
707
+ var columnConfig = _getColumnConfigForValidation(newLayer);
708
+ if (Object.keys(columnConfig)) {
709
+ var columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig, options);
710
+ if (columns) {
711
+ newLayer.updateLayerConfig({
712
+ columns: _objectSpread(_objectSpread({}, newLayer.config.columns), columns)
713
+ });
714
+ } else if (!options.allowEmptyColumn) {
715
+ return null;
716
+ }
717
+ }
718
+ var textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel, options) : newLayer.config.textLabel;
719
+
720
+ // copy visConfig over to emptyLayer to make sure it has all the props
721
+ var copiedVisConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
722
+ shallowCopy: ['colorRange', 'strokeColorRange']
723
+ });
724
+
725
+ // call layer methods to validate visConfig when switching dataset
726
+ var visConfig = newLayer.validateVisConfig ? newLayer.validateVisConfig(dataset, copiedVisConfig) : copiedVisConfig;
727
+ newLayer.updateLayerConfig({
728
+ visConfig: visConfig,
729
+ textLabel: textLabel
730
+ });
731
+
732
+ // visual channel field is saved to be {name, type}
733
+ // find visual channel field by matching both name and type
734
+ // refer to vis-state-schema.js VisualChannelSchemaV1
735
+ newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer, options);
736
+ if (throwOnError) {
737
+ if (!newLayer.isValidToSave()) {
738
+ throw new Error("Layer is not valid to save: ".concat(newLayer.id));
739
+ }
740
+ }
741
+ return newLayer;
742
+ }
743
+ function mergeEditor(state, savedEditor) {
744
+ var _savedEditor$visible;
745
+ if (!savedEditor) {
746
+ return state;
747
+ }
748
+ return _objectSpread(_objectSpread({}, state), {}, {
749
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
750
+ features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), (0, _toConsumableArray2["default"])(savedEditor.features || [])),
751
+ // if savedEditor.visible is undefined keep state.editor.visible
752
+ visible: (_savedEditor$visible = savedEditor.visible) !== null && _savedEditor$visible !== void 0 ? _savedEditor$visible : state.editor.visible
753
+ })
754
+ });
755
+ }
756
+
757
+ /**
758
+ * Validate saved layer config with new data,
759
+ * update fieldIdx based on new fields
760
+ */
761
+ function mergeDatasetsByOrder(state, newDataEntries) {
762
+ var merged = _objectSpread(_objectSpread({}, state.datasets), newDataEntries);
763
+ if (Array.isArray(state.preserveDatasetOrder)) {
764
+ // preserveDatasetOrder might not include the new datasets
765
+ var newDatasetIds = Object.keys(merged).filter(function (id) {
766
+ var _state$preserveDatase;
767
+ return !((_state$preserveDatase = state.preserveDatasetOrder) !== null && _state$preserveDatase !== void 0 && _state$preserveDatase.includes(id));
768
+ });
769
+ return [].concat((0, _toConsumableArray2["default"])(state.preserveDatasetOrder), (0, _toConsumableArray2["default"])(newDatasetIds)).reduce(function (accu, dataId) {
770
+ return _objectSpread(_objectSpread({}, accu), merged[dataId] ? (0, _defineProperty2["default"])({}, dataId, merged[dataId]) : {});
771
+ }, {});
772
+ }
773
+ return merged;
774
+ }
775
+ var VIS_STATE_MERGERS = exports.VIS_STATE_MERGERS = [{
776
+ merge: mergeLayers,
777
+ prop: 'layers',
778
+ toMergeProp: 'layerToBeMerged',
779
+ preserveOrder: 'preserveLayerOrder'
780
+ }, {
781
+ merge: mergeFilters,
782
+ prop: 'filters',
783
+ toMergeProp: 'filterToBeMerged',
784
+ preserveOrder: 'preserveFilterOrder',
785
+ replaceParentDatasetIds: replaceFilterDatasetIds
786
+ }, {
787
+ merge: mergeEffects,
788
+ prop: 'effects'
789
+ }, {
790
+ merge: mergeInteractions,
791
+ prop: 'interactionConfig',
792
+ toMergeProp: 'interactionToBeMerged',
793
+ replaceParentDatasetIds: replaceInteractionDatasetIds,
794
+ saveUnmerged: savedUnmergedInteraction
795
+ }, {
796
+ merge: mergeLayerBlending,
797
+ prop: 'layerBlending'
798
+ }, {
799
+ merge: mergeOverlayBlending,
800
+ prop: 'overlayBlending'
801
+ }, {
802
+ merge: mergeSplitMaps,
803
+ prop: 'splitMaps',
804
+ toMergeProp: 'splitMapsToBeMerged'
805
+ }, {
806
+ merge: mergeAnimationConfig,
807
+ prop: 'animationConfig'
808
+ }, {
809
+ merge: mergeEditor,
810
+ prop: 'editor'
811
+ }];
812
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9kYXNoMiIsIl9sb2Rhc2gzIiwiX2RlZXBtZXJnZSIsIl91dGlscyIsIl9lZmZlY3RzIiwiX2NvbnN0YW50cyIsIl9zY2hlbWFzIiwiX3RhYmxlIiwiX2xheWVyVXRpbHMiLCJfZXhjbHVkZWQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJlIiwidCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsImEiLCJ1IiwiY2FsbCIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIm93bktleXMiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJtZXJnZUZpbHRlcnMiLCJzdGF0ZSIsImZpbHRlcnNUb01lcmdlIiwiZnJvbUNvbmZpZyIsInByZXNlcnZlRmlsdGVyT3JkZXIiLCJtYXAiLCJsIiwiaWQiLCJfdmFsaWRhdGVGaWx0ZXJzVXBkYXQiLCJ2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyIsInZhbGlkYXRlZCIsImZhaWxlZCIsInVwZGF0ZWREYXRhc2V0cyIsInVwZGF0ZWRGaWx0ZXJzIiwiaW5zZXJ0SXRlbUJhc2VkT25QcmVzZXJ2ZWRPcmRlciIsImZpbHRlcnMiLCJyZXNldEZpbHRlckdwdU1vZGUiLCJhc3NpZ25HcHVDaGFubmVscyIsImRhdGFzZXRzVG9GaWx0ZXIiLCJ1bmlxIiwiZmxhdHRlbkRlZXAiLCJkYXRhSWQiLCJmaWx0ZXJlZCIsImFwcGx5RmlsdGVyc1RvRGF0YXNldHMiLCJsYXllcnMiLCJkYXRhc2V0cyIsImZpbHRlclRvQmVNZXJnZWQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwicmVwbGFjZUZpbHRlckRhdGFzZXRJZHMiLCJzYXZlZEZpbHRlciIsImRhdGFJZFRvVXNlIiwicmVwbGFjZWQiLCJpbmNsdWRlcyIsIm5ld0RhdGFJZCIsImQiLCJpc1NhdmVkTGF5ZXJDb25maWdWMSIsImxheWVyQ29uZmlnIiwidmlzdWFsQ2hhbm5lbHMiLCJwYXJzZUxheWVyQ29uZmlnIiwic2NoZW1hIiwiX3NjaGVtYSRwYXJzZVNhdmVkQ29uIiwic2F2ZWRDb25maWciLCJ2ZXJzaW9uIiwiQ1VSUkVOVF9WRVJTSU9OIiwiY29uZmlnIiwidmlzU3RhdGUiLCJsYXllck9yZGVyIiwicGFyc2VTYXZlZENvbmZpZyIsImN1cnJlbnRJdGVtcyIsIml0ZW1zIiwicHJlc2VydmVkT3JkZXIiLCJ1bmRlZmluZWQiLCJkZWZhdWx0U3RhcnQiLCJuZXdJdGVtcyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiaXRlbSIsImV4cGVjdGVkSWR4IiwiaW5kZXhPZiIsImluc2VydEF0IiwiaSIsInByZWNlZWRJZHgiLCJfbG9vcCIsInByZWNlZWRJdGVtSWQiLCJmaW5kSW5kZXgiLCJhcnJheUluc2VydCIsImVyciIsImNyZWF0ZUxheWVyRnJvbUNvbmZpZyIsInBhcnNlZExheWVyQ29uZmlnIiwiX3ZhbGlkYXRlTGF5ZXJzQnlEYXRhIiwidmFsaWRhdGVMYXllcnNCeURhdGFzZXRzIiwibGF5ZXJDbGFzc2VzIiwiYWxsb3dFbXB0eUNvbHVtbiIsIm5ld0xheWVyIiwidXBkYXRlTGF5ZXJEb21haW4iLCJzZXJpYWxpemVMYXllciIsIl9zZXJpYWxpemVkVmlzU3RhdGUkbCIsInNlcmlhbGl6ZWRWaXNTdGF0ZSIsInNlcmlhbGl6ZVZpc1N0YXRlIiwic2VyaWFsaXplRWZmZWN0IiwibmV3RWZmZWN0IiwiX3NlcmlhbGl6ZWRWaXNTdGF0ZSRlIiwiZWZmZWN0cyIsImVmZmVjdE9yZGVyIiwiX3NjaGVtYSRwYXJzZVNhdmVkQ29uMiIsInNhdmVkU3RhdGUiLCJnZXRDb25maWdUb1NhdmUiLCJtZXJnZUxheWVycyIsImxheWVyc1RvTWVyZ2UiLCJwcmVzZXJ2ZUxheWVyT3JkZXIiLCJnZXRMYXllck9yZGVyRnJvbUxheWVycyIsInVubWVyZ2VkIiwidG9NZXJnZSIsIl9sJGNvbmZpZyIsImlzTWVyZ2luZ0RhdGFzZXRzIiwiX3ZhbGlkYXRlTGF5ZXJzQnlEYXRhMiIsIm1lcmdlZExheWVyIiwiX2luc2VydExheWVyQXRSaWdodE9yIiwiaW5zZXJ0TGF5ZXJBdFJpZ2h0T3JkZXIiLCJuZXdMYXllck9yZGVyIiwibmV3TGF5ZXJzIiwibGF5ZXJUb0JlTWVyZ2VkIiwiY3VycmVudExheWVycyIsImxheWVyc1RvSW5zZXJ0IiwiY3VycmVudE9yZGVyIiwiY3VycmVudExheWVyUXVldWUiLCJmaW5kQnlJZCIsImxheWVyIiwiQm9vbGVhbiIsIm5ld0xheWVyT3JkZXJRdWV1ZSIsIm1lcmdlSW50ZXJhY3Rpb25zIiwiaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkIiwibWVyZ2VkIiwia2V5IiwiaW50ZXJhY3Rpb25Db25maWciLCJjdXJyZW50Q29uZmlnIiwiX3JlZiIsImVuYWJsZWQiLCJjb25maWdTYXZlZCIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJjb25maWdUb01lcmdlIiwiX21lcmdlSW50ZXJhY3Rpb25Ub29sIiwibWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWciLCJtZXJnZWRUb29sdGlwIiwidW5tZXJnZWRUb29sdGlwIiwiZmllbGRzVG9TaG93IiwidG9vbHRpcCIsInBpY2siLCJuZXh0U3RhdGUiLCJzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb24iLCJfdW5tZXJnZWQkdG9vbHRpcCIsIl91bm1lcmdlZCR0b29sdGlwMiIsIl9zdGF0ZSRpbnRlcmFjdGlvblRvQiIsIl91bm1lcmdlZCR0b29sdGlwMyIsInJlcGxhY2VJbnRlcmFjdGlvbkRhdGFzZXRJZHMiLCJkYXRhSWRUb1JlcGxhY2UiLCJfaW50ZXJhY3Rpb25Db25maWckdG8iLCJfaW50ZXJhY3Rpb25Db25maWckdG8yIiwibWVyZ2VTcGxpdE1hcHMiLCJzcGxpdE1hcHMiLCJzbSIsImVudHJpZXMiLCJfcmVmMiIsIl9yZWYzIiwiX3NsaWNlZFRvQXJyYXkyIiwicHVzaFRvIiwiZmluZCIsImdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcCIsInNwbGl0TWFwc1RvQmVNZXJnZWQiLCJtZXJnZUVmZmVjdHMiLCJuZXdFZmZlY3RzIiwiZWZmZWN0IiwiY3JlYXRlRWZmZWN0IiwiZGVlcG1lcmdlIiwiYWxsIiwiaXNDb25maWdBY3RpdmUiLCJpc1ZhbGlkVG9TYXZlIiwidG9vbHRpcENvbmZpZyIsIl9sb29wMiIsImFsbEZpZWxkcyIsImZpZWxkcyIsImZvdW5kRmllbGRzVG9TaG93IiwiZmllbGQiLCJtZXJnZUxheWVyQmxlbmRpbmciLCJsYXllckJsZW5kaW5nIiwiTEFZRVJfQkxFTkRJTkdTIiwibWVyZ2VPdmVybGF5QmxlbmRpbmciLCJvdmVybGF5QmxlbmRpbmciLCJPVkVSTEFZX0JMRU5ESU5HUyIsIm1lcmdlQW5pbWF0aW9uQ29uZmlnIiwiYW5pbWF0aW9uIiwiY3VycmVudFRpbWUiLCJhbmltYXRpb25Db25maWciLCJkb21haW4iLCJ2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zIiwic2F2ZWRDb2xzIiwiZW1wdHlDb2xzIiwib3B0aW9ucyIsImNvbHVtbnMiLCJfbG9vcDMiLCJfT2JqZWN0JGtleXMiLCJfaSIsInNhdmVkIiwiZmllbGRJZHgiLCJfcmVmNCIsImFsbENvbEZvdW5kIiwiZXZlcnkiLCJ2YWxpZGF0ZUNvbHVtbiIsInJ2IiwidGhyb3dPbkVycm9yIiwicmVxdWlyZWRDb2x1bW5zIiwiayIsIm9wdGlvbmFsIiwibWlzc2luZ0NvbHVtbnMiLCJFcnJvciIsImpvaW4iLCJjb25maWdDb2x1bW5zIiwiaW52YWxpZENvbHVtbnMiLCJfY29sdW1ucyRrIiwiY29sdW1uIiwidmFsaWRhdG9yIiwidmFsaWRhdGVTYXZlZFRleHRMYWJlbCIsIl9yZWY1Iiwic2F2ZWRUZXh0TGFiZWwiLCJfcmVmNiIsImxheWVyVGV4dExhYmVsIiwic2F2ZWRUZXh0TGFiZWxzIiwidGV4dExhYmVsIiwiZmQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVkdWNlIiwiYWNjdSIsInZhbGlkYXRlU2F2ZWRWaXN1YWxDaGFubmVscyIsInNhdmVkTGF5ZXIiLCJ2YWx1ZXMiLCJfcmVmNyIsInNjYWxlIiwiZm91bmRGaWVsZCIsImZvdW5kQ2hhbm5lbCIsInVwZGF0ZUxheWVyQ29uZmlnIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwiX3NhdmVkTGF5ZXIkY29uZmlnIiwiX25ld0xheWVyJGNvbmZpZyRmaWVsIiwiZmllbGROYW1lIiwiX2xheWVyJGNvbmZpZyIsInZhbGlkYXRlTGF5ZXIiLCJ2YWxpZGF0ZUxheWVyV2l0aERhdGEiLCJfZ2V0Q29sdW1uQ29uZmlnRm9yVmFsaWRhdGlvbiIsImNvbHVtbkNvbmZpZyIsImdldExheWVyQ29sdW1ucyIsImNvbE1vZGVDb25maWciLCJjb2x1bW5Nb2RlIiwic3VwcG9ydGVkQ29sdW1uTW9kZXMiLCJjb2xNb2RlIiwib3B0aW9uYWxDb2x1bW5zIiwiZGF0YXNldCIsInR5cGUiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImxhYmVsIiwiY29sb3IiLCJpc1Zpc2libGUiLCJoaWRkZW4iLCJoaWdobGlnaHRDb2xvciIsImNvcGllZFZpc0NvbmZpZyIsImNvcHlMYXllckNvbmZpZyIsInZpc0NvbmZpZyIsInNoYWxsb3dDb3B5IiwidmFsaWRhdGVWaXNDb25maWciLCJtZXJnZUVkaXRvciIsInNhdmVkRWRpdG9yIiwiX3NhdmVkRWRpdG9yJHZpc2libGUiLCJlZGl0b3IiLCJmZWF0dXJlcyIsInZpc2libGUiLCJtZXJnZURhdGFzZXRzQnlPcmRlciIsIm5ld0RhdGFFbnRyaWVzIiwicHJlc2VydmVEYXRhc2V0T3JkZXIiLCJuZXdEYXRhc2V0SWRzIiwiX3N0YXRlJHByZXNlcnZlRGF0YXNlIiwiVklTX1NUQVRFX01FUkdFUlMiLCJleHBvcnRzIiwibWVyZ2UiLCJwcm9wIiwidG9NZXJnZVByb3AiLCJwcmVzZXJ2ZU9yZGVyIiwicmVwbGFjZVBhcmVudERhdGFzZXRJZHMiLCJzYXZlVW5tZXJnZWQiXSwic291cmNlcyI6WyIuLi9zcmMvdmlzLXN0YXRlLW1lcmdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gudW5pcSc7XG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gucGljayc7XG5pbXBvcnQgZmxhdHRlbkRlZXAgZnJvbSAnbG9kYXNoLmZsYXR0ZW5kZWVwJztcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB7XG4gIGFycmF5SW5zZXJ0LFxuICBnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAsXG4gIGFwcGx5RmlsdGVyc1RvRGF0YXNldHMsXG4gIHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzLFxuICBmaW5kQnlJZFxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuaW1wb3J0IHtMYXllciwgVmlzdWFsQ2hhbm5lbH0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtjcmVhdGVFZmZlY3R9IGZyb20gJ0BrZXBsZXIuZ2wvZWZmZWN0cyc7XG5pbXBvcnQge0xBWUVSX0JMRU5ESU5HUywgT1ZFUkxBWV9CTEVORElOR1N9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Q1VSUkVOVF9WRVJTSU9OLCBWaXNTdGF0ZSwgVmlzU3RhdGVNZXJnZXJzLCBLZXBsZXJHTFNjaGVtYUNsYXNzfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge1xuICBQYXJzZWRMYXllcixcbiAgUGFyc2VkVmlzU3RhdGUsXG4gIFNhdmVkSW50ZXJhY3Rpb25Db25maWcsXG4gIFRvb2x0aXBJbmZvLFxuICBTYXZlZEVkaXRvcixcbiAgUGFyc2VkQ29uZmlnLFxuICBGaWx0ZXIsXG4gIEVmZmVjdCBhcyBFZmZlY3RUeXBlLFxuICBQYXJzZWRFZmZlY3QsXG4gIExheWVyQ29sdW1ucyxcbiAgTGF5ZXJDb2x1bW5cbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0tlcGxlclRhYmxlLCBEYXRhc2V0cywgYXNzaWduR3B1Q2hhbm5lbHMsIHJlc2V0RmlsdGVyR3B1TW9kZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbmltcG9ydCB7Z2V0TGF5ZXJPcmRlckZyb21MYXllcnN9IGZyb20gJy4vbGF5ZXItdXRpbHMnO1xuXG4vKipcbiAqIE1lcmdlIGxvYWRlZCBmaWx0ZXJzIHdpdGggY3VycmVudCBzdGF0ZSwgaWYgbm8gZmllbGRzIG9yIGRhdGEgYXJlIGxvYWRlZFxuICogc2F2ZSBpdCBmb3IgbGF0ZXJcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUZpbHRlcnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGZpbHRlcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydmaWx0ZXJzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgcHJlc2VydmVGaWx0ZXJPcmRlciA9IGZyb21Db25maWdcbiAgICA/IGZpbHRlcnNUb01lcmdlPy5tYXAobCA9PiBsLmlkKVxuICAgIDogc3RhdGUucHJlc2VydmVGaWx0ZXJPcmRlcjtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyc1RvTWVyZ2UpIHx8ICFmaWx0ZXJzVG9NZXJnZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7dmFsaWRhdGVkLCBmYWlsZWQsIHVwZGF0ZWREYXRhc2V0c30gPSB2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyhzdGF0ZSwgZmlsdGVyc1RvTWVyZ2UpO1xuICBsZXQgdXBkYXRlZEZpbHRlcnMgPSBpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyKFxuICAgIHN0YXRlLmZpbHRlcnMsXG4gICAgdmFsaWRhdGVkLFxuICAgIHByZXNlcnZlRmlsdGVyT3JkZXJcbiAgKTtcblxuICAvLyBtZXJnZSBmaWx0ZXIgd2l0aCBleGlzdGluZ1xuICB1cGRhdGVkRmlsdGVycyA9IHJlc2V0RmlsdGVyR3B1TW9kZSh1cGRhdGVkRmlsdGVycyk7XG4gIHVwZGF0ZWRGaWx0ZXJzID0gYXNzaWduR3B1Q2hhbm5lbHModXBkYXRlZEZpbHRlcnMpO1xuICAvLyBmaWx0ZXIgZGF0YVxuICBjb25zdCBkYXRhc2V0c1RvRmlsdGVyID0gdW5pcShmbGF0dGVuRGVlcCh2YWxpZGF0ZWQubWFwKGYgPT4gZi5kYXRhSWQpKSk7XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBhcHBseUZpbHRlcnNUb0RhdGFzZXRzKFxuICAgIGRhdGFzZXRzVG9GaWx0ZXIsXG4gICAgdXBkYXRlZERhdGFzZXRzLFxuICAgIHVwZGF0ZWRGaWx0ZXJzLFxuICAgIHN0YXRlLmxheWVyc1xuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogdXBkYXRlZEZpbHRlcnMsXG4gICAgZGF0YXNldHM6IGZpbHRlcmVkLFxuICAgIHByZXNlcnZlRmlsdGVyT3JkZXIsXG4gICAgZmlsdGVyVG9CZU1lcmdlZDogWy4uLnN0YXRlLmZpbHRlclRvQmVNZXJnZWQsIC4uLmZhaWxlZF1cbiAgfTtcbn1cblxuLy8gcmVwbGFjZSBkYXRhSWQgaW4gc2F2ZWQgRmlsdGVyXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUZpbHRlckRhdGFzZXRJZHMoXG4gIHNhdmVkRmlsdGVyOiBGaWx0ZXJbXSxcbiAgZGF0YUlkOiBzdHJpbmcsXG4gIGRhdGFJZFRvVXNlOiBzdHJpbmdcbikge1xuICBjb25zdCByZXBsYWNlZDogRmlsdGVyW10gPSBbXTtcbiAgc2F2ZWRGaWx0ZXIuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgIGlmIChmaWx0ZXIuZGF0YUlkLmluY2x1ZGVzKGRhdGFJZCkpIHtcbiAgICAgIGNvbnN0IG5ld0RhdGFJZCA9IGZpbHRlci5kYXRhSWQubWFwKGQgPT4gKGQgPT09IGRhdGFJZCA/IGRhdGFJZFRvVXNlIDogZCkpO1xuICAgICAgcmVwbGFjZWQucHVzaCh7XG4gICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgZGF0YUlkOiBuZXdEYXRhSWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXBsYWNlZC5sZW5ndGggPyByZXBsYWNlZCA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NhdmVkTGF5ZXJDb25maWdWMShsYXllckNvbmZpZzogYW55KTogYm9vbGVhbiB7XG4gIC8vIGV4cG9ydGVkIGxheWVyIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgdmlzdWFsQ2hhbm5lbHMgcHJvcGVydHlcbiAgcmV0dXJuIGxheWVyQ29uZmlnPy52aXN1YWxDaGFubmVscztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJDb25maWcoXG4gIHNjaGVtYTogS2VwbGVyR0xTY2hlbWFDbGFzcyxcbiAgbGF5ZXJDb25maWc6IGFueVxuKTogUGFyc2VkTGF5ZXIgfCB1bmRlZmluZWQge1xuICAvLyBhc3N1bWUgdGhlIGxheWVyIGNvbmZpZyBpcyBjdXJyZW50IHZlcnNpb25cbiAgY29uc3Qgc2F2ZWRDb25maWcgPSB7XG4gICAgdmVyc2lvbjogQ1VSUkVOVF9WRVJTSU9OLFxuICAgIGNvbmZpZzoge1xuICAgICAgdmlzU3RhdGU6IHtsYXllcnM6IFtsYXllckNvbmZpZ10sIGxheWVyT3JkZXI6IFtsYXllckNvbmZpZy5pZF19XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzY2hlbWEucGFyc2VTYXZlZENvbmZpZyhzYXZlZENvbmZpZyk/LnZpc1N0YXRlPy5sYXllcnM/LlswXTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0SXRlbUJhc2VkT25QcmVzZXJ2ZWRPcmRlcihcbiAgY3VycmVudEl0ZW1zOiBGaWx0ZXJbXSxcbiAgaXRlbXM6IEZpbHRlcltdLFxuICBwcmVzZXJ2ZWRPcmRlcjogYW55W10gPSBbXSxcbiAgZGVmYXVsdFN0YXJ0PzogYm9vbGVhblxuKSB7XG4gIGxldCBuZXdJdGVtcyA9IFsuLi5jdXJyZW50SXRlbXNdO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGNvbnN0IGV4cGVjdGVkSWR4ID0gcHJlc2VydmVkT3JkZXIuaW5kZXhPZihpdGVtLmlkKTtcbiAgICAvLyBpbnNlcnRBdCB0aGUgZW5kIGJ5IGRlZmF1bHRcbiAgICBsZXQgaW5zZXJ0QXQgPSBkZWZhdWx0U3RhcnQgPyAwIDogbmV3SXRlbXMubGVuZ3RoO1xuICAgIGlmIChleHBlY3RlZElkeCA+IDApIHtcbiAgICAgIC8vIGxvb2sgZm9yIGxheWVyIHRvIGluc2VydCBhZnRlclxuICAgICAgbGV0IGkgPSBleHBlY3RlZElkeCArIDE7XG4gICAgICBsZXQgcHJlY2VlZElkeCA9IC0xO1xuICAgICAgd2hpbGUgKGktLSA+IDAgJiYgcHJlY2VlZElkeCA8IDApIHtcbiAgICAgICAgLy8ga2VlcCBsb29raW5nIGZvciBwcmVjZWVkIGxheWVyIHRoYXQgaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgY29uc3QgcHJlY2VlZEl0ZW1JZCA9IHByZXNlcnZlZE9yZGVyW2kgLSAxXTtcbiAgICAgICAgcHJlY2VlZElkeCA9IG5ld0l0ZW1zLmZpbmRJbmRleChkID0+IGQuaWQgPT09IHByZWNlZWRJdGVtSWQpO1xuICAgICAgfVxuICAgICAgaWYgKHByZWNlZWRJZHggPiAtMSkge1xuICAgICAgICAvLyBpZiBmb3VuZFxuICAgICAgICBpbnNlcnRBdCA9IHByZWNlZWRJZHggKyAxO1xuICAgICAgfVxuICAgIH1cbiAgICBuZXdJdGVtcyA9IGFycmF5SW5zZXJ0KG5ld0l0ZW1zLCBpbnNlcnRBdCwgaXRlbSk7XG4gIH1cbiAgcmV0dXJuIG5ld0l0ZW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlOiBWaXNTdGF0ZSwgbGF5ZXJDb25maWc6IGFueSk6IExheWVyIHwgbnVsbCB7XG4gIC8vIGNoZWNrIGlmIHRoZSBsYXllciBjb25maWcgaXMgcGFyc2VkXG4gIGNvbnN0IHBhcnNlZExheWVyQ29uZmlnID0gaXNTYXZlZExheWVyQ29uZmlnVjEobGF5ZXJDb25maWcpXG4gICAgPyBwYXJzZUxheWVyQ29uZmlnKHN0YXRlLnNjaGVtYSwgbGF5ZXJDb25maWcpXG4gICAgOiBsYXllckNvbmZpZztcblxuICBpZiAoIXBhcnNlZExheWVyQ29uZmlnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gZmlyc3QgdmFsaWRhdGUgY29uZmlnIGFnYWluc3QgZGF0YXNldFxuICBjb25zdCB7dmFsaWRhdGVkLCBmYWlsZWR9ID0gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICAgIHN0YXRlLmRhdGFzZXRzLFxuICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICBbcGFyc2VkTGF5ZXJDb25maWddLFxuICAgIHthbGxvd0VtcHR5Q29sdW1uOiB0cnVlfVxuICApO1xuXG4gIGlmIChmYWlsZWQ/Lmxlbmd0aCB8fCAhdmFsaWRhdGVkLmxlbmd0aCkge1xuICAgIC8vIGZhaWxlZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbmV3TGF5ZXIgPSB2YWxpZGF0ZWRbMF07XG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG4vKipcbiAqIEdldCBsb2FkZWQgbGF5ZXIgZnJvbSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTGF5ZXIoXG4gIG5ld0xheWVyOiBMYXllcixcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRMYXllciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRWaXNTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKFxuICAgIHtsYXllcnM6IFtuZXdMYXllcl0sIGxheWVyT3JkZXI6IFtuZXdMYXllci5pZF19LFxuICAgIHNjaGVtYVxuICApO1xuICByZXR1cm4gc2VyaWFsaXplZFZpc1N0YXRlPy5sYXllcnM/LlswXTtcbn1cblxuLyoqXG4gKiBHZXQgbG9hZGVkIGVmZmVjdCBmcm9tIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFZmZlY3QoXG4gIG5ld0VmZmVjdDogRWZmZWN0VHlwZSxcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRFZmZlY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZXJpYWxpemVkVmlzU3RhdGUgPSBzZXJpYWxpemVWaXNTdGF0ZShcbiAgICB7ZWZmZWN0czogW25ld0VmZmVjdF0sIGVmZmVjdE9yZGVyOiBbbmV3RWZmZWN0LmlkXX0sXG4gICAgc2NoZW1hXG4gICk7XG4gIHJldHVybiBzZXJpYWxpemVkVmlzU3RhdGU/LmVmZmVjdHM/LlswXTtcbn1cblxuLyoqXG4gKiBHZXQgdmlzIHN0YXRlIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVmlzU3RhdGUoXG4gIHZpc1N0YXRlOiBQYXJ0aWFsPFZpc1N0YXRlPixcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRWaXNTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNhdmVkU3RhdGUgPSBzY2hlbWEuZ2V0Q29uZmlnVG9TYXZlKHtcbiAgICB2aXNTdGF0ZVxuICB9KTtcbiAgcmV0dXJuIHNhdmVkU3RhdGUgPyBzY2hlbWEucGFyc2VTYXZlZENvbmZpZyhzYXZlZFN0YXRlKT8udmlzU3RhdGUgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIE1lcmdlIGxheWVycyBmcm9tIGRlLXNlcmlhbGl6ZWQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllcnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGxheWVyc1RvTWVyZ2U6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgcHJlc2VydmVMYXllck9yZGVyID0gZnJvbUNvbmZpZ1xuICAgID8gZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMobGF5ZXJzVG9NZXJnZSlcbiAgICA6IHN0YXRlLnByZXNlcnZlTGF5ZXJPcmRlcjtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxheWVyc1RvTWVyZ2UpIHx8ICFsYXllcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBkb24ndCBtZXJnZSBsYXllciBpZiBkYXRhc2V0IGlzIGJlaW5nIG1lcmdlZFxuICBjb25zdCB1bm1lcmdlZDogUGFyc2VkTGF5ZXJbXSA9IFtdO1xuICBjb25zdCB0b01lcmdlOiBQYXJzZWRMYXllcltdID0gW107XG4gIGxheWVyc1RvTWVyZ2UuZm9yRWFjaCgobDogUGFyc2VkTGF5ZXIpID0+IHtcbiAgICBpZiAobD8uY29uZmlnPy5kYXRhSWQgJiYgc3RhdGUuaXNNZXJnaW5nRGF0YXNldHNbbC5jb25maWcuZGF0YUlkXSkge1xuICAgICAgdW5tZXJnZWQucHVzaChsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9NZXJnZS5wdXNoKGwpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3Qge3ZhbGlkYXRlZDogbWVyZ2VkTGF5ZXIsIGZhaWxlZH0gPSB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gICAgc3RhdGUuZGF0YXNldHMsXG4gICAgc3RhdGUubGF5ZXJDbGFzc2VzLFxuICAgIHRvTWVyZ2VcbiAgKTtcbiAgdW5tZXJnZWQucHVzaCguLi5mYWlsZWQpO1xuICAvLyBwdXQgbmV3IGxheWVycyBpbiBmcm9udCBvZiBjdXJyZW50IGxheWVyc1xuICBjb25zdCB7bmV3TGF5ZXJPcmRlciwgbmV3TGF5ZXJzfSA9IGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICAgIHN0YXRlLmxheWVycyxcbiAgICBtZXJnZWRMYXllcixcbiAgICBzdGF0ZS5sYXllck9yZGVyLFxuICAgIHByZXNlcnZlTGF5ZXJPcmRlclxuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBuZXdMYXllcnMsXG4gICAgbGF5ZXJPcmRlcjogbmV3TGF5ZXJPcmRlcixcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXIsXG4gICAgbGF5ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUubGF5ZXJUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICBjdXJyZW50TGF5ZXJzLFxuICBsYXllcnNUb0luc2VydCxcbiAgY3VycmVudE9yZGVyLFxuICBwcmVzZXJ2ZWRPcmRlcjogc3RyaW5nW10gPSBbXVxuKSB7XG4gIGlmICghbGF5ZXJzVG9JbnNlcnQ/Lmxlbmd0aCkge1xuICAgIHJldHVybiB7bmV3TGF5ZXJzOiBjdXJyZW50TGF5ZXJzLCBuZXdMYXllck9yZGVyOiBjdXJyZW50T3JkZXJ9O1xuICB9XG4gIC8vIHBlcnNlcnZlZE9yZGVyIFsnYScsICdiJywgJ2MnXTtcbiAgLy8gbGF5ZXJPcmRlciBbJ2EnLCAnYicsICdjJ11cbiAgY29uc3QgY3VycmVudExheWVyUXVldWUgPSBjdXJyZW50T3JkZXJcbiAgICAubWFwKGlkID0+IGZpbmRCeUlkKGlkKShjdXJyZW50TGF5ZXJzKSlcbiAgICAuZmlsdGVyKGxheWVyID0+IEJvb2xlYW4obGF5ZXIpKTtcbiAgY29uc3QgbmV3TGF5ZXJzID0gY3VycmVudExheWVycy5jb25jYXQobGF5ZXJzVG9JbnNlcnQpO1xuICBjb25zdCBuZXdMYXllck9yZGVyUXVldWUgPSBpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyKFxuICAgIGN1cnJlbnRMYXllclF1ZXVlLFxuICAgIGxheWVyc1RvSW5zZXJ0LFxuICAgIHByZXNlcnZlZE9yZGVyLFxuICAgIHRydWVcbiAgKTtcblxuICAvLyByZWNvbnN0cnVjdCBsYXllck9yZGVyIGFmdGVyIGluc2VydFxuICBjb25zdCBuZXdMYXllck9yZGVyID0gZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMobmV3TGF5ZXJPcmRlclF1ZXVlKTtcblxuICByZXR1cm4ge1xuICAgIG5ld0xheWVyT3JkZXIsXG4gICAgbmV3TGF5ZXJzXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgaW50ZXJhY3Rpb25zIHdpdGggc2F2ZWQgY29uZmlnXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvbnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGludGVyYWN0aW9uVG9CZU1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiB8IHVuZGVmaW5lZFxuKTogUyB7XG4gIGNvbnN0IG1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiA9IHt9O1xuICBjb25zdCB1bm1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiA9IHt9O1xuXG4gIGlmIChpbnRlcmFjdGlvblRvQmVNZXJnZWQpIHtcbiAgICAoT2JqZWN0LmtleXMoaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkKSBhcyBBcnJheTxrZXlvZiBTYXZlZEludGVyYWN0aW9uQ29uZmlnPikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKCFzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1trZXldKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudENvbmZpZyA9XG4gICAgICAgIGtleSA9PT0gJ3Rvb2x0aXAnIHx8IGtleSA9PT0gJ2JydXNoJyA/IHN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0uY29uZmlnIDogbnVsbDtcblxuICAgICAgY29uc3Qge2VuYWJsZWQsIC4uLmNvbmZpZ1NhdmVkfSA9IGludGVyYWN0aW9uVG9CZU1lcmdlZFtrZXldIHx8IHt9O1xuXG4gICAgICBsZXQgY29uZmlnVG9NZXJnZSA9IGNvbmZpZ1NhdmVkO1xuXG4gICAgICBpZiAoa2V5ID09PSAndG9vbHRpcCcpIHtcbiAgICAgICAgY29uc3Qge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH0gPSBtZXJnZUludGVyYWN0aW9uVG9vbHRpcENvbmZpZyhcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb25maWdTYXZlZCBhcyBTYXZlZEludGVyYWN0aW9uQ29uZmlnWyd0b29sdGlwJ11cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBtZXJnZSBuZXcgZGF0YXNldCB0b29sdGlwcyB3aXRoIG9yaWdpbmFsIGRhdGFzZXQgdG9vbHRpcHNcbiAgICAgICAgY29uZmlnVG9NZXJnZSA9IHtcbiAgICAgICAgICBmaWVsZHNUb1Nob3c6IHtcbiAgICAgICAgICAgIC4uLihjdXJyZW50Q29uZmlnIGFzIFRvb2x0aXBJbmZvWydjb25maWcnXSkuZmllbGRzVG9TaG93LFxuICAgICAgICAgICAgLi4ubWVyZ2VkVG9vbHRpcFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXModW5tZXJnZWRUb29sdGlwKS5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgdW5tZXJnZWQudG9vbHRpcCA9IHtmaWVsZHNUb1Nob3c6IHVubWVyZ2VkVG9vbHRpcCwgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKX07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWVyZ2VkW2tleV0gPSB7XG4gICAgICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0sXG4gICAgICAgIGVuYWJsZWQ6IEJvb2xlYW4oZW5hYmxlZCksXG4gICAgICAgIC4uLihjdXJyZW50Q29uZmlnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvbmZpZzogcGljayhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5jdXJyZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgLi4uY29uZmlnVG9NZXJnZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY3VycmVudENvbmZpZylcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnOiB7XG4gICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgIC4uLm1lcmdlZFxuICAgIH0sXG4gICAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiBzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb24oc3RhdGUsIHVubWVyZ2VkKVxuICB9O1xuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG5mdW5jdGlvbiBzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb248UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+XG4pIHtcbiAgaWYgKCF1bm1lcmdlZD8udG9vbHRpcD8uZmllbGRzVG9TaG93KSB7XG4gICAgcmV0dXJuIHN0YXRlLmludGVyYWN0aW9uVG9CZU1lcmdlZDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRvb2x0aXA6IHtcbiAgICAgIC4uLnN0YXRlLmludGVyYWN0aW9uVG9CZU1lcmdlZC50b29sdGlwLFxuICAgICAgLi4uKHR5cGVvZiB1bm1lcmdlZD8udG9vbHRpcD8uZW5hYmxlZCA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgID8ge2VuYWJsZWQ6IHVubWVyZ2VkLnRvb2x0aXAuZW5hYmxlZH1cbiAgICAgICAgOiB7fSksXG4gICAgICBmaWVsZHNUb1Nob3c6IHtcbiAgICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkPy50b29sdGlwPy5maWVsZHNUb1Nob3csXG4gICAgICAgIC4uLnVubWVyZ2VkPy50b29sdGlwPy5maWVsZHNUb1Nob3dcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VJbnRlcmFjdGlvbkRhdGFzZXRJZHMoaW50ZXJhY3Rpb25Db25maWcsIGRhdGFJZDogc3RyaW5nLCBkYXRhSWRUb1JlcGxhY2U6IHN0cmluZykge1xuICBpZiAoaW50ZXJhY3Rpb25Db25maWc/LnRvb2x0aXA/LmZpZWxkc1RvU2hvd1tkYXRhSWRdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgdG9vbHRpcDoge1xuICAgICAgICAuLi5pbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLFxuICAgICAgICBmaWVsZHNUb1Nob3c6IHtcbiAgICAgICAgICBbZGF0YUlkVG9SZXBsYWNlXTogaW50ZXJhY3Rpb25Db25maWc/LnRvb2x0aXA/LmZpZWxkc1RvU2hvd1tkYXRhSWRdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBNZXJnZSBzcGxpdE1hcHMgY29uZmlnIHdpdGggY3VycmVudCB2aXNTdGV0ZS5cbiAqIDEuIGlmIGN1cnJlbnQgbWFwIGlzIHNwbGl0LCBidXQgc3BsaXRNYXAgRE9FU05PVCBjb250YWluIG1hcHNcbiAqICAgIDogZG9uJ3QgbWVyZ2UgYW55dGhpbmdcbiAqIDIuIGlmIGN1cnJlbnQgbWFwIGlzIE5PVCBzcGxpdCwgYnV0IHNwbGl0TWFwcyBjb250YWluIG1hcHNcbiAqICAgIDogYWRkIHRvIHNwbGl0TWFwcywgYW5kIGFkZCBjdXJyZW50IGxheWVycyB0byBzcGxpdE1hcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU3BsaXRNYXBzPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBzcGxpdE1hcHM6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ3NwbGl0TWFwcyddID0gW11cbik6IFMge1xuICBjb25zdCBtZXJnZWQgPSBbLi4uc3RhdGUuc3BsaXRNYXBzXTtcbiAgY29uc3QgdW5tZXJnZWQgPSBbXTtcbiAgc3BsaXRNYXBzLmZvckVhY2goKHNtLCBpKSA9PiB7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHNtLmxheWVycyk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgZW50cmllcy5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgICAgICAvLyBjaGVjayBpZiBsYXllciBleGlzdHNcbiAgICAgICAgY29uc3QgcHVzaFRvID0gc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBpZCkgPyBtZXJnZWQgOiB1bm1lcmdlZDtcblxuICAgICAgICAvLyBjcmVhdGUgbWFwIHBhbmVsIGlmIGN1cnJlbnQgbWFwIGlzIG5vdCBzcGxpdFxuICAgICAgICBwdXNoVG9baV0gPSBwdXNoVG9baV0gfHwge1xuICAgICAgICAgIC8vIGtlZXAgaWRcbiAgICAgICAgICAuLi5zbSxcbiAgICAgICAgICBsYXllcnM6IHB1c2hUbyA9PT0gbWVyZ2VkID8gZ2V0SW5pdGlhbE1hcExheWVyc0ZvclNwbGl0TWFwKHN0YXRlLmxheWVycykgOiBbXVxuICAgICAgICB9O1xuICAgICAgICBwdXNoVG9baV0ubGF5ZXJzID0ge1xuICAgICAgICAgIC4uLnB1c2hUb1tpXS5sYXllcnMsXG4gICAgICAgICAgW2lkXTogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBhcmUgbWVyZ2luZyBpZiB0aGVyZSBhcmUgbm8gbGF5ZXJzIGluIGJvdGggc3BsaXQgbWFwXG4gICAgICBtZXJnZWQucHVzaChzbSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHNwbGl0TWFwczogbWVyZ2VkLFxuICAgIHNwbGl0TWFwc1RvQmVNZXJnZWQ6IFsuLi5zdGF0ZS5zcGxpdE1hcHNUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBlZmZlY3RzIHdpdGggc2F2ZWQgY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUVmZmVjdHM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGVmZmVjdHM6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2VmZmVjdHMnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBjb25zdCBuZXdFZmZlY3RzID0gW1xuICAgIC4uLnN0YXRlLmVmZmVjdHMsXG4gICAgLi4uKGVmZmVjdHMgfHwgW10pXG4gICAgICAubWFwKGVmZmVjdCA9PiB7XG4gICAgICAgIHJldHVybiBmcm9tQ29uZmlnXG4gICAgICAgICAgPyBjcmVhdGVFZmZlY3QoXG4gICAgICAgICAgICAgIGRlZXBtZXJnZS5hbGwoW1xuICAgICAgICAgICAgICAgIGVmZmVjdCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAvLyBjb2xsYXBzZSBhbGwgcGFuZWxzIHdoZW4gbG9hZGluZyBlZmZlY3RzXG4gICAgICAgICAgICAgICAgICBpc0NvbmZpZ0FjdGl2ZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiAoZWZmZWN0IGFzIEVmZmVjdFR5cGUpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoZWZmZWN0ID0+IHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZWZmZWN0ICYmIGVmZmVjdC5pc1ZhbGlkVG9TYXZlKCkpO1xuICAgICAgfSlcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZmZlY3RzOiBuZXdFZmZlY3RzLFxuICAgIGVmZmVjdE9yZGVyOiBuZXdFZmZlY3RzLm1hcChlZmZlY3QgPT4gZWZmZWN0LmlkKVxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAgd2l0aCBzYXZlZCBjb25maWcsXG4gKiB2YWxpZGF0ZSBmaWVsZHNUb1Nob3dcbiAqXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSB0b29sdGlwQ29uZmlnXG4gKiBAcmV0dXJuIC0ge21lcmdlZFRvb2x0aXA6IHt9LCB1bm1lcmdlZFRvb2x0aXA6IHt9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgdG9vbHRpcENvbmZpZzogUGljazxUb29sdGlwSW5mb1snY29uZmlnJ10sICdmaWVsZHNUb1Nob3cnPiB8IG51bGwgPSBudWxsXG4pIHtcbiAgY29uc3QgdW5tZXJnZWRUb29sdGlwOiBUb29sdGlwSW5mb1snY29uZmlnJ11bJ2ZpZWxkc1RvU2hvdyddID0ge307XG4gIGNvbnN0IG1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcblxuICBpZiAoXG4gICAgIXRvb2x0aXBDb25maWcgfHxcbiAgICAhdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cgfHxcbiAgICAhT2JqZWN0LmtleXModG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cpLmxlbmd0aFxuICApIHtcbiAgICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFJZCBpbiB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykge1xuICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXSB8fCBzdGF0ZS5pc01lcmdpbmdEYXRhc2V0c1tkYXRhSWRdKSB7XG4gICAgICAvLyBpcyBub3QgeWV0IGxvYWRlZFxuICAgICAgdW5tZXJnZWRUb29sdGlwW2RhdGFJZF0gPSB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBkYXRhc2V0IGlzIGxvYWRlZFxuICAgICAgY29uc3QgYWxsRmllbGRzID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5maWVsZHMubWFwKGQgPT4gZC5uYW1lKTtcbiAgICAgIGNvbnN0IGZvdW5kRmllbGRzVG9TaG93ID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXS5maWx0ZXIoZmllbGQgPT5cbiAgICAgICAgYWxsRmllbGRzLmluY2x1ZGVzKGZpZWxkLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBtZXJnZWRUb29sdGlwW2RhdGFJZF0gPSBmb3VuZEZpZWxkc1RvU2hvdztcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG59XG4vKipcbiAqIE1lcmdlIGxheWVyQmxlbmRpbmcgd2l0aCBzYXZlZFxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTGF5ZXJCbGVuZGluZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgbGF5ZXJCbGVuZGluZzogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJCbGVuZGluZyddXG4pOiBTIHtcbiAgaWYgKGxheWVyQmxlbmRpbmcgJiYgTEFZRVJfQkxFTkRJTkdTW2xheWVyQmxlbmRpbmddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJCbGVuZGluZ1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogTWVyZ2Ugb3ZlcmxheUJsZW5kaW5nIHdpdGggc2F2ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlT3ZlcmxheUJsZW5kaW5nPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBvdmVybGF5QmxlbmRpbmc6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ292ZXJsYXlCbGVuZGluZyddXG4pOiBTIHtcbiAgaWYgKG92ZXJsYXlCbGVuZGluZyAmJiBPVkVSTEFZX0JMRU5ESU5HU1tvdmVybGF5QmxlbmRpbmddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgb3ZlcmxheUJsZW5kaW5nXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBNZXJnZSBhbmltYXRpb24gY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFuaW1hdGlvbkNvbmZpZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYW5pbWF0aW9uOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydhbmltYXRpb25Db25maWcnXVxuKTogUyB7XG4gIGlmIChhbmltYXRpb24gJiYgYW5pbWF0aW9uLmN1cnJlbnRUaW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgLi4uYW5pbWF0aW9uLFxuICAgICAgICBkb21haW46IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbHVtbnMgd2l0aCBuZXcgZGF0YSxcbiAqIHVwZGF0ZSBmaWVsZElkeCBiYXNlZCBvbiBuZXcgZmllbGRzXG4gKlxuICogQHBhcmFtIGZpZWxkc1xuICogQHBhcmFtIHNhdmVkQ29sc1xuICogQHBhcmFtIGVtcHR5Q29sc1xuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm4gLSB2YWxpZGF0ZWQgY29sdW1ucyBvciBudWxsXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoXG4gIGZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddLFxuICBzYXZlZENvbHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH0gPSB7fSxcbiAgZW1wdHlDb2xzOiBMYXllckNvbHVtbnMsXG4gIG9wdGlvbnM6IHt0aHJvd09uRXJyb3I/OiBib29sZWFufSA9IHt9XG4pIHtcbiAgLy8gUHJlcGFyZSBjb2x1bW5zIGZvciB0aGUgdmFsaWRhdG9yXG4gIGNvbnN0IGNvbHVtbnM6IHR5cGVvZiBlbXB0eUNvbHMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW1wdHlDb2xzKSkge1xuICAgIGNvbHVtbnNba2V5XSA9IHsuLi5lbXB0eUNvbHNba2V5XX07XG5cbiAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29sc1trZXldO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KCh7bmFtZX0pID0+IG5hbWUgPT09IHNhdmVkKTtcblxuICAgICAgaWYgKGZpZWxkSWR4ID4gLTEpIHtcbiAgICAgICAgLy8gdXBkYXRlIGZvdW5kIGNvbHVtbnNcbiAgICAgICAgY29sdW1uc1trZXldLmZpZWxkSWR4ID0gZmllbGRJZHg7XG4gICAgICAgIGNvbHVtbnNba2V5XS52YWx1ZSA9IHNhdmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgYWN0dWFsIGNvbHVtbiBmaWVsZElkeCwgaW4gY2FzZSBpdCBoYXMgY2hhbmdlZFxuICBjb25zdCBhbGxDb2xGb3VuZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpLmV2ZXJ5KGtleSA9PlxuICAgIHZhbGlkYXRlQ29sdW1uKGNvbHVtbnNba2V5XSwgY29sdW1ucywgZmllbGRzKVxuICApO1xuXG4gIGNvbnN0IHJ2ID0gYWxsQ29sRm91bmQgPyBjb2x1bW5zIDogbnVsbDtcbiAgaWYgKG9wdGlvbnMudGhyb3dPbkVycm9yKSB7XG4gICAgY29uc3QgcmVxdWlyZWRDb2x1bW5zID0gT2JqZWN0LmtleXMoZW1wdHlDb2xzKS5maWx0ZXIoayA9PiAhZW1wdHlDb2xzW2tdLm9wdGlvbmFsKTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IHJlcXVpcmVkQ29sdW1ucy5maWx0ZXIoayA9PiAhY29sdW1ucz8uW2tdLnZhbHVlKTtcbiAgICBpZiAobWlzc2luZ0NvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgY29sdW1uczogJHttaXNzaW5nQ29sdW1ucy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb25maWdDb2x1bW5zID0gT2JqZWN0LmtleXMoc2F2ZWRDb2xzKTtcbiAgICBjb25zdCBpbnZhbGlkQ29sdW1ucyA9IGNvbmZpZ0NvbHVtbnMuZmlsdGVyKGsgPT4gIWNvbHVtbnM/LltrXT8udmFsdWUpO1xuICAgIGlmIChpbnZhbGlkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgY29sdW1uczogJHtpbnZhbGlkQ29sdW1ucy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydjtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBsYXllciBjb2x1bW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29sdW1uKFxuICBjb2x1bW46IExheWVyQ29sdW1uICYge3ZhbGlkYXRvcj86IHR5cGVvZiB2YWxpZGF0ZUNvbHVtbn0sXG4gIGNvbHVtbnM6IExheWVyQ29sdW1ucyxcbiAgYWxsRmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ11cbik6IGJvb2xlYW4ge1xuICBpZiAoY29sdW1uLm9wdGlvbmFsIHx8IGNvbHVtbi52YWx1ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChjb2x1bW4udmFsaWRhdG9yKSB7XG4gICAgcmV0dXJuIGNvbHVtbi52YWxpZGF0b3IoY29sdW1uLCBjb2x1bW5zLCBhbGxGaWVsZHMpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCB0ZXh0IGxhYmVsIGNvbmZpZyB3aXRoIG5ldyBkYXRhXG4gKiByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFRleHRMYWJlbFNjaGVtYVYxXG4gKlxuICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBmaWVsZHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzYXZlZFRleHRMYWJlbFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gLSB2YWxpZGF0ZWQgdGV4dGxhYmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVGV4dExhYmVsKFxuICBmaWVsZHMsXG4gIFtsYXllclRleHRMYWJlbF0sXG4gIHNhdmVkVGV4dExhYmVsLFxuICBvcHRpb25zOiB7dGhyb3dPbkVycm9yPzogYm9vbGVhbn0gPSB7fVxuKSB7XG4gIGNvbnN0IHNhdmVkVGV4dExhYmVscyA9IEFycmF5LmlzQXJyYXkoc2F2ZWRUZXh0TGFiZWwpID8gc2F2ZWRUZXh0TGFiZWwgOiBbc2F2ZWRUZXh0TGFiZWxdO1xuXG4gIC8vIHZhbGlkYXRlIGZpZWxkXG4gIHJldHVybiBzYXZlZFRleHRMYWJlbHMubWFwKHRleHRMYWJlbCA9PiB7XG4gICAgY29uc3QgZmllbGQgPSB0ZXh0TGFiZWwuZmllbGRcbiAgICAgID8gZmllbGRzLmZpbmQoZmQgPT5cbiAgICAgICAgICBPYmplY3Qua2V5cyh0ZXh0TGFiZWwuZmllbGQpLmV2ZXJ5KGtleSA9PiB0ZXh0TGFiZWwuZmllbGRba2V5XSA9PT0gZmRba2V5XSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgdGV4dCBsYWJlbCBmaWVsZDogJHtKU09OLnN0cmluZ2lmeSh0ZXh0TGFiZWwuZmllbGQpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhsYXllclRleHRMYWJlbCkucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGtleSA9PT0gJ2ZpZWxkJyA/IGZpZWxkIDogdGV4dExhYmVsW2tleV0gfHwgbGF5ZXJUZXh0TGFiZWxba2V5XVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIHZpc3VhbCBjaGFubmVscyBjb25maWcgd2l0aCBuZXcgZGF0YSxcbiAqIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVmlzdWFsQ2hhbm5lbHMoXG4gIGZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddLFxuICBuZXdMYXllcjogTGF5ZXIsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBvcHRpb25zOiB7dGhyb3dPbkVycm9yPzogYm9vbGVhbn0gPSB7fVxuKTogbnVsbCB8IExheWVyIHtcbiAgKE9iamVjdC52YWx1ZXMobmV3TGF5ZXIudmlzdWFsQ2hhbm5lbHMpIGFzIFZpc3VhbENoYW5uZWxbXSkuZm9yRWFjaCgoe2ZpZWxkLCBzY2FsZSwga2V5fSkgPT4ge1xuICAgIGxldCBmb3VuZEZpZWxkO1xuICAgIGlmIChzYXZlZExheWVyLmNvbmZpZykge1xuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgICBmb3VuZEZpZWxkID0gZmllbGRzLmZpbmQoXG4gICAgICAgICAgZmQgPT4gc2F2ZWRMYXllci5jb25maWcgJiYgZmQubmFtZSA9PT0gc2F2ZWRMYXllci5jb25maWdbZmllbGRdLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmRDaGFubmVsID0ge1xuICAgICAgICAuLi4oZm91bmRGaWVsZCA/IHtbZmllbGRdOiBmb3VuZEZpZWxkfSA6IHt9KSxcbiAgICAgICAgLi4uKHNhdmVkTGF5ZXIuY29uZmlnW3NjYWxlXSA/IHtbc2NhbGVdOiBzYXZlZExheWVyLmNvbmZpZ1tzY2FsZV19IDoge30pXG4gICAgICB9O1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGZvdW5kQ2hhbm5lbCkubGVuZ3RoKSB7XG4gICAgICAgIG5ld0xheWVyLnVwZGF0ZUxheWVyQ29uZmlnKGZvdW5kQ2hhbm5lbCk7XG4gICAgICB9XG5cbiAgICAgIG5ld0xheWVyLnZhbGlkYXRlVmlzdWFsQ2hhbm5lbChrZXkpO1xuICAgICAgaWYgKG9wdGlvbnMudGhyb3dPbkVycm9yKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHNhdmVkTGF5ZXIuY29uZmlnPy5bZmllbGRdPy5uYW1lO1xuICAgICAgICBpZiAoZmllbGROYW1lICYmIGZpZWxkTmFtZSAhPT0gbmV3TGF5ZXIuY29uZmlnW2ZpZWxkXT8ubmFtZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgdmlzdWFsIGNoYW5uZWwgZmllbGQ6ICR7ZmllbGR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbnR5cGUgVmFsaWRhdGVMYXllck9wdGlvbiA9IHtcbiAgYWxsb3dFbXB0eUNvbHVtbj86IGJvb2xlYW47XG4gIHRocm93T25FcnJvcj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICBkYXRhc2V0czogRGF0YXNldHMsXG4gIGxheWVyQ2xhc3NlczogVmlzU3RhdGVbJ2xheWVyQ2xhc3NlcyddLFxuICBsYXllcnM6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW10sXG4gIG9wdGlvbnM/OiBWYWxpZGF0ZUxheWVyT3B0aW9uXG4pIHtcbiAgY29uc3QgdmFsaWRhdGVkOiBMYXllcltdID0gW107XG4gIGNvbnN0IGZhaWxlZDogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXTtcblxuICBsYXllcnMuZm9yRWFjaChsYXllciA9PiB7XG4gICAgbGV0IHZhbGlkYXRlTGF5ZXI6IExheWVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAobGF5ZXI/LmNvbmZpZz8uZGF0YUlkKSB7XG4gICAgICBpZiAoZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0pIHtcbiAgICAgICAgLy8gZGF0YXNldHMgYXJlIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIHZhbGlkYXRlTGF5ZXIgPSB2YWxpZGF0ZUxheWVyV2l0aERhdGEoXG4gICAgICAgICAgZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0sXG4gICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgbGF5ZXJDbGFzc2VzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVMYXllcikge1xuICAgICAgdmFsaWRhdGVkLnB1c2godmFsaWRhdGVMYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRhdGFzZXRzIG5vdCB5ZXQgbG9hZGVkXG4gICAgICBmYWlsZWQucHVzaChsYXllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge3ZhbGlkYXRlZCwgZmFpbGVkfTtcbn1cblxuLyoqXG4gKiBHZXQgcmVxdWlyZWQgY29sdW1ucyBmb3IgdmFsaWRhdGlvbiBiYXNlZCBvbiBjb2x1bW4gbW9kZVxuICovXG5mdW5jdGlvbiBfZ2V0Q29sdW1uQ29uZmlnRm9yVmFsaWRhdGlvbihuZXdMYXllcikge1xuICAvLyBmaW5kIGNvbHVtbiBmaWVsZElkeFxuICBsZXQgY29sdW1uQ29uZmlnID0gbmV3TGF5ZXIuZ2V0TGF5ZXJDb2x1bW5zKCk7XG4gIC8vIGlmIGNvbHVtbk1vZGUgaXMgZGVmaW5lZCwgZmluZCBjb2x1bW4gbW9kZSBjb25maWdcbiAgY29uc3QgY29sTW9kZUNvbmZpZyA9IG5ld0xheWVyLmNvbmZpZy5jb2x1bW5Nb2RlXG4gICAgPyAobmV3TGF5ZXIuc3VwcG9ydGVkQ29sdW1uTW9kZXMgfHwgW10pLmZpbmQoXG4gICAgICAgIGNvbE1vZGUgPT4gY29sTW9kZS5rZXkgPT09IG5ld0xheWVyLmNvbmZpZy5jb2x1bW5Nb2RlXG4gICAgICApXG4gICAgOiBudWxsO1xuXG4gIGlmIChjb2xNb2RlQ29uZmlnKSB7XG4gICAgLy8gb25seSB2YWxpZGF0ZSBjb2x1bW5zIGluIGNvbHVtbiBtb2RlXG4gICAgY29sdW1uQ29uZmlnID0gW1xuICAgICAgLi4uKGNvbE1vZGVDb25maWcucmVxdWlyZWRDb2x1bW5zIHx8IFtdKSxcbiAgICAgIC4uLihjb2xNb2RlQ29uZmlnLm9wdGlvbmFsQ29sdW1ucyB8fCBbXSlcbiAgICBdLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBjb2x1bW5Db25maWdba2V5XVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29sdW1uQ29uZmlnO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbmZpZyB3aXRoIG5ldyBkYXRhLFxuICogdXBkYXRlIGZpZWxkSWR4IGJhc2VkIG9uIG5ldyBmaWVsZHNcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyV2l0aERhdGEoXG4gIGRhdGFzZXQ6IEtlcGxlclRhYmxlLFxuICBzYXZlZExheWVyOiBQYXJzZWRMYXllcixcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIG9wdGlvbnM6IFZhbGlkYXRlTGF5ZXJPcHRpb24gPSB7fVxuKTogTGF5ZXIgfCBudWxsIHtcbiAgY29uc3Qge2ZpZWxkcywgaWQ6IGRhdGFJZH0gPSBkYXRhc2V0O1xuICBjb25zdCB7dHlwZX0gPSBzYXZlZExheWVyO1xuICBjb25zdCB7dGhyb3dPbkVycm9yfSA9IG9wdGlvbnM7XG4gIC8vIGxheWVyIGRvZXNudCBoYXZlIGEgdmFsaWQgdHlwZVxuICBpZiAoIXR5cGUgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsYXllckNsYXNzZXMsIHR5cGUpIHx8ICFzYXZlZExheWVyLmNvbmZpZykge1xuICAgIGlmICh0aHJvd09uRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgdHlwZSBcIiR7dHlwZX1cIiBvciBjb25maWcgaXMgbWlzc2luZ2ApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbdHlwZV0oe1xuICAgIGlkOiBzYXZlZExheWVyLmlkLFxuICAgIGRhdGFJZCxcbiAgICBsYWJlbDogc2F2ZWRMYXllci5jb25maWcubGFiZWwsXG4gICAgY29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmNvbG9yLFxuICAgIGlzVmlzaWJsZTogc2F2ZWRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGhpZGRlbjogc2F2ZWRMYXllci5jb25maWcuaGlkZGVuLFxuICAgIGNvbHVtbk1vZGU6IHNhdmVkTGF5ZXIuY29uZmlnLmNvbHVtbk1vZGUsXG4gICAgaGlnaGxpZ2h0Q29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmhpZ2hsaWdodENvbG9yXG4gIH0pO1xuXG4gIGNvbnN0IGNvbHVtbkNvbmZpZyA9IF9nZXRDb2x1bW5Db25maWdGb3JWYWxpZGF0aW9uKG5ld0xheWVyKTtcblxuICBpZiAoT2JqZWN0LmtleXMoY29sdW1uQ29uZmlnKSkge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zKFxuICAgICAgZmllbGRzLFxuICAgICAgc2F2ZWRMYXllci5jb25maWcuY29sdW1ucyxcbiAgICAgIGNvbHVtbkNvbmZpZyxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgIGNvbHVtbnM6IHtcbiAgICAgICAgICAuLi5uZXdMYXllci5jb25maWcuY29sdW1ucyxcbiAgICAgICAgICAuLi5jb2x1bW5zXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuYWxsb3dFbXB0eUNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGV4dExhYmVsID1cbiAgICBzYXZlZExheWVyLmNvbmZpZy50ZXh0TGFiZWwgJiYgbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbFxuICAgICAgPyB2YWxpZGF0ZVNhdmVkVGV4dExhYmVsKFxuICAgICAgICAgIGZpZWxkcyxcbiAgICAgICAgICBuZXdMYXllci5jb25maWcudGV4dExhYmVsLFxuICAgICAgICAgIHNhdmVkTGF5ZXIuY29uZmlnLnRleHRMYWJlbCxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgIClcbiAgICAgIDogbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbDtcblxuICAvLyBjb3B5IHZpc0NvbmZpZyBvdmVyIHRvIGVtcHR5TGF5ZXIgdG8gbWFrZSBzdXJlIGl0IGhhcyBhbGwgdGhlIHByb3BzXG4gIGNvbnN0IGNvcGllZFZpc0NvbmZpZyA9IG5ld0xheWVyLmNvcHlMYXllckNvbmZpZyhcbiAgICBuZXdMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIHNhdmVkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyB8fCB7fSxcbiAgICB7XG4gICAgICBzaGFsbG93Q29weTogWydjb2xvclJhbmdlJywgJ3N0cm9rZUNvbG9yUmFuZ2UnXVxuICAgIH1cbiAgKTtcblxuICAvLyBjYWxsIGxheWVyIG1ldGhvZHMgdG8gdmFsaWRhdGUgdmlzQ29uZmlnIHdoZW4gc3dpdGNoaW5nIGRhdGFzZXRcbiAgY29uc3QgdmlzQ29uZmlnID0gbmV3TGF5ZXIudmFsaWRhdGVWaXNDb25maWdcbiAgICA/IG5ld0xheWVyLnZhbGlkYXRlVmlzQ29uZmlnKGRhdGFzZXQsIGNvcGllZFZpc0NvbmZpZylcbiAgICA6IGNvcGllZFZpc0NvbmZpZztcblxuICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgdmlzQ29uZmlnLFxuICAgIHRleHRMYWJlbFxuICB9KTtcblxuICAvLyB2aXN1YWwgY2hhbm5lbCBmaWVsZCBpcyBzYXZlZCB0byBiZSB7bmFtZSwgdHlwZX1cbiAgLy8gZmluZCB2aXN1YWwgY2hhbm5lbCBmaWVsZCBieSBtYXRjaGluZyBib3RoIG5hbWUgYW5kIHR5cGVcbiAgLy8gcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBWaXN1YWxDaGFubmVsU2NoZW1hVjFcbiAgbmV3TGF5ZXIgPSB2YWxpZGF0ZVNhdmVkVmlzdWFsQ2hhbm5lbHMoZmllbGRzLCBuZXdMYXllciwgc2F2ZWRMYXllciwgb3B0aW9ucyk7XG5cbiAgaWYgKHRocm93T25FcnJvcikge1xuICAgIGlmICghbmV3TGF5ZXIuaXNWYWxpZFRvU2F2ZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGlzIG5vdCB2YWxpZCB0byBzYXZlOiAke25ld0xheWVyLmlkfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdMYXllcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRWRpdG9yPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMsIHNhdmVkRWRpdG9yOiBTYXZlZEVkaXRvcikge1xuICBpZiAoIXNhdmVkRWRpdG9yKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICBmZWF0dXJlczogWy4uLnN0YXRlLmVkaXRvci5mZWF0dXJlcywgLi4uKHNhdmVkRWRpdG9yLmZlYXR1cmVzIHx8IFtdKV0sXG4gICAgICAvLyBpZiBzYXZlZEVkaXRvci52aXNpYmxlIGlzIHVuZGVmaW5lZCBrZWVwIHN0YXRlLmVkaXRvci52aXNpYmxlXG4gICAgICB2aXNpYmxlOiBzYXZlZEVkaXRvci52aXNpYmxlID8/IHN0YXRlLmVkaXRvci52aXNpYmxlXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbmZpZyB3aXRoIG5ldyBkYXRhLFxuICogdXBkYXRlIGZpZWxkSWR4IGJhc2VkIG9uIG5ldyBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGF0YXNldHNCeU9yZGVyKHN0YXRlOiBWaXNTdGF0ZSwgbmV3RGF0YUVudHJpZXM6IERhdGFzZXRzKTogRGF0YXNldHMge1xuICBjb25zdCBtZXJnZWQgPSB7XG4gICAgLi4uc3RhdGUuZGF0YXNldHMsXG4gICAgLi4ubmV3RGF0YUVudHJpZXNcbiAgfTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlcikpIHtcbiAgICAvLyBwcmVzZXJ2ZURhdGFzZXRPcmRlciAgbWlnaHQgbm90IGluY2x1ZGUgdGhlICBuZXcgZGF0YXNldHNcbiAgICBjb25zdCBuZXdEYXRhc2V0SWRzID0gT2JqZWN0LmtleXMobWVyZ2VkKS5maWx0ZXIoXG4gICAgICBpZCA9PiAhc3RhdGUucHJlc2VydmVEYXRhc2V0T3JkZXI/LmluY2x1ZGVzKGlkKVxuICAgICk7XG4gICAgcmV0dXJuIFsuLi5zdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlciwgLi4ubmV3RGF0YXNldElkc10ucmVkdWNlKFxuICAgICAgKGFjY3UsIGRhdGFJZCkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgLi4uKG1lcmdlZFtkYXRhSWRdID8ge1tkYXRhSWRdOiBtZXJnZWRbZGF0YUlkXX0gOiB7fSlcbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZXhwb3J0IGNvbnN0IFZJU19TVEFURV9NRVJHRVJTOiBWaXNTdGF0ZU1lcmdlcnM8YW55PiA9IFtcbiAge1xuICAgIG1lcmdlOiBtZXJnZUxheWVycyxcbiAgICBwcm9wOiAnbGF5ZXJzJyxcbiAgICB0b01lcmdlUHJvcDogJ2xheWVyVG9CZU1lcmdlZCcsXG4gICAgcHJlc2VydmVPcmRlcjogJ3ByZXNlcnZlTGF5ZXJPcmRlcidcbiAgfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZUZpbHRlcnMsXG4gICAgcHJvcDogJ2ZpbHRlcnMnLFxuICAgIHRvTWVyZ2VQcm9wOiAnZmlsdGVyVG9CZU1lcmdlZCcsXG4gICAgcHJlc2VydmVPcmRlcjogJ3ByZXNlcnZlRmlsdGVyT3JkZXInLFxuICAgIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzOiByZXBsYWNlRmlsdGVyRGF0YXNldElkc1xuICB9LFxuICB7XG4gICAgbWVyZ2U6IG1lcmdlRWZmZWN0cyxcbiAgICBwcm9wOiAnZWZmZWN0cydcbiAgfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZUludGVyYWN0aW9ucyxcbiAgICBwcm9wOiAnaW50ZXJhY3Rpb25Db25maWcnLFxuICAgIHRvTWVyZ2VQcm9wOiAnaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkJyxcbiAgICByZXBsYWNlUGFyZW50RGF0YXNldElkczogcmVwbGFjZUludGVyYWN0aW9uRGF0YXNldElkcyxcbiAgICBzYXZlVW5tZXJnZWQ6IHNhdmVkVW5tZXJnZWRJbnRlcmFjdGlvblxuICB9LFxuICB7bWVyZ2U6IG1lcmdlTGF5ZXJCbGVuZGluZywgcHJvcDogJ2xheWVyQmxlbmRpbmcnfSxcbiAge21lcmdlOiBtZXJnZU92ZXJsYXlCbGVuZGluZywgcHJvcDogJ292ZXJsYXlCbGVuZGluZyd9LFxuICB7bWVyZ2U6IG1lcmdlU3BsaXRNYXBzLCBwcm9wOiAnc3BsaXRNYXBzJywgdG9NZXJnZVByb3A6ICdzcGxpdE1hcHNUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VBbmltYXRpb25Db25maWcsIHByb3A6ICdhbmltYXRpb25Db25maWcnfSxcbiAge21lcmdlOiBtZXJnZUVkaXRvciwgcHJvcDogJ2VkaXRvcid9XG5dO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxRQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFTQSxJQUFBSyxRQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxVQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxRQUFBLEdBQUFQLE9BQUE7QUFlQSxJQUFBUSxNQUFBLEdBQUFSLE9BQUE7QUFFQSxJQUFBUyxXQUFBLEdBQUFULE9BQUE7QUFBc0QsSUFBQVUsU0FBQTtBQUFBLFNBQUFDLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLENBQUEsR0FBQUss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