@kepler.gl/reducers 3.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/combined-updaters.d.ts +50 -0
- package/dist/combined-updaters.js +212 -0
- package/dist/composer-helpers.d.ts +21 -0
- package/dist/composer-helpers.js +133 -0
- package/dist/composers.d.ts +12 -0
- package/dist/composers.js +47 -0
- package/dist/core.d.ts +64 -0
- package/dist/core.js +149 -0
- package/dist/data-utils.d.ts +8 -0
- package/dist/data-utils.js +60 -0
- package/dist/export-utils.d.ts +21 -0
- package/dist/export-utils.js +124 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +372 -0
- package/dist/interaction-utils.d.ts +35 -0
- package/dist/interaction-utils.js +149 -0
- package/dist/layer-utils.d.ts +66 -0
- package/dist/layer-utils.js +289 -0
- package/dist/map-state-updaters.d.ts +62 -0
- package/dist/map-state-updaters.js +250 -0
- package/dist/map-state.d.ts +3 -0
- package/dist/map-state.js +67 -0
- package/dist/map-style-updaters.d.ts +173 -0
- package/dist/map-style-updaters.js +538 -0
- package/dist/map-style.d.ts +4 -0
- package/dist/map-style.js +66 -0
- package/dist/middleware.d.ts +8 -0
- package/dist/middleware.js +46 -0
- package/dist/provider-state-updaters.d.ts +42 -0
- package/dist/provider-state-updaters.js +512 -0
- package/dist/provider-state.d.ts +4 -0
- package/dist/provider-state.js +66 -0
- package/dist/root.d.ts +31 -0
- package/dist/root.js +235 -0
- package/dist/ui-state-updaters.d.ts +355 -0
- package/dist/ui-state-updaters.js +866 -0
- package/dist/ui-state.d.ts +3 -0
- package/dist/ui-state.js +68 -0
- package/dist/vis-state-merger.d.ts +102 -0
- package/dist/vis-state-merger.js +635 -0
- package/dist/vis-state-selectors.d.ts +2 -0
- package/dist/vis-state-selectors.js +53 -0
- package/dist/vis-state-updaters.d.ts +419 -0
- package/dist/vis-state-updaters.js +2472 -0
- package/dist/vis-state.d.ts +3 -0
- package/dist/vis-state.js +66 -0
- package/package.json +83 -0
|
@@ -0,0 +1,2472 @@
|
|
|
1
|
+
// Copyright (c) 2022 Uber Technologies, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
// in the Software without restriction, including without limitation the rights
|
|
6
|
+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
// copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
19
|
+
// THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
"use strict";
|
|
22
|
+
|
|
23
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
24
|
+
|
|
25
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
26
|
+
|
|
27
|
+
Object.defineProperty(exports, "__esModule", {
|
|
28
|
+
value: true
|
|
29
|
+
});
|
|
30
|
+
exports.updateStateWithLayerAndData = updateStateWithLayerAndData;
|
|
31
|
+
exports.updateStateOnLayerVisibilityChange = updateStateOnLayerVisibilityChange;
|
|
32
|
+
exports.layerConfigChangeUpdater = layerConfigChangeUpdater;
|
|
33
|
+
exports.layerTextLabelChangeUpdater = layerTextLabelChangeUpdater;
|
|
34
|
+
exports.layerDataIdChangeUpdater = layerDataIdChangeUpdater;
|
|
35
|
+
exports.layerTypeChangeUpdater = layerTypeChangeUpdater;
|
|
36
|
+
exports.layerVisualChannelChangeUpdater = layerVisualChannelChangeUpdater;
|
|
37
|
+
exports.layerVisConfigChangeUpdater = layerVisConfigChangeUpdater;
|
|
38
|
+
exports.setFilterAnimationTimeUpdater = setFilterAnimationTimeUpdater;
|
|
39
|
+
exports.setFilterAnimationWindowUpdater = setFilterAnimationWindowUpdater;
|
|
40
|
+
exports.setFilterUpdater = setFilterUpdater;
|
|
41
|
+
exports.interactionConfigChangeUpdater = interactionConfigChangeUpdater;
|
|
42
|
+
exports.renameDatasetUpdater = renameDatasetUpdater;
|
|
43
|
+
exports.closeSpecificMapAtIndex = closeSpecificMapAtIndex;
|
|
44
|
+
exports.loadFileStepSuccessUpdater = loadFileStepSuccessUpdater;
|
|
45
|
+
exports.loadNextFileUpdater = loadNextFileUpdater;
|
|
46
|
+
exports.makeLoadFileTask = makeLoadFileTask;
|
|
47
|
+
exports.processFileContentUpdater = processFileContentUpdater;
|
|
48
|
+
exports.parseProgress = parseProgress;
|
|
49
|
+
exports.addDefaultLayers = addDefaultLayers;
|
|
50
|
+
exports.addDefaultTooltips = addDefaultTooltips;
|
|
51
|
+
exports.initialFileLoadingProgress = initialFileLoadingProgress;
|
|
52
|
+
exports.updateFileLoadingProgressUpdater = updateFileLoadingProgressUpdater;
|
|
53
|
+
exports.updateAllLayerDomainData = updateAllLayerDomainData;
|
|
54
|
+
exports.updateAnimationDomain = updateAnimationDomain;
|
|
55
|
+
exports.setFeaturesUpdater = setFeaturesUpdater;
|
|
56
|
+
exports.deleteFeatureUpdater = deleteFeatureUpdater;
|
|
57
|
+
exports.setPolygonFilterLayerUpdater = setPolygonFilterLayerUpdater;
|
|
58
|
+
exports.sortTableColumnUpdater = sortTableColumnUpdater;
|
|
59
|
+
exports.pinTableColumnUpdater = pinTableColumnUpdater;
|
|
60
|
+
exports.copyTableColumnUpdater = copyTableColumnUpdater;
|
|
61
|
+
exports.toggleEditorVisibilityUpdater = toggleEditorVisibilityUpdater;
|
|
62
|
+
exports.setFilterAnimationTimeConfigUpdater = setFilterAnimationTimeConfigUpdater;
|
|
63
|
+
exports.setLayerAnimationTimeConfigUpdater = setLayerAnimationTimeConfigUpdater;
|
|
64
|
+
exports.setSelectedFeatureUpdater = exports.setEditorModeUpdater = exports.setMapInfoUpdater = exports.applyCPUFilterUpdater = exports.loadFilesErrUpdater = exports.nextFileBatchUpdater = exports.loadFilesUpdater = exports.updateVisDataUpdater = exports.toggleLayerForMapUpdater = exports.toggleSplitMapUpdater = exports.mouseMoveUpdater = exports.mapClickUpdater = exports.layerClickUpdater = exports.layerHoverUpdater = exports.receiveMapConfigUpdater = exports.resetMapConfigUpdater = exports.updateTableColorUpdater = exports.showDatasetTableUpdater = exports.updateLayerBlendingUpdater = exports.removeDatasetUpdater = exports.reorderLayerUpdater = exports.duplicateLayerUpdater = exports.removeLayerUpdater = exports.addLayerUpdater = exports.removeFilterUpdater = exports.toggleFilterFeatureUpdater = exports.enlargeFilterUpdater = exports.updateLayerAnimationSpeedUpdater = exports.setLayerAnimationTimeUpdater = exports.updateFilterAnimationSpeedUpdater = exports.toggleLayerAnimationControlUpdater = exports.toggleLayerAnimationUpdater = exports.toggleFilterAnimationUpdater = exports.layerColorUIChangeUpdater = exports.addFilterUpdater = exports.setFilterPlotUpdater = exports.INITIAL_VIS_STATE = exports.DEFAULT_EDITOR = exports.DEFAULT_ANIMATION_CONFIG = exports.defaultInteractionConfig = void 0;
|
|
65
|
+
|
|
66
|
+
var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
|
|
67
|
+
|
|
68
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
69
|
+
|
|
70
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
71
|
+
|
|
72
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
73
|
+
|
|
74
|
+
var _window = require("global/window");
|
|
75
|
+
|
|
76
|
+
var _tasks = require("react-palm/tasks");
|
|
77
|
+
|
|
78
|
+
var _lodash = _interopRequireDefault(require("lodash.clonedeep"));
|
|
79
|
+
|
|
80
|
+
var _lodash2 = _interopRequireDefault(require("lodash.uniq"));
|
|
81
|
+
|
|
82
|
+
var _lodash3 = _interopRequireDefault(require("lodash.get"));
|
|
83
|
+
|
|
84
|
+
var _lodash4 = _interopRequireDefault(require("lodash.xor"));
|
|
85
|
+
|
|
86
|
+
var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
|
|
87
|
+
|
|
88
|
+
var _tasks2 = require("@kepler.gl/tasks");
|
|
89
|
+
|
|
90
|
+
var _actions = require("@kepler.gl/actions");
|
|
91
|
+
|
|
92
|
+
var _utils = require("@kepler.gl/utils");
|
|
93
|
+
|
|
94
|
+
var _visStateMerger = require("./vis-state-merger");
|
|
95
|
+
|
|
96
|
+
var _layers = require("@kepler.gl/layers");
|
|
97
|
+
|
|
98
|
+
var _constants = require("@kepler.gl/constants");
|
|
99
|
+
|
|
100
|
+
var _composerHelpers = require("./composer-helpers");
|
|
101
|
+
|
|
102
|
+
var _schemas = _interopRequireDefault(require("@kepler.gl/schemas"));
|
|
103
|
+
|
|
104
|
+
var _layerUtils = require("./layer-utils");
|
|
105
|
+
|
|
106
|
+
var _table = require("@kepler.gl/table");
|
|
107
|
+
|
|
108
|
+
var _interactionUtils = require("./interaction-utils");
|
|
109
|
+
|
|
110
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
111
|
+
|
|
112
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
113
|
+
|
|
114
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
115
|
+
|
|
116
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
117
|
+
|
|
118
|
+
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
119
|
+
|
|
120
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
121
|
+
|
|
122
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
123
|
+
|
|
124
|
+
// react-palm
|
|
125
|
+
// disable capture exception for react-palm call to withTask
|
|
126
|
+
(0, _tasks.disableStackCapturing)();
|
|
127
|
+
/**
|
|
128
|
+
* Updaters for `visState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
|
|
129
|
+
* Read more about [Using updaters](../advanced-usage/using-updaters.md)
|
|
130
|
+
*
|
|
131
|
+
* @public
|
|
132
|
+
* @example
|
|
133
|
+
*
|
|
134
|
+
* import keplerGlReducer, {visStateUpdaters} from 'kepler.gl/reducers';
|
|
135
|
+
* // Root Reducer
|
|
136
|
+
* const reducers = combineReducers({
|
|
137
|
+
* keplerGl: keplerGlReducer,
|
|
138
|
+
* app: appReducer
|
|
139
|
+
* });
|
|
140
|
+
*
|
|
141
|
+
* const composedReducer = (state, action) => {
|
|
142
|
+
* switch (action.type) {
|
|
143
|
+
* case 'CLICK_BUTTON':
|
|
144
|
+
* return {
|
|
145
|
+
* ...state,
|
|
146
|
+
* keplerGl: {
|
|
147
|
+
* ...state.keplerGl,
|
|
148
|
+
* foo: {
|
|
149
|
+
* ...state.keplerGl.foo,
|
|
150
|
+
* visState: visStateUpdaters.enlargeFilterUpdater(
|
|
151
|
+
* state.keplerGl.foo.visState,
|
|
152
|
+
* {idx: 0}
|
|
153
|
+
* )
|
|
154
|
+
* }
|
|
155
|
+
* }
|
|
156
|
+
* };
|
|
157
|
+
* }
|
|
158
|
+
* return reducers(state, action);
|
|
159
|
+
* };
|
|
160
|
+
*
|
|
161
|
+
* export default composedReducer;
|
|
162
|
+
*/
|
|
163
|
+
|
|
164
|
+
/* eslint-disable no-unused-vars */
|
|
165
|
+
// @ts-ignore
|
|
166
|
+
|
|
167
|
+
var visStateUpdaters = null;
|
|
168
|
+
/* eslint-enable no-unused-vars */
|
|
169
|
+
|
|
170
|
+
var defaultInteractionConfig = {
|
|
171
|
+
tooltip: {
|
|
172
|
+
id: 'tooltip',
|
|
173
|
+
label: 'interactions.tooltip',
|
|
174
|
+
enabled: true,
|
|
175
|
+
config: {
|
|
176
|
+
fieldsToShow: {},
|
|
177
|
+
compareMode: false,
|
|
178
|
+
compareType: _constants.COMPARE_TYPES.ABSOLUTE
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
geocoder: {
|
|
182
|
+
id: 'geocoder',
|
|
183
|
+
label: 'interactions.geocoder',
|
|
184
|
+
enabled: false,
|
|
185
|
+
position: null
|
|
186
|
+
},
|
|
187
|
+
brush: {
|
|
188
|
+
id: 'brush',
|
|
189
|
+
label: 'interactions.brush',
|
|
190
|
+
enabled: false,
|
|
191
|
+
config: {
|
|
192
|
+
// size is in km
|
|
193
|
+
size: 0.5
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
coordinate: {
|
|
197
|
+
id: 'coordinate',
|
|
198
|
+
label: 'interactions.coordinate',
|
|
199
|
+
enabled: false,
|
|
200
|
+
position: null
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
exports.defaultInteractionConfig = defaultInteractionConfig;
|
|
204
|
+
var DEFAULT_ANIMATION_CONFIG = {
|
|
205
|
+
domain: null,
|
|
206
|
+
currentTime: null,
|
|
207
|
+
speed: 1,
|
|
208
|
+
isAnimating: false,
|
|
209
|
+
timeFormat: null,
|
|
210
|
+
timezone: null,
|
|
211
|
+
defaultTimeFormat: null
|
|
212
|
+
};
|
|
213
|
+
exports.DEFAULT_ANIMATION_CONFIG = DEFAULT_ANIMATION_CONFIG;
|
|
214
|
+
var DEFAULT_EDITOR = {
|
|
215
|
+
mode: _constants.EDITOR_MODES.DRAW_POLYGON,
|
|
216
|
+
features: [],
|
|
217
|
+
selectedFeature: null,
|
|
218
|
+
visible: true
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* Default initial `visState`
|
|
222
|
+
* @memberof visStateUpdaters
|
|
223
|
+
* @constant
|
|
224
|
+
* @public
|
|
225
|
+
*/
|
|
226
|
+
|
|
227
|
+
exports.DEFAULT_EDITOR = DEFAULT_EDITOR;
|
|
228
|
+
var INITIAL_VIS_STATE = {
|
|
229
|
+
// map info
|
|
230
|
+
mapInfo: {
|
|
231
|
+
title: '',
|
|
232
|
+
description: ''
|
|
233
|
+
},
|
|
234
|
+
// layers
|
|
235
|
+
layers: [],
|
|
236
|
+
layerData: [],
|
|
237
|
+
layerToBeMerged: [],
|
|
238
|
+
layerOrder: [],
|
|
239
|
+
// filters
|
|
240
|
+
filters: [],
|
|
241
|
+
filterToBeMerged: [],
|
|
242
|
+
// a collection of multiple dataset
|
|
243
|
+
datasets: {},
|
|
244
|
+
editingDataset: undefined,
|
|
245
|
+
interactionConfig: defaultInteractionConfig,
|
|
246
|
+
interactionToBeMerged: undefined,
|
|
247
|
+
layerBlending: 'normal',
|
|
248
|
+
hoverInfo: undefined,
|
|
249
|
+
clicked: undefined,
|
|
250
|
+
mousePos: {},
|
|
251
|
+
maxDefaultTooltips: _constants.MAX_DEFAULT_TOOLTIPS,
|
|
252
|
+
// this is used when user split maps
|
|
253
|
+
splitMaps: [// this will contain a list of objects to
|
|
254
|
+
// describe the state of layer availability and visibility for each map
|
|
255
|
+
// [
|
|
256
|
+
// {
|
|
257
|
+
// layers: {layer_id: true | false}
|
|
258
|
+
// }
|
|
259
|
+
// ]
|
|
260
|
+
],
|
|
261
|
+
splitMapsToBeMerged: [],
|
|
262
|
+
// defaults layer classes
|
|
263
|
+
layerClasses: _layers.LayerClasses,
|
|
264
|
+
// default animation
|
|
265
|
+
// time in unix timestamp (milliseconds) (the number of seconds since the Unix Epoch)
|
|
266
|
+
animationConfig: DEFAULT_ANIMATION_CONFIG,
|
|
267
|
+
editor: DEFAULT_EDITOR,
|
|
268
|
+
fileLoading: false,
|
|
269
|
+
fileLoadingProgress: {},
|
|
270
|
+
loaders: [],
|
|
271
|
+
loadOptions: {},
|
|
272
|
+
// visStateMergers
|
|
273
|
+
mergers: _visStateMerger.VIS_STATE_MERGERS,
|
|
274
|
+
// kepler schemas
|
|
275
|
+
schema: _schemas["default"]
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* Update state with updated layer and layerData
|
|
279
|
+
*
|
|
280
|
+
*/
|
|
281
|
+
|
|
282
|
+
exports.INITIAL_VIS_STATE = INITIAL_VIS_STATE;
|
|
283
|
+
|
|
284
|
+
function updateStateWithLayerAndData(state, _ref) {
|
|
285
|
+
var layerData = _ref.layerData,
|
|
286
|
+
layer = _ref.layer,
|
|
287
|
+
idx = _ref.idx;
|
|
288
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
289
|
+
layers: state.layers.map(function (lyr, i) {
|
|
290
|
+
return i === idx ? layer : lyr;
|
|
291
|
+
}),
|
|
292
|
+
layerData: layerData ? state.layerData.map(function (d, i) {
|
|
293
|
+
return i === idx ? layerData : d;
|
|
294
|
+
}) : state.layerData
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function updateStateOnLayerVisibilityChange(state, layer) {
|
|
299
|
+
var newState = state;
|
|
300
|
+
|
|
301
|
+
if (state.splitMaps.length) {
|
|
302
|
+
newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
303
|
+
splitMaps: layer.config.isVisible ? (0, _utils.addNewLayersToSplitMap)(state.splitMaps, layer) : (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layer)
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (layer.config.animation.enabled) {
|
|
308
|
+
newState = updateAnimationDomain(state);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return newState;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Update layer base config: dataId, label, column, isVisible
|
|
315
|
+
* @memberof visStateUpdaters
|
|
316
|
+
* @returns nextState
|
|
317
|
+
*/
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
function layerConfigChangeUpdater(state, action) {
|
|
321
|
+
var oldLayer = action.oldLayer;
|
|
322
|
+
var idx = state.layers.findIndex(function (l) {
|
|
323
|
+
return l.id === oldLayer.id;
|
|
324
|
+
});
|
|
325
|
+
var props = Object.keys(action.newConfig);
|
|
326
|
+
|
|
327
|
+
if (typeof action.newConfig.dataId === 'string') {
|
|
328
|
+
var _action$newConfig = action.newConfig,
|
|
329
|
+
dataId = _action$newConfig.dataId,
|
|
330
|
+
restConfig = (0, _objectWithoutProperties2["default"])(_action$newConfig, ["dataId"]);
|
|
331
|
+
var stateWithDataId = layerDataIdChangeUpdater(state, {
|
|
332
|
+
oldLayer: oldLayer,
|
|
333
|
+
newConfig: {
|
|
334
|
+
dataId: dataId
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
var nextLayer = stateWithDataId.layers.find(function (l) {
|
|
338
|
+
return l.id === oldLayer.id;
|
|
339
|
+
});
|
|
340
|
+
return nextLayer && Object.keys(restConfig).length ? layerConfigChangeUpdater(stateWithDataId, {
|
|
341
|
+
oldLayer: nextLayer,
|
|
342
|
+
newConfig: restConfig
|
|
343
|
+
}) : stateWithDataId;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
var newLayer = oldLayer.updateLayerConfig(action.newConfig);
|
|
347
|
+
var layerData; // let newLayer;
|
|
348
|
+
|
|
349
|
+
if (newLayer.shouldCalculateLayerData(props)) {
|
|
350
|
+
var oldLayerData = state.layerData[idx];
|
|
351
|
+
var updateLayerDataResult = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData);
|
|
352
|
+
layerData = updateLayerDataResult.layerData;
|
|
353
|
+
newLayer = updateLayerDataResult.layer;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
var newState = state;
|
|
357
|
+
|
|
358
|
+
if ('isVisible' in action.newConfig) {
|
|
359
|
+
newState = updateStateOnLayerVisibilityChange(state, newLayer);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
return updateStateWithLayerAndData(newState, {
|
|
363
|
+
layer: newLayer,
|
|
364
|
+
layerData: layerData,
|
|
365
|
+
idx: idx
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
function addOrRemoveTextLabels(newFields, textLabel) {
|
|
370
|
+
var newTextLabel = textLabel.slice();
|
|
371
|
+
var currentFields = textLabel.map(function (tl) {
|
|
372
|
+
return tl.field && tl.field.name;
|
|
373
|
+
}).filter(function (d) {
|
|
374
|
+
return d;
|
|
375
|
+
});
|
|
376
|
+
var addFields = newFields.filter(function (f) {
|
|
377
|
+
return !currentFields.includes(f.name);
|
|
378
|
+
});
|
|
379
|
+
var deleteFields = currentFields.filter(function (f) {
|
|
380
|
+
return !newFields.find(function (fd) {
|
|
381
|
+
return fd.name === f;
|
|
382
|
+
});
|
|
383
|
+
}); // delete
|
|
384
|
+
|
|
385
|
+
newTextLabel = newTextLabel.filter(function (tl) {
|
|
386
|
+
return tl.field && !deleteFields.includes(tl.field.name);
|
|
387
|
+
});
|
|
388
|
+
newTextLabel = !newTextLabel.length ? [_constants.DEFAULT_TEXT_LABEL] : newTextLabel; // add
|
|
389
|
+
|
|
390
|
+
newTextLabel = [].concat((0, _toConsumableArray2["default"])(newTextLabel.filter(function (tl) {
|
|
391
|
+
return tl.field;
|
|
392
|
+
})), (0, _toConsumableArray2["default"])(addFields.map(function (af) {
|
|
393
|
+
return _objectSpread(_objectSpread({}, _constants.DEFAULT_TEXT_LABEL), {}, {
|
|
394
|
+
field: af
|
|
395
|
+
});
|
|
396
|
+
})));
|
|
397
|
+
return newTextLabel;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
function updateTextLabelPropAndValue(idx, prop, value, textLabel) {
|
|
401
|
+
if (!textLabel[idx].hasOwnProperty(prop)) {
|
|
402
|
+
return textLabel;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
var newTextLabel = textLabel.slice();
|
|
406
|
+
|
|
407
|
+
if (prop && (value || textLabel.length === 1)) {
|
|
408
|
+
newTextLabel = textLabel.map(function (tl, i) {
|
|
409
|
+
return i === idx ? _objectSpread(_objectSpread({}, tl), {}, (0, _defineProperty2["default"])({}, prop, value)) : tl;
|
|
410
|
+
});
|
|
411
|
+
} else if (prop === 'field' && value === null && textLabel.length > 1) {
|
|
412
|
+
// remove label when field value is set to null
|
|
413
|
+
newTextLabel.splice(idx, 1);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
return newTextLabel;
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Update layer base config: dataId, label, column, isVisible
|
|
420
|
+
* @memberof visStateUpdaters
|
|
421
|
+
* @returns nextState
|
|
422
|
+
*/
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
function layerTextLabelChangeUpdater(state, action) {
|
|
426
|
+
var oldLayer = action.oldLayer,
|
|
427
|
+
idx = action.idx,
|
|
428
|
+
prop = action.prop,
|
|
429
|
+
value = action.value;
|
|
430
|
+
var textLabel = oldLayer.config.textLabel;
|
|
431
|
+
var newTextLabel = textLabel.slice();
|
|
432
|
+
|
|
433
|
+
if (!textLabel[idx] && idx === textLabel.length) {
|
|
434
|
+
// if idx is set to length, add empty text label
|
|
435
|
+
newTextLabel = [].concat((0, _toConsumableArray2["default"])(textLabel), [_constants.DEFAULT_TEXT_LABEL]);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
if (idx === 'all' && prop === 'fields') {
|
|
439
|
+
newTextLabel = addOrRemoveTextLabels(value, textLabel);
|
|
440
|
+
} else {
|
|
441
|
+
newTextLabel = updateTextLabelPropAndValue(idx, prop, value, newTextLabel);
|
|
442
|
+
} // update text label prop and value
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
return layerConfigChangeUpdater(state, {
|
|
446
|
+
oldLayer: oldLayer,
|
|
447
|
+
newConfig: {
|
|
448
|
+
textLabel: newTextLabel
|
|
449
|
+
}
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function validateExistingLayerWithData(dataset, layerClasses, layer) {
|
|
454
|
+
var loadedLayer = (0, _visStateMerger.serializeLayer)(layer);
|
|
455
|
+
return (0, _visStateMerger.validateLayerWithData)(dataset, loadedLayer, layerClasses, {
|
|
456
|
+
allowEmptyColumn: true
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Update layer config dataId
|
|
461
|
+
* @memberof visStateUpdaters
|
|
462
|
+
* @returns nextState
|
|
463
|
+
*/
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
function layerDataIdChangeUpdater(state, action) {
|
|
467
|
+
var oldLayer = action.oldLayer,
|
|
468
|
+
newConfig = action.newConfig;
|
|
469
|
+
var dataId = newConfig.dataId;
|
|
470
|
+
|
|
471
|
+
if (!oldLayer || !state.datasets[dataId]) {
|
|
472
|
+
return state;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
var idx = state.layers.findIndex(function (l) {
|
|
476
|
+
return l.id === oldLayer.id;
|
|
477
|
+
});
|
|
478
|
+
var newLayer = oldLayer.updateLayerConfig({
|
|
479
|
+
dataId: dataId
|
|
480
|
+
}); // this may happen when a layer is new (type: null and no columns) but it's not ready to be saved
|
|
481
|
+
|
|
482
|
+
if (newLayer.isValidToSave()) {
|
|
483
|
+
var validated = validateExistingLayerWithData(state.datasets[dataId], state.layerClasses, newLayer); // if cant validate it with data create a new one
|
|
484
|
+
|
|
485
|
+
if (!validated) {
|
|
486
|
+
// @ts-expect-error TODO: checking oldLayer.type !== null
|
|
487
|
+
newLayer = new state.layerClasses[oldLayer.type]({
|
|
488
|
+
dataId: dataId,
|
|
489
|
+
id: oldLayer.id
|
|
490
|
+
});
|
|
491
|
+
} else {
|
|
492
|
+
newLayer = validated;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
newLayer = newLayer.updateLayerConfig({
|
|
497
|
+
isVisible: oldLayer.config.isVisible,
|
|
498
|
+
isConfigActive: true
|
|
499
|
+
});
|
|
500
|
+
newLayer.updateLayerDomain(state.datasets);
|
|
501
|
+
|
|
502
|
+
var _calculateLayerData = (0, _layerUtils.calculateLayerData)(newLayer, state, undefined),
|
|
503
|
+
layerData = _calculateLayerData.layerData,
|
|
504
|
+
layer = _calculateLayerData.layer;
|
|
505
|
+
|
|
506
|
+
return updateStateWithLayerAndData(state, {
|
|
507
|
+
layerData: layerData,
|
|
508
|
+
layer: layer,
|
|
509
|
+
idx: idx
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
function setInitialLayerConfig(layer, datasets, layerClasses) {
|
|
514
|
+
var newLayer = layer;
|
|
515
|
+
|
|
516
|
+
if (!Object.keys(datasets).length) {
|
|
517
|
+
// no data is loaded
|
|
518
|
+
return layer;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
if (!layer.config.dataId) {
|
|
522
|
+
// set layer dataId
|
|
523
|
+
newLayer = layer.updateLayerConfig({
|
|
524
|
+
dataId: Object.keys(datasets)[0]
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
var dataset = datasets[newLayer.config.dataId];
|
|
529
|
+
|
|
530
|
+
if (!dataset) {
|
|
531
|
+
return layer;
|
|
532
|
+
} // find defaut layer props
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
var result = typeof layerClasses[newLayer.type].findDefaultLayerProps === 'function' ? layerClasses[newLayer.type].findDefaultLayerProps(dataset, []) : {
|
|
536
|
+
props: []
|
|
537
|
+
}; // an array of possible props, use 1st one
|
|
538
|
+
|
|
539
|
+
var props = Array.isArray(result) ? result : result.props || [];
|
|
540
|
+
|
|
541
|
+
if (props.length) {
|
|
542
|
+
newLayer = new layerClasses[layer.type](_objectSpread(_objectSpread({}, props[0]), {}, {
|
|
543
|
+
label: newLayer.config.label,
|
|
544
|
+
dataId: newLayer.config.dataId,
|
|
545
|
+
isVisible: true,
|
|
546
|
+
isConfigActive: newLayer.config.isConfigActive
|
|
547
|
+
}));
|
|
548
|
+
return typeof newLayer.setInitialLayerConfig === 'function' ? newLayer.setInitialLayerConfig(dataset) : newLayer;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
return newLayer;
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Update layer type. Previews layer config will be copied if applicable.
|
|
555
|
+
* @memberof visStateUpdaters
|
|
556
|
+
* @public
|
|
557
|
+
*/
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
function layerTypeChangeUpdater(state, action) {
|
|
561
|
+
var oldLayer = action.oldLayer,
|
|
562
|
+
newType = action.newType;
|
|
563
|
+
|
|
564
|
+
if (!oldLayer) {
|
|
565
|
+
return state;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
var oldId = oldLayer.id;
|
|
569
|
+
var idx = state.layers.findIndex(function (l) {
|
|
570
|
+
return l.id === oldId;
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
if (!state.layerClasses[newType]) {
|
|
574
|
+
_window.console.error("".concat(newType, " is not a valid layer type"));
|
|
575
|
+
|
|
576
|
+
return state;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
var newLayer = new state.layerClasses[newType]({
|
|
580
|
+
// keep old layer lable and isConfigActive
|
|
581
|
+
label: oldLayer.config.label,
|
|
582
|
+
isConfigActive: oldLayer.config.isConfigActive
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
if (!oldLayer.type) {
|
|
586
|
+
// if setting layer type on an empty layer
|
|
587
|
+
newLayer = setInitialLayerConfig(newLayer, state.datasets, state.layerClasses);
|
|
588
|
+
} else {
|
|
589
|
+
// get a mint layer, with new id and type
|
|
590
|
+
// because deck.gl uses id to match between new and old layer.
|
|
591
|
+
// If type has changed but id is the same, it will break
|
|
592
|
+
newLayer.assignConfigToLayer(oldLayer.config, oldLayer.visConfigSettings);
|
|
593
|
+
newLayer.updateLayerDomain(state.datasets);
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
var clicked = state.clicked,
|
|
597
|
+
hoverInfo = state.hoverInfo;
|
|
598
|
+
|
|
599
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
600
|
+
clicked: oldLayer.isLayerHovered(clicked) ? undefined : clicked,
|
|
601
|
+
hoverInfo: oldLayer.isLayerHovered(hoverInfo) ? undefined : hoverInfo
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
var _calculateLayerData2 = (0, _layerUtils.calculateLayerData)(newLayer, newState),
|
|
605
|
+
layerData = _calculateLayerData2.layerData,
|
|
606
|
+
layer = _calculateLayerData2.layer;
|
|
607
|
+
|
|
608
|
+
newState = updateStateWithLayerAndData(newState, {
|
|
609
|
+
layerData: layerData,
|
|
610
|
+
layer: layer,
|
|
611
|
+
idx: idx
|
|
612
|
+
});
|
|
613
|
+
|
|
614
|
+
if (layer.config.animation.enabled || oldLayer.config.animation.enabled) {
|
|
615
|
+
newState = updateAnimationDomain(newState);
|
|
616
|
+
} // update splitMap layer id
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
if (state.splitMaps.length) {
|
|
620
|
+
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
621
|
+
splitMaps: newState.splitMaps.map(function (settings) {
|
|
622
|
+
var _settings$layers = settings.layers,
|
|
623
|
+
oldLayerMap = _settings$layers[oldId],
|
|
624
|
+
otherLayers = (0, _objectWithoutProperties2["default"])(_settings$layers, [oldId].map(_toPropertyKey));
|
|
625
|
+
return oldId in settings.layers ? _objectSpread(_objectSpread({}, settings), {}, {
|
|
626
|
+
layers: _objectSpread(_objectSpread({}, otherLayers), {}, (0, _defineProperty2["default"])({}, layer.id, oldLayerMap))
|
|
627
|
+
}) : settings;
|
|
628
|
+
})
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
return newState;
|
|
633
|
+
}
|
|
634
|
+
/**
|
|
635
|
+
* Update layer visual channel
|
|
636
|
+
* @memberof visStateUpdaters
|
|
637
|
+
* @returns {Object} nextState
|
|
638
|
+
* @public
|
|
639
|
+
*/
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
function layerVisualChannelChangeUpdater(state, action) {
|
|
643
|
+
var oldLayer = action.oldLayer,
|
|
644
|
+
newConfig = action.newConfig,
|
|
645
|
+
channel = action.channel;
|
|
646
|
+
|
|
647
|
+
if (!oldLayer.config.dataId) {
|
|
648
|
+
return state;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
var dataset = state.datasets[oldLayer.config.dataId];
|
|
652
|
+
var idx = state.layers.findIndex(function (l) {
|
|
653
|
+
return l.id === oldLayer.id;
|
|
654
|
+
});
|
|
655
|
+
var newLayer = oldLayer.updateLayerConfig(newConfig);
|
|
656
|
+
newLayer.updateLayerVisualChannel(dataset, channel);
|
|
657
|
+
var oldLayerData = state.layerData[idx];
|
|
658
|
+
|
|
659
|
+
var _calculateLayerData3 = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData),
|
|
660
|
+
layerData = _calculateLayerData3.layerData,
|
|
661
|
+
layer = _calculateLayerData3.layer;
|
|
662
|
+
|
|
663
|
+
return updateStateWithLayerAndData(state, {
|
|
664
|
+
layerData: layerData,
|
|
665
|
+
layer: layer,
|
|
666
|
+
idx: idx
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
/**
|
|
670
|
+
* Update layer `visConfig`
|
|
671
|
+
* @memberof visStateUpdaters
|
|
672
|
+
* @public
|
|
673
|
+
*/
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
function layerVisConfigChangeUpdater(state, action) {
|
|
677
|
+
var oldLayer = action.oldLayer;
|
|
678
|
+
var idx = state.layers.findIndex(function (l) {
|
|
679
|
+
return l.id === oldLayer.id;
|
|
680
|
+
});
|
|
681
|
+
var props = Object.keys(action.newVisConfig);
|
|
682
|
+
|
|
683
|
+
var newVisConfig = _objectSpread(_objectSpread({}, oldLayer.config.visConfig), action.newVisConfig);
|
|
684
|
+
|
|
685
|
+
var newLayer = oldLayer.updateLayerConfig({
|
|
686
|
+
visConfig: newVisConfig
|
|
687
|
+
});
|
|
688
|
+
|
|
689
|
+
if (newLayer.shouldCalculateLayerData(props)) {
|
|
690
|
+
var oldLayerData = state.layerData[idx];
|
|
691
|
+
|
|
692
|
+
var _calculateLayerData4 = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData),
|
|
693
|
+
layerData = _calculateLayerData4.layerData,
|
|
694
|
+
layer = _calculateLayerData4.layer;
|
|
695
|
+
|
|
696
|
+
return updateStateWithLayerAndData(state, {
|
|
697
|
+
layerData: layerData,
|
|
698
|
+
layer: layer,
|
|
699
|
+
idx: idx
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
return updateStateWithLayerAndData(state, {
|
|
704
|
+
layer: newLayer,
|
|
705
|
+
idx: idx
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* Update filter property
|
|
710
|
+
* @memberof visStateUpdaters
|
|
711
|
+
* @public
|
|
712
|
+
*/
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
function setFilterAnimationTimeUpdater(state, action) {
|
|
716
|
+
return setFilterUpdater(state, action);
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* Update filter animation window
|
|
720
|
+
* @memberof visStateUpdaters
|
|
721
|
+
* @public
|
|
722
|
+
*/
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
function setFilterAnimationWindowUpdater(state, _ref2) {
|
|
726
|
+
var id = _ref2.id,
|
|
727
|
+
animationWindow = _ref2.animationWindow;
|
|
728
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
729
|
+
filters: state.filters.map(function (f) {
|
|
730
|
+
return f.id === id ? _objectSpread(_objectSpread({}, f), {}, {
|
|
731
|
+
animationWindow: animationWindow
|
|
732
|
+
}) : f;
|
|
733
|
+
})
|
|
734
|
+
});
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* Update filter property
|
|
738
|
+
* @memberof visStateUpdaters
|
|
739
|
+
* @public
|
|
740
|
+
*/
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
function setFilterUpdater(state, action) {
|
|
744
|
+
var idx = action.idx,
|
|
745
|
+
prop = action.prop,
|
|
746
|
+
value = action.value,
|
|
747
|
+
_action$valueIndex = action.valueIndex,
|
|
748
|
+
valueIndex = _action$valueIndex === void 0 ? 0 : _action$valueIndex;
|
|
749
|
+
var oldFilter = state.filters[idx];
|
|
750
|
+
|
|
751
|
+
if (!oldFilter) {
|
|
752
|
+
_window.console.error("filters.".concat(idx, " is undefined"));
|
|
753
|
+
|
|
754
|
+
return state;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
var newFilter = (0, _utils.set)([prop], value, oldFilter);
|
|
758
|
+
var newState = state;
|
|
759
|
+
var _newFilter = newFilter,
|
|
760
|
+
dataId = _newFilter.dataId; // Ensuring backward compatibility
|
|
761
|
+
|
|
762
|
+
var datasetIds = (0, _utils.toArray)(dataId);
|
|
763
|
+
|
|
764
|
+
switch (prop) {
|
|
765
|
+
// TODO: Next PR for UI if we update dataId, we need to consider two cases:
|
|
766
|
+
// 1. dataId is empty: create a default filter
|
|
767
|
+
// 2. Add a new dataset id
|
|
768
|
+
case _utils.FILTER_UPDATER_PROPS.dataId:
|
|
769
|
+
// if trying to update filter dataId. create an empty new filter
|
|
770
|
+
newFilter = (0, _utils.updateFilterDataId)(dataId);
|
|
771
|
+
break;
|
|
772
|
+
|
|
773
|
+
case _utils.FILTER_UPDATER_PROPS.name:
|
|
774
|
+
// we are supporting the current functionality
|
|
775
|
+
// TODO: Next PR for UI filter name will only update filter name but it won't have side effects
|
|
776
|
+
// we are gonna use pair of datasets and fieldIdx to update the filter
|
|
777
|
+
var datasetId = newFilter.dataId[valueIndex];
|
|
778
|
+
|
|
779
|
+
var _applyFilterFieldName = (0, _utils.applyFilterFieldName)(newFilter, state.datasets[datasetId], value, valueIndex, {
|
|
780
|
+
mergeDomain: false
|
|
781
|
+
}),
|
|
782
|
+
updatedFilter = _applyFilterFieldName.filter,
|
|
783
|
+
newDataset = _applyFilterFieldName.dataset;
|
|
784
|
+
|
|
785
|
+
if (!updatedFilter) {
|
|
786
|
+
return state;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
newFilter = updatedFilter;
|
|
790
|
+
|
|
791
|
+
if (newFilter.gpu) {
|
|
792
|
+
newFilter = (0, _table.setFilterGpuMode)(newFilter, state.filters);
|
|
793
|
+
newFilter = (0, _table.assignGpuChannel)(newFilter, state.filters);
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
newState = (0, _utils.set)(['datasets', datasetId], newDataset, state); // only filter the current dataset
|
|
797
|
+
|
|
798
|
+
break;
|
|
799
|
+
|
|
800
|
+
case _utils.FILTER_UPDATER_PROPS.layerId:
|
|
801
|
+
// We need to update only datasetId/s if we have added/removed layers
|
|
802
|
+
// - check for layerId changes (XOR works because of string values)
|
|
803
|
+
// if no differences between layerIds, don't do any filtering
|
|
804
|
+
// @ts-ignore
|
|
805
|
+
var layerIdDifference = (0, _lodash4["default"])(newFilter.layerId, oldFilter.layerId);
|
|
806
|
+
var layerDataIds = (0, _lodash2["default"])(layerIdDifference.map(function (lid) {
|
|
807
|
+
return (0, _lodash3["default"])(state.layers.find(function (l) {
|
|
808
|
+
return l.id === lid;
|
|
809
|
+
}), ['config', 'dataId']);
|
|
810
|
+
}).filter(function (d) {
|
|
811
|
+
return d;
|
|
812
|
+
})); // only filter datasetsIds
|
|
813
|
+
|
|
814
|
+
datasetIds = layerDataIds; // Update newFilter dataIds
|
|
815
|
+
|
|
816
|
+
var newDataIds = (0, _lodash2["default"])(newFilter.layerId.map(function (lid) {
|
|
817
|
+
return (0, _lodash3["default"])(state.layers.find(function (l) {
|
|
818
|
+
return l.id === lid;
|
|
819
|
+
}), ['config', 'dataId']);
|
|
820
|
+
}).filter(function (d) {
|
|
821
|
+
return d;
|
|
822
|
+
}));
|
|
823
|
+
newFilter = _objectSpread(_objectSpread({}, newFilter), {}, {
|
|
824
|
+
dataId: newDataIds
|
|
825
|
+
});
|
|
826
|
+
break;
|
|
827
|
+
|
|
828
|
+
default:
|
|
829
|
+
break;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
var enlargedFilter = state.filters.find(function (f) {
|
|
833
|
+
return f.enlarged;
|
|
834
|
+
});
|
|
835
|
+
|
|
836
|
+
if (enlargedFilter && enlargedFilter.id !== newFilter.id) {
|
|
837
|
+
// there should be only one enlarged filter
|
|
838
|
+
newFilter.enlarged = false;
|
|
839
|
+
} // save new filters to newState
|
|
840
|
+
|
|
841
|
+
|
|
842
|
+
newState = (0, _utils.set)(['filters', idx], newFilter, newState); // if we are currently setting a prop that only requires to filter the current
|
|
843
|
+
// dataset we will pass only the current dataset to applyFiltersToDatasets and
|
|
844
|
+
// updateAllLayerDomainData otherwise we pass the all list of datasets as defined in dataId
|
|
845
|
+
|
|
846
|
+
var datasetIdsToFilter = _utils.LIMITED_FILTER_EFFECT_PROPS[prop] ? [datasetIds[valueIndex]] : datasetIds; // filter data
|
|
847
|
+
|
|
848
|
+
var filteredDatasets = (0, _utils.applyFiltersToDatasets)(datasetIdsToFilter, newState.datasets, newState.filters, newState.layers);
|
|
849
|
+
newState = (0, _utils.set)(['datasets'], filteredDatasets, newState); // dataId is an array
|
|
850
|
+
// pass only the dataset we need to update
|
|
851
|
+
|
|
852
|
+
newState = updateAllLayerDomainData(newState, datasetIdsToFilter, newFilter);
|
|
853
|
+
return newState;
|
|
854
|
+
}
|
|
855
|
+
/**
|
|
856
|
+
* Set the property of a filter plot
|
|
857
|
+
* @memberof visStateUpdaters
|
|
858
|
+
* @public
|
|
859
|
+
*/
|
|
860
|
+
|
|
861
|
+
|
|
862
|
+
var setFilterPlotUpdater = function setFilterPlotUpdater(state, _ref3) {
|
|
863
|
+
var idx = _ref3.idx,
|
|
864
|
+
newProp = _ref3.newProp,
|
|
865
|
+
_ref3$valueIndex = _ref3.valueIndex,
|
|
866
|
+
valueIndex = _ref3$valueIndex === void 0 ? 0 : _ref3$valueIndex;
|
|
867
|
+
|
|
868
|
+
var newFilter = _objectSpread(_objectSpread({}, state.filters[idx]), newProp);
|
|
869
|
+
|
|
870
|
+
var prop = Object.keys(newProp)[0];
|
|
871
|
+
|
|
872
|
+
if (prop === 'yAxis') {
|
|
873
|
+
var plotType = (0, _utils.getDefaultFilterPlotType)(newFilter); // TODO: plot is not supported in multi dataset filter for now
|
|
874
|
+
|
|
875
|
+
if (plotType) {
|
|
876
|
+
newFilter = _objectSpread(_objectSpread(_objectSpread({}, newFilter), (0, _utils.getFilterPlot)(_objectSpread(_objectSpread({}, newFilter), {}, {
|
|
877
|
+
plotType: plotType
|
|
878
|
+
}), state.datasets[newFilter.dataId[valueIndex]])), {}, {
|
|
879
|
+
plotType: plotType
|
|
880
|
+
});
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
885
|
+
filters: state.filters.map(function (f, i) {
|
|
886
|
+
return i === idx ? newFilter : f;
|
|
887
|
+
})
|
|
888
|
+
});
|
|
889
|
+
};
|
|
890
|
+
/**
|
|
891
|
+
* Add a new filter
|
|
892
|
+
* @memberof visStateUpdaters
|
|
893
|
+
* @public
|
|
894
|
+
*/
|
|
895
|
+
|
|
896
|
+
|
|
897
|
+
exports.setFilterPlotUpdater = setFilterPlotUpdater;
|
|
898
|
+
|
|
899
|
+
var addFilterUpdater = function addFilterUpdater(state, action) {
|
|
900
|
+
return !action.dataId ? state : _objectSpread(_objectSpread({}, state), {}, {
|
|
901
|
+
filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [(0, _utils.getDefaultFilter)(action.dataId)])
|
|
902
|
+
});
|
|
903
|
+
};
|
|
904
|
+
/**
|
|
905
|
+
* Set layer color palette ui state
|
|
906
|
+
* @memberof visStateUpdaters
|
|
907
|
+
*/
|
|
908
|
+
|
|
909
|
+
|
|
910
|
+
exports.addFilterUpdater = addFilterUpdater;
|
|
911
|
+
|
|
912
|
+
var layerColorUIChangeUpdater = function layerColorUIChangeUpdater(state, _ref4) {
|
|
913
|
+
var oldLayer = _ref4.oldLayer,
|
|
914
|
+
prop = _ref4.prop,
|
|
915
|
+
newConfig = _ref4.newConfig;
|
|
916
|
+
var oldVixConfig = oldLayer.config.visConfig[prop];
|
|
917
|
+
var newLayer = oldLayer.updateLayerColorUI(prop, newConfig);
|
|
918
|
+
var newVisConfig = newLayer.config.visConfig[prop];
|
|
919
|
+
|
|
920
|
+
if (oldVixConfig !== newVisConfig) {
|
|
921
|
+
return layerVisConfigChangeUpdater(state, {
|
|
922
|
+
oldLayer: oldLayer,
|
|
923
|
+
newVisConfig: (0, _defineProperty2["default"])({}, prop, newVisConfig)
|
|
924
|
+
});
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
928
|
+
layers: state.layers.map(function (l) {
|
|
929
|
+
return l.id === oldLayer.id ? newLayer : l;
|
|
930
|
+
})
|
|
931
|
+
});
|
|
932
|
+
};
|
|
933
|
+
/**
|
|
934
|
+
* Start and end filter animation
|
|
935
|
+
* @memberof visStateUpdaters
|
|
936
|
+
* @public
|
|
937
|
+
*/
|
|
938
|
+
|
|
939
|
+
|
|
940
|
+
exports.layerColorUIChangeUpdater = layerColorUIChangeUpdater;
|
|
941
|
+
|
|
942
|
+
var toggleFilterAnimationUpdater = function toggleFilterAnimationUpdater(state, action) {
|
|
943
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
944
|
+
filters: state.filters.map(function (f, i) {
|
|
945
|
+
return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
946
|
+
isAnimating: !f.isAnimating
|
|
947
|
+
}) : f;
|
|
948
|
+
})
|
|
949
|
+
});
|
|
950
|
+
};
|
|
951
|
+
/**
|
|
952
|
+
* @memberof visStateUpdaters
|
|
953
|
+
* @public
|
|
954
|
+
*/
|
|
955
|
+
|
|
956
|
+
|
|
957
|
+
exports.toggleFilterAnimationUpdater = toggleFilterAnimationUpdater;
|
|
958
|
+
|
|
959
|
+
var toggleLayerAnimationUpdater = function toggleLayerAnimationUpdater(state, action) {
|
|
960
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
961
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
962
|
+
isAnimating: !state.animationConfig.isAnimating
|
|
963
|
+
})
|
|
964
|
+
});
|
|
965
|
+
};
|
|
966
|
+
/**
|
|
967
|
+
* Hide and show layer animation control
|
|
968
|
+
* @memberof visStateUpdaters
|
|
969
|
+
* @public
|
|
970
|
+
*/
|
|
971
|
+
|
|
972
|
+
|
|
973
|
+
exports.toggleLayerAnimationUpdater = toggleLayerAnimationUpdater;
|
|
974
|
+
|
|
975
|
+
var toggleLayerAnimationControlUpdater = function toggleLayerAnimationControlUpdater(state, action) {
|
|
976
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
977
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
978
|
+
hideControl: !state.animationConfig.hideControl
|
|
979
|
+
})
|
|
980
|
+
});
|
|
981
|
+
};
|
|
982
|
+
/**
|
|
983
|
+
* Change filter animation speed
|
|
984
|
+
* @memberof visStateUpdaters
|
|
985
|
+
* @public
|
|
986
|
+
*/
|
|
987
|
+
|
|
988
|
+
|
|
989
|
+
exports.toggleLayerAnimationControlUpdater = toggleLayerAnimationControlUpdater;
|
|
990
|
+
|
|
991
|
+
var updateFilterAnimationSpeedUpdater = function updateFilterAnimationSpeedUpdater(state, action) {
|
|
992
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
993
|
+
filters: state.filters.map(function (f, i) {
|
|
994
|
+
return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
995
|
+
speed: action.speed
|
|
996
|
+
}) : f;
|
|
997
|
+
})
|
|
998
|
+
});
|
|
999
|
+
};
|
|
1000
|
+
/**
|
|
1001
|
+
* Reset animation config current time to a specified value
|
|
1002
|
+
* @memberof visStateUpdaters
|
|
1003
|
+
* @public
|
|
1004
|
+
*
|
|
1005
|
+
*/
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
exports.updateFilterAnimationSpeedUpdater = updateFilterAnimationSpeedUpdater;
|
|
1009
|
+
|
|
1010
|
+
var setLayerAnimationTimeUpdater = function setLayerAnimationTimeUpdater(state, _ref5) {
|
|
1011
|
+
var value = _ref5.value;
|
|
1012
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1013
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1014
|
+
currentTime: value
|
|
1015
|
+
})
|
|
1016
|
+
});
|
|
1017
|
+
};
|
|
1018
|
+
/**
|
|
1019
|
+
* Update animation speed with the vertical speed slider
|
|
1020
|
+
* @memberof visStateUpdaters
|
|
1021
|
+
* @public
|
|
1022
|
+
*
|
|
1023
|
+
*/
|
|
1024
|
+
|
|
1025
|
+
|
|
1026
|
+
exports.setLayerAnimationTimeUpdater = setLayerAnimationTimeUpdater;
|
|
1027
|
+
|
|
1028
|
+
var updateLayerAnimationSpeedUpdater = function updateLayerAnimationSpeedUpdater(state, _ref6) {
|
|
1029
|
+
var speed = _ref6.speed;
|
|
1030
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1031
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1032
|
+
speed: speed
|
|
1033
|
+
})
|
|
1034
|
+
});
|
|
1035
|
+
};
|
|
1036
|
+
/**
|
|
1037
|
+
* Show larger time filter at bottom for time playback (apply to time filter only)
|
|
1038
|
+
* @memberof visStateUpdaters
|
|
1039
|
+
* @public
|
|
1040
|
+
*/
|
|
1041
|
+
|
|
1042
|
+
|
|
1043
|
+
exports.updateLayerAnimationSpeedUpdater = updateLayerAnimationSpeedUpdater;
|
|
1044
|
+
|
|
1045
|
+
var enlargeFilterUpdater = function enlargeFilterUpdater(state, action) {
|
|
1046
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1047
|
+
filters: state.filters.map(function (f, i) {
|
|
1048
|
+
return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1049
|
+
enlarged: !f.enlarged
|
|
1050
|
+
}) : f;
|
|
1051
|
+
})
|
|
1052
|
+
});
|
|
1053
|
+
};
|
|
1054
|
+
/**
|
|
1055
|
+
* Toggles filter feature visibility
|
|
1056
|
+
* @memberof visStateUpdaters
|
|
1057
|
+
*/
|
|
1058
|
+
|
|
1059
|
+
|
|
1060
|
+
exports.enlargeFilterUpdater = enlargeFilterUpdater;
|
|
1061
|
+
|
|
1062
|
+
var toggleFilterFeatureUpdater = function toggleFilterFeatureUpdater(state, action) {
|
|
1063
|
+
var filter = state.filters[action.idx];
|
|
1064
|
+
var isVisible = (0, _lodash3["default"])(filter, ['value', 'properties', 'isVisible']);
|
|
1065
|
+
|
|
1066
|
+
var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
|
|
1067
|
+
value: (0, _utils.featureToFilterValue)(filter.value, filter.id, {
|
|
1068
|
+
isVisible: !isVisible
|
|
1069
|
+
})
|
|
1070
|
+
});
|
|
1071
|
+
|
|
1072
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1073
|
+
filters: Object.assign((0, _toConsumableArray2["default"])(state.filters), (0, _defineProperty2["default"])({}, action.idx, newFilter))
|
|
1074
|
+
});
|
|
1075
|
+
};
|
|
1076
|
+
/**
|
|
1077
|
+
* Remove a filter
|
|
1078
|
+
* @memberof visStateUpdaters
|
|
1079
|
+
* @public
|
|
1080
|
+
*/
|
|
1081
|
+
|
|
1082
|
+
|
|
1083
|
+
exports.toggleFilterFeatureUpdater = toggleFilterFeatureUpdater;
|
|
1084
|
+
|
|
1085
|
+
var removeFilterUpdater = function removeFilterUpdater(state, action) {
|
|
1086
|
+
var idx = action.idx;
|
|
1087
|
+
var _state$filters$idx = state.filters[idx],
|
|
1088
|
+
dataId = _state$filters$idx.dataId,
|
|
1089
|
+
id = _state$filters$idx.id;
|
|
1090
|
+
var newFilters = [].concat((0, _toConsumableArray2["default"])(state.filters.slice(0, idx)), (0, _toConsumableArray2["default"])(state.filters.slice(idx + 1, state.filters.length)));
|
|
1091
|
+
var filteredDatasets = (0, _utils.applyFiltersToDatasets)(dataId, state.datasets, newFilters, state.layers);
|
|
1092
|
+
var newEditor = (0, _utils.getFilterIdInFeature)(state.editor.selectedFeature) === id ? _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
1093
|
+
selectedFeature: null
|
|
1094
|
+
}) : state.editor;
|
|
1095
|
+
var newState = (0, _utils.set)(['filters'], newFilters, state);
|
|
1096
|
+
newState = (0, _utils.set)(['datasets'], filteredDatasets, newState);
|
|
1097
|
+
newState = (0, _utils.set)(['editor'], newEditor, newState);
|
|
1098
|
+
return updateAllLayerDomainData(newState, dataId, undefined);
|
|
1099
|
+
};
|
|
1100
|
+
/**
|
|
1101
|
+
* Add a new layer
|
|
1102
|
+
* @memberof visStateUpdaters
|
|
1103
|
+
* @public
|
|
1104
|
+
*/
|
|
1105
|
+
|
|
1106
|
+
|
|
1107
|
+
exports.removeFilterUpdater = removeFilterUpdater;
|
|
1108
|
+
|
|
1109
|
+
var addLayerUpdater = function addLayerUpdater(state, action) {
|
|
1110
|
+
var newLayer;
|
|
1111
|
+
var newLayerData;
|
|
1112
|
+
|
|
1113
|
+
if (action.config) {
|
|
1114
|
+
newLayer = (0, _visStateMerger.createLayerFromConfig)(state, action.config);
|
|
1115
|
+
|
|
1116
|
+
if (!newLayer) {
|
|
1117
|
+
_window.console.warn('Failed to create layer from config, it usually means the config is not be in correct format', action.config);
|
|
1118
|
+
|
|
1119
|
+
return state;
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
var result = (0, _layerUtils.calculateLayerData)(newLayer, state);
|
|
1123
|
+
newLayer = result.layer;
|
|
1124
|
+
newLayerData = result.layerData;
|
|
1125
|
+
} else {
|
|
1126
|
+
var _action$datasetId;
|
|
1127
|
+
|
|
1128
|
+
// create an empty layer with a specific dataset or a default one
|
|
1129
|
+
var defaultDataset = (_action$datasetId = action.datasetId) !== null && _action$datasetId !== void 0 ? _action$datasetId : Object.keys(state.datasets)[0];
|
|
1130
|
+
newLayer = new _layers.Layer({
|
|
1131
|
+
isVisible: true,
|
|
1132
|
+
isConfigActive: true,
|
|
1133
|
+
dataId: defaultDataset
|
|
1134
|
+
});
|
|
1135
|
+
newLayerData = {};
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1139
|
+
layers: [].concat((0, _toConsumableArray2["default"])(state.layers), [newLayer]),
|
|
1140
|
+
layerData: [].concat((0, _toConsumableArray2["default"])(state.layerData), [newLayerData]),
|
|
1141
|
+
layerOrder: [].concat((0, _toConsumableArray2["default"])(state.layerOrder), [state.layerOrder.length]),
|
|
1142
|
+
splitMaps: (0, _utils.addNewLayersToSplitMap)(state.splitMaps, newLayer)
|
|
1143
|
+
});
|
|
1144
|
+
};
|
|
1145
|
+
/**
|
|
1146
|
+
* remove layer
|
|
1147
|
+
* @memberof visStateUpdaters
|
|
1148
|
+
* @public
|
|
1149
|
+
*/
|
|
1150
|
+
|
|
1151
|
+
|
|
1152
|
+
exports.addLayerUpdater = addLayerUpdater;
|
|
1153
|
+
|
|
1154
|
+
var removeLayerUpdater = function removeLayerUpdater(state, _ref7) {
|
|
1155
|
+
var idx = _ref7.idx;
|
|
1156
|
+
var layers = state.layers,
|
|
1157
|
+
layerData = state.layerData,
|
|
1158
|
+
clicked = state.clicked,
|
|
1159
|
+
hoverInfo = state.hoverInfo;
|
|
1160
|
+
var layerToRemove = state.layers[idx];
|
|
1161
|
+
var newMaps = (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layerToRemove);
|
|
1162
|
+
|
|
1163
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1164
|
+
layers: [].concat((0, _toConsumableArray2["default"])(layers.slice(0, idx)), (0, _toConsumableArray2["default"])(layers.slice(idx + 1, layers.length))),
|
|
1165
|
+
layerData: [].concat((0, _toConsumableArray2["default"])(layerData.slice(0, idx)), (0, _toConsumableArray2["default"])(layerData.slice(idx + 1, layerData.length))),
|
|
1166
|
+
layerOrder: state.layerOrder.filter(function (i) {
|
|
1167
|
+
return i !== idx;
|
|
1168
|
+
}).map(function (pid) {
|
|
1169
|
+
return pid > idx ? pid - 1 : pid;
|
|
1170
|
+
}),
|
|
1171
|
+
clicked: layerToRemove.isLayerHovered(clicked) ? undefined : clicked,
|
|
1172
|
+
hoverInfo: layerToRemove.isLayerHovered(hoverInfo) ? undefined : hoverInfo,
|
|
1173
|
+
splitMaps: newMaps // TODO: update filters, create helper to remove layer form filter (remove layerid and dataid) if mapped
|
|
1174
|
+
|
|
1175
|
+
});
|
|
1176
|
+
|
|
1177
|
+
return updateAnimationDomain(newState);
|
|
1178
|
+
};
|
|
1179
|
+
/**
|
|
1180
|
+
* duplicate layer
|
|
1181
|
+
* @memberof visStateUpdaters
|
|
1182
|
+
* @public
|
|
1183
|
+
*/
|
|
1184
|
+
|
|
1185
|
+
|
|
1186
|
+
exports.removeLayerUpdater = removeLayerUpdater;
|
|
1187
|
+
|
|
1188
|
+
var duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref8) {
|
|
1189
|
+
var idx = _ref8.idx;
|
|
1190
|
+
var layers = state.layers;
|
|
1191
|
+
var original = state.layers[idx];
|
|
1192
|
+
var originalLayerOrderIdx = state.layerOrder.findIndex(function (i) {
|
|
1193
|
+
return i === idx;
|
|
1194
|
+
});
|
|
1195
|
+
|
|
1196
|
+
if (!original) {
|
|
1197
|
+
_window.console.warn("layer.".concat(idx, " is undefined"));
|
|
1198
|
+
|
|
1199
|
+
return state;
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
var newLabel = "Copy of ".concat(original.config.label);
|
|
1203
|
+
var postfix = 0; // eslint-disable-next-line no-loop-func
|
|
1204
|
+
|
|
1205
|
+
while (layers.find(function (l) {
|
|
1206
|
+
return l.config.label === newLabel;
|
|
1207
|
+
})) {
|
|
1208
|
+
newLabel = "Copy of ".concat(original.config.label, " ").concat(++postfix);
|
|
1209
|
+
} // collect layer config from original
|
|
1210
|
+
|
|
1211
|
+
|
|
1212
|
+
var loadedLayer = (0, _visStateMerger.serializeLayer)(original); // assign new id and label to copied layer
|
|
1213
|
+
|
|
1214
|
+
if (!(loadedLayer !== null && loadedLayer !== void 0 && loadedLayer.config)) {
|
|
1215
|
+
return state;
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
loadedLayer.config.label = newLabel;
|
|
1219
|
+
loadedLayer.id = (0, _utils.generateHashId)(_layers.LAYER_ID_LENGTH); // add layer to state
|
|
1220
|
+
|
|
1221
|
+
var nextState = addLayerUpdater(state, {
|
|
1222
|
+
config: loadedLayer
|
|
1223
|
+
}); // new added layer are at the end, move it to be on top of original layer
|
|
1224
|
+
|
|
1225
|
+
var newLayerOrderIdx = nextState.layerOrder.length - 1;
|
|
1226
|
+
var newLayerOrder = (0, _utils.arrayInsert)(nextState.layerOrder.slice(0, newLayerOrderIdx), originalLayerOrderIdx, newLayerOrderIdx);
|
|
1227
|
+
nextState = _objectSpread(_objectSpread({}, nextState), {}, {
|
|
1228
|
+
layerOrder: newLayerOrder
|
|
1229
|
+
});
|
|
1230
|
+
return updateAnimationDomain(nextState);
|
|
1231
|
+
};
|
|
1232
|
+
/**
|
|
1233
|
+
* Reorder layer
|
|
1234
|
+
* @memberof visStateUpdaters
|
|
1235
|
+
* @public
|
|
1236
|
+
*/
|
|
1237
|
+
|
|
1238
|
+
|
|
1239
|
+
exports.duplicateLayerUpdater = duplicateLayerUpdater;
|
|
1240
|
+
|
|
1241
|
+
var reorderLayerUpdater = function reorderLayerUpdater(state, _ref9) {
|
|
1242
|
+
var order = _ref9.order;
|
|
1243
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1244
|
+
layerOrder: order
|
|
1245
|
+
});
|
|
1246
|
+
};
|
|
1247
|
+
/**
|
|
1248
|
+
* Remove a dataset and all layers, filters, tooltip configs that based on it
|
|
1249
|
+
* @memberof visStateUpdaters
|
|
1250
|
+
* @public
|
|
1251
|
+
*/
|
|
1252
|
+
|
|
1253
|
+
|
|
1254
|
+
exports.reorderLayerUpdater = reorderLayerUpdater;
|
|
1255
|
+
|
|
1256
|
+
var removeDatasetUpdater = function removeDatasetUpdater(state, action) {
|
|
1257
|
+
// extract dataset key
|
|
1258
|
+
var datasetKey = action.dataId;
|
|
1259
|
+
var datasets = state.datasets; // check if dataset is present
|
|
1260
|
+
|
|
1261
|
+
if (!datasets[datasetKey]) {
|
|
1262
|
+
return state;
|
|
1263
|
+
}
|
|
1264
|
+
/* eslint-disable no-unused-vars */
|
|
1265
|
+
|
|
1266
|
+
|
|
1267
|
+
var layers = state.layers,
|
|
1268
|
+
_state$datasets = state.datasets,
|
|
1269
|
+
dataset = _state$datasets[datasetKey],
|
|
1270
|
+
newDatasets = (0, _objectWithoutProperties2["default"])(_state$datasets, [datasetKey].map(_toPropertyKey));
|
|
1271
|
+
/* eslint-enable no-unused-vars */
|
|
1272
|
+
|
|
1273
|
+
var indexes = layers.reduce(function (listOfIndexes, layer, index) {
|
|
1274
|
+
if (layer.config.dataId === datasetKey) {
|
|
1275
|
+
// @ts-ignore
|
|
1276
|
+
listOfIndexes.push(index);
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
return listOfIndexes;
|
|
1280
|
+
}, []); // remove layers and datasets
|
|
1281
|
+
|
|
1282
|
+
var _indexes$reduce = indexes.reduce(function (_ref10, idx) {
|
|
1283
|
+
var currentState = _ref10.newState,
|
|
1284
|
+
indexCounter = _ref10.indexCounter;
|
|
1285
|
+
var currentIndex = idx - indexCounter;
|
|
1286
|
+
currentState = removeLayerUpdater(currentState, {
|
|
1287
|
+
idx: currentIndex
|
|
1288
|
+
});
|
|
1289
|
+
indexCounter++;
|
|
1290
|
+
return {
|
|
1291
|
+
newState: currentState,
|
|
1292
|
+
indexCounter: indexCounter
|
|
1293
|
+
};
|
|
1294
|
+
}, {
|
|
1295
|
+
newState: _objectSpread(_objectSpread({}, state), {}, {
|
|
1296
|
+
datasets: newDatasets
|
|
1297
|
+
}),
|
|
1298
|
+
indexCounter: 0
|
|
1299
|
+
}),
|
|
1300
|
+
newState = _indexes$reduce.newState; // remove filters
|
|
1301
|
+
|
|
1302
|
+
|
|
1303
|
+
var filters = state.filters.filter(function (filter) {
|
|
1304
|
+
return !filter.dataId.includes(datasetKey);
|
|
1305
|
+
}); // update interactionConfig
|
|
1306
|
+
|
|
1307
|
+
var interactionConfig = state.interactionConfig;
|
|
1308
|
+
var _interactionConfig = interactionConfig,
|
|
1309
|
+
tooltip = _interactionConfig.tooltip;
|
|
1310
|
+
|
|
1311
|
+
if (tooltip) {
|
|
1312
|
+
var config = tooltip.config;
|
|
1313
|
+
/* eslint-disable no-unused-vars */
|
|
1314
|
+
|
|
1315
|
+
var _config$fieldsToShow = config.fieldsToShow,
|
|
1316
|
+
fields = _config$fieldsToShow[datasetKey],
|
|
1317
|
+
fieldsToShow = (0, _objectWithoutProperties2["default"])(_config$fieldsToShow, [datasetKey].map(_toPropertyKey));
|
|
1318
|
+
/* eslint-enable no-unused-vars */
|
|
1319
|
+
|
|
1320
|
+
interactionConfig = _objectSpread(_objectSpread({}, interactionConfig), {}, {
|
|
1321
|
+
tooltip: _objectSpread(_objectSpread({}, tooltip), {}, {
|
|
1322
|
+
config: _objectSpread(_objectSpread({}, config), {}, {
|
|
1323
|
+
fieldsToShow: fieldsToShow
|
|
1324
|
+
})
|
|
1325
|
+
})
|
|
1326
|
+
});
|
|
1327
|
+
}
|
|
1328
|
+
|
|
1329
|
+
return _objectSpread(_objectSpread({}, newState), {}, {
|
|
1330
|
+
filters: filters,
|
|
1331
|
+
interactionConfig: interactionConfig
|
|
1332
|
+
});
|
|
1333
|
+
};
|
|
1334
|
+
/**
|
|
1335
|
+
* update layer blending mode
|
|
1336
|
+
* @memberof visStateUpdaters
|
|
1337
|
+
* @public
|
|
1338
|
+
*/
|
|
1339
|
+
|
|
1340
|
+
|
|
1341
|
+
exports.removeDatasetUpdater = removeDatasetUpdater;
|
|
1342
|
+
|
|
1343
|
+
var updateLayerBlendingUpdater = function updateLayerBlendingUpdater(state, action) {
|
|
1344
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1345
|
+
layerBlending: action.mode
|
|
1346
|
+
});
|
|
1347
|
+
};
|
|
1348
|
+
/**
|
|
1349
|
+
* Display dataset table in a modal
|
|
1350
|
+
* @memberof visStateUpdaters
|
|
1351
|
+
* @public
|
|
1352
|
+
*/
|
|
1353
|
+
|
|
1354
|
+
|
|
1355
|
+
exports.updateLayerBlendingUpdater = updateLayerBlendingUpdater;
|
|
1356
|
+
|
|
1357
|
+
var showDatasetTableUpdater = function showDatasetTableUpdater(state, action) {
|
|
1358
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1359
|
+
editingDataset: action.dataId
|
|
1360
|
+
});
|
|
1361
|
+
};
|
|
1362
|
+
/**
|
|
1363
|
+
* Add custom color for datasets and layers
|
|
1364
|
+
* @memberof visStateUpdaters
|
|
1365
|
+
* @public
|
|
1366
|
+
*/
|
|
1367
|
+
|
|
1368
|
+
|
|
1369
|
+
exports.showDatasetTableUpdater = showDatasetTableUpdater;
|
|
1370
|
+
|
|
1371
|
+
var updateTableColorUpdater = function updateTableColorUpdater(state, action) {
|
|
1372
|
+
var dataId = action.dataId,
|
|
1373
|
+
newColor = action.newColor;
|
|
1374
|
+
var datasets = state.datasets;
|
|
1375
|
+
|
|
1376
|
+
if ((0, _utils.isRgbColor)(newColor)) {
|
|
1377
|
+
var existing = datasets[dataId];
|
|
1378
|
+
existing.updateTableColor(newColor);
|
|
1379
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1380
|
+
datasets: _objectSpread(_objectSpread({}, state.datasets), {}, (0, _defineProperty2["default"])({}, dataId, (0, _table.copyTableAndUpdate)(existing, {})))
|
|
1381
|
+
});
|
|
1382
|
+
}
|
|
1383
|
+
|
|
1384
|
+
return state;
|
|
1385
|
+
};
|
|
1386
|
+
/**
|
|
1387
|
+
* reset visState to initial State
|
|
1388
|
+
* @memberof visStateUpdaters
|
|
1389
|
+
* @public
|
|
1390
|
+
*/
|
|
1391
|
+
|
|
1392
|
+
|
|
1393
|
+
exports.updateTableColorUpdater = updateTableColorUpdater;
|
|
1394
|
+
|
|
1395
|
+
var resetMapConfigUpdater = function resetMapConfigUpdater(state) {
|
|
1396
|
+
return _objectSpread(_objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), {}, {
|
|
1397
|
+
initialState: state.initialState
|
|
1398
|
+
});
|
|
1399
|
+
};
|
|
1400
|
+
/**
|
|
1401
|
+
* Propagate `visState` reducer with a new configuration. Current config will be override.
|
|
1402
|
+
* @memberof visStateUpdaters
|
|
1403
|
+
* @public
|
|
1404
|
+
*/
|
|
1405
|
+
|
|
1406
|
+
|
|
1407
|
+
exports.resetMapConfigUpdater = resetMapConfigUpdater;
|
|
1408
|
+
|
|
1409
|
+
var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref11) {
|
|
1410
|
+
var _ref11$payload = _ref11.payload,
|
|
1411
|
+
_ref11$payload$config = _ref11$payload.config,
|
|
1412
|
+
config = _ref11$payload$config === void 0 ? {
|
|
1413
|
+
version: ''
|
|
1414
|
+
} : _ref11$payload$config,
|
|
1415
|
+
_ref11$payload$option = _ref11$payload.options,
|
|
1416
|
+
options = _ref11$payload$option === void 0 ? {} : _ref11$payload$option;
|
|
1417
|
+
|
|
1418
|
+
if (!config.visState) {
|
|
1419
|
+
return state;
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
var keepExistingConfig = options.keepExistingConfig; // reset config if keepExistingConfig is falsy
|
|
1423
|
+
|
|
1424
|
+
var mergedState = !keepExistingConfig ? resetMapConfigUpdater(state) : state;
|
|
1425
|
+
|
|
1426
|
+
var _iterator = _createForOfIteratorHelper(state.mergers),
|
|
1427
|
+
_step;
|
|
1428
|
+
|
|
1429
|
+
try {
|
|
1430
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
1431
|
+
var merger = _step.value;
|
|
1432
|
+
|
|
1433
|
+
if ((0, _visStateMerger.isValidMerger)(merger) && config.visState[merger.prop]) {
|
|
1434
|
+
mergedState = merger.merge(mergedState, config.visState[merger.prop], true);
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
} catch (err) {
|
|
1438
|
+
_iterator.e(err);
|
|
1439
|
+
} finally {
|
|
1440
|
+
_iterator.f();
|
|
1441
|
+
}
|
|
1442
|
+
|
|
1443
|
+
return mergedState;
|
|
1444
|
+
};
|
|
1445
|
+
/**
|
|
1446
|
+
* Trigger layer hover event with hovered object
|
|
1447
|
+
* @memberof visStateUpdaters
|
|
1448
|
+
* @public
|
|
1449
|
+
*/
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
exports.receiveMapConfigUpdater = receiveMapConfigUpdater;
|
|
1453
|
+
|
|
1454
|
+
var layerHoverUpdater = function layerHoverUpdater(state, action) {
|
|
1455
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1456
|
+
hoverInfo: _objectSpread({}, action.info)
|
|
1457
|
+
});
|
|
1458
|
+
};
|
|
1459
|
+
/* eslint-enable max-statements */
|
|
1460
|
+
|
|
1461
|
+
/**
|
|
1462
|
+
* Update `interactionConfig`
|
|
1463
|
+
* @memberof visStateUpdaters
|
|
1464
|
+
* @public
|
|
1465
|
+
*/
|
|
1466
|
+
|
|
1467
|
+
|
|
1468
|
+
exports.layerHoverUpdater = layerHoverUpdater;
|
|
1469
|
+
|
|
1470
|
+
function interactionConfigChangeUpdater(state, action) {
|
|
1471
|
+
var config = action.config;
|
|
1472
|
+
|
|
1473
|
+
var interactionConfig = _objectSpread(_objectSpread({}, state.interactionConfig), (0, _defineProperty2["default"])({}, config.id, config)); // Don't enable tooltip and brush at the same time
|
|
1474
|
+
// but coordinates can be shown at all time
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
var contradict = ['brush', 'tooltip'];
|
|
1478
|
+
|
|
1479
|
+
if (contradict.includes(config.id) && config.enabled && !state.interactionConfig[config.id].enabled) {
|
|
1480
|
+
// only enable one interaction at a time
|
|
1481
|
+
contradict.forEach(function (k) {
|
|
1482
|
+
if (k !== config.id) {
|
|
1483
|
+
interactionConfig[k] = _objectSpread(_objectSpread({}, interactionConfig[k]), {}, {
|
|
1484
|
+
enabled: false
|
|
1485
|
+
});
|
|
1486
|
+
}
|
|
1487
|
+
});
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1491
|
+
interactionConfig: interactionConfig
|
|
1492
|
+
});
|
|
1493
|
+
|
|
1494
|
+
if (config.id === 'geocoder' && !config.enabled) {
|
|
1495
|
+
return removeDatasetUpdater(newState, {
|
|
1496
|
+
dataId: 'geocoder_dataset'
|
|
1497
|
+
});
|
|
1498
|
+
}
|
|
1499
|
+
|
|
1500
|
+
return newState;
|
|
1501
|
+
}
|
|
1502
|
+
/**
|
|
1503
|
+
* Trigger layer click event with clicked object
|
|
1504
|
+
* @memberof visStateUpdaters
|
|
1505
|
+
* @public
|
|
1506
|
+
*/
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
var layerClickUpdater = function layerClickUpdater(state, action) {
|
|
1510
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1511
|
+
mousePos: state.interactionConfig.coordinate.enabled ? _objectSpread(_objectSpread({}, state.mousePos), {}, {
|
|
1512
|
+
pinned: state.mousePos.pinned ? null : (0, _lodash["default"])(state.mousePos)
|
|
1513
|
+
}) : state.mousePos,
|
|
1514
|
+
clicked: action.info && action.info.picked ? action.info : null
|
|
1515
|
+
});
|
|
1516
|
+
};
|
|
1517
|
+
/**
|
|
1518
|
+
* Trigger map click event, unselect clicked object
|
|
1519
|
+
* @memberof visStateUpdaters
|
|
1520
|
+
* @public
|
|
1521
|
+
*/
|
|
1522
|
+
|
|
1523
|
+
|
|
1524
|
+
exports.layerClickUpdater = layerClickUpdater;
|
|
1525
|
+
|
|
1526
|
+
var mapClickUpdater = function mapClickUpdater(state, action) {
|
|
1527
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1528
|
+
clicked: null
|
|
1529
|
+
});
|
|
1530
|
+
};
|
|
1531
|
+
/**
|
|
1532
|
+
* Trigger map move event
|
|
1533
|
+
* @memberof visStateUpdaters
|
|
1534
|
+
* @public
|
|
1535
|
+
*/
|
|
1536
|
+
|
|
1537
|
+
|
|
1538
|
+
exports.mapClickUpdater = mapClickUpdater;
|
|
1539
|
+
|
|
1540
|
+
var mouseMoveUpdater = function mouseMoveUpdater(state, _ref12) {
|
|
1541
|
+
var evt = _ref12.evt;
|
|
1542
|
+
|
|
1543
|
+
if (Object.values(state.interactionConfig).some(function (config) {
|
|
1544
|
+
return config.enabled;
|
|
1545
|
+
})) {
|
|
1546
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1547
|
+
mousePos: _objectSpread(_objectSpread(_objectSpread({}, state.mousePos), Array.isArray(evt.point) ? {
|
|
1548
|
+
mousePosition: (0, _toConsumableArray2["default"])(evt.point)
|
|
1549
|
+
} : {}), Array.isArray(evt.lngLat) ? {
|
|
1550
|
+
coordinate: (0, _toConsumableArray2["default"])(evt.lngLat)
|
|
1551
|
+
} : {})
|
|
1552
|
+
});
|
|
1553
|
+
}
|
|
1554
|
+
|
|
1555
|
+
return state;
|
|
1556
|
+
};
|
|
1557
|
+
/**
|
|
1558
|
+
* Toggle visibility of a layer for a split map
|
|
1559
|
+
* @memberof visStateUpdaters
|
|
1560
|
+
* @public
|
|
1561
|
+
*/
|
|
1562
|
+
|
|
1563
|
+
|
|
1564
|
+
exports.mouseMoveUpdater = mouseMoveUpdater;
|
|
1565
|
+
|
|
1566
|
+
var toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
|
|
1567
|
+
return state.splitMaps && state.splitMaps.length === 0 ? _objectSpread(_objectSpread({}, state), {}, {
|
|
1568
|
+
// maybe we should use an array to store state for a single map as well
|
|
1569
|
+
// if current maps length is equal to 0 it means that we are about to split the view
|
|
1570
|
+
splitMaps: (0, _utils.computeSplitMapLayers)(state.layers)
|
|
1571
|
+
}) : closeSpecificMapAtIndex(state, action);
|
|
1572
|
+
};
|
|
1573
|
+
/**
|
|
1574
|
+
* Toggle visibility of a layer in a split map
|
|
1575
|
+
* @memberof visStateUpdaters
|
|
1576
|
+
* @public
|
|
1577
|
+
*/
|
|
1578
|
+
|
|
1579
|
+
|
|
1580
|
+
exports.toggleSplitMapUpdater = toggleSplitMapUpdater;
|
|
1581
|
+
|
|
1582
|
+
var toggleLayerForMapUpdater = function toggleLayerForMapUpdater(state, _ref13) {
|
|
1583
|
+
var mapIndex = _ref13.mapIndex,
|
|
1584
|
+
layerId = _ref13.layerId;
|
|
1585
|
+
var splitMaps = state.splitMaps;
|
|
1586
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1587
|
+
splitMaps: splitMaps.map(function (sm, i) {
|
|
1588
|
+
return i === mapIndex ? _objectSpread(_objectSpread({}, splitMaps[i]), {}, {
|
|
1589
|
+
layers: _objectSpread(_objectSpread({}, splitMaps[i].layers), {}, (0, _defineProperty2["default"])({}, layerId, !splitMaps[i].layers[layerId]))
|
|
1590
|
+
}) : sm;
|
|
1591
|
+
})
|
|
1592
|
+
});
|
|
1593
|
+
};
|
|
1594
|
+
/**
|
|
1595
|
+
* Add new dataset to `visState`, with option to load a map config along with the datasets
|
|
1596
|
+
* @memberof visStateUpdaters
|
|
1597
|
+
* @public
|
|
1598
|
+
*/
|
|
1599
|
+
|
|
1600
|
+
/* eslint-disable max-statements */
|
|
1601
|
+
// eslint-disable-next-line complexity
|
|
1602
|
+
|
|
1603
|
+
|
|
1604
|
+
exports.toggleLayerForMapUpdater = toggleLayerForMapUpdater;
|
|
1605
|
+
|
|
1606
|
+
var updateVisDataUpdater = function updateVisDataUpdater(state, action) {
|
|
1607
|
+
// datasets can be a single data entries or an array of multiple data entries
|
|
1608
|
+
var config = action.config,
|
|
1609
|
+
options = action.options;
|
|
1610
|
+
var datasets = (0, _utils.toArray)(action.datasets);
|
|
1611
|
+
var newDataEntries = datasets.reduce(function (accu) {
|
|
1612
|
+
var _ref14 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
1613
|
+
_ref14$info = _ref14.info,
|
|
1614
|
+
info = _ref14$info === void 0 ? {} : _ref14$info,
|
|
1615
|
+
rest = (0, _objectWithoutProperties2["default"])(_ref14, ["info"]);
|
|
1616
|
+
|
|
1617
|
+
return _objectSpread(_objectSpread({}, accu), (0, _table.createNewDataEntry)(_objectSpread({
|
|
1618
|
+
info: info
|
|
1619
|
+
}, rest), state.datasets) || {});
|
|
1620
|
+
}, {});
|
|
1621
|
+
var dataEmpty = Object.keys(newDataEntries).length < 1; // apply config if passed from action
|
|
1622
|
+
|
|
1623
|
+
var previousState = config ? receiveMapConfigUpdater(state, {
|
|
1624
|
+
payload: {
|
|
1625
|
+
config: config,
|
|
1626
|
+
options: options
|
|
1627
|
+
}
|
|
1628
|
+
}) : state;
|
|
1629
|
+
|
|
1630
|
+
var mergedState = _objectSpread(_objectSpread({}, previousState), {}, {
|
|
1631
|
+
datasets: _objectSpread(_objectSpread({}, previousState.datasets), newDataEntries)
|
|
1632
|
+
}); // merge state with config to be merged
|
|
1633
|
+
|
|
1634
|
+
|
|
1635
|
+
var _iterator2 = _createForOfIteratorHelper(mergedState.mergers),
|
|
1636
|
+
_step2;
|
|
1637
|
+
|
|
1638
|
+
try {
|
|
1639
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
1640
|
+
var merger = _step2.value;
|
|
1641
|
+
|
|
1642
|
+
if ((0, _visStateMerger.isValidMerger)(merger) && merger.toMergeProp && mergedState[merger.toMergeProp]) {
|
|
1643
|
+
var toMerge = mergedState[merger.toMergeProp];
|
|
1644
|
+
mergedState[merger.toMergeProp] = INITIAL_VIS_STATE[merger.toMergeProp];
|
|
1645
|
+
mergedState = merger.merge(mergedState, toMerge);
|
|
1646
|
+
}
|
|
1647
|
+
}
|
|
1648
|
+
} catch (err) {
|
|
1649
|
+
_iterator2.e(err);
|
|
1650
|
+
} finally {
|
|
1651
|
+
_iterator2.f();
|
|
1652
|
+
}
|
|
1653
|
+
|
|
1654
|
+
var newLayers = !dataEmpty ? mergedState.layers.filter(function (l) {
|
|
1655
|
+
return l.config.dataId && l.config.dataId in newDataEntries;
|
|
1656
|
+
}) : [];
|
|
1657
|
+
|
|
1658
|
+
if (!newLayers.length && (options || {}).autoCreateLayers !== false) {
|
|
1659
|
+
// no layer merged, find defaults
|
|
1660
|
+
var result = addDefaultLayers(mergedState, newDataEntries);
|
|
1661
|
+
mergedState = result.state;
|
|
1662
|
+
newLayers = result.newLayers;
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
if (mergedState.splitMaps.length) {
|
|
1666
|
+
// if map is split, add new layers to splitMaps
|
|
1667
|
+
newLayers = mergedState.layers.filter(function (l) {
|
|
1668
|
+
return l.config.dataId && l.config.dataId in newDataEntries;
|
|
1669
|
+
});
|
|
1670
|
+
mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
|
|
1671
|
+
splitMaps: (0, _utils.addNewLayersToSplitMap)(mergedState.splitMaps, newLayers)
|
|
1672
|
+
});
|
|
1673
|
+
} // if no tooltips merged add default tooltips
|
|
1674
|
+
|
|
1675
|
+
|
|
1676
|
+
Object.keys(newDataEntries).forEach(function (dataId) {
|
|
1677
|
+
var tooltipFields = mergedState.interactionConfig.tooltip.config.fieldsToShow[dataId];
|
|
1678
|
+
|
|
1679
|
+
if (!Array.isArray(tooltipFields) || !tooltipFields.length) {
|
|
1680
|
+
mergedState = addDefaultTooltips(mergedState, newDataEntries[dataId]);
|
|
1681
|
+
}
|
|
1682
|
+
});
|
|
1683
|
+
var updatedState = updateAllLayerDomainData(mergedState, dataEmpty ? Object.keys(mergedState.datasets) : Object.keys(newDataEntries), undefined); // register layer animation domain,
|
|
1684
|
+
// need to be called after layer data is calculated
|
|
1685
|
+
|
|
1686
|
+
updatedState = updateAnimationDomain(updatedState);
|
|
1687
|
+
return updatedState;
|
|
1688
|
+
};
|
|
1689
|
+
/* eslint-enable max-statements */
|
|
1690
|
+
|
|
1691
|
+
/**
|
|
1692
|
+
* Rename an existing dataset in `visState`
|
|
1693
|
+
* @memberof visStateUpdaters
|
|
1694
|
+
* @public
|
|
1695
|
+
*/
|
|
1696
|
+
|
|
1697
|
+
|
|
1698
|
+
exports.updateVisDataUpdater = updateVisDataUpdater;
|
|
1699
|
+
|
|
1700
|
+
function renameDatasetUpdater(state, action) {
|
|
1701
|
+
var dataId = action.dataId,
|
|
1702
|
+
label = action.label;
|
|
1703
|
+
var datasets = state.datasets;
|
|
1704
|
+
var existing = datasets[dataId];
|
|
1705
|
+
|
|
1706
|
+
if (existing) {
|
|
1707
|
+
var newDataset = (0, _table.copyTableAndUpdate)(existing, {
|
|
1708
|
+
label: label
|
|
1709
|
+
});
|
|
1710
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1711
|
+
datasets: _objectSpread(_objectSpread({}, datasets), {}, (0, _defineProperty2["default"])({}, dataId, newDataset))
|
|
1712
|
+
});
|
|
1713
|
+
} // No-op if the dataset doesn't exist
|
|
1714
|
+
|
|
1715
|
+
|
|
1716
|
+
return state;
|
|
1717
|
+
}
|
|
1718
|
+
/**
|
|
1719
|
+
* When a user clicks on the specific map closing icon
|
|
1720
|
+
* the application will close the selected map
|
|
1721
|
+
* and will merge the remaining one with the global state
|
|
1722
|
+
* TODO: i think in the future this action should be called merge map layers with global settings
|
|
1723
|
+
* @param {Object} state `visState`
|
|
1724
|
+
* @param {Object} action action
|
|
1725
|
+
* @returns {Object} nextState
|
|
1726
|
+
*/
|
|
1727
|
+
|
|
1728
|
+
|
|
1729
|
+
function closeSpecificMapAtIndex(state, action) {
|
|
1730
|
+
var _state$splitMaps$inde;
|
|
1731
|
+
|
|
1732
|
+
// retrieve layers meta data from the remaining map that we need to keep
|
|
1733
|
+
var indexToRetrieve = 1 - action.payload;
|
|
1734
|
+
var mapLayers = (_state$splitMaps$inde = state.splitMaps[indexToRetrieve]) === null || _state$splitMaps$inde === void 0 ? void 0 : _state$splitMaps$inde.layers;
|
|
1735
|
+
var layers = state.layers; // update layer visibility
|
|
1736
|
+
|
|
1737
|
+
var newLayers = layers.map(function (layer) {
|
|
1738
|
+
return mapLayers && !mapLayers[layer.id] && layer.config.isVisible ? layer.updateLayerConfig({
|
|
1739
|
+
// if layer.id is not in mapLayers, it should be inVisible
|
|
1740
|
+
isVisible: false
|
|
1741
|
+
}) : layer;
|
|
1742
|
+
}); // delete map
|
|
1743
|
+
|
|
1744
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1745
|
+
layers: newLayers,
|
|
1746
|
+
splitMaps: []
|
|
1747
|
+
});
|
|
1748
|
+
}
|
|
1749
|
+
/**
|
|
1750
|
+
* Trigger file loading dispatch `addDataToMap` if succeed, or `loadFilesErr` if failed
|
|
1751
|
+
* @memberof visStateUpdaters
|
|
1752
|
+
* @public
|
|
1753
|
+
*/
|
|
1754
|
+
|
|
1755
|
+
|
|
1756
|
+
var loadFilesUpdater = function loadFilesUpdater(state, action) {
|
|
1757
|
+
var files = action.files,
|
|
1758
|
+
_action$onFinish = action.onFinish,
|
|
1759
|
+
onFinish = _action$onFinish === void 0 ? _actions.loadFilesSuccess : _action$onFinish;
|
|
1760
|
+
|
|
1761
|
+
if (!files.length) {
|
|
1762
|
+
return state;
|
|
1763
|
+
}
|
|
1764
|
+
|
|
1765
|
+
var fileLoadingProgress = Array.from(files).reduce(function (accu, f, i) {
|
|
1766
|
+
return (0, _composerHelpers.merge_)(initialFileLoadingProgress(f, i))(accu);
|
|
1767
|
+
}, {});
|
|
1768
|
+
var fileLoading = {
|
|
1769
|
+
fileCache: [],
|
|
1770
|
+
filesToLoad: files,
|
|
1771
|
+
onFinish: onFinish
|
|
1772
|
+
};
|
|
1773
|
+
var nextState = (0, _composerHelpers.merge_)({
|
|
1774
|
+
fileLoadingProgress: fileLoadingProgress,
|
|
1775
|
+
fileLoading: fileLoading
|
|
1776
|
+
})(state);
|
|
1777
|
+
return loadNextFileUpdater(nextState);
|
|
1778
|
+
};
|
|
1779
|
+
/**
|
|
1780
|
+
* Sucessfully loaded one file, move on to the next one
|
|
1781
|
+
* @memberof visStateUpdaters
|
|
1782
|
+
* @public
|
|
1783
|
+
*/
|
|
1784
|
+
|
|
1785
|
+
|
|
1786
|
+
exports.loadFilesUpdater = loadFilesUpdater;
|
|
1787
|
+
|
|
1788
|
+
function loadFileStepSuccessUpdater(state, action) {
|
|
1789
|
+
if (!state.fileLoading) {
|
|
1790
|
+
return state;
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
var fileName = action.fileName,
|
|
1794
|
+
fileCache = action.fileCache;
|
|
1795
|
+
var _state$fileLoading = state.fileLoading,
|
|
1796
|
+
filesToLoad = _state$fileLoading.filesToLoad,
|
|
1797
|
+
onFinish = _state$fileLoading.onFinish;
|
|
1798
|
+
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
1799
|
+
fileName: fileName,
|
|
1800
|
+
progress: {
|
|
1801
|
+
percent: 1,
|
|
1802
|
+
message: 'Done'
|
|
1803
|
+
}
|
|
1804
|
+
}); // save processed file to fileCache
|
|
1805
|
+
|
|
1806
|
+
var stateWithCache = (0, _composerHelpers.pick_)('fileLoading')((0, _composerHelpers.merge_)({
|
|
1807
|
+
fileCache: fileCache
|
|
1808
|
+
}))(stateWithProgress);
|
|
1809
|
+
return (0, _tasks.withTask)(stateWithCache, (0, _tasks2.DELAY_TASK)(200).map(filesToLoad.length ? _actions.loadNextFile : function () {
|
|
1810
|
+
return onFinish(fileCache);
|
|
1811
|
+
}));
|
|
1812
|
+
} // withTask<T>(state: T, task: any): T
|
|
1813
|
+
|
|
1814
|
+
/**
|
|
1815
|
+
*
|
|
1816
|
+
* @memberof visStateUpdaters
|
|
1817
|
+
* @public
|
|
1818
|
+
*/
|
|
1819
|
+
|
|
1820
|
+
|
|
1821
|
+
function loadNextFileUpdater(state) {
|
|
1822
|
+
if (!state.fileLoading) {
|
|
1823
|
+
return state;
|
|
1824
|
+
}
|
|
1825
|
+
|
|
1826
|
+
var filesToLoad = state.fileLoading.filesToLoad;
|
|
1827
|
+
|
|
1828
|
+
var _filesToLoad = (0, _toArray2["default"])(filesToLoad),
|
|
1829
|
+
file = _filesToLoad[0],
|
|
1830
|
+
remainingFilesToLoad = _filesToLoad.slice(1); // save filesToLoad to state
|
|
1831
|
+
|
|
1832
|
+
|
|
1833
|
+
var nextState = (0, _composerHelpers.pick_)('fileLoading')((0, _composerHelpers.merge_)({
|
|
1834
|
+
filesToLoad: remainingFilesToLoad
|
|
1835
|
+
}))(state);
|
|
1836
|
+
var stateWithProgress = updateFileLoadingProgressUpdater(nextState, {
|
|
1837
|
+
fileName: file.name,
|
|
1838
|
+
progress: {
|
|
1839
|
+
percent: 0,
|
|
1840
|
+
message: 'loading...'
|
|
1841
|
+
}
|
|
1842
|
+
});
|
|
1843
|
+
var loaders = state.loaders,
|
|
1844
|
+
loadOptions = state.loadOptions;
|
|
1845
|
+
return (0, _tasks.withTask)(stateWithProgress, makeLoadFileTask(file, nextState.fileLoading && nextState.fileLoading.fileCache, loaders, loadOptions));
|
|
1846
|
+
}
|
|
1847
|
+
|
|
1848
|
+
function makeLoadFileTask(file, fileCache) {
|
|
1849
|
+
var loaders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
1850
|
+
var loadOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
1851
|
+
return (0, _tasks2.LOAD_FILE_TASK)({
|
|
1852
|
+
file: file,
|
|
1853
|
+
fileCache: fileCache,
|
|
1854
|
+
loaders: loaders,
|
|
1855
|
+
loadOptions: loadOptions
|
|
1856
|
+
}).bimap( // prettier ignore
|
|
1857
|
+
// success
|
|
1858
|
+
function (gen) {
|
|
1859
|
+
return (0, _actions.nextFileBatch)({
|
|
1860
|
+
gen: gen,
|
|
1861
|
+
fileName: file.name,
|
|
1862
|
+
onFinish: function onFinish(result) {
|
|
1863
|
+
return (0, _actions.processFileContent)({
|
|
1864
|
+
content: result,
|
|
1865
|
+
fileCache: fileCache
|
|
1866
|
+
});
|
|
1867
|
+
}
|
|
1868
|
+
});
|
|
1869
|
+
}, // error
|
|
1870
|
+
function (err) {
|
|
1871
|
+
return (0, _actions.loadFilesErr)(file.name, err);
|
|
1872
|
+
});
|
|
1873
|
+
}
|
|
1874
|
+
/**
|
|
1875
|
+
*
|
|
1876
|
+
* @memberof visStateUpdaters
|
|
1877
|
+
* @public
|
|
1878
|
+
*/
|
|
1879
|
+
|
|
1880
|
+
|
|
1881
|
+
function processFileContentUpdater(state, action) {
|
|
1882
|
+
var _action$payload = action.payload,
|
|
1883
|
+
content = _action$payload.content,
|
|
1884
|
+
fileCache = _action$payload.fileCache;
|
|
1885
|
+
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
1886
|
+
fileName: content.fileName,
|
|
1887
|
+
progress: {
|
|
1888
|
+
percent: 1,
|
|
1889
|
+
message: 'processing...'
|
|
1890
|
+
}
|
|
1891
|
+
});
|
|
1892
|
+
return (0, _tasks.withTask)(stateWithProgress, (0, _tasks2.PROCESS_FILE_DATA)({
|
|
1893
|
+
content: content,
|
|
1894
|
+
fileCache: fileCache
|
|
1895
|
+
}).bimap(function (result) {
|
|
1896
|
+
return (0, _actions.loadFileStepSuccess)({
|
|
1897
|
+
fileName: content.fileName,
|
|
1898
|
+
fileCache: result
|
|
1899
|
+
});
|
|
1900
|
+
}, function (err) {
|
|
1901
|
+
return (0, _actions.loadFilesErr)(content.fileName, err);
|
|
1902
|
+
}));
|
|
1903
|
+
}
|
|
1904
|
+
|
|
1905
|
+
function parseProgress() {
|
|
1906
|
+
var prevProgress = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1907
|
+
var progress = arguments.length > 1 ? arguments[1] : undefined;
|
|
1908
|
+
|
|
1909
|
+
// This happens when receiving query metadata or other cases we don't
|
|
1910
|
+
// have an update for the user.
|
|
1911
|
+
if (!progress || !progress.percent) {
|
|
1912
|
+
return {};
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1915
|
+
return {
|
|
1916
|
+
percent: progress.percent
|
|
1917
|
+
};
|
|
1918
|
+
}
|
|
1919
|
+
/**
|
|
1920
|
+
* gets called with payload = AsyncGenerator<???>
|
|
1921
|
+
* @memberof visStateUpdaters
|
|
1922
|
+
* @public
|
|
1923
|
+
*/
|
|
1924
|
+
|
|
1925
|
+
|
|
1926
|
+
var nextFileBatchUpdater = function nextFileBatchUpdater(state, _ref15) {
|
|
1927
|
+
var _ref15$payload = _ref15.payload,
|
|
1928
|
+
gen = _ref15$payload.gen,
|
|
1929
|
+
fileName = _ref15$payload.fileName,
|
|
1930
|
+
progress = _ref15$payload.progress,
|
|
1931
|
+
accumulated = _ref15$payload.accumulated,
|
|
1932
|
+
onFinish = _ref15$payload.onFinish;
|
|
1933
|
+
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
1934
|
+
fileName: fileName,
|
|
1935
|
+
progress: parseProgress(state.fileLoadingProgress[fileName], progress)
|
|
1936
|
+
});
|
|
1937
|
+
return (0, _tasks.withTask)(stateWithProgress, (0, _tasks2.UNWRAP_TASK)(gen.next()).bimap(function (_ref16) {
|
|
1938
|
+
var value = _ref16.value,
|
|
1939
|
+
done = _ref16.done;
|
|
1940
|
+
return done ? onFinish(accumulated) : (0, _actions.nextFileBatch)({
|
|
1941
|
+
gen: gen,
|
|
1942
|
+
fileName: fileName,
|
|
1943
|
+
progress: value.progress,
|
|
1944
|
+
accumulated: value,
|
|
1945
|
+
onFinish: onFinish
|
|
1946
|
+
});
|
|
1947
|
+
}, function (err) {
|
|
1948
|
+
return (0, _actions.loadFilesErr)(fileName, err);
|
|
1949
|
+
}));
|
|
1950
|
+
};
|
|
1951
|
+
/**
|
|
1952
|
+
* Trigger loading file error
|
|
1953
|
+
* @memberof visStateUpdaters
|
|
1954
|
+
* @public
|
|
1955
|
+
*/
|
|
1956
|
+
|
|
1957
|
+
|
|
1958
|
+
exports.nextFileBatchUpdater = nextFileBatchUpdater;
|
|
1959
|
+
|
|
1960
|
+
var loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref17) {
|
|
1961
|
+
var error = _ref17.error,
|
|
1962
|
+
fileName = _ref17.fileName;
|
|
1963
|
+
|
|
1964
|
+
// update ui with error message
|
|
1965
|
+
_window.console.warn(error);
|
|
1966
|
+
|
|
1967
|
+
if (!state.fileLoading) {
|
|
1968
|
+
return state;
|
|
1969
|
+
}
|
|
1970
|
+
|
|
1971
|
+
var _state$fileLoading2 = state.fileLoading,
|
|
1972
|
+
filesToLoad = _state$fileLoading2.filesToLoad,
|
|
1973
|
+
onFinish = _state$fileLoading2.onFinish,
|
|
1974
|
+
fileCache = _state$fileLoading2.fileCache;
|
|
1975
|
+
var nextState = updateFileLoadingProgressUpdater(state, {
|
|
1976
|
+
fileName: fileName,
|
|
1977
|
+
progress: {
|
|
1978
|
+
error: error
|
|
1979
|
+
}
|
|
1980
|
+
}); // kick off next file or finish
|
|
1981
|
+
|
|
1982
|
+
return (0, _tasks.withTask)(nextState, (0, _tasks2.DELAY_TASK)(200).map(filesToLoad.length ? _actions.loadNextFile : function () {
|
|
1983
|
+
return onFinish(fileCache);
|
|
1984
|
+
}));
|
|
1985
|
+
};
|
|
1986
|
+
/**
|
|
1987
|
+
* When select dataset for export, apply cpu filter to selected dataset
|
|
1988
|
+
* @memberof visStateUpdaters
|
|
1989
|
+
* @public
|
|
1990
|
+
*/
|
|
1991
|
+
|
|
1992
|
+
|
|
1993
|
+
exports.loadFilesErrUpdater = loadFilesErrUpdater;
|
|
1994
|
+
|
|
1995
|
+
var applyCPUFilterUpdater = function applyCPUFilterUpdater(state, _ref18) {
|
|
1996
|
+
var dataId = _ref18.dataId;
|
|
1997
|
+
// apply cpuFilter
|
|
1998
|
+
var dataIds = (0, _utils.toArray)(dataId);
|
|
1999
|
+
return dataIds.reduce(function (accu, id) {
|
|
2000
|
+
return (0, _utils.filterDatasetCPU)(accu, id);
|
|
2001
|
+
}, state);
|
|
2002
|
+
};
|
|
2003
|
+
/**
|
|
2004
|
+
* User input to update the info of the map
|
|
2005
|
+
* @memberof visStateUpdaters
|
|
2006
|
+
* @public
|
|
2007
|
+
*/
|
|
2008
|
+
|
|
2009
|
+
|
|
2010
|
+
exports.applyCPUFilterUpdater = applyCPUFilterUpdater;
|
|
2011
|
+
|
|
2012
|
+
var setMapInfoUpdater = function setMapInfoUpdater(state, action) {
|
|
2013
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2014
|
+
mapInfo: _objectSpread(_objectSpread({}, state.mapInfo), action.info)
|
|
2015
|
+
});
|
|
2016
|
+
};
|
|
2017
|
+
/**
|
|
2018
|
+
* Helper function to update All layer domain and layer data of state
|
|
2019
|
+
*/
|
|
2020
|
+
|
|
2021
|
+
|
|
2022
|
+
exports.setMapInfoUpdater = setMapInfoUpdater;
|
|
2023
|
+
|
|
2024
|
+
function addDefaultLayers(state, datasets) {
|
|
2025
|
+
var empty = [];
|
|
2026
|
+
var defaultLayers = Object.values(datasets).reduce(function (accu, dataset) {
|
|
2027
|
+
var foundLayers = (0, _layerUtils.findDefaultLayer)(dataset, state.layerClasses);
|
|
2028
|
+
return foundLayers && foundLayers.length ? accu.concat(foundLayers) : accu;
|
|
2029
|
+
}, empty);
|
|
2030
|
+
return {
|
|
2031
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
2032
|
+
layers: [].concat((0, _toConsumableArray2["default"])(state.layers), (0, _toConsumableArray2["default"])(defaultLayers)),
|
|
2033
|
+
layerOrder: [].concat((0, _toConsumableArray2["default"])(defaultLayers.map(function (_, i) {
|
|
2034
|
+
return state.layers.length + i;
|
|
2035
|
+
})), (0, _toConsumableArray2["default"])(state.layerOrder))
|
|
2036
|
+
}),
|
|
2037
|
+
newLayers: defaultLayers
|
|
2038
|
+
};
|
|
2039
|
+
}
|
|
2040
|
+
/**
|
|
2041
|
+
* helper function to find default tooltips
|
|
2042
|
+
* @param {Object} state
|
|
2043
|
+
* @param {Object} dataset
|
|
2044
|
+
* @returns {Object} nextState
|
|
2045
|
+
*/
|
|
2046
|
+
|
|
2047
|
+
|
|
2048
|
+
function addDefaultTooltips(state, dataset) {
|
|
2049
|
+
var tooltipFields = (0, _interactionUtils.findFieldsToShow)(_objectSpread(_objectSpread({}, dataset), {}, {
|
|
2050
|
+
maxDefaultTooltips: state.maxDefaultTooltips
|
|
2051
|
+
}));
|
|
2052
|
+
|
|
2053
|
+
var merged = _objectSpread(_objectSpread({}, state.interactionConfig.tooltip.config.fieldsToShow), tooltipFields);
|
|
2054
|
+
|
|
2055
|
+
return (0, _utils.set)(['interactionConfig', 'tooltip', 'config', 'fieldsToShow'], merged, state);
|
|
2056
|
+
}
|
|
2057
|
+
|
|
2058
|
+
function initialFileLoadingProgress(file, index) {
|
|
2059
|
+
var fileName = file.name || "Untitled File ".concat(index);
|
|
2060
|
+
return (0, _defineProperty2["default"])({}, fileName, {
|
|
2061
|
+
// percent of current file
|
|
2062
|
+
percent: 0,
|
|
2063
|
+
message: '',
|
|
2064
|
+
fileName: fileName,
|
|
2065
|
+
error: null
|
|
2066
|
+
});
|
|
2067
|
+
}
|
|
2068
|
+
|
|
2069
|
+
function updateFileLoadingProgressUpdater(state, _ref20) {
|
|
2070
|
+
var fileName = _ref20.fileName,
|
|
2071
|
+
progress = _ref20.progress;
|
|
2072
|
+
// @ts-expect-error
|
|
2073
|
+
return (0, _composerHelpers.pick_)('fileLoadingProgress')((0, _composerHelpers.pick_)(fileName)((0, _composerHelpers.merge_)(progress)))(state);
|
|
2074
|
+
}
|
|
2075
|
+
/**
|
|
2076
|
+
* Helper function to update layer domains for an array of datasets
|
|
2077
|
+
*/
|
|
2078
|
+
|
|
2079
|
+
|
|
2080
|
+
function updateAllLayerDomainData(state, dataId, updatedFilter) {
|
|
2081
|
+
var dataIds = typeof dataId === 'string' ? [dataId] : dataId;
|
|
2082
|
+
var newLayers = [];
|
|
2083
|
+
var newLayerData = [];
|
|
2084
|
+
state.layers.forEach(function (oldLayer, i) {
|
|
2085
|
+
if (oldLayer.config.dataId && dataIds.includes(oldLayer.config.dataId)) {
|
|
2086
|
+
// No need to recalculate layer domain if filter has fixed domain
|
|
2087
|
+
var newLayer = updatedFilter && updatedFilter.fixedDomain ? oldLayer : oldLayer.updateLayerDomain(state.datasets, updatedFilter);
|
|
2088
|
+
|
|
2089
|
+
var _calculateLayerData5 = (0, _layerUtils.calculateLayerData)(newLayer, state, state.layerData[i]),
|
|
2090
|
+
layerData = _calculateLayerData5.layerData,
|
|
2091
|
+
layer = _calculateLayerData5.layer;
|
|
2092
|
+
|
|
2093
|
+
newLayers.push(layer);
|
|
2094
|
+
newLayerData.push(layerData);
|
|
2095
|
+
} else {
|
|
2096
|
+
newLayers.push(oldLayer);
|
|
2097
|
+
newLayerData.push(state.layerData[i]);
|
|
2098
|
+
}
|
|
2099
|
+
});
|
|
2100
|
+
|
|
2101
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2102
|
+
layers: newLayers,
|
|
2103
|
+
layerData: newLayerData
|
|
2104
|
+
});
|
|
2105
|
+
|
|
2106
|
+
return newState;
|
|
2107
|
+
}
|
|
2108
|
+
|
|
2109
|
+
function updateAnimationDomain(state) {
|
|
2110
|
+
// merge all animatable layer domain and update global config
|
|
2111
|
+
var animatableLayers = state.layers.filter(function (l) {
|
|
2112
|
+
return l.config.isVisible && l.config.animation && l.config.animation.enabled && // @ts-expect-error trip-layer-only
|
|
2113
|
+
Array.isArray(l.animationDomain);
|
|
2114
|
+
});
|
|
2115
|
+
|
|
2116
|
+
if (!animatableLayers.length) {
|
|
2117
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2118
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
2119
|
+
domain: null,
|
|
2120
|
+
defaultTimeFormat: null
|
|
2121
|
+
})
|
|
2122
|
+
});
|
|
2123
|
+
}
|
|
2124
|
+
|
|
2125
|
+
var mergedDomain = animatableLayers.reduce(function (accu, layer) {
|
|
2126
|
+
return [// @ts-expect-error trip-layer-only
|
|
2127
|
+
Math.min(accu[0], layer.animationDomain[0]), // @ts-expect-error trip-layer-only
|
|
2128
|
+
Math.max(accu[1], layer.animationDomain[1])];
|
|
2129
|
+
}, [Number(Infinity), -Infinity]);
|
|
2130
|
+
var defaultTimeFormat = (0, _utils.getTimeWidgetTitleFormatter)(mergedDomain);
|
|
2131
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2132
|
+
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
2133
|
+
currentTime: (0, _utils.isInRange)(state.animationConfig.currentTime, mergedDomain) ? state.animationConfig.currentTime : mergedDomain[0],
|
|
2134
|
+
domain: mergedDomain,
|
|
2135
|
+
defaultTimeFormat: defaultTimeFormat
|
|
2136
|
+
})
|
|
2137
|
+
});
|
|
2138
|
+
}
|
|
2139
|
+
/**
|
|
2140
|
+
* Update the status of the editor
|
|
2141
|
+
* @memberof visStateUpdaters
|
|
2142
|
+
*/
|
|
2143
|
+
|
|
2144
|
+
|
|
2145
|
+
var setEditorModeUpdater = function setEditorModeUpdater(state, _ref21) {
|
|
2146
|
+
var mode = _ref21.mode;
|
|
2147
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2148
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2149
|
+
mode: mode,
|
|
2150
|
+
selectedFeature: null
|
|
2151
|
+
})
|
|
2152
|
+
});
|
|
2153
|
+
}; // const featureToFilterValue = (feature) => ({...feature, id: feature.id});
|
|
2154
|
+
|
|
2155
|
+
/**
|
|
2156
|
+
* Update editor features
|
|
2157
|
+
* @memberof visStateUpdaters
|
|
2158
|
+
*/
|
|
2159
|
+
|
|
2160
|
+
|
|
2161
|
+
exports.setEditorModeUpdater = setEditorModeUpdater;
|
|
2162
|
+
|
|
2163
|
+
function setFeaturesUpdater(state, _ref22) {
|
|
2164
|
+
var _ref22$features = _ref22.features,
|
|
2165
|
+
features = _ref22$features === void 0 ? [] : _ref22$features;
|
|
2166
|
+
var lastFeature = features.length && features[features.length - 1];
|
|
2167
|
+
|
|
2168
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2169
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2170
|
+
// only save none filter features to editor
|
|
2171
|
+
features: features.filter(function (f) {
|
|
2172
|
+
return !(0, _utils.getFilterIdInFeature)(f);
|
|
2173
|
+
}),
|
|
2174
|
+
mode: lastFeature && lastFeature.properties.isClosed ? _constants.EDITOR_MODES.EDIT : state.editor.mode
|
|
2175
|
+
})
|
|
2176
|
+
}); // Retrieve existing feature
|
|
2177
|
+
|
|
2178
|
+
|
|
2179
|
+
var selectedFeature = state.editor.selectedFeature; // If no feature is selected we can simply return since no operations
|
|
2180
|
+
|
|
2181
|
+
if (!selectedFeature) {
|
|
2182
|
+
return newState;
|
|
2183
|
+
} // TODO: check if the feature has changed
|
|
2184
|
+
|
|
2185
|
+
|
|
2186
|
+
var feature = features.find(function (f) {
|
|
2187
|
+
return f.id === selectedFeature.id;
|
|
2188
|
+
}); // if feature is part of a filter
|
|
2189
|
+
|
|
2190
|
+
var filterId = feature && (0, _utils.getFilterIdInFeature)(feature);
|
|
2191
|
+
|
|
2192
|
+
if (filterId && feature) {
|
|
2193
|
+
var featureValue = (0, _utils.featureToFilterValue)(feature, filterId);
|
|
2194
|
+
var filterIdx = state.filters.findIndex(function (fil) {
|
|
2195
|
+
return fil.id === filterId;
|
|
2196
|
+
}); // @ts-ignore
|
|
2197
|
+
|
|
2198
|
+
return setFilterUpdater(newState, {
|
|
2199
|
+
idx: filterIdx,
|
|
2200
|
+
prop: 'value',
|
|
2201
|
+
value: featureValue
|
|
2202
|
+
});
|
|
2203
|
+
}
|
|
2204
|
+
|
|
2205
|
+
return newState;
|
|
2206
|
+
}
|
|
2207
|
+
/**
|
|
2208
|
+
* Set the current selected feature
|
|
2209
|
+
* @memberof uiStateUpdaters
|
|
2210
|
+
*/
|
|
2211
|
+
|
|
2212
|
+
|
|
2213
|
+
var setSelectedFeatureUpdater = function setSelectedFeatureUpdater(state, _ref23) {
|
|
2214
|
+
var feature = _ref23.feature;
|
|
2215
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2216
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2217
|
+
selectedFeature: feature
|
|
2218
|
+
})
|
|
2219
|
+
});
|
|
2220
|
+
};
|
|
2221
|
+
/**
|
|
2222
|
+
* Delete existing feature from filters
|
|
2223
|
+
* @memberof visStateUpdaters
|
|
2224
|
+
*/
|
|
2225
|
+
|
|
2226
|
+
|
|
2227
|
+
exports.setSelectedFeatureUpdater = setSelectedFeatureUpdater;
|
|
2228
|
+
|
|
2229
|
+
function deleteFeatureUpdater(state, _ref24) {
|
|
2230
|
+
var feature = _ref24.feature;
|
|
2231
|
+
|
|
2232
|
+
if (!feature) {
|
|
2233
|
+
return state;
|
|
2234
|
+
}
|
|
2235
|
+
|
|
2236
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2237
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2238
|
+
selectedFeature: null
|
|
2239
|
+
})
|
|
2240
|
+
});
|
|
2241
|
+
|
|
2242
|
+
if ((0, _utils.getFilterIdInFeature)(feature)) {
|
|
2243
|
+
var filterIdx = newState.filters.findIndex(function (f) {
|
|
2244
|
+
return f.id === (0, _utils.getFilterIdInFeature)(feature);
|
|
2245
|
+
});
|
|
2246
|
+
return filterIdx > -1 ? removeFilterUpdater(newState, {
|
|
2247
|
+
idx: filterIdx
|
|
2248
|
+
}) : newState;
|
|
2249
|
+
} // modify editor object
|
|
2250
|
+
|
|
2251
|
+
|
|
2252
|
+
var newEditor = _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2253
|
+
features: state.editor.features.filter(function (f) {
|
|
2254
|
+
return f.id !== feature.id;
|
|
2255
|
+
}),
|
|
2256
|
+
selectedFeature: null
|
|
2257
|
+
});
|
|
2258
|
+
|
|
2259
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2260
|
+
editor: newEditor
|
|
2261
|
+
});
|
|
2262
|
+
}
|
|
2263
|
+
/**
|
|
2264
|
+
* Toggle feature as layer filter
|
|
2265
|
+
* @memberof visStateUpdaters
|
|
2266
|
+
*/
|
|
2267
|
+
|
|
2268
|
+
|
|
2269
|
+
function setPolygonFilterLayerUpdater(state, payload) {
|
|
2270
|
+
var layer = payload.layer,
|
|
2271
|
+
feature = payload.feature;
|
|
2272
|
+
var filterId = (0, _utils.getFilterIdInFeature)(feature); // let newFilter = null;
|
|
2273
|
+
|
|
2274
|
+
var filterIdx;
|
|
2275
|
+
var newLayerId = [layer.id];
|
|
2276
|
+
var newState = state; // If polygon filter already exists, we need to find out if the current layer is already included
|
|
2277
|
+
|
|
2278
|
+
if (filterId) {
|
|
2279
|
+
filterIdx = state.filters.findIndex(function (f) {
|
|
2280
|
+
return f.id === filterId;
|
|
2281
|
+
});
|
|
2282
|
+
|
|
2283
|
+
if (!state.filters[filterIdx]) {
|
|
2284
|
+
// what if filter doesn't exist?... not possible.
|
|
2285
|
+
// because features in the editor is passed in from filters and editors.
|
|
2286
|
+
// but we will move this feature back to editor just in case
|
|
2287
|
+
var noneFilterFeature = _objectSpread(_objectSpread({}, feature), {}, {
|
|
2288
|
+
properties: _objectSpread(_objectSpread({}, feature.properties), {}, {
|
|
2289
|
+
filterId: null
|
|
2290
|
+
})
|
|
2291
|
+
});
|
|
2292
|
+
|
|
2293
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2294
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2295
|
+
features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), [noneFilterFeature]),
|
|
2296
|
+
selectedFeature: noneFilterFeature
|
|
2297
|
+
})
|
|
2298
|
+
});
|
|
2299
|
+
}
|
|
2300
|
+
|
|
2301
|
+
var filter = state.filters[filterIdx];
|
|
2302
|
+
var _filter$layerId = filter.layerId,
|
|
2303
|
+
layerId = _filter$layerId === void 0 ? [] : _filter$layerId;
|
|
2304
|
+
var isLayerIncluded = layerId.includes(layer.id);
|
|
2305
|
+
newLayerId = isLayerIncluded ? // if layer is included, remove it
|
|
2306
|
+
layerId.filter(function (l) {
|
|
2307
|
+
return l !== layer.id;
|
|
2308
|
+
}) : [].concat((0, _toConsumableArray2["default"])(layerId), [layer.id]);
|
|
2309
|
+
} else {
|
|
2310
|
+
// if we haven't create the polygon filter, create it
|
|
2311
|
+
var newFilter = (0, _utils.generatePolygonFilter)([], feature);
|
|
2312
|
+
filterIdx = state.filters.length; // add feature, remove feature from eidtor
|
|
2313
|
+
|
|
2314
|
+
newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2315
|
+
filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [newFilter]),
|
|
2316
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2317
|
+
features: state.editor.features.filter(function (f) {
|
|
2318
|
+
return f.id !== feature.id;
|
|
2319
|
+
}),
|
|
2320
|
+
selectedFeature: newFilter.value
|
|
2321
|
+
})
|
|
2322
|
+
});
|
|
2323
|
+
}
|
|
2324
|
+
|
|
2325
|
+
return setFilterUpdater(newState, {
|
|
2326
|
+
idx: filterIdx,
|
|
2327
|
+
prop: 'layerId',
|
|
2328
|
+
value: newLayerId
|
|
2329
|
+
});
|
|
2330
|
+
}
|
|
2331
|
+
/**
|
|
2332
|
+
* @memberof visStateUpdaters
|
|
2333
|
+
* @public
|
|
2334
|
+
*/
|
|
2335
|
+
|
|
2336
|
+
|
|
2337
|
+
function sortTableColumnUpdater(state, _ref25) {
|
|
2338
|
+
var dataId = _ref25.dataId,
|
|
2339
|
+
column = _ref25.column,
|
|
2340
|
+
mode = _ref25.mode;
|
|
2341
|
+
var dataset = state.datasets[dataId];
|
|
2342
|
+
|
|
2343
|
+
if (!dataset) {
|
|
2344
|
+
return state;
|
|
2345
|
+
}
|
|
2346
|
+
|
|
2347
|
+
var sortMode = mode;
|
|
2348
|
+
|
|
2349
|
+
if (!sortMode) {
|
|
2350
|
+
var currentMode = (0, _lodash3["default"])(dataset, ['sortColumn', column]); // @ts-ignore - should be fixable in a TS file
|
|
2351
|
+
|
|
2352
|
+
sortMode = currentMode ? Object.keys(_constants.SORT_ORDER).find(function (m) {
|
|
2353
|
+
return m !== currentMode;
|
|
2354
|
+
}) : _constants.SORT_ORDER.ASCENDING;
|
|
2355
|
+
}
|
|
2356
|
+
|
|
2357
|
+
var sorted = (0, _table.sortDatasetByColumn)(dataset, column, sortMode);
|
|
2358
|
+
return (0, _utils.set)(['datasets', dataId], sorted, state);
|
|
2359
|
+
}
|
|
2360
|
+
/**
|
|
2361
|
+
* @memberof visStateUpdaters
|
|
2362
|
+
* @public
|
|
2363
|
+
*/
|
|
2364
|
+
|
|
2365
|
+
|
|
2366
|
+
function pinTableColumnUpdater(state, _ref26) {
|
|
2367
|
+
var dataId = _ref26.dataId,
|
|
2368
|
+
column = _ref26.column;
|
|
2369
|
+
var dataset = state.datasets[dataId];
|
|
2370
|
+
|
|
2371
|
+
if (!dataset) {
|
|
2372
|
+
return state;
|
|
2373
|
+
}
|
|
2374
|
+
|
|
2375
|
+
var newDataset = (0, _table.pinTableColumns)(dataset, column);
|
|
2376
|
+
return (0, _utils.set)(['datasets', dataId], newDataset, state);
|
|
2377
|
+
}
|
|
2378
|
+
/**
|
|
2379
|
+
* Copy column content as strings
|
|
2380
|
+
* @memberof visStateUpdaters
|
|
2381
|
+
* @public
|
|
2382
|
+
*/
|
|
2383
|
+
|
|
2384
|
+
|
|
2385
|
+
function copyTableColumnUpdater(state, _ref27) {
|
|
2386
|
+
var dataId = _ref27.dataId,
|
|
2387
|
+
column = _ref27.column;
|
|
2388
|
+
var dataset = state.datasets[dataId];
|
|
2389
|
+
|
|
2390
|
+
if (!dataset) {
|
|
2391
|
+
return state;
|
|
2392
|
+
}
|
|
2393
|
+
|
|
2394
|
+
var fieldIdx = dataset.fields.findIndex(function (f) {
|
|
2395
|
+
return f.name === column;
|
|
2396
|
+
});
|
|
2397
|
+
|
|
2398
|
+
if (fieldIdx < 0) {
|
|
2399
|
+
return state;
|
|
2400
|
+
}
|
|
2401
|
+
|
|
2402
|
+
var type = dataset.fields[fieldIdx].type;
|
|
2403
|
+
var text = dataset.dataContainer.map(function (row) {
|
|
2404
|
+
return (0, _utils.parseFieldValue)(row.valueAt(fieldIdx), type);
|
|
2405
|
+
}, true).join('\n');
|
|
2406
|
+
(0, _copyToClipboard["default"])(text);
|
|
2407
|
+
return state;
|
|
2408
|
+
}
|
|
2409
|
+
/**
|
|
2410
|
+
* Update editor
|
|
2411
|
+
*/
|
|
2412
|
+
|
|
2413
|
+
|
|
2414
|
+
function toggleEditorVisibilityUpdater(state, action) {
|
|
2415
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2416
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2417
|
+
visible: !state.editor.visible
|
|
2418
|
+
})
|
|
2419
|
+
});
|
|
2420
|
+
}
|
|
2421
|
+
|
|
2422
|
+
function setFilterAnimationTimeConfigUpdater(state, _ref28) {
|
|
2423
|
+
var idx = _ref28.idx,
|
|
2424
|
+
config = _ref28.config;
|
|
2425
|
+
var oldFilter = state.filters[idx];
|
|
2426
|
+
|
|
2427
|
+
if (!oldFilter) {
|
|
2428
|
+
_window.console.error("filters.".concat(idx, " is undefined"));
|
|
2429
|
+
|
|
2430
|
+
return state;
|
|
2431
|
+
}
|
|
2432
|
+
|
|
2433
|
+
if (oldFilter.type !== _constants.FILTER_TYPES.timeRange) {
|
|
2434
|
+
_window.console.error("setFilterAnimationTimeConfig can only be called to update a time filter. check filter.type === 'timeRange'");
|
|
2435
|
+
|
|
2436
|
+
return state;
|
|
2437
|
+
}
|
|
2438
|
+
|
|
2439
|
+
var updates = checkTimeConfigArgs(config);
|
|
2440
|
+
return (0, _composerHelpers.pick_)('filters')((0, _composerHelpers.swap_)((0, _composerHelpers.merge_)(updates)(oldFilter)))(state);
|
|
2441
|
+
}
|
|
2442
|
+
|
|
2443
|
+
function checkTimeConfigArgs(config) {
|
|
2444
|
+
var allowed = ['timeFormat', 'timezone'];
|
|
2445
|
+
return Object.keys(config).reduce(function (accu, prop) {
|
|
2446
|
+
if (!allowed.includes(prop)) {
|
|
2447
|
+
_window.console.error("setLayerAnimationTimeConfig takes timeFormat and/or timezone as options, found ".concat(prop));
|
|
2448
|
+
|
|
2449
|
+
return accu;
|
|
2450
|
+
} // here we are NOT checking if timezone or timeFormat input is valid
|
|
2451
|
+
|
|
2452
|
+
|
|
2453
|
+
accu[prop] = config[prop];
|
|
2454
|
+
return accu;
|
|
2455
|
+
}, {});
|
|
2456
|
+
}
|
|
2457
|
+
/**
|
|
2458
|
+
* Update editor
|
|
2459
|
+
*/
|
|
2460
|
+
|
|
2461
|
+
|
|
2462
|
+
function setLayerAnimationTimeConfigUpdater(state, _ref29) {
|
|
2463
|
+
var config = _ref29.config;
|
|
2464
|
+
|
|
2465
|
+
if (!config) {
|
|
2466
|
+
return state;
|
|
2467
|
+
}
|
|
2468
|
+
|
|
2469
|
+
var updates = checkTimeConfigArgs(config);
|
|
2470
|
+
return (0, _composerHelpers.pick_)('animationConfig')((0, _composerHelpers.merge_)(updates))(state);
|
|
2471
|
+
}
|
|
2472
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy92aXMtc3RhdGUtdXBkYXRlcnMudHMiXSwibmFtZXMiOlsidmlzU3RhdGVVcGRhdGVycyIsImRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZyIsInRvb2x0aXAiLCJpZCIsImxhYmVsIiwiZW5hYmxlZCIsImNvbmZpZyIsImZpZWxkc1RvU2hvdyIsImNvbXBhcmVNb2RlIiwiY29tcGFyZVR5cGUiLCJDT01QQVJFX1RZUEVTIiwiQUJTT0xVVEUiLCJnZW9jb2RlciIsInBvc2l0aW9uIiwiYnJ1c2giLCJzaXplIiwiY29vcmRpbmF0ZSIsIkRFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRyIsImRvbWFpbiIsImN1cnJlbnRUaW1lIiwic3BlZWQiLCJpc0FuaW1hdGluZyIsInRpbWVGb3JtYXQiLCJ0aW1lem9uZSIsImRlZmF1bHRUaW1lRm9ybWF0IiwiREVGQVVMVF9FRElUT1IiLCJtb2RlIiwiRURJVE9SX01PREVTIiwiRFJBV19QT0xZR09OIiwiZmVhdHVyZXMiLCJzZWxlY3RlZEZlYXR1cmUiLCJ2aXNpYmxlIiwiSU5JVElBTF9WSVNfU1RBVEUiLCJtYXBJbmZvIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsImxheWVycyIsImxheWVyRGF0YSIsImxheWVyVG9CZU1lcmdlZCIsImxheWVyT3JkZXIiLCJmaWx0ZXJzIiwiZmlsdGVyVG9CZU1lcmdlZCIsImRhdGFzZXRzIiwiZWRpdGluZ0RhdGFzZXQiLCJ1bmRlZmluZWQiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImludGVyYWN0aW9uVG9CZU1lcmdlZCIsImxheWVyQmxlbmRpbmciLCJob3ZlckluZm8iLCJjbGlja2VkIiwibW91c2VQb3MiLCJtYXhEZWZhdWx0VG9vbHRpcHMiLCJNQVhfREVGQVVMVF9UT09MVElQUyIsInNwbGl0TWFwcyIsInNwbGl0TWFwc1RvQmVNZXJnZWQiLCJsYXllckNsYXNzZXMiLCJMYXllckNsYXNzZXMiLCJhbmltYXRpb25Db25maWciLCJlZGl0b3IiLCJmaWxlTG9hZGluZyIsImZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJsb2FkZXJzIiwibG9hZE9wdGlvbnMiLCJtZXJnZXJzIiwiVklTX1NUQVRFX01FUkdFUlMiLCJzY2hlbWEiLCJLZXBsZXJHTFNjaGVtYSIsInVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YSIsInN0YXRlIiwibGF5ZXIiLCJpZHgiLCJtYXAiLCJseXIiLCJpIiwiZCIsInVwZGF0ZVN0YXRlT25MYXllclZpc2liaWxpdHlDaGFuZ2UiLCJuZXdTdGF0ZSIsImxlbmd0aCIsImlzVmlzaWJsZSIsImFuaW1hdGlvbiIsInVwZGF0ZUFuaW1hdGlvbkRvbWFpbiIsImxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlciIsImFjdGlvbiIsIm9sZExheWVyIiwiZmluZEluZGV4IiwibCIsInByb3BzIiwiT2JqZWN0Iiwia2V5cyIsIm5ld0NvbmZpZyIsImRhdGFJZCIsInJlc3RDb25maWciLCJzdGF0ZVdpdGhEYXRhSWQiLCJsYXllckRhdGFJZENoYW5nZVVwZGF0ZXIiLCJuZXh0TGF5ZXIiLCJmaW5kIiwibmV3TGF5ZXIiLCJ1cGRhdGVMYXllckNvbmZpZyIsInNob3VsZENhbGN1bGF0ZUxheWVyRGF0YSIsIm9sZExheWVyRGF0YSIsInVwZGF0ZUxheWVyRGF0YVJlc3VsdCIsImFkZE9yUmVtb3ZlVGV4dExhYmVscyIsIm5ld0ZpZWxkcyIsInRleHRMYWJlbCIsIm5ld1RleHRMYWJlbCIsInNsaWNlIiwiY3VycmVudEZpZWxkcyIsInRsIiwiZmllbGQiLCJuYW1lIiwiZmlsdGVyIiwiYWRkRmllbGRzIiwiZiIsImluY2x1ZGVzIiwiZGVsZXRlRmllbGRzIiwiZmQiLCJERUZBVUxUX1RFWFRfTEFCRUwiLCJhZiIsInVwZGF0ZVRleHRMYWJlbFByb3BBbmRWYWx1ZSIsInByb3AiLCJ2YWx1ZSIsImhhc093blByb3BlcnR5Iiwic3BsaWNlIiwibGF5ZXJUZXh0TGFiZWxDaGFuZ2VVcGRhdGVyIiwidmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEiLCJkYXRhc2V0IiwibG9hZGVkTGF5ZXIiLCJhbGxvd0VtcHR5Q29sdW1uIiwiaXNWYWxpZFRvU2F2ZSIsInZhbGlkYXRlZCIsInR5cGUiLCJpc0NvbmZpZ0FjdGl2ZSIsInVwZGF0ZUxheWVyRG9tYWluIiwic2V0SW5pdGlhbExheWVyQ29uZmlnIiwicmVzdWx0IiwiZmluZERlZmF1bHRMYXllclByb3BzIiwiQXJyYXkiLCJpc0FycmF5IiwibGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciIsIm5ld1R5cGUiLCJvbGRJZCIsIkNvbnNvbGUiLCJlcnJvciIsImFzc2lnbkNvbmZpZ1RvTGF5ZXIiLCJ2aXNDb25maWdTZXR0aW5ncyIsImlzTGF5ZXJIb3ZlcmVkIiwic2V0dGluZ3MiLCJvbGRMYXllck1hcCIsIm90aGVyTGF5ZXJzIiwibGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlciIsImNoYW5uZWwiLCJ1cGRhdGVMYXllclZpc3VhbENoYW5uZWwiLCJsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIiLCJuZXdWaXNDb25maWciLCJ2aXNDb25maWciLCJzZXRGaWx0ZXJBbmltYXRpb25UaW1lVXBkYXRlciIsInNldEZpbHRlclVwZGF0ZXIiLCJzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyIiwiYW5pbWF0aW9uV2luZG93IiwidmFsdWVJbmRleCIsIm9sZEZpbHRlciIsIm5ld0ZpbHRlciIsImRhdGFzZXRJZHMiLCJGSUxURVJfVVBEQVRFUl9QUk9QUyIsImRhdGFzZXRJZCIsIm1lcmdlRG9tYWluIiwidXBkYXRlZEZpbHRlciIsIm5ld0RhdGFzZXQiLCJncHUiLCJsYXllcklkIiwibGF5ZXJJZERpZmZlcmVuY2UiLCJsYXllckRhdGFJZHMiLCJsaWQiLCJuZXdEYXRhSWRzIiwiZW5sYXJnZWRGaWx0ZXIiLCJlbmxhcmdlZCIsImRhdGFzZXRJZHNUb0ZpbHRlciIsIkxJTUlURURfRklMVEVSX0VGRkVDVF9QUk9QUyIsImZpbHRlcmVkRGF0YXNldHMiLCJ1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEiLCJzZXRGaWx0ZXJQbG90VXBkYXRlciIsIm5ld1Byb3AiLCJwbG90VHlwZSIsImFkZEZpbHRlclVwZGF0ZXIiLCJsYXllckNvbG9yVUlDaGFuZ2VVcGRhdGVyIiwib2xkVml4Q29uZmlnIiwidXBkYXRlTGF5ZXJDb2xvclVJIiwidG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbFVwZGF0ZXIiLCJoaWRlQ29udHJvbCIsInVwZGF0ZUZpbHRlckFuaW1hdGlvblNwZWVkVXBkYXRlciIsInNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXIiLCJ1cGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlciIsImVubGFyZ2VGaWx0ZXJVcGRhdGVyIiwidG9nZ2xlRmlsdGVyRmVhdHVyZVVwZGF0ZXIiLCJhc3NpZ24iLCJyZW1vdmVGaWx0ZXJVcGRhdGVyIiwibmV3RmlsdGVycyIsIm5ld0VkaXRvciIsImFkZExheWVyVXBkYXRlciIsIm5ld0xheWVyRGF0YSIsIndhcm4iLCJkZWZhdWx0RGF0YXNldCIsIkxheWVyIiwicmVtb3ZlTGF5ZXJVcGRhdGVyIiwibGF5ZXJUb1JlbW92ZSIsIm5ld01hcHMiLCJwaWQiLCJkdXBsaWNhdGVMYXllclVwZGF0ZXIiLCJvcmlnaW5hbCIsIm9yaWdpbmFsTGF5ZXJPcmRlcklkeCIsIm5ld0xhYmVsIiwicG9zdGZpeCIsIkxBWUVSX0lEX0xFTkdUSCIsIm5leHRTdGF0ZSIsIm5ld0xheWVyT3JkZXJJZHgiLCJuZXdMYXllck9yZGVyIiwicmVvcmRlckxheWVyVXBkYXRlciIsIm9yZGVyIiwicmVtb3ZlRGF0YXNldFVwZGF0ZXIiLCJkYXRhc2V0S2V5IiwibmV3RGF0YXNldHMiLCJpbmRleGVzIiwicmVkdWNlIiwibGlzdE9mSW5kZXhlcyIsImluZGV4IiwicHVzaCIsImN1cnJlbnRTdGF0ZSIsImluZGV4Q291bnRlciIsImN1cnJlbnRJbmRleCIsImZpZWxkcyIsInVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyIiwic2hvd0RhdGFzZXRUYWJsZVVwZGF0ZXIiLCJ1cGRhdGVUYWJsZUNvbG9yVXBkYXRlciIsIm5ld0NvbG9yIiwiZXhpc3RpbmciLCJ1cGRhdGVUYWJsZUNvbG9yIiwicmVzZXRNYXBDb25maWdVcGRhdGVyIiwiaW5pdGlhbFN0YXRlIiwicmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIiLCJwYXlsb2FkIiwidmVyc2lvbiIsIm9wdGlvbnMiLCJ2aXNTdGF0ZSIsImtlZXBFeGlzdGluZ0NvbmZpZyIsIm1lcmdlZFN0YXRlIiwibWVyZ2VyIiwibWVyZ2UiLCJsYXllckhvdmVyVXBkYXRlciIsImluZm8iLCJpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXIiLCJjb250cmFkaWN0IiwiZm9yRWFjaCIsImsiLCJsYXllckNsaWNrVXBkYXRlciIsInBpbm5lZCIsInBpY2tlZCIsIm1hcENsaWNrVXBkYXRlciIsIm1vdXNlTW92ZVVwZGF0ZXIiLCJldnQiLCJ2YWx1ZXMiLCJzb21lIiwicG9pbnQiLCJtb3VzZVBvc2l0aW9uIiwibG5nTGF0IiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwiY2xvc2VTcGVjaWZpY01hcEF0SW5kZXgiLCJ0b2dnbGVMYXllckZvck1hcFVwZGF0ZXIiLCJtYXBJbmRleCIsInNtIiwidXBkYXRlVmlzRGF0YVVwZGF0ZXIiLCJuZXdEYXRhRW50cmllcyIsImFjY3UiLCJyZXN0IiwiZGF0YUVtcHR5IiwicHJldmlvdXNTdGF0ZSIsInRvTWVyZ2VQcm9wIiwidG9NZXJnZSIsIm5ld0xheWVycyIsImF1dG9DcmVhdGVMYXllcnMiLCJhZGREZWZhdWx0TGF5ZXJzIiwidG9vbHRpcEZpZWxkcyIsImFkZERlZmF1bHRUb29sdGlwcyIsInVwZGF0ZWRTdGF0ZSIsInJlbmFtZURhdGFzZXRVcGRhdGVyIiwiaW5kZXhUb1JldHJpZXZlIiwibWFwTGF5ZXJzIiwibG9hZEZpbGVzVXBkYXRlciIsImZpbGVzIiwib25GaW5pc2giLCJsb2FkRmlsZXNTdWNjZXNzIiwiZnJvbSIsImluaXRpYWxGaWxlTG9hZGluZ1Byb2dyZXNzIiwiZmlsZUNhY2hlIiwiZmlsZXNUb0xvYWQiLCJsb2FkTmV4dEZpbGVVcGRhdGVyIiwibG9hZEZpbGVTdGVwU3VjY2Vzc1VwZGF0ZXIiLCJmaWxlTmFtZSIsInN0YXRlV2l0aFByb2dyZXNzIiwidXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIiLCJwcm9ncmVzcyIsInBlcmNlbnQiLCJtZXNzYWdlIiwic3RhdGVXaXRoQ2FjaGUiLCJsb2FkTmV4dEZpbGUiLCJmaWxlIiwicmVtYWluaW5nRmlsZXNUb0xvYWQiLCJtYWtlTG9hZEZpbGVUYXNrIiwiYmltYXAiLCJnZW4iLCJjb250ZW50IiwiZXJyIiwicHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlciIsInBhcnNlUHJvZ3Jlc3MiLCJwcmV2UHJvZ3Jlc3MiLCJuZXh0RmlsZUJhdGNoVXBkYXRlciIsImFjY3VtdWxhdGVkIiwibmV4dCIsImRvbmUiLCJsb2FkRmlsZXNFcnJVcGRhdGVyIiwiYXBwbHlDUFVGaWx0ZXJVcGRhdGVyIiwiZGF0YUlkcyIsInNldE1hcEluZm9VcGRhdGVyIiwiZW1wdHkiLCJkZWZhdWx0TGF5ZXJzIiwiZm91bmRMYXllcnMiLCJjb25jYXQiLCJfIiwibWVyZ2VkIiwiZml4ZWREb21haW4iLCJhbmltYXRhYmxlTGF5ZXJzIiwiYW5pbWF0aW9uRG9tYWluIiwibWVyZ2VkRG9tYWluIiwiTWF0aCIsIm1pbiIsIm1heCIsIk51bWJlciIsIkluZmluaXR5Iiwic2V0RWRpdG9yTW9kZVVwZGF0ZXIiLCJzZXRGZWF0dXJlc1VwZGF0ZXIiLCJsYXN0RmVhdHVyZSIsInByb3BlcnRpZXMiLCJpc0Nsb3NlZCIsIkVESVQiLCJmZWF0dXJlIiwiZmlsdGVySWQiLCJmZWF0dXJlVmFsdWUiLCJmaWx0ZXJJZHgiLCJmaWwiLCJzZXRTZWxlY3RlZEZlYXR1cmVVcGRhdGVyIiwiZGVsZXRlRmVhdHVyZVVwZGF0ZXIiLCJzZXRQb2x5Z29uRmlsdGVyTGF5ZXJVcGRhdGVyIiwibmV3TGF5ZXJJZCIsIm5vbmVGaWx0ZXJGZWF0dXJlIiwiaXNMYXllckluY2x1ZGVkIiwic29ydFRhYmxlQ29sdW1uVXBkYXRlciIsImNvbHVtbiIsInNvcnRNb2RlIiwiY3VycmVudE1vZGUiLCJTT1JUX09SREVSIiwibSIsIkFTQ0VORElORyIsInNvcnRlZCIsInBpblRhYmxlQ29sdW1uVXBkYXRlciIsImNvcHlUYWJsZUNvbHVtblVwZGF0ZXIiLCJmaWVsZElkeCIsInRleHQiLCJkYXRhQ29udGFpbmVyIiwicm93IiwidmFsdWVBdCIsImpvaW4iLCJ0b2dnbGVFZGl0b3JWaXNpYmlsaXR5VXBkYXRlciIsInNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyIiwiRklMVEVSX1RZUEVTIiwidGltZVJhbmdlIiwidXBkYXRlcyIsImNoZWNrVGltZUNvbmZpZ0FyZ3MiLCJhbGxvd2VkIiwic2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnVXBkYXRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBY0E7O0FBMEJBOztBQVFBOztBQUNBOztBQVFBOztBQUVBOztBQUtBOztBQUNBOztBQVNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0EsSUFBTUEsZ0JBQWdCLEdBQUcsSUFBekI7QUFDQTs7QUFFTyxJQUFNQyx3QkFBMkMsR0FBRztBQUN6REMsRUFBQUEsT0FBTyxFQUFFO0FBQ1BDLElB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O0FBRUQsTUFBTW9ULE9BQU8sR0FBR0MsbUJBQW1CLENBQUNuWCxNQUFELENBQW5DO0FBRUEsU0FBTyw0QkFBTSxTQUFOLEVBQWlCLDRCQUFNLDZCQUFPa1gsT0FBUCxFQUFnQnhOLFNBQWhCLENBQU4sQ0FBakIsRUFBb0Q1RixLQUFwRCxDQUFQO0FBQ0Q7O0FBRUQsU0FBU3FULG1CQUFULENBQTZCblgsTUFBN0IsRUFBcUM7QUFDbkMsTUFBTW9YLE9BQU8sR0FBRyxDQUFDLFlBQUQsRUFBZSxVQUFmLENBQWhCO0FBQ0EsU0FBT25TLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZbEYsTUFBWixFQUFvQjBOLE1BQXBCLENBQTJCLFVBQUNpRCxJQUFELEVBQU8xSixJQUFQLEVBQWdCO0FBQ2hELFFBQUksQ0FBQ21RLE9BQU8sQ0FBQ3pRLFFBQVIsQ0FBaUJNLElBQWpCLENBQUwsRUFBNkI7QUFDM0JzQixzQkFBUUMsS0FBUiwwRkFDb0Z2QixJQURwRjs7QUFHQSxhQUFPMEosSUFBUDtBQUNELEtBTitDLENBUWhEOzs7QUFDQUEsSUFBQUEsSUFBSSxDQUFDMUosSUFBRCxDQUFKLEdBQWFqSCxNQUFNLENBQUNpSCxJQUFELENBQW5CO0FBQ0EsV0FBTzBKLElBQVA7QUFDRCxHQVhNLEVBV0osRUFYSSxDQUFQO0FBWUQ7QUFDRDtBQUNBO0FBQ0E7OztBQUNPLFNBQVMwRyxrQ0FBVCxDQUNMdlQsS0FESyxVQUdLO0FBQUEsTUFEVDlELE1BQ1MsVUFEVEEsTUFDUzs7QUFDVixNQUFJLENBQUNBLE1BQUwsRUFBYTtBQUNYLFdBQU84RCxLQUFQO0FBQ0Q7O0FBQ0QsTUFBTW9ULE9BQU8sR0FBR0MsbUJBQW1CLENBQUNuWCxNQUFELENBQW5DO0FBQ0EsU0FBTyw0QkFBTSxpQkFBTixFQUF5Qiw2QkFBT2tYLE9BQVAsQ0FBekIsRUFBMENwVCxLQUExQyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQge2Rpc2FibGVTdGFja0NhcHR1cmluZywgd2l0aFRhc2t9IGZyb20gJ3JlYWN0LXBhbG0vdGFza3MnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC51bmlxJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoLmdldCc7XG5pbXBvcnQgeG9yIGZyb20gJ2xvZGFzaC54b3InO1xuaW1wb3J0IGNvcHkgZnJvbSAnY29weS10by1jbGlwYm9hcmQnO1xuLy8gVGFza3NcbmltcG9ydCB7TE9BRF9GSUxFX1RBU0ssIFVOV1JBUF9UQVNLLCBQUk9DRVNTX0ZJTEVfREFUQSwgREVMQVlfVEFTS30gZnJvbSAnQGtlcGxlci5nbC90YXNrcyc7XG4vLyBBY3Rpb25zXG5pbXBvcnQge1xuICBsb2FkRmlsZXNFcnIsXG4gIGxvYWRGaWxlc1N1Y2Nlc3MsXG4gIGxvYWRGaWxlU3RlcFN1Y2Nlc3MsXG4gIGxvYWROZXh0RmlsZSxcbiAgbmV4dEZpbGVCYXRjaCxcbiAgUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQsXG4gIFZpc1N0YXRlQWN0aW9ucyxcbiAgTWFwU3RhdGVBY3Rpb25zLFxuICBwcm9jZXNzRmlsZUNvbnRlbnQsXG4gIEFjdGlvblR5cGVzXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5cbi8vIFV0aWxzXG5pbXBvcnQge1xuICBzZXQsXG4gIHRvQXJyYXksXG4gIGFycmF5SW5zZXJ0LFxuICBnZW5lcmF0ZUhhc2hJZCxcbiAgYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcCxcbiAgY29tcHV0ZVNwbGl0TWFwTGF5ZXJzLFxuICByZW1vdmVMYXllckZyb21TcGxpdE1hcHMsXG4gIGlzUmdiQ29sb3IsXG4gIHBhcnNlRmllbGRWYWx1ZSxcbiAgYXBwbHlGaWx0ZXJGaWVsZE5hbWUsXG4gIGFwcGx5RmlsdGVyc1RvRGF0YXNldHMsXG4gIGZlYXR1cmVUb0ZpbHRlclZhbHVlLFxuICBmaWx0ZXJEYXRhc2V0Q1BVLFxuICBGSUxURVJfVVBEQVRFUl9QUk9QUyxcbiAgZ2VuZXJhdGVQb2x5Z29uRmlsdGVyLFxuICBnZXREZWZhdWx0RmlsdGVyLFxuICBnZXRGaWx0ZXJJZEluRmVhdHVyZSxcbiAgZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyLFxuICBpc0luUmFuZ2UsXG4gIExJTUlURURfRklMVEVSX0VGRkVDVF9QUk9QUyxcbiAgdXBkYXRlRmlsdGVyRGF0YUlkLFxuICBnZXRGaWx0ZXJQbG90LFxuICBnZXREZWZhdWx0RmlsdGVyUGxvdFR5cGVcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7XG4gIGlzVmFsaWRNZXJnZXIsXG4gIFZJU19TVEFURV9NRVJHRVJTLFxuICB2YWxpZGF0ZUxheWVyV2l0aERhdGEsXG4gIGNyZWF0ZUxheWVyRnJvbUNvbmZpZyxcbiAgc2VyaWFsaXplTGF5ZXJcbn0gZnJvbSAnLi92aXMtc3RhdGUtbWVyZ2VyJztcblxuaW1wb3J0IHtMYXllciwgTGF5ZXJDbGFzc2VzLCBMQVlFUl9JRF9MRU5HVEh9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7XG4gIEVESVRPUl9NT0RFUyxcbiAgU09SVF9PUkRFUixcbiAgRklMVEVSX1RZUEVTLFxuICBNQVhfREVGQVVMVF9UT09MVElQUyxcbiAgREVGQVVMVF9URVhUX0xBQkVMLFxuICBDT01QQVJFX1RZUEVTXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7cGlja18sIG1lcmdlXywgc3dhcF99IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5cbmltcG9ydCBLZXBsZXJHTFNjaGVtYSwge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge0ZpbHRlciwgSW50ZXJhY3Rpb25Db25maWcsIEFuaW1hdGlvbkNvbmZpZywgRWRpdG9yfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7TG9hZGVyfSBmcm9tICdAbG9hZGVycy5nbC9sb2FkZXItdXRpbHMnO1xuXG5pbXBvcnQge2NhbGN1bGF0ZUxheWVyRGF0YSwgZmluZERlZmF1bHRMYXllcn0gZnJvbSAnLi9sYXllci11dGlscyc7XG5pbXBvcnQge1xuICBjb3B5VGFibGVBbmRVcGRhdGUsXG4gIERhdGFzZXRzLFxuICBwaW5UYWJsZUNvbHVtbnMsXG4gIHNvcnREYXRhc2V0QnlDb2x1bW4sXG4gIGFzc2lnbkdwdUNoYW5uZWwsXG4gIHNldEZpbHRlckdwdU1vZGUsXG4gIGNyZWF0ZU5ld0RhdGFFbnRyeVxufSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7ZmluZEZpZWxkc1RvU2hvd30gZnJvbSAnLi9pbnRlcmFjdGlvbi11dGlscyc7XG5cbi8vIHJlYWN0LXBhbG1cbi8vIGRpc2FibGUgY2FwdHVyZSBleGNlcHRpb24gZm9yIHJlYWN0LXBhbG0gY2FsbCB0byB3aXRoVGFza1xuZGlzYWJsZVN0YWNrQ2FwdHVyaW5nKCk7XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGB2aXNTdGF0ZWAgcmVkdWNlci4gQ2FuIGJlIHVzZWQgaW4geW91ciByb290IHJlZHVjZXIgdG8gZGlyZWN0bHkgbW9kaWZ5IGtlcGxlci5nbCdzIHN0YXRlLlxuICogUmVhZCBtb3JlIGFib3V0IFtVc2luZyB1cGRhdGVyc10oLi4vYWR2YW5jZWQtdXNhZ2UvdXNpbmctdXBkYXRlcnMubWQpXG4gKlxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7dmlzU3RhdGVVcGRhdGVyc30gZnJvbSAna2VwbGVyLmdsL3JlZHVjZXJzJztcbiAqIC8vIFJvb3QgUmVkdWNlclxuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogIGtlcGxlckdsOiBrZXBsZXJHbFJlZHVjZXIsXG4gKiAgYXBwOiBhcHBSZWR1Y2VyXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBjb21wb3NlZFJlZHVjZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICogIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAqICAgIGNhc2UgJ0NMSUNLX0JVVFRPTic6XG4gKiAgICAgIHJldHVybiB7XG4gKiAgICAgICAgLi4uc3RhdGUsXG4gKiAgICAgICAga2VwbGVyR2w6IHtcbiAqICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLFxuICogICAgICAgICAgZm9vOiB7XG4gKiAgICAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbC5mb28sXG4gKiAgICAgICAgICAgICB2aXNTdGF0ZTogdmlzU3RhdGVVcGRhdGVycy5lbmxhcmdlRmlsdGVyVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgc3RhdGUua2VwbGVyR2wuZm9vLnZpc1N0YXRlLFxuICogICAgICAgICAgICAgICB7aWR4OiAwfVxuICogICAgICAgICAgICAgKVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCB2aXNTdGF0ZVVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZzogSW50ZXJhY3Rpb25Db25maWcgPSB7XG4gIHRvb2x0aXA6IHtcbiAgICBpZDogJ3Rvb2x0aXAnLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLnRvb2x0aXAnLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgY29uZmlnOiB7XG4gICAgICBmaWVsZHNUb1Nob3c6IHt9LFxuICAgICAgY29tcGFyZU1vZGU6IGZhbHNlLFxuICAgICAgY29tcGFyZVR5cGU6IENPTVBBUkVfVFlQRVMuQUJTT0xVVEVcbiAgICB9XG4gIH0sXG4gIGdlb2NvZGVyOiB7XG4gICAgaWQ6ICdnZW9jb2RlcicsXG4gICAgbGFiZWw6ICdpbnRlcmFjdGlvbnMuZ2VvY29kZXInLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIHBvc2l0aW9uOiBudWxsXG4gIH0sXG4gIGJydXNoOiB7XG4gICAgaWQ6ICdicnVzaCcsXG4gICAgbGFiZWw6ICdpbnRlcmFjdGlvbnMuYnJ1c2gnLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIGNvbmZpZzoge1xuICAgICAgLy8gc2l6ZSBpcyBpbiBrbVxuICAgICAgc2l6ZTogMC41XG4gICAgfVxuICB9LFxuICBjb29yZGluYXRlOiB7XG4gICAgaWQ6ICdjb29yZGluYXRlJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy5jb29yZGluYXRlJyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBwb3NpdGlvbjogbnVsbFxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTklNQVRJT05fQ09ORklHOiBBbmltYXRpb25Db25maWcgPSB7XG4gIGRvbWFpbjogbnVsbCxcbiAgY3VycmVudFRpbWU6IG51bGwsXG4gIHNwZWVkOiAxLFxuICBpc0FuaW1hdGluZzogZmFsc2UsXG4gIHRpbWVGb3JtYXQ6IG51bGwsXG4gIHRpbWV6b25lOiBudWxsLFxuICBkZWZhdWx0VGltZUZvcm1hdDogbnVsbFxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRURJVE9SOiBFZGl0b3IgPSB7XG4gIG1vZGU6IEVESVRPUl9NT0RFUy5EUkFXX1BPTFlHT04sXG4gIGZlYXR1cmVzOiBbXSxcbiAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsLFxuICB2aXNpYmxlOiB0cnVlXG59O1xuXG4vKipcbiAqIERlZmF1bHQgaW5pdGlhbCBgdmlzU3RhdGVgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQGNvbnN0YW50XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBJTklUSUFMX1ZJU19TVEFURTogVmlzU3RhdGUgPSB7XG4gIC8vIG1hcCBpbmZvXG4gIG1hcEluZm86IHtcbiAgICB0aXRsZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnXG4gIH0sXG4gIC8vIGxheWVyc1xuICBsYXllcnM6IFtdLFxuICBsYXllckRhdGE6IFtdLFxuICBsYXllclRvQmVNZXJnZWQ6IFtdLFxuICBsYXllck9yZGVyOiBbXSxcblxuICAvLyBmaWx0ZXJzXG4gIGZpbHRlcnM6IFtdLFxuICBmaWx0ZXJUb0JlTWVyZ2VkOiBbXSxcblxuICAvLyBhIGNvbGxlY3Rpb24gb2YgbXVsdGlwbGUgZGF0YXNldFxuICBkYXRhc2V0czoge30sXG4gIGVkaXRpbmdEYXRhc2V0OiB1bmRlZmluZWQsXG5cbiAgaW50ZXJhY3Rpb25Db25maWc6IGRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZyxcbiAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiB1bmRlZmluZWQsXG5cbiAgbGF5ZXJCbGVuZGluZzogJ25vcm1hbCcsXG4gIGhvdmVySW5mbzogdW5kZWZpbmVkLFxuICBjbGlja2VkOiB1bmRlZmluZWQsXG4gIG1vdXNlUG9zOiB7fSxcbiAgbWF4RGVmYXVsdFRvb2x0aXBzOiBNQVhfREVGQVVMVF9UT09MVElQUyxcblxuICAvLyB0aGlzIGlzIHVzZWQgd2hlbiB1c2VyIHNwbGl0IG1hcHNcbiAgc3BsaXRNYXBzOiBbXG4gICAgLy8gdGhpcyB3aWxsIGNvbnRhaW4gYSBsaXN0IG9mIG9iamVjdHMgdG9cbiAgICAvLyBkZXNjcmliZSB0aGUgc3RhdGUgb2YgbGF5ZXIgYXZhaWxhYmlsaXR5IGFuZCB2aXNpYmlsaXR5IGZvciBlYWNoIG1hcFxuICAgIC8vIFtcbiAgICAvLyAgIHtcbiAgICAvLyAgICAgIGxheWVyczoge2xheWVyX2lkOiB0cnVlIHwgZmFsc2V9XG4gICAgLy8gICB9XG4gICAgLy8gXVxuICBdLFxuICBzcGxpdE1hcHNUb0JlTWVyZ2VkOiBbXSxcblxuICAvLyBkZWZhdWx0cyBsYXllciBjbGFzc2VzXG4gIGxheWVyQ2xhc3NlczogTGF5ZXJDbGFzc2VzLFxuXG4gIC8vIGRlZmF1bHQgYW5pbWF0aW9uXG4gIC8vIHRpbWUgaW4gdW5peCB0aW1lc3RhbXAgKG1pbGxpc2Vjb25kcykgKHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBFcG9jaClcbiAgYW5pbWF0aW9uQ29uZmlnOiBERUZBVUxUX0FOSU1BVElPTl9DT05GSUcsXG5cbiAgZWRpdG9yOiBERUZBVUxUX0VESVRPUixcblxuICBmaWxlTG9hZGluZzogZmFsc2UsXG4gIGZpbGVMb2FkaW5nUHJvZ3Jlc3M6IHt9LFxuXG4gIGxvYWRlcnM6IFtdLFxuICBsb2FkT3B0aW9uczoge30sXG5cbiAgLy8gdmlzU3RhdGVNZXJnZXJzXG4gIG1lcmdlcnM6IFZJU19TVEFURV9NRVJHRVJTLFxuXG4gIC8vIGtlcGxlciBzY2hlbWFzXG4gIHNjaGVtYTogS2VwbGVyR0xTY2hlbWFcbn07XG5cbi8qKlxuICogVXBkYXRlIHN0YXRlIHdpdGggdXBkYXRlZCBsYXllciBhbmQgbGF5ZXJEYXRhXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtsYXllckRhdGEsIGxheWVyLCBpZHh9OiB7bGF5ZXJEYXRhPzogYW55OyBsYXllcjogTGF5ZXI7IGlkeDogbnVtYmVyfVxuKTogVmlzU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogc3RhdGUubGF5ZXJzLm1hcCgobHlyLCBpKSA9PiAoaSA9PT0gaWR4ID8gbGF5ZXIgOiBseXIpKSxcbiAgICBsYXllckRhdGE6IGxheWVyRGF0YVxuICAgICAgPyBzdGF0ZS5sYXllckRhdGEubWFwKChkLCBpKSA9PiAoaSA9PT0gaWR4ID8gbGF5ZXJEYXRhIDogZCkpXG4gICAgICA6IHN0YXRlLmxheWVyRGF0YVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVPbkxheWVyVmlzaWJpbGl0eUNoYW5nZTxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBsYXllcjogTGF5ZXIpOiBTIHtcbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIGlmIChzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoKSB7XG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNwbGl0TWFwczogbGF5ZXIuY29uZmlnLmlzVmlzaWJsZVxuICAgICAgICA/IGFkZE5ld0xheWVyc1RvU3BsaXRNYXAoc3RhdGUuc3BsaXRNYXBzLCBsYXllcilcbiAgICAgICAgOiByZW1vdmVMYXllckZyb21TcGxpdE1hcHMoc3RhdGUuc3BsaXRNYXBzLCBsYXllcilcbiAgICB9O1xuICB9XG5cbiAgaWYgKGxheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCkge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlQW5pbWF0aW9uRG9tYWluKHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYmFzZSBjb25maWc6IGRhdGFJZCwgbGFiZWwsIGNvbHVtbiwgaXNWaXNpYmxlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcn0gPSBhY3Rpb247XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG4gIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoYWN0aW9uLm5ld0NvbmZpZyk7XG4gIGlmICh0eXBlb2YgYWN0aW9uLm5ld0NvbmZpZy5kYXRhSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3Qge2RhdGFJZCwgLi4ucmVzdENvbmZpZ30gPSBhY3Rpb24ubmV3Q29uZmlnO1xuICAgIGNvbnN0IHN0YXRlV2l0aERhdGFJZCA9IGxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgICAgb2xkTGF5ZXIsXG4gICAgICBuZXdDb25maWc6IHtkYXRhSWR9XG4gICAgfSk7XG4gICAgY29uc3QgbmV4dExheWVyID0gc3RhdGVXaXRoRGF0YUlkLmxheWVycy5maW5kKGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICAgIHJldHVybiBuZXh0TGF5ZXIgJiYgT2JqZWN0LmtleXMocmVzdENvbmZpZykubGVuZ3RoXG4gICAgICA/IGxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZVdpdGhEYXRhSWQsIHtvbGRMYXllcjogbmV4dExheWVyLCBuZXdDb25maWc6IHJlc3RDb25maWd9KVxuICAgICAgOiBzdGF0ZVdpdGhEYXRhSWQ7XG4gIH1cblxuICBsZXQgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyhhY3Rpb24ubmV3Q29uZmlnKTtcblxuICBsZXQgbGF5ZXJEYXRhO1xuXG4gIC8vIGxldCBuZXdMYXllcjtcbiAgaWYgKG5ld0xheWVyLnNob3VsZENhbGN1bGF0ZUxheWVyRGF0YShwcm9wcykpIHtcbiAgICBjb25zdCBvbGRMYXllckRhdGEgPSBzdGF0ZS5sYXllckRhdGFbaWR4XTtcbiAgICBjb25zdCB1cGRhdGVMYXllckRhdGFSZXN1bHQgPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlLCBvbGRMYXllckRhdGEpO1xuXG4gICAgbGF5ZXJEYXRhID0gdXBkYXRlTGF5ZXJEYXRhUmVzdWx0LmxheWVyRGF0YTtcbiAgICBuZXdMYXllciA9IHVwZGF0ZUxheWVyRGF0YVJlc3VsdC5sYXllcjtcbiAgfVxuXG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICBpZiAoJ2lzVmlzaWJsZScgaW4gYWN0aW9uLm5ld0NvbmZpZykge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlU3RhdGVPbkxheWVyVmlzaWJpbGl0eUNoYW5nZShzdGF0ZSwgbmV3TGF5ZXIpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXdTdGF0ZSwge1xuICAgIGxheWVyOiBuZXdMYXllcixcbiAgICBsYXllckRhdGEsXG4gICAgaWR4XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRPclJlbW92ZVRleHRMYWJlbHMobmV3RmllbGRzLCB0ZXh0TGFiZWwpIHtcbiAgbGV0IG5ld1RleHRMYWJlbCA9IHRleHRMYWJlbC5zbGljZSgpO1xuXG4gIGNvbnN0IGN1cnJlbnRGaWVsZHMgPSB0ZXh0TGFiZWwubWFwKHRsID0+IHRsLmZpZWxkICYmIHRsLmZpZWxkLm5hbWUpLmZpbHRlcihkID0+IGQpO1xuXG4gIGNvbnN0IGFkZEZpZWxkcyA9IG5ld0ZpZWxkcy5maWx0ZXIoZiA9PiAhY3VycmVudEZpZWxkcy5pbmNsdWRlcyhmLm5hbWUpKTtcbiAgY29uc3QgZGVsZXRlRmllbGRzID0gY3VycmVudEZpZWxkcy5maWx0ZXIoZiA9PiAhbmV3RmllbGRzLmZpbmQoZmQgPT4gZmQubmFtZSA9PT0gZikpO1xuXG4gIC8vIGRlbGV0ZVxuICBuZXdUZXh0TGFiZWwgPSBuZXdUZXh0TGFiZWwuZmlsdGVyKHRsID0+IHRsLmZpZWxkICYmICFkZWxldGVGaWVsZHMuaW5jbHVkZXModGwuZmllbGQubmFtZSkpO1xuICBuZXdUZXh0TGFiZWwgPSAhbmV3VGV4dExhYmVsLmxlbmd0aCA/IFtERUZBVUxUX1RFWFRfTEFCRUxdIDogbmV3VGV4dExhYmVsO1xuXG4gIC8vIGFkZFxuICBuZXdUZXh0TGFiZWwgPSBbXG4gICAgLi4ubmV3VGV4dExhYmVsLmZpbHRlcih0bCA9PiB0bC5maWVsZCksXG4gICAgLi4uYWRkRmllbGRzLm1hcChhZiA9PiAoe1xuICAgICAgLi4uREVGQVVMVF9URVhUX0xBQkVMLFxuICAgICAgZmllbGQ6IGFmXG4gICAgfSkpXG4gIF07XG5cbiAgcmV0dXJuIG5ld1RleHRMYWJlbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVGV4dExhYmVsUHJvcEFuZFZhbHVlKGlkeCwgcHJvcCwgdmFsdWUsIHRleHRMYWJlbCkge1xuICBpZiAoIXRleHRMYWJlbFtpZHhdLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgcmV0dXJuIHRleHRMYWJlbDtcbiAgfVxuXG4gIGxldCBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwuc2xpY2UoKTtcblxuICBpZiAocHJvcCAmJiAodmFsdWUgfHwgdGV4dExhYmVsLmxlbmd0aCA9PT0gMSkpIHtcbiAgICBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwubWFwKCh0bCwgaSkgPT4gKGkgPT09IGlkeCA/IHsuLi50bCwgW3Byb3BdOiB2YWx1ZX0gOiB0bCkpO1xuICB9IGVsc2UgaWYgKHByb3AgPT09ICdmaWVsZCcgJiYgdmFsdWUgPT09IG51bGwgJiYgdGV4dExhYmVsLmxlbmd0aCA+IDEpIHtcbiAgICAvLyByZW1vdmUgbGFiZWwgd2hlbiBmaWVsZCB2YWx1ZSBpcyBzZXQgdG8gbnVsbFxuICAgIG5ld1RleHRMYWJlbC5zcGxpY2UoaWR4LCAxKTtcbiAgfVxuXG4gIHJldHVybiBuZXdUZXh0TGFiZWw7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGJhc2UgY29uZmlnOiBkYXRhSWQsIGxhYmVsLCBjb2x1bW4sIGlzVmlzaWJsZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJUZXh0TGFiZWxDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVGV4dExhYmVsQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXIsIGlkeCwgcHJvcCwgdmFsdWV9ID0gYWN0aW9uO1xuICBjb25zdCB7dGV4dExhYmVsfSA9IG9sZExheWVyLmNvbmZpZztcblxuICBsZXQgbmV3VGV4dExhYmVsID0gdGV4dExhYmVsLnNsaWNlKCk7XG4gIGlmICghdGV4dExhYmVsW2lkeF0gJiYgaWR4ID09PSB0ZXh0TGFiZWwubGVuZ3RoKSB7XG4gICAgLy8gaWYgaWR4IGlzIHNldCB0byBsZW5ndGgsIGFkZCBlbXB0eSB0ZXh0IGxhYmVsXG4gICAgbmV3VGV4dExhYmVsID0gWy4uLnRleHRMYWJlbCwgREVGQVVMVF9URVhUX0xBQkVMXTtcbiAgfVxuXG4gIGlmIChpZHggPT09ICdhbGwnICYmIHByb3AgPT09ICdmaWVsZHMnKSB7XG4gICAgbmV3VGV4dExhYmVsID0gYWRkT3JSZW1vdmVUZXh0TGFiZWxzKHZhbHVlLCB0ZXh0TGFiZWwpO1xuICB9IGVsc2Uge1xuICAgIG5ld1RleHRMYWJlbCA9IHVwZGF0ZVRleHRMYWJlbFByb3BBbmRWYWx1ZShpZHgsIHByb3AsIHZhbHVlLCBuZXdUZXh0TGFiZWwpO1xuICB9XG4gIC8vIHVwZGF0ZSB0ZXh0IGxhYmVsIHByb3AgYW5kIHZhbHVlXG4gIHJldHVybiBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoc3RhdGUsIHtcbiAgICBvbGRMYXllcixcbiAgICBuZXdDb25maWc6IHt0ZXh0TGFiZWw6IG5ld1RleHRMYWJlbH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhpc3RpbmdMYXllcldpdGhEYXRhKGRhdGFzZXQsIGxheWVyQ2xhc3NlcywgbGF5ZXIpIHtcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSBzZXJpYWxpemVMYXllcihsYXllcik7XG4gIHJldHVybiB2YWxpZGF0ZUxheWVyV2l0aERhdGEoZGF0YXNldCwgbG9hZGVkTGF5ZXIsIGxheWVyQ2xhc3Nlcywge1xuICAgIGFsbG93RW1wdHlDb2x1bW46IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGNvbmZpZyBkYXRhSWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IHtcbiAgICBvbGRMYXllcjogTGF5ZXI7XG4gICAgbmV3Q29uZmlnOiB7XG4gICAgICBkYXRhSWQ6IHN0cmluZztcbiAgICB9O1xuICB9XG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3Q29uZmlnfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFJZH0gPSBuZXdDb25maWc7XG5cbiAgaWYgKCFvbGRMYXllciB8fCAhc3RhdGUuZGF0YXNldHNbZGF0YUlkXSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuXG4gIGxldCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtkYXRhSWR9KTtcbiAgLy8gdGhpcyBtYXkgaGFwcGVuIHdoZW4gYSBsYXllciBpcyBuZXcgKHR5cGU6IG51bGwgYW5kIG5vIGNvbHVtbnMpIGJ1dCBpdCdzIG5vdCByZWFkeSB0byBiZSBzYXZlZFxuICBpZiAobmV3TGF5ZXIuaXNWYWxpZFRvU2F2ZSgpKSB7XG4gICAgY29uc3QgdmFsaWRhdGVkID0gdmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEoXG4gICAgICBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLFxuICAgICAgc3RhdGUubGF5ZXJDbGFzc2VzLFxuICAgICAgbmV3TGF5ZXJcbiAgICApO1xuICAgIC8vIGlmIGNhbnQgdmFsaWRhdGUgaXQgd2l0aCBkYXRhIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICBpZiAoIXZhbGlkYXRlZCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPOiBjaGVja2luZyBvbGRMYXllci50eXBlICE9PSBudWxsXG4gICAgICBuZXdMYXllciA9IG5ldyBzdGF0ZS5sYXllckNsYXNzZXNbb2xkTGF5ZXIudHlwZV0oe2RhdGFJZCwgaWQ6IG9sZExheWVyLmlkfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheWVyID0gdmFsaWRhdGVkO1xuICAgIH1cbiAgfVxuXG4gIG5ld0xheWVyID0gbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIGlzVmlzaWJsZTogb2xkTGF5ZXIuY29uZmlnLmlzVmlzaWJsZSxcbiAgICBpc0NvbmZpZ0FjdGl2ZTogdHJ1ZVxuICB9KTtcblxuICBuZXdMYXllci51cGRhdGVMYXllckRvbWFpbihzdGF0ZS5kYXRhc2V0cyk7XG4gIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xufVxuXG5mdW5jdGlvbiBzZXRJbml0aWFsTGF5ZXJDb25maWcobGF5ZXIsIGRhdGFzZXRzLCBsYXllckNsYXNzZXMpIHtcbiAgbGV0IG5ld0xheWVyID0gbGF5ZXI7XG4gIGlmICghT2JqZWN0LmtleXMoZGF0YXNldHMpLmxlbmd0aCkge1xuICAgIC8vIG5vIGRhdGEgaXMgbG9hZGVkXG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG4gIGlmICghbGF5ZXIuY29uZmlnLmRhdGFJZCkge1xuICAgIC8vIHNldCBsYXllciBkYXRhSWRcbiAgICBuZXdMYXllciA9IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtkYXRhSWQ6IE9iamVjdC5rZXlzKGRhdGFzZXRzKVswXX0pO1xuICB9XG4gIGNvbnN0IGRhdGFzZXQgPSBkYXRhc2V0c1tuZXdMYXllci5jb25maWcuZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG5cbiAgLy8gZmluZCBkZWZhdXQgbGF5ZXIgcHJvcHNcbiAgY29uc3QgcmVzdWx0ID1cbiAgICB0eXBlb2YgbGF5ZXJDbGFzc2VzW25ld0xheWVyLnR5cGVdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBsYXllckNsYXNzZXNbbmV3TGF5ZXIudHlwZV0uZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIFtdKVxuICAgICAgOiB7cHJvcHM6IFtdfTtcblxuICAvLyBhbiBhcnJheSBvZiBwb3NzaWJsZSBwcm9wcywgdXNlIDFzdCBvbmVcbiAgY29uc3QgcHJvcHMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHQucHJvcHMgfHwgW107XG5cbiAgaWYgKHByb3BzLmxlbmd0aCkge1xuICAgIG5ld0xheWVyID0gbmV3IGxheWVyQ2xhc3Nlc1tsYXllci50eXBlXSh7XG4gICAgICAuLi5wcm9wc1swXSxcbiAgICAgIGxhYmVsOiBuZXdMYXllci5jb25maWcubGFiZWwsXG4gICAgICBkYXRhSWQ6IG5ld0xheWVyLmNvbmZpZy5kYXRhSWQsXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogbmV3TGF5ZXIuY29uZmlnLmlzQ29uZmlnQWN0aXZlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHlwZW9mIG5ld0xheWVyLnNldEluaXRpYWxMYXllckNvbmZpZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBuZXdMYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICAgIDogbmV3TGF5ZXI7XG4gIH1cblxuICByZXR1cm4gbmV3TGF5ZXI7XG59XG4vKipcbiAqIFVwZGF0ZSBsYXllciB0eXBlLiBQcmV2aWV3cyBsYXllciBjb25maWcgd2lsbCBiZSBjb3BpZWQgaWYgYXBwbGljYWJsZS5cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclR5cGVDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVHlwZUNoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBuZXdUeXBlfSA9IGFjdGlvbjtcbiAgaWYgKCFvbGRMYXllcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBvbGRJZCA9IG9sZExheWVyLmlkO1xuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkSWQpO1xuXG4gIGlmICghc3RhdGUubGF5ZXJDbGFzc2VzW25ld1R5cGVdKSB7XG4gICAgQ29uc29sZS5lcnJvcihgJHtuZXdUeXBlfSBpcyBub3QgYSB2YWxpZCBsYXllciB0eXBlYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBuZXdMYXllciA9IG5ldyBzdGF0ZS5sYXllckNsYXNzZXNbbmV3VHlwZV0oe1xuICAgIC8vIGtlZXAgb2xkIGxheWVyIGxhYmxlIGFuZCBpc0NvbmZpZ0FjdGl2ZVxuICAgIGxhYmVsOiBvbGRMYXllci5jb25maWcubGFiZWwsXG4gICAgaXNDb25maWdBY3RpdmU6IG9sZExheWVyLmNvbmZpZy5pc0NvbmZpZ0FjdGl2ZVxuICB9KTtcblxuICBpZiAoIW9sZExheWVyLnR5cGUpIHtcbiAgICAvLyBpZiBzZXR0aW5nIGxheWVyIHR5cGUgb24gYW4gZW1wdHkgbGF5ZXJcbiAgICBuZXdMYXllciA9IHNldEluaXRpYWxMYXllckNvbmZpZyhuZXdMYXllciwgc3RhdGUuZGF0YXNldHMsIHN0YXRlLmxheWVyQ2xhc3Nlcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gZ2V0IGEgbWludCBsYXllciwgd2l0aCBuZXcgaWQgYW5kIHR5cGVcbiAgICAvLyBiZWNhdXNlIGRlY2suZ2wgdXNlcyBpZCB0byBtYXRjaCBiZXR3ZWVuIG5ldyBhbmQgb2xkIGxheWVyLlxuICAgIC8vIElmIHR5cGUgaGFzIGNoYW5nZWQgYnV0IGlkIGlzIHRoZSBzYW1lLCBpdCB3aWxsIGJyZWFrXG4gICAgbmV3TGF5ZXIuYXNzaWduQ29uZmlnVG9MYXllcihvbGRMYXllci5jb25maWcsIG9sZExheWVyLnZpc0NvbmZpZ1NldHRpbmdzKTtcbiAgICBuZXdMYXllci51cGRhdGVMYXllckRvbWFpbihzdGF0ZS5kYXRhc2V0cyk7XG4gIH1cblxuICBjb25zdCB7Y2xpY2tlZCwgaG92ZXJJbmZvfSA9IHN0YXRlO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjbGlja2VkOiBvbGRMYXllci5pc0xheWVySG92ZXJlZChjbGlja2VkKSA/IHVuZGVmaW5lZCA6IGNsaWNrZWQsXG4gICAgaG92ZXJJbmZvOiBvbGRMYXllci5pc0xheWVySG92ZXJlZChob3ZlckluZm8pID8gdW5kZWZpbmVkIDogaG92ZXJJbmZvXG4gIH07XG5cbiAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBuZXdTdGF0ZSk7XG4gIG5ld1N0YXRlID0gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKG5ld1N0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG5cbiAgaWYgKGxheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCB8fCBvbGRMYXllci5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQpIHtcbiAgICBuZXdTdGF0ZSA9IHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihuZXdTdGF0ZSk7XG4gIH1cblxuICAvLyB1cGRhdGUgc3BsaXRNYXAgbGF5ZXIgaWRcbiAgaWYgKHN0YXRlLnNwbGl0TWFwcy5sZW5ndGgpIHtcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBuZXdTdGF0ZS5zcGxpdE1hcHMubWFwKHNldHRpbmdzID0+IHtcbiAgICAgICAgY29uc3Qge1tvbGRJZF06IG9sZExheWVyTWFwLCAuLi5vdGhlckxheWVyc30gPSBzZXR0aW5ncy5sYXllcnM7XG4gICAgICAgIHJldHVybiBvbGRJZCBpbiBzZXR0aW5ncy5sYXllcnNcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uc2V0dGluZ3MsXG4gICAgICAgICAgICAgIGxheWVyczoge1xuICAgICAgICAgICAgICAgIC4uLm90aGVyTGF5ZXJzLFxuICAgICAgICAgICAgICAgIFtsYXllci5pZF06IG9sZExheWVyTWFwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHNldHRpbmdzO1xuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciB2aXN1YWwgY2hhbm5lbFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3Q29uZmlnLCBjaGFubmVsfSA9IGFjdGlvbjtcbiAgaWYgKCFvbGRMYXllci5jb25maWcuZGF0YUlkKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tvbGRMYXllci5jb25maWcuZGF0YUlkXTtcblxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKG5ld0NvbmZpZyk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsKGRhdGFzZXQsIGNoYW5uZWwpO1xuXG4gIGNvbnN0IG9sZExheWVyRGF0YSA9IHN0YXRlLmxheWVyRGF0YVtpZHhdO1xuICBjb25zdCB7bGF5ZXJEYXRhLCBsYXllcn0gPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlLCBvbGRMYXllckRhdGEpO1xuXG4gIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEoc3RhdGUsIHtsYXllckRhdGEsIGxheWVyLCBpZHh9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYHZpc0NvbmZpZ2BcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJWaXNDb25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcn0gPSBhY3Rpb247XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG4gIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoYWN0aW9uLm5ld1Zpc0NvbmZpZyk7XG4gIGNvbnN0IG5ld1Zpc0NvbmZpZyA9IHtcbiAgICAuLi5vbGRMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIC4uLmFjdGlvbi5uZXdWaXNDb25maWdcbiAgfTtcblxuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHt2aXNDb25maWc6IG5ld1Zpc0NvbmZpZ30pO1xuXG4gIGlmIChuZXdMYXllci5zaG91bGRDYWxjdWxhdGVMYXllckRhdGEocHJvcHMpKSB7XG4gICAgY29uc3Qgb2xkTGF5ZXJEYXRhID0gc3RhdGUubGF5ZXJEYXRhW2lkeF07XG4gICAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgb2xkTGF5ZXJEYXRhKTtcbiAgICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXI6IG5ld0xheWVyLCBpZHh9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZmlsdGVyIHByb3BlcnR5XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyQW5pbWF0aW9uVGltZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyQW5pbWF0aW9uVGltZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIoc3RhdGUsIGFjdGlvbik7XG59XG5cbi8qKlxuICogVXBkYXRlIGZpbHRlciBhbmltYXRpb24gd2luZG93XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyQW5pbWF0aW9uV2luZG93VXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWQsIGFuaW1hdGlvbldpbmRvd306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoZiA9PlxuICAgICAgZi5pZCA9PT0gaWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgYW5pbWF0aW9uV2luZG93XG4gICAgICAgICAgfVxuICAgICAgICA6IGZcbiAgICApXG4gIH07XG59XG4vKipcbiAqIFVwZGF0ZSBmaWx0ZXIgcHJvcGVydHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldEZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2lkeCwgcHJvcCwgdmFsdWUsIHZhbHVlSW5kZXggPSAwfSA9IGFjdGlvbjtcbiAgY29uc3Qgb2xkRmlsdGVyID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuXG4gIGlmICghb2xkRmlsdGVyKSB7XG4gICAgQ29uc29sZS5lcnJvcihgZmlsdGVycy4ke2lkeH0gaXMgdW5kZWZpbmVkYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBuZXdGaWx0ZXIgPSBzZXQoW3Byb3BdLCB2YWx1ZSwgb2xkRmlsdGVyKTtcbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG5cbiAgY29uc3Qge2RhdGFJZH0gPSBuZXdGaWx0ZXI7XG5cbiAgLy8gRW5zdXJpbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBsZXQgZGF0YXNldElkcyA9IHRvQXJyYXkoZGF0YUlkKTtcblxuICBzd2l0Y2ggKHByb3ApIHtcbiAgICAvLyBUT0RPOiBOZXh0IFBSIGZvciBVSSBpZiB3ZSB1cGRhdGUgZGF0YUlkLCB3ZSBuZWVkIHRvIGNvbnNpZGVyIHR3byBjYXNlczpcbiAgICAvLyAxLiBkYXRhSWQgaXMgZW1wdHk6IGNyZWF0ZSBhIGRlZmF1bHQgZmlsdGVyXG4gICAgLy8gMi4gQWRkIGEgbmV3IGRhdGFzZXQgaWRcbiAgICBjYXNlIEZJTFRFUl9VUERBVEVSX1BST1BTLmRhdGFJZDpcbiAgICAgIC8vIGlmIHRyeWluZyB0byB1cGRhdGUgZmlsdGVyIGRhdGFJZC4gY3JlYXRlIGFuIGVtcHR5IG5ldyBmaWx0ZXJcbiAgICAgIG5ld0ZpbHRlciA9IHVwZGF0ZUZpbHRlckRhdGFJZChkYXRhSWQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEZJTFRFUl9VUERBVEVSX1BST1BTLm5hbWU6XG4gICAgICAvLyB3ZSBhcmUgc3VwcG9ydGluZyB0aGUgY3VycmVudCBmdW5jdGlvbmFsaXR5XG4gICAgICAvLyBUT0RPOiBOZXh0IFBSIGZvciBVSSBmaWx0ZXIgbmFtZSB3aWxsIG9ubHkgdXBkYXRlIGZpbHRlciBuYW1lIGJ1dCBpdCB3b24ndCBoYXZlIHNpZGUgZWZmZWN0c1xuICAgICAgLy8gd2UgYXJlIGdvbm5hIHVzZSBwYWlyIG9mIGRhdGFzZXRzIGFuZCBmaWVsZElkeCB0byB1cGRhdGUgdGhlIGZpbHRlclxuICAgICAgY29uc3QgZGF0YXNldElkID0gbmV3RmlsdGVyLmRhdGFJZFt2YWx1ZUluZGV4XTtcbiAgICAgIGNvbnN0IHtmaWx0ZXI6IHVwZGF0ZWRGaWx0ZXIsIGRhdGFzZXQ6IG5ld0RhdGFzZXR9ID0gYXBwbHlGaWx0ZXJGaWVsZE5hbWUoXG4gICAgICAgIG5ld0ZpbHRlcixcbiAgICAgICAgc3RhdGUuZGF0YXNldHNbZGF0YXNldElkXSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlSW5kZXgsXG4gICAgICAgIHttZXJnZURvbWFpbjogZmFsc2V9XG4gICAgICApO1xuICAgICAgaWYgKCF1cGRhdGVkRmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgbmV3RmlsdGVyID0gdXBkYXRlZEZpbHRlcjtcblxuICAgICAgaWYgKG5ld0ZpbHRlci5ncHUpIHtcbiAgICAgICAgbmV3RmlsdGVyID0gc2V0RmlsdGVyR3B1TW9kZShuZXdGaWx0ZXIsIHN0YXRlLmZpbHRlcnMpO1xuICAgICAgICBuZXdGaWx0ZXIgPSBhc3NpZ25HcHVDaGFubmVsKG5ld0ZpbHRlciwgc3RhdGUuZmlsdGVycyk7XG4gICAgICB9XG5cbiAgICAgIG5ld1N0YXRlID0gc2V0KFsnZGF0YXNldHMnLCBkYXRhc2V0SWRdLCBuZXdEYXRhc2V0LCBzdGF0ZSk7XG5cbiAgICAgIC8vIG9ubHkgZmlsdGVyIHRoZSBjdXJyZW50IGRhdGFzZXRcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRklMVEVSX1VQREFURVJfUFJPUFMubGF5ZXJJZDpcbiAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIG9ubHkgZGF0YXNldElkL3MgaWYgd2UgaGF2ZSBhZGRlZC9yZW1vdmVkIGxheWVyc1xuICAgICAgLy8gLSBjaGVjayBmb3IgbGF5ZXJJZCBjaGFuZ2VzIChYT1Igd29ya3MgYmVjYXVzZSBvZiBzdHJpbmcgdmFsdWVzKVxuICAgICAgLy8gaWYgbm8gZGlmZmVyZW5jZXMgYmV0d2VlbiBsYXllcklkcywgZG9uJ3QgZG8gYW55IGZpbHRlcmluZ1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbGF5ZXJJZERpZmZlcmVuY2UgPSB4b3IobmV3RmlsdGVyLmxheWVySWQsIG9sZEZpbHRlci5sYXllcklkKTtcblxuICAgICAgY29uc3QgbGF5ZXJEYXRhSWRzID0gdW5pcShcbiAgICAgICAgbGF5ZXJJZERpZmZlcmVuY2VcbiAgICAgICAgICAubWFwKGxpZCA9PlxuICAgICAgICAgICAgZ2V0KFxuICAgICAgICAgICAgICBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxpZCksXG4gICAgICAgICAgICAgIFsnY29uZmlnJywgJ2RhdGFJZCddXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkKVxuICAgICAgKTtcblxuICAgICAgLy8gb25seSBmaWx0ZXIgZGF0YXNldHNJZHNcbiAgICAgIGRhdGFzZXRJZHMgPSBsYXllckRhdGFJZHM7XG5cbiAgICAgIC8vIFVwZGF0ZSBuZXdGaWx0ZXIgZGF0YUlkc1xuICAgICAgY29uc3QgbmV3RGF0YUlkcyA9IHVuaXEoXG4gICAgICAgIG5ld0ZpbHRlci5sYXllcklkXG4gICAgICAgICAgLm1hcChsaWQgPT5cbiAgICAgICAgICAgIGdldChcbiAgICAgICAgICAgICAgc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBsaWQpLFxuICAgICAgICAgICAgICBbJ2NvbmZpZycsICdkYXRhSWQnXVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAuZmlsdGVyKGQgPT4gZClcbiAgICAgICk7XG5cbiAgICAgIG5ld0ZpbHRlciA9IHtcbiAgICAgICAgLi4ubmV3RmlsdGVyLFxuICAgICAgICBkYXRhSWQ6IG5ld0RhdGFJZHNcbiAgICAgIH07XG5cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGNvbnN0IGVubGFyZ2VkRmlsdGVyID0gc3RhdGUuZmlsdGVycy5maW5kKGYgPT4gZi5lbmxhcmdlZCk7XG5cbiAgaWYgKGVubGFyZ2VkRmlsdGVyICYmIGVubGFyZ2VkRmlsdGVyLmlkICE9PSBuZXdGaWx0ZXIuaWQpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgZW5sYXJnZWQgZmlsdGVyXG4gICAgbmV3RmlsdGVyLmVubGFyZ2VkID0gZmFsc2U7XG4gIH1cblxuICAvLyBzYXZlIG5ldyBmaWx0ZXJzIHRvIG5ld1N0YXRlXG4gIG5ld1N0YXRlID0gc2V0KFsnZmlsdGVycycsIGlkeF0sIG5ld0ZpbHRlciwgbmV3U3RhdGUpO1xuXG4gIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgc2V0dGluZyBhIHByb3AgdGhhdCBvbmx5IHJlcXVpcmVzIHRvIGZpbHRlciB0aGUgY3VycmVudFxuICAvLyBkYXRhc2V0IHdlIHdpbGwgcGFzcyBvbmx5IHRoZSBjdXJyZW50IGRhdGFzZXQgdG8gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyBhbmRcbiAgLy8gdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhIG90aGVyd2lzZSB3ZSBwYXNzIHRoZSBhbGwgbGlzdCBvZiBkYXRhc2V0cyBhcyBkZWZpbmVkIGluIGRhdGFJZFxuICBjb25zdCBkYXRhc2V0SWRzVG9GaWx0ZXIgPSBMSU1JVEVEX0ZJTFRFUl9FRkZFQ1RfUFJPUFNbcHJvcF1cbiAgICA/IFtkYXRhc2V0SWRzW3ZhbHVlSW5kZXhdXVxuICAgIDogZGF0YXNldElkcztcblxuICAvLyBmaWx0ZXIgZGF0YVxuICBjb25zdCBmaWx0ZXJlZERhdGFzZXRzID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgICBkYXRhc2V0SWRzVG9GaWx0ZXIsXG4gICAgbmV3U3RhdGUuZGF0YXNldHMsXG4gICAgbmV3U3RhdGUuZmlsdGVycyxcbiAgICBuZXdTdGF0ZS5sYXllcnNcbiAgKTtcblxuICBuZXdTdGF0ZSA9IHNldChbJ2RhdGFzZXRzJ10sIGZpbHRlcmVkRGF0YXNldHMsIG5ld1N0YXRlKTtcbiAgLy8gZGF0YUlkIGlzIGFuIGFycmF5XG4gIC8vIHBhc3Mgb25seSB0aGUgZGF0YXNldCB3ZSBuZWVkIHRvIHVwZGF0ZVxuICBuZXdTdGF0ZSA9IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShuZXdTdGF0ZSwgZGF0YXNldElkc1RvRmlsdGVyLCBuZXdGaWx0ZXIpO1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHByb3BlcnR5IG9mIGEgZmlsdGVyIHBsb3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRGaWx0ZXJQbG90VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR4LCBuZXdQcm9wLCB2YWx1ZUluZGV4ID0gMH06IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJQbG90VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBsZXQgbmV3RmlsdGVyID0gey4uLnN0YXRlLmZpbHRlcnNbaWR4XSwgLi4ubmV3UHJvcH07XG4gIGNvbnN0IHByb3AgPSBPYmplY3Qua2V5cyhuZXdQcm9wKVswXTtcbiAgaWYgKHByb3AgPT09ICd5QXhpcycpIHtcbiAgICBjb25zdCBwbG90VHlwZSA9IGdldERlZmF1bHRGaWx0ZXJQbG90VHlwZShuZXdGaWx0ZXIpO1xuICAgIC8vIFRPRE86IHBsb3QgaXMgbm90IHN1cHBvcnRlZCBpbiBtdWx0aSBkYXRhc2V0IGZpbHRlciBmb3Igbm93XG4gICAgaWYgKHBsb3RUeXBlKSB7XG4gICAgICBuZXdGaWx0ZXIgPSB7XG4gICAgICAgIC4uLm5ld0ZpbHRlcixcbiAgICAgICAgLi4uZ2V0RmlsdGVyUGxvdCh7Li4ubmV3RmlsdGVyLCBwbG90VHlwZX0sIHN0YXRlLmRhdGFzZXRzW25ld0ZpbHRlci5kYXRhSWRbdmFsdWVJbmRleF1dKSxcbiAgICAgICAgcGxvdFR5cGVcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT4gKGkgPT09IGlkeCA/IG5ld0ZpbHRlciA6IGYpKVxuICB9O1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYWRkRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRGaWx0ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PlxuICAhYWN0aW9uLmRhdGFJZFxuICAgID8gc3RhdGVcbiAgICA6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGZpbHRlcnM6IFsuLi5zdGF0ZS5maWx0ZXJzLCBnZXREZWZhdWx0RmlsdGVyKGFjdGlvbi5kYXRhSWQpXVxuICAgICAgfTtcblxuLyoqXG4gKiBTZXQgbGF5ZXIgY29sb3IgcGFsZXR0ZSB1aSBzdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyQ29sb3JVSUNoYW5nZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge29sZExheWVyLCBwcm9wLCBuZXdDb25maWd9OiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJDb2xvclVJQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBvbGRWaXhDb25maWcgPSBvbGRMYXllci5jb25maWcudmlzQ29uZmlnW3Byb3BdO1xuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29sb3JVSShwcm9wLCBuZXdDb25maWcpO1xuICBjb25zdCBuZXdWaXNDb25maWcgPSBuZXdMYXllci5jb25maWcudmlzQ29uZmlnW3Byb3BdO1xuICBpZiAob2xkVml4Q29uZmlnICE9PSBuZXdWaXNDb25maWcpIHtcbiAgICByZXR1cm4gbGF5ZXJWaXNDb25maWdDaGFuZ2VVcGRhdGVyKHN0YXRlLCB7XG4gICAgICBvbGRMYXllcixcbiAgICAgIG5ld1Zpc0NvbmZpZzoge1xuICAgICAgICBbcHJvcF06IG5ld1Zpc0NvbmZpZ1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBzdGF0ZS5sYXllcnMubWFwKGwgPT4gKGwuaWQgPT09IG9sZExheWVyLmlkID8gbmV3TGF5ZXIgOiBsKSlcbiAgfTtcbn07XG5cbi8qKlxuICogU3RhcnQgYW5kIGVuZCBmaWx0ZXIgYW5pbWF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVGaWx0ZXJBbmltYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+IChpID09PSBhY3Rpb24uaWR4ID8gey4uLmYsIGlzQW5pbWF0aW5nOiAhZi5pc0FuaW1hdGluZ30gOiBmKSlcbn0pO1xuXG4vKipcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckFuaW1hdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlTGF5ZXJBbmltYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgIGlzQW5pbWF0aW5nOiAhc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmlzQW5pbWF0aW5nXG4gIH1cbn0pO1xuXG4vKipcbiAqIEhpZGUgYW5kIHNob3cgbGF5ZXIgYW5pbWF0aW9uIGNvbnRyb2xcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckFuaW1hdGlvbkNvbnRyb2xVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBhbmltYXRpb25Db25maWc6IHtcbiAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgaGlkZUNvbnRyb2w6ICFzdGF0ZS5hbmltYXRpb25Db25maWcuaGlkZUNvbnRyb2xcbiAgfVxufSk7XG5cbi8qKlxuICogQ2hhbmdlIGZpbHRlciBhbmltYXRpb24gc3BlZWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlRmlsdGVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+IChpID09PSBhY3Rpb24uaWR4ID8gey4uLmYsIHNwZWVkOiBhY3Rpb24uc3BlZWR9IDogZikpXG59KTtcblxuLyoqXG4gKiBSZXNldCBhbmltYXRpb24gY29uZmlnIGN1cnJlbnQgdGltZSB0byBhIHNwZWNpZmllZCB2YWx1ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRMYXllckFuaW1hdGlvblRpbWVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHt2YWx1ZX06IFZpc1N0YXRlQWN0aW9ucy5TZXRMYXllckFuaW1hdGlvblRpbWVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgIGN1cnJlbnRUaW1lOiB2YWx1ZVxuICB9XG59KTtcblxuLyoqXG4gKiBVcGRhdGUgYW5pbWF0aW9uIHNwZWVkIHdpdGggdGhlIHZlcnRpY2FsIHNwZWVkIHNsaWRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7c3BlZWR9OiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIHNwZWVkXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBTaG93IGxhcmdlciB0aW1lIGZpbHRlciBhdCBib3R0b20gZm9yIHRpbWUgcGxheWJhY2sgKGFwcGx5IHRvIHRpbWUgZmlsdGVyIG9ubHkpXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZW5sYXJnZUZpbHRlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuRW5sYXJnZUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT5cbiAgICAgIGkgPT09IGFjdGlvbi5pZHhcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgZW5sYXJnZWQ6ICFmLmVubGFyZ2VkXG4gICAgICAgICAgfVxuICAgICAgICA6IGZcbiAgICApXG4gIH07XG59O1xuXG4vKipcbiAqIFRvZ2dsZXMgZmlsdGVyIGZlYXR1cmUgdmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUZpbHRlckZlYXR1cmVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUZpbHRlckZlYXR1cmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbYWN0aW9uLmlkeF07XG4gIGNvbnN0IGlzVmlzaWJsZSA9IGdldChmaWx0ZXIsIFsndmFsdWUnLCAncHJvcGVydGllcycsICdpc1Zpc2libGUnXSk7XG4gIGNvbnN0IG5ld0ZpbHRlciA9IHtcbiAgICAuLi5maWx0ZXIsXG4gICAgdmFsdWU6IGZlYXR1cmVUb0ZpbHRlclZhbHVlKGZpbHRlci52YWx1ZSwgZmlsdGVyLmlkLCB7XG4gICAgICBpc1Zpc2libGU6ICFpc1Zpc2libGVcbiAgICB9KVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogT2JqZWN0LmFzc2lnbihbLi4uc3RhdGUuZmlsdGVyc10sIHtbYWN0aW9uLmlkeF06IG5ld0ZpbHRlcn0pXG4gIH07XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUZpbHRlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCB7aWR4fSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFJZCwgaWR9ID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuXG4gIGNvbnN0IG5ld0ZpbHRlcnMgPSBbXG4gICAgLi4uc3RhdGUuZmlsdGVycy5zbGljZSgwLCBpZHgpLFxuICAgIC4uLnN0YXRlLmZpbHRlcnMuc2xpY2UoaWR4ICsgMSwgc3RhdGUuZmlsdGVycy5sZW5ndGgpXG4gIF07XG5cbiAgY29uc3QgZmlsdGVyZWREYXRhc2V0cyA9IGFwcGx5RmlsdGVyc1RvRGF0YXNldHMoZGF0YUlkLCBzdGF0ZS5kYXRhc2V0cywgbmV3RmlsdGVycywgc3RhdGUubGF5ZXJzKTtcbiAgY29uc3QgbmV3RWRpdG9yID1cbiAgICBnZXRGaWx0ZXJJZEluRmVhdHVyZShzdGF0ZS5lZGl0b3Iuc2VsZWN0ZWRGZWF0dXJlKSA9PT0gaWRcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgICAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgICAgICAgfVxuICAgICAgOiBzdGF0ZS5lZGl0b3I7XG5cbiAgbGV0IG5ld1N0YXRlID0gc2V0KFsnZmlsdGVycyddLCBuZXdGaWx0ZXJzLCBzdGF0ZSk7XG4gIG5ld1N0YXRlID0gc2V0KFsnZGF0YXNldHMnXSwgZmlsdGVyZWREYXRhc2V0cywgbmV3U3RhdGUpO1xuICBuZXdTdGF0ZSA9IHNldChbJ2VkaXRvciddLCBuZXdFZGl0b3IsIG5ld1N0YXRlKTtcblxuICByZXR1cm4gdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhKG5ld1N0YXRlLCBkYXRhSWQsIHVuZGVmaW5lZCk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG5ldyBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZExheWVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgbGV0IG5ld0xheWVyO1xuICBsZXQgbmV3TGF5ZXJEYXRhO1xuICBpZiAoYWN0aW9uLmNvbmZpZykge1xuICAgIG5ld0xheWVyID0gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlLCBhY3Rpb24uY29uZmlnKTtcbiAgICBpZiAoIW5ld0xheWVyKSB7XG4gICAgICBDb25zb2xlLndhcm4oXG4gICAgICAgICdGYWlsZWQgdG8gY3JlYXRlIGxheWVyIGZyb20gY29uZmlnLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBjb25maWcgaXMgbm90IGJlIGluIGNvcnJlY3QgZm9ybWF0JyxcbiAgICAgICAgYWN0aW9uLmNvbmZpZ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlKTtcbiAgICBuZXdMYXllciA9IHJlc3VsdC5sYXllcjtcbiAgICBuZXdMYXllckRhdGEgPSByZXN1bHQubGF5ZXJEYXRhO1xuICB9IGVsc2Uge1xuICAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBsYXllciB3aXRoIGEgc3BlY2lmaWMgZGF0YXNldCBvciBhIGRlZmF1bHQgb25lXG4gICAgY29uc3QgZGVmYXVsdERhdGFzZXQgPSBhY3Rpb24uZGF0YXNldElkID8/IE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKVswXTtcbiAgICBuZXdMYXllciA9IG5ldyBMYXllcih7XG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogdHJ1ZSxcbiAgICAgIGRhdGFJZDogZGVmYXVsdERhdGFzZXRcbiAgICB9KTtcbiAgICBuZXdMYXllckRhdGEgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogWy4uLnN0YXRlLmxheWVycywgbmV3TGF5ZXJdLFxuICAgIGxheWVyRGF0YTogWy4uLnN0YXRlLmxheWVyRGF0YSwgbmV3TGF5ZXJEYXRhXSxcbiAgICBsYXllck9yZGVyOiBbLi4uc3RhdGUubGF5ZXJPcmRlciwgc3RhdGUubGF5ZXJPcmRlci5sZW5ndGhdLFxuICAgIHNwbGl0TWFwczogYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChzdGF0ZS5zcGxpdE1hcHMsIG5ld0xheWVyKVxuICB9O1xufTtcblxuLyoqXG4gKiByZW1vdmUgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkeH06IFZpc1N0YXRlQWN0aW9ucy5SZW1vdmVMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2xheWVycywgbGF5ZXJEYXRhLCBjbGlja2VkLCBob3ZlckluZm99ID0gc3RhdGU7XG4gIGNvbnN0IGxheWVyVG9SZW1vdmUgPSBzdGF0ZS5sYXllcnNbaWR4XTtcbiAgY29uc3QgbmV3TWFwcyA9IHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyhzdGF0ZS5zcGxpdE1hcHMsIGxheWVyVG9SZW1vdmUpO1xuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogWy4uLmxheWVycy5zbGljZSgwLCBpZHgpLCAuLi5sYXllcnMuc2xpY2UoaWR4ICsgMSwgbGF5ZXJzLmxlbmd0aCldLFxuICAgIGxheWVyRGF0YTogWy4uLmxheWVyRGF0YS5zbGljZSgwLCBpZHgpLCAuLi5sYXllckRhdGEuc2xpY2UoaWR4ICsgMSwgbGF5ZXJEYXRhLmxlbmd0aCldLFxuICAgIGxheWVyT3JkZXI6IHN0YXRlLmxheWVyT3JkZXIuZmlsdGVyKGkgPT4gaSAhPT0gaWR4KS5tYXAocGlkID0+IChwaWQgPiBpZHggPyBwaWQgLSAxIDogcGlkKSksXG4gICAgY2xpY2tlZDogbGF5ZXJUb1JlbW92ZS5pc0xheWVySG92ZXJlZChjbGlja2VkKSA/IHVuZGVmaW5lZCA6IGNsaWNrZWQsXG4gICAgaG92ZXJJbmZvOiBsYXllclRvUmVtb3ZlLmlzTGF5ZXJIb3ZlcmVkKGhvdmVySW5mbykgPyB1bmRlZmluZWQgOiBob3ZlckluZm8sXG4gICAgc3BsaXRNYXBzOiBuZXdNYXBzXG4gICAgLy8gVE9ETzogdXBkYXRlIGZpbHRlcnMsIGNyZWF0ZSBoZWxwZXIgdG8gcmVtb3ZlIGxheWVyIGZvcm0gZmlsdGVyIChyZW1vdmUgbGF5ZXJpZCBhbmQgZGF0YWlkKSBpZiBtYXBwZWRcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5ld1N0YXRlKTtcbn07XG5cbi8qKlxuICogZHVwbGljYXRlIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZHVwbGljYXRlTGF5ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZHh9OiBWaXNTdGF0ZUFjdGlvbnMuRHVwbGljYXRlTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtsYXllcnN9ID0gc3RhdGU7XG4gIGNvbnN0IG9yaWdpbmFsID0gc3RhdGUubGF5ZXJzW2lkeF07XG4gIGNvbnN0IG9yaWdpbmFsTGF5ZXJPcmRlcklkeCA9IHN0YXRlLmxheWVyT3JkZXIuZmluZEluZGV4KGkgPT4gaSA9PT0gaWR4KTtcblxuICBpZiAoIW9yaWdpbmFsKSB7XG4gICAgQ29uc29sZS53YXJuKGBsYXllci4ke2lkeH0gaXMgdW5kZWZpbmVkYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBuZXdMYWJlbCA9IGBDb3B5IG9mICR7b3JpZ2luYWwuY29uZmlnLmxhYmVsfWA7XG4gIGxldCBwb3N0Zml4ID0gMDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICB3aGlsZSAobGF5ZXJzLmZpbmQobCA9PiBsLmNvbmZpZy5sYWJlbCA9PT0gbmV3TGFiZWwpKSB7XG4gICAgbmV3TGFiZWwgPSBgQ29weSBvZiAke29yaWdpbmFsLmNvbmZpZy5sYWJlbH0gJHsrK3Bvc3RmaXh9YDtcbiAgfVxuXG4gIC8vIGNvbGxlY3QgbGF5ZXIgY29uZmlnIGZyb20gb3JpZ2luYWxcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSBzZXJpYWxpemVMYXllcihvcmlnaW5hbCk7XG5cbiAgLy8gYXNzaWduIG5ldyBpZCBhbmQgbGFiZWwgdG8gY29waWVkIGxheWVyXG4gIGlmICghbG9hZGVkTGF5ZXI/LmNvbmZpZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsb2FkZWRMYXllci5jb25maWcubGFiZWwgPSBuZXdMYWJlbDtcbiAgbG9hZGVkTGF5ZXIuaWQgPSBnZW5lcmF0ZUhhc2hJZChMQVlFUl9JRF9MRU5HVEgpO1xuXG4gIC8vIGFkZCBsYXllciB0byBzdGF0ZVxuICBsZXQgbmV4dFN0YXRlID0gYWRkTGF5ZXJVcGRhdGVyKHN0YXRlLCB7Y29uZmlnOiBsb2FkZWRMYXllcn0pO1xuXG4gIC8vIG5ldyBhZGRlZCBsYXllciBhcmUgYXQgdGhlIGVuZCwgbW92ZSBpdCB0byBiZSBvbiB0b3Agb2Ygb3JpZ2luYWwgbGF5ZXJcbiAgY29uc3QgbmV3TGF5ZXJPcmRlcklkeCA9IG5leHRTdGF0ZS5sYXllck9yZGVyLmxlbmd0aCAtIDE7XG4gIGNvbnN0IG5ld0xheWVyT3JkZXIgPSBhcnJheUluc2VydChcbiAgICBuZXh0U3RhdGUubGF5ZXJPcmRlci5zbGljZSgwLCBuZXdMYXllck9yZGVySWR4KSxcbiAgICBvcmlnaW5hbExheWVyT3JkZXJJZHgsXG4gICAgbmV3TGF5ZXJPcmRlcklkeFxuICApO1xuXG4gIG5leHRTdGF0ZSA9IHtcbiAgICAuLi5uZXh0U3RhdGUsXG4gICAgbGF5ZXJPcmRlcjogbmV3TGF5ZXJPcmRlclxuICB9O1xuXG4gIHJldHVybiB1cGRhdGVBbmltYXRpb25Eb21haW4obmV4dFN0YXRlKTtcbn07XG5cbi8qKlxuICogUmVvcmRlciBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlb3JkZXJMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge29yZGVyfTogVmlzU3RhdGVBY3Rpb25zLlJlb3JkZXJMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsYXllck9yZGVyOiBvcmRlclxufSk7XG5cbi8qKlxuICogUmVtb3ZlIGEgZGF0YXNldCBhbmQgYWxsIGxheWVycywgZmlsdGVycywgdG9vbHRpcCBjb25maWdzIHRoYXQgYmFzZWQgb24gaXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVEYXRhc2V0VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SZW1vdmVEYXRhc2V0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBleHRyYWN0IGRhdGFzZXQga2V5XG4gIGNvbnN0IHtkYXRhSWQ6IGRhdGFzZXRLZXl9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YXNldHN9ID0gc3RhdGU7XG5cbiAgLy8gY2hlY2sgaWYgZGF0YXNldCBpcyBwcmVzZW50XG4gIGlmICghZGF0YXNldHNbZGF0YXNldEtleV0pIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICBjb25zdCB7XG4gICAgbGF5ZXJzLFxuICAgIGRhdGFzZXRzOiB7W2RhdGFzZXRLZXldOiBkYXRhc2V0LCAuLi5uZXdEYXRhc2V0c31cbiAgfSA9IHN0YXRlO1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbiAgY29uc3QgaW5kZXhlcyA9IGxheWVycy5yZWR1Y2UoKGxpc3RPZkluZGV4ZXMsIGxheWVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChsYXllci5jb25maWcuZGF0YUlkID09PSBkYXRhc2V0S2V5KSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBsaXN0T2ZJbmRleGVzLnB1c2goaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdE9mSW5kZXhlcztcbiAgfSwgW10pO1xuXG4gIC8vIHJlbW92ZSBsYXllcnMgYW5kIGRhdGFzZXRzXG4gIGNvbnN0IHtuZXdTdGF0ZX0gPSBpbmRleGVzLnJlZHVjZShcbiAgICAoe25ld1N0YXRlOiBjdXJyZW50U3RhdGUsIGluZGV4Q291bnRlcn0sIGlkeCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gaWR4IC0gaW5kZXhDb3VudGVyO1xuICAgICAgY3VycmVudFN0YXRlID0gcmVtb3ZlTGF5ZXJVcGRhdGVyKGN1cnJlbnRTdGF0ZSwge2lkeDogY3VycmVudEluZGV4fSk7XG4gICAgICBpbmRleENvdW50ZXIrKztcbiAgICAgIHJldHVybiB7bmV3U3RhdGU6IGN1cnJlbnRTdGF0ZSwgaW5kZXhDb3VudGVyfTtcbiAgICB9LFxuICAgIHtuZXdTdGF0ZTogey4uLnN0YXRlLCBkYXRhc2V0czogbmV3RGF0YXNldHN9LCBpbmRleENvdW50ZXI6IDB9XG4gICk7XG5cbiAgLy8gcmVtb3ZlIGZpbHRlcnNcbiAgY29uc3QgZmlsdGVycyA9IHN0YXRlLmZpbHRlcnMuZmlsdGVyKGZpbHRlciA9PiAhZmlsdGVyLmRhdGFJZC5pbmNsdWRlcyhkYXRhc2V0S2V5KSk7XG5cbiAgLy8gdXBkYXRlIGludGVyYWN0aW9uQ29uZmlnXG4gIGxldCB7aW50ZXJhY3Rpb25Db25maWd9ID0gc3RhdGU7XG4gIGNvbnN0IHt0b29sdGlwfSA9IGludGVyYWN0aW9uQ29uZmlnO1xuICBpZiAodG9vbHRpcCkge1xuICAgIGNvbnN0IHtjb25maWd9ID0gdG9vbHRpcDtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgIGNvbnN0IHtbZGF0YXNldEtleV06IGZpZWxkcywgLi4uZmllbGRzVG9TaG93fSA9IGNvbmZpZy5maWVsZHNUb1Nob3c7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgIGludGVyYWN0aW9uQ29uZmlnID0ge1xuICAgICAgLi4uaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICB0b29sdGlwOiB7Li4udG9vbHRpcCwgY29uZmlnOiB7Li4uY29uZmlnLCBmaWVsZHNUb1Nob3d9fVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gey4uLm5ld1N0YXRlLCBmaWx0ZXJzLCBpbnRlcmFjdGlvbkNvbmZpZ307XG59O1xuXG4vKipcbiAqIHVwZGF0ZSBsYXllciBibGVuZGluZyBtb2RlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlTGF5ZXJCbGVuZGluZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlTGF5ZXJCbGVuZGluZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsYXllckJsZW5kaW5nOiBhY3Rpb24ubW9kZVxufSk7XG5cbi8qKlxuICogRGlzcGxheSBkYXRhc2V0IHRhYmxlIGluIGEgbW9kYWxcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzaG93RGF0YXNldFRhYmxlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TaG93RGF0YXNldFRhYmxlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRpbmdEYXRhc2V0OiBhY3Rpb24uZGF0YUlkXG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBjdXN0b20gY29sb3IgZm9yIGRhdGFzZXRzIGFuZCBsYXllcnNcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVUYWJsZUNvbG9yVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVEYXRhc2V0Q29sb3JVcGRhdGVyXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtkYXRhSWQsIG5ld0NvbG9yfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFzZXRzfSA9IHN0YXRlO1xuXG4gIGlmIChpc1JnYkNvbG9yKG5ld0NvbG9yKSkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZGF0YXNldHNbZGF0YUlkXTtcbiAgICBleGlzdGluZy51cGRhdGVUYWJsZUNvbG9yKG5ld0NvbG9yKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRhdGFzZXRzOiB7XG4gICAgICAgIC4uLnN0YXRlLmRhdGFzZXRzLFxuICAgICAgICBbZGF0YUlkXTogY29weVRhYmxlQW5kVXBkYXRlKGV4aXN0aW5nLCB7fSlcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogcmVzZXQgdmlzU3RhdGUgdG8gaW5pdGlhbCBTdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnVXBkYXRlciA9IChzdGF0ZTogVmlzU3RhdGUpOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxufSk7XG5cbi8qKlxuICogUHJvcGFnYXRlIGB2aXNTdGF0ZWAgcmVkdWNlciB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEN1cnJlbnQgY29uZmlnIHdpbGwgYmUgb3ZlcnJpZGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtjb25maWcgPSB7dmVyc2lvbjogJyd9LCBvcHRpb25zID0ge319XG4gIH06IHtcbiAgICB0eXBlPzogdHlwZW9mIEFjdGlvblR5cGVzLlJFQ0VJVkVfTUFQX0NPTkZJRztcbiAgICBwYXlsb2FkOiBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZDtcbiAgfVxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoIWNvbmZpZy52aXNTdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHtrZWVwRXhpc3RpbmdDb25maWd9ID0gb3B0aW9ucztcblxuICAvLyByZXNldCBjb25maWcgaWYga2VlcEV4aXN0aW5nQ29uZmlnIGlzIGZhbHN5XG4gIGxldCBtZXJnZWRTdGF0ZSA9ICFrZWVwRXhpc3RpbmdDb25maWcgPyByZXNldE1hcENvbmZpZ1VwZGF0ZXIoc3RhdGUpIDogc3RhdGU7XG4gIGZvciAoY29uc3QgbWVyZ2VyIG9mIHN0YXRlLm1lcmdlcnMpIHtcbiAgICBpZiAoaXNWYWxpZE1lcmdlcihtZXJnZXIpICYmIGNvbmZpZy52aXNTdGF0ZVttZXJnZXIucHJvcF0pIHtcbiAgICAgIG1lcmdlZFN0YXRlID0gbWVyZ2VyLm1lcmdlKG1lcmdlZFN0YXRlLCBjb25maWcudmlzU3RhdGVbbWVyZ2VyLnByb3BdLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkU3RhdGU7XG59O1xuXG4vKipcbiAqIFRyaWdnZXIgbGF5ZXIgaG92ZXIgZXZlbnQgd2l0aCBob3ZlcmVkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVySG92ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLk9uTGF5ZXJIb3ZlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBob3ZlckluZm86IHtcbiAgICAvLyBkZWNrLmdsIGluZm8gaXMgbXV0YWJsZVxuICAgIC4uLmFjdGlvbi5pbmZvXG4gIH1cbn0pO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzICovXG5cbi8qKlxuICogVXBkYXRlIGBpbnRlcmFjdGlvbkNvbmZpZ2BcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuSW50ZXJhY3Rpb25Db25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtjb25maWd9ID0gYWN0aW9uO1xuXG4gIGNvbnN0IGludGVyYWN0aW9uQ29uZmlnID0ge1xuICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnLFxuICAgIC4uLntbY29uZmlnLmlkXTogY29uZmlnfVxuICB9O1xuXG4gIC8vIERvbid0IGVuYWJsZSB0b29sdGlwIGFuZCBicnVzaCBhdCB0aGUgc2FtZSB0aW1lXG4gIC8vIGJ1dCBjb29yZGluYXRlcyBjYW4gYmUgc2hvd24gYXQgYWxsIHRpbWVcbiAgY29uc3QgY29udHJhZGljdCA9IFsnYnJ1c2gnLCAndG9vbHRpcCddO1xuXG4gIGlmIChcbiAgICBjb250cmFkaWN0LmluY2x1ZGVzKGNvbmZpZy5pZCkgJiZcbiAgICBjb25maWcuZW5hYmxlZCAmJlxuICAgICFzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1tjb25maWcuaWRdLmVuYWJsZWRcbiAgKSB7XG4gICAgLy8gb25seSBlbmFibGUgb25lIGludGVyYWN0aW9uIGF0IGEgdGltZVxuICAgIGNvbnRyYWRpY3QuZm9yRWFjaChrID0+IHtcbiAgICAgIGlmIChrICE9PSBjb25maWcuaWQpIHtcbiAgICAgICAgaW50ZXJhY3Rpb25Db25maWdba10gPSB7Li4uaW50ZXJhY3Rpb25Db25maWdba10sIGVuYWJsZWQ6IGZhbHNlfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pZCA9PT0gJ2dlb2NvZGVyJyAmJiAhY29uZmlnLmVuYWJsZWQpIHtcbiAgICByZXR1cm4gcmVtb3ZlRGF0YXNldFVwZGF0ZXIobmV3U3RhdGUsIHtkYXRhSWQ6ICdnZW9jb2Rlcl9kYXRhc2V0J30pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbGF5ZXIgY2xpY2sgZXZlbnQgd2l0aCBjbGlja2VkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyQ2xpY2tVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLk9uTGF5ZXJDbGlja1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtb3VzZVBvczogc3RhdGUuaW50ZXJhY3Rpb25Db25maWcuY29vcmRpbmF0ZS5lbmFibGVkXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICBwaW5uZWQ6IHN0YXRlLm1vdXNlUG9zLnBpbm5lZCA/IG51bGwgOiBjbG9uZURlZXAoc3RhdGUubW91c2VQb3MpXG4gICAgICB9XG4gICAgOiBzdGF0ZS5tb3VzZVBvcyxcbiAgY2xpY2tlZDogYWN0aW9uLmluZm8gJiYgYWN0aW9uLmluZm8ucGlja2VkID8gYWN0aW9uLmluZm8gOiBudWxsXG59KTtcblxuLyoqXG4gKiBUcmlnZ2VyIG1hcCBjbGljayBldmVudCwgdW5zZWxlY3QgY2xpY2tlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBDbGlja1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuT25NYXBDbGlja1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjbGlja2VkOiBudWxsXG4gIH07XG59O1xuXG4vKipcbiAqIFRyaWdnZXIgbWFwIG1vdmUgZXZlbnRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtb3VzZU1vdmVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtldnR9OiBWaXNTdGF0ZUFjdGlvbnMuT25Nb3VzZU1vdmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGlmIChPYmplY3QudmFsdWVzKHN0YXRlLmludGVyYWN0aW9uQ29uZmlnKS5zb21lKGNvbmZpZyA9PiBjb25maWcuZW5hYmxlZCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBtb3VzZVBvczoge1xuICAgICAgICAuLi5zdGF0ZS5tb3VzZVBvcyxcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZ0LnBvaW50KSA/IHttb3VzZVBvc2l0aW9uOiBbLi4uZXZ0LnBvaW50XX0gOiB7fSksXG4gICAgICAgIC4uLihBcnJheS5pc0FycmF5KGV2dC5sbmdMYXQpID8ge2Nvb3JkaW5hdGU6IFsuLi5ldnQubG5nTGF0XX0gOiB7fSlcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcbi8qKlxuICogVG9nZ2xlIHZpc2liaWxpdHkgb2YgYSBsYXllciBmb3IgYSBzcGxpdCBtYXBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVTcGxpdE1hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuVG9nZ2xlU3BsaXRNYXBVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PlxuICBzdGF0ZS5zcGxpdE1hcHMgJiYgc3RhdGUuc3BsaXRNYXBzLmxlbmd0aCA9PT0gMFxuICAgID8ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgLy8gbWF5YmUgd2Ugc2hvdWxkIHVzZSBhbiBhcnJheSB0byBzdG9yZSBzdGF0ZSBmb3IgYSBzaW5nbGUgbWFwIGFzIHdlbGxcbiAgICAgICAgLy8gaWYgY3VycmVudCBtYXBzIGxlbmd0aCBpcyBlcXVhbCB0byAwIGl0IG1lYW5zIHRoYXQgd2UgYXJlIGFib3V0IHRvIHNwbGl0IHRoZSB2aWV3XG4gICAgICAgIHNwbGl0TWFwczogY29tcHV0ZVNwbGl0TWFwTGF5ZXJzKHN0YXRlLmxheWVycylcbiAgICAgIH1cbiAgICA6IGNsb3NlU3BlY2lmaWNNYXBBdEluZGV4KHN0YXRlLCBhY3Rpb24pO1xuXG4vKipcbiAqIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIGEgbGF5ZXIgaW4gYSBzcGxpdCBtYXBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckZvck1hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge21hcEluZGV4LCBsYXllcklkfTogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUxheWVyRm9yTWFwVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCB7c3BsaXRNYXBzfSA9IHN0YXRlO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgc3BsaXRNYXBzOiBzcGxpdE1hcHMubWFwKChzbSwgaSkgPT5cbiAgICAgIGkgPT09IG1hcEluZGV4XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uc3BsaXRNYXBzW2ldLFxuICAgICAgICAgICAgbGF5ZXJzOiB7XG4gICAgICAgICAgICAgIC4uLnNwbGl0TWFwc1tpXS5sYXllcnMsXG4gICAgICAgICAgICAgIC8vIGlmIGxheWVySWQgbm90IGluIGxheWVycywgc2V0IGl0IHRvIHZpc2libGVcbiAgICAgICAgICAgICAgW2xheWVySWRdOiAhc3BsaXRNYXBzW2ldLmxheWVyc1tsYXllcklkXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiBzbVxuICAgIClcbiAgfTtcbn07XG5cbi8qKlxuICogQWRkIG5ldyBkYXRhc2V0IHRvIGB2aXNTdGF0ZWAsIHdpdGggb3B0aW9uIHRvIGxvYWQgYSBtYXAgY29uZmlnIGFsb25nIHdpdGggdGhlIGRhdGFzZXRzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cyAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBjb25zdCB1cGRhdGVWaXNEYXRhVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVWaXNEYXRhVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBkYXRhc2V0cyBjYW4gYmUgYSBzaW5nbGUgZGF0YSBlbnRyaWVzIG9yIGFuIGFycmF5IG9mIG11bHRpcGxlIGRhdGEgZW50cmllc1xuICBjb25zdCB7Y29uZmlnLCBvcHRpb25zfSA9IGFjdGlvbjtcbiAgY29uc3QgZGF0YXNldHMgPSB0b0FycmF5KGFjdGlvbi5kYXRhc2V0cyk7XG5cbiAgY29uc3QgbmV3RGF0YUVudHJpZXMgPSBkYXRhc2V0cy5yZWR1Y2UoXG4gICAgKGFjY3UsIHtpbmZvID0ge30sIC4uLnJlc3R9ID0ge30pID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgLi4uKGNyZWF0ZU5ld0RhdGFFbnRyeSh7aW5mbywgLi4ucmVzdH0sIHN0YXRlLmRhdGFzZXRzKSB8fCB7fSlcbiAgICB9KSxcbiAgICB7fVxuICApO1xuXG4gIGNvbnN0IGRhdGFFbXB0eSA9IE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKS5sZW5ndGggPCAxO1xuXG4gIC8vIGFwcGx5IGNvbmZpZyBpZiBwYXNzZWQgZnJvbSBhY3Rpb25cbiAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IGNvbmZpZ1xuICAgID8gcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIoc3RhdGUsIHtcbiAgICAgICAgcGF5bG9hZDoge2NvbmZpZywgb3B0aW9uc31cbiAgICAgIH0pXG4gICAgOiBzdGF0ZTtcblxuICBsZXQgbWVyZ2VkU3RhdGUgPSB7XG4gICAgLi4ucHJldmlvdXNTdGF0ZSxcbiAgICBkYXRhc2V0czoge1xuICAgICAgLi4ucHJldmlvdXNTdGF0ZS5kYXRhc2V0cyxcbiAgICAgIC4uLm5ld0RhdGFFbnRyaWVzXG4gICAgfVxuICB9O1xuXG4gIC8vIG1lcmdlIHN0YXRlIHdpdGggY29uZmlnIHRvIGJlIG1lcmdlZFxuICBmb3IgKGNvbnN0IG1lcmdlciBvZiBtZXJnZWRTdGF0ZS5tZXJnZXJzKSB7XG4gICAgaWYgKGlzVmFsaWRNZXJnZXIobWVyZ2VyKSAmJiBtZXJnZXIudG9NZXJnZVByb3AgJiYgbWVyZ2VkU3RhdGVbbWVyZ2VyLnRvTWVyZ2VQcm9wXSkge1xuICAgICAgY29uc3QgdG9NZXJnZSA9IG1lcmdlZFN0YXRlW21lcmdlci50b01lcmdlUHJvcF07XG4gICAgICBtZXJnZWRTdGF0ZVttZXJnZXIudG9NZXJnZVByb3BdID0gSU5JVElBTF9WSVNfU1RBVEVbbWVyZ2VyLnRvTWVyZ2VQcm9wXTtcbiAgICAgIG1lcmdlZFN0YXRlID0gbWVyZ2VyLm1lcmdlKG1lcmdlZFN0YXRlLCB0b01lcmdlKTtcbiAgICB9XG4gIH1cblxuICBsZXQgbmV3TGF5ZXJzID0gIWRhdGFFbXB0eVxuICAgID8gbWVyZ2VkU3RhdGUubGF5ZXJzLmZpbHRlcihsID0+IGwuY29uZmlnLmRhdGFJZCAmJiBsLmNvbmZpZy5kYXRhSWQgaW4gbmV3RGF0YUVudHJpZXMpXG4gICAgOiBbXTtcblxuICBpZiAoIW5ld0xheWVycy5sZW5ndGggJiYgKG9wdGlvbnMgfHwge30pLmF1dG9DcmVhdGVMYXllcnMgIT09IGZhbHNlKSB7XG4gICAgLy8gbm8gbGF5ZXIgbWVyZ2VkLCBmaW5kIGRlZmF1bHRzXG4gICAgY29uc3QgcmVzdWx0ID0gYWRkRGVmYXVsdExheWVycyhtZXJnZWRTdGF0ZSwgbmV3RGF0YUVudHJpZXMpO1xuICAgIG1lcmdlZFN0YXRlID0gcmVzdWx0LnN0YXRlO1xuICAgIG5ld0xheWVycyA9IHJlc3VsdC5uZXdMYXllcnM7XG4gIH1cblxuICBpZiAobWVyZ2VkU3RhdGUuc3BsaXRNYXBzLmxlbmd0aCkge1xuICAgIC8vIGlmIG1hcCBpcyBzcGxpdCwgYWRkIG5ldyBsYXllcnMgdG8gc3BsaXRNYXBzXG4gICAgbmV3TGF5ZXJzID0gbWVyZ2VkU3RhdGUubGF5ZXJzLmZpbHRlcihcbiAgICAgIGwgPT4gbC5jb25maWcuZGF0YUlkICYmIGwuY29uZmlnLmRhdGFJZCBpbiBuZXdEYXRhRW50cmllc1xuICAgICk7XG4gICAgbWVyZ2VkU3RhdGUgPSB7XG4gICAgICAuLi5tZXJnZWRTdGF0ZSxcbiAgICAgIHNwbGl0TWFwczogYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChtZXJnZWRTdGF0ZS5zcGxpdE1hcHMsIG5ld0xheWVycylcbiAgICB9O1xuICB9XG5cbiAgLy8gaWYgbm8gdG9vbHRpcHMgbWVyZ2VkIGFkZCBkZWZhdWx0IHRvb2x0aXBzXG4gIE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKS5mb3JFYWNoKGRhdGFJZCA9PiB7XG4gICAgY29uc3QgdG9vbHRpcEZpZWxkcyA9IG1lcmdlZFN0YXRlLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0b29sdGlwRmllbGRzKSB8fCAhdG9vbHRpcEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIG1lcmdlZFN0YXRlID0gYWRkRGVmYXVsdFRvb2x0aXBzKG1lcmdlZFN0YXRlLCBuZXdEYXRhRW50cmllc1tkYXRhSWRdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEoXG4gICAgbWVyZ2VkU3RhdGUsXG4gICAgZGF0YUVtcHR5ID8gT2JqZWN0LmtleXMobWVyZ2VkU3RhdGUuZGF0YXNldHMpIDogT2JqZWN0LmtleXMobmV3RGF0YUVudHJpZXMpLFxuICAgIHVuZGVmaW5lZFxuICApO1xuXG4gIC8vIHJlZ2lzdGVyIGxheWVyIGFuaW1hdGlvbiBkb21haW4sXG4gIC8vIG5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGxheWVyIGRhdGEgaXMgY2FsY3VsYXRlZFxuICB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4odXBkYXRlZFN0YXRlKTtcblxuICByZXR1cm4gdXBkYXRlZFN0YXRlO1xufTtcbi8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMgKi9cblxuLyoqXG4gKiBSZW5hbWUgYW4gZXhpc3RpbmcgZGF0YXNldCBpbiBgdmlzU3RhdGVgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuYW1lRGF0YXNldFVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVuYW1lRGF0YXNldFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2RhdGFJZCwgbGFiZWx9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YXNldHN9ID0gc3RhdGU7XG4gIGNvbnN0IGV4aXN0aW5nID0gZGF0YXNldHNbZGF0YUlkXTtcblxuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBjb25zdCBuZXdEYXRhc2V0ID0gY29weVRhYmxlQW5kVXBkYXRlKGV4aXN0aW5nLCB7bGFiZWx9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBkYXRhc2V0czoge1xuICAgICAgICAuLi5kYXRhc2V0cyxcbiAgICAgICAgW2RhdGFJZF06IG5ld0RhdGFzZXRcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gTm8tb3AgaWYgdGhlIGRhdGFzZXQgZG9lc24ndCBleGlzdFxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogV2hlbiBhIHVzZXIgY2xpY2tzIG9uIHRoZSBzcGVjaWZpYyBtYXAgY2xvc2luZyBpY29uXG4gKiB0aGUgYXBwbGljYXRpb24gd2lsbCBjbG9zZSB0aGUgc2VsZWN0ZWQgbWFwXG4gKiBhbmQgd2lsbCBtZXJnZSB0aGUgcmVtYWluaW5nIG9uZSB3aXRoIHRoZSBnbG9iYWwgc3RhdGVcbiAqIFRPRE86IGkgdGhpbmsgaW4gdGhlIGZ1dHVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUgY2FsbGVkIG1lcmdlIG1hcCBsYXllcnMgd2l0aCBnbG9iYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBgdmlzU3RhdGVgXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIGFjdGlvblxuICogQHJldHVybnMge09iamVjdH0gbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9zZVNwZWNpZmljTWFwQXRJbmRleDxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuVG9nZ2xlU3BsaXRNYXBVcGRhdGVyQWN0aW9uXG4pOiBTIHtcbiAgLy8gcmV0cmlldmUgbGF5ZXJzIG1ldGEgZGF0YSBmcm9tIHRoZSByZW1haW5pbmcgbWFwIHRoYXQgd2UgbmVlZCB0byBrZWVwXG4gIGNvbnN0IGluZGV4VG9SZXRyaWV2ZSA9IDEgLSBhY3Rpb24ucGF5bG9hZDtcbiAgY29uc3QgbWFwTGF5ZXJzID0gc3RhdGUuc3BsaXRNYXBzW2luZGV4VG9SZXRyaWV2ZV0/LmxheWVycztcbiAgY29uc3Qge2xheWVyc30gPSBzdGF0ZTtcblxuICAvLyB1cGRhdGUgbGF5ZXIgdmlzaWJpbGl0eVxuICBjb25zdCBuZXdMYXllcnMgPSBsYXllcnMubWFwKGxheWVyID0+XG4gICAgbWFwTGF5ZXJzICYmICFtYXBMYXllcnNbbGF5ZXIuaWRdICYmIGxheWVyLmNvbmZpZy5pc1Zpc2libGVcbiAgICAgID8gbGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgICAgIC8vIGlmIGxheWVyLmlkIGlzIG5vdCBpbiBtYXBMYXllcnMsIGl0IHNob3VsZCBiZSBpblZpc2libGVcbiAgICAgICAgICBpc1Zpc2libGU6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICA6IGxheWVyXG4gICk7XG5cbiAgLy8gZGVsZXRlIG1hcFxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogbmV3TGF5ZXJzLFxuICAgIHNwbGl0TWFwczogW11cbiAgfTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGZpbGUgbG9hZGluZyBkaXNwYXRjaCBgYWRkRGF0YVRvTWFwYCBpZiBzdWNjZWVkLCBvciBgbG9hZEZpbGVzRXJyYCBpZiBmYWlsZWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxvYWRGaWxlc1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2ZpbGVzLCBvbkZpbmlzaCA9IGxvYWRGaWxlc1N1Y2Nlc3N9ID0gYWN0aW9uO1xuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVMb2FkaW5nUHJvZ3Jlc3MgPSBBcnJheS5mcm9tKGZpbGVzKS5yZWR1Y2UoXG4gICAgKGFjY3UsIGYsIGkpID0+IG1lcmdlXyhpbml0aWFsRmlsZUxvYWRpbmdQcm9ncmVzcyhmLCBpKSkoYWNjdSksXG4gICAge31cbiAgKTtcblxuICBjb25zdCBmaWxlTG9hZGluZyA9IHtcbiAgICBmaWxlQ2FjaGU6IFtdLFxuICAgIGZpbGVzVG9Mb2FkOiBmaWxlcyxcbiAgICBvbkZpbmlzaFxuICB9O1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IG1lcmdlXyh7ZmlsZUxvYWRpbmdQcm9ncmVzcywgZmlsZUxvYWRpbmd9KShzdGF0ZSk7XG5cbiAgcmV0dXJuIGxvYWROZXh0RmlsZVVwZGF0ZXIobmV4dFN0YXRlKTtcbn07XG5cbi8qKlxuICogU3VjZXNzZnVsbHkgbG9hZGVkIG9uZSBmaWxlLCBtb3ZlIG9uIHRvIHRoZSBuZXh0IG9uZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlU3RlcFN1Y2Nlc3NVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxvYWRGaWxlU3RlcFN1Y2Nlc3NBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZU5hbWUsIGZpbGVDYWNoZX0gPSBhY3Rpb247XG4gIGNvbnN0IHtmaWxlc1RvTG9hZCwgb25GaW5pc2h9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDEsIG1lc3NhZ2U6ICdEb25lJ31cbiAgfSk7XG5cbiAgLy8gc2F2ZSBwcm9jZXNzZWQgZmlsZSB0byBmaWxlQ2FjaGVcbiAgY29uc3Qgc3RhdGVXaXRoQ2FjaGUgPSBwaWNrXygnZmlsZUxvYWRpbmcnKShtZXJnZV8oe2ZpbGVDYWNoZX0pKShzdGF0ZVdpdGhQcm9ncmVzcyk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aENhY2hlLFxuICAgIERFTEFZX1RBU0soMjAwKS5tYXAoZmlsZXNUb0xvYWQubGVuZ3RoID8gbG9hZE5leHRGaWxlIDogKCkgPT4gb25GaW5pc2goZmlsZUNhY2hlKSlcbiAgKTtcbn1cblxuLy8gd2l0aFRhc2s8VD4oc3RhdGU6IFQsIHRhc2s6IGFueSk6IFRcblxuLyoqXG4gKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWROZXh0RmlsZVVwZGF0ZXIoc3RhdGU6IFZpc1N0YXRlKTogVmlzU3RhdGUge1xuICBpZiAoIXN0YXRlLmZpbGVMb2FkaW5nKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHtmaWxlc1RvTG9hZH0gPSBzdGF0ZS5maWxlTG9hZGluZztcbiAgY29uc3QgW2ZpbGUsIC4uLnJlbWFpbmluZ0ZpbGVzVG9Mb2FkXSA9IGZpbGVzVG9Mb2FkO1xuXG4gIC8vIHNhdmUgZmlsZXNUb0xvYWQgdG8gc3RhdGVcbiAgY29uc3QgbmV4dFN0YXRlID0gcGlja18oJ2ZpbGVMb2FkaW5nJykobWVyZ2VfKHtmaWxlc1RvTG9hZDogcmVtYWluaW5nRmlsZXNUb0xvYWR9KSkoc3RhdGUpO1xuXG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIobmV4dFN0YXRlLCB7XG4gICAgZmlsZU5hbWU6IGZpbGUubmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDAsIG1lc3NhZ2U6ICdsb2FkaW5nLi4uJ31cbiAgfSk7XG5cbiAgY29uc3Qge2xvYWRlcnMsIGxvYWRPcHRpb25zfSA9IHN0YXRlO1xuICByZXR1cm4gd2l0aFRhc2soXG4gICAgc3RhdGVXaXRoUHJvZ3Jlc3MsXG4gICAgbWFrZUxvYWRGaWxlVGFzayhcbiAgICAgIGZpbGUsXG4gICAgICBuZXh0U3RhdGUuZmlsZUxvYWRpbmcgJiYgbmV4dFN0YXRlLmZpbGVMb2FkaW5nLmZpbGVDYWNoZSxcbiAgICAgIGxvYWRlcnMsXG4gICAgICBsb2FkT3B0aW9uc1xuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VMb2FkRmlsZVRhc2soZmlsZSwgZmlsZUNhY2hlLCBsb2FkZXJzOiBMb2FkZXJbXSA9IFtdLCBsb2FkT3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBMT0FEX0ZJTEVfVEFTSyh7ZmlsZSwgZmlsZUNhY2hlLCBsb2FkZXJzLCBsb2FkT3B0aW9uc30pLmJpbWFwKFxuICAgIC8vIHByZXR0aWVyIGlnbm9yZVxuICAgIC8vIHN1Y2Nlc3NcbiAgICBnZW4gPT5cbiAgICAgIG5leHRGaWxlQmF0Y2goe1xuICAgICAgICBnZW4sXG4gICAgICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIG9uRmluaXNoOiByZXN1bHQgPT5cbiAgICAgICAgICBwcm9jZXNzRmlsZUNvbnRlbnQoe1xuICAgICAgICAgICAgY29udGVudDogcmVzdWx0LFxuICAgICAgICAgICAgZmlsZUNhY2hlXG4gICAgICAgICAgfSlcbiAgICAgIH0pLFxuXG4gICAgLy8gZXJyb3JcbiAgICBlcnIgPT4gbG9hZEZpbGVzRXJyKGZpbGUubmFtZSwgZXJyKVxuICApO1xufVxuXG4vKipcbiAqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Qcm9jZXNzRmlsZUNvbnRlbnRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtjb250ZW50LCBmaWxlQ2FjaGV9ID0gYWN0aW9uLnBheWxvYWQ7XG5cbiAgY29uc3Qgc3RhdGVXaXRoUHJvZ3Jlc3MgPSB1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlcihzdGF0ZSwge1xuICAgIGZpbGVOYW1lOiBjb250ZW50LmZpbGVOYW1lLFxuICAgIHByb2dyZXNzOiB7cGVyY2VudDogMSwgbWVzc2FnZTogJ3Byb2Nlc3NpbmcuLi4nfVxuICB9KTtcblxuICByZXR1cm4gd2l0aFRhc2soXG4gICAgc3RhdGVXaXRoUHJvZ3Jlc3MsXG4gICAgUFJPQ0VTU19GSUxFX0RBVEEoe2NvbnRlbnQsIGZpbGVDYWNoZX0pLmJpbWFwKFxuICAgICAgcmVzdWx0ID0+IGxvYWRGaWxlU3RlcFN1Y2Nlc3Moe2ZpbGVOYW1lOiBjb250ZW50LmZpbGVOYW1lLCBmaWxlQ2FjaGU6IHJlc3VsdH0pLFxuICAgICAgZXJyID0+IGxvYWRGaWxlc0Vycihjb250ZW50LmZpbGVOYW1lLCBlcnIpXG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQcm9ncmVzcyhwcmV2UHJvZ3Jlc3MgPSB7fSwgcHJvZ3Jlc3MpIHtcbiAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcmVjZWl2aW5nIHF1ZXJ5IG1ldGFkYXRhIG9yIG90aGVyIGNhc2VzIHdlIGRvbid0XG4gIC8vIGhhdmUgYW4gdXBkYXRlIGZvciB0aGUgdXNlci5cbiAgaWYgKCFwcm9ncmVzcyB8fCAhcHJvZ3Jlc3MucGVyY2VudCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGVyY2VudDogcHJvZ3Jlc3MucGVyY2VudFxuICB9O1xufVxuXG4vKipcbiAqIGdldHMgY2FsbGVkIHdpdGggcGF5bG9hZCA9IEFzeW5jR2VuZXJhdG9yPD8/Pz5cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBuZXh0RmlsZUJhdGNoVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7XG4gICAgcGF5bG9hZDoge2dlbiwgZmlsZU5hbWUsIHByb2dyZXNzLCBhY2N1bXVsYXRlZCwgb25GaW5pc2h9XG4gIH06IFZpc1N0YXRlQWN0aW9ucy5OZXh0RmlsZUJhdGNoVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHBhcnNlUHJvZ3Jlc3Moc3RhdGUuZmlsZUxvYWRpbmdQcm9ncmVzc1tmaWxlTmFtZV0sIHByb2dyZXNzKVxuICB9KTtcbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIFVOV1JBUF9UQVNLKGdlbi5uZXh0KCkpLmJpbWFwKFxuICAgICAgKHt2YWx1ZSwgZG9uZX0pID0+IHtcbiAgICAgICAgcmV0dXJuIGRvbmVcbiAgICAgICAgICA/IG9uRmluaXNoKGFjY3VtdWxhdGVkKVxuICAgICAgICAgIDogbmV4dEZpbGVCYXRjaCh7XG4gICAgICAgICAgICAgIGdlbixcbiAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgIHByb2dyZXNzOiB2YWx1ZS5wcm9ncmVzcyxcbiAgICAgICAgICAgICAgYWNjdW11bGF0ZWQ6IHZhbHVlLFxuICAgICAgICAgICAgICBvbkZpbmlzaFxuICAgICAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyID0+IGxvYWRGaWxlc0VycihmaWxlTmFtZSwgZXJyKVxuICAgIClcbiAgKTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBsb2FkaW5nIGZpbGUgZXJyb3JcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNFcnJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtlcnJvciwgZmlsZU5hbWV9OiBWaXNTdGF0ZUFjdGlvbnMuTG9hZEZpbGVzRXJyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyB1cGRhdGUgdWkgd2l0aCBlcnJvciBtZXNzYWdlXG4gIENvbnNvbGUud2FybihlcnJvcik7XG4gIGlmICghc3RhdGUuZmlsZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qge2ZpbGVzVG9Mb2FkLCBvbkZpbmlzaCwgZmlsZUNhY2hlfSA9IHN0YXRlLmZpbGVMb2FkaW5nO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtlcnJvcn1cbiAgfSk7XG5cbiAgLy8ga2ljayBvZmYgbmV4dCBmaWxlIG9yIGZpbmlzaFxuICByZXR1cm4gd2l0aFRhc2soXG4gICAgbmV4dFN0YXRlLFxuICAgIERFTEFZX1RBU0soMjAwKS5tYXAoZmlsZXNUb0xvYWQubGVuZ3RoID8gbG9hZE5leHRGaWxlIDogKCkgPT4gb25GaW5pc2goZmlsZUNhY2hlKSlcbiAgKTtcbn07XG5cbi8qKlxuICogV2hlbiBzZWxlY3QgZGF0YXNldCBmb3IgZXhwb3J0LCBhcHBseSBjcHUgZmlsdGVyIHRvIHNlbGVjdGVkIGRhdGFzZXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBseUNQVUZpbHRlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZH06IFZpc1N0YXRlQWN0aW9ucy5BcHBseUNQVUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgLy8gYXBwbHkgY3B1RmlsdGVyXG4gIGNvbnN0IGRhdGFJZHMgPSB0b0FycmF5KGRhdGFJZCk7XG5cbiAgcmV0dXJuIGRhdGFJZHMucmVkdWNlKChhY2N1LCBpZCkgPT4gZmlsdGVyRGF0YXNldENQVShhY2N1LCBpZCksIHN0YXRlKTtcbn07XG5cbi8qKlxuICogVXNlciBpbnB1dCB0byB1cGRhdGUgdGhlIGluZm8gb2YgdGhlIG1hcFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldE1hcEluZm9VcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldE1hcEluZm9VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbWFwSW5mbzoge1xuICAgIC4uLnN0YXRlLm1hcEluZm8sXG4gICAgLi4uYWN0aW9uLmluZm9cbiAgfVxufSk7XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgQWxsIGxheWVyIGRvbWFpbiBhbmQgbGF5ZXIgZGF0YSBvZiBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdExheWVycyhcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBkYXRhc2V0czogRGF0YXNldHNcbik6IHtzdGF0ZTogVmlzU3RhdGU7IG5ld0xheWVyczogTGF5ZXJbXX0ge1xuICBjb25zdCBlbXB0eTogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBkZWZhdWx0TGF5ZXJzID0gT2JqZWN0LnZhbHVlcyhkYXRhc2V0cykucmVkdWNlKChhY2N1OiBMYXllcltdLCBkYXRhc2V0KSA9PiB7XG4gICAgY29uc3QgZm91bmRMYXllcnMgPSBmaW5kRGVmYXVsdExheWVyKGRhdGFzZXQsIHN0YXRlLmxheWVyQ2xhc3Nlcyk7XG4gICAgcmV0dXJuIGZvdW5kTGF5ZXJzICYmIGZvdW5kTGF5ZXJzLmxlbmd0aCA/IGFjY3UuY29uY2F0KGZvdW5kTGF5ZXJzKSA6IGFjY3U7XG4gIH0sIGVtcHR5KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXRlOiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxheWVyczogWy4uLnN0YXRlLmxheWVycywgLi4uZGVmYXVsdExheWVyc10sXG4gICAgICBsYXllck9yZGVyOiBbXG4gICAgICAgIC8vIHB1dCBuZXcgbGF5ZXJzIG9uIHRvcCBvZiBvbGQgb25lc1xuICAgICAgICAuLi5kZWZhdWx0TGF5ZXJzLm1hcCgoXywgaSkgPT4gc3RhdGUubGF5ZXJzLmxlbmd0aCArIGkpLFxuICAgICAgICAuLi5zdGF0ZS5sYXllck9yZGVyXG4gICAgICBdXG4gICAgfSxcbiAgICBuZXdMYXllcnM6IGRlZmF1bHRMYXllcnNcbiAgfTtcbn1cblxuLyoqXG4gKiBoZWxwZXIgZnVuY3Rpb24gdG8gZmluZCBkZWZhdWx0IHRvb2x0aXBzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhc2V0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERlZmF1bHRUb29sdGlwcyhzdGF0ZSwgZGF0YXNldCkge1xuICBjb25zdCB0b29sdGlwRmllbGRzID0gZmluZEZpZWxkc1RvU2hvdyh7XG4gICAgLi4uZGF0YXNldCxcbiAgICBtYXhEZWZhdWx0VG9vbHRpcHM6IHN0YXRlLm1heERlZmF1bHRUb29sdGlwc1xuICB9KTtcbiAgY29uc3QgbWVyZ2VkID0ge1xuICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLmZpZWxkc1RvU2hvdyxcbiAgICAuLi50b29sdGlwRmllbGRzXG4gIH07XG5cbiAgcmV0dXJuIHNldChbJ2ludGVyYWN0aW9uQ29uZmlnJywgJ3Rvb2x0aXAnLCAnY29uZmlnJywgJ2ZpZWxkc1RvU2hvdyddLCBtZXJnZWQsIHN0YXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxGaWxlTG9hZGluZ1Byb2dyZXNzKGZpbGUsIGluZGV4KSB7XG4gIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8IGBVbnRpdGxlZCBGaWxlICR7aW5kZXh9YDtcbiAgcmV0dXJuIHtcbiAgICBbZmlsZU5hbWVdOiB7XG4gICAgICAvLyBwZXJjZW50IG9mIGN1cnJlbnQgZmlsZVxuICAgICAgcGVyY2VudDogMCxcbiAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgZmlsZU5hbWUsXG4gICAgICBlcnJvcjogbnVsbFxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7ZmlsZU5hbWUsIHByb2dyZXNzfSkge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIHJldHVybiBwaWNrXygnZmlsZUxvYWRpbmdQcm9ncmVzcycpKHBpY2tfKGZpbGVOYW1lKShtZXJnZV8ocHJvZ3Jlc3MpKSkoc3RhdGUpO1xufVxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gdXBkYXRlIGxheWVyIGRvbWFpbnMgZm9yIGFuIGFycmF5IG9mIGRhdGFzZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgZGF0YUlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgdXBkYXRlZEZpbHRlcj86IEZpbHRlclxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhSWRzID0gdHlwZW9mIGRhdGFJZCA9PT0gJ3N0cmluZycgPyBbZGF0YUlkXSA6IGRhdGFJZDtcbiAgY29uc3QgbmV3TGF5ZXJzOiBMYXllcltdID0gW107XG4gIGNvbnN0IG5ld0xheWVyRGF0YTogYW55W10gPSBbXTtcblxuICBzdGF0ZS5sYXllcnMuZm9yRWFjaCgob2xkTGF5ZXIsIGkpID0+IHtcbiAgICBpZiAob2xkTGF5ZXIuY29uZmlnLmRhdGFJZCAmJiBkYXRhSWRzLmluY2x1ZGVzKG9sZExheWVyLmNvbmZpZy5kYXRhSWQpKSB7XG4gICAgICAvLyBObyBuZWVkIHRvIHJlY2FsY3VsYXRlIGxheWVyIGRvbWFpbiBpZiBmaWx0ZXIgaGFzIGZpeGVkIGRvbWFpblxuICAgICAgY29uc3QgbmV3TGF5ZXIgPVxuICAgICAgICB1cGRhdGVkRmlsdGVyICYmIHVwZGF0ZWRGaWx0ZXIuZml4ZWREb21haW5cbiAgICAgICAgICA/IG9sZExheWVyXG4gICAgICAgICAgOiBvbGRMYXllci51cGRhdGVMYXllckRvbWFpbihzdGF0ZS5kYXRhc2V0cywgdXBkYXRlZEZpbHRlcik7XG5cbiAgICAgIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIHN0YXRlLmxheWVyRGF0YVtpXSk7XG5cbiAgICAgIG5ld0xheWVycy5wdXNoKGxheWVyKTtcbiAgICAgIG5ld0xheWVyRGF0YS5wdXNoKGxheWVyRGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheWVycy5wdXNoKG9sZExheWVyKTtcbiAgICAgIG5ld0xheWVyRGF0YS5wdXNoKHN0YXRlLmxheWVyRGF0YVtpXSk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBsYXllckRhdGE6IG5ld0xheWVyRGF0YVxuICB9O1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFuaW1hdGlvbkRvbWFpbjxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTKTogUyB7XG4gIC8vIG1lcmdlIGFsbCBhbmltYXRhYmxlIGxheWVyIGRvbWFpbiBhbmQgdXBkYXRlIGdsb2JhbCBjb25maWdcbiAgY29uc3QgYW5pbWF0YWJsZUxheWVycyA9IHN0YXRlLmxheWVycy5maWx0ZXIoXG4gICAgbCA9PlxuICAgICAgbC5jb25maWcuaXNWaXNpYmxlICYmXG4gICAgICBsLmNvbmZpZy5hbmltYXRpb24gJiZcbiAgICAgIGwuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkICYmXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRyaXAtbGF5ZXItb25seVxuICAgICAgQXJyYXkuaXNBcnJheShsLmFuaW1hdGlvbkRvbWFpbilcbiAgKTtcblxuICBpZiAoIWFuaW1hdGFibGVMYXllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgICBkZWZhdWx0VGltZUZvcm1hdDogbnVsbFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjb25zdCBtZXJnZWREb21haW46IFtudW1iZXIsIG51bWJlcl0gPSBhbmltYXRhYmxlTGF5ZXJzLnJlZHVjZShcbiAgICAoYWNjdSwgbGF5ZXIpID0+IFtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdHJpcC1sYXllci1vbmx5XG4gICAgICBNYXRoLm1pbihhY2N1WzBdLCBsYXllci5hbmltYXRpb25Eb21haW5bMF0pLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0cmlwLWxheWVyLW9ubHlcbiAgICAgIE1hdGgubWF4KGFjY3VbMV0sIGxheWVyLmFuaW1hdGlvbkRvbWFpblsxXSlcbiAgICBdLFxuICAgIFtOdW1iZXIoSW5maW5pdHkpLCAtSW5maW5pdHldXG4gICk7XG4gIGNvbnN0IGRlZmF1bHRUaW1lRm9ybWF0ID0gZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyKG1lcmdlZERvbWFpbik7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIGN1cnJlbnRUaW1lOiBpc0luUmFuZ2Uoc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lLCBtZXJnZWREb21haW4pXG4gICAgICAgID8gc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lXG4gICAgICAgIDogbWVyZ2VkRG9tYWluWzBdLFxuICAgICAgZG9tYWluOiBtZXJnZWREb21haW4sXG4gICAgICBkZWZhdWx0VGltZUZvcm1hdFxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiB0aGUgZWRpdG9yXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3Qgc2V0RWRpdG9yTW9kZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge21vZGV9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0RWRpdG9yTW9kZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBlZGl0b3I6IHtcbiAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgbW9kZSxcbiAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgfVxufSk7XG5cbi8vIGNvbnN0IGZlYXR1cmVUb0ZpbHRlclZhbHVlID0gKGZlYXR1cmUpID0+ICh7Li4uZmVhdHVyZSwgaWQ6IGZlYXR1cmUuaWR9KTtcbi8qKlxuICogVXBkYXRlIGVkaXRvciBmZWF0dXJlc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZlYXR1cmVzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZmVhdHVyZXMgPSBbXX06IFZpc1N0YXRlQWN0aW9ucy5TZXRGZWF0dXJlc1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbGFzdEZlYXR1cmUgPSBmZWF0dXJlcy5sZW5ndGggJiYgZmVhdHVyZXNbZmVhdHVyZXMubGVuZ3RoIC0gMV07XG5cbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAvLyBvbmx5IHNhdmUgbm9uZSBmaWx0ZXIgZmVhdHVyZXMgdG8gZWRpdG9yXG4gICAgICBmZWF0dXJlczogZmVhdHVyZXMuZmlsdGVyKGYgPT4gIWdldEZpbHRlcklkSW5GZWF0dXJlKGYpKSxcbiAgICAgIG1vZGU6IGxhc3RGZWF0dXJlICYmIGxhc3RGZWF0dXJlLnByb3BlcnRpZXMuaXNDbG9zZWQgPyBFRElUT1JfTU9ERVMuRURJVCA6IHN0YXRlLmVkaXRvci5tb2RlXG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHJpZXZlIGV4aXN0aW5nIGZlYXR1cmVcbiAgY29uc3Qge3NlbGVjdGVkRmVhdHVyZX0gPSBzdGF0ZS5lZGl0b3I7XG5cbiAgLy8gSWYgbm8gZmVhdHVyZSBpcyBzZWxlY3RlZCB3ZSBjYW4gc2ltcGx5IHJldHVybiBzaW5jZSBubyBvcGVyYXRpb25zXG4gIGlmICghc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xuICB9XG5cbiAgLy8gVE9ETzogY2hlY2sgaWYgdGhlIGZlYXR1cmUgaGFzIGNoYW5nZWRcbiAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVzLmZpbmQoZiA9PiBmLmlkID09PSBzZWxlY3RlZEZlYXR1cmUuaWQpO1xuXG4gIC8vIGlmIGZlYXR1cmUgaXMgcGFydCBvZiBhIGZpbHRlclxuICBjb25zdCBmaWx0ZXJJZCA9IGZlYXR1cmUgJiYgZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSk7XG4gIGlmIChmaWx0ZXJJZCAmJiBmZWF0dXJlKSB7XG4gICAgY29uc3QgZmVhdHVyZVZhbHVlID0gZmVhdHVyZVRvRmlsdGVyVmFsdWUoZmVhdHVyZSwgZmlsdGVySWQpO1xuICAgIGNvbnN0IGZpbHRlcklkeCA9IHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGZpbCA9PiBmaWwuaWQgPT09IGZpbHRlcklkKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgIGlkeDogZmlsdGVySWR4LFxuICAgICAgcHJvcDogJ3ZhbHVlJyxcbiAgICAgIHZhbHVlOiBmZWF0dXJlVmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgZmVhdHVyZVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3Qgc2V0U2VsZWN0ZWRGZWF0dXJlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZmVhdHVyZX06IFZpc1N0YXRlQWN0aW9ucy5TZXRTZWxlY3RlZEZlYXR1cmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZWRpdG9yOiB7XG4gICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgIHNlbGVjdGVkRmVhdHVyZTogZmVhdHVyZVxuICB9XG59KTtcblxuLyoqXG4gKiBEZWxldGUgZXhpc3RpbmcgZmVhdHVyZSBmcm9tIGZpbHRlcnNcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVGZWF0dXJlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZmVhdHVyZX06IFZpc1N0YXRlQWN0aW9ucy5EZWxldGVGZWF0dXJlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBpZiAoIWZlYXR1cmUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICAgIH1cbiAgfTtcblxuICBpZiAoZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSkpIHtcbiAgICBjb25zdCBmaWx0ZXJJZHggPSBuZXdTdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGdldEZpbHRlcklkSW5GZWF0dXJlKGZlYXR1cmUpKTtcblxuICAgIHJldHVybiBmaWx0ZXJJZHggPiAtMSA/IHJlbW92ZUZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtpZHg6IGZpbHRlcklkeH0pIDogbmV3U3RhdGU7XG4gIH1cblxuICAvLyBtb2RpZnkgZWRpdG9yIG9iamVjdFxuICBjb25zdCBuZXdFZGl0b3IgPSB7XG4gICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgIGZlYXR1cmVzOiBzdGF0ZS5lZGl0b3IuZmVhdHVyZXMuZmlsdGVyKGYgPT4gZi5pZCAhPT0gZmVhdHVyZS5pZCksXG4gICAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IG5ld0VkaXRvclxuICB9O1xufVxuXG4vKipcbiAqIFRvZ2dsZSBmZWF0dXJlIGFzIGxheWVyIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBvbHlnb25GaWx0ZXJMYXllclVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgcGF5bG9hZDogVmlzU3RhdGVBY3Rpb25zLlNldFBvbHlnb25GaWx0ZXJMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2xheWVyLCBmZWF0dXJlfSA9IHBheWxvYWQ7XG4gIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSk7XG5cbiAgLy8gbGV0IG5ld0ZpbHRlciA9IG51bGw7XG4gIGxldCBmaWx0ZXJJZHg7XG4gIGxldCBuZXdMYXllcklkID0gW2xheWVyLmlkXTtcbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIC8vIElmIHBvbHlnb24gZmlsdGVyIGFscmVhZHkgZXhpc3RzLCB3ZSBuZWVkIHRvIGZpbmQgb3V0IGlmIHRoZSBjdXJyZW50IGxheWVyIGlzIGFscmVhZHkgaW5jbHVkZWRcbiAgaWYgKGZpbHRlcklkKSB7XG4gICAgZmlsdGVySWR4ID0gc3RhdGUuZmlsdGVycy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBmaWx0ZXJJZCk7XG5cbiAgICBpZiAoIXN0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSkge1xuICAgICAgLy8gd2hhdCBpZiBmaWx0ZXIgZG9lc24ndCBleGlzdD8uLi4gbm90IHBvc3NpYmxlLlxuICAgICAgLy8gYmVjYXVzZSBmZWF0dXJlcyBpbiB0aGUgZWRpdG9yIGlzIHBhc3NlZCBpbiBmcm9tIGZpbHRlcnMgYW5kIGVkaXRvcnMuXG4gICAgICAvLyBidXQgd2Ugd2lsbCBtb3ZlIHRoaXMgZmVhdHVyZSBiYWNrIHRvIGVkaXRvciBqdXN0IGluIGNhc2VcbiAgICAgIGNvbnN0IG5vbmVGaWx0ZXJGZWF0dXJlID0ge1xuICAgICAgICAuLi5mZWF0dXJlLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgLi4uZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgIGZpbHRlcklkOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBlZGl0b3I6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAgICAgZmVhdHVyZXM6IFsuLi5zdGF0ZS5lZGl0b3IuZmVhdHVyZXMsIG5vbmVGaWx0ZXJGZWF0dXJlXSxcbiAgICAgICAgICBzZWxlY3RlZEZlYXR1cmU6IG5vbmVGaWx0ZXJGZWF0dXJlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbZmlsdGVySWR4XTtcbiAgICBjb25zdCB7bGF5ZXJJZCA9IFtdfSA9IGZpbHRlcjtcbiAgICBjb25zdCBpc0xheWVySW5jbHVkZWQgPSBsYXllcklkLmluY2x1ZGVzKGxheWVyLmlkKTtcblxuICAgIG5ld0xheWVySWQgPSBpc0xheWVySW5jbHVkZWRcbiAgICAgID8gLy8gaWYgbGF5ZXIgaXMgaW5jbHVkZWQsIHJlbW92ZSBpdFxuICAgICAgICBsYXllcklkLmZpbHRlcihsID0+IGwgIT09IGxheWVyLmlkKVxuICAgICAgOiBbLi4ubGF5ZXJJZCwgbGF5ZXIuaWRdO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIHdlIGhhdmVuJ3QgY3JlYXRlIHRoZSBwb2x5Z29uIGZpbHRlciwgY3JlYXRlIGl0XG4gICAgY29uc3QgbmV3RmlsdGVyID0gZ2VuZXJhdGVQb2x5Z29uRmlsdGVyKFtdLCBmZWF0dXJlKTtcbiAgICBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmxlbmd0aDtcblxuICAgIC8vIGFkZCBmZWF0dXJlLCByZW1vdmUgZmVhdHVyZSBmcm9tIGVpZHRvclxuICAgIG5ld1N0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBmaWx0ZXJzOiBbLi4uc3RhdGUuZmlsdGVycywgbmV3RmlsdGVyXSxcbiAgICAgIGVkaXRvcjoge1xuICAgICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAgIGZlYXR1cmVzOiBzdGF0ZS5lZGl0b3IuZmVhdHVyZXMuZmlsdGVyKGYgPT4gZi5pZCAhPT0gZmVhdHVyZS5pZCksXG4gICAgICAgIHNlbGVjdGVkRmVhdHVyZTogbmV3RmlsdGVyLnZhbHVlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgaWR4OiBmaWx0ZXJJZHgsXG4gICAgcHJvcDogJ2xheWVySWQnLFxuICAgIHZhbHVlOiBuZXdMYXllcklkXG4gIH0pO1xufVxuXG4vKipcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0VGFibGVDb2x1bW5VcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGNvbHVtbiwgbW9kZX06IFZpc1N0YXRlQWN0aW9ucy5Tb3J0VGFibGVDb2x1bW5VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbGV0IHNvcnRNb2RlID0gbW9kZTtcbiAgaWYgKCFzb3J0TW9kZSkge1xuICAgIGNvbnN0IGN1cnJlbnRNb2RlID0gZ2V0KGRhdGFzZXQsIFsnc29ydENvbHVtbicsIGNvbHVtbl0pO1xuICAgIC8vIEB0cy1pZ25vcmUgLSBzaG91bGQgYmUgZml4YWJsZSBpbiBhIFRTIGZpbGVcbiAgICBzb3J0TW9kZSA9IGN1cnJlbnRNb2RlXG4gICAgICA/IE9iamVjdC5rZXlzKFNPUlRfT1JERVIpLmZpbmQobSA9PiBtICE9PSBjdXJyZW50TW9kZSlcbiAgICAgIDogU09SVF9PUkRFUi5BU0NFTkRJTkc7XG4gIH1cblxuICBjb25zdCBzb3J0ZWQgPSBzb3J0RGF0YXNldEJ5Q29sdW1uKGRhdGFzZXQsIGNvbHVtbiwgc29ydE1vZGUpO1xuICByZXR1cm4gc2V0KFsnZGF0YXNldHMnLCBkYXRhSWRdLCBzb3J0ZWQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGluVGFibGVDb2x1bW5VcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGNvbHVtbn06IFZpc1N0YXRlQWN0aW9ucy5QaW5UYWJsZUNvbHVtblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBuZXdEYXRhc2V0ID0gcGluVGFibGVDb2x1bW5zKGRhdGFzZXQsIGNvbHVtbik7XG5cbiAgcmV0dXJuIHNldChbJ2RhdGFzZXRzJywgZGF0YUlkXSwgbmV3RGF0YXNldCwgc3RhdGUpO1xufVxuXG4vKipcbiAqIENvcHkgY29sdW1uIGNvbnRlbnQgYXMgc3RyaW5nc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlUYWJsZUNvbHVtblVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZCwgY29sdW1ufTogVmlzU3RhdGVBY3Rpb25zLkNvcHlUYWJsZUNvbHVtblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBmaWVsZElkeCA9IGRhdGFzZXQuZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gY29sdW1uKTtcbiAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7dHlwZX0gPSBkYXRhc2V0LmZpZWxkc1tmaWVsZElkeF07XG4gIGNvbnN0IHRleHQgPSBkYXRhc2V0LmRhdGFDb250YWluZXJcbiAgICAubWFwKHJvdyA9PiBwYXJzZUZpZWxkVmFsdWUocm93LnZhbHVlQXQoZmllbGRJZHgpLCB0eXBlKSwgdHJ1ZSlcbiAgICAuam9pbignXFxuJyk7XG5cbiAgY29weSh0ZXh0KTtcblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogVXBkYXRlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlRWRpdG9yVmlzaWJpbGl0eVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRWRpdG9yVmlzaWJpbGl0eVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHZpc2libGU6ICFzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZHgsIGNvbmZpZ306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IG9sZEZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcbiAgaWYgKCFvbGRGaWx0ZXIpIHtcbiAgICBDb25zb2xlLmVycm9yKGBmaWx0ZXJzLiR7aWR4fSBpcyB1bmRlZmluZWRgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKG9sZEZpbHRlci50eXBlICE9PSBGSUxURVJfVFlQRVMudGltZVJhbmdlKSB7XG4gICAgQ29uc29sZS5lcnJvcihcbiAgICAgIGBzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnIGNhbiBvbmx5IGJlIGNhbGxlZCB0byB1cGRhdGUgYSB0aW1lIGZpbHRlci4gY2hlY2sgZmlsdGVyLnR5cGUgPT09ICd0aW1lUmFuZ2UnYFxuICAgICk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlcyA9IGNoZWNrVGltZUNvbmZpZ0FyZ3MoY29uZmlnKTtcblxuICByZXR1cm4gcGlja18oJ2ZpbHRlcnMnKShzd2FwXyhtZXJnZV8odXBkYXRlcykob2xkRmlsdGVyKSkpKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpIHtcbiAgY29uc3QgYWxsb3dlZCA9IFsndGltZUZvcm1hdCcsICd0aW1lem9uZSddO1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoKGFjY3UsIHByb3ApID0+IHtcbiAgICBpZiAoIWFsbG93ZWQuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWcgdGFrZXMgdGltZUZvcm1hdCBhbmQvb3IgdGltZXpvbmUgYXMgb3B0aW9ucywgZm91bmQgJHtwcm9wfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9XG5cbiAgICAvLyBoZXJlIHdlIGFyZSBOT1QgY2hlY2tpbmcgaWYgdGltZXpvbmUgb3IgdGltZUZvcm1hdCBpbnB1dCBpcyB2YWxpZFxuICAgIGFjY3VbcHJvcF0gPSBjb25maWdbcHJvcF07XG4gICAgcmV0dXJuIGFjY3U7XG4gIH0sIHt9KTtcbn1cbi8qKlxuICogVXBkYXRlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7Y29uZmlnfTogVmlzU3RhdGVBY3Rpb25zLlNldExheWVyQW5pbWF0aW9uVGltZUNvbmZpZ0FjdGlvblxuKTogVmlzU3RhdGUge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB1cGRhdGVzID0gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpO1xuICByZXR1cm4gcGlja18oJ2FuaW1hdGlvbkNvbmZpZycpKG1lcmdlXyh1cGRhdGVzKSkoc3RhdGUpO1xufVxuIl19
|