@fireflysemantics/slice 17.0.14 → 17.0.17
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/README.md +44 -12
- package/esm2022/lib/AbstractStore.mjs +44 -40
- package/esm2022/lib/EStore.mjs +203 -139
- package/esm2022/lib/Slice.mjs +10 -10
- package/esm2022/lib/models/Delta.mjs +1 -1
- package/fesm2022/fireflysemantics-slice.mjs +252 -184
- package/fesm2022/fireflysemantics-slice.mjs.map +1 -1
- package/lib/AbstractStore.d.ts +38 -34
- package/lib/EStore.d.ts +182 -116
- package/lib/Slice.d.ts +9 -9
- package/lib/models/Delta.d.ts +1 -1
- package/package.json +1 -1
package/esm2022/lib/EStore.mjs
CHANGED
@@ -7,36 +7,43 @@ import { Slice } from './Slice';
|
|
7
7
|
* This `todoFactory` code will be used to illustrate the API examples. The following
|
8
8
|
* utilities are used in the tests and the API Typedoc examples contained here.
|
9
9
|
* @example Utilities for API Examples
|
10
|
-
```
|
11
|
-
export const enum TodoSliceEnum {
|
12
|
-
|
13
|
-
|
14
|
-
}
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
10
|
+
* ```
|
11
|
+
* export const enum TodoSliceEnum {
|
12
|
+
* COMPLETE = "Complete",
|
13
|
+
* INCOMPLETE = "Incomplete"
|
14
|
+
* }
|
15
|
+
* export class Todo {
|
16
|
+
* constructor(
|
17
|
+
* public complete: boolean,
|
18
|
+
* public title: string,
|
19
|
+
* public gid?:string,
|
20
|
+
* public id?:string) {}
|
21
|
+
* }
|
22
|
+
*
|
23
|
+
* export let todos = [new Todo(false, "You complete me!"), new Todo(true, "You completed me!")];
|
24
|
+
*
|
25
|
+
* export function todosFactory():Todo[] {
|
26
|
+
* return [new Todo(false, "You complete me!"), new Todo(true, "You completed me!")];
|
27
|
+
* }
|
28
|
+
* ```
|
26
29
|
*/
|
27
30
|
export class EStore extends AbstractStore {
|
28
31
|
/**
|
29
32
|
* Store constructor (Initialization with element is optional)
|
30
33
|
*
|
31
34
|
* perform initial notification to all observers,
|
32
|
-
* such that
|
35
|
+
* such that functions like {@link combineLatest}{}
|
33
36
|
* will execute at least once.
|
34
|
-
*
|
35
|
-
* @
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
*
|
38
|
+
* @param entities The entities to initialize the store with.
|
39
|
+
* @param config The optional configuration instance.
|
40
|
+
*
|
41
|
+
* @example EStore<Todo> Creation
|
42
|
+
* ```
|
43
|
+
* // Initialize the Store
|
44
|
+
* let store: EStore<Todo> = new EStore<Todo>(todosFactory());
|
45
|
+
* ```
|
46
|
+
*/
|
40
47
|
constructor(entities = [], config) {
|
41
48
|
super(config);
|
42
49
|
/**
|
@@ -91,7 +98,7 @@ export class EStore extends AbstractStore {
|
|
91
98
|
this.notifyDelta.next(delta);
|
92
99
|
}
|
93
100
|
/**
|
94
|
-
* Calls complete on all {@link
|
101
|
+
* Calls complete on all EStore {@link ReplaySubject} instances.
|
95
102
|
*
|
96
103
|
* Call destroy when disposing of the store.
|
97
104
|
*/
|
@@ -99,7 +106,7 @@ export class EStore extends AbstractStore {
|
|
99
106
|
super.destroy();
|
100
107
|
this.notifyLoading.complete();
|
101
108
|
this.notifyActive.complete();
|
102
|
-
this.slices.forEach(slice => slice.destroy());
|
109
|
+
this.slices.forEach((slice) => slice.destroy());
|
103
110
|
}
|
104
111
|
/**
|
105
112
|
* Toggles the entity:
|
@@ -108,16 +115,15 @@ export class EStore extends AbstractStore {
|
|
108
115
|
* it will be deleted. If the store
|
109
116
|
* does not contains the entity,
|
110
117
|
* it is added.
|
111
|
-
* @param e
|
112
|
-
* @example Toggle the
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
```
|
118
|
+
* @param e The entity to toggle
|
119
|
+
* @example Toggle the Todo instance
|
120
|
+
* ```
|
121
|
+
* estore.post(todo);
|
122
|
+
* // Remove todo
|
123
|
+
* estore.toggle(todo);
|
124
|
+
* // Add it back
|
125
|
+
* estore.toggle(todo);
|
126
|
+
* ```
|
121
127
|
*/
|
122
128
|
toggle(e) {
|
123
129
|
if (this.contains(e)) {
|
@@ -138,11 +144,11 @@ export class EStore extends AbstractStore {
|
|
138
144
|
* change detection in the event that it maintains
|
139
145
|
* a reference to the `active` state `Map` instance.
|
140
146
|
*
|
141
|
-
* @example Add
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
147
|
+
* @example Add todo1 and todo2 as active
|
148
|
+
* ```
|
149
|
+
* addActive(todo1);
|
150
|
+
* addActive(todo2);
|
151
|
+
* ```
|
146
152
|
*/
|
147
153
|
addActive(e) {
|
148
154
|
if (this.contains(e)) {
|
@@ -156,18 +162,18 @@ export class EStore extends AbstractStore {
|
|
156
162
|
}
|
157
163
|
}
|
158
164
|
/**
|
159
|
-
* Delete an entity
|
165
|
+
* Delete an active entity.
|
160
166
|
*
|
161
167
|
* Also we clone the map prior to broadcasting it with
|
162
168
|
* `notifyActive` to make sure we will trigger Angular
|
163
169
|
* change detection in the event that it maintains
|
164
170
|
* a reference to the `active` state `Map` instance.
|
165
171
|
*
|
166
|
-
* @example
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
172
|
+
* @example Remove todo1 and todo2 as active entities
|
173
|
+
* ```
|
174
|
+
* deleteActive(todo1);
|
175
|
+
* deleteActive(todo2);
|
176
|
+
* ```
|
171
177
|
*/
|
172
178
|
deleteActive(e) {
|
173
179
|
this.active.delete(e.gid);
|
@@ -181,23 +187,23 @@ export class EStore extends AbstractStore {
|
|
181
187
|
* change detection in the event that it maintains
|
182
188
|
* a reference to the `active` state `Map` instance.
|
183
189
|
*
|
184
|
-
* @example
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
```
|
190
|
+
* @example Clear active todo instances
|
191
|
+
* ```
|
192
|
+
* store.clearActive();
|
193
|
+
* ```
|
189
194
|
*/
|
190
195
|
clearActive() {
|
191
196
|
this.active.clear();
|
192
197
|
this.notifyActive.next(new Map(this.active));
|
193
198
|
}
|
194
199
|
/**
|
195
|
-
* Observe the active
|
200
|
+
* Observe the active entities.
|
201
|
+
*
|
196
202
|
* @example
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
203
|
+
* ```
|
204
|
+
* let active$ = store.observeActive();
|
205
|
+
* ```
|
206
|
+
*/
|
201
207
|
observeActive() {
|
202
208
|
return this.notifyActive.asObservable();
|
203
209
|
}
|
@@ -220,35 +226,91 @@ export class EStore extends AbstractStore {
|
|
220
226
|
}
|
221
227
|
/**
|
222
228
|
* @return A snapshot of the loading state.
|
229
|
+
* @example Create a reference to the loading state
|
230
|
+
* ```
|
231
|
+
* const loading:boolean = todoStore.loading;
|
232
|
+
* ```
|
223
233
|
*/
|
224
234
|
get loading() {
|
225
235
|
return this._loading;
|
226
236
|
}
|
227
237
|
/**
|
228
238
|
* Observe loading.
|
239
|
+
*
|
240
|
+
* Note that this obverable piped through
|
241
|
+
* `takeWhile(v->v, true), such that it will
|
242
|
+
* complete after each emission.
|
243
|
+
*
|
244
|
+
* See:
|
245
|
+
* https://fireflysemantics.medium.com/waiting-on-estore-to-load-8dcbe161613c
|
246
|
+
*
|
247
|
+
* For more details.
|
248
|
+
* Also note that v=>v is the same as v=>v!=false
|
249
|
+
*
|
229
250
|
* @example
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
251
|
+
* ```
|
252
|
+
* const observeLoadingHandler: Observer<boolean> = {
|
253
|
+
* complete: () => {
|
254
|
+
* console.log(`Data Loaded and Observable Marked as Complete`);
|
255
|
+
* }, // completeHandler
|
256
|
+
* error: () => {
|
257
|
+
* console.log(`Any Errors?`);
|
258
|
+
* }, // errorHandler
|
259
|
+
* next: (l) => {
|
260
|
+
* console.log(`Data loaded and loading is ${l}`);
|
261
|
+
* },
|
262
|
+
* };
|
263
|
+
*
|
264
|
+
* const observeLoadingResubscribeHandler: Observer<boolean> = {
|
265
|
+
* complete: () => {
|
266
|
+
* console.log(`Data Loaded and Resubscribe Observable Marked as Complete`);
|
267
|
+
* }, // completeHandler
|
268
|
+
* error: () => {
|
269
|
+
* console.log(`Any Resubscribe Errors?`);
|
270
|
+
* }, // errorHandler
|
271
|
+
* next: (l) => {
|
272
|
+
* console.log(`Data loaded and resusbscribe loading value is ${l}`);
|
273
|
+
* },
|
274
|
+
* };
|
275
|
+
*
|
276
|
+
* const todoStore: EStore<Todo> = new EStore();
|
277
|
+
* //============================================
|
278
|
+
* // Loading is true by default
|
279
|
+
* //============================================
|
280
|
+
* console.log(`The initial value of loading is ${todoStore.loading}`);
|
281
|
+
* //============================================
|
282
|
+
* // Observe Loading
|
283
|
+
* //============================================
|
284
|
+
* let loading$: Observable<boolean> = todoStore.observeLoading();
|
285
|
+
* loading$.subscribe((l) => console.log(`The value of loading is ${l}`));
|
286
|
+
*
|
287
|
+
* todoStore.loading = false;
|
288
|
+
* loading$.subscribe(observeLoadingHandler);
|
289
|
+
* //============================================
|
290
|
+
* // The subscription no longer fires
|
291
|
+
* //============================================
|
292
|
+
* todoStore.loading = true;
|
293
|
+
* todoStore.loading = false;
|
294
|
+
*
|
295
|
+
* //============================================
|
296
|
+
* // The subscription no longer fires,
|
297
|
+
* // so if we want to observe loading again
|
298
|
+
* // resusbscribe.
|
299
|
+
* //============================================
|
300
|
+
* todoStore.loading = true;
|
301
|
+
* loading$ = todoStore.observeLoading();
|
302
|
+
* loading$.subscribe(observeLoadingResubscribeHandler);
|
303
|
+
* todoStore.loading = false;
|
304
|
+
* ```
|
305
|
+
*/
|
243
306
|
observeLoading() {
|
244
|
-
return this.notifyLoading.asObservable().
|
245
|
-
pipe(takeWhile(v => v, true));
|
307
|
+
return this.notifyLoading.asObservable().pipe(takeWhile((v) => v, true));
|
246
308
|
}
|
247
309
|
/**
|
248
310
|
* Notfiies when loading has completed.
|
249
311
|
*/
|
250
312
|
observeLoadingComplete() {
|
251
|
-
return this.observeLoading().pipe(filter(loading => loading == false), switchMap(() => of(true)));
|
313
|
+
return this.observeLoading().pipe(filter((loading) => loading == false), switchMap(() => of(true)));
|
252
314
|
}
|
253
315
|
/**
|
254
316
|
* Sets the current searching state and notifies observers.
|
@@ -280,14 +342,13 @@ export class EStore extends AbstractStore {
|
|
280
342
|
For more details.
|
281
343
|
*/
|
282
344
|
observeSearching() {
|
283
|
-
return this.notifySearching.asObservable().
|
284
|
-
pipe(takeWhile(v => v, true));
|
345
|
+
return this.notifySearching.asObservable().pipe(takeWhile((v) => v, true));
|
285
346
|
}
|
286
347
|
/**
|
287
348
|
* Notfiies when searching has completed.
|
288
349
|
*/
|
289
350
|
observeSearchingComplete() {
|
290
|
-
return this.observeSearching().pipe(filter(searching => searching == false), switchMap(() => of(true)));
|
351
|
+
return this.observeSearching().pipe(filter((searching) => searching == false), switchMap(() => of(true)));
|
291
352
|
}
|
292
353
|
/**
|
293
354
|
* Adds a slice to the store and keys it by the slices label.
|
@@ -332,10 +393,11 @@ export class EStore extends AbstractStore {
|
|
332
393
|
/**
|
333
394
|
* Post (Add a new) element(s) to the store.
|
334
395
|
* @param e An indiidual entity or an array of entities
|
335
|
-
* @example Post a
|
336
|
-
|
337
|
-
|
338
|
-
|
396
|
+
* @example Post a Todo instance.
|
397
|
+
*
|
398
|
+
*```
|
399
|
+
* store.post(todo);
|
400
|
+
*```
|
339
401
|
*/
|
340
402
|
post(e) {
|
341
403
|
if (!Array.isArray(e)) {
|
@@ -345,7 +407,7 @@ export class EStore extends AbstractStore {
|
|
345
407
|
e[this.GUID_KEY] = guid;
|
346
408
|
this.entries.set(guid, e);
|
347
409
|
this.updateIDEntry(e);
|
348
|
-
Array.from(this.slices.values()).forEach(s => {
|
410
|
+
Array.from(this.slices.values()).forEach((s) => {
|
349
411
|
s.post(e);
|
350
412
|
});
|
351
413
|
//Create a new array reference to trigger Angular change detection.
|
@@ -358,15 +420,15 @@ export class EStore extends AbstractStore {
|
|
358
420
|
}
|
359
421
|
}
|
360
422
|
/**
|
361
|
-
* Post
|
423
|
+
* Post N entities to the store.
|
362
424
|
* @param ...e
|
363
|
-
* @example Post two
|
364
|
-
|
365
|
-
|
366
|
-
|
425
|
+
* @example Post two Todo instances.
|
426
|
+
* ```
|
427
|
+
* store.post(todo1, todo2);
|
428
|
+
* ```
|
367
429
|
*/
|
368
430
|
postN(...e) {
|
369
|
-
e.forEach(e => {
|
431
|
+
e.forEach((e) => {
|
370
432
|
const guid = e[this.GUID_KEY]
|
371
433
|
? e[this.GUID_KEY]
|
372
434
|
: GUID();
|
@@ -374,7 +436,7 @@ export class EStore extends AbstractStore {
|
|
374
436
|
this.entries.set(guid, e);
|
375
437
|
this.updateIDEntry(e);
|
376
438
|
});
|
377
|
-
Array.from(this.slices.values()).forEach(s => {
|
439
|
+
Array.from(this.slices.values()).forEach((s) => {
|
378
440
|
s.postA(e);
|
379
441
|
});
|
380
442
|
//Create a new array reference to trigger Angular change detection.
|
@@ -385,21 +447,22 @@ export class EStore extends AbstractStore {
|
|
385
447
|
/**
|
386
448
|
* Post (Add) an array of elements to the store.
|
387
449
|
* @param e
|
388
|
-
* @example Post a
|
389
|
-
|
390
|
-
|
391
|
-
|
450
|
+
* @example Post a Todo array.
|
451
|
+
*
|
452
|
+
* ```
|
453
|
+
* store.post([todo1, todo2]);
|
454
|
+
* ```
|
392
455
|
*/
|
393
456
|
postA(e) {
|
394
457
|
this.postN(...e);
|
395
458
|
}
|
396
459
|
/**
|
397
|
-
* Put (Update) an
|
460
|
+
* Put (Update) an entity.
|
398
461
|
* @param e
|
399
462
|
* @example Put a Todo instance.
|
400
|
-
|
401
|
-
|
402
|
-
|
463
|
+
* ```
|
464
|
+
* store.put(todo1);
|
465
|
+
* ```
|
403
466
|
*/
|
404
467
|
put(e) {
|
405
468
|
if (!Array.isArray(e)) {
|
@@ -410,7 +473,7 @@ export class EStore extends AbstractStore {
|
|
410
473
|
this.notify.next(v);
|
411
474
|
const delta = { type: "Put" /* ActionTypes.PUT */, entries: [e] };
|
412
475
|
this.notifyDelta.next(delta);
|
413
|
-
Array.from(this.slices.values()).forEach(s => {
|
476
|
+
Array.from(this.slices.values()).forEach((s) => {
|
414
477
|
s.put(e);
|
415
478
|
});
|
416
479
|
}
|
@@ -421,25 +484,26 @@ export class EStore extends AbstractStore {
|
|
421
484
|
/**
|
422
485
|
* Put (Update) an element or add an element that was read from a persistence source
|
423
486
|
* and thus already has an assigned global id`.
|
424
|
-
* @param e
|
425
|
-
* @example Put Todo instances.
|
426
|
-
|
427
|
-
|
428
|
-
|
487
|
+
* @param e The enetity instances to update.
|
488
|
+
* @example Put N Todo instances.
|
489
|
+
*
|
490
|
+
* ```
|
491
|
+
* store.put(todo1, todo2);
|
492
|
+
* ```
|
429
493
|
*/
|
430
494
|
putN(...e) {
|
431
495
|
this.putA(e);
|
432
496
|
}
|
433
497
|
/**
|
434
|
-
* Put (Update) the array of
|
435
|
-
* @param e
|
436
|
-
* @example Put Todo instances.
|
437
|
-
|
438
|
-
|
439
|
-
|
498
|
+
* Put (Update) the array of enntities.
|
499
|
+
* @param e The array of enntities to update
|
500
|
+
* @example Put an array of Todo instances.
|
501
|
+
* ```
|
502
|
+
* store.put([todo1, todo2]);
|
503
|
+
* ```
|
440
504
|
*/
|
441
505
|
putA(e) {
|
442
|
-
e.forEach(e => {
|
506
|
+
e.forEach((e) => {
|
443
507
|
let guid = e[this.GUID_KEY];
|
444
508
|
this.entries.set(guid, e);
|
445
509
|
this.updateIDEntry(e);
|
@@ -449,7 +513,7 @@ export class EStore extends AbstractStore {
|
|
449
513
|
this.notify.next(v);
|
450
514
|
const delta = { type: "Put" /* ActionTypes.PUT */, entries: e };
|
451
515
|
this.notifyDelta.next(delta);
|
452
|
-
Array.from(this.slices.values()).forEach(s => {
|
516
|
+
Array.from(this.slices.values()).forEach((s) => {
|
453
517
|
s.putA(e);
|
454
518
|
});
|
455
519
|
}
|
@@ -457,9 +521,9 @@ export class EStore extends AbstractStore {
|
|
457
521
|
* Delete (Update) the array of elements.
|
458
522
|
* @param e
|
459
523
|
* @example Delete todo1.
|
460
|
-
|
461
|
-
|
462
|
-
|
524
|
+
* ```
|
525
|
+
* store.delete(todo1]);
|
526
|
+
* ```
|
463
527
|
*/
|
464
528
|
delete(e) {
|
465
529
|
if (!Array.isArray(e)) {
|
@@ -467,14 +531,14 @@ export class EStore extends AbstractStore {
|
|
467
531
|
const guid = e[this.GUID_KEY];
|
468
532
|
this.entries.delete(guid);
|
469
533
|
this.deleteIDEntry(e);
|
470
|
-
Array.from(this.slices.values()).forEach(s => {
|
534
|
+
Array.from(this.slices.values()).forEach((s) => {
|
471
535
|
s.entries.delete(guid);
|
472
536
|
});
|
473
537
|
//Create a new array reference to trigger Angular change detection.
|
474
538
|
let v = [...Array.from(this.entries.values())];
|
475
539
|
const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: [e] };
|
476
540
|
this.notifyAll(v, delta);
|
477
|
-
Array.from(this.slices.values()).forEach(s => {
|
541
|
+
Array.from(this.slices.values()).forEach((s) => {
|
478
542
|
s.delete(e);
|
479
543
|
});
|
480
544
|
}
|
@@ -485,29 +549,29 @@ export class EStore extends AbstractStore {
|
|
485
549
|
/**
|
486
550
|
* Delete N elements.
|
487
551
|
* @param ...e
|
488
|
-
* @example
|
489
|
-
|
490
|
-
|
491
|
-
|
552
|
+
* @example Delete N Todo instance argument.
|
553
|
+
* ```
|
554
|
+
* store.deleteN(todo1, todo2);
|
555
|
+
* ```
|
492
556
|
*/
|
493
557
|
deleteN(...e) {
|
494
558
|
this.deleteA(e);
|
495
559
|
}
|
496
560
|
/**
|
497
|
-
* Delete
|
498
|
-
* @param
|
499
|
-
* @example
|
500
|
-
|
501
|
-
|
502
|
-
|
561
|
+
* Delete an array of elements.
|
562
|
+
* @param e The array of instances to be deleted
|
563
|
+
* @example Delete the array of Todo instances.
|
564
|
+
* ```
|
565
|
+
* store.deleteA([todo1, todo2]);
|
566
|
+
* ```
|
503
567
|
*/
|
504
568
|
deleteA(e) {
|
505
|
-
e.forEach(e => {
|
569
|
+
e.forEach((e) => {
|
506
570
|
this.deleteActive(e);
|
507
571
|
const guid = e[this.GUID_KEY];
|
508
572
|
this.entries.delete(guid);
|
509
573
|
this.deleteIDEntry(e);
|
510
|
-
Array.from(this.slices.values()).forEach(s => {
|
574
|
+
Array.from(this.slices.values()).forEach((s) => {
|
511
575
|
s.entries.delete(guid);
|
512
576
|
});
|
513
577
|
});
|
@@ -515,21 +579,21 @@ export class EStore extends AbstractStore {
|
|
515
579
|
let v = [...Array.from(this.entries.values())];
|
516
580
|
const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: e };
|
517
581
|
this.notifyAll(v, delta);
|
518
|
-
Array.from(this.slices.values()).forEach(s => {
|
582
|
+
Array.from(this.slices.values()).forEach((s) => {
|
519
583
|
s.deleteA(e);
|
520
584
|
});
|
521
585
|
}
|
522
586
|
/**
|
523
587
|
* Delete elements by {@link Predicate}.
|
524
588
|
* @param p The predicate.
|
525
|
-
* @example
|
526
|
-
|
527
|
-
|
528
|
-
|
589
|
+
* @example Delete the Todo instances.
|
590
|
+
* ```
|
591
|
+
* store.delete(todo1, todo2);
|
592
|
+
* ```
|
529
593
|
*/
|
530
594
|
deleteP(p) {
|
531
595
|
const d = [];
|
532
|
-
Array.from(this.entries.values()).forEach(e => {
|
596
|
+
Array.from(this.entries.values()).forEach((e) => {
|
533
597
|
if (p(e)) {
|
534
598
|
d.push(e);
|
535
599
|
const id = e[this.GUID_KEY];
|
@@ -542,7 +606,7 @@ export class EStore extends AbstractStore {
|
|
542
606
|
let v = [...Array.from(this.entries.values())];
|
543
607
|
const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: d };
|
544
608
|
this.notifyAll(v, delta);
|
545
|
-
Array.from(this.slices.values()).forEach(s => {
|
609
|
+
Array.from(this.slices.values()).forEach((s) => {
|
546
610
|
s.deleteA(d);
|
547
611
|
});
|
548
612
|
}
|
@@ -575,18 +639,18 @@ export class EStore extends AbstractStore {
|
|
575
639
|
* send their own delta notification.
|
576
640
|
*
|
577
641
|
* @example Reset the store.
|
578
|
-
|
579
|
-
|
580
|
-
|
642
|
+
* ```
|
643
|
+
* store.reset();
|
644
|
+
* ```
|
581
645
|
*/
|
582
646
|
reset() {
|
583
647
|
const delta = {
|
584
648
|
type: "Reset" /* ActionTypes.RESET */,
|
585
|
-
entries: Array.from(this.entries.values())
|
649
|
+
entries: Array.from(this.entries.values()),
|
586
650
|
};
|
587
651
|
this.notifyAll([], delta);
|
588
652
|
this.entries = new Map();
|
589
|
-
Array.from(this.slices.values()).forEach(s => {
|
653
|
+
Array.from(this.slices.values()).forEach((s) => {
|
590
654
|
s.reset();
|
591
655
|
});
|
592
656
|
}
|
@@ -601,4 +665,4 @@ export class EStore extends AbstractStore {
|
|
601
665
|
this.notifyLoading.next(this.loading);
|
602
666
|
}
|
603
667
|
}
|
604
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi9FU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLE9BQU8sTUFBVSxTQUFRLGFBQWdCO0lBQzdDOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsWUFBWSxXQUFnQixFQUFFLEVBQUUsTUFBb0I7UUFDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBNENoQjs7V0FFRztRQUNLLGlCQUFZLEdBQUcsSUFBSSxhQUFhLENBQWlCLENBQUMsQ0FBQyxDQUFDO1FBRzVEOzs7O1dBSUc7UUFDSSxXQUFNLEdBQW1CLElBQUksR0FBRyxFQUFFLENBQUM7UUF3RzFDOzs7OztXQUtHO1FBQ0ssa0JBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUV0RDs7Ozs7Ozs7OztXQVVHO1FBQ0ssYUFBUSxHQUFZLElBQUksQ0FBQztRQStEakM7Ozs7O1dBS0c7UUFDSyxvQkFBZSxHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXhEOzs7OztXQUtHO1FBQ0ssZUFBVSxHQUFZLEtBQUssQ0FBQztRQStDcEM7O1dBRUc7UUFDSyxXQUFNLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7UUFoVGhELE1BQU0sS0FBSyxH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QUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RTdG9yZSB9IGZyb20gJy4vQWJzdHJhY3RTdG9yZSc7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL1N0b3JlQ29uZmlnJztcbmltcG9ydCB7IEdVSUQgfSBmcm9tICcuL3V0aWxpdGllcyc7XG5cbmltcG9ydCB7IEFjdGlvblR5cGVzLCBQcmVkaWNhdGUsIERlbHRhIH0gZnJvbSAnLi9tb2RlbHMvJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG9mLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlV2hpbGUsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2xpY2UgfSBmcm9tICcuL1NsaWNlJztcblxuLyoqXG4gKiBUaGlzIGB0b2RvRmFjdG9yeWAgY29kZSB3aWxsIGJlIHVzZWQgdG8gaWxsdXN0cmF0ZSB0aGUgQVBJIGV4YW1wbGVzLiAgVGhlIGZvbGxvd2luZ1xuICogdXRpbGl0aWVzIGFyZSB1c2VkIGluIHRoZSB0ZXN0cyBhbmQgdGhlIEFQSSBUeXBlZG9jIGV4YW1wbGVzIGNvbnRhaW5lZCBoZXJlLlxuICogQGV4YW1wbGUgVXRpbGl0aWVzIGZvciBBUEkgRXhhbXBsZXNcbmBgYFxuZXhwb3J0IGNvbnN0IGVudW0gVG9kb1NsaWNlRW51bSB7XG4gIENPTVBMRVRFID0gXCJDb21wbGV0ZVwiLFxuICBJTkNPTVBMRVRFID0gXCJJbmNvbXBsZXRlXCJcbn1cblxuZXhwb3J0IGNsYXNzIFRvZG8ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcGxldGU6IGJvb2xlYW4sIHB1YmxpYyB0aXRsZTogc3RyaW5nLHB1YmxpYyBnaWQ/OnN0cmluZywgcHVibGljIGlkPzpzdHJpbmcpIHt9XG59XG5cbmV4cG9ydCBsZXQgdG9kb3MgPSBbbmV3IFRvZG8oZmFsc2UsIFwiWW91IGNvbXBsZXRlIG1lIVwiKSwgbmV3IFRvZG8odHJ1ZSwgXCJZb3UgY29tcGxldGVkIG1lIVwiKV07XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2Rvc0ZhY3RvcnkoKTpUb2RvW10ge1xuICByZXR1cm4gW25ldyBUb2RvKGZhbHNlLCBcIllvdSBjb21wbGV0ZSBtZSFcIiksIG5ldyBUb2RvKHRydWUsIFwiWW91IGNvbXBsZXRlZCBtZSFcIildO1xufVxuIGBgYCBcbiAqL1xuXG5leHBvcnQgY2xhc3MgRVN0b3JlPEU+IGV4dGVuZHMgQWJzdHJhY3RTdG9yZTxFPiB7XG4gIC8qKlxuICAgKiBTdG9yZSBjb25zdHJ1Y3RvciAoSW5pdGlhbGl6YXRpb24gd2l0aCBlbGVtZW50IGlzIG9wdGlvbmFsKVxuICAgKlxuICAgKiBwZXJmb3JtIGluaXRpYWwgbm90aWZpY2F0aW9uIHRvIGFsbCBvYnNlcnZlcnMsXG4gICAqIHN1Y2ggdGhhdCBmdW5jdGlvbiBsaWtlIHtAbGluayBjb21iaW5lTGF0ZXN0fXt9XG4gICAqIHdpbGwgZXhlY3V0ZSBhdCBsZWFzdCBvbmNlLlxuICAgKiBAcGFyYW0gZW50aXRpZXNcbiAgICogQGV4YW1wbGUgRHluYW1pYyBgRVN0b3JlPFRvZG8+YCBDcmVhdGlvbiBcbmBgYFxuLy8gSW5pdGlhbGl6ZSB0aGUgU3RvcmVcbmxldCBzdG9yZTogRVN0b3JlPFRvZG8+ID0gbmV3IEVTdG9yZTxUb2RvPih0b2Rvc0ZhY3RvcnkoKSk7XG5gYGAqL1xuICBjb25zdHJ1Y3RvcihlbnRpdGllczogRVtdID0gW10sIGNvbmZpZz86IFN0b3JlQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLklOVElBTElaRSwgZW50cmllczogZW50aXRpZXMgfTtcbiAgICB0aGlzLnBvc3QoZW50aXRpZXMpXG4gICAgdGhpcy5ub3RpZnlEZWx0YS5uZXh0KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBjb21wbGV0ZSBvbiBhbGwge0BsaW5rIEJlaGF2aW9yU3ViamVjdH0gaW5zdGFuY2VzLlxuICAgKiBcbiAgICogQ2FsbCBkZXN0cm95IHdoZW4gZGlzcG9zaW5nIG9mIHRoZSBzdG9yZS5cbiAgICovXG4gIG92ZXJyaWRlIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpXG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLmNvbXBsZXRlKClcbiAgICB0aGlzLm5vdGlmeUFjdGl2ZS5jb21wbGV0ZSgpXG4gICAgdGhpcy5zbGljZXMuZm9yRWFjaChzbGljZSA9PiBzbGljZS5kZXN0cm95KCkpXG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZW50aXR5OlxuICAgKiBcbiAgICogSWYgdGhlIHN0b3JlIGNvbnRhaW5zIHRoZSBlbnRpdHlcbiAgICogaXQgd2lsbCBiZSBkZWxldGVkLiAgSWYgdGhlIHN0b3JlIFxuICAgKiBkb2VzIG5vdCBjb250YWlucyB0aGUgZW50aXR5LFxuICAgKiBpdCBpcyBhZGRlZC5cbiAgICogQHBhcmFtIGUgXG4gICAqIEBleGFtcGxlIFRvZ2dsZSB0aGUgYFRvZG9gIGluc3RhbmNlXG5gYGBcbmVzdG9yZS5wb3N0KHRvZG8pO1xuLy8gUmVtb3ZlIHRvZG9cbmVzdG9yZS50b2dnbGUodG9kbyk7XG4vLyBBZGQgaXQgYmFja1xuZXN0b3JlLnRvZ2dsZSh0b2RvKTtcblxuYGBgXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGU6IEUpIHtcbiAgICBpZiAodGhpcy5jb250YWlucyhlKSkge1xuICAgICAgdGhpcy5kZWxldGUoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zdChlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlBY3RpdmUgPSBuZXcgUmVwbGF5U3ViamVjdDxNYXA8c3RyaW5nLCBFPj4oMSk7XG5cblxuICAvKipcbiAgICogYE1hcGAgb2YgYWN0aXZlIGVudHRpZXMuIFRoZSBpbnN0YW5jZSBpcyBwdWJsaWMgYW5kIGNhbiBiZSB1c2VkXG4gICAqIGRpcmVjdGx5IHRvIGFkZCBhbmQgcmVtb3ZlIGFjdGl2ZSBlbnRpdGllcywgaG93ZXZlciB3ZSByZWNvbW1lbmRcbiAgICogdXNpbmcgdGhlIHtAbGluayBhZGRBY3RpdmV9IGFuZCB7QGxpbmsgZGVsZXRlQWN0aXZlfSBtZXRob2RzLlxuICAgKi9cbiAgcHVibGljIGFjdGl2ZTogTWFwPHN0cmluZywgRT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEFkZCBtdWx0aXBsZSBlbnRpdHkgZW50aXRpZXMgdG8gYWN0aXZlLlxuICAgKiBcbiAgICogSWYgdGhlIGVudGl0eSBpcyBub3QgY29udGFpbmVkIGluIHRoZSBzdG9yZSBpdCBpcyBhZGRlZFxuICAgKiB0byB0aGUgc3RvcmUgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIGBhY3RpdmVgLlxuICAgKiBcbiAgICogQWxzbyB3ZSBjbG9uZSB0aGUgbWFwIHByaW9yIHRvIGJyb2FkY2FzdGluZyBpdCB3aXRoXG4gICAqIGBub3RpZnlBY3RpdmVgIHRvIG1ha2Ugc3VyZSB3ZSB3aWxsIHRyaWdnZXIgQW5ndWxhciBcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnMgXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIEFkZCBhIGB0b2RvMWAgYW5kIGB0b2RvMmAgYXMgYWN0aXZlXG5gYGBcbmFkZEFjdGl2ZSh0b2RvMSk7XG5hZGRBY3RpdmUodG9kbzIpO1xuYGBgXG4gICAqL1xuICBwdWJsaWMgYWRkQWN0aXZlKGU6IEUpIHtcbiAgICBpZiAodGhpcy5jb250YWlucyhlKSkge1xuICAgICAgdGhpcy5hY3RpdmUuc2V0KCg8YW55PmUpLmdpZCwgZSk7XG4gICAgICB0aGlzLm5vdGlmeUFjdGl2ZS5uZXh0KG5ldyBNYXAodGhpcy5hY3RpdmUpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnBvc3QoZSk7XG4gICAgICB0aGlzLmFjdGl2ZS5zZXQoKDxhbnk+ZSkuZ2lkLCBlKTtcbiAgICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZW50aXR5IGFzIGFjdGl2ZS5cbiAgICogXG4gICAqIEFsc28gd2UgY2xvbmUgdGhlIG1hcCBwcmlvciB0byBicm9hZGNhc3RpbmcgaXQgd2l0aFxuICAgKiBgbm90aWZ5QWN0aXZlYCB0byBtYWtlIHN1cmUgd2Ugd2lsbCB0cmlnZ2VyIEFuZ3VsYXIgXG4gICAqIGNoYW5nZSBkZXRlY3Rpb24gaW4gdGhlIGV2ZW50IHRoYXQgaXQgbWFpbnRhaW5zIFxuICAgKiBhIHJlZmVyZW5jZSB0byB0aGUgYGFjdGl2ZWAgc3RhdGUgYE1hcGAgaW5zdGFuY2UuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBNYXJrIGEgYHRvZG9gIGluc3RhbmNlIGFzIGFjdGl2ZVxuICBgYGBcbmRlbGV0ZUFjdGl2ZSh0b2RvMSk7XG5kZWxldGVBY3RpdmUodG9kbzIpO1xuICBgYGBcbiAgICovXG4gIHB1YmxpYyBkZWxldGVBY3RpdmUoZTogRSkge1xuICAgIHRoaXMuYWN0aXZlLmRlbGV0ZSgoPGFueT5lKS5naWQpO1xuICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIC8gcmVzZXQgdGhlIGFjdGl2ZSBlbnRpdHkgbWFwLlxuICAgKiBcbiAgICogQWxzbyB3ZSBjbG9uZSB0aGUgbWFwIHByaW9yIHRvIGJyb2FkY2FzdGluZyBpdCB3aXRoXG4gICAqIGBub3RpZnlBY3RpdmVgIHRvIG1ha2Ugc3VyZSB3ZSB3aWxsIHRyaWdnZXIgQW5ndWxhciBcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnMgXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIE1hcmsgYSBgdG9kb2AgaW5zdGFuY2UgYXMgYWN0aXZlXG4gIGBgYFxuZGVsZXRlQWN0aXZlKHRvZG8xKTtcbmRlbGV0ZUFjdGl2ZSh0b2RvMik7XG4gIGBgYFxuICAgKi9cbiAgY2xlYXJBY3RpdmUoKSB7XG4gICAgdGhpcy5hY3RpdmUuY2xlYXIoKTtcbiAgICB0aGlzLm5vdGlmeUFjdGl2ZS5uZXh0KG5ldyBNYXAodGhpcy5hY3RpdmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlIHRoZSBhY3RpdmUgZW50aXR5LlxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgIGxldCBhY3RpdmUkID0gc291cmNlLm9ic2VydmVBY3RpdmUoKTtcbiAgICA8L3ByZT5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVBY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5QWN0aXZlLmFzT2JzZXJ2YWJsZSgpXG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSB0aGUgYWN0aXZlIGVudGl0eS5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgYWN0aXZlJCA9IHNvdXJjZS5hY3RpdmVTbmFwc2hvdCgpO1xuICAgIDwvcHJlPlxuICAqL1xuICAgIHB1YmxpYyBhY3RpdmVTbmFwc2hvdCgpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYWN0aXZlLnZhbHVlcygpKVxuICB9XG5cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMT0FESU5HXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBhIGxvYWQgcmVxdWVzdC5cbiAgICogXG4gICAqIFRoZSBlcnJvciBPYnNlcnZhYmxlIHNob3VsZCBiZSBjcmVhdGVkIGJ5IHRoZSBcbiAgICogY2xpZW50LlxuICAgKi9cbiAgcHVibGljIGxvYWRpbmdFcnJvciE6IE9ic2VydmFibGU8YW55PjtcblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gdGhlIHN0b3JlIGlzIGxvYWRpbmcuXG4gICAqIFxuICAgKiBUaGlzIGlzIGEgY29tbW9uIHBhdHRlcm4gZm91bmQgd2hlbiBpbXBsZW1lbnRpbmdcbiAgICogYE9ic2VydmFibGVgIGRhdGEgc291cmNlcy5cbiAgICovXG4gIHByaXZhdGUgbm90aWZ5TG9hZGluZyA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBsb2FkaW5nIHN0YXRlLiAgVXNlIGxvYWRpbmcgd2hlbiBmZXRjaGluZyBuZXdcbiAgICogZGF0YSBmb3IgdGhlIHN0b3JlLiAgVGhlIGRlZmF1bHQgbG9hZGluZyBzdGF0ZSBpcyBgdHJ1ZWAuXG4gICAqIFxuICAgKiBUaGlzIGlzIHN1Y2ggdGhhdCBpZiBkYXRhIGlzIGZldGNoZWQgYXN5bmNocm9ub3VzbHkgXG4gICAqIGluIGEgc2VydmljZSwgY29tcG9uZW50cyBjYW4gd2FpdCBvbiBsb2FkaW5nIG5vdGlmaWNhdGlvblxuICAgKiBiZWZvcmUgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBkYXRhIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqXG4gICAqIExvYWRpbmcgY291bGQgYmUgYmFzZWQgb24gYSBjb21wb3NpdGUgcmVzcG9uc2UuICBGb3IgZXhhbXBsZVxuICAgKiB3aGVuIHRoZSBzdG9jayBhbmQgbXV0dWFsIGZ1bmRzIGhhdmUgbG9hZGVkLCBzZXQgbG9hZGluZyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgbG9hZGluZyBzdGF0ZSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzLlxuICAgKi9cbiAgc2V0IGxvYWRpbmcobG9hZGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX2xvYWRpbmcgPSBsb2FkaW5nO1xuICAgIHRoaXMubm90aWZ5TG9hZGluZy5uZXh0KHRoaXMuX2xvYWRpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gQSBzbmFwc2hvdCBvZiB0aGUgbG9hZGluZyBzdGF0ZS5cbiAgICovXG4gIGdldCBsb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgbG9hZGluZy5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgbG9hZGluZyQgPSBzb3VyY2Uub2JzZXJ2ZUxvYWRpbmcoKTtcbiAgICA8L3ByZT5cblxuICAgIE5vdGUgdGhhdCB0aGlzIG9idmVyYWJsZSBwaXBlZCB0aHJvdWdoXG4gICAgYHRha2VXaGlsZSh2LT52LCB0cnVlKSwgc3VjaCB0aGF0IGl0IHdpbGwgXG4gICAgY29tcGxldGUgYWZ0ZXIgZWFjaCBlbWlzc2lvbi5cblxuICAgIFNlZTpcbiAgICBodHRwczovL21lZGl1bS5jb20vQG9sZS5lcnNveS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuXG4gICAgRm9yIG1vcmUgZGV0YWlscy5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVMb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm5vdGlmeUxvYWRpbmcuYXNPYnNlcnZhYmxlKCkuXG4gICAgICBwaXBlKHRha2VXaGlsZSh2ID0+IHYsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RmaWllcyB3aGVuIGxvYWRpbmcgaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvYnNlcnZlTG9hZGluZ0NvbXBsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVMb2FkaW5nKCkucGlwZShcbiAgICAgIGZpbHRlcihsb2FkaW5nID0+IGxvYWRpbmcgPT0gZmFsc2UpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mKHRydWUpKSlcbiAgfVxuXG5cblxuXG5cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTRUFSQ0hJTkdcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBhIHNlYXJjaCByZXF1ZXN0LlxuICAgKiBcbiAgICogVGhlIGVycm9yIE9ic2VydmFibGUgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgdGhlIFxuICAgKiBjbGllbnQuXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoRXJyb3IhOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIG9ic2VydmVycyB0aGF0IGEgc2VhcmNoIGlzIGluIHByb2dyZXNzLlxuICAgKiBcbiAgICogVGhpcyBpcyBhIGNvbW1vbiBwYXR0ZXJuIGZvdW5kIHdoZW4gaW1wbGVtZW50aW5nXG4gICAqIGBPYnNlcnZhYmxlYCBkYXRhIHNvdXJjZXMuXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeVNlYXJjaGluZyA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBgc2VhcmNoaW5nYCBzdGF0ZS4gIFVzZSBgc2VhcmNoaW5nYFxuICAgKiBmb3IgZXhhbXBsZSB0byBkaXNwbGF5IGEgc3Bpbm5uZXIgXG4gICAqIHdoZW4gcGVyZm9ybWluZyBhIHNlYXJjaC4gIFxuICAgKiBUaGUgZGVmYXVsdCBgc2VhcmNoaW5nYCBzdGF0ZSBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VhcmNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc2VhcmNoaW5nIHN0YXRlIGFuZCBub3RpZmllcyBvYnNlcnZlcnMuXG4gICAqL1xuICBzZXQgc2VhcmNoaW5nKHNlYXJjaGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlYXJjaGluZyA9IHNlYXJjaGluZztcbiAgICB0aGlzLm5vdGlmeVNlYXJjaGluZy5uZXh0KHRoaXMuX3NlYXJjaGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBzZWFyY2hpbmcgc3RhdGUuXG4gICAqL1xuICBnZXQgc2VhcmNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBzZWFyY2hpbmcuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IHNlYXJjaGluZyQgPSBzb3VyY2Uub2JzZXJ2ZVNlYXJjaGluZygpO1xuICAgIDwvcHJlPlxuICBcbiAgICBOb3RlIHRoYXQgdGhpcyBvYnZlcmFibGUgcGlwZWQgdGhyb3VnaFxuICAgIGB0YWtlV2hpbGUodi0+diwgdHJ1ZSksIHN1Y2ggdGhhdCBpdCB3aWxsIFxuICAgIGNvbXBsZXRlIGFmdGVyIGVhY2ggZW1pc3Npb24uXG4gIFxuICAgIFNlZTpcbiAgICBodHRwczovL21lZGl1bS5jb20vQG9sZS5lcnNveS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuICBcbiAgICBGb3IgbW9yZSBkZXRhaWxzLlxuICAqL1xuICBwdWJsaWMgb2JzZXJ2ZVNlYXJjaGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlTZWFyY2hpbmcuYXNPYnNlcnZhYmxlKCkuXG4gICAgICBwaXBlKHRha2VXaGlsZSh2ID0+IHYsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RmaWllcyB3aGVuIHNlYXJjaGluZyBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG9ic2VydmVTZWFyY2hpbmdDb21wbGV0ZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlU2VhcmNoaW5nKCkucGlwZShcbiAgICAgIGZpbHRlcihzZWFyY2hpbmcgPT4gc2VhcmNoaW5nID09IGZhbHNlKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBvZih0cnVlKSkpXG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgc2xpY2VzXG4gICAqL1xuICBwcml2YXRlIHNsaWNlczogTWFwPHN0cmluZywgU2xpY2U8RT4+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc2xpY2UgdG8gdGhlIHN0b3JlIGFuZCBrZXlzIGl0IGJ5IHRoZSBzbGljZXMgbGFiZWwuXG4gICAqXG4gICAqIEBwYXJhbSBwXG4gICAqIEBwYXJhbSBsYWJlbFxuICAgKiBcbiAgICogQGV4YW1wbGUgU2V0dXAgYSBUb2RvIFNsaWNlIGZvciBDT01QTEVURSBUb2Rvc1xuYGBgXG5zb3VyY2UuYWRkU2xpY2UodG9kbyA9PiB0b2RvLmNvbXBsZXRlLCBUb2RvU2xpY2VzLkNPTVBMRVRFKTtcbmBgYFxuICAgKi9cbiAgYWRkU2xpY2UocDogUHJlZGljYXRlPEU+LCBsYWJlbDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2xpY2U6IFNsaWNlPEU+ID0gbmV3IFNsaWNlKFxuICAgICAgbGFiZWwsXG4gICAgICBwLFxuICAgICAgdGhpcylcbiAgICB0aGlzLnNsaWNlcy5zZXQoc2xpY2UubGFiZWwsIHNsaWNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHNsaWNlXG4gICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgaWRlbnRpZnlpbmcgdGhlIHNsaWNlXG4gICAqIFxuICAgKiBAZXhhbXBsZSBSZW1vdmUgdGhlIFRvZG9TbGljZXMuQ09NUExFVEUgU2xpY2VcbmBgYFxuc291cmNlLnJlbW92ZVNsaWNlKFRvZG9TbGljZXMuQ09NUExFVEUpO1xuYGBgXG4gICAqL1xuICByZW1vdmVTbGljZShsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zbGljZXMuZGVsZXRlKGxhYmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzbGljZVxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIGlkZW50aWZ5aW5nIHRoZSBzbGljZVxuICAgKiBAcmV0dXJuIFRoZSBTbGljZSBpbnN0YW5jZSBvciB1bmRlZmluZWQgXG4gICAqIFxuICAgKiBAZXhhbXBsZSBHZXQgdGhlIFRvZG9TbGljZXMuQ09NUExFVEUgc2xpY2VcbmBgYFxuc291cmNlLmdldFNsaWNlKFRvZG9TbGljZXMuQ09NUExFVEUpO1xuYGBgXG4gICAqL1xuICBnZXRTbGljZShsYWJlbDogc3RyaW5nKTogU2xpY2U8RT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNsaWNlcy5nZXQobGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgKEFkZCBhIG5ldykgZWxlbWVudChzKSB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBlIEFuIGluZGlpZHVhbCBlbnRpdHkgb3IgYW4gYXJyYXkgb2YgZW50aXRpZXNcbiAgICogQGV4YW1wbGUgUG9zdCBhIGB0b2RvYC5cbmBgYFxuc3RvcmUucG9zdCh0b2RvKTtcbmBgYFxuICAgKi9cbiAgcG9zdChlOiBFIHwgRVtdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBjb25zdCBndWlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXVxuICAgICAgICA/ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgIDogR1VJRCgpO1xuICAgICAgKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV0gPSBndWlkO1xuICAgICAgdGhpcy5lbnRyaWVzLnNldChndWlkLCBlKTtcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMucG9zdChlKTtcbiAgICAgIH0pO1xuICAgICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnBvc3RBKGUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgZWxlbWVudHMgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBQb3N0IHR3byBgVG9kb2AgaW5zdGFuY2VzLlxuYGBgXG5zdG9yZS5wb3N0KHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIHBvc3ROKC4uLmU6IEVbXSkge1xuICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IGd1aWQ6IHN0cmluZyA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgID8gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgICAgOiBHVUlEKCk7XG4gICAgICAoPGFueT5lKVt0aGlzLkdVSURfS0VZXSA9IGd1aWQ7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGd1aWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgIH0pO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnBvc3RBKGUpO1xuICAgIH0pO1xuICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBlIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgKEFkZCkgYW4gYXJyYXkgb2YgZWxlbWVudHMgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gZVxuICAgKiBAZXhhbXBsZSBQb3N0IGEgYFRvZG9gIGFycmF5LlxuYGBgXG5zdG9yZS5wb3N0KFt0b2RvMSwgdG9kbzJdKTtcbmBgYFxuICAgKi9cbiAgcG9zdEEoZTogRVtdKSB7XG4gICAgdGhpcy5wb3N0TiguLi5lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgKFVwZGF0ZSkgYW4gZWxlbWVudC5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgUHV0IGEgVG9kbyBpbnN0YW5jZS5cbmBgYFxuc3RvcmUucHV0KHRvZG8xKTtcbmBgYFxuICAgKi9cbiAgcHV0KGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIGxldCBpZDogc3RyaW5nID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGlkLCBlKTtcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICAgIHRoaXMubm90aWZ5Lm5leHQodik7XG4gICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBVVCwgZW50cmllczogW2VdIH07XG4gICAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5wdXQoZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnB1dEEoZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHV0IChVcGRhdGUpIGFuIGVsZW1lbnQgb3IgYWRkIGFuIGVsZW1lbnQgdGhhdCB3YXMgcmVhZCBmcm9tIGEgcGVyc2lzdGVuY2Ugc291cmNlXG4gICAqIGFuZCB0aHVzIGFscmVhZHkgaGFzIGFuIGFzc2lnbmVkIGdsb2JhbCBpZGAuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUucHV0KHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIHB1dE4oLi4uZTogRVtdKSB7XG4gICAgdGhpcy5wdXRBKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCAoVXBkYXRlKSB0aGUgYXJyYXkgb2YgZWxlbWVudHMuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUucHV0KFt0b2RvMSwgdG9kbzJdKTtcbmBgYFxuICAgKi9cbiAgcHV0QShlOiBFW10pIHtcbiAgICBlLmZvckVhY2goZSA9PiB7XG4gICAgICBsZXQgZ3VpZDogc3RyaW5nID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgIHRoaXMuZW50cmllcy5zZXQoZ3VpZCwgZSlcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIHRoaXMubm90aWZ5Lm5leHQodik7XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QVVQsIGVudHJpZXM6IGUgfTtcbiAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnB1dEEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIChVcGRhdGUpIHRoZSBhcnJheSBvZiBlbGVtZW50cy5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgRGVsZXRlIHRvZG8xLlxuYGBgXG5zdG9yZS5kZWxldGUodG9kbzFdKTtcbmBgYFxuICAgKi9cbiAgZGVsZXRlKGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlKGUpO1xuICAgICAgY29uc3QgZ3VpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZW50cmllcy5kZWxldGUoZ3VpZCk7XG4gICAgICB9KTtcbiAgICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZGVsZXRlKGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5kZWxldGVBKGUpXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIE4gZWxlbWVudHMuXG4gICAqIEBwYXJhbSAuLi5lXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUuZGVsZXRlKHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIGRlbGV0ZU4oLi4uZTogRVtdKSB7XG4gICAgdGhpcy5kZWxldGVBKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBOIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBQdXQgVG9kbyBpbnN0YW5jZXMuXG5gYGBcbnN0b3JlLmRlbGV0ZSh0b2RvMSwgdG9kbzIpO1xuYGBgXG4gICAqL1xuICBkZWxldGVBKGU6IEVbXSkge1xuICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlKGUpO1xuICAgICAgY29uc3QgZ3VpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZW50cmllcy5kZWxldGUoZ3VpZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBlIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLmRlbGV0ZUEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGVsZW1lbnRzIGJ5IHtAbGluayBQcmVkaWNhdGV9LlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlLlxuICAgKiBAZXhhbXBsZSBQdXQgVG9kbyBpbnN0YW5jZXMuXG5gYGBcbnN0b3JlLmRlbGV0ZSh0b2RvMSwgdG9kbzIpO1xuYGBgXG4gICAqL1xuICBkZWxldGVQKHA6IFByZWRpY2F0ZTxFPikge1xuICAgIGNvbnN0IGQ6IEVbXSA9IFtdO1xuICAgIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5mb3JFYWNoKGUgPT4ge1xuICAgICAgaWYgKHAoZSkpIHtcbiAgICAgICAgZC5wdXNoKGUpO1xuICAgICAgICBjb25zdCBpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBkIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLmRlbGV0ZUEoZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGVudGl0eSBoYXMgdGhlIGBpZGAga2V5IGluaXRpYWxpemVkIHdpdGggYSB2YWx1ZSxcbiAgICogdGhlbiBhbHNvIGFkZCB0aGUgZW50aXR5IHRvIHRoZSBgaWRFbnRyaWVzYC5cbiAgICpcbiAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVJREVudHJ5KGU6IEUpIHtcbiAgICBpZiAoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKSB7XG4gICAgICB0aGlzLmlkRW50cmllcy5zZXQoKDxhbnk+ZSlbdGhpcy5JRF9LRVldLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGVudGl0eSBoYXMgdGhlIGBpZGAga2V5IGluaXRpYWxpemVkIHdpdGggYSB2YWx1ZSxcbiAgICogdGhlbiBhbHNvIGRlbGV0ZSB0aGUgZW50aXR5IHRvIHRoZSBgaWRFbnRyaWVzYC5cbiAgICpcbiAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVJREVudHJ5KGU6IEUpIHtcbiAgICBpZiAoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKSB7XG4gICAgICB0aGlzLmlkRW50cmllcy5kZWxldGUoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZSBhbmQgYWxsIGNvbnRhaW5lZCBzbGljZSBpbnN0YW5jZXMgdG8gZW1wdHkuXG4gICAqIEFsc28gcGVyZm9ybSBkZWx0YSBub3RpZmljYXRpb24gdGhhdCBzZW5kcyBhbGwgY3VycmVudCBzdG9yZSBlbnRyaWVzLlxuICAgKiBUaGUgQWN0aW9uVHlwZS5SRVNFVCBjb2RlIGlzIHNlbnQgd2l0aCB0aGUgZGVsdGEgbm90aWZpY2F0aW9uLiAgU2xpY2VzXG4gICAqIHNlbmQgdGhlaXIgb3duIGRlbHRhIG5vdGlmaWNhdGlvbi5cbiAgICogXG4gICAqIEBleGFtcGxlIFJlc2V0IHRoZSBzdG9yZS5cbmBgYFxuc3RvcmUucmVzZXQoKTtcbmBgYFxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0ge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUkVTRVQsXG4gICAgICBlbnRyaWVzOiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9O1xuICAgIHRoaXMubm90aWZ5QWxsKFtdLCBkZWx0YSk7XG4gICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnJlc2V0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBhbGwgdGhlIG5vdGlmaWVycyBhdCBvbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gdlxuICAgKiBAcGFyYW0gZGVsdGFcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBub3RpZnlBbGwodjogRVtdLCBkZWx0YTogRGVsdGE8RT4pIHtcbiAgICBzdXBlci5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIHRoaXMubm90aWZ5TG9hZGluZy5uZXh0KHRoaXMubG9hZGluZyk7XG4gIH1cbn0iXX0=
|
668
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi9FU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQTZCLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxPQUFPLE1BQVUsU0FBUSxhQUFnQjtJQUM3Qzs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxZQUFZLFdBQWdCLEVBQUUsRUFBRSxNQUFvQjtRQUNsRCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUEyQ2hCOztXQUVHO1FBQ0ssaUJBQVksR0FBRyxJQUFJLGFBQWEsQ0FBaUIsQ0FBQyxDQUFDLENBQUM7UUFFNUQ7Ozs7V0FJRztRQUNJLFdBQU0sR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQXNHMUM7Ozs7O1dBS0c7UUFDSyxrQkFBYSxHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXREOzs7Ozs7Ozs7O1dBVUc7UUFDSyxhQUFRLEdBQVksSUFBSSxDQUFDO1FBbUhqQzs7Ozs7V0FLRztRQUNLLG9CQUFlLEdBQUcsSUFBSSxhQUFhLENBQVUsQ0FBQyxDQUFDLENBQUM7UUFFeEQ7Ozs7O1dBS0c7UUFDSyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBK0NwQzs7V0FFRztRQUNLLFdBQU0sR0FBMEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQWhXaEQsTUFB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QUFLLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ2dCLFNBQVMsQ0FBQyxDQUFNLEVBQUUsS0FBZTtRQUNsRCxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RTdG9yZSB9IGZyb20gJy4vQWJzdHJhY3RTdG9yZSc7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL1N0b3JlQ29uZmlnJztcbmltcG9ydCB7IEdVSUQgfSBmcm9tICcuL3V0aWxpdGllcyc7XG5cbmltcG9ydCB7IEFjdGlvblR5cGVzLCBQcmVkaWNhdGUsIERlbHRhIH0gZnJvbSAnLi9tb2RlbHMvJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG9mLCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlV2hpbGUsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2xpY2UgfSBmcm9tICcuL1NsaWNlJztcblxuLyoqXG4gKiBUaGlzIGB0b2RvRmFjdG9yeWAgY29kZSB3aWxsIGJlIHVzZWQgdG8gaWxsdXN0cmF0ZSB0aGUgQVBJIGV4YW1wbGVzLiAgVGhlIGZvbGxvd2luZ1xuICogdXRpbGl0aWVzIGFyZSB1c2VkIGluIHRoZSB0ZXN0cyBhbmQgdGhlIEFQSSBUeXBlZG9jIGV4YW1wbGVzIGNvbnRhaW5lZCBoZXJlLlxuICogQGV4YW1wbGUgVXRpbGl0aWVzIGZvciBBUEkgRXhhbXBsZXNcbiAqIGBgYFxuICogZXhwb3J0IGNvbnN0IGVudW0gVG9kb1NsaWNlRW51bSB7XG4gKiAgICBDT01QTEVURSA9IFwiQ29tcGxldGVcIixcbiAqICAgIElOQ09NUExFVEUgPSBcIkluY29tcGxldGVcIlxuICogfVxuICogZXhwb3J0IGNsYXNzIFRvZG8ge1xuICogICAgY29uc3RydWN0b3IoXG4gKiAgICAgICAgIHB1YmxpYyBjb21wbGV0ZTogYm9vbGVhbixcbiAqICAgICAgICAgcHVibGljIHRpdGxlOiBzdHJpbmcsXG4gKiAgICAgICAgIHB1YmxpYyBnaWQ/OnN0cmluZyxcbiAqICAgICAgICAgcHVibGljIGlkPzpzdHJpbmcpIHt9XG4gKiB9XG4gKlxuICogZXhwb3J0IGxldCB0b2RvcyA9IFtuZXcgVG9kbyhmYWxzZSwgXCJZb3UgY29tcGxldGUgbWUhXCIpLCBuZXcgVG9kbyh0cnVlLCBcIllvdSBjb21wbGV0ZWQgbWUhXCIpXTtcbiAqXG4gKiBleHBvcnQgZnVuY3Rpb24gdG9kb3NGYWN0b3J5KCk6VG9kb1tdIHtcbiAqICAgcmV0dXJuIFtuZXcgVG9kbyhmYWxzZSwgXCJZb3UgY29tcGxldGUgbWUhXCIpLCBuZXcgVG9kbyh0cnVlLCBcIllvdSBjb21wbGV0ZWQgbWUhXCIpXTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRVN0b3JlPEU+IGV4dGVuZHMgQWJzdHJhY3RTdG9yZTxFPiB7XG4gIC8qKlxuICAgKiBTdG9yZSBjb25zdHJ1Y3RvciAoSW5pdGlhbGl6YXRpb24gd2l0aCBlbGVtZW50IGlzIG9wdGlvbmFsKVxuICAgKlxuICAgKiBwZXJmb3JtIGluaXRpYWwgbm90aWZpY2F0aW9uIHRvIGFsbCBvYnNlcnZlcnMsXG4gICAqIHN1Y2ggdGhhdCBmdW5jdGlvbnMgbGlrZSB7QGxpbmsgY29tYmluZUxhdGVzdH17fVxuICAgKiB3aWxsIGV4ZWN1dGUgYXQgbGVhc3Qgb25jZS5cbiAgICogXG4gICAqIEBwYXJhbSBlbnRpdGllcyBUaGUgZW50aXRpZXMgdG8gaW5pdGlhbGl6ZSB0aGUgc3RvcmUgd2l0aC5cbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIEVTdG9yZTxUb2RvPiBDcmVhdGlvblxuICAgKiBgYGBcbiAgICogLy8gSW5pdGlhbGl6ZSB0aGUgU3RvcmVcbiAgICogbGV0IHN0b3JlOiBFU3RvcmU8VG9kbz4gPSBuZXcgRVN0b3JlPFRvZG8+KHRvZG9zRmFjdG9yeSgpKTtcbiAgICogYGBgXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbnRpdGllczogRVtdID0gW10sIGNvbmZpZz86IFN0b3JlQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLklOVElBTElaRSwgZW50cmllczogZW50aXRpZXMgfTtcbiAgICB0aGlzLnBvc3QoZW50aXRpZXMpO1xuICAgIHRoaXMubm90aWZ5RGVsdGEubmV4dChkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgY29tcGxldGUgb24gYWxsIEVTdG9yZSB7QGxpbmsgUmVwbGF5U3ViamVjdH0gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBDYWxsIGRlc3Ryb3kgd2hlbiBkaXNwb3Npbmcgb2YgdGhlIHN0b3JlLlxuICAgKi9cbiAgb3ZlcnJpZGUgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5ub3RpZnlBY3RpdmUuY29tcGxldGUoKTtcbiAgICB0aGlzLnNsaWNlcy5mb3JFYWNoKChzbGljZSkgPT4gc2xpY2UuZGVzdHJveSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBlbnRpdHk6XG4gICAqXG4gICAqIElmIHRoZSBzdG9yZSBjb250YWlucyB0aGUgZW50aXR5XG4gICAqIGl0IHdpbGwgYmUgZGVsZXRlZC4gIElmIHRoZSBzdG9yZVxuICAgKiBkb2VzIG5vdCBjb250YWlucyB0aGUgZW50aXR5LFxuICAgKiBpdCBpcyBhZGRlZC5cbiAgICogQHBhcmFtIGUgVGhlIGVudGl0eSB0byB0b2dnbGVcbiAgICogQGV4YW1wbGUgVG9nZ2xlIHRoZSBUb2RvIGluc3RhbmNlXG4gICAqIGBgYFxuICAgKiBlc3RvcmUucG9zdCh0b2RvKTtcbiAgICogLy8gUmVtb3ZlIHRvZG9cbiAgICogZXN0b3JlLnRvZ2dsZSh0b2RvKTtcbiAgICogLy8gQWRkIGl0IGJhY2tcbiAgICogZXN0b3JlLnRvZ2dsZSh0b2RvKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGU6IEUpIHtcbiAgICBpZiAodGhpcy5jb250YWlucyhlKSkge1xuICAgICAgdGhpcy5kZWxldGUoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zdChlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlBY3RpdmUgPSBuZXcgUmVwbGF5U3ViamVjdDxNYXA8c3RyaW5nLCBFPj4oMSk7XG5cbiAgLyoqXG4gICAqIGBNYXBgIG9mIGFjdGl2ZSBlbnR0aWVzLiBUaGUgaW5zdGFuY2UgaXMgcHVibGljIGFuZCBjYW4gYmUgdXNlZFxuICAgKiBkaXJlY3RseSB0byBhZGQgYW5kIHJlbW92ZSBhY3RpdmUgZW50aXRpZXMsIGhvd2V2ZXIgd2UgcmVjb21tZW5kXG4gICAqIHVzaW5nIHRoZSB7QGxpbmsgYWRkQWN0aXZlfSBhbmQge0BsaW5rIGRlbGV0ZUFjdGl2ZX0gbWV0aG9kcy5cbiAgICovXG4gIHB1YmxpYyBhY3RpdmU6IE1hcDxzdHJpbmcsIEU+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBZGQgbXVsdGlwbGUgZW50aXR5IGVudGl0aWVzIHRvIGFjdGl2ZS5cbiAgICpcbiAgICogSWYgdGhlIGVudGl0eSBpcyBub3QgY29udGFpbmVkIGluIHRoZSBzdG9yZSBpdCBpcyBhZGRlZFxuICAgKiB0byB0aGUgc3RvcmUgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIGBhY3RpdmVgLlxuICAgKlxuICAgKiBBbHNvIHdlIGNsb25lIHRoZSBtYXAgcHJpb3IgdG8gYnJvYWRjYXN0aW5nIGl0IHdpdGhcbiAgICogYG5vdGlmeUFjdGl2ZWAgdG8gbWFrZSBzdXJlIHdlIHdpbGwgdHJpZ2dlciBBbmd1bGFyXG4gICAqIGNoYW5nZSBkZXRlY3Rpb24gaW4gdGhlIGV2ZW50IHRoYXQgaXQgbWFpbnRhaW5zXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGV4YW1wbGUgQWRkIHRvZG8xIGFuZCB0b2RvMiBhcyBhY3RpdmVcbiAgICogYGBgXG4gICAqIGFkZEFjdGl2ZSh0b2RvMSk7XG4gICAqIGFkZEFjdGl2ZSh0b2RvMik7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFkZEFjdGl2ZShlOiBFKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbnMoZSkpIHtcbiAgICAgIHRoaXMuYWN0aXZlLnNldCgoPGFueT5lKS5naWQsIGUpO1xuICAgICAgdGhpcy5ub3RpZnlBY3RpdmUubmV4dChuZXcgTWFwKHRoaXMuYWN0aXZlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zdChlKTtcbiAgICAgIHRoaXMuYWN0aXZlLnNldCgoPGFueT5lKS5naWQsIGUpO1xuICAgICAgdGhpcy5ub3RpZnlBY3RpdmUubmV4dChuZXcgTWFwKHRoaXMuYWN0aXZlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBhY3RpdmUgZW50aXR5LlxuICAgKlxuICAgKiBBbHNvIHdlIGNsb25lIHRoZSBtYXAgcHJpb3IgdG8gYnJvYWRjYXN0aW5nIGl0IHdpdGhcbiAgICogYG5vdGlmeUFjdGl2ZWAgdG8gbWFrZSBzdXJlIHdlIHdpbGwgdHJpZ2dlciBBbmd1bGFyXG4gICAqIGNoYW5nZSBkZXRlY3Rpb24gaW4gdGhlIGV2ZW50IHRoYXQgaXQgbWFpbnRhaW5zXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGV4YW1wbGUgUmVtb3ZlIHRvZG8xIGFuZCB0b2RvMiBhcyBhY3RpdmUgZW50aXRpZXNcbiAgICogYGBgXG4gICAqIGRlbGV0ZUFjdGl2ZSh0b2RvMSk7XG4gICAqIGRlbGV0ZUFjdGl2ZSh0b2RvMik7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUFjdGl2ZShlOiBFKSB7XG4gICAgdGhpcy5hY3RpdmUuZGVsZXRlKCg8YW55PmUpLmdpZCk7XG4gICAgdGhpcy5ub3RpZnlBY3RpdmUubmV4dChuZXcgTWFwKHRoaXMuYWN0aXZlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgLyByZXNldCB0aGUgYWN0aXZlIGVudGl0eSBtYXAuXG4gICAqXG4gICAqIEFsc28gd2UgY2xvbmUgdGhlIG1hcCBwcmlvciB0byBicm9hZGNhc3RpbmcgaXQgd2l0aFxuICAgKiBgbm90aWZ5QWN0aXZlYCB0byBtYWtlIHN1cmUgd2Ugd2lsbCB0cmlnZ2VyIEFuZ3VsYXJcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnNcbiAgICogYSByZWZlcmVuY2UgdG8gdGhlIGBhY3RpdmVgIHN0YXRlIGBNYXBgIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBDbGVhciBhY3RpdmUgdG9kbyBpbnN0YW5jZXNcbiAgICogYGBgXG4gICAqIHN0b3JlLmNsZWFyQWN0aXZlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgY2xlYXJBY3RpdmUoKSB7XG4gICAgdGhpcy5hY3RpdmUuY2xlYXIoKTtcbiAgICB0aGlzLm5vdGlmeUFjdGl2ZS5uZXh0KG5ldyBNYXAodGhpcy5hY3RpdmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlIHRoZSBhY3RpdmUgZW50aXRpZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBsZXQgYWN0aXZlJCA9IHN0b3JlLm9ic2VydmVBY3RpdmUoKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZUFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlBY3RpdmUuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSB0aGUgYWN0aXZlIGVudGl0eS5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgYWN0aXZlJCA9IHNvdXJjZS5hY3RpdmVTbmFwc2hvdCgpO1xuICAgIDwvcHJlPlxuICAqL1xuICBwdWJsaWMgYWN0aXZlU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5hY3RpdmUudmFsdWVzKCkpO1xuICB9XG5cbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTE9BRElOR1xuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgYSBsb2FkIHJlcXVlc3QuXG4gICAqXG4gICAqIFRoZSBlcnJvciBPYnNlcnZhYmxlIHNob3VsZCBiZSBjcmVhdGVkIGJ5IHRoZVxuICAgKiBjbGllbnQuXG4gICAqL1xuICBwdWJsaWMgbG9hZGluZ0Vycm9yITogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgd2hlbiB0aGUgc3RvcmUgaXMgbG9hZGluZy5cbiAgICpcbiAgICogVGhpcyBpcyBhIGNvbW1vbiBwYXR0ZXJuIGZvdW5kIHdoZW4gaW1wbGVtZW50aW5nXG4gICAqIGBPYnNlcnZhYmxlYCBkYXRhIHNvdXJjZXMuXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeUxvYWRpbmcgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgbG9hZGluZyBzdGF0ZS4gIFVzZSBsb2FkaW5nIHdoZW4gZmV0Y2hpbmcgbmV3XG4gICAqIGRhdGEgZm9yIHRoZSBzdG9yZS4gIFRoZSBkZWZhdWx0IGxvYWRpbmcgc3RhdGUgaXMgYHRydWVgLlxuICAgKlxuICAgKiBUaGlzIGlzIHN1Y2ggdGhhdCBpZiBkYXRhIGlzIGZldGNoZWQgYXN5bmNocm9ub3VzbHlcbiAgICogaW4gYSBzZXJ2aWNlLCBjb21wb25lbnRzIGNhbiB3YWl0IG9uIGxvYWRpbmcgbm90aWZpY2F0aW9uXG4gICAqIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIGRhdGEgZnJvbSB0aGUgc2VydmljZS5cbiAgICpcbiAgICogTG9hZGluZyBjb3VsZCBiZSBiYXNlZCBvbiBhIGNvbXBvc2l0ZSByZXNwb25zZS4gIEZvciBleGFtcGxlXG4gICAqIHdoZW4gdGhlIHN0b2NrIGFuZCBtdXR1YWwgZnVuZHMgaGF2ZSBsb2FkZWQsIHNldCBsb2FkaW5nIHRvIGBmYWxzZWAuXG4gICAqL1xuICBwcml2YXRlIF9sb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBsb2FkaW5nIHN0YXRlIGFuZCBub3RpZmllcyBvYnNlcnZlcnMuXG4gICAqL1xuICBzZXQgbG9hZGluZyhsb2FkaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbG9hZGluZyA9IGxvYWRpbmc7XG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLm5leHQodGhpcy5fbG9hZGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBsb2FkaW5nIHN0YXRlLlxuICAgKiBAZXhhbXBsZSBDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhlIGxvYWRpbmcgc3RhdGVcbiAgICogYGBgXG4gICAqIGNvbnN0IGxvYWRpbmc6Ym9vbGVhbiA9IHRvZG9TdG9yZS5sb2FkaW5nO1xuICAgKiBgYGBcbiAgICovXG4gIGdldCBsb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgbG9hZGluZy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgb2J2ZXJhYmxlIHBpcGVkIHRocm91Z2hcbiAgICogYHRha2VXaGlsZSh2LT52LCB0cnVlKSwgc3VjaCB0aGF0IGl0IHdpbGxcbiAgICogY29tcGxldGUgYWZ0ZXIgZWFjaCBlbWlzc2lvbi5cbiAgICpcbiAgICogU2VlOlxuICAgKiBodHRwczovL2ZpcmVmbHlzZW1hbnRpY3MubWVkaXVtLmNvbS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuICAgKlxuICAgKiBGb3IgbW9yZSBkZXRhaWxzLlxuICAgKiBBbHNvIG5vdGUgdGhhdCB2PT52IGlzIHRoZSBzYW1lIGFzIHY9PnYhPWZhbHNlXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogY29uc3Qgb2JzZXJ2ZUxvYWRpbmdIYW5kbGVyOiBPYnNlcnZlcjxib29sZWFuPiA9IHtcbiAgICogICBjb21wbGV0ZTogKCkgPT4ge1xuICAgKiAgICAgY29uc29sZS5sb2coYERhdGEgTG9hZGVkIGFuZCBPYnNlcnZhYmxlIE1hcmtlZCBhcyBDb21wbGV0ZWApO1xuICAgKiAgIH0sIC8vIGNvbXBsZXRlSGFuZGxlclxuICAgKiAgIGVycm9yOiAoKSA9PiB7XG4gICAqICAgICBjb25zb2xlLmxvZyhgQW55IEVycm9ycz9gKTtcbiAgICogICB9LCAvLyBlcnJvckhhbmRsZXJcbiAgICogICBuZXh0OiAobCkgPT4ge1xuICAgKiAgICAgY29uc29sZS5sb2coYERhdGEgbG9hZGVkIGFuZCBsb2FkaW5nIGlzICR7bH1gKTtcbiAgICogICB9LFxuICAgKiB9O1xuICAgKlxuICAgKiBjb25zdCBvYnNlcnZlTG9hZGluZ1Jlc3Vic2NyaWJlSGFuZGxlcjogT2JzZXJ2ZXI8Ym9vbGVhbj4gPSB7XG4gICAqICAgY29tcGxldGU6ICgpID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKGBEYXRhIExvYWRlZCBhbmQgUmVzdWJzY3JpYmUgT2JzZXJ2YWJsZSBNYXJrZWQgYXMgQ29tcGxldGVgKTtcbiAgICogICB9LCAvLyBjb21wbGV0ZUhhbmRsZXJcbiAgICogICBlcnJvcjogKCkgPT4ge1xuICAgKiAgICAgY29uc29sZS5sb2coYEFueSBSZXN1YnNjcmliZSBFcnJvcnM/YCk7XG4gICAqICAgfSwgLy8gZXJyb3JIYW5kbGVyXG4gICAqICAgbmV4dDogKGwpID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKGBEYXRhIGxvYWRlZCBhbmQgcmVzdXNic2NyaWJlIGxvYWRpbmcgIHZhbHVlIGlzICR7bH1gKTtcbiAgICogICB9LFxuICAgKiB9O1xuICAgKlxuICAgKiBjb25zdCB0b2RvU3RvcmU6IEVTdG9yZTxUb2RvPiA9IG5ldyBFU3RvcmUoKTtcbiAgICogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKiAvLyBMb2FkaW5nIGlzIHRydWUgYnkgZGVmYXVsdFxuICAgKiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqIGNvbnNvbGUubG9nKGBUaGUgaW5pdGlhbCB2YWx1ZSBvZiBsb2FkaW5nIGlzICR7dG9kb1N0b3JlLmxvYWRpbmd9YCk7XG4gICAqIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICogLy8gT2JzZXJ2ZSBMb2FkaW5nXG4gICAqIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICogbGV0IGxvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdG9kb1N0b3JlLm9ic2VydmVMb2FkaW5nKCk7XG4gICAqIGxvYWRpbmckLnN1YnNjcmliZSgobCkgPT4gY29uc29sZS5sb2coYFRoZSB2YWx1ZSBvZiBsb2FkaW5nIGlzICR7bH1gKSk7XG4gICAqXG4gICAqIHRvZG9TdG9yZS5sb2FkaW5nID0gZmFsc2U7XG4gICAqIGxvYWRpbmckLnN1YnNjcmliZShvYnNlcnZlTG9hZGluZ0hhbmRsZXIpO1xuICAgKiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqIC8vIFRoZSBzdWJzY3JpcHRpb24gbm8gbG9uZ2VyIGZpcmVzXG4gICAqIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICogdG9kb1N0b3JlLmxvYWRpbmcgPSB0cnVlO1xuICAgKiB0b2RvU3RvcmUubG9hZGluZyA9IGZhbHNlO1xuICAgKlxuICAgKiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqIC8vIFRoZSBzdWJzY3JpcHRpb24gbm8gbG9uZ2VyIGZpcmVzLFxuICAgKiAvLyBzbyBpZiB3ZSB3YW50IHRvIG9ic2VydmUgbG9hZGluZyBhZ2FpblxuICAgKiAvLyByZXN1c2JzY3JpYmUuXG4gICAqIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICogdG9kb1N0b3JlLmxvYWRpbmcgPSB0cnVlO1xuICAgKiBsb2FkaW5nJCA9IHRvZG9TdG9yZS5vYnNlcnZlTG9hZGluZygpO1xuICAgKiBsb2FkaW5nJC5zdWJzY3JpYmUob2JzZXJ2ZUxvYWRpbmdSZXN1YnNjcmliZUhhbmRsZXIpO1xuICAgKiB0b2RvU3RvcmUubG9hZGluZyA9IGZhbHNlO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBvYnNlcnZlTG9hZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlMb2FkaW5nLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVdoaWxlKCh2KSA9PiB2LCB0cnVlKSk7XG4gIH1cblxuICAvKipcbiAgICogTm90ZmlpZXMgd2hlbiBsb2FkaW5nIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZUxvYWRpbmdDb21wbGV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlTG9hZGluZygpLnBpcGUoXG4gICAgICBmaWx0ZXIoKGxvYWRpbmcpID0+IGxvYWRpbmcgPT0gZmFsc2UpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mKHRydWUpKVxuICAgICk7XG4gIH1cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTRUFSQ0hJTkdcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBhIHNlYXJjaCByZXF1ZXN0LlxuICAgKlxuICAgKiBUaGUgZXJyb3IgT2JzZXJ2YWJsZSBzaG91bGQgYmUgY3JlYXRlZCBieSB0aGVcbiAgICogY2xpZW50LlxuICAgKi9cbiAgcHVibGljIHNlYXJjaEVycm9yITogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgdGhhdCBhIHNlYXJjaCBpcyBpbiBwcm9ncmVzcy5cbiAgICpcbiAgICogVGhpcyBpcyBhIGNvbW1vbiBwYXR0ZXJuIGZvdW5kIHdoZW4gaW1wbGVtZW50aW5nXG4gICAqIGBPYnNlcnZhYmxlYCBkYXRhIHNvdXJjZXMuXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeVNlYXJjaGluZyA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBgc2VhcmNoaW5nYCBzdGF0ZS4gIFVzZSBgc2VhcmNoaW5nYFxuICAgKiBmb3IgZXhhbXBsZSB0byBkaXNwbGF5IGEgc3Bpbm5uZXJcbiAgICogd2hlbiBwZXJmb3JtaW5nIGEgc2VhcmNoLlxuICAgKiBUaGUgZGVmYXVsdCBgc2VhcmNoaW5nYCBzdGF0ZSBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VhcmNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc2VhcmNoaW5nIHN0YXRlIGFuZCBub3RpZmllcyBvYnNlcnZlcnMuXG4gICAqL1xuICBzZXQgc2VhcmNoaW5nKHNlYXJjaGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlYXJjaGluZyA9IHNlYXJjaGluZztcbiAgICB0aGlzLm5vdGlmeVNlYXJjaGluZy5uZXh0KHRoaXMuX3NlYXJjaGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBzZWFyY2hpbmcgc3RhdGUuXG4gICAqL1xuICBnZXQgc2VhcmNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBzZWFyY2hpbmcuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IHNlYXJjaGluZyQgPSBzb3VyY2Uub2JzZXJ2ZVNlYXJjaGluZygpO1xuICAgIDwvcHJlPlxuICBcbiAgICBOb3RlIHRoYXQgdGhpcyBvYnZlcmFibGUgcGlwZWQgdGhyb3VnaFxuICAgIGB0YWtlV2hpbGUodi0+diwgdHJ1ZSksIHN1Y2ggdGhhdCBpdCB3aWxsIFxuICAgIGNvbXBsZXRlIGFmdGVyIGVhY2ggZW1pc3Npb24uXG4gIFxuICAgIFNlZTpcbiAgICBodHRwczovL21lZGl1bS5jb20vQG9sZS5lcnNveS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuICBcbiAgICBGb3IgbW9yZSBkZXRhaWxzLlxuICAqL1xuICBwdWJsaWMgb2JzZXJ2ZVNlYXJjaGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlTZWFyY2hpbmcuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlV2hpbGUoKHYpID0+IHYsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RmaWllcyB3aGVuIHNlYXJjaGluZyBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG9ic2VydmVTZWFyY2hpbmdDb21wbGV0ZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlU2VhcmNoaW5nKCkucGlwZShcbiAgICAgIGZpbHRlcigoc2VhcmNoaW5nKSA9PiBzZWFyY2hpbmcgPT0gZmFsc2UpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mKHRydWUpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgc2xpY2VzXG4gICAqL1xuICBwcml2YXRlIHNsaWNlczogTWFwPHN0cmluZywgU2xpY2U8RT4+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc2xpY2UgdG8gdGhlIHN0b3JlIGFuZCBrZXlzIGl0IGJ5IHRoZSBzbGljZXMgbGFiZWwuXG4gICAqXG4gICAqIEBwYXJhbSBwXG4gICAqIEBwYXJhbSBsYWJlbFxuICAgKiBcbiAgICogQGV4YW1wbGUgU2V0dXAgYSBUb2RvIFNsaWNlIGZvciBDT01QTEVURSBUb2Rvc1xuYGBgXG5zb3VyY2UuYWRkU2xpY2UodG9kbyA9PiB0b2RvLmNvbXBsZXRlLCBUb2RvU2xpY2VzLkNPTVBMRVRFKTtcbmBgYFxuICAgKi9cbiAgYWRkU2xpY2UocDogUHJlZGljYXRlPEU+LCBsYWJlbDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2xpY2U6IFNsaWNlPEU+ID0gbmV3IFNsaWNlKGxhYmVsLCBwLCB0aGlzKTtcbiAgICB0aGlzLnNsaWNlcy5zZXQoc2xpY2UubGFiZWwsIHNsaWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzbGljZVxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIGlkZW50aWZ5aW5nIHRoZSBzbGljZVxuICAgKiBcbiAgICogQGV4YW1wbGUgUmVtb3ZlIHRoZSBUb2RvU2xpY2VzLkNPTVBMRVRFIFNsaWNlXG5gYGBcbnNvdXJjZS5yZW1vdmVTbGljZShUb2RvU2xpY2VzLkNPTVBMRVRFKTtcbmBgYFxuICAgKi9cbiAgcmVtb3ZlU2xpY2UobGFiZWw6IHN0cmluZykge1xuICAgIHRoaXMuc2xpY2VzLmRlbGV0ZShsYWJlbCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2xpY2VcbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBpZGVudGlmeWluZyB0aGUgc2xpY2VcbiAgICogQHJldHVybiBUaGUgU2xpY2UgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIFxuICAgKiBcbiAgICogQGV4YW1wbGUgR2V0IHRoZSBUb2RvU2xpY2VzLkNPTVBMRVRFIHNsaWNlXG5gYGBcbnNvdXJjZS5nZXRTbGljZShUb2RvU2xpY2VzLkNPTVBMRVRFKTtcbmBgYFxuICAgKi9cbiAgZ2V0U2xpY2UobGFiZWw6IHN0cmluZyk6IFNsaWNlPEU+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZXMuZ2V0KGxhYmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0IChBZGQgYSBuZXcpIGVsZW1lbnQocykgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gZSBBbiBpbmRpaWR1YWwgZW50aXR5IG9yIGFuIGFycmF5IG9mIGVudGl0aWVzXG4gICAqIEBleGFtcGxlIFBvc3QgYSBUb2RvIGluc3RhbmNlLlxuICAgKlxuICAgKmBgYFxuICAgKiBzdG9yZS5wb3N0KHRvZG8pO1xuICAgKmBgYFxuICAgKi9cbiAgcG9zdChlOiBFIHwgRVtdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBjb25zdCBndWlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXVxuICAgICAgICA/ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgIDogR1VJRCgpO1xuICAgICAgKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV0gPSBndWlkO1xuICAgICAgdGhpcy5lbnRyaWVzLnNldChndWlkLCBlKTtcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgcy5wb3N0KGUpO1xuICAgICAgfSk7XG4gICAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBPU1QsIGVudHJpZXM6IFtlXSB9O1xuICAgICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBvc3RBKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0IE4gZW50aXRpZXMgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBQb3N0IHR3byBUb2RvIGluc3RhbmNlcy5cbiAgICogYGBgXG4gICAqIHN0b3JlLnBvc3QodG9kbzEsIHRvZG8yKTtcbiAgICogYGBgXG4gICAqL1xuICBwb3N0TiguLi5lOiBFW10pIHtcbiAgICBlLmZvckVhY2goKGUpID0+IHtcbiAgICAgIGNvbnN0IGd1aWQ6IHN0cmluZyA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgID8gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgICAgOiBHVUlEKCk7XG4gICAgICAoPGFueT5lKVt0aGlzLkdVSURfS0VZXSA9IGd1aWQ7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGd1aWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgIH0pO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2goKHMpID0+IHtcbiAgICAgIHMucG9zdEEoZSk7XG4gICAgfSk7XG4gICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBPU1QsIGVudHJpZXM6IGUgfTtcbiAgICB0aGlzLm5vdGlmeUFsbCh2LCBkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogUG9zdCAoQWRkKSBhbiBhcnJheSBvZiBlbGVtZW50cyB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFBvc3QgYSBUb2RvIGFycmF5LlxuICAgKlxuICAgKiBgYGBcbiAgICogc3RvcmUucG9zdChbdG9kbzEsIHRvZG8yXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcG9zdEEoZTogRVtdKSB7XG4gICAgdGhpcy5wb3N0TiguLi5lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgKFVwZGF0ZSkgYW4gZW50aXR5LlxuICAgKiBAcGFyYW0gZVxuICAgKiBAZXhhbXBsZSBQdXQgYSBUb2RvIGluc3RhbmNlLlxuICAgKiBgYGBcbiAgICogc3RvcmUucHV0KHRvZG8xKTtcbiAgICogYGBgXG4gICAqL1xuICBwdXQoZTogRSB8IEVbXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgbGV0IGlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoaWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgdGhpcy5ub3RpZnkubmV4dCh2KTtcbiAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuUFVULCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5RGVsdGEubmV4dChkZWx0YSk7XG4gICAgICBBcnJheS5mcm9tKHRoaXMuc2xpY2VzLnZhbHVlcygpKS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgIHMucHV0KGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHV0QShlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHV0IChVcGRhdGUpIGFuIGVsZW1lbnQgb3IgYWRkIGFuIGVsZW1lbnQgdGhhdCB3YXMgcmVhZCBmcm9tIGEgcGVyc2lzdGVuY2Ugc291cmNlXG4gICAqIGFuZCB0aHVzIGFscmVhZHkgaGFzIGFuIGFzc2lnbmVkIGdsb2JhbCBpZGAuXG4gICAqIEBwYXJhbSBlIFRoZSBlbmV0aXR5IGluc3RhbmNlcyB0byB1cGRhdGUuXG4gICAqIEBleGFtcGxlIFB1dCBOIFRvZG8gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBgYGBcbiAgICogc3RvcmUucHV0KHRvZG8xLCB0b2RvMik7XG4gICAqIGBgYFxuICAgKi9cbiAgcHV0TiguLi5lOiBFW10pIHtcbiAgICB0aGlzLnB1dEEoZSk7XG4gIH1cblxuICAvKipcbiAgICogUHV0IChVcGRhdGUpIHRoZSBhcnJheSBvZiBlbm50aXRpZXMuXG4gICAqIEBwYXJhbSBlIFRoZSBhcnJheSBvZiBlbm50aXRpZXMgdG8gdXBkYXRlXG4gICAqIEBleGFtcGxlIFB1dCBhbiBhcnJheSBvZiBUb2RvIGluc3RhbmNlcy5cbiAgICogYGBgXG4gICAqIHN0b3JlLnB1dChbdG9kbzEsIHRvZG8yXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHV0QShlOiBFW10pIHtcbiAgICBlLmZvckVhY2goKGUpID0+IHtcbiAgICAgIGxldCBndWlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoZ3VpZCwgZSk7XG4gICAgICB0aGlzLnVwZGF0ZUlERW50cnkoZSk7XG4gICAgfSk7XG4gICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICB0aGlzLm5vdGlmeS5uZXh0KHYpO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuUFVULCBlbnRyaWVzOiBlIH07XG4gICAgdGhpcy5ub3RpZnlEZWx0YS5uZXh0KGRlbHRhKTtcbiAgICBBcnJheS5mcm9tKHRoaXMuc2xpY2VzLnZhbHVlcygpKS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBzLnB1dEEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIChVcGRhdGUpIHRoZSBhcnJheSBvZiBlbGVtZW50cy5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgRGVsZXRlIHRvZG8xLlxuICAgKiBgYGBcbiAgICogc3RvcmUuZGVsZXRlKHRvZG8xXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZGVsZXRlKGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlKGUpO1xuICAgICAgY29uc3QgZ3VpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIH0pO1xuICAgICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5ERUxFVEUsIGVudHJpZXM6IFtlXSB9O1xuICAgICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaCgocykgPT4ge1xuICAgICAgICBzLmRlbGV0ZShlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlbGV0ZUEoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBOIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBEZWxldGUgTiBUb2RvIGluc3RhbmNlIGFyZ3VtZW50LlxuICAgKiBgYGBcbiAgICogc3RvcmUuZGVsZXRlTih0b2RvMSwgdG9kbzIpO1xuICAgKiBgYGBcbiAgICovXG4gIGRlbGV0ZU4oLi4uZTogRVtdKSB7XG4gICAgdGhpcy5kZWxldGVBKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBhcnJheSBvZiBlbGVtZW50cy5cbiAgICogQHBhcmFtIGUgVGhlIGFycmF5IG9mIGluc3RhbmNlcyB0byBiZSBkZWxldGVkXG4gICAqIEBleGFtcGxlIERlbGV0ZSB0aGUgYXJyYXkgb2YgVG9kbyBpbnN0YW5jZXMuXG4gICAqIGBgYFxuICAgKiBzdG9yZS5kZWxldGVBKFt0b2RvMSwgdG9kbzJdKTtcbiAgICogYGBgXG4gICAqL1xuICBkZWxldGVBKGU6IEVbXSkge1xuICAgIGUuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICBjb25zdCBndWlkID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGd1aWQpO1xuICAgICAgdGhpcy5kZWxldGVJREVudHJ5KGUpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaCgocykgPT4ge1xuICAgICAgICBzLmVudHJpZXMuZGVsZXRlKGd1aWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLkRFTEVURSwgZW50cmllczogZSB9O1xuICAgIHRoaXMubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICBBcnJheS5mcm9tKHRoaXMuc2xpY2VzLnZhbHVlcygpKS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBzLmRlbGV0ZUEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGVsZW1lbnRzIGJ5IHtAbGluayBQcmVkaWNhdGV9LlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlLlxuICAgKiBAZXhhbXBsZSBEZWxldGUgdGhlIFRvZG8gaW5zdGFuY2VzLlxuICAgKiBgYGBcbiAgICogc3RvcmUuZGVsZXRlKHRvZG8xLCB0b2RvMik7XG4gICAqIGBgYFxuICAgKi9cbiAgZGVsZXRlUChwOiBQcmVkaWNhdGU8RT4pIHtcbiAgICBjb25zdCBkOiBFW10gPSBbXTtcbiAgICBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgaWYgKHAoZSkpIHtcbiAgICAgICAgZC5wdXNoKGUpO1xuICAgICAgICBjb25zdCBpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBkIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2goKHMpID0+IHtcbiAgICAgIHMuZGVsZXRlQShkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZW50aXR5IGhhcyB0aGUgYGlkYCBrZXkgaW5pdGlhbGl6ZWQgd2l0aCBhIHZhbHVlLFxuICAgKiB0aGVuIGFsc28gYWRkIHRoZSBlbnRpdHkgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKlxuICAgKiBAcGFyYW0gZSBUaGUgZWxlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYGlkRW50cmllc2AuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUlERW50cnkoZTogRSkge1xuICAgIGlmICgoPGFueT5lKVt0aGlzLklEX0tFWV0pIHtcbiAgICAgIHRoaXMuaWRFbnRyaWVzLnNldCgoPGFueT5lKVt0aGlzLklEX0tFWV0sIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZW50aXR5IGhhcyB0aGUgYGlkYCBrZXkgaW5pdGlhbGl6ZWQgd2l0aCBhIHZhbHVlLFxuICAgKiB0aGVuIGFsc28gZGVsZXRlIHRoZSBlbnRpdHkgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKlxuICAgKiBAcGFyYW0gZSBUaGUgZWxlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYGlkRW50cmllc2AuXG4gICAqL1xuICBwcml2YXRlIGRlbGV0ZUlERW50cnkoZTogRSkge1xuICAgIGlmICgoPGFueT5lKVt0aGlzLklEX0tFWV0pIHtcbiAgICAgIHRoaXMuaWRFbnRyaWVzLmRlbGV0ZSgoPGFueT5lKVt0aGlzLklEX0tFWV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHN0b3JlIGFuZCBhbGwgY29udGFpbmVkIHNsaWNlIGluc3RhbmNlcyB0byBlbXB0eS5cbiAgICogQWxzbyBwZXJmb3JtIGRlbHRhIG5vdGlmaWNhdGlvbiB0aGF0IHNlbmRzIGFsbCBjdXJyZW50IHN0b3JlIGVudHJpZXMuXG4gICAqIFRoZSBBY3Rpb25UeXBlLlJFU0VUIGNvZGUgaXMgc2VudCB3aXRoIHRoZSBkZWx0YSBub3RpZmljYXRpb24uICBTbGljZXNcbiAgICogc2VuZCB0aGVpciBvd24gZGVsdGEgbm90aWZpY2F0aW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZSBSZXNldCB0aGUgc3RvcmUuXG4gICAqIGBgYFxuICAgKiBzdG9yZS5yZXNldCgpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlc2V0KCkge1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFU0VULFxuICAgICAgZW50cmllczogQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLFxuICAgIH07XG4gICAgdGhpcy5ub3RpZnlBbGwoW10sIGRlbHRhKTtcbiAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKCk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaCgocykgPT4ge1xuICAgICAgcy5yZXNldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgYWxsIHRoZSBub3RpZmllcnMgYXQgb25jZS5cbiAgICpcbiAgICogQHBhcmFtIHZcbiAgICogQHBhcmFtIGRlbHRhXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbm90aWZ5QWxsKHY6IEVbXSwgZGVsdGE6IERlbHRhPEU+KSB7XG4gICAgc3VwZXIubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICB0aGlzLm5vdGlmeUxvYWRpbmcubmV4dCh0aGlzLmxvYWRpbmcpO1xuICB9XG59XG4iXX0=
|