@kepler.gl/reducers 3.3.0-alpha.4 → 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.
- 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 +654 -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 +905 -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/cjs/vis-state-updaters.js +4114 -0
- package/dist/cjs/vis-state.js +35 -0
- package/dist/{combined-updaters.js → esm/combined-updaters.js} +74 -81
- 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 +646 -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 +900 -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 +4035 -0
- package/dist/esm/vis-state.js +29 -0
- package/package.json +31 -24
- 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-updaters.js +0 -4114
- package/dist/vis-state.js +0 -35
package/dist/esm/root.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import _typeof from "@babel/runtime/helpers/esm/typeof";
|
|
2
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
4
|
+
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; }
|
|
5
|
+
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; }
|
|
6
|
+
// SPDX-License-Identifier: MIT
|
|
7
|
+
// Copyright contributors to the kepler.gl project
|
|
8
|
+
|
|
9
|
+
import { ActionTypes, keplerGlInit, _actionFor, _updateProperty } from '@kepler.gl/actions';
|
|
10
|
+
import { handleActions } from 'redux-actions';
|
|
11
|
+
import { coreReducerFactory } from './core';
|
|
12
|
+
// Extend this type with additional actions to enforce strict typings
|
|
13
|
+
|
|
14
|
+
// INITIAL_STATE
|
|
15
|
+
var initialCoreState = {};
|
|
16
|
+
export function provideInitialState(initialState, extraReducers) {
|
|
17
|
+
var coreReducer = coreReducerFactory(initialState, extraReducers);
|
|
18
|
+
var handleRegisterEntry = function handleRegisterEntry(state, _ref) {
|
|
19
|
+
var _ref$payload = _ref.payload,
|
|
20
|
+
id = _ref$payload.id,
|
|
21
|
+
mint = _ref$payload.mint,
|
|
22
|
+
mapboxApiAccessToken = _ref$payload.mapboxApiAccessToken,
|
|
23
|
+
mapboxApiUrl = _ref$payload.mapboxApiUrl,
|
|
24
|
+
mapStylesReplaceDefault = _ref$payload.mapStylesReplaceDefault,
|
|
25
|
+
initialUiState = _ref$payload.initialUiState;
|
|
26
|
+
// by default, always create a mint state even if the same id already exist
|
|
27
|
+
// if state.id exist and mint=false, keep the existing state
|
|
28
|
+
var previousState = state[id] && mint === false ? state[id] : undefined;
|
|
29
|
+
return _objectSpread(_objectSpread({}, state), {}, _defineProperty({}, id, coreReducer(previousState, keplerGlInit({
|
|
30
|
+
mapboxApiAccessToken: mapboxApiAccessToken,
|
|
31
|
+
mapboxApiUrl: mapboxApiUrl,
|
|
32
|
+
mapStylesReplaceDefault: mapStylesReplaceDefault,
|
|
33
|
+
initialUiState: initialUiState
|
|
34
|
+
}))));
|
|
35
|
+
};
|
|
36
|
+
var handleDeleteEntry = function handleDeleteEntry(state, _ref2) {
|
|
37
|
+
var id = _ref2.payload.id;
|
|
38
|
+
return Object.keys(state).reduce(function (accu, curr) {
|
|
39
|
+
return _objectSpread(_objectSpread({}, accu), curr === id ? {} : _defineProperty({}, curr, state[curr]));
|
|
40
|
+
}, {});
|
|
41
|
+
};
|
|
42
|
+
var handleRenameEntry = function handleRenameEntry(state, _ref4) {
|
|
43
|
+
var _ref4$payload = _ref4.payload,
|
|
44
|
+
oldId = _ref4$payload.oldId,
|
|
45
|
+
newId = _ref4$payload.newId;
|
|
46
|
+
return Object.keys(state).reduce(function (accu, curr) {
|
|
47
|
+
return _objectSpread(_objectSpread({}, accu), _defineProperty({}, curr === oldId ? newId : curr, state[curr]));
|
|
48
|
+
}, {});
|
|
49
|
+
};
|
|
50
|
+
return function () {
|
|
51
|
+
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialCoreState;
|
|
52
|
+
var action = arguments.length > 1 ? arguments[1] : undefined;
|
|
53
|
+
// update child states
|
|
54
|
+
Object.keys(state).forEach(function (id) {
|
|
55
|
+
var updateItemState = coreReducer(state[id], _actionFor(id, action));
|
|
56
|
+
state = _updateProperty(state, id, updateItemState);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// perform additional state reducing (e.g. switch action.type etc...)
|
|
60
|
+
var handlers = _defineProperty(_defineProperty(_defineProperty({}, ActionTypes.REGISTER_ENTRY, handleRegisterEntry), ActionTypes.DELETE_ENTRY, handleDeleteEntry), ActionTypes.RENAME_ENTRY, handleRenameEntry);
|
|
61
|
+
return handleActions(handlers, initialCoreState)(state, action);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
var _keplerGlReducer = provideInitialState(initialCoreState);
|
|
65
|
+
function mergeInitialState() {
|
|
66
|
+
var saved = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
67
|
+
var provided = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
68
|
+
var extraInitialStateKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
69
|
+
var keys = ['mapState', 'mapStyle', 'visState', 'uiState'].concat(_toConsumableArray(extraInitialStateKeys));
|
|
70
|
+
|
|
71
|
+
// shallow merge each reducer
|
|
72
|
+
var newState = keys.reduce(function (accu, key) {
|
|
73
|
+
return _objectSpread(_objectSpread({}, accu), saved[key] && provided[key] ? _defineProperty({}, key, _objectSpread(_objectSpread({}, saved[key]), provided[key])) : _defineProperty({}, key, saved[key] || provided[key] || {}));
|
|
74
|
+
}, {});
|
|
75
|
+
return newState;
|
|
76
|
+
}
|
|
77
|
+
function decorate(target) {
|
|
78
|
+
var savedInitialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
79
|
+
var targetInitialState = savedInitialState;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Returns a kepler.gl reducer that will also pass each action through additional reducers spiecified.
|
|
83
|
+
* The parameter should be either a reducer map or a reducer function.
|
|
84
|
+
* The state passed into the additional action handler is the instance state.
|
|
85
|
+
* It will include all the subreducers `visState`, `uiState`, `mapState` and `mapStyle`.
|
|
86
|
+
* `.plugin` is only meant to be called once when mounting the keplerGlReducer to the store.
|
|
87
|
+
* **Note** This is an advanced option to give you more freedom to modify the internal state of the kepler.gl instance.
|
|
88
|
+
* You should only use this to adding additional actions instead of replacing default actions.
|
|
89
|
+
*
|
|
90
|
+
* @mixin keplerGlReducer.plugin
|
|
91
|
+
* @memberof keplerGlReducer
|
|
92
|
+
* @param {Object|Function} customReducer - A reducer map or a reducer
|
|
93
|
+
* @param {Object} options - options to be applied to custom reducer logic
|
|
94
|
+
* @param {Object} options.override - objects that describe which action to override, e.g. {[ActionTypes.LAYER_TYPE_CHANGE]: true}
|
|
95
|
+
* @public
|
|
96
|
+
* @example
|
|
97
|
+
* const myKeplerGlReducer = keplerGlReducer
|
|
98
|
+
* .plugin({
|
|
99
|
+
* // 1. as reducer map
|
|
100
|
+
* HIDE_AND_SHOW_SIDE_PANEL: (state, action) => ({
|
|
101
|
+
* ...state,
|
|
102
|
+
* uiState: {
|
|
103
|
+
* ...state.uiState,
|
|
104
|
+
* readOnly: !state.uiState.readOnly
|
|
105
|
+
* }
|
|
106
|
+
* })
|
|
107
|
+
* })
|
|
108
|
+
* .plugin(handleActions({
|
|
109
|
+
* // 2. as reducer
|
|
110
|
+
* 'HIDE_MAP_CONTROLS': (state, action) => ({
|
|
111
|
+
* ...state,
|
|
112
|
+
* uiState: {
|
|
113
|
+
* ...state.uiState,
|
|
114
|
+
* mapControls: hiddenMapControl
|
|
115
|
+
* }
|
|
116
|
+
* })
|
|
117
|
+
* }, {}));
|
|
118
|
+
*/
|
|
119
|
+
target.plugin = function plugin(customReducer, options) {
|
|
120
|
+
var _this = this;
|
|
121
|
+
if (_typeof(customReducer) === 'object') {
|
|
122
|
+
// if only provided a reducerMap, wrap it in a reducer
|
|
123
|
+
customReducer = handleActions(customReducer, {});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// use 'function' keyword to enable 'this'
|
|
127
|
+
// TODO: temporarily making action type to any, will fix that by creating a shared action interface
|
|
128
|
+
return decorate(function () {
|
|
129
|
+
var _options$override;
|
|
130
|
+
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
131
|
+
var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
132
|
+
var nextState = state;
|
|
133
|
+
if (action.type && !(options !== null && options !== void 0 && (_options$override = options.override) !== null && _options$override !== void 0 && _options$override[action.type])) {
|
|
134
|
+
nextState = _this(state, action);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// for each entry in the staten
|
|
138
|
+
Object.keys(nextState).forEach(function (id) {
|
|
139
|
+
// update child states
|
|
140
|
+
nextState = _updateProperty(nextState, id, customReducer(nextState[id], _actionFor(id, action)));
|
|
141
|
+
});
|
|
142
|
+
return nextState;
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Return a reducer that initiated with custom initial state.
|
|
148
|
+
* The parameter should be an object mapping from `subreducer` name to custom subreducer state,
|
|
149
|
+
* which will be shallow **merged** with default initial state.
|
|
150
|
+
*
|
|
151
|
+
* Default subreducer state:
|
|
152
|
+
* - [`visState`](./vis-state.md#INITIAL_VIS_STATE)
|
|
153
|
+
* - [`mapState`](./map-state.md#INITIAL_MAP_STATE)
|
|
154
|
+
* - [`mapStyle`](./map-style.md#INITIAL_MAP_STYLE)
|
|
155
|
+
* - [`uiState`](./ui-state.md#INITIAL_UI_STATE)
|
|
156
|
+
* @mixin keplerGlReducer.initialState
|
|
157
|
+
* @memberof keplerGlReducer
|
|
158
|
+
* @param {Object} iniSt - custom state to be merged with default initial state
|
|
159
|
+
* @param {Object} extraReducers - optional custom reducers in addition to the default `visState`, `mapState`, `mapStyle`, and `uiState`
|
|
160
|
+
* @public
|
|
161
|
+
* @example
|
|
162
|
+
* const myKeplerGlReducer = keplerGlReducer
|
|
163
|
+
* .initialState({
|
|
164
|
+
* uiState: {readOnly: true}
|
|
165
|
+
* });
|
|
166
|
+
*/
|
|
167
|
+
target.initialState = function initialState(iniSt) {
|
|
168
|
+
var extraReducers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
169
|
+
// passing through extraInitialStateKeys and extraReducers allows external customization by adding additional subreducers and state beyond the default `visState`, `mapState`, `mapStyle`, and `uiState`
|
|
170
|
+
var extraInitialStateKeys = Object.keys(extraReducers);
|
|
171
|
+
var merged = mergeInitialState(targetInitialState, iniSt, extraInitialStateKeys);
|
|
172
|
+
var targetReducer = provideInitialState(merged, extraReducers);
|
|
173
|
+
return decorate(targetReducer, merged);
|
|
174
|
+
};
|
|
175
|
+
return target;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Kepler.gl reducer to be mounted to your store. You can mount `keplerGlReducer` at property `keplerGl`, if you choose
|
|
180
|
+
* to mount it at another address e.g. `foo` you will need to specify it when you mount `KeplerGl` component in your app with `getState: state => state.foo`
|
|
181
|
+
* @public
|
|
182
|
+
* @example
|
|
183
|
+
* import keplerGlReducer from '@kepler.gl/reducers';
|
|
184
|
+
* import {createStore, combineReducers, applyMiddleware, compose} from 'redux';
|
|
185
|
+
* import {taskMiddleware} from 'react-palm/tasks';
|
|
186
|
+
*
|
|
187
|
+
* const initialState = {};
|
|
188
|
+
* const reducers = combineReducers({
|
|
189
|
+
* // <-- mount kepler.gl reducer in your app
|
|
190
|
+
* keplerGl: keplerGlReducer,
|
|
191
|
+
*
|
|
192
|
+
* // Your other reducers here
|
|
193
|
+
* app: appReducer
|
|
194
|
+
* });
|
|
195
|
+
*
|
|
196
|
+
* // using createStore
|
|
197
|
+
* export default createStore(reducer, initialState, applyMiddleware(taskMiddleware));
|
|
198
|
+
*/
|
|
199
|
+
var keplerGlReducer = decorate(_keplerGlReducer);
|
|
200
|
+
export default keplerGlReducer;
|
|
201
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBY3Rpb25UeXBlcyIsImtlcGxlckdsSW5pdCIsIl9hY3Rpb25Gb3IiLCJfdXBkYXRlUHJvcGVydHkiLCJoYW5kbGVBY3Rpb25zIiwiY29yZVJlZHVjZXJGYWN0b3J5IiwiaW5pdGlhbENvcmVTdGF0ZSIsInByb3ZpZGVJbml0aWFsU3RhdGUiLCJpbml0aWFsU3RhdGUiLCJleHRyYVJlZHVjZXJzIiwiY29yZVJlZHVjZXIiLCJoYW5kbGVSZWdpc3RlckVudHJ5Iiwic3RhdGUiLCJfcmVmIiwiX3JlZiRwYXlsb2FkIiwicGF5bG9hZCIsImlkIiwibWludCIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwibWFwYm94QXBpVXJsIiwibWFwU3R5bGVzUmVwbGFjZURlZmF1bHQiLCJpbml0aWFsVWlTdGF0ZSIsInByZXZpb3VzU3RhdGUiLCJ1bmRlZmluZWQiLCJfb2JqZWN0U3ByZWFkIiwiX2RlZmluZVByb3BlcnR5IiwiaGFuZGxlRGVsZXRlRW50cnkiLCJfcmVmMiIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJhY2N1IiwiY3VyciIsImhhbmRsZVJlbmFtZUVudHJ5IiwiX3JlZjQiLCJfcmVmNCRwYXlsb2FkIiwib2xkSWQiLCJuZXdJZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFjdGlvbiIsImZvckVhY2giLCJ1cGRhdGVJdGVtU3RhdGUiLCJoYW5kbGVycyIsIlJFR0lTVEVSX0VOVFJZIiwiREVMRVRFX0VOVFJZIiwiUkVOQU1FX0VOVFJZIiwiX2tlcGxlckdsUmVkdWNlciIsIm1lcmdlSW5pdGlhbFN0YXRlIiwic2F2ZWQiLCJwcm92aWRlZCIsImV4dHJhSW5pdGlhbFN0YXRlS2V5cyIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheSIsIm5ld1N0YXRlIiwia2V5IiwiZGVjb3JhdGUiLCJ0YXJnZXQiLCJzYXZlZEluaXRpYWxTdGF0ZSIsInRhcmdldEluaXRpYWxTdGF0ZSIsInBsdWdpbiIsImN1c3RvbVJlZHVjZXIiLCJvcHRpb25zIiwiX3RoaXMiLCJfdHlwZW9mIiwiX29wdGlvbnMkb3ZlcnJpZGUiLCJuZXh0U3RhdGUiLCJ0eXBlIiwib3ZlcnJpZGUiLCJpbmlTdCIsIm1lcmdlZCIsInRhcmdldFJlZHVjZXIiLCJrZXBsZXJHbFJlZHVjZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcm9vdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1xuICBBY3Rpb25UeXBlcyxcbiAga2VwbGVyR2xJbml0LFxuICBfYWN0aW9uRm9yLFxuICBfdXBkYXRlUHJvcGVydHksXG4gIFJlZ2lzdGVyRW50cnlVcGRhdGVyQWN0aW9uLFxuICBSZW5hbWVFbnRyeVVwZGF0ZXJBY3Rpb25cbn0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7aGFuZGxlQWN0aW9uc30gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5cbmltcG9ydCB7Y29yZVJlZHVjZXJGYWN0b3J5LCBLZXBsZXJHbFN0YXRlfSBmcm9tICcuL2NvcmUnO1xuXG50eXBlIEtlcGxlckdsU3RhdGVNYXAgPSB7XG4gIFtpZDogc3RyaW5nXTogUGFydGlhbDxLZXBsZXJHbFN0YXRlPjtcbn07XG5cbnR5cGUgQ29tYmluZVJlZ2lzdGVyVXBkYXRlQWN0aW9ucyA9IFJlZ2lzdGVyRW50cnlVcGRhdGVyQWN0aW9uWydwYXlsb2FkJ10gJlxuICBSZW5hbWVFbnRyeVVwZGF0ZXJBY3Rpb25bJ3BheWxvYWQnXTsgLy8gRXh0ZW5kIHRoaXMgdHlwZSB3aXRoIGFkZGl0aW9uYWwgYWN0aW9ucyB0byBlbmZvcmNlIHN0cmljdCB0eXBpbmdzXG5cbi8vIElOSVRJQUxfU1RBVEVcbmNvbnN0IGluaXRpYWxDb3JlU3RhdGUgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVJbml0aWFsU3RhdGUoaW5pdGlhbFN0YXRlLCBleHRyYVJlZHVjZXJzPykge1xuICBjb25zdCBjb3JlUmVkdWNlciA9IGNvcmVSZWR1Y2VyRmFjdG9yeShpbml0aWFsU3RhdGUsIGV4dHJhUmVkdWNlcnMpO1xuXG4gIGNvbnN0IGhhbmRsZVJlZ2lzdGVyRW50cnkgPSAoXG4gICAgc3RhdGU6IEtlcGxlckdsU3RhdGVNYXAsXG4gICAge1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBpZCxcbiAgICAgICAgbWludCxcbiAgICAgICAgbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gICAgICAgIG1hcGJveEFwaVVybCxcbiAgICAgICAgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQsXG4gICAgICAgIGluaXRpYWxVaVN0YXRlXG4gICAgICB9XG4gICAgfToge1xuICAgICAgcGF5bG9hZDogUmVnaXN0ZXJFbnRyeVVwZGF0ZXJBY3Rpb25bJ3BheWxvYWQnXTtcbiAgICB9XG4gICk6IEtlcGxlckdsU3RhdGVNYXAgPT4ge1xuICAgIC8vIGJ5IGRlZmF1bHQsIGFsd2F5cyBjcmVhdGUgYSBtaW50IHN0YXRlIGV2ZW4gaWYgdGhlIHNhbWUgaWQgYWxyZWFkeSBleGlzdFxuICAgIC8vIGlmIHN0YXRlLmlkIGV4aXN0IGFuZCBtaW50PWZhbHNlLCBrZWVwIHRoZSBleGlzdGluZyBzdGF0ZVxuICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBzdGF0ZVtpZF0gJiYgbWludCA9PT0gZmFsc2UgPyBzdGF0ZVtpZF0gOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLy8gcmVnaXN0ZXIgZW50cnkgdG8ga2VwbGVyLmdsIHBhc3NpbmcgaW4gbWFwYm94IGNvbmZpZyB0byBtYXBTdHlsZVxuICAgICAgLi4uc3RhdGUsXG4gICAgICBbaWRdOiBjb3JlUmVkdWNlcihcbiAgICAgICAgcHJldmlvdXNTdGF0ZSxcbiAgICAgICAga2VwbGVyR2xJbml0KHttYXBib3hBcGlBY2Nlc3NUb2tlbiwgbWFwYm94QXBpVXJsLCBtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCwgaW5pdGlhbFVpU3RhdGV9KVxuICAgICAgKVxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRGVsZXRlRW50cnkgPSAoXG4gICAgc3RhdGU6IEtlcGxlckdsU3RhdGVNYXAsXG4gICAge3BheWxvYWQ6IHtpZH19OiB7cGF5bG9hZDoge2lkOiBzdHJpbmd9fVxuICApOiBLZXBsZXJHbFN0YXRlTWFwID0+XG4gICAgT2JqZWN0LmtleXMoc3RhdGUpLnJlZHVjZShcbiAgICAgIChhY2N1LCBjdXJyKSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICAuLi4oY3VyciA9PT0gaWQgPyB7fSA6IHtbY3Vycl06IHN0YXRlW2N1cnJdfSlcbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuXG4gIGNvbnN0IGhhbmRsZVJlbmFtZUVudHJ5ID0gKFxuICAgIHN0YXRlOiBLZXBsZXJHbFN0YXRlTWFwLFxuICAgIHtcbiAgICAgIHBheWxvYWQ6IHtvbGRJZCwgbmV3SWR9XG4gICAgfToge1xuICAgICAgcGF5bG9hZDogUmVuYW1lRW50cnlVcGRhdGVyQWN0aW9uWydwYXlsb2FkJ107XG4gICAgfVxuICApOiBLZXBsZXJHbFN0YXRlTWFwID0+XG4gICAgT2JqZWN0LmtleXMoc3RhdGUpLnJlZHVjZShcbiAgICAgIChhY2N1LCBjdXJyKSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICAuLi57W2N1cnIgPT09IG9sZElkID8gbmV3SWQgOiBjdXJyXTogc3RhdGVbY3Vycl19XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICByZXR1cm4gKHN0YXRlID0gaW5pdGlhbENvcmVTdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgLy8gdXBkYXRlIGNoaWxkIHN0YXRlc1xuICAgIE9iamVjdC5rZXlzKHN0YXRlKS5mb3JFYWNoKGlkID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZUl0ZW1TdGF0ZSA9IGNvcmVSZWR1Y2VyKHN0YXRlW2lkXSwgX2FjdGlvbkZvcihpZCwgYWN0aW9uKSk7XG4gICAgICBzdGF0ZSA9IF91cGRhdGVQcm9wZXJ0eShzdGF0ZSwgaWQsIHVwZGF0ZUl0ZW1TdGF0ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBwZXJmb3JtIGFkZGl0aW9uYWwgc3RhdGUgcmVkdWNpbmcgKGUuZy4gc3dpdGNoIGFjdGlvbi50eXBlIGV0Yy4uLilcbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIFtBY3Rpb25UeXBlcy5SRUdJU1RFUl9FTlRSWV06IGhhbmRsZVJlZ2lzdGVyRW50cnksXG4gICAgICBbQWN0aW9uVHlwZXMuREVMRVRFX0VOVFJZXTogaGFuZGxlRGVsZXRlRW50cnksXG4gICAgICBbQWN0aW9uVHlwZXMuUkVOQU1FX0VOVFJZXTogaGFuZGxlUmVuYW1lRW50cnlcbiAgICB9O1xuXG4gICAgcmV0dXJuIGhhbmRsZUFjdGlvbnM8S2VwbGVyR2xTdGF0ZU1hcCwgQ29tYmluZVJlZ2lzdGVyVXBkYXRlQWN0aW9ucz4oXG4gICAgICBoYW5kbGVycyxcbiAgICAgIGluaXRpYWxDb3JlU3RhdGVcbiAgICApKHN0YXRlLCBhY3Rpb24pO1xuICB9O1xufVxuXG5jb25zdCBfa2VwbGVyR2xSZWR1Y2VyID0gcHJvdmlkZUluaXRpYWxTdGF0ZShpbml0aWFsQ29yZVN0YXRlKTtcblxuZnVuY3Rpb24gbWVyZ2VJbml0aWFsU3RhdGUoc2F2ZWQgPSB7fSwgcHJvdmlkZWQgPSB7fSwgZXh0cmFJbml0aWFsU3RhdGVLZXlzOiBzdHJpbmdbXSA9IFtdKSB7XG4gIGNvbnN0IGtleXMgPSBbJ21hcFN0YXRlJywgJ21hcFN0eWxlJywgJ3Zpc1N0YXRlJywgJ3VpU3RhdGUnLCAuLi5leHRyYUluaXRpYWxTdGF0ZUtleXNdO1xuXG4gIC8vIHNoYWxsb3cgbWVyZ2UgZWFjaCByZWR1Y2VyXG4gIGNvbnN0IG5ld1N0YXRlID0ga2V5cy5yZWR1Y2UoXG4gICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICAuLi4oc2F2ZWRba2V5XSAmJiBwcm92aWRlZFtrZXldXG4gICAgICAgID8ge1trZXldOiB7Li4uc2F2ZWRba2V5XSwgLi4ucHJvdmlkZWRba2V5XX19XG4gICAgICAgIDoge1trZXldOiBzYXZlZFtrZXldIHx8IHByb3ZpZGVkW2tleV0gfHwge319KVxuICAgIH0pLFxuICAgIHt9XG4gICk7XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG5mdW5jdGlvbiBkZWNvcmF0ZSh0YXJnZXQsIHNhdmVkSW5pdGlhbFN0YXRlID0ge30pIHtcbiAgY29uc3QgdGFyZ2V0SW5pdGlhbFN0YXRlID0gc2F2ZWRJbml0aWFsU3RhdGU7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBrZXBsZXIuZ2wgcmVkdWNlciB0aGF0IHdpbGwgYWxzbyBwYXNzIGVhY2ggYWN0aW9uIHRocm91Z2ggYWRkaXRpb25hbCByZWR1Y2VycyBzcGllY2lmaWVkLlxuICAgKiBUaGUgcGFyYW1ldGVyIHNob3VsZCBiZSBlaXRoZXIgYSByZWR1Y2VyIG1hcCBvciBhIHJlZHVjZXIgZnVuY3Rpb24uXG4gICAqIFRoZSBzdGF0ZSBwYXNzZWQgaW50byB0aGUgYWRkaXRpb25hbCBhY3Rpb24gaGFuZGxlciBpcyB0aGUgaW5zdGFuY2Ugc3RhdGUuXG4gICAqIEl0IHdpbGwgaW5jbHVkZSBhbGwgdGhlIHN1YnJlZHVjZXJzIGB2aXNTdGF0ZWAsIGB1aVN0YXRlYCwgYG1hcFN0YXRlYCBhbmQgYG1hcFN0eWxlYC5cbiAgICogYC5wbHVnaW5gIGlzIG9ubHkgbWVhbnQgdG8gYmUgY2FsbGVkIG9uY2Ugd2hlbiBtb3VudGluZyB0aGUga2VwbGVyR2xSZWR1Y2VyIHRvIHRoZSBzdG9yZS5cbiAgICogKipOb3RlKiogVGhpcyBpcyBhbiBhZHZhbmNlZCBvcHRpb24gdG8gZ2l2ZSB5b3UgbW9yZSBmcmVlZG9tIHRvIG1vZGlmeSB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGtlcGxlci5nbCBpbnN0YW5jZS5cbiAgICogWW91IHNob3VsZCBvbmx5IHVzZSB0aGlzIHRvIGFkZGluZyBhZGRpdGlvbmFsIGFjdGlvbnMgaW5zdGVhZCBvZiByZXBsYWNpbmcgZGVmYXVsdCBhY3Rpb25zLlxuICAgKlxuICAgKiBAbWl4aW4ga2VwbGVyR2xSZWR1Y2VyLnBsdWdpblxuICAgKiBAbWVtYmVyb2Yga2VwbGVyR2xSZWR1Y2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBjdXN0b21SZWR1Y2VyIC0gQSByZWR1Y2VyIG1hcCBvciBhIHJlZHVjZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRvIGJlIGFwcGxpZWQgdG8gY3VzdG9tIHJlZHVjZXIgbG9naWNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMub3ZlcnJpZGUgLSBvYmplY3RzIHRoYXQgZGVzY3JpYmUgd2hpY2ggYWN0aW9uIHRvIG92ZXJyaWRlLCBlLmcuIHtbQWN0aW9uVHlwZXMuTEFZRVJfVFlQRV9DSEFOR0VdOiB0cnVlfVxuICAgKiBAcHVibGljXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IG15S2VwbGVyR2xSZWR1Y2VyID0ga2VwbGVyR2xSZWR1Y2VyXG4gICAqICAucGx1Z2luKHtcbiAgICogICAgLy8gMS4gYXMgcmVkdWNlciBtYXBcbiAgICogICAgSElERV9BTkRfU0hPV19TSURFX1BBTkVMOiAoc3RhdGUsIGFjdGlvbikgPT4gKHtcbiAgICogICAgICAuLi5zdGF0ZSxcbiAgICogICAgICB1aVN0YXRlOiB7XG4gICAqICAgICAgICAuLi5zdGF0ZS51aVN0YXRlLFxuICAgKiAgICAgICAgcmVhZE9ubHk6ICFzdGF0ZS51aVN0YXRlLnJlYWRPbmx5XG4gICAqICAgICAgfVxuICAgKiAgICB9KVxuICAgKiAgfSlcbiAgICogLnBsdWdpbihoYW5kbGVBY3Rpb25zKHtcbiAgICogICAvLyAyLiBhcyByZWR1Y2VyXG4gICAqICAgJ0hJREVfTUFQX0NPTlRST0xTJzogKHN0YXRlLCBhY3Rpb24pID0+ICh7XG4gICAqICAgICAuLi5zdGF0ZSxcbiAgICogICAgIHVpU3RhdGU6IHtcbiAgICogICAgICAgLi4uc3RhdGUudWlTdGF0ZSxcbiAgICogICAgICAgbWFwQ29udHJvbHM6IGhpZGRlbk1hcENvbnRyb2xcbiAgICogICAgIH1cbiAgICogICB9KVxuICAgKiB9LCB7fSkpO1xuICAgKi9cbiAgdGFyZ2V0LnBsdWdpbiA9IGZ1bmN0aW9uIHBsdWdpbihjdXN0b21SZWR1Y2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21SZWR1Y2VyID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gaWYgb25seSBwcm92aWRlZCBhIHJlZHVjZXJNYXAsIHdyYXAgaXQgaW4gYSByZWR1Y2VyXG4gICAgICBjdXN0b21SZWR1Y2VyID0gaGFuZGxlQWN0aW9ucyhjdXN0b21SZWR1Y2VyLCB7fSk7XG4gICAgfVxuXG4gICAgLy8gdXNlICdmdW5jdGlvbicga2V5d29yZCB0byBlbmFibGUgJ3RoaXMnXG4gICAgLy8gVE9ETzogdGVtcG9yYXJpbHkgbWFraW5nIGFjdGlvbiB0eXBlIHRvIGFueSwgd2lsbCBmaXggdGhhdCBieSBjcmVhdGluZyBhIHNoYXJlZCBhY3Rpb24gaW50ZXJmYWNlXG4gICAgcmV0dXJuIGRlY29yYXRlKChzdGF0ZSA9IHt9LCBhY3Rpb246IGFueSA9IHt9KSA9PiB7XG4gICAgICBsZXQgbmV4dFN0YXRlID0gc3RhdGU7XG4gICAgICBpZiAoYWN0aW9uLnR5cGUgJiYgIW9wdGlvbnM/Lm92ZXJyaWRlPy5bYWN0aW9uLnR5cGVdKSB7XG4gICAgICAgIG5leHRTdGF0ZSA9IHRoaXMoc3RhdGUsIGFjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIGZvciBlYWNoIGVudHJ5IGluIHRoZSBzdGF0ZW5cbiAgICAgIE9iamVjdC5rZXlzKG5leHRTdGF0ZSkuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgIC8vIHVwZGF0ZSBjaGlsZCBzdGF0ZXNcbiAgICAgICAgbmV4dFN0YXRlID0gX3VwZGF0ZVByb3BlcnR5KFxuICAgICAgICAgIG5leHRTdGF0ZSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjdXN0b21SZWR1Y2VyKG5leHRTdGF0ZVtpZF0sIF9hY3Rpb25Gb3IoaWQsIGFjdGlvbikpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHJlZHVjZXIgdGhhdCBpbml0aWF0ZWQgd2l0aCBjdXN0b20gaW5pdGlhbCBzdGF0ZS5cbiAgICogVGhlIHBhcmFtZXRlciBzaG91bGQgYmUgYW4gb2JqZWN0IG1hcHBpbmcgZnJvbSBgc3VicmVkdWNlcmAgbmFtZSB0byBjdXN0b20gc3VicmVkdWNlciBzdGF0ZSxcbiAgICogd2hpY2ggd2lsbCBiZSBzaGFsbG93ICoqbWVyZ2VkKiogd2l0aCBkZWZhdWx0IGluaXRpYWwgc3RhdGUuXG4gICAqXG4gICAqIERlZmF1bHQgc3VicmVkdWNlciBzdGF0ZTpcbiAgICogIC0gW2B2aXNTdGF0ZWBdKC4vdmlzLXN0YXRlLm1kI0lOSVRJQUxfVklTX1NUQVRFKVxuICAgKiAgLSBbYG1hcFN0YXRlYF0oLi9tYXAtc3RhdGUubWQjSU5JVElBTF9NQVBfU1RBVEUpXG4gICAqICAtIFtgbWFwU3R5bGVgXSguL21hcC1zdHlsZS5tZCNJTklUSUFMX01BUF9TVFlMRSlcbiAgICogIC0gW2B1aVN0YXRlYF0oLi91aS1zdGF0ZS5tZCNJTklUSUFMX1VJX1NUQVRFKVxuICAgKiBAbWl4aW4ga2VwbGVyR2xSZWR1Y2VyLmluaXRpYWxTdGF0ZVxuICAgKiBAbWVtYmVyb2Yga2VwbGVyR2xSZWR1Y2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmlTdCAtIGN1c3RvbSBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBkZWZhdWx0IGluaXRpYWwgc3RhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGV4dHJhUmVkdWNlcnMgLSBvcHRpb25hbCBjdXN0b20gcmVkdWNlcnMgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgYHZpc1N0YXRlYCwgYG1hcFN0YXRlYCwgYG1hcFN0eWxlYCwgYW5kIGB1aVN0YXRlYFxuICAgKiBAcHVibGljXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IG15S2VwbGVyR2xSZWR1Y2VyID0ga2VwbGVyR2xSZWR1Y2VyXG4gICAqICAuaW5pdGlhbFN0YXRlKHtcbiAgICogICAgdWlTdGF0ZToge3JlYWRPbmx5OiB0cnVlfVxuICAgKiAgfSk7XG4gICAqL1xuICB0YXJnZXQuaW5pdGlhbFN0YXRlID0gZnVuY3Rpb24gaW5pdGlhbFN0YXRlKGluaVN0LCBleHRyYVJlZHVjZXJzID0ge30pIHtcbiAgICAvLyBwYXNzaW5nIHRocm91Z2ggZXh0cmFJbml0aWFsU3RhdGVLZXlzIGFuZCBleHRyYVJlZHVjZXJzIGFsbG93cyBleHRlcm5hbCBjdXN0b21pemF0aW9uIGJ5IGFkZGluZyBhZGRpdGlvbmFsIHN1YnJlZHVjZXJzIGFuZCBzdGF0ZSBiZXlvbmQgdGhlIGRlZmF1bHQgYHZpc1N0YXRlYCwgYG1hcFN0YXRlYCwgYG1hcFN0eWxlYCwgYW5kIGB1aVN0YXRlYFxuICAgIGNvbnN0IGV4dHJhSW5pdGlhbFN0YXRlS2V5cyA9IE9iamVjdC5rZXlzKGV4dHJhUmVkdWNlcnMpO1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlSW5pdGlhbFN0YXRlKHRhcmdldEluaXRpYWxTdGF0ZSwgaW5pU3QsIGV4dHJhSW5pdGlhbFN0YXRlS2V5cyk7XG4gICAgY29uc3QgdGFyZ2V0UmVkdWNlciA9IHByb3ZpZGVJbml0aWFsU3RhdGUobWVyZ2VkLCBleHRyYVJlZHVjZXJzKTtcblxuICAgIHJldHVybiBkZWNvcmF0ZSh0YXJnZXRSZWR1Y2VyLCBtZXJnZWQpO1xuICB9O1xuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogS2VwbGVyLmdsIHJlZHVjZXIgdG8gYmUgbW91bnRlZCB0byB5b3VyIHN0b3JlLiBZb3UgY2FuIG1vdW50IGBrZXBsZXJHbFJlZHVjZXJgIGF0IHByb3BlcnR5IGBrZXBsZXJHbGAsIGlmIHlvdSBjaG9vc2VcbiAqIHRvIG1vdW50IGl0IGF0IGFub3RoZXIgYWRkcmVzcyBlLmcuIGBmb29gIHlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSBpdCB3aGVuIHlvdSBtb3VudCBgS2VwbGVyR2xgIGNvbXBvbmVudCBpbiB5b3VyIGFwcCB3aXRoIGBnZXRTdGF0ZTogc3RhdGUgPT4gc3RhdGUuZm9vYFxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIgZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiBpbXBvcnQge2NyZWF0ZVN0b3JlLCBjb21iaW5lUmVkdWNlcnMsIGFwcGx5TWlkZGxld2FyZSwgY29tcG9zZX0gZnJvbSAncmVkdXgnO1xuICogaW1wb3J0IHt0YXNrTWlkZGxld2FyZX0gZnJvbSAncmVhY3QtcGFsbS90YXNrcyc7XG4gKlxuICogY29uc3QgaW5pdGlhbFN0YXRlID0ge307XG4gKiBjb25zdCByZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycyh7XG4gKiAgIC8vIDwtLSBtb3VudCBrZXBsZXIuZ2wgcmVkdWNlciBpbiB5b3VyIGFwcFxuICogICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICpcbiAqICAgLy8gWW91ciBvdGhlciByZWR1Y2VycyBoZXJlXG4gKiAgIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogLy8gdXNpbmcgY3JlYXRlU3RvcmVcbiAqIGV4cG9ydCBkZWZhdWx0IGNyZWF0ZVN0b3JlKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSwgYXBwbHlNaWRkbGV3YXJlKHRhc2tNaWRkbGV3YXJlKSk7XG4gKi9cbmNvbnN0IGtlcGxlckdsUmVkdWNlciA9IGRlY29yYXRlKF9rZXBsZXJHbFJlZHVjZXIpO1xuZXhwb3J0IGRlZmF1bHQga2VwbGVyR2xSZWR1Y2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7O0FBRUEsU0FDRUEsV0FBVyxFQUNYQyxZQUFZLEVBQ1pDLFVBQVUsRUFDVkMsZUFBZSxRQUdWLG9CQUFvQjtBQUMzQixTQUFRQyxhQUFhLFFBQU8sZUFBZTtBQUUzQyxTQUFRQyxrQkFBa0IsUUFBc0IsUUFBUTtBQU9q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
|