@kepler.gl/reducers 3.3.0-alpha.5 → 3.3.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/cjs/combined-updaters.js +491 -0
  2. package/dist/cjs/composer-helpers.js +101 -0
  3. package/dist/cjs/composers.js +22 -0
  4. package/dist/cjs/core.js +105 -0
  5. package/dist/cjs/data-utils.js +53 -0
  6. package/dist/cjs/export-utils.js +91 -0
  7. package/dist/{index.js → cjs/index.js} +1 -1
  8. package/dist/cjs/interaction-utils.js +105 -0
  9. package/dist/cjs/layer-utils.js +635 -0
  10. package/dist/cjs/map-state-updaters.js +654 -0
  11. package/dist/cjs/map-state.js +35 -0
  12. package/dist/cjs/map-style-updaters.js +660 -0
  13. package/dist/cjs/map-style.js +33 -0
  14. package/dist/cjs/merger-handler.js +105 -0
  15. package/dist/cjs/middleware.js +27 -0
  16. package/dist/cjs/provider-state-updaters.js +465 -0
  17. package/dist/cjs/provider-state.js +34 -0
  18. package/dist/cjs/root.js +207 -0
  19. package/dist/cjs/ui-state-updaters.js +905 -0
  20. package/dist/cjs/ui-state.js +36 -0
  21. package/dist/cjs/vis-state-merger.js +1193 -0
  22. package/dist/cjs/vis-state-selectors.js +30 -0
  23. package/dist/cjs/vis-state-updaters.js +4114 -0
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/{combined-updaters.js → esm/combined-updaters.js} +74 -81
  26. package/dist/esm/composer-helpers.js +85 -0
  27. package/dist/esm/composers.js +14 -0
  28. package/dist/esm/core.js +101 -0
  29. package/dist/esm/data-utils.js +47 -0
  30. package/dist/esm/export-utils.js +86 -0
  31. package/dist/esm/index.js +62 -0
  32. package/dist/esm/interaction-utils.js +96 -0
  33. package/dist/esm/layer-utils.js +602 -0
  34. package/dist/esm/map-state-updaters.js +646 -0
  35. package/dist/esm/map-state.js +29 -0
  36. package/dist/esm/map-style-updaters.js +652 -0
  37. package/dist/esm/map-style.js +27 -0
  38. package/dist/esm/merger-handler.js +96 -0
  39. package/dist/esm/middleware.js +19 -0
  40. package/dist/esm/provider-state-updaters.js +458 -0
  41. package/dist/esm/provider-state.js +28 -0
  42. package/dist/esm/root.js +201 -0
  43. package/dist/esm/ui-state-updaters.js +900 -0
  44. package/dist/esm/ui-state.js +30 -0
  45. package/dist/esm/vis-state-merger.js +1161 -0
  46. package/dist/esm/vis-state-selectors.js +24 -0
  47. package/dist/esm/vis-state-updaters.js +4035 -0
  48. package/dist/esm/vis-state.js +29 -0
  49. package/package.json +29 -20
  50. package/dist/composer-helpers.js +0 -101
  51. package/dist/composers.js +0 -22
  52. package/dist/core.js +0 -105
  53. package/dist/data-utils.js +0 -53
  54. package/dist/export-utils.js +0 -91
  55. package/dist/interaction-utils.js +0 -105
  56. package/dist/layer-utils.js +0 -635
  57. package/dist/map-state-updaters.js +0 -649
  58. package/dist/map-state.js +0 -35
  59. package/dist/map-style-updaters.js +0 -660
  60. package/dist/map-style.js +0 -33
  61. package/dist/merger-handler.js +0 -105
  62. package/dist/middleware.js +0 -27
  63. package/dist/provider-state-updaters.js +0 -465
  64. package/dist/provider-state.js +0 -34
  65. package/dist/root.js +0 -207
  66. package/dist/ui-state-updaters.js +0 -905
  67. package/dist/ui-state.js +0 -36
  68. package/dist/vis-state-merger.js +0 -1193
  69. package/dist/vis-state-selectors.js +0 -30
  70. package/dist/vis-state-updaters.js +0 -4114
  71. package/dist/vis-state.js +0 -35
@@ -0,0 +1,900 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
3
+ 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; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
+ // SPDX-License-Identifier: MIT
6
+ // Copyright contributors to the kepler.gl project
7
+
8
+ import { ADD_DATA_ID, DATA_TABLE_ID, DEFAULT_NOTIFICATION_TOPICS, DELETE_DATA_ID, EXPORT_DATA_TYPE, EXPORT_HTML_MAP_MODES, EXPORT_IMG_RATIOS, EXPORT_MAP_FORMATS, RESOLUTIONS, MAP_CONTROLS } from '@kepler.gl/constants';
9
+ import { LOCALE_CODES } from '@kepler.gl/localization';
10
+ import { createNotification, errorNotification, calculateExportImageSize, getApplicationConfig } from '@kepler.gl/utils';
11
+ import { payload_, apply_, compose_ } from './composer-helpers';
12
+ export var DEFAULT_ACTIVE_SIDE_PANEL = 'layer';
13
+ export var DEFAULT_MODAL = ADD_DATA_ID;
14
+
15
+ /**
16
+ * Updaters for `uiState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
17
+ * Read more about [Using updaters](../advanced-usage/using-updaters.md)
18
+ *
19
+ * @public
20
+ * @example
21
+ *
22
+ * import keplerGlReducer, {uiStateUpdaters} from '@kepler.gl/reducers';
23
+ * // Root Reducer
24
+ * const reducers = combineReducers({
25
+ * keplerGl: keplerGlReducer,
26
+ * app: appReducer
27
+ * });
28
+ *
29
+ * const composedReducer = (state, action) => {
30
+ * switch (action.type) {
31
+ * // click button to close side panel
32
+ * case 'CLICK_BUTTON':
33
+ * return {
34
+ * ...state,
35
+ * keplerGl: {
36
+ * ...state.keplerGl,
37
+ * foo: {
38
+ * ...state.keplerGl.foo,
39
+ * uiState: uiStateUpdaters.toggleSidePanelUpdater(
40
+ * uiState, {payload: null}
41
+ * )
42
+ * }
43
+ * }
44
+ * };
45
+ * }
46
+ * return reducers(state, action);
47
+ * };
48
+ *
49
+ * export default composedReducer;
50
+ */
51
+ /* eslint-disable @typescript-eslint/no-unused-vars */
52
+ // @ts-ignore
53
+ var uiStateUpdaters = null;
54
+ /* eslint-enable @typescript-eslint/no-unused-vars */
55
+
56
+ var DEFAULT_MAP_CONTROLS_FEATURES = {
57
+ show: true,
58
+ active: false,
59
+ disableClose: false,
60
+ // defines which map index users are interacting with (through map controls)
61
+ activeMapIndex: 0
62
+ };
63
+ var DEFAULT_MAP_LEGEND_CONTROL = _objectSpread(_objectSpread({}, DEFAULT_MAP_CONTROLS_FEATURES), {}, {
64
+ disableEdit: false
65
+ });
66
+ /**
67
+ * A list of map control visibility and whether is it active.
68
+ * @memberof uiStateUpdaters
69
+ * @constant
70
+ * @property visibleLayers Default: `{show: true, active: false}`
71
+ * @property mapLegend Default: `{show: true, active: false}`
72
+ * @property toggle3d Default: `{show: true}`
73
+ * @property splitMap Default: `{show: true}`
74
+ * @property mapDraw Default: `{show: true, active: false}`
75
+ * @property mapLocale Default: `{show: false, active: false}`
76
+ * @public
77
+ */
78
+ export var DEFAULT_MAP_CONTROLS = Object.keys(MAP_CONTROLS).reduce(function (_final, current) {
79
+ return _objectSpread(_objectSpread({}, _final), {}, _defineProperty({}, current, current === MAP_CONTROLS.mapLegend ? DEFAULT_MAP_LEGEND_CONTROL : DEFAULT_MAP_CONTROLS_FEATURES));
80
+ }, {});
81
+
82
+ /**
83
+ * Default image export config
84
+ * @memberof uiStateUpdaters
85
+ * @constant
86
+ * @property ratio Default: `'SCREEN'`,
87
+ * @property resolution Default: `'ONE_X'`,
88
+ * @property legend Default: `false`,
89
+ * @property mapH Default: 0,
90
+ * @property mapW Default: 0,
91
+ * @property imageSize Default: {zoomOffset: 0, scale: 1, imageW: 0, imageH: 0},
92
+ * @property imageDataUri Default: `''`,
93
+ * @property exporting Default: `false`
94
+ * @property error Default: `false`
95
+ * @property escapeXhtmlForWebpack Default: from application config (auto-detected: `true` for webpack)
96
+ * @public
97
+ */
98
+ export var DEFAULT_EXPORT_IMAGE = {
99
+ // user options
100
+ ratio: EXPORT_IMG_RATIOS.SCREEN,
101
+ resolution: RESOLUTIONS.ONE_X,
102
+ legend: false,
103
+ mapH: 0,
104
+ mapW: 0,
105
+ imageSize: {
106
+ zoomOffset: 0,
107
+ scale: 1,
108
+ imageW: 0,
109
+ imageH: 0
110
+ },
111
+ // when this is set to true, the mock map viewport will move to the center of data
112
+ center: false,
113
+ // exporting state
114
+ imageDataUri: '',
115
+ // exporting: used to attach plot-container to dom
116
+ exporting: false,
117
+ // processing: used as loading indicator when export image is being produced
118
+ processing: false,
119
+ error: false,
120
+ // whether to apply fix for uglify error in dom-to-image (from application config, auto-detects build tool)
121
+ escapeXhtmlForWebpack: getApplicationConfig().escapeXhtmlForWebpack
122
+ };
123
+ export var DEFAULT_LOAD_FILES = {
124
+ fileLoading: false
125
+ };
126
+
127
+ /**
128
+ * Default initial `exportData` settings
129
+ * @memberof uiStateUpdaters
130
+ * @constant
131
+ * @property selectedDataset Default: `''`,
132
+ * @property dataType Default: `'csv'`,
133
+ * @property filtered Default: `true`,
134
+ * @public
135
+ */
136
+ export var DEFAULT_EXPORT_DATA = {
137
+ selectedDataset: '',
138
+ dataType: EXPORT_DATA_TYPE.CSV,
139
+ filtered: true
140
+ };
141
+
142
+ /**
143
+ * @constant
144
+ */
145
+ export var DEFAULT_NOTIFICATIONS = [];
146
+
147
+ /**
148
+ * @constant
149
+ * @property exportMapboxAccessToken - Default: null, this is used when we provide a default mapbox token for users to take advantage of
150
+ * @property userMapboxToken - Default: '', mapbox token provided by user through input field
151
+ * @property mode - Default: 'READ', read only or editable
152
+ * @public
153
+ */
154
+ export var DEFAULT_EXPORT_HTML = {
155
+ exportMapboxAccessToken: null,
156
+ userMapboxToken: '',
157
+ mode: EXPORT_HTML_MAP_MODES.READ
158
+ };
159
+
160
+ /**
161
+ * @constant
162
+ * @property hasData - Default: 'true',
163
+ * @public
164
+ */
165
+ export var DEFAULT_EXPORT_JSON = {
166
+ hasData: true
167
+ };
168
+
169
+ /**
170
+ * Export Map Config
171
+ * @constant
172
+ * @property HTML - Default: 'DEFAULT_EXPORT_HTML',
173
+ * @property JSON - Default: 'DEFAULT_EXPORT_JSON',
174
+ * @property format - Default: 'HTML',
175
+ * @public
176
+ */
177
+ export var DEFAULT_EXPORT_MAP = _defineProperty(_defineProperty(_defineProperty({}, EXPORT_MAP_FORMATS.HTML, DEFAULT_EXPORT_HTML), EXPORT_MAP_FORMATS.JSON, DEFAULT_EXPORT_JSON), "format", EXPORT_MAP_FORMATS.HTML);
178
+
179
+ /**
180
+ * Default initial `exportVideo` settings
181
+ * @memberof uiStateUpdaters
182
+ * @constant
183
+ * @property mediaType Default: `'webm'`
184
+ * @property cameraPreset Default: `'None'`
185
+ * @property fileName Default: `'kepler.gl'`
186
+ * @property resolution Default: `'1280x720'`
187
+ * @property durationMs Default: `1000`
188
+ * @public
189
+ */
190
+ export var DEFAULT_EXPORT_VIDEO = {
191
+ mediaType: 'webm',
192
+ // use webm as default as gif export tends to freeze on larger recordings
193
+ cameraPreset: 'None',
194
+ fileName: 'kepler.gl',
195
+ resolution: '1280x720',
196
+ durationMs: 1000,
197
+ swipeStartPct: 0,
198
+ swipeEndPct: 100,
199
+ swipeEasing: 'ease-in-out'
200
+ };
201
+
202
+ /**
203
+ * Default initial `uiState`
204
+ * @memberof uiStateUpdaters
205
+ * @constant
206
+ * @property readOnly Default: `false`
207
+ * @property activeSidePanel Default: `'layer'`
208
+ * @property currentModal Default: `'addData'`
209
+ * @property datasetKeyToRemove Default: `null`
210
+ * @property visibleDropdown Default: `null`
211
+ * @property exportImage Default: [`DEFAULT_EXPORT_IMAGE`](#default_export_image)
212
+ * @property exportData Default: [`DEFAULT_EXPORT_DATA`](#default_export_data)
213
+ * @property exportMap Default: [`DEFAULT_EXPORT_MAP`](#default_export_map)
214
+ * @property mapControls Default: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
215
+ * @property notifications Default: `[]`
216
+ * @property notifications Default: `[]`
217
+ * @property loadFiles
218
+ * @property isSidePanelCloseButtonVisible Default: `true`
219
+ * @public
220
+ */
221
+ export var INITIAL_UI_STATE = {
222
+ readOnly: false,
223
+ activeSidePanel: DEFAULT_ACTIVE_SIDE_PANEL,
224
+ currentModal: DEFAULT_MODAL,
225
+ datasetKeyToRemove: null,
226
+ visibleDropdown: null,
227
+ // export image modal ui
228
+ exportImage: DEFAULT_EXPORT_IMAGE,
229
+ // export data modal ui
230
+ exportData: DEFAULT_EXPORT_DATA,
231
+ // html export
232
+ exportMap: DEFAULT_EXPORT_MAP,
233
+ // export video modal ui
234
+ exportVideo: DEFAULT_EXPORT_VIDEO,
235
+ // map control panels
236
+ mapControls: DEFAULT_MAP_CONTROLS,
237
+ // ui notifications
238
+ notifications: DEFAULT_NOTIFICATIONS,
239
+ // load files
240
+ loadFiles: DEFAULT_LOAD_FILES,
241
+ // Locale of the UI
242
+ locale: LOCALE_CODES.en,
243
+ layerPanelListView: 'list',
244
+ filterPanelListView: 'list',
245
+ isSidePanelCloseButtonVisible: true
246
+ };
247
+
248
+ /* Updaters */
249
+ /**
250
+ * @memberof uiStateUpdaters
251
+ */
252
+ export var initUiStateUpdater = function initUiStateUpdater(state, action) {
253
+ return _objectSpread(_objectSpread({}, state), (action.payload || {}).initialUiState);
254
+ };
255
+
256
+ /**
257
+ * Toggle active side panel
258
+ * @memberof uiStateUpdaters
259
+ * @param state `uiState`
260
+ * @param action
261
+ * @param action.payload id of side panel to be shown, one of `layer`, `filter`, `interaction`, `map`. close side panel if `null`
262
+ * @returns nextState
263
+ * @public
264
+ */
265
+ export var toggleSidePanelUpdater = function toggleSidePanelUpdater(state, _ref) {
266
+ var id = _ref.payload;
267
+ return id === state.activeSidePanel ? state : _objectSpread(_objectSpread({}, state), {}, {
268
+ activeSidePanel: id
269
+ });
270
+ };
271
+
272
+ /**
273
+ * Show and hide modal dialog
274
+ * @memberof uiStateUpdaters
275
+ * @param state `uiState`
276
+ * @param action
277
+ * @paramaction.payload id of modal to be shown, null to hide modals. One of:
278
+ * - [`DATA_TABLE_ID`](../constants/default-settings.md#data_table_id)
279
+ * - [`DELETE_DATA_ID`](../constants/default-settings.md#delete_data_id)
280
+ * - [`ADD_DATA_ID`](../constants/default-settings.md#add_data_id)
281
+ * - [`EXPORT_IMAGE_ID`](../constants/default-settings.md#export_image_id)
282
+ * - [`EXPORT_DATA_ID`](../constants/default-settings.md#export_data_id)
283
+ * - [`ADD_MAP_STYLE_ID`](../constants/default-settings.md#add_map_style_id)
284
+ * @returns nextState
285
+ * @public
286
+ */
287
+ export var toggleModalUpdater = function toggleModalUpdater(state, _ref2) {
288
+ var id = _ref2.payload;
289
+ return _objectSpread(_objectSpread({}, state), {}, {
290
+ currentModal: id
291
+ });
292
+ };
293
+
294
+ /**
295
+ * Hide and show side panel header dropdown, activated by clicking the share link on top of the side panel
296
+ * @memberof uiStateUpdaters
297
+ * @public
298
+ */
299
+ export var showExportDropdownUpdater = function showExportDropdownUpdater(state, _ref3) {
300
+ var id = _ref3.payload;
301
+ return _objectSpread(_objectSpread({}, state), {}, {
302
+ visibleDropdown: id
303
+ });
304
+ };
305
+
306
+ /**
307
+ * Hide side panel header dropdown, activated by clicking the share link on top of the side panel
308
+ * @memberof uiStateUpdaters
309
+ * @public
310
+ */
311
+ export var hideExportDropdownUpdater = function hideExportDropdownUpdater(state) {
312
+ return _objectSpread(_objectSpread({}, state), {}, {
313
+ visibleDropdown: null
314
+ });
315
+ };
316
+
317
+ /**
318
+ * Toggle side panel close button on top left of the side panel
319
+ * @memberof uiStateUpdaters
320
+ * @public
321
+ */
322
+ export var toggleSidePanelCloseButtonUpdater = function toggleSidePanelCloseButtonUpdater(state, _ref4) {
323
+ var show = _ref4.payload.show;
324
+ return _objectSpread(_objectSpread({}, state), {}, {
325
+ isSidePanelCloseButtonVisible: show
326
+ });
327
+ };
328
+
329
+ // Map control dropdowns/menus that overlap each other visually and therefore
330
+ // should be mutually exclusive: opening one closes all the others.
331
+ // (split/view-mode menu, top/3d/globe menu, polygon draw tool, language menu)
332
+ export var MUTUALLY_EXCLUSIVE_MAP_CONTROLS = [MAP_CONTROLS.splitMap, MAP_CONTROLS.toggle3d, MAP_CONTROLS.mapDraw, MAP_CONTROLS.mapLocale];
333
+
334
+ /**
335
+ * Toggle active map control panel
336
+ * @memberof uiStateUpdaters
337
+ * @param state `uiState`
338
+ * @param action action
339
+ * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
340
+ * @returns nextState
341
+ * @public
342
+ */
343
+ export var toggleMapControlUpdater = function toggleMapControlUpdater(state, _ref5) {
344
+ var _state$mapControls$pa, _updatedState$mapCont;
345
+ var _ref5$payload = _ref5.payload,
346
+ panelId = _ref5$payload.panelId,
347
+ _ref5$payload$index = _ref5$payload.index,
348
+ index = _ref5$payload$index === void 0 ? 0 : _ref5$payload$index;
349
+ var updatedState = state;
350
+ // The effect panel and ai assistant panel can not be active at the same time
351
+ // so we need to deactivate the other panel when one is activated
352
+ var panelToDeactivate = panelId === MAP_CONTROLS.effect ? MAP_CONTROLS.aiAssistant : panelId === MAP_CONTROLS.aiAssistant ? MAP_CONTROLS.effect : null;
353
+
354
+ // If we need to deactivate a competing panel and it's currently active
355
+ if (panelToDeactivate && (_state$mapControls$pa = state.mapControls[panelToDeactivate]) !== null && _state$mapControls$pa !== void 0 && _state$mapControls$pa.active) {
356
+ updatedState = _objectSpread(_objectSpread({}, state), {}, {
357
+ mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, _defineProperty({}, panelToDeactivate, _objectSpread(_objectSpread({}, updatedState.mapControls[panelToDeactivate]), {}, {
358
+ active: false
359
+ })))
360
+ });
361
+ }
362
+
363
+ // The overlapping map control menus should be mutually exclusive: when one of
364
+ // them is being opened, deactivate every other one that is currently active
365
+ // so their dropdowns never overlap on screen.
366
+ var isOpening = !((_updatedState$mapCont = updatedState.mapControls[panelId]) !== null && _updatedState$mapCont !== void 0 && _updatedState$mapCont.active);
367
+ if (isOpening && MUTUALLY_EXCLUSIVE_MAP_CONTROLS.includes(panelId)) {
368
+ var nextMapControls = _objectSpread({}, updatedState.mapControls);
369
+ var didDeactivate = false;
370
+ MUTUALLY_EXCLUSIVE_MAP_CONTROLS.forEach(function (controlId) {
371
+ var _nextMapControls$cont;
372
+ if (controlId !== panelId && (_nextMapControls$cont = nextMapControls[controlId]) !== null && _nextMapControls$cont !== void 0 && _nextMapControls$cont.active) {
373
+ nextMapControls[controlId] = _objectSpread(_objectSpread({}, nextMapControls[controlId]), {}, {
374
+ active: false
375
+ });
376
+ didDeactivate = true;
377
+ }
378
+ });
379
+ if (didDeactivate) {
380
+ updatedState = _objectSpread(_objectSpread({}, updatedState), {}, {
381
+ mapControls: nextMapControls
382
+ });
383
+ }
384
+ }
385
+ return _objectSpread(_objectSpread({}, updatedState), {}, {
386
+ mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, _defineProperty({}, panelId, _objectSpread(_objectSpread({}, updatedState.mapControls[panelId]), {}, {
387
+ active: !updatedState.mapControls[panelId].active,
388
+ activeMapIndex: index
389
+ })))
390
+ });
391
+ };
392
+
393
+ /**
394
+ * Toggle map control visibility
395
+ * @memberof uiStateUpdaters
396
+ * @param state `uiState`
397
+ * @param action action
398
+ * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
399
+ * @returns nextState
400
+ * @public
401
+ */
402
+ export var setMapControlVisibilityUpdater = function setMapControlVisibilityUpdater(state, _ref6) {
403
+ var _state$mapControls;
404
+ var _ref6$payload = _ref6.payload,
405
+ panelId = _ref6$payload.panelId,
406
+ show = _ref6$payload.show;
407
+ if (!((_state$mapControls = state.mapControls) !== null && _state$mapControls !== void 0 && _state$mapControls[panelId])) {
408
+ return state;
409
+ }
410
+ return _objectSpread(_objectSpread({}, state), {}, {
411
+ mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, _defineProperty({}, panelId, _objectSpread(_objectSpread({}, state.mapControls[panelId]), {}, {
412
+ show: Boolean(show)
413
+ })))
414
+ });
415
+ };
416
+
417
+ /**
418
+ * Toggle map control settings
419
+ * @memberof uiStateUpdaters
420
+ * @param state `uiState`
421
+ * @param action action
422
+ * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
423
+ * @returns nextState
424
+ * @public
425
+ */
426
+ export var setMapControlSettingsUpdater = function setMapControlSettingsUpdater(state, _ref7) {
427
+ var _state$mapControls2;
428
+ var _ref7$payload = _ref7.payload,
429
+ panelId = _ref7$payload.panelId,
430
+ settings = _ref7$payload.settings;
431
+ var mapControl = (_state$mapControls2 = state.mapControls) === null || _state$mapControls2 === void 0 ? void 0 : _state$mapControls2[panelId];
432
+ if (!mapControl) {
433
+ return state;
434
+ }
435
+ return _objectSpread(_objectSpread({}, state), {}, {
436
+ mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, _defineProperty({}, panelId, _objectSpread(_objectSpread({}, mapControl), {}, {
437
+ settings: _objectSpread(_objectSpread({}, mapControl.settings), settings)
438
+ })))
439
+ });
440
+ };
441
+
442
+ /**
443
+ * Toggle active map control panel
444
+ * @memberof uiStateUpdaters
445
+ * @param state `uiState`
446
+ * @param action
447
+ * @param action.payload dataset id
448
+ * @returns nextState
449
+ * @public
450
+ */
451
+ export var openDeleteModalUpdater = function openDeleteModalUpdater(state, _ref8) {
452
+ var datasetKeyToRemove = _ref8.payload;
453
+ return _objectSpread(_objectSpread({}, state), {}, {
454
+ currentModal: DELETE_DATA_ID,
455
+ datasetKeyToRemove: datasetKeyToRemove
456
+ });
457
+ };
458
+
459
+ /**
460
+ * Set `exportImage.legend` to `true` or `false`
461
+ * @memberof uiStateUpdaters
462
+ * @param state `uiState`
463
+ * @returns nextState
464
+ * @public
465
+ */
466
+ export var setExportImageSettingUpdater = function setExportImageSettingUpdater(state, _ref9) {
467
+ var newSetting = _ref9.payload;
468
+ var updated = _objectSpread(_objectSpread({}, state.exportImage), newSetting);
469
+ var imageSize = calculateExportImageSize(updated) || state.exportImage.imageSize;
470
+ return _objectSpread(_objectSpread({}, state), {}, {
471
+ exportImage: _objectSpread(_objectSpread({}, updated), {}, {
472
+ imageSize: imageSize
473
+ })
474
+ });
475
+ };
476
+
477
+ /**
478
+ * Set `exportImage.setExportImageDataUri` to a image dataUri
479
+ * @memberof uiStateUpdaters
480
+ * @param state `uiState`
481
+ * @param action
482
+ * @param action.payload export image data uri
483
+ * @returns nextState
484
+ * @public
485
+ */
486
+ export var setExportImageDataUriUpdater = function setExportImageDataUriUpdater(state, _ref0) {
487
+ var dataUri = _ref0.payload;
488
+ if (dataUri === state.exportImage.imageDataUri) {
489
+ return state;
490
+ }
491
+ return _objectSpread(_objectSpread({}, state), {}, {
492
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
493
+ processing: false,
494
+ imageDataUri: dataUri
495
+ })
496
+ });
497
+ };
498
+
499
+ /**
500
+ * @memberof uiStateUpdaters
501
+ * @public
502
+ */
503
+ export var setExportImageErrorUpdater = function setExportImageErrorUpdater(state, _ref1) {
504
+ var error = _ref1.payload;
505
+ return _objectSpread(_objectSpread({}, state), {}, {
506
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
507
+ processing: false,
508
+ error: error
509
+ })
510
+ });
511
+ };
512
+
513
+ /**
514
+ * Delete cached export image
515
+ * @memberof uiStateUpdaters
516
+ * @public
517
+ */
518
+ export var cleanupExportImageUpdater = function cleanupExportImageUpdater(state) {
519
+ return _objectSpread(_objectSpread({}, state), {}, {
520
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
521
+ exporting: false,
522
+ imageDataUri: '',
523
+ error: false,
524
+ processing: false,
525
+ center: false
526
+ })
527
+ });
528
+ };
529
+
530
+ /**
531
+ * Set `exportVideo` settings: mediaType, cameraPreset, fileName, resolution, durationMs
532
+ * @memberof uiStateUpdaters
533
+ * @param state `uiState`
534
+ * @param action
535
+ * @param action.payload new video export settings
536
+ * @returns nextState
537
+ * @public
538
+ */
539
+ export var setExportVideoSettingUpdater = function setExportVideoSettingUpdater(state, _ref10) {
540
+ var newSetting = _ref10.payload;
541
+ return _objectSpread(_objectSpread({}, state), {}, {
542
+ exportVideo: _objectSpread(_objectSpread({}, state.exportVideo), newSetting)
543
+ });
544
+ };
545
+
546
+ /**
547
+ * Start image exporting flow
548
+ * @memberof uiStateUpdaters
549
+ * @param state
550
+ * @param options
551
+ * @returns {UiState}
552
+ * @public
553
+ */
554
+ export var startExportingImageUpdater = function startExportingImageUpdater(state, _ref11) {
555
+ var _ref11$payload = _ref11.payload,
556
+ options = _ref11$payload === void 0 ? {} : _ref11$payload;
557
+ var imageSettings = _objectSpread(_objectSpread({}, options), {}, {
558
+ exporting: true
559
+ });
560
+ return compose_([cleanupExportImageUpdater, apply_(setExportImageSettingUpdater, payload_(imageSettings))])(state);
561
+ };
562
+
563
+ /**
564
+ * Set selected dataset for export
565
+ * @memberof uiStateUpdaters
566
+ * @param state `uiState`
567
+ * @param action
568
+ * @param action.payload dataset id
569
+ * @returns nextState
570
+ * @public
571
+ */
572
+ export var setExportSelectedDatasetUpdater = function setExportSelectedDatasetUpdater(state, _ref12) {
573
+ var dataset = _ref12.payload;
574
+ return _objectSpread(_objectSpread({}, state), {}, {
575
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
576
+ selectedDataset: dataset
577
+ })
578
+ });
579
+ };
580
+
581
+ /**
582
+ * Set data format for exporting data
583
+ * @memberof uiStateUpdaters
584
+ * @param state `uiState`
585
+ * @param action
586
+ * @param action.payload one of `'text/csv'`
587
+ * @returns nextState
588
+ * @public
589
+ */
590
+ export var setExportDataTypeUpdater = function setExportDataTypeUpdater(state, _ref13) {
591
+ var dataType = _ref13.payload;
592
+ return _objectSpread(_objectSpread({}, state), {}, {
593
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
594
+ dataType: dataType
595
+ })
596
+ });
597
+ };
598
+
599
+ /**
600
+ * Whether to export filtered data, `true` or `false`
601
+ * @memberof uiStateUpdaters
602
+ * @param state `uiState`
603
+ * @param action
604
+ * @param action.payload
605
+ * @returns nextState
606
+ * @public
607
+ */
608
+ export var setExportFilteredUpdater = function setExportFilteredUpdater(state, _ref14) {
609
+ var filtered = _ref14.payload;
610
+ return _objectSpread(_objectSpread({}, state), {}, {
611
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
612
+ filtered: filtered
613
+ })
614
+ });
615
+ };
616
+
617
+ /**
618
+ * Whether to including data in map config, toggle between `true` or `false`
619
+ * @memberof uiStateUpdaters
620
+ * @param state `uiState`
621
+ * @returns nextState
622
+ * @public
623
+ */
624
+ export var setExportDataUpdater = function setExportDataUpdater(state) {
625
+ return _objectSpread(_objectSpread({}, state), {}, {
626
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, _defineProperty({}, EXPORT_MAP_FORMATS.JSON, _objectSpread(_objectSpread({}, state.exportMap[EXPORT_MAP_FORMATS.JSON]), {}, {
627
+ hasData: !state.exportMap[EXPORT_MAP_FORMATS.JSON].hasData
628
+ })))
629
+ });
630
+ };
631
+
632
+ /**
633
+ * whether to export a mapbox access to HTML single page
634
+ * @param state - `uiState`
635
+ * @param action
636
+ * @param action.payload
637
+ * @returns nextState
638
+ * @public
639
+ */
640
+ export var setUserMapboxAccessTokenUpdater = function setUserMapboxAccessTokenUpdater(state, _ref15) {
641
+ var userMapboxToken = _ref15.payload;
642
+ return _objectSpread(_objectSpread({}, state), {}, {
643
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, _defineProperty({}, EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[EXPORT_MAP_FORMATS.HTML]), {}, {
644
+ userMapboxToken: userMapboxToken
645
+ })))
646
+ });
647
+ };
648
+
649
+ /**
650
+ * Sets the export map format
651
+ * @param state - `uiState`
652
+ * @param action
653
+ * @param action.payload format to use to export the map into
654
+ * @return nextState
655
+ */
656
+ export var setExportMapFormatUpdater = function setExportMapFormatUpdater(state, _ref16) {
657
+ var format = _ref16.payload;
658
+ return _objectSpread(_objectSpread({}, state), {}, {
659
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, {
660
+ // @ts-expect-error
661
+ format: format
662
+ })
663
+ });
664
+ };
665
+
666
+ /**
667
+ * Set the export html map mode
668
+ * @param state - `uiState`
669
+ * @param action
670
+ * @param action.payload to be set (available modes: EXPORT_HTML_MAP_MODES)
671
+ * @return nextState
672
+ */
673
+ export var setExportMapHTMLModeUpdater = function setExportMapHTMLModeUpdater(state, _ref17) {
674
+ var mode = _ref17.payload;
675
+ return _objectSpread(_objectSpread({}, state), {}, {
676
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, _defineProperty({}, EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[EXPORT_MAP_FORMATS.HTML]), {}, {
677
+ mode: mode
678
+ })))
679
+ });
680
+ };
681
+
682
+ /**
683
+ * Adds a new notification.
684
+ * Updates a notification in case of matching ids.
685
+ * @memberof uiStateUpdaters
686
+ * @param state `uiState`
687
+ * @param action
688
+ * @param action.payload Params of a notification
689
+ * @returns nextState
690
+ * @public
691
+ */
692
+ export var addNotificationUpdater = function addNotificationUpdater(state, _ref18) {
693
+ var payload = _ref18.payload;
694
+ var oldNotifications = state.notifications || [];
695
+ // @ts-expect-error
696
+ var payloadId = payload === null || payload === void 0 ? void 0 : payload.id;
697
+ var notificationToUpdate = payloadId ? oldNotifications.find(function (n) {
698
+ return n.id === payloadId;
699
+ }) : null;
700
+ var notifications;
701
+ if (notificationToUpdate) {
702
+ notifications = oldNotifications.map(function (n) {
703
+ return n.id === payloadId ? createNotification(_objectSpread(_objectSpread({}, payload), {}, {
704
+ count: n.count + 1
705
+ })) : n;
706
+ });
707
+ } else {
708
+ notifications = [].concat(_toConsumableArray(oldNotifications), [createNotification(payload)]);
709
+ }
710
+ return _objectSpread(_objectSpread({}, state), {}, {
711
+ notifications: notifications
712
+ });
713
+ };
714
+
715
+ /**
716
+ * Remove a notification
717
+ * @memberof uiStateUpdaters
718
+ * @param state `uiState`
719
+ * @param action
720
+ * @param action.payload id of the notification to be removed
721
+ * @returns nextState
722
+ * @public
723
+ */
724
+ export var removeNotificationUpdater = function removeNotificationUpdater(state, _ref19) {
725
+ var id = _ref19.payload;
726
+ return _objectSpread(_objectSpread({}, state), {}, {
727
+ notifications: state.notifications.filter(function (n) {
728
+ return n.id !== id;
729
+ })
730
+ });
731
+ };
732
+
733
+ /**
734
+ * Fired when file loading begin
735
+ * @memberof uiStateUpdaters
736
+ * @param state `uiState`
737
+ * @returns nextState
738
+ * @public
739
+ */
740
+ export var loadFilesUpdater = function loadFilesUpdater(state) {
741
+ return _objectSpread(_objectSpread({}, state), {}, {
742
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
743
+ fileLoading: true
744
+ })
745
+ });
746
+ };
747
+
748
+ /**
749
+ * Handles loading file success and set fileLoading property to false
750
+ * @memberof uiStateUpdaters
751
+ * @param state `uiState`
752
+ * @returns nextState
753
+ */
754
+ export var loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state) {
755
+ return _objectSpread(_objectSpread({}, state), {}, {
756
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
757
+ fileLoading: false
758
+ })
759
+ });
760
+ };
761
+
762
+ /**
763
+ * Handles load file error and set fileLoading property to false
764
+ * @memberof uiStateUpdaters
765
+ * @param state
766
+ * @param action
767
+ * @param action.error
768
+ * @returns nextState
769
+ * @public
770
+ */
771
+ export var loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref20) {
772
+ var error = _ref20.error;
773
+ return addNotificationUpdater(_objectSpread(_objectSpread({}, state), {}, {
774
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
775
+ fileLoading: false
776
+ })
777
+ }), {
778
+ payload: errorNotification({
779
+ message: (error || {}).message || 'Failed to upload files',
780
+ topic: DEFAULT_NOTIFICATION_TOPICS.global
781
+ })
782
+ });
783
+ };
784
+
785
+ /**
786
+ * Handles toggle map split and reset all map control index to 0
787
+ * @memberof uiStateUpdaters
788
+ * @param state
789
+ * @returns nextState
790
+ * @public
791
+ */
792
+ export var toggleSplitMapUpdater = function toggleSplitMapUpdater(state) {
793
+ return _objectSpread(_objectSpread({}, state), {}, {
794
+ mapControls: Object.entries(state.mapControls).reduce(function (acc, entry) {
795
+ return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, entry[0], _objectSpread(_objectSpread({}, entry[1]), {}, {
796
+ activeMapIndex: 0
797
+ })));
798
+ }, {})
799
+ });
800
+ };
801
+
802
+ /**
803
+ * Toggle modal data
804
+ * @memberof uiStateUpdaters
805
+ * @param state
806
+ * @returns nextState
807
+ * @public
808
+ */
809
+ export var showDatasetTableUpdater = function showDatasetTableUpdater(state) {
810
+ return toggleModalUpdater(state, {
811
+ payload: DATA_TABLE_ID
812
+ });
813
+ };
814
+
815
+ /**
816
+ * Set the locale of the UI
817
+ * @memberof uiStateUpdaters
818
+ * @param state `uiState`
819
+ * @param action
820
+ * @param action.payload
821
+ * @param action.payload.locale locale
822
+ * @returns nextState
823
+ * @public
824
+ */
825
+ export var setLocaleUpdater = function setLocaleUpdater(state, _ref21) {
826
+ var locale = _ref21.payload.locale;
827
+ return _objectSpread(_objectSpread({}, state), {}, {
828
+ locale: locale
829
+ });
830
+ };
831
+
832
+ /**
833
+ * Toggle layer panel list view
834
+ * @memberof uiStateUpdaters
835
+ * @param state `uiState`
836
+ * @param action
837
+ * @param action.payload layer panel listView value. Can be 'list' or 'sortByDataset'
838
+ * @returns nextState
839
+ * @public
840
+ */
841
+ export var togglePanelListViewUpdater = function togglePanelListViewUpdater(state, _ref22) {
842
+ var _ref22$payload = _ref22.payload,
843
+ panelId = _ref22$payload.panelId,
844
+ listView = _ref22$payload.listView;
845
+ var stateProp = panelId === 'layer' ? 'layerPanelListView' : panelId === 'filter' ? 'filterPanelListView' : null;
846
+ if (!stateProp || state[stateProp] === listView) {
847
+ return state;
848
+ }
849
+ return _objectSpread(_objectSpread({}, state), {}, _defineProperty({}, stateProp, listView));
850
+ };
851
+
852
+ /**
853
+ * Merge received ui state config when loading a saved map
854
+ * @memberof uiStateUpdaters
855
+ * @param state `uiState`
856
+ * @param action
857
+ * @param action.payload saved map config `{mapStyle, visState, mapState, uiState}`
858
+ * @returns nextState
859
+ * @public
860
+ */
861
+ export var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref23) {
862
+ var _uiState$mapControls, _uiState$mapControls2;
863
+ var config = _ref23.payload.config;
864
+ var _ref24 = config || {},
865
+ uiState = _ref24.uiState;
866
+ if (!uiState) {
867
+ return state;
868
+ }
869
+ var newState = state;
870
+ if ((_uiState$mapControls = uiState.mapControls) !== null && _uiState$mapControls !== void 0 && (_uiState$mapControls = _uiState$mapControls.mapLegend) !== null && _uiState$mapControls !== void 0 && _uiState$mapControls.active) {
871
+ var currentLegend = newState.mapControls.mapLegend;
872
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
873
+ mapControls: _objectSpread(_objectSpread({}, newState.mapControls), {}, {
874
+ mapLegend: _objectSpread(_objectSpread({
875
+ show: true
876
+ }, currentLegend), {}, {
877
+ active: true,
878
+ activeMapIndex: 0
879
+ })
880
+ })
881
+ });
882
+ }
883
+ if ((_uiState$mapControls2 = uiState.mapControls) !== null && _uiState$mapControls2 !== void 0 && (_uiState$mapControls2 = _uiState$mapControls2.mapLegend) !== null && _uiState$mapControls2 !== void 0 && _uiState$mapControls2.settings) {
884
+ newState = setMapControlSettingsUpdater(newState, {
885
+ payload: {
886
+ panelId: 'mapLegend',
887
+ settings: uiState.mapControls.mapLegend.settings
888
+ }
889
+ });
890
+ }
891
+ if (uiState.locale) {
892
+ newState = setLocaleUpdater(newState, {
893
+ payload: {
894
+ locale: uiState.locale
895
+ }
896
+ });
897
+ }
898
+ return newState;
899
+ };
900
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBRERfREFUQV9JRCIsIkRBVEFfVEFCTEVfSUQiLCJERUZBVUxUX05PVElGSUNBVElPTl9UT1BJQ1MiLCJERUxFVEVfREFUQV9JRCIsIkVYUE9SVF9EQVRBX1RZUEUiLCJFWFBPUlRfSFRNTF9NQVBfTU9ERVMiLCJFWFBPUlRfSU1HX1JBVElPUyIsIkVYUE9SVF9NQVBfRk9STUFUUyIsIlJFU09MVVRJT05TIiwiTUFQX0NPTlRST0xTIiwiTE9DQUxFX0NPREVTIiwiY3JlYXRlTm90aWZpY2F0aW9uIiwiZXJyb3JOb3RpZmljYXRpb24iLCJjYWxjdWxhdGVFeHBvcnRJbWFnZVNpemUiLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsInBheWxvYWRfIiwiYXBwbHlfIiwiY29tcG9zZV8iLCJERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMIiwiREVGQVVMVF9NT0RBTCIsInVpU3RhdGVVcGRhdGVycyIsIkRFRkFVTFRfTUFQX0NPTlRST0xTX0ZFQVRVUkVTIiwic2hvdyIsImFjdGl2ZSIsImRpc2FibGVDbG9zZSIsImFjdGl2ZU1hcEluZGV4IiwiREVGQVVMVF9NQVBfTEVHRU5EX0NPTlRST0wiLCJfb2JqZWN0U3ByZWFkIiwiZGlzYWJsZUVkaXQiLCJERUZBVUxUX01BUF9DT05UUk9MUyIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJmaW5hbCIsImN1cnJlbnQiLCJfZGVmaW5lUHJvcGVydHkiLCJtYXBMZWdlbmQiLCJERUZBVUxUX0VYUE9SVF9JTUFHRSIsInJhdGlvIiwiU0NSRUVOIiwicmVzb2x1dGlvbiIsIk9ORV9YIiwibGVnZW5kIiwibWFwSCIsIm1hcFciLCJpbWFnZVNpemUiLCJ6b29tT2Zmc2V0Iiwic2NhbGUiLCJpbWFnZVciLCJpbWFnZUgiLCJjZW50ZXIiLCJpbWFnZURhdGFVcmkiLCJleHBvcnRpbmciLCJwcm9jZXNzaW5nIiwiZXJyb3IiLCJlc2NhcGVYaHRtbEZvcldlYnBhY2siLCJERUZBVUxUX0xPQURfRklMRVMiLCJmaWxlTG9hZGluZyIsIkRFRkFVTFRfRVhQT1JUX0RBVEEiLCJzZWxlY3RlZERhdGFzZXQiLCJkYXRhVHlwZSIsIkNTViIsImZpbHRlcmVkIiwiREVGQVVMVF9OT1RJRklDQVRJT05TIiwiREVGQVVMVF9FWFBPUlRfSFRNTCIsImV4cG9ydE1hcGJveEFjY2Vzc1Rva2VuIiwidXNlck1hcGJveFRva2VuIiwibW9kZSIsIlJFQUQiLCJERUZBVUxUX0VYUE9SVF9KU09OIiwiaGFzRGF0YSIsIkRFRkFVTFRfRVhQT1JUX01BUCIsIkhUTUwiLCJKU09OIiwiREVGQVVMVF9FWFBPUlRfVklERU8iLCJtZWRpYVR5cGUiLCJjYW1lcmFQcmVzZXQiLCJmaWxlTmFtZSIsImR1cmF0aW9uTXMiLCJzd2lwZVN0YXJ0UGN0Iiwic3dpcGVFbmRQY3QiLCJzd2lwZUVhc2luZyIsIklOSVRJQUxfVUlfU1RBVEUiLCJyZWFkT25seSIsImFjdGl2ZVNpZGVQYW5lbCIsImN1cnJlbnRNb2RhbCIsImRhdGFzZXRLZXlUb1JlbW92ZSIsInZpc2libGVEcm9wZG93biIsImV4cG9ydEltYWdlIiwiZXhwb3J0RGF0YSIsImV4cG9ydE1hcCIsImV4cG9ydFZpZGVvIiwibWFwQ29udHJvbHMiLCJub3RpZmljYXRpb25zIiwibG9hZEZpbGVzIiwibG9jYWxlIiwiZW4iLCJsYXllclBhbmVsTGlzdFZpZXciLCJmaWx0ZXJQYW5lbExpc3RWaWV3IiwiaXNTaWRlUGFuZWxDbG9zZUJ1dHRvblZpc2libGUiLCJpbml0VWlTdGF0ZVVwZGF0ZXIiLCJzdGF0ZSIsImFjdGlvbiIsInBheWxvYWQiLCJpbml0aWFsVWlTdGF0ZSIsInRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXIiLCJfcmVmIiwiaWQiLCJ0b2dnbGVNb2RhbFVwZGF0ZXIiLCJfcmVmMiIsInNob3dFeHBvcnREcm9wZG93blVwZGF0ZXIiLCJfcmVmMyIsImhpZGVFeHBvcnREcm9wZG93blVwZGF0ZXIiLCJ0b2dnbGVTaWRlUGFuZWxDbG9zZUJ1dHRvblVwZGF0ZXIiLCJfcmVmNCIsIk1VVFVBTExZX0VYQ0xVU0lWRV9NQVBfQ09OVFJPTFMiLCJzcGxpdE1hcCIsInRvZ2dsZTNkIiwibWFwRHJhdyIsIm1hcExvY2FsZSIsInRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyIiwiX3JlZjUiLCJfc3RhdGUkbWFwQ29udHJvbHMkcGEiLCJfdXBkYXRlZFN0YXRlJG1hcENvbnQiLCJfcmVmNSRwYXlsb2FkIiwicGFuZWxJZCIsIl9yZWY1JHBheWxvYWQkaW5kZXgiLCJpbmRleCIsInVwZGF0ZWRTdGF0ZSIsInBhbmVsVG9EZWFjdGl2YXRlIiwiZWZmZWN0IiwiYWlBc3Npc3RhbnQiLCJpc09wZW5pbmciLCJpbmNsdWRlcyIsIm5leHRNYXBDb250cm9scyIsImRpZERlYWN0aXZhdGUiLCJmb3JFYWNoIiwiY29udHJvbElkIiwiX25leHRNYXBDb250cm9scyRjb250Iiwic2V0TWFwQ29udHJvbFZpc2liaWxpdHlVcGRhdGVyIiwiX3JlZjYiLCJfc3RhdGUkbWFwQ29udHJvbHMiLCJfcmVmNiRwYXlsb2FkIiwiQm9vbGVhbiIsInNldE1hcENvbnRyb2xTZXR0aW5nc1VwZGF0ZXIiLCJfcmVmNyIsIl9zdGF0ZSRtYXBDb250cm9sczIiLCJfcmVmNyRwYXlsb2FkIiwic2V0dGluZ3MiLCJtYXBDb250cm9sIiwib3BlbkRlbGV0ZU1vZGFsVXBkYXRlciIsIl9yZWY4Iiwic2V0RXhwb3J0SW1hZ2VTZXR0aW5nVXBkYXRlciIsIl9yZWY5IiwibmV3U2V0dGluZyIsInVwZGF0ZWQiLCJzZXRFeHBvcnRJbWFnZURhdGFVcmlVcGRhdGVyIiwiX3JlZjAiLCJkYXRhVXJpIiwic2V0RXhwb3J0SW1hZ2VFcnJvclVwZGF0ZXIiLCJfcmVmMSIsImNsZWFudXBFeHBvcnRJbWFnZVVwZGF0ZXIiLCJzZXRFeHBvcnRWaWRlb1NldHRpbmdVcGRhdGVyIiwiX3JlZjEwIiwic3RhcnRFeHBvcnRpbmdJbWFnZVVwZGF0ZXIiLCJfcmVmMTEiLCJfcmVmMTEkcGF5bG9hZCIsIm9wdGlvbnMiLCJpbWFnZVNldHRpbmdzIiwic2V0RXhwb3J0U2VsZWN0ZWREYXRhc2V0VXBkYXRlciIsIl9yZWYxMiIsImRhdGFzZXQiLCJzZXRFeHBvcnREYXRhVHlwZVVwZGF0ZXIiLCJfcmVmMTMiLCJzZXRFeHBvcnRGaWx0ZXJlZFVwZGF0ZXIiLCJfcmVmMTQiLCJzZXRFeHBvcnREYXRhVXBkYXRlciIsInNldFVzZXJNYXBib3hBY2Nlc3NUb2tlblVwZGF0ZXIiLCJfcmVmMTUiLCJzZXRFeHBvcnRNYXBGb3JtYXRVcGRhdGVyIiwiX3JlZjE2IiwiZm9ybWF0Iiwic2V0RXhwb3J0TWFwSFRNTE1vZGVVcGRhdGVyIiwiX3JlZjE3IiwiYWRkTm90aWZpY2F0aW9uVXBkYXRlciIsIl9yZWYxOCIsIm9sZE5vdGlmaWNhdGlvbnMiLCJwYXlsb2FkSWQiLCJub3RpZmljYXRpb25Ub1VwZGF0ZSIsImZpbmQiLCJuIiwibWFwIiwiY291bnQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJyZW1vdmVOb3RpZmljYXRpb25VcGRhdGVyIiwiX3JlZjE5IiwiZmlsdGVyIiwibG9hZEZpbGVzVXBkYXRlciIsImxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyIiwibG9hZEZpbGVzRXJyVXBkYXRlciIsIl9yZWYyMCIsIm1lc3NhZ2UiLCJ0b3BpYyIsImdsb2JhbCIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsImVudHJpZXMiLCJhY2MiLCJlbnRyeSIsInNob3dEYXRhc2V0VGFibGVVcGRhdGVyIiwic2V0TG9jYWxlVXBkYXRlciIsIl9yZWYyMSIsInRvZ2dsZVBhbmVsTGlzdFZpZXdVcGRhdGVyIiwiX3JlZjIyIiwiX3JlZjIyJHBheWxvYWQiLCJsaXN0VmlldyIsInN0YXRlUHJvcCIsInJlY2VpdmVNYXBDb25maWdVcGRhdGVyIiwiX3JlZjIzIiwiX3VpU3RhdGUkbWFwQ29udHJvbHMiLCJfdWlTdGF0ZSRtYXBDb250cm9sczIiLCJjb25maWciLCJfcmVmMjQiLCJ1aVN0YXRlIiwibmV3U3RhdGUiLCJjdXJyZW50TGVnZW5kIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpLXN0YXRlLXVwZGF0ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7XG4gIEFERF9EQVRBX0lELFxuICBEQVRBX1RBQkxFX0lELFxuICBERUZBVUxUX05PVElGSUNBVElPTl9UT1BJQ1MsXG4gIERFTEVURV9EQVRBX0lELFxuICBFWFBPUlRfREFUQV9UWVBFLFxuICBFWFBPUlRfSFRNTF9NQVBfTU9ERVMsXG4gIEVYUE9SVF9JTUdfUkFUSU9TLFxuICBFWFBPUlRfTUFQX0ZPUk1BVFMsXG4gIFJFU09MVVRJT05TLFxuICBNQVBfQ09OVFJPTFNcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtMT0NBTEVfQ09ERVN9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7XG4gIGNyZWF0ZU5vdGlmaWNhdGlvbixcbiAgZXJyb3JOb3RpZmljYXRpb24sXG4gIGNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSxcbiAgZ2V0QXBwbGljYXRpb25Db25maWdcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge3BheWxvYWRfLCBhcHBseV8sIGNvbXBvc2VffSBmcm9tICcuL2NvbXBvc2VyLWhlbHBlcnMnO1xuXG5pbXBvcnQge1xuICBBY3Rpb25UeXBlcyxcbiAgS2VwbGVyR2xJbml0UGF5bG9hZCxcbiAgTG9hZEZpbGVzRXJyVXBkYXRlckFjdGlvbixcbiAgUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQsXG4gIFVJU3RhdGVBY3Rpb25zXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge1xuICBFeHBvcnREYXRhLFxuICBFeHBvcnRIdG1sLFxuICBFeHBvcnRKc29uLFxuICBFeHBvcnRNYXAsXG4gIEV4cG9ydEltYWdlLFxuICBFeHBvcnRWaWRlbyxcbiAgTWFwQ29udHJvbEl0ZW0sXG4gIE1hcENvbnRyb2xzLFxuICBVaVN0YXRlXG59IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BQ1RJVkVfU0lERV9QQU5FTCA9ICdsYXllcic7XG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RBTCA9IEFERF9EQVRBX0lEO1xuXG4vKipcbiAqIFVwZGF0ZXJzIGZvciBgdWlTdGF0ZWAgcmVkdWNlci4gQ2FuIGJlIHVzZWQgaW4geW91ciByb290IHJlZHVjZXIgdG8gZGlyZWN0bHkgbW9kaWZ5IGtlcGxlci5nbCdzIHN0YXRlLlxuICogUmVhZCBtb3JlIGFib3V0IFtVc2luZyB1cGRhdGVyc10oLi4vYWR2YW5jZWQtdXNhZ2UvdXNpbmctdXBkYXRlcnMubWQpXG4gKlxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7dWlTdGF0ZVVwZGF0ZXJzfSBmcm9tICdAa2VwbGVyLmdsL3JlZHVjZXJzJztcbiAqIC8vIFJvb3QgUmVkdWNlclxuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogIGtlcGxlckdsOiBrZXBsZXJHbFJlZHVjZXIsXG4gKiAgYXBwOiBhcHBSZWR1Y2VyXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBjb21wb3NlZFJlZHVjZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICogIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAqICAgIC8vIGNsaWNrIGJ1dHRvbiB0byBjbG9zZSBzaWRlIHBhbmVsXG4gKiAgICBjYXNlICdDTElDS19CVVRUT04nOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIGZvbzoge1xuICogICAgICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wuZm9vLFxuICogICAgICAgICAgICAgdWlTdGF0ZTogdWlTdGF0ZVVwZGF0ZXJzLnRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXIoXG4gKiAgICAgICAgICAgICAgIHVpU3RhdGUsIHtwYXlsb2FkOiBudWxsfVxuICogICAgICAgICAgICAgKVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgdWlTdGF0ZVVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5cbmNvbnN0IERFRkFVTFRfTUFQX0NPTlRST0xTX0ZFQVRVUkVTOiBNYXBDb250cm9sSXRlbSA9IHtcbiAgc2hvdzogdHJ1ZSxcbiAgYWN0aXZlOiBmYWxzZSxcbiAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcbiAgLy8gZGVmaW5lcyB3aGljaCBtYXAgaW5kZXggdXNlcnMgYXJlIGludGVyYWN0aW5nIHdpdGggKHRocm91Z2ggbWFwIGNvbnRyb2xzKVxuICBhY3RpdmVNYXBJbmRleDogMFxufTtcblxuY29uc3QgREVGQVVMVF9NQVBfTEVHRU5EX0NPTlRST0wgPSB7XG4gIC4uLkRFRkFVTFRfTUFQX0NPTlRST0xTX0ZFQVRVUkVTLFxuICBkaXNhYmxlRWRpdDogZmFsc2Vcbn07XG4vKipcbiAqIEEgbGlzdCBvZiBtYXAgY29udHJvbCB2aXNpYmlsaXR5IGFuZCB3aGV0aGVyIGlzIGl0IGFjdGl2ZS5cbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHZpc2libGVMYXllcnMgRGVmYXVsdDogYHtzaG93OiB0cnVlLCBhY3RpdmU6IGZhbHNlfWBcbiAqIEBwcm9wZXJ0eSBtYXBMZWdlbmQgRGVmYXVsdDogYHtzaG93OiB0cnVlLCBhY3RpdmU6IGZhbHNlfWBcbiAqIEBwcm9wZXJ0eSB0b2dnbGUzZCBEZWZhdWx0OiBge3Nob3c6IHRydWV9YFxuICogQHByb3BlcnR5IHNwbGl0TWFwIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZX1gXG4gKiBAcHJvcGVydHkgbWFwRHJhdyBEZWZhdWx0OiBge3Nob3c6IHRydWUsIGFjdGl2ZTogZmFsc2V9YFxuICogQHByb3BlcnR5IG1hcExvY2FsZSBEZWZhdWx0OiBge3Nob3c6IGZhbHNlLCBhY3RpdmU6IGZhbHNlfWBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFQX0NPTlRST0xTOiBNYXBDb250cm9scyA9IChcbiAgT2JqZWN0LmtleXMoTUFQX0NPTlRST0xTKSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgTUFQX0NPTlRST0xTPlxuKS5yZWR1Y2UoXG4gIChmaW5hbCwgY3VycmVudCkgPT4gKHtcbiAgICAuLi5maW5hbCxcbiAgICBbY3VycmVudF06XG4gICAgICBjdXJyZW50ID09PSBNQVBfQ09OVFJPTFMubWFwTGVnZW5kXG4gICAgICAgID8gREVGQVVMVF9NQVBfTEVHRU5EX0NPTlRST0xcbiAgICAgICAgOiBERUZBVUxUX01BUF9DT05UUk9MU19GRUFUVVJFU1xuICB9KSxcbiAge30gYXMgTWFwQ29udHJvbHNcbik7XG5cbi8qKlxuICogRGVmYXVsdCBpbWFnZSBleHBvcnQgY29uZmlnXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSByYXRpbyBEZWZhdWx0OiBgJ1NDUkVFTidgLFxuICogQHByb3BlcnR5IHJlc29sdXRpb24gRGVmYXVsdDogYCdPTkVfWCdgLFxuICogQHByb3BlcnR5IGxlZ2VuZCBEZWZhdWx0OiBgZmFsc2VgLFxuICogQHByb3BlcnR5IG1hcEggRGVmYXVsdDogMCxcbiAqIEBwcm9wZXJ0eSBtYXBXIERlZmF1bHQ6IDAsXG4gKiBAcHJvcGVydHkgaW1hZ2VTaXplIERlZmF1bHQ6IHt6b29tT2Zmc2V0OiAwLCBzY2FsZTogMSwgaW1hZ2VXOiAwLCBpbWFnZUg6IDB9LFxuICogQHByb3BlcnR5IGltYWdlRGF0YVVyaSBEZWZhdWx0OiBgJydgLFxuICogQHByb3BlcnR5IGV4cG9ydGluZyBEZWZhdWx0OiBgZmFsc2VgXG4gKiBAcHJvcGVydHkgZXJyb3IgRGVmYXVsdDogYGZhbHNlYFxuICogQHByb3BlcnR5IGVzY2FwZVhodG1sRm9yV2VicGFjayBEZWZhdWx0OiBmcm9tIGFwcGxpY2F0aW9uIGNvbmZpZyAoYXV0by1kZXRlY3RlZDogYHRydWVgIGZvciB3ZWJwYWNrKVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfSU1BR0U6IEV4cG9ydEltYWdlID0ge1xuICAvLyB1c2VyIG9wdGlvbnNcbiAgcmF0aW86IEVYUE9SVF9JTUdfUkFUSU9TLlNDUkVFTixcbiAgcmVzb2x1dGlvbjogUkVTT0xVVElPTlMuT05FX1gsXG4gIGxlZ2VuZDogZmFsc2UsXG4gIG1hcEg6IDAsXG4gIG1hcFc6IDAsXG4gIGltYWdlU2l6ZToge1xuICAgIHpvb21PZmZzZXQ6IDAsXG4gICAgc2NhbGU6IDEsXG4gICAgaW1hZ2VXOiAwLFxuICAgIGltYWdlSDogMFxuICB9LFxuICAvLyB3aGVuIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZSBtb2NrIG1hcCB2aWV3cG9ydCB3aWxsIG1vdmUgdG8gdGhlIGNlbnRlciBvZiBkYXRhXG4gIGNlbnRlcjogZmFsc2UsXG4gIC8vIGV4cG9ydGluZyBzdGF0ZVxuICBpbWFnZURhdGFVcmk6ICcnLFxuICAvLyBleHBvcnRpbmc6IHVzZWQgdG8gYXR0YWNoIHBsb3QtY29udGFpbmVyIHRvIGRvbVxuICBleHBvcnRpbmc6IGZhbHNlLFxuICAvLyBwcm9jZXNzaW5nOiB1c2VkIGFzIGxvYWRpbmcgaW5kaWNhdG9yIHdoZW4gZXhwb3J0IGltYWdlIGlzIGJlaW5nIHByb2R1Y2VkXG4gIHByb2Nlc3Npbmc6IGZhbHNlLFxuICBlcnJvcjogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gYXBwbHkgZml4IGZvciB1Z2xpZnkgZXJyb3IgaW4gZG9tLXRvLWltYWdlIChmcm9tIGFwcGxpY2F0aW9uIGNvbmZpZywgYXV0by1kZXRlY3RzIGJ1aWxkIHRvb2wpXG4gIGVzY2FwZVhodG1sRm9yV2VicGFjazogZ2V0QXBwbGljYXRpb25Db25maWcoKS5lc2NhcGVYaHRtbEZvcldlYnBhY2tcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xPQURfRklMRVMgPSB7XG4gIGZpbGVMb2FkaW5nOiBmYWxzZVxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYGV4cG9ydERhdGFgIHNldHRpbmdzXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBzZWxlY3RlZERhdGFzZXQgRGVmYXVsdDogYCcnYCxcbiAqIEBwcm9wZXJ0eSBkYXRhVHlwZSBEZWZhdWx0OiBgJ2NzdidgLFxuICogQHByb3BlcnR5IGZpbHRlcmVkIERlZmF1bHQ6IGB0cnVlYCxcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhQT1JUX0RBVEE6IEV4cG9ydERhdGEgPSB7XG4gIHNlbGVjdGVkRGF0YXNldDogJycsXG4gIGRhdGFUeXBlOiBFWFBPUlRfREFUQV9UWVBFLkNTVixcbiAgZmlsdGVyZWQ6IHRydWVcbn07XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PVElGSUNBVElPTlMgPSBbXTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBleHBvcnRNYXBib3hBY2Nlc3NUb2tlbiAtIERlZmF1bHQ6IG51bGwsIHRoaXMgaXMgdXNlZCB3aGVuIHdlIHByb3ZpZGUgYSBkZWZhdWx0IG1hcGJveCB0b2tlbiBmb3IgdXNlcnMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2ZcbiAqIEBwcm9wZXJ0eSB1c2VyTWFwYm94VG9rZW4gLSBEZWZhdWx0OiAnJywgbWFwYm94IHRva2VuIHByb3ZpZGVkIGJ5IHVzZXIgdGhyb3VnaCBpbnB1dCBmaWVsZFxuICogQHByb3BlcnR5IG1vZGUgLSBEZWZhdWx0OiAnUkVBRCcsIHJlYWQgb25seSBvciBlZGl0YWJsZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfSFRNTDogRXhwb3J0SHRtbCA9IHtcbiAgZXhwb3J0TWFwYm94QWNjZXNzVG9rZW46IG51bGwsXG4gIHVzZXJNYXBib3hUb2tlbjogJycsXG4gIG1vZGU6IEVYUE9SVF9IVE1MX01BUF9NT0RFUy5SRUFEXG59O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IGhhc0RhdGEgLSBEZWZhdWx0OiAndHJ1ZScsXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9KU09OOiBFeHBvcnRKc29uID0ge1xuICBoYXNEYXRhOiB0cnVlXG59O1xuXG4vKipcbiAqIEV4cG9ydCBNYXAgQ29uZmlnXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBIVE1MIC0gRGVmYXVsdDogJ0RFRkFVTFRfRVhQT1JUX0hUTUwnLFxuICogQHByb3BlcnR5IEpTT04gLSBEZWZhdWx0OiAnREVGQVVMVF9FWFBPUlRfSlNPTicsXG4gKiBAcHJvcGVydHkgZm9ybWF0IC0gRGVmYXVsdDogJ0hUTUwnLFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfTUFQOiBFeHBvcnRNYXAgPSB7XG4gIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF06IERFRkFVTFRfRVhQT1JUX0hUTUwsXG4gIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSlNPTl06IERFRkFVTFRfRVhQT1JUX0pTT04sXG4gIGZvcm1hdDogRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxcbn07XG5cbi8qKlxuICogRGVmYXVsdCBpbml0aWFsIGBleHBvcnRWaWRlb2Agc2V0dGluZ3NcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IG1lZGlhVHlwZSBEZWZhdWx0OiBgJ3dlYm0nYFxuICogQHByb3BlcnR5IGNhbWVyYVByZXNldCBEZWZhdWx0OiBgJ05vbmUnYFxuICogQHByb3BlcnR5IGZpbGVOYW1lIERlZmF1bHQ6IGAna2VwbGVyLmdsJ2BcbiAqIEBwcm9wZXJ0eSByZXNvbHV0aW9uIERlZmF1bHQ6IGAnMTI4MHg3MjAnYFxuICogQHByb3BlcnR5IGR1cmF0aW9uTXMgRGVmYXVsdDogYDEwMDBgXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9WSURFTzogRXhwb3J0VmlkZW8gPSB7XG4gIG1lZGlhVHlwZTogJ3dlYm0nLCAvLyB1c2Ugd2VibSBhcyBkZWZhdWx0IGFzIGdpZiBleHBvcnQgdGVuZHMgdG8gZnJlZXplIG9uIGxhcmdlciByZWNvcmRpbmdzXG4gIGNhbWVyYVByZXNldDogJ05vbmUnLFxuICBmaWxlTmFtZTogJ2tlcGxlci5nbCcsXG4gIHJlc29sdXRpb246ICcxMjgweDcyMCcsXG4gIGR1cmF0aW9uTXM6IDEwMDAsXG4gIHN3aXBlU3RhcnRQY3Q6IDAsXG4gIHN3aXBlRW5kUGN0OiAxMDAsXG4gIHN3aXBlRWFzaW5nOiAnZWFzZS1pbi1vdXQnXG59O1xuXG4vKipcbiAqIERlZmF1bHQgaW5pdGlhbCBgdWlTdGF0ZWBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHJlYWRPbmx5IERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSBhY3RpdmVTaWRlUGFuZWwgRGVmYXVsdDogYCdsYXllcidgXG4gKiBAcHJvcGVydHkgY3VycmVudE1vZGFsIERlZmF1bHQ6IGAnYWRkRGF0YSdgXG4gKiBAcHJvcGVydHkgZGF0YXNldEtleVRvUmVtb3ZlIERlZmF1bHQ6IGBudWxsYFxuICogQHByb3BlcnR5IHZpc2libGVEcm9wZG93biBEZWZhdWx0OiBgbnVsbGBcbiAqIEBwcm9wZXJ0eSBleHBvcnRJbWFnZSBEZWZhdWx0OiBbYERFRkFVTFRfRVhQT1JUX0lNQUdFYF0oI2RlZmF1bHRfZXhwb3J0X2ltYWdlKVxuICogQHByb3BlcnR5IGV4cG9ydERhdGEgRGVmYXVsdDogW2BERUZBVUxUX0VYUE9SVF9EQVRBYF0oI2RlZmF1bHRfZXhwb3J0X2RhdGEpXG4gKiBAcHJvcGVydHkgZXhwb3J0TWFwIERlZmF1bHQ6IFtgREVGQVVMVF9FWFBPUlRfTUFQYF0oI2RlZmF1bHRfZXhwb3J0X21hcClcbiAqIEBwcm9wZXJ0eSBtYXBDb250cm9scyBEZWZhdWx0OiBbYERFRkFVTFRfTUFQX0NPTlRST0xTYF0oI2RlZmF1bHRfbWFwX2NvbnRyb2xzKVxuICogQHByb3BlcnR5IG5vdGlmaWNhdGlvbnMgRGVmYXVsdDogYFtdYFxuICogQHByb3BlcnR5IG5vdGlmaWNhdGlvbnMgRGVmYXVsdDogYFtdYFxuICogQHByb3BlcnR5IGxvYWRGaWxlc1xuICogQHByb3BlcnR5IGlzU2lkZVBhbmVsQ2xvc2VCdXR0b25WaXNpYmxlIERlZmF1bHQ6IGB0cnVlYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9VSV9TVEFURTogVWlTdGF0ZSA9IHtcbiAgcmVhZE9ubHk6IGZhbHNlLFxuICBhY3RpdmVTaWRlUGFuZWw6IERFRkFVTFRfQUNUSVZFX1NJREVfUEFORUwsXG4gIGN1cnJlbnRNb2RhbDogREVGQVVMVF9NT0RBTCxcbiAgZGF0YXNldEtleVRvUmVtb3ZlOiBudWxsLFxuICB2aXNpYmxlRHJvcGRvd246IG51bGwsXG4gIC8vIGV4cG9ydCBpbWFnZSBtb2RhbCB1aVxuICBleHBvcnRJbWFnZTogREVGQVVMVF9FWFBPUlRfSU1BR0UsXG4gIC8vIGV4cG9ydCBkYXRhIG1vZGFsIHVpXG4gIGV4cG9ydERhdGE6IERFRkFVTFRfRVhQT1JUX0RBVEEsXG4gIC8vIGh0bWwgZXhwb3J0XG4gIGV4cG9ydE1hcDogREVGQVVMVF9FWFBPUlRfTUFQLFxuICAvLyBleHBvcnQgdmlkZW8gbW9kYWwgdWlcbiAgZXhwb3J0VmlkZW86IERFRkFVTFRfRVhQT1JUX1ZJREVPLFxuICAvLyBtYXAgY29udHJvbCBwYW5lbHNcbiAgbWFwQ29udHJvbHM6IERFRkFVTFRfTUFQX0NPTlRST0xTLFxuICAvLyB1aSBub3RpZmljYXRpb25zXG4gIG5vdGlmaWNhdGlvbnM6IERFRkFVTFRfTk9USUZJQ0FUSU9OUyxcbiAgLy8gbG9hZCBmaWxlc1xuICBsb2FkRmlsZXM6IERFRkFVTFRfTE9BRF9GSUxFUyxcbiAgLy8gTG9jYWxlIG9mIHRoZSBVSVxuICBsb2NhbGU6IExPQ0FMRV9DT0RFUy5lbixcbiAgbGF5ZXJQYW5lbExpc3RWaWV3OiAnbGlzdCcsXG4gIGZpbHRlclBhbmVsTGlzdFZpZXc6ICdsaXN0JyxcbiAgaXNTaWRlUGFuZWxDbG9zZUJ1dHRvblZpc2libGU6IHRydWVcbn07XG5cbi8qIFVwZGF0ZXJzICovXG4vKipcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGluaXRVaVN0YXRlVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIGFjdGlvbjoge1xuICAgIHR5cGU/OiAodHlwZW9mIEFjdGlvblR5cGVzKVsnSU5JVCddO1xuICAgIHBheWxvYWQ6IEtlcGxlckdsSW5pdFBheWxvYWQ7XG4gIH1cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIC4uLihhY3Rpb24ucGF5bG9hZCB8fCB7fSkuaW5pdGlhbFVpU3RhdGVcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBhY3RpdmUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGlkIG9mIHNpZGUgcGFuZWwgdG8gYmUgc2hvd24sIG9uZSBvZiBgbGF5ZXJgLCBgZmlsdGVyYCwgYGludGVyYWN0aW9uYCwgYG1hcGAuIGNsb3NlIHNpZGUgcGFuZWwgaWYgYG51bGxgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogaWR9OiBVSVN0YXRlQWN0aW9ucy5Ub2dnbGVTaWRlUGFuZWxVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgcmV0dXJuIGlkID09PSBzdGF0ZS5hY3RpdmVTaWRlUGFuZWxcbiAgICA/IHN0YXRlXG4gICAgOiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBhY3RpdmVTaWRlUGFuZWw6IGlkXG4gICAgICB9O1xufTtcblxuLyoqXG4gKiBTaG93IGFuZCBoaWRlIG1vZGFsIGRpYWxvZ1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtYWN0aW9uLnBheWxvYWQgaWQgb2YgbW9kYWwgdG8gYmUgc2hvd24sIG51bGwgdG8gaGlkZSBtb2RhbHMuIE9uZSBvZjpcbiAqICAtIFtgREFUQV9UQUJMRV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2RhdGFfdGFibGVfaWQpXG4gKiAgLSBbYERFTEVURV9EQVRBX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjZGVsZXRlX2RhdGFfaWQpXG4gKiAgLSBbYEFERF9EQVRBX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjYWRkX2RhdGFfaWQpXG4gKiAgLSBbYEVYUE9SVF9JTUFHRV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2V4cG9ydF9pbWFnZV9pZClcbiAqICAtIFtgRVhQT1JUX0RBVEFfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNleHBvcnRfZGF0YV9pZClcbiAqICAtIFtgQUREX01BUF9TVFlMRV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2FkZF9tYXBfc3R5bGVfaWQpXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZU1vZGFsVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZU1vZGFsVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgY3VycmVudE1vZGFsOiBpZFxufSk7XG5cbi8qKlxuICogSGlkZSBhbmQgc2hvdyBzaWRlIHBhbmVsIGhlYWRlciBkcm9wZG93biwgYWN0aXZhdGVkIGJ5IGNsaWNraW5nIHRoZSBzaGFyZSBsaW5rIG9uIHRvcCBvZiB0aGUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2hvd0V4cG9ydERyb3Bkb3duVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlNob3dFeHBvcnREcm9wZG93blVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIHZpc2libGVEcm9wZG93bjogaWRcbn0pO1xuXG4vKipcbiAqIEhpZGUgc2lkZSBwYW5lbCBoZWFkZXIgZHJvcGRvd24sIGFjdGl2YXRlZCBieSBjbGlja2luZyB0aGUgc2hhcmUgbGluayBvbiB0b3Agb2YgdGhlIHNpZGUgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGhpZGVFeHBvcnREcm9wZG93blVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICB2aXNpYmxlRHJvcGRvd246IG51bGxcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBzaWRlIHBhbmVsIGNsb3NlIGJ1dHRvbiBvbiB0b3AgbGVmdCBvZiB0aGUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU2lkZVBhbmVsQ2xvc2VCdXR0b25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtzaG93fX06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZVNpZGVQYW5lbENsb3NlQnV0dG9uVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgaXNTaWRlUGFuZWxDbG9zZUJ1dHRvblZpc2libGU6IHNob3dcbn0pO1xuXG4vLyBNYXAgY29udHJvbCBkcm9wZG93bnMvbWVudXMgdGhhdCBvdmVybGFwIGVhY2ggb3RoZXIgdmlzdWFsbHkgYW5kIHRoZXJlZm9yZVxuLy8gc2hvdWxkIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZTogb3BlbmluZyBvbmUgY2xvc2VzIGFsbCB0aGUgb3RoZXJzLlxuLy8gKHNwbGl0L3ZpZXctbW9kZSBtZW51LCB0b3AvM2QvZ2xvYmUgbWVudSwgcG9seWdvbiBkcmF3IHRvb2wsIGxhbmd1YWdlIG1lbnUpXG5leHBvcnQgY29uc3QgTVVUVUFMTFlfRVhDTFVTSVZFX01BUF9DT05UUk9MUzogc3RyaW5nW10gPSBbXG4gIE1BUF9DT05UUk9MUy5zcGxpdE1hcCxcbiAgTUFQX0NPTlRST0xTLnRvZ2dsZTNkLFxuICBNQVBfQ09OVFJPTFMubWFwRHJhdyxcbiAgTUFQX0NPTlRST0xTLm1hcExvY2FsZVxuXTtcblxuLyoqXG4gKiBUb2dnbGUgYWN0aXZlIG1hcCBjb250cm9sIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIG1hcCBjb250cm9sIHBhbmVsIGlkLCBvbmUgb2YgdGhlIGtleXMgb2Y6IFtgREVGQVVMVF9NQVBfQ09OVFJPTFNgXSgjZGVmYXVsdF9tYXBfY29udHJvbHMpXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtwYW5lbElkLCBpbmRleCA9IDB9fTogVUlTdGF0ZUFjdGlvbnMuVG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICBsZXQgdXBkYXRlZFN0YXRlID0gc3RhdGU7XG4gIC8vIFRoZSBlZmZlY3QgcGFuZWwgYW5kIGFpIGFzc2lzdGFudCBwYW5lbCBjYW4gbm90IGJlIGFjdGl2ZSBhdCB0aGUgc2FtZSB0aW1lXG4gIC8vIHNvIHdlIG5lZWQgdG8gZGVhY3RpdmF0ZSB0aGUgb3RoZXIgcGFuZWwgd2hlbiBvbmUgaXMgYWN0aXZhdGVkXG4gIGNvbnN0IHBhbmVsVG9EZWFjdGl2YXRlID1cbiAgICBwYW5lbElkID09PSBNQVBfQ09OVFJPTFMuZWZmZWN0XG4gICAgICA/IE1BUF9DT05UUk9MUy5haUFzc2lzdGFudFxuICAgICAgOiBwYW5lbElkID09PSBNQVBfQ09OVFJPTFMuYWlBc3Npc3RhbnRcbiAgICAgID8gTUFQX0NPTlRST0xTLmVmZmVjdFxuICAgICAgOiBudWxsO1xuXG4gIC8vIElmIHdlIG5lZWQgdG8gZGVhY3RpdmF0ZSBhIGNvbXBldGluZyBwYW5lbCBhbmQgaXQncyBjdXJyZW50bHkgYWN0aXZlXG4gIGlmIChwYW5lbFRvRGVhY3RpdmF0ZSAmJiBzdGF0ZS5tYXBDb250cm9sc1twYW5lbFRvRGVhY3RpdmF0ZV0/LmFjdGl2ZSkge1xuICAgIHVwZGF0ZWRTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbWFwQ29udHJvbHM6IHtcbiAgICAgICAgLi4udXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzLFxuICAgICAgICBbcGFuZWxUb0RlYWN0aXZhdGVdOiB7XG4gICAgICAgICAgLi4udXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzW3BhbmVsVG9EZWFjdGl2YXRlXSxcbiAgICAgICAgICBhY3RpdmU6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIG92ZXJsYXBwaW5nIG1hcCBjb250cm9sIG1lbnVzIHNob3VsZCBiZSBtdXR1YWxseSBleGNsdXNpdmU6IHdoZW4gb25lIG9mXG4gIC8vIHRoZW0gaXMgYmVpbmcgb3BlbmVkLCBkZWFjdGl2YXRlIGV2ZXJ5IG90aGVyIG9uZSB0aGF0IGlzIGN1cnJlbnRseSBhY3RpdmVcbiAgLy8gc28gdGhlaXIgZHJvcGRvd25zIG5ldmVyIG92ZXJsYXAgb24gc2NyZWVuLlxuICBjb25zdCBpc09wZW5pbmcgPSAhdXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzW3BhbmVsSWRdPy5hY3RpdmU7XG4gIGlmIChpc09wZW5pbmcgJiYgTVVUVUFMTFlfRVhDTFVTSVZFX01BUF9DT05UUk9MUy5pbmNsdWRlcyhwYW5lbElkKSkge1xuICAgIGNvbnN0IG5leHRNYXBDb250cm9scyA9IHsuLi51cGRhdGVkU3RhdGUubWFwQ29udHJvbHN9O1xuICAgIGxldCBkaWREZWFjdGl2YXRlID0gZmFsc2U7XG4gICAgTVVUVUFMTFlfRVhDTFVTSVZFX01BUF9DT05UUk9MUy5mb3JFYWNoKGNvbnRyb2xJZCA9PiB7XG4gICAgICBpZiAoY29udHJvbElkICE9PSBwYW5lbElkICYmIG5leHRNYXBDb250cm9sc1tjb250cm9sSWRdPy5hY3RpdmUpIHtcbiAgICAgICAgbmV4dE1hcENvbnRyb2xzW2NvbnRyb2xJZF0gPSB7Li4ubmV4dE1hcENvbnRyb2xzW2NvbnRyb2xJZF0sIGFjdGl2ZTogZmFsc2V9O1xuICAgICAgICBkaWREZWFjdGl2YXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZGlkRGVhY3RpdmF0ZSkge1xuICAgICAgdXBkYXRlZFN0YXRlID0gey4uLnVwZGF0ZWRTdGF0ZSwgbWFwQ29udHJvbHM6IG5leHRNYXBDb250cm9sc307XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi51cGRhdGVkU3RhdGUsXG4gICAgbWFwQ29udHJvbHM6IHtcbiAgICAgIC4uLnVwZGF0ZWRTdGF0ZS5tYXBDb250cm9scyxcbiAgICAgIFtwYW5lbElkXToge1xuICAgICAgICAuLi51cGRhdGVkU3RhdGUubWFwQ29udHJvbHNbcGFuZWxJZF0sXG4gICAgICAgIGFjdGl2ZTogIXVwZGF0ZWRTdGF0ZS5tYXBDb250cm9sc1twYW5lbElkXS5hY3RpdmUsXG4gICAgICAgIGFjdGl2ZU1hcEluZGV4OiBpbmRleFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIG1hcCBjb250cm9sIHZpc2liaWxpdHlcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgbWFwIGNvbnRyb2wgcGFuZWwgaWQsIG9uZSBvZiB0aGUga2V5cyBvZjogW2BERUZBVUxUX01BUF9DT05UUk9MU2BdKCNkZWZhdWx0X21hcF9jb250cm9scylcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwQ29udHJvbFZpc2liaWxpdHlVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtwYW5lbElkLCBzaG93fX06IFVJU3RhdGVBY3Rpb25zLnNldE1hcENvbnRyb2xWaXNpYmlsaXR5VXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGlmICghc3RhdGUubWFwQ29udHJvbHM/LltwYW5lbElkXSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbWFwQ29udHJvbHM6IHtcbiAgICAgIC4uLnN0YXRlLm1hcENvbnRyb2xzLFxuICAgICAgW3BhbmVsSWRdOiB7XG4gICAgICAgIC4uLnN0YXRlLm1hcENvbnRyb2xzW3BhbmVsSWRdLFxuICAgICAgICBzaG93OiBCb29sZWFuKHNob3cpXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBUb2dnbGUgbWFwIGNvbnRyb2wgc2V0dGluZ3NcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgbWFwIGNvbnRyb2wgcGFuZWwgaWQsIG9uZSBvZiB0aGUga2V5cyBvZjogW2BERUZBVUxUX01BUF9DT05UUk9MU2BdKCNkZWZhdWx0X21hcF9jb250cm9scylcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwQ29udHJvbFNldHRpbmdzVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiB7cGFuZWxJZCwgc2V0dGluZ3N9fTogVUlTdGF0ZUFjdGlvbnMuc2V0TWFwQ29udHJvbFNldHRpbmdzVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGNvbnN0IG1hcENvbnRyb2wgPSBzdGF0ZS5tYXBDb250cm9scz8uW3BhbmVsSWRdO1xuICBpZiAoIW1hcENvbnRyb2wpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIG1hcENvbnRyb2xzOiB7XG4gICAgICAuLi5zdGF0ZS5tYXBDb250cm9scyxcbiAgICAgIFtwYW5lbElkXTogey4uLm1hcENvbnRyb2wsIHNldHRpbmdzOiB7Li4ubWFwQ29udHJvbC5zZXR0aW5ncywgLi4uc2V0dGluZ3N9fVxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIGFjdGl2ZSBtYXAgY29udHJvbCBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGRhdGFzZXQgaWRcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgb3BlbkRlbGV0ZU1vZGFsVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBkYXRhc2V0S2V5VG9SZW1vdmV9OiBVSVN0YXRlQWN0aW9ucy5PcGVuRGVsZXRlTW9kYWxVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBjdXJyZW50TW9kYWw6IERFTEVURV9EQVRBX0lELFxuICBkYXRhc2V0S2V5VG9SZW1vdmVcbn0pO1xuXG4vKipcbiAqIFNldCBgZXhwb3J0SW1hZ2UubGVnZW5kYCB0byBgdHJ1ZWAgb3IgYGZhbHNlYFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IG5ld1NldHRpbmd9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3QgdXBkYXRlZCA9IHsuLi5zdGF0ZS5leHBvcnRJbWFnZSwgLi4ubmV3U2V0dGluZ307XG4gIGNvbnN0IGltYWdlU2l6ZSA9IGNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSh1cGRhdGVkKSB8fCBzdGF0ZS5leHBvcnRJbWFnZS5pbWFnZVNpemU7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBleHBvcnRJbWFnZToge1xuICAgICAgLi4udXBkYXRlZCxcbiAgICAgIGltYWdlU2l6ZVxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogU2V0IGBleHBvcnRJbWFnZS5zZXRFeHBvcnRJbWFnZURhdGFVcmlgIHRvIGEgaW1hZ2UgZGF0YVVyaVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGV4cG9ydCBpbWFnZSBkYXRhIHVyaVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRJbWFnZURhdGFVcmlVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGRhdGFVcml9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRJbWFnZURhdGFVcmlVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgaWYgKGRhdGFVcmkgPT09IHN0YXRlLmV4cG9ydEltYWdlLmltYWdlRGF0YVVyaSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGV4cG9ydEltYWdlOiB7XG4gICAgICAuLi5zdGF0ZS5leHBvcnRJbWFnZSxcbiAgICAgIHByb2Nlc3Npbmc6IGZhbHNlLFxuICAgICAgaW1hZ2VEYXRhVXJpOiBkYXRhVXJpXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRJbWFnZUVycm9yVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBlcnJvcn06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydEltYWdlRXJyb3JVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRJbWFnZToge1xuICAgIC4uLnN0YXRlLmV4cG9ydEltYWdlLFxuICAgIHByb2Nlc3Npbmc6IGZhbHNlLFxuICAgIGVycm9yXG4gIH1cbn0pO1xuXG4vKipcbiAqIERlbGV0ZSBjYWNoZWQgZXhwb3J0IGltYWdlXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBjbGVhbnVwRXhwb3J0SW1hZ2VVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0SW1hZ2U6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRJbWFnZSxcbiAgICBleHBvcnRpbmc6IGZhbHNlLFxuICAgIGltYWdlRGF0YVVyaTogJycsXG4gICAgZXJyb3I6IGZhbHNlLFxuICAgIHByb2Nlc3Npbmc6IGZhbHNlLFxuICAgIGNlbnRlcjogZmFsc2VcbiAgfVxufSk7XG5cbi8qKlxuICogU2V0IGBleHBvcnRWaWRlb2Agc2V0dGluZ3M6IG1lZGlhVHlwZSwgY2FtZXJhUHJlc2V0LCBmaWxlTmFtZSwgcmVzb2x1dGlvbiwgZHVyYXRpb25Nc1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIG5ldyB2aWRlbyBleHBvcnQgc2V0dGluZ3NcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0VmlkZW9TZXR0aW5nVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBuZXdTZXR0aW5nfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0VmlkZW9TZXR0aW5nVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0VmlkZW86IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRWaWRlbyxcbiAgICAuLi5uZXdTZXR0aW5nXG4gIH1cbn0pO1xuXG4vKipcbiAqIFN0YXJ0IGltYWdlIGV4cG9ydGluZyBmbG93XG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7VWlTdGF0ZX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0YXJ0RXhwb3J0aW5nSW1hZ2VVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IG9wdGlvbnMgPSB7fX06IHtwYXlsb2FkOiBQYXJ0aWFsPEV4cG9ydEltYWdlPn1cbik6IFVpU3RhdGUgPT4ge1xuICBjb25zdCBpbWFnZVNldHRpbmdzID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZXhwb3J0aW5nOiB0cnVlXG4gIH07XG5cbiAgcmV0dXJuIGNvbXBvc2VfKFtcbiAgICBjbGVhbnVwRXhwb3J0SW1hZ2VVcGRhdGVyLFxuICAgIGFwcGx5XyhzZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyLCBwYXlsb2FkXyhpbWFnZVNldHRpbmdzKSlcbiAgXSkoc3RhdGUpO1xufTtcblxuLyoqXG4gKiBTZXQgc2VsZWN0ZWQgZGF0YXNldCBmb3IgZXhwb3J0XG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgZGF0YXNldCBpZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRTZWxlY3RlZERhdGFzZXRVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGRhdGFzZXR9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRTZWxlY3RlZERhdGFzZXRVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnREYXRhOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0RGF0YSxcbiAgICBzZWxlY3RlZERhdGFzZXQ6IGRhdGFzZXRcbiAgfVxufSk7XG5cbi8qKlxuICogU2V0IGRhdGEgZm9ybWF0IGZvciBleHBvcnRpbmcgZGF0YVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIG9uZSBvZiBgJ3RleHQvY3N2J2BcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0RGF0YVR5cGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGRhdGFUeXBlfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0RGF0YVR5cGVVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnREYXRhOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0RGF0YSxcbiAgICBkYXRhVHlwZVxuICB9XG59KTtcblxuLyoqXG4gKiBXaGV0aGVyIHRvIGV4cG9ydCBmaWx0ZXJlZCBkYXRhLCBgdHJ1ZWAgb3IgYGZhbHNlYFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydEZpbHRlcmVkVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBmaWx0ZXJlZH06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydEZpbHRlcmVkVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0RGF0YToge1xuICAgIC4uLnN0YXRlLmV4cG9ydERhdGEsXG4gICAgZmlsdGVyZWRcbiAgfVxufSk7XG5cbi8qKlxuICogV2hldGhlciB0byBpbmNsdWRpbmcgZGF0YSBpbiBtYXAgY29uZmlnLCB0b2dnbGUgYmV0d2VlbiBgdHJ1ZWAgb3IgYGZhbHNlYFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnREYXRhVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICBbRVhQT1JUX01BUF9GT1JNQVRTLkpTT05dOiB7XG4gICAgICAuLi5zdGF0ZS5leHBvcnRNYXBbRVhQT1JUX01BUF9GT1JNQVRTLkpTT05dLFxuICAgICAgaGFzRGF0YTogIXN0YXRlLmV4cG9ydE1hcFtFWFBPUlRfTUFQX0ZPUk1BVFMuSlNPTl0uaGFzRGF0YVxuICAgIH1cbiAgfVxufSk7XG5cbi8qKlxuICogd2hldGhlciB0byBleHBvcnQgYSBtYXBib3ggYWNjZXNzIHRvIEhUTUwgc2luZ2xlIHBhZ2VcbiAqIEBwYXJhbSBzdGF0ZSAtIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFVzZXJNYXBib3hBY2Nlc3NUb2tlblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogdXNlck1hcGJveFRva2VufTogVUlTdGF0ZUFjdGlvbnMuU2V0VXNlck1hcGJveEFjY2Vzc1Rva2VuVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0TWFwOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0TWFwLFxuICAgIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF06IHtcbiAgICAgIC4uLnN0YXRlLmV4cG9ydE1hcFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF0sXG4gICAgICB1c2VyTWFwYm94VG9rZW5cbiAgICB9XG4gIH1cbn0pO1xuXG4vKipcbiAqIFNldHMgdGhlIGV4cG9ydCBtYXAgZm9ybWF0XG4gKiBAcGFyYW0gc3RhdGUgLSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBmb3JtYXQgdG8gdXNlIHRvIGV4cG9ydCB0aGUgbWFwIGludG9cbiAqIEByZXR1cm4gbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRNYXBGb3JtYXRVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGZvcm1hdH06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydE1hcEZvcm1hdFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgZm9ybWF0XG4gIH1cbn0pO1xuXG4vKipcbiAqIFNldCB0aGUgZXhwb3J0IGh0bWwgbWFwIG1vZGVcbiAqIEBwYXJhbSBzdGF0ZSAtIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIHRvIGJlIHNldCAoYXZhaWxhYmxlIG1vZGVzOiBFWFBPUlRfSFRNTF9NQVBfTU9ERVMpXG4gKiBAcmV0dXJuIG5leHRTdGF0ZVxuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0TWFwSFRNTE1vZGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IG1vZGV9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRIVE1MTWFwTW9kZVVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdOiB7XG4gICAgICAuLi5zdGF0ZS5leHBvcnRNYXBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdLFxuICAgICAgbW9kZVxuICAgIH1cbiAgfVxufSk7XG5cbi8qKlxuICogQWRkcyBhIG5ldyBub3RpZmljYXRpb24uXG4gKiBVcGRhdGVzIGEgbm90aWZpY2F0aW9uIGluIGNhc2Ugb2YgbWF0Y2hpbmcgaWRzLlxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIFBhcmFtcyBvZiBhIG5vdGlmaWNhdGlvblxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGROb3RpZmljYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWR9OiBVSVN0YXRlQWN0aW9ucy5BZGROb3RpZmljYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3Qgb2xkTm90aWZpY2F0aW9ucyA9IHN0YXRlLm5vdGlmaWNhdGlvbnMgfHwgW107XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3QgcGF5bG9hZElkID0gcGF5bG9hZD8uaWQ7XG4gIGNvbnN0IG5vdGlmaWNhdGlvblRvVXBkYXRlID0gcGF5bG9hZElkID8gb2xkTm90aWZpY2F0aW9ucy5maW5kKG4gPT4gbi5pZCA9PT0gcGF5bG9hZElkKSA6IG51bGw7XG5cbiAgbGV0IG5vdGlmaWNhdGlvbnM7XG4gIGlmIChub3RpZmljYXRpb25Ub1VwZGF0ZSkge1xuICAgIG5vdGlmaWNhdGlvbnMgPSBvbGROb3RpZmljYXRpb25zLm1hcChuID0+XG4gICAgICBuLmlkID09PSBwYXlsb2FkSWQgPyBjcmVhdGVOb3RpZmljYXRpb24oey4uLnBheWxvYWQsIGNvdW50OiBuLmNvdW50ICsgMX0pIDogblxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgbm90aWZpY2F0aW9ucyA9IFsuLi5vbGROb3RpZmljYXRpb25zLCBjcmVhdGVOb3RpZmljYXRpb24ocGF5bG9hZCldO1xuICB9XG5cbiAgcmV0dXJuIHsuLi5zdGF0ZSwgbm90aWZpY2F0aW9uc307XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIG5vdGlmaWNhdGlvblxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGlkIG9mIHRoZSBub3RpZmljYXRpb24gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVOb3RpZmljYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGlkfTogVUlTdGF0ZUFjdGlvbnMuUmVtb3ZlTm90aWZpY2F0aW9uVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbm90aWZpY2F0aW9uczogc3RhdGUubm90aWZpY2F0aW9ucy5maWx0ZXIobiA9PiBuLmlkICE9PSBpZClcbn0pO1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gZmlsZSBsb2FkaW5nIGJlZ2luXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc1VwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsb2FkRmlsZXM6IHtcbiAgICAuLi5zdGF0ZS5sb2FkRmlsZXMsXG4gICAgZmlsZUxvYWRpbmc6IHRydWVcbiAgfVxufSk7XG5cbi8qKlxuICogSGFuZGxlcyBsb2FkaW5nIGZpbGUgc3VjY2VzcyBhbmQgc2V0IGZpbGVMb2FkaW5nIHByb3BlcnR5IHRvIGZhbHNlXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbG9hZEZpbGVzOiB7XG4gICAgLi4uc3RhdGUubG9hZEZpbGVzLFxuICAgIGZpbGVMb2FkaW5nOiBmYWxzZVxuICB9XG59KTtcblxuLyoqXG4gKiBIYW5kbGVzIGxvYWQgZmlsZSBlcnJvciBhbmQgc2V0IGZpbGVMb2FkaW5nIHByb3BlcnR5IHRvIGZhbHNlXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24uZXJyb3JcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzRXJyVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSwge2Vycm9yfTogTG9hZEZpbGVzRXJyVXBkYXRlckFjdGlvbik6IFVpU3RhdGUgPT5cbiAgYWRkTm90aWZpY2F0aW9uVXBkYXRlcihcbiAgICB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxvYWRGaWxlczoge1xuICAgICAgICAuLi5zdGF0ZS5sb2FkRmlsZXMsXG4gICAgICAgIGZpbGVMb2FkaW5nOiBmYWxzZVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgcGF5bG9hZDogZXJyb3JOb3RpZmljYXRpb24oe1xuICAgICAgICBtZXNzYWdlOiAoZXJyb3IgfHwge30pLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byB1cGxvYWQgZmlsZXMnLFxuICAgICAgICB0b3BpYzogREVGQVVMVF9OT1RJRklDQVRJT05fVE9QSUNTLmdsb2JhbFxuICAgICAgfSlcbiAgICB9XG4gICk7XG5cbi8qKlxuICogSGFuZGxlcyB0b2dnbGUgbWFwIHNwbGl0IGFuZCByZXNldCBhbGwgbWFwIGNvbnRyb2wgaW5kZXggdG8gMFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIG1hcENvbnRyb2xzOiBPYmplY3QuZW50cmllcyhzdGF0ZS5tYXBDb250cm9scykucmVkdWNlKFxuICAgIChhY2MsIGVudHJ5KSA9PiAoe1xuICAgICAgLi4uYWNjLFxuICAgICAgW2VudHJ5WzBdXToge1xuICAgICAgICAuLi5lbnRyeVsxXSxcbiAgICAgICAgYWN0aXZlTWFwSW5kZXg6IDBcbiAgICAgIH1cbiAgICB9KSxcbiAgICB7fSBhcyBNYXBDb250cm9sc1xuICApXG59KTtcblxuLyoqXG4gKiBUb2dnbGUgbW9kYWwgZGF0YVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNob3dEYXRhc2V0VGFibGVVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PlxuICB0b2dnbGVNb2RhbFVwZGF0ZXIoc3RhdGUsIHtwYXlsb2FkOiBEQVRBX1RBQkxFX0lEfSk7XG5cbi8qKlxuICogU2V0IHRoZSBsb2NhbGUgb2YgdGhlIFVJXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWRcbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZC5sb2NhbGUgbG9jYWxlXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldExvY2FsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge2xvY2FsZX19OiBVSVN0YXRlQWN0aW9ucy5TZXRMb2NhbGVVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsb2NhbGVcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBsYXllciBwYW5lbCBsaXN0IHZpZXdcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBsYXllciBwYW5lbCBsaXN0VmlldyB2YWx1ZS4gQ2FuIGJlICdsaXN0JyBvciAnc29ydEJ5RGF0YXNldCdcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlUGFuZWxMaXN0Vmlld1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3BhbmVsSWQsIGxpc3RWaWV3fX06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZVBhbmVsTGlzdFZpZXdBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICBjb25zdCBzdGF0ZVByb3AgPVxuICAgIHBhbmVsSWQgPT09ICdsYXllcidcbiAgICAgID8gJ2xheWVyUGFuZWxMaXN0VmlldydcbiAgICAgIDogcGFuZWxJZCA9PT0gJ2ZpbHRlcidcbiAgICAgID8gJ2ZpbHRlclBhbmVsTGlzdFZpZXcnXG4gICAgICA6IG51bGw7XG4gIGlmICghc3RhdGVQcm9wIHx8IHN0YXRlW3N0YXRlUHJvcF0gPT09IGxpc3RWaWV3KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgW3N0YXRlUHJvcF06IGxpc3RWaWV3XG4gIH07XG59O1xuXG4vKipcbiAqIE1lcmdlIHJlY2VpdmVkIHVpIHN0YXRlIGNvbmZpZyB3aGVuIGxvYWRpbmcgYSBzYXZlZCBtYXBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBzYXZlZCBtYXAgY29uZmlnIGB7bWFwU3R5bGUsIHZpc1N0YXRlLCBtYXBTdGF0ZSwgdWlTdGF0ZX1gXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlY2VpdmVNYXBDb25maWdVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtjb25maWd9XG4gIH06IHtcbiAgICB0eXBlPzogKHR5cGVvZiBBY3Rpb25UeXBlcylbJ1JFQ0VJVkVfTUFQX0NPTkZJRyddO1xuICAgIHBheWxvYWQ6IFJlY2VpdmVNYXBDb25maWdQYXlsb2FkO1xuICB9XG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3Qge3VpU3RhdGV9ID0gY29uZmlnIHx8IHt9O1xuICBpZiAoIXVpU3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcblxuICBpZiAodWlTdGF0ZS5tYXBDb250cm9scz8ubWFwTGVnZW5kPy5hY3RpdmUpIHtcbiAgICBjb25zdCBjdXJyZW50TGVnZW5kID0gbmV3U3RhdGUubWFwQ29udHJvbHMubWFwTGVnZW5kO1xuICAgIG5ld1N0YXRlID0ge1xuICAgICAgLi4ubmV3U3RhdGUsXG4gICAgICBtYXBDb250cm9sczoge1xuICAgICAgICAuLi5uZXdTdGF0ZS5tYXBDb250cm9scyxcbiAgICAgICAgbWFwTGVnZW5kOiB7XG4gICAgICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgICAgICAuLi5jdXJyZW50TGVnZW5kLFxuICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICBhY3RpdmVNYXBJbmRleDogMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGlmICh1aVN0YXRlLm1hcENvbnRyb2xzPy5tYXBMZWdlbmQ/LnNldHRpbmdzKSB7XG4gICAgbmV3U3RhdGUgPSBzZXRNYXBDb250cm9sU2V0dGluZ3NVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBwYXlsb2FkOiB7cGFuZWxJZDogJ21hcExlZ2VuZCcsIHNldHRpbmdzOiB1aVN0YXRlLm1hcENvbnRyb2xzLm1hcExlZ2VuZC5zZXR0aW5nc31cbiAgICB9IGFzIFVJU3RhdGVBY3Rpb25zLnNldE1hcENvbnRyb2xTZXR0aW5nc1VwZGF0ZXJBY3Rpb24pO1xuICB9XG5cbiAgaWYgKHVpU3RhdGUubG9jYWxlKSB7XG4gICAgbmV3U3RhdGUgPSBzZXRMb2NhbGVVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBwYXlsb2FkOiB7bG9jYWxlOiB1aVN0YXRlLmxvY2FsZX1cbiAgICB9IGFzIFVJU3RhdGVBY3Rpb25zLlNldExvY2FsZVVwZGF0ZXJBY3Rpb24pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7O0FBRUEsU0FDRUEsV0FBVyxFQUNYQyxhQUFhLEVBQ2JDLDJCQUEyQixFQUMzQkMsY0FBYyxFQUNkQyxnQkFBZ0IsRUFDaEJDLHFCQUFxQixFQUNyQkMsaUJBQWlCLEVBQ2pCQyxrQkFBa0IsRUFDbEJDLFdBQVcsRUFDWEMsWUFBWSxRQUNQLHNCQUFzQjtBQUM3QixTQUFRQyxZQUFZLFFBQU8seUJBQXlCO0FBQ3BELFNBQ0VDLGtCQUFrQixFQUNsQkMsaUJBQWlCLEVBQ2pCQyx3QkFBd0IsRUFDeEJDLG9CQUFvQixRQUNmLGtCQUFrQjtBQUN6QixTQUFRQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsUUFBUSxRQUFP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