@kepler.gl/reducers 3.3.0-alpha.5 → 3.3.0-alpha.7
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/cjs/combined-updaters.js +491 -0
- package/dist/cjs/composer-helpers.js +101 -0
- package/dist/cjs/composers.js +22 -0
- package/dist/cjs/core.js +105 -0
- package/dist/cjs/data-utils.js +53 -0
- package/dist/cjs/export-utils.js +91 -0
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/cjs/interaction-utils.js +105 -0
- package/dist/cjs/layer-utils.js +635 -0
- package/dist/cjs/map-state-updaters.js +658 -0
- package/dist/cjs/map-state.js +35 -0
- package/dist/cjs/map-style-updaters.js +660 -0
- package/dist/cjs/map-style.js +33 -0
- package/dist/cjs/merger-handler.js +105 -0
- package/dist/cjs/middleware.js +27 -0
- package/dist/cjs/provider-state-updaters.js +465 -0
- package/dist/cjs/provider-state.js +34 -0
- package/dist/cjs/root.js +207 -0
- package/dist/cjs/ui-state-updaters.js +934 -0
- package/dist/cjs/ui-state.js +36 -0
- package/dist/cjs/vis-state-merger.js +1193 -0
- package/dist/cjs/vis-state-selectors.js +30 -0
- package/dist/{vis-state-updaters.js → cjs/vis-state-updaters.js} +338 -47
- package/dist/cjs/vis-state.js +35 -0
- package/dist/combined-updaters.d.ts +1 -1
- package/dist/esm/combined-updaters.js +484 -0
- package/dist/esm/composer-helpers.js +85 -0
- package/dist/esm/composers.js +14 -0
- package/dist/esm/core.js +101 -0
- package/dist/esm/data-utils.js +47 -0
- package/dist/esm/export-utils.js +86 -0
- package/dist/esm/index.js +62 -0
- package/dist/esm/interaction-utils.js +96 -0
- package/dist/esm/layer-utils.js +602 -0
- package/dist/esm/map-state-updaters.js +650 -0
- package/dist/esm/map-state.js +29 -0
- package/dist/esm/map-style-updaters.js +652 -0
- package/dist/esm/map-style.js +27 -0
- package/dist/esm/merger-handler.js +96 -0
- package/dist/esm/middleware.js +19 -0
- package/dist/esm/provider-state-updaters.js +458 -0
- package/dist/esm/provider-state.js +28 -0
- package/dist/esm/root.js +201 -0
- package/dist/esm/ui-state-updaters.js +929 -0
- package/dist/esm/ui-state.js +30 -0
- package/dist/esm/vis-state-merger.js +1161 -0
- package/dist/esm/vis-state-selectors.js +24 -0
- package/dist/esm/vis-state-updaters.js +4320 -0
- package/dist/esm/vis-state.js +29 -0
- package/dist/ui-state-updaters.d.ts +15 -1
- package/dist/vis-state-updaters.d.ts +27 -0
- package/package.json +31 -22
- package/dist/combined-updaters.js +0 -491
- package/dist/composer-helpers.js +0 -101
- package/dist/composers.js +0 -22
- package/dist/core.js +0 -105
- package/dist/data-utils.js +0 -53
- package/dist/export-utils.js +0 -91
- package/dist/interaction-utils.js +0 -105
- package/dist/layer-utils.js +0 -635
- package/dist/map-state-updaters.js +0 -649
- package/dist/map-state.js +0 -35
- package/dist/map-style-updaters.js +0 -660
- package/dist/map-style.js +0 -33
- package/dist/merger-handler.js +0 -105
- package/dist/middleware.js +0 -27
- package/dist/provider-state-updaters.js +0 -465
- package/dist/provider-state.js +0 -34
- package/dist/root.js +0 -207
- package/dist/ui-state-updaters.js +0 -905
- package/dist/ui-state.js +0 -36
- package/dist/vis-state-merger.js +0 -1193
- package/dist/vis-state-selectors.js +0 -30
- package/dist/vis-state.js +0 -35
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.setMapSplitModeUpdater = exports.replaceDataInMapUpdater = exports.loadFilesSuccessUpdater = exports.isValidConfig = exports.defaultAddDataToMapOptions = exports.combinedSetMapViewModeUpdater = exports.combinedMapStyleChangeUpdater = exports.combinedLayerTypeChangeUpdater = exports.addDataToMapUpdater = exports.addDataToMapComposed = void 0;
|
|
8
|
+
exports.syncGlobeConfigColorsToStyle = syncGlobeConfigColorsToStyle;
|
|
9
|
+
exports.toggleSplitMapUpdater = void 0;
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
var _uiStateUpdaters = require("./ui-state-updaters");
|
|
12
|
+
var _visStateUpdaters = require("./vis-state-updaters");
|
|
13
|
+
var _mapStateUpdaters = require("./map-state-updaters");
|
|
14
|
+
var _mapStyleUpdaters = require("./map-style-updaters");
|
|
15
|
+
var _processors = require("@kepler.gl/processors");
|
|
16
|
+
var _composerHelpers = require("./composer-helpers");
|
|
17
|
+
var _utils = require("@kepler.gl/utils");
|
|
18
|
+
var _dataUtils = require("./data-utils");
|
|
19
|
+
var _constants = require("@kepler.gl/constants");
|
|
20
|
+
var _deckglLayers = require("@kepler.gl/deckgl-layers");
|
|
21
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
22
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
|
|
23
|
+
// Copyright contributors to the kepler.gl project
|
|
24
|
+
// compose action to apply result multiple reducers, with the output of one
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Some actions will affect the entire kepler.lg instance state.
|
|
28
|
+
* The updaters for these actions is exported as `combinedUpdaters`. These updater take the entire instance state
|
|
29
|
+
* as the first argument. Read more about [Using updaters](../advanced-usage/using-updaters.md)
|
|
30
|
+
* @public
|
|
31
|
+
* @example
|
|
32
|
+
*
|
|
33
|
+
* import keplerGlReducer, {combinedUpdaters} from '@kepler.gl/reducers';
|
|
34
|
+
* // Root Reducer
|
|
35
|
+
* const reducers = combineReducers({
|
|
36
|
+
* keplerGl: keplerGlReducer,
|
|
37
|
+
* app: appReducer
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* const composedReducer = (state, action) => {
|
|
41
|
+
* switch (action.type) {
|
|
42
|
+
* // add data to map after receiving data from remote sources
|
|
43
|
+
* case 'LOAD_REMOTE_RESOURCE_SUCCESS':
|
|
44
|
+
* return {
|
|
45
|
+
* ...state,
|
|
46
|
+
* keplerGl: {
|
|
47
|
+
* ...state.keplerGl,
|
|
48
|
+
* // pass in kepler.gl instance state to combinedUpdaters
|
|
49
|
+
* map: combinedUpdaters.addDataToMapUpdater(
|
|
50
|
+
* state.keplerGl.map,
|
|
51
|
+
* {
|
|
52
|
+
* payload: {
|
|
53
|
+
* datasets: action.datasets,
|
|
54
|
+
* options: {readOnly: true},
|
|
55
|
+
* config: action.config
|
|
56
|
+
* }
|
|
57
|
+
* }
|
|
58
|
+
* )
|
|
59
|
+
* }
|
|
60
|
+
* };
|
|
61
|
+
* }
|
|
62
|
+
* return reducers(state, action);
|
|
63
|
+
* };
|
|
64
|
+
*
|
|
65
|
+
* export default composedReducer;
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
69
|
+
// @ts-ignore
|
|
70
|
+
var combinedUpdaters = null;
|
|
71
|
+
/* eslint-enable @typescript-eslint/no-unused-vars */
|
|
72
|
+
|
|
73
|
+
var isValidConfig = exports.isValidConfig = function isValidConfig(config) {
|
|
74
|
+
return (0, _utils.isPlainObject)(config) && (0, _utils.isPlainObject)(config.config) && config.version;
|
|
75
|
+
};
|
|
76
|
+
var defaultAddDataToMapOptions = exports.defaultAddDataToMapOptions = {
|
|
77
|
+
centerMap: true,
|
|
78
|
+
keepExistingConfig: false,
|
|
79
|
+
autoCreateLayers: true,
|
|
80
|
+
autoCreateTooltips: true
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Combine data and full configuration update in a single action
|
|
85
|
+
*
|
|
86
|
+
* @memberof combinedUpdaters
|
|
87
|
+
* @param {Object} state kepler.gl instance state, containing all subreducer state
|
|
88
|
+
* @param {Object} action
|
|
89
|
+
* @param {Object} action.payload `{datasets, options, config}`
|
|
90
|
+
* @param action.payload.datasets - ***required** datasets can be a dataset or an array of datasets
|
|
91
|
+
* Each dataset object needs to have `info` and `data` property.
|
|
92
|
+
* @param [action.payload.options] option object `{centerMap: true, padding: {left: 300}}`
|
|
93
|
+
* @param [action.payload.config] map config
|
|
94
|
+
* @param [action.payload.info] map info contains title and description
|
|
95
|
+
* @returns nextState
|
|
96
|
+
*
|
|
97
|
+
* @typedef {Object} Dataset
|
|
98
|
+
* @property info -info of a dataset
|
|
99
|
+
* @property info.id - id of this dataset. If config is defined, `id` should matches the `dataId` in config.
|
|
100
|
+
* @property info.label - A display name of this dataset
|
|
101
|
+
* @property data - ***required** The data object, in a tabular format with 2 properties `fields` and `rows`
|
|
102
|
+
* @property data.fields - ***required** Array of fields,
|
|
103
|
+
* @property data.fields.name - ***required** Name of the field,
|
|
104
|
+
* @property data.rows - ***required** Array of rows, in a tabular format with `fields` and `rows`
|
|
105
|
+
*
|
|
106
|
+
* @public
|
|
107
|
+
*/
|
|
108
|
+
var addDataToMapUpdater = exports.addDataToMapUpdater = function addDataToMapUpdater(state, _ref) {
|
|
109
|
+
var _datasets$, _datasets$2, _datasets$3;
|
|
110
|
+
var payload = _ref.payload;
|
|
111
|
+
var datasets = payload.datasets,
|
|
112
|
+
config = payload.config,
|
|
113
|
+
info = payload.info;
|
|
114
|
+
var options = _objectSpread(_objectSpread({}, defaultAddDataToMapOptions), payload.options);
|
|
115
|
+
|
|
116
|
+
// check if progressive loading dataset by batches, and update visState directly
|
|
117
|
+
var isProgressiveLoading = Array.isArray(datasets) && ((_datasets$ = datasets[0]) === null || _datasets$ === void 0 ? void 0 : _datasets$.info.format) === 'arrow' && ((_datasets$2 = datasets[0]) === null || _datasets$2 === void 0 ? void 0 : _datasets$2.info.id) && ((_datasets$3 = datasets[0]) === null || _datasets$3 === void 0 ? void 0 : _datasets$3.info.id) in state.visState.datasets;
|
|
118
|
+
if (isProgressiveLoading) {
|
|
119
|
+
return (0, _composerHelpers.compose_)([(0, _composerHelpers.pick_)('visState')((0, _composerHelpers.apply_)(_visStateUpdaters.updateVisDataUpdater, {
|
|
120
|
+
datasets: datasets,
|
|
121
|
+
options: options,
|
|
122
|
+
config: config
|
|
123
|
+
}))])(state);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// @ts-expect-error
|
|
127
|
+
var parsedConfig = config;
|
|
128
|
+
if (isValidConfig(config)) {
|
|
129
|
+
// if passed in saved config
|
|
130
|
+
// @ts-expect-error
|
|
131
|
+
parsedConfig = state.visState.schema.parseSavedConfig(config);
|
|
132
|
+
}
|
|
133
|
+
var oldLayers = state.visState.layers;
|
|
134
|
+
var filterNewlyAddedLayers = function filterNewlyAddedLayers(layers) {
|
|
135
|
+
return layers.filter(function (nl) {
|
|
136
|
+
return !oldLayers.find(function (ol) {
|
|
137
|
+
return ol === nl;
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// Returns undefined if not found, to make typescript happy
|
|
143
|
+
var findMapBoundsIfCentered = function findMapBoundsIfCentered(layers) {
|
|
144
|
+
var bounds = options.centerMap && (0, _dataUtils.findMapBounds)(layers);
|
|
145
|
+
return bounds ? bounds : undefined;
|
|
146
|
+
};
|
|
147
|
+
return (0, _composerHelpers.compose_)([(0, _composerHelpers.pick_)('visState')(
|
|
148
|
+
// this part can be async
|
|
149
|
+
(0, _composerHelpers.apply_)(_visStateUpdaters.updateVisDataUpdater, {
|
|
150
|
+
datasets: datasets,
|
|
151
|
+
options: options,
|
|
152
|
+
config: parsedConfig
|
|
153
|
+
})), (0, _composerHelpers.if_)(Boolean(info), (0, _composerHelpers.pick_)('visState')((0, _composerHelpers.apply_)(_visStateUpdaters.setMapInfoUpdater, {
|
|
154
|
+
info: info
|
|
155
|
+
}))),
|
|
156
|
+
// Note that fit bounds here won't be called in case datasets are created in Tasks.
|
|
157
|
+
// A separate Task to update bounds is created once the datasets are ready.
|
|
158
|
+
(0, _composerHelpers.with_)(function (_ref2) {
|
|
159
|
+
var visState = _ref2.visState;
|
|
160
|
+
return (0, _composerHelpers.pick_)('mapState')((0, _composerHelpers.apply_)(_mapStateUpdaters.receiveMapConfigUpdater, (0, _composerHelpers.payload_)({
|
|
161
|
+
config: parsedConfig,
|
|
162
|
+
options: options,
|
|
163
|
+
bounds: findMapBoundsIfCentered(filterNewlyAddedLayers(visState.layers))
|
|
164
|
+
})));
|
|
165
|
+
}), (0, _composerHelpers.pick_)('mapStyle')((0, _composerHelpers.apply_)(_mapStyleUpdaters.receiveMapConfigUpdater, (0, _composerHelpers.payload_)({
|
|
166
|
+
config: parsedConfig,
|
|
167
|
+
options: options
|
|
168
|
+
}))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.apply_)(_uiStateUpdaters.receiveMapConfigUpdater, (0, _composerHelpers.payload_)({
|
|
169
|
+
config: parsedConfig,
|
|
170
|
+
options: options
|
|
171
|
+
}))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.apply_)(_uiStateUpdaters.loadFilesSuccessUpdater, (0, _composerHelpers.payload_)(null))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.apply_)(_uiStateUpdaters.toggleModalUpdater, (0, _composerHelpers.payload_)(null))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.merge_)(Object.prototype.hasOwnProperty.call(options, 'readOnly') ? {
|
|
172
|
+
readOnly: options.readOnly
|
|
173
|
+
} : {}))])(state);
|
|
174
|
+
};
|
|
175
|
+
var loadFilesSuccessUpdater = exports.loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state, action) {
|
|
176
|
+
// still more to load
|
|
177
|
+
var payloads = (0, _processors.filesToDataPayload)(action.result);
|
|
178
|
+
var nextState = (0, _composerHelpers.compose_)([(0, _composerHelpers.pick_)('visState')((0, _composerHelpers.merge_)({
|
|
179
|
+
fileLoading: false,
|
|
180
|
+
fileLoadingProgress: {}
|
|
181
|
+
}))])(state);
|
|
182
|
+
// make multiple add data to map calls
|
|
183
|
+
var stateWithData = (0, _composerHelpers.compose_)(payloads.map(function (p) {
|
|
184
|
+
return (0, _composerHelpers.apply_)(addDataToMapUpdater, (0, _composerHelpers.payload_)(p));
|
|
185
|
+
}))(nextState);
|
|
186
|
+
return stateWithData;
|
|
187
|
+
};
|
|
188
|
+
var addDataToMapComposed = exports.addDataToMapComposed = addDataToMapUpdater;
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Helper which updates map overlay blending mode in visState,
|
|
192
|
+
* but only if it's not currently in the `normal` mode.
|
|
193
|
+
*/
|
|
194
|
+
var updateOverlayBlending = function updateOverlayBlending(overlayBlending) {
|
|
195
|
+
return function (visState) {
|
|
196
|
+
if (visState.overlayBlending !== _constants.OVERLAY_BLENDINGS.normal.value) {
|
|
197
|
+
return _objectSpread(_objectSpread({}, visState), {}, {
|
|
198
|
+
overlayBlending: overlayBlending
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
return visState;
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Helper which updates `darkBaseMapEnabled` in all the layers in visState which
|
|
207
|
+
* have this config setting (or in one specific layer if the `layerId` param is provided).
|
|
208
|
+
*/
|
|
209
|
+
var updateDarkBaseMapLayers = function updateDarkBaseMapLayers(darkBaseMapEnabled) {
|
|
210
|
+
var layerId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
211
|
+
return function (visState) {
|
|
212
|
+
return _objectSpread(_objectSpread({}, visState), {}, {
|
|
213
|
+
layers: visState.layers.map(function (layer) {
|
|
214
|
+
if (!layerId || layer.id === layerId) {
|
|
215
|
+
if (Object.prototype.hasOwnProperty.call(layer.visConfigSettings, 'darkBaseMapEnabled')) {
|
|
216
|
+
var visConfig = layer.config.visConfig;
|
|
217
|
+
return layer.updateLayerConfig({
|
|
218
|
+
visConfig: _objectSpread(_objectSpread({}, visConfig), {}, {
|
|
219
|
+
darkBaseMapEnabled: darkBaseMapEnabled
|
|
220
|
+
})
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return layer;
|
|
225
|
+
})
|
|
226
|
+
});
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Updater that changes the map style by calling mapStyleChangeUpdater on visState.
|
|
232
|
+
* In addition to that, it does the following:
|
|
233
|
+
*
|
|
234
|
+
* 1. Update map overlay blending mode in accordance with the colorMode of the
|
|
235
|
+
* base map, but only if it's not in the `normal` mode.
|
|
236
|
+
*
|
|
237
|
+
* 2. Update all the layers which have the `darkBaseMapEnabled` config setting
|
|
238
|
+
* adjusting it in accordance with the colorMode of the base map.
|
|
239
|
+
*
|
|
240
|
+
*/
|
|
241
|
+
var combinedMapStyleChangeUpdater = exports.combinedMapStyleChangeUpdater = function combinedMapStyleChangeUpdater(state, action) {
|
|
242
|
+
var _mapState$globe;
|
|
243
|
+
var payload = action.payload;
|
|
244
|
+
var mapStyle = state.mapStyle;
|
|
245
|
+
var getColorMode = function getColorMode(key) {
|
|
246
|
+
var _mapStyle$mapStyles$k;
|
|
247
|
+
return (_mapStyle$mapStyles$k = mapStyle.mapStyles[key]) === null || _mapStyle$mapStyles$k === void 0 ? void 0 : _mapStyle$mapStyles$k.colorMode;
|
|
248
|
+
};
|
|
249
|
+
var prevColorMode = getColorMode(mapStyle.styleType);
|
|
250
|
+
var nextColorMode = getColorMode(payload.styleType);
|
|
251
|
+
var visState = state.visState,
|
|
252
|
+
mapState = state.mapState;
|
|
253
|
+
if (nextColorMode !== prevColorMode) {
|
|
254
|
+
switch (nextColorMode) {
|
|
255
|
+
case _constants.BASE_MAP_COLOR_MODES.DARK:
|
|
256
|
+
visState = (0, _composerHelpers.compose_)([updateOverlayBlending(_constants.OVERLAY_BLENDINGS.screen.value), updateDarkBaseMapLayers(true)])(visState);
|
|
257
|
+
break;
|
|
258
|
+
case _constants.BASE_MAP_COLOR_MODES.LIGHT:
|
|
259
|
+
visState = (0, _composerHelpers.compose_)([updateOverlayBlending(_constants.OVERLAY_BLENDINGS.darken.value), updateDarkBaseMapLayers(false)])(visState);
|
|
260
|
+
break;
|
|
261
|
+
default:
|
|
262
|
+
// do nothing
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Update globe config colors when style changes and globe is enabled
|
|
267
|
+
if ((_mapState$globe = mapState.globe) !== null && _mapState$globe !== void 0 && _mapState$globe.enabled) {
|
|
268
|
+
// Switching from "No Basemap" to a basemap - restore basemap sub-toggles
|
|
269
|
+
if (payload.styleType !== _constants.NO_MAP_ID && mapStyle.styleType === _constants.NO_MAP_ID) {
|
|
270
|
+
mapState = _objectSpread(_objectSpread({}, mapState), {}, {
|
|
271
|
+
globe: _objectSpread(_objectSpread({}, mapState.globe), {}, {
|
|
272
|
+
config: _objectSpread(_objectSpread({}, mapState.globe.config), {}, {
|
|
273
|
+
basemap: true,
|
|
274
|
+
labels: true,
|
|
275
|
+
adminLines: true,
|
|
276
|
+
water: true
|
|
277
|
+
})
|
|
278
|
+
})
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
mapState = syncGlobeConfigColorsToStyle(mapState, mapStyle, payload.styleType);
|
|
282
|
+
}
|
|
283
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
284
|
+
visState: visState,
|
|
285
|
+
mapState: mapState,
|
|
286
|
+
mapStyle: (0, _mapStyleUpdaters.mapStyleChangeUpdater)(mapStyle, {
|
|
287
|
+
payload: _objectSpread({}, payload)
|
|
288
|
+
})
|
|
289
|
+
});
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Derive globe basemap colors (surface / water / admin lines) from a map style and
|
|
294
|
+
* return an updated mapState with those colors written into `globe.config`. Used both
|
|
295
|
+
* when the base map style changes and when entering globe mode, so the globe always
|
|
296
|
+
* reflects the currently selected basemap instead of the static DEFAULT_GLOBE_CONFIG.
|
|
297
|
+
*/
|
|
298
|
+
function syncGlobeConfigColorsToStyle(mapState, mapStyle, styleType) {
|
|
299
|
+
var _mapState$globe2;
|
|
300
|
+
if (!((_mapState$globe2 = mapState.globe) !== null && _mapState$globe2 !== void 0 && _mapState$globe2.enabled)) {
|
|
301
|
+
return mapState;
|
|
302
|
+
}
|
|
303
|
+
var nextStyleObj = mapStyle.mapStyles[styleType];
|
|
304
|
+
var nextGlobeConfig = _objectSpread({}, mapState.globe.config);
|
|
305
|
+
if (styleType === _constants.NO_MAP_ID) {
|
|
306
|
+
nextGlobeConfig.basemap = false;
|
|
307
|
+
nextGlobeConfig.labels = false;
|
|
308
|
+
nextGlobeConfig.adminLines = false;
|
|
309
|
+
nextGlobeConfig.water = false;
|
|
310
|
+
nextGlobeConfig.surfaceColor = _deckglLayers.DEFAULT_BASEMAP_COLOR.backgroundFillColor;
|
|
311
|
+
nextGlobeConfig.waterColor = _deckglLayers.DEFAULT_BASEMAP_COLOR.basemapWaterFillColor;
|
|
312
|
+
nextGlobeConfig.adminLinesColor = _deckglLayers.DEFAULT_BASEMAP_COLOR.basemapAdminLineColor;
|
|
313
|
+
} else {
|
|
314
|
+
var basemapColors = nextStyleObj ? (0, _deckglLayers.getBasemapColorsForStyle)(styleType, {
|
|
315
|
+
style: nextStyleObj.style,
|
|
316
|
+
layerGroups: nextStyleObj.layerGroups
|
|
317
|
+
}) :
|
|
318
|
+
// Style object not yet loaded - use known presets by style type
|
|
319
|
+
(0, _deckglLayers.getBasemapColorsForStyle)(styleType);
|
|
320
|
+
nextGlobeConfig.surfaceColor = basemapColors.backgroundFillColor;
|
|
321
|
+
nextGlobeConfig.waterColor = basemapColors.basemapWaterFillColor;
|
|
322
|
+
nextGlobeConfig.adminLinesColor = basemapColors.basemapAdminLineColor;
|
|
323
|
+
}
|
|
324
|
+
return _objectSpread(_objectSpread({}, mapState), {}, {
|
|
325
|
+
globe: _objectSpread(_objectSpread({}, mapState.globe), {}, {
|
|
326
|
+
config: nextGlobeConfig
|
|
327
|
+
})
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Updater that switches the map view mode (2D / 3D / Globe). Runs the base map-state
|
|
333
|
+
* updater and, when entering globe mode, syncs the globe basemap colors to the
|
|
334
|
+
* currently selected map style so the globe doesn't show stale default colors.
|
|
335
|
+
*/
|
|
336
|
+
var combinedSetMapViewModeUpdater = exports.combinedSetMapViewModeUpdater = function combinedSetMapViewModeUpdater(state, action) {
|
|
337
|
+
var _mapState$globe3;
|
|
338
|
+
var mapState = (0, _mapStateUpdaters.setMapViewModeUpdater)(state.mapState, action);
|
|
339
|
+
if ((_mapState$globe3 = mapState.globe) !== null && _mapState$globe3 !== void 0 && _mapState$globe3.enabled) {
|
|
340
|
+
mapState = syncGlobeConfigColorsToStyle(mapState, state.mapStyle, state.mapStyle.styleType);
|
|
341
|
+
}
|
|
342
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
343
|
+
mapState: mapState
|
|
344
|
+
});
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Updater that changes the layer type by calling `layerTypeChangeUpdater` on visState.
|
|
349
|
+
* In addition to that, if the new layer type has the `darkBaseMapEnabled` config
|
|
350
|
+
* setting, we adjust it in accordance with the colorMode of the base map.s
|
|
351
|
+
*/
|
|
352
|
+
var combinedLayerTypeChangeUpdater = exports.combinedLayerTypeChangeUpdater = function combinedLayerTypeChangeUpdater(state, action) {
|
|
353
|
+
var visState = state.visState;
|
|
354
|
+
var oldLayerIndex = visState.layers.findIndex(function (layer) {
|
|
355
|
+
return layer === action.oldLayer;
|
|
356
|
+
});
|
|
357
|
+
visState = (0, _visStateUpdaters.layerTypeChangeUpdater)(visState, action);
|
|
358
|
+
var newLayer = visState.layers[oldLayerIndex];
|
|
359
|
+
if (Object.prototype.hasOwnProperty.call(newLayer === null || newLayer === void 0 ? void 0 : newLayer.visConfigSettings, 'darkBaseMapEnabled')) {
|
|
360
|
+
var mapStyle = state.mapStyle;
|
|
361
|
+
var colorMode = mapStyle.mapStyles[mapStyle.styleType].colorMode;
|
|
362
|
+
var darkBaseMapEnabled = newLayer.config.visConfig.darkBaseMapEnabled;
|
|
363
|
+
switch (colorMode) {
|
|
364
|
+
case _constants.BASE_MAP_COLOR_MODES.DARK:
|
|
365
|
+
if (!darkBaseMapEnabled) {
|
|
366
|
+
visState = updateDarkBaseMapLayers(true, newLayer.id)(visState);
|
|
367
|
+
}
|
|
368
|
+
break;
|
|
369
|
+
case _constants.BASE_MAP_COLOR_MODES.LIGHT:
|
|
370
|
+
if (darkBaseMapEnabled) {
|
|
371
|
+
visState = updateDarkBaseMapLayers(false, newLayer.id)(visState);
|
|
372
|
+
}
|
|
373
|
+
break;
|
|
374
|
+
default:
|
|
375
|
+
// do nothing
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
379
|
+
visState: visState
|
|
380
|
+
});
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Make mapLegend active when toggleSplitMap action is called
|
|
385
|
+
*/
|
|
386
|
+
var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
|
|
387
|
+
var _newState$uiState$map;
|
|
388
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
389
|
+
visState: (0, _visStateUpdaters.toggleSplitMapUpdater)(state.visState, action),
|
|
390
|
+
uiState: (0, _uiStateUpdaters.toggleSplitMapUpdater)(state.uiState),
|
|
391
|
+
mapState: (0, _mapStateUpdaters.toggleSplitMapUpdater)(state.mapState)
|
|
392
|
+
});
|
|
393
|
+
var isSplit = newState.visState.splitMaps.length !== 0;
|
|
394
|
+
var isLegendActive = (_newState$uiState$map = newState.uiState.mapControls) === null || _newState$uiState$map === void 0 || (_newState$uiState$map = _newState$uiState$map.mapLegend) === null || _newState$uiState$map === void 0 ? void 0 : _newState$uiState$map.active;
|
|
395
|
+
if (isSplit && !isLegendActive) {
|
|
396
|
+
newState.uiState = (0, _uiStateUpdaters.toggleMapControlUpdater)(newState.uiState, {
|
|
397
|
+
payload: {
|
|
398
|
+
panelId: 'mapLegend',
|
|
399
|
+
index: action.payload
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
return newState;
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Set map split mode updater - coordinates state changes across visState, mapState, and uiState
|
|
408
|
+
*/
|
|
409
|
+
var setMapSplitModeUpdater = exports.setMapSplitModeUpdater = function setMapSplitModeUpdater(state, action) {
|
|
410
|
+
var _newUiState$mapContro;
|
|
411
|
+
var mapSplitMode = action.payload.mapSplitMode;
|
|
412
|
+
var prevMode = state.mapState.mapSplitMode;
|
|
413
|
+
if (mapSplitMode === prevMode) {
|
|
414
|
+
return state;
|
|
415
|
+
}
|
|
416
|
+
var newMapState = (0, _mapStateUpdaters.setMapSplitModeUpdater)(state.mapState, action);
|
|
417
|
+
var newVisState = _objectSpread({}, state.visState);
|
|
418
|
+
switch (mapSplitMode) {
|
|
419
|
+
case _constants.MapSplitMode.SINGLE_MAP:
|
|
420
|
+
newVisState = _objectSpread(_objectSpread({}, newVisState), {}, {
|
|
421
|
+
splitMaps: []
|
|
422
|
+
});
|
|
423
|
+
break;
|
|
424
|
+
case _constants.MapSplitMode.DUAL_MAP:
|
|
425
|
+
case _constants.MapSplitMode.SWIPE_COMPARE:
|
|
426
|
+
if (prevMode === _constants.MapSplitMode.SINGLE_MAP) {
|
|
427
|
+
newVisState = _objectSpread(_objectSpread({}, newVisState), {}, {
|
|
428
|
+
splitMaps: (0, _utils.computeSplitMapLayers)(newVisState.layers, {
|
|
429
|
+
duplicate: mapSplitMode === _constants.MapSplitMode.SWIPE_COMPARE
|
|
430
|
+
})
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
break;
|
|
434
|
+
default:
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
var newUiState = (0, _uiStateUpdaters.toggleSplitMapUpdater)(state.uiState);
|
|
438
|
+
var isSplit = newVisState.splitMaps.length !== 0;
|
|
439
|
+
var isLegendActive = (_newUiState$mapContro = newUiState.mapControls) === null || _newUiState$mapContro === void 0 || (_newUiState$mapContro = _newUiState$mapContro.mapLegend) === null || _newUiState$mapContro === void 0 ? void 0 : _newUiState$mapContro.active;
|
|
440
|
+
if (isSplit && !isLegendActive) {
|
|
441
|
+
newUiState = (0, _uiStateUpdaters.toggleMapControlUpdater)(newUiState, {
|
|
442
|
+
payload: {
|
|
443
|
+
panelId: 'mapLegend',
|
|
444
|
+
index: 0
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
449
|
+
mapState: newMapState,
|
|
450
|
+
visState: newVisState,
|
|
451
|
+
uiState: newUiState
|
|
452
|
+
});
|
|
453
|
+
};
|
|
454
|
+
var defaultReplaceDataToMapOptions = {
|
|
455
|
+
keepExistingConfig: true,
|
|
456
|
+
centerMap: true,
|
|
457
|
+
autoCreateLayers: false
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Updater replace a dataset in state
|
|
462
|
+
*/
|
|
463
|
+
var replaceDataInMapUpdater = exports.replaceDataInMapUpdater = function replaceDataInMapUpdater(state, _ref3) {
|
|
464
|
+
var payload = _ref3.payload;
|
|
465
|
+
var datasetToReplaceId = payload.datasetToReplaceId,
|
|
466
|
+
datasetToUse = payload.datasetToUse,
|
|
467
|
+
_payload$options = payload.options,
|
|
468
|
+
options = _payload$options === void 0 ? {} : _payload$options;
|
|
469
|
+
var addDataToMapOptions = _objectSpread(_objectSpread({}, defaultReplaceDataToMapOptions), options);
|
|
470
|
+
|
|
471
|
+
// check if dataset is there
|
|
472
|
+
if (!state.visState.datasets[datasetToReplaceId]) {
|
|
473
|
+
return state;
|
|
474
|
+
}
|
|
475
|
+
// datasetToUse is ProtoDataset
|
|
476
|
+
var dataIdToUse = datasetToUse.info.id;
|
|
477
|
+
if (!dataIdToUse) {
|
|
478
|
+
return state;
|
|
479
|
+
}
|
|
480
|
+
// remove dataset and put dependencies in toBeMerged
|
|
481
|
+
var preparedState = _objectSpread(_objectSpread({}, state), {}, {
|
|
482
|
+
visState: (0, _visStateUpdaters.prepareStateForDatasetReplace)(state.visState, datasetToReplaceId, dataIdToUse)
|
|
483
|
+
});
|
|
484
|
+
var nextState = addDataToMapUpdater(preparedState, (0, _composerHelpers.payload_)({
|
|
485
|
+
datasets: datasetToUse,
|
|
486
|
+
// should zoom to new dataset
|
|
487
|
+
options: addDataToMapOptions
|
|
488
|
+
}));
|
|
489
|
+
return nextState;
|
|
490
|
+
};
|
|
491
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdWlTdGF0ZVVwZGF0ZXJzIiwicmVxdWlyZSIsIl92aXNTdGF0ZVVwZGF0ZXJzIiwiX21hcFN0YXRlVXBkYXRlcnMiLCJfbWFwU3R5bGVVcGRhdGVycyIsIl9wcm9jZXNzb3JzIiwiX2NvbXBvc2VySGVscGVycyIsIl91dGlscyIsIl9kYXRhVXRpbHMiLCJfY29uc3RhbnRzIiwiX2RlY2tnbExheWVycyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiY29tYmluZWRVcGRhdGVycyIsImlzVmFsaWRDb25maWciLCJleHBvcnRzIiwiY29uZmlnIiwiaXNQbGFpbk9iamVjdCIsInZlcnNpb24iLCJkZWZhdWx0QWRkRGF0YVRvTWFwT3B0aW9ucyIsImNlbnRlck1hcCIsImtlZXBFeGlzdGluZ0NvbmZpZyIsImF1dG9DcmVhdGVMYXllcnMiLCJhdXRvQ3JlYXRlVG9vbHRpcHMiLCJhZGREYXRhVG9NYXBVcGRhdGVyIiwic3RhdGUiLCJfcmVmIiwiX2RhdGFzZXRzJCIsIl9kYXRhc2V0cyQyIiwiX2RhdGFzZXRzJDMiLCJwYXlsb2FkIiwiZGF0YXNldHMiLCJpbmZvIiwib3B0aW9ucyIsImlzUHJvZ3Jlc3NpdmVMb2FkaW5nIiwiQXJyYXkiLCJpc0FycmF5IiwiZm9ybWF0IiwiaWQiLCJ2aXNTdGF0ZSIsImNvbXBvc2VfIiwicGlja18iLCJhcHBseV8iLCJ2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyIiwicGFyc2VkQ29uZmlnIiwic2NoZW1hIiwicGFyc2VTYXZlZENvbmZpZyIsIm9sZExheWVycyIsImxheWVycyIsImZpbHRlck5ld2x5QWRkZWRMYXllcnMiLCJubCIsImZpbmQiLCJvbCIsImZpbmRNYXBCb3VuZHNJZkNlbnRlcmVkIiwiYm91bmRzIiwiZmluZE1hcEJvdW5kcyIsInVuZGVmaW5lZCIsImlmXyIsIkJvb2xlYW4iLCJzZXRNYXBJbmZvVXBkYXRlciIsIndpdGhfIiwiX3JlZjIiLCJzdGF0ZU1hcENvbmZpZ1VwZGF0ZXIiLCJwYXlsb2FkXyIsInN0eWxlTWFwQ29uZmlnVXBkYXRlciIsInVpU3RhdGVSZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsInVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlciIsInRvZ2dsZU1vZGFsVXBkYXRlciIsIm1lcmdlXyIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInJlYWRPbmx5IiwibG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXIiLCJhY3Rpb24iLCJwYXlsb2FkcyIsImZpbGVzVG9EYXRhUGF5bG9hZCIsInJlc3VsdCIsIm5leHRTdGF0ZSIsImZpbGVMb2FkaW5nIiwiZmlsZUxvYWRpbmdQcm9ncmVzcyIsInN0YXRlV2l0aERhdGEiLCJtYXAiLCJwIiwiYWRkRGF0YVRvTWFwQ29tcG9zZWQiLCJ1cGRhdGVPdmVybGF5QmxlbmRpbmciLCJvdmVybGF5QmxlbmRpbmciLCJPVkVSTEFZX0JMRU5ESU5HUyIsIm5vcm1hbCIsInZhbHVlIiwidXBkYXRlRGFya0Jhc2VNYXBMYXllcnMiLCJkYXJrQmFzZU1hcEVuYWJsZWQiLCJsYXllcklkIiwibGF5ZXIiLCJ2aXNDb25maWdTZXR0aW5ncyIsInZpc0NvbmZpZyIsInVwZGF0ZUxheWVyQ29uZmlnIiwiY29tYmluZWRNYXBTdHlsZUNoYW5nZVVwZGF0ZXIiLCJfbWFwU3RhdGUkZ2xvYmUiLCJtYXBTdHlsZSIsImdldENvbG9yTW9kZSIsImtleSIsIl9tYXBTdHlsZSRtYXBTdHlsZXMkayIsIm1hcFN0eWxlcyIsImNvbG9yTW9kZSIsInByZXZDb2xvck1vZGUiLCJzdHlsZVR5cGUiLCJuZXh0Q29sb3JNb2RlIiwibWFwU3RhdGUiLCJCQVNFX01BUF9DT0xPUl9NT0RFUyIsIkRBUksiLCJzY3JlZW4iLCJMSUdIVCIsImRhcmtlbiIsImdsb2JlIiwiZW5hYmxlZCIsIk5PX01BUF9JRCIsImJhc2VtYXAiLCJsYWJlbHMiLCJhZG1pbkxpbmVzIiwid2F0ZXIiLCJzeW5jR2xvYmVDb25maWdDb2xvcnNUb1N0eWxlIiwibWFwU3R5bGVDaGFuZ2VVcGRhdGVyIiwiX21hcFN0YXRlJGdsb2JlMiIsIm5leHRTdHlsZU9iaiIsIm5leHRHbG9iZUNvbmZpZyIsInN1cmZhY2VDb2xvciIsIkRFRkFVTFRfQkFTRU1BUF9DT0xPUiIsImJhY2tncm91bmRGaWxsQ29sb3IiLCJ3YXRlckNvbG9yIiwiYmFzZW1hcFdhdGVyRmlsbENvbG9yIiwiYWRtaW5MaW5lc0NvbG9yIiwiYmFzZW1hcEFkbWluTGluZUNvbG9yIiwiYmFzZW1hcENvbG9ycyIsImdldEJhc2VtYXBDb2xvcnNGb3JTdHlsZSIsInN0eWxlIiwibGF5ZXJHcm91cHMiLCJjb21iaW5lZFNldE1hcFZpZXdNb2RlVXBkYXRlciIsIl9tYXBTdGF0ZSRnbG9iZTMiLCJzZXRNYXBWaWV3TW9kZVVwZGF0ZXIiLCJjb21iaW5lZExheWVyVHlwZUNoYW5nZVVwZGF0ZXIiLCJvbGRMYXllckluZGV4IiwiZmluZEluZGV4Iiwib2xkTGF5ZXIiLCJsYXllclR5cGVDaGFuZ2VVcGRhdGVyIiwibmV3TGF5ZXIiLCJ0b2dnbGVTcGxpdE1hcFVwZGF0ZXIiLCJfbmV3U3RhdGUkdWlTdGF0ZSRtYXAiLCJuZXdTdGF0ZSIsInZpc1N0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwidWlTdGF0ZSIsInVpU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIiLCJtYXBTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsImlzU3BsaXQiLCJzcGxpdE1hcHMiLCJpc0xlZ2VuZEFjdGl2ZSIsIm1hcENvbnRyb2xzIiwibWFwTGVnZW5kIiwiYWN0aXZlIiwidG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIiLCJwYW5lbElkIiwiaW5kZXgiLCJzZXRNYXBTcGxpdE1vZGVVcGRhdGVyIiwiX25ld1VpU3RhdGUkbWFwQ29udHJvIiwibWFwU3BsaXRNb2RlIiwicHJldk1vZGUiLCJuZXdNYXBTdGF0ZSIsIm1hcFN0YXRlU2V0TWFwU3BsaXRNb2RlVXBkYXRlciIsIm5ld1Zpc1N0YXRlIiwiTWFwU3BsaXRNb2RlIiwiU0lOR0xFX01BUCIsIkRVQUxfTUFQIiwiU1dJUEVfQ09NUEFSRSIsImNvbXB1dGVTcGxpdE1hcExheWVycyIsImR1cGxpY2F0ZSIsIm5ld1VpU3RhdGUiLCJkZWZhdWx0UmVwbGFjZURhdGFUb01hcE9wdGlvbnMiLCJyZXBsYWNlRGF0YUluTWFwVXBkYXRlciIsIl9yZWYzIiwiZGF0YXNldFRvUmVwbGFjZUlkIiwiZGF0YXNldFRvVXNlIiwiX3BheWxvYWQkb3B0aW9ucyIsImFkZERhdGFUb01hcE9wdGlvbnMiLCJkYXRhSWRUb1VzZSIsInByZXBhcmVkU3RhdGUiLCJwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21iaW5lZC11cGRhdGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1xuICB0b2dnbGVNb2RhbFVwZGF0ZXIsXG4gIGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyIGFzIHVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlcixcbiAgdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIsXG4gIHRvZ2dsZVNwbGl0TWFwVXBkYXRlciBhcyB1aVN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyLFxuICByZWNlaXZlTWFwQ29uZmlnVXBkYXRlciBhcyB1aVN0YXRlUmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXJcbn0gZnJvbSAnLi91aS1zdGF0ZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICB1cGRhdGVWaXNEYXRhVXBkYXRlciBhcyB2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLFxuICBzZXRNYXBJbmZvVXBkYXRlcixcbiAgbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlcixcbiAgdG9nZ2xlU3BsaXRNYXBVcGRhdGVyIGFzIHZpc1N0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyLFxuICBwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZVxufSBmcm9tICcuL3Zpcy1zdGF0ZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICByZWNlaXZlTWFwQ29uZmlnVXBkYXRlciBhcyBzdGF0ZU1hcENvbmZpZ1VwZGF0ZXIsXG4gIHRvZ2dsZVNwbGl0TWFwVXBkYXRlciBhcyBtYXBTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlcixcbiAgc2V0TWFwU3BsaXRNb2RlVXBkYXRlciBhcyBtYXBTdGF0ZVNldE1hcFNwbGl0TW9kZVVwZGF0ZXIsXG4gIHNldE1hcFZpZXdNb2RlVXBkYXRlclxufSBmcm9tICcuL21hcC1zdGF0ZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIsXG4gIHJlY2VpdmVNYXBDb25maWdVcGRhdGVyIGFzIHN0eWxlTWFwQ29uZmlnVXBkYXRlclxufSBmcm9tICcuL21hcC1zdHlsZS11cGRhdGVycyc7XG5pbXBvcnQge2ZpbGVzVG9EYXRhUGF5bG9hZH0gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB7cGF5bG9hZF8sIGFwcGx5Xywgd2l0aF8sIGlmXywgY29tcG9zZV8sIG1lcmdlXywgcGlja199IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5pbXBvcnQge01hcFN0YXRlLCBVaVN0YXRlLCBBZGREYXRhVG9NYXBQYXlsb2FkLCBQYXJzZWRDb25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtNYXBTdHlsZX0gZnJvbSAnLi9tYXAtc3R5bGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtQcm92aWRlclN0YXRlfSBmcm9tICcuL3Byb3ZpZGVyLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7XG4gIGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyQWN0aW9uLFxuICBNYXBTdHlsZUNoYW5nZVVwZGF0ZXJBY3Rpb24sXG4gIExheWVyVHlwZUNoYW5nZVVwZGF0ZXJBY3Rpb24sXG4gIFRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvbixcbiAgUmVwbGFjZURhdGFJbk1hcFBheWxvYWQsXG4gIE1hcFN0YXRlQWN0aW9uc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7aXNQbGFpbk9iamVjdCwgY29tcHV0ZVNwbGl0TWFwTGF5ZXJzfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7ZmluZE1hcEJvdW5kc30gZnJvbSAnLi9kYXRhLXV0aWxzJztcbmltcG9ydCB7QkFTRV9NQVBfQ09MT1JfTU9ERVMsIE9WRVJMQVlfQkxFTkRJTkdTLCBOT19NQVBfSUQsIE1hcFNwbGl0TW9kZX0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRCYXNlbWFwQ29sb3JzRm9yU3R5bGUsIERFRkFVTFRfQkFTRU1BUF9DT0xPUn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtbGF5ZXJzJztcblxuZXhwb3J0IHR5cGUgS2VwbGVyR2xTdGF0ZSA9IHtcbiAgdmlzU3RhdGU6IFZpc1N0YXRlO1xuICBtYXBTdGF0ZTogTWFwU3RhdGU7XG4gIG1hcFN0eWxlOiBNYXBTdHlsZTtcbiAgdWlTdGF0ZTogVWlTdGF0ZTtcbiAgcHJvdmlkZXJTdGF0ZTogUHJvdmlkZXJTdGF0ZTtcbn07XG5cbi8vIGNvbXBvc2UgYWN0aW9uIHRvIGFwcGx5IHJlc3VsdCBtdWx0aXBsZSByZWR1Y2Vycywgd2l0aCB0aGUgb3V0cHV0IG9mIG9uZVxuXG4vKipcbiAqIFNvbWUgYWN0aW9ucyB3aWxsIGFmZmVjdCB0aGUgZW50aXJlIGtlcGxlci5sZyBpbnN0YW5jZSBzdGF0ZS5cbiAqIFRoZSB1cGRhdGVycyBmb3IgdGhlc2UgYWN0aW9ucyBpcyBleHBvcnRlZCBhcyBgY29tYmluZWRVcGRhdGVyc2AuIFRoZXNlIHVwZGF0ZXIgdGFrZSB0aGUgZW50aXJlIGluc3RhbmNlIHN0YXRlXG4gKiBhcyB0aGUgZmlyc3QgYXJndW1lbnQuIFJlYWQgbW9yZSBhYm91dCBbVXNpbmcgdXBkYXRlcnNdKC4uL2FkdmFuY2VkLXVzYWdlL3VzaW5nLXVwZGF0ZXJzLm1kKVxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7Y29tYmluZWRVcGRhdGVyc30gZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICAvLyBhZGQgZGF0YSB0byBtYXAgYWZ0ZXIgcmVjZWl2aW5nIGRhdGEgZnJvbSByZW1vdGUgc291cmNlc1xuICogICAgY2FzZSAnTE9BRF9SRU1PVEVfUkVTT1VSQ0VfU1VDQ0VTUyc6XG4gKiAgICAgIHJldHVybiB7XG4gKiAgICAgICAgLi4uc3RhdGUsXG4gKiAgICAgICAga2VwbGVyR2w6IHtcbiAqICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLFxuICogICAgICAgICAgLy8gcGFzcyBpbiBrZXBsZXIuZ2wgaW5zdGFuY2Ugc3RhdGUgdG8gY29tYmluZWRVcGRhdGVyc1xuICogICAgICAgICAgbWFwOiAgY29tYmluZWRVcGRhdGVycy5hZGREYXRhVG9NYXBVcGRhdGVyKFxuICogICAgICAgICAgIHN0YXRlLmtlcGxlckdsLm1hcCxcbiAqICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gKiAgICAgICAgICAgICAgIGRhdGFzZXRzOiBhY3Rpb24uZGF0YXNldHMsXG4gKiAgICAgICAgICAgICAgIG9wdGlvbnM6IHtyZWFkT25seTogdHJ1ZX0sXG4gKiAgICAgICAgICAgICAgIGNvbmZpZzogYWN0aW9uLmNvbmZpZ1xuICogICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgfVxuICogICAgICAgICAgKVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCBjb21iaW5lZFVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkQ29uZmlnID0gY29uZmlnID0+XG4gIGlzUGxhaW5PYmplY3QoY29uZmlnKSAmJiBpc1BsYWluT2JqZWN0KGNvbmZpZy5jb25maWcpICYmIGNvbmZpZy52ZXJzaW9uO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEFkZERhdGFUb01hcE9wdGlvbnMgPSB7XG4gIGNlbnRlck1hcDogdHJ1ZSxcbiAga2VlcEV4aXN0aW5nQ29uZmlnOiBmYWxzZSxcbiAgYXV0b0NyZWF0ZUxheWVyczogdHJ1ZSxcbiAgYXV0b0NyZWF0ZVRvb2x0aXBzOiB0cnVlXG59O1xuXG4vKipcbiAqIENvbWJpbmUgZGF0YSBhbmQgZnVsbCBjb25maWd1cmF0aW9uIHVwZGF0ZSBpbiBhIHNpbmdsZSBhY3Rpb25cbiAqXG4gKiBAbWVtYmVyb2YgY29tYmluZWRVcGRhdGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGtlcGxlci5nbCBpbnN0YW5jZSBzdGF0ZSwgY29udGFpbmluZyBhbGwgc3VicmVkdWNlciBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbi5wYXlsb2FkIGB7ZGF0YXNldHMsIG9wdGlvbnMsIGNvbmZpZ31gXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQuZGF0YXNldHMgLSAqKipyZXF1aXJlZCoqIGRhdGFzZXRzIGNhbiBiZSBhIGRhdGFzZXQgb3IgYW4gYXJyYXkgb2YgZGF0YXNldHNcbiAqIEVhY2ggZGF0YXNldCBvYmplY3QgbmVlZHMgdG8gaGF2ZSBgaW5mb2AgYW5kIGBkYXRhYCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBbYWN0aW9uLnBheWxvYWQub3B0aW9uc10gb3B0aW9uIG9iamVjdCBge2NlbnRlck1hcDogdHJ1ZSwgcGFkZGluZzoge2xlZnQ6IDMwMH19YFxuICogQHBhcmFtIFthY3Rpb24ucGF5bG9hZC5jb25maWddIG1hcCBjb25maWdcbiAqIEBwYXJhbSBbYWN0aW9uLnBheWxvYWQuaW5mb10gbWFwIGluZm8gY29udGFpbnMgdGl0bGUgYW5kIGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEYXRhc2V0XG4gKiBAcHJvcGVydHkgaW5mbyAtaW5mbyBvZiBhIGRhdGFzZXRcbiAqIEBwcm9wZXJ0eSBpbmZvLmlkIC0gaWQgb2YgdGhpcyBkYXRhc2V0LiBJZiBjb25maWcgaXMgZGVmaW5lZCwgYGlkYCBzaG91bGQgbWF0Y2hlcyB0aGUgYGRhdGFJZGAgaW4gY29uZmlnLlxuICogQHByb3BlcnR5IGluZm8ubGFiZWwgLSBBIGRpc3BsYXkgbmFtZSBvZiB0aGlzIGRhdGFzZXRcbiAqIEBwcm9wZXJ0eSBkYXRhIC0gKioqcmVxdWlyZWQqKiBUaGUgZGF0YSBvYmplY3QsIGluIGEgdGFidWxhciBmb3JtYXQgd2l0aCAyIHByb3BlcnRpZXMgYGZpZWxkc2AgYW5kIGByb3dzYFxuICogQHByb3BlcnR5IGRhdGEuZmllbGRzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiBmaWVsZHMsXG4gKiBAcHJvcGVydHkgZGF0YS5maWVsZHMubmFtZSAtICoqKnJlcXVpcmVkKiogTmFtZSBvZiB0aGUgZmllbGQsXG4gKiBAcHJvcGVydHkgZGF0YS5yb3dzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiByb3dzLCBpbiBhIHRhYnVsYXIgZm9ybWF0IHdpdGggYGZpZWxkc2AgYW5kIGByb3dzYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZERhdGFUb01hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICB7cGF5bG9hZH06IHtwYXlsb2FkOiBBZGREYXRhVG9NYXBQYXlsb2FkfVxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGNvbnN0IHtkYXRhc2V0cywgY29uZmlnLCBpbmZvfSA9IHBheWxvYWQ7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAuLi5kZWZhdWx0QWRkRGF0YVRvTWFwT3B0aW9ucyxcbiAgICAuLi5wYXlsb2FkLm9wdGlvbnNcbiAgfTtcblxuICAvLyBjaGVjayBpZiBwcm9ncmVzc2l2ZSBsb2FkaW5nIGRhdGFzZXQgYnkgYmF0Y2hlcywgYW5kIHVwZGF0ZSB2aXNTdGF0ZSBkaXJlY3RseVxuICBjb25zdCBpc1Byb2dyZXNzaXZlTG9hZGluZyA9XG4gICAgQXJyYXkuaXNBcnJheShkYXRhc2V0cykgJiZcbiAgICBkYXRhc2V0c1swXT8uaW5mby5mb3JtYXQgPT09ICdhcnJvdycgJiZcbiAgICBkYXRhc2V0c1swXT8uaW5mby5pZCAmJlxuICAgIGRhdGFzZXRzWzBdPy5pbmZvLmlkIGluIHN0YXRlLnZpc1N0YXRlLmRhdGFzZXRzO1xuICBpZiAoaXNQcm9ncmVzc2l2ZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gY29tcG9zZV88S2VwbGVyR2xTdGF0ZT4oW1xuICAgICAgcGlja18oJ3Zpc1N0YXRlJykoXG4gICAgICAgIGFwcGx5XzxWaXNTdGF0ZSwgYW55Pih2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLCB7XG4gICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICBdKShzdGF0ZSk7XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGxldCBwYXJzZWRDb25maWc6IFBhcnNlZENvbmZpZyA9IGNvbmZpZztcblxuICBpZiAoaXNWYWxpZENvbmZpZyhjb25maWcpKSB7XG4gICAgLy8gaWYgcGFzc2VkIGluIHNhdmVkIGNvbmZpZ1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBwYXJzZWRDb25maWcgPSBzdGF0ZS52aXNTdGF0ZS5zY2hlbWEucGFyc2VTYXZlZENvbmZpZyhjb25maWcpO1xuICB9XG4gIGNvbnN0IG9sZExheWVycyA9IHN0YXRlLnZpc1N0YXRlLmxheWVycztcbiAgY29uc3QgZmlsdGVyTmV3bHlBZGRlZExheWVycyA9IChsYXllcnM6IExheWVyW10pID0+XG4gICAgbGF5ZXJzLmZpbHRlcihubCA9PiAhb2xkTGF5ZXJzLmZpbmQob2wgPT4gb2wgPT09IG5sKSk7XG5cbiAgLy8gUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGZvdW5kLCB0byBtYWtlIHR5cGVzY3JpcHQgaGFwcHlcbiAgY29uc3QgZmluZE1hcEJvdW5kc0lmQ2VudGVyZWQgPSAobGF5ZXJzOiBMYXllcltdKSA9PiB7XG4gICAgY29uc3QgYm91bmRzID0gb3B0aW9ucy5jZW50ZXJNYXAgJiYgZmluZE1hcEJvdW5kcyhsYXllcnMpO1xuICAgIHJldHVybiBib3VuZHMgPyBib3VuZHMgOiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIGNvbXBvc2VfPEtlcGxlckdsU3RhdGU+KFtcbiAgICBwaWNrXygndmlzU3RhdGUnKShcbiAgICAgIC8vIHRoaXMgcGFydCBjYW4gYmUgYXN5bmNcbiAgICAgIGFwcGx5XzxWaXNTdGF0ZSwgYW55Pih2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLCB7XG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBjb25maWc6IHBhcnNlZENvbmZpZ1xuICAgICAgfSlcbiAgICApLFxuXG4gICAgaWZfKEJvb2xlYW4oaW5mbyksIHBpY2tfKCd2aXNTdGF0ZScpKGFwcGx5XzxWaXNTdGF0ZSwgYW55PihzZXRNYXBJbmZvVXBkYXRlciwge2luZm99KSkpLFxuICAgIC8vIE5vdGUgdGhhdCBmaXQgYm91bmRzIGhlcmUgd29uJ3QgYmUgY2FsbGVkIGluIGNhc2UgZGF0YXNldHMgYXJlIGNyZWF0ZWQgaW4gVGFza3MuXG4gICAgLy8gQSBzZXBhcmF0ZSBUYXNrIHRvIHVwZGF0ZSBib3VuZHMgaXMgY3JlYXRlZCBvbmNlIHRoZSBkYXRhc2V0cyBhcmUgcmVhZHkuXG4gICAgd2l0aF8oKHt2aXNTdGF0ZX0pID0+XG4gICAgICBwaWNrXygnbWFwU3RhdGUnKShcbiAgICAgICAgYXBwbHlfKFxuICAgICAgICAgIHN0YXRlTWFwQ29uZmlnVXBkYXRlcixcbiAgICAgICAgICBwYXlsb2FkXyh7XG4gICAgICAgICAgICBjb25maWc6IHBhcnNlZENvbmZpZyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBib3VuZHM6IGZpbmRNYXBCb3VuZHNJZkNlbnRlcmVkKGZpbHRlck5ld2x5QWRkZWRMYXllcnModmlzU3RhdGUubGF5ZXJzKSlcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKSxcbiAgICBwaWNrXygnbWFwU3R5bGUnKShhcHBseV8oc3R5bGVNYXBDb25maWdVcGRhdGVyLCBwYXlsb2FkXyh7Y29uZmlnOiBwYXJzZWRDb25maWcsIG9wdGlvbnN9KSkpLFxuICAgIHBpY2tfKCd1aVN0YXRlJykoXG4gICAgICBhcHBseV8odWlTdGF0ZVJlY2VpdmVNYXBDb25maWdVcGRhdGVyLCBwYXlsb2FkXyh7Y29uZmlnOiBwYXJzZWRDb25maWcsIG9wdGlvbnN9KSlcbiAgICApLFxuICAgIHBpY2tfKCd1aVN0YXRlJykoYXBwbHlfKHVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlciwgcGF5bG9hZF8obnVsbCkpKSxcblxuICAgIHBpY2tfKCd1aVN0YXRlJykoYXBwbHlfKHRvZ2dsZU1vZGFsVXBkYXRlciwgcGF5bG9hZF8obnVsbCkpKSxcbiAgICBwaWNrXygndWlTdGF0ZScpKFxuICAgICAgbWVyZ2VfKFxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3JlYWRPbmx5JylcbiAgICAgICAgICA/IHtyZWFkT25seTogb3B0aW9ucy5yZWFkT25seX1cbiAgICAgICAgICA6IHt9XG4gICAgICApXG4gICAgKVxuICBdKShzdGF0ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICBhY3Rpb246IGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgLy8gc3RpbGwgbW9yZSB0byBsb2FkXG4gIGNvbnN0IHBheWxvYWRzID0gZmlsZXNUb0RhdGFQYXlsb2FkKGFjdGlvbi5yZXN1bHQpO1xuICBjb25zdCBuZXh0U3RhdGUgPSBjb21wb3NlXyhbXG4gICAgcGlja18oJ3Zpc1N0YXRlJykoXG4gICAgICBtZXJnZV8oe1xuICAgICAgICBmaWxlTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGZpbGVMb2FkaW5nUHJvZ3Jlc3M6IHt9XG4gICAgICB9KVxuICAgIClcbiAgXSkoc3RhdGUpO1xuICAvLyBtYWtlIG11bHRpcGxlIGFkZCBkYXRhIHRvIG1hcCBjYWxsc1xuICBjb25zdCBzdGF0ZVdpdGhEYXRhID0gY29tcG9zZV8ocGF5bG9hZHMubWFwKHAgPT4gYXBwbHlfKGFkZERhdGFUb01hcFVwZGF0ZXIsIHBheWxvYWRfKHApKSkpKFxuICAgIG5leHRTdGF0ZVxuICApO1xuICByZXR1cm4gc3RhdGVXaXRoRGF0YSBhcyBLZXBsZXJHbFN0YXRlO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZERhdGFUb01hcENvbXBvc2VkID0gYWRkRGF0YVRvTWFwVXBkYXRlcjtcblxuLyoqXG4gKiBIZWxwZXIgd2hpY2ggdXBkYXRlcyBtYXAgb3ZlcmxheSBibGVuZGluZyBtb2RlIGluIHZpc1N0YXRlLFxuICogYnV0IG9ubHkgaWYgaXQncyBub3QgY3VycmVudGx5IGluIHRoZSBgbm9ybWFsYCBtb2RlLlxuICovXG5jb25zdCB1cGRhdGVPdmVybGF5QmxlbmRpbmcgPSBvdmVybGF5QmxlbmRpbmcgPT4gdmlzU3RhdGUgPT4ge1xuICBpZiAodmlzU3RhdGUub3ZlcmxheUJsZW5kaW5nICE9PSBPVkVSTEFZX0JMRU5ESU5HUy5ub3JtYWwudmFsdWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmlzU3RhdGUsXG4gICAgICBvdmVybGF5QmxlbmRpbmdcbiAgICB9O1xuICB9XG4gIHJldHVybiB2aXNTdGF0ZTtcbn07XG5cbi8qKlxuICogSGVscGVyIHdoaWNoIHVwZGF0ZXMgYGRhcmtCYXNlTWFwRW5hYmxlZGAgaW4gYWxsIHRoZSBsYXllcnMgaW4gdmlzU3RhdGUgd2hpY2hcbiAqIGhhdmUgdGhpcyBjb25maWcgc2V0dGluZyAob3IgaW4gb25lIHNwZWNpZmljIGxheWVyIGlmIHRoZSBgbGF5ZXJJZGAgcGFyYW0gaXMgcHJvdmlkZWQpLlxuICovXG5jb25zdCB1cGRhdGVEYXJrQmFzZU1hcExheWVycyA9XG4gIChkYXJrQmFzZU1hcEVuYWJsZWQ6IGJvb2xlYW4sIGxheWVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsKSA9PlxuICB2aXNTdGF0ZSA9PiAoe1xuICAgIC4uLnZpc1N0YXRlLFxuICAgIGxheWVyczogdmlzU3RhdGUubGF5ZXJzLm1hcChsYXllciA9PiB7XG4gICAgICBpZiAoIWxheWVySWQgfHwgbGF5ZXIuaWQgPT09IGxheWVySWQpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsYXllci52aXNDb25maWdTZXR0aW5ncywgJ2RhcmtCYXNlTWFwRW5hYmxlZCcpKSB7XG4gICAgICAgICAgY29uc3Qge3Zpc0NvbmZpZ30gPSBsYXllci5jb25maWc7XG4gICAgICAgICAgcmV0dXJuIGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAgIHZpc0NvbmZpZzogey4uLnZpc0NvbmZpZywgZGFya0Jhc2VNYXBFbmFibGVkfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGF5ZXI7XG4gICAgfSlcbiAgfSk7XG5cbi8qKlxuICogVXBkYXRlciB0aGF0IGNoYW5nZXMgdGhlIG1hcCBzdHlsZSBieSBjYWxsaW5nIG1hcFN0eWxlQ2hhbmdlVXBkYXRlciBvbiB2aXNTdGF0ZS5cbiAqIEluIGFkZGl0aW9uIHRvIHRoYXQsIGl0IGRvZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgIDEuIFVwZGF0ZSBtYXAgb3ZlcmxheSBibGVuZGluZyBtb2RlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY29sb3JNb2RlIG9mIHRoZVxuICogICAgICBiYXNlIG1hcCwgYnV0IG9ubHkgaWYgaXQncyBub3QgaW4gdGhlIGBub3JtYWxgIG1vZGUuXG4gKlxuICogICAyLiBVcGRhdGUgYWxsIHRoZSBsYXllcnMgd2hpY2ggaGF2ZSB0aGUgYGRhcmtCYXNlTWFwRW5hYmxlZGAgY29uZmlnIHNldHRpbmdcbiAqICAgICAgYWRqdXN0aW5nIGl0IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY29sb3JNb2RlIG9mIHRoZSBiYXNlIG1hcC5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBjb21iaW5lZE1hcFN0eWxlQ2hhbmdlVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogTWFwU3R5bGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgY29uc3Qge3BheWxvYWR9ID0gYWN0aW9uO1xuICBjb25zdCB7bWFwU3R5bGV9ID0gc3RhdGU7XG4gIGNvbnN0IGdldENvbG9yTW9kZSA9IGtleSA9PiBtYXBTdHlsZS5tYXBTdHlsZXNba2V5XT8uY29sb3JNb2RlO1xuICBjb25zdCBwcmV2Q29sb3JNb2RlID0gZ2V0Q29sb3JNb2RlKG1hcFN0eWxlLnN0eWxlVHlwZSk7XG4gIGNvbnN0IG5leHRDb2xvck1vZGUgPSBnZXRDb2xvck1vZGUocGF5bG9hZC5zdHlsZVR5cGUpO1xuICBsZXQge3Zpc1N0YXRlLCBtYXBTdGF0ZX0gPSBzdGF0ZTtcbiAgaWYgKG5leHRDb2xvck1vZGUgIT09IHByZXZDb2xvck1vZGUpIHtcbiAgICBzd2l0Y2ggKG5leHRDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQkFTRV9NQVBfQ09MT1JfTU9ERVMuREFSSzpcbiAgICAgICAgdmlzU3RhdGUgPSBjb21wb3NlXyhbXG4gICAgICAgICAgdXBkYXRlT3ZlcmxheUJsZW5kaW5nKE9WRVJMQVlfQkxFTkRJTkdTLnNjcmVlbi52YWx1ZSksXG4gICAgICAgICAgdXBkYXRlRGFya0Jhc2VNYXBMYXllcnModHJ1ZSlcbiAgICAgICAgXSkodmlzU3RhdGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQkFTRV9NQVBfQ09MT1JfTU9ERVMuTElHSFQ6XG4gICAgICAgIHZpc1N0YXRlID0gY29tcG9zZV8oW1xuICAgICAgICAgIHVwZGF0ZU92ZXJsYXlCbGVuZGluZyhPVkVSTEFZX0JMRU5ESU5HUy5kYXJrZW4udmFsdWUpLFxuICAgICAgICAgIHVwZGF0ZURhcmtCYXNlTWFwTGF5ZXJzKGZhbHNlKVxuICAgICAgICBdKSh2aXNTdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGUgZ2xvYmUgY29uZmlnIGNvbG9ycyB3aGVuIHN0eWxlIGNoYW5nZXMgYW5kIGdsb2JlIGlzIGVuYWJsZWRcbiAgaWYgKG1hcFN0YXRlLmdsb2JlPy5lbmFibGVkKSB7XG4gICAgLy8gU3dpdGNoaW5nIGZyb20gXCJObyBCYXNlbWFwXCIgdG8gYSBiYXNlbWFwIC0gcmVzdG9yZSBiYXNlbWFwIHN1Yi10b2dnbGVzXG4gICAgaWYgKHBheWxvYWQuc3R5bGVUeXBlICE9PSBOT19NQVBfSUQgJiYgbWFwU3R5bGUuc3R5bGVUeXBlID09PSBOT19NQVBfSUQpIHtcbiAgICAgIG1hcFN0YXRlID0ge1xuICAgICAgICAuLi5tYXBTdGF0ZSxcbiAgICAgICAgZ2xvYmU6IHtcbiAgICAgICAgICAuLi5tYXBTdGF0ZS5nbG9iZSxcbiAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIC4uLm1hcFN0YXRlLmdsb2JlLmNvbmZpZyxcbiAgICAgICAgICAgIGJhc2VtYXA6IHRydWUsXG4gICAgICAgICAgICBsYWJlbHM6IHRydWUsXG4gICAgICAgICAgICBhZG1pbkxpbmVzOiB0cnVlLFxuICAgICAgICAgICAgd2F0ZXI6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIG1hcFN0YXRlID0gc3luY0dsb2JlQ29uZmlnQ29sb3JzVG9TdHlsZShtYXBTdGF0ZSwgbWFwU3R5bGUsIHBheWxvYWQuc3R5bGVUeXBlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgdmlzU3RhdGUsXG4gICAgbWFwU3RhdGUsXG4gICAgbWFwU3R5bGU6IG1hcFN0eWxlQ2hhbmdlVXBkYXRlcihtYXBTdHlsZSwge3BheWxvYWQ6IHsuLi5wYXlsb2FkfX0pXG4gIH07XG59O1xuXG4vKipcbiAqIERlcml2ZSBnbG9iZSBiYXNlbWFwIGNvbG9ycyAoc3VyZmFjZSAvIHdhdGVyIC8gYWRtaW4gbGluZXMpIGZyb20gYSBtYXAgc3R5bGUgYW5kXG4gKiByZXR1cm4gYW4gdXBkYXRlZCBtYXBTdGF0ZSB3aXRoIHRob3NlIGNvbG9ycyB3cml0dGVuIGludG8gYGdsb2JlLmNvbmZpZ2AuIFVzZWQgYm90aFxuICogd2hlbiB0aGUgYmFzZSBtYXAgc3R5bGUgY2hhbmdlcyBhbmQgd2hlbiBlbnRlcmluZyBnbG9iZSBtb2RlLCBzbyB0aGUgZ2xvYmUgYWx3YXlzXG4gKiByZWZsZWN0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJhc2VtYXAgaW5zdGVhZCBvZiB0aGUgc3RhdGljIERFRkFVTFRfR0xPQkVfQ09ORklHLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3luY0dsb2JlQ29uZmlnQ29sb3JzVG9TdHlsZShcbiAgbWFwU3RhdGU6IE1hcFN0YXRlLFxuICBtYXBTdHlsZTogTWFwU3R5bGUsXG4gIHN0eWxlVHlwZTogc3RyaW5nXG4pOiBNYXBTdGF0ZSB7XG4gIGlmICghbWFwU3RhdGUuZ2xvYmU/LmVuYWJsZWQpIHtcbiAgICByZXR1cm4gbWFwU3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXh0U3R5bGVPYmogPSBtYXBTdHlsZS5tYXBTdHlsZXNbc3R5bGVUeXBlXTtcbiAgY29uc3QgbmV4dEdsb2JlQ29uZmlnID0gey4uLm1hcFN0YXRlLmdsb2JlLmNvbmZpZ307XG5cbiAgaWYgKHN0eWxlVHlwZSA9PT0gTk9fTUFQX0lEKSB7XG4gICAgbmV4dEdsb2JlQ29uZmlnLmJhc2VtYXAgPSBmYWxzZTtcbiAgICBuZXh0R2xvYmVDb25maWcubGFiZWxzID0gZmFsc2U7XG4gICAgbmV4dEdsb2JlQ29uZmlnLmFkbWluTGluZXMgPSBmYWxzZTtcbiAgICBuZXh0R2xvYmVDb25maWcud2F0ZXIgPSBmYWxzZTtcbiAgICBuZXh0R2xvYmVDb25maWcuc3VyZmFjZUNvbG9yID0gREVGQVVMVF9CQVNFTUFQX0NPTE9SLmJhY2tncm91bmRGaWxsQ29sb3I7XG4gICAgbmV4dEdsb2JlQ29uZmlnLndhdGVyQ29sb3IgPSBERUZBVUxUX0JBU0VNQVBfQ09MT1IuYmFzZW1hcFdhdGVyRmlsbENvbG9yO1xuICAgIG5leHRHbG9iZUNvbmZpZy5hZG1pbkxpbmVzQ29sb3IgPSBERUZBVUxUX0JBU0VNQVBfQ09MT1IuYmFzZW1hcEFkbWluTGluZUNvbG9yO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJhc2VtYXBDb2xvcnMgPSBuZXh0U3R5bGVPYmpcbiAgICAgID8gZ2V0QmFzZW1hcENvbG9yc0ZvclN0eWxlKHN0eWxlVHlwZSwge1xuICAgICAgICAgIHN0eWxlOiBuZXh0U3R5bGVPYmouc3R5bGUsXG4gICAgICAgICAgbGF5ZXJHcm91cHM6IG5leHRTdHlsZU9iai5sYXllckdyb3Vwc1xuICAgICAgICB9KVxuICAgICAgOiAvLyBTdHlsZSBvYmplY3Qgbm90IHlldCBsb2FkZWQgLSB1c2Uga25vd24gcHJlc2V0cyBieSBzdHlsZSB0eXBlXG4gICAgICAgIGdldEJhc2VtYXBDb2xvcnNGb3JTdHlsZShzdHlsZVR5cGUpO1xuICAgIG5leHRHbG9iZUNvbmZpZy5zdXJmYWNlQ29sb3IgPSBiYXNlbWFwQ29sb3JzLmJhY2tncm91bmRGaWxsQ29sb3I7XG4gICAgbmV4dEdsb2JlQ29uZmlnLndhdGVyQ29sb3IgPSBiYXNlbWFwQ29sb3JzLmJhc2VtYXBXYXRlckZpbGxDb2xvcjtcbiAgICBuZXh0R2xvYmVDb25maWcuYWRtaW5MaW5lc0NvbG9yID0gYmFzZW1hcENvbG9ycy5iYXNlbWFwQWRtaW5MaW5lQ29sb3I7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLm1hcFN0YXRlLFxuICAgIGdsb2JlOiB7XG4gICAgICAuLi5tYXBTdGF0ZS5nbG9iZSxcbiAgICAgIGNvbmZpZzogbmV4dEdsb2JlQ29uZmlnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXIgdGhhdCBzd2l0Y2hlcyB0aGUgbWFwIHZpZXcgbW9kZSAoMkQgLyAzRCAvIEdsb2JlKS4gUnVucyB0aGUgYmFzZSBtYXAtc3RhdGVcbiAqIHVwZGF0ZXIgYW5kLCB3aGVuIGVudGVyaW5nIGdsb2JlIG1vZGUsIHN5bmNzIHRoZSBnbG9iZSBiYXNlbWFwIGNvbG9ycyB0byB0aGVcbiAqIGN1cnJlbnRseSBzZWxlY3RlZCBtYXAgc3R5bGUgc28gdGhlIGdsb2JlIGRvZXNuJ3Qgc2hvdyBzdGFsZSBkZWZhdWx0IGNvbG9ycy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVkU2V0TWFwVmlld01vZGVVcGRhdGVyID0gKFxuICBzdGF0ZTogS2VwbGVyR2xTdGF0ZSxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuU2V0TWFwVmlld01vZGVVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgbGV0IG1hcFN0YXRlID0gc2V0TWFwVmlld01vZGVVcGRhdGVyKHN0YXRlLm1hcFN0YXRlLCBhY3Rpb24pO1xuXG4gIGlmIChtYXBTdGF0ZS5nbG9iZT8uZW5hYmxlZCkge1xuICAgIG1hcFN0YXRlID0gc3luY0dsb2JlQ29uZmlnQ29sb3JzVG9TdHlsZShtYXBTdGF0ZSwgc3RhdGUubWFwU3R5bGUsIHN0YXRlLm1hcFN0eWxlLnN0eWxlVHlwZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIG1hcFN0YXRlXG4gIH07XG59O1xuXG4vKipcbiAqIFVwZGF0ZXIgdGhhdCBjaGFuZ2VzIHRoZSBsYXllciB0eXBlIGJ5IGNhbGxpbmcgYGxheWVyVHlwZUNoYW5nZVVwZGF0ZXJgIG9uIHZpc1N0YXRlLlxuICogSW4gYWRkaXRpb24gdG8gdGhhdCwgaWYgdGhlIG5ldyBsYXllciB0eXBlIGhhcyB0aGUgYGRhcmtCYXNlTWFwRW5hYmxlZGAgY29uZmlnXG4gKiBzZXR0aW5nLCB3ZSBhZGp1c3QgaXQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBjb2xvck1vZGUgb2YgdGhlIGJhc2UgbWFwLnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVkTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGxldCB7dmlzU3RhdGV9ID0gc3RhdGU7XG4gIGNvbnN0IG9sZExheWVySW5kZXggPSB2aXNTdGF0ZS5sYXllcnMuZmluZEluZGV4KGxheWVyID0+IGxheWVyID09PSBhY3Rpb24ub2xkTGF5ZXIpO1xuICB2aXNTdGF0ZSA9IGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIodmlzU3RhdGUsIGFjdGlvbik7XG4gIGNvbnN0IG5ld0xheWVyID0gdmlzU3RhdGUubGF5ZXJzW29sZExheWVySW5kZXhdO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld0xheWVyPy52aXNDb25maWdTZXR0aW5ncywgJ2RhcmtCYXNlTWFwRW5hYmxlZCcpKSB7XG4gICAgY29uc3Qge21hcFN0eWxlfSA9IHN0YXRlO1xuICAgIGNvbnN0IHtjb2xvck1vZGV9ID0gbWFwU3R5bGUubWFwU3R5bGVzW21hcFN0eWxlLnN0eWxlVHlwZV07XG4gICAgY29uc3Qge2RhcmtCYXNlTWFwRW5hYmxlZH0gPSBuZXdMYXllci5jb25maWcudmlzQ29uZmlnO1xuICAgIHN3aXRjaCAoY29sb3JNb2RlKSB7XG4gICAgICBjYXNlIEJBU0VfTUFQX0NPTE9SX01PREVTLkRBUks6XG4gICAgICAgIGlmICghZGFya0Jhc2VNYXBFbmFibGVkKSB7XG4gICAgICAgICAgdmlzU3RhdGUgPSB1cGRhdGVEYXJrQmFzZU1hcExheWVycyh0cnVlLCBuZXdMYXllci5pZCkodmlzU3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBCQVNFX01BUF9DT0xPUl9NT0RFUy5MSUdIVDpcbiAgICAgICAgaWYgKGRhcmtCYXNlTWFwRW5hYmxlZCkge1xuICAgICAgICAgIHZpc1N0YXRlID0gdXBkYXRlRGFya0Jhc2VNYXBMYXllcnMoZmFsc2UsIG5ld0xheWVyLmlkKSh2aXNTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHZpc1N0YXRlXG4gIH07XG59O1xuXG4vKipcbiAqIE1ha2UgbWFwTGVnZW5kIGFjdGl2ZSB3aGVuIHRvZ2dsZVNwbGl0TWFwIGFjdGlvbiBpcyBjYWxsZWRcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogVG9nZ2xlU3BsaXRNYXBVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgdmlzU3RhdGU6IHZpc1N0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyKHN0YXRlLnZpc1N0YXRlLCBhY3Rpb24pLFxuICAgIHVpU3RhdGU6IHVpU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIoc3RhdGUudWlTdGF0ZSksXG4gICAgbWFwU3RhdGU6IG1hcFN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyKHN0YXRlLm1hcFN0YXRlKVxuICB9O1xuXG4gIGNvbnN0IGlzU3BsaXQgPSBuZXdTdGF0ZS52aXNTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoICE9PSAwO1xuICBjb25zdCBpc0xlZ2VuZEFjdGl2ZSA9IG5ld1N0YXRlLnVpU3RhdGUubWFwQ29udHJvbHM/Lm1hcExlZ2VuZD8uYWN0aXZlO1xuICBpZiAoaXNTcGxpdCAmJiAhaXNMZWdlbmRBY3RpdmUpIHtcbiAgICBuZXdTdGF0ZS51aVN0YXRlID0gdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIobmV3U3RhdGUudWlTdGF0ZSwge1xuICAgICAgcGF5bG9hZDoge3BhbmVsSWQ6ICdtYXBMZWdlbmQnLCBpbmRleDogYWN0aW9uLnBheWxvYWR9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59O1xuXG4vKipcbiAqIFNldCBtYXAgc3BsaXQgbW9kZSB1cGRhdGVyIC0gY29vcmRpbmF0ZXMgc3RhdGUgY2hhbmdlcyBhY3Jvc3MgdmlzU3RhdGUsIG1hcFN0YXRlLCBhbmQgdWlTdGF0ZVxuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwU3BsaXRNb2RlVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlNldE1hcFNwbGl0TW9kZVVwZGF0ZXJBY3Rpb25cbik6IEtlcGxlckdsU3RhdGUgPT4ge1xuICBjb25zdCB7bWFwU3BsaXRNb2RlfSA9IGFjdGlvbi5wYXlsb2FkO1xuICBjb25zdCBwcmV2TW9kZSA9IHN0YXRlLm1hcFN0YXRlLm1hcFNwbGl0TW9kZTtcblxuICBpZiAobWFwU3BsaXRNb2RlID09PSBwcmV2TW9kZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IG5ld01hcFN0YXRlID0gbWFwU3RhdGVTZXRNYXBTcGxpdE1vZGVVcGRhdGVyKHN0YXRlLm1hcFN0YXRlLCBhY3Rpb24pO1xuXG4gIGxldCBuZXdWaXNTdGF0ZSA9IHsuLi5zdGF0ZS52aXNTdGF0ZX07XG5cbiAgc3dpdGNoIChtYXBTcGxpdE1vZGUpIHtcbiAgICBjYXNlIE1hcFNwbGl0TW9kZS5TSU5HTEVfTUFQOlxuICAgICAgbmV3VmlzU3RhdGUgPSB7XG4gICAgICAgIC4uLm5ld1Zpc1N0YXRlLFxuICAgICAgICBzcGxpdE1hcHM6IFtdXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBNYXBTcGxpdE1vZGUuRFVBTF9NQVA6XG4gICAgY2FzZSBNYXBTcGxpdE1vZGUuU1dJUEVfQ09NUEFSRTpcbiAgICAgIGlmIChwcmV2TW9kZSA9PT0gTWFwU3BsaXRNb2RlLlNJTkdMRV9NQVApIHtcbiAgICAgICAgbmV3VmlzU3RhdGUgPSB7XG4gICAgICAgICAgLi4ubmV3VmlzU3RhdGUsXG4gICAgICAgICAgc3BsaXRNYXBzOiBjb21wdXRlU3BsaXRNYXBMYXllcnMobmV3VmlzU3RhdGUubGF5ZXJzLCB7XG4gICAgICAgICAgICBkdXBsaWNhdGU6IG1hcFNwbGl0TW9kZSA9PT0gTWFwU3BsaXRNb2RlLlNXSVBFX0NPTVBBUkVcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgbGV0IG5ld1VpU3RhdGUgPSB1aVN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyKHN0YXRlLnVpU3RhdGUpO1xuXG4gIGNvbnN0IGlzU3BsaXQgPSBuZXdWaXNTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoICE9PSAwO1xuICBjb25zdCBpc0xlZ2VuZEFjdGl2ZSA9IG5ld1VpU3RhdGUubWFwQ29udHJvbHM/Lm1hcExlZ2VuZD8uYWN0aXZlO1xuICBpZiAoaXNTcGxpdCAmJiAhaXNMZWdlbmRBY3RpdmUpIHtcbiAgICBuZXdVaVN0YXRlID0gdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIobmV3VWlTdGF0ZSwge1xuICAgICAgcGF5bG9hZDoge3BhbmVsSWQ6ICdtYXBMZWdlbmQnLCBpbmRleDogMH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbWFwU3RhdGU6IG5ld01hcFN0YXRlLFxuICAgIHZpc1N0YXRlOiBuZXdWaXNTdGF0ZSxcbiAgICB1aVN0YXRlOiBuZXdVaVN0YXRlXG4gIH07XG59O1xuXG5jb25zdCBkZWZhdWx0UmVwbGFjZURhdGFUb01hcE9wdGlvbnMgPSB7XG4gIGtlZXBFeGlzdGluZ0NvbmZpZzogdHJ1ZSxcbiAgY2VudGVyTWFwOiB0cnVlLFxuICBhdXRvQ3JlYXRlTGF5ZXJzOiBmYWxzZVxufTtcblxuLyoqXG4gKiBVcGRhdGVyIHJlcGxhY2UgYSBkYXRhc2V0IGluIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCByZXBsYWNlRGF0YUluTWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIHtwYXlsb2FkfToge3BheWxvYWQ6IFJlcGxhY2VEYXRhSW5NYXBQYXlsb2FkfVxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGNvbnN0IHtkYXRhc2V0VG9SZXBsYWNlSWQsIGRhdGFzZXRUb1VzZSwgb3B0aW9ucyA9IHt9fSA9IHBheWxvYWQ7XG4gIGNvbnN0IGFkZERhdGFUb01hcE9wdGlvbnMgPSB7Li4uZGVmYXVsdFJlcGxhY2VEYXRhVG9NYXBPcHRpb25zLCAuLi5vcHRpb25zfTtcblxuICAvLyBjaGVjayBpZiBkYXRhc2V0IGlzIHRoZXJlXG4gIGlmICghc3RhdGUudmlzU3RhdGUuZGF0YXNldHNbZGF0YXNldFRvUmVwbGFjZUlkXSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBkYXRhc2V0VG9Vc2UgaXMgUHJvdG9EYXRhc2V0XG4gIGNvbnN0IGRhdGFJZFRvVXNlID0gZGF0YXNldFRvVXNlLmluZm8uaWQ7XG4gIGlmICghZGF0YUlkVG9Vc2UpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgLy8gcmVtb3ZlIGRhdGFzZXQgYW5kIHB1dCBkZXBlbmRlbmNpZXMgaW4gdG9CZU1lcmdlZFxuICBjb25zdCBwcmVwYXJlZFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIHZpc1N0YXRlOiBwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZShzdGF0ZS52aXNTdGF0ZSwgZGF0YXNldFRvUmVwbGFjZUlkLCBkYXRhSWRUb1VzZSlcbiAgfTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSBhZGREYXRhVG9NYXBVcGRhdGVyKFxuICAgIHByZXBhcmVkU3RhdGUsXG4gICAgcGF5bG9hZF8oe1xuICAgICAgZGF0YXNldHM6IGRhdGFzZXRUb1VzZSxcbiAgICAgIC8vIHNob3VsZCB6b29tIHRvIG5ldyBkYXRhc2V0XG4gICAgICBvcHRpb25zOiBhZGREYXRhVG9NYXBPcHRpb25zXG4gICAgfSlcbiAgKTtcblxuICByZXR1cm4gbmV4dFN0YXRlO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUdBLElBQUFBLGdCQUFBLEdB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
|