@ngrx-traits/core 12.1.2 → 13.0.0-beta.2
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/cache/cache.service.d.ts +2 -1
- package/esm2020/cache/cache.actions.mjs +6 -0
- package/esm2020/cache/cache.models.mjs +30 -0
- package/esm2020/cache/cache.module.mjs +18 -0
- package/esm2020/cache/cache.reducer.mjs +138 -0
- package/esm2020/cache/cache.selectors.mjs +5 -0
- package/esm2020/cache/cache.service.mjs +72 -0
- package/esm2020/cache/index.mjs +7 -0
- package/esm2020/create-entity-feature.mjs +404 -0
- package/esm2020/index.mjs +7 -0
- package/esm2020/local-store/disable-local-trait-effects.token.mjs +7 -0
- package/esm2020/local-store/index.mjs +3 -0
- package/esm2020/local-store/traits-local-store.mjs +147 -0
- package/esm2020/model.mjs +2 -0
- package/esm2020/ngrx-traits-core.mjs +5 -0
- package/esm2020/public_api.mjs +2 -0
- package/esm2020/testing/index.mjs +2 -0
- package/esm2020/testing/ngrx-traits-core-testing.mjs +5 -0
- package/esm2020/testing/provide-mock-local-traits.mjs +36 -0
- package/esm2020/testing/public_api.mjs +2 -0
- package/esm2020/trait-effect.mjs +32 -0
- package/esm2020/util.mjs +70 -0
- package/fesm2015/{ngrx-traits-core-testing.js → ngrx-traits-core-testing.mjs} +1 -1
- package/fesm2015/ngrx-traits-core-testing.mjs.map +1 -0
- package/fesm2015/{ngrx-traits-core.js → ngrx-traits-core.mjs} +13 -13
- package/fesm2015/ngrx-traits-core.mjs.map +1 -0
- package/{esm2015/testing/provide-mock-local-traits.js → fesm2020/ngrx-traits-core-testing.mjs} +12 -8
- package/fesm2020/ngrx-traits-core-testing.mjs.map +1 -0
- package/fesm2020/ngrx-traits-core.mjs +915 -0
- package/fesm2020/ngrx-traits-core.mjs.map +1 -0
- package/package.json +36 -14
- package/src/lib/cache/README.md +100 -0
- package/src/lib/local-store/README.md +172 -0
- package/testing/package.json +5 -5
- package/bundles/ngrx-traits-core-testing.umd.js +0 -52
- package/bundles/ngrx-traits-core-testing.umd.js.map +0 -1
- package/bundles/ngrx-traits-core.umd.js +0 -1442
- package/bundles/ngrx-traits-core.umd.js.map +0 -1
- package/esm2015/cache/cache.actions.js +0 -6
- package/esm2015/cache/cache.actions.js.map +0 -1
- package/esm2015/cache/cache.models.js +0 -31
- package/esm2015/cache/cache.models.js.map +0 -1
- package/esm2015/cache/cache.module.js +0 -18
- package/esm2015/cache/cache.module.js.map +0 -1
- package/esm2015/cache/cache.reducer.js +0 -141
- package/esm2015/cache/cache.reducer.js.map +0 -1
- package/esm2015/cache/cache.selectors.js +0 -5
- package/esm2015/cache/cache.selectors.js.map +0 -1
- package/esm2015/cache/cache.service.js +0 -72
- package/esm2015/cache/cache.service.js.map +0 -1
- package/esm2015/cache/index.js +0 -7
- package/esm2015/cache/index.js.map +0 -1
- package/esm2015/create-entity-feature.js +0 -409
- package/esm2015/create-entity-feature.js.map +0 -1
- package/esm2015/index.js +0 -7
- package/esm2015/index.js.map +0 -1
- package/esm2015/local-store/disable-local-trait-effects.token.js +0 -7
- package/esm2015/local-store/disable-local-trait-effects.token.js.map +0 -1
- package/esm2015/local-store/index.js +0 -3
- package/esm2015/local-store/index.js.map +0 -1
- package/esm2015/local-store/traits-local-store.js +0 -148
- package/esm2015/local-store/traits-local-store.js.map +0 -1
- package/esm2015/model.js +0 -2
- package/esm2015/model.js.map +0 -1
- package/esm2015/ngrx-traits-core.js +0 -5
- package/esm2015/ngrx-traits-core.js.map +0 -1
- package/esm2015/public_api.js +0 -2
- package/esm2015/public_api.js.map +0 -1
- package/esm2015/testing/index.js +0 -2
- package/esm2015/testing/index.js.map +0 -1
- package/esm2015/testing/ngrx-traits-core-testing.js +0 -5
- package/esm2015/testing/ngrx-traits-core-testing.js.map +0 -1
- package/esm2015/testing/provide-mock-local-traits.js.map +0 -1
- package/esm2015/testing/public_api.js +0 -2
- package/esm2015/testing/public_api.js.map +0 -1
- package/esm2015/trait-effect.js +0 -32
- package/esm2015/trait-effect.js.map +0 -1
- package/esm2015/util.js +0 -67
- package/esm2015/util.js.map +0 -1
- package/fesm2015/ngrx-traits-core-testing.js.map +0 -1
- package/fesm2015/ngrx-traits-core.js.map +0 -1
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { combineReducers, createFeatureSelector, createReducer, createSelector, } from '@ngrx/store';
|
|
2
|
+
import { capitalize, setPropertiesReducer } from './util';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a function that when execute will combine all the traits, and return a EntityFeatureFactory
|
|
5
|
+
* which combines all the traits actions, selectors , reducers and effects,
|
|
6
|
+
* the names param will replace any action and selector with the word Entity or Entities,
|
|
7
|
+
* with the corresponding entityName and entitiesName param (entityName+'s' if entitiesName is omitted).
|
|
8
|
+
* @param namesConfig - Optional Names for entities
|
|
9
|
+
* @param namesConfig.entityName - singular name for entity
|
|
10
|
+
* @param [namesConfig.entitiesName] - plural name for entities, defaults to entityName + 's'
|
|
11
|
+
* @param traits set of traits to be combined
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
*
|
|
15
|
+
* const featureFactory = createEntityFeatureFactory(
|
|
16
|
+
* { entityName: 'product' },
|
|
17
|
+
* addLoadEntitiesTrait<Product>(),
|
|
18
|
+
* addSelectEntityTrait<Product>(),
|
|
19
|
+
* addAsyncActionTrait({
|
|
20
|
+
* name: 'checkout',
|
|
21
|
+
* actionSuccessProps: props<{ orderId: string }>(),
|
|
22
|
+
* })
|
|
23
|
+
* );
|
|
24
|
+
*
|
|
25
|
+
* export const productsFeature = featureFactory({
|
|
26
|
+
* actionsGroupKey: '[Products]',
|
|
27
|
+
* featureSelector: 'products',
|
|
28
|
+
* });
|
|
29
|
+
*/
|
|
30
|
+
export function createEntityFeatureFactory(namesOrFactory, ...traits) {
|
|
31
|
+
return ((config) => {
|
|
32
|
+
const { entityName, entitiesName } = 'entityName' in namesOrFactory
|
|
33
|
+
? namesOrFactory
|
|
34
|
+
: { entityName: 'Entity', entitiesName: 'Entities' };
|
|
35
|
+
const singular = capitalize(entityName);
|
|
36
|
+
const plural = entitiesName
|
|
37
|
+
? capitalize(entitiesName)
|
|
38
|
+
: capitalize(entityName + 's');
|
|
39
|
+
const sortedTraits = sortTraits('entityName' in namesOrFactory ? [...traits] : [namesOrFactory, ...traits]);
|
|
40
|
+
const allConfigs = buildAllConfigs(sortedTraits);
|
|
41
|
+
const allActions = buildAllActions(sortedTraits, config.actionsGroupKey, singular, plural, allConfigs);
|
|
42
|
+
const allSelectors = buildAllSelectors(sortedTraits, allConfigs);
|
|
43
|
+
const allMutators = buildAllMutators(sortedTraits, allSelectors, allConfigs);
|
|
44
|
+
const initialState = buildInitialState(sortedTraits, allConfigs);
|
|
45
|
+
const reducer = buildReducer(sortedTraits, initialState, allActions, allSelectors, allMutators, allConfigs);
|
|
46
|
+
const featureSelector = typeof config.featureSelector === 'string'
|
|
47
|
+
? createFeatureSelector(config.featureSelector)
|
|
48
|
+
: config.featureSelector;
|
|
49
|
+
const allFeatureSelectors = allSelectors && getSelectorsForFeature(featureSelector, allSelectors);
|
|
50
|
+
const allEffects = buildAllEffects(sortedTraits, allActions, allFeatureSelectors, allConfigs);
|
|
51
|
+
return {
|
|
52
|
+
actions: entityName
|
|
53
|
+
? renameProps(allActions, singular, plural)
|
|
54
|
+
: allActions,
|
|
55
|
+
selectors: entityName
|
|
56
|
+
? renameProps(allFeatureSelectors, singular, plural)
|
|
57
|
+
: allSelectors,
|
|
58
|
+
initialState,
|
|
59
|
+
reducer: reducer ?? createReducer(initialState),
|
|
60
|
+
effects: allEffects,
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function renameProps(target, entityName, entitiesName) {
|
|
65
|
+
const result = {};
|
|
66
|
+
for (const [key, value] of Object.entries(target)) {
|
|
67
|
+
const newKey = key
|
|
68
|
+
.replace('Entities', entitiesName)
|
|
69
|
+
.replace('Entity', entityName);
|
|
70
|
+
result[newKey] = value;
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
function sortTraits(traits) {
|
|
75
|
+
const sortedTraits = [];
|
|
76
|
+
for (let i = 0; i < traits.length; i++) {
|
|
77
|
+
const trait = traits[i];
|
|
78
|
+
if (!trait.depends?.length) {
|
|
79
|
+
sortedTraits.push(trait);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (trait.depends.length > 1)
|
|
83
|
+
for (const d of trait.depends) {
|
|
84
|
+
const isTraitPresent = traits.some((tr) => tr.key === d);
|
|
85
|
+
if (isTraitPresent) {
|
|
86
|
+
trait.depends = [d];
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (trait.depends.length > 1)
|
|
91
|
+
throw Error('could not find dependencies ' + trait.depends.join(' '));
|
|
92
|
+
const isDependencyAlreadyAdded = sortedTraits.some((tr) => tr.key === trait?.depends?.[0]);
|
|
93
|
+
if (isDependencyAlreadyAdded)
|
|
94
|
+
sortedTraits.push(trait);
|
|
95
|
+
else {
|
|
96
|
+
// move trait to the end
|
|
97
|
+
delete traits[i];
|
|
98
|
+
traits.push(trait);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return sortedTraits;
|
|
102
|
+
}
|
|
103
|
+
function buildAllConfigs(sortedTraits) {
|
|
104
|
+
return sortedTraits.reduce((acc, factory) => {
|
|
105
|
+
acc[factory.key] = factory.config;
|
|
106
|
+
return acc;
|
|
107
|
+
}, {});
|
|
108
|
+
}
|
|
109
|
+
function buildAllActions(sortedTraits, actionsGroupKey, entityName, entitiesName, allConfigs) {
|
|
110
|
+
return sortedTraits.reduce((previousResult, factory) => {
|
|
111
|
+
let result = factory?.actions?.({
|
|
112
|
+
actionsGroupKey: actionsGroupKey,
|
|
113
|
+
entityName,
|
|
114
|
+
entitiesName,
|
|
115
|
+
allConfigs,
|
|
116
|
+
}) ?? {};
|
|
117
|
+
result = previousResult ? { ...previousResult, ...result } : result;
|
|
118
|
+
return result;
|
|
119
|
+
}, {});
|
|
120
|
+
}
|
|
121
|
+
function buildAllSelectors(sortedTraits, allConfigs) {
|
|
122
|
+
return sortedTraits.reduce((previousResult, factory) => {
|
|
123
|
+
let result = factory?.selectors?.({
|
|
124
|
+
previousSelectors: previousResult,
|
|
125
|
+
allConfigs,
|
|
126
|
+
}) ?? {};
|
|
127
|
+
result = previousResult ? { ...previousResult, ...result } : result;
|
|
128
|
+
return result;
|
|
129
|
+
}, {});
|
|
130
|
+
}
|
|
131
|
+
function buildAllMutators(sortedTraits, allSelectors, allConfigs) {
|
|
132
|
+
return (sortedTraits.reduce((previousResult, factory) => {
|
|
133
|
+
let result = factory?.mutators?.({
|
|
134
|
+
allSelectors: allSelectors,
|
|
135
|
+
previousMutators: previousResult,
|
|
136
|
+
allConfigs,
|
|
137
|
+
}) ?? {};
|
|
138
|
+
result = previousResult ? { ...previousResult, ...result } : result;
|
|
139
|
+
return result;
|
|
140
|
+
}, {}) || {});
|
|
141
|
+
}
|
|
142
|
+
function buildInitialState(sortedTraits, allConfigs) {
|
|
143
|
+
return sortedTraits.reduce((previousResult, factory) => {
|
|
144
|
+
const result = factory?.initialState?.({
|
|
145
|
+
previousInitialState: previousResult,
|
|
146
|
+
allConfigs,
|
|
147
|
+
}) ??
|
|
148
|
+
previousResult ??
|
|
149
|
+
{};
|
|
150
|
+
return result;
|
|
151
|
+
}, {});
|
|
152
|
+
}
|
|
153
|
+
function buildReducer(sortedTraits, initialState, allActions, allSelectors, allMutators, allConfigs) {
|
|
154
|
+
return sortedTraits.reduce((previousResult, factory) => {
|
|
155
|
+
const result = factory?.reducer?.({
|
|
156
|
+
initialState,
|
|
157
|
+
allActions,
|
|
158
|
+
allSelectors,
|
|
159
|
+
allMutators,
|
|
160
|
+
allConfigs,
|
|
161
|
+
});
|
|
162
|
+
return result && previousResult
|
|
163
|
+
? (state = initialState, action) => {
|
|
164
|
+
const aState = previousResult(state, action);
|
|
165
|
+
return result(aState, action);
|
|
166
|
+
}
|
|
167
|
+
: result ?? previousResult;
|
|
168
|
+
}, undefined);
|
|
169
|
+
}
|
|
170
|
+
function buildAllEffects(sortedTraits, allActions, allFeatureSelectors, allConfigs) {
|
|
171
|
+
return sortedTraits.reduce((previousResult, factory) => {
|
|
172
|
+
let result = factory?.effects?.({
|
|
173
|
+
allActions,
|
|
174
|
+
allSelectors: allFeatureSelectors,
|
|
175
|
+
allConfigs,
|
|
176
|
+
}) ?? [];
|
|
177
|
+
result = previousResult ? [...previousResult, ...result] : result;
|
|
178
|
+
return result;
|
|
179
|
+
}, []);
|
|
180
|
+
}
|
|
181
|
+
function getSelectorsForFeature(featureSelect, selectors) {
|
|
182
|
+
const ss = {};
|
|
183
|
+
for (const prop in selectors) {
|
|
184
|
+
ss[prop] = createSelector(featureSelect, selectors[prop]);
|
|
185
|
+
}
|
|
186
|
+
return ss;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Combine a map entityFeatureFactories into one,
|
|
190
|
+
* grouping the actions and selectors by the key of the respective entityFeatureFactory
|
|
191
|
+
* @param traitFactoriesMap
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
*
|
|
195
|
+
* const clientsFeatureFactory = createEntityFeatureFactory(
|
|
196
|
+
* { entityName: 'client', entitiesName: 'clients' },
|
|
197
|
+
* addLoadEntitiesTrait<Client>(),
|
|
198
|
+
* addCrudEntitiesTrait<Client>()
|
|
199
|
+
* );
|
|
200
|
+
*
|
|
201
|
+
* const productOrderFeatureFactory = createEntityFeatureFactory(
|
|
202
|
+
* { entityName: 'productOrder' },
|
|
203
|
+
* addLoadEntitiesTrait<ProductOrder>(),
|
|
204
|
+
* addSelectEntitiesTrait<ProductOrder>()
|
|
205
|
+
* );
|
|
206
|
+
*
|
|
207
|
+
* const productFeatureFactory = createEntityFeatureFactory(
|
|
208
|
+
* { entityName: 'product' },
|
|
209
|
+
* addLoadEntitiesTrait<Product>(),
|
|
210
|
+
* addSelectEntitiesTrait<Product>()
|
|
211
|
+
* );
|
|
212
|
+
*
|
|
213
|
+
* const productCombinedFactory = combineEntityFeatures({
|
|
214
|
+
* products: productFeatureFactory,
|
|
215
|
+
* productOrders: productOrderFeatureFactory,
|
|
216
|
+
* clients: clientsFeatureFactory,
|
|
217
|
+
* });
|
|
218
|
+
*
|
|
219
|
+
* const combinedFeature = productCombinedFactory({
|
|
220
|
+
* actionsGroupKey: '[Combined]',
|
|
221
|
+
* featureSelector: 'combined',
|
|
222
|
+
* });
|
|
223
|
+
*
|
|
224
|
+
* combinedFeature.actions.client.loadClients();
|
|
225
|
+
* combinedFeature.actions.product.loadProducts();
|
|
226
|
+
*/
|
|
227
|
+
export function combineEntityFeatures(traitFactoriesMap) {
|
|
228
|
+
return ((config) => {
|
|
229
|
+
const featureSelector = typeof config.featureSelector === 'string'
|
|
230
|
+
? createFeatureSelector(config.featureSelector)
|
|
231
|
+
: config.featureSelector;
|
|
232
|
+
const actions = {};
|
|
233
|
+
const selectors = {};
|
|
234
|
+
const reducers = {};
|
|
235
|
+
let effects = [];
|
|
236
|
+
for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
|
|
237
|
+
const selector = createSelector(featureSelector, (state) => state[key]);
|
|
238
|
+
const featureTraits = entityFeatureFactory({
|
|
239
|
+
actionsGroupKey: config.actionsGroupKey,
|
|
240
|
+
featureSelector: selector,
|
|
241
|
+
});
|
|
242
|
+
actions[key] = featureTraits.actions;
|
|
243
|
+
selectors[key] = featureTraits.selectors;
|
|
244
|
+
reducers[key] = featureTraits.reducer;
|
|
245
|
+
effects = [...effects, ...featureTraits.effects];
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
actions,
|
|
249
|
+
selectors,
|
|
250
|
+
reducer: combineReducers(reducers),
|
|
251
|
+
effects,
|
|
252
|
+
};
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Mix a map entityFeatureFactories into one, different from combine the actions and selectors a mix, not group by key like in combine, the keys are still use
|
|
257
|
+
* internal in the reducers and selector to separate the state
|
|
258
|
+
* @param traitFactoriesMap
|
|
259
|
+
*
|
|
260
|
+
* @example
|
|
261
|
+
*
|
|
262
|
+
* const clientsFeatureFactory = createEntityFeatureFactory(
|
|
263
|
+
* { entityName: 'client', entitiesName: 'clients' },
|
|
264
|
+
* addLoadEntitiesTrait<Client>(),
|
|
265
|
+
* addCrudEntitiesTrait<Client>()
|
|
266
|
+
* );
|
|
267
|
+
*
|
|
268
|
+
* const productOrderFeatureFactory = createEntityFeatureFactory(
|
|
269
|
+
* { entityName: 'productOrder' },
|
|
270
|
+
* addLoadEntitiesTrait<ProductOrder>(),
|
|
271
|
+
* addSelectEntitiesTrait<ProductOrder>()
|
|
272
|
+
* );
|
|
273
|
+
*
|
|
274
|
+
* const productFeatureFactory = createEntityFeatureFactory(
|
|
275
|
+
* { entityName: 'product' },
|
|
276
|
+
* addLoadEntitiesTrait<Product>(),
|
|
277
|
+
* addSelectEntitiesTrait<Product>()
|
|
278
|
+
* );
|
|
279
|
+
*
|
|
280
|
+
* const productMixedFactory = mixEntityFeatures({
|
|
281
|
+
* products: productFeatureFactory,
|
|
282
|
+
* productOrders: productOrderFeatureFactory,
|
|
283
|
+
* clients: clientsFeatureFactory,
|
|
284
|
+
* });
|
|
285
|
+
*
|
|
286
|
+
* const mixedFeature = productMixedFactory({
|
|
287
|
+
* actionsGroupKey: '[Mixed]',
|
|
288
|
+
* featureSelector: 'mixed',
|
|
289
|
+
* });
|
|
290
|
+
* mixedFeature.actions.loadClients();
|
|
291
|
+
* mixedFeature.actions.loadProducts();
|
|
292
|
+
*
|
|
293
|
+
*/
|
|
294
|
+
export function mixEntityFeatures(traitFactoriesMap) {
|
|
295
|
+
return ((config) => {
|
|
296
|
+
const featureSelector = typeof config.featureSelector === 'string'
|
|
297
|
+
? createFeatureSelector(config.featureSelector)
|
|
298
|
+
: config.featureSelector;
|
|
299
|
+
let actions = {};
|
|
300
|
+
let selectors = {};
|
|
301
|
+
const reducers = {};
|
|
302
|
+
let effects = [];
|
|
303
|
+
for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
|
|
304
|
+
const selector = createSelector(featureSelector, (state) => state[key]);
|
|
305
|
+
const featureTraits = entityFeatureFactory({
|
|
306
|
+
actionsGroupKey: config.actionsGroupKey,
|
|
307
|
+
featureSelector: selector,
|
|
308
|
+
});
|
|
309
|
+
actions = { ...actions, ...featureTraits.actions };
|
|
310
|
+
selectors = { ...selectors, ...featureTraits.selectors };
|
|
311
|
+
reducers[key] = featureTraits.reducer;
|
|
312
|
+
effects = [...effects, ...featureTraits.effects];
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
actions,
|
|
316
|
+
selectors,
|
|
317
|
+
reducer: combineReducers(reducers),
|
|
318
|
+
effects,
|
|
319
|
+
};
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Combines targetTraitFactory with the traitFactoriesMap using the keys as props for the targetTraitFactory state,
|
|
324
|
+
* and grouping the combined actions by key
|
|
325
|
+
* @param targetTraitFactory
|
|
326
|
+
* @param traitFactoriesMap
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
*
|
|
330
|
+
* const clientsFeatureFactory = createEntityFeatureFactory(
|
|
331
|
+
* { entityName: 'client', entitiesName: 'clients' },
|
|
332
|
+
* addLoadEntitiesTrait<Client>(),
|
|
333
|
+
* addCrudEntitiesTrait<Client>()
|
|
334
|
+
* );
|
|
335
|
+
*
|
|
336
|
+
* const productOrderFeatureFactory = createEntityFeatureFactory(
|
|
337
|
+
* { entityName: 'productOrder' },
|
|
338
|
+
* addLoadEntitiesTrait<ProductOrder>(),
|
|
339
|
+
* addSelectEntitiesTrait<ProductOrder>()
|
|
340
|
+
* );
|
|
341
|
+
*
|
|
342
|
+
* const productFeatureFactory = createEntityFeatureFactory(
|
|
343
|
+
* { entityName: 'product' },
|
|
344
|
+
* addLoadEntitiesTrait<Product>(),
|
|
345
|
+
* addSelectEntitiesTrait<Product>()
|
|
346
|
+
* );
|
|
347
|
+
*
|
|
348
|
+
* const productAddEntityPropertiesFactory = addEntityFeaturesProperties(
|
|
349
|
+
* productFeatureFactory,
|
|
350
|
+
* {
|
|
351
|
+
* productOrders: productOrderFeatureFactory,
|
|
352
|
+
* clients: clientsFeatureFactory,
|
|
353
|
+
* }
|
|
354
|
+
* );
|
|
355
|
+
*
|
|
356
|
+
* const combinedFeature = productAddEntityPropertiesFactory({
|
|
357
|
+
* actionsGroupKey: '[addEntityFeatures]',
|
|
358
|
+
* featureSelector: 'addEntityFeatures',
|
|
359
|
+
* });
|
|
360
|
+
*
|
|
361
|
+
* combinedFeature.actions.loadProducts();
|
|
362
|
+
* combinedFeature.actions.clients.loadClients();
|
|
363
|
+
* combinedFeature.actions.productOrders.loadProductOrders();
|
|
364
|
+
*/
|
|
365
|
+
export function addEntityFeaturesProperties(targetTraitFactory, traitFactoriesMap) {
|
|
366
|
+
return ((config) => {
|
|
367
|
+
const featureSelector = typeof config.featureSelector === 'string'
|
|
368
|
+
? createFeatureSelector(config.featureSelector)
|
|
369
|
+
: config.featureSelector;
|
|
370
|
+
const targetFeatureTraits = targetTraitFactory({
|
|
371
|
+
actionsGroupKey: config.actionsGroupKey,
|
|
372
|
+
featureSelector: featureSelector,
|
|
373
|
+
});
|
|
374
|
+
const actions = { ...targetFeatureTraits.actions };
|
|
375
|
+
const selectors = { ...targetFeatureTraits.selectors };
|
|
376
|
+
const reducers = {};
|
|
377
|
+
let effects = [...targetFeatureTraits.effects];
|
|
378
|
+
for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
|
|
379
|
+
const selector = createSelector(featureSelector, (state) => state[key]);
|
|
380
|
+
const featureTraits = entityFeatureFactory({
|
|
381
|
+
actionsGroupKey: config.actionsGroupKey,
|
|
382
|
+
featureSelector: selector,
|
|
383
|
+
});
|
|
384
|
+
actions[key] = featureTraits.actions;
|
|
385
|
+
selectors[key] = featureTraits.selectors;
|
|
386
|
+
reducers[key] = featureTraits.reducer;
|
|
387
|
+
effects = [...effects, ...featureTraits.effects];
|
|
388
|
+
}
|
|
389
|
+
return {
|
|
390
|
+
actions,
|
|
391
|
+
selectors,
|
|
392
|
+
reducer: setPropertiesReducer(targetFeatureTraits.reducer, reducers),
|
|
393
|
+
effects,
|
|
394
|
+
};
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Helper function to create an implementation a TraitFactory
|
|
399
|
+
* @param f TraitFactory implementation
|
|
400
|
+
*/
|
|
401
|
+
export function createTraitFactory(f) {
|
|
402
|
+
return f;
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWVudGl0eS1mZWF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRyYWl0cy9jb3JlL3NyYy9saWIvY3JlYXRlLWVudGl0eS1mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW9CQSxPQUFPLEVBR0wsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBR3JCLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFpRjFEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FLeEMsY0FFZ0IsRUFDaEIsR0FBRyxNQUFTO0lBUVosT0FBTyxDQUFDLENBQUMsTUFBd0IsRUFBRSxFQUFFO1FBQ25DLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQ2hDLFlBQVksSUFBSSxjQUFjO1lBQzVCLENBQUMsQ0FBRSxjQUdDO1lBQ0osQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFFekQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLFlBQVk7WUFDekIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7WUFDMUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFFakMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUM3QixZQUFZLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQzNFLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFD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QUFlLEVBQUUsUUFBUTthQUMxQixDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUNyQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztZQUN6QyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUN0QyxPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsRDtRQUNELE9BQU87WUFDTCxPQUFPO1lBQ1AsU0FBUztZQUNULE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1lBQ3BFLE9BQU87U0FDUixDQUFDO0lBQ0osQ0FBQyxDQUFNLENBQUM7QUFDVixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQVFoQyxDQVVEO0lBQ0MsT0FBTyxDQUE2QyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWcsXG4gIEV4dHJhY3RBY3Rpb25zVHlwZSxcbiAgRXh0cmFjdFNlbGVjdG9yc1R5cGUsXG4gIEV4dHJhY3RTdGF0ZVR5cGUsXG4gIEVudGl0eUZlYXR1cmVGYWN0b3J5LFxuICBGZWF0dXJlU2VsZWN0b3JzLFxuICBLZXllZENvbmZpZyxcbiAgVHJhaXRBY3Rpb25zLFxuICBUcmFpdEZhY3RvcnksXG4gIFRyYWl0U2VsZWN0b3JzLFxuICBUcmFpdFN0YXRlTXV0YXRvcnMsXG4gIFVuaW9uVG9JbnRlcnNlY3Rpb24sXG4gIFRyYWl0QWN0aW9uc0ZhY3RvcnksXG4gIFRyYWl0U2VsZWN0b3JzRmFjdG9yeSxcbiAgVHJhaXRJbml0aWFsU3RhdGVGYWN0b3J5LFxuICBUcmFpdFN0YXRlTXV0YXRvcnNGYWN0b3J5LFxuICBUcmFpdFJlZHVjZXJGYWN0b3J5LFxuICBUcmFpdEVmZmVjdHNGYWN0b3J5LFxufSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7XG4gIEFjdGlvbixcbiAgQWN0aW9uVHlwZSxcbiAgY29tYmluZVJlZHVjZXJzLFxuICBjcmVhdGVGZWF0dXJlU2VsZWN0b3IsXG4gIGNyZWF0ZVJlZHVjZXIsXG4gIGNyZWF0ZVNlbGVjdG9yLFxuICBNZW1vaXplZFNlbGVjdG9yLFxufSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBUcmFpdEVmZmVjdCB9IGZyb20gJy4vdHJhaXQtZWZmZWN0JztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuL2xvY2FsLXN0b3JlJztcbmltcG9ydCB7IGNhcGl0YWxpemUsIHNldFByb3BlcnRpZXNSZWR1Y2VyIH0gZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aGVuIGV4ZWN1dGUgd2lsbCBjb21iaW5lIGFsbCB0aGUgdHJhaXRzLCBhbmQgcmV0dXJuIGEgRW50aXR5RmVhdHVyZUZhY3RvcnlcbiAqIHdoaWNoIGNvbWJpbmVzIGFsbCB0aGUgdHJhaXRzIGFjdGlvbnMsIHNlbGVjdG9ycyAsIHJlZHVjZXJzIGFuZCBlZmZlY3RzLFxuICogdGhlIG5hbWVzIHBhcmFtIHdpbGwgcmVwbGFjZSBhbnkgYWN0aW9uIGFuZCBzZWxlY3RvciB3aXRoIHRoZSB3b3JkIEVudGl0eSBvciBFbnRpdGllcyxcbiAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZW50aXR5TmFtZSBhbmQgIGVudGl0aWVzTmFtZSBwYXJhbSAoZW50aXR5TmFtZSsncycgaWYgZW50aXRpZXNOYW1lIGlzIG9taXR0ZWQpLlxuICogQHBhcmFtIG5hbWVzQ29uZmlnIC0gT3B0aW9uYWwgTmFtZXMgZm9yIGVudGl0aWVzXG4gKiBAcGFyYW0gbmFtZXNDb25maWcuZW50aXR5TmFtZSAtIHNpbmd1bGFyIG5hbWUgZm9yIGVudGl0eVxuICogQHBhcmFtIFtuYW1lc0NvbmZpZy5lbnRpdGllc05hbWVdIC0gcGx1cmFsIG5hbWUgZm9yIGVudGl0aWVzLCBkZWZhdWx0cyB0byBlbnRpdHlOYW1lICsgJ3MnXG4gKiBAcGFyYW0gdHJhaXRzIHNldCBvZiB0cmFpdHMgdG8gYmUgY29tYmluZWRcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3QnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PFByb2R1Y3Q+KCksXG4gKiAgIGFkZFNlbGVjdEVudGl0eVRyYWl0PFByb2R1Y3Q+KCksXG4gKiAgIGFkZEFzeW5jQWN0aW9uVHJhaXQoe1xuICogICAgIG5hbWU6ICdjaGVja291dCcsXG4gKiAgICAgYWN0aW9uU3VjY2Vzc1Byb3BzOiBwcm9wczx7IG9yZGVySWQ6IHN0cmluZyB9PigpLFxuICogICB9KVxuICogKTtcbiAqXG4gKiBleHBvcnQgY29uc3QgcHJvZHVjdHNGZWF0dXJlID0gZmVhdHVyZUZhY3Rvcnkoe1xuICogICBhY3Rpb25zR3JvdXBLZXk6ICdbUHJvZHVjdHNdJyxcbiAqICAgZmVhdHVyZVNlbGVjdG9yOiAncHJvZHVjdHMnLFxuICogfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeTxcbiAgRiBleHRlbmRzIHJlYWRvbmx5IFRyYWl0RmFjdG9yeVtdLFxuICBFbnRpdHlOYW1lIGV4dGVuZHMgc3RyaW5nLFxuICBFbnRpdGllc05hbWUgZXh0ZW5kcyBzdHJpbmcgPSBgJHtFbnRpdHlOYW1lfXNgXG4+KFxuICB7XG4gICAgZW50aXR5TmFtZSxcbiAgICBlbnRpdGllc05hbWUsXG4gIH06IHsgZW50aXR5TmFtZTogRW50aXR5TmFtZTsgZW50aXRpZXNOYW1lPzogRW50aXRpZXNOYW1lIH0sXG4gIC4uLnRyYWl0czogRlxuKTogRW50aXR5RmVhdHVyZUZhY3Rvcnk8XG4gIEVudGl0eU5hbWUsXG4gIEVudGl0aWVzTmFtZSxcbiAgRXh0cmFjdFN0YXRlVHlwZTxGPixcbiAgRXh0cmFjdEFjdGlvbnNUeXBlPEY+LFxuICBFeHRyYWN0U2VsZWN0b3JzVHlwZTxGPlxuPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aGVuIGV4ZWN1dGUgd2lsbCBjb21iaW5lIGFsbCB0aGUgdHJhaXRzLCBhbmQgcmV0dXJuIGEgRW50aXR5RmVhdHVyZUZhY3RvcnlcbiAqIHdoaWNoIGNvbWJpbmVzIGFsbCB0aGUgdHJhaXRzIGFjdGlvbnMsIHNlbGVjdG9ycyAsIHJlZHVjZXJzIGFuZCBlZmZlY3RzLlxuICogQHBhcmFtIHRyYWl0cyBzZXQgb2YgdHJhaXRzIHRvIGJlIGNvbWJpbmVkXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmZWF0dXJlRmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5KFxuICogICB7IGVudGl0eU5hbWU6ICdwcm9kdWN0JyB9LFxuICogICBhZGRMb2FkRW50aXRpZXNUcmFpdDxQcm9kdWN0PigpLFxuICogICBhZGRTZWxlY3RFbnRpdHlUcmFpdDxQcm9kdWN0PigpLFxuICogICBhZGRBc3luY0FjdGlvblRyYWl0KHtcbiAqICAgICBuYW1lOiAnY2hlY2tvdXQnLFxuICogICAgIGFjdGlvblN1Y2Nlc3NQcm9wczogcHJvcHM8eyBvcmRlcklkOiBzdHJpbmcgfT4oKSxcbiAqICAgfSlcbiAqICk7XG4gKlxuICogZXhwb3J0IGNvbnN0IHByb2R1Y3RzRmVhdHVyZSA9IGZlYXR1cmVGYWN0b3J5KHtcbiAqICAgYWN0aW9uc0dyb3VwS2V5OiAnW1Byb2R1Y3RzXScsXG4gKiAgIGZlYXR1cmVTZWxlY3RvcjogJ3Byb2R1Y3RzJyxcbiAqIH0pO1xuICpcbiAqIHByb2R1Y3RzRmVhdHVyZS5hY3Rpb25zLmxvYWRQcm9kdWN0cygpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3Rvcnk8RiBleHRlbmRzIHJlYWRvbmx5IFRyYWl0RmFjdG9yeVtdPihcbiAgLi4udHJhaXRzOiBGXG4pOiBFbnRpdHlGZWF0dXJlRmFjdG9yeTxcbiAgJ0VudGl0eScsXG4gICdFbnRpdGllcycsXG4gIEV4dHJhY3RTdGF0ZVR5cGU8Rj4sXG4gIEV4dHJhY3RBY3Rpb25zVHlwZTxGPixcbiAgRXh0cmFjdFNlbGVjdG9yc1R5cGU8Rj5cbj47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd2hlbiBleGVjdXRlIHdpbGwgY29tYmluZSBhbGwgdGhlIHRyYWl0cywgYW5kIHJldHVybiBhIEVudGl0eUZlYXR1cmVGYWN0b3J5XG4gKiB3aGljaCBjb21iaW5lcyBhbGwgdGhlIHRyYWl0cyBhY3Rpb25zLCBzZWxlY3RvcnMgLCByZWR1Y2VycyBhbmQgZWZmZWN0cyxcbiAqIHRoZSBuYW1lcyBwYXJhbSB3aWxsIHJlcGxhY2UgYW55IGFjdGlvbiBhbmQgc2VsZWN0b3Igd2l0aCB0aGUgd29yZCBFbnRpdHkgb3IgRW50aXRpZXMsXG4gKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGVudGl0eU5hbWUgYW5kICBlbnRpdGllc05hbWUgcGFyYW0gKGVudGl0eU5hbWUrJ3MnIGlmIGVudGl0aWVzTmFtZSBpcyBvbWl0dGVkKS5cbiAqIEBwYXJhbSBuYW1lc0NvbmZpZyAtIE9wdGlvbmFsIE5hbWVzIGZvciBlbnRpdGllc1xuICogQHBhcmFtIG5hbWVzQ29uZmlnLmVudGl0eU5hbWUgLSBzaW5ndWxhciBuYW1lIGZvciBlbnRpdHlcbiAqIEBwYXJhbSBbbmFtZXNDb25maWcuZW50aXRpZXNOYW1lXSAtIHBsdXJhbCBuYW1lIGZvciBlbnRpdGllcywgZGVmYXVsdHMgdG8gZW50aXR5TmFtZSArICdzJ1xuICogQHBhcmFtIHRyYWl0cyBzZXQgb2YgdHJhaXRzIHRvIGJlIGNvbWJpbmVkXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmZWF0dXJlRmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5KFxuICogICB7IGVudGl0eU5hbWU6ICdwcm9kdWN0JyB9LFxuICogICBhZGRMb2FkRW50aXRpZXNUcmFpdDxQcm9kdWN0PigpLFxuICogICBhZGRTZWxlY3RFbnRpdHlUcmFpdDxQcm9kdWN0PigpLFxuICogICBhZGRBc3luY0FjdGlvblRyYWl0KHtcbiAqICAgICBuYW1lOiAnY2hlY2tvdXQnLFxuICogICAgIGFjdGlvblN1Y2Nlc3NQcm9wczogcHJvcHM8eyBvcmRlcklkOiBzdHJpbmcgfT4oKSxcbiAqICAgfSlcbiAqICk7XG4gKlxuICogZXhwb3J0IGNvbnN0IHByb2R1Y3RzRmVhdHVyZSA9IGZlYXR1cmVGYWN0b3J5KHtcbiAqICAgYWN0aW9uc0dyb3VwS2V5OiAnW1Byb2R1Y3RzXScsXG4gKiAgIGZlYXR1cmVTZWxlY3RvcjogJ3Byb2R1Y3RzJyxcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3Rvcnk8XG4gIEYgZXh0ZW5kcyByZWFkb25seSBUcmFpdEZhY3RvcnlbXSxcbiAgRW50aXR5TmFtZSBleHRlbmRzIHN0cmluZyxcbiAgRW50aXRpZXNOYW1lIGV4dGVuZHMgc3RyaW5nID0gYCR7RW50aXR5TmFtZX1zYFxuPihcbiAgbmFtZXNPckZhY3Rvcnk6XG4gICAgfCB7IGVudGl0eU5hbWU6IEVudGl0eU5hbWU7IGVudGl0aWVzTmFtZT86IEVudGl0aWVzTmFtZSB9XG4gICAgfCBUcmFpdEZhY3RvcnksXG4gIC4uLnRyYWl0czogRlxuKTogRW50aXR5RmVhdHVyZUZhY3Rvcnk8XG4gIEVudGl0eU5hbWUsXG4gIEVudGl0aWVzTmFtZSxcbiAgRXh0cmFjdFN0YXRlVHlwZTxGPixcbiAgRXh0cmFjdEFjdGlvbnNUeXBlPEY+LFxuICBFeHRyYWN0U2VsZWN0b3JzVHlwZTxGPlxuPiB7XG4gIHJldHVybiAoKGNvbmZpZzogQ29uZmlnPGFueSwgYW55PikgPT4ge1xuICAgIGNvbnN0IHsgZW50aXR5TmFtZSwgZW50aXRpZXNOYW1lIH0gPVxuICAgICAgJ2VudGl0eU5hbWUnIGluIG5hbWVzT3JGYWN0b3J5XG4gICAgICAgID8gKG5hbWVzT3JGYWN0b3J5IGFzIHtcbiAgICAgICAgICAgIGVudGl0eU5hbWU6IEVudGl0eU5hbWU7XG4gICAgICAgICAgICBlbnRpdGllc05hbWU/OiBFbnRpdGllc05hbWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgOiB7IGVudGl0eU5hbWU6ICdFbnRpdHknLCBlbnRpdGllc05hbWU6ICdFbnRpdGllcycgfTtcblxuICAgIGNvbnN0IHNpbmd1bGFyID0gY2FwaXRhbGl6ZShlbnRpdHlOYW1lKTtcbiAgICBjb25zdCBwbHVyYWwgPSBlbnRpdGllc05hbWVcbiAgICAgID8gY2FwaXRhbGl6ZShlbnRpdGllc05hbWUpXG4gICAgICA6IGNhcGl0YWxpemUoZW50aXR5TmFtZSArICdzJyk7XG5cbiAgICBjb25zdCBzb3J0ZWRUcmFpdHMgPSBzb3J0VHJhaXRzKFxuICAgICAgJ2VudGl0eU5hbWUnIGluIG5hbWVzT3JGYWN0b3J5ID8gWy4uLnRyYWl0c10gOiBbbmFtZXNPckZhY3RvcnksIC4uLnRyYWl0c11cbiAgICApO1xuXG4gICAgY29uc3QgYWxsQ29uZmlncyA9IGJ1aWxkQWxsQ29uZmlncyhzb3J0ZWRUcmFpdHMpO1xuXG4gICAgY29uc3QgYWxsQWN0aW9ucyA9IGJ1aWxkQWxsQWN0aW9ucyhcbiAgICAgIHNvcnRlZFRyYWl0cyxcbiAgICAgIGNvbmZpZy5hY3Rpb25zR3JvdXBLZXksXG4gICAgICBzaW5ndWxhcixcbiAgICAgIHBsdXJhbCxcbiAgICAgIGFsbENvbmZpZ3NcbiAgICApO1xuXG4gICAgY29uc3QgYWxsU2VsZWN0b3JzID0gYnVpbGRBbGxTZWxlY3RvcnMoc29ydGVkVHJhaXRzLCBhbGxDb25maWdzKTtcblxuICAgIGNvbnN0IGFsbE11dGF0b3JzID0gYnVpbGRBbGxNdXRhdG9ycyhcbiAgICAgIHNvcnRlZFRyYWl0cyxcbiAgICAgIGFsbFNlbGVjdG9ycyxcbiAgICAgIGFsbENvbmZpZ3NcbiAgICApO1xuXG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0gYnVpbGRJbml0aWFsU3RhdGUoc29ydGVkVHJhaXRzLCBhbGxDb25maWdzKTtcblxuICAgIGNvbnN0IHJlZHVjZXIgPSBidWlsZFJlZHVjZXIoXG4gICAgICBzb3J0ZWRUcmFpdHMsXG4gICAgICBpbml0aWFsU3RhdGUsXG4gICAgICBhbGxBY3Rpb25zLFxuICAgICAgYWxsU2VsZWN0b3JzLFxuICAgICAgYWxsTXV0YXRvcnMsXG4gICAgICBhbGxDb25maWdzXG4gICAgKTtcblxuICAgIGNvbnN0IGZlYXR1cmVTZWxlY3RvciA9XG4gICAgICB0eXBlb2YgY29uZmlnLmZlYXR1cmVTZWxlY3RvciA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBjcmVhdGVGZWF0dXJlU2VsZWN0b3I8RXh0cmFjdFN0YXRlVHlwZTxGPj4oY29uZmlnLmZlYXR1cmVTZWxlY3RvcilcbiAgICAgICAgOiBjb25maWcuZmVhdHVyZVNlbGVjdG9yO1xuXG4gICAgY29uc3QgYWxsRmVhdHVyZVNlbGVjdG9ycyA9XG4gICAgICBhbGxTZWxlY3RvcnMgJiYgZ2V0U2VsZWN0b3JzRm9yRmVhdHVyZShmZWF0dXJlU2VsZWN0b3IsIGFsbFNlbGVjdG9ycyk7XG5cbiAgICBjb25zdCBhbGxFZmZlY3RzID0gYnVpbGRBbGxFZmZlY3RzKFxuICAgICAgc29ydGVkVHJhaXRzLFxuICAgICAgYWxsQWN0aW9ucyxcbiAgICAgIGFsbEZlYXR1cmVTZWxlY3RvcnMsXG4gICAgICBhbGxDb25maWdzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25zOiBlbnRpdHlOYW1lXG4gICAgICAgID8gcmVuYW1lUHJvcHMoYWxsQWN0aW9ucywgc2luZ3VsYXIsIHBsdXJhbClcbiAgICAgICAgOiBhbGxBY3Rpb25zLFxuICAgICAgc2VsZWN0b3JzOiBlbnRpdHlOYW1lXG4gICAgICAgID8gcmVuYW1lUHJvcHMoYWxsRmVhdHVyZVNlbGVjdG9ycywgc2luZ3VsYXIsIHBsdXJhbClcbiAgICAgICAgOiBhbGxTZWxlY3RvcnMsXG4gICAgICBpbml0aWFsU3RhdGUsXG4gICAgICByZWR1Y2VyOiByZWR1Y2VyID8/IGNyZWF0ZVJlZHVjZXIoaW5pdGlhbFN0YXRlKSxcbiAgICAgIGVmZmVjdHM6IGFsbEVmZmVjdHMsXG4gICAgfTtcbiAgfSkgYXMgRW50aXR5RmVhdHVyZUZhY3Rvcnk8XG4gICAgRW50aXR5TmFtZSxcbiAgICBFbnRpdGllc05hbWUsXG4gICAgRXh0cmFjdFN0YXRlVHlwZTxGPixcbiAgICBFeHRyYWN0QWN0aW9uc1R5cGU8Rj4sXG4gICAgRXh0cmFjdFNlbGVjdG9yc1R5cGU8Rj5cbiAgPjtcbn1cblxuZnVuY3Rpb24gcmVuYW1lUHJvcHModGFyZ2V0OiBhbnksIGVudGl0eU5hbWU6IHN0cmluZywgZW50aXRpZXNOYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgYW55O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YXJnZXQpKSB7XG4gICAgY29uc3QgbmV3S2V5ID0ga2V5XG4gICAgICAucmVwbGFjZSgnRW50aXRpZXMnLCBlbnRpdGllc05hbWUpXG4gICAgICAucmVwbGFjZSgnRW50aXR5JywgZW50aXR5TmFtZSk7XG4gICAgcmVzdWx0W25ld0tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzb3J0VHJhaXRzKFxuICB0cmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W11cbik6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10ge1xuICBjb25zdCBzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFpdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0cmFpdCA9IHRyYWl0c1tpXTtcbiAgICBpZiAoIXRyYWl0LmRlcGVuZHM/Lmxlbmd0aCkge1xuICAgICAgc29ydGVkVHJhaXRzLnB1c2godHJhaXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0cmFpdC5kZXBlbmRzLmxlbmd0aCA+IDEpXG4gICAgICBmb3IgKGNvbnN0IGQgb2YgdHJhaXQuZGVwZW5kcykge1xuICAgICAgICBjb25zdCBpc1RyYWl0UHJlc2VudCA9IHRyYWl0cy5zb21lKCh0cikgPT4gdHIua2V5ID09PSBkKTtcbiAgICAgICAgaWYgKGlzVHJhaXRQcmVzZW50KSB7XG4gICAgICAgICAgdHJhaXQuZGVwZW5kcyA9IFtkXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGlmICh0cmFpdC5kZXBlbmRzLmxlbmd0aCA+IDEpXG4gICAgICB0aHJvdyBFcnJvcignY291bGQgbm90IGZpbmQgZGVwZW5kZW5jaWVzICcgKyB0cmFpdC5kZXBlbmRzLmpvaW4oJyAnKSk7XG4gICAgY29uc3QgaXNEZXBlbmRlbmN5QWxyZWFkeUFkZGVkID0gc29ydGVkVHJhaXRzLnNvbWUoXG4gICAgICAodHIpID0+IHRyLmtleSA9PT0gdHJhaXQ/LmRlcGVuZHM/LlswXVxuICAgICk7XG5cbiAgICBpZiAoaXNEZXBlbmRlbmN5QWxyZWFkeUFkZGVkKSBzb3J0ZWRUcmFpdHMucHVzaCh0cmFpdCk7XG4gICAgZWxzZSB7XG4gICAgICAvLyBtb3ZlIHRyYWl0IHRvIHRoZSBlbmRcbiAgICAgIGRlbGV0ZSB0cmFpdHNbaV07XG4gICAgICB0cmFpdHMucHVzaCh0cmFpdCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzb3J0ZWRUcmFpdHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsQ29uZmlncyhzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10pIHtcbiAgcmV0dXJuIHNvcnRlZFRyYWl0cy5yZWR1Y2UoKGFjYzogS2V5ZWRDb25maWc8c3RyaW5nLCBhbnk+LCBmYWN0b3J5KSA9PiB7XG4gICAgYWNjW2ZhY3Rvcnkua2V5XSA9IGZhY3RvcnkuY29uZmlnO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxBY3Rpb25zKFxuICBzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10sXG4gIGFjdGlvbnNHcm91cEtleTogc3RyaW5nLFxuICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gIGVudGl0aWVzTmFtZTogc3RyaW5nLFxuICBhbGxDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ICYgeyBbcDogc3RyaW5nXTogYW55IH1cbikge1xuICByZXR1cm4gc29ydGVkVHJhaXRzLnJlZHVjZSgocHJldmlvdXNSZXN1bHQ6IFRyYWl0QWN0aW9ucywgZmFjdG9yeSkgPT4ge1xuICAgIGxldCByZXN1bHQgPVxuICAgICAgZmFjdG9yeT8uYWN0aW9ucz8uKHtcbiAgICAgICAgYWN0aW9uc0dyb3VwS2V5OiBhY3Rpb25zR3JvdXBLZXksXG4gICAgICAgIGVudGl0eU5hbWUsXG4gICAgICAgIGVudGl0aWVzTmFtZSxcbiAgICAgICAgYWxsQ29uZmlncyxcbiAgICAgIH0pID8/IHt9O1xuICAgIHJlc3VsdCA9IHByZXZpb3VzUmVzdWx0ID8geyAuLi5wcmV2aW91c1Jlc3VsdCwgLi4ucmVzdWx0IH0gOiByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFsbFNlbGVjdG9ycyhcbiAgc29ydGVkVHJhaXRzOiBUcmFpdEZhY3Rvcnk8YW55LCBhbnksIGFueSwgYW55PltdLFxuICBhbGxDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ICYgeyBbcDogc3RyaW5nXTogYW55IH1cbikge1xuICByZXR1cm4gc29ydGVkVHJhaXRzLnJlZHVjZSgocHJldmlvdXNSZXN1bHQ6IFRyYWl0U2VsZWN0b3JzPGFueT4sIGZhY3RvcnkpID0+IHtcbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIGZhY3Rvcnk/LnNlbGVjdG9ycz8uKHtcbiAgICAgICAgcHJldmlvdXNTZWxlY3RvcnM6IHByZXZpb3VzUmVzdWx0LFxuICAgICAgICBhbGxDb25maWdzLFxuICAgICAgfSkgPz8ge307XG4gICAgcmVzdWx0ID0gcHJldmlvdXNSZXN1bHQgPyB7IC4uLnByZXZpb3VzUmVzdWx0LCAuLi5yZXN1bHQgfSA6IHJlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsTXV0YXRvcnMoXG4gIHNvcnRlZFRyYWl0czogVHJhaXRGYWN0b3J5PGFueSwgYW55LCBhbnksIGFueT5bXSxcbiAgYWxsU2VsZWN0b3JzOiBUcmFpdFNlbGVjdG9yczxhbnk+LFxuICBhbGxDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ICYgeyBbcDogc3RyaW5nXTogYW55IH1cbikge1xuICByZXR1cm4gKFxuICAgIHNvcnRlZFRyYWl0cy5yZWR1Y2UoXG4gICAgICAocHJldmlvdXNSZXN1bHQ6IFRyYWl0U3RhdGVNdXRhdG9yczxhbnk+IHwgdW5kZWZpbmVkLCBmYWN0b3J5KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPVxuICAgICAgICAgIGZhY3Rvcnk/Lm11dGF0b3JzPy4oe1xuICAgICAgICAgICAgYWxsU2VsZWN0b3JzOiBhbGxTZWxlY3RvcnMsXG4gICAgICAgICAgICBwcmV2aW91c011dGF0b3JzOiBwcmV2aW91c1Jlc3VsdCxcbiAgICAgICAgICAgIGFsbENvbmZpZ3MsXG4gICAgICAgICAgfSkgPz8ge307XG4gICAgICAgIHJlc3VsdCA9IHByZXZpb3VzUmVzdWx0ID8geyAuLi5wcmV2aW91c1Jlc3VsdCwgLi4ucmVzdWx0IH0gOiByZXN1bHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge31cbiAgICApIHx8IHt9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSW5pdGlhbFN0YXRlKFxuICBzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10sXG4gIGFsbENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gJiB7IFtwOiBzdHJpbmddOiBhbnkgfVxuKSB7XG4gIHJldHVybiBzb3J0ZWRUcmFpdHMucmVkdWNlKChwcmV2aW91c1Jlc3VsdDogYW55LCBmYWN0b3J5KSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgIGZhY3Rvcnk/LmluaXRpYWxTdGF0ZT8uKHtcbiAgICAgICAgcHJldmlvdXNJbml0aWFsU3RhdGU6IHByZXZpb3VzUmVzdWx0LFxuICAgICAgICBhbGxDb25maWdzLFxuICAgICAgfSkgPz9cbiAgICAgIHByZXZpb3VzUmVzdWx0ID8/XG4gICAgICB7fTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVkdWNlcihcbiAgc29ydGVkVHJhaXRzOiBUcmFpdEZhY3Rvcnk8YW55LCBhbnksIGFueSwgYW55PltdLFxuICBpbml0aWFsU3RhdGU6IGFueSxcbiAgYWxsQWN0aW9uczogVHJhaXRBY3Rpb25zLFxuICBhbGxTZWxlY3RvcnM6IFRyYWl0U2VsZWN0b3JzPGFueT4sXG4gIGFsbE11dGF0b3JzOiBUcmFpdFN0YXRlTXV0YXRvcnM8YW55PixcbiAgYWxsQ29uZmlnczogUmVjb3JkPHN0cmluZywgYW55PiAmIHsgW3A6IHN0cmluZ106IGFueSB9XG4pIHtcbiAgcmV0dXJuIHNvcnRlZFRyYWl0cy5yZWR1Y2UoXG4gICAgKFxuICAgICAgcHJldmlvdXNSZXN1bHQ6ICgoc3RhdGU6IGFueSwgYWN0aW9uOiBBY3Rpb24pID0+IGFueSkgfCB1bmRlZmluZWQsXG4gICAgICBmYWN0b3J5XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBmYWN0b3J5Py5yZWR1Y2VyPy4oe1xuICAgICAgICBpbml0aWFsU3RhdGUsXG4gICAgICAgIGFsbEFjdGlvbnMsXG4gICAgICAgIGFsbFNlbGVjdG9ycyxcbiAgICAgICAgYWxsTXV0YXRvcnMsXG4gICAgICAgIGFsbENvbmZpZ3MsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQgJiYgcHJldmlvdXNSZXN1bHRcbiAgICAgICAgPyAoc3RhdGUgPSBpbml0aWFsU3RhdGUsIGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYVN0YXRlID0gcHJldmlvdXNSZXN1bHQoc3RhdGUsIGFjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0KGFTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogcmVzdWx0ID8/IHByZXZpb3VzUmVzdWx0O1xuICAgIH0sXG4gICAgdW5kZWZpbmVkXG4gICk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsRWZmZWN0cyhcbiAgc29ydGVkVHJhaXRzOiBUcmFpdEZhY3Rvcnk8YW55LCBhbnksIGFueSwgYW55PltdLFxuICBhbGxBY3Rpb25zOiBUcmFpdEFjdGlvbnMsXG4gIGFsbEZlYXR1cmVTZWxlY3RvcnM6IFRyYWl0U2VsZWN0b3JzPGFueT4sXG4gIGFsbENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gJiB7IFtwOiBzdHJpbmddOiBhbnkgfVxuKSB7XG4gIHJldHVybiBzb3J0ZWRUcmFpdHMucmVkdWNlKFxuICAgIChwcmV2aW91c1Jlc3VsdDogVHlwZTxUcmFpdEVmZmVjdD5bXSB8IHVuZGVmaW5lZCwgZmFjdG9yeSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdCA9XG4gICAgICAgIGZhY3Rvcnk/LmVmZmVjdHM/Lih7XG4gICAgICAgICAgYWxsQWN0aW9ucyxcbiAgICAgICAgICBhbGxTZWxlY3RvcnM6IGFsbEZlYXR1cmVTZWxlY3RvcnMsXG4gICAgICAgICAgYWxsQ29uZmlncyxcbiAgICAgICAgfSkgPz8gW107XG4gICAgICByZXN1bHQgPSBwcmV2aW91c1Jlc3VsdCA/IFsuLi5wcmV2aW91c1Jlc3VsdCwgLi4ucmVzdWx0XSA6IHJlc3VsdDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICBbXVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3RvcnNGb3JGZWF0dXJlPFxuICBTdGF0ZSxcbiAgUyBleHRlbmRzIFRyYWl0U2VsZWN0b3JzPFN0YXRlPixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgRiBleHRlbmRzIE1lbW9pemVkU2VsZWN0b3I8b2JqZWN0LCBhbnk+XG4+KGZlYXR1cmVTZWxlY3Q6IEYsIHNlbGVjdG9yczogUyk6IEZlYXR1cmVTZWxlY3RvcnM8U3RhdGUsIFM+IHtcbiAgY29uc3Qgc3M6IHsgW2tleSBpbiBrZXlvZiBTXT86IGFueSB9ID0ge307XG4gIGZvciAoY29uc3QgcHJvcCBpbiBzZWxlY3RvcnMpIHtcbiAgICBzc1twcm9wXSA9IGNyZWF0ZVNlbGVjdG9yKGZlYXR1cmVTZWxlY3QgYXMgYW55LCBzZWxlY3RvcnNbcHJvcF0gYXMgYW55KTtcbiAgfVxuICByZXR1cm4gc3MgYXMgRmVhdHVyZVNlbGVjdG9yczxTdGF0ZSwgUz47XG59XG5cbi8qKlxuICogQ29tYmluZSBhIG1hcCBlbnRpdHlGZWF0dXJlRmFjdG9yaWVzIGludG8gb25lLFxuICogZ3JvdXBpbmcgdGhlIGFjdGlvbnMgYW5kIHNlbGVjdG9ycyBieSB0aGUga2V5IG9mIHRoZSByZXNwZWN0aXZlIGVudGl0eUZlYXR1cmVGYWN0b3J5XG4gKiBAcGFyYW0gdHJhaXRGYWN0b3JpZXNNYXBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGNsaWVudHNGZWF0dXJlRmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5KFxuICogICB7IGVudGl0eU5hbWU6ICdjbGllbnQnLCBlbnRpdGllc05hbWU6ICdjbGllbnRzJyB9LFxuICogICBhZGRMb2FkRW50aXRpZXNUcmFpdDxDbGllbnQ+KCksXG4gKiAgIGFkZENydWRFbnRpdGllc1RyYWl0PENsaWVudD4oKVxuICogKTtcbiAqXG4gKiBjb25zdCBwcm9kdWN0T3JkZXJGZWF0dXJlRmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5KFxuICogICB7IGVudGl0eU5hbWU6ICdwcm9kdWN0T3JkZXInIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PFByb2R1Y3RPcmRlcj4oKSxcbiAqICAgYWRkU2VsZWN0RW50aXRpZXNUcmFpdDxQcm9kdWN0T3JkZXI+KClcbiAqICk7XG4gKlxuICogY29uc3QgcHJvZHVjdEZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3QnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PFByb2R1Y3Q+KCksXG4gKiAgIGFkZFNlbGVjdEVudGl0aWVzVHJhaXQ8UHJvZHVjdD4oKVxuICogKTtcbiAqXG4gKiBjb25zdCBwcm9kdWN0Q29tYmluZWRGYWN0b3J5ID0gY29tYmluZUVudGl0eUZlYXR1cmVzKHtcbiAqICAgcHJvZHVjdHM6IHByb2R1Y3RGZWF0dXJlRmFjdG9yeSxcbiAqICAgcHJvZHVjdE9yZGVyczogcHJvZHVjdE9yZGVyRmVhdHVyZUZhY3RvcnksXG4gKiAgIGNsaWVudHM6IGNsaWVudHNGZWF0dXJlRmFjdG9yeSxcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGNvbWJpbmVkRmVhdHVyZSA9IHByb2R1Y3RDb21iaW5lZEZhY3Rvcnkoe1xuICogICAgIGFjdGlvbnNHcm91cEtleTogJ1tDb21iaW5lZF0nLFxuICogICAgIGZlYXR1cmVTZWxlY3RvcjogJ2NvbWJpbmVkJyxcbiAqICAgfSk7XG4gKlxuICogICBjb21iaW5lZEZlYXR1cmUuYWN0aW9ucy5jbGllbnQubG9hZENsaWVudHMoKTtcbiAqICAgY29tYmluZWRGZWF0dXJlLmFjdGlvbnMucHJvZHVjdC5sb2FkUHJvZHVjdHMoKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVFbnRpdHlGZWF0dXJlczxcbiAgVCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogRW50aXR5RmVhdHVyZUZhY3Rvcnk8YW55LCBhbnk+IH0sXG4gIEsgZXh0ZW5kcyBrZXlvZiBULFxuICBTdGF0ZSBleHRlbmRzIHsgW1AgaW4gS106IEV4dHJhY3RTdGF0ZVR5cGU8UmV0dXJuVHlwZTxUW1BdPj4gfSxcbiAgQSBleHRlbmRzIHsgW1AgaW4gS106IEV4dHJhY3RBY3Rpb25zVHlwZTxSZXR1cm5UeXBlPFRbUF0+PiB9LFxuICBTIGV4dGVuZHMge1xuICAgIFtQIGluIEtdOiBGZWF0dXJlU2VsZWN0b3JzPFN0YXRlLCBFeHRyYWN0U2VsZWN0b3JzVHlwZTxSZXR1cm5UeXBlPFRbUF0+Pj47XG4gIH0sXG4gIFIgZXh0ZW5kcyAoY29uZmlnOiBDb25maWc8U3RhdGU+KSA9PiB7XG4gICAgYWN0aW9uczogQTtcbiAgICBzZWxlY3RvcnM6IFM7XG4gICAgcmVkdWNlcjogKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25UeXBlPGFueT4pID0+IFN0YXRlO1xuICAgIGVmZmVjdHM6IFR5cGU8YW55PltdO1xuICAgIGluaXRpYWxTdGF0ZTogU3RhdGU7XG4gIH1cbj4odHJhaXRGYWN0b3JpZXNNYXA6IFQpOiBSIHtcbiAgcmV0dXJuICgoY29uZmlnOiBDb25maWc8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc3QgZmVhdHVyZVNlbGVjdG9yID1cbiAgICAgIHR5cGVvZiBjb25maWcuZmVhdHVyZVNlbGVjdG9yID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGNyZWF0ZUZlYXR1cmVTZWxlY3Rvcjxhbnk+KGNvbmZpZy5mZWF0dXJlU2VsZWN0b3IpXG4gICAgICAgIDogY29uZmlnLmZlYXR1cmVTZWxlY3RvcjtcbiAgICBjb25zdCBhY3Rpb25zOiBhbnkgPSB7fTtcbiAgICBjb25zdCBzZWxlY3RvcnM6IGFueSA9IHt9O1xuICAgIGNvbnN0IHJlZHVjZXJzOiBhbnkgPSB7fTtcbiAgICBsZXQgZWZmZWN0czogVHlwZTxhbnk+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudGl0eUZlYXR1cmVGYWN0b3J5XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIHRyYWl0RmFjdG9yaWVzTWFwXG4gICAgKSkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICAgICAgZmVhdHVyZVNlbGVjdG9yLFxuICAgICAgICAoc3RhdGU6IGFueSkgPT4gc3RhdGVba2V5XVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGZlYXR1cmVUcmFpdHMgPSBlbnRpdHlGZWF0dXJlRmFjdG9yeSh7XG4gICAgICAgIGFjdGlvbnNHcm91cEtleTogY29uZmlnLmFjdGlvbnNHcm91cEtleSxcbiAgICAgICAgZmVhdHVyZVNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgIH0pO1xuICAgICAgYWN0aW9uc1trZXldID0gZmVhdHVyZVRyYWl0cy5hY3Rpb25zO1xuICAgICAgc2VsZWN0b3JzW2tleV0gPSBmZWF0dXJlVHJhaXRzLnNlbGVjdG9ycztcbiAgICAgIHJlZHVjZXJzW2tleV0gPSBmZWF0dXJlVHJhaXRzLnJlZHVjZXI7XG4gICAgICBlZmZlY3RzID0gWy4uLmVmZmVjdHMsIC4uLmZlYXR1cmVUcmFpdHMuZWZmZWN0c107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25zLFxuICAgICAgc2VsZWN0b3JzLFxuICAgICAgcmVkdWNlcjogY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSxcbiAgICAgIGVmZmVjdHMsXG4gICAgfTtcbiAgfSkgYXMgUjtcbn1cblxuLyoqXG4gKiBNaXggYSBtYXAgZW50aXR5RmVhdHVyZUZhY3RvcmllcyBpbnRvIG9uZSwgZGlmZmVyZW50IGZyb20gY29tYmluZSB0aGUgYWN0aW9ucyBhbmQgc2VsZWN0b3JzIGEgbWl4LCBub3QgZ3JvdXAgYnkga2V5IGxpa2UgaW4gY29tYmluZSwgdGhlIGtleXMgYXJlIHN0aWxsIHVzZVxuICogaW50ZXJuYWwgaW4gdGhlIHJlZHVjZXJzIGFuZCBzZWxlY3RvciB0byBzZXBhcmF0ZSB0aGUgc3RhdGVcbiAqIEBwYXJhbSB0cmFpdEZhY3Rvcmllc01hcFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgY2xpZW50c0ZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ2NsaWVudCcsIGVudGl0aWVzTmFtZTogJ2NsaWVudHMnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PENsaWVudD4oKSxcbiAqICAgYWRkQ3J1ZEVudGl0aWVzVHJhaXQ8Q2xpZW50PigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RPcmRlckZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3RPcmRlcicgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdE9yZGVyPigpLFxuICogICBhZGRTZWxlY3RFbnRpdGllc1RyYWl0PFByb2R1Y3RPcmRlcj4oKVxuICogKTtcbiAqXG4gKiBjb25zdCBwcm9kdWN0RmVhdHVyZUZhY3RvcnkgPSBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeShcbiAqICAgeyBlbnRpdHlOYW1lOiAncHJvZHVjdCcgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdD4oKSxcbiAqICAgYWRkU2VsZWN0RW50aXRpZXNUcmFpdDxQcm9kdWN0PigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RNaXhlZEZhY3RvcnkgPSBtaXhFbnRpdHlGZWF0dXJlcyh7XG4gKiAgIHByb2R1Y3RzOiBwcm9kdWN0RmVhdHVyZUZhY3RvcnksXG4gKiAgIHByb2R1Y3RPcmRlcnM6IHByb2R1Y3RPcmRlckZlYXR1cmVGYWN0b3J5LFxuICogICBjbGllbnRzOiBjbGllbnRzRmVhdHVyZUZhY3RvcnksXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBtaXhlZEZlYXR1cmUgPSBwcm9kdWN0TWl4ZWRGYWN0b3J5KHtcbiAqICAgICBhY3Rpb25zR3JvdXBLZXk6ICdbTWl4ZWRdJyxcbiAqICAgICBmZWF0dXJlU2VsZWN0b3I6ICdtaXhlZCcsXG4gKiAgIH0pO1xuICogbWl4ZWRGZWF0dXJlLmFjdGlvbnMubG9hZENsaWVudHMoKTtcbiAqIG1peGVkRmVhdHVyZS5hY3Rpb25zLmxvYWRQcm9kdWN0cygpO1xuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1peEVudGl0eUZlYXR1cmVzPFxuICBUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBFbnRpdHlGZWF0dXJlRmFjdG9yeTxhbnksIGFueT4gfSxcbiAgSyBleHRlbmRzIGtleW9mIFQsXG4gIFN0YXRlIGV4dGVuZHMgeyBbUCBpbiBLXTogRXh0cmFjdFN0YXRlVHlwZTxSZXR1cm5UeXBlPFRbUF0+PiB9LFxuICBBIGV4dGVuZHMgVHJhaXRBY3Rpb25zICZcbiAgICBVbmlvblRvSW50ZXJzZWN0aW9uPEV4dHJhY3RBY3Rpb25zVHlwZTxSZXR1cm5UeXBlPFRbS10+Pj4sXG4gIFMgZXh0ZW5kcyBUcmFpdFNlbGVjdG9yczxhbnk+ICZcbiAgICBVbmlvblRvSW50ZXJzZWN0aW9uPFxuICAgICAgRmVhdHVyZVNlbGVjdG9yczxTdGF0ZSwgRXh0cmFjdFNlbGVjdG9yc1R5cGU8UmV0dXJuVHlwZTxUW0tdPj4+XG4gICAgPixcbiAgUiBleHRlbmRzIEVudGl0eUZlYXR1cmVGYWN0b3J5PGFueSwgYW55LCBTdGF0ZSwgQSwgUz5cbj4odHJhaXRGYWN0b3JpZXNNYXA6IFQpOiBSIHtcbiAgcmV0dXJuICgoY29uZmlnOiBDb25maWc8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc3QgZmVhdHVyZVNlbGVjdG9yID1cbiAgICAgIHR5cGVvZiBjb25maWcuZmVhdHVyZVNlbGVjdG9yID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGNyZWF0ZUZlYXR1cmVTZWxlY3Rvcjxhbnk+KGNvbmZpZy5mZWF0dXJlU2VsZWN0b3IpXG4gICAgICAgIDogY29uZmlnLmZlYXR1cmVTZWxlY3RvcjtcbiAgICBsZXQgYWN0aW9uczogYW55ID0ge307XG4gICAgbGV0IHNlbGVjdG9yczogYW55ID0ge307XG4gICAgY29uc3QgcmVkdWNlcnM6IGFueSA9IHt9O1xuICAgIGxldCBlZmZlY3RzOiBUeXBlPGFueT5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50aXR5RmVhdHVyZUZhY3RvcnldIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgdHJhaXRGYWN0b3JpZXNNYXBcbiAgICApKSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICBmZWF0dXJlU2VsZWN0b3IsXG4gICAgICAgIChzdGF0ZTogYW55KSA9PiBzdGF0ZVtrZXldXG4gICAgICApO1xuICAgICAgY29uc3QgZmVhdHVyZVRyYWl0cyA9IGVudGl0eUZlYXR1cmVGYWN0b3J5KHtcbiAgICAgICAgYWN0aW9uc0dyb3VwS2V5OiBjb25maWcuYWN0aW9uc0dyb3VwS2V5LFxuICAgICAgICBmZWF0dXJlU2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgfSk7XG4gICAgICBhY3Rpb25zID0geyAuLi5hY3Rpb25zLCAuLi5mZWF0dXJlVHJhaXRzLmFjdGlvbnMgfTtcbiAgICAgIHNlbGVjdG9ycyA9IHsgLi4uc2VsZWN0b3JzLCAuLi5mZWF0dXJlVHJhaXRzLnNlbGVjdG9ycyB9O1xuICAgICAgcmVkdWNlcnNba2V5XSA9IGZlYXR1cmVUcmFpdHMucmVkdWNlcjtcbiAgICAgIGVmZmVjdHMgPSBbLi4uZWZmZWN0cywgLi4uZmVhdHVyZVRyYWl0cy5lZmZlY3RzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbnMsXG4gICAgICBzZWxlY3RvcnMsXG4gICAgICByZWR1Y2VyOiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpLFxuICAgICAgZWZmZWN0cyxcbiAgICB9O1xuICB9KSBhcyBSO1xufVxuXG4vKipcbiAqIENvbWJpbmVzIHRhcmdldFRyYWl0RmFjdG9yeSB3aXRoIHRoZSB0cmFpdEZhY3Rvcmllc01hcCB1c2luZyB0aGUga2V5cyBhcyBwcm9wcyBmb3IgdGhlIHRhcmdldFRyYWl0RmFjdG9yeSBzdGF0ZSxcbiAqIGFuZCBncm91cGluZyB0aGUgY29tYmluZWQgYWN0aW9ucyBieSBrZXlcbiAqIEBwYXJhbSB0YXJnZXRUcmFpdEZhY3RvcnlcbiAqIEBwYXJhbSB0cmFpdEZhY3Rvcmllc01hcFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgY2xpZW50c0ZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ2NsaWVudCcsIGVudGl0aWVzTmFtZTogJ2NsaWVudHMnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PENsaWVudD4oKSxcbiAqICAgYWRkQ3J1ZEVudGl0aWVzVHJhaXQ8Q2xpZW50PigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RPcmRlckZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3RPcmRlcicgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdE9yZGVyPigpLFxuICogICBhZGRTZWxlY3RFbnRpdGllc1RyYWl0PFByb2R1Y3RPcmRlcj4oKVxuICogKTtcbiAqXG4gKiBjb25zdCBwcm9kdWN0RmVhdHVyZUZhY3RvcnkgPSBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeShcbiAqICAgeyBlbnRpdHlOYW1lOiAncHJvZHVjdCcgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdD4oKSxcbiAqICAgYWRkU2VsZWN0RW50aXRpZXNUcmFpdDxQcm9kdWN0PigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RBZGRFbnRpdHlQcm9wZXJ0aWVzRmFjdG9yeSA9IGFkZEVudGl0eUZlYXR1cmVzUHJvcGVydGllcyhcbiAqICAgcHJvZHVjdEZlYXR1cmVGYWN0b3J5LFxuICogICB7XG4gKiAgICAgcHJvZHVjdE9yZGVyczogcHJvZHVjdE9yZGVyRmVhdHVyZUZhY3RvcnksXG4gKiAgICAgY2xpZW50czogY2xpZW50c0ZlYXR1cmVGYWN0b3J5LFxuICogICB9XG4gKiApO1xuICpcbiAqIGNvbnN0IGNvbWJpbmVkRmVhdHVyZSA9IHByb2R1Y3RBZGRFbnRpdHlQcm9wZXJ0aWVzRmFjdG9yeSh7XG4gKiAgICAgYWN0aW9uc0dyb3VwS2V5OiAnW2FkZEVudGl0eUZlYXR1cmVzXScsXG4gKiAgICAgZmVhdHVyZVNlbGVjdG9yOiAnYWRkRW50aXR5RmVhdHVyZXMnLFxuICogICB9KTtcbiAqXG4gKiAgIGNvbWJpbmVkRmVhdHVyZS5hY3Rpb25zLmxvYWRQcm9kdWN0cygpO1xuICogICBjb21iaW5lZEZlYXR1cmUuYWN0aW9ucy5jbGllbnRzLmxvYWRDbGllbnRzKCk7XG4gKiAgIGNvbWJpbmVkRmVhdHVyZS5hY3Rpb25zLnByb2R1Y3RPcmRlcnMubG9hZFByb2R1Y3RPcmRlcnMoKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEVudGl0eUZlYXR1cmVzUHJvcGVydGllczxcbiAgRiBleHRlbmRzIEVudGl0eUZlYXR1cmVGYWN0b3J5PGFueSwgYW55PixcbiAgVCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogRW50aXR5RmVhdHVyZUZhY3Rvcnk8YW55LCBhbnksIGFueSwgYW55LCBhbnk+IH0sXG4gIEsgZXh0ZW5kcyBrZXlvZiBULFxuICBTdGF0ZSBleHRlbmRzIEV4dHJhY3RTdGF0ZVR5cGU8UmV0dXJuVHlwZTxGPj4gJlxuICAgIHtcbiAgICAgIFtQIGluIEtdOiBFeHRyYWN0U3RhdGVUeXBlPFJldHVyblR5cGU8VFtQXT4+O1xuICAgIH0sXG4gIEEgZXh0ZW5kcyBFeHRyYWN0QWN0aW9uc1R5cGU8UmV0dXJuVHlwZTxGPj4gJlxuICAgIHsgW1AgaW4gS106IEV4dHJhY3RBY3Rpb25zVHlwZTxSZXR1cm5UeXBlPFRbUF0+PiB9LFxuICBTIGV4dGVuZHMgRmVhdHVyZVNlbGVjdG9yczxTdGF0ZSwgRXh0cmFjdFNlbGVjdG9yc1R5cGU8UmV0dXJuVHlwZTxGPj4+ICZcbiAgICB7XG4gICAgICBbUCBpbiBLXTogRmVhdHVyZVNlbGVjdG9yczxTdGF0ZSwgRXh0cmFjdFNlbGVjdG9yc1R5cGU8UmV0dXJuVHlwZTxUW1BdPj4+O1xuICAgIH0sXG4gIFIgZXh0ZW5kcyAoY29uZmlnOiBDb25maWc8U3RhdGU+KSA9PiB7XG4gICAgYWN0aW9uczogQTtcbiAgICBzZWxlY3RvcnM6IFM7XG4gICAgcmVkdWNlcjogKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25UeXBlPGFueT4pID0+IFN0YXRlO1xuICAgIGVmZmVjdHM6IFR5cGU8YW55PltdO1xuICAgIGluaXRpYWxTdGF0ZTogU3RhdGU7XG4gIH1cbj4odGFyZ2V0VHJhaXRGYWN0b3J5OiBGLCB0cmFpdEZhY3Rvcmllc01hcDogVCk6IFIge1xuICByZXR1cm4gKChjb25maWc6IENvbmZpZzxhbnksIGFueT4pID0+IHtcbiAgICBjb25zdCBmZWF0dXJlU2VsZWN0b3IgPVxuICAgICAgdHlwZW9mIGNvbmZpZy5mZWF0dXJlU2VsZWN0b3IgPT09ICdzdHJpbmcnXG4gICAgICAgID8gY3JlYXRlRmVhdHVyZVNlbGVjdG9yPGFueT4oY29uZmlnLmZlYXR1cmVTZWxlY3RvcilcbiAgICAgICAgOiBjb25maWcuZmVhdHVyZVNlbGVjdG9yO1xuICAgIGNvbnN0IHRhcmdldEZlYXR1cmVUcmFpdHMgPSB0YXJnZXRUcmFpdEZhY3Rvcnkoe1xuICAgICAgYWN0aW9uc0dyb3VwS2V5OiBjb25maWcuYWN0aW9uc0dyb3VwS2V5LFxuICAgICAgZmVhdHVyZVNlbGVjdG9yOiBmZWF0dXJlU2VsZWN0b3IsXG4gICAgfSk7XG4gICAgY29uc3QgYWN0aW9uczogYW55ID0geyAuLi50YXJnZXRGZWF0dXJlVHJhaXRzLmFjdGlvbnMgfTtcbiAgICBjb25zdCBzZWxlY3RvcnM6IGFueSA9IHsgLi4udGFyZ2V0RmVhdHVyZVRyYWl0cy5zZWxlY3RvcnMgfTtcbiAgICBjb25zdCByZWR1Y2VyczogYW55ID0ge307XG4gICAgbGV0IGVmZmVjdHM6IFR5cGU8YW55PltdID0gWy4uLnRhcmdldEZlYXR1cmVUcmFpdHMuZWZmZWN0c107XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRpdHlGZWF0dXJlRmFjdG9yeV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICB0cmFpdEZhY3Rvcmllc01hcFxuICAgICkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgIGZlYXR1cmVTZWxlY3RvcixcbiAgICAgICAgKHN0YXRlOiBhbnkpID0+IHN0YXRlW2tleV1cbiAgICAgICk7XG4gICAgICBjb25zdCBmZWF0dXJlVHJhaXRzID0gZW50aXR5RmVhdHVyZUZhY3Rvcnkoe1xuICAgICAgICBhY3Rpb25zR3JvdXBLZXk6IGNvbmZpZy5hY3Rpb25zR3JvdXBLZXksXG4gICAgICAgIGZlYXR1cmVTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICB9KTtcbiAgICAgIGFjdGlvbnNba2V5XSA9IGZlYXR1cmVUcmFpdHMuYWN0aW9ucztcbiAgICAgIHNlbGVjdG9yc1trZXldID0gZmVhdHVyZVRyYWl0cy5zZWxlY3RvcnM7XG4gICAgICByZWR1Y2Vyc1trZXldID0gZmVhdHVyZVRyYWl0cy5yZWR1Y2VyO1xuICAgICAgZWZmZWN0cyA9IFsuLi5lZmZlY3RzLCAuLi5mZWF0dXJlVHJhaXRzLmVmZmVjdHNdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9ucyxcbiAgICAgIHNlbGVjdG9ycyxcbiAgICAgIHJlZHVjZXI6IHNldFByb3BlcnRpZXNSZWR1Y2VyKHRhcmdldEZlYXR1cmVUcmFpdHMucmVkdWNlciwgcmVkdWNlcnMpLFxuICAgICAgZWZmZWN0cyxcbiAgICB9O1xuICB9KSBhcyBSO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYW4gaW1wbGVtZW50YXRpb24gIGEgVHJhaXRGYWN0b3J5XG4gKiBAcGFyYW0gZiBUcmFpdEZhY3RvcnkgaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyYWl0RmFjdG9yeTxcbiAgU3RhdGUgPSB7fSxcbiAgQSBleHRlbmRzIFRyYWl0QWN0aW9ucyA9IHt9LFxuICBTIGV4dGVuZHMgVHJhaXRTZWxlY3RvcnM8U3RhdGU+ID0ge30sXG4gIE0gZXh0ZW5kcyBUcmFpdFN0YXRlTXV0YXRvcnM8U3RhdGU+ID0ge30sXG4gIEtFWSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgQyA9IHVua25vd24sXG4gIEtDID0gS2V5ZWRDb25maWc8S0VZLCBDPlxuPihmOiB7XG4gIGtleTogS0VZO1xuICBjb25maWc/OiBDO1xuICBkZXBlbmRzPzogc3RyaW5nW107XG4gIGFjdGlvbnM/OiBUcmFpdEFjdGlvbnNGYWN0b3J5PEEsIEtDPjtcbiAgc2VsZWN0b3JzPzogVHJhaXRTZWxlY3RvcnNGYWN0b3J5PFN0YXRlLCBTLCBLQz47XG4gIGluaXRpYWxTdGF0ZT86IFRyYWl0SW5pdGlhbFN0YXRlRmFjdG9yeTxTdGF0ZSwgS0M+O1xuICBtdXRhdG9ycz86IFRyYWl0U3RhdGVNdXRhdG9yc0ZhY3Rvcnk8U3RhdGUsIE0sIEtDPjtcbiAgcmVkdWNlcj86IFRyYWl0UmVkdWNlckZhY3Rvcnk8U3RhdGUsIEEsIFMsIE0sIEtDPjtcbiAgZWZmZWN0cz86IFRyYWl0RWZmZWN0c0ZhY3Rvcnk8U3RhdGUsIEEsIFMsIEtDPjtcbn0pOiBUcmFpdEZhY3Rvcnk8U3RhdGUsIEEsIFMsIE0sIEtFWSwgQywgS0M+IHtcbiAgcmV0dXJuIGYgYXMgVHJhaXRGYWN0b3J5PFN0YXRlLCBBLCBTLCBNLCBLRVksIEMsIEtDPjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './create-entity-feature';
|
|
2
|
+
export * from './model';
|
|
3
|
+
export * from './local-store';
|
|
4
|
+
export * from './trait-effect';
|
|
5
|
+
export * from './util';
|
|
6
|
+
export * from './cache';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdHJhaXRzL2NvcmUvc3JjL2xpYi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxRQUFRLENBQUM7QUFDdkIsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NyZWF0ZS1lbnRpdHktZmVhdHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vbG9jYWwtc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi90cmFpdC1lZmZlY3QnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUnO1xuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* @ignore
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export const DISABLE_LOCAL_TRAIT_EFFECTS = new InjectionToken('disableLocalTraitEffects');
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzYWJsZS1sb2NhbC10cmFpdC1lZmZlY3RzLnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRyYWl0cy9jb3JlL3NyYy9saWIvbG9jYWwtc3RvcmUvZGlzYWJsZS1sb2NhbC10cmFpdC1lZmZlY3RzLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0M7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxjQUFjLENBQzNELDBCQUEwQixDQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAaWdub3JlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERJU0FCTEVfTE9DQUxfVFJBSVRfRUZGRUNUUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPihcbiAgJ2Rpc2FibGVMb2NhbFRyYWl0RWZmZWN0cydcbik7XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './traits-local-store';
|
|
2
|
+
export * from './disable-local-trait-effects.token';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdHJhaXRzL2NvcmUvc3JjL2xpYi9sb2NhbC1zdG9yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMscUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3RyYWl0cy1sb2NhbC1zdG9yZSc7XG5leHBvcnQgKiBmcm9tICcuL2Rpc2FibGUtbG9jYWwtdHJhaXQtZWZmZWN0cy50b2tlbic7XG4iXX0=
|