@decaf-ts/for-pouch 0.2.2 → 0.2.4

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.
@@ -4,6 +4,22 @@ import { BaseError, ConflictError, InternalError, NotFoundError, onCreate, } fro
4
4
  import { ConnectionError, PersistenceKeys, Repository, UnsupportedError, } from "@decaf-ts/core";
5
5
  import { Decoration, propMetadata, } from "@decaf-ts/decorator-validation";
6
6
  import { PouchFlavour } from "./constants";
7
+ /**
8
+ * @description Sets the creator ID on a model during creation or update operations
9
+ * @summary This function is used as a decorator handler to automatically set the creator ID field on a model
10
+ * when it's being created or updated. It extracts the UUID from the context and assigns it to the specified key.
11
+ * @template M - The model type that extends Model
12
+ * @template R - The repository type that extends PouchRepository<M>
13
+ * @template V - The relations metadata type that extends RelationsMetadata
14
+ * @param {R} this - The repository instance
15
+ * @param {Context<PouchFlags>} context - The operation context containing flags
16
+ * @param {V} data - The relations metadata
17
+ * @param key - The property key to set on the model
18
+ * @param {M} model - The model instance to modify
19
+ * @return {Promise<void>} A promise that resolves when the operation is complete
20
+ * @function createdByOnPouchCreateUpdate
21
+ * @memberOf module:for-pouch
22
+ */
7
23
  export async function createdByOnPouchCreateUpdate(context, data, key, model) {
8
24
  try {
9
25
  const uuid = context.get("UUID");
@@ -14,10 +30,69 @@ export async function createdByOnPouchCreateUpdate(context, data, key, model) {
14
30
  throw new UnsupportedError("No User found in context. Please provide a user in the context");
15
31
  }
16
32
  }
33
+ /**
34
+ * @description PouchDB implementation of the CouchDBAdapter
35
+ * @summary This class provides a concrete implementation of the CouchDBAdapter for PouchDB.
36
+ * It handles all database operations like create, read, update, delete (CRUD) for both
37
+ * single documents and bulk operations. It also provides methods for querying and indexing.
38
+ * @template Database - The PouchDB database type
39
+ * @template PouchFlags - The flags specific to PouchDB operations
40
+ * @template Context<PouchFlags> - The context type with PouchDB flags
41
+ * @param {Database} scope - The PouchDB database instance
42
+ * @param {string} [alias] - Optional alias for the database
43
+ * @class PouchAdapter
44
+ * @example
45
+ * ```typescript
46
+ * import PouchDB from 'pouchdb';
47
+ * import { PouchAdapter } from '@decaf-ts/for-pouch';
48
+ *
49
+ * // Create a new PouchDB instance
50
+ * const db = new PouchDB('my-database');
51
+ *
52
+ * // Create a PouchAdapter with the database
53
+ * const adapter = new PouchAdapter(db);
54
+ *
55
+ * // Use the adapter for database operations
56
+ * const result = await adapter.read('users', 'user-123');
57
+ * ```
58
+ * @mermaid
59
+ * sequenceDiagram
60
+ * participant Client
61
+ * participant PouchAdapter
62
+ * participant PouchDB
63
+ * participant CouchDB
64
+ *
65
+ * Client->>PouchAdapter: new PouchAdapter(db)
66
+ * PouchAdapter->>CouchDBAdapter: super(scope, PouchFlavour, alias)
67
+ *
68
+ * Client->>PouchAdapter: create(table, id, model)
69
+ * PouchAdapter->>PouchDB: put(model)
70
+ * PouchDB->>CouchDB: HTTP PUT
71
+ * CouchDB-->>PouchDB: Response
72
+ * PouchDB-->>PouchAdapter: Response
73
+ * PouchAdapter-->>Client: Updated model
74
+ *
75
+ * Client->>PouchAdapter: read(table, id)
76
+ * PouchAdapter->>PouchDB: get(id)
77
+ * PouchDB->>CouchDB: HTTP GET
78
+ * CouchDB-->>PouchDB: Document
79
+ * PouchDB-->>PouchAdapter: Document
80
+ * PouchAdapter-->>Client: Model
81
+ */
17
82
  export class PouchAdapter extends CouchDBAdapter {
18
83
  constructor(scope, alias) {
19
84
  super(scope, PouchFlavour, alias);
20
85
  }
86
+ /**
87
+ * @description Generates operation flags for PouchDB operations
88
+ * @summary Creates a set of flags for a specific operation, including a UUID for identification.
89
+ * This method extracts the user ID from the database URL or generates a random UUID if not available.
90
+ * @template M - The model type that extends Model
91
+ * @param {OperationKeys} operation - The operation key (create, read, update, delete)
92
+ * @param {Constructor<M>} model - The model constructor
93
+ * @param {Partial<PouchFlags>} flags - Partial flags to be merged
94
+ * @return {PouchFlags} The complete set of flags for the operation
95
+ */
21
96
  flags(operation, model, flags) {
22
97
  let id = "";
23
98
  const url = this.native.name;
@@ -34,6 +109,14 @@ export class PouchAdapter extends CouchDBAdapter {
34
109
  UUID: id,
35
110
  });
36
111
  }
112
+ /**
113
+ * @description Creates database indexes for the given models
114
+ * @summary Generates and creates indexes in the PouchDB database based on the provided model constructors.
115
+ * This method uses the generateIndexes utility to create index definitions and then creates them in the database.
116
+ * @template M - The model type that extends Model
117
+ * @param models - The model constructors to create indexes for
118
+ * @return {Promise<void>} A promise that resolves when all indexes are created
119
+ */
37
120
  async index(...models) {
38
121
  const indexes = generateIndexes(models);
39
122
  for (const index of indexes) {
@@ -43,6 +126,32 @@ export class PouchAdapter extends CouchDBAdapter {
43
126
  throw new ConflictError(`Index ${index.name} already exists`);
44
127
  }
45
128
  }
129
+ /**
130
+ * @description Creates a new document in the database
131
+ * @summary Inserts a new document into the PouchDB database using the put operation.
132
+ * This method handles error parsing and ensures the operation was successful.
133
+ * @param {string} tableName - The name of the table/collection
134
+ * @param {string|number} id - The document ID
135
+ * @param {Record<string, any>} model - The document data to insert
136
+ * @return {Promise<Record<string, any>>} A promise that resolves to the created document with metadata
137
+ * @mermaid
138
+ * sequenceDiagram
139
+ * participant Client
140
+ * participant PouchAdapter
141
+ * participant PouchDB
142
+ *
143
+ * Client->>PouchAdapter: create(tableName, id, model)
144
+ * PouchAdapter->>PouchDB: put(model)
145
+ * alt Success
146
+ * PouchDB-->>PouchAdapter: Response with ok=true
147
+ * PouchAdapter->>PouchAdapter: assignMetadata(model, response.rev)
148
+ * PouchAdapter-->>Client: Updated model with metadata
149
+ * else Error
150
+ * PouchDB-->>PouchAdapter: Error
151
+ * PouchAdapter->>PouchAdapter: parseError(e)
152
+ * PouchAdapter-->>Client: Throws error
153
+ * end
154
+ */
46
155
  async create(tableName, id, model) {
47
156
  let response;
48
157
  try {
@@ -55,6 +164,32 @@ export class PouchAdapter extends CouchDBAdapter {
55
164
  throw new InternalError(`Failed to insert doc id: ${id} in table ${tableName}`);
56
165
  return this.assignMetadata(model, response.rev);
57
166
  }
167
+ /**
168
+ * @description Creates multiple documents in the database in a single operation
169
+ * @summary Inserts multiple documents into the PouchDB database using the bulkDocs operation.
170
+ * This method handles error parsing and ensures all operations were successful.
171
+ * @param {string} tableName - The name of the table/collection
172
+ * @param {string[]|number[]} ids - The document IDs
173
+ * @param models - The document data to insert
174
+ * @return A promise that resolves to the created documents with metadata
175
+ * @mermaid
176
+ * sequenceDiagram
177
+ * participant Client
178
+ * participant PouchAdapter
179
+ * participant PouchDB
180
+ *
181
+ * Client->>PouchAdapter: createAll(tableName, ids, models)
182
+ * PouchAdapter->>PouchDB: bulkDocs(models)
183
+ * alt Success
184
+ * PouchDB-->>PouchAdapter: Array of responses with ok=true
185
+ * PouchAdapter->>PouchAdapter: assignMultipleMetadata(models, revs)
186
+ * PouchAdapter-->>Client: Updated models with metadata
187
+ * else Error
188
+ * PouchDB-->>PouchAdapter: Array with errors
189
+ * PouchAdapter->>PouchAdapter: Check for errors
190
+ * PouchAdapter-->>Client: Throws InternalError
191
+ * end
192
+ */
58
193
  async createAll(tableName, ids, models) {
59
194
  let response;
60
195
  try {
@@ -73,6 +208,32 @@ export class PouchAdapter extends CouchDBAdapter {
73
208
  }
74
209
  return this.assignMultipleMetadata(models, response.map((r) => r.rev));
75
210
  }
211
+ /**
212
+ * @description Retrieves a document from the database by ID
213
+ * @summary Fetches a document from the PouchDB database using the get operation.
214
+ * This method generates the document ID based on the table name and ID, then retrieves the document.
215
+ * @param {string} tableName - The name of the table/collection
216
+ * @param {string|number} id - The document ID
217
+ * @return {Promise<Record<string, any>>} A promise that resolves to the retrieved document with metadata
218
+ * @mermaid
219
+ * sequenceDiagram
220
+ * participant Client
221
+ * participant PouchAdapter
222
+ * participant PouchDB
223
+ *
224
+ * Client->>PouchAdapter: read(tableName, id)
225
+ * PouchAdapter->>PouchAdapter: generateId(tableName, id)
226
+ * PouchAdapter->>PouchDB: get(_id)
227
+ * alt Success
228
+ * PouchDB-->>PouchAdapter: Document
229
+ * PouchAdapter->>PouchAdapter: assignMetadata(record, record._rev)
230
+ * PouchAdapter-->>Client: Document with metadata
231
+ * else Error
232
+ * PouchDB-->>PouchAdapter: Error
233
+ * PouchAdapter->>PouchAdapter: parseError(e)
234
+ * PouchAdapter-->>Client: Throws error
235
+ * end
236
+ */
76
237
  async read(tableName, id) {
77
238
  const _id = this.generateId(tableName, id);
78
239
  let record;
@@ -84,6 +245,32 @@ export class PouchAdapter extends CouchDBAdapter {
84
245
  }
85
246
  return this.assignMetadata(record, record._rev);
86
247
  }
248
+ /**
249
+ * @description Retrieves multiple documents from the database by their IDs
250
+ * @summary Fetches multiple documents from the PouchDB database using the bulkGet operation.
251
+ * This method generates document IDs based on the table name and IDs, then retrieves the documents.
252
+ * @param {string} tableName - The name of the table/collection
253
+ * @param {Array<string|number|bigint>} ids - The document IDs
254
+ * @return A promise that resolves to the retrieved documents with metadata
255
+ * @mermaid
256
+ * sequenceDiagram
257
+ * participant Client
258
+ * participant PouchAdapter
259
+ * participant PouchDB
260
+ *
261
+ * Client->>PouchAdapter: readAll(tableName, ids)
262
+ * PouchAdapter->>PouchAdapter: Map ids to generateId(tableName, id)
263
+ * PouchAdapter->>PouchDB: bulkGet({docs})
264
+ * alt Success
265
+ * PouchDB-->>PouchAdapter: BulkGetResponse
266
+ * PouchAdapter->>PouchAdapter: Process results
267
+ * PouchAdapter->>PouchAdapter: assignMetadata for each doc
268
+ * PouchAdapter-->>Client: Documents with metadata
269
+ * else Error
270
+ * PouchAdapter->>PouchAdapter: parseError(error)
271
+ * PouchAdapter-->>Client: Throws error
272
+ * end
273
+ */
87
274
  async readAll(tableName, ids) {
88
275
  const results = await this.native.bulkGet({
89
276
  docs: ids.map((id) => ({ id: this.generateId(tableName, id) })),
@@ -100,6 +287,32 @@ export class PouchAdapter extends CouchDBAdapter {
100
287
  }, []);
101
288
  return res;
102
289
  }
290
+ /**
291
+ * @description Updates an existing document in the database
292
+ * @summary Updates a document in the PouchDB database using the put operation.
293
+ * This method handles error parsing and ensures the operation was successful.
294
+ * @param {string} tableName - The name of the table/collection
295
+ * @param {string|number} id - The document ID
296
+ * @param {Record<string, any>} model - The updated document data
297
+ * @return {Promise<Record<string, any>>} A promise that resolves to the updated document with metadata
298
+ * @mermaid
299
+ * sequenceDiagram
300
+ * participant Client
301
+ * participant PouchAdapter
302
+ * participant PouchDB
303
+ *
304
+ * Client->>PouchAdapter: update(tableName, id, model)
305
+ * PouchAdapter->>PouchDB: put(model)
306
+ * alt Success
307
+ * PouchDB-->>PouchAdapter: Response with ok=true
308
+ * PouchAdapter->>PouchAdapter: assignMetadata(model, response.rev)
309
+ * PouchAdapter-->>Client: Updated model with metadata
310
+ * else Error
311
+ * PouchDB-->>PouchAdapter: Error
312
+ * PouchAdapter->>PouchAdapter: parseError(e)
313
+ * PouchAdapter-->>Client: Throws error
314
+ * end
315
+ */
103
316
  async update(tableName, id, model) {
104
317
  let response;
105
318
  try {
@@ -112,6 +325,32 @@ export class PouchAdapter extends CouchDBAdapter {
112
325
  throw new InternalError(`Failed to update doc id: ${id} in table ${tableName}`);
113
326
  return this.assignMetadata(model, response.rev);
114
327
  }
328
+ /**
329
+ * @description Updates multiple documents in the database in a single operation
330
+ * @summary Updates multiple documents in the PouchDB database using the bulkDocs operation.
331
+ * This method handles error parsing and ensures all operations were successful.
332
+ * @param {string} tableName - The name of the table/collection
333
+ * @param {string[]|number[]} ids - The document IDs
334
+ * @param models - The updated document data
335
+ * @return A promise that resolves to the updated documents with metadata
336
+ * @mermaid
337
+ * sequenceDiagram
338
+ * participant Client
339
+ * participant PouchAdapter
340
+ * participant PouchDB
341
+ *
342
+ * Client->>PouchAdapter: updateAll(tableName, ids, models)
343
+ * PouchAdapter->>PouchDB: bulkDocs(models)
344
+ * alt Success
345
+ * PouchDB-->>PouchAdapter: Array of responses with ok=true
346
+ * PouchAdapter->>PouchAdapter: assignMultipleMetadata(models, revs)
347
+ * PouchAdapter-->>Client: Updated models with metadata
348
+ * else Error
349
+ * PouchDB-->>PouchAdapter: Array with errors
350
+ * PouchAdapter->>PouchAdapter: Check for errors
351
+ * PouchAdapter-->>Client: Throws InternalError
352
+ * end
353
+ */
115
354
  async updateAll(tableName, ids, models) {
116
355
  let response;
117
356
  try {
@@ -130,6 +369,34 @@ export class PouchAdapter extends CouchDBAdapter {
130
369
  }
131
370
  return this.assignMultipleMetadata(models, response.map((r) => r.rev));
132
371
  }
372
+ /**
373
+ * @description Deletes a document from the database by ID
374
+ * @summary Removes a document from the PouchDB database using the remove operation.
375
+ * This method first retrieves the document to get its revision, then deletes it.
376
+ * @param {string} tableName - The name of the table/collection
377
+ * @param {string|number} id - The document ID
378
+ * @return {Promise<Record<string, any>>} A promise that resolves to the deleted document with metadata
379
+ * @mermaid
380
+ * sequenceDiagram
381
+ * participant Client
382
+ * participant PouchAdapter
383
+ * participant PouchDB
384
+ *
385
+ * Client->>PouchAdapter: delete(tableName, id)
386
+ * PouchAdapter->>PouchAdapter: generateId(tableName, id)
387
+ * PouchAdapter->>PouchDB: get(_id)
388
+ * PouchDB-->>PouchAdapter: Document with _rev
389
+ * PouchAdapter->>PouchDB: remove(_id, record._rev)
390
+ * alt Success
391
+ * PouchDB-->>PouchAdapter: Success response
392
+ * PouchAdapter->>PouchAdapter: assignMetadata(record, record._rev)
393
+ * PouchAdapter-->>Client: Deleted document with metadata
394
+ * else Error
395
+ * PouchDB-->>PouchAdapter: Error
396
+ * PouchAdapter->>PouchAdapter: parseError(e)
397
+ * PouchAdapter-->>Client: Throws error
398
+ * end
399
+ */
133
400
  async delete(tableName, id) {
134
401
  const _id = this.generateId(tableName, id);
135
402
  let record;
@@ -142,6 +409,35 @@ export class PouchAdapter extends CouchDBAdapter {
142
409
  }
143
410
  return this.assignMetadata(record, record._rev);
144
411
  }
412
+ /**
413
+ * @description Deletes multiple documents from the database by their IDs
414
+ * @summary Removes multiple documents from the PouchDB database in a single operation.
415
+ * This method first retrieves all documents to get their revisions, then marks them as deleted.
416
+ * @param {string} tableName - The name of the table/collection
417
+ * @param {Array<string|number|bigint>} ids - The document IDs
418
+ * @return A promise that resolves to the deleted documents with metadata
419
+ * @mermaid
420
+ * sequenceDiagram
421
+ * participant Client
422
+ * participant PouchAdapter
423
+ * participant PouchDB
424
+ *
425
+ * Client->>PouchAdapter: deleteAll(tableName, ids)
426
+ * PouchAdapter->>PouchAdapter: Map ids to generateId(tableName, id)
427
+ * PouchAdapter->>PouchDB: bulkGet({docs})
428
+ * PouchDB-->>PouchAdapter: BulkGetResponse with documents
429
+ * PouchAdapter->>PouchAdapter: Mark documents as deleted
430
+ * PouchAdapter->>PouchDB: bulkDocs(marked documents)
431
+ * alt Success
432
+ * PouchDB-->>PouchAdapter: Success responses
433
+ * PouchAdapter->>PouchAdapter: Process results
434
+ * PouchAdapter->>PouchAdapter: assignMetadata for each doc
435
+ * PouchAdapter-->>Client: Deleted documents with metadata
436
+ * else Error
437
+ * PouchAdapter->>PouchAdapter: Check for errors
438
+ * PouchAdapter-->>Client: Throws InternalError
439
+ * end
440
+ */
145
441
  async deleteAll(tableName, ids) {
146
442
  const results = await this.native.bulkGet({
147
443
  docs: ids.map((id) => ({ id: this.generateId(tableName, id) })),
@@ -161,6 +457,35 @@ export class PouchAdapter extends CouchDBAdapter {
161
457
  return accum;
162
458
  }, []);
163
459
  }
460
+ /**
461
+ * @description Executes a raw Mango query against the database
462
+ * @summary Performs a direct find operation using a Mango query object.
463
+ * This method allows for complex queries beyond the standard CRUD operations.
464
+ * @template V - The return type
465
+ * @param {MangoQuery} rawInput - The Mango query to execute
466
+ * @param {boolean} [process=true] - Whether to process the response (true returns just docs, false returns full response)
467
+ * @return {Promise<V>} A promise that resolves to the query results
468
+ * @mermaid
469
+ * sequenceDiagram
470
+ * participant Client
471
+ * participant PouchAdapter
472
+ * participant PouchDB
473
+ *
474
+ * Client->>PouchAdapter: raw<V>(rawInput, process)
475
+ * PouchAdapter->>PouchDB: find(rawInput)
476
+ * alt Success
477
+ * PouchDB-->>PouchAdapter: FindResponse
478
+ * alt process=true
479
+ * PouchAdapter-->>Client: response.docs as V
480
+ * else process=false
481
+ * PouchAdapter-->>Client: response as V
482
+ * end
483
+ * else Error
484
+ * PouchDB-->>PouchAdapter: Error
485
+ * PouchAdapter->>PouchAdapter: parseError(e)
486
+ * PouchAdapter-->>Client: Throws error
487
+ * end
488
+ */
164
489
  async raw(rawInput, process = true) {
165
490
  try {
166
491
  const response = await this.native.find(rawInput);
@@ -174,9 +499,56 @@ export class PouchAdapter extends CouchDBAdapter {
174
499
  throw PouchAdapter.parseError(e);
175
500
  }
176
501
  }
502
+ /**
503
+ * @description Parses and converts errors from PouchDB to application-specific errors
504
+ * @summary Converts PouchDB errors to the application's error hierarchy.
505
+ * This instance method delegates to the static parseError method.
506
+ * @param {Error|string} err - The error object or message to parse
507
+ * @param {string} [reason] - Optional reason for the error
508
+ * @return {BaseError} The converted error object
509
+ */
177
510
  parseError(err, reason) {
178
511
  return PouchAdapter.parseError(err, reason);
179
512
  }
513
+ /**
514
+ * @description Static method to parse and convert errors from PouchDB to application-specific errors
515
+ * @summary Converts PouchDB errors to the application's error hierarchy based on error codes and messages.
516
+ * This method analyzes the error type, status code, or message to determine the appropriate error class.
517
+ * @param {Error|string} err - The error object or message to parse
518
+ * @param {string} [reason] - Optional reason for the error
519
+ * @return {BaseError} The converted error object
520
+ * @mermaid
521
+ * sequenceDiagram
522
+ * participant Caller
523
+ * participant PouchAdapter
524
+ *
525
+ * Caller->>PouchAdapter: parseError(err, reason)
526
+ * alt err is BaseError
527
+ * PouchAdapter-->>Caller: Return err as is
528
+ * else err is string
529
+ * alt contains "already exist" or "update conflict"
530
+ * PouchAdapter-->>Caller: ConflictError
531
+ * else contains "missing" or "deleted"
532
+ * PouchAdapter-->>Caller: NotFoundError
533
+ * end
534
+ * else err has status
535
+ * alt status is 401, 412, 409
536
+ * PouchAdapter-->>Caller: ConflictError
537
+ * else status is 404
538
+ * PouchAdapter-->>Caller: NotFoundError
539
+ * else status is 400
540
+ * alt message contains "No index exists"
541
+ * PouchAdapter-->>Caller: IndexError
542
+ * else
543
+ * PouchAdapter-->>Caller: InternalError
544
+ * end
545
+ * else message contains "ECONNREFUSED"
546
+ * PouchAdapter-->>Caller: ConnectionError
547
+ * else
548
+ * PouchAdapter-->>Caller: InternalError
549
+ * end
550
+ * end
551
+ */
180
552
  static parseError(err, reason) {
181
553
  // return super.parseError(err, reason);
182
554
  if (err instanceof BaseError)
@@ -213,6 +585,34 @@ export class PouchAdapter extends CouchDBAdapter {
213
585
  return new InternalError(err);
214
586
  }
215
587
  }
588
+ /**
589
+ * @description Sets up decorations for PouchDB-specific model properties
590
+ * @summary Configures decorators for createdBy and updatedBy fields in models.
591
+ * This method defines how these fields should be automatically populated during create and update operations.
592
+ * @mermaid
593
+ * sequenceDiagram
594
+ * participant Caller
595
+ * participant PouchAdapter
596
+ * participant Decoration
597
+ *
598
+ * Caller->>PouchAdapter: decoration()
599
+ * PouchAdapter->>Repository: key(PersistenceKeys.CREATED_BY)
600
+ * Repository-->>PouchAdapter: createdByKey
601
+ * PouchAdapter->>Repository: key(PersistenceKeys.UPDATED_BY)
602
+ * Repository-->>PouchAdapter: updatedByKey
603
+ *
604
+ * PouchAdapter->>Decoration: flavouredAs(PouchFlavour)
605
+ * Decoration-->>PouchAdapter: DecoratorBuilder
606
+ * PouchAdapter->>Decoration: for(createdByKey)
607
+ * PouchAdapter->>Decoration: define(onCreate, propMetadata)
608
+ * PouchAdapter->>Decoration: apply()
609
+ *
610
+ * PouchAdapter->>Decoration: flavouredAs(PouchFlavour)
611
+ * Decoration-->>PouchAdapter: DecoratorBuilder
612
+ * PouchAdapter->>Decoration: for(updatedByKey)
613
+ * PouchAdapter->>Decoration: define(onCreate, propMetadata)
614
+ * PouchAdapter->>Decoration: apply()
615
+ */
216
616
  static decoration() {
217
617
  const createdByKey = Repository.key(PersistenceKeys.CREATED_BY);
218
618
  const updatedByKey = Repository.key(PersistenceKeys.UPDATED_BY);
@@ -226,4 +626,4 @@ export class PouchAdapter extends CouchDBAdapter {
226
626
  .apply();
227
627
  }
228
628
  }
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxXQUFXLEVBRVgsZUFBZSxFQUNmLFVBQVUsR0FFWCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxFQUViLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxHQUVULE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLGVBQWUsRUFDZixlQUFlLEVBRWYsVUFBVSxFQUNWLGdCQUFnQixHQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBT3hCLE9BQU8sRUFFTCxVQUFVLEVBRVYsWUFBWSxHQUNiLE1BQU0sZ0NBQWdDLENBQUM7QUFJeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUczQyxNQUFNLENBQUMsS0FBSyxVQUFVLDRCQUE0QixDQU1oRCxPQUE0QixFQUM1QixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVE7SUFFUixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFrQixDQUFDO1FBQ2hDLDZEQUE2RDtJQUMvRCxDQUFDO0lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksZ0JBQWdCLENBQ3hCLGdFQUFnRSxDQUNqRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLE9BQU8sWUFBYSxTQUFRLGNBSWpDO0lBQ0MsWUFBWSxLQUFlLEVBQUUsS0FBYztRQUN6QyxLQUFLLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRWtCLEtBQUssQ0FDdEIsU0FBd0Is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QyxZQUFZLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUMvQjthQUNBLEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQkFkYXB0ZXIsXG4gIENvdWNoREJLZXlzLFxuICBDcmVhdGVJbmRleFJlcXVlc3QsXG4gIGdlbmVyYXRlSW5kZXhlcyxcbiAgSW5kZXhFcnJvcixcbiAgTWFuZ29RdWVyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBDb250ZXh0LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uRXJyb3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IERhdGFiYXNlID0gUG91Y2hEQi5EYXRhYmFzZTtcbmltcG9ydCBSZXNwb25zZSA9IFBvdWNoREIuQ29yZS5SZXNwb25zZTtcbmltcG9ydCBFcnIgPSBQb3VjaERCLkNvcmUuRXJyb3I7XG5pbXBvcnQgSWRNZXRhID0gUG91Y2hEQi5Db3JlLklkTWV0YTtcbmltcG9ydCBHZXRNZXRhID0gUG91Y2hEQi5Db3JlLkdldE1ldGE7XG5pbXBvcnQgQ3JlYXRlSW5kZXhSZXNwb25zZSA9IFBvdWNoREIuRmluZC5DcmVhdGVJbmRleFJlc3BvbnNlO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCBCdWxrR2V0UmVzcG9uc2UgPSBQb3VjaERCLkNvcmUuQnVsa0dldFJlc3BvbnNlO1xuaW1wb3J0IEZpbmRSZXNwb25zZSA9IFBvdWNoREIuRmluZC5GaW5kUmVzcG9uc2U7XG5pbXBvcnQgeyBQb3VjaEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBvdWNoRmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUG91Y2hSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUG91Y2hSZXBvc2l0b3J5XCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBQb3VjaFJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8UG91Y2hGbGFncz4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHV1aWQ6IHN0cmluZyA9IGNvbnRleHQuZ2V0KFwiVVVJRFwiKTtcbiAgICBtb2RlbFtrZXldID0gdXVpZCBhcyBNW2tleW9mIE1dO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG91Y2hBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXI8XG4gIERhdGFiYXNlLFxuICBQb3VjaEZsYWdzLFxuICBDb250ZXh0PFBvdWNoRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IERhdGFiYXNlLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBQb3VjaEZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8UG91Y2hGbGFncz5cbiAgKTogUG91Y2hGbGFncyB7XG4gICAgbGV0IGlkOiBzdHJpbmcgPSBcIlwiO1xuICAgIGNvbnN0IHVybCA9ICh0aGlzLm5hdGl2ZSBhcyB1bmtub3duIGFzIHsgbmFtZTogc3RyaW5nIH0pLm5hbWU7XG4gICAgaWYgKHVybCkge1xuICAgICAgY29uc3QgcmVnZXhwID0gL2h0dHBzPzpcXC9cXC8oLis/KTouKz9AL2c7XG4gICAgICBjb25zdCBtID0gcmVnZXhwLmV4ZWModXJsKTtcbiAgICAgIGlmIChtKSBpZCA9IG1bMV07XG4gICAgfVxuICAgIGlmICghaWQpIHtcbiAgICAgIGlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyksIHtcbiAgICAgIFVVSUQ6IGlkLFxuICAgIH0pIGFzIFBvdWNoRmxhZ3M7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlczogQ3JlYXRlSW5kZXhSZXF1ZXN0W10gPSBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgIGNvbnN0IHJlczogQ3JlYXRlSW5kZXhSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuY3JlYXRlSW5kZXgoXG4gICAgICAgIGluZGV4IGFzIGFueVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSByZXM7XG4gICAgICBpZiAocmVzdWx0ID09PSBcImV4aXN0aW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKGBJbmRleCAke2luZGV4Lm5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5wdXQobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gaW5zZXJ0IGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlW10gfCBFcnJbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHI6IFJlc3BvbnNlIHwgRXJyKSA9PiAociBhcyBSZXNwb25zZSkub2spKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKGVsLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHtlbC5lcnJvcn0ke2VsLnJlYXNvbiA/IGAgLSAke2VsLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgICBtb2RlbHMsXG4gICAgICByZXNwb25zZS5tYXAoKHIpID0+IHIucmV2IGFzIHN0cmluZylcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBJZE1ldGEgJiBHZXRNZXRhO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0czogQnVsa0dldFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrR2V0KHtcbiAgICAgIGRvY3M6IGlkcy5tYXAoKGlkKSA9PiAoeyBpZDogdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQgYXMgYW55KSB9KSksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzID0gcmVzdWx0cy5yZXN1bHRzLnJlZHVjZSgoYWNjdW06IGFueVtdLCByKSA9PiB7XG4gICAgICByLmRvY3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBpZiAoKGQgYXMgYW55KS5lcnJvciB8fCAhKGQgYXMgYW55KS5vaylcbiAgICAgICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihcbiAgICAgICAgICAgICgoZCBhcyB7IGVycm9yOiBFcnIgfSkuZXJyb3IgYXMgRXJyb3IpIHx8XG4gICAgICAgICAgICAgIG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyB2YWxpZCByZXNwb25zZVwiKVxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIChkIGFzIHsgb2s6IGFueSB9KS5vayk7XG4gICAgICAgIGFjY3VtLnB1c2godGhpcy5hc3NpZ25NZXRhZGF0YShyZXN1bHQsIChkIGFzIGFueSkub2tbQ291Y2hEQktleXMuUkVWXSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUucHV0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGxldCByZXNwb25zZTogKFJlc3BvbnNlIHwgRXJyKVtdO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKG1vZGVscyk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ldmVyeSgocikgPT4gIShyIGFzIGFueSkuZXJyb3IpKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKChlbCBhcyBhbnkpLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHsoZWwgYXMgYW55KS5lcnJvcn0keyhlbCBhcyBhbnkpLnJlYXNvbiA/IGAgLSAkeyhlbCBhcyBhbnkpLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgICBtb2RlbHMsXG4gICAgICByZXNwb25zZS5tYXAoKHIpID0+IHIucmV2IGFzIHN0cmluZylcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgX2lkID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIGxldCByZWNvcmQ6IElkTWV0YSAmIEdldE1ldGE7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMubmF0aXZlLmdldChfaWQpO1xuICAgICAgYXdhaXQgdGhpcy5uYXRpdmUucmVtb3ZlKF9pZCwgcmVjb3JkLl9yZXYpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEJ1bGtHZXRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0dldCh7XG4gICAgICBkb2NzOiBpZHMubWFwKChpZCkgPT4gKHsgaWQ6IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkgfSkpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVsZXRpb246IChSZXNwb25zZSB8IEVycilbXSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKFxuICAgICAgcmVzdWx0cy5yZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLkRFTEVURURdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJzID0gZGVsZXRpb24uZmlsdGVyKChkKSA9PiAoZCBhcyBhbnkpLmVycm9yKTtcbiAgICBpZiAoZXJycy5sZW5ndGgpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycnMuam9pbihcIlxcblwiKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzLnJlZHVjZSgoYWNjdW06IGFueVtdLCByKSA9PiB7XG4gICAgICByLmRvY3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCAoZCBhcyB7IG9rOiBhbnkgfSkub2spO1xuICAgICAgICBhY2N1bS5wdXNoKHRoaXMuYXNzaWduTWV0YWRhdGEocmVzdWx0LCAoZCBhcyBhbnkpLm9rW0NvdWNoREJLZXlzLlJFVl0pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIGFzeW5jIHJhdzxWPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgcHJvY2VzcyA9IHRydWUpOiBQcm9taXNlPFY+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IEZpbmRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuZmluZChcbiAgICAgICAgcmF3SW5wdXQgYXMgYW55XG4gICAgICApO1xuICAgICAgaWYgKHJlc3BvbnNlLndhcm5pbmcpIGNvbnNvbGUud2FybihyZXNwb25zZS53YXJuaW5nKTtcbiAgICAgIGlmIChwcm9jZXNzKSByZXR1cm4gcmVzcG9uc2UuZG9jcyBhcyBWO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFY7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgcmV0dXJuIFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGVyciwgcmVhc29uKTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgLy8gcmV0dXJuIHN1cGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgYW55O1xuICAgIGxldCBjb2RlOiBzdHJpbmcgPSBcIlwiO1xuICAgIGlmICh0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb2RlID0gZXJyO1xuICAgICAgaWYgKGNvZGUubWF0Y2goL2FscmVhZHkgZXhpc3R8dXBkYXRlIGNvbmZsaWN0L2cpKVxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvbWlzc2luZ3xkZWxldGVkL2cpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoY29kZSk7XG4gICAgfSBlbHNlIGlmICgoZXJyIGFzIGFueSkuc3RhdHVzKSB7XG4gICAgICBjb2RlID0gKGVyciBhcyBhbnkpLnN0YXR1cztcbiAgICAgIHJlYXNvbiA9IHJlYXNvbiB8fCBlcnIubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZSA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29kZS50b1N0cmluZygpKSB7XG4gICAgICBjYXNlIFwiNDAxXCI6XG4gICAgICBjYXNlIFwiNDEyXCI6XG4gICAgICBjYXNlIFwiNDA5XCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcbiAgICAgIGNhc2UgXCI0MDRcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwMFwiOlxuICAgICAgICBpZiAoY29kZS50b1N0cmluZygpLm1hdGNoKC9Ob1xcc2luZGV4XFxzZXhpc3RzL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGVjb3JhdGlvbigpIHtcbiAgICBjb25zdCBjcmVhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gICAgY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICAgIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25Qb3VjaENyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cbiJdfQ==
629
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxXQUFXLEVBRVgsZUFBZSxFQUNmLFVBQVUsR0FFWCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxFQUViLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxHQUVULE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLGVBQWUsRUFDZixlQUFlLEVBRWYsVUFBVSxFQUNWLGdCQUFnQixHQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBT3hCLE9BQU8sRUFFTCxVQUFVLEVBRVYsWUFBWSxHQUNiLE1BQU0sZ0NBQWdDLENBQUM7QUFJeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUczQzs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDRCQUE0QixDQU1oRCxPQUE0QixFQUM1QixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVE7SUFFUixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFrQixDQUFDO1FBQ2hDLDZEQUE2RDtJQUMvRCxDQUFDO0lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksZ0JBQWdCLENBQ3hCLGdFQUFnRSxDQUNqRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0RHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxjQUlqQztJQUNDLFlBQVksS0FBZSxFQUFFLEtBQWM7UUFD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QUFlLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMkJHO0lBQ0gsTUFBTSxDQUFDLFVBQVU7UUFDZixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQzthQUNqQyxHQUFHLENBQUMsWUFBWSxDQUFDO2FBQ2pCLE1BQU0sQ0FDTCxRQUFRLENBQUMsNEJBQTRCLENBQUMsRUFDdEMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FDL0I7YUFDQSxLQUFLLEVBQUUsQ0FBQztRQUNYLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO2FBQ2pDLEdBQUcsQ0FBQyxZQUFZLENBQUM7YUFDakIsTUFBTSxDQUNMLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxFQUN0QyxZQUFZLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUMvQjthQUNBLEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQkFkYXB0ZXIsXG4gIENvdWNoREJLZXlzLFxuICBDcmVhdGVJbmRleFJlcXVlc3QsXG4gIGdlbmVyYXRlSW5kZXhlcyxcbiAgSW5kZXhFcnJvcixcbiAgTWFuZ29RdWVyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBDb250ZXh0LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uRXJyb3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IERhdGFiYXNlID0gUG91Y2hEQi5EYXRhYmFzZTtcbmltcG9ydCBSZXNwb25zZSA9IFBvdWNoREIuQ29yZS5SZXNwb25zZTtcbmltcG9ydCBFcnIgPSBQb3VjaERCLkNvcmUuRXJyb3I7XG5pbXBvcnQgSWRNZXRhID0gUG91Y2hEQi5Db3JlLklkTWV0YTtcbmltcG9ydCBHZXRNZXRhID0gUG91Y2hEQi5Db3JlLkdldE1ldGE7XG5pbXBvcnQgQ3JlYXRlSW5kZXhSZXNwb25zZSA9IFBvdWNoREIuRmluZC5DcmVhdGVJbmRleFJlc3BvbnNlO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCBCdWxrR2V0UmVzcG9uc2UgPSBQb3VjaERCLkNvcmUuQnVsa0dldFJlc3BvbnNlO1xuaW1wb3J0IEZpbmRSZXNwb25zZSA9IFBvdWNoREIuRmluZC5GaW5kUmVzcG9uc2U7XG5pbXBvcnQgeyBQb3VjaEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBvdWNoRmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUG91Y2hSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUG91Y2hSZXBvc2l0b3J5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGNyZWF0b3IgSUQgb24gYSBtb2RlbCBkdXJpbmcgY3JlYXRpb24gb3IgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGRlY29yYXRvciBoYW5kbGVyIHRvIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBjcmVhdG9yIElEIGZpZWxkIG9uIGEgbW9kZWxcbiAqIHdoZW4gaXQncyBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWQuIEl0IGV4dHJhY3RzIHRoZSBVVUlEIGZyb20gdGhlIGNvbnRleHQgYW5kIGFzc2lnbnMgaXQgdG8gdGhlIHNwZWNpZmllZCBrZXkuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIHRoYXQgZXh0ZW5kcyBQb3VjaFJlcG9zaXRvcnk8TT5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIHRoYXQgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxQb3VjaEZsYWdzPn0gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dCBjb250YWluaW5nIGZsYWdzXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXQgb24gdGhlIG1vZGVsXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIG1vZGlmeVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25Qb3VjaENyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItcG91Y2hcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFBvdWNoUmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxQb3VjaEZsYWdzPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXVpZDogc3RyaW5nID0gY29udGV4dC5nZXQoXCJVVUlEXCIpO1xuICAgIG1vZGVsW2tleV0gPSB1dWlkIGFzIE1ba2V5b2YgTV07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIk5vIFVzZXIgZm91bmQgaW4gY29udGV4dC4gUGxlYXNlIHByb3ZpZGUgYSB1c2VyIGluIHRoZSBjb250ZXh0XCJcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBvdWNoREIgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvdWNoREJBZGFwdGVyXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvdWNoREJBZGFwdGVyIGZvciBQb3VjaERCLlxuICogSXQgaGFuZGxlcyBhbGwgZGF0YWJhc2Ugb3BlcmF0aW9ucyBsaWtlIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUgKENSVUQpIGZvciBib3RoXG4gKiBzaW5nbGUgZG9jdW1lbnRzIGFuZCBidWxrIG9wZXJhdGlvbnMuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyBmb3IgcXVlcnlpbmcgYW5kIGluZGV4aW5nLlxuICogQHRlbXBsYXRlIERhdGFiYXNlIC0gVGhlIFBvdWNoREIgZGF0YWJhc2UgdHlwZVxuICogQHRlbXBsYXRlIFBvdWNoRmxhZ3MgLSBUaGUgZmxhZ3Mgc3BlY2lmaWMgdG8gUG91Y2hEQiBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgQ29udGV4dDxQb3VjaEZsYWdzPiAtIFRoZSBjb250ZXh0IHR5cGUgd2l0aCBQb3VjaERCIGZsYWdzXG4gKiBAcGFyYW0ge0RhdGFiYXNlfSBzY29wZSAtIFRoZSBQb3VjaERCIGRhdGFiYXNlIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgZGF0YWJhc2VcbiAqIEBjbGFzcyBQb3VjaEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcbiAqIGltcG9ydCB7IFBvdWNoQWRhcHRlciB9IGZyb20gJ0BkZWNhZi10cy9mb3ItcG91Y2gnO1xuICpcbiAqIC8vIENyZWF0ZSBhIG5ldyBQb3VjaERCIGluc3RhbmNlXG4gKiBjb25zdCBkYiA9IG5ldyBQb3VjaERCKCdteS1kYXRhYmFzZScpO1xuICpcbiAqIC8vIENyZWF0ZSBhIFBvdWNoQWRhcHRlciB3aXRoIHRoZSBkYXRhYmFzZVxuICogY29uc3QgYWRhcHRlciA9IG5ldyBQb3VjaEFkYXB0ZXIoZGIpO1xuICpcbiAqIC8vIFVzZSB0aGUgYWRhcHRlciBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgYWRhcHRlci5yZWFkKCd1c2VycycsICd1c2VyLTEyMycpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICogICBwYXJ0aWNpcGFudCBDb3VjaERCXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IG5ldyBQb3VjaEFkYXB0ZXIoZGIpXG4gKiAgIFBvdWNoQWRhcHRlci0+PkNvdWNoREJBZGFwdGVyOiBzdXBlcihzY29wZSwgUG91Y2hGbGF2b3VyLCBhbGlhcylcbiAqXG4gKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwpXG4gKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHB1dChtb2RlbClcbiAqICAgUG91Y2hEQi0+PkNvdWNoREI6IEhUVFAgUFVUXG4gKiAgIENvdWNoREItLT4+UG91Y2hEQjogUmVzcG9uc2VcbiAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFJlc3BvbnNlXG4gKiAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxcbiAqXG4gKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmVhZCh0YWJsZSwgaWQpXG4gKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGdldChpZClcbiAqICAgUG91Y2hEQi0+PkNvdWNoREI6IEhUVFAgR0VUXG4gKiAgIENvdWNoREItLT4+UG91Y2hEQjogRG9jdW1lbnRcbiAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IERvY3VtZW50XG4gKiAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IE1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3VjaEFkYXB0ZXIgZXh0ZW5kcyBDb3VjaERCQWRhcHRlcjxcbiAgRGF0YWJhc2UsXG4gIFBvdWNoRmxhZ3MsXG4gIENvbnRleHQ8UG91Y2hGbGFncz5cbj4ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogRGF0YWJhc2UsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIFBvdWNoRmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgb3BlcmF0aW9uIGZsYWdzIGZvciBQb3VjaERCIG9wZXJhdGlvbnNcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIHNldCBvZiBmbGFncyBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb24sIGluY2x1ZGluZyBhIFVVSUQgZm9yIGlkZW50aWZpY2F0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyB0aGUgdXNlciBJRCBmcm9tIHRoZSBkYXRhYmFzZSBVUkwgb3IgZ2VuZXJhdGVzIGEgcmFuZG9tIFVVSUQgaWYgbm90IGF2YWlsYWJsZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGtleSAoY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZSlcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPFBvdWNoRmxhZ3M+fSBmbGFncyAtIFBhcnRpYWwgZmxhZ3MgdG8gYmUgbWVyZ2VkXG4gICAqIEByZXR1cm4ge1BvdWNoRmxhZ3N9IFRoZSBjb21wbGV0ZSBzZXQgb2YgZmxhZ3MgZm9yIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8UG91Y2hGbGFncz5cbiAgKTogUG91Y2hGbGFncyB7XG4gICAgbGV0IGlkOiBzdHJpbmcgPSBcIlwiO1xuICAgIGNvbnN0IHVybCA9ICh0aGlzLm5hdGl2ZSBhcyB1bmtub3duIGFzIHsgbmFtZTogc3RyaW5nIH0pLm5hbWU7XG4gICAgaWYgKHVybCkge1xuICAgICAgY29uc3QgcmVnZXhwID0gL2h0dHBzPzpcXC9cXC8oLis/KTouKz9AL2c7XG4gICAgICBjb25zdCBtID0gcmVnZXhwLmV4ZWModXJsKTtcbiAgICAgIGlmIChtKSBpZCA9IG1bMV07XG4gICAgfVxuICAgIGlmICghaWQpIHtcbiAgICAgIGlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyksIHtcbiAgICAgIFVVSUQ6IGlkLFxuICAgIH0pIGFzIFBvdWNoRmxhZ3M7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgZGF0YWJhc2UgaW5kZXhlcyBmb3IgdGhlIGdpdmVuIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYW5kIGNyZWF0ZXMgaW5kZXhlcyBpbiB0aGUgUG91Y2hEQiBkYXRhYmFzZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbW9kZWwgY29uc3RydWN0b3JzLlxuICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBnZW5lcmF0ZUluZGV4ZXMgdXRpbGl0eSB0byBjcmVhdGUgaW5kZXggZGVmaW5pdGlvbnMgYW5kIHRoZW4gY3JlYXRlcyB0aGVtIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAgICogQHBhcmFtIG1vZGVscyAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvcnMgdG8gY3JlYXRlIGluZGV4ZXMgZm9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGluZGV4ZXMgYXJlIGNyZWF0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBpbmRleDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIC4uLm1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleGVzOiBDcmVhdGVJbmRleFJlcXVlc3RbXSA9IGdlbmVyYXRlSW5kZXhlcyhtb2RlbHMpO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykge1xuICAgICAgY29uc3QgcmVzOiBDcmVhdGVJbmRleFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5jcmVhdGVJbmRleChcbiAgICAgICAgaW5kZXggYXMgYW55XG4gICAgICApO1xuICAgICAgY29uc3QgeyByZXN1bHQgfSA9IHJlcztcbiAgICAgIGlmIChyZXN1bHQgPT09IFwiZXhpc3RpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoYEluZGV4ICR7aW5kZXgubmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgYSBuZXcgZG9jdW1lbnQgaW50byB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgcHV0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBlcnJvciBwYXJzaW5nIGFuZCBlbnN1cmVzIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGRvY3VtZW50IElEXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgZG9jdW1lbnQgZGF0YSB0byBpbnNlcnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogcHV0KG1vZGVsKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogUmVzcG9uc2Ugd2l0aCBvaz10cnVlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVsIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLnB1dChtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBpbnNlcnQgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgbXVsdGlwbGUgZG9jdW1lbnRzIGludG8gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIGJ1bGtEb2NzIG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBlcnJvciBwYXJzaW5nIGFuZCBlbnN1cmVzIGFsbCBvcGVyYXRpb25zIHdlcmUgc3VjY2Vzc2Z1bC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHBhcmFtICBtb2RlbHMgLSBUaGUgZG9jdW1lbnQgZGF0YSB0byBpbnNlcnRcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBjcmVhdGVBbGwodGFibGVOYW1lLCBpZHMsIG1vZGVscylcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrRG9jcyhtb2RlbHMpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBBcnJheSBvZiByZXNwb25zZXMgd2l0aCBvaz10cnVlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk11bHRpcGxlTWV0YWRhdGEobW9kZWxzLCByZXZzKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBBcnJheSB3aXRoIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBDaGVjayBmb3IgZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2VbXSB8IEVycltdO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKG1vZGVscyk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ldmVyeSgocjogUmVzcG9uc2UgfCBFcnIpID0+IChyIGFzIFJlc3BvbnNlKS5vaykpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3BvbnNlLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBlbCwgaSkgPT4ge1xuICAgICAgICBpZiAoZWwuZXJyb3IpXG4gICAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICAgIGBlbCAke2l9OiAke2VsLmVycm9yfSR7ZWwucmVhc29uID8gYCAtICR7ZWwucmVhc29ufWAgOiBcIlwifWBcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCBbXSk7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlcnJvcnMuam9pbihcIlxcblwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTXVsdGlwbGVNZXRhZGF0YShcbiAgICAgIG1vZGVscyxcbiAgICAgIHJlc3BvbnNlLm1hcCgocikgPT4gci5yZXYgYXMgc3RyaW5nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIGRvY3VtZW50IGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBnZXQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGRvY3VtZW50IElEIGJhc2VkIG9uIHRoZSB0YWJsZSBuYW1lIGFuZCBJRCwgdGhlbiByZXRyaWV2ZXMgdGhlIGRvY3VtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmVhZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGdldChfaWQpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudFxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogRG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogSWRNZXRhICYgR2V0TWV0YTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3Jldik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgdGhlaXIgSURzXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIGJ1bGtHZXQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgZG9jdW1lbnQgSURzIGJhc2VkIG9uIHRoZSB0YWJsZSBuYW1lIGFuZCBJRHMsIHRoZW4gcmV0cmlldmVzIHRoZSBkb2N1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZ3xudW1iZXJ8YmlnaW50Pn0gaWRzIC0gVGhlIGRvY3VtZW50IElEc1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmVhZEFsbCh0YWJsZU5hbWUsIGlkcylcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IE1hcCBpZHMgdG8gZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtHZXQoe2RvY3N9KVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQnVsa0dldFJlc3BvbnNlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0c1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YSBmb3IgZWFjaCBkb2NcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGVycm9yKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEJ1bGtHZXRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0dldCh7XG4gICAgICBkb2NzOiBpZHMubWFwKChpZCkgPT4gKHsgaWQ6IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkgfSkpLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IHJlc3VsdHMucmVzdWx0cy5yZWR1Y2UoKGFjY3VtOiBhbnlbXSwgcikgPT4ge1xuICAgICAgci5kb2NzLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgaWYgKChkIGFzIGFueSkuZXJyb3IgfHwgIShkIGFzIGFueSkub2spXG4gICAgICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoXG4gICAgICAgICAgICAoKGQgYXMgeyBlcnJvcjogRXJyIH0pLmVycm9yIGFzIEVycm9yKSB8fFxuICAgICAgICAgICAgICBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgdmFsaWQgcmVzcG9uc2VcIilcbiAgICAgICAgICApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCAoZCBhcyB7IG9rOiBhbnkgfSkub2spO1xuICAgICAgICBhY2N1bS5wdXNoKHRoaXMuYXNzaWduTWV0YWRhdGEocmVzdWx0LCAoZCBhcyBhbnkpLm9rW0NvdWNoREJLZXlzLlJFVl0pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW4gZXhpc3RpbmcgZG9jdW1lbnQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYSBkb2N1bWVudCBpbiB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgcHV0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBlcnJvciBwYXJzaW5nIGFuZCBlbnN1cmVzIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGRvY3VtZW50IElEXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCBkb2N1bWVudCBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogdXBkYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHB1dChtb2RlbClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFJlc3BvbnNlIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5wdXQobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBkb2MgaWQ6ICR7aWR9IGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBkYXRhYmFzZSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIGJ1bGtEb2NzIG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBlcnJvciBwYXJzaW5nIGFuZCBlbnN1cmVzIGFsbCBvcGVyYXRpb25zIHdlcmUgc3VjY2Vzc2Z1bC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHBhcmFtIG1vZGVscyAtIFRoZSB1cGRhdGVkIGRvY3VtZW50IGRhdGFcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiB1cGRhdGVBbGwodGFibGVOYW1lLCBpZHMsIG1vZGVscylcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrRG9jcyhtb2RlbHMpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBBcnJheSBvZiByZXNwb25zZXMgd2l0aCBvaz10cnVlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk11bHRpcGxlTWV0YWRhdGEobW9kZWxzLCByZXZzKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBBcnJheSB3aXRoIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBDaGVjayBmb3IgZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGxldCByZXNwb25zZTogKFJlc3BvbnNlIHwgRXJyKVtdO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKG1vZGVscyk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ldmVyeSgocikgPT4gIShyIGFzIGFueSkuZXJyb3IpKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKChlbCBhcyBhbnkpLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHsoZWwgYXMgYW55KS5lcnJvcn0keyhlbCBhcyBhbnkpLnJlYXNvbiA/IGAgLSAkeyhlbCBhcyBhbnkpLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgICBtb2RlbHMsXG4gICAgICByZXNwb25zZS5tYXAoKHIpID0+IHIucmV2IGFzIHN0cmluZylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIGRvY3VtZW50IGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHJlbW92ZSBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGZpcnN0IHJldHJpZXZlcyB0aGUgZG9jdW1lbnQgdG8gZ2V0IGl0cyByZXZpc2lvbiwgdGhlbiBkZWxldGVzIGl0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGRlbGV0ZSh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGdldChfaWQpXG4gICAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IERvY3VtZW50IHdpdGggX3JldlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHJlbW92ZShfaWQsIHJlY29yZC5fcmV2KVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogU3VjY2VzcyByZXNwb25zZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogRGVsZXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgX2lkID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIGxldCByZWNvcmQ6IElkTWV0YSAmIEdldE1ldGE7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMubmF0aXZlLmdldChfaWQpO1xuICAgICAgYXdhaXQgdGhpcy5uYXRpdmUucmVtb3ZlKF9pZCwgcmVjb3JkLl9yZXYpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBkYXRhYmFzZSBieSB0aGVpciBJRHNcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSBpbiBhIHNpbmdsZSBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGZpcnN0IHJldHJpZXZlcyBhbGwgZG9jdW1lbnRzIHRvIGdldCB0aGVpciByZXZpc2lvbnMsIHRoZW4gbWFya3MgdGhlbSBhcyBkZWxldGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmd8bnVtYmVyfGJpZ2ludD59IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBkZWxldGVBbGwodGFibGVOYW1lLCBpZHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBNYXAgaWRzIHRvIGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrR2V0KHtkb2NzfSlcbiAgICogICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQnVsa0dldFJlc3BvbnNlIHdpdGggZG9jdW1lbnRzXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBNYXJrIGRvY3VtZW50cyBhcyBkZWxldGVkXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobWFya2VkIGRvY3VtZW50cylcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFN1Y2Nlc3MgcmVzcG9uc2VzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0c1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YSBmb3IgZWFjaCBkb2NcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERlbGV0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IENoZWNrIGZvciBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0czogQnVsa0dldFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrR2V0KHtcbiAgICAgIGRvY3M6IGlkcy5tYXAoKGlkKSA9PiAoeyBpZDogdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQgYXMgYW55KSB9KSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZWxldGlvbjogKFJlc3BvbnNlIHwgRXJyKVtdID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0RvY3MoXG4gICAgICByZXN1bHRzLnJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgIChyIGFzIGFueSlbQ291Y2hEQktleXMuREVMRVRFRF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGVycnMgPSBkZWxldGlvbi5maWx0ZXIoKGQpID0+IChkIGFzIGFueSkuZXJyb3IpO1xuICAgIGlmIChlcnJzLmxlbmd0aCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJycy5qb2luKFwiXFxuXCIpKTtcblxuICAgIHJldHVybiByZXN1bHRzLnJlc3VsdHMucmVkdWNlKChhY2N1bTogYW55W10sIHIpID0+IHtcbiAgICAgIHIuZG9jcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIChkIGFzIHsgb2s6IGFueSB9KS5vayk7XG4gICAgICAgIGFjY3VtLnB1c2godGhpcy5hc3NpZ25NZXRhZGF0YShyZXN1bHQsIChkIGFzIGFueSkub2tbQ291Y2hEQktleXMuUkVWXSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhIGRpcmVjdCBmaW5kIG9wZXJhdGlvbiB1c2luZyBhIE1hbmdvIHF1ZXJ5IG9iamVjdC5cbiAgICogVGhpcyBtZXRob2QgYWxsb3dzIGZvciBjb21wbGV4IHF1ZXJpZXMgYmV5b25kIHRoZSBzdGFuZGFyZCBDUlVEIG9wZXJhdGlvbnMuXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJldHVybiB0eXBlXG4gICAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcmF3SW5wdXQgLSBUaGUgTWFuZ28gcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9jZXNzPXRydWVdIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXNwb25zZSAodHJ1ZSByZXR1cm5zIGp1c3QgZG9jcywgZmFsc2UgcmV0dXJucyBmdWxsIHJlc3BvbnNlKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFY+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiByYXc8Vj4ocmF3SW5wdXQsIHByb2Nlc3MpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogZmluZChyYXdJbnB1dClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEZpbmRSZXNwb25zZVxuICAgKiAgICAgYWx0IHByb2Nlc3M9dHJ1ZVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiByZXNwb25zZS5kb2NzIGFzIFZcbiAgICogICAgIGVsc2UgcHJvY2Vzcz1mYWxzZVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiByZXNwb25zZSBhcyBWXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyByYXc8Vj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIHByb2Nlc3MgPSB0cnVlKTogUHJvbWlzZTxWPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBGaW5kUmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmZpbmQoXG4gICAgICAgIHJhd0lucHV0IGFzIGFueVxuICAgICAgKTtcbiAgICAgIGlmIChyZXNwb25zZS53YXJuaW5nKSBjb25zb2xlLndhcm4ocmVzcG9uc2Uud2FybmluZyk7XG4gICAgICBpZiAocHJvY2VzcykgcmV0dXJuIHJlc3BvbnNlLmRvY3MgYXMgVjtcbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBWO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW5kIGNvbnZlcnRzIGVycm9ycyBmcm9tIFBvdWNoREIgdG8gYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3JzXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIFBvdWNoREIgZXJyb3JzIHRvIHRoZSBhcHBsaWNhdGlvbidzIGVycm9yIGhpZXJhcmNoeS5cbiAgICogVGhpcyBpbnN0YW5jZSBtZXRob2QgZGVsZWdhdGVzIHRvIHRoZSBzdGF0aWMgcGFyc2VFcnJvciBtZXRob2QuXG4gICAqIEBwYXJhbSB7RXJyb3J8c3RyaW5nfSBlcnIgLSBUaGUgZXJyb3Igb2JqZWN0IG9yIG1lc3NhZ2UgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgY29udmVydGVkIGVycm9yIG9iamVjdFxuICAgKi9cbiAgb3ZlcnJpZGUgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIHJldHVybiBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtZXRob2QgdG8gcGFyc2UgYW5kIGNvbnZlcnQgZXJyb3JzIGZyb20gUG91Y2hEQiB0byBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvcnNcbiAgICogQHN1bW1hcnkgQ29udmVydHMgUG91Y2hEQiBlcnJvcnMgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgZXJyb3IgaGllcmFyY2h5IGJhc2VkIG9uIGVycm9yIGNvZGVzIGFuZCBtZXNzYWdlcy5cbiAgICogVGhpcyBtZXRob2QgYW5hbHl6ZXMgdGhlIGVycm9yIHR5cGUsIHN0YXR1cyBjb2RlLCBvciBtZXNzYWdlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY2xhc3MuXG4gICAqIEBwYXJhbSB7RXJyb3J8c3RyaW5nfSBlcnIgLSBUaGUgZXJyb3Igb2JqZWN0IG9yIG1lc3NhZ2UgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgY29udmVydGVkIGVycm9yIG9iamVjdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICpcbiAgICogICBDYWxsZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZXJyLCByZWFzb24pXG4gICAqICAgYWx0IGVyciBpcyBCYXNlRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IFJldHVybiBlcnIgYXMgaXNcbiAgICogICBlbHNlIGVyciBpcyBzdHJpbmdcbiAgICogICAgIGFsdCBjb250YWlucyBcImFscmVhZHkgZXhpc3RcIiBvciBcInVwZGF0ZSBjb25mbGljdFwiXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVsc2UgY29udGFpbnMgXCJtaXNzaW5nXCIgb3IgXCJkZWxldGVkXCJcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBlcnIgaGFzIHN0YXR1c1xuICAgKiAgICAgYWx0IHN0YXR1cyBpcyA0MDEsIDQxMiwgNDA5XG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVsc2Ugc3RhdHVzIGlzIDQwNFxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgICBlbHNlIHN0YXR1cyBpcyA0MDBcbiAgICogICAgICAgYWx0IG1lc3NhZ2UgY29udGFpbnMgXCJObyBpbmRleCBleGlzdHNcIlxuICAgKiAgICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IEluZGV4RXJyb3JcbiAgICogICAgICAgZWxzZVxuICAgKiAgICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IEludGVybmFsRXJyb3JcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlIG1lc3NhZ2UgY29udGFpbnMgXCJFQ09OTlJFRlVTRURcIlxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25uZWN0aW9uRXJyb3JcbiAgICogICAgIGVsc2VcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogSW50ZXJuYWxFcnJvclxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGUgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIC8vIHJldHVybiBzdXBlci5wYXJzZUVycm9yKGVyciwgcmVhc29uKTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyIGFzIGFueTtcbiAgICBsZXQgY29kZTogc3RyaW5nID0gXCJcIjtcbiAgICBpZiAodHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29kZSA9IGVycjtcbiAgICAgIGlmIChjb2RlLm1hdGNoKC9hbHJlYWR5IGV4aXN0fHVwZGF0ZSBjb25mbGljdC9nKSlcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGNvZGUpO1xuICAgICAgaWYgKGNvZGUubWF0Y2goL21pc3Npbmd8ZGVsZXRlZC9nKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGNvZGUpO1xuICAgIH0gZWxzZSBpZiAoKGVyciBhcyBhbnkpLnN0YXR1cykge1xuICAgICAgY29kZSA9IChlcnIgYXMgYW55KS5zdGF0dXM7XG4gICAgICByZWFzb24gPSByZWFzb24gfHwgZXJyLm1lc3NhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUgPSBlcnIubWVzc2FnZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvZGUudG9TdHJpbmcoKSkge1xuICAgICAgY2FzZSBcIjQwMVwiOlxuICAgICAgY2FzZSBcIjQxMlwiOlxuICAgICAgY2FzZSBcIjQwOVwiOlxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IocmVhc29uIGFzIHN0cmluZyk7XG4gICAgICBjYXNlIFwiNDA0XCI6XG4gICAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcbiAgICAgIGNhc2UgXCI0MDBcIjpcbiAgICAgICAgaWYgKGNvZGUudG9TdHJpbmcoKS5tYXRjaCgvTm9cXHNpbmRleFxcc2V4aXN0cy9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IEluZGV4RXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoY29kZS50b1N0cmluZygpLm1hdGNoKC9FQ09OTlJFRlVTRUQvZykpXG4gICAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHVwIGRlY29yYXRpb25zIGZvciBQb3VjaERCLXNwZWNpZmljIG1vZGVsIHByb3BlcnRpZXNcbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBkZWNvcmF0b3JzIGZvciBjcmVhdGVkQnkgYW5kIHVwZGF0ZWRCeSBmaWVsZHMgaW4gbW9kZWxzLlxuICAgKiBUaGlzIG1ldGhvZCBkZWZpbmVzIGhvdyB0aGVzZSBmaWVsZHMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEZWNvcmF0aW9uXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UG91Y2hBZGFwdGVyOiBkZWNvcmF0aW9uKClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZWRCeUtleVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlJlcG9zaXRvcnk6IGtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSlcbiAgICogICBSZXBvc2l0b3J5LS0+PlBvdWNoQWRhcHRlcjogdXBkYXRlZEJ5S2V5XG4gICAqXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UG91Y2hBZGFwdGVyOiBEZWNvcmF0b3JCdWlsZGVyXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZm9yKGNyZWF0ZWRCeUtleSlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBhcHBseSgpXG4gICAqXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UG91Y2hBZGFwdGVyOiBEZWNvcmF0b3JCdWlsZGVyXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZm9yKHVwZGF0ZWRCeUtleSlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBhcHBseSgpXG4gICAqL1xuICBzdGF0aWMgZGVjb3JhdGlvbigpIHtcbiAgICBjb25zdCBjcmVhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gICAgY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICAgIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25Qb3VjaENyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cbiJdfQ==