@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/README.md
CHANGED
@@ -2,15 +2,17 @@
|
|
2
2
|
|
3
3
|
# @fireflysemantics/slice
|
4
4
|
|
5
|
-
##
|
5
|
+
## Table of Contents
|
6
6
|
|
7
7
|
- [Overview](#overview)
|
8
8
|
- [Why Slice](#why-slice)
|
9
9
|
- [Install](#install)
|
10
|
+
- [API Reference](#api-documentation)
|
10
11
|
- [Object Store Core Use Cases](#object-store-core-use-cases)
|
11
12
|
- [Entity Store Core Use Cases](#entity-store-core-use-cases)
|
12
13
|
- [Features](#features)
|
13
|
-
- [Documentatino and Media](#firefly-semantics-slice-development-center-media-and-documentation)
|
14
|
+
- [Help Center Documentatino and Media](#firefly-semantics-slice-development-center-media-and-documentation)
|
15
|
+
- [Getting Help](#getting-help)
|
14
16
|
|
15
17
|
## Overview
|
16
18
|
|
@@ -366,13 +368,43 @@ console.log(
|
|
366
368
|
);
|
367
369
|
|
368
370
|
//============================================
|
369
|
-
// API: count()
|
371
|
+
// API: count() and snapshotCount()
|
370
372
|
//
|
371
|
-
//
|
373
|
+
// Take snapshot and observable
|
374
|
+
// the counts of store entities
|
372
375
|
//============================================
|
373
|
-
|
374
|
-
|
376
|
+
|
377
|
+
const completePredicate: Predicate<Todo> = function pred(t: Todo) {
|
378
|
+
return t.complete;
|
379
|
+
};
|
380
|
+
|
381
|
+
const incompletePredicate: Predicate<Todo> = function pred(t: Todo) {
|
382
|
+
return !t.complete;
|
383
|
+
};
|
384
|
+
|
385
|
+
store.count().subscribe((c) => {
|
386
|
+
console.log(`The observed count of Todo entities is ${c}`);
|
375
387
|
});
|
388
|
+
store.count(incompletePredicate).subscribe((c) => {
|
389
|
+
console.log(`The observed count of incomplete Todo enttiies is ${c}`);
|
390
|
+
});
|
391
|
+
store.count(completePredicate).subscribe((c) => {
|
392
|
+
console.log(`The observed count of complete Todo enttiies is ${c}`);
|
393
|
+
});
|
394
|
+
|
395
|
+
const snapshotCount = store.countSnapshot(completePredicate);
|
396
|
+
console.log(`The count is ${snapshotCount}`);
|
397
|
+
|
398
|
+
const completeSnapshotCount = store.countSnapshot(completePredicate);
|
399
|
+
console.log(
|
400
|
+
`The complete Todo Entity Snapshot count is ${completeSnapshotCount}`
|
401
|
+
);
|
402
|
+
|
403
|
+
const incompleteSnapshotCount = store.countSnapshot(incompletePredicate);
|
404
|
+
console.log(
|
405
|
+
`The incomplete Todo Entity Snapshot count is ${incompleteSnapshotCount}`
|
406
|
+
);
|
407
|
+
|
376
408
|
|
377
409
|
//============================================
|
378
410
|
// API: toggle()
|
@@ -563,11 +595,13 @@ store.isEmpty().subscribe((empty) => {
|
|
563
595
|
- [Minimal Slice Object Store](https://developer.fireflysemantics.com/examples/examples--slice--minimal-slice-object-store)
|
564
596
|
- [Minimal Angular Slice Object Store State Service](https://developer.fireflysemantics.com/examples/examples--slice--minial-angular-slice-object-store-state-service)
|
565
597
|
|
566
|
-
# API
|
598
|
+
# API Reference
|
599
|
+
|
600
|
+
The [Typedoc API Reference](https://fireflysemantics.github.io/slice/typedoc/) includes simple examples of how to apply the API for the various stores, methods, and classes included.
|
567
601
|
|
568
|
-
|
602
|
+
## Getting Help
|
569
603
|
|
570
|
-
|
604
|
+
[Firefly Semantics Slice on Stackoverflow](https://stackoverflow.com/questions/tagged/fireflysemantics-slice)
|
571
605
|
|
572
606
|
## Build
|
573
607
|
|
@@ -575,9 +609,7 @@ Run `npm run c` to build the project. The build artifacts will be stored in the
|
|
575
609
|
|
576
610
|
## Running unit tests
|
577
611
|
|
578
|
-
Run `npm run test` to execute the unit tests
|
579
|
-
|
580
|
-
|
612
|
+
Run `npm run test` to execute the unit tests.
|
581
613
|
|
582
614
|
## Tests
|
583
615
|
|
@@ -1,11 +1,11 @@
|
|
1
|
-
import { ReplaySubject } from
|
2
|
-
import { map } from
|
1
|
+
import { ReplaySubject } from 'rxjs';
|
2
|
+
import { map } from 'rxjs/operators';
|
3
3
|
const { freeze } = Object;
|
4
|
-
const ESTORE_DEFAULT_ID_KEY =
|
5
|
-
const ESTORE_DEFAULT_GID_KEY =
|
4
|
+
const ESTORE_DEFAULT_ID_KEY = 'id';
|
5
|
+
const ESTORE_DEFAULT_GID_KEY = 'gid';
|
6
6
|
export const ESTORE_CONFIG_DEFAULT = freeze({
|
7
7
|
idKey: ESTORE_DEFAULT_ID_KEY,
|
8
|
-
guidKey: ESTORE_DEFAULT_GID_KEY
|
8
|
+
guidKey: ESTORE_DEFAULT_GID_KEY,
|
9
9
|
});
|
10
10
|
export class AbstractStore {
|
11
11
|
constructor(config) {
|
@@ -40,7 +40,6 @@ export class AbstractStore {
|
|
40
40
|
* An Observable<E[]> reference
|
41
41
|
* to the entities in the store or
|
42
42
|
* Slice instance.
|
43
|
-
*
|
44
43
|
*/
|
45
44
|
this.obs = this.observe();
|
46
45
|
this.config = config
|
@@ -96,14 +95,15 @@ export class AbstractStore {
|
|
96
95
|
}
|
97
96
|
/**
|
98
97
|
* Observe store state changes.
|
98
|
+
*
|
99
99
|
* @param sort Optional sorting function yielding a sorted observable.
|
100
100
|
* @example
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
101
|
+
* ```
|
102
|
+
* let todos$ = source.observe();
|
103
|
+
* //or with a sort by title function
|
104
|
+
* let todos$ = source.observe((a, b)=>(a.title > b.title ? -1 : 1));
|
105
|
+
* ```
|
106
|
+
*/
|
107
107
|
observe(sort) {
|
108
108
|
if (sort) {
|
109
109
|
return this.notify.pipe(map((e) => e.sort(sort)));
|
@@ -112,10 +112,11 @@ export class AbstractStore {
|
|
112
112
|
}
|
113
113
|
/**
|
114
114
|
* Observe delta updates.
|
115
|
+
*
|
115
116
|
* @example
|
116
|
-
|
117
|
-
|
118
|
-
|
117
|
+
* ```
|
118
|
+
* let todos$ = source.observeDelta();
|
119
|
+
* ```
|
119
120
|
*/
|
120
121
|
observeDelta() {
|
121
122
|
return this.notifyDelta.asObservable();
|
@@ -126,10 +127,10 @@ export class AbstractStore {
|
|
126
127
|
* @return A hot {@link Observable} that indicates whether the store is empty.
|
127
128
|
*
|
128
129
|
* @example
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
130
|
+
* ```
|
131
|
+
* const empty$:Observable<boolean> = source.isEmpty();
|
132
|
+
* ```
|
133
|
+
*/
|
133
134
|
isEmpty() {
|
134
135
|
return this.notify.pipe(map((entries) => entries.length == 0));
|
135
136
|
}
|
@@ -139,10 +140,10 @@ export class AbstractStore {
|
|
139
140
|
* @return A snapshot that indicates whether the store is empty.
|
140
141
|
*
|
141
142
|
* @example
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
143
|
+
* ```
|
144
|
+
* const empty:boolean = source.isEmptySnapshot();
|
145
|
+
* ```
|
146
|
+
*/
|
146
147
|
isEmptySnapshot() {
|
147
148
|
return Array.from(this.entries.values()).length == 0;
|
148
149
|
}
|
@@ -192,7 +193,7 @@ export class AbstractStore {
|
|
192
193
|
</pre>
|
193
194
|
*/
|
194
195
|
contains(target) {
|
195
|
-
if (typeof target ===
|
196
|
+
if (typeof target === 'string') {
|
196
197
|
return this.entries.get(target) ? true : false;
|
197
198
|
}
|
198
199
|
const guid = target[this.config.guidKey];
|
@@ -210,7 +211,7 @@ export class AbstractStore {
|
|
210
211
|
</pre>
|
211
212
|
*/
|
212
213
|
containsById(target) {
|
213
|
-
if (typeof target ===
|
214
|
+
if (typeof target === 'string') {
|
214
215
|
return this.idEntries.get(target) ? true : false;
|
215
216
|
}
|
216
217
|
const id = target[this.config.idKey];
|
@@ -242,14 +243,14 @@ export class AbstractStore {
|
|
242
243
|
* @param p The predicate used to query for the selection.
|
243
244
|
* @return A snapshot array containing the entities that match the predicate.
|
244
245
|
*
|
245
|
-
* @example Select all the
|
246
|
-
|
247
|
-
|
248
|
-
|
246
|
+
* @example Select all the Todo instances where the title length is greater than 100.
|
247
|
+
* ```
|
248
|
+
* let todos:Todo[]=store.select(todo=>todo.title.length>100);
|
249
|
+
* ```
|
249
250
|
*/
|
250
251
|
select(p) {
|
251
252
|
const selected = [];
|
252
|
-
Array.from(this.entries.values()).forEach(e => {
|
253
|
+
Array.from(this.entries.values()).forEach((e) => {
|
253
254
|
if (p(e)) {
|
254
255
|
selected.push(e);
|
255
256
|
}
|
@@ -261,10 +262,11 @@ export class AbstractStore {
|
|
261
262
|
* @param e1 The first entity
|
262
263
|
* @param e2 The second entity
|
263
264
|
* @return true if the two entities have equal GUID ids
|
264
|
-
*
|
265
|
-
|
266
|
-
|
267
|
-
|
265
|
+
*
|
266
|
+
* @example Compare todo1 with todo2 by gid.
|
267
|
+
* ```
|
268
|
+
* if (equalsByGUID(todo1, todo2)){...};
|
269
|
+
* ```
|
268
270
|
*/
|
269
271
|
equalsByGUID(e1, e2) {
|
270
272
|
return e1[this.GUID_KEY] == e2[this.GUID_KEY];
|
@@ -274,16 +276,18 @@ export class AbstractStore {
|
|
274
276
|
* @param e1 The first entity
|
275
277
|
* @param e2 The second entity
|
276
278
|
* @return true if the two entities have equal ID ids
|
277
|
-
*
|
278
|
-
|
279
|
-
|
280
|
-
|
279
|
+
*
|
280
|
+
* @example Compare todo1 with todo2 by id.
|
281
|
+
*
|
282
|
+
* ```
|
283
|
+
* if (equalsByID(todo1, todo2)){...};
|
284
|
+
* ```
|
281
285
|
*/
|
282
286
|
equalsByID(e1, e2) {
|
283
287
|
return e1[this.ID_KEY] == e2[this.ID_KEY];
|
284
288
|
}
|
285
289
|
/**
|
286
|
-
* Calls complete on all {@link
|
290
|
+
* Calls complete on all {@link ReplaySubject} instances.
|
287
291
|
*
|
288
292
|
* Call destroy when disposing of the store.
|
289
293
|
*/
|
@@ -293,4 +297,4 @@ export class AbstractStore {
|
|
293
297
|
this.notifyQuery.complete();
|
294
298
|
}
|
295
299
|
}
|
296
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RTdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NsaWNlL3NyYy9saWIvQWJzdHJhY3RTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUlwQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFBO0FBRXpCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFBO0FBQ2xDLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFBO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFnQixNQUFNLENBQUM7SUFDdkQsS0FBSyxFQUFFLHFCQUFxQjtJQUM1QixPQUFPLEVBQUUsc0JBQXNCO0NBQ2hDLENBQUMsQ0FBQztBQUVILE1BQU0sT0FBZ0IsYUFBYTtJQU9oQyxZQUFZLE1BQW9CO1FBTWpDOztXQUVHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUVyRDs7V0FFRztRQUNPLFdBQU0sR0FBVyxFQUFFLENBQUM7UUE0QzlCOztXQUVHO1FBQ0ksWUFBTyxHQUFtQixJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTFDOzs7V0FHRztRQUNJLGNBQVMsR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUU1Qzs7O1dBR0c7UUFDTyxXQUFNLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUE7UUFFNUM7OztXQUdHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBVyxDQUFDLENBQUMsQ0FBQTtRQThCdEQ7Ozs7O1dBS0c7UUFDSyxRQUFHLEdBQW9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQWxIMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNO1lBQ2xCLENBQUMsQ0FBQyxNQUFNLENB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SUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDM0Q7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsV0FBVztRQUNULE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsUUFBUSxDQUFDLE1BQWtCO1FBQ3pCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxJQUFJLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxDQUFDLE1BQWtCO1FBQzdCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2xEO1FBQ0QsTUFBTSxFQUFFLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsSUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxXQUFXLENBQUMsRUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBTSxDQUFDLENBQWU7UUFDcEIsTUFBTSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDUixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxDQUFDLEVBQU0sRUFBRSxFQUFNO1FBQ3pCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxVQUFVLENBQUMsRUFBTSxFQUFFLEVBQU07UUFDdkIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCJcbmltcG9ydCB7IG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiXG5pbXBvcnQgeyBEZWx0YSwgUHJlZGljYXRlIH0gZnJvbSBcIi4vbW9kZWxzXCJcbmltcG9ydCB7IFN0b3JlQ29uZmlnIH0gZnJvbSBcIi4vbW9kZWxzL1N0b3JlQ29uZmlnXCJcblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdFxuXG5jb25zdCBFU1RPUkVfREVGQVVMVF9JRF9LRVkgPSBcImlkXCJcbmNvbnN0IEVTVE9SRV9ERUZBVUxUX0dJRF9LRVkgPSBcImdpZFwiXG5cbmV4cG9ydCBjb25zdCBFU1RPUkVfQ09ORklHX0RFRkFVTFQ6IFN0b3JlQ29uZmlnID0gZnJlZXplKHtcbiAgaWRLZXk6IEVTVE9SRV9ERUZBVUxUX0lEX0tFWSxcbiAgZ3VpZEtleTogRVNUT1JFX0RFRkFVTFRfR0lEX0tFWVxufSk7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0b3JlPEU+IHtcblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzdG9yZS5cbiAgICovXG4gICBwdWJsaWMgY29uZmlnOiBTdG9yZUNvbmZpZztcblxuICAgY29uc3RydWN0b3IoY29uZmlnPzogU3RvcmVDb25maWcpIHtcbiAgICAgdGhpcy5jb25maWcgPSBjb25maWdcbiAgICAgICA/IGZyZWV6ZSh7IC4uLkVTVE9SRV9DT05GSUdfREVGQVVMVCwgLi4uY29uZmlnIH0pXG4gICAgICAgOiBFU1RPUkVfQ09ORklHX0RFRkFVTFQ7XG4gICB9XG4gXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgb2YgdGhlIHN0b3JlIHF1ZXJ5LlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeVF1ZXJ5ID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcXVlcnkgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3F1ZXJ5OiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBxdWVyeSBzdGF0ZSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzLlxuICAgKi9cbiAgc2V0IHF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMubm90aWZ5UXVlcnkubmV4dCh0aGlzLl9xdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBxdWVyeSBzdGF0ZS5cbiAgICovXG4gIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSB0aGUgcXVlcnkuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IHF1ZXJ5JCA9IHNvdXJjZS5vYnNlcnZlUXVlcnkoKTtcbiAgICA8L3ByZT5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlRdWVyeS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGlkIGtleSBmb3IgdGhlIEVTdG9yZSBpbnN0YW5jZS5cbiAgICogQHJldHVybiB0aGlzLmNvbmZpZy5pZEtleTtcbiAgICovXG4gIGdldCBJRF9LRVkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaWRLZXlcbiAgfVxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZ3VpZCBrZXkgZm9yIHRoZSBFU3RvcmUgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4gdGhpcy5jb25maWcuZ3VpZEtleTtcbiAgICovXG4gIGdldCBHVUlEX0tFWSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5ndWlkS2V5XG4gIH1cblxuICAvKipcbiAgICogUHJpbWFyeSBpbmRleCBmb3IgdGhlIHN0b3JlcyBlbGVtZW50cy5cbiAgICovXG4gIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFPiA9IG5ldyBNYXAoKVxuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBlbnRyaWVzIHRoYXQgYXJlIGtleWVkIGJ5XG4gICAqIGFuIGlkIGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIGlkRW50cmllczogTWFwPHN0cmluZywgRT4gPSBuZXcgTWFwKClcblxuICAvKipcbiAgICogQ3JlYXRlIG5vdGlmaWNhdGlvbnMgdGhhdCBicm9hY2FzdFxuICAgKiB0aGUgZW50aXJlIHNldCBvZiBlbnRyaWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeSA9IG5ldyBSZXBsYXlTdWJqZWN0PEVbXT4oMSlcblxuICAvKipcbiAgICogQ3JlYXRlIG5vdGlmaWNhdGlvbnMgdGhhdCBicm9hY2FzdFxuICAgKiBzdG9yZSBvciBzbGljZSBkZWx0YSBzdGF0ZSBjaGFuZ2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeURlbHRhID0gbmV3IFJlcGxheVN1YmplY3Q8RGVsdGE8RT4+KDEpXG5cbiAgLyoqXG4gICAqIENhbGwgYWxsIHRoZSBub3RpZmllcnMgYXQgb25jZS5cbiAgICpcbiAgICogQHBhcmFtIHZcbiAgICogQHBhcmFtIGRlbHRhXG4gICAqL1xuICBwcm90ZWN0ZWQgbm90aWZ5QWxsKHY6IEVbXSwgZGVsdGE6IERlbHRhPEU+KSB7XG4gICAgdGhpcy5ub3RpZnkubmV4dCh2KTtcbiAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgc3RvcmUgc3RhdGUgY2hhbmdlcy5cbiAgICogQHBhcmFtIHNvcnQgT3B0aW9uYWwgc29ydGluZyBmdW5jdGlvbiB5aWVsZGluZyBhIHNvcnRlZCBvYnNlcnZhYmxlLlxuICAgKiBAZXhhbXBsZVxuYGBgXG5sZXQgdG9kb3MkID0gc291cmNlLm9ic2VydmUoKTtcbi8vb3Igd2l0aCBhIHNvcnQgYnkgdGl0bGUgZnVuY3Rpb25cbmxldCB0b2RvcyQgPSBzb3VyY2Uub2JzZXJ2ZSgoYSwgYik9PihhLnRpdGxlID4gYi50aXRsZSA/IC0xIDogMSkpO1xuYGBgXG4gICovXG4gIHB1YmxpYyBvYnNlcnZlKHNvcnQ/OiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcik6IE9ic2VydmFibGU8RVtdPiB7XG4gICAgaWYgKHNvcnQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKG1hcCgoZTogRVtdKSA9PiBlLnNvcnQoc29ydCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIE9ic2VydmFibGU8RVtdPiByZWZlcmVuY2VcbiAgICogdG8gdGhlIGVudGl0aWVzIGluIHRoZSBzdG9yZSBvclxuICAgKiBTbGljZSBpbnN0YW5jZS5cbiAgICogXG4gICAqL1xuICAgcHVibGljIG9iczogT2JzZXJ2YWJsZTxFW10+ID0gdGhpcy5vYnNlcnZlKClcblxuXG5cbiAgLyoqXG4gICAqIE9ic2VydmUgZGVsdGEgdXBkYXRlcy5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IHRvZG9zJCA9IHNvdXJjZS5vYnNlcnZlRGVsdGEoKTtcbiAgICAgPC9wcmU+XG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZURlbHRhKCk6IE9ic2VydmFibGU8RGVsdGE8RT4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlEZWx0YS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIHRoZSBzdG9yZSBpcyBlbXB0eS5cbiAgICogXG4gICAqIEByZXR1cm4gQSBob3Qge0BsaW5rIE9ic2VydmFibGV9IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICA8cHJlPlxuICAgIHNvdXJjZS5pc0VtcHR5KCk7XG4gICAgPC9wcmU+XG4gICovXG4gIGlzRW1wdHkoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5LnBpcGUoXG4gICAgICBtYXAoKGVudHJpZXM6IEVbXSkgPT4gZW50cmllcy5sZW5ndGggPT0gMClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQHJldHVybiBBIHNuYXBzaG90IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBzb3VyY2UuaXNFbXB0eSgpO1xuICAgIDwvcHJlPlxuICAqL1xuICBpc0VtcHR5U25hcHNob3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5sZW5ndGggPT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBjb250YWluZWQuXG4gICAqIEBwYXJhbSBwIFRoZSBwcmVkaWNhdGUgdG8gYXBwbHkgaW4gb3JkZXIgdG8gZmlsdGVyIHRoZSBjb3VudFxuICAgKi9cbiAgY291bnQocD86IFByZWRpY2F0ZTxFPik6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgaWYgKHApIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKFxuICAgICAgICBtYXAoKGU6IEVbXSkgPT4gZS5yZWR1Y2UoKHRvdGFsLCBlKSA9PiB0b3RhbCArIChwKGUpID8gMSA6IDApLCAwKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKG1hcCgoZW50cmllczogRVtdKSA9PiBlbnRyaWVzLmxlbmd0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY29udGFpbmVkIGluIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIHAgVGhlIHByZWRpY2F0ZSB0byBhcHBseSBpbiBvcmRlciB0byBmaWx0ZXIgdGhlIGNvdW50XG4gICAqL1xuICBjb3VudFNuYXBzaG90KHA/OiBQcmVkaWNhdGU8RT4pOiBudW1iZXIge1xuICAgIGlmIChwKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmZpbHRlcihwKS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90IG9mIGFsbCBlbnRyaWVzLlxuICAgKiBcbiAgICogQHJldHVybiBTbmFwc2hvdCBhcnJheSBvZiBhbGwgdGhlIGVsZW1lbnRzIHRoZSBlbnRpdGllcyB0aGUgc3RvcmUgY29udGFpbnMuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBPYnNlcnZlIGEgc25hcHNob3Qgb2YgYWxsIHRoZSBlbnRpdGllcyBpbiB0aGUgc3RvcmUuXG5gYGBcbmxldCBzZWxlY3RlZFRvZG9zOlRvZG9bXSA9IHNvdXJjZS5hbGxTbmFwc2hvdCgpO1xuYGBgXG4gICAqL1xuICBhbGxTbmFwc2hvdCgpOiBFW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyaWVzIGNvbnRhaW4gdGhlIGlkZW50aWZpZWQgaW5zdGFuY2UuXG4gICAqIFxuICAgKiBAcGFyYW0gdGFyZ2V0IEVpdGhlciBhbiBpbnN0YW5jZSBvZiB0eXBlIGBFYCBvciBhIGBndWlkYCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UuIFxuICAgKiBAcGFyYW0gYnlJZCBXaGV0aGVyIHRoZSBsb29rdXAgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aXRoIHRoZSBgaWRgIGtleSByYXRoZXIgdGhhbiB0aGUgYGd1aWRgLlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpZGVudGlmaWVkIGJ5IHRoZSBndWlkIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IGNvbnRhaW5zOmJvb2xlYW4gPSBzb3VyY2UuY29udGFpbnMoZ3VpZCk7XG4gICAgIDwvcHJlPlxuICAgKi9cbiAgY29udGFpbnModGFyZ2V0OiBFIHwgc3RyaW5nKTpib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQodGFyZ2V0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZ3VpZDogc3RyaW5nID0gKDxhbnk+dGFyZ2V0KVt0aGlzLmNvbmZpZy5ndWlkS2V5XTtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChndWlkKSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVudHJpZXMgY29udGFpbiB0aGUgaWRlbnRpZmllZCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBwYXJhbSB0YXJnZXQgRWl0aGVyIGFuIGluc3RhbmNlIG9mIHR5cGUgYEVgIG9yIGEgYGlkYCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UuIFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpZGVudGlmaWVkIGJ5IHRoZSBgaWRgIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IGNvbnRhaW5zOmJvb2xlYW4gPSBzb3VyY2UuY29udGFpbnMoZ3VpZCk7XG4gICAgIDwvcHJlPlxuICAgKi9cbiAgY29udGFpbnNCeUlkKHRhcmdldDogRSB8IHN0cmluZyk6Ym9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQodGFyZ2V0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaWQ6IHN0cmluZyA9ICg8YW55PnRhcmdldClbdGhpcy5jb25maWcuaWRLZXldO1xuICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQoaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIEdVSUQgcGFyYW1ldGVyXG4gICAqIGlmIGl0IGV4aXN0cyBhbmQgcmV0dXJuIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpZFxuICAgKiBAcmV0dXJuIFRoZSBlbnRpdHkgaW5zdGFuY2UgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgZmluZE9uZShndWlkOiBzdHJpbmcpOiBFIHwgdW5kZWZpbmVke1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGd1aWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIElEIHBhcmFtZXRlclxuICAgKiBpZiBpdCBleGlzdHMgYW5kIHJldHVybiBpdC5cbiAgICpcbiAgICogQHBhcmFtIGlkXG4gICAqIEByZXR1cm4gVGhlIGVudGl0eSBpbnN0YW5jZSBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlXG4gICAqL1xuICBmaW5kT25lQnlJRChpZDogc3RyaW5nKTogRSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuaWRFbnRyaWVzLmdldChpZCk7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3Qgb2YgdGhlIGVudHJpZXMgdGhhdCBtYXRjaCB0aGUgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlIHVzZWQgdG8gcXVlcnkgZm9yIHRoZSBzZWxlY3Rpb24uXG4gICAqIEByZXR1cm4gQSBzbmFwc2hvdCBhcnJheSBjb250YWluaW5nIHRoZSBlbnRpdGllcyB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGUuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBTZWxlY3QgYWxsIHRoZSBgVG9kb2AgaW5zdGFuY2Ugd2hlcmUgdGhlIGB0aXRsZWAgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiAxMDAuIFxuYGBgXG5sZXQgdG9kb3M6VG9kb1tdPXN0b3JlLnNlbGVjdCh0b2RvPT50b2RvLnRpdGxlLmxlbmd0aD4xMDApO1xuYGBgXG4gICAqL1xuICBzZWxlY3QocDogUHJlZGljYXRlPEU+KTogRVtdIHtcbiAgICBjb25zdCBzZWxlY3RlZDogRVtdID0gW107XG4gICAgQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmZvckVhY2goZSA9PiB7XG4gICAgICBpZiAocChlKSkge1xuICAgICAgICBzZWxlY3RlZC5wdXNoKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxuXG4gIC8qKiBcbiAgICogQ29tcGFyZSBlbnRpdGllcyBieSBHVUlEIFxuICAgKiBAcGFyYW0gZTEgVGhlIGZpcnN0IGVudGl0eVxuICAgKiBAcGFyYW0gZTIgVGhlIHNlY29uZCBlbnRpdHlcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gZW50aXRpZXMgaGF2ZSBlcXVhbCBHVUlEIGlkc1xuICAgKiBAZXhhbXBsZSBDb21wYXJlIGB0b2RvMWAgd2l0aCBgdG9kbzJgIGJ5IGBnaWRgLlxuYGBgXG5pZiAoZXF1YWxzQnlHVUlEKHRvZG8xLCB0b2RvMikpey4uLn07XG5gYGBcbiAgICovXG4gIGVxdWFsc0J5R1VJRChlMTphbnksIGUyOmFueSkge1xuICAgIHJldHVybiBlMVt0aGlzLkdVSURfS0VZXSA9PSBlMlt0aGlzLkdVSURfS0VZXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIGVudGl0aWVzIGJ5IElEIFxuICAgKiBAcGFyYW0gZTEgVGhlIGZpcnN0IGVudGl0eVxuICAgKiBAcGFyYW0gZTIgVGhlIHNlY29uZCBlbnRpdHlcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gZW50aXRpZXMgaGF2ZSBlcXVhbCBJRCBpZHNcbiAgICogQGV4YW1wbGUgQ29tcGFyZSBgdG9kbzFgIHdpdGggYHRvZG8yYCBieSBgaWRgLlxuYGBgXG5pZiAoZXF1YWxzQnlJRCh0b2RvMSwgdG9kbzIpKXsuLi59O1xuYGBgXG4gICAqL1xuICBlcXVhbHNCeUlEKGUxOmFueSwgZTI6YW55KSB7XG4gICAgcmV0dXJuIGUxW3RoaXMuSURfS0VZXSA9PSBlMlt0aGlzLklEX0tFWV07XG4gIH1cbiAgLyoqXG4gICAqIENhbGxzIGNvbXBsZXRlIG9uIGFsbCB7QGxpbmsgQmVoYXZpb3JTdWJqZWN0fSBpbnN0YW5jZXMuXG4gICAqIFxuICAgKiBDYWxsIGRlc3Ryb3kgd2hlbiBkaXNwb3Npbmcgb2YgdGhlIHN0b3JlLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLm5vdGlmeS5jb21wbGV0ZSgpO1xuICAgIHRoaXMubm90aWZ5RGVsdGEuY29tcGxldGUoKTtcbiAgICB0aGlzLm5vdGlmeVF1ZXJ5LmNvbXBsZXRlKCk7XG4gIH1cbn0iXX0=
|
300
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RTdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NsaWNlL3NyYy9saWIvQWJzdHJhY3RTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlyQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBRTFCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDO0FBQ25DLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0FBRXJDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFnQixNQUFNLENBQUM7SUFDdkQsS0FBSyxFQUFFLHFCQUFxQjtJQUM1QixPQUFPLEVBQUUsc0JBQXNCO0NBQ2hDLENBQUMsQ0FBQztBQUVILE1BQU0sT0FBZ0IsYUFBYTtJQU1qQyxZQUFZLE1BQW9CO1FBTWhDOztXQUVHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUVyRDs7V0FFRztRQUNPLFdBQU0sR0FBVyxFQUFFLENBQUM7UUEyQzlCOztXQUVHO1FBQ0ksWUFBTyxHQUFtQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTNDOzs7V0FHRztRQUNJLGNBQVMsR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUU3Qzs7O1dBR0c7UUFDTyxXQUFNLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUM7UUFFN0M7OztXQUdHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBVyxDQUFDLENBQUMsQ0FBQztRQStCdkQ7Ozs7V0FJRztRQUNJLFFBQUcsR0FBb0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBakgzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU07WUFDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FB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SUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDM0Q7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsV0FBVztRQUNULE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsUUFBUSxDQUFDLE1BQWtCO1FBQ3pCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxJQUFJLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxDQUFDLE1BQWtCO1FBQzdCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2xEO1FBQ0QsTUFBTSxFQUFFLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsSUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxXQUFXLENBQUMsRUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBTSxDQUFDLENBQWU7UUFDcEIsTUFBTSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNSLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxDQUFDLEVBQU8sRUFBRSxFQUFPO1FBQzNCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILFVBQVUsQ0FBQyxFQUFPLEVBQUUsRUFBTztRQUN6QixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILE9BQU87UUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEZWx0YSwgUHJlZGljYXRlIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgU3RvcmVDb25maWcgfSBmcm9tICcuL21vZGVscy9TdG9yZUNvbmZpZyc7XG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEVTVE9SRV9ERUZBVUxUX0lEX0tFWSA9ICdpZCc7XG5jb25zdCBFU1RPUkVfREVGQVVMVF9HSURfS0VZID0gJ2dpZCc7XG5cbmV4cG9ydCBjb25zdCBFU1RPUkVfQ09ORklHX0RFRkFVTFQ6IFN0b3JlQ29uZmlnID0gZnJlZXplKHtcbiAgaWRLZXk6IEVTVE9SRV9ERUZBVUxUX0lEX0tFWSxcbiAgZ3VpZEtleTogRVNUT1JFX0RFRkFVTFRfR0lEX0tFWSxcbn0pO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdG9yZTxFPiB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHN0b3JlLlxuICAgKi9cbiAgcHVibGljIGNvbmZpZzogU3RvcmVDb25maWc7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnPzogU3RvcmVDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ1xuICAgICAgPyBmcmVlemUoeyAuLi5FU1RPUkVfQ09ORklHX0RFRkFVTFQsIC4uLmNvbmZpZyB9KVxuICAgICAgOiBFU1RPUkVfQ09ORklHX0RFRkFVTFQ7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIG9mIHRoZSBzdG9yZSBxdWVyeS5cbiAgICovXG4gIHByb3RlY3RlZCBub3RpZnlRdWVyeSA9IG5ldyBSZXBsYXlTdWJqZWN0PHN0cmluZz4oMSk7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHF1ZXJ5IHN0YXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9xdWVyeTogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgcXVlcnkgc3RhdGUgYW5kIG5vdGlmaWVzIG9ic2VydmVycy5cbiAgICovXG4gIHNldCBxdWVyeShxdWVyeTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcXVlcnkgPSBxdWVyeTtcbiAgICB0aGlzLm5vdGlmeVF1ZXJ5Lm5leHQodGhpcy5fcXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gQSBzbmFwc2hvdCBvZiB0aGUgcXVlcnkgc3RhdGUuXG4gICAqL1xuICBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgdGhlIHF1ZXJ5LlxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgIGxldCBxdWVyeSQgPSBzb3VyY2Uub2JzZXJ2ZVF1ZXJ5KCk7XG4gICAgPC9wcmU+XG4gICovXG4gIHB1YmxpYyBvYnNlcnZlUXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5UXVlcnkuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgaWQga2V5IGZvciB0aGUgRVN0b3JlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHRoaXMuY29uZmlnLmlkS2V5O1xuICAgKi9cbiAgZ2V0IElEX0tFWSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pZEtleTtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZ3VpZCBrZXkgZm9yIHRoZSBFU3RvcmUgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4gdGhpcy5jb25maWcuZ3VpZEtleTtcbiAgICovXG4gIGdldCBHVUlEX0tFWSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5ndWlkS2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW1hcnkgaW5kZXggZm9yIHRoZSBzdG9yZXMgZWxlbWVudHMuXG4gICAqL1xuICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IGVudHJpZXMgdGhhdCBhcmUga2V5ZWQgYnlcbiAgICogYW4gaWQgZ2VuZXJhdGVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgaWRFbnRyaWVzOiBNYXA8c3RyaW5nLCBFPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogQ3JlYXRlIG5vdGlmaWNhdGlvbnMgdGhhdCBicm9hY2FzdFxuICAgKiB0aGUgZW50aXJlIHNldCBvZiBlbnRyaWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeSA9IG5ldyBSZXBsYXlTdWJqZWN0PEVbXT4oMSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBub3RpZmljYXRpb25zIHRoYXQgYnJvYWNhc3RcbiAgICogc3RvcmUgb3Igc2xpY2UgZGVsdGEgc3RhdGUgY2hhbmdlcy5cbiAgICovXG4gIHByb3RlY3RlZCBub3RpZnlEZWx0YSA9IG5ldyBSZXBsYXlTdWJqZWN0PERlbHRhPEU+PigxKTtcblxuICAvKipcbiAgICogQ2FsbCBhbGwgdGhlIG5vdGlmaWVycyBhdCBvbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gdlxuICAgKiBAcGFyYW0gZGVsdGFcbiAgICovXG4gIHByb3RlY3RlZCBub3RpZnlBbGwodjogRVtdLCBkZWx0YTogRGVsdGE8RT4pIHtcbiAgICB0aGlzLm5vdGlmeS5uZXh0KHYpO1xuICAgIHRoaXMubm90aWZ5RGVsdGEubmV4dChkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBzdG9yZSBzdGF0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gc29ydCBPcHRpb25hbCBzb3J0aW5nIGZ1bmN0aW9uIHlpZWxkaW5nIGEgc29ydGVkIG9ic2VydmFibGUuXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBsZXQgdG9kb3MkID0gc291cmNlLm9ic2VydmUoKTtcbiAgICogLy9vciB3aXRoIGEgc29ydCBieSB0aXRsZSBmdW5jdGlvblxuICAgKiBsZXQgdG9kb3MkID0gc291cmNlLm9ic2VydmUoKGEsIGIpPT4oYS50aXRsZSA+IGIudGl0bGUgPyAtMSA6IDEpKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZShzb3J0PzogKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXIpOiBPYnNlcnZhYmxlPEVbXT4ge1xuICAgIGlmIChzb3J0KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RpZnkucGlwZShtYXAoKGU6IEVbXSkgPT4gZS5zb3J0KHNvcnQpKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vdGlmeS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBPYnNlcnZhYmxlPEVbXT4gcmVmZXJlbmNlXG4gICAqIHRvIHRoZSBlbnRpdGllcyBpbiB0aGUgc3RvcmUgb3JcbiAgICogU2xpY2UgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgb2JzOiBPYnNlcnZhYmxlPEVbXT4gPSB0aGlzLm9ic2VydmUoKTtcblxuICAvKipcbiAgICogT2JzZXJ2ZSBkZWx0YSB1cGRhdGVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogbGV0IHRvZG9zJCA9IHNvdXJjZS5vYnNlcnZlRGVsdGEoKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZURlbHRhKCk6IE9ic2VydmFibGU8RGVsdGE8RT4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlEZWx0YS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIHRoZSBzdG9yZSBpcyBlbXB0eS5cbiAgICpcbiAgICogQHJldHVybiBBIGhvdCB7QGxpbmsgT2JzZXJ2YWJsZX0gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RvcmUgaXMgZW1wdHkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBjb25zdCBlbXB0eSQ6T2JzZXJ2YWJsZTxib29sZWFuPiA9IHNvdXJjZS5pc0VtcHR5KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgaXNFbXB0eSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnkucGlwZShtYXAoKGVudHJpZXM6IEVbXSkgPT4gZW50cmllcy5sZW5ndGggPT0gMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKlxuICAgKiBAcmV0dXJuIEEgc25hcHNob3QgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RvcmUgaXMgZW1wdHkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBjb25zdCBlbXB0eTpib29sZWFuID0gc291cmNlLmlzRW1wdHlTbmFwc2hvdCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGlzRW1wdHlTbmFwc2hvdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmxlbmd0aCA9PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGNvbnRhaW5lZC5cbiAgICogQHBhcmFtIHAgVGhlIHByZWRpY2F0ZSB0byBhcHBseSBpbiBvcmRlciB0byBmaWx0ZXIgdGhlIGNvdW50XG4gICAqL1xuICBjb3VudChwPzogUHJlZGljYXRlPEU+KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBpZiAocCkge1xuICAgICAgcmV0dXJuIHRoaXMubm90aWZ5LnBpcGUoXG4gICAgICAgIG1hcCgoZTogRVtdKSA9PiBlLnJlZHVjZSgodG90YWwsIGUpID0+IHRvdGFsICsgKHAoZSkgPyAxIDogMCksIDApKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5LnBpcGUobWFwKChlbnRyaWVzOiBFW10pID0+IGVudHJpZXMubGVuZ3RoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyBjb250YWluZWQgaW4gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlIHRvIGFwcGx5IGluIG9yZGVyIHRvIGZpbHRlciB0aGUgY291bnRcbiAgICovXG4gIGNvdW50U25hcHNob3QocD86IFByZWRpY2F0ZTxFPik6IG51bWJlciB7XG4gICAgaWYgKHApIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSkuZmlsdGVyKHApLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3Qgb2YgYWxsIGVudHJpZXMuXG4gICAqIFxuICAgKiBAcmV0dXJuIFNuYXBzaG90IGFycmF5IG9mIGFsbCB0aGUgZWxlbWVudHMgdGhlIGVudGl0aWVzIHRoZSBzdG9yZSBjb250YWlucy5cbiAgICogXG4gICAqIEBleGFtcGxlIE9ic2VydmUgYSBzbmFwc2hvdCBvZiBhbGwgdGhlIGVudGl0aWVzIGluIHRoZSBzdG9yZS5cbmBgYFxubGV0IHNlbGVjdGVkVG9kb3M6VG9kb1tdID0gc291cmNlLmFsbFNuYXBzaG90KCk7XG5gYGBcbiAgICovXG4gIGFsbFNuYXBzaG90KCk6IEVbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVudHJpZXMgY29udGFpbiB0aGUgaWRlbnRpZmllZCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBwYXJhbSB0YXJnZXQgRWl0aGVyIGFuIGluc3RhbmNlIG9mIHR5cGUgYEVgIG9yIGEgYGd1aWRgIGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZS4gXG4gICAqIEBwYXJhbSBieUlkIFdoZXRoZXIgdGhlIGxvb2t1cCBzaG91bGQgYmUgcGVyZm9ybWVkIHdpdGggdGhlIGBpZGAga2V5IHJhdGhlciB0aGFuIHRoZSBgZ3VpZGAuXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluc3RhbmNlIGlkZW50aWZpZWQgYnkgdGhlIGd1aWQgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgICBsZXQgY29udGFpbnM6Ym9vbGVhbiA9IHNvdXJjZS5jb250YWlucyhndWlkKTtcbiAgICAgPC9wcmU+XG4gICAqL1xuICBjb250YWlucyh0YXJnZXQ6IEUgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KHRhcmdldCkgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGd1aWQ6IHN0cmluZyA9ICg8YW55PnRhcmdldClbdGhpcy5jb25maWcuZ3VpZEtleV07XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQoZ3VpZCkgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyaWVzIGNvbnRhaW4gdGhlIGlkZW50aWZpZWQgaW5zdGFuY2UuXG4gICAqIFxuICAgKiBAcGFyYW0gdGFyZ2V0IEVpdGhlciBhbiBpbnN0YW5jZSBvZiB0eXBlIGBFYCBvciBhIGBpZGAgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlLiBcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdGFuY2UgaWRlbnRpZmllZCBieSB0aGUgYGlkYCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgIGxldCBjb250YWluczpib29sZWFuID0gc291cmNlLmNvbnRhaW5zKGd1aWQpO1xuICAgICA8L3ByZT5cbiAgICovXG4gIGNvbnRhaW5zQnlJZCh0YXJnZXQ6IEUgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQodGFyZ2V0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaWQ6IHN0cmluZyA9ICg8YW55PnRhcmdldClbdGhpcy5jb25maWcuaWRLZXldO1xuICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQoaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIEdVSUQgcGFyYW1ldGVyXG4gICAqIGlmIGl0IGV4aXN0cyBhbmQgcmV0dXJuIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpZFxuICAgKiBAcmV0dXJuIFRoZSBlbnRpdHkgaW5zdGFuY2UgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgZmluZE9uZShndWlkOiBzdHJpbmcpOiBFIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChndWlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuZCByZXR1cm4gdGhlIGVudGl0eSBpZGVudGlmaWVkIGJ5IHRoZSBJRCBwYXJhbWV0ZXJcbiAgICogaWYgaXQgZXhpc3RzIGFuZCByZXR1cm4gaXQuXG4gICAqXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcmV0dXJuIFRoZSBlbnRpdHkgaW5zdGFuY2UgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgZmluZE9uZUJ5SUQoaWQ6IHN0cmluZyk6IEUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90IG9mIHRoZSBlbnRyaWVzIHRoYXQgbWF0Y2ggdGhlIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtIHAgVGhlIHByZWRpY2F0ZSB1c2VkIHRvIHF1ZXJ5IGZvciB0aGUgc2VsZWN0aW9uLlxuICAgKiBAcmV0dXJuIEEgc25hcHNob3QgYXJyYXkgY29udGFpbmluZyB0aGUgZW50aXRpZXMgdGhhdCBtYXRjaCB0aGUgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBTZWxlY3QgYWxsIHRoZSBUb2RvIGluc3RhbmNlcyB3aGVyZSB0aGUgdGl0bGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiAxMDAuXG4gICAqIGBgYFxuICAgKiBsZXQgdG9kb3M6VG9kb1tdPXN0b3JlLnNlbGVjdCh0b2RvPT50b2RvLnRpdGxlLmxlbmd0aD4xMDApO1xuICAgKiBgYGBcbiAgICovXG4gIHNlbGVjdChwOiBQcmVkaWNhdGU8RT4pOiBFW10ge1xuICAgIGNvbnN0IHNlbGVjdGVkOiBFW10gPSBbXTtcbiAgICBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgaWYgKHAoZSkpIHtcbiAgICAgICAgc2VsZWN0ZWQucHVzaChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZSBlbnRpdGllcyBieSBHVUlEXG4gICAqIEBwYXJhbSBlMSBUaGUgZmlyc3QgZW50aXR5XG4gICAqIEBwYXJhbSBlMiBUaGUgc2Vjb25kIGVudGl0eVxuICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBlbnRpdGllcyBoYXZlIGVxdWFsIEdVSUQgaWRzXG4gICAqXG4gICAqIEBleGFtcGxlIENvbXBhcmUgdG9kbzEgd2l0aCB0b2RvMiBieSBnaWQuXG4gICAqIGBgYFxuICAgKiBpZiAoZXF1YWxzQnlHVUlEKHRvZG8xLCB0b2RvMikpey4uLn07XG4gICAqIGBgYFxuICAgKi9cbiAgZXF1YWxzQnlHVUlEKGUxOiBhbnksIGUyOiBhbnkpIHtcbiAgICByZXR1cm4gZTFbdGhpcy5HVUlEX0tFWV0gPT0gZTJbdGhpcy5HVUlEX0tFWV07XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZSBlbnRpdGllcyBieSBJRFxuICAgKiBAcGFyYW0gZTEgVGhlIGZpcnN0IGVudGl0eVxuICAgKiBAcGFyYW0gZTIgVGhlIHNlY29uZCBlbnRpdHlcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gZW50aXRpZXMgaGF2ZSBlcXVhbCBJRCBpZHNcbiAgICpcbiAgICogQGV4YW1wbGUgQ29tcGFyZSB0b2RvMSB3aXRoIHRvZG8yIGJ5IGlkLlxuICAgKlxuICAgKiBgYGBcbiAgICogaWYgKGVxdWFsc0J5SUQodG9kbzEsIHRvZG8yKSl7Li4ufTtcbiAgICogYGBgXG4gICAqL1xuICBlcXVhbHNCeUlEKGUxOiBhbnksIGUyOiBhbnkpIHtcbiAgICByZXR1cm4gZTFbdGhpcy5JRF9LRVldID09IGUyW3RoaXMuSURfS0VZXTtcbiAgfVxuICAvKipcbiAgICogQ2FsbHMgY29tcGxldGUgb24gYWxsIHtAbGluayBSZXBsYXlTdWJqZWN0fSBpbnN0YW5jZXMuXG4gICAqXG4gICAqIENhbGwgZGVzdHJveSB3aGVuIGRpc3Bvc2luZyBvZiB0aGUgc3RvcmUuXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMubm90aWZ5LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5ub3RpZnlEZWx0YS5jb21wbGV0ZSgpO1xuICAgIHRoaXMubm90aWZ5UXVlcnkuY29tcGxldGUoKTtcbiAgfVxufVxuIl19
|