@ngx-pwa/local-storage 18.0.0 → 19.0.0
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/fesm2022/ngx-pwa-local-storage.mjs +48 -35
- package/fesm2022/ngx-pwa-local-storage.mjs.map +1 -1
- package/package.json +3 -5
- package/schematics/ng-add/index.js +7 -7
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-update/index.js +14 -24
- package/schematics/ng-update/index.js.map +1 -1
- package/schematics/utility/config.js +24 -34
- package/schematics/utility/config.js.map +1 -1
- package/schematics/utility/module.js +3 -3
- package/schematics/utility/module.js.map +1 -1
- package/esm2022/lib/databases/exceptions.mjs +0 -28
- package/esm2022/lib/databases/indexeddb-database.mjs +0 -308
- package/esm2022/lib/databases/local-database.mjs +0 -66
- package/esm2022/lib/databases/localstorage-database.mjs +0 -158
- package/esm2022/lib/databases/memory-database.mjs +0 -84
- package/esm2022/lib/providers.mjs +0 -66
- package/esm2022/lib/storage.module.mjs +0 -34
- package/esm2022/lib/storages/exceptions.mjs +0 -15
- package/esm2022/lib/storages/storage-map.service.mjs +0 -340
- package/esm2022/lib/tokens.mjs +0 -59
- package/esm2022/lib/validation/json-schema.mjs +0 -5
- package/esm2022/lib/validation/json-validator.mjs +0 -244
- package/esm2022/ngx-pwa-local-storage.mjs +0 -5
- package/esm2022/public-api.mjs +0 -9
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
import { Injectable } from "@angular/core";
|
|
2
|
-
import { Observable, ReplaySubject, of, throwError } from "rxjs";
|
|
3
|
-
import { catchError, mergeMap, tap } from "rxjs/operators";
|
|
4
|
-
import { IDB_BROKEN_ERROR } from "../databases/exceptions";
|
|
5
|
-
import { IndexedDBDatabase } from "../databases/indexeddb-database";
|
|
6
|
-
import { LocalDatabase } from "../databases/local-database";
|
|
7
|
-
import { LocalStorageDatabase } from "../databases/localstorage-database";
|
|
8
|
-
import { MemoryDatabase } from "../databases/memory-database";
|
|
9
|
-
import { JSONValidator } from "../validation/json-validator";
|
|
10
|
-
import { ValidationError } from "./exceptions";
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "../databases/local-database";
|
|
13
|
-
export class StorageMap {
|
|
14
|
-
#database;
|
|
15
|
-
#jsonValidator;
|
|
16
|
-
#notifiers = new Map();
|
|
17
|
-
/**
|
|
18
|
-
* Constructor params are provided by Angular (but can also be passed manually in tests)
|
|
19
|
-
* @param database Storage to use
|
|
20
|
-
*/
|
|
21
|
-
constructor(database) {
|
|
22
|
-
this.#database = database;
|
|
23
|
-
this.#jsonValidator = new JSONValidator();
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* **Number of items** in storage, wrapped in an Observable.
|
|
27
|
-
*
|
|
28
|
-
* Note you do *not* need to unsubscribe (it is a self-completing Observable).
|
|
29
|
-
*
|
|
30
|
-
* @example
|
|
31
|
-
* this.storageMap.size.subscribe((size) => {
|
|
32
|
-
* console.log(size);
|
|
33
|
-
* });
|
|
34
|
-
*/
|
|
35
|
-
get size() {
|
|
36
|
-
return this.#database.size
|
|
37
|
-
/* Catch if `indexedDb` is broken */
|
|
38
|
-
.pipe(this.#catchIDBBroken(() => this.#database.size));
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Tells you which storage engine is used.
|
|
42
|
-
*
|
|
43
|
-
* *Only useful for interoperability.*
|
|
44
|
-
*
|
|
45
|
-
* Note that due to some browsers issues in some special contexts
|
|
46
|
-
* (like Safari cross-origin iframes),
|
|
47
|
-
* **this information may be wrong at initialization,**
|
|
48
|
-
* as the storage could fallback from `indexedDB` to `localStorage`
|
|
49
|
-
* only after a first read or write operation.
|
|
50
|
-
* @returns Storage engine used
|
|
51
|
-
*
|
|
52
|
-
* @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}
|
|
53
|
-
*
|
|
54
|
-
* @example
|
|
55
|
-
* if (this.storageMap.backingEngine === 'indexedDB') {}
|
|
56
|
-
*/
|
|
57
|
-
get backingEngine() {
|
|
58
|
-
if (this.#database instanceof IndexedDBDatabase) {
|
|
59
|
-
return "indexedDB";
|
|
60
|
-
}
|
|
61
|
-
else if (this.#database instanceof LocalStorageDatabase) {
|
|
62
|
-
return "localStorage";
|
|
63
|
-
}
|
|
64
|
-
else if (this.#database instanceof MemoryDatabase) {
|
|
65
|
-
return "memory";
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
return "unknown";
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Information about `indexedDB` database.
|
|
73
|
-
*
|
|
74
|
-
* *Only useful for interoperability.*
|
|
75
|
-
*
|
|
76
|
-
* @returns `indexedDB` database name, store name and database version.
|
|
77
|
-
* **Values will be empty if the storage is not `indexedDB`, so it should be used after an engine check**.
|
|
78
|
-
*
|
|
79
|
-
* @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}
|
|
80
|
-
*
|
|
81
|
-
* @example
|
|
82
|
-
* if (this.storageMap.backingEngine === 'indexedDB') {
|
|
83
|
-
* const { database, store, version } = this.storageMap.backingStore;
|
|
84
|
-
* }
|
|
85
|
-
*/
|
|
86
|
-
get backingStore() {
|
|
87
|
-
return (this.#database instanceof IndexedDBDatabase) ?
|
|
88
|
-
this.#database.backingStore :
|
|
89
|
-
{ database: "", store: "", version: 0 };
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Information about `localStorage` fallback storage.
|
|
93
|
-
*
|
|
94
|
-
* *Only useful for interoperability.*
|
|
95
|
-
*
|
|
96
|
-
* @returns `localStorage` prefix.
|
|
97
|
-
* **Values will be empty if the storage is not `localStorage`, so it should be used after an engine check**.
|
|
98
|
-
*
|
|
99
|
-
* @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* if (this.storageMap.backingEngine === 'localStorage') {
|
|
103
|
-
* const { prefix } = this.storageMap.fallbackBackingStore;
|
|
104
|
-
* }
|
|
105
|
-
*/
|
|
106
|
-
get fallbackBackingStore() {
|
|
107
|
-
return (this.#database instanceof LocalStorageDatabase) ?
|
|
108
|
-
{ prefix: this.#database.prefix } :
|
|
109
|
-
{ prefix: "" };
|
|
110
|
-
}
|
|
111
|
-
get(key, schema) {
|
|
112
|
-
/* Get the data in storage */
|
|
113
|
-
return this.#database.get(key).pipe(
|
|
114
|
-
/* Check if `indexedDb` is broken */
|
|
115
|
-
this.#catchIDBBroken(() => this.#database.get(key)), mergeMap((data) => {
|
|
116
|
-
/* No need to validate if the data is empty */
|
|
117
|
-
if ((data === undefined) || (data === null)) {
|
|
118
|
-
return of(undefined);
|
|
119
|
-
}
|
|
120
|
-
else if (schema) {
|
|
121
|
-
/* Validate data against a JSON schema if provided */
|
|
122
|
-
if (!this.#jsonValidator.validate(data, schema)) {
|
|
123
|
-
return throwError(() => new ValidationError());
|
|
124
|
-
}
|
|
125
|
-
/* Data have been checked, so it's OK to cast */
|
|
126
|
-
return of(data);
|
|
127
|
-
}
|
|
128
|
-
/* Cast to unknown as the data wasn't checked */
|
|
129
|
-
return of(data);
|
|
130
|
-
}));
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Store an item in storage.
|
|
134
|
-
*
|
|
135
|
-
* Note that:
|
|
136
|
-
* * you *do* need to subscribe, even if you do not have something specific to do after writing in storage, otherwise nothing happens (because it is how RxJS Observables work),
|
|
137
|
-
* * but you do *not* need to unsubscribe (it is a self-completing Observable),
|
|
138
|
-
* * setting `null` or `undefined` will remove the item to avoid some browsers issues,
|
|
139
|
-
* * you should stick to serializable JSON data, meaning primitive types, arrays and literal objects. Date, Map, Set, Blob and other special structures can cause issues in some scenarios.
|
|
140
|
-
* @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/SERIALIZATION.md}
|
|
141
|
-
*
|
|
142
|
-
* @param key The item's key
|
|
143
|
-
* @param data The item's value
|
|
144
|
-
* @param schema Optional JSON schema to validate the data
|
|
145
|
-
* @returns A RxJS Observable to wait the end of the operation
|
|
146
|
-
*
|
|
147
|
-
* @example
|
|
148
|
-
* this.storageMap.set('key', 'value').subscribe(() => {});
|
|
149
|
-
*/
|
|
150
|
-
set(key, data, schema) {
|
|
151
|
-
/* Storing `undefined` or `null` is useless and can cause issues in `indexedDb` in some browsers,
|
|
152
|
-
* so removing item instead for all storages to have a consistent API */
|
|
153
|
-
if ((data === undefined) || (data === null)) {
|
|
154
|
-
return this.delete(key);
|
|
155
|
-
}
|
|
156
|
-
/* Validate data against a JSON schema if provided */
|
|
157
|
-
if (schema && !this.#jsonValidator.validate(data, schema)) {
|
|
158
|
-
return throwError(() => new ValidationError());
|
|
159
|
-
}
|
|
160
|
-
return this.#database.set(key, data).pipe(
|
|
161
|
-
/* Catch if `indexedDb` is broken */
|
|
162
|
-
this.#catchIDBBroken(() => this.#database.set(key, data)),
|
|
163
|
-
/* Notify watchers (must be last because it should only happen if the operation succeeds) */
|
|
164
|
-
tap(() => { this.#notify(key, data); }));
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Delete an item in storage.
|
|
168
|
-
*
|
|
169
|
-
* Note that:
|
|
170
|
-
* * you *do* need to subscribe, even if you do not have something specific to do after deleting, otherwise nothing happens (because it is how RxJS Observables work),
|
|
171
|
-
* * but you do *not* need to unsubscribe (it is a self-completing Observable).
|
|
172
|
-
*
|
|
173
|
-
* @param key The item's key
|
|
174
|
-
* @returns A RxJS Observable to wait the end of the operation
|
|
175
|
-
*
|
|
176
|
-
* @example
|
|
177
|
-
* this.storageMap.delete('key').subscribe(() => {});
|
|
178
|
-
*/
|
|
179
|
-
delete(key) {
|
|
180
|
-
return this.#database.delete(key).pipe(
|
|
181
|
-
/* Catch if `indexedDb` is broken */
|
|
182
|
-
this.#catchIDBBroken(() => this.#database.delete(key)),
|
|
183
|
-
/* Notify watchers (must be last because it should only happen if the operation succeeds) */
|
|
184
|
-
tap(() => { this.#notify(key, undefined); }));
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Delete all items in storage.
|
|
188
|
-
*
|
|
189
|
-
* Note that:
|
|
190
|
-
* * you *do* need to subscribe, even if you do not have something specific to do after clearing, otherwise nothing happens (because it is how RxJS Observables work),
|
|
191
|
-
* * but you do *not* need to unsubscribe (it is a self-completing Observable).
|
|
192
|
-
*
|
|
193
|
-
* @returns A RxJS Observable to wait the end of the operation
|
|
194
|
-
*
|
|
195
|
-
* @example
|
|
196
|
-
* this.storageMap.clear().subscribe(() => {});
|
|
197
|
-
*/
|
|
198
|
-
clear() {
|
|
199
|
-
return this.#database.clear().pipe(
|
|
200
|
-
/* Catch if `indexedDb` is broken */
|
|
201
|
-
this.#catchIDBBroken(() => this.#database.clear()),
|
|
202
|
-
/* Notify watchers (must be last because it should only happen if the operation succeeds) */
|
|
203
|
-
tap(() => {
|
|
204
|
-
for (const key of this.#notifiers.keys()) {
|
|
205
|
-
this.#notify(key, undefined);
|
|
206
|
-
}
|
|
207
|
-
}));
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Get all keys stored in storage.
|
|
211
|
-
*
|
|
212
|
-
* Note **this is an *iterating* Observable**:
|
|
213
|
-
* * if there is no key, the `next` callback will not be invoked,
|
|
214
|
-
* * if you need to wait the whole operation to end, be sure to act in the `complete` callback,
|
|
215
|
-
* as this Observable can emit several values and so will invoke the `next` callback several times,
|
|
216
|
-
* * you do *not* need to unsubscribe (it is a self-completing Observable).
|
|
217
|
-
*
|
|
218
|
-
* @returns A list of the keys wrapped in a RxJS Observable
|
|
219
|
-
*
|
|
220
|
-
* @example
|
|
221
|
-
* this.storageMap.keys().subscribe({
|
|
222
|
-
* next: (key) => { console.log(key); },
|
|
223
|
-
* complete: () => { console.log('Done'); },
|
|
224
|
-
* });
|
|
225
|
-
*/
|
|
226
|
-
keys() {
|
|
227
|
-
return this.#database.keys()
|
|
228
|
-
/* Catch if `indexedDb` is broken */
|
|
229
|
-
.pipe(this.#catchIDBBroken(() => this.#database.keys()));
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Tells if a key exists in storage.
|
|
233
|
-
*
|
|
234
|
-
* Note you do *not* need to unsubscribe (it is a self-completing Observable).
|
|
235
|
-
*
|
|
236
|
-
* @returns A RxJS Observable telling if the key exists
|
|
237
|
-
*
|
|
238
|
-
* @example
|
|
239
|
-
* this.storageMap.has('key').subscribe((hasKey) => {
|
|
240
|
-
* if (hasKey) {}
|
|
241
|
-
* });
|
|
242
|
-
*/
|
|
243
|
-
has(key) {
|
|
244
|
-
return this.#database.has(key)
|
|
245
|
-
/* Catch if `indexedDb` is broken */
|
|
246
|
-
.pipe(this.#catchIDBBroken(() => this.#database.has(key)));
|
|
247
|
-
}
|
|
248
|
-
watch(key, schema) {
|
|
249
|
-
/* Check if there is already a notifier */
|
|
250
|
-
if (!this.#notifiers.has(key)) {
|
|
251
|
-
this.#notifiers.set(key, new ReplaySubject(1));
|
|
252
|
-
}
|
|
253
|
-
/* Non-null assertion is required because TypeScript doesn't narrow `.has()` yet */
|
|
254
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Ensured by the logic
|
|
255
|
-
const notifier = this.#notifiers.get(key);
|
|
256
|
-
/* Get the current item value */
|
|
257
|
-
(schema ? this.get(key, schema) : this.get(key)).subscribe({
|
|
258
|
-
next: (result) => {
|
|
259
|
-
notifier.next(result);
|
|
260
|
-
},
|
|
261
|
-
error: (error) => {
|
|
262
|
-
notifier.error(error);
|
|
263
|
-
},
|
|
264
|
-
});
|
|
265
|
-
/* Only the public API of the Observable should be returned */
|
|
266
|
-
return (schema ?
|
|
267
|
-
notifier.asObservable() :
|
|
268
|
-
notifier.asObservable());
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Notify when a value changes
|
|
272
|
-
* @param key The item's key
|
|
273
|
-
* @param data The new value
|
|
274
|
-
*/
|
|
275
|
-
#notify(key, value) {
|
|
276
|
-
const notifier = this.#notifiers.get(key);
|
|
277
|
-
if (notifier) {
|
|
278
|
-
notifier.next(value);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* RxJS operator to catch if `indexedDB` is broken
|
|
283
|
-
* @param operationCallback Callback with the operation to redo
|
|
284
|
-
*/
|
|
285
|
-
#catchIDBBroken(operationCallback) {
|
|
286
|
-
return catchError((error) => {
|
|
287
|
-
/* Check if `indexedDB` is broken based on error message (the specific error class seems to be lost in the process) */
|
|
288
|
-
if ((error !== undefined) && (error !== null)
|
|
289
|
-
&& (typeof error === "object") && ("message" in error)
|
|
290
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Required because TypeScript narrowing is not working here
|
|
291
|
-
&& (error.message === IDB_BROKEN_ERROR)) {
|
|
292
|
-
/* When storage is fully disabled in browser (via the "Block all cookies" option),
|
|
293
|
-
* just trying to check `localStorage` variable causes a security exception.
|
|
294
|
-
* Prevents https://github.com/cyrilletuzi/angular-async-local-storage/issues/118
|
|
295
|
-
*/
|
|
296
|
-
try {
|
|
297
|
-
if ("getItem" in localStorage) {
|
|
298
|
-
/* Fallback to `localStorage` if available */
|
|
299
|
-
this.#database = new LocalStorageDatabase();
|
|
300
|
-
}
|
|
301
|
-
else {
|
|
302
|
-
/* Fallback to memory storage otherwise */
|
|
303
|
-
this.#database = new MemoryDatabase();
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
catch {
|
|
307
|
-
/* Fallback to memory storage otherwise */
|
|
308
|
-
this.#database = new MemoryDatabase();
|
|
309
|
-
}
|
|
310
|
-
/* Redo the operation */
|
|
311
|
-
return operationCallback();
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
/* Otherwise, rethrow the error */
|
|
315
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
316
|
-
return throwError(() => error);
|
|
317
|
-
}
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* THIS METHOD IS FOR INTERNAL PURPOSE ONLY AND MUST NOT BE USED,
|
|
322
|
-
* IT CAN BE REMOVED AT ANY TIME AND MESSING WITH IT CAN CAUSE ISSUES
|
|
323
|
-
* @private
|
|
324
|
-
* @ignore
|
|
325
|
-
*/
|
|
326
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error -- Silence the not used error, it is used in tests
|
|
327
|
-
// @ts-ignore
|
|
328
|
-
ɵinternalGetDatabase() {
|
|
329
|
-
return this.#database;
|
|
330
|
-
}
|
|
331
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: StorageMap, deps: [{ token: i1.LocalDatabase }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
332
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: StorageMap, providedIn: "root" }); }
|
|
333
|
-
}
|
|
334
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: StorageMap, decorators: [{
|
|
335
|
-
type: Injectable,
|
|
336
|
-
args: [{
|
|
337
|
-
providedIn: "root"
|
|
338
|
-
}]
|
|
339
|
-
}], ctorParameters: () => [{ type: i1.LocalDatabase }] });
|
|
340
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1tYXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvbGliL3N0b3JhZ2VzL3N0b3JhZ2UtbWFwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUF5QixNQUFNLE1BQU0sQ0FBQztBQUN4RixPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBTzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7QUFLL0MsTUFBTSxPQUFPLFVBQVU7SUFFckIsU0FBUyxDQUFnQjtJQUNoQixjQUFjLENBQWdCO0lBQzlCLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztJQUVoRTs7O09BR0c7SUFDSCxZQUNFLFFBQXVCO1FBRXZCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsSUFBSSxJQUFJO1FBRU4sT0FBTyxJQUFJ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Y29yZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgb2YsIHRocm93RXJyb3IsIHR5cGUgT3BlcmF0b3JGdW5jdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtZXJnZU1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBJREJfQlJPS0VOX0VSUk9SIH0gZnJvbSBcIi4uL2RhdGFiYXNlcy9leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBJbmRleGVkREJEYXRhYmFzZSB9IGZyb20gXCIuLi9kYXRhYmFzZXMvaW5kZXhlZGRiLWRhdGFiYXNlXCI7XG5pbXBvcnQgeyBMb2NhbERhdGFiYXNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlcy9sb2NhbC1kYXRhYmFzZVwiO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlRGF0YWJhc2UgfSBmcm9tIFwiLi4vZGF0YWJhc2VzL2xvY2Fsc3RvcmFnZS1kYXRhYmFzZVwiO1xuaW1wb3J0IHsgTWVtb3J5RGF0YWJhc2UgfSBmcm9tIFwiLi4vZGF0YWJhc2VzL21lbW9yeS1kYXRhYmFzZVwiO1xuaW1wb3J0IHR5cGUge1xuICBKU09OU2NoZW1hLFxuICBKU09OU2NoZW1hQXJyYXlPZixcbiAgSlNPTlNjaGVtYUJvb2xlYW4sIEpTT05TY2hlbWFJbnRlZ2VyLFxuICBKU09OU2NoZW1hTnVtYmVyLCBKU09OU2NoZW1hU3RyaW5nXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL2pzb24tc2NoZW1hXCI7XG5pbXBvcnQgeyBKU09OVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vanNvbi12YWxpZGF0b3JcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBTdG9yYWdlTWFwIHtcblxuICAjZGF0YWJhc2U6IExvY2FsRGF0YWJhc2U7XG4gIHJlYWRvbmx5ICNqc29uVmFsaWRhdG9yOiBKU09OVmFsaWRhdG9yO1xuICByZWFkb25seSAjbm90aWZpZXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlcGxheVN1YmplY3Q8dW5rbm93bj4+KCk7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHBhcmFtcyBhcmUgcHJvdmlkZWQgYnkgQW5ndWxhciAoYnV0IGNhbiBhbHNvIGJlIHBhc3NlZCBtYW51YWxseSBpbiB0ZXN0cylcbiAgICogQHBhcmFtIGRhdGFiYXNlIFN0b3JhZ2UgdG8gdXNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhYmFzZTogTG9jYWxEYXRhYmFzZSxcbiAgKSB7XG4gICAgdGhpcy4jZGF0YWJhc2UgPSBkYXRhYmFzZTtcbiAgICB0aGlzLiNqc29uVmFsaWRhdG9yID0gbmV3IEpTT05WYWxpZGF0b3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqKk51bWJlciBvZiBpdGVtcyoqIGluIHN0b3JhZ2UsIHdyYXBwZWQgaW4gYW4gT2JzZXJ2YWJsZS5cbiAgICogXG4gICAqIE5vdGUgeW91IGRvICpub3QqIG5lZWQgdG8gdW5zdWJzY3JpYmUgKGl0IGlzIGEgc2VsZi1jb21wbGV0aW5nIE9ic2VydmFibGUpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnN0b3JhZ2VNYXAuc2l6ZS5zdWJzY3JpYmUoKHNpemUpID0+IHtcbiAgICogICBjb25zb2xlLmxvZyhzaXplKTtcbiAgICogfSk7XG4gICAqL1xuICBnZXQgc2l6ZSgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuXG4gICAgcmV0dXJuIHRoaXMuI2RhdGFiYXNlLnNpemVcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgLnBpcGUodGhpcy4jY2F0Y2hJREJCcm9rZW4oKCkgPT4gdGhpcy4jZGF0YWJhc2Uuc2l6ZSkpO1xuXG4gIH1cblxuICAvKipcbiAgICogVGVsbHMgeW91IHdoaWNoIHN0b3JhZ2UgZW5naW5lIGlzIHVzZWQuXG4gICAqIFxuICAgKiAqT25seSB1c2VmdWwgZm9yIGludGVyb3BlcmFiaWxpdHkuKlxuICAgKiBcbiAgICogTm90ZSB0aGF0IGR1ZSB0byBzb21lIGJyb3dzZXJzIGlzc3VlcyBpbiBzb21lIHNwZWNpYWwgY29udGV4dHNcbiAgICogKGxpa2UgU2FmYXJpIGNyb3NzLW9yaWdpbiBpZnJhbWVzKSxcbiAgICogKip0aGlzIGluZm9ybWF0aW9uIG1heSBiZSB3cm9uZyBhdCBpbml0aWFsaXphdGlvbiwqKlxuICAgKiBhcyB0aGUgc3RvcmFnZSBjb3VsZCBmYWxsYmFjayBmcm9tIGBpbmRleGVkREJgIHRvIGBsb2NhbFN0b3JhZ2VgXG4gICAqIG9ubHkgYWZ0ZXIgYSBmaXJzdCByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMgU3RvcmFnZSBlbmdpbmUgdXNlZFxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2Jsb2IvbWFpbi9kb2NzL0lOVEVST1BFUkFCSUxJVFkubWR9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGlmICh0aGlzLnN0b3JhZ2VNYXAuYmFja2luZ0VuZ2luZSA9PT0gJ2luZGV4ZWREQicpIHt9XG4gICAqL1xuICBnZXQgYmFja2luZ0VuZ2luZSgpOiBcImluZGV4ZWREQlwiIHwgXCJsb2NhbFN0b3JhZ2VcIiB8IFwibWVtb3J5XCIgfCBcInVua25vd25cIiB7XG5cbiAgICBpZiAodGhpcy4jZGF0YWJhc2UgaW5zdGFuY2VvZiBJbmRleGVkREJEYXRhYmFzZSkge1xuXG4gICAgICByZXR1cm4gXCJpbmRleGVkREJcIjtcblxuICAgIH0gZWxzZSBpZiAodGhpcy4jZGF0YWJhc2UgaW5zdGFuY2VvZiBMb2NhbFN0b3JhZ2VEYXRhYmFzZSkge1xuXG4gICAgICByZXR1cm4gXCJsb2NhbFN0b3JhZ2VcIjtcblxuICAgIH0gZWxzZSBpZiAodGhpcy4jZGF0YWJhc2UgaW5zdGFuY2VvZiBNZW1vcnlEYXRhYmFzZSkge1xuXG4gICAgICByZXR1cm4gXCJtZW1vcnlcIjtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIHJldHVybiBcInVua25vd25cIjtcblxuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IGBpbmRleGVkREJgIGRhdGFiYXNlLlxuICAgKiBcbiAgICogKk9ubHkgdXNlZnVsIGZvciBpbnRlcm9wZXJhYmlsaXR5LipcbiAgICogXG4gICAqIEByZXR1cm5zIGBpbmRleGVkREJgIGRhdGFiYXNlIG5hbWUsIHN0b3JlIG5hbWUgYW5kIGRhdGFiYXNlIHZlcnNpb24uXG4gICAqICoqVmFsdWVzIHdpbGwgYmUgZW1wdHkgaWYgdGhlIHN0b3JhZ2UgaXMgbm90IGBpbmRleGVkREJgLCBzbyBpdCBzaG91bGQgYmUgdXNlZCBhZnRlciBhbiBlbmdpbmUgY2hlY2sqKi5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9JTlRFUk9QRVJBQklMSVRZLm1kfVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpZiAodGhpcy5zdG9yYWdlTWFwLmJhY2tpbmdFbmdpbmUgPT09ICdpbmRleGVkREInKSB7XG4gICAqICAgY29uc3QgeyBkYXRhYmFzZSwgc3RvcmUsIHZlcnNpb24gfSA9IHRoaXMuc3RvcmFnZU1hcC5iYWNraW5nU3RvcmU7XG4gICAqIH1cbiAgICovXG4gIGdldCBiYWNraW5nU3RvcmUoKTogeyBkYXRhYmFzZTogc3RyaW5nLCBzdG9yZTogc3RyaW5nLCB2ZXJzaW9uOiBudW1iZXI7IH0ge1xuXG4gICAgcmV0dXJuICh0aGlzLiNkYXRhYmFzZSBpbnN0YW5jZW9mIEluZGV4ZWREQkRhdGFiYXNlKSA/XG4gICAgICB0aGlzLiNkYXRhYmFzZS5iYWNraW5nU3RvcmUgOlxuICAgICAgeyBkYXRhYmFzZTogXCJcIiwgc3RvcmU6IFwiXCIsIHZlcnNpb246IDAgfTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IGBsb2NhbFN0b3JhZ2VgIGZhbGxiYWNrIHN0b3JhZ2UuXG4gICAqIFxuICAgKiAqT25seSB1c2VmdWwgZm9yIGludGVyb3BlcmFiaWxpdHkuKlxuICAgKiBcbiAgICogQHJldHVybnMgYGxvY2FsU3RvcmFnZWAgcHJlZml4LlxuICAgKiAqKlZhbHVlcyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBzdG9yYWdlIGlzIG5vdCBgbG9jYWxTdG9yYWdlYCwgc28gaXQgc2hvdWxkIGJlIHVzZWQgYWZ0ZXIgYW4gZW5naW5lIGNoZWNrKiouXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvYmxvYi9tYWluL2RvY3MvSU5URVJPUEVSQUJJTElUWS5tZH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogaWYgKHRoaXMuc3RvcmFnZU1hcC5iYWNraW5nRW5naW5lID09PSAnbG9jYWxTdG9yYWdlJykge1xuICAgKiAgIGNvbnN0IHsgcHJlZml4IH0gPSB0aGlzLnN0b3JhZ2VNYXAuZmFsbGJhY2tCYWNraW5nU3RvcmU7XG4gICAqIH1cbiAgICovXG4gIGdldCBmYWxsYmFja0JhY2tpbmdTdG9yZSgpOiB7IHByZWZpeDogc3RyaW5nOyB9IHtcblxuICAgIHJldHVybiAodGhpcy4jZGF0YWJhc2UgaW5zdGFuY2VvZiBMb2NhbFN0b3JhZ2VEYXRhYmFzZSkgP1xuICAgICAgeyBwcmVmaXg6IHRoaXMuI2RhdGFiYXNlLnByZWZpeCB9IDpcbiAgICAgIHsgcHJlZml4OiBcIlwiIH07XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gaXRlbSB2YWx1ZSBpbiBzdG9yYWdlLlxuICAgKiBcbiAgICogTm90ZSB0aGF0OlxuICAgKiAqIG5vdCBmaW5kaW5nIGFuIGl0ZW0gaXMgbm90IGFuIGVycm9yLCBpdCBzdWNjZWVkcyBidXQgcmV0dXJucyBgdW5kZWZpbmVkYCxcbiAgICogKiB5b3UgZG8gKm5vdCogbmVlZCB0byB1bnN1YnNjcmliZSAoaXQgaXMgYSBzZWxmLWNvbXBsZXRpbmcgT2JzZXJ2YWJsZSksXG4gICAqICogeW91IHdpbGwgb25seSBnZXQgKm9uZSogdmFsdWU6IHRoZSBPYnNlcnZhYmxlIGlzIGhlcmUgZm9yIGFzeW5jaHJvbnkgYnV0IGlzICpub3QqIG1lYW50IHRvIGVtaXQgYWdhaW4gd2hlbiB0aGUgc3RvcmVkIGRhdGEgaXMgY2hhbmdlZC4gSWYgeW91IG5lZWQgdG8gd2F0Y2ggdGhlIHZhbHVlLCBzZWUgdGhlIGB3YXRjaGAgbWV0aG9kLlxuICAgKiBcbiAgICogRG8gbm90IGZvcmdldCBpdCBpcyBjbGllbnQtc2lkZSBzdG9yYWdlOiAqKmFsd2F5cyBjaGVjayB0aGUgZGF0YSoqLCBhcyBpdCBjb3VsZCBoYXZlIGJlZW4gZm9yZ2VkLlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2Jsb2IvbWFpbi9kb2NzL1ZBTElEQVRJT04ubWR9XG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5XG4gICAqIEBwYXJhbSBzY2hlbWEgT3B0aW9uYWwgYnV0IHJlY29tbWVuZGVkIEpTT04gc2NoZW1hIHRvIHZhbGlkYXRlIHRoZSBkYXRhXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtJ3MgdmFsdWUgaWYgdGhlIGtleSBleGlzdHMsIGB1bmRlZmluZWRgIG90aGVyd2lzZSwgd3JhcHBlZCBpbiBhIFJ4SlMgT2JzZXJ2YWJsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnN0b3JhZ2VNYXAuZ2V0KCdrZXknLCB7IHR5cGU6ICdzdHJpbmcnIH0pLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAqICAgcmVzdWx0OyAvLyBzdHJpbmcgb3IgdW5kZWZpbmVkXG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpbnRlcmZhY2UgVXNlciB7XG4gICAqICAgZmlyc3ROYW1lOiBzdHJpbmc7XG4gICAqICAgbGFzdE5hbWU/OiBzdHJpbmc7XG4gICAqIH1cbiAgICpcbiAgICogY29uc3Qgc2NoZW1hID0ge1xuICAgKiAgIHR5cGU6ICdvYmplY3QnLFxuICAgKiAgIHByb3BlcnRpZXM6IHtcbiAgICogICAgIGZpcnN0TmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgKiAgICAgbGFzdE5hbWU6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICogICB9LFxuICAgKiAgIHJlcXVpcmVkOiBbJ2ZpcnN0TmFtZSddLFxuICAgKiB9IHNhdGlzZmllcyBKU09OU2NoZW1hO1xuICAgKlxuICAgKiB0aGlzLnN0b3JhZ2VNYXAuZ2V0PFVzZXI+KCd1c2VyJywgc2NoZW1hKS5zdWJzY3JpYmUoKHVzZXIpID0+IHtcbiAgICogICBpZiAodXNlcikge1xuICAgKiAgICAgdXNlci5maXJzdE5hbWU7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICovXG4gIGdldChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj47XG4gIGdldDxUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hU3RyaW5nKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgZ2V0PFQgZXh0ZW5kcyBudW1iZXIgPSBudW1iZXI+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFJbnRlZ2VyIHwgSlNPTlNjaGVtYU51bWJlcik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIGdldDxUIGV4dGVuZHMgYm9vbGVhbiA9IGJvb2xlYW4+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFCb29sZWFuKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgZ2V0PFQgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXSA9IHN0cmluZ1tdPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hU3RyaW5nPik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzIC0tIEJldHRlciBmb3IgZG9jdW1lbnRhdGlvblxuICBnZXQ8VCBleHRlbmRzIHJlYWRvbmx5IG51bWJlcltdID0gbnVtYmVyW10+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFJbnRlZ2VyIHwgSlNPTlNjaGVtYU51bWJlcj4pOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuaWZpZWQtc2lnbmF0dXJlcyAtLSBCZXR0ZXIgZm9yIGRvY3VtZW50YXRpb25cbiAgZ2V0PFQgZXh0ZW5kcyByZWFkb25seSBib29sZWFuW10gPSBib29sZWFuW10+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFCb29sZWFuPik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIGdldDxUPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgZ2V0PFQgPSB1bmtub3duPihrZXk6IHN0cmluZywgc2NoZW1hPzogSlNPTlNjaGVtYSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuXG4gICAgLyogR2V0IHRoZSBkYXRhIGluIHN0b3JhZ2UgKi9cbiAgICByZXR1cm4gdGhpcy4jZGF0YWJhc2UuZ2V0KGtleSkucGlwZShcbiAgICAgIC8qIENoZWNrIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgdGhpcy4jY2F0Y2hJREJCcm9rZW4oKCkgPT4gdGhpcy4jZGF0YWJhc2UuZ2V0KGtleSkpLFxuICAgICAgbWVyZ2VNYXAoKGRhdGEpID0+IHtcblxuICAgICAgICAvKiBObyBuZWVkIHRvIHZhbGlkYXRlIGlmIHRoZSBkYXRhIGlzIGVtcHR5ICovXG4gICAgICAgIGlmICgoZGF0YSA9PT0gdW5kZWZpbmVkKSB8fCAoZGF0YSA9PT0gbnVsbCkpIHtcblxuICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hKSB7XG5cbiAgICAgICAgICAvKiBWYWxpZGF0ZSBkYXRhIGFnYWluc3QgYSBKU09OIHNjaGVtYSBpZiBwcm92aWRlZCAqL1xuICAgICAgICAgIGlmICghdGhpcy4janNvblZhbGlkYXRvci52YWxpZGF0ZShkYXRhLCBzY2hlbWEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qIERhdGEgaGF2ZSBiZWVuIGNoZWNrZWQsIHNvIGl0J3MgT0sgdG8gY2FzdCAqL1xuICAgICAgICAgIHJldHVybiBvZihkYXRhIGFzIFQgfCB1bmRlZmluZWQpO1xuXG4gICAgICAgIH1cblxuICAgICAgICAvKiBDYXN0IHRvIHVua25vd24gYXMgdGhlIGRhdGEgd2Fzbid0IGNoZWNrZWQgKi9cbiAgICAgICAgcmV0dXJuIG9mKGRhdGEpO1xuXG4gICAgICB9KSxcbiAgICApO1xuXG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgYW4gaXRlbSBpbiBzdG9yYWdlLlxuICAgKiBcbiAgICogTm90ZSB0aGF0OlxuICAgKiAqIHlvdSAqZG8qIG5lZWQgdG8gc3Vic2NyaWJlLCBldmVuIGlmIHlvdSBkbyBub3QgaGF2ZSBzb21ldGhpbmcgc3BlY2lmaWMgdG8gZG8gYWZ0ZXIgd3JpdGluZyBpbiBzdG9yYWdlLCBvdGhlcndpc2Ugbm90aGluZyBoYXBwZW5zIChiZWNhdXNlIGl0IGlzIGhvdyBSeEpTIE9ic2VydmFibGVzIHdvcmspLFxuICAgKiAqIGJ1dCB5b3UgZG8gKm5vdCogbmVlZCB0byB1bnN1YnNjcmliZSAoaXQgaXMgYSBzZWxmLWNvbXBsZXRpbmcgT2JzZXJ2YWJsZSksXG4gICAqICogc2V0dGluZyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgd2lsbCByZW1vdmUgdGhlIGl0ZW0gdG8gYXZvaWQgc29tZSBicm93c2VycyBpc3N1ZXMsXG4gICAqICogeW91IHNob3VsZCBzdGljayB0byBzZXJpYWxpemFibGUgSlNPTiBkYXRhLCBtZWFuaW5nIHByaW1pdGl2ZSB0eXBlcywgYXJyYXlzIGFuZCBsaXRlcmFsIG9iamVjdHMuIERhdGUsIE1hcCwgU2V0LCBCbG9iIGFuZCBvdGhlciBzcGVjaWFsIHN0cnVjdHVyZXMgY2FuIGNhdXNlIGlzc3VlcyBpbiBzb21lIHNjZW5hcmlvcy5cbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9TRVJJQUxJWkFUSU9OLm1kfVxuICAgKiBcbiAgICogQHBhcmFtIGtleSBUaGUgaXRlbSdzIGtleVxuICAgKiBAcGFyYW0gZGF0YSBUaGUgaXRlbSdzIHZhbHVlXG4gICAqIEBwYXJhbSBzY2hlbWEgT3B0aW9uYWwgSlNPTiBzY2hlbWEgdG8gdmFsaWRhdGUgdGhlIGRhdGFcbiAgICogQHJldHVybnMgQSBSeEpTIE9ic2VydmFibGUgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLnNldCgna2V5JywgJ3ZhbHVlJykuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICovXG4gIHNldChrZXk6IHN0cmluZywgZGF0YTogdW5rbm93biwgc2NoZW1hPzogSlNPTlNjaGVtYSk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICAvKiBTdG9yaW5nIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpcyB1c2VsZXNzIGFuZCBjYW4gY2F1c2UgaXNzdWVzIGluIGBpbmRleGVkRGJgIGluIHNvbWUgYnJvd3NlcnMsXG4gICAgICogc28gcmVtb3ZpbmcgaXRlbSBpbnN0ZWFkIGZvciBhbGwgc3RvcmFnZXMgdG8gaGF2ZSBhIGNvbnNpc3RlbnQgQVBJICovXG4gICAgaWYgKChkYXRhID09PSB1bmRlZmluZWQpIHx8IChkYXRhID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgLyogVmFsaWRhdGUgZGF0YSBhZ2FpbnN0IGEgSlNPTiBzY2hlbWEgaWYgcHJvdmlkZWQgKi9cbiAgICBpZiAoc2NoZW1hICYmICF0aGlzLiNqc29uVmFsaWRhdG9yLnZhbGlkYXRlKGRhdGEsIHNjaGVtYSkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBWYWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2RhdGFiYXNlLnNldChrZXksIGRhdGEpLnBpcGUoXG4gICAgICAvKiBDYXRjaCBpZiBgaW5kZXhlZERiYCBpcyBicm9rZW4gKi9cbiAgICAgIHRoaXMuI2NhdGNoSURCQnJva2VuKCgpID0+IHRoaXMuI2RhdGFiYXNlLnNldChrZXksIGRhdGEpKSxcbiAgICAgIC8qIE5vdGlmeSB3YXRjaGVycyAobXVzdCBiZSBsYXN0IGJlY2F1c2UgaXQgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMpICovXG4gICAgICB0YXAoKCkgPT4geyB0aGlzLiNub3RpZnkoa2V5LCBkYXRhKTsgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gaXRlbSBpbiBzdG9yYWdlLlxuICAgKiBcbiAgICogTm90ZSB0aGF0OlxuICAgKiAqIHlvdSAqZG8qIG5lZWQgdG8gc3Vic2NyaWJlLCBldmVuIGlmIHlvdSBkbyBub3QgaGF2ZSBzb21ldGhpbmcgc3BlY2lmaWMgdG8gZG8gYWZ0ZXIgZGVsZXRpbmcsIG90aGVyd2lzZSBub3RoaW5nIGhhcHBlbnMgKGJlY2F1c2UgaXQgaXMgaG93IFJ4SlMgT2JzZXJ2YWJsZXMgd29yayksXG4gICAqICogYnV0IHlvdSBkbyAqbm90KiBuZWVkIHRvIHVuc3Vic2NyaWJlIChpdCBpcyBhIHNlbGYtY29tcGxldGluZyBPYnNlcnZhYmxlKS5cbiAgICogXG4gICAqIEBwYXJhbSBrZXkgVGhlIGl0ZW0ncyBrZXlcbiAgICogQHJldHVybnMgQSBSeEpTIE9ic2VydmFibGUgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLmRlbGV0ZSgna2V5Jykuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICovXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICByZXR1cm4gdGhpcy4jZGF0YWJhc2UuZGVsZXRlKGtleSkucGlwZShcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgdGhpcy4jY2F0Y2hJREJCcm9rZW4oKCkgPT4gdGhpcy4jZGF0YWJhc2UuZGVsZXRlKGtleSkpLFxuICAgICAgLyogTm90aWZ5IHdhdGNoZXJzIChtdXN0IGJlIGxhc3QgYmVjYXVzZSBpdCBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcykgKi9cbiAgICAgIHRhcCgoKSA9PiB7IHRoaXMuI25vdGlmeShrZXksIHVuZGVmaW5lZCk7IH0pLFxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYWxsIGl0ZW1zIGluIHN0b3JhZ2UuXG4gICAqIFxuICAgKiBOb3RlIHRoYXQ6XG4gICAqICogeW91ICpkbyogbmVlZCB0byBzdWJzY3JpYmUsIGV2ZW4gaWYgeW91IGRvIG5vdCBoYXZlIHNvbWV0aGluZyBzcGVjaWZpYyB0byBkbyBhZnRlciBjbGVhcmluZywgb3RoZXJ3aXNlIG5vdGhpbmcgaGFwcGVucyAoYmVjYXVzZSBpdCBpcyBob3cgUnhKUyBPYnNlcnZhYmxlcyB3b3JrKSxcbiAgICogKiBidXQgeW91IGRvICpub3QqIG5lZWQgdG8gdW5zdWJzY3JpYmUgKGl0IGlzIGEgc2VsZi1jb21wbGV0aW5nIE9ic2VydmFibGUpLlxuICAgKiBcbiAgICogQHJldHVybnMgQSBSeEpTIE9ic2VydmFibGUgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLmNsZWFyKCkuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICovXG4gIGNsZWFyKCk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICByZXR1cm4gdGhpcy4jZGF0YWJhc2UuY2xlYXIoKS5waXBlKFxuICAgICAgLyogQ2F0Y2ggaWYgYGluZGV4ZWREYmAgaXMgYnJva2VuICovXG4gICAgICB0aGlzLiNjYXRjaElEQkJyb2tlbigoKSA9PiB0aGlzLiNkYXRhYmFzZS5jbGVhcigpKSxcbiAgICAgIC8qIE5vdGlmeSB3YXRjaGVycyAobXVzdCBiZSBsYXN0IGJlY2F1c2UgaXQgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMpICovXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLiNub3RpZmllcnMua2V5cygpKSB7XG4gICAgICAgICAgdGhpcy4jbm90aWZ5KGtleSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwga2V5cyBzdG9yZWQgaW4gc3RvcmFnZS5cbiAgICogXG4gICAqIE5vdGUgKip0aGlzIGlzIGFuICppdGVyYXRpbmcqIE9ic2VydmFibGUqKjpcbiAgICogKiBpZiB0aGVyZSBpcyBubyBrZXksIHRoZSBgbmV4dGAgY2FsbGJhY2sgd2lsbCBub3QgYmUgaW52b2tlZCxcbiAgICogKiBpZiB5b3UgbmVlZCB0byB3YWl0IHRoZSB3aG9sZSBvcGVyYXRpb24gdG8gZW5kLCBiZSBzdXJlIHRvIGFjdCBpbiB0aGUgYGNvbXBsZXRlYCBjYWxsYmFjayxcbiAgICogYXMgdGhpcyBPYnNlcnZhYmxlIGNhbiBlbWl0IHNldmVyYWwgdmFsdWVzIGFuZCBzbyB3aWxsIGludm9rZSB0aGUgYG5leHRgIGNhbGxiYWNrIHNldmVyYWwgdGltZXMsXG4gICAqICogeW91IGRvICpub3QqIG5lZWQgdG8gdW5zdWJzY3JpYmUgKGl0IGlzIGEgc2VsZi1jb21wbGV0aW5nIE9ic2VydmFibGUpLlxuICAgKiBcbiAgICogQHJldHVybnMgQSBsaXN0IG9mIHRoZSBrZXlzIHdyYXBwZWQgaW4gYSBSeEpTIE9ic2VydmFibGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLmtleXMoKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChrZXkpID0+IHsgY29uc29sZS5sb2coa2V5KTsgfSxcbiAgICogICBjb21wbGV0ZTogKCkgPT4geyBjb25zb2xlLmxvZygnRG9uZScpOyB9LFxuICAgKiB9KTtcbiAgICovXG4gIGtleXMoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiB0aGlzLiNkYXRhYmFzZS5rZXlzKClcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgLnBpcGUodGhpcy4jY2F0Y2hJREJCcm9rZW4oKCkgPT4gdGhpcy4jZGF0YWJhc2Uua2V5cygpKSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxscyBpZiBhIGtleSBleGlzdHMgaW4gc3RvcmFnZS5cbiAgICogXG4gICAqIE5vdGUgeW91IGRvICpub3QqIG5lZWQgdG8gdW5zdWJzY3JpYmUgKGl0IGlzIGEgc2VsZi1jb21wbGV0aW5nIE9ic2VydmFibGUpLlxuICAgKiBcbiAgICogQHJldHVybnMgQSBSeEpTIE9ic2VydmFibGUgdGVsbGluZyBpZiB0aGUga2V5IGV4aXN0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnN0b3JhZ2VNYXAuaGFzKCdrZXknKS5zdWJzY3JpYmUoKGhhc0tleSkgPT4ge1xuICAgKiAgIGlmIChoYXNLZXkpIHt9XG4gICAqIH0pO1xuICAgKi9cbiAgaGFzKGtleTogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG5cbiAgICByZXR1cm4gdGhpcy4jZGF0YWJhc2UuaGFzKGtleSlcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgLnBpcGUodGhpcy4jY2F0Y2hJREJCcm9rZW4oKCkgPT4gdGhpcy4jZGF0YWJhc2UuaGFzKGtleSkpKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoIGFuIGl0ZW0gdmFsdWUgaW4gc3RvcmFnZS5cbiAgICogXG4gICAqIE5vdGUgdGhhdDpcbiAgICogKiBpdCBpcyBhbiBpbmZpbml0ZSBPYnNlcnZhYmxlLCBkbyBub3QgZm9yZ2V0IHRvIHVuc3Vic2NyaWJlLFxuICAgKiAqIG9ubHkgY2hhbmdlcyBkb25lIHZpYSB0aGlzIGxpYnJhcnkgd2lsbCBiZSB3YXRjaGVkLCBleHRlcm5hbCBjaGFuZ2VzIGluIHN0b3JhZ2UgY2Fubm90IGJlIGRldGVjdGVkLlxuICAgKiBcbiAgICogVGhlIHNpZ25hdHVyZSBoYXMgbWFueSBvdmVybG9hZHMgZHVlIHRvIHZhbGlkYXRpb24sICoqcGxlYXNlIHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uLioqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9WQUxJREFUSU9OLm1kXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5IHRvIHdhdGNoXG4gICAqIEBwYXJhbSBzY2hlbWEgT3B0aW9uYWwgSlNPTiBzY2hlbWEgdG8gdmFsaWRhdGUgdGhlIGluaXRpYWwgdmFsdWVcbiAgICogQHJldHVybnMgQW4gaW5maW5pdGUgT2JzZXJ2YWJsZSBnaXZpbmcgdGhlIGN1cnJlbnQgdmFsdWVcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIENvbXBvbmVudCgpXG4gICAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICogXG4gICAqICAgcHJpdmF0ZSBzdG9yYWdlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgKiBcbiAgICogICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICogICAgIHRoaXMuc3RvcmFnZVN1YnNjcmlwdGlvbiA9IHRoaXMuc3RvcmFnZU1hcC53YXRjaCgna2V5JywgeyB0eXBlOiAnc3RyaW5nJyB9KS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgKiAgICAgICByZXN1bHQ7IC8vIHN0cmluZyBvciB1bmRlZmluZWRcbiAgICogICAgIH0pO1xuICAgKiAgIH1cbiAgICogXG4gICAqICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAqICAgICB0aGlzLnN0b3JhZ2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAqICAgfVxuICAgKiBcbiAgICogfVxuICAgKi9cbiAgd2F0Y2goa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+O1xuICB3YXRjaDxUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hU3RyaW5nKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgd2F0Y2g8VCBleHRlbmRzIG51bWJlciA9IG51bWJlcj4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hTnVtYmVyKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgd2F0Y2g8VCBleHRlbmRzIGJvb2xlYW4gPSBib29sZWFuPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQm9vbGVhbik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIHdhdGNoPFQgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXSA9IHN0cmluZ1tdPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hU3RyaW5nPik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzIC0tIEJldHRlciBmb3IgZG9jdW1lbnRhdGlvblxuICB3YXRjaDxUIGV4dGVuZHMgcmVhZG9ubHkgbnVtYmVyW10gPSBudW1iZXJbXT4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hTnVtYmVyPik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzIC0tIEJldHRlciBmb3IgZG9jdW1lbnRhdGlvblxuICB3YXRjaDxUIGV4dGVuZHMgcmVhZG9ubHkgYm9vbGVhbltdID0gYm9vbGVhbltdPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hQm9vbGVhbj4pOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+O1xuICB3YXRjaDxUPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgd2F0Y2g8VCA9IHVua25vd24+KGtleTogc3RyaW5nLCBzY2hlbWE/OiBKU09OU2NoZW1hKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG5cbiAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgbm90aWZpZXIgKi9cbiAgICBpZiAoIXRoaXMuI25vdGlmaWVycy5oYXMoa2V5KSkge1xuICAgICAgdGhpcy4jbm90aWZpZXJzLnNldChrZXksIG5ldyBSZXBsYXlTdWJqZWN0KDEpKTtcbiAgICB9XG5cbiAgICAvKiBOb24tbnVsbCBhc3NlcnRpb24gaXMgcmVxdWlyZWQgYmVjYXVzZSBUeXBlU2NyaXB0IGRvZXNuJ3QgbmFycm93IGAuaGFzKClgIHlldCAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uIC0tIEVuc3VyZWQgYnkgdGhlIGxvZ2ljXG4gICAgY29uc3Qgbm90aWZpZXIgPSB0aGlzLiNub3RpZmllcnMuZ2V0KGtleSkhO1xuXG4gICAgLyogR2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgKi9cbiAgICAoc2NoZW1hID8gdGhpcy5nZXQ8VD4oa2V5LCBzY2hlbWEpIDogdGhpcy5nZXQoa2V5KSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICAgICAgbm90aWZpZXIubmV4dChyZXN1bHQpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgbm90aWZpZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8qIE9ubHkgdGhlIHB1YmxpYyBBUEkgb2YgdGhlIE9ic2VydmFibGUgc2hvdWxkIGJlIHJldHVybmVkICovXG4gICAgcmV0dXJuIChzY2hlbWEgP1xuICAgICAgbm90aWZpZXIuYXNPYnNlcnZhYmxlKCkgYXMgT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiA6XG4gICAgICBub3RpZmllci5hc09ic2VydmFibGUoKVxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgd2hlbiBhIHZhbHVlIGNoYW5nZXNcbiAgICogQHBhcmFtIGtleSBUaGUgaXRlbSdzIGtleVxuICAgKiBAcGFyYW0gZGF0YSBUaGUgbmV3IHZhbHVlXG4gICAqL1xuICAjbm90aWZ5KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuXG4gICAgY29uc3Qgbm90aWZpZXIgPSB0aGlzLiNub3RpZmllcnMuZ2V0KGtleSk7XG5cbiAgICBpZiAobm90aWZpZXIpIHtcbiAgICAgIG5vdGlmaWVyLm5leHQodmFsdWUpO1xuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIFJ4SlMgb3BlcmF0b3IgdG8gY2F0Y2ggaWYgYGluZGV4ZWREQmAgaXMgYnJva2VuXG4gICAqIEBwYXJhbSBvcGVyYXRpb25DYWxsYmFjayBDYWxsYmFjayB3aXRoIHRoZSBvcGVyYXRpb24gdG8gcmVkb1xuICAgKi9cbiAgI2NhdGNoSURCQnJva2VuPFQ+KG9wZXJhdGlvbkNhbGxiYWNrOiAoKSA9PiBPYnNlcnZhYmxlPFQ+KTogT3BlcmF0b3JGdW5jdGlvbjxULCBUPiB7XG5cbiAgICByZXR1cm4gY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcblxuICAgICAgLyogQ2hlY2sgaWYgYGluZGV4ZWREQmAgaXMgYnJva2VuIGJhc2VkIG9uIGVycm9yIG1lc3NhZ2UgKHRoZSBzcGVjaWZpYyBlcnJvciBjbGFzcyBzZWVtcyB0byBiZSBsb3N0IGluIHRoZSBwcm9jZXNzKSAqL1xuICAgICAgaWYgKChlcnJvciAhPT0gdW5kZWZpbmVkKSAmJiAoZXJyb3IgIT09IG51bGwpXG4gICAgICAgICYmICh0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIpICYmIChcIm1lc3NhZ2VcIiBpbiBlcnJvcilcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAtLSBSZXF1aXJlZCBiZWNhdXNlIFR5cGVTY3JpcHQgbmFycm93aW5nIGlzIG5vdCB3b3JraW5nIGhlcmVcbiAgICAgICAgJiYgKGVycm9yLm1lc3NhZ2UgPT09IElEQl9CUk9LRU5fRVJST1IpKSB7XG5cbiAgICAgICAgLyogV2hlbiBzdG9yYWdlIGlzIGZ1bGx5IGRpc2FibGVkIGluIGJyb3dzZXIgKHZpYSB0aGUgXCJCbG9jayBhbGwgY29va2llc1wiIG9wdGlvbiksXG4gICAgICAgICAqIGp1c3QgdHJ5aW5nIHRvIGNoZWNrIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIGNhdXNlcyBhIHNlY3VyaXR5IGV4Y2VwdGlvbi5cbiAgICAgICAgICogUHJldmVudHMgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9pc3N1ZXMvMTE4XG4gICAgICAgICAqL1xuICAgICAgICB0cnkge1xuXG4gICAgICAgICAgaWYgKFwiZ2V0SXRlbVwiIGluIGxvY2FsU3RvcmFnZSkge1xuXG4gICAgICAgICAgICAvKiBGYWxsYmFjayB0byBgbG9jYWxTdG9yYWdlYCBpZiBhdmFpbGFibGUgKi9cbiAgICAgICAgICAgIHRoaXMuI2RhdGFiYXNlID0gbmV3IExvY2FsU3RvcmFnZURhdGFiYXNlKCk7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAvKiBGYWxsYmFjayB0byBtZW1vcnkgc3RvcmFnZSBvdGhlcndpc2UgKi9cbiAgICAgICAgICAgIHRoaXMuI2RhdGFiYXNlID0gbmV3IE1lbW9yeURhdGFiYXNlKCk7XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCB7XG5cbiAgICAgICAgICAvKiBGYWxsYmFjayB0byBtZW1vcnkgc3RvcmFnZSBvdGhlcndpc2UgKi9cbiAgICAgICAgICB0aGlzLiNkYXRhYmFzZSA9IG5ldyBNZW1vcnlEYXRhYmFzZSgpO1xuXG4gICAgICAgIH1cblxuICAgICAgICAvKiBSZWRvIHRoZSBvcGVyYXRpb24gKi9cbiAgICAgICAgcmV0dXJuIG9wZXJhdGlvbkNhbGxiYWNrKCk7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgLyogT3RoZXJ3aXNlLCByZXRocm93IHRoZSBlcnJvciAqL1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFRISVMgTUVUSE9EIElTIEZPUiBJTlRFUk5BTCBQVVJQT1NFIE9OTFkgQU5EIE1VU1QgTk9UIEJFIFVTRUQsXG4gICAqIElUIENBTiBCRSBSRU1PVkVEIEFUIEFOWSBUSU1FIEFORCBNRVNTSU5HIFdJVEggSVQgQ0FOIENBVVNFIElTU1VFU1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAaWdub3JlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBTaWxlbmNlIHRoZSBub3QgdXNlZCBlcnJvciwgaXQgaXMgdXNlZCBpbiB0ZXN0c1xuICAvLyBAdHMtaWdub3JlXG4gIHByaXZhdGUgybVpbnRlcm5hbEdldERhdGFiYXNlKCk6IExvY2FsRGF0YWJhc2Uge1xuXG4gICAgcmV0dXJuIHRoaXMuI2RhdGFiYXNlO1xuXG4gIH1cblxufVxuIl19
|
package/esm2022/lib/tokens.mjs
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from "@angular/core";
|
|
2
|
-
/**
|
|
3
|
-
* Token to provide a prefix to `localStorage` keys.
|
|
4
|
-
*/
|
|
5
|
-
export const LS_PREFIX = new InjectionToken("localStoragePrefix", {
|
|
6
|
-
providedIn: "root",
|
|
7
|
-
factory: () => ""
|
|
8
|
-
});
|
|
9
|
-
/**
|
|
10
|
-
* Default name used for `indexedDB` database.
|
|
11
|
-
*/
|
|
12
|
-
export const DEFAULT_IDB_DB_NAME = "ngStorage";
|
|
13
|
-
/**
|
|
14
|
-
* Token to provide `indexedDB` database name.
|
|
15
|
-
*/
|
|
16
|
-
export const IDB_DB_NAME = new InjectionToken("localStorageIDBDBName", {
|
|
17
|
-
providedIn: "root",
|
|
18
|
-
factory: () => DEFAULT_IDB_DB_NAME
|
|
19
|
-
});
|
|
20
|
-
/**
|
|
21
|
-
* Default version used for `indexedDB` database.
|
|
22
|
-
*/
|
|
23
|
-
export const DEFAULT_IDB_DB_VERSION = 1;
|
|
24
|
-
/**
|
|
25
|
-
* Token to provide `indexedDB` database version.
|
|
26
|
-
* Must be an unsigned **integer**.
|
|
27
|
-
*/
|
|
28
|
-
export const IDB_DB_VERSION = new InjectionToken("localStorageIDBDBVersion", {
|
|
29
|
-
providedIn: "root",
|
|
30
|
-
factory: () => DEFAULT_IDB_DB_VERSION
|
|
31
|
-
});
|
|
32
|
-
/**
|
|
33
|
-
* Default name used for `indexedDB` object store.
|
|
34
|
-
*/
|
|
35
|
-
export const DEFAULT_IDB_STORE_NAME = "localStorage";
|
|
36
|
-
/**
|
|
37
|
-
* Token to provide `indexedDB` store name.
|
|
38
|
-
* For backward compatibility, the default can't be set now, `IndexedDBDatabase` will do it at runtime.
|
|
39
|
-
*/
|
|
40
|
-
export const IDB_STORE_NAME = new InjectionToken("localStorageIDBStoreName", {
|
|
41
|
-
providedIn: "root",
|
|
42
|
-
factory: () => DEFAULT_IDB_STORE_NAME
|
|
43
|
-
});
|
|
44
|
-
/**
|
|
45
|
-
* Default value for interoperability with native `indexedDB` and other storage libs,
|
|
46
|
-
* by changing how values are stored in `indexedDB` database.
|
|
47
|
-
*/
|
|
48
|
-
export const DEFAULT_IDB_NO_WRAP = true;
|
|
49
|
-
/**
|
|
50
|
-
* Token to allow interoperability with native `indexedDB` and other storage libs,
|
|
51
|
-
* by changing how values are stored in `indexedDB` database.
|
|
52
|
-
* Defaults to `true`. Change to `false` for backward compatiblity in existing applications.
|
|
53
|
-
* **DO NOT CHANGE THIS BEHAVIOR ONCE IN PRODUCTION**, as it would break with existing data.
|
|
54
|
-
*/
|
|
55
|
-
export const IDB_NO_WRAP = new InjectionToken("localStorageIDBWrap", {
|
|
56
|
-
providedIn: "root",
|
|
57
|
-
factory: () => DEFAULT_IDB_NO_WRAP
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3NyYy9saWIvdG9rZW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVMsb0JBQW9CLEVBQUU7SUFDeEUsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7Q0FDbEIsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQVMsdUJBQXVCLEVBQUU7SUFDN0UsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLG1CQUFtQjtDQUNuQyxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUV4Qzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQVMsMEJBQTBCLEVBQUU7SUFDbkYsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNCQUFzQjtDQUN0QyxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLGNBQWMsQ0FBQztBQUVyRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQVMsMEJBQTBCLEVBQUU7SUFDbkYsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNCQUFzQjtDQUN0QyxDQUFDLENBQUM7QUFFSDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFeEM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQVUscUJBQXFCLEVBQUU7SUFDNUUsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLG1CQUFtQjtDQUNuQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbi8qKlxuICogVG9rZW4gdG8gcHJvdmlkZSBhIHByZWZpeCB0byBgbG9jYWxTdG9yYWdlYCBrZXlzLlxuICovXG5leHBvcnQgY29uc3QgTFNfUFJFRklYID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJsb2NhbFN0b3JhZ2VQcmVmaXhcIiwge1xuICBwcm92aWRlZEluOiBcInJvb3RcIixcbiAgZmFjdG9yeTogKCkgPT4gXCJcIlxufSk7XG5cbi8qKlxuICogRGVmYXVsdCBuYW1lIHVzZWQgZm9yIGBpbmRleGVkREJgIGRhdGFiYXNlLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9JREJfREJfTkFNRSA9IFwibmdTdG9yYWdlXCI7XG5cbi8qKlxuICogVG9rZW4gdG8gcHJvdmlkZSBgaW5kZXhlZERCYCBkYXRhYmFzZSBuYW1lLlxuICovXG5leHBvcnQgY29uc3QgSURCX0RCX05BTUUgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImxvY2FsU3RvcmFnZUlEQkRCTmFtZVwiLCB7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0lEQl9EQl9OQU1FXG59KTtcblxuLyoqXG4gKiBEZWZhdWx0IHZlcnNpb24gdXNlZCBmb3IgYGluZGV4ZWREQmAgZGF0YWJhc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lEQl9EQl9WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBUb2tlbiB0byBwcm92aWRlIGBpbmRleGVkREJgIGRhdGFiYXNlIHZlcnNpb24uXG4gKiBNdXN0IGJlIGFuIHVuc2lnbmVkICoqaW50ZWdlcioqLlxuICovXG5leHBvcnQgY29uc3QgSURCX0RCX1ZFUlNJT04gPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImxvY2FsU3RvcmFnZUlEQkRCVmVyc2lvblwiLCB7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0lEQl9EQl9WRVJTSU9OXG59KTtcblxuLyoqXG4gKiBEZWZhdWx0IG5hbWUgdXNlZCBmb3IgYGluZGV4ZWREQmAgb2JqZWN0IHN0b3JlLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9JREJfU1RPUkVfTkFNRSA9IFwibG9jYWxTdG9yYWdlXCI7XG5cbi8qKlxuICogVG9rZW4gdG8gcHJvdmlkZSBgaW5kZXhlZERCYCBzdG9yZSBuYW1lLlxuICogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSBkZWZhdWx0IGNhbid0IGJlIHNldCBub3csIGBJbmRleGVkREJEYXRhYmFzZWAgd2lsbCBkbyBpdCBhdCBydW50aW1lLlxuICovXG5leHBvcnQgY29uc3QgSURCX1NUT1JFX05BTUUgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImxvY2FsU3RvcmFnZUlEQlN0b3JlTmFtZVwiLCB7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0lEQl9TVE9SRV9OQU1FXG59KTtcblxuLyoqXG4gKiBEZWZhdWx0IHZhbHVlIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggbmF0aXZlIGBpbmRleGVkREJgIGFuZCBvdGhlciBzdG9yYWdlIGxpYnMsXG4gKiBieSBjaGFuZ2luZyBob3cgdmFsdWVzIGFyZSBzdG9yZWQgaW4gYGluZGV4ZWREQmAgZGF0YWJhc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lEQl9OT19XUkFQID0gdHJ1ZTtcblxuLyoqXG4gKiBUb2tlbiB0byBhbGxvdyBpbnRlcm9wZXJhYmlsaXR5IHdpdGggbmF0aXZlIGBpbmRleGVkREJgIGFuZCBvdGhlciBzdG9yYWdlIGxpYnMsXG4gKiBieSBjaGFuZ2luZyBob3cgdmFsdWVzIGFyZSBzdG9yZWQgaW4gYGluZGV4ZWREQmAgZGF0YWJhc2UuXG4gKiBEZWZhdWx0cyB0byBgdHJ1ZWAuIENoYW5nZSB0byBgZmFsc2VgIGZvciBiYWNrd2FyZCBjb21wYXRpYmxpdHkgaW4gZXhpc3RpbmcgYXBwbGljYXRpb25zLlxuICogKipETyBOT1QgQ0hBTkdFIFRISVMgQkVIQVZJT1IgT05DRSBJTiBQUk9EVUNUSU9OKiosIGFzIGl0IHdvdWxkIGJyZWFrIHdpdGggZXhpc3RpbmcgZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IElEQl9OT19XUkFQID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KFwibG9jYWxTdG9yYWdlSURCV3JhcFwiLCB7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0lEQl9OT19XUkFQXG59KTtcblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSBpcyBvbmx5IGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksICoqZG8gbm90IGFkZCBpdCBieSB5b3Vyc2VsZioqXG4gKiBcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlQ29uZmlnIHtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBwcm92aWRlTG9jYWxTdG9yYWdlUHJlZml4KClgIG1ldGhvZCBpbnN0ZWFkXG4gICAqL1xuICBMU1ByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBwcm92aWRlSW5kZXhlZERCRGF0YUJhc2VOYW1lKClgIG1ldGhvZCBpbnN0ZWFkXG4gICAqL1xuICBJREJEQk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgcHJvdmlkZUluZGV4ZWREQlN0b3JlTmFtZSgpYCBtZXRob2QgaW5zdGVhZFxuICAgKi9cbiAgSURCU3RvcmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYHByb3ZpZGVJbmRleGVkREJEYXRhQmFzZVZlcnNpb24oKWAgbWV0aG9kIGluc3RlYWRcbiAgICovXG4gIElEQkRCVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogQWxsb3dzIGludGVyb3BlcmFiaWxpdHkgd2l0aCBuYXRpdmUgYGluZGV4ZWREQmAgYW5kIG90aGVyIHN0b3JhZ2UgbGlicyxcbiAgICogYnkgY2hhbmdpbmcgaG93IHZhbHVlcyBhcmUgc3RvcmVkIGluIGBpbmRleGVkREJgIGRhdGFiYXNlLlxuICAgKiBcbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLiBDaGFuZ2UgdG8gYGZhbHNlYCBmb3IgYmFja3dhcmQgY29tcGF0aWJsaXR5IGluIGV4aXN0aW5nIGFwcGxpY2F0aW9ucy5cbiAgICogXG4gICAqICoqRE8gTk9UIENIQU5HRSBUSElTIEJFSEFWSU9SIE9OQ0UgSU4gUFJPRFVDVElPTioqLCBhcyBpdCB3b3VsZCBicmVhayB3aXRoIGV4aXN0aW5nIGRhdGEuXG4gICAqL1xuICBJREJOb1dyYXA/OiBib29sZWFuO1xuXG59XG4iXX0=
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/* All schemas interfaces must have a required and different `type`,
|
|
2
|
-
* to create a TypeScript discriminant union type.
|
|
3
|
-
* Avoid https://github.com/cyrilletuzi/angular-async-local-storage/issues/64 */
|
|
4
|
-
export {};
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2xpYi92YWxpZGF0aW9uL2pzb24tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztnRkFFZ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBBbGwgc2NoZW1hcyBpbnRlcmZhY2VzIG11c3QgaGF2ZSBhIHJlcXVpcmVkIGFuZCBkaWZmZXJlbnQgYHR5cGVgLFxuICogdG8gY3JlYXRlIGEgVHlwZVNjcmlwdCBkaXNjcmltaW5hbnQgdW5pb24gdHlwZS5cbiAqIEF2b2lkIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvaXNzdWVzLzY0ICovXG5cbi8qKlxuICogSlNPTiBTY2hlbWEgdG8gZGVzY3JpYmUgYSBib29sZWFuIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFCb29sZWFuIHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYSBib29sZWFuIHZhbHVlLlxuICAgKi9cbiAgdHlwZTogXCJib29sZWFuXCI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIHRoaXMuXG4gICAqL1xuICBjb25zdD86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBKU09OIFNjaGVtYSB0byBkZXNjcmliZSBhIG51bWJlciB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hTnVtYmVyIHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYSBudW1lcmljIHZhbHVlLlxuICAgKi9cbiAgdHlwZTogXCJudW1iZXJcIjtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgc3RyaWN0bHkgZXF1YWwgdG8gdGhpcy5cbiAgICovXG4gIGNvbnN0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBzdHJpY3RseSBlcXVhbCB0byBvbmUgb2YgdGhlIHZhbHVlIG9mIGVudW0uXG4gICAqL1xuICBlbnVtPzogcmVhZG9ubHkgbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGEgbXVsdGlwbGUgb2YgeC5cbiAgICogTXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gMC5cbiAgICovXG4gIG11bHRpcGxlT2Y/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGxvd2VyIG9yIGVxdWFsIHRoYW4gdGhpcyBtYXhpbXVtLlxuICAgKi9cbiAgbWF4aW11bT86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgc3RyaWN0bHkgbG93ZXIgdGhhbiB0aGlzIG1heGltdW0uXG4gICAqL1xuICBleGNsdXNpdmVNYXhpbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gdGhpcyBtaW5pbXVtLlxuICAgKi9cbiAgbWluaW11bT86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHRoaXMgbWluaW11bS5cbiAgICovXG4gIGV4Y2x1c2l2ZU1pbmltdW0/OiBudW1iZXI7XG5cbn1cblxuLyoqXG4gKiBKU09OIFNjaGVtYSB0byBkZXNjcmliZSBhbiBpbnRlZ2VyIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFJbnRlZ2VyIHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYW4gaW50ZWdlciB2YWx1ZS5cbiAgICovXG4gIHR5cGU6IFwiaW50ZWdlclwiO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBzdHJpY3RseSBlcXVhbCB0byB0aGlzLlxuICAgKi9cbiAgY29uc3Q/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIG9uZSBvZiB0aGUgdmFsdWUgb2YgZW51bS5cbiAgICovXG4gIGVudW0/OiByZWFkb25seSBudW1iZXJbXTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgYSBtdWx0aXBsZSBvZiB4LlxuICAgKiBNdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLlxuICAgKi9cbiAgbXVsdGlwbGVPZj86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiB0aGlzIG1heGltdW0uXG4gICAqL1xuICBtYXhpbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBzdHJpY3RseSBsb3dlciB0aGFuIHRoaXMgbWF4aW11bS5cbiAgICovXG4gIGV4Y2x1c2l2ZU1heGltdW0/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGlzIG1pbmltdW0uXG4gICAqL1xuICBtaW5pbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gdGhpcyBtaW5pbXVtLlxuICAgKi9cbiAgZXhjbHVzaXZlTWluaW11bT86IG51bWJlcjtcblxufVxuXG4vKipcbiAqIEpTT04gU2NoZW1hIHRvIGRlc2NyaWJlIGEgc3RyaW5nIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFTdHJpbmcge1xuXG4gIC8qKlxuICAgKiBUeXBlIGZvciBhIHN0cmluZyB2YWx1ZS5cbiAgICovXG4gIHR5cGU6IFwic3RyaW5nXCI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIHRoaXMuXG4gICAqL1xuICBjb25zdD86IHN0cmluZztcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgc3RyaWN0bHkgZXF1YWwgdG8gb25lIG9mIHRoZSB2YWx1ZSBvZiBlbnVtLlxuICAgKi9cbiAgZW51bT86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNYXhpdW0gbGVuZ3RoIGZvciBhIHN0cmluZy5cbiAgICogTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICAgKi9cbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIGxlbmd0aCBmb3IgYSBzdHJpbmcuXG4gICAqIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1pbkxlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogUGF0dGVybiB0byBtYXRjaCBmb3IgYSBzdHJpbmcuXG4gICAqIE11c3QgYmUgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24sICp3aXRob3V0KiB0aGUgYC9gIGRlbGltaXRlcnMuXG4gICAqL1xuICBwYXR0ZXJuPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogSlNPTiBzY2hlbWEgdG8gZGVzY3JpYmUgYW4gYXJyYXkgb2YgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFBcnJheSB7XG5cbiAgLyoqXG4gICAqIFR5cGUgZm9yIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAgICovXG4gIHR5cGU6IFwiYXJyYXlcIjtcblxuICAvKipcbiAgICogU2NoZW1hIGZvciB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheS5cbiAgICovXG4gIGl0ZW1zOiBKU09OU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgbG93ZXIgb3IgZXF1YWwgdG8gdGhpcyB2YWx1ZS5cbiAgICogTXVzdCBiZSBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyLlxuICAgKi9cbiAgbWF4SXRlbXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFycmF5IGxlbmd0aCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1pbkl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBvbmx5IGhhdmUgdW5pcXVlIHZhbHVlcy5cbiAgICovXG4gIHVuaXF1ZUl0ZW1zPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIEpTT04gU2NoZW1hIHRvIGRlc2NyaWJlIGFuIGFycmF5IG9mIHByaW1pdGl2ZSB2YWx1ZXM6XG4gKiAtIGFycmF5IG9mIGJvb2xlYW5zOiBgSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYUJvb2xlYW4+YCxcbiAqIC0gYXJyYXkgb2YgbnVtYmVyczogYEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFOdW1iZXI+YCxcbiAqIC0gYXJyYXkgb2YgaW50ZWdlcnM6IGBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hSW50ZWdlcj5gLFxuICogLSBhcnJheSBvZiBzdHJpbmdzOiBgSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYVN0cmluZz5gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFBcnJheU9mPFQgZXh0ZW5kcyBKU09OU2NoZW1hQm9vbGVhbiB8IEpTT05TY2hlbWFOdW1iZXIgfCBKU09OU2NoZW1hSW50ZWdlciB8IEpTT05TY2hlbWFTdHJpbmc+IHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYW4gYXJyYXkgb2YgdmFsdWVzLlxuICAgKi9cbiAgdHlwZTogXCJhcnJheVwiO1xuXG4gIC8qKlxuICAgKiBTY2hlbWEgZm9yIHRoZSB2YWx1ZXMgb2YgYW4gYXJyYXkuXG4gICAqL1xuICBpdGVtczogVDtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXJyYXkgbGVuZ3RoIGlzIGxvd2VyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1heEl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGlzIHZhbHVlLlxuICAgKiBNdXN0IGJlIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIuXG4gICAqL1xuICBtaW5JdGVtcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXJyYXkgb25seSBoYXZlIHVuaXF1ZSB2YWx1ZXMuXG4gICAqL1xuICB1bmlxdWVJdGVtcz86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBKU09OIHNjaGVtYSB0byBkZXNjcmliZSBhIHR1cGxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFUdXBsZSB7XG5cbiAgLyoqXG4gICAqIFR5cGUgZm9yIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAgICovXG4gIHR5cGU6IFwiYXJyYXlcIjtcblxuICAvKipcbiAgICogU2NoZW1hIGZvciB0aGUgdmFsdWVzIG9mIHRoZSB0dXBsZS5cbiAgICovXG4gIGl0ZW1zPzogcmVhZG9ubHkgSlNPTlNjaGVtYVtdO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgbG93ZXIgb3IgZXF1YWwgdG8gdGhpcyB2YWx1ZS5cbiAgICogTXVzdCBiZSBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyLlxuICAgKi9cbiAgbWF4SXRlbXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFycmF5IGxlbmd0aCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1pbkl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBvbmx5IGhhdmUgdW5pcXVlIHZhbHVlcy5cbiAgICovXG4gIHVuaXF1ZUl0ZW1zPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIEpTT04gc2NoZW1hIHRvIGRlc2NyaWJlIGFuIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hT2JqZWN0IHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYW4gb2JqZWN0LlxuICAgKi9cbiAgdHlwZTogXCJvYmplY3RcIjtcblxuICAvKipcbiAgICogTGlzdCBvZiBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgYW5kIHRoZWlyIGFzc29jaWF0ZWQgSlNPTiBzY2hlbWFzLlxuICAgKi9cbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgSlNPTlNjaGVtYT47XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIG5hbWVzIG9mIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciBhbiBvYmplY3QuXG4gICAqIFByb3BlcnRpZXMgc2V0IGFzIHJlcXVpcmVkIHNob3VsZCBiZSBwcmVzZW50IGluIGBwcm9wZXJ0aWVzYCB0b28uXG4gICAqL1xuICByZXF1aXJlZD86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG59XG5cbi8qKlxuICogU3Vic2V0IG9mIHRoZSBKU09OIFNjaGVtYSBzdGFuZGFyZC5cbiAqIFxuICogVHlwZXMgYXJlIGVuZm9yY2VkIHRvIHZhbGlkYXRlIGV2ZXJ5dGhpbmc6IGVhY2ggdmFsdWUgKiptdXN0KiogaGF2ZSBhIGB0eXBlYC5cbiAqIFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9WQUxJREFUSU9OLm1kfVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzY2hlbWEgPSB7IHR5cGU6ICdzdHJpbmcnIH0gc2F0aXNmaWVzIEpTT05TY2hlbWE7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNjaGVtYSA9IHsgdHlwZTogJ251bWJlcicgfSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hID0geyB0eXBlOiAnaW50ZWdlcicgfSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hID0geyB0eXBlOiAnYm9vbGVhbicgfSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hID0ge1xuICogICB0eXBlOiAnYXJyYXknLFxuICogICBpdGVtczogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICogfSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hID0ge1xuICogICB0eXBlOiAnb2JqZWN0JyxcbiAqICAgcHJvcGVydGllczoge1xuICogICAgIGZpcnN0TmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICogICAgIGxhc3ROYW1lOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gKiAgIH0sXG4gKiAgIHJlcXVpcmVkOiBbJ2ZpcnN0TmFtZSddLFxuICogfSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTtcbiAqL1xuZXhwb3J0IHR5cGUgSlNPTlNjaGVtYSA9IEpTT05TY2hlbWFTdHJpbmcgfCBKU09OU2NoZW1hTnVtYmVyIHwgSlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hQm9vbGVhbiB8IEpTT05TY2hlbWFBcnJheSB8IEpTT05TY2hlbWFUdXBsZSB8IEpTT05TY2hlbWFPYmplY3Q7XG4iXX0=
|