@decaf-ts/core 0.4.1 → 0.5.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.
Files changed (169) hide show
  1. package/dist/core.cjs +179 -168
  2. package/dist/core.esm.cjs +134 -134
  3. package/lib/esm/identity/decorators.d.ts +3 -2
  4. package/lib/esm/identity/decorators.js +7 -5
  5. package/lib/esm/index.d.ts +1 -1
  6. package/lib/esm/index.js +1 -1
  7. package/lib/esm/interfaces/ErrorParser.d.ts +4 -0
  8. package/lib/esm/interfaces/ErrorParser.js +2 -0
  9. package/lib/esm/interfaces/index.d.ts +1 -0
  10. package/lib/esm/interfaces/index.js +2 -1
  11. package/lib/esm/model/construction.d.ts +13 -10
  12. package/lib/esm/model/construction.js +8 -3
  13. package/lib/esm/model/decorators.d.ts +9 -8
  14. package/lib/esm/model/decorators.js +34 -14
  15. package/lib/esm/model/index.d.ts +1 -1
  16. package/lib/esm/model/index.js +3 -2
  17. package/lib/esm/persistence/Adapter.d.ts +14 -13
  18. package/lib/esm/persistence/Adapter.js +37 -26
  19. package/lib/esm/query/Clause.d.ts +2 -2
  20. package/lib/esm/query/ClauseFactory.d.ts +3 -3
  21. package/lib/esm/query/ClauseFactory.js +1 -1
  22. package/lib/esm/query/Paginator.d.ts +2 -2
  23. package/lib/esm/query/Paginator.js +4 -3
  24. package/lib/esm/query/Query.d.ts +1 -1
  25. package/lib/esm/query/Query.js +1 -1
  26. package/lib/esm/query/Statement.d.ts +3 -3
  27. package/lib/esm/query/Statement.js +1 -1
  28. package/lib/esm/query/errors.js +3 -3
  29. package/lib/esm/ram/RamAdapter.d.ts +41 -0
  30. package/lib/esm/ram/RamAdapter.js +230 -0
  31. package/lib/esm/ram/RamClauseFactory.d.ts +17 -0
  32. package/lib/esm/ram/RamClauseFactory.js +92 -0
  33. package/lib/esm/ram/RamContext.d.ts +5 -0
  34. package/lib/esm/ram/RamContext.js +7 -0
  35. package/lib/esm/ram/RamPaginator.d.ts +7 -0
  36. package/lib/esm/ram/RamPaginator.js +20 -0
  37. package/lib/esm/ram/RamSequence.d.ts +50 -0
  38. package/lib/esm/ram/RamSequence.js +130 -0
  39. package/lib/esm/ram/RamStatement.d.ts +8 -0
  40. package/lib/esm/ram/RamStatement.js +18 -0
  41. package/lib/esm/ram/clauses/FromClause.d.ts +7 -0
  42. package/lib/esm/ram/clauses/FromClause.js +11 -0
  43. package/lib/esm/ram/clauses/InsertClause.d.ts +7 -0
  44. package/lib/esm/ram/clauses/InsertClause.js +13 -0
  45. package/lib/esm/ram/clauses/OrderByClause.d.ts +7 -0
  46. package/lib/esm/ram/clauses/OrderByClause.js +39 -0
  47. package/lib/esm/ram/clauses/SelectClause.d.ts +7 -0
  48. package/lib/esm/ram/clauses/SelectClause.js +16 -0
  49. package/lib/esm/ram/clauses/ValuesClause.d.ts +7 -0
  50. package/lib/esm/ram/clauses/ValuesClause.js +12 -0
  51. package/lib/esm/ram/clauses/WhereClause.d.ts +7 -0
  52. package/lib/esm/ram/clauses/WhereClause.js +11 -0
  53. package/lib/esm/ram/clauses/index.d.ts +6 -0
  54. package/lib/esm/ram/clauses/index.js +7 -0
  55. package/lib/esm/ram/index.d.ts +9 -0
  56. package/lib/esm/ram/index.js +10 -0
  57. package/lib/esm/ram/model/RamSequence.d.ts +20 -0
  58. package/lib/esm/ram/model/RamSequence.js +33 -0
  59. package/lib/esm/ram/model/index.d.ts +1 -0
  60. package/lib/esm/ram/model/index.js +2 -0
  61. package/lib/esm/ram/types.d.ts +17 -0
  62. package/lib/esm/ram/types.js +2 -0
  63. package/lib/esm/repository/Repository.d.ts +6 -3
  64. package/lib/esm/repository/Repository.js +27 -15
  65. package/lib/esm/repository/errors.d.ts +6 -0
  66. package/lib/esm/repository/errors.js +12 -2
  67. package/lib/esm/repository/index.d.ts +0 -1
  68. package/lib/esm/repository/index.js +1 -2
  69. package/lib/identity/decorators.cjs +10 -8
  70. package/lib/identity/decorators.d.ts +3 -2
  71. package/lib/identity/index.cjs +1 -1
  72. package/lib/identity/utils.cjs +3 -3
  73. package/lib/index.cjs +2 -2
  74. package/lib/index.d.ts +1 -1
  75. package/lib/interfaces/ErrorParser.cjs +3 -0
  76. package/lib/interfaces/ErrorParser.d.ts +4 -0
  77. package/lib/interfaces/index.cjs +2 -1
  78. package/lib/interfaces/index.d.ts +1 -0
  79. package/lib/model/IdentifiedBaseModel.cjs +1 -1
  80. package/lib/model/construction.cjs +11 -6
  81. package/lib/model/construction.d.ts +13 -10
  82. package/lib/model/decorators.cjs +39 -19
  83. package/lib/model/decorators.d.ts +9 -8
  84. package/lib/model/index.cjs +3 -2
  85. package/lib/model/index.d.ts +1 -1
  86. package/lib/persistence/Adapter.cjs +37 -26
  87. package/lib/persistence/Adapter.d.ts +14 -13
  88. package/lib/persistence/Sequence.cjs +2 -2
  89. package/lib/persistence/decorators.cjs +1 -1
  90. package/lib/persistence/index.cjs +1 -1
  91. package/lib/query/Clause.cjs +1 -1
  92. package/lib/query/Clause.d.ts +2 -2
  93. package/lib/query/ClauseFactory.cjs +1 -1
  94. package/lib/query/ClauseFactory.d.ts +3 -3
  95. package/lib/query/Condition.cjs +1 -1
  96. package/lib/query/Paginator.cjs +4 -3
  97. package/lib/query/Paginator.d.ts +2 -2
  98. package/lib/query/Query.cjs +1 -1
  99. package/lib/query/Query.d.ts +1 -1
  100. package/lib/query/Statement.cjs +3 -3
  101. package/lib/query/Statement.d.ts +3 -3
  102. package/lib/query/clauses/FromClause.cjs +3 -3
  103. package/lib/query/clauses/GroupByClause.cjs +2 -2
  104. package/lib/query/clauses/InsertClause.cjs +3 -3
  105. package/lib/query/clauses/LimitClause.cjs +2 -2
  106. package/lib/query/clauses/OffsetClause.cjs +2 -2
  107. package/lib/query/clauses/OrderByClause.cjs +2 -2
  108. package/lib/query/clauses/SelectClause.cjs +2 -2
  109. package/lib/query/clauses/SelectorBasedClause.cjs +2 -2
  110. package/lib/query/clauses/ValuesClause.cjs +3 -3
  111. package/lib/query/clauses/WhereClause.cjs +4 -4
  112. package/lib/query/clauses/index.cjs +1 -1
  113. package/lib/query/errors.cjs +3 -3
  114. package/lib/query/index.cjs +1 -1
  115. package/lib/ram/RamAdapter.cjs +268 -0
  116. package/lib/ram/RamAdapter.d.ts +41 -0
  117. package/lib/ram/RamClauseFactory.cjs +96 -0
  118. package/lib/ram/RamClauseFactory.d.ts +17 -0
  119. package/lib/ram/RamContext.cjs +11 -0
  120. package/lib/ram/RamContext.d.ts +5 -0
  121. package/lib/ram/RamPaginator.cjs +24 -0
  122. package/lib/ram/RamPaginator.d.ts +7 -0
  123. package/lib/ram/RamSequence.cjs +135 -0
  124. package/lib/ram/RamSequence.d.ts +50 -0
  125. package/lib/ram/RamStatement.cjs +22 -0
  126. package/lib/ram/RamStatement.d.ts +8 -0
  127. package/lib/ram/clauses/FromClause.cjs +15 -0
  128. package/lib/ram/clauses/FromClause.d.ts +7 -0
  129. package/lib/ram/clauses/InsertClause.cjs +17 -0
  130. package/lib/ram/clauses/InsertClause.d.ts +7 -0
  131. package/lib/ram/clauses/OrderByClause.cjs +43 -0
  132. package/lib/ram/clauses/OrderByClause.d.ts +7 -0
  133. package/lib/ram/clauses/SelectClause.cjs +20 -0
  134. package/lib/ram/clauses/SelectClause.d.ts +7 -0
  135. package/lib/ram/clauses/ValuesClause.cjs +16 -0
  136. package/lib/ram/clauses/ValuesClause.d.ts +7 -0
  137. package/lib/ram/clauses/WhereClause.cjs +15 -0
  138. package/lib/ram/clauses/WhereClause.d.ts +7 -0
  139. package/lib/ram/clauses/index.cjs +23 -0
  140. package/lib/ram/clauses/index.d.ts +6 -0
  141. package/lib/ram/index.cjs +26 -0
  142. package/lib/ram/index.d.ts +9 -0
  143. package/lib/ram/model/RamSequence.cjs +36 -0
  144. package/lib/ram/model/RamSequence.d.ts +20 -0
  145. package/lib/ram/model/index.cjs +18 -0
  146. package/lib/ram/model/index.d.ts +1 -0
  147. package/lib/ram/types.cjs +3 -0
  148. package/lib/ram/types.d.ts +17 -0
  149. package/lib/repository/Repository.cjs +32 -20
  150. package/lib/repository/Repository.d.ts +6 -3
  151. package/lib/repository/decorators.cjs +1 -1
  152. package/lib/repository/errors.cjs +15 -3
  153. package/lib/repository/errors.d.ts +6 -0
  154. package/lib/repository/index.cjs +1 -2
  155. package/lib/repository/index.d.ts +0 -1
  156. package/lib/repository/injectables.cjs +3 -3
  157. package/lib/repository/utils.cjs +3 -3
  158. package/lib/validators/ClauseSequenceValidator.cjs +5 -5
  159. package/lib/validators/decorators.cjs +2 -2
  160. package/lib/validators/index.cjs +1 -1
  161. package/package.json +10 -3
  162. package/lib/esm/model/User.d.ts +0 -9
  163. package/lib/esm/model/User.js +0 -34
  164. package/lib/esm/repository/Context.d.ts +0 -10
  165. package/lib/esm/repository/Context.js +0 -12
  166. package/lib/model/User.cjs +0 -37
  167. package/lib/model/User.d.ts +0 -9
  168. package/lib/repository/Context.cjs +0 -16
  169. package/lib/repository/Context.d.ts +0 -10
package/dist/core.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@decaf-ts/db-decorators'), require('@decaf-ts/injectable-decorators'), require('@decaf-ts/reflection'), require('@decaf-ts/decorator-validation')) :
3
- typeof define === 'function' && define.amd ? define(['exports', '@decaf-ts/db-decorators', '@decaf-ts/injectable-decorators', '@decaf-ts/reflection', '@decaf-ts/decorator-validation'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.core = {}, global.dbDecorators, global.injectableDecorators, global.reflection, global.decoratorValidation));
5
- })(this, (function (exports, dbDecorators, injectableDecorators, reflection, decoratorValidation) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@decaf-ts/injectable-decorators'), require('@decaf-ts/db-decorators'), require('@decaf-ts/reflection'), require('@decaf-ts/decorator-validation'), require('tslib')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', '@decaf-ts/injectable-decorators', '@decaf-ts/db-decorators', '@decaf-ts/reflection', '@decaf-ts/decorator-validation', 'tslib'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.core = {}, global.injectableDecorators, global.dbDecorators, global.reflection, global.decoratorValidation, global.tslib));
5
+ })(this, (function (exports, injectableDecorators, dbDecorators, reflection, decoratorValidation, tslib) { 'use strict';
6
6
 
7
7
  /**
8
8
  * @summary defines order directions when sorting
@@ -34,17 +34,6 @@
34
34
  delete: exports.Cascade.NONE,
35
35
  };
36
36
 
37
- class Context extends dbDecorators.Context {
38
- constructor(operation, model, parent) {
39
- super(operation, model, parent);
40
- }
41
- get timestamp() {
42
- if (!this._timestamp)
43
- this._timestamp = new Date();
44
- return this._timestamp;
45
- }
46
- }
47
-
48
37
  exports.PersistenceKeys = void 0;
49
38
  (function (PersistenceKeys) {
50
39
  PersistenceKeys["INDEX"] = "index";
@@ -212,23 +201,22 @@
212
201
  }
213
202
  }
214
203
 
215
- class ConnectionError extends dbDecorators.BaseError {
216
- constructor(msg) {
217
- super(ConnectionError.name, msg);
204
+ decoratorValidation.Decoration.setFlavourResolver((obj) => {
205
+ try {
206
+ return (Adapter.flavourOf(decoratorValidation.Model.isModel(obj) ? obj.constructor : obj) ||
207
+ decoratorValidation.DefaultFlavour);
208
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
218
209
  }
219
- }
220
- class UnsupportedError extends dbDecorators.BaseError {
221
- constructor(msg) {
222
- super(UnsupportedError.name, msg);
210
+ catch (e) {
211
+ return decoratorValidation.DefaultFlavour;
223
212
  }
224
- }
225
-
213
+ });
226
214
  /**
227
215
  * @summary Abstract Decaf-ts Persistence Adapter Class
228
216
  * @description Offers the base implementation for all Adapter Classes
229
217
  * and manages them various registered {@link Adapter}s
230
218
  *
231
- * @typedef Y the underlying persistence object type
219
+ * @typedef Y the underlying persistence object type or the required config to set it up
232
220
  * @typedef Q The query object the adapter uses
233
221
  *
234
222
  * @param {Y} native the underlying persistence object
@@ -253,6 +241,8 @@
253
241
  throw new dbDecorators.InternalError(`Persistence adapter flavour ${this.flavour} already registered`);
254
242
  this._native = native;
255
243
  Adapter._cache[this.flavour] = this;
244
+ if (!Adapter._current)
245
+ Adapter._current = this;
256
246
  }
257
247
  Query() {
258
248
  return new Query(this);
@@ -260,26 +250,18 @@
260
250
  isReserved(attr) {
261
251
  return !attr;
262
252
  }
263
- async context(operation, model) {
264
- let user;
265
- try {
266
- user = await this.user();
267
- }
268
- catch (e) {
269
- if (!(e instanceof UnsupportedError))
270
- throw e;
271
- }
272
- const c = new (class extends Context {
273
- constructor(operation, model, parent) {
274
- super(operation, model, parent);
253
+ async context(operation, overrides, model) {
254
+ const AdapterContext = class extends dbDecorators.Context {
255
+ constructor(obj) {
256
+ super(obj);
275
257
  }
276
- get user() {
277
- if (!user)
278
- throw new UnsupportedError("Adapter does not support user identification");
279
- return user;
280
- }
281
- })(operation, model);
282
- return c;
258
+ };
259
+ return new AdapterContext(Object.assign({}, dbDecorators.DefaultRepositoryFlags, overrides, {
260
+ affectedTables: Repository.table(model),
261
+ writeOperation: operation !== dbDecorators.OperationKeys.READ,
262
+ timestamp: new Date(),
263
+ operation: operation,
264
+ }));
283
265
  }
284
266
  prepare(model, pk) {
285
267
  const result = Object.entries(model).reduce((accum, [key, val]) => {
@@ -373,8 +355,17 @@
373
355
  console.warn(`Failed to update observable ${this._observers[i]}: ${result.reason}`);
374
356
  });
375
357
  }
358
+ toString() {
359
+ return `${this.flavour} persistence Adapter`;
360
+ }
361
+ static flavourOf(model) {
362
+ return (Reflect.getMetadata(this.key(exports.PersistenceKeys.ADAPTER), model) ||
363
+ this.current.flavour);
364
+ }
376
365
  static get current() {
377
- return this._current;
366
+ if (!Adapter._current)
367
+ throw new dbDecorators.InternalError(`No persistence flavour set. Please initialize your adapter`);
368
+ return Adapter._current;
378
369
  }
379
370
  static get(flavour) {
380
371
  if (flavour in this._cache)
@@ -475,11 +466,21 @@
475
466
  dbDecorators.wrapMethodWithContext(this, this[name + "Prefix"], m, this[name + "Suffix"]);
476
467
  });
477
468
  }
469
+ override(flags) {
470
+ return new Proxy(this, {
471
+ get: (target, p, receiver) => {
472
+ const result = Reflect.get(target, p, receiver);
473
+ if (p !== "_overrides")
474
+ return result;
475
+ return Object.assign({}, result, flags);
476
+ },
477
+ });
478
+ }
478
479
  async createPrefix(model, ...args) {
479
- const contextArgs = await Context.args(dbDecorators.OperationKeys.CREATE, this.class, args, this.adapter);
480
+ const contextArgs = await dbDecorators.Context.args(dbDecorators.OperationKeys.CREATE, this.class, args, this.adapter, this._overrides || {});
480
481
  model = new this.class(model);
481
482
  await dbDecorators.enforceDBDecorators(this, contextArgs.context, model, dbDecorators.OperationKeys.CREATE, dbDecorators.OperationKeys.ON);
482
- const errors = model.hasErrors();
483
+ const errors = model.hasErrors(...(contextArgs.context.get("ignoredValidationProperties") || []));
483
484
  if (errors)
484
485
  throw new dbDecorators.ValidationError(errors.toString());
485
486
  return [model, ...contextArgs.args];
@@ -490,6 +491,9 @@
490
491
  record = await this.adapter.create(this.tableName, id, record, ...args);
491
492
  return this.adapter.revert(record, this.class, this.pk, id);
492
493
  }
494
+ async createSuffix(model, context) {
495
+ return super.createSuffix(model, context);
496
+ }
493
497
  async createAll(models, ...args) {
494
498
  if (!models.length)
495
499
  return models;
@@ -500,7 +504,7 @@
500
504
  return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, ids[i]));
501
505
  }
502
506
  async createAllPrefix(models, ...args) {
503
- const contextArgs = await Context.args(dbDecorators.OperationKeys.CREATE, this.class, args, this.adapter);
507
+ const contextArgs = await dbDecorators.Context.args(dbDecorators.OperationKeys.CREATE, this.class, args, this.adapter, this._overrides || {});
504
508
  if (!models.length)
505
509
  return [models, ...contextArgs.args];
506
510
  const opts = Repository.getSequenceOptions(models[0]);
@@ -517,7 +521,7 @@
517
521
  return m;
518
522
  }));
519
523
  const errors = models
520
- .map((m) => m.hasErrors())
524
+ .map((m) => m.hasErrors(...(contextArgs.context.get("ignoredValidationProperties") || [])))
521
525
  .reduce((accum, e, i) => {
522
526
  if (e)
523
527
  accum =
@@ -531,7 +535,7 @@
531
535
  return [models, ...contextArgs.args];
532
536
  }
533
537
  async readPrefix(key, ...args) {
534
- const contextArgs = await Context.args(dbDecorators.OperationKeys.READ, this.class, args, this.adapter);
538
+ const contextArgs = await dbDecorators.Context.args(dbDecorators.OperationKeys.READ, this.class, args, this.adapter, this._overrides || {});
535
539
  const model = new this.class();
536
540
  model[this.pk] = key;
537
541
  await dbDecorators.enforceDBDecorators(this, contextArgs.context, model, dbDecorators.OperationKeys.READ, dbDecorators.OperationKeys.ON);
@@ -542,7 +546,7 @@
542
546
  return this.adapter.revert(m, this.class, this.pk, id);
543
547
  }
544
548
  async readAllPrefix(keys, ...args) {
545
- const contextArgs = await Context.args(dbDecorators.OperationKeys.READ, this.class, args, this.adapter);
549
+ const contextArgs = await dbDecorators.Context.args(dbDecorators.OperationKeys.READ, this.class, args, this.adapter, this._overrides || {});
546
550
  await Promise.all(keys.map(async (k) => {
547
551
  const m = new this.class();
548
552
  m[this.pk] = k;
@@ -561,14 +565,14 @@
561
565
  return this.adapter.revert(record, this.class, this.pk, id);
562
566
  }
563
567
  async updatePrefix(model, ...args) {
564
- const contextArgs = await Context.args(dbDecorators.OperationKeys.UPDATE, this.class, args, this.adapter);
568
+ const contextArgs = await dbDecorators.Context.args(dbDecorators.OperationKeys.UPDATE, this.class, args, this.adapter, this._overrides || {});
565
569
  const pk = model[this.pk];
566
570
  if (!pk)
567
571
  throw new dbDecorators.InternalError(`No value for the Id is defined under the property ${this.pk}`);
568
572
  const oldModel = await this.read(pk, ...contextArgs.args);
569
573
  model = this.merge(oldModel, model);
570
574
  await dbDecorators.enforceDBDecorators(this, contextArgs.context, model, dbDecorators.OperationKeys.UPDATE, dbDecorators.OperationKeys.ON, oldModel);
571
- const errors = model.hasErrors(oldModel, ...Repository.relations(this.class));
575
+ const errors = model.hasErrors(oldModel, ...Repository.relations(this.class), ...(contextArgs.context.get("ignoredValidationProperties") || []));
572
576
  if (errors)
573
577
  throw new dbDecorators.ValidationError(errors.toString());
574
578
  if (Repository.getMetadata(oldModel)) {
@@ -583,7 +587,7 @@
583
587
  return updated.map((u, i) => this.adapter.revert(u, this.class, this.pk, records[i].id));
584
588
  }
585
589
  async updateAllPrefix(models, ...args) {
586
- const contextArgs = await Context.args(dbDecorators.OperationKeys.UPDATE, this.class, args, this.adapter);
590
+ const contextArgs = await dbDecorators.Context.args(dbDecorators.OperationKeys.UPDATE, this.class, args, this.adapter, this._overrides || {});
587
591
  const ids = models.map((m) => {
588
592
  const id = m[this.pk];
589
593
  if (!id)
@@ -601,7 +605,7 @@
601
605
  });
602
606
  await Promise.all(models.map((m, i) => dbDecorators.enforceDBDecorators(this, contextArgs.context, m, dbDecorators.OperationKeys.UPDATE, dbDecorators.OperationKeys.ON, oldModels[i])));
603
607
  const errors = models
604
- .map((m, i) => m.hasErrors(oldModels[i], m))
608
+ .map((m, i) => m.hasErrors(oldModels[i], m, ...(contextArgs.context.get("ignoredValidationProperties") || [])))
605
609
  .reduce((accum, e, i) => {
606
610
  if (e)
607
611
  accum =
@@ -621,7 +625,7 @@
621
625
  return [models, ...contextArgs.args];
622
626
  }
623
627
  async deletePrefix(key, ...args) {
624
- const contextArgs = await Context.args(dbDecorators.OperationKeys.DELETE, this.class, args, this.adapter);
628
+ const contextArgs = await dbDecorators.Context.args(dbDecorators.OperationKeys.DELETE, this.class, args, this.adapter, this._overrides || {});
625
629
  const model = await this.read(key, ...contextArgs.args);
626
630
  await dbDecorators.enforceDBDecorators(this, contextArgs.context, model, dbDecorators.OperationKeys.DELETE, dbDecorators.OperationKeys.ON);
627
631
  return [key, ...contextArgs.args];
@@ -631,7 +635,7 @@
631
635
  return this.adapter.revert(m, this.class, this.pk, id);
632
636
  }
633
637
  async deleteAllPrefix(keys, ...args) {
634
- const contextArgs = await Context.args(dbDecorators.OperationKeys.DELETE, this.class, args, this.adapter);
638
+ const contextArgs = await dbDecorators.Context.args(dbDecorators.OperationKeys.DELETE, this.class, args, this.adapter, this._overrides || {});
635
639
  const models = await this.readAll(keys, ...contextArgs.args);
636
640
  await Promise.all(models.map(async (m) => {
637
641
  return dbDecorators.enforceDBDecorators(this, contextArgs.context, m, dbDecorators.OperationKeys.DELETE, dbDecorators.OperationKeys.ON);
@@ -813,7 +817,17 @@
813
817
  */
814
818
  class ObserverError extends dbDecorators.BaseError {
815
819
  constructor(msg) {
816
- super(ObserverError.name, msg);
820
+ super(ObserverError.name, msg, 500);
821
+ }
822
+ }
823
+ class AuthorizationError extends dbDecorators.BaseError {
824
+ constructor(msg) {
825
+ super(AuthorizationError.name, msg, 401);
826
+ }
827
+ }
828
+ class ForbiddenError extends dbDecorators.BaseError {
829
+ constructor(msg) {
830
+ super(ForbiddenError.name, msg, 403);
817
831
  }
818
832
  }
819
833
 
@@ -873,47 +887,14 @@
873
887
  cycle: false,
874
888
  };
875
889
 
876
- /******************************************************************************
877
- Copyright (c) Microsoft Corporation.
878
-
879
- Permission to use, copy, modify, and/or distribute this software for any
880
- purpose with or without fee is hereby granted.
881
-
882
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
883
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
884
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
885
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
886
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
887
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
888
- PERFORMANCE OF THIS SOFTWARE.
889
- ***************************************************************************** */
890
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
891
-
892
-
893
- function __decorate(decorators, target, key, desc) {
894
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
895
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
896
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
897
- return c > 3 && r && Object.defineProperty(target, key, r), r;
898
- }
899
-
900
- function __metadata(metadataKey, metadataValue) {
901
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
902
- }
903
-
904
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
905
- var e = new Error(message);
906
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
907
- };
908
-
909
890
  class QueryError extends dbDecorators.BaseError {
910
891
  constructor(msg) {
911
- super(QueryError.name, msg);
892
+ super(QueryError.name, msg, 500);
912
893
  }
913
894
  }
914
895
  class PagingError extends dbDecorators.BaseError {
915
896
  constructor(msg) {
916
- super(PagingError.name, msg);
897
+ super(PagingError.name, msg, 500);
917
898
  }
918
899
  }
919
900
 
@@ -1139,17 +1120,17 @@
1139
1120
  return new Condition.Builder();
1140
1121
  }
1141
1122
  }
1142
- __decorate([
1123
+ tslib.__decorate([
1143
1124
  decoratorValidation.required(),
1144
- __metadata("design:type", Object)
1125
+ tslib.__metadata("design:type", Object)
1145
1126
  ], Condition.prototype, "attr1", void 0);
1146
- __decorate([
1127
+ tslib.__decorate([
1147
1128
  decoratorValidation.required(),
1148
- __metadata("design:type", String)
1129
+ tslib.__metadata("design:type", String)
1149
1130
  ], Condition.prototype, "operator", void 0);
1150
- __decorate([
1131
+ tslib.__decorate([
1151
1132
  decoratorValidation.required(),
1152
- __metadata("design:type", Object)
1133
+ tslib.__metadata("design:type", Object)
1153
1134
  ], Condition.prototype, "comparison", void 0);
1154
1135
 
1155
1136
  async function createOrUpdate(model, context, repository) {
@@ -1254,7 +1235,12 @@
1254
1235
  const { cascade } = data;
1255
1236
  if (cascade.update !== exports.Cascade.CASCADE)
1256
1237
  return;
1257
- return oneToManyOnCreate.call(this, context, data, key, model);
1238
+ return oneToManyOnCreate.apply(this, [
1239
+ context,
1240
+ data,
1241
+ key,
1242
+ model,
1243
+ ]);
1258
1244
  }
1259
1245
  async function oneToManyOnDelete(context, data, key, model) {
1260
1246
  if (data.cascade.delete !== exports.Cascade.CASCADE)
@@ -1286,7 +1272,7 @@
1286
1272
  }
1287
1273
  async function cacheModelForPopulate(context, parentModel, propertyKey, pkValue, cacheValue) {
1288
1274
  const cacheKey = getPopulateKey(parentModel.constructor.name, propertyKey, pkValue);
1289
- return context.put(cacheKey, cacheValue);
1275
+ return context.accumulate({ [cacheKey]: cacheValue });
1290
1276
  }
1291
1277
  async function populate(context, data, key, model) {
1292
1278
  if (!data.populate)
@@ -1351,6 +1337,17 @@
1351
1337
  return Repository.forModel(constructor);
1352
1338
  }
1353
1339
 
1340
+ class ConnectionError extends dbDecorators.BaseError {
1341
+ constructor(msg) {
1342
+ super(ConnectionError.name, msg);
1343
+ }
1344
+ }
1345
+ class UnsupportedError extends dbDecorators.BaseError {
1346
+ constructor(msg) {
1347
+ super(UnsupportedError.name, msg);
1348
+ }
1349
+ }
1350
+
1354
1351
  function table(tableName) {
1355
1352
  return reflection.metadata(Adapter.key(exports.PersistenceKeys.TABLE), tableName);
1356
1353
  }
@@ -1394,17 +1391,28 @@
1394
1391
  function unique() {
1395
1392
  return reflection.apply(dbDecorators.onCreateUpdate(uniqueOnCreateUpdate), decoratorValidation.propMetadata(Repository.key(exports.PersistenceKeys.UNIQUE), {}));
1396
1393
  }
1397
- async function createdByOnCreateUpdate(context, data, key, model) {
1398
- const user = context.user;
1399
- if (!user)
1400
- throw new UnsupportedError("This adapter does not support user identification");
1401
- model[key] = user.id;
1394
+ async function createdByOnCreateUpdate(
1395
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1396
+ context,
1397
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1398
+ data,
1399
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1400
+ key,
1401
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1402
+ model) {
1403
+ throw new UnsupportedError("This adapter does not support user identification");
1402
1404
  }
1403
1405
  function createdBy() {
1404
- return reflection.apply(dbDecorators.onCreate(createdByOnCreateUpdate), decoratorValidation.propMetadata(Repository.key(exports.PersistenceKeys.CREATED_BY), {}));
1406
+ const key = Repository.key(exports.PersistenceKeys.CREATED_BY);
1407
+ return decoratorValidation.Decoration.for(key)
1408
+ .define(dbDecorators.onCreate(createdByOnCreateUpdate), decoratorValidation.propMetadata(key, {}))
1409
+ .apply();
1405
1410
  }
1406
1411
  function updatedBy() {
1407
- return reflection.apply(dbDecorators.onCreateUpdate(createdByOnCreateUpdate), decoratorValidation.propMetadata(Repository.key(exports.PersistenceKeys.CREATED_BY), {}));
1412
+ const key = Repository.key(exports.PersistenceKeys.UPDATED_BY);
1413
+ return decoratorValidation.Decoration.for(key)
1414
+ .define(dbDecorators.onCreateUpdate(createdByOnCreateUpdate), decoratorValidation.propMetadata(key, {}))
1415
+ .apply();
1408
1416
  }
1409
1417
  /**
1410
1418
  * @summary One To One relation Decorators
@@ -1427,7 +1435,10 @@
1427
1435
  cascade: cascadeOptions,
1428
1436
  populate: populate$1,
1429
1437
  };
1430
- return reflection.apply(decoratorValidation.prop(exports.PersistenceKeys.RELATIONS), decoratorValidation.type([clazz.name, String.name, Number.name, BigInt.name]), dbDecorators.onCreate(oneToOneOnCreate, metadata), dbDecorators.onUpdate(oneToOneOnUpdate, metadata), dbDecorators.onDelete(oneToOneOnDelete, metadata), dbDecorators.afterAny(populate, metadata), decoratorValidation.propMetadata(Repository.key(exports.PersistenceKeys.ONE_TO_ONE), metadata));
1438
+ const key = Repository.key(exports.PersistenceKeys.ONE_TO_ONE);
1439
+ return decoratorValidation.Decoration.for(key)
1440
+ .define(decoratorValidation.prop(exports.PersistenceKeys.RELATIONS), decoratorValidation.type([clazz.name, String.name, Number.name, BigInt.name]), dbDecorators.onCreate(oneToOneOnCreate, metadata), dbDecorators.onUpdate(oneToOneOnUpdate, metadata), dbDecorators.onDelete(oneToOneOnDelete, metadata), dbDecorators.afterAny(populate, metadata), decoratorValidation.propMetadata(key, metadata))
1441
+ .apply();
1431
1442
  }
1432
1443
  /**
1433
1444
  * @summary One To Many relation Decorators
@@ -1449,9 +1460,12 @@
1449
1460
  cascade: cascadeOptions,
1450
1461
  populate: populate$1,
1451
1462
  };
1452
- return reflection.apply(decoratorValidation.prop(exports.PersistenceKeys.RELATIONS),
1463
+ const key = Repository.key(exports.PersistenceKeys.ONE_TO_MANY);
1464
+ return decoratorValidation.Decoration.for(key)
1465
+ .define(decoratorValidation.prop(exports.PersistenceKeys.RELATIONS),
1453
1466
  // @ts-expect-error purposeful override
1454
- decoratorValidation.list([clazz, String, Number, BigInt]), dbDecorators.onCreate(oneToManyOnCreate, metadata), dbDecorators.onUpdate(oneToManyOnUpdate, metadata), dbDecorators.onDelete(oneToManyOnDelete, metadata), dbDecorators.afterAny(populate, metadata), decoratorValidation.propMetadata(Repository.key(exports.PersistenceKeys.ONE_TO_MANY), metadata));
1467
+ decoratorValidation.list([clazz, String, Number, BigInt]), dbDecorators.onCreate(oneToManyOnCreate, metadata), dbDecorators.onUpdate(oneToManyOnUpdate, metadata), dbDecorators.onDelete(oneToManyOnDelete, metadata), dbDecorators.afterAny(populate, metadata), decoratorValidation.propMetadata(key, metadata))
1468
+ .apply();
1455
1469
  }
1456
1470
  /**
1457
1471
  * @summary Many To One relation Decorators
@@ -1473,12 +1487,15 @@
1473
1487
  cascade: cascadeOptions,
1474
1488
  populate: populate,
1475
1489
  };
1476
- return reflection.apply(decoratorValidation.prop(exports.PersistenceKeys.RELATIONS), decoratorValidation.type([clazz.name, String.name, Number.name, BigInt.name]),
1490
+ const key = Repository.key(exports.PersistenceKeys.MANY_TO_ONE);
1491
+ return decoratorValidation.Decoration.for(key)
1492
+ .define(decoratorValidation.prop(exports.PersistenceKeys.RELATIONS), decoratorValidation.type([clazz.name, String.name, Number.name, BigInt.name]),
1477
1493
  // onCreate(oneToManyOnCreate, metadata),
1478
1494
  // onUpdate(oneToManyOnUpdate, metadata),
1479
1495
  // onDelete(oneToManyOnDelete, metadata),
1480
1496
  // afterAll(populate, metadata),
1481
- decoratorValidation.propMetadata(Repository.key(exports.PersistenceKeys.MANY_TO_ONE), metadata));
1497
+ decoratorValidation.propMetadata(key, metadata))
1498
+ .apply();
1482
1499
  }
1483
1500
 
1484
1501
  /**
@@ -1525,9 +1542,12 @@
1525
1542
  }
1526
1543
  function pk(opts = DefaultSequenceOptions) {
1527
1544
  opts = Object.assign({}, DefaultSequenceOptions, opts);
1528
- return reflection.apply(index([exports.OrderDirection.ASC, exports.OrderDirection.DSC]), decoratorValidation.required(), dbDecorators.readonly(),
1545
+ const key = Repository.key(dbDecorators.DBKeys.ID);
1546
+ return decoratorValidation.Decoration.for(key)
1547
+ .define(index([exports.OrderDirection.ASC, exports.OrderDirection.DSC]), decoratorValidation.required(), dbDecorators.readonly(),
1529
1548
  // type([String.name, Number.name, BigInt.name]),
1530
- decoratorValidation.propMetadata(Repository.key(dbDecorators.DBKeys.ID), opts), dbDecorators.onCreate(pkOnCreate, opts));
1549
+ decoratorValidation.propMetadata(key, opts), dbDecorators.onCreate(pkOnCreate, opts))
1550
+ .apply();
1531
1551
  }
1532
1552
 
1533
1553
  class BaseModel extends decoratorValidation.Model {
@@ -1535,37 +1555,15 @@
1535
1555
  super(arg);
1536
1556
  }
1537
1557
  }
1538
- __decorate([
1558
+ tslib.__decorate([
1539
1559
  dbDecorators.timestamp(dbDecorators.DBOperations.CREATE),
1540
- __metadata("design:type", Date)
1560
+ tslib.__metadata("design:type", Date)
1541
1561
  ], BaseModel.prototype, "createdOn", void 0);
1542
- __decorate([
1562
+ tslib.__decorate([
1543
1563
  dbDecorators.timestamp(),
1544
- __metadata("design:type", Date)
1564
+ tslib.__metadata("design:type", Date)
1545
1565
  ], BaseModel.prototype, "updatedOn", void 0);
1546
1566
 
1547
- exports.User = class User extends decoratorValidation.Model {
1548
- constructor(arg) {
1549
- super(arg);
1550
- }
1551
- };
1552
- __decorate([
1553
- pk(),
1554
- __metadata("design:type", String)
1555
- ], exports.User.prototype, "id", void 0);
1556
- __decorate([
1557
- decoratorValidation.list([String]),
1558
- __metadata("design:type", Array)
1559
- ], exports.User.prototype, "roles", void 0);
1560
- __decorate([
1561
- decoratorValidation.list([String]),
1562
- __metadata("design:type", Array)
1563
- ], exports.User.prototype, "affiliations", void 0);
1564
- exports.User = __decorate([
1565
- decoratorValidation.model(),
1566
- __metadata("design:paramtypes", [Object])
1567
- ], exports.User);
1568
-
1569
1567
  Object.defineProperty(decoratorValidation.DEFAULT_ERROR_MESSAGES, exports.PersistenceKeys.CLAUSE_SEQUENCE, {
1570
1568
  value: "Invalid clause sequence: {0}",
1571
1569
  });
@@ -1662,9 +1660,9 @@
1662
1660
  }
1663
1661
  }
1664
1662
  };
1665
- exports.ClauseSequenceValidator = __decorate([
1663
+ exports.ClauseSequenceValidator = tslib.__decorate([
1666
1664
  decoratorValidation.validator(exports.PersistenceKeys.CLAUSE_SEQUENCE),
1667
- __metadata("design:paramtypes", [String])
1665
+ tslib.__metadata("design:paramtypes", [String])
1668
1666
  ], exports.ClauseSequenceValidator);
1669
1667
 
1670
1668
  /**
@@ -1794,24 +1792,24 @@
1794
1792
  this.type = type;
1795
1793
  }
1796
1794
  }
1797
- __decorate([
1795
+ tslib.__decorate([
1798
1796
  decoratorValidation.required(),
1799
1797
  decoratorValidation.minlength(MandatoryPriorities.length),
1800
1798
  clauseSequence(),
1801
- __metadata("design:type", Array)
1799
+ tslib.__metadata("design:type", Array)
1802
1800
  ], Statement.prototype, "clauses", void 0);
1803
- __decorate([
1801
+ tslib.__decorate([
1804
1802
  decoratorValidation.required(),
1805
1803
  decoratorValidation.type(["object"]),
1806
- __metadata("design:type", Adapter)
1804
+ tslib.__metadata("design:type", Adapter)
1807
1805
  ], Statement.prototype, "adapter", void 0);
1808
- __decorate([
1806
+ tslib.__decorate([
1809
1807
  decoratorValidation.required(),
1810
- __metadata("design:type", Object)
1808
+ tslib.__metadata("design:type", Object)
1811
1809
  ], Statement.prototype, "target", void 0);
1812
- __decorate([
1810
+ tslib.__decorate([
1813
1811
  decoratorValidation.required(),
1814
- __metadata("design:type", String)
1812
+ tslib.__metadata("design:type", String)
1815
1813
  ], Statement.prototype, "type", void 0);
1816
1814
 
1817
1815
  /**
@@ -1873,14 +1871,14 @@
1873
1871
  return this.constructor.name;
1874
1872
  }
1875
1873
  }
1876
- __decorate([
1874
+ tslib.__decorate([
1877
1875
  decoratorValidation.required(),
1878
- __metadata("design:type", Number)
1876
+ tslib.__metadata("design:type", Number)
1879
1877
  ], Clause.prototype, "priority", void 0);
1880
- __decorate([
1878
+ tslib.__decorate([
1881
1879
  decoratorValidation.required(),
1882
1880
  decoratorValidation.type("object"),
1883
- __metadata("design:type", Statement)
1881
+ tslib.__metadata("design:type", Statement)
1884
1882
  ], Clause.prototype, "statement", void 0);
1885
1883
 
1886
1884
  /**
@@ -1911,9 +1909,9 @@
1911
1909
  return this.constructor.name + `[${this.selector}]`;
1912
1910
  }
1913
1911
  }
1914
- __decorate([
1912
+ tslib.__decorate([
1915
1913
  decoratorValidation.required(),
1916
- __metadata("design:type", Object)
1914
+ tslib.__metadata("design:type", Object)
1917
1915
  ], SelectorBasedClause.prototype, "selector", void 0);
1918
1916
 
1919
1917
  /**
@@ -2026,9 +2024,9 @@
2026
2024
  return this.Clauses.where(this.statement, condition);
2027
2025
  }
2028
2026
  }
2029
- __decorate([
2027
+ tslib.__decorate([
2030
2028
  decoratorValidation.required(),
2031
- __metadata("design:type", String)
2029
+ tslib.__metadata("design:type", String)
2032
2030
  ], InsertClause.prototype, "table", void 0);
2033
2031
 
2034
2032
  /**
@@ -2188,10 +2186,10 @@
2188
2186
  this.models = clause?.models;
2189
2187
  }
2190
2188
  }
2191
- __decorate([
2189
+ tslib.__decorate([
2192
2190
  decoratorValidation.required(),
2193
2191
  decoratorValidation.type(Array.name),
2194
- __metadata("design:type", Array)
2192
+ tslib.__metadata("design:type", Array)
2195
2193
  ], ValuesClause.prototype, "models", void 0);
2196
2194
 
2197
2195
  /**
@@ -2246,10 +2244,10 @@
2246
2244
  return this.condition.hasErrors();
2247
2245
  }
2248
2246
  }
2249
- __decorate([
2247
+ tslib.__decorate([
2250
2248
  decoratorValidation.required(),
2251
2249
  decoratorValidation.type("Condition"),
2252
- __metadata("design:type", Condition)
2250
+ tslib.__metadata("design:type", Condition)
2253
2251
  ], WhereClause.prototype, "condition", void 0);
2254
2252
 
2255
2253
  class ClauseFactory {
@@ -2290,8 +2288,9 @@
2290
2288
  validatePage(page) {
2291
2289
  if (page < 1 || !Number.isInteger(page))
2292
2290
  throw new PagingError("page number cannot be under 1 and must be an integer");
2293
- if (page > this._totalPages)
2294
- throw new PagingError("page number cannot be under 1 and must be an integer");
2291
+ if (typeof this._totalPages !== "undefined" && page > this._totalPages)
2292
+ throw new PagingError(`Requested more pages than available. Total pages: ${this._totalPages}`);
2293
+ return page;
2295
2294
  }
2296
2295
  }
2297
2296
 
@@ -2302,18 +2301,19 @@
2302
2301
  * @const VERSION
2303
2302
  * @memberOf module:ts-workspace
2304
2303
  */
2305
- const VERSION = "0.4.1";
2304
+ const VERSION = "0.5.0";
2306
2305
 
2307
2306
  exports.Adapter = Adapter;
2307
+ exports.AuthorizationError = AuthorizationError;
2308
2308
  exports.BaseModel = BaseModel;
2309
2309
  exports.BigIntSequence = BigIntSequence;
2310
2310
  exports.Clause = Clause;
2311
2311
  exports.ClauseFactory = ClauseFactory;
2312
2312
  exports.Condition = Condition;
2313
2313
  exports.ConnectionError = ConnectionError;
2314
- exports.Context = Context;
2315
2314
  exports.DefaultCascade = DefaultCascade;
2316
2315
  exports.DefaultSequenceOptions = DefaultSequenceOptions;
2316
+ exports.ForbiddenError = ForbiddenError;
2317
2317
  exports.FromClause = FromClause;
2318
2318
  exports.GroupByClause = GroupByClause;
2319
2319
  exports.InjectablesRegistry = InjectablesRegistry;
@@ -2337,19 +2337,30 @@
2337
2337
  exports.VERSION = VERSION;
2338
2338
  exports.ValuesClause = ValuesClause;
2339
2339
  exports.WhereClause = WhereClause;
2340
+ exports.cacheModelForPopulate = cacheModelForPopulate;
2340
2341
  exports.clauseSequence = clauseSequence;
2341
2342
  exports.column = column;
2343
+ exports.createOrUpdate = createOrUpdate;
2342
2344
  exports.createdBy = createdBy;
2343
2345
  exports.createdByOnCreateUpdate = createdByOnCreateUpdate;
2344
2346
  exports.generateInjectableNameForRepository = generateInjectableNameForRepository;
2347
+ exports.getPopulateKey = getPopulateKey;
2345
2348
  exports.getTableName = getTableName;
2346
2349
  exports.index = index;
2347
2350
  exports.manyToOne = manyToOne;
2348
2351
  exports.oneToMany = oneToMany;
2352
+ exports.oneToManyOnCreate = oneToManyOnCreate;
2353
+ exports.oneToManyOnDelete = oneToManyOnDelete;
2354
+ exports.oneToManyOnUpdate = oneToManyOnUpdate;
2349
2355
  exports.oneToOne = oneToOne;
2356
+ exports.oneToOneOnCreate = oneToOneOnCreate;
2357
+ exports.oneToOneOnDelete = oneToOneOnDelete;
2358
+ exports.oneToOneOnUpdate = oneToOneOnUpdate;
2350
2359
  exports.pk = pk;
2351
2360
  exports.pkOnCreate = pkOnCreate;
2361
+ exports.populate = populate;
2352
2362
  exports.repository = repository;
2363
+ exports.repositoryFromTypeMetadata = repositoryFromTypeMetadata;
2353
2364
  exports.sequenceNameForModel = sequenceNameForModel;
2354
2365
  exports.table = table;
2355
2366
  exports.unique = unique;
@@ -2358,4 +2369,4 @@
2358
2369
  exports.uses = uses;
2359
2370
 
2360
2371
  }));
2361
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXBvc2l0b3J5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L0NvbnRleHQudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3F1ZXJ5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9xdWVyeS9RdWVyeS50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9lcnJvcnMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvQWRhcHRlci50cyIsIi4uL3NyYy9pZGVudGl0eS91dGlscy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9TZXF1ZW5jZS50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvUmVwb3NpdG9yeS50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9lcnJvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS91dGlscy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L2luamVjdGFibGVzLnRzIiwiLi4vc3JjL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zLnRzIiwiLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIi4uL3NyYy9xdWVyeS9lcnJvcnMudHMiLCIuLi9zcmMvcXVlcnkvQ29uZGl0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2lkZW50aXR5L2RlY29yYXRvcnMudHMiLCIuLi9zcmMvbW9kZWwvQmFzZU1vZGVsLnRzIiwiLi4vc3JjL21vZGVsL1VzZXIudHMiLCIuLi9zcmMvdmFsaWRhdG9ycy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3ZhbGlkYXRvcnMvQ2xhdXNlU2VxdWVuY2VWYWxpZGF0b3IudHMiLCIuLi9zcmMvcXVlcnkvU3RhdGVtZW50LnRzIiwiLi4vc3JjL3F1ZXJ5L0NsYXVzZS50cyIsIi4uL3NyYy9xdWVyeS9jbGF1c2VzL1NlbGVjdG9yQmFzZWRDbGF1c2UudHMiLCIuLi9zcmMvcXVlcnkvY2xhdXNlcy9Gcm9tQ2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L2NsYXVzZXMvR3JvdXBCeUNsYXVzZS50cyIsIi4uL3NyYy9xdWVyeS9jbGF1c2VzL0luc2VydENsYXVzZS50cyIsIi4uL3NyYy9xdWVyeS9jbGF1c2VzL0xpbWl0Q2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L2NsYXVzZXMvT2Zmc2V0Q2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L2NsYXVzZXMvT3JkZXJCeUNsYXVzZS50cyIsIi4uL3NyYy9xdWVyeS9jbGF1c2VzL1NlbGVjdENsYXVzZS50cyIsIi4uL3NyYy9xdWVyeS9jbGF1c2VzL1ZhbHVlc0NsYXVzZS50cyIsIi4uL3NyYy9xdWVyeS9jbGF1c2VzL1doZXJlQ2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L0NsYXVzZUZhY3RvcnkudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhc2NhZGVNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgZGVmaW5lcyBvcmRlciBkaXJlY3Rpb25zIHdoZW4gc29ydGluZ1xuICpcbiAqIEBjb25zdGFudCBPcmRlckRpcmVjdGlvblxuICpcbiAqIEBjYXRlZ29yeSBRdWVyeVxuICovXG5leHBvcnQgZW51bSBPcmRlckRpcmVjdGlvbiB7XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzb3J0IG9yZGVyIGFzIGFzY2VuZGluZ1xuICAgKiBAcHJvcCBBU0NcbiAgICovXG4gIEFTQyA9IFwiYXNjXCIsXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzb3J0IG9yZGVyIGFzIGRlc2NlbmRpbmdcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IERTQ1xuICAgKi9cbiAgRFNDID0gXCJkZXNjXCIsXG59XG5cbmV4cG9ydCBlbnVtIENhc2NhZGUge1xuICBDQVNDQURFID0gXCJjYXNjYWRlXCIsXG4gIE5PTkUgPSBcIm5vbmVcIixcbn1cblxuZXhwb3J0IGNvbnN0IERlZmF1bHRDYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbn07XG4iLCJpbXBvcnQgeyBDb250ZXh0IGFzIEN0eCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCIuLi9tb2RlbFwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29udGV4dDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBVIGV4dGVuZHMgVXNlciA9IFVzZXIsXG4+IGV4dGVuZHMgQ3R4PE0+IHtcbiAgcHJvdGVjdGVkIF90aW1lc3RhbXAhOiBEYXRlO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw/OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBwYXJlbnQ/OiBDb250ZXh0PGFueSwgYW55PlxuICApIHtcbiAgICBzdXBlcihvcGVyYXRpb24sIG1vZGVsLCBwYXJlbnQpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICBpZiAoIXRoaXMuX3RpbWVzdGFtcCkgdGhpcy5fdGltZXN0YW1wID0gbmV3IERhdGUoKTtcbiAgICByZXR1cm4gdGhpcy5fdGltZXN0YW1wO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IHVzZXIoKTogVSB8IHVuZGVmaW5lZDtcbn1cbiIsImV4cG9ydCBlbnVtIFBlcnNpc3RlbmNlS2V5cyB7XG4gIElOREVYID0gXCJpbmRleFwiLFxuICBVTklRVUUgPSBcInVuaXF1ZVwiLFxuICBBREFQVEVSID0gXCJhZGFwdGVyXCIsXG4gIElOSkVDVEFCTEUgPSBcImRlY2FmX3swfV9hZGFwdGVyX2Zvcl97MX1cIixcbiAgVEFCTEUgPSBcInRhYmxlXCIsXG4gIENPTFVNTiA9IFwiY29sdW1uXCIsXG4gIE1FVEFEQVRBID0gXCJfX21ldGFkYXRhXCIsXG4gIFJFTEFUSU9OUyA9IFwiX19yZWxhdGlvbnNcIixcbiAgQ0xBVVNFX1NFUVVFTkNFID0gXCJjbGF1c2Utc2VxdWVuY2VcIixcbiAgLy8gT3duZXJzaGlwXG4gIENSRUFURURfQlkgPSBcIm93bmVyc2hpcC5jcmVhdGVkLWJ5XCIsXG4gIFVQREFURURfQlkgPSBcIm93bmVyc2hpcC51cGRhdGVkLWJ5XCIsXG4gIC8vIFJlbGF0aW9uc1xuICBPTkVfVE9fT05FID0gXCJyZWxhdGlvbnMub25lLXRvLW9uZVwiLFxuICBPTkVfVE9fTUFOWSA9IFwicmVsYXRpb25zLm9uZS10by1tYW55XCIsXG4gIE1BTllfVE9fT05FID0gXCJyZWxhdGlvbnMubWFueS10by1vbmVcIixcbiAgUE9QVUxBVEUgPSBcInBvcHVsYXRlXCIsXG59XG5cbmV4cG9ydCBlbnVtIFJvbGVzIHtcbiAgQURNSU4gPSBcImFkbWluXCIsXG4gIFdSSVRFUiA9IFwid3JpdGVyXCIsXG4gIFJFQURFUiA9IFwicmVhZGVyXCIsXG59XG4iLCJleHBvcnQgZW51bSBPcGVyYXRvciB7XG4gIEVRVUFMID0gXCJFUVVBTFwiLFxuICBESUZGRVJFTlQgPSBcIkRJRkZFUkVOVFwiLFxuICBCSUdHRVIgPSBcIkJJR0dFUlwiLFxuICBCSUdHRVJfRVEgPSBcIkJJR0dFUl9FUVwiLFxuICBTTUFMTEVSID0gXCJTTUFMTEVSXCIsXG4gIFNNQUxMRVJfRVEgPSBcIlNNQUxMRVJfRVFcIixcbiAgLy8gQkVUV0VFTiA9IFwiQkVUV0VFTlwiLFxuICBOT1QgPSBcIk5PVFwiLFxuICBJTiA9IFwiSU5cIixcbiAgLy8gSVMgPSBcIklTXCIsXG4gIFJFR0VYUCA9IFwiUkVHRVhQXCIsXG59XG5cbmV4cG9ydCBlbnVtIEdyb3VwT3BlcmF0b3Ige1xuICBBTkQgPSBcIkFORFwiLFxuICBPUiA9IFwiT1JcIixcbn1cblxuZXhwb3J0IGVudW0gQ29uc3Qge1xuICBOVUxMID0gXCJOVUxMXCIsXG4gIEZVTExfUkVDT1JEID0gXCIqXCIsXG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBleGVjdXRpb24gb3JkZXIgb2YgQ2xhdXNlcyBpbiBzdGF0ZW1lbnRzIGFzIGRlZmluZWQgaW4gU1FMLlxuICpcbiAqIEBkZXNjcmlwdGlvbiBzdWIgcHJpb3JpdGllcyB3aGVyZSBkZWZpbmVkIHRvIGJldHRlciBvcmdhbml6ZSBjbGF1c2VzIHdpdGhpbiBzdGF0ZW1lbnRzLCBlZyBGcm9tIGFuZCBKb2luIENsYXVzZXNcbiAqXG4gKiBAY29uc3QgUHJpb3JpdHlcbiAqXG4gKiBAY2F0ZWdvcnkgQ2xhdXNlc1xuICogQHN1YmNhdGVnb3J5IENvbnN0YW50c1xuICovXG5leHBvcnQgZW51bSBQcmlvcml0eSB7XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBwcmlvcml0eSBmb3IgdGhlIEZST00gQ2xhdXNlXG4gICAqIEBkZXNjcmlwdGlvbiBGcm9tIENsYXVzZSBpbiBTRUxFQ1QgU3RhdGVtZW50cy5cbiAgICogVmFsdWVzIENsYXVzZSBpbiBJTlNFUlQgU3RhdGVtZW50c1xuICAgKlxuICAgKiBAcHJvcCBGUk9NXG4gICAqL1xuICBGUk9NID0gMSxcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByaW9yaXR5IGZvciB0aGUgSk9JTiBDbGF1c2VcbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IEpPSU5cbiAgICovXG4gIEpPSU4gPSAxLjEsXG4gIC8qKlxuICAgKiBXaGVyZSBDbGF1c2VcbiAgICovXG4gIFdIRVJFID0gMixcbiAgLyoqXG4gICAqIEdyb3VwIEJ5IENsYXVzZVxuICAgKi9cbiAgR1JPVVBfQlkgPSAzLFxuICAvKipcbiAgICogSGF2aW5nIENsYXVzZVxuICAgKi9cbiAgSEFWSU5HID0gNCxcbiAgLyoqXG4gICAqIFNlbGVjdCBDbGF1c2UgaW4gU0VMRUNUIFN0YXRlbWVudHNcbiAgICogSW5zZXJ0IENsYXVzZSBpbiBJTlNFUlQgU3RhdGVtZW50c1xuICAgKi9cbiAgU0VMRUNUID0gNSxcbiAgLyoqXG4gICAqIE9yZGVyIEJ5IENsYXVzZVxuICAgKi9cbiAgT1JERVJfQlkgPSA2LFxuICAvKipcbiAgICogTGltaXQgQ2xhdXNlXG4gICAqL1xuICBMSU1JVCA9IDcsXG4gIC8qKlxuICAgKiBPZmZzZXQgQ2xhdXNlXG4gICAqL1xuICBPRkZTRVQgPSA3LjEsXG59XG5cbmV4cG9ydCBjb25zdCBNYW5kYXRvcnlQcmlvcml0aWVzID0gW1ByaW9yaXR5LkZST00sIFByaW9yaXR5LlNFTEVDVF07XG5cbmV4cG9ydCBlbnVtIFN0YXRlbWVudFR5cGUge1xuICBRVUVSWSA9IFwicXVlcnlcIixcbiAgVFJBTlNBQ1RJT04gPSBcInRyYW5zYWN0aW9uXCIsXG59XG4iLCJpbXBvcnQge1xuICBDb3VudE9wdGlvbixcbiAgRGlzdGluY3RPcHRpb24sXG4gIEluc2VydE9wdGlvbixcbiAgTWF4T3B0aW9uLFxuICBNaW5PcHRpb24sXG4gIFNlbGVjdE9wdGlvbixcbn0gZnJvbSBcIi4vb3B0aW9uc1wiO1xuaW1wb3J0IHsgU2VsZWN0U2VsZWN0b3IgfSBmcm9tIFwiLi9zZWxlY3RvcnNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IENvbnN0IH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIZWxwZXIgQ2xhc3MgdG8gYnVpbGQgcXVlcmllc1xuICpcbiAqIEBwYXJhbSB7RGF0YWJhc2V9IGRiXG4gKlxuICogQGNsYXNzIFF1ZXJ5XG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVyeTxRLCBNIGV4dGVuZHMgTW9kZWw+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhZGFwdGVyOiBBZGFwdGVyPGFueSwgUT4pIHt9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBTZWxlY3QgQ2xhdXNlXG4gICAqIEBwYXJhbSB7U2VsZWN0U2VsZWN0b3J9IFtzZWxlY3Rvcl1cbiAgICovXG4gIHNlbGVjdChzZWxlY3RvcjogU2VsZWN0U2VsZWN0b3IgPSBDb25zdC5GVUxMX1JFQ09SRCk6IFNlbGVjdE9wdGlvbjxNPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5DbGF1c2VzLnNlbGVjdDxNPihzZWxlY3Rvcik7XG4gIH1cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBNaW4gQ2xhdXNlXG4gICAqIEBwYXJhbSB7U2VsZWN0U2VsZWN0b3J9IHNlbGVjdG9yXG4gICAqL1xuICBtaW4oc2VsZWN0b3I6IFNlbGVjdFNlbGVjdG9yKTogTWluT3B0aW9uPE0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoKS5taW4oc2VsZWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgTWF4IENsYXVzZVxuICAgKiBAcGFyYW0ge1NlbGVjdFNlbGVjdG9yfSBzZWxlY3RvclxuICAgKi9cbiAgbWF4KHNlbGVjdG9yOiBTZWxlY3RTZWxlY3Rvcik6IE1heE9wdGlvbjxNPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0KCkubWF4KHNlbGVjdG9yKTtcbiAgfVxuICAvKipcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIERpc3RpbmN0IENsYXVzZVxuICAgKiBAcGFyYW0ge1NlbGVjdFNlbGVjdG9yfSBzZWxlY3RvclxuICAgKi9cbiAgZGlzdGluY3Qoc2VsZWN0b3I6IFNlbGVjdFNlbGVjdG9yKTogRGlzdGluY3RPcHRpb248TT4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdCgpLmRpc3RpbmN0KHNlbGVjdG9yKTtcbiAgfVxuICAvKipcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIENvdW50IENsYXVzZVxuICAgKiBAcGFyYW0ge1NlbGVjdFNlbGVjdG9yfSBzZWxlY3RvclxuICAgKi9cbiAgY291bnQoc2VsZWN0b3I/OiBTZWxlY3RTZWxlY3Rvcik6IENvdW50T3B0aW9uPE0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoKS5jb3VudChzZWxlY3Rvcik7XG4gIH1cblxuICBpbnNlcnQoKTogSW5zZXJ0T3B0aW9uPE0+IHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLkNsYXVzZXMuaW5zZXJ0PE0+KCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKENvbm5lY3Rpb25FcnJvci5uYW1lLCBtc2cpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKFVuc3VwcG9ydGVkRXJyb3IubmFtZSwgbXNnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBEQktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIENvbnRleHQsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZlclwiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxuICBNb2RlbFJlZ2lzdHJ5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7IFJhd0V4ZWN1dG9yIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUmF3RXhlY3V0b3JcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIi4uL3F1ZXJ5L1F1ZXJ5XCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vcXVlcnkvU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBDbGF1c2VGYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXJ5L0NsYXVzZUZhY3RvcnlcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcIi4uL21vZGVsL1VzZXJcIjtcbmltcG9ydCB7IENvbnRleHQgYXMgQ3R4IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvQ29udGV4dFwiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEFic3RyYWN0IERlY2FmLXRzIFBlcnNpc3RlbmNlIEFkYXB0ZXIgQ2xhc3NcbiAqIEBkZXNjcmlwdGlvbiBPZmZlcnMgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBBZGFwdGVyIENsYXNzZXNcbiAqIGFuZCBtYW5hZ2VzIHRoZW0gdmFyaW91cyByZWdpc3RlcmVkIHtAbGluayBBZGFwdGVyfXNcbiAqXG4gKiBAdHlwZWRlZiBZIHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIG9iamVjdCB0eXBlXG4gKiBAdHlwZWRlZiBRIFRoZSBxdWVyeSBvYmplY3QgdGhlIGFkYXB0ZXIgdXNlc1xuICpcbiAqIEBwYXJhbSB7WX0gbmF0aXZlIHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgdGhlIHVuZGVyIHdpdGNoIHRoZSBwZXJzaXN0ZW5jZSBhZGFwdGVyIHNob3VsZCBiZSBzdG9yZWRcbiAqXG4gKiBAY2xhc3MgQWRhcHRlclxuICogQGltcGxlbWVudHMgUmF3RXhlY3V0b3JcbiAqIEBpbXBsZW1lbnRzIE9ic2VydmFibGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFkYXB0ZXI8WSwgUT4gaW1wbGVtZW50cyBSYXdFeGVjdXRvcjxRPiwgT2JzZXJ2YWJsZSB7XG4gIHByaXZhdGUgc3RhdGljIF9jdXJyZW50OiBBZGFwdGVyPGFueSwgYW55PjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBSZWNvcmQ8c3RyaW5nLCBBZGFwdGVyPGFueSwgYW55Pj4gPSB7fTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX29ic2VydmVyczogT2JzZXJ2ZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9uYXRpdmU6IFk7XG5cbiAgZ2V0IG5hdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmF0aXZlO1xuICB9XG5cbiAgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TSwgUSwgQWRhcHRlcjxZLCBRPj4+IHtcbiAgICByZXR1cm4gUmVwb3NpdG9yeTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBuYXRpdmU6IFksXG4gICAgcmVhZG9ubHkgZmxhdm91cjogc3RyaW5nXG4gICkge1xuICAgIGlmICh0aGlzLmZsYXZvdXIgaW4gQWRhcHRlci5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFBlcnNpc3RlbmNlIGFkYXB0ZXIgZmxhdm91ciAke3RoaXMuZmxhdm91cn0gYWxyZWFkeSByZWdpc3RlcmVkYFxuICAgICAgKTtcbiAgICB0aGlzLl9uYXRpdmUgPSBuYXRpdmU7XG4gICAgQWRhcHRlci5fY2FjaGVbdGhpcy5mbGF2b3VyXSA9IHRoaXM7XG4gIH1cblxuICBRdWVyeTxNIGV4dGVuZHMgTW9kZWw+KCk6IFF1ZXJ5PFEsIE0+IHtcbiAgICByZXR1cm4gbmV3IFF1ZXJ5KHRoaXMpO1xuICB9XG5cbiAgYWJzdHJhY3QgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24pOiBRO1xuXG4gIGFic3RyYWN0IGdldCBTdGF0ZW1lbnQoKTogU3RhdGVtZW50PFE+O1xuXG4gIGFic3RyYWN0IGdldCBDbGF1c2VzKCk6IENsYXVzZUZhY3Rvcnk8WSwgUT47XG5cbiAgcHJvdGVjdGVkIGlzUmVzZXJ2ZWQoYXR0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuICFhdHRyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlRXJyb3IoZXJyOiBFcnJvcik6IEJhc2VFcnJvcjtcblxuICBhYnN0cmFjdCBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcblxuICBhYnN0cmFjdCBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXNlcigpOiBQcm9taXNlPFVzZXIgfCB1bmRlZmluZWQ+O1xuXG4gIGFzeW5jIGNvbnRleHQ8TSBleHRlbmRzIE1vZGVsLCBDIGV4dGVuZHMgQ29udGV4dDxNPj4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4gICk6IFByb21pc2U8Qz4ge1xuICAgIGxldCB1c2VyOiBVc2VyIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICB1c2VyID0gYXdhaXQgdGhpcy51c2VyKCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvcikpIHRocm93IGU7XG4gICAgfVxuXG4gICAgY29uc3QgYzogQyA9IG5ldyAoY2xhc3MgZXh0ZW5kcyBDdHg8TT4ge1xuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICAgICAgbW9kZWw/OiBDb25zdHJ1Y3RvcjxNPixcbiAgICAgICAgcGFyZW50PzogQ3R4PGFueSwgYW55PlxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKG9wZXJhdGlvbiwgbW9kZWwsIHBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIGdldCB1c2VyKCk6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoIXVzZXIpXG4gICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICBcIkFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCB1c2VyIGlkZW50aWZpY2F0aW9uXCJcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgIH1cbiAgICB9KShvcGVyYXRpb24sIG1vZGVsKSBhcyB1bmtub3duIGFzIEM7XG5cbiAgICByZXR1cm4gYztcbiAgfVxuXG4gIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBwazogc3RyaW5nIHwgbnVtYmVyXG4gICk6IHtcbiAgICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgaWQ6IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMobW9kZWwpLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAvLyBpZiAoa2V5ID09PSBwaykgcmV0dXJuIGFjY3VtO1xuICAgICAgICBjb25zdCBtYXBwZWRQcm9wID0gUmVwb3NpdG9yeS5jb2x1bW4obW9kZWwsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzZXJ2ZWQobWFwcGVkUHJvcCkpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFByb3BlcnR5IG5hbWUgJHttYXBwZWRQcm9wfSBpcyByZXNlcnZlZGApO1xuICAgICAgICBhY2N1bVttYXBwZWRQcm9wXSA9IHZhbDtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSlcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogcmVzdWx0LFxuICAgICAgaWQ6IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwa10sXG4gICAgfTtcbiAgfVxuXG4gIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4sXG4gICAgcGs6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICk6IE0ge1xuICAgIGNvbnN0IG9iOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgb2JbcGtdID0gaWQ7XG4gICAgY29uc3QgbSA9IChcbiAgICAgIHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmJ1aWxkKG9iLCBjbGF6eikgOiBuZXcgY2xhenoob2IpXG4gICAgKSBhcyBNO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gb2JqW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV07XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMobSkucmVkdWNlKChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBwaykgcmV0dXJuIGFjY3VtO1xuICAgICAgKGFjY3VtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0gPSBvYmpbUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIG0pO1xuICAgIGlmIChtZXRhZGF0YSlcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbWV0YWRhdGEsXG4gICAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYWJzdHJhY3QgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICBhc3luYyBjcmVhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZC5tYXAoKGksIGNvdW50KSA9PiB0aGlzLmNyZWF0ZSh0YWJsZU5hbWUsIGksIG1vZGVsW2NvdW50XSwgLi4uYXJncykpXG4gICAgKTtcbiAgfVxuXG4gIGFic3RyYWN0IHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIGFzeW5jIHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoaWQubWFwKChpKSA9PiB0aGlzLnJlYWQodGFibGVOYW1lLCBpLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgYWJzdHJhY3QgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICBhc3luYyB1cGRhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZC5tYXAoKGksIGNvdW50KSA9PiB0aGlzLnVwZGF0ZSh0YWJsZU5hbWUsIGksIG1vZGVsW2NvdW50XSwgLi4uYXJncykpXG4gICAgKTtcbiAgfVxuXG4gIGFic3RyYWN0IGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGlkLm1hcCgoaSkgPT4gdGhpcy5kZWxldGUodGFibGVOYW1lLCBpLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgYWJzdHJhY3QgcmF3PFI+KHJhd0lucHV0OiBRLCBwcm9jZXNzOiBib29sZWFuLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj47XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjb2JzZXJ2ZX1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJPYnNlcnZlciBhbHJlYWR5IHJlZ2lzdGVyZWRcIik7XG4gICAgdGhpcy5fb2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFVucmVnaXN0ZXJzIGFuIHtAbGluayBPYnNlcnZlcn1cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICpcbiAgICogQHNlZSB7T2JzZXJ2YWJsZSN1bk9ic2VydmV9XG4gICAqL1xuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLl9vYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBjYWxscyBhbGwgcmVnaXN0ZXJlZCB7QGxpbmsgT2JzZXJ2ZXJ9cyB0byB1cGRhdGUgdGhlbXNlbHZlc1xuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gb3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUge0BsaW5rIE9ic2VydmVyI3JlZnJlc2h9IG1ldGhvZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRoaXMuX29ic2VydmVycy5tYXAoKG8pID0+IG8ucmVmcmVzaCguLi5hcmdzKSlcbiAgICApO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpKSA9PiB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgb2JzZXJ2YWJsZSAke3RoaXMuX29ic2VydmVyc1tpXX06ICR7cmVzdWx0LnJlYXNvbn1gXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0PFksIFE+KGZsYXZvdXI6IGFueSk6IEFkYXB0ZXI8WSwgUT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChmbGF2b3VyIGluIHRoaXMuX2NhY2hlKSByZXR1cm4gdGhpcy5fY2FjaGVbZmxhdm91cl07XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIEFkYXB0ZXIgcmVnaXN0ZXJlZCB1bmRlciAke2ZsYXZvdXJ9LmApO1xuICB9XG5cbiAgc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cjogc3RyaW5nKSB7XG4gICAgY29uc3QgYWRhcHRlciA9IEFkYXB0ZXIuZ2V0KGZsYXZvdXIpO1xuICAgIGlmICghYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBObyBwZXJzaXN0ZW5jZSBmbGF2b3VyICR7Zmxhdm91cn0gcmVnaXN0ZXJlZGApO1xuICAgIHRoaXMuX2N1cnJlbnQgPSBhZGFwdGVyO1xuICB9XG5cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBSZXBvc2l0b3J5LmtleShrZXkpO1xuICB9XG5cbiAgc3RhdGljIG1vZGVsczxNIGV4dGVuZHMgTW9kZWw+KGZsYXZvdXI6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IChNb2RlbCBhcyBhbnkpLmdldFJlZ2lzdHJ5KCkgYXMgTW9kZWxSZWdpc3RyeTxhbnk+O1xuICAgICAgY29uc3QgY2FjaGUgPSAoXG4gICAgICAgIHJlZ2lzdHJ5IGFzIHVua25vd24gYXMgeyBjYWNoZTogUmVjb3JkPHN0cmluZywgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+PiB9XG4gICAgICApLmNhY2hlO1xuICAgICAgY29uc3QgbWFuYWdlZE1vZGVsczogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W10gPSBPYmplY3QudmFsdWVzKGNhY2hlKVxuICAgICAgICAubWFwKChtOiBNb2RlbENvbnN0cnVjdG9yPE0+KSA9PiB7XG4gICAgICAgICAgbGV0IGYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgbSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT5cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmICYmIGYgPT09IGZsYXZvdXIpIHJldHVybiBtO1xuICAgICAgICAgIGlmICghZikge1xuICAgICAgICAgICAgY29uc3QgcmVwbyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgIFJlcG9zaXRvcnkua2V5KERCS2V5cy5SRVBPU0lUT1JZKSxcbiAgICAgICAgICAgICAgbSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIXJlcG8pIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuXG4gICAgICAgICAgICBmID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgICByZXBvc2l0b3J5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGY7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChtKSA9PiAhIW0pO1xuICAgICAgcmV0dXJuIG1hbmFnZWRNb2RlbHM7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVOYW1lPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKSxcbiAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IgOiBtb2RlbFxuICApO1xuICBpZiAobWV0YWRhdGEpIHtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cbiAgaWYgKG1vZGVsIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICByZXR1cm4gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuICByZXR1cm4gbW9kZWwubmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIC4uLmFyZ3M6IHN0cmluZ1tdXG4pIHtcbiAgcmV0dXJuIFtnZXRUYWJsZU5hbWUobW9kZWwpLCAuLi5hcmdzXS5qb2luKFwiX1wiKTtcbn1cbiIsIi8qKlxuICogQHN1bW1hcnkgU2VxdWVuY2VcbiAqXG4gKiBAaW50ZXJmYWNlIFNlcXVlbmNlXG4gKlxuICogQGNhdGVnb3J5IFNlcXVlbmNlc1xuICovXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBzZXF1ZW5jZU5hbWVGb3JNb2RlbCB9IGZyb20gXCIuLi9pZGVudGl0eS91dGlsc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTZXF1ZW5jZSB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9uczogU2VxdWVuY2VPcHRpb25zKSB7fVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBnZW5lcmF0ZXMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqXG4gICAqIEBtZXRob2RcbiAgICovXG4gIGFic3RyYWN0IG5leHQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+O1xuICBhYnN0cmFjdCBjdXJyZW50KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PjtcbiAgYWJzdHJhY3QgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8KG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXT47XG5cbiAgc3RhdGljIHBrPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHJldHVybiBzZXF1ZW5jZU5hbWVGb3JNb2RlbChtb2RlbCwgXCJwa1wiKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi9BZGFwdGVyXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VzKGZsYXZvdXI6IHN0cmluZykge1xuICByZXR1cm4gYXBwbHkobWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBmbGF2b3VyKSk7XG59XG4iLCJpbXBvcnQge1xuICBEQktleXMsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBJUmVwb3NpdG9yeSxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeSBhcyBSZXAsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgd3JhcE1ldGhvZFdpdGhDb250ZXh0LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmVyXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIi4uL3F1ZXJ5L1F1ZXJ5XCI7XG5pbXBvcnQgeyBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyaWFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9RdWVyaWFibGVcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvU2VxdWVuY2VcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7IFdoZXJlT3B0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L29wdGlvbnNcIjtcbmltcG9ydCB7IE9yZGVyQnlTZWxlY3RvciwgU2VsZWN0U2VsZWN0b3IgfSBmcm9tIFwiLi4vcXVlcnkvc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBnZXRUYWJsZU5hbWUgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IHVzZXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcblxuZXhwb3J0IHR5cGUgUmVwbzxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBRID0gYW55LFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIFE+ID0gQWRhcHRlcjxhbnksIFE+LFxuPiA9IFJlcG9zaXRvcnk8TSwgUSwgQT47XG5cbmV4cG9ydCBjbGFzcyBSZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbCwgUSwgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBRPj5cbiAgZXh0ZW5kcyBSZXA8TT5cbiAgaW1wbGVtZW50cyBPYnNlcnZhYmxlLCBRdWVyaWFibGUsIElSZXBvc2l0b3J5PE0+XG57XG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBDb25zdHJ1Y3RvcjxSZXBvPE1vZGVsPj4gfCBSZXBvPE1vZGVsPlxuICA+ID0ge307XG5cbiAgcHJvdGVjdGVkIG9ic2VydmVyczogT2JzZXJ2ZXJbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXIhOiBBO1xuICBwcml2YXRlIF90YWJsZU5hbWUhOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIGdldCBhZGFwdGVyKCk6IEEge1xuICAgIGlmICghdGhpcy5fYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gYWRhcHRlciBmb3VuZCBmb3IgdGhpcyByZXBvc2l0b3J5LiBkaWQgeW91IHVzZSB0aGUgQHVzZXMgZGVjb3JhdG9yIG9yIHBhc3MgaXQgaW4gdGhlIGNvbnN0cnVjdG9yP2BcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICBpZiAoIXRoaXMuX3RhYmxlTmFtZSkgdGhpcy5fdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZSh0aGlzLmNsYXNzKTtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVOYW1lO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4pIHtcbiAgICBzdXBlcihjbGF6eik7XG4gICAgaWYgKGFkYXB0ZXIpIHRoaXMuX2FkYXB0ZXIgPSBhZGFwdGVyO1xuICAgIGlmIChjbGF6eikge1xuICAgICAgUmVwb3NpdG9yeS5yZWdpc3RlcihjbGF6eiwgdGhpcyk7XG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBjb25zdCBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgY2xhenpcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZsYXZvdXIgJiYgZmxhdm91ciAhPT0gYWRhcHRlci5mbGF2b3VyKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSW5jb21wYXRpYmxlIGZsYXZvdXJzXCIpO1xuICAgICAgICB1c2VzKGFkYXB0ZXIuZmxhdm91cikoY2xhenopO1xuICAgICAgfVxuICAgIH1cbiAgICBbdGhpcy5jcmVhdGVBbGwsIHRoaXMucmVhZEFsbCwgdGhpcy51cGRhdGVBbGwsIHRoaXMuZGVsZXRlQWxsXS5mb3JFYWNoKFxuICAgICAgKG0pID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG0ubmFtZTtcbiAgICAgICAgd3JhcE1ldGhvZFdpdGhDb250ZXh0KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJQcmVmaXhcIl0sXG4gICAgICAgICAgbSxcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW25hbWUgKyBcIlN1ZmZpeFwiXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFueVtdXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlclxuICAgICk7XG4gICAgbW9kZWwgPSBuZXcgdGhpcy5jbGFzcyhtb2RlbCk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWwuaGFzRXJyb3JzKCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gbW9kZWxzO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgbGV0IHJlY29yZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgaWRzIGFzIChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICByZWNvcmRzLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZHNbaV0gYXMgc3RyaW5nIHwgbnVtYmVyKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlclxuICAgICk7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gICAgY29uc3Qgb3B0cyA9IFJlcG9zaXRvcnkuZ2V0U2VxdWVuY2VPcHRpb25zKG1vZGVsc1swXSk7XG4gICAgbGV0IGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZClbXSA9IFtdO1xuICAgIGlmIChvcHRzLnR5cGUpIHtcbiAgICAgIGlmICghb3B0cy5uYW1lKSBvcHRzLm5hbWUgPSBTZXF1ZW5jZS5wayhtb2RlbHNbMF0pO1xuICAgICAgaWRzID0gYXdhaXQgKGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShvcHRzKSkucmFuZ2UobW9kZWxzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgbW9kZWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtLCBpKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgKG0gYXMgUmVjb3JkPHN0cmluZywgYW55PilbdGhpcy5wa10gPSBpZHNbaV07XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+IG0uaGFzRXJyb3JzKCkpXG4gICAgICAucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlKVxuICAgICAgICAgIGFjY3VtID1cbiAgICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IGFjY3VtICsgYFxcbiAtICR7aX06ICR7ZS50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycyk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRQcmVmaXgoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlclxuICAgICk7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgIChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVt0aGlzLnBrXSA9IGtleTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuICAgIHJldHVybiBba2V5LCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVhZEFsbFByZWZpeChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXJcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAga2V5cy5tYXAoYXN5bmMgKGspID0+IHtcbiAgICAgICAgY29uc3QgbSA9IG5ldyB0aGlzLmNsYXNzKCk7XG4gICAgICAgIChtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3RoaXMucGtdID0gaztcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgYXN5bmMgcmVhZEFsbChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXJcbiAgICApO1xuICAgIGNvbnN0IHBrID0gKG1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3RoaXMucGtdO1xuICAgIGlmICghcGspXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrfWBcbiAgICAgICk7XG4gICAgY29uc3Qgb2xkTW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQocGssIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVsID0gdGhpcy5tZXJnZShvbGRNb2RlbCwgbW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgb2xkTW9kZWxcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWwuaGFzRXJyb3JzKFxuICAgICAgb2xkTW9kZWwsXG4gICAgICAuLi5SZXBvc2l0b3J5LnJlbGF0aW9ucyh0aGlzLmNsYXNzKVxuICAgICk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG4gICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKSB7XG4gICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobW9kZWwpKVxuICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG1vZGVsLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIucmVjb3JkKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB1cGRhdGVkLm1hcCgodSwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZUFsbFByZWZpeChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueVtdPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyXG4gICAgKTtcbiAgICBjb25zdCBpZHMgPSBtb2RlbHMubWFwKChtKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IChtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3RoaXMucGtdO1xuICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJtaXNzaW5nIGlkIG9uIHVwZGF0ZSBvcGVyYXRpb25cIik7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSk7XG4gICAgY29uc3Qgb2xkTW9kZWxzID0gYXdhaXQgdGhpcy5yZWFkQWxsKGlkcywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgbW9kZWxzID0gbW9kZWxzLm1hcCgobSwgaSkgPT4ge1xuICAgICAgbSA9IHRoaXMubWVyZ2Uob2xkTW9kZWxzW2ldLCBtKTtcbiAgICAgIGlmIChSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpIHtcbiAgICAgICAgaWYgKCFSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG0pKVxuICAgICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobSwgUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtO1xuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgICAgIG9sZE1vZGVsc1tpXVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IG1vZGVsc1xuICAgICAgLm1hcCgobSwgaSkgPT4gbS5oYXNFcnJvcnMob2xkTW9kZWxzW2ldLCBtKSlcbiAgICAgIC5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUpXG4gICAgICAgICAgYWNjdW0gPVxuICAgICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB1bmRlZmluZWQpO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKTtcblxuICAgIG1vZGVscy5mb3JFYWNoKChtLCBpKSA9PiB7XG4gICAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKSB7XG4gICAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtKSlcbiAgICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0sIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZVByZWZpeChrZXk6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXJcbiAgICApO1xuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKGtleSwgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuICAgIHJldHVybiBba2V5LCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZUFsbFByZWZpeChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlclxuICAgICk7XG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgdGhpcy5yZWFkQWxsKGtleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICByZXR1cm4gZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFtrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgc2VsZWN0KHNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3IpOiBXaGVyZU9wdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeTxRLCBNPih0aGlzLmFkYXB0ZXIpLnNlbGVjdChzZWxlY3RvcikuZnJvbSh0aGlzLmNsYXNzKTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5PFY+KFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uLFxuICAgIG9yZGVyQnk6IHN0cmluZyxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgc2tpcD86IG51bWJlclxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCBzb3J0OiBPcmRlckJ5U2VsZWN0b3IgPSBbb3JkZXJCeSBhcyBzdHJpbmcsIG9yZGVyIGFzIE9yZGVyRGlyZWN0aW9uXTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VsZWN0KCkud2hlcmUoY29uZGl0aW9uKS5vcmRlckJ5KHNvcnQpO1xuICAgIGlmIChsaW1pdCkgcXVlcnkubGltaXQobGltaXQpO1xuICAgIGlmIChza2lwKSBxdWVyeS5vZmZzZXQoc2tpcCk7XG4gICAgcmV0dXJuIHF1ZXJ5LmV4ZWN1dGU8Vj4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYW4ge0BsaW5rIE9ic2VydmVyfVxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgKlxuICAgKiBAc2VlIHtPYnNlcnZhYmxlI29ic2VydmV9XG4gICAqL1xuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJPYnNlcnZlciBhbHJlYWR5IHJlZ2lzdGVyZWRcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVW5yZWdpc3RlcnMgYW4ge0BsaW5rIE9ic2VydmVyfVxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgKlxuICAgKiBAc2VlIHtPYnNlcnZhYmxlI3VuT2JzZXJ2ZX1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgT2JzZXJ2ZXJcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBjYWxscyBhbGwgcmVnaXN0ZXJlZCB7QGxpbmsgT2JzZXJ2ZXJ9cyB0byB1cGRhdGUgdGhlbXNlbHZlc1xuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gb3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUge0BsaW5rIE9ic2VydmVyI3JlZnJlc2h9IG1ldGhvZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5yZWZyZXNoKC4uLmFyZ3MpKVxuICAgICk7XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBvYnNlcnZhYmxlICR7dGhpcy5vYnNlcnZlcnNbaV19OiAke3Jlc3VsdC5yZWFzb259YFxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbCwgUiBleHRlbmRzIFJlcG88TT4+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBkZWZhdWx0Rmxhdm91cj86IHN0cmluZ1xuICApOiBSIHtcbiAgICBsZXQgcmVwbzogUiB8IENvbnN0cnVjdG9yPFI+IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICByZXBvID0gdGhpcy5nZXQobW9kZWwpIGFzIENvbnN0cnVjdG9yPFI+IHwgUjtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJlcG8gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHJlcG8gaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSByZXR1cm4gcmVwbyBhcyBSO1xuXG4gICAgY29uc3QgZmxhdm91cjogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIChyZXBvICYmXG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCByZXBvKSkgfHxcbiAgICAgIGRlZmF1bHRGbGF2b3VyO1xuICAgIGNvbnN0IGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBhbnk+IHwgdW5kZWZpbmVkID0gZmxhdm91clxuICAgICAgPyBBZGFwdGVyLmdldChmbGF2b3VyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UgYWRhcHRlciBmb3VuZCBmbGF2b3VyICR7Zmxhdm91cn1gXG4gICAgICApO1xuXG4gICAgcmVwbyA9IHJlcG8gfHwgKGFkYXB0ZXIucmVwb3NpdG9yeSgpIGFzIENvbnN0cnVjdG9yPFI+KTtcbiAgICByZXR1cm4gbmV3IHJlcG8oYWRhcHRlciwgbW9kZWwpIGFzIFI7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbiAgKTogQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+IHtcbiAgICBjb25zdCBuYW1lID0gUmVwb3NpdG9yeS50YWJsZShtb2RlbCk7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVbbmFtZV0gYXMgQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+O1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBmaW5kIHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCB1bmRlciAke25hbWV9YFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgcmVnaXN0ZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgcmVwbzogQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+XG4gICkge1xuICAgIGNvbnN0IG5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBpZiAobmFtZSBpbiB0aGlzLl9jYWNoZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGAke25hbWV9IGFscmVhZHkgcmVnaXN0ZXJlZCBhcyBhIHJlcG9zaXRvcnlgKTtcbiAgICB0aGlzLl9jYWNoZVtuYW1lXSA9IHJlcG87XG4gIH1cblxuICBzdGF0aWMgc2V0TWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSwgbWV0YWRhdGE6IGFueSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZU1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIG1vZGVsLFxuICAgICAgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXG4gICAgKTtcbiAgICBpZiAoZGVzY3JpcHRvcikgZGVsZXRlIChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV07XG4gIH1cblxuICBzdGF0aWMgZ2V0U2VxdWVuY2VPcHRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKSwgbW9kZWwsIHBrKTtcbiAgICBpZiAoIW1ldGFkYXRhKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiTm8gc2VxdWVuY2Ugb3B0aW9ucyBkZWZpbmVkIGZvciBtb2RlbC4gZGlkIHlvdSB1c2UgdGhlIEBwayBkZWNvcmF0b3I/XCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1ldGFkYXRhIGFzIFNlcXVlbmNlT3B0aW9ucztcbiAgfVxuXG4gIHN0YXRpYyBpbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IGluZGV4RGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsIDogbmV3IG1vZGVsKCksXG4gICAgICBEQktleXMuUkVGTEVDVFxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGluZGV4RGVjb3JhdG9ycyB8fCB7fSkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj4sIFtrLCB2YWxdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB2YWwuZmlsdGVyKCh2KSA9PiB2LmtleS5zdGFydHNXaXRoKFBlcnNpc3RlbmNlS2V5cy5JTkRFWCkpO1xuICAgICAgICBpZiAoZGVjcyAmJiBkZWNzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjO1xuICAgICAgICAgICAgYWNjdW1ba10gPSBhY2N1bVtrXSB8fCB7fTtcbiAgICAgICAgICAgIGFjY3VtW2tdW2tleV0gPSBwcm9wcyBhcyBJbmRleE1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHJlbGF0aW9uczxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHByb3RvdHlwZSA9XG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsXG4gICAgICAgID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKVxuICAgICAgICA6IChtb2RlbCBhcyBhbnkpLnByb3RvdHlwZTtcbiAgICB3aGlsZSAocHJvdG90eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3BzOiBzdHJpbmdbXSA9IHByb3RvdHlwZVtQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TXTtcbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICByZXN1bHQucHVzaCguLi5wcm9wcyk7XG4gICAgICB9XG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHN0YXRpYyB0YWJsZTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICByZXR1cm4gZ2V0VGFibGVOYW1lKG1vZGVsKTtcbiAgfVxuXG4gIHN0YXRpYyBjb2x1bW48TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSwgYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKSxcbiAgICAgIG1vZGVsLFxuICAgICAgYXR0cmlidXRlXG4gICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgPyBtZXRhZGF0YSA6IGF0dHJpYnV0ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IERCS2V5cywgSVJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8VD4sXG4gIG5hbWVPdmVycmlkZT86IHN0cmluZ1xuKTogYW55IHtcbiAgcmV0dXJuICgob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBpZiAocHJvcGVydHlLZXkpIHtcbiAgICAgIHJldHVybiBpbmplY3QobmFtZU92ZXJyaWRlIHx8IG1vZGVsLm5hbWUpKG9yaWdpbmFsLCBwcm9wZXJ0eUtleSk7XG4gICAgfVxuXG4gICAgbWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuUkVQT1NJVE9SWSksXG4gICAgICBuYW1lT3ZlcnJpZGUgfHwgb3JpZ2luYWwubmFtZVxuICAgICkobW9kZWwpO1xuICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIobW9kZWwsIG9yaWdpbmFsKTtcbiAgICByZXR1cm4gaW5qZWN0YWJsZShcbiAgICAgIG5hbWVPdmVycmlkZSB8fCBvcmlnaW5hbC5uYW1lLFxuICAgICAgdHJ1ZSxcbiAgICAgIChpbnN0YW5jZTogSVJlcG9zaXRvcnk8VD4pID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBEQktleXMuQ0xBU1MsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogbW9kZWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICkob3JpZ2luYWwpO1xuICB9KSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiBvYnNlcnZlciBjb21tdW5pY2F0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBPYnNlcnZlckVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqL1xuZXhwb3J0IGNsYXNzIE9ic2VydmVyRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoT2JzZXJ2ZXJFcnJvci5uYW1lLCBtc2cpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3Rvciwgc2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuL1JlcG9zaXRvcnlcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5PFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxUPiB8IFQsXG4gIGZsYXZvdXI/OiBzdHJpbmdcbikge1xuICBpZiAoIWZsYXZvdXIpIHtcbiAgICBjb25zdCBrZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUik7XG4gICAgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBrZXksXG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IgOiBtb2RlbFxuICAgICk7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV0cmlldmUgZmxhdm91ciBmcm9tIG1vZGVsICR7bW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUgOiBtb2RlbC5uYW1lfWBcbiAgICAgICk7XG4gIH1cbiAgcmV0dXJuIHNmKFBlcnNpc3RlbmNlS2V5cy5JTkpFQ1RBQkxFLCBmbGF2b3VyLCBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKSk7XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlUmVnaXN0cnlJbXAsXG4gIEluamVjdGFibGVzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuL1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnkgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5IGV4dGVuZHMgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldDxUPihuYW1lOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaW5qZWN0YWJsZSA9IHN1cGVyLmdldChuYW1lKTtcbiAgICBpZiAoIWluamVjdGFibGUpXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtID0gTW9kZWwuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAobSkgaW5qZWN0YWJsZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG4gICAgICAgIGlmIChpbmplY3RhYmxlKSB7XG4gICAgICAgICAgaWYgKGluamVjdGFibGUgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSByZXR1cm4gaW5qZWN0YWJsZSBhcyBUO1xuICAgICAgICAgIGNvbnN0IGZsYXZvdXIgPVxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgICBpbmplY3RhYmxlLmNvbnN0cnVjdG9yXG4gICAgICAgICAgICApIHx8XG4gICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKFxuICAgICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICAgIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5KFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAgICAgICAgICAgZmxhdm91clxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgcmV0dXJuIGluamVjdGFibGUgYXMgVCB8IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAdHlwZWRlZiBTZXF1ZW5jZU9wdGlvbnNcbiAqXG4gKiBAcHJvcCB7c3RyaW5nIHwgbnVtYmVyfSBbc3RhcnRpbmdWYWx1ZV0gZGVmaW5lcyB0aGUgc3RhcnRpbmcgdmFsdWUgd2hlbiBzZXF1ZW5jZSBkb2VzdCBub3QgZXhpc3RcbiAqXG4gKiBAY2F0ZWdvcnkgU2VxdWVuY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VxdWVuY2VPcHRpb25zIHtcbiAgbmFtZT86IHN0cmluZztcbiAgdHlwZTogXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWQ7XG4gIHN0YXJ0V2l0aDogbnVtYmVyO1xuICBpbmNyZW1lbnRCeTogbnVtYmVyO1xuICBtaW5WYWx1ZT86IG51bWJlcjtcbiAgbWF4VmFsdWU/OiBudW1iZXI7XG4gIGN5Y2xlOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRGVmYXVsdFNlcXVlbmNlT3B0aW9uczogU2VxdWVuY2VPcHRpb25zID0ge1xuICB0eXBlOiBcIk51bWJlclwiLFxuICBzdGFydFdpdGg6IDAsXG4gIGluY3JlbWVudEJ5OiAxLFxuICBjeWNsZTogZmFsc2UsXG59O1xuXG5leHBvcnQgY29uc3QgTnVtZXJpY1NlcXVlbmNlOiBTZXF1ZW5jZU9wdGlvbnMgPSB7XG4gIHR5cGU6IFwiTnVtYmVyXCIsXG4gIHN0YXJ0V2l0aDogMCxcbiAgaW5jcmVtZW50Qnk6IDEsXG4gIGN5Y2xlOiBmYWxzZSxcbn07XG5cbmV4cG9ydCBjb25zdCBCaWdJbnRTZXF1ZW5jZTogU2VxdWVuY2VPcHRpb25zID0ge1xuICB0eXBlOiBcIkJpZ0ludFwiLFxuICBzdGFydFdpdGg6IDAsXG4gIGluY3JlbWVudEJ5OiAxLFxuICBjeWNsZTogZmFsc2UsXG59O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xyXG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XHJcbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xyXG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XHJcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcclxuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XHJcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xyXG4gICAgZG9uZSA9IHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xyXG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XHJcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xyXG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xyXG4gICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgdmFyIGFyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG93bktleXMobyk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XHJcbiAgICAgICAgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcclxuICAgICAgICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcclxuICAgICAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG5cclxufVxyXG5cclxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XHJcbiAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XHJcbiAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHZhciByLCBzID0gMDtcclxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBzIHw9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGZhaWwoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XHJcbiAgICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBfX2V4dGVuZHM6IF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduOiBfX2Fzc2lnbixcclxuICAgIF9fcmVzdDogX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZTogX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW06IF9fcGFyYW0sXHJcbiAgICBfX2VzRGVjb3JhdGU6IF9fZXNEZWNvcmF0ZSxcclxuICAgIF9fcnVuSW5pdGlhbGl6ZXJzOiBfX3J1bkluaXRpYWxpemVycyxcclxuICAgIF9fcHJvcEtleTogX19wcm9wS2V5LFxyXG4gICAgX19zZXRGdW5jdGlvbk5hbWU6IF9fc2V0RnVuY3Rpb25OYW1lLFxyXG4gICAgX19tZXRhZGF0YTogX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcjogX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nOiBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXI6IF9fZXhwb3J0U3RhcixcclxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZDogX19yZWFkLFxyXG4gICAgX19zcHJlYWQ6IF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheTogX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yOiBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdDogX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXI6IF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW46IF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxuICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlOiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlczogX19kaXNwb3NlUmVzb3VyY2VzLFxyXG4gICAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb246IF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxyXG59O1xyXG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoUXVlcnlFcnJvci5uYW1lLCBtc2cpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYWdpbmdFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihQYWdpbmdFcnJvci5uYW1lLCBtc2cpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBdHRyaWJ1dGVPcHRpb24sIENvbmRpdGlvbkJ1aWxkZXJPcHRpb24gfSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQge1xuICBNb2RlbCxcbiAgTW9kZWxFcnJvckRlZmluaXRpb24sXG4gIHJlcXVpcmVkLFxuICBzZixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgR3JvdXBPcGVyYXRvciwgT3BlcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBDb25kaXRpb24gQ2xhc3NcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIGEgbG9naWNhbCBjb25kaXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbmRpdGlvbn0gYXR0cjFcbiAqIEBwYXJhbSB7T3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yfSBvcGVyYXRvclxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25kaXRpb259IGNvbXBhcmlzb25cbiAqXG4gKiBAY2xhc3MgQ29uZGl0aW9uXG4gKiBAaW1wbGVtZW50cyBFeGVjdXRvclxuICpcbiAqIEBjYXRlZ29yeSBRdWVyeVxuICogQHN1YmNhdGVnb3J5IENvbmRpdGlvbnNcbiAqL1xuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uIGV4dGVuZHMgTW9kZWwge1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgYXR0cjE/OiBzdHJpbmcgfCBDb25kaXRpb24gPSB1bmRlZmluZWQ7XG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgQHJlcXVpcmVkKClcbiAgcHJvdGVjdGVkIGNvbXBhcmlzb24/OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uLFxuICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3IsXG4gICAgY29tcGFyaXNvbjogYW55XG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hdHRyMSA9IGF0dHIxO1xuICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICB0aGlzLmNvbXBhcmlzb24gPSBjb21wYXJpc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEpvaW5zIDIge0BsaW5rIENvbmRpdGlvbn1zIG9uIGFuIHtAbGluayBPcGVyYXRvciNBTkR9IG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbn0gY29uZGl0aW9uXG4gICAqL1xuICBhbmQoY29uZGl0aW9uOiBDb25kaXRpb24pOiBDb25kaXRpb24ge1xuICAgIHJldHVybiBDb25kaXRpb24uYW5kKHRoaXMsIGNvbmRpdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgSm9pbnMgMiB7QGxpbmsgQ29uZGl0aW9ufXMgb24gYW4ge0BsaW5rIE9wZXJhdG9yI09SfSBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb259IGNvbmRpdGlvblxuICAgKi9cbiAgb3IoY29uZGl0aW9uOiBDb25kaXRpb24pOiBDb25kaXRpb24ge1xuICAgIHJldHVybiBDb25kaXRpb24ub3IodGhpcywgY29uZGl0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBleGNsdWRlcyBhIHZhbHV0IGZyb20gdGhlIHJlc3VsdFxuICAgKiBAcGFyYW0gdmFsXG4gICAqL1xuICBub3QodmFsOiBhbnkpOiBDb25kaXRpb24ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uKHRoaXMsIE9wZXJhdG9yLk5PVCwgdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgaGFzRXJyb3JzKC4uLmV4Y2VwdGlvbnM6IHN0cmluZ1tdKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHN1cGVyLmhhc0Vycm9ycyguLi5leGNlcHRpb25zKTtcbiAgICBpZiAoZXJyb3JzKSByZXR1cm4gZXJyb3JzO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmF0dHIxID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAodGhpcy5jb21wYXJpc29uIGluc3RhbmNlb2YgQ29uZGl0aW9uKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhcmlzb246IHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogXCJCb3RoIHNpZGVzIG9mIHRoZSBjb21wYXJpc29uIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgTW9kZWxFcnJvckRlZmluaXRpb247XG4gICAgICBpZiAoT2JqZWN0LnZhbHVlcyhPcGVyYXRvcikuaW5kZXhPZih0aGlzLm9wZXJhdG9yIGFzIE9wZXJhdG9yKSA9PT0gLTEpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb3BlcmF0b3I6IHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogc2YoXCJJbnZhbGlkIG9wZXJhdG9yIHswfVwiLCB0aGlzLm9wZXJhdG9yIGFzIHN0cmluZyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hdHRyMSBpbnN0YW5jZW9mIENvbmRpdGlvbikge1xuICAgICAgaWYgKFxuICAgICAgICAhKHRoaXMuY29tcGFyaXNvbiBpbnN0YW5jZW9mIENvbmRpdGlvbikgJiZcbiAgICAgICAgdGhpcy5vcGVyYXRvciAhPT0gT3BlcmF0b3IuTk9UXG4gICAgICApXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29tcGFyaXNvbjoge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBzZihcIkludmFsaWQgb3BlcmF0b3IgezB9XCIsIHRoaXMub3BlcmF0b3IgYXMgc3RyaW5nKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgaWYgKFxuICAgICAgICBPYmplY3QudmFsdWVzKEdyb3VwT3BlcmF0b3IpLmluZGV4T2YodGhpcy5vcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yKSA9PT1cbiAgICAgICAgICAtMSAmJlxuICAgICAgICB0aGlzLm9wZXJhdG9yICE9PSBPcGVyYXRvci5OT1RcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcGVyYXRvcjoge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBzZihcIkludmFsaWQgb3BlcmF0b3IgezB9XCIsIHRoaXMub3BlcmF0b3IgYXMgc3RyaW5nKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgLy8gaWYgKHRoaXMub3BlcmF0b3IgIT09IE9wZXJhdG9yLk5PVCAmJiB0eXBlb2YgdGhpcy5hdHRyMS5hdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgIC8vICAgICByZXR1cm4ge1xuICAgICAgLy8gICAgICAgICBhdHRyMToge1xuICAgICAgLy8gICAgICAgICAgICAgY29uZGl0aW9uOiBzdHJpbmdGb3JtYXQoXCJQYXJlbnQgY29uZGl0aW9uIGF0dHJpYnV0ZSBtdXN0IGJlIGEgc3RyaW5nXCIpXG4gICAgICAvLyAgICAgICAgIH1cbiAgICAgIC8vICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEpvaW5zIDIge0BsaW5rIENvbmRpdGlvbn1zIG9uIGFuIHtAbGluayBPcGVyYXRvciNBTkR9IG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbn0gY29uZGl0aW9uMVxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbn0gY29uZGl0aW9uMlxuICAgKi9cbiAgc3RhdGljIGFuZChjb25kaXRpb24xOiBDb25kaXRpb24sIGNvbmRpdGlvbjI6IENvbmRpdGlvbik6IENvbmRpdGlvbiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ncm91cChjb25kaXRpb24xLCBHcm91cE9wZXJhdG9yLkFORCwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgSm9pbnMgMiB7QGxpbmsgQ29uZGl0aW9ufXMgb24gYW4ge0BsaW5rIE9wZXJhdG9yI09SfSBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb259IGNvbmRpdGlvbjFcbiAgICogQHBhcmFtIHtDb25kaXRpb259IGNvbmRpdGlvbjJcbiAgICovXG4gIHN0YXRpYyBvcihjb25kaXRpb24xOiBDb25kaXRpb24sIGNvbmRpdGlvbjI6IENvbmRpdGlvbik6IENvbmRpdGlvbiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ncm91cChjb25kaXRpb24xLCBHcm91cE9wZXJhdG9yLk9SLCBjb25kaXRpb24yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBHcm91cHMgMiB7QGxpbmsgQ29uZGl0aW9ufXMgYnkgdGhlIHNwZWNpZmllZCB7QGxpbmsgR3JvdXBPcGVyYXRvcn1cbiAgICogQHBhcmFtIHtDb25kaXRpb259IGNvbmRpdGlvbjFcbiAgICogQHBhcmFtIHtHcm91cE9wZXJhdG9yfSBvcGVyYXRvclxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbn0gY29uZGl0aW9uMlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXAoXG4gICAgY29uZGl0aW9uMTogQ29uZGl0aW9uLFxuICAgIG9wZXJhdG9yOiBHcm91cE9wZXJhdG9yLFxuICAgIGNvbmRpdGlvbjI6IENvbmRpdGlvblxuICApOiBDb25kaXRpb24ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uKGNvbmRpdGlvbjEsIG9wZXJhdG9yLCBjb25kaXRpb24yKTtcbiAgfVxuXG4gIHN0YXRpYyBhdHRyaWJ1dGUoYXR0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24uQnVpbGRlcigpLmF0dHJpYnV0ZShhdHRyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDb25kaXRpb24gQnVpbGRlciBDbGFzc1xuICAgKiBAZGVzY3JpcHRpb24gcHJvdmlkZXMgYSBzaW1wbGUgQVBJIHRvIGJ1aWxkIHtAbGluayBDb25kaXRpb259c1xuICAgKlxuICAgKiBAY2xhc3MgQ29uZGl0aW9uQnVpbGRlclxuICAgKiBAaW1wbGVtZW50cyBCdWlsZGVyXG4gICAqIEBpbXBsZW1lbnRzIEF0dHJpYnV0ZU9wdGlvblxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUXVlcnlcbiAgICogQHN1YmNhdGVnb3J5IENvbmRpdGlvbnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIEJ1aWxkZXIgPSBjbGFzcyBDb25kaXRpb25CdWlsZGVyXG4gICAgaW1wbGVtZW50cyBDb25kaXRpb25CdWlsZGVyT3B0aW9uLCBBdHRyaWJ1dGVPcHRpb25cbiAge1xuICAgIGF0dHIxPzogc3RyaW5nIHwgQ29uZGl0aW9uID0gdW5kZWZpbmVkO1xuICAgIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgIGNvbXBhcmlzb24/OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZShhdHRyOiBzdHJpbmcpOiBBdHRyaWJ1dGVPcHRpb24ge1xuICAgICAgdGhpcy5hdHRyMSA9IGF0dHI7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGFuIEVxdWFsaXR5IENvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgZXEodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkVRVUFMLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBEaWZmZXJlbnQgQ29tcGFyaXNvblxuICAgICAqIEBwYXJhbSB7YW55fSB2YWxcbiAgICAgKi9cbiAgICBkaWYodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkRJRkZFUkVOVCwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR3JlYXRlciBUaGFuIENvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgZ3QodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkJJR0dFUiwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgTG93ZXIgVGhhbiBDb21wYXJpc29uXG4gICAgICogQHBhcmFtIHthbnl9IHZhbFxuICAgICAqL1xuICAgIGx0KHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5TTUFMTEVSLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHcmVhdGVyIG9yIEVxdWFsIHRvIENvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgZ3RlKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5CSUdHRVJfRVEsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIExvd2VyIG9yIEVxdWFsIHRvIENvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgbHRlKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5TTUFMTEVSX0VRLCB2YWwpO1xuICAgIH1cblxuICAgIGluKGFycjogYW55W10pIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLklOLCBhcnIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBSZWdleHBvIENvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgcmVnZXhwKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5SRUdFWFAsIG5ldyBSZWdFeHAodmFsKS5zb3VyY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYW4ge0BsaW5rIE9wZXJhdG9yfSBiYXNlZCBDb21wYXJpc29uXG4gICAgICogQHBhcmFtIHtPcGVyYXRvcn0gb3BcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRPcChvcDogT3BlcmF0b3IsIHZhbDogYW55KSB7XG4gICAgICB0aGlzLm9wZXJhdG9yID0gb3A7XG4gICAgICB0aGlzLmNvbXBhcmlzb24gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUgRGF0YWJhc2UgT2JqZWN0XG4gICAgICogQHRocm93cyB7UXVlcnlFcnJvcn0gaWYgaXQgZmFpbHMgdG8gYnVpbGQgdGhlIHtAbGluayBDb25kaXRpb259XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkKCk6IENvbmRpdGlvbiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmV3IENvbmRpdGlvbihcbiAgICAgICAgICB0aGlzLmF0dHIxIGFzIHN0cmluZyB8IENvbmRpdGlvbixcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yIGFzIE9wZXJhdG9yLFxuICAgICAgICAgIHRoaXMuY29tcGFyaXNvbiBhcyBhbnlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGdldCBidWlsZGVyKCk6IENvbmRpdGlvbkJ1aWxkZXJPcHRpb24ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uLkJ1aWxkZXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENhc2NhZGUgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU9yVXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICBjb250ZXh0OiBDb250ZXh0PE0+LFxuICByZXBvc2l0b3J5PzogUmVwbzxNPlxuKTogUHJvbWlzZTxNPiB7XG4gIGlmICghcmVwb3NpdG9yeSkge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgQ291bGQgbm90IGZpbmQgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIHJlcG9zaXRvcnkgPSBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yKSBhcyBSZXBvPE0+O1xuICB9XG4gIGlmICh0eXBlb2YgKG1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3JlcG9zaXRvcnkucGtdID09PSBcInVuZGVmaW5lZFwiKVxuICAgIHJldHVybiByZXBvc2l0b3J5LmNyZWF0ZShtb2RlbCwgY29udGV4dCk7XG4gIGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVwb3NpdG9yeS51cGRhdGUobW9kZWwsIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgcmV0dXJuIHJlcG9zaXRvcnkuY3JlYXRlKG1vZGVsLCBjb250ZXh0KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFkgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4odGhpczogUiwgY29udGV4dDogQ29udGV4dDxNPiwgZGF0YTogWSwga2V5OiBzdHJpbmcsIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWUpIHJldHVybjtcblxuICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBpbm5lclJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5KTtcbiAgICBjb25zdCByZWFkID0gYXdhaXQgaW5uZXJSZXBvLnJlYWQocHJvcGVydHlWYWx1ZSk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWQpO1xuICAgIChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID0gcHJvcGVydHlWYWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChkYXRhLmNsYXNzKTtcbiAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgQ291bGQgbm90IGZpbmQgbW9kZWwgJHtkYXRhLmNsYXNzfWApO1xuICBjb25zdCByZXBvOiBSZXBvPGFueT4gPSBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yKTtcbiAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKHByb3BlcnR5VmFsdWUpO1xuICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KGNyZWF0ZWQpLmlkO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgY3JlYXRlZFtwa10sIGNyZWF0ZWQpO1xuICAobW9kZWwgYXMgYW55KVtrZXldID0gY3JlYXRlZFtwa107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb09uZU9uVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBZIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4+KHRoaXM6IFIsIGNvbnRleHQ6IENvbnRleHQ8TT4sIGRhdGE6IFksIGtleTogc3RyaW5nLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlOiBhbnkgPSAobW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG4gIGlmIChkYXRhLmNhc2NhZGUudXBkYXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcblxuICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBpbm5lclJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5KTtcbiAgICBjb25zdCByZWFkID0gYXdhaXQgaW5uZXJSZXBvLnJlYWQocHJvcGVydHlWYWx1ZSk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWQpO1xuICAgIChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID0gcHJvcGVydHlWYWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB1cGRhdGVkID0gYXdhaXQgY3JlYXRlT3JVcGRhdGUoXG4gICAgKG1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0sXG4gICAgY29udGV4dFxuICApO1xuICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KHVwZGF0ZWQpLmlkO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgKHVwZGF0ZWQgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcGtdLFxuICAgIHVwZGF0ZWRcbiAgKTtcbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9ICh1cGRhdGVkIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3BrXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFkgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4odGhpczogUiwgY29udGV4dDogQ29udGV4dDxNPiwgZGF0YTogWSwga2V5OiBzdHJpbmcsIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWUpIHJldHVybjtcbiAgaWYgKGRhdGEuY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuICBjb25zdCBpbm5lclJlcG86IFJlcG88TT4gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5KTtcbiAgbGV0IGRlbGV0ZWQ6IE07XG4gIGlmICghKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNb2RlbCkpXG4gICAgZGVsZXRlZCA9IGF3YWl0IGlubmVyUmVwby5kZWxldGUoXG4gICAgICAobW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICBlbHNlXG4gICAgZGVsZXRlZCA9IGF3YWl0IGlubmVyUmVwby5kZWxldGUoXG4gICAgICAobW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XVtpbm5lclJlcG8ucGtdLFxuICAgICAgY29udGV4dFxuICAgICk7XG4gIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShcbiAgICBjb250ZXh0LFxuICAgIG1vZGVsLFxuICAgIGtleSxcbiAgICAoZGVsZXRlZCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtpbm5lclJlcG8ucGtdLFxuICAgIGRlbGV0ZWRcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvTWFueU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBZIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4+KHRoaXM6IFIsIGNvbnRleHQ6IENvbnRleHQ8TT4sIGRhdGE6IFksIGtleTogc3RyaW5nLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlczogYW55ID0gKG1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZXMgfHwgIXByb3BlcnR5VmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhcnJheVR5cGUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZXNbMF07XG4gIGlmICghcHJvcGVydHlWYWx1ZXMuZXZlcnkoKGl0ZW06IGFueSkgPT4gdHlwZW9mIGl0ZW0gPT09IGFycmF5VHlwZSkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgSW52YWxpZCBvcGVyYXRpb24uIEFsbCBlbGVtZW50cyBvZiBwcm9wZXJ0eSAke2tleX0gbXVzdCBtYXRjaCB0aGUgc2FtZSB0eXBlLmBcbiAgICApO1xuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBuZXcgU2V0KFsuLi5wcm9wZXJ0eVZhbHVlc10pO1xuICBpZiAoYXJyYXlUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKG1vZGVsLCBrZXkpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdW5pcXVlVmFsdWVzKSB7XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgcmVwby5yZWFkKGlkKTtcbiAgICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgcmVhZCk7XG4gICAgfVxuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwa05hbWUgPSBmaW5kUHJpbWFyeUtleShwcm9wZXJ0eVZhbHVlc1swXSkuaWQ7XG5cbiAgY29uc3QgcmVzdWx0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBmb3IgKGNvbnN0IG0gb2YgcHJvcGVydHlWYWx1ZXMpIHtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBjcmVhdGVPclVwZGF0ZShtLCBjb250ZXh0KTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgcmVjb3JkW3BrTmFtZV0sIHJlY29yZCk7XG4gICAgcmVzdWx0LmFkZChyZWNvcmRbcGtOYW1lXSk7XG4gIH1cblxuICAobW9kZWwgYXMgYW55KVtrZXldID0gWy4uLnJlc3VsdF07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPblVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgWSBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPih0aGlzOiBSLCBjb250ZXh0OiBDb250ZXh0PE0+LCBkYXRhOiBZLCBrZXk6IHN0cmluZywgbW9kZWw6IE0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBjYXNjYWRlIH0gPSBkYXRhO1xuICBpZiAoY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuICByZXR1cm4gb25lVG9NYW55T25DcmVhdGUuY2FsbCh0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvTWFueU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBZIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4+KHRoaXM6IFIsIGNvbnRleHQ6IENvbnRleHQ8TT4sIGRhdGE6IFksIGtleTogc3RyaW5nLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZGF0YS5jYXNjYWRlLmRlbGV0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIGNvbnN0IHZhbHVlcyA9IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICBpZiAoIXZhbHVlcyB8fCAhdmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhcnJheVR5cGUgPSB0eXBlb2YgdmFsdWVzWzBdO1xuICBjb25zdCBhcmVBbGxTYW1lVHlwZSA9IHZhbHVlcy5ldmVyeSgoaXRlbTogYW55KSA9PiB0eXBlb2YgaXRlbSA9PT0gYXJyYXlUeXBlKTtcbiAgaWYgKCFhcmVBbGxTYW1lVHlwZSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBJbnZhbGlkIG9wZXJhdGlvbi4gQWxsIGVsZW1lbnRzIG9mIHByb3BlcnR5ICR7a2V5fSBtdXN0IG1hdGNoIHRoZSBzYW1lIHR5cGUuYFxuICAgICk7XG4gIGNvbnN0IGlzSW5zdGFudGlhdGVkID0gYXJyYXlUeXBlID09PSBcIm9iamVjdFwiO1xuICBjb25zdCByZXBvID0gaXNJbnN0YW50aWF0ZWRcbiAgICA/IFJlcG9zaXRvcnkuZm9yTW9kZWwodmFsdWVzWzBdKVxuICAgIDogcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIGtleSk7XG5cbiAgY29uc3QgdW5pcXVlVmFsdWVzID0gbmV3IFNldChbXG4gICAgLi4uKGlzSW5zdGFudGlhdGVkXG4gICAgICA/IHZhbHVlcy5tYXAoKHY6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZbcmVwby5wa10pXG4gICAgICA6IHZhbHVlcyksXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgaWQgb2YgdW5pcXVlVmFsdWVzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgZGVsZXRlZCA9IGF3YWl0IHJlcG8uZGVsZXRlKGlkLCBjb250ZXh0KTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIGRlbGV0ZWQpO1xuICB9XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvcHVsYXRlS2V5KFxuICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbikge1xuICByZXR1cm4gW1BlcnNpc3RlbmNlS2V5cy5QT1BVTEFURSwgdGFibGVOYW1lLCBmaWVsZE5hbWUsIGlkXS5qb2luKFwiLlwiKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhY2hlTW9kZWxGb3JQb3B1bGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjb250ZXh0OiBDb250ZXh0PE0+LFxuICBwYXJlbnRNb2RlbDogTSxcbiAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgcGtWYWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICBjYWNoZVZhbHVlOiBhbnlcbikge1xuICBjb25zdCBjYWNoZUtleSA9IGdldFBvcHVsYXRlS2V5KFxuICAgIHBhcmVudE1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgcHJvcGVydHlLZXksXG4gICAgcGtWYWx1ZVxuICApO1xuICByZXR1cm4gY29udGV4dC5wdXQoY2FjaGVLZXksIGNhY2hlVmFsdWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFkgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4odGhpczogUiwgY29udGV4dDogQ29udGV4dDxNPiwgZGF0YTogWSwga2V5OiBzdHJpbmcsIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZGF0YS5wb3B1bGF0ZSkgcmV0dXJuO1xuICBjb25zdCBuZXN0ZWQ6IGFueSA9IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICBjb25zdCBpc0FyciA9IEFycmF5LmlzQXJyYXkobmVzdGVkKTtcbiAgaWYgKHR5cGVvZiBuZXN0ZWQgPT09IFwidW5kZWZpbmVkXCIgfHwgKGlzQXJyICYmIG5lc3RlZC5sZW5ndGggPT09IDApKSByZXR1cm47XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQb3B1bGF0ZVZhbHVlcyhcbiAgICBjOiBDb250ZXh0PE0+LFxuICAgIG1vZGVsOiBNLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgcHJvcEtleVZhbHVlczogYW55W11cbiAgKSB7XG4gICAgbGV0IGNhY2hlS2V5OiBzdHJpbmc7XG4gICAgbGV0IHZhbDogYW55O1xuICAgIGNvbnN0IHJlc3VsdHM6IE1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvS2V5VmFsdWUgb2YgcHJvcEtleVZhbHVlcykge1xuICAgICAgY2FjaGVLZXkgPSBnZXRQb3B1bGF0ZUtleShtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsID0gYXdhaXQgYy5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKG1vZGVsLCBwcm9wTmFtZSk7XG4gICAgICAgIGlmICghcmVwbykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCByZXBvXCIpO1xuICAgICAgICB2YWwgPSBhd2FpdCByZXBvLnJlYWQocHJvS2V5VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmVzdWx0cy5wdXNoKHZhbCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgaXNBcnIgPyBuZXN0ZWQgOiBbbmVzdGVkXVxuICApO1xuICAobW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSA9IGlzQXJyID8gcmVzIDogcmVzWzBdO1xufVxuXG5jb25zdCBjb21tb21UeXBlcyA9IFtcbiAgXCJhcnJheVwiLFxuICBcInN0cmluZ1wiLFxuICBcIm51bWJlclwiLFxuICBcImJvb2xlYW5cIixcbiAgXCJzeW1ib2xcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcIm9iamVjdFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcIm51bGxcIixcbiAgXCJiaWdpbnRcIixcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogYW55LFxuICBwcm9wZXJ0eUtleTogc3RyaW5nXG4pOiBSZXBvPE0+IHtcbiAgY29uc3QgdHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIFZhbGlkYXRpb24ua2V5KFxuICAgICAgQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgICAgID8gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICA6IFZhbGlkYXRpb25LZXlzLlRZUEVcbiAgICApLFxuICAgIG1vZGVsLFxuICAgIHByb3BlcnR5S2V5XG4gICk7XG4gIGNvbnN0IGN1c3RvbVR5cGVzOiBhbnkgPSBBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSlcbiAgICA/IHR5cGVzLmNsYXp6XG4gICAgOiB0eXBlcy5jdXN0b21UeXBlcztcbiAgaWYgKCF0eXBlcyB8fCAhY3VzdG9tVHlwZXMpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGZpbmQgdHlwZXMgZGVjb3JhdG9ycyBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eUtleX1gXG4gICAgKTtcblxuICBjb25zdCBhbGxvd2VkVHlwZXM6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShjdXN0b21UeXBlcylcbiAgICA/IFsuLi5jdXN0b21UeXBlc11cbiAgICA6IFtjdXN0b21UeXBlc107XG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IGFsbG93ZWRUeXBlcy5maW5kKFxuICAgICh0KSA9PiAhY29tbW9tVHlwZXMuaW5jbHVkZXMoYCR7dH1gLnRvTG93ZXJDYXNlKCkpXG4gICk7XG4gIGlmICghY29uc3RydWN0b3JOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFByb3BlcnR5IGtleSAke3Byb3BlcnR5S2V5fSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgY29uc3RydWN0b3IgdHlwZWBcbiAgICApO1xuICBjb25zdCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfCB1bmRlZmluZWQgPSBNb2RlbC5nZXQoY29uc3RydWN0b3JOYW1lKTtcbiAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gcmVnaXN0ZXJlZCBtb2RlbCBmb3VuZCBmb3IgJHtjb25zdHJ1Y3Rvck5hbWV9YCk7XG5cbiAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoY29uc3RydWN0b3IpO1xufVxuIiwiaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25VcGRhdGUsXG4gIGFmdGVyQW55LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2FzY2FkZU1ldGFkYXRhLCBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRDYXNjYWRlLCBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIGxpc3QsXG4gIE1vZGVsLFxuICBwcm9wLFxuICBwcm9wTWV0YWRhdGEsXG4gIHR5cGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIG9uZVRvTWFueU9uQ3JlYXRlLFxuICBvbmVUb01hbnlPbkRlbGV0ZSxcbiAgb25lVG9NYW55T25VcGRhdGUsXG4gIG9uZVRvT25lT25DcmVhdGUsXG4gIG9uZVRvT25lT25EZWxldGUsXG4gIG9uZVRvT25lT25VcGRhdGUsXG4gIHBvcHVsYXRlIGFzIHBvcCxcbn0gZnJvbSBcIi4vY29uc3RydWN0aW9uXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcIi4vVXNlclwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L0NvbnRleHRcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvZXJyb3JzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWJsZSh0YWJsZU5hbWU6IHN0cmluZykge1xuICByZXR1cm4gbWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKSwgdGFibGVOYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbHVtbihjb2x1bW5OYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKSwgY29sdW1uTmFtZSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgSW5kZXggRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gcHJvcGVydGllcyBkZWNvcmF0ZWQgd2lsbCB0aGUgaW5kZXggaW4gdGhlXG4gKiBEQiBmb3IgcGVyZm9ybWFuY2UgaW4gcXVlcmllc1xuICpcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb25bXX0gW2RpcmVjdGlvbnNdXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbY29tcG9zaXRpb25zXVxuICpcbiAqIEBmdW5jdGlvbiBpbmRleFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoZGlyZWN0aW9ucz86IE9yZGVyRGlyZWN0aW9uW10sIGNvbXBvc2l0aW9ucz86IHN0cmluZ1tdKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGEoXG4gICAgUmVwb3NpdG9yeS5rZXkoXG4gICAgICBgJHtQZXJzaXN0ZW5jZUtleXMuSU5ERVh9JHtjb21wb3NpdGlvbnMgJiYgY29tcG9zaXRpb25zLmxlbmd0aCA/IGAuJHtjb21wb3NpdGlvbnMuam9pbihcIi5cIil9YCA6IFwiXCJ9YFxuICAgICksXG4gICAge1xuICAgICAgZGlyZWN0aW9uczogZGlyZWN0aW9ucyxcbiAgICAgIGNvbXBvc2l0aW9uczogY29tcG9zaXRpb25zLFxuICAgIH0gYXMgSW5kZXhNZXRhZGF0YVxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5pcXVlT25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFkgPSBhbnksXG4+KHRoaXM6IFIsIGNvbnRleHQ6IENvbnRleHQ8TT4sIGRhdGE6IFksIGtleTogc3RyaW5nLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShtb2RlbCBhcyBhbnkpW2tleV0pIHJldHVybjtcbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnNlbGVjdCgpXG4gICAgLndoZXJlKENvbmRpdGlvbi5hdHRyaWJ1dGUoa2V5KS5lcSgobW9kZWwgYXMgYW55KVtrZXldKSlcbiAgICAuZXhlY3V0ZTxNW10+KCk7XG4gIGlmIChleGlzdGluZy5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICBgbW9kZWwgYWxyZWFkeSBleGlzdHMgd2l0aCBwcm9wZXJ0eSAke2tleX0gZXF1YWwgdG8gJHtKU09OLnN0cmluZ2lmeSgobW9kZWwgYXMgYW55KVtrZXldLCB1bmRlZmluZWQsIDIpfWBcbiAgICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFVuaXF1ZSBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBUYWdzIGEgcHJvcGVydHkgYXMgdW5pcXVlLlxuICogIE5vIG90aGVyIGVsZW1lbnRzIGluIHRoYXQgdGFibGUgY2FuIGhhdmUgdGhlIHNhbWUgcHJvcGVydHkgdmFsdWVcbiAqXG4gKiBAZnVuY3Rpb24gdW5pcXVlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp3YWxsZXQtZGIuRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlKCkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgb25DcmVhdGVVcGRhdGUodW5pcXVlT25DcmVhdGVVcGRhdGUpLFxuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVU5JUVVFKSwge30pXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgWSA9IGFueSxcbj4odGhpczogUiwgY29udGV4dDogQ29udGV4dDxNPiwgZGF0YTogWSwga2V5OiBzdHJpbmcsIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZXI6IFVzZXIgfCB1bmRlZmluZWQgPSBjb250ZXh0LnVzZXI7XG4gIGlmICghdXNlcilcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICAgKTtcbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IHVzZXIuaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZShjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZSksXG4gICAgcHJvcE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKSwge30pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVkQnkoKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZSksXG4gICAgcHJvcE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKSwge30pXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgT25lIFRvIE9uZSByZWxhdGlvbiBEZWNvcmF0b3JzXG4gKlxuICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBjbGF6eiB0aGUge0BsaW5rIFNlcXVlbmNlfSB0byB1c2UuIERlZmF1bHRzIHRvIHtAbGluayBOb25lU2VxdWVuY2V9XG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBwb3B1bGF0ZSBJZiB0cnVlLCByZXBsYWNlcyB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAqXG4gKiBAZnVuY3Rpb24gb25Ub09uZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6d2FsbGV0LWRiLkRlY29yYXRvcnNcbiAqXG4gKiBAc2VlIG9uZVRvTWFueVxuICogQHNlZSBtYW55VG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZVRvT25lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZTogYm9vbGVhbiA9IHRydWVcbikge1xuICBNb2RlbC5yZWdpc3RlcihjbGF6eik7XG4gIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICBjbGFzczogY2xhenoubmFtZSxcbiAgICBjYXNjYWRlOiBjYXNjYWRlT3B0aW9ucyxcbiAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gIH07XG4gIHJldHVybiBhcHBseShcbiAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgIHR5cGUoW2NsYXp6Lm5hbWUsIFN0cmluZy5uYW1lLCBOdW1iZXIubmFtZSwgQmlnSW50Lm5hbWVdKSxcbiAgICBvbkNyZWF0ZShvbmVUb09uZU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgb25VcGRhdGUob25lVG9PbmVPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgIG9uRGVsZXRlKG9uZVRvT25lT25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICBhZnRlckFueShwb3AsIG1ldGFkYXRhKSxcbiAgICBwcm9wTWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpLCBtZXRhZGF0YSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBPbmUgVG8gTWFueSByZWxhdGlvbiBEZWNvcmF0b3JzXG4gKlxuICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBjbGF6eiB0aGUge0BsaW5rIFNlcXVlbmNlfSB0byB1c2UuIERlZmF1bHRzIHRvIHtAbGluayBOb25lU2VxdWVuY2V9XG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zXVxuICpcbiAqIEBmdW5jdGlvbiBvbmVUb01hbnlcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOndhbGxldC1kYi5EZWNvcmF0b3JzXG4gKlxuICogQHNlZSBvbmVUb09uZVxuICogQHNlZSBtYW55VG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZVRvTWFueTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlXG4pIHtcbiAgTW9kZWwucmVnaXN0ZXIoY2xhenopO1xuICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgY2xhc3M6IGNsYXp6Lm5hbWUsXG4gICAgY2FzY2FkZTogY2FzY2FkZU9wdGlvbnMsXG4gICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICB9O1xuICByZXR1cm4gYXBwbHkoXG4gICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHB1cnBvc2VmdWwgb3ZlcnJpZGVcbiAgICBsaXN0KFtjbGF6eiwgU3RyaW5nLCBOdW1iZXIsIEJpZ0ludF0pLFxuICAgIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgb25VcGRhdGUob25lVG9NYW55T25VcGRhdGUsIG1ldGFkYXRhKSxcbiAgICBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgIGFmdGVyQW55KHBvcCwgbWV0YWRhdGEpLFxuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX01BTlkpLCBtZXRhZGF0YSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBNYW55IFRvIE9uZSByZWxhdGlvbiBEZWNvcmF0b3JzXG4gKlxuICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBjbGF6eiB0aGUge0BsaW5rIFNlcXVlbmNlfSB0byB1c2UuIERlZmF1bHRzIHRvIHtAbGluayBOb25lU2VxdWVuY2V9XG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zXVxuICpcbiAqIEBmdW5jdGlvbiBtYW55VG9PbmVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOndhbGxldC1kYi5EZWNvcmF0b3JzXG4gKlxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgb25lVG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbnlUb09uZShcbiAgY2xheno6IENvbnN0cnVjdG9yPGFueT4sXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGUgPSB0cnVlXG4pIHtcbiAgTW9kZWwucmVnaXN0ZXIoY2xhenopO1xuICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgY2xhc3M6IGNsYXp6Lm5hbWUsXG4gICAgY2FzY2FkZTogY2FzY2FkZU9wdGlvbnMsXG4gICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICB9O1xuICByZXR1cm4gYXBwbHkoXG4gICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICB0eXBlKFtjbGF6ei5uYW1lLCBTdHJpbmcubmFtZSwgTnVtYmVyLm5hbWUsIEJpZ0ludC5uYW1lXSksXG4gICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAvLyBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgIC8vIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlLCBtZXRhZGF0YSksXG4gICAgLy8gYWZ0ZXJBbGwocG9wdWxhdGUsIG1ldGFkYXRhKSxcbiAgICBwcm9wTWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fT05FKSwgbWV0YWRhdGEpXG4gICk7XG59XG4iLCJpbXBvcnQgeyBNb2RlbCwgcHJvcE1ldGFkYXRhLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMsXG4gIFNlcXVlbmNlT3B0aW9ucyxcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQge1xuICBEQktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICByZWFkb25seSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBhcHBseSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IGluZGV4IH0gZnJvbSBcIi4uL21vZGVsL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHNlcXVlbmNlTmFtZUZvck1vZGVsIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5cbi8qKlxuICogQHN1bW1hcnkgUHJpbWFyeSBLZXkgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gTWFya3MgdGhlIHByb3BlcnR5IGFzIHRoZSB7QGxpbmsgTW9kZWx9cyBwcmltYXJ5IGtleS5cbiAqICBBbHNvIG1hcmtzIHRoZSBwcm9wZXJ0eSBhcyB7QGxpbmsgdW5pcXVlfSBhcyB7QHJlcXVpcmVkfSBhbmQgZW5zdXJlcyB0aGUgaW5kZXggaXMgY3JlYXRlZCBwcm9wZXJseSBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIHtAbGluayBTZXF1ZW5jZX1cbiAqXG4gKlxuICpcbiAqIEBmdW5jdGlvbiBwa1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6d2FsbGV0LWRiLkRlY29yYXRvcnNcbiAqXG4gKiBAc2VlIHVuaXF1ZVxuICogQHNlZSByZXF1aXJlZFxuICogQHNlZSBvblxuICogQHBhcmFtIGRhdGFcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBtb2RlbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGtPbkNyZWF0ZTxNIGV4dGVuZHMgTW9kZWwsIFYgZXh0ZW5kcyBSZXBvPE0+PihcbiAgdGhpczogVixcbiAgY29udGV4dDogQ29udGV4dDxNPixcbiAgZGF0YTogU2VxdWVuY2VPcHRpb25zLFxuICBrZXk6IHN0cmluZyxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWRhdGEudHlwZSB8fCAobW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldFByaW1hcnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG4gIGlmICghZGF0YS5uYW1lKSBkYXRhLm5hbWUgPSBzZXF1ZW5jZU5hbWVGb3JNb2RlbChtb2RlbCwgXCJwa1wiKTtcbiAgbGV0IHNlcXVlbmNlOiBTZXF1ZW5jZTtcbiAgdHJ5IHtcbiAgICBzZXF1ZW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShkYXRhKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGluc3RhbnRpYXRlIFNlcXVlbmNlICR7ZGF0YS5uYW1lfTogJHtlfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IGF3YWl0IHNlcXVlbmNlLm5leHQoKTtcbiAgc2V0UHJpbWFyeUtleVZhbHVlKG1vZGVsLCBrZXksIG5leHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGsoXG4gIG9wdHM6IE9taXQ8XG4gICAgU2VxdWVuY2VPcHRpb25zLFxuICAgIFwiY3ljbGVcIiB8IFwic3RhcnRXaXRoXCIgfCBcImluY3JlbWVudEJ5XCJcbiAgPiA9IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnNcbikge1xuICBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucywgb3B0cykgYXMgU2VxdWVuY2VPcHRpb25zO1xuICByZXR1cm4gYXBwbHkoXG4gICAgaW5kZXgoW09yZGVyRGlyZWN0aW9uLkFTQywgT3JkZXJEaXJlY3Rpb24uRFNDXSksXG4gICAgcmVxdWlyZWQoKSxcbiAgICByZWFkb25seSgpLFxuICAgIC8vIHR5cGUoW1N0cmluZy5uYW1lLCBOdW1iZXIubmFtZSwgQmlnSW50Lm5hbWVdKSxcbiAgICBwcm9wTWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKSwgb3B0cyBhcyBTZXF1ZW5jZU9wdGlvbnMpLFxuICAgIG9uQ3JlYXRlKHBrT25DcmVhdGUsIG9wdHMgYXMgU2VxdWVuY2VPcHRpb25zKVxuICApO1xufVxuIiwiaW1wb3J0IHsgREJPcGVyYXRpb25zLCB0aW1lc3RhbXAgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQXJnLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgQHRpbWVzdGFtcChEQk9wZXJhdGlvbnMuQ1JFQVRFKVxuICBjcmVhdGVkT24hOiBEYXRlO1xuICBAdGltZXN0YW1wKClcbiAgdXBkYXRlZE9uITogRGF0ZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYXJnPzogTW9kZWxBcmc8QmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGxpc3QsIG1vZGVsLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSb2xlcyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IHBrIH0gZnJvbSBcIi4uL2lkZW50aXR5L2RlY29yYXRvcnNcIjtcblxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBVc2VyIGV4dGVuZHMgTW9kZWwge1xuICBAcGsoKVxuICBpZCE6IHN0cmluZztcblxuICBAbGlzdChbU3RyaW5nXSlcbiAgcm9sZXM/OiAoc3RyaW5nIHwgUm9sZXMpW107XG5cbiAgQGxpc3QoW1N0cmluZ10pXG4gIGFmZmlsaWF0aW9ucz86IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPFVzZXI+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgcHJvcE1ldGFkYXRhLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbk1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFBlcnNpc3RlbmNlS2V5cy5DTEFVU0VfU0VRVUVOQ0UsIHtcbiAgdmFsdWU6IFwiSW52YWxpZCBjbGF1c2Ugc2VxdWVuY2U6IHswfVwiLFxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWYWxpZGF0aW9uS2V5cywgXCJDTEFVU0VfU0VRVUVOQ0VcIiwge1xuICB2YWx1ZTogUGVyc2lzdGVuY2VLZXlzLkNMQVVTRV9TRVFVRU5DRSxcbn0pO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdXG4gKlxuICogQGZ1bmN0aW9uIGNsYXVzZVNlcXVlbmNlXG4gKlxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqIEBzdWJjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGF1c2VTZXF1ZW5jZShtZXNzYWdlPzogc3RyaW5nKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCksXG4gICAge1xuICAgICAgbWVzc2FnZTpcbiAgICAgICAgbWVzc2FnZSB8fFxuICAgICAgICAoKERFRkFVTFRfRVJST1JfTUVTU0FHRVMgYXMgYW55KVtcbiAgICAgICAgICBQZXJzaXN0ZW5jZUtleXMuQ0xBVVNFX1NFUVVFTkNFIGFzIGFueVxuICAgICAgICBdIGFzIHN0cmluZyksXG4gICAgfVxuICApO1xufVxuIiwiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgc2YsXG4gIHZhbGlkYXRvcixcbiAgVmFsaWRhdG9yLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDbGF1c2UgfSBmcm9tIFwiLi4vcXVlcnkvQ2xhdXNlXCI7XG5pbXBvcnQgeyBNYW5kYXRvcnlQcmlvcml0aWVzIH0gZnJvbSBcIi4uL3F1ZXJ5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuLi9xdWVyeS9lcnJvcnNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSB7QGxpbmsgU2VxdWVuY2V9J3Mge0BsaW5rIENsYXVzZX1zXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXVxuICpcbiAqIEBjbGFzcyBDbGF1c2VTZXF1ZW5jZVZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqIEBzdWJjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoUGVyc2lzdGVuY2VLZXlzLkNMQVVTRV9TRVFVRU5DRSlcbmV4cG9ydCBjbGFzcyBDbGF1c2VTZXF1ZW5jZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVNbUGVyc2lzdGVuY2VLZXlzLkNMQVVTRV9TRVFVRU5DRV1cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlU2VxdWVuY2UoXG4gICAgY2xhdXNlczogQ2xhdXNlPGFueT5bXSxcbiAgICBtZXNzYWdlPzogc3RyaW5nXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIE1hbmRhdG9yeVByaW9yaXRpZXMuZXZlcnkoXG4gICAgICAocCkgPT4gISFjbGF1c2VzLmZpbmQoKGMpID0+IGMuZ2V0UHJpb3JpdHkoKSA9PT0gcClcbiAgICApXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgc2YobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIFwiTWlzc2luZyByZXF1aXJlZCBDbGF1c2UgUHJpb3JpdGllc1wiKVxuICAgICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZlcmlmaWVzIHRoZSBtb2RlbCBmb3IgZXJyb3JzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1ZhbGlkYXRvck9wdGlvbnN9IFtvcHRpb25zXVxuICAgKlxuICAgKiBAcmV0dXJuIEVycm9yc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3JcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnModmFsdWU6IGFueSwgb3B0aW9ucz86IFZhbGlkYXRvck9wdGlvbnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAoXG4gICAgICAgICF2YWx1ZSB8fFxuICAgICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcbiAgICAgICAgIXZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAhdmFsdWUuZXZlcnkoKGUpID0+IGUgaW5zdGFuY2VvZiBDbGF1c2UpXG4gICAgICApXG4gICAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgc2YoXG4gICAgICAgICAgICAob3B0aW9ucyB8fCB7fSkubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICAgICAgICBcIk5vIG9yIGludmFsaWQgQ2xhdXNlcyBmb3VuZFwiXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBjbGF1c2VzOiBDbGF1c2U8YW55PltdID0gdmFsdWUgYXMgQ2xhdXNlPGFueT5bXTtcblxuICAgICAgY29uc3QgY2xhdXNlRXJyb3JzID0gY2xhdXNlcy5yZWR1Y2UoXG4gICAgICAgIChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjOiBDbGF1c2U8YW55PikgPT4ge1xuICAgICAgICAgIGNvbnN0IGVycnMgPSBjLmhhc0Vycm9ycygpO1xuICAgICAgICAgIGlmIChlcnJzKVxuICAgICAgICAgICAgaWYgKGFjY3VtKVxuICAgICAgICAgICAgICBhY2N1bSArPSBzZihcbiAgICAgICAgICAgICAgICBcIlxcbkNsYXVzZSB7MH06IHsxfVwiLFxuICAgICAgICAgICAgICAgIGMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICAgICBlcnJzLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgYWNjdW0gPSBzZihcbiAgICAgICAgICAgICAgICBcIkNsYXVzZSB7MH06IHsxfVwiLFxuICAgICAgICAgICAgICAgIGMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICAgICBlcnJzLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcblxuICAgICAgaWYgKGNsYXVzZUVycm9ycylcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgICBzZigob3B0aW9ucyB8fCB7fSkubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIGNsYXVzZUVycm9ycy50b1N0cmluZygpKVxuICAgICAgICApO1xuXG4gICAgICBjb25zdCB2ZXJpZnlQcmlvcml0eSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJpb3JpdGllcyA9IGNsYXVzZXMubWFwKChjKSA9PiBjLmdldFByaW9yaXR5KCkpO1xuICAgICAgICBjb25zdCBhbGxVbmlxdWUgPSBuZXcgU2V0KHByaW9yaXRpZXMpLnNpemUgPT09IHByaW9yaXRpZXMubGVuZ3RoO1xuICAgICAgICBpZiAoIWFsbFVuaXF1ZSkgcmV0dXJuIFwiTm90IGFsbCBjbGF1c2VzICBoYXZlIHVuaXF1ZSBwcmlvcml0aWVzXCI7XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IHByaW9yaXRpZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIHJldHVybiBiIC0gYTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGlzRXF1YWwocHJpb3JpdGllcywgc29ydGVkKVxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogXCJDbGF1c2VzICBhcmUgbm90IHByb3Blcmx5IHNvcnRlZFwiO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcHJpb3JpdHlDaGVjayA9IHZlcmlmeVByaW9yaXR5KCk7XG4gICAgICBpZiAocHJpb3JpdHlDaGVjayAhPT0gdHJ1ZSlcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgICBzZigob3B0aW9ucyB8fCB7fSkubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIFwiSW52YWxpZCBwcmlvcml0aXphdGlvblwiKVxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBzZXF1ZW5jZUNoZWNrID0gdGhpcy52YWxpZGF0ZVNlcXVlbmNlKFxuICAgICAgICBjbGF1c2VzLFxuICAgICAgICAob3B0aW9ucyB8fCB7fSkubWVzc2FnZVxuICAgICAgKTtcbiAgICAgIGlmIChzZXF1ZW5jZUNoZWNrKVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICAgIHNmKChvcHRpb25zIHx8IHt9KS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgXCJJbnZhbGlkIHNlcXVlbmNlXCIpXG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgc2YoXCJGYWlsZWQgdG8gdmVyaWZ5IGNsYXVzZSBzZXF1ZW5jZSB7MH06IHsxfVwiLCB2YWx1ZSwgZSlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgbWlubGVuZ3RoLFxuICBNb2RlbCxcbiAgTW9kZWxFcnJvckRlZmluaXRpb24sXG4gIHJlcXVpcmVkLFxuICB0eXBlLFxuICBzZixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRXhlY3V0b3IsIFJhd0V4ZWN1dG9yIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IE1hbmRhdG9yeVByaW9yaXRpZXMsIFN0YXRlbWVudFR5cGUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IENsYXVzZSB9IGZyb20gXCIuL0NsYXVzZVwiO1xuaW1wb3J0IHsgY2xhdXNlU2VxdWVuY2UgfSBmcm9tIFwiLi4vdmFsaWRhdG9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXksIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhZ2luYXRvciB9IGZyb20gXCIuL1BhZ2luYXRvclwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFN0YXRlbWVudCBDbGFzc1xuICogQGRlc2NyaXB0aW9uIGhvbGRzIGFsbCB0aGUgY2xhdXNlcyB1bnRpbCB0aGV5IGNhbiBiZSBwcm9jZXNzZWRcbiAqXG4gKiBAcGFyYW0ge01vZGVsQXJnfSBbc3RhdGVtZW50XVxuICpcbiAqIEBjbGFzcyBTdGF0ZW1lbnRcbiAqIEBleHRlbmRzIE1vZGVsXG4gKiBAaW1wbGVtZW50cyBFeGVjdXRvclxuICogQGltcGxlbWVudHMgUmF3RXhlY3V0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0YXRlbWVudDxRPlxuICBleHRlbmRzIE1vZGVsXG4gIGltcGxlbWVudHMgRXhlY3V0b3IsIFJhd0V4ZWN1dG9yPFE+XG57XG4gIEByZXF1aXJlZCgpXG4gIEBtaW5sZW5ndGgoTWFuZGF0b3J5UHJpb3JpdGllcy5sZW5ndGgpXG4gIEBjbGF1c2VTZXF1ZW5jZSgpXG4gIHByb3RlY3RlZCBjbGF1c2VzPzogQ2xhdXNlPGFueT5bXSA9IHVuZGVmaW5lZDtcbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoW1wib2JqZWN0XCJdKVxuICBwcm90ZWN0ZWQgYWRhcHRlcjogQWRhcHRlcjxhbnksIFE+O1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgdGFyZ2V0PzogQ29uc3RydWN0b3I8YW55PiA9IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgZnVsbFJlY29yZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCB0eXBlPzogc3RyaW5nID0gdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihkYjogQWRhcHRlcjxhbnksIFE+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkYXB0ZXIgPSBkYjtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZCgpOiBRIHtcbiAgICBpZiAoIXRoaXMuY2xhdXNlcylcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKHNmKFwiRmFpbGVkIHRvIGJ1aWxkIFN0YXRlbWVudDpcXG57MH1cIiwgXCJObyBDbGF1c2VzXCIpKTtcbiAgICB0aGlzLmNsYXVzZXMuc29ydCgoYzEsIGMyKSA9PiB7XG4gICAgICByZXR1cm4gYzEuZ2V0UHJpb3JpdHkoKSAtIGMyLmdldFByaW9yaXR5KCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmhhc0Vycm9ycygpO1xuICAgIGlmIChlcnJvcnMpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgc2YoXCJQb29ybHkgYnVpbHQgc3RhdGVtZW50OiB7MH1cIiwgZXJyb3JzLnRvU3RyaW5nKCkpXG4gICAgICApO1xuXG4gICAgbGV0IHF1ZXJ5OiBRO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IGZ1bmN0aW9uIChcbiAgICAgICAgY2xhdXNlczogQ2xhdXNlPGFueT5bXSxcbiAgICAgICAgcHJldmlvdXM6IGFueSA9IHt9XG4gICAgICApOiBRIHtcbiAgICAgICAgY29uc3QgYyA9IGNsYXVzZXMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFjKSByZXR1cm4gcHJldmlvdXMgYXMgUTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGMuYnVpbGQocHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gaXRlcmF0b3IoY2xhdXNlcywgcmVzdWx0cyBhcyBhbnkpO1xuICAgICAgfTtcblxuICAgICAgcXVlcnkgPSBpdGVyYXRvcihuZXcgQXJyYXkoLi4uKHRoaXMuY2xhdXNlcyBhcyBDbGF1c2U8UT5bXSkpKSBhcyBRO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBhc3luYyBleGVjdXRlPFk+KCk6IFByb21pc2U8WT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeTogUSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIHJldHVybiB0aGlzLnJhdyhxdWVyeSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGFic3RyYWN0IHBhZ2luYXRlPFk+KHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPFksIFE+PjtcblxuICBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFEsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXc8Uj4ocmF3SW5wdXQsIHRydWUsIC4uLmFyZ3MpO1xuICAgIGlmICghdGhpcy5mdWxsUmVjb3JkKSByZXR1cm4gcmVzdWx0cztcbiAgICBpZiAoIXRoaXMudGFyZ2V0KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiTm8gdGFyZ2V0IGRlZmluZWQgaW4gc3RhdGVtZW50LiBzaG91bGQgbmV2ZXIgaGFwcGVuXCJcbiAgICAgICk7XG5cbiAgICBjb25zdCBwa0F0dHIgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy50YXJnZXQoKSBhcyBhbnkpLmlkO1xuXG4gICAgY29uc3QgcHJvY2Vzc29yID0gZnVuY3Rpb24gcmVjb3JkUHJvY2Vzc29yKHRoaXM6IFN0YXRlbWVudDxRPiwgcjogYW55KSB7XG4gICAgICBjb25zdCBpZCA9IHJbcGtBdHRyXTtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KFxuICAgICAgICByLFxuICAgICAgICB0aGlzLnRhcmdldCBhcyBDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgICAgICBwa0F0dHIsXG4gICAgICAgIGlkXG4gICAgICApIGFzIGFueTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkgcmV0dXJuIHJlc3VsdHMubWFwKHByb2Nlc3NvcikgYXMgUjtcbiAgICByZXR1cm4gcHJvY2Vzc29yKHJlc3VsdHMpIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGhhc0Vycm9ycyguLi5leGNlcHRpb25zOiBzdHJpbmdbXSk6IE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlcnJvcnMgPSBzdXBlci5oYXNFcnJvcnMoLi4uZXhjZXB0aW9ucyk7XG4gICAgaWYgKGVycm9ycykgcmV0dXJuIGVycm9ycztcblxuICAgIGZvciAoY29uc3QgaSBpbiB0aGlzLmNsYXVzZXMpIHtcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY2xhdXNlc1tpIGFzIGFueV0uaGFzRXJyb3JzKCk7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBBZGRzIGEgY2xhdXNlIHRvIHRoZSBTdGF0ZW1lbnRcbiAgICogQHBhcmFtIHtDbGF1c2V9IGNsYXVzZVxuICAgKi9cbiAgYWRkQ2xhdXNlKGNsYXVzZTogQ2xhdXNlPFE+KSB7XG4gICAgaWYgKCF0aGlzLmNsYXVzZXMpIHRoaXMuY2xhdXNlcyA9IFtdO1xuXG4gICAgY29uc3QgcHJpb3JpdHkgPSBjbGF1c2UuZ2V0UHJpb3JpdHkoKTtcbiAgICBjb25zdCBjdXJyZW50UHJpb3JpdHkgPSB0aGlzLmNsYXVzZXNcbiAgICAgIC5tYXAoKGMsIGkpID0+ICh7IGluZGV4OiBpLCBjbGF1c2U6IGMgfSkpXG4gICAgICAuZmluZCgoYykgPT4gYy5jbGF1c2UuZ2V0UHJpb3JpdHkoKSA9PT0gcHJpb3JpdHkpO1xuICAgIGlmIChjdXJyZW50UHJpb3JpdHkpIHtcbiAgICAgIHRoaXMuY2xhdXNlc1tjdXJyZW50UHJpb3JpdHkuaW5kZXhdID0gY2xhdXNlO1xuICAgIH1cbiAgICB0aGlzLmNsYXVzZXMucHVzaChjbGF1c2UpO1xuICB9XG5cbiAgZ2V0QWRhcHRlcigpOiBBZGFwdGVyPGFueSwgUT4ge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgb3V0cHV0IGNsYXNzICh3aGVuIGV4aXN0aW5nKVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBjbGF6elxuICAgKi9cbiAgc2V0VGFyZ2V0KGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+KSB7XG4gICAgaWYgKHRoaXMudGFyZ2V0KVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIHNmKFwiT3V0cHV0IGNsYXNzIGFscmVhZHkgZGVmaW5lZCB0byB7MH1cIiwgdGhpcy50YXJnZXQhLm5hbWUpXG4gICAgICApO1xuICAgIHRoaXMudGFyZ2V0ID0gY2xheno7XG4gIH1cblxuICBnZXRUYXJnZXQoKSB7XG4gICAgaWYgKCF0aGlzLnRhcmdldClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gdGFyZ2V0IGRlZmluZWQgZm9yIHN0YXRlbWVudFwiKTtcbiAgICByZXR1cm4gdGhpcy50YXJnZXQ7XG4gIH1cblxuICBzZXRGdWxsUmVjb3JkKCkge1xuICAgIHRoaXMuZnVsbFJlY29yZCA9IHRydWU7XG4gIH1cblxuICBzZXRNb2RlKHR5cGU6IFN0YXRlbWVudFR5cGUpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRvciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQge1xuICBNb2RlbCxcbiAgTW9kZWxBcmcsXG4gIHJlcXVpcmVkLFxuICB0eXBlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyeUVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBQcmlvcml0eSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIi4vU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBQYWdpbmF0YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1BhZ2luYXRhYmxlXCI7XG5pbXBvcnQgeyBQYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcblxuLyoqXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBDbGF1c2UgQ2xhc3NcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIGEgQ2xhdXNlIGluIGEge0BsaW5rIFN0YXRlbWVudH1cbiAqXG4gKiBAdHlwZWRlZiBRIFJlcHJlc2VudHMgcXVlIHF1ZXJ5IG9iamVjdCB0aGUgcGVyc2lzdGVuY2UgYWRhcHRlciB1c2VzXG4gKlxuICogQHBhcmFtIHtNb2RlbEFyZzxDbGF1c2U8UT4+fSBbY2xhdXNlXVxuICpcbiAqIEBjbGFzcyBDbGF1c2VcbiAqIEBleHRlbmRzIE1vZGVsXG4gKiBAaW1wbGVtZW50cyBFeGVjdXRvclxuICogQGltcGxlbWVudHMgUXVlcnlCdWlsZGVyXG4gKiBAYWJzdHJhY3RcbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqIEBzdWJjYXRlZ29yeSBDbGF1c2VzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDbGF1c2U8UT5cbiAgZXh0ZW5kcyBNb2RlbFxuICBpbXBsZW1lbnRzIEV4ZWN1dG9yLCBQYWdpbmF0YWJsZSwgUXVlcnlCdWlsZGVyPFE+XG57XG4gIEByZXF1aXJlZCgpXG4gIHJlYWRvbmx5IHByaW9yaXR5ITogUHJpb3JpdHk7XG5cbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoXCJvYmplY3RcIilcbiAgcmVhZG9ubHkgc3RhdGVtZW50ITogU3RhdGVtZW50PFE+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxDbGF1c2U8UT4+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnByaW9yaXR5ID0gY2xhdXNlPy5wcmlvcml0eTtcbiAgICB0aGlzLnN0YXRlbWVudCA9IGNsYXVzZT8uc3RhdGVtZW50O1xuICAgIGlmICghdGhpcy5zdGF0ZW1lbnQgfHwgIXRoaXMucHJpb3JpdHkpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgXCJNaXNzaW5nIHN0YXRlbWVudCBvciBwcmlvcml0eS4gU2hvdWxkIGJlIGltcG9zc2libGVcIlxuICAgICAgKTtcbiAgICB0aGlzLnN0YXRlbWVudC5hZGRDbGF1c2UodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50LmdldEFkYXB0ZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgQ2xhdXNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQuZ2V0QWRhcHRlcigpLkNsYXVzZXM7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmV0dXJuIHRoZSBwcmlvcml0eSBvZiB0aGUgY2xhdXNlXG4gICAqIEBzZWUgUHJpb3JpdHlcbiAgICovXG4gIGdldFByaW9yaXR5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucHJpb3JpdHkgYXMgbnVtYmVyO1xuICB9XG5cbiAgYWJzdHJhY3QgYnVpbGQocHJldmlvdXM6IFEpOiBRO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGU8Uj4oKTogUHJvbWlzZTxSPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50LmV4ZWN1dGUoKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhc3luYyBwYWdpbmF0ZTxSPihzaXplOiBudW1iZXIpOiBQcm9taXNlPFBhZ2luYXRvcjxSLCBRPj4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudC5wYWdpbmF0ZShzaXplKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICAvLyAvKipcbiAgLy8gICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIHtAbGluayBGcm9tQ2xhdXNlfVxuICAvLyAgKiBAcGFyYW0ge3twcmlvcml0eTogbnVtYmVyLCBzdGF0ZW1lbnQ6IFN0YXRlbWVudCwgZ2V0UHJpb3JpdHk6IEZ1bmN0aW9uLCBidWlsZDogRnVuY3Rpb24sIHByb2Nlc3M6IEZ1bmN0aW9ufX0gY2xhdXNlXG4gIC8vICAqL1xuICAvLyBzdGF0aWMgaXNDbGF1c2UoY2xhdXNlOiBQYXJ0aWFsPENsYXVzZTxhbnk+Pikge1xuICAvLyAgIHJldHVybiBjbGF1c2UgaW5zdGFuY2VvZiBDbGF1c2U7XG4gIC8vICAgcmV0dXJuIChcbiAgLy8gICAgIGNsYXVzZS5jb25zdHJ1Y3RvciAmJlxuICAvLyAgICAgY2xhdXNlLmNvbnN0cnVjdG9yLm5hbWUgJiZcbiAgLy8gICAgIGNsYXVzZS5wcmlvcml0eSAmJlxuICAvLyAgICAgY2xhdXNlLnN0YXRlbWVudCAmJlxuICAvLyAgICAgY2xhdXNlLmdldFByaW9yaXR5ICYmXG4gIC8vICAgICBjbGF1c2UuYnVpbGQgJiZcbiAgLy8gICAgIGNsYXVzZS5leGVjdXRlXG4gIC8vICAgKTtcbiAgLy8gfVxufVxuIiwiaW1wb3J0IHsgQ2xhdXNlIH0gZnJvbSBcIi4uL0NsYXVzZVwiO1xuaW1wb3J0IHsgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBiYXNlIFNlbGVjdG9yIGJhc2VkIGNsYXVzZVxuICpcbiAqIEBwYXJhbSB7Q2xhdXNlQXJnfSBbY2xhdXNlXVxuICpcbiAqIEBjbGFzcyBTZWxlY3RvckJhc2VkQ2xhdXNlXG4gKiBAZXh0ZW5kcyBDbGF1c2VcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBjYXRlZ29yeSBRdWVyeVxuICogQHN1YmNhdGVnb3J5IENsYXVzZXNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlbGVjdG9yQmFzZWRDbGF1c2U8USwgUz4gZXh0ZW5kcyBDbGF1c2U8UT4ge1xuICAvKipcbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAcHJvcCBzZWxlY3RvclxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgc2VsZWN0b3I/OiBTID0gdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxTZWxlY3RvckJhc2VkQ2xhdXNlPFEsIFM+Pikge1xuICAgIHN1cGVyKGNsYXVzZSk7XG4gICAgdGhpcy5zZWxlY3RvciA9IChjbGF1c2UgYXMgeyBzZWxlY3RvcjogUyB9KS5zZWxlY3RvcjtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyBgWyR7dGhpcy5zZWxlY3Rvcn1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJpb3JpdHkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBGcm9tU2VsZWN0b3IsXG4gIEdyb3VwQnlTZWxlY3RvcixcbiAgTGltaXRTZWxlY3RvcixcbiAgT2Zmc2V0U2VsZWN0b3IsXG4gIE9yZGVyQnlTZWxlY3Rvcixcbn0gZnJvbSBcIi4uL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHtcbiAgTGltaXRPcHRpb24sXG4gIE9mZnNldE9wdGlvbixcbiAgT3JkZXJBbmRHcm91cE9wdGlvbixcbiAgV2hlcmVPcHRpb24sXG59IGZyb20gXCIuLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBTZWxlY3RvckJhc2VkQ2xhdXNlIH0gZnJvbSBcIi4vU2VsZWN0b3JCYXNlZENsYXVzZVwiO1xuaW1wb3J0IHsgRXhlY3V0b3IgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9Db25kaXRpb25cIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxBcmcsXG4gIHN0cmluZ0Zvcm1hdCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBGUk9NIGNsYXVzZVxuICpcbiAqIEBwYXJhbSB7TW9kZWxBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIEZyb21DbGF1c2VcbiAqIEBleHRlbmRzIFNlbGVjdG9yQmFzZWRDbGF1c2VcbiAqIEBpbXBsZW1lbnRzIFdoZXJlT3B0aW9uXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKiBAc3ViY2F0ZWdvcnkgQ2xhdXNlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRnJvbUNsYXVzZTxRLCBNIGV4dGVuZHMgTW9kZWw+XG4gIGV4dGVuZHMgU2VsZWN0b3JCYXNlZENsYXVzZTxRLCBGcm9tU2VsZWN0b3I8TT4+XG4gIGltcGxlbWVudHMgV2hlcmVPcHRpb25cbntcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNsYXVzZT86IE1vZGVsQXJnPEZyb21DbGF1c2U8USwgTT4+KSB7XG4gICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7fSwgY2xhdXNlLCB7IHByaW9yaXR5OiBQcmlvcml0eS5GUk9NIH0pKTtcbiAgICB0aGlzLnNlbGVjdG9yID1cbiAgICAgIHR5cGVvZiB0aGlzLnNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gTW9kZWwuZ2V0KHRoaXMuc2VsZWN0b3IpXG4gICAgICAgIDogdGhpcy5zZWxlY3RvcjtcbiAgICBpZiAoIXRoaXMuc2VsZWN0b3IpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihzdHJpbmdGb3JtYXQoXCJDb3VsZCBub3QgZmluZCBzZWxlY3RvciBtb2RlbDogezB9XCIpKTtcbiAgICB0aGlzLnN0YXRlbWVudC5zZXRUYXJnZXQodGhpcy5zZWxlY3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGFic3RyYWN0IGJ1aWxkKHF1ZXJ5OiBRKTogUTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHdoZXJlKGNvbmRpdGlvbjogQ29uZGl0aW9uKTogT3JkZXJBbmRHcm91cE9wdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuQ2xhdXNlcy53aGVyZSh0aGlzLnN0YXRlbWVudCwgY29uZGl0aW9uKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG9yZGVyQnkoLi4uc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcltdKTogTGltaXRPcHRpb24gJiBPZmZzZXRPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMub3JkZXJCeSh0aGlzLnN0YXRlbWVudCwgc2VsZWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZ3JvdXBCeShzZWxlY3RvcjogR3JvdXBCeVNlbGVjdG9yKTogRXhlY3V0b3Ige1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMuZ3JvdXBCeSh0aGlzLnN0YXRlbWVudCwgc2VsZWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgbGltaXQoc2VsZWN0b3I6IExpbWl0U2VsZWN0b3IpOiBPZmZzZXRPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMubGltaXQodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG9mZnNldChzZWxlY3RvcjogT2Zmc2V0U2VsZWN0b3IpOiBFeGVjdXRvciB7XG4gICAgcmV0dXJuIHRoaXMuQ2xhdXNlcy5vZmZzZXQodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBHcm91cEJ5U2VsZWN0b3IgfSBmcm9tIFwiLi4vc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBQcmlvcml0eSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNlbGVjdG9yQmFzZWRDbGF1c2UgfSBmcm9tIFwiLi9TZWxlY3RvckJhc2VkQ2xhdXNlXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIEdST1VQIEJZIGNsYXVzZVxuICpcbiAqIEBwYXJhbSB7Q2xhdXNlQXJnfSBbY2xhdXNlXVxuICpcbiAqIEBjbGFzcyBHcm91cEJ5Q2xhdXNlXG4gKiBAZXh0ZW5kcyBTZWxlY3RvckJhc2VkQ2xhdXNlXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKiBAc3ViY2F0ZWdvcnkgQ2xhdXNlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR3JvdXBCeUNsYXVzZTxRPiBleHRlbmRzIFNlbGVjdG9yQmFzZWRDbGF1c2U8XG4gIFEsXG4gIEdyb3VwQnlTZWxlY3RvclxuPiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxHcm91cEJ5Q2xhdXNlPFE+Pikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGNsYXVzZSwgeyBwcmlvcml0eTogUHJpb3JpdHkuR1JPVVBfQlkgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xufVxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgSW5zZXJ0T3B0aW9uLCBJbnRvT3B0aW9uLCBPcmRlckFuZEdyb3VwT3B0aW9uIH0gZnJvbSBcIi4uL29wdGlvbnNcIjtcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2xhdXNlIH0gZnJvbSBcIi4uL0NsYXVzZVwiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbEFyZyxcbiAgcmVxdWlyZWQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEV4ZWN1dG9yIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgSU5TRVJUL0lOVE8gY2xhdXNlXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIEZyb21DbGF1c2VcbiAqIEBleHRlbmRzIENsYXVzZVxuICogQGltcGxlbWVudHMgSW50b09wdGlvblxuICpcbiAqIEBjYXRlZ29yeSBRdWVyeVxuICogQHN1YmNhdGVnb3J5IENsYXVzZXNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluc2VydENsYXVzZTxRLCBNIGV4dGVuZHMgTW9kZWw+XG4gIGV4dGVuZHMgQ2xhdXNlPFE+XG4gIGltcGxlbWVudHMgSW5zZXJ0T3B0aW9uPE0+LCBJbnRvT3B0aW9uPE0+XG57XG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCB0YWJsZT86IHN0cmluZyA9IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xhdXNlPzogTW9kZWxBcmc8SW5zZXJ0Q2xhdXNlPFEsIE0+Pikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGNsYXVzZSwgeyBwcmlvcml0eTogUHJpb3JpdHkuU0VMRUNUIH0pKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGFic3RyYWN0IGJ1aWxkKHF1ZXJ5OiBRKTogUTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGludG8odGFibGU6IENvbnN0cnVjdG9yPE0+KTogSW50b09wdGlvbjxNPiB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlLm5hbWU7IC8vIFRPRE8gZ2V0IG1hcHBlZCBuYW1lXG4gICAgdGhpcy5zdGF0ZW1lbnQuc2V0VGFyZ2V0KHRhYmxlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHZhbHVlcyguLi5tb2RlbHM6IE1bXSk6IEV4ZWN1dG9yIHtcbiAgICByZXR1cm4gdGhpcy5DbGF1c2VzLnZhbHVlcyh0aGlzLnN0YXRlbWVudCwgbW9kZWxzKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHdoZXJlKGNvbmRpdGlvbjogQ29uZGl0aW9uKTogT3JkZXJBbmRHcm91cE9wdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuQ2xhdXNlcy53aGVyZSh0aGlzLnN0YXRlbWVudCwgY29uZGl0aW9uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VsZWN0b3JCYXNlZENsYXVzZSB9IGZyb20gXCIuL1NlbGVjdG9yQmFzZWRDbGF1c2VcIjtcbmltcG9ydCB7IE9mZnNldE9wdGlvbiB9IGZyb20gXCIuLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBFeGVjdXRvciB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBMaW1pdFNlbGVjdG9yLCBPZmZzZXRTZWxlY3RvciB9IGZyb20gXCIuLi9zZWxlY3RvcnNcIjtcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTGltaXQgQ2xhdXNlXG4gKiBAZGVzY3JpcHRpb24gTGltaXRzIHRoZSByZXN1bHRzXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIExpbWl0Q2xhdXNlXG4gKiBAZXh0ZW5kcyBTZWxlY3RvckJhc2VkQ2xhdXNlPFQ+XG4gKiBAaW1wbGVtZW50cyBPZmZzZXRPcHRpb248VD5cbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqIEBzdWJjYXRlZ29yeSBDbGF1c2VzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMaW1pdENsYXVzZTxRPlxuICBleHRlbmRzIFNlbGVjdG9yQmFzZWRDbGF1c2U8USwgTGltaXRTZWxlY3Rvcj5cbiAgaW1wbGVtZW50cyBPZmZzZXRPcHRpb25cbntcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNsYXVzZT86IE1vZGVsQXJnPExpbWl0Q2xhdXNlPFE+Pikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGNsYXVzZSwgeyBwcmlvcml0eTogUHJpb3JpdHkuR1JPVVBfQlkgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG9mZnNldChzZWxlY3RvcjogT2Zmc2V0U2VsZWN0b3IpOiBFeGVjdXRvciB7XG4gICAgcmV0dXJuIHRoaXMuQ2xhdXNlcy5vZmZzZXQodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VsZWN0b3JCYXNlZENsYXVzZSB9IGZyb20gXCIuL1NlbGVjdG9yQmFzZWRDbGF1c2VcIjtcbmltcG9ydCB7IE9mZnNldFNlbGVjdG9yIH0gZnJvbSBcIi4uL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgUHJpb3JpdHkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgT0ZGU0VUIGNsYXVzZVxuICpcbiAqIEBwYXJhbSB7Q2xhdXNlQXJnfSBbY2xhdXNlXVxuICpcbiAqIEBjbGFzcyBGcm9tQ2xhdXNlXG4gKiBAZXh0ZW5kcyBTZWxlY3RvckJhc2VkQ2xhdXNlXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKiBAc3ViY2F0ZWdvcnkgQ2xhdXNlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgT2Zmc2V0Q2xhdXNlPFE+IGV4dGVuZHMgU2VsZWN0b3JCYXNlZENsYXVzZTxcbiAgUSxcbiAgT2Zmc2V0U2VsZWN0b3Jcbj4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xhdXNlPzogTW9kZWxBcmc8T2Zmc2V0Q2xhdXNlPFE+Pikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGNsYXVzZSwgeyBwcmlvcml0eTogUHJpb3JpdHkuR1JPVVBfQlkgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xufVxuIiwiaW1wb3J0IHsgU2VsZWN0b3JCYXNlZENsYXVzZSB9IGZyb20gXCIuL1NlbGVjdG9yQmFzZWRDbGF1c2VcIjtcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgR3JvdXBCeVNlbGVjdG9yLFxuICBMaW1pdFNlbGVjdG9yLFxuICBPZmZzZXRTZWxlY3RvcixcbiAgT3JkZXJCeVNlbGVjdG9yLFxufSBmcm9tIFwiLi4vc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBMaW1pdE9wdGlvbiwgT2Zmc2V0T3B0aW9uIH0gZnJvbSBcIi4uL29wdGlvbnNcIjtcbmltcG9ydCB7IEV4ZWN1dG9yIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IE1vZGVsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuLyoqXG4gKiBAc3VtbWFyeSBUaGUgT1JERVIgQlkgY2xhdXNlXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIE9yZGVyQnlDbGF1c2VcbiAqIEBleHRlbmRzIFNlbGVjdG9yQmFzZWRDbGF1c2VcbiAqIEBpbXBsZW1lbnRzIExpbWl0T3B0aW9uXG4gKiBAaW1wbGVtZW50cyBPZmZzZXRPcHRpb25cbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqIEBzdWJjYXRlZ29yeSBDbGF1c2VzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPcmRlckJ5Q2xhdXNlPFE+XG4gIGV4dGVuZHMgU2VsZWN0b3JCYXNlZENsYXVzZTxRLCBPcmRlckJ5U2VsZWN0b3JbXT5cbiAgaW1wbGVtZW50cyBMaW1pdE9wdGlvbiwgT2Zmc2V0T3B0aW9uXG57XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxPcmRlckJ5Q2xhdXNlPFE+Pikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGNsYXVzZSwgeyBwcmlvcml0eTogUHJpb3JpdHkuT1JERVJfQlkgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGdyb3VwQnkoc2VsZWN0b3I6IEdyb3VwQnlTZWxlY3Rvcik6IEV4ZWN1dG9yIHtcbiAgICByZXR1cm4gdGhpcy5DbGF1c2VzLmdyb3VwQnkodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGxpbWl0KHNlbGVjdG9yOiBMaW1pdFNlbGVjdG9yKTogT2Zmc2V0T3B0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5DbGF1c2VzLmxpbWl0KHRoaXMuc3RhdGVtZW50LCBzZWxlY3Rvcik7XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBvZmZzZXQoc2VsZWN0b3I6IE9mZnNldFNlbGVjdG9yKTogRXhlY3V0b3Ige1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMub2Zmc2V0KHRoaXMuc3RhdGVtZW50LCBzZWxlY3Rvcik7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNlbGVjdG9yQmFzZWRDbGF1c2UgfSBmcm9tIFwiLi9TZWxlY3RvckJhc2VkQ2xhdXNlXCI7XG5pbXBvcnQge1xuICBDb3VudE9wdGlvbixcbiAgRGlzdGluY3RPcHRpb24sXG4gIE1heE9wdGlvbixcbiAgTWluT3B0aW9uLFxuICBTZWxlY3RPcHRpb24sXG4gIFdoZXJlT3B0aW9uLFxufSBmcm9tIFwiLi4vb3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29uc3QsIFByaW9yaXR5LCBTdGF0ZW1lbnRUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsQXJnLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFNlbGVjdFNlbGVjdG9yIH0gZnJvbSBcIi4uL3NlbGVjdG9yc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBTRUxFQ1QgY2xhdXNlXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIFNlbGVjdENsYXVzZVxuICogQGV4dGVuZHMgU2VsZWN0b3JCYXNlZENsYXVzZVxuICogQGltcGxlbWVudHMgU2VsZWN0T3B0aW9uXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKiBAc3ViY2F0ZWdvcnkgQ2xhdXNlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2VsZWN0Q2xhdXNlPFEsIE0gZXh0ZW5kcyBNb2RlbD5cbiAgZXh0ZW5kcyBTZWxlY3RvckJhc2VkQ2xhdXNlPFEsIFNlbGVjdFNlbGVjdG9yPlxuICBpbXBsZW1lbnRzIFNlbGVjdE9wdGlvbjxNPlxue1xuICBwcml2YXRlIGlzRGlzdGluY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0NvdW50ID0gZmFsc2U7XG4gIHByaXZhdGUgaXNNYXggPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc01pbiA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxTZWxlY3RDbGF1c2U8USwgTT4+KSB7XG4gICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7fSwgY2xhdXNlLCB7IHByaW9yaXR5OiBQcmlvcml0eS5TRUxFQ1QgfSkpO1xuICAgIGlmICh0aGlzLnNlbGVjdG9yID09PSBDb25zdC5GVUxMX1JFQ09SRCkgdGhpcy5zdGF0ZW1lbnQuc2V0RnVsbFJlY29yZCgpO1xuICAgIHRoaXMuc3RhdGVtZW50LnNldE1vZGUoU3RhdGVtZW50VHlwZS5RVUVSWSk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBhYnN0cmFjdCBidWlsZChxdWVyeTogUSk6IFE7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZGlzdGluY3Qoc2VsZWN0b3I6IFNlbGVjdFNlbGVjdG9yKTogRGlzdGluY3RPcHRpb248TT4ge1xuICAgIHRoaXMuaXNEaXN0aW5jdCA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgY291bnQoc2VsZWN0b3I6IFNlbGVjdFNlbGVjdG9yKTogQ291bnRPcHRpb248TT4ge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG1pbihzZWxlY3RvcjogU2VsZWN0U2VsZWN0b3IpOiBNaW5PcHRpb248TT4ge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG1heChzZWxlY3RvcjogU2VsZWN0U2VsZWN0b3IpOiBNYXhPcHRpb248TT4ge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGZyb20odGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPik6IFdoZXJlT3B0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5DbGF1c2VzLmZyb20odGhpcy5zdGF0ZW1lbnQsIHRhYmxlTmFtZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENsYXVzZSB9IGZyb20gXCIuLi9DbGF1c2VcIjtcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWxBcmcsIHJlcXVpcmVkLCB0eXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBWQUxVRVMgY2xhdXNlXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIFZhbHVlc0NsYXVzZVxuICogQGV4dGVuZHMgQ2xhdXNlXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKiBAc3ViY2F0ZWdvcnkgQ2xhdXNlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVmFsdWVzQ2xhdXNlPFEsIE0+IGV4dGVuZHMgQ2xhdXNlPFE+IHtcbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoQXJyYXkubmFtZSlcbiAgbW9kZWxzPzogTVtdID0gdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxWYWx1ZXNDbGF1c2U8USwgTT4+KSB7XG4gICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7fSwgY2xhdXNlLCB7IHByaW9yaXR5OiBQcmlvcml0eS5GUk9NIH0pKTtcbiAgICB0aGlzLm1vZGVscyA9IGNsYXVzZT8ubW9kZWxzO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xufVxuIiwiaW1wb3J0IHsgQ2xhdXNlIH0gZnJvbSBcIi4uL0NsYXVzZVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL0NvbmRpdGlvblwiO1xuaW1wb3J0IHtcbiAgTW9kZWxBcmcsXG4gIE1vZGVsRXJyb3JEZWZpbml0aW9uLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTGltaXRPcHRpb24sIE9mZnNldE9wdGlvbiwgT3JkZXJBbmRHcm91cE9wdGlvbiB9IGZyb20gXCIuLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBQcmlvcml0eSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEdyb3VwQnlTZWxlY3RvcixcbiAgTGltaXRTZWxlY3RvcixcbiAgT2Zmc2V0U2VsZWN0b3IsXG4gIE9yZGVyQnlTZWxlY3Rvcixcbn0gZnJvbSBcIi4uL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgRXhlY3V0b3IgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xuLyoqXG4gKiBAc3VtbWFyeSBUaGUgV0hFUkUgY2xhdXNlXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIFdoZXJlQ2xhdXNlXG4gKiBAZXh0ZW5kcyBDbGF1c2VcbiAqIEBpbXBsZW1lbnRzIE9yZGVyQW5kR3JvdXBPcHRpb25cbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqIEBzdWJjYXRlZ29yeSBDbGF1c2VzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXaGVyZUNsYXVzZTxRPlxuICBleHRlbmRzIENsYXVzZTxRPlxuICBpbXBsZW1lbnRzIE9yZGVyQW5kR3JvdXBPcHRpb25cbntcbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoXCJDb25kaXRpb25cIilcbiAgY29uZGl0aW9uPzogQ29uZGl0aW9uID0gdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxXaGVyZUNsYXVzZTxRPj4pIHtcbiAgICBzdXBlcihPYmplY3QuYXNzaWduKHt9LCBjbGF1c2UsIHsgcHJpb3JpdHk6IFByaW9yaXR5LldIRVJFIH0pKTtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IGNsYXVzZT8uY29uZGl0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG9yZGVyQnkoLi4uc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcltdKTogTGltaXRPcHRpb24gJiBPZmZzZXRPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMub3JkZXJCeSh0aGlzLnN0YXRlbWVudCwgc2VsZWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZ3JvdXBCeShzZWxlY3RvcjogR3JvdXBCeVNlbGVjdG9yKTogRXhlY3V0b3Ige1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMuZ3JvdXBCeSh0aGlzLnN0YXRlbWVudCwgc2VsZWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgbGltaXQoc2VsZWN0b3I6IExpbWl0U2VsZWN0b3IpOiBPZmZzZXRPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMubGltaXQodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG9mZnNldChzZWxlY3RvcjogT2Zmc2V0U2VsZWN0b3IpOiBFeGVjdXRvciB7XG4gICAgcmV0dXJuIHRoaXMuQ2xhdXNlcy5vZmZzZXQodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgaGFzRXJyb3JzKC4uLmV4Y2VwdGlvbnM6IHN0cmluZ1tdKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHN1cGVyLmhhc0Vycm9ycyguLi5leGNlcHRpb25zKTtcbiAgICBpZiAoZXJyb3JzKSByZXR1cm4gZXJyb3JzO1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbiEuaGFzRXJyb3JzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZyb21DbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzXCI7XG5pbXBvcnQgeyBHcm91cEJ5Q2xhdXNlIH0gZnJvbSBcIi4vY2xhdXNlcy9Hcm91cEJ5Q2xhdXNlXCI7XG5pbXBvcnQgeyBJbnNlcnRDbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzL0luc2VydENsYXVzZVwiO1xuaW1wb3J0IHsgTGltaXRDbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzL0xpbWl0Q2xhdXNlXCI7XG5pbXBvcnQgeyBPZmZzZXRDbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzL09mZnNldENsYXVzZVwiO1xuaW1wb3J0IHsgT3JkZXJCeUNsYXVzZSB9IGZyb20gXCIuL2NsYXVzZXMvT3JkZXJCeUNsYXVzZVwiO1xuaW1wb3J0IHsgU2VsZWN0Q2xhdXNlIH0gZnJvbSBcIi4vY2xhdXNlcy9TZWxlY3RDbGF1c2VcIjtcbmltcG9ydCB7IFZhbHVlc0NsYXVzZSB9IGZyb20gXCIuL2NsYXVzZXMvVmFsdWVzQ2xhdXNlXCI7XG5pbXBvcnQgeyBXaGVyZUNsYXVzZSB9IGZyb20gXCIuL2NsYXVzZXMvV2hlcmVDbGF1c2VcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL0NvbmRpdGlvblwiO1xuaW1wb3J0IHtcbiAgRnJvbVNlbGVjdG9yLFxuICBHcm91cEJ5U2VsZWN0b3IsXG4gIExpbWl0U2VsZWN0b3IsXG4gIE9mZnNldFNlbGVjdG9yLFxuICBPcmRlckJ5U2VsZWN0b3IsXG4gIFNlbGVjdFNlbGVjdG9yLFxufSBmcm9tIFwiLi9zZWxlY3RvcnNcIjtcbmltcG9ydCB7IFN0YXRlbWVudCB9IGZyb20gXCIuL1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDbGF1c2VGYWN0b3J5PFksIFE+IHtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIGZvciB7QGxpbmsgRnJvbUNsYXVzZX1cbiAgICogQHBhcmFtIHtTdGF0ZW1lbnR9IHN0YXRlbWVudFxuICAgKiBAcGFyYW0ge0Zyb21TZWxlY3Rvcn0gc2VsZWN0b3JcbiAgICovXG4gIGFic3RyYWN0IGZyb208TSBleHRlbmRzIE1vZGVsPihcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxRPixcbiAgICBzZWxlY3RvcjogRnJvbVNlbGVjdG9yPE0+XG4gICk6IEZyb21DbGF1c2U8USwgTT47XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCBmb3Ige0BsaW5rIEdyb3VwQnlDbGF1c2V9XG4gICAqIEBwYXJhbSB7U3RhdGVtZW50fSBzdGF0ZW1lbnRcbiAgICogQHBhcmFtIHtHcm91cEJ5U2VsZWN0b3J9IHNlbGVjdG9yXG4gICAqL1xuICBhYnN0cmFjdCBncm91cEJ5KFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PFE+LFxuICAgIHNlbGVjdG9yOiBHcm91cEJ5U2VsZWN0b3JcbiAgKTogR3JvdXBCeUNsYXVzZTxRPjtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIGZvciB7QGxpbmsgSW5zZXJ0Q2xhdXNlfVxuICAgKiBAcGFyYW0ge1N0YXRlbWVudH0gc3RhdGVtZW50XG4gICAqL1xuICBhYnN0cmFjdCBpbnNlcnQ8TSBleHRlbmRzIE1vZGVsPigpOiBJbnNlcnRDbGF1c2U8USwgTT47XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCBmb3Ige0BsaW5rIExpbWl0Q2xhdXNlfVxuICAgKiBAcGFyYW0ge1N0YXRlbWVudH0gc3RhdGVtZW50XG4gICAqIEBwYXJhbSB7TGltaXRTZWxlY3Rvcn0gc2VsZWN0b3JcbiAgICovXG4gIGFic3RyYWN0IGxpbWl0KFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PFE+LFxuICAgIHNlbGVjdG9yOiBMaW1pdFNlbGVjdG9yXG4gICk6IExpbWl0Q2xhdXNlPFE+O1xuICAvKipcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIHtAbGluayBPZmZzZXRDbGF1c2V9XG4gICAqIEBwYXJhbSB7U3RhdGVtZW50fSBzdGF0ZW1lbnRcbiAgICogQHBhcmFtIHtPZmZzZXRTZWxlY3Rvcn0gc2VsZWN0b3JcbiAgICovXG4gIGFic3RyYWN0IG9mZnNldChcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxRPixcbiAgICBzZWxlY3RvcjogT2Zmc2V0U2VsZWN0b3JcbiAgKTogT2Zmc2V0Q2xhdXNlPFE+O1xuICAvKipcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIHtAbGluayBPcmRlckJ5Q2xhdXNlfVxuICAgKiBAcGFyYW0ge1N0YXRlbWVudH0gc3RhdGVtZW50XG4gICAqIEBwYXJhbSB7T3JkZXJCeVNlbGVjdG9yfSBzZWxlY3RvclxuICAgKi9cbiAgYWJzdHJhY3Qgb3JkZXJCeShcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxRPixcbiAgICBzZWxlY3RvcjogT3JkZXJCeVNlbGVjdG9yW11cbiAgKTogT3JkZXJCeUNsYXVzZTxRPjtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIGZvciB7QGxpbmsgU2VsZWN0Q2xhdXNlfVxuICAgKiBAcGFyYW0ge1N0YXRlbWVudH0gc3RhdGVtZW50XG4gICAqIEBwYXJhbSB7U2VsZWN0U2VsZWN0b3J9IFtzZWxlY3Rvcl1cbiAgICovXG4gIGFic3RyYWN0IHNlbGVjdDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3JcbiAgKTogU2VsZWN0Q2xhdXNlPFEsIE0+O1xuICAvKipcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIHtAbGluayBWYWx1ZXNDbGF1c2V9XG4gICAqIEBwYXJhbSB7U3RhdGVtZW50fSBzdGF0ZW1lbnRcbiAgICogQHBhcmFtIHtNW119IHZhbHVlc1xuICAgKi9cbiAgYWJzdHJhY3QgdmFsdWVzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgc3RhdGVtZW50OiBTdGF0ZW1lbnQ8UT4sXG4gICAgdmFsdWVzOiBNW11cbiAgKTogVmFsdWVzQ2xhdXNlPFEsIE0+O1xuICAvKipcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIHtAbGluayBXaGVyZUNsYXVzZX1cbiAgICogQHBhcmFtIHtTdGF0ZW1lbnR9IHN0YXRlbWVudFxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbn0gY29uZGl0aW9uXG4gICAqL1xuICBhYnN0cmFjdCB3aGVyZShzdGF0ZW1lbnQ6IFN0YXRlbWVudDxRPiwgY29uZGl0aW9uOiBDb25kaXRpb24pOiBXaGVyZUNsYXVzZTxRPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIGFkYXB0ZXI6IEFkYXB0ZXI8WSwgUT4pIHt9XG59XG4iLCJpbXBvcnQgeyBQYWdpbmdFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIi4vU3RhdGVtZW50XCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYWdpbmF0b3I8ViwgUT4ge1xuICBwcm90ZWN0ZWQgX2N1cnJlbnRQYWdlITogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3RvdGFsUGFnZXMhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfcmVjb3JkQ291bnQhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBsaW1pdCE6IG51bWJlcjtcblxuICBwcml2YXRlIF9zdGF0ZW1lbnQ/OiBRO1xuXG4gIGdldCBjdXJyZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UGFnZTtcbiAgfVxuXG4gIGdldCB0b3RhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxQYWdlcztcbiAgfVxuXG4gIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yZWNvcmRDb3VudDtcbiAgfVxuXG4gIGdldCBzdGF0ZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9zdGF0ZW1lbnQpIHRoaXMuX3N0YXRlbWVudCA9IHRoaXMucHJlcGFyZSh0aGlzLl9yYXdTdGF0ZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdC5nZXRBZGFwdGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHN0YXQ6IFN0YXRlbWVudDxRPixcbiAgICByZWFkb25seSBzaXplOiBudW1iZXIsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9yYXdTdGF0ZW1lbnQ6IFFcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwcmVwYXJlKHJhd1N0YXRlbWVudDogUSk6IFE7XG5cbiAgYXN5bmMgbmV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlKHRoaXMuY3VycmVudCArIDEpO1xuICB9XG5cbiAgYXN5bmMgcHJldmlvdXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFnZSh0aGlzLmN1cnJlbnQgLSAxKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgaWYgKHBhZ2UgPCAxIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UpKVxuICAgICAgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFxuICAgICAgICBcInBhZ2UgbnVtYmVyIGNhbm5vdCBiZSB1bmRlciAxIGFuZCBtdXN0IGJlIGFuIGludGVnZXJcIlxuICAgICAgKTtcbiAgICBpZiAocGFnZSA+IHRoaXMuX3RvdGFsUGFnZXMpXG4gICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXG4gICAgICAgIFwicGFnZSBudW1iZXIgY2Fubm90IGJlIHVuZGVyIDEgYW5kIG11c3QgYmUgYW4gaW50ZWdlclwiXG4gICAgICApO1xuICB9XG5cbiAgYWJzdHJhY3QgcGFnZShwYWdlPzogbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VltdPjtcbn1cbiIsImltcG9ydCB7IEluamVjdGFibGVzUmVnaXN0cnkgfSBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTW9kdWxlIHN1bW1hcnlcbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUgZGVzY3JpcHRpb25cbiAqIEBtb2R1bGUgdHMtd29ya3NwYWNlXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBOYW1lc3BhY2Ugc3VtbWFyeVxuICogQGRlc2NyaXB0aW9uIE5hbWVzcGFjZSBkZXNjcmlwdGlvblxuICogQG5hbWVzcGFjZSBOYW1lc3BhY2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dHMtd29ya3NwYWNlXG4gKi9cblxuZXhwb3J0ICogZnJvbSBcIi4vaWRlbnRpdHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wZXJzaXN0ZW5jZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcXVlcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRvcnNcIjtcblxuSW5qZWN0YWJsZXMuc2V0UmVnaXN0cnkobmV3IEluamVjdGFibGVzUmVnaXN0cnkoKSk7XG5cbi8qKlxuICogQHN1bW1hcnkgc3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQGRlc2NyaXB0aW9uIHRoaXMgaXMgaG93IHlvdSBzaG91bGQgZG9jdW1lbnQgYSBjb25zdGFudFxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6dHMtd29ya3NwYWNlXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIk9yZGVyRGlyZWN0aW9uIiwiQ2FzY2FkZSIsIkN0eCIsIlBlcnNpc3RlbmNlS2V5cyIsIlJvbGVzIiwiT3BlcmF0b3IiLCJHcm91cE9wZXJhdG9yIiwiQ29uc3QiLCJQcmlvcml0eSIsIlN0YXRlbWVudFR5cGUiLCJCYXNlRXJyb3IiLCJJbnRlcm5hbEVycm9yIiwiTW9kZWwiLCJOb3RGb3VuZEVycm9yIiwiREJLZXlzIiwiYXBwbHkiLCJtZXRhZGF0YSIsIlJlcCIsIndyYXBNZXRob2RXaXRoQ29udGV4dCIsIk9wZXJhdGlvbktleXMiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiVmFsaWRhdGlvbkVycm9yIiwiZmluZFByaW1hcnlLZXkiLCJSZWZsZWN0aW9uIiwiaW5qZWN0IiwiaW5qZWN0YWJsZSIsInNmIiwiSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIiwiSW5qZWN0YWJsZXMiLCJyZXF1aXJlZCIsIlZhbGlkYXRpb24iLCJWYWxpZGF0aW9uS2V5cyIsInByb3BNZXRhZGF0YSIsIkNvbmZsaWN0RXJyb3IiLCJvbkNyZWF0ZVVwZGF0ZSIsIm9uQ3JlYXRlIiwicG9wdWxhdGUiLCJwcm9wIiwidHlwZSIsIm9uVXBkYXRlIiwib25EZWxldGUiLCJhZnRlckFueSIsInBvcCIsImxpc3QiLCJyZWFkb25seSIsInRpbWVzdGFtcCIsIkRCT3BlcmF0aW9ucyIsIlVzZXIiLCJtb2RlbCIsIkRFRkFVTFRfRVJST1JfTUVTU0FHRVMiLCJDbGF1c2VTZXF1ZW5jZVZhbGlkYXRvciIsIlZhbGlkYXRvciIsImlzRXF1YWwiLCJ2YWxpZGF0b3IiLCJtaW5sZW5ndGgiLCJzdHJpbmdGb3JtYXQiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUVBOzs7Ozs7SUFNRztBQUNTQTtJQUFaLENBQUEsVUFBWSxjQUFjLEVBQUE7SUFDeEI7OztJQUdHO0lBQ0gsSUFBQSxjQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsS0FBVztJQUNY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
2372
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXBvc2l0b3J5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3F1ZXJ5L1F1ZXJ5LnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL0FkYXB0ZXIudHMiLCIuLi9zcmMvaWRlbnRpdHkvdXRpbHMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvU2VxdWVuY2UudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L1JlcG9zaXRvcnkudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvZXJyb3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvdXRpbHMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9pbmplY3RhYmxlcy50cyIsIi4uL3NyYy9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9ucy50cyIsIi4uL3NyYy9xdWVyeS9lcnJvcnMudHMiLCIuLi9zcmMvcXVlcnkvQ29uZGl0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9lcnJvcnMudHMiLCIuLi9zcmMvbW9kZWwvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pZGVudGl0eS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL21vZGVsL0Jhc2VNb2RlbC50cyIsIi4uL3NyYy92YWxpZGF0b3JzL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvdmFsaWRhdG9ycy9DbGF1c2VTZXF1ZW5jZVZhbGlkYXRvci50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvcXVlcnkvQ2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L2NsYXVzZXMvU2VsZWN0b3JCYXNlZENsYXVzZS50cyIsIi4uL3NyYy9xdWVyeS9jbGF1c2VzL0Zyb21DbGF1c2UudHMiLCIuLi9zcmMvcXVlcnkvY2xhdXNlcy9Hcm91cEJ5Q2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L2NsYXVzZXMvSW5zZXJ0Q2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L2NsYXVzZXMvTGltaXRDbGF1c2UudHMiLCIuLi9zcmMvcXVlcnkvY2xhdXNlcy9PZmZzZXRDbGF1c2UudHMiLCIuLi9zcmMvcXVlcnkvY2xhdXNlcy9PcmRlckJ5Q2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L2NsYXVzZXMvU2VsZWN0Q2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L2NsYXVzZXMvVmFsdWVzQ2xhdXNlLnRzIiwiLi4vc3JjL3F1ZXJ5L2NsYXVzZXMvV2hlcmVDbGF1c2UudHMiLCIuLi9zcmMvcXVlcnkvQ2xhdXNlRmFjdG9yeS50cyIsIi4uL3NyYy9xdWVyeS9QYWdpbmF0b3IudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FzY2FkZU1ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBkZWZpbmVzIG9yZGVyIGRpcmVjdGlvbnMgd2hlbiBzb3J0aW5nXG4gKlxuICogQGNvbnN0YW50IE9yZGVyRGlyZWN0aW9uXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKi9cbmV4cG9ydCBlbnVtIE9yZGVyRGlyZWN0aW9uIHtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHNvcnQgb3JkZXIgYXMgYXNjZW5kaW5nXG4gICAqIEBwcm9wIEFTQ1xuICAgKi9cbiAgQVNDID0gXCJhc2NcIixcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHNvcnQgb3JkZXIgYXMgZGVzY2VuZGluZ1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gRFNDXG4gICAqL1xuICBEU0MgPSBcImRlc2NcIixcbn1cblxuZXhwb3J0IGVudW0gQ2FzY2FkZSB7XG4gIENBU0NBREUgPSBcImNhc2NhZGVcIixcbiAgTk9ORSA9IFwibm9uZVwiLFxufVxuXG5leHBvcnQgY29uc3QgRGVmYXVsdENhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5OT05FLFxufTtcbiIsImV4cG9ydCBlbnVtIFBlcnNpc3RlbmNlS2V5cyB7XG4gIElOREVYID0gXCJpbmRleFwiLFxuICBVTklRVUUgPSBcInVuaXF1ZVwiLFxuICBBREFQVEVSID0gXCJhZGFwdGVyXCIsXG4gIElOSkVDVEFCTEUgPSBcImRlY2FmX3swfV9hZGFwdGVyX2Zvcl97MX1cIixcbiAgVEFCTEUgPSBcInRhYmxlXCIsXG4gIENPTFVNTiA9IFwiY29sdW1uXCIsXG4gIE1FVEFEQVRBID0gXCJfX21ldGFkYXRhXCIsXG4gIFJFTEFUSU9OUyA9IFwiX19yZWxhdGlvbnNcIixcbiAgQ0xBVVNFX1NFUVVFTkNFID0gXCJjbGF1c2Utc2VxdWVuY2VcIixcbiAgLy8gT3duZXJzaGlwXG4gIENSRUFURURfQlkgPSBcIm93bmVyc2hpcC5jcmVhdGVkLWJ5XCIsXG4gIFVQREFURURfQlkgPSBcIm93bmVyc2hpcC51cGRhdGVkLWJ5XCIsXG4gIC8vIFJlbGF0aW9uc1xuICBPTkVfVE9fT05FID0gXCJyZWxhdGlvbnMub25lLXRvLW9uZVwiLFxuICBPTkVfVE9fTUFOWSA9IFwicmVsYXRpb25zLm9uZS10by1tYW55XCIsXG4gIE1BTllfVE9fT05FID0gXCJyZWxhdGlvbnMubWFueS10by1vbmVcIixcbiAgUE9QVUxBVEUgPSBcInBvcHVsYXRlXCIsXG59XG5cbmV4cG9ydCBlbnVtIFJvbGVzIHtcbiAgQURNSU4gPSBcImFkbWluXCIsXG4gIFdSSVRFUiA9IFwid3JpdGVyXCIsXG4gIFJFQURFUiA9IFwicmVhZGVyXCIsXG59XG4iLCJleHBvcnQgZW51bSBPcGVyYXRvciB7XG4gIEVRVUFMID0gXCJFUVVBTFwiLFxuICBESUZGRVJFTlQgPSBcIkRJRkZFUkVOVFwiLFxuICBCSUdHRVIgPSBcIkJJR0dFUlwiLFxuICBCSUdHRVJfRVEgPSBcIkJJR0dFUl9FUVwiLFxuICBTTUFMTEVSID0gXCJTTUFMTEVSXCIsXG4gIFNNQUxMRVJfRVEgPSBcIlNNQUxMRVJfRVFcIixcbiAgLy8gQkVUV0VFTiA9IFwiQkVUV0VFTlwiLFxuICBOT1QgPSBcIk5PVFwiLFxuICBJTiA9IFwiSU5cIixcbiAgLy8gSVMgPSBcIklTXCIsXG4gIFJFR0VYUCA9IFwiUkVHRVhQXCIsXG59XG5cbmV4cG9ydCBlbnVtIEdyb3VwT3BlcmF0b3Ige1xuICBBTkQgPSBcIkFORFwiLFxuICBPUiA9IFwiT1JcIixcbn1cblxuZXhwb3J0IGVudW0gQ29uc3Qge1xuICBOVUxMID0gXCJOVUxMXCIsXG4gIEZVTExfUkVDT1JEID0gXCIqXCIsXG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBleGVjdXRpb24gb3JkZXIgb2YgQ2xhdXNlcyBpbiBzdGF0ZW1lbnRzIGFzIGRlZmluZWQgaW4gU1FMLlxuICpcbiAqIEBkZXNjcmlwdGlvbiBzdWIgcHJpb3JpdGllcyB3aGVyZSBkZWZpbmVkIHRvIGJldHRlciBvcmdhbml6ZSBjbGF1c2VzIHdpdGhpbiBzdGF0ZW1lbnRzLCBlZyBGcm9tIGFuZCBKb2luIENsYXVzZXNcbiAqXG4gKiBAY29uc3QgUHJpb3JpdHlcbiAqXG4gKiBAY2F0ZWdvcnkgQ2xhdXNlc1xuICogQHN1YmNhdGVnb3J5IENvbnN0YW50c1xuICovXG5leHBvcnQgZW51bSBQcmlvcml0eSB7XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBwcmlvcml0eSBmb3IgdGhlIEZST00gQ2xhdXNlXG4gICAqIEBkZXNjcmlwdGlvbiBGcm9tIENsYXVzZSBpbiBTRUxFQ1QgU3RhdGVtZW50cy5cbiAgICogVmFsdWVzIENsYXVzZSBpbiBJTlNFUlQgU3RhdGVtZW50c1xuICAgKlxuICAgKiBAcHJvcCBGUk9NXG4gICAqL1xuICBGUk9NID0gMSxcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByaW9yaXR5IGZvciB0aGUgSk9JTiBDbGF1c2VcbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IEpPSU5cbiAgICovXG4gIEpPSU4gPSAxLjEsXG4gIC8qKlxuICAgKiBXaGVyZSBDbGF1c2VcbiAgICovXG4gIFdIRVJFID0gMixcbiAgLyoqXG4gICAqIEdyb3VwIEJ5IENsYXVzZVxuICAgKi9cbiAgR1JPVVBfQlkgPSAzLFxuICAvKipcbiAgICogSGF2aW5nIENsYXVzZVxuICAgKi9cbiAgSEFWSU5HID0gNCxcbiAgLyoqXG4gICAqIFNlbGVjdCBDbGF1c2UgaW4gU0VMRUNUIFN0YXRlbWVudHNcbiAgICogSW5zZXJ0IENsYXVzZSBpbiBJTlNFUlQgU3RhdGVtZW50c1xuICAgKi9cbiAgU0VMRUNUID0gNSxcbiAgLyoqXG4gICAqIE9yZGVyIEJ5IENsYXVzZVxuICAgKi9cbiAgT1JERVJfQlkgPSA2LFxuICAvKipcbiAgICogTGltaXQgQ2xhdXNlXG4gICAqL1xuICBMSU1JVCA9IDcsXG4gIC8qKlxuICAgKiBPZmZzZXQgQ2xhdXNlXG4gICAqL1xuICBPRkZTRVQgPSA3LjEsXG59XG5cbmV4cG9ydCBjb25zdCBNYW5kYXRvcnlQcmlvcml0aWVzID0gW1ByaW9yaXR5LkZST00sIFByaW9yaXR5LlNFTEVDVF07XG5cbmV4cG9ydCBlbnVtIFN0YXRlbWVudFR5cGUge1xuICBRVUVSWSA9IFwicXVlcnlcIixcbiAgVFJBTlNBQ1RJT04gPSBcInRyYW5zYWN0aW9uXCIsXG59XG4iLCJpbXBvcnQge1xuICBDb3VudE9wdGlvbixcbiAgRGlzdGluY3RPcHRpb24sXG4gIEluc2VydE9wdGlvbixcbiAgTWF4T3B0aW9uLFxuICBNaW5PcHRpb24sXG4gIFNlbGVjdE9wdGlvbixcbn0gZnJvbSBcIi4vb3B0aW9uc1wiO1xuaW1wb3J0IHsgU2VsZWN0U2VsZWN0b3IgfSBmcm9tIFwiLi9zZWxlY3RvcnNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IENvbnN0IH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIZWxwZXIgQ2xhc3MgdG8gYnVpbGQgcXVlcmllc1xuICpcbiAqIEBwYXJhbSB7RGF0YWJhc2V9IGRiXG4gKlxuICogQGNsYXNzIFF1ZXJ5XG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVyeTxRLCBNIGV4dGVuZHMgTW9kZWw+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhZGFwdGVyOiBBZGFwdGVyPGFueSwgUSwgYW55LCBhbnk+KSB7fVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgU2VsZWN0IENsYXVzZVxuICAgKiBAcGFyYW0ge1NlbGVjdFNlbGVjdG9yfSBbc2VsZWN0b3JdXG4gICAqL1xuICBzZWxlY3Qoc2VsZWN0b3I6IFNlbGVjdFNlbGVjdG9yID0gQ29uc3QuRlVMTF9SRUNPUkQpOiBTZWxlY3RPcHRpb248TT4ge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuQ2xhdXNlcy5zZWxlY3Q8TT4oc2VsZWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgTWluIENsYXVzZVxuICAgKiBAcGFyYW0ge1NlbGVjdFNlbGVjdG9yfSBzZWxlY3RvclxuICAgKi9cbiAgbWluKHNlbGVjdG9yOiBTZWxlY3RTZWxlY3Rvcik6IE1pbk9wdGlvbjxNPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0KCkubWluKHNlbGVjdG9yKTtcbiAgfVxuICAvKipcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIE1heCBDbGF1c2VcbiAgICogQHBhcmFtIHtTZWxlY3RTZWxlY3Rvcn0gc2VsZWN0b3JcbiAgICovXG4gIG1heChzZWxlY3RvcjogU2VsZWN0U2VsZWN0b3IpOiBNYXhPcHRpb248TT4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdCgpLm1heChzZWxlY3Rvcik7XG4gIH1cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBEaXN0aW5jdCBDbGF1c2VcbiAgICogQHBhcmFtIHtTZWxlY3RTZWxlY3Rvcn0gc2VsZWN0b3JcbiAgICovXG4gIGRpc3RpbmN0KHNlbGVjdG9yOiBTZWxlY3RTZWxlY3Rvcik6IERpc3RpbmN0T3B0aW9uPE0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoKS5kaXN0aW5jdChzZWxlY3Rvcik7XG4gIH1cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBDb3VudCBDbGF1c2VcbiAgICogQHBhcmFtIHtTZWxlY3RTZWxlY3Rvcn0gc2VsZWN0b3JcbiAgICovXG4gIGNvdW50KHNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3IpOiBDb3VudE9wdGlvbjxNPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0KCkuY291bnQoc2VsZWN0b3IpO1xuICB9XG5cbiAgaW5zZXJ0KCk6IEluc2VydE9wdGlvbjxNPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5DbGF1c2VzLmluc2VydDxNPigpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIERCS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29udGV4dCxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeUZsYWdzLFxuICBDb250ZXh0dWFsLFxuICBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBEZWZhdWx0Rmxhdm91cixcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIE1vZGVsUmVnaXN0cnksXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgUmF3RXhlY3V0b3IgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9SYXdFeGVjdXRvclwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmFibGVcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiLi4vcXVlcnkvUXVlcnlcIjtcbmltcG9ydCB7IFN0YXRlbWVudCB9IGZyb20gXCIuLi9xdWVyeS9TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IENsYXVzZUZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlcnkvQ2xhdXNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4vU2VxdWVuY2VcIjtcbmltcG9ydCB7IEVycm9yUGFyc2VyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcblxuRGVjb3JhdGlvbi5zZXRGbGF2b3VyUmVzb2x2ZXIoKG9iajogb2JqZWN0KSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIEFkYXB0ZXIuZmxhdm91ck9mKE1vZGVsLmlzTW9kZWwob2JqKSA/IG9iai5jb25zdHJ1Y3RvciA6IChvYmogYXMgYW55KSkgfHxcbiAgICAgIERlZmF1bHRGbGF2b3VyXG4gICAgKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEFic3RyYWN0IERlY2FmLXRzIFBlcnNpc3RlbmNlIEFkYXB0ZXIgQ2xhc3NcbiAqIEBkZXNjcmlwdGlvbiBPZmZlcnMgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBBZGFwdGVyIENsYXNzZXNcbiAqIGFuZCBtYW5hZ2VzIHRoZW0gdmFyaW91cyByZWdpc3RlcmVkIHtAbGluayBBZGFwdGVyfXNcbiAqXG4gKiBAdHlwZWRlZiBZIHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIG9iamVjdCB0eXBlIG9yIHRoZSByZXF1aXJlZCBjb25maWcgdG8gc2V0IGl0IHVwXG4gKiBAdHlwZWRlZiBRIFRoZSBxdWVyeSBvYmplY3QgdGhlIGFkYXB0ZXIgdXNlc1xuICpcbiAqIEBwYXJhbSB7WX0gbmF0aXZlIHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgdGhlIHVuZGVyIHdpdGNoIHRoZSBwZXJzaXN0ZW5jZSBhZGFwdGVyIHNob3VsZCBiZSBzdG9yZWRcbiAqXG4gKiBAY2xhc3MgQWRhcHRlclxuICogQGltcGxlbWVudHMgUmF3RXhlY3V0b3JcbiAqIEBpbXBsZW1lbnRzIE9ic2VydmFibGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFkYXB0ZXI8XG4gICAgWSxcbiAgICBRLFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4gID5cbiAgaW1wbGVtZW50cyBSYXdFeGVjdXRvcjxRPiwgT2JzZXJ2YWJsZSwgQ29udGV4dHVhbDxGPiwgRXJyb3JQYXJzZXJcbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2N1cnJlbnQ6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBSZWNvcmQ8c3RyaW5nLCBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+ID0ge307XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9vYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbmF0aXZlOiBZO1xuXG4gIGdldCBuYXRpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hdGl2ZTtcbiAgfVxuXG4gIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPigpOiBDb25zdHJ1Y3RvcjxcbiAgICBSZXBvc2l0b3J5PE0sIFEsIEFkYXB0ZXI8WSwgUSwgRiwgQz4sIEYsIEM+XG4gID4ge1xuICAgIHJldHVybiBSZXBvc2l0b3J5O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG5hdGl2ZTogWSxcbiAgICByZWFkb25seSBmbGF2b3VyOiBzdHJpbmdcbiAgKSB7XG4gICAgaWYgKHRoaXMuZmxhdm91ciBpbiBBZGFwdGVyLl9jYWNoZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgUGVyc2lzdGVuY2UgYWRhcHRlciBmbGF2b3VyICR7dGhpcy5mbGF2b3VyfSBhbHJlYWR5IHJlZ2lzdGVyZWRgXG4gICAgICApO1xuICAgIHRoaXMuX25hdGl2ZSA9IG5hdGl2ZTtcbiAgICBBZGFwdGVyLl9jYWNoZVt0aGlzLmZsYXZvdXJdID0gdGhpcztcbiAgICBpZiAoIUFkYXB0ZXIuX2N1cnJlbnQpIEFkYXB0ZXIuX2N1cnJlbnQgPSB0aGlzO1xuICB9XG5cbiAgUXVlcnk8TSBleHRlbmRzIE1vZGVsPigpOiBRdWVyeTxRLCBNPiB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzKTtcbiAgfVxuXG4gIGFic3RyYWN0IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uKTogUTtcblxuICBhYnN0cmFjdCBnZXQgU3RhdGVtZW50KCk6IFN0YXRlbWVudDxRPjtcblxuICBhYnN0cmFjdCBnZXQgQ2xhdXNlcygpOiBDbGF1c2VGYWN0b3J5PFksIFEsIHR5cGVvZiB0aGlzPjtcblxuICBwcm90ZWN0ZWQgaXNSZXNlcnZlZChhdHRyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gIWF0dHI7XG4gIH1cblxuICBhYnN0cmFjdCBwYXJzZUVycm9yKGVycjogRXJyb3IpOiBCYXNlRXJyb3I7XG5cbiAgYWJzdHJhY3QgaW5pdGlhbGl6ZSguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD47XG5cbiAgYWJzdHJhY3QgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT47XG5cbiAgYXN5bmMgY29udGV4dDxcbiAgICBNIGV4dGVuZHMgTW9kZWwsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgPihcbiAgICBvcGVyYXRpb246XG4gICAgICB8IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuUkVBRFxuICAgICAgfCBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICBvdmVycmlkZXM6IFBhcnRpYWw8Rj4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4gICk6IFByb21pc2U8Qz4ge1xuICAgIGNvbnN0IEFkYXB0ZXJDb250ZXh0ID0gY2xhc3MgZXh0ZW5kcyBDb250ZXh0PEY+IHtcbiAgICAgIGNvbnN0cnVjdG9yKG9iajogRikge1xuICAgICAgICBzdXBlcihvYmopO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBBZGFwdGVyQ29udGV4dChcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsIG92ZXJyaWRlcywge1xuICAgICAgICBhZmZlY3RlZFRhYmxlczogUmVwb3NpdG9yeS50YWJsZShtb2RlbCksXG4gICAgICAgIHdyaXRlT3BlcmF0aW9uOiBvcGVyYXRpb24gIT09IE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgIH0pIGFzIEZcbiAgICApIGFzIEM7XG4gIH1cblxuICBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE1cbiAgKToge1xuICAgIHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBpZDogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhtb2RlbCkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIC8vIGlmIChrZXkgPT09IHBrKSByZXR1cm4gYWNjdW07XG4gICAgICAgIGNvbnN0IG1hcHBlZFByb3AgPSBSZXBvc2l0b3J5LmNvbHVtbihtb2RlbCwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNlcnZlZChtYXBwZWRQcm9wKSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgbmFtZSAke21hcHBlZFByb3B9IGlzIHJlc2VydmVkYCk7XG4gICAgICAgIGFjY3VtW21hcHBlZFByb3BdID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIGlmICgobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0sXG4gICAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkOiByZXN1bHQsXG4gICAgICBpZDogbW9kZWxbcGtdIGFzIHN0cmluZyxcbiAgICB9O1xuICB9XG5cbiAgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICk6IE0ge1xuICAgIGNvbnN0IG9iOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgb2JbcGsgYXMgc3RyaW5nXSA9IGlkO1xuICAgIGNvbnN0IG0gPSAoXG4gICAgICB0eXBlb2YgY2xhenogPT09IFwic3RyaW5nXCIgPyBNb2RlbC5idWlsZChvYiwgY2xhenopIDogbmV3IGNsYXp6KG9iKVxuICAgICkgYXMgTTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IG9ialtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKG0pLnJlZHVjZSgoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gcGspIHJldHVybiBhY2N1bTtcbiAgICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID0gb2JqW1JlcG9zaXRvcnkuY29sdW1uKGFjY3VtLCBrZXkpXTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBtKTtcbiAgICBpZiAobWV0YWRhdGEpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IG1ldGFkYXRhLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFic3RyYWN0IGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgYXN5bmMgY3JlYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWQubGVuZ3RoICE9PSBtb2RlbC5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaWQubWFwKChpLCBjb3VudCkgPT4gdGhpcy5jcmVhdGUodGFibGVOYW1lLCBpLCBtb2RlbFtjb3VudF0sIC4uLmFyZ3MpKVxuICAgICk7XG4gIH1cblxuICBhYnN0cmFjdCByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICBhc3luYyByZWFkQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGlkLm1hcCgoaSkgPT4gdGhpcy5yZWFkKHRhYmxlTmFtZSwgaSwgLi4uYXJncykpKTtcbiAgfVxuXG4gIGFic3RyYWN0IHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWQubGVuZ3RoICE9PSBtb2RlbC5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaWQubWFwKChpLCBjb3VudCkgPT4gdGhpcy51cGRhdGUodGFibGVOYW1lLCBpLCBtb2RlbFtjb3VudF0sIC4uLmFyZ3MpKVxuICAgICk7XG4gIH1cblxuICBhYnN0cmFjdCBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIGFzeW5jIGRlbGV0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChpZC5tYXAoKGkpID0+IHRoaXMuZGVsZXRlKHRhYmxlTmFtZSwgaSwgLi4uYXJncykpKTtcbiAgfVxuXG4gIGFic3RyYWN0IHJhdzxSPihyYXdJbnB1dDogUSwgcHJvY2VzczogYm9vbGVhbiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+O1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYW4ge0BsaW5rIE9ic2VydmVyfVxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgKlxuICAgKiBAc2VlIHtPYnNlcnZhYmxlI29ic2VydmV9XG4gICAqL1xuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiT2JzZXJ2ZXIgYWxyZWFkeSByZWdpc3RlcmVkXCIpO1xuICAgIHRoaXMuX29ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgT2JzZXJ2ZXJcIik7XG4gICAgdGhpcy5fb2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgY2FsbHMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIE9ic2VydmVyfXMgdG8gdXBkYXRlIHRoZW1zZWx2ZXNcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayBPYnNlcnZlciNyZWZyZXNofSBtZXRob2RcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aGlzLl9vYnNlcnZlcnMubWFwKChvKSA9PiBvLnJlZnJlc2goLi4uYXJncykpXG4gICAgKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIG9ic2VydmFibGUgJHt0aGlzLl9vYnNlcnZlcnNbaV19OiAke3Jlc3VsdC5yZWFzb259YFxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZmxhdm91cn0gcGVyc2lzdGVuY2UgQWRhcHRlcmA7XG4gIH1cblxuICBzdGF0aWMgZmxhdm91ck9mPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YSh0aGlzLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG1vZGVsKSB8fFxuICAgICAgdGhpcy5jdXJyZW50LmZsYXZvdXJcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldCBjdXJyZW50KCkge1xuICAgIGlmICghQWRhcHRlci5fY3VycmVudClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcGVyc2lzdGVuY2UgZmxhdm91ciBzZXQuIFBsZWFzZSBpbml0aWFsaXplIHlvdXIgYWRhcHRlcmBcbiAgICAgICk7XG4gICAgcmV0dXJuIEFkYXB0ZXIuX2N1cnJlbnQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0PFksIFEsIEMgZXh0ZW5kcyBDb250ZXh0PEY+LCBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzPihcbiAgICBmbGF2b3VyOiBhbnlcbiAgKTogQWRhcHRlcjxZLCBRLCBGLCBDPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGZsYXZvdXIgaW4gdGhpcy5fY2FjaGUpIHJldHVybiB0aGlzLl9jYWNoZVtmbGF2b3VyXTtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gQWRhcHRlciByZWdpc3RlcmVkIHVuZGVyICR7Zmxhdm91cn0uYCk7XG4gIH1cblxuICBzdGF0aWMgc2V0Q3VycmVudChmbGF2b3VyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGFwdGVyID0gQWRhcHRlci5nZXQoZmxhdm91cik7XG4gICAgaWYgKCFhZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYE5vIHBlcnNpc3RlbmNlIGZsYXZvdXIgJHtmbGF2b3VyfSByZWdpc3RlcmVkYCk7XG4gICAgdGhpcy5fY3VycmVudCA9IGFkYXB0ZXI7XG4gIH1cblxuICBzdGF0aWMga2V5KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFJlcG9zaXRvcnkua2V5KGtleSk7XG4gIH1cblxuICBzdGF0aWMgbW9kZWxzPE0gZXh0ZW5kcyBNb2RlbD4oZmxhdm91cjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gKE1vZGVsIGFzIGFueSkuZ2V0UmVnaXN0cnkoKSBhcyBNb2RlbFJlZ2lzdHJ5PGFueT47XG4gICAgICBjb25zdCBjYWNoZSA9IChcbiAgICAgICAgcmVnaXN0cnkgYXMgdW5rbm93biBhcyB7IGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnN0cnVjdG9yPGFueT4+IH1cbiAgICAgICkuY2FjaGU7XG4gICAgICBjb25zdCBtYW5hZ2VkTW9kZWxzOiBNb2RlbENvbnN0cnVjdG9yPGFueT5bXSA9IE9iamVjdC52YWx1ZXMoY2FjaGUpXG4gICAgICAgIC5tYXAoKG06IE1vZGVsQ29uc3RydWN0b3I8TT4pID0+IHtcbiAgICAgICAgICBsZXQgZiA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGYgJiYgZiA9PT0gZmxhdm91cikgcmV0dXJuIG07XG4gICAgICAgICAgaWYgKCFmKSB7XG4gICAgICAgICAgICBjb25zdCByZXBvID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghcmVwbykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG5cbiAgICAgICAgICAgIGYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIHJlcG9zaXRvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSk7XG4gICAgICByZXR1cm4gbWFuYWdlZE1vZGVscztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZU5hbWU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpLFxuICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsXG4gICk7XG4gIGlmIChtZXRhZGF0YSkge1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuICBpZiAobW9kZWwgaW5zdGFuY2VvZiBNb2RlbCkge1xuICAgIHJldHVybiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG4gIHJldHVybiBtb2RlbC5uYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VOYW1lRm9yTW9kZWw8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogc3RyaW5nW11cbikge1xuICByZXR1cm4gW2dldFRhYmxlTmFtZShtb2RlbCksIC4uLmFyZ3NdLmpvaW4oXCJfXCIpO1xufVxuIiwiLyoqXG4gKiBAc3VtbWFyeSBTZXF1ZW5jZVxuICpcbiAqIEBpbnRlcmZhY2UgU2VxdWVuY2VcbiAqXG4gKiBAY2F0ZWdvcnkgU2VxdWVuY2VzXG4gKi9cbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHNlcXVlbmNlTmFtZUZvck1vZGVsIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlIHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGdlbmVyYXRlcyB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICpcbiAgICogQG1ldGhvZFxuICAgKi9cbiAgYWJzdHJhY3QgbmV4dCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD47XG4gIGFic3RyYWN0IGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+O1xuICBhYnN0cmFjdCByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPjtcblxuICBzdGF0aWMgcGs8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgcmV0dXJuIHNlcXVlbmNlTmFtZUZvck1vZGVsKG1vZGVsLCBcInBrXCIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZXMoZmxhdm91cjogc3RyaW5nKSB7XG4gIHJldHVybiBhcHBseShtZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIGZsYXZvdXIpKTtcbn1cbiIsImltcG9ydCB7XG4gIENvbnRleHQsXG4gIERCS2V5cyxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIElSZXBvc2l0b3J5LFxuICBPcGVyYXRpb25LZXlzLFxuICBSZXBvc2l0b3J5IGFzIFJlcCxcbiAgUmVwb3NpdG9yeUZsYWdzLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIHdyYXBNZXRob2RXaXRoQ29udGV4dCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gXCIuLi9xdWVyeS9RdWVyeVwiO1xuaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgUXVlcmlhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUXVlcmlhYmxlXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcXVlcnkvQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBXaGVyZU9wdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9vcHRpb25zXCI7XG5pbXBvcnQgeyBPcmRlckJ5U2VsZWN0b3IsIFNlbGVjdFNlbGVjdG9yIH0gZnJvbSBcIi4uL3F1ZXJ5L3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyB1c2VzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2RlY29yYXRvcnNcIjtcblxuZXhwb3J0IHR5cGUgUmVwbzxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBRID0gYW55LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgUSwgRiwgQz4gPSBBZGFwdGVyPGFueSwgUSwgRiwgQz4sXG4+ID0gUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPjtcblxuZXhwb3J0IGNsYXNzIFJlcG9zaXRvcnk8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFEsXG4gICAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBRLCBGLCBDPixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbiAgPlxuICBleHRlbmRzIFJlcDxNLCBGLCBDPlxuICBpbXBsZW1lbnRzIE9ic2VydmFibGUsIFF1ZXJpYWJsZSwgSVJlcG9zaXRvcnk8TSwgRiwgQz5cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIENvbnN0cnVjdG9yPFJlcG88TW9kZWw+PiB8IFJlcG88TW9kZWw+XG4gID4gPSB7fTtcblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJzOiBPYnNlcnZlcltdID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWRhcHRlciE6IEE7XG4gIHByaXZhdGUgX3RhYmxlTmFtZSE6IHN0cmluZztcbiAgcHJpdmF0ZSBfb3ZlcnJpZGVzPzogUGFydGlhbDxGPjtcblxuICBwcm90ZWN0ZWQgZ2V0IGFkYXB0ZXIoKTogQSB7XG4gICAgaWYgKCF0aGlzLl9hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBhZGFwdGVyIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnkuIGRpZCB5b3UgdXNlIHRoZSBAdXNlcyBkZWNvcmF0b3Igb3IgcGFzcyBpdCBpbiB0aGUgY29uc3RydWN0b3I/YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdGFibGVOYW1lKCkge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQSwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHN1cGVyKGNsYXp6KTtcbiAgICBpZiAoYWRhcHRlcikgdGhpcy5fYWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgaWYgKGNsYXp6KSB7XG4gICAgICBSZXBvc2l0b3J5LnJlZ2lzdGVyKGNsYXp6LCB0aGlzKTtcbiAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgIGNvbnN0IGZsYXZvdXIgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICBjbGF6elxuICAgICAgICApO1xuICAgICAgICBpZiAoZmxhdm91ciAmJiBmbGF2b3VyICE9PSBhZGFwdGVyLmZsYXZvdXIpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJbmNvbXBhdGlibGUgZmxhdm91cnNcIik7XG4gICAgICAgIHVzZXMoYWRhcHRlci5mbGF2b3VyKShjbGF6eik7XG4gICAgICB9XG4gICAgfVxuICAgIFt0aGlzLmNyZWF0ZUFsbCwgdGhpcy5yZWFkQWxsLCB0aGlzLnVwZGF0ZUFsbCwgdGhpcy5kZWxldGVBbGxdLmZvckVhY2goXG4gICAgICAobSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gbS5uYW1lO1xuICAgICAgICB3cmFwTWV0aG9kV2l0aENvbnRleHQoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW25hbWUgKyBcIlByZWZpeFwiXSxcbiAgICAgICAgICBtLFxuICAgICAgICAgICh0aGlzIGFzIGFueSlbbmFtZSArIFwiU3VmZml4XCJdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEY+KSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IHR5cGVvZiB0aGlzLCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgIGlmIChwICE9PSBcIl9vdmVycmlkZXNcIikgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlc3VsdCwgZmxhZ3MpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVQcmVmaXgoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxbTSwgLi4uYW55W11dPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBtb2RlbCA9IG5ldyB0aGlzLmNsYXNzKG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbC5oYXNFcnJvcnMoXG4gICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcblxuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkIH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTdWZmaXgobW9kZWw6IE0sIGNvbnRleHQ6IEMpOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlU3VmZml4KG1vZGVsLCBjb250ZXh0KTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIG1vZGVscztcbiAgICBjb25zdCBwcmVwYXJlZCA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGxldCByZWNvcmRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIGlkcyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgICAgcmVjb3JkcyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUFsbFByZWZpeChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICAgIGNvbnN0IG9wdHMgPSBSZXBvc2l0b3J5LmdldFNlcXVlbmNlT3B0aW9ucyhtb2RlbHNbMF0pO1xuICAgIGxldCBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgfCB1bmRlZmluZWQpW10gPSBbXTtcbiAgICBpZiAob3B0cy50eXBlKSB7XG4gICAgICBpZiAoIW9wdHMubmFtZSkgb3B0cy5uYW1lID0gU2VxdWVuY2UucGsobW9kZWxzWzBdKTtcbiAgICAgIGlkcyA9IGF3YWl0IChhd2FpdCB0aGlzLmFkYXB0ZXIuU2VxdWVuY2Uob3B0cykpLnJhbmdlKG1vZGVscy5sZW5ndGgpO1xuICAgIH1cblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSwgaSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIG1bdGhpcy5wa10gPSBpZHNbaV0gYXMgTVtrZXlvZiBNXTtcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IGVycm9ycyA9IG1vZGVsc1xuICAgICAgLm1hcCgobSkgPT5cbiAgICAgICAgbS5oYXNFcnJvcnMoXG4gICAgICAgICAgLi4uKGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlKVxuICAgICAgICAgIGFjY3VtID1cbiAgICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IGFjY3VtICsgYFxcbiAtICR7aX06ICR7ZS50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycyk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRQcmVmaXgoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgIG1vZGVsW3RoaXMucGtdID0ga2V5IGFzIE1ba2V5b2YgTV07XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRBbGxQcmVmaXgoa2V5czogc3RyaW5nW10gfCBudW1iZXJbXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgICAgICBtW3RoaXMucGtdID0gayBhcyBNW2tleW9mIE1dO1xuICAgICAgICByZXR1cm4gZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBba2V5cywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICBhc3luYyByZWFkQWxsKGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWRBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkIH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFyZ3M6IGFueVtdXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgcGsgPSBtb2RlbFt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgaWYgKCFwaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gdmFsdWUgZm9yIHRoZSBJZCBpcyBkZWZpbmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSAke3RoaXMucGsgYXMgc3RyaW5nfWBcbiAgICAgICk7XG4gICAgY29uc3Qgb2xkTW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQocGssIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVsID0gdGhpcy5tZXJnZShvbGRNb2RlbCwgbW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgb2xkTW9kZWxcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWwuaGFzRXJyb3JzKFxuICAgICAgb2xkTW9kZWwsXG4gICAgICAuLi5SZXBvc2l0b3J5LnJlbGF0aW9ucyh0aGlzLmNsYXNzKSxcbiAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICApO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuICAgIGlmIChSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsKSkge1xuICAgICAgaWYgKCFSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG1vZGVsKSlcbiAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtb2RlbCwgUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpO1xuICAgIH1cbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLmlkKSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLnJlY29yZCksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHUsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHUsIHRoaXMuY2xhc3MsIHRoaXMucGssIHJlY29yZHNbaV0uaWQpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgaWRzID0gbW9kZWxzLm1hcCgobSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBtW3RoaXMucGtdIGFzIHN0cmluZztcbiAgICAgIGlmICghaWQpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwibWlzc2luZyBpZCBvbiB1cGRhdGUgb3BlcmF0aW9uXCIpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH0pO1xuICAgIGNvbnN0IG9sZE1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbChpZHMsIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVscyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHtcbiAgICAgIG0gPSB0aGlzLm1lcmdlKG9sZE1vZGVsc1tpXSwgbSk7XG4gICAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKSB7XG4gICAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtKSlcbiAgICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0sIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbTtcbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgICAgICBvbGRNb2RlbHNbaV1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0sIGkpID0+XG4gICAgICAgIG0uaGFzRXJyb3JzKFxuICAgICAgICAgIG9sZE1vZGVsc1tpXSxcbiAgICAgICAgICBtLFxuICAgICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuXG4gICAgbW9kZWxzLmZvckVhY2goKG0sIGkpID0+IHtcbiAgICAgIGlmIChSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpIHtcbiAgICAgICAgaWYgKCFSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG0pKVxuICAgICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobSwgUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlUHJlZml4KGtleTogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQoa2V5LCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFtrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGUodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlQWxsUHJlZml4KGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoa2V5cywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQWxsKGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZUFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICBzZWxlY3Qoc2VsZWN0b3I/OiBTZWxlY3RTZWxlY3Rvcik6IFdoZXJlT3B0aW9uIHtcbiAgICByZXR1cm4gbmV3IFF1ZXJ5PFEsIE0+KHRoaXMuYWRhcHRlcikuc2VsZWN0KHNlbGVjdG9yKS5mcm9tKHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnk8Vj4oXG4gICAgY29uZGl0aW9uOiBDb25kaXRpb24sXG4gICAgb3JkZXJCeTogc3RyaW5nLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICBsaW1pdD86IG51bWJlcixcbiAgICBza2lwPzogbnVtYmVyXG4gICk6IFByb21pc2U8Vj4ge1xuICAgIGNvbnN0IHNvcnQ6IE9yZGVyQnlTZWxlY3RvciA9IFtvcmRlckJ5IGFzIHN0cmluZywgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb25dO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWxlY3QoKS53aGVyZShjb25kaXRpb24pLm9yZGVyQnkoc29ydCk7XG4gICAgaWYgKGxpbWl0KSBxdWVyeS5saW1pdChsaW1pdCk7XG4gICAgaWYgKHNraXApIHF1ZXJ5Lm9mZnNldChza2lwKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZTxWPigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjb2JzZXJ2ZX1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk9ic2VydmVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGNhbGxzIGFsbCByZWdpc3RlcmVkIHtAbGluayBPYnNlcnZlcn1zIHRvIHVwZGF0ZSB0aGVtc2VsdmVzXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSBvcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgT2JzZXJ2ZXIjcmVmcmVzaH0gbWV0aG9kXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLnJlZnJlc2goLi4uYXJncykpXG4gICAgKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIG9ic2VydmFibGUgJHt0aGlzLm9ic2VydmVyc1tpXX06ICR7cmVzdWx0LnJlYXNvbn1gXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZm9yTW9kZWw8TSBleHRlbmRzIE1vZGVsLCBSIGV4dGVuZHMgUmVwbzxNPj4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGRlZmF1bHRGbGF2b3VyPzogc3RyaW5nXG4gICk6IFIge1xuICAgIGxldCByZXBvOiBSIHwgQ29uc3RydWN0b3I8Uj4gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlcG8gPSB0aGlzLmdldChtb2RlbCkgYXMgQ29uc3RydWN0b3I8Uj4gfCBSO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmVwbyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAocmVwbyBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHJldHVybiByZXBvIGFzIFI7XG5cbiAgICBjb25zdCBmbGF2b3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG1vZGVsKSB8fFxuICAgICAgKHJlcG8gJiZcbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIHJlcG8pKSB8fFxuICAgICAgZGVmYXVsdEZsYXZvdXI7XG4gICAgY29uc3QgYWRhcHRlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+IHwgdW5kZWZpbmVkID0gZmxhdm91clxuICAgICAgPyBBZGFwdGVyLmdldChmbGF2b3VyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UgYWRhcHRlciBmb3VuZCBmbGF2b3VyICR7Zmxhdm91cn1gXG4gICAgICApO1xuXG4gICAgcmVwbyA9IHJlcG8gfHwgKGFkYXB0ZXIucmVwb3NpdG9yeSgpIGFzIENvbnN0cnVjdG9yPFI+KTtcbiAgICByZXR1cm4gbmV3IHJlcG8oYWRhcHRlciwgbW9kZWwpIGFzIFI7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbiAgKTogQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+IHtcbiAgICBjb25zdCBuYW1lID0gUmVwb3NpdG9yeS50YWJsZShtb2RlbCk7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVbbmFtZV0gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT47XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgQ291bGQgbm90IGZpbmQgcmVwb3NpdG9yeSByZWdpc3RlcmVkIHVuZGVyICR7bmFtZX1gXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyByZWdpc3RlcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICByZXBvOiBDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT5cbiAgKSB7XG4gICAgY29uc3QgbmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGlmIChuYW1lIGluIHRoaXMuX2NhY2hlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYCR7bmFtZX0gYWxyZWFkeSByZWdpc3RlcmVkIGFzIGEgcmVwb3NpdG9yeWApO1xuICAgIHRoaXMuX2NhY2hlW25hbWVdID0gcmVwbyBhcyBhbnk7XG4gIH1cblxuICBzdGF0aWMgc2V0TWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSwgbWV0YWRhdGE6IGFueSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZU1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIG1vZGVsLFxuICAgICAgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXG4gICAgKTtcbiAgICBpZiAoZGVzY3JpcHRvcikgZGVsZXRlIChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV07XG4gIH1cblxuICBzdGF0aWMgZ2V0U2VxdWVuY2VPcHRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLFxuICAgICAgbW9kZWwsXG4gICAgICBwayBhcyBzdHJpbmdcbiAgICApO1xuICAgIGlmICghbWV0YWRhdGEpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyBzZXF1ZW5jZSBvcHRpb25zIGRlZmluZWQgZm9yIG1vZGVsLiBkaWQgeW91IHVzZSB0aGUgQHBrIGRlY29yYXRvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgU2VxdWVuY2VPcHRpb25zO1xuICB9XG5cbiAgc3RhdGljIGluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgY29uc3QgaW5kZXhEZWNvcmF0b3JzID0gUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwgOiBuZXcgbW9kZWwoKSxcbiAgICAgIERCS2V5cy5SRUZMRUNUXG4gICAgKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoaW5kZXhEZWNvcmF0b3JzIHx8IHt9KS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEluZGV4TWV0YWRhdGE+PiwgW2ssIHZhbF0pID0+IHtcbiAgICAgICAgY29uc3QgZGVjcyA9IHZhbC5maWx0ZXIoKHYpID0+IHYua2V5LnN0YXJ0c1dpdGgoUGVyc2lzdGVuY2VLZXlzLklOREVYKSk7XG4gICAgICAgIGlmIChkZWNzICYmIGRlY3MubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgZGVjcykge1xuICAgICAgICAgICAgY29uc3QgeyBrZXksIHByb3BzIH0gPSBkZWM7XG4gICAgICAgICAgICBhY2N1bVtrXSA9IGFjY3VtW2tdIHx8IHt9O1xuICAgICAgICAgICAgYWNjdW1ba11ba2V5XSA9IHByb3BzIGFzIEluZGV4TWV0YWRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgcmVsYXRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcHJvdG90eXBlID1cbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWxcbiAgICAgICAgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpXG4gICAgICAgIDogKG1vZGVsIGFzIGFueSkucHJvdG90eXBlO1xuICAgIHdoaWxlIChwcm90b3R5cGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcHM6IHN0cmluZ1tdID0gcHJvdG90eXBlW1BlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlNdO1xuICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnByb3BzKTtcbiAgICAgIH1cbiAgICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHRhYmxlPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHJldHVybiBnZXRUYWJsZU5hbWUobW9kZWwpO1xuICB9XG5cbiAgc3RhdGljIGNvbHVtbjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pLFxuICAgICAgbW9kZWwsXG4gICAgICBhdHRyaWJ1dGVcbiAgICApO1xuICAgIHJldHVybiBtZXRhZGF0YSA/IG1ldGFkYXRhIDogYXR0cmlidXRlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5PFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxUPixcbiAgbmFtZU92ZXJyaWRlPzogc3RyaW5nXG4pOiBhbnkge1xuICByZXR1cm4gKChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGlmIChwcm9wZXJ0eUtleSkge1xuICAgICAgcmV0dXJuIGluamVjdChuYW1lT3ZlcnJpZGUgfHwgbW9kZWwubmFtZSkob3JpZ2luYWwsIHByb3BlcnR5S2V5KTtcbiAgICB9XG5cbiAgICBtZXRhZGF0YShcbiAgICAgIFJlcG9zaXRvcnkua2V5KERCS2V5cy5SRVBPU0lUT1JZKSxcbiAgICAgIG5hbWVPdmVycmlkZSB8fCBvcmlnaW5hbC5uYW1lXG4gICAgKShtb2RlbCk7XG4gICAgUmVwb3NpdG9yeS5yZWdpc3Rlcihtb2RlbCwgb3JpZ2luYWwpO1xuICAgIHJldHVybiBpbmplY3RhYmxlKFxuICAgICAgbmFtZU92ZXJyaWRlIHx8IG9yaWdpbmFsLm5hbWUsXG4gICAgICB0cnVlLFxuICAgICAgKGluc3RhbmNlOiBJUmVwb3NpdG9yeTxUPikgPT4ge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdGFuY2UsIERCS2V5cy5DTEFTUywge1xuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBtb2RlbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKShvcmlnaW5hbCk7XG4gIH0pIGFzIGFueTtcbn1cbiIsImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIG9ic2VydmVyIGNvbW11bmljYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRoZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNsYXNzIE9ic2VydmVyRXJyb3JcbiAqIEBleHRlbmRzIEJhc2VFcnJvclxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihPYnNlcnZlckVycm9yLm5hbWUsIG1zZywgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEF1dGhvcml6YXRpb25FcnJvci5uYW1lLCBtc2csIDQwMSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZvcmJpZGRlbkVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEZvcmJpZGRlbkVycm9yLm5hbWUsIG1zZywgNDAzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIHNmIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8VD4gfCBULFxuICBmbGF2b3VyPzogc3RyaW5nXG4pIHtcbiAgaWYgKCFmbGF2b3VyKSB7XG4gICAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpO1xuICAgIGZsYXZvdXIgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAga2V5LFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yIDogbW9kZWxcbiAgICApO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldHJpZXZlIGZsYXZvdXIgZnJvbSBtb2RlbCAke21vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lIDogbW9kZWwubmFtZX1gXG4gICAgICApO1xuICB9XG4gIHJldHVybiBzZihQZXJzaXN0ZW5jZUtleXMuSU5KRUNUQUJMRSwgZmxhdm91ciwgUmVwb3NpdG9yeS50YWJsZShtb2RlbCkpO1xufVxuIiwiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wLFxuICBJbmplY3RhYmxlcyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZXNSZWdpc3RyeSBleHRlbmRzIEluamVjdGFibGVSZWdpc3RyeUltcCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQ8VD4obmFtZTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGluamVjdGFibGUgPSBzdXBlci5nZXQobmFtZSk7XG4gICAgaWYgKCFpbmplY3RhYmxlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbSA9IE1vZGVsLmdldChuYW1lKTtcbiAgICAgICAgaWYgKG0pIGluamVjdGFibGUgPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuICAgICAgICBpZiAoaW5qZWN0YWJsZSkge1xuICAgICAgICAgIGlmIChpbmplY3RhYmxlIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIGluamVjdGFibGUgYXMgVDtcbiAgICAgICAgICBjb25zdCBmbGF2b3VyID1cbiAgICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZS5jb25zdHJ1Y3RvclxuICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihcbiAgICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICAgICBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeShcbiAgICAgICAgICAgICAgbSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgICAgIGZsYXZvdXJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIHJldHVybiBpbmplY3RhYmxlIGFzIFQgfCB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQHR5cGVkZWYgU2VxdWVuY2VPcHRpb25zXG4gKlxuICogQHByb3Age3N0cmluZyB8IG51bWJlcn0gW3N0YXJ0aW5nVmFsdWVdIGRlZmluZXMgdGhlIHN0YXJ0aW5nIHZhbHVlIHdoZW4gc2VxdWVuY2UgZG9lc3Qgbm90IGV4aXN0XG4gKlxuICogQGNhdGVnb3J5IFNlcXVlbmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcXVlbmNlT3B0aW9ucyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHR5cGU6IFwiTnVtYmVyXCIgfCBcIkJpZ0ludFwiIHwgdW5kZWZpbmVkO1xuICBzdGFydFdpdGg6IG51bWJlcjtcbiAgaW5jcmVtZW50Qnk6IG51bWJlcjtcbiAgbWluVmFsdWU/OiBudW1iZXI7XG4gIG1heFZhbHVlPzogbnVtYmVyO1xuICBjeWNsZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyA9IHtcbiAgdHlwZTogXCJOdW1iZXJcIixcbiAgc3RhcnRXaXRoOiAwLFxuICBpbmNyZW1lbnRCeTogMSxcbiAgY3ljbGU6IGZhbHNlLFxufTtcblxuZXhwb3J0IGNvbnN0IE51bWVyaWNTZXF1ZW5jZTogU2VxdWVuY2VPcHRpb25zID0ge1xuICB0eXBlOiBcIk51bWJlclwiLFxuICBzdGFydFdpdGg6IDAsXG4gIGluY3JlbWVudEJ5OiAxLFxuICBjeWNsZTogZmFsc2UsXG59O1xuXG5leHBvcnQgY29uc3QgQmlnSW50U2VxdWVuY2U6IFNlcXVlbmNlT3B0aW9ucyA9IHtcbiAgdHlwZTogXCJCaWdJbnRcIixcbiAgc3RhcnRXaXRoOiAwLFxuICBpbmNyZW1lbnRCeTogMSxcbiAgY3ljbGU6IGZhbHNlLFxufTtcbiIsImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihRdWVyeUVycm9yLm5hbWUsIG1zZywgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFnaW5nRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoUGFnaW5nRXJyb3IubmFtZSwgbXNnLCA1MDApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBdHRyaWJ1dGVPcHRpb24sIENvbmRpdGlvbkJ1aWxkZXJPcHRpb24gfSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQge1xuICBNb2RlbCxcbiAgTW9kZWxFcnJvckRlZmluaXRpb24sXG4gIHJlcXVpcmVkLFxuICBzZixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgR3JvdXBPcGVyYXRvciwgT3BlcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBDb25kaXRpb24gQ2xhc3NcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIGEgbG9naWNhbCBjb25kaXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbmRpdGlvbn0gYXR0cjFcbiAqIEBwYXJhbSB7T3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yfSBvcGVyYXRvclxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25kaXRpb259IGNvbXBhcmlzb25cbiAqXG4gKiBAY2xhc3MgQ29uZGl0aW9uXG4gKiBAaW1wbGVtZW50cyBFeGVjdXRvclxuICpcbiAqIEBjYXRlZ29yeSBRdWVyeVxuICogQHN1YmNhdGVnb3J5IENvbmRpdGlvbnNcbiAqL1xuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uIGV4dGVuZHMgTW9kZWwge1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgYXR0cjE/OiBzdHJpbmcgfCBDb25kaXRpb24gPSB1bmRlZmluZWQ7XG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgQHJlcXVpcmVkKClcbiAgcHJvdGVjdGVkIGNvbXBhcmlzb24/OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uLFxuICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3IsXG4gICAgY29tcGFyaXNvbjogYW55XG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hdHRyMSA9IGF0dHIxO1xuICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICB0aGlzLmNvbXBhcmlzb24gPSBjb21wYXJpc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEpvaW5zIDIge0BsaW5rIENvbmRpdGlvbn1zIG9uIGFuIHtAbGluayBPcGVyYXRvciNBTkR9IG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbn0gY29uZGl0aW9uXG4gICAqL1xuICBhbmQoY29uZGl0aW9uOiBDb25kaXRpb24pOiBDb25kaXRpb24ge1xuICAgIHJldHVybiBDb25kaXRpb24uYW5kKHRoaXMsIGNvbmRpdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgSm9pbnMgMiB7QGxpbmsgQ29uZGl0aW9ufXMgb24gYW4ge0BsaW5rIE9wZXJhdG9yI09SfSBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb259IGNvbmRpdGlvblxuICAgKi9cbiAgb3IoY29uZGl0aW9uOiBDb25kaXRpb24pOiBDb25kaXRpb24ge1xuICAgIHJldHVybiBDb25kaXRpb24ub3IodGhpcywgY29uZGl0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBleGNsdWRlcyBhIHZhbHV0IGZyb20gdGhlIHJlc3VsdFxuICAgKiBAcGFyYW0gdmFsXG4gICAqL1xuICBub3QodmFsOiBhbnkpOiBDb25kaXRpb24ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uKHRoaXMsIE9wZXJhdG9yLk5PVCwgdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgaGFzRXJyb3JzKC4uLmV4Y2VwdGlvbnM6IHN0cmluZ1tdKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHN1cGVyLmhhc0Vycm9ycyguLi5leGNlcHRpb25zKTtcbiAgICBpZiAoZXJyb3JzKSByZXR1cm4gZXJyb3JzO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmF0dHIxID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAodGhpcy5jb21wYXJpc29uIGluc3RhbmNlb2YgQ29uZGl0aW9uKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhcmlzb246IHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogXCJCb3RoIHNpZGVzIG9mIHRoZSBjb21wYXJpc29uIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgTW9kZWxFcnJvckRlZmluaXRpb247XG4gICAgICBpZiAoT2JqZWN0LnZhbHVlcyhPcGVyYXRvcikuaW5kZXhPZih0aGlzLm9wZXJhdG9yIGFzIE9wZXJhdG9yKSA9PT0gLTEpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb3BlcmF0b3I6IHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogc2YoXCJJbnZhbGlkIG9wZXJhdG9yIHswfVwiLCB0aGlzLm9wZXJhdG9yIGFzIHN0cmluZyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hdHRyMSBpbnN0YW5jZW9mIENvbmRpdGlvbikge1xuICAgICAgaWYgKFxuICAgICAgICAhKHRoaXMuY29tcGFyaXNvbiBpbnN0YW5jZW9mIENvbmRpdGlvbikgJiZcbiAgICAgICAgdGhpcy5vcGVyYXRvciAhPT0gT3BlcmF0b3IuTk9UXG4gICAgICApXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29tcGFyaXNvbjoge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBzZihcIkludmFsaWQgb3BlcmF0b3IgezB9XCIsIHRoaXMub3BlcmF0b3IgYXMgc3RyaW5nKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgaWYgKFxuICAgICAgICBPYmplY3QudmFsdWVzKEdyb3VwT3BlcmF0b3IpLmluZGV4T2YodGhpcy5vcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yKSA9PT1cbiAgICAgICAgICAtMSAmJlxuICAgICAgICB0aGlzLm9wZXJhdG9yICE9PSBPcGVyYXRvci5OT1RcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcGVyYXRvcjoge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBzZihcIkludmFsaWQgb3BlcmF0b3IgezB9XCIsIHRoaXMub3BlcmF0b3IgYXMgc3RyaW5nKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgLy8gaWYgKHRoaXMub3BlcmF0b3IgIT09IE9wZXJhdG9yLk5PVCAmJiB0eXBlb2YgdGhpcy5hdHRyMS5hdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgIC8vICAgICByZXR1cm4ge1xuICAgICAgLy8gICAgICAgICBhdHRyMToge1xuICAgICAgLy8gICAgICAgICAgICAgY29uZGl0aW9uOiBzdHJpbmdGb3JtYXQoXCJQYXJlbnQgY29uZGl0aW9uIGF0dHJpYnV0ZSBtdXN0IGJlIGEgc3RyaW5nXCIpXG4gICAgICAvLyAgICAgICAgIH1cbiAgICAgIC8vICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEpvaW5zIDIge0BsaW5rIENvbmRpdGlvbn1zIG9uIGFuIHtAbGluayBPcGVyYXRvciNBTkR9IG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbn0gY29uZGl0aW9uMVxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbn0gY29uZGl0aW9uMlxuICAgKi9cbiAgc3RhdGljIGFuZChjb25kaXRpb24xOiBDb25kaXRpb24sIGNvbmRpdGlvbjI6IENvbmRpdGlvbik6IENvbmRpdGlvbiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ncm91cChjb25kaXRpb24xLCBHcm91cE9wZXJhdG9yLkFORCwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgSm9pbnMgMiB7QGxpbmsgQ29uZGl0aW9ufXMgb24gYW4ge0BsaW5rIE9wZXJhdG9yI09SfSBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb259IGNvbmRpdGlvbjFcbiAgICogQHBhcmFtIHtDb25kaXRpb259IGNvbmRpdGlvbjJcbiAgICovXG4gIHN0YXRpYyBvcihjb25kaXRpb24xOiBDb25kaXRpb24sIGNvbmRpdGlvbjI6IENvbmRpdGlvbik6IENvbmRpdGlvbiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ncm91cChjb25kaXRpb24xLCBHcm91cE9wZXJhdG9yLk9SLCBjb25kaXRpb24yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBHcm91cHMgMiB7QGxpbmsgQ29uZGl0aW9ufXMgYnkgdGhlIHNwZWNpZmllZCB7QGxpbmsgR3JvdXBPcGVyYXRvcn1cbiAgICogQHBhcmFtIHtDb25kaXRpb259IGNvbmRpdGlvbjFcbiAgICogQHBhcmFtIHtHcm91cE9wZXJhdG9yfSBvcGVyYXRvclxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbn0gY29uZGl0aW9uMlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXAoXG4gICAgY29uZGl0aW9uMTogQ29uZGl0aW9uLFxuICAgIG9wZXJhdG9yOiBHcm91cE9wZXJhdG9yLFxuICAgIGNvbmRpdGlvbjI6IENvbmRpdGlvblxuICApOiBDb25kaXRpb24ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uKGNvbmRpdGlvbjEsIG9wZXJhdG9yLCBjb25kaXRpb24yKTtcbiAgfVxuXG4gIHN0YXRpYyBhdHRyaWJ1dGUoYXR0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24uQnVpbGRlcigpLmF0dHJpYnV0ZShhdHRyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDb25kaXRpb24gQnVpbGRlciBDbGFzc1xuICAgKiBAZGVzY3JpcHRpb24gcHJvdmlkZXMgYSBzaW1wbGUgQVBJIHRvIGJ1aWxkIHtAbGluayBDb25kaXRpb259c1xuICAgKlxuICAgKiBAY2xhc3MgQ29uZGl0aW9uQnVpbGRlclxuICAgKiBAaW1wbGVtZW50cyBCdWlsZGVyXG4gICAqIEBpbXBsZW1lbnRzIEF0dHJpYnV0ZU9wdGlvblxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUXVlcnlcbiAgICogQHN1YmNhdGVnb3J5IENvbmRpdGlvbnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIEJ1aWxkZXIgPSBjbGFzcyBDb25kaXRpb25CdWlsZGVyXG4gICAgaW1wbGVtZW50cyBDb25kaXRpb25CdWlsZGVyT3B0aW9uLCBBdHRyaWJ1dGVPcHRpb25cbiAge1xuICAgIGF0dHIxPzogc3RyaW5nIHwgQ29uZGl0aW9uID0gdW5kZWZpbmVkO1xuICAgIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgIGNvbXBhcmlzb24/OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZShhdHRyOiBzdHJpbmcpOiBBdHRyaWJ1dGVPcHRpb24ge1xuICAgICAgdGhpcy5hdHRyMSA9IGF0dHI7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGFuIEVxdWFsaXR5IENvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgZXEodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkVRVUFMLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBEaWZmZXJlbnQgQ29tcGFyaXNvblxuICAgICAqIEBwYXJhbSB7YW55fSB2YWxcbiAgICAgKi9cbiAgICBkaWYodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkRJRkZFUkVOVCwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR3JlYXRlciBUaGFuIENvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgZ3QodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkJJR0dFUiwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgTG93ZXIgVGhhbiBDb21wYXJpc29uXG4gICAgICogQHBhcmFtIHthbnl9IHZhbFxuICAgICAqL1xuICAgIGx0KHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5TTUFMTEVSLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHcmVhdGVyIG9yIEVxdWFsIHRvIENvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgZ3RlKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5CSUdHRVJfRVEsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIExvd2VyIG9yIEVxdWFsIHRvIENvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgbHRlKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5TTUFMTEVSX0VRLCB2YWwpO1xuICAgIH1cblxuICAgIGluKGFycjogYW55W10pIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLklOLCBhcnIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBSZWdleHBvIENvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgcmVnZXhwKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5SRUdFWFAsIG5ldyBSZWdFeHAodmFsKS5zb3VyY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYW4ge0BsaW5rIE9wZXJhdG9yfSBiYXNlZCBDb21wYXJpc29uXG4gICAgICogQHBhcmFtIHtPcGVyYXRvcn0gb3BcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRPcChvcDogT3BlcmF0b3IsIHZhbDogYW55KSB7XG4gICAgICB0aGlzLm9wZXJhdG9yID0gb3A7XG4gICAgICB0aGlzLmNvbXBhcmlzb24gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUgRGF0YWJhc2UgT2JqZWN0XG4gICAgICogQHRocm93cyB7UXVlcnlFcnJvcn0gaWYgaXQgZmFpbHMgdG8gYnVpbGQgdGhlIHtAbGluayBDb25kaXRpb259XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkKCk6IENvbmRpdGlvbiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmV3IENvbmRpdGlvbihcbiAgICAgICAgICB0aGlzLmF0dHIxIGFzIHN0cmluZyB8IENvbmRpdGlvbixcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yIGFzIE9wZXJhdG9yLFxuICAgICAgICAgIHRoaXMuY29tcGFyaXNvbiBhcyBhbnlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGdldCBidWlsZGVyKCk6IENvbmRpdGlvbkJ1aWxkZXJPcHRpb24ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uLkJ1aWxkZXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBJUmVwb3NpdG9yeSxcbiAgTm90Rm91bmRFcnJvcixcbiAgUmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENhc2NhZGUgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU9yVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4+KG1vZGVsOiBNLCBjb250ZXh0OiBDb250ZXh0PEY+LCByZXBvc2l0b3J5PzogUmVwbzxNPik6IFByb21pc2U8TT4ge1xuICBpZiAoIXJlcG9zaXRvcnkpIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYENvdWxkIG5vdCBmaW5kIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICByZXBvc2l0b3J5ID0gUmVwb3NpdG9yeS5mb3JNb2RlbDxNLCBSZXBvPE0+PihcbiAgICAgIGNvbnN0cnVjdG9yIGFzIHVua25vd24gYXMgTW9kZWxDb25zdHJ1Y3RvcjxNPlxuICAgICk7XG4gIH1cbiAgaWYgKHR5cGVvZiBtb2RlbFtyZXBvc2l0b3J5LnBrXSA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICByZXR1cm4gcmVwb3NpdG9yeS5jcmVhdGUobW9kZWwsIGNvbnRleHQpO1xuICBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHJlcG9zaXRvcnkudXBkYXRlKG1vZGVsLCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkgdGhyb3cgZTtcbiAgICAgIHJldHVybiByZXBvc2l0b3J5LmNyZWF0ZShtb2RlbCwgY29udGV4dCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb09uZU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlOiBhbnkgPSBtb2RlbFtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWUpIHJldHVybjtcblxuICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBpbm5lclJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5KTtcbiAgICBjb25zdCByZWFkID0gYXdhaXQgaW5uZXJSZXBvLnJlYWQocHJvcGVydHlWYWx1ZSk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWQpO1xuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBwcm9wZXJ0eVZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGRhdGEuY2xhc3MpO1xuICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgZmluZCBtb2RlbCAke2RhdGEuY2xhc3N9YCk7XG4gIGNvbnN0IHJlcG86IFJlcG88YW55PiA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoY29uc3RydWN0b3IpO1xuICBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUocHJvcGVydHlWYWx1ZSk7XG4gIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkoY3JlYXRlZCkuaWQ7XG4gIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBjcmVhdGVkW3BrXSwgY3JlYXRlZCk7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBjcmVhdGVkW3BrXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25VcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZSkgcmV0dXJuO1xuICBpZiAoZGF0YS5jYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgaW5uZXJSZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIGtleSk7XG4gICAgY29uc3QgcmVhZCA9IGF3YWl0IGlubmVyUmVwby5yZWFkKHByb3BlcnR5VmFsdWUpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkKTtcbiAgICAobW9kZWwgYXMgYW55KVtrZXldID0gcHJvcGVydHlWYWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB1cGRhdGVkID0gYXdhaXQgY3JlYXRlT3JVcGRhdGUobW9kZWxba2V5XSBhcyBNLCBjb250ZXh0KTtcbiAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleSh1cGRhdGVkKS5pZDtcbiAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKFxuICAgIGNvbnRleHQsXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIHVwZGF0ZWRbcGtdIGFzIHN0cmluZyxcbiAgICB1cGRhdGVkXG4gICk7XG4gIG1vZGVsW2tleV0gPSB1cGRhdGVkW3BrXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZSkgcmV0dXJuO1xuICBpZiAoZGF0YS5jYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIGNvbnN0IGlubmVyUmVwbzogUmVwbzxNPiA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKG1vZGVsLCBrZXkpO1xuICBsZXQgZGVsZXRlZDogTTtcbiAgaWYgKCEocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSlcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShtb2RlbFtrZXldIGFzIHN0cmluZywgY29udGV4dCk7XG4gIGVsc2VcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShcbiAgICAgIChtb2RlbFtrZXldIGFzIE0pW2lubmVyUmVwby5wayBhcyBrZXlvZiBNXSBhcyBzdHJpbmcsXG4gICAgICBjb250ZXh0XG4gICAgKTtcbiAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKFxuICAgIGNvbnRleHQsXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIGRlbGV0ZWRbaW5uZXJSZXBvLnBrXSBhcyBzdHJpbmcsXG4gICAgZGVsZXRlZFxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWVzOiBhbnkgPSBtb2RlbFtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWVzIHx8ICFwcm9wZXJ0eVZhbHVlcy5sZW5ndGgpIHJldHVybjtcbiAgY29uc3QgYXJyYXlUeXBlID0gdHlwZW9mIHByb3BlcnR5VmFsdWVzWzBdO1xuICBpZiAoIXByb3BlcnR5VmFsdWVzLmV2ZXJ5KChpdGVtOiBhbnkpID0+IHR5cGVvZiBpdGVtID09PSBhcnJheVR5cGUpKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEludmFsaWQgb3BlcmF0aW9uLiBBbGwgZWxlbWVudHMgb2YgcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBtdXN0IG1hdGNoIHRoZSBzYW1lIHR5cGUuYFxuICAgICk7XG4gIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IG5ldyBTZXQoWy4uLnByb3BlcnR5VmFsdWVzXSk7XG4gIGlmIChhcnJheVR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCByZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIGtleSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiB1bmlxdWVWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCByZXBvLnJlYWQoaWQpO1xuICAgICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCByZWFkKTtcbiAgICB9XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBrTmFtZSA9IGZpbmRQcmltYXJ5S2V5KHByb3BlcnR5VmFsdWVzWzBdKS5pZDtcblxuICBjb25zdCByZXN1bHQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGZvciAoY29uc3QgbSBvZiBwcm9wZXJ0eVZhbHVlcykge1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKG0sIGNvbnRleHQpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCByZWNvcmRbcGtOYW1lXSwgcmVjb3JkKTtcbiAgICByZXN1bHQuYWRkKHJlY29yZFtwa05hbWVdKTtcbiAgfVxuXG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4ucmVzdWx0XTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvTWFueU9uVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGNhc2NhZGUgfSA9IGRhdGE7XG4gIGlmIChjYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIHJldHVybiBvbmVUb01hbnlPbkNyZWF0ZS5hcHBseSh0aGlzIGFzIGFueSwgW1xuICAgIGNvbnRleHQsXG4gICAgZGF0YSxcbiAgICBrZXkgYXMga2V5b2YgTW9kZWwsXG4gICAgbW9kZWwsXG4gIF0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkYXRhLmNhc2NhZGUuZGVsZXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgdmFsdWVzID0gbW9kZWxba2V5XSBhcyBhbnk7XG4gIGlmICghdmFsdWVzIHx8ICF2YWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiB2YWx1ZXNbMF07XG4gIGNvbnN0IGFyZUFsbFNhbWVUeXBlID0gdmFsdWVzLmV2ZXJ5KChpdGVtOiBhbnkpID0+IHR5cGVvZiBpdGVtID09PSBhcnJheVR5cGUpO1xuICBpZiAoIWFyZUFsbFNhbWVUeXBlKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEludmFsaWQgb3BlcmF0aW9uLiBBbGwgZWxlbWVudHMgb2YgcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBtdXN0IG1hdGNoIHRoZSBzYW1lIHR5cGUuYFxuICAgICk7XG4gIGNvbnN0IGlzSW5zdGFudGlhdGVkID0gYXJyYXlUeXBlID09PSBcIm9iamVjdFwiO1xuICBjb25zdCByZXBvID0gaXNJbnN0YW50aWF0ZWRcbiAgICA/IFJlcG9zaXRvcnkuZm9yTW9kZWwodmFsdWVzWzBdKVxuICAgIDogcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIGtleSk7XG5cbiAgY29uc3QgdW5pcXVlVmFsdWVzID0gbmV3IFNldChbXG4gICAgLi4uKGlzSW5zdGFudGlhdGVkXG4gICAgICA/IHZhbHVlcy5tYXAoKHY6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZbcmVwby5wayBhcyBzdHJpbmddKVxuICAgICAgOiB2YWx1ZXMpLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IGlkIG9mIHVuaXF1ZVZhbHVlcy52YWx1ZXMoKSkge1xuICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCByZXBvLmRlbGV0ZShpZCwgY29udGV4dCk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCBkZWxldGVkKTtcbiAgfVxuICAobW9kZWwgYXMgYW55KVtrZXldID0gWy4uLnVuaXF1ZVZhbHVlc107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3B1bGF0ZUtleShcbiAgdGFibGVOYW1lOiBzdHJpbmcsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4pIHtcbiAgcmV0dXJuIFtQZXJzaXN0ZW5jZUtleXMuUE9QVUxBVEUsIHRhYmxlTmFtZSwgZmllbGROYW1lLCBpZF0uam9pbihcIi5cIik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWNoZU1vZGVsRm9yUG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbj4oXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIHBhcmVudE1vZGVsOiBNLFxuICBwcm9wZXJ0eUtleToga2V5b2YgTSB8IHN0cmluZyxcbiAgcGtWYWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICBjYWNoZVZhbHVlOiBhbnlcbikge1xuICBjb25zdCBjYWNoZUtleSA9IGdldFBvcHVsYXRlS2V5KFxuICAgIHBhcmVudE1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgcHJvcGVydHlLZXkgYXMgc3RyaW5nLFxuICAgIHBrVmFsdWVcbiAgKTtcbiAgcmV0dXJuIGNvbnRleHQuYWNjdW11bGF0ZSh7IFtjYWNoZUtleV06IGNhY2hlVmFsdWUgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3B1bGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnBvcHVsYXRlKSByZXR1cm47XG4gIGNvbnN0IG5lc3RlZDogYW55ID0gbW9kZWxba2V5XTtcbiAgY29uc3QgaXNBcnIgPSBBcnJheS5pc0FycmF5KG5lc3RlZCk7XG4gIGlmICh0eXBlb2YgbmVzdGVkID09PSBcInVuZGVmaW5lZFwiIHx8IChpc0FyciAmJiBuZXN0ZWQubGVuZ3RoID09PSAwKSkgcmV0dXJuO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgYzogQ29udGV4dDxGPixcbiAgICBtb2RlbDogTSxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIHByb3BLZXlWYWx1ZXM6IGFueVtdXG4gICkge1xuICAgIGxldCBjYWNoZUtleTogc3RyaW5nO1xuICAgIGxldCB2YWw6IGFueTtcbiAgICBjb25zdCByZXN1bHRzOiBNW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb0tleVZhbHVlIG9mIHByb3BLZXlWYWx1ZXMpIHtcbiAgICAgIGNhY2hlS2V5ID0gZ2V0UG9wdWxhdGVLZXkobW9kZWwuY29uc3RydWN0b3IubmFtZSwgcHJvcE5hbWUsIHByb0tleVZhbHVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbCA9IGF3YWl0IGMuZ2V0KGNhY2hlS2V5IGFzIGFueSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBjb25zdCByZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIHByb3BOYW1lKTtcbiAgICAgICAgaWYgKCFyZXBvKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHJlcG9cIik7XG4gICAgICAgIHZhbCA9IGF3YWl0IHJlcG8ucmVhZChwcm9LZXlWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXN1bHRzLnB1c2godmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hQb3B1bGF0ZVZhbHVlcyhcbiAgICBjb250ZXh0LFxuICAgIG1vZGVsLFxuICAgIGtleSBhcyBzdHJpbmcsXG4gICAgaXNBcnIgPyBuZXN0ZWQgOiBbbmVzdGVkXVxuICApO1xuICAobW9kZWwgYXMgYW55KVtrZXldID0gaXNBcnIgPyByZXMgOiByZXNbMF07XG59XG5cbmNvbnN0IGNvbW1vbVR5cGVzID0gW1xuICBcImFycmF5XCIsXG4gIFwic3RyaW5nXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiYm9vbGVhblwiLFxuICBcInN5bWJvbFwiLFxuICBcImZ1bmN0aW9uXCIsXG4gIFwib2JqZWN0XCIsXG4gIFwidW5kZWZpbmVkXCIsXG4gIFwibnVsbFwiLFxuICBcImJpZ2ludFwiLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBhbnksXG4gIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBrZXlvZiBNXG4pOiBSZXBvPE0+IHtcbiAgY29uc3QgdHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIFZhbGlkYXRpb24ua2V5KFxuICAgICAgQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgICAgID8gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICA6IFZhbGlkYXRpb25LZXlzLlRZUEVcbiAgICApLFxuICAgIG1vZGVsLFxuICAgIHByb3BlcnR5S2V5IGFzIHN0cmluZ1xuICApO1xuICBjb25zdCBjdXN0b21UeXBlczogYW55ID0gQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgPyB0eXBlcy5jbGF6elxuICAgIDogdHlwZXMuY3VzdG9tVHlwZXM7XG4gIGlmICghdHlwZXMgfHwgIWN1c3RvbVR5cGVzKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBmaW5kIHR5cGVzIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5ICR7cHJvcGVydHlLZXkgYXMgc3RyaW5nfWBcbiAgICApO1xuXG4gIGNvbnN0IGFsbG93ZWRUeXBlczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KGN1c3RvbVR5cGVzKVxuICAgID8gWy4uLmN1c3RvbVR5cGVzXVxuICAgIDogW2N1c3RvbVR5cGVzXTtcbiAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gYWxsb3dlZFR5cGVzLmZpbmQoXG4gICAgKHQpID0+ICFjb21tb21UeXBlcy5pbmNsdWRlcyhgJHt0fWAudG9Mb3dlckNhc2UoKSlcbiAgKTtcbiAgaWYgKCFjb25zdHJ1Y3Rvck5hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgUHJvcGVydHkga2V5ICR7cHJvcGVydHlLZXkgYXMgc3RyaW5nfSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgY29uc3RydWN0b3IgdHlwZWBcbiAgICApO1xuICBjb25zdCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfCB1bmRlZmluZWQgPSBNb2RlbC5nZXQoY29uc3RydWN0b3JOYW1lKTtcbiAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gcmVnaXN0ZXJlZCBtb2RlbCBmb3VuZCBmb3IgJHtjb25zdHJ1Y3Rvck5hbWV9YCk7XG5cbiAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoY29uc3RydWN0b3IpO1xufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoQ29ubmVjdGlvbkVycm9yLm5hbWUsIG1zZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoVW5zdXBwb3J0ZWRFcnJvci5uYW1lLCBtc2cpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb25mbGljdEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIG9uRGVsZXRlLFxuICBvblVwZGF0ZSxcbiAgYWZ0ZXJBbnksXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgQ29udGV4dCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENhc2NhZGVNZXRhZGF0YSwgSW5kZXhNZXRhZGF0YSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Q2FzY2FkZSwgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBsaXN0LFxuICBNb2RlbCxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICB0eXBlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcXVlcnkvQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBSZWxhdGlvbnNNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBvbmVUb01hbnlPbkNyZWF0ZSxcbiAgb25lVG9NYW55T25EZWxldGUsXG4gIG9uZVRvTWFueU9uVXBkYXRlLFxuICBvbmVUb09uZU9uQ3JlYXRlLFxuICBvbmVUb09uZU9uRGVsZXRlLFxuICBvbmVUb09uZU9uVXBkYXRlLFxuICBwb3B1bGF0ZSBhcyBwb3AsXG59IGZyb20gXCIuL2NvbnN0cnVjdGlvblwiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9lcnJvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBtZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpLCB0YWJsZU5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZykge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pLCBjb2x1bW5OYW1lKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBJbmRleCBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aWxsIHRoZSBpbmRleCBpbiB0aGVcbiAqIERCIGZvciBwZXJmb3JtYW5jZSBpbiBxdWVyaWVzXG4gKlxuICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbltdfSBbZGlyZWN0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdXG4gKlxuICogQGZ1bmN0aW9uIGluZGV4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleChkaXJlY3Rpb25zPzogT3JkZXJEaXJlY3Rpb25bXSwgY29tcG9zaXRpb25zPzogc3RyaW5nW10pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShcbiAgICAgIGAke1BlcnNpc3RlbmNlS2V5cy5JTkRFWH0ke2NvbXBvc2l0aW9ucyAmJiBjb21wb3NpdGlvbnMubGVuZ3RoID8gYC4ke2NvbXBvc2l0aW9ucy5qb2luKFwiLlwiKX1gIDogXCJcIn1gXG4gICAgKSxcbiAgICB7XG4gICAgICBkaXJlY3Rpb25zOiBkaXJlY3Rpb25zLFxuICAgICAgY29tcG9zaXRpb25zOiBjb21wb3NpdGlvbnMsXG4gICAgfSBhcyBJbmRleE1ldGFkYXRhXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBDLCBGPixcbiAgViBleHRlbmRzIG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEobW9kZWwgYXMgYW55KVtrZXldKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zZWxlY3QoKVxuICAgIC53aGVyZShDb25kaXRpb24uYXR0cmlidXRlKGtleSBhcyBzdHJpbmcpLmVxKChtb2RlbCBhcyBhbnkpW2tleV0pKVxuICAgIC5leGVjdXRlPE1bXT4oKTtcbiAgaWYgKGV4aXN0aW5nLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgIGBtb2RlbCBhbHJlYWR5IGV4aXN0cyB3aXRoIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gZXF1YWwgdG8gJHtKU09OLnN0cmluZ2lmeSgobW9kZWwgYXMgYW55KVtrZXldLCB1bmRlZmluZWQsIDIpfWBcbiAgICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFVuaXF1ZSBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBUYWdzIGEgcHJvcGVydHkgYXMgdW5pcXVlLlxuICogIE5vIG90aGVyIGVsZW1lbnRzIGluIHRoYXQgdGFibGUgY2FuIGhhdmUgdGhlIHNhbWUgcHJvcGVydHkgdmFsdWVcbiAqXG4gKiBAZnVuY3Rpb24gdW5pcXVlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp3YWxsZXQtZGIuRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlKCkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgb25DcmVhdGVVcGRhdGUodW5pcXVlT25DcmVhdGVVcGRhdGUpLFxuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVU5JUVVFKSwge30pXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBDLCBGPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBkYXRhOiBWLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlZEJ5KCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBPbmUgVG8gT25lIHJlbGF0aW9uIERlY29yYXRvcnNcbiAqXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IGNsYXp6IHRoZSB7QGxpbmsgU2VxdWVuY2V9IHRvIHVzZS4gRGVmYXVsdHMgdG8ge0BsaW5rIE5vbmVTZXF1ZW5jZX1cbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHBvcHVsYXRlIElmIHRydWUsIHJlcGxhY2VzIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBkb2N1bWVudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICpcbiAqIEBmdW5jdGlvbiBvblRvT25lXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp3YWxsZXQtZGIuRGVjb3JhdG9yc1xuICpcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9PbmU8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZVxuKSB7XG4gIE1vZGVsLnJlZ2lzdGVyKGNsYXp6KTtcbiAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgIGNsYXNzOiBjbGF6ei5uYW1lLFxuICAgIGNhc2NhZGU6IGNhc2NhZGVPcHRpb25zLFxuICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgfTtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgdHlwZShbY2xhenoubmFtZSwgU3RyaW5nLm5hbWUsIE51bWJlci5uYW1lLCBCaWdJbnQubmFtZV0pLFxuICAgICAgb25DcmVhdGUob25lVG9PbmVPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25VcGRhdGUob25lVG9PbmVPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25EZWxldGUob25lVG9PbmVPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgT25lIFRvIE1hbnkgcmVsYXRpb24gRGVjb3JhdG9yc1xuICpcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gY2xhenogdGhlIHtAbGluayBTZXF1ZW5jZX0gdG8gdXNlLiBEZWZhdWx0cyB0byB7QGxpbmsgTm9uZVNlcXVlbmNlfVxuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9uc11cbiAqXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55XG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp3YWxsZXQtZGIuRGVjb3JhdG9yc1xuICpcbiAqIEBzZWUgb25lVG9PbmVcbiAqIEBzZWUgbWFueVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVUb01hbnk8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZVxuKSB7XG4gIE1vZGVsLnJlZ2lzdGVyKGNsYXp6KTtcbiAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgIGNsYXNzOiBjbGF6ei5uYW1lLFxuICAgIGNhc2NhZGU6IGNhc2NhZGVPcHRpb25zLFxuICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgfTtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcHVycG9zZWZ1bCBvdmVycmlkZVxuICAgICAgbGlzdChbY2xhenosIFN0cmluZywgTnVtYmVyLCBCaWdJbnRdKSxcbiAgICAgIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIGFmdGVyQW55KHBvcCwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IE1hbnkgVG8gT25lIHJlbGF0aW9uIERlY29yYXRvcnNcbiAqXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IGNsYXp6IHRoZSB7QGxpbmsgU2VxdWVuY2V9IHRvIHVzZS4gRGVmYXVsdHMgdG8ge0BsaW5rIE5vbmVTZXF1ZW5jZX1cbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnNdXG4gKlxuICogQGZ1bmN0aW9uIG1hbnlUb09uZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6d2FsbGV0LWRiLkRlY29yYXRvcnNcbiAqXG4gKiBAc2VlIG9uZVRvTWFueVxuICogQHNlZSBvbmVUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFueVRvT25lKFxuICBjbGF6ejogQ29uc3RydWN0b3I8YW55PixcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZSA9IHRydWVcbikge1xuICBNb2RlbC5yZWdpc3RlcihjbGF6eik7XG4gIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICBjbGFzczogY2xhenoubmFtZSxcbiAgICBjYXNjYWRlOiBjYXNjYWRlT3B0aW9ucyxcbiAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gIH07XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX09ORSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICB0eXBlKFtjbGF6ei5uYW1lLCBTdHJpbmcubmFtZSwgTnVtYmVyLm5hbWUsIEJpZ0ludC5uYW1lXSksXG4gICAgICAvLyBvbkNyZWF0ZShvbmVUb01hbnlPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25VcGRhdGUob25lVG9NYW55T25VcGRhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBhZnRlckFsbChwb3B1bGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuIiwiaW1wb3J0IHtcbiAgRGVjb3JhdGlvbixcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbiAgcmVxdWlyZWQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMsXG4gIFNlcXVlbmNlT3B0aW9ucyxcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQge1xuICBEQktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICByZWFkb25seSxcbiAgUmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gXCIuLi9tb2RlbC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBzZXF1ZW5jZU5hbWVGb3JNb2RlbCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFByaW1hcnkgS2V5IERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIE1hcmtzIHRoZSBwcm9wZXJ0eSBhcyB0aGUge0BsaW5rIE1vZGVsfXMgcHJpbWFyeSBrZXkuXG4gKiAgQWxzbyBtYXJrcyB0aGUgcHJvcGVydHkgYXMge0BsaW5rIHVuaXF1ZX0gYXMge0ByZXF1aXJlZH0gYW5kIGVuc3VyZXMgdGhlIGluZGV4IGlzIGNyZWF0ZWQgcHJvcGVybHkgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCB7QGxpbmsgU2VxdWVuY2V9XG4gKlxuICpcbiAqXG4gKiBAZnVuY3Rpb24gcGtcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOndhbGxldC1kYi5EZWNvcmF0b3JzXG4gKlxuICogQHNlZSB1bmlxdWVcbiAqIEBzZWUgcmVxdWlyZWRcbiAqIEBzZWUgb25cbiAqIEBwYXJhbSBkYXRhXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gbW9kZWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBrT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgQywgRj4sXG4gIFYgZXh0ZW5kcyBTZXF1ZW5jZU9wdGlvbnMsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZGF0YS50eXBlIHx8IG1vZGVsW2tleV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXRQcmltYXJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuICBpZiAoIWRhdGEubmFtZSkgZGF0YS5uYW1lID0gc2VxdWVuY2VOYW1lRm9yTW9kZWwobW9kZWwsIFwicGtcIik7XG4gIGxldCBzZXF1ZW5jZTogU2VxdWVuY2U7XG4gIHRyeSB7XG4gICAgc2VxdWVuY2UgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuU2VxdWVuY2UoZGF0YSk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBpbnN0YW50aWF0ZSBTZXF1ZW5jZSAke2RhdGEubmFtZX06ICR7ZX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG5leHQgPSBhd2FpdCBzZXF1ZW5jZS5uZXh0KCk7XG4gIHNldFByaW1hcnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgbmV4dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwayhcbiAgb3B0czogT21pdDxcbiAgICBTZXF1ZW5jZU9wdGlvbnMsXG4gICAgXCJjeWNsZVwiIHwgXCJzdGFydFdpdGhcIiB8IFwiaW5jcmVtZW50QnlcIlxuICA+ID0gRGVmYXVsdFNlcXVlbmNlT3B0aW9uc1xuKSB7XG4gIG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0U2VxdWVuY2VPcHRpb25zLCBvcHRzKSBhcyBTZXF1ZW5jZU9wdGlvbnM7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KERCS2V5cy5JRCk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIGluZGV4KFtPcmRlckRpcmVjdGlvbi5BU0MsIE9yZGVyRGlyZWN0aW9uLkRTQ10pLFxuICAgICAgcmVxdWlyZWQoKSxcbiAgICAgIHJlYWRvbmx5KCksXG4gICAgICAvLyB0eXBlKFtTdHJpbmcubmFtZSwgTnVtYmVyLm5hbWUsIEJpZ0ludC5uYW1lXSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBvcHRzIGFzIFNlcXVlbmNlT3B0aW9ucyksXG4gICAgICBvbkNyZWF0ZShwa09uQ3JlYXRlLCBvcHRzIGFzIFNlcXVlbmNlT3B0aW9ucylcbiAgICApXG4gICAgLmFwcGx5KCk7XG59XG4iLCJpbXBvcnQgeyBEQk9wZXJhdGlvbnMsIHRpbWVzdGFtcCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWxBcmcsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBAdGltZXN0YW1wKERCT3BlcmF0aW9ucy5DUkVBVEUpXG4gIGNyZWF0ZWRPbiE6IERhdGU7XG4gIEB0aW1lc3RhbXAoKVxuICB1cGRhdGVkT24hOiBEYXRlO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgcHJvcE1ldGFkYXRhLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbk1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFBlcnNpc3RlbmNlS2V5cy5DTEFVU0VfU0VRVUVOQ0UsIHtcbiAgdmFsdWU6IFwiSW52YWxpZCBjbGF1c2Ugc2VxdWVuY2U6IHswfVwiLFxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWYWxpZGF0aW9uS2V5cywgXCJDTEFVU0VfU0VRVUVOQ0VcIiwge1xuICB2YWx1ZTogUGVyc2lzdGVuY2VLZXlzLkNMQVVTRV9TRVFVRU5DRSxcbn0pO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdXG4gKlxuICogQGZ1bmN0aW9uIGNsYXVzZVNlcXVlbmNlXG4gKlxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqIEBzdWJjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGF1c2VTZXF1ZW5jZShtZXNzYWdlPzogc3RyaW5nKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCksXG4gICAge1xuICAgICAgbWVzc2FnZTpcbiAgICAgICAgbWVzc2FnZSB8fFxuICAgICAgICAoKERFRkFVTFRfRVJST1JfTUVTU0FHRVMgYXMgYW55KVtcbiAgICAgICAgICBQZXJzaXN0ZW5jZUtleXMuQ0xBVVNFX1NFUVVFTkNFIGFzIGFueVxuICAgICAgICBdIGFzIHN0cmluZyksXG4gICAgfVxuICApO1xufVxuIiwiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgc2YsXG4gIHZhbGlkYXRvcixcbiAgVmFsaWRhdG9yLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDbGF1c2UgfSBmcm9tIFwiLi4vcXVlcnkvQ2xhdXNlXCI7XG5pbXBvcnQgeyBNYW5kYXRvcnlQcmlvcml0aWVzIH0gZnJvbSBcIi4uL3F1ZXJ5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuLi9xdWVyeS9lcnJvcnNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSB7QGxpbmsgU2VxdWVuY2V9J3Mge0BsaW5rIENsYXVzZX1zXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXVxuICpcbiAqIEBjbGFzcyBDbGF1c2VTZXF1ZW5jZVZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqIEBzdWJjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoUGVyc2lzdGVuY2VLZXlzLkNMQVVTRV9TRVFVRU5DRSlcbmV4cG9ydCBjbGFzcyBDbGF1c2VTZXF1ZW5jZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVNbUGVyc2lzdGVuY2VLZXlzLkNMQVVTRV9TRVFVRU5DRV1cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlU2VxdWVuY2UoXG4gICAgY2xhdXNlczogQ2xhdXNlPGFueT5bXSxcbiAgICBtZXNzYWdlPzogc3RyaW5nXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIE1hbmRhdG9yeVByaW9yaXRpZXMuZXZlcnkoXG4gICAgICAocCkgPT4gISFjbGF1c2VzLmZpbmQoKGMpID0+IGMuZ2V0UHJpb3JpdHkoKSA9PT0gcClcbiAgICApXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgc2YobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIFwiTWlzc2luZyByZXF1aXJlZCBDbGF1c2UgUHJpb3JpdGllc1wiKVxuICAgICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZlcmlmaWVzIHRoZSBtb2RlbCBmb3IgZXJyb3JzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1ZhbGlkYXRvck9wdGlvbnN9IFtvcHRpb25zXVxuICAgKlxuICAgKiBAcmV0dXJuIEVycm9yc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3JcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnModmFsdWU6IGFueSwgb3B0aW9ucz86IFZhbGlkYXRvck9wdGlvbnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAoXG4gICAgICAgICF2YWx1ZSB8fFxuICAgICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcbiAgICAgICAgIXZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAhdmFsdWUuZXZlcnkoKGUpID0+IGUgaW5zdGFuY2VvZiBDbGF1c2UpXG4gICAgICApXG4gICAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgc2YoXG4gICAgICAgICAgICAob3B0aW9ucyB8fCB7fSkubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICAgICAgICBcIk5vIG9yIGludmFsaWQgQ2xhdXNlcyBmb3VuZFwiXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBjbGF1c2VzOiBDbGF1c2U8YW55PltdID0gdmFsdWUgYXMgQ2xhdXNlPGFueT5bXTtcblxuICAgICAgY29uc3QgY2xhdXNlRXJyb3JzID0gY2xhdXNlcy5yZWR1Y2UoXG4gICAgICAgIChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjOiBDbGF1c2U8YW55PikgPT4ge1xuICAgICAgICAgIGNvbnN0IGVycnMgPSBjLmhhc0Vycm9ycygpO1xuICAgICAgICAgIGlmIChlcnJzKVxuICAgICAgICAgICAgaWYgKGFjY3VtKVxuICAgICAgICAgICAgICBhY2N1bSArPSBzZihcbiAgICAgICAgICAgICAgICBcIlxcbkNsYXVzZSB7MH06IHsxfVwiLFxuICAgICAgICAgICAgICAgIGMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICAgICBlcnJzLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgYWNjdW0gPSBzZihcbiAgICAgICAgICAgICAgICBcIkNsYXVzZSB7MH06IHsxfVwiLFxuICAgICAgICAgICAgICAgIGMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICAgICBlcnJzLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcblxuICAgICAgaWYgKGNsYXVzZUVycm9ycylcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgICBzZigob3B0aW9ucyB8fCB7fSkubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIGNsYXVzZUVycm9ycy50b1N0cmluZygpKVxuICAgICAgICApO1xuXG4gICAgICBjb25zdCB2ZXJpZnlQcmlvcml0eSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJpb3JpdGllcyA9IGNsYXVzZXMubWFwKChjKSA9PiBjLmdldFByaW9yaXR5KCkpO1xuICAgICAgICBjb25zdCBhbGxVbmlxdWUgPSBuZXcgU2V0KHByaW9yaXRpZXMpLnNpemUgPT09IHByaW9yaXRpZXMubGVuZ3RoO1xuICAgICAgICBpZiAoIWFsbFVuaXF1ZSkgcmV0dXJuIFwiTm90IGFsbCBjbGF1c2VzICBoYXZlIHVuaXF1ZSBwcmlvcml0aWVzXCI7XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IHByaW9yaXRpZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIHJldHVybiBiIC0gYTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGlzRXF1YWwocHJpb3JpdGllcywgc29ydGVkKVxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogXCJDbGF1c2VzICBhcmUgbm90IHByb3Blcmx5IHNvcnRlZFwiO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcHJpb3JpdHlDaGVjayA9IHZlcmlmeVByaW9yaXR5KCk7XG4gICAgICBpZiAocHJpb3JpdHlDaGVjayAhPT0gdHJ1ZSlcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgICBzZigob3B0aW9ucyB8fCB7fSkubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIFwiSW52YWxpZCBwcmlvcml0aXphdGlvblwiKVxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBzZXF1ZW5jZUNoZWNrID0gdGhpcy52YWxpZGF0ZVNlcXVlbmNlKFxuICAgICAgICBjbGF1c2VzLFxuICAgICAgICAob3B0aW9ucyB8fCB7fSkubWVzc2FnZVxuICAgICAgKTtcbiAgICAgIGlmIChzZXF1ZW5jZUNoZWNrKVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICAgIHNmKChvcHRpb25zIHx8IHt9KS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgXCJJbnZhbGlkIHNlcXVlbmNlXCIpXG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgc2YoXCJGYWlsZWQgdG8gdmVyaWZ5IGNsYXVzZSBzZXF1ZW5jZSB7MH06IHsxfVwiLCB2YWx1ZSwgZSlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgbWlubGVuZ3RoLFxuICBNb2RlbCxcbiAgTW9kZWxFcnJvckRlZmluaXRpb24sXG4gIHJlcXVpcmVkLFxuICB0eXBlLFxuICBzZixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRXhlY3V0b3IsIFJhd0V4ZWN1dG9yIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IE1hbmRhdG9yeVByaW9yaXRpZXMsIFN0YXRlbWVudFR5cGUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IENsYXVzZSB9IGZyb20gXCIuL0NsYXVzZVwiO1xuaW1wb3J0IHsgY2xhdXNlU2VxdWVuY2UgfSBmcm9tIFwiLi4vdmFsaWRhdG9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXksIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhZ2luYXRvciB9IGZyb20gXCIuL1BhZ2luYXRvclwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFN0YXRlbWVudCBDbGFzc1xuICogQGRlc2NyaXB0aW9uIGhvbGRzIGFsbCB0aGUgY2xhdXNlcyB1bnRpbCB0aGV5IGNhbiBiZSBwcm9jZXNzZWRcbiAqXG4gKiBAcGFyYW0ge01vZGVsQXJnfSBbc3RhdGVtZW50XVxuICpcbiAqIEBjbGFzcyBTdGF0ZW1lbnRcbiAqIEBleHRlbmRzIE1vZGVsXG4gKiBAaW1wbGVtZW50cyBFeGVjdXRvclxuICogQGltcGxlbWVudHMgUmF3RXhlY3V0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0YXRlbWVudDxRPlxuICBleHRlbmRzIE1vZGVsXG4gIGltcGxlbWVudHMgRXhlY3V0b3IsIFJhd0V4ZWN1dG9yPFE+XG57XG4gIEByZXF1aXJlZCgpXG4gIEBtaW5sZW5ndGgoTWFuZGF0b3J5UHJpb3JpdGllcy5sZW5ndGgpXG4gIEBjbGF1c2VTZXF1ZW5jZSgpXG4gIHByb3RlY3RlZCBjbGF1c2VzPzogQ2xhdXNlPGFueT5bXSA9IHVuZGVmaW5lZDtcbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoW1wib2JqZWN0XCJdKVxuICBwcm90ZWN0ZWQgYWRhcHRlcjogQWRhcHRlcjxhbnksIFEsIGFueSwgYW55PjtcbiAgQHJlcXVpcmVkKClcbiAgcHJvdGVjdGVkIHRhcmdldD86IENvbnN0cnVjdG9yPGFueT4gPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIGZ1bGxSZWNvcmQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgdHlwZT86IHN0cmluZyA9IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoZGI6IEFkYXB0ZXI8YW55LCBRLCBhbnksIGFueT4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRhcHRlciA9IGRiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkKCk6IFEge1xuICAgIGlmICghdGhpcy5jbGF1c2VzKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3Ioc2YoXCJGYWlsZWQgdG8gYnVpbGQgU3RhdGVtZW50OlxcbnswfVwiLCBcIk5vIENsYXVzZXNcIikpO1xuICAgIHRoaXMuY2xhdXNlcy5zb3J0KChjMSwgYzIpID0+IHtcbiAgICAgIHJldHVybiBjMS5nZXRQcmlvcml0eSgpIC0gYzIuZ2V0UHJpb3JpdHkoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuaGFzRXJyb3JzKCk7XG4gICAgaWYgKGVycm9ycylcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBzZihcIlBvb3JseSBidWlsdCBzdGF0ZW1lbnQ6IHswfVwiLCBlcnJvcnMudG9TdHJpbmcoKSlcbiAgICAgICk7XG5cbiAgICBsZXQgcXVlcnk6IFE7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gZnVuY3Rpb24gKFxuICAgICAgICBjbGF1c2VzOiBDbGF1c2U8YW55PltdLFxuICAgICAgICBwcmV2aW91czogYW55ID0ge31cbiAgICAgICk6IFEge1xuICAgICAgICBjb25zdCBjID0gY2xhdXNlcy5zaGlmdCgpO1xuICAgICAgICBpZiAoIWMpIHJldHVybiBwcmV2aW91cyBhcyBRO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYy5idWlsZChwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBpdGVyYXRvcihjbGF1c2VzLCByZXN1bHRzIGFzIGFueSk7XG4gICAgICB9O1xuXG4gICAgICBxdWVyeSA9IGl0ZXJhdG9yKG5ldyBBcnJheSguLi4odGhpcy5jbGF1c2VzIGFzIENsYXVzZTxRPltdKSkpIGFzIFE7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGU8WT4oKTogUHJvbWlzZTxZPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5OiBRID0gdGhpcy5idWlsZCgpO1xuICAgICAgcmV0dXJuIHRoaXMucmF3KHF1ZXJ5KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgcGFnaW5hdGU8WT4oc2l6ZTogbnVtYmVyKTogUHJvbWlzZTxQYWdpbmF0b3I8WSwgUT4+O1xuXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogUSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdzxSPihyYXdJbnB1dCwgdHJ1ZSwgLi4uYXJncyk7XG4gICAgaWYgKCF0aGlzLmZ1bGxSZWNvcmQpIHJldHVybiByZXN1bHRzO1xuICAgIGlmICghdGhpcy50YXJnZXQpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyB0YXJnZXQgZGVmaW5lZCBpbiBzdGF0ZW1lbnQuIHNob3VsZCBuZXZlciBoYXBwZW5cIlxuICAgICAgKTtcblxuICAgIGNvbnN0IHBrQXR0ciA9IGZpbmRQcmltYXJ5S2V5KG5ldyB0aGlzLnRhcmdldCgpIGFzIGFueSkuaWQ7XG5cbiAgICBjb25zdCBwcm9jZXNzb3IgPSBmdW5jdGlvbiByZWNvcmRQcm9jZXNzb3IodGhpczogU3RhdGVtZW50PFE+LCByOiBhbnkpIHtcbiAgICAgIGNvbnN0IGlkID0gcltwa0F0dHJdO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQoXG4gICAgICAgIHIsXG4gICAgICAgIHRoaXMudGFyZ2V0IGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgIHBrQXR0cixcbiAgICAgICAgaWRcbiAgICAgICkgYXMgYW55O1xuICAgIH0uYmluZCh0aGlzKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSByZXR1cm4gcmVzdWx0cy5tYXAocHJvY2Vzc29yKSBhcyBSO1xuICAgIHJldHVybiBwcm9jZXNzb3IocmVzdWx0cykgYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgaGFzRXJyb3JzKC4uLmV4Y2VwdGlvbnM6IHN0cmluZ1tdKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHN1cGVyLmhhc0Vycm9ycyguLi5leGNlcHRpb25zKTtcbiAgICBpZiAoZXJyb3JzKSByZXR1cm4gZXJyb3JzO1xuXG4gICAgZm9yIChjb25zdCBpIGluIHRoaXMuY2xhdXNlcykge1xuICAgICAgY29uc3QgZXJyID0gdGhpcy5jbGF1c2VzW2kgYXMgYW55XS5oYXNFcnJvcnMoKTtcbiAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEFkZHMgYSBjbGF1c2UgdG8gdGhlIFN0YXRlbWVudFxuICAgKiBAcGFyYW0ge0NsYXVzZX0gY2xhdXNlXG4gICAqL1xuICBhZGRDbGF1c2UoY2xhdXNlOiBDbGF1c2U8UT4pIHtcbiAgICBpZiAoIXRoaXMuY2xhdXNlcykgdGhpcy5jbGF1c2VzID0gW107XG5cbiAgICBjb25zdCBwcmlvcml0eSA9IGNsYXVzZS5nZXRQcmlvcml0eSgpO1xuICAgIGNvbnN0IGN1cnJlbnRQcmlvcml0eSA9IHRoaXMuY2xhdXNlc1xuICAgICAgLm1hcCgoYywgaSkgPT4gKHsgaW5kZXg6IGksIGNsYXVzZTogYyB9KSlcbiAgICAgIC5maW5kKChjKSA9PiBjLmNsYXVzZS5nZXRQcmlvcml0eSgpID09PSBwcmlvcml0eSk7XG4gICAgaWYgKGN1cnJlbnRQcmlvcml0eSkge1xuICAgICAgdGhpcy5jbGF1c2VzW2N1cnJlbnRQcmlvcml0eS5pbmRleF0gPSBjbGF1c2U7XG4gICAgfVxuICAgIHRoaXMuY2xhdXNlcy5wdXNoKGNsYXVzZSk7XG4gIH1cblxuICBnZXRBZGFwdGVyKCk6IEFkYXB0ZXI8YW55LCBRLCBhbnksIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgb3V0cHV0IGNsYXNzICh3aGVuIGV4aXN0aW5nKVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBjbGF6elxuICAgKi9cbiAgc2V0VGFyZ2V0KGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+KSB7XG4gICAgaWYgKHRoaXMudGFyZ2V0KVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIHNmKFwiT3V0cHV0IGNsYXNzIGFscmVhZHkgZGVmaW5lZCB0byB7MH1cIiwgdGhpcy50YXJnZXQhLm5hbWUpXG4gICAgICApO1xuICAgIHRoaXMudGFyZ2V0ID0gY2xheno7XG4gIH1cblxuICBnZXRUYXJnZXQoKSB7XG4gICAgaWYgKCF0aGlzLnRhcmdldClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gdGFyZ2V0IGRlZmluZWQgZm9yIHN0YXRlbWVudFwiKTtcbiAgICByZXR1cm4gdGhpcy50YXJnZXQ7XG4gIH1cblxuICBzZXRGdWxsUmVjb3JkKCkge1xuICAgIHRoaXMuZnVsbFJlY29yZCA9IHRydWU7XG4gIH1cblxuICBzZXRNb2RlKHR5cGU6IFN0YXRlbWVudFR5cGUpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRvciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQge1xuICBNb2RlbCxcbiAgTW9kZWxBcmcsXG4gIHJlcXVpcmVkLFxuICB0eXBlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyeUVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBQcmlvcml0eSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIi4vU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBQYWdpbmF0YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1BhZ2luYXRhYmxlXCI7XG5pbXBvcnQgeyBQYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcblxuLyoqXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBDbGF1c2UgQ2xhc3NcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIGEgQ2xhdXNlIGluIGEge0BsaW5rIFN0YXRlbWVudH1cbiAqXG4gKiBAdHlwZWRlZiBRIFJlcHJlc2VudHMgcXVlIHF1ZXJ5IG9iamVjdCB0aGUgcGVyc2lzdGVuY2UgYWRhcHRlciB1c2VzXG4gKlxuICogQHBhcmFtIHtNb2RlbEFyZzxDbGF1c2U8UT4+fSBbY2xhdXNlXVxuICpcbiAqIEBjbGFzcyBDbGF1c2VcbiAqIEBleHRlbmRzIE1vZGVsXG4gKiBAaW1wbGVtZW50cyBFeGVjdXRvclxuICogQGltcGxlbWVudHMgUXVlcnlCdWlsZGVyXG4gKiBAYWJzdHJhY3RcbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqIEBzdWJjYXRlZ29yeSBDbGF1c2VzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDbGF1c2U8UT5cbiAgZXh0ZW5kcyBNb2RlbFxuICBpbXBsZW1lbnRzIEV4ZWN1dG9yLCBQYWdpbmF0YWJsZSwgUXVlcnlCdWlsZGVyPFE+XG57XG4gIEByZXF1aXJlZCgpXG4gIHJlYWRvbmx5IHByaW9yaXR5ITogUHJpb3JpdHk7XG5cbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoXCJvYmplY3RcIilcbiAgcmVhZG9ubHkgc3RhdGVtZW50ITogU3RhdGVtZW50PFE+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxDbGF1c2U8UT4+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnByaW9yaXR5ID0gY2xhdXNlPy5wcmlvcml0eTtcbiAgICB0aGlzLnN0YXRlbWVudCA9IGNsYXVzZT8uc3RhdGVtZW50O1xuICAgIGlmICghdGhpcy5zdGF0ZW1lbnQgfHwgIXRoaXMucHJpb3JpdHkpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgXCJNaXNzaW5nIHN0YXRlbWVudCBvciBwcmlvcml0eS4gU2hvdWxkIGJlIGltcG9zc2libGVcIlxuICAgICAgKTtcbiAgICB0aGlzLnN0YXRlbWVudC5hZGRDbGF1c2UodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50LmdldEFkYXB0ZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgQ2xhdXNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQuZ2V0QWRhcHRlcigpLkNsYXVzZXM7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmV0dXJuIHRoZSBwcmlvcml0eSBvZiB0aGUgY2xhdXNlXG4gICAqIEBzZWUgUHJpb3JpdHlcbiAgICovXG4gIGdldFByaW9yaXR5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucHJpb3JpdHkgYXMgbnVtYmVyO1xuICB9XG5cbiAgYWJzdHJhY3QgYnVpbGQocHJldmlvdXM6IFEpOiBRO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGU8Uj4oKTogUHJvbWlzZTxSPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50LmV4ZWN1dGUoKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhc3luYyBwYWdpbmF0ZTxSPihzaXplOiBudW1iZXIpOiBQcm9taXNlPFBhZ2luYXRvcjxSLCBRPj4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudC5wYWdpbmF0ZShzaXplKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICAvLyAvKipcbiAgLy8gICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIHtAbGluayBGcm9tQ2xhdXNlfVxuICAvLyAgKiBAcGFyYW0ge3twcmlvcml0eTogbnVtYmVyLCBzdGF0ZW1lbnQ6IFN0YXRlbWVudCwgZ2V0UHJpb3JpdHk6IEZ1bmN0aW9uLCBidWlsZDogRnVuY3Rpb24sIHByb2Nlc3M6IEZ1bmN0aW9ufX0gY2xhdXNlXG4gIC8vICAqL1xuICAvLyBzdGF0aWMgaXNDbGF1c2UoY2xhdXNlOiBQYXJ0aWFsPENsYXVzZTxhbnk+Pikge1xuICAvLyAgIHJldHVybiBjbGF1c2UgaW5zdGFuY2VvZiBDbGF1c2U7XG4gIC8vICAgcmV0dXJuIChcbiAgLy8gICAgIGNsYXVzZS5jb25zdHJ1Y3RvciAmJlxuICAvLyAgICAgY2xhdXNlLmNvbnN0cnVjdG9yLm5hbWUgJiZcbiAgLy8gICAgIGNsYXVzZS5wcmlvcml0eSAmJlxuICAvLyAgICAgY2xhdXNlLnN0YXRlbWVudCAmJlxuICAvLyAgICAgY2xhdXNlLmdldFByaW9yaXR5ICYmXG4gIC8vICAgICBjbGF1c2UuYnVpbGQgJiZcbiAgLy8gICAgIGNsYXVzZS5leGVjdXRlXG4gIC8vICAgKTtcbiAgLy8gfVxufVxuIiwiaW1wb3J0IHsgQ2xhdXNlIH0gZnJvbSBcIi4uL0NsYXVzZVwiO1xuaW1wb3J0IHsgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBiYXNlIFNlbGVjdG9yIGJhc2VkIGNsYXVzZVxuICpcbiAqIEBwYXJhbSB7Q2xhdXNlQXJnfSBbY2xhdXNlXVxuICpcbiAqIEBjbGFzcyBTZWxlY3RvckJhc2VkQ2xhdXNlXG4gKiBAZXh0ZW5kcyBDbGF1c2VcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBjYXRlZ29yeSBRdWVyeVxuICogQHN1YmNhdGVnb3J5IENsYXVzZXNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlbGVjdG9yQmFzZWRDbGF1c2U8USwgUz4gZXh0ZW5kcyBDbGF1c2U8UT4ge1xuICAvKipcbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAcHJvcCBzZWxlY3RvclxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgc2VsZWN0b3I/OiBTID0gdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxTZWxlY3RvckJhc2VkQ2xhdXNlPFEsIFM+Pikge1xuICAgIHN1cGVyKGNsYXVzZSk7XG4gICAgdGhpcy5zZWxlY3RvciA9IChjbGF1c2UgYXMgeyBzZWxlY3RvcjogUyB9KS5zZWxlY3RvcjtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyBgWyR7dGhpcy5zZWxlY3Rvcn1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJpb3JpdHkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBGcm9tU2VsZWN0b3IsXG4gIEdyb3VwQnlTZWxlY3RvcixcbiAgTGltaXRTZWxlY3RvcixcbiAgT2Zmc2V0U2VsZWN0b3IsXG4gIE9yZGVyQnlTZWxlY3Rvcixcbn0gZnJvbSBcIi4uL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHtcbiAgTGltaXRPcHRpb24sXG4gIE9mZnNldE9wdGlvbixcbiAgT3JkZXJBbmRHcm91cE9wdGlvbixcbiAgV2hlcmVPcHRpb24sXG59IGZyb20gXCIuLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBTZWxlY3RvckJhc2VkQ2xhdXNlIH0gZnJvbSBcIi4vU2VsZWN0b3JCYXNlZENsYXVzZVwiO1xuaW1wb3J0IHsgRXhlY3V0b3IgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9Db25kaXRpb25cIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxBcmcsXG4gIHN0cmluZ0Zvcm1hdCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBGUk9NIGNsYXVzZVxuICpcbiAqIEBwYXJhbSB7TW9kZWxBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIEZyb21DbGF1c2VcbiAqIEBleHRlbmRzIFNlbGVjdG9yQmFzZWRDbGF1c2VcbiAqIEBpbXBsZW1lbnRzIFdoZXJlT3B0aW9uXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKiBAc3ViY2F0ZWdvcnkgQ2xhdXNlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRnJvbUNsYXVzZTxRLCBNIGV4dGVuZHMgTW9kZWw+XG4gIGV4dGVuZHMgU2VsZWN0b3JCYXNlZENsYXVzZTxRLCBGcm9tU2VsZWN0b3I8TT4+XG4gIGltcGxlbWVudHMgV2hlcmVPcHRpb25cbntcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNsYXVzZT86IE1vZGVsQXJnPEZyb21DbGF1c2U8USwgTT4+KSB7XG4gICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7fSwgY2xhdXNlLCB7IHByaW9yaXR5OiBQcmlvcml0eS5GUk9NIH0pKTtcbiAgICB0aGlzLnNlbGVjdG9yID1cbiAgICAgIHR5cGVvZiB0aGlzLnNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gTW9kZWwuZ2V0KHRoaXMuc2VsZWN0b3IpXG4gICAgICAgIDogdGhpcy5zZWxlY3RvcjtcbiAgICBpZiAoIXRoaXMuc2VsZWN0b3IpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihzdHJpbmdGb3JtYXQoXCJDb3VsZCBub3QgZmluZCBzZWxlY3RvciBtb2RlbDogezB9XCIpKTtcbiAgICB0aGlzLnN0YXRlbWVudC5zZXRUYXJnZXQodGhpcy5zZWxlY3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGFic3RyYWN0IGJ1aWxkKHF1ZXJ5OiBRKTogUTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHdoZXJlKGNvbmRpdGlvbjogQ29uZGl0aW9uKTogT3JkZXJBbmRHcm91cE9wdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuQ2xhdXNlcy53aGVyZSh0aGlzLnN0YXRlbWVudCwgY29uZGl0aW9uKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG9yZGVyQnkoLi4uc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcltdKTogTGltaXRPcHRpb24gJiBPZmZzZXRPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMub3JkZXJCeSh0aGlzLnN0YXRlbWVudCwgc2VsZWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZ3JvdXBCeShzZWxlY3RvcjogR3JvdXBCeVNlbGVjdG9yKTogRXhlY3V0b3Ige1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMuZ3JvdXBCeSh0aGlzLnN0YXRlbWVudCwgc2VsZWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgbGltaXQoc2VsZWN0b3I6IExpbWl0U2VsZWN0b3IpOiBPZmZzZXRPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMubGltaXQodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG9mZnNldChzZWxlY3RvcjogT2Zmc2V0U2VsZWN0b3IpOiBFeGVjdXRvciB7XG4gICAgcmV0dXJuIHRoaXMuQ2xhdXNlcy5vZmZzZXQodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBHcm91cEJ5U2VsZWN0b3IgfSBmcm9tIFwiLi4vc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBQcmlvcml0eSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNlbGVjdG9yQmFzZWRDbGF1c2UgfSBmcm9tIFwiLi9TZWxlY3RvckJhc2VkQ2xhdXNlXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIEdST1VQIEJZIGNsYXVzZVxuICpcbiAqIEBwYXJhbSB7Q2xhdXNlQXJnfSBbY2xhdXNlXVxuICpcbiAqIEBjbGFzcyBHcm91cEJ5Q2xhdXNlXG4gKiBAZXh0ZW5kcyBTZWxlY3RvckJhc2VkQ2xhdXNlXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKiBAc3ViY2F0ZWdvcnkgQ2xhdXNlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR3JvdXBCeUNsYXVzZTxRPiBleHRlbmRzIFNlbGVjdG9yQmFzZWRDbGF1c2U8XG4gIFEsXG4gIEdyb3VwQnlTZWxlY3RvclxuPiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxHcm91cEJ5Q2xhdXNlPFE+Pikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGNsYXVzZSwgeyBwcmlvcml0eTogUHJpb3JpdHkuR1JPVVBfQlkgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xufVxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgSW5zZXJ0T3B0aW9uLCBJbnRvT3B0aW9uLCBPcmRlckFuZEdyb3VwT3B0aW9uIH0gZnJvbSBcIi4uL29wdGlvbnNcIjtcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2xhdXNlIH0gZnJvbSBcIi4uL0NsYXVzZVwiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbEFyZyxcbiAgcmVxdWlyZWQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEV4ZWN1dG9yIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgSU5TRVJUL0lOVE8gY2xhdXNlXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIEZyb21DbGF1c2VcbiAqIEBleHRlbmRzIENsYXVzZVxuICogQGltcGxlbWVudHMgSW50b09wdGlvblxuICpcbiAqIEBjYXRlZ29yeSBRdWVyeVxuICogQHN1YmNhdGVnb3J5IENsYXVzZXNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluc2VydENsYXVzZTxRLCBNIGV4dGVuZHMgTW9kZWw+XG4gIGV4dGVuZHMgQ2xhdXNlPFE+XG4gIGltcGxlbWVudHMgSW5zZXJ0T3B0aW9uPE0+LCBJbnRvT3B0aW9uPE0+XG57XG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCB0YWJsZT86IHN0cmluZyA9IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xhdXNlPzogTW9kZWxBcmc8SW5zZXJ0Q2xhdXNlPFEsIE0+Pikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGNsYXVzZSwgeyBwcmlvcml0eTogUHJpb3JpdHkuU0VMRUNUIH0pKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGFic3RyYWN0IGJ1aWxkKHF1ZXJ5OiBRKTogUTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGludG8odGFibGU6IENvbnN0cnVjdG9yPE0+KTogSW50b09wdGlvbjxNPiB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlLm5hbWU7IC8vIFRPRE8gZ2V0IG1hcHBlZCBuYW1lXG4gICAgdGhpcy5zdGF0ZW1lbnQuc2V0VGFyZ2V0KHRhYmxlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHZhbHVlcyguLi5tb2RlbHM6IE1bXSk6IEV4ZWN1dG9yIHtcbiAgICByZXR1cm4gdGhpcy5DbGF1c2VzLnZhbHVlcyh0aGlzLnN0YXRlbWVudCwgbW9kZWxzKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHdoZXJlKGNvbmRpdGlvbjogQ29uZGl0aW9uKTogT3JkZXJBbmRHcm91cE9wdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuQ2xhdXNlcy53aGVyZSh0aGlzLnN0YXRlbWVudCwgY29uZGl0aW9uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VsZWN0b3JCYXNlZENsYXVzZSB9IGZyb20gXCIuL1NlbGVjdG9yQmFzZWRDbGF1c2VcIjtcbmltcG9ydCB7IE9mZnNldE9wdGlvbiB9IGZyb20gXCIuLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBFeGVjdXRvciB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBMaW1pdFNlbGVjdG9yLCBPZmZzZXRTZWxlY3RvciB9IGZyb20gXCIuLi9zZWxlY3RvcnNcIjtcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTGltaXQgQ2xhdXNlXG4gKiBAZGVzY3JpcHRpb24gTGltaXRzIHRoZSByZXN1bHRzXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIExpbWl0Q2xhdXNlXG4gKiBAZXh0ZW5kcyBTZWxlY3RvckJhc2VkQ2xhdXNlPFQ+XG4gKiBAaW1wbGVtZW50cyBPZmZzZXRPcHRpb248VD5cbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqIEBzdWJjYXRlZ29yeSBDbGF1c2VzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMaW1pdENsYXVzZTxRPlxuICBleHRlbmRzIFNlbGVjdG9yQmFzZWRDbGF1c2U8USwgTGltaXRTZWxlY3Rvcj5cbiAgaW1wbGVtZW50cyBPZmZzZXRPcHRpb25cbntcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNsYXVzZT86IE1vZGVsQXJnPExpbWl0Q2xhdXNlPFE+Pikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGNsYXVzZSwgeyBwcmlvcml0eTogUHJpb3JpdHkuR1JPVVBfQlkgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG9mZnNldChzZWxlY3RvcjogT2Zmc2V0U2VsZWN0b3IpOiBFeGVjdXRvciB7XG4gICAgcmV0dXJuIHRoaXMuQ2xhdXNlcy5vZmZzZXQodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VsZWN0b3JCYXNlZENsYXVzZSB9IGZyb20gXCIuL1NlbGVjdG9yQmFzZWRDbGF1c2VcIjtcbmltcG9ydCB7IE9mZnNldFNlbGVjdG9yIH0gZnJvbSBcIi4uL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgUHJpb3JpdHkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgT0ZGU0VUIGNsYXVzZVxuICpcbiAqIEBwYXJhbSB7Q2xhdXNlQXJnfSBbY2xhdXNlXVxuICpcbiAqIEBjbGFzcyBGcm9tQ2xhdXNlXG4gKiBAZXh0ZW5kcyBTZWxlY3RvckJhc2VkQ2xhdXNlXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKiBAc3ViY2F0ZWdvcnkgQ2xhdXNlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgT2Zmc2V0Q2xhdXNlPFE+IGV4dGVuZHMgU2VsZWN0b3JCYXNlZENsYXVzZTxcbiAgUSxcbiAgT2Zmc2V0U2VsZWN0b3Jcbj4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xhdXNlPzogTW9kZWxBcmc8T2Zmc2V0Q2xhdXNlPFE+Pikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGNsYXVzZSwgeyBwcmlvcml0eTogUHJpb3JpdHkuR1JPVVBfQlkgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xufVxuIiwiaW1wb3J0IHsgU2VsZWN0b3JCYXNlZENsYXVzZSB9IGZyb20gXCIuL1NlbGVjdG9yQmFzZWRDbGF1c2VcIjtcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgR3JvdXBCeVNlbGVjdG9yLFxuICBMaW1pdFNlbGVjdG9yLFxuICBPZmZzZXRTZWxlY3RvcixcbiAgT3JkZXJCeVNlbGVjdG9yLFxufSBmcm9tIFwiLi4vc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBMaW1pdE9wdGlvbiwgT2Zmc2V0T3B0aW9uIH0gZnJvbSBcIi4uL29wdGlvbnNcIjtcbmltcG9ydCB7IEV4ZWN1dG9yIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IE1vZGVsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuLyoqXG4gKiBAc3VtbWFyeSBUaGUgT1JERVIgQlkgY2xhdXNlXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIE9yZGVyQnlDbGF1c2VcbiAqIEBleHRlbmRzIFNlbGVjdG9yQmFzZWRDbGF1c2VcbiAqIEBpbXBsZW1lbnRzIExpbWl0T3B0aW9uXG4gKiBAaW1wbGVtZW50cyBPZmZzZXRPcHRpb25cbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqIEBzdWJjYXRlZ29yeSBDbGF1c2VzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPcmRlckJ5Q2xhdXNlPFE+XG4gIGV4dGVuZHMgU2VsZWN0b3JCYXNlZENsYXVzZTxRLCBPcmRlckJ5U2VsZWN0b3JbXT5cbiAgaW1wbGVtZW50cyBMaW1pdE9wdGlvbiwgT2Zmc2V0T3B0aW9uXG57XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxPcmRlckJ5Q2xhdXNlPFE+Pikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGNsYXVzZSwgeyBwcmlvcml0eTogUHJpb3JpdHkuT1JERVJfQlkgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGdyb3VwQnkoc2VsZWN0b3I6IEdyb3VwQnlTZWxlY3Rvcik6IEV4ZWN1dG9yIHtcbiAgICByZXR1cm4gdGhpcy5DbGF1c2VzLmdyb3VwQnkodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGxpbWl0KHNlbGVjdG9yOiBMaW1pdFNlbGVjdG9yKTogT2Zmc2V0T3B0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5DbGF1c2VzLmxpbWl0KHRoaXMuc3RhdGVtZW50LCBzZWxlY3Rvcik7XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBvZmZzZXQoc2VsZWN0b3I6IE9mZnNldFNlbGVjdG9yKTogRXhlY3V0b3Ige1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMub2Zmc2V0KHRoaXMuc3RhdGVtZW50LCBzZWxlY3Rvcik7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNlbGVjdG9yQmFzZWRDbGF1c2UgfSBmcm9tIFwiLi9TZWxlY3RvckJhc2VkQ2xhdXNlXCI7XG5pbXBvcnQge1xuICBDb3VudE9wdGlvbixcbiAgRGlzdGluY3RPcHRpb24sXG4gIE1heE9wdGlvbixcbiAgTWluT3B0aW9uLFxuICBTZWxlY3RPcHRpb24sXG4gIFdoZXJlT3B0aW9uLFxufSBmcm9tIFwiLi4vb3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29uc3QsIFByaW9yaXR5LCBTdGF0ZW1lbnRUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsQXJnLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFNlbGVjdFNlbGVjdG9yIH0gZnJvbSBcIi4uL3NlbGVjdG9yc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBTRUxFQ1QgY2xhdXNlXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIFNlbGVjdENsYXVzZVxuICogQGV4dGVuZHMgU2VsZWN0b3JCYXNlZENsYXVzZVxuICogQGltcGxlbWVudHMgU2VsZWN0T3B0aW9uXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKiBAc3ViY2F0ZWdvcnkgQ2xhdXNlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2VsZWN0Q2xhdXNlPFEsIE0gZXh0ZW5kcyBNb2RlbD5cbiAgZXh0ZW5kcyBTZWxlY3RvckJhc2VkQ2xhdXNlPFEsIFNlbGVjdFNlbGVjdG9yPlxuICBpbXBsZW1lbnRzIFNlbGVjdE9wdGlvbjxNPlxue1xuICBwcml2YXRlIGlzRGlzdGluY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0NvdW50ID0gZmFsc2U7XG4gIHByaXZhdGUgaXNNYXggPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc01pbiA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxTZWxlY3RDbGF1c2U8USwgTT4+KSB7XG4gICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7fSwgY2xhdXNlLCB7IHByaW9yaXR5OiBQcmlvcml0eS5TRUxFQ1QgfSkpO1xuICAgIGlmICh0aGlzLnNlbGVjdG9yID09PSBDb25zdC5GVUxMX1JFQ09SRCkgdGhpcy5zdGF0ZW1lbnQuc2V0RnVsbFJlY29yZCgpO1xuICAgIHRoaXMuc3RhdGVtZW50LnNldE1vZGUoU3RhdGVtZW50VHlwZS5RVUVSWSk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBhYnN0cmFjdCBidWlsZChxdWVyeTogUSk6IFE7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZGlzdGluY3Qoc2VsZWN0b3I6IFNlbGVjdFNlbGVjdG9yKTogRGlzdGluY3RPcHRpb248TT4ge1xuICAgIHRoaXMuaXNEaXN0aW5jdCA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgY291bnQoc2VsZWN0b3I6IFNlbGVjdFNlbGVjdG9yKTogQ291bnRPcHRpb248TT4ge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG1pbihzZWxlY3RvcjogU2VsZWN0U2VsZWN0b3IpOiBNaW5PcHRpb248TT4ge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG1heChzZWxlY3RvcjogU2VsZWN0U2VsZWN0b3IpOiBNYXhPcHRpb248TT4ge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGZyb20odGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPik6IFdoZXJlT3B0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5DbGF1c2VzLmZyb20odGhpcy5zdGF0ZW1lbnQsIHRhYmxlTmFtZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENsYXVzZSB9IGZyb20gXCIuLi9DbGF1c2VcIjtcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWxBcmcsIHJlcXVpcmVkLCB0eXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBWQUxVRVMgY2xhdXNlXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIFZhbHVlc0NsYXVzZVxuICogQGV4dGVuZHMgQ2xhdXNlXG4gKlxuICogQGNhdGVnb3J5IFF1ZXJ5XG4gKiBAc3ViY2F0ZWdvcnkgQ2xhdXNlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVmFsdWVzQ2xhdXNlPFEsIE0+IGV4dGVuZHMgQ2xhdXNlPFE+IHtcbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoQXJyYXkubmFtZSlcbiAgbW9kZWxzPzogTVtdID0gdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxWYWx1ZXNDbGF1c2U8USwgTT4+KSB7XG4gICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7fSwgY2xhdXNlLCB7IHByaW9yaXR5OiBQcmlvcml0eS5GUk9NIH0pKTtcbiAgICB0aGlzLm1vZGVscyA9IGNsYXVzZT8ubW9kZWxzO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xufVxuIiwiaW1wb3J0IHsgQ2xhdXNlIH0gZnJvbSBcIi4uL0NsYXVzZVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL0NvbmRpdGlvblwiO1xuaW1wb3J0IHtcbiAgTW9kZWxBcmcsXG4gIE1vZGVsRXJyb3JEZWZpbml0aW9uLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTGltaXRPcHRpb24sIE9mZnNldE9wdGlvbiwgT3JkZXJBbmRHcm91cE9wdGlvbiB9IGZyb20gXCIuLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBQcmlvcml0eSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEdyb3VwQnlTZWxlY3RvcixcbiAgTGltaXRTZWxlY3RvcixcbiAgT2Zmc2V0U2VsZWN0b3IsXG4gIE9yZGVyQnlTZWxlY3Rvcixcbn0gZnJvbSBcIi4uL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgRXhlY3V0b3IgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xuLyoqXG4gKiBAc3VtbWFyeSBUaGUgV0hFUkUgY2xhdXNlXG4gKlxuICogQHBhcmFtIHtDbGF1c2VBcmd9IFtjbGF1c2VdXG4gKlxuICogQGNsYXNzIFdoZXJlQ2xhdXNlXG4gKiBAZXh0ZW5kcyBDbGF1c2VcbiAqIEBpbXBsZW1lbnRzIE9yZGVyQW5kR3JvdXBPcHRpb25cbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqIEBzdWJjYXRlZ29yeSBDbGF1c2VzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXaGVyZUNsYXVzZTxRPlxuICBleHRlbmRzIENsYXVzZTxRPlxuICBpbXBsZW1lbnRzIE9yZGVyQW5kR3JvdXBPcHRpb25cbntcbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoXCJDb25kaXRpb25cIilcbiAgY29uZGl0aW9uPzogQ29uZGl0aW9uID0gdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF1c2U/OiBNb2RlbEFyZzxXaGVyZUNsYXVzZTxRPj4pIHtcbiAgICBzdXBlcihPYmplY3QuYXNzaWduKHt9LCBjbGF1c2UsIHsgcHJpb3JpdHk6IFByaW9yaXR5LldIRVJFIH0pKTtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IGNsYXVzZT8uY29uZGl0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQocXVlcnk6IFEpOiBRO1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG9yZGVyQnkoLi4uc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcltdKTogTGltaXRPcHRpb24gJiBPZmZzZXRPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMub3JkZXJCeSh0aGlzLnN0YXRlbWVudCwgc2VsZWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZ3JvdXBCeShzZWxlY3RvcjogR3JvdXBCeVNlbGVjdG9yKTogRXhlY3V0b3Ige1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMuZ3JvdXBCeSh0aGlzLnN0YXRlbWVudCwgc2VsZWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgbGltaXQoc2VsZWN0b3I6IExpbWl0U2VsZWN0b3IpOiBPZmZzZXRPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLkNsYXVzZXMubGltaXQodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIG9mZnNldChzZWxlY3RvcjogT2Zmc2V0U2VsZWN0b3IpOiBFeGVjdXRvciB7XG4gICAgcmV0dXJuIHRoaXMuQ2xhdXNlcy5vZmZzZXQodGhpcy5zdGF0ZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgaGFzRXJyb3JzKC4uLmV4Y2VwdGlvbnM6IHN0cmluZ1tdKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHN1cGVyLmhhc0Vycm9ycyguLi5leGNlcHRpb25zKTtcbiAgICBpZiAoZXJyb3JzKSByZXR1cm4gZXJyb3JzO1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbiEuaGFzRXJyb3JzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZyb21DbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzXCI7XG5pbXBvcnQgeyBHcm91cEJ5Q2xhdXNlIH0gZnJvbSBcIi4vY2xhdXNlcy9Hcm91cEJ5Q2xhdXNlXCI7XG5pbXBvcnQgeyBJbnNlcnRDbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzL0luc2VydENsYXVzZVwiO1xuaW1wb3J0IHsgTGltaXRDbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzL0xpbWl0Q2xhdXNlXCI7XG5pbXBvcnQgeyBPZmZzZXRDbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzL09mZnNldENsYXVzZVwiO1xuaW1wb3J0IHsgT3JkZXJCeUNsYXVzZSB9IGZyb20gXCIuL2NsYXVzZXMvT3JkZXJCeUNsYXVzZVwiO1xuaW1wb3J0IHsgU2VsZWN0Q2xhdXNlIH0gZnJvbSBcIi4vY2xhdXNlcy9TZWxlY3RDbGF1c2VcIjtcbmltcG9ydCB7IFZhbHVlc0NsYXVzZSB9IGZyb20gXCIuL2NsYXVzZXMvVmFsdWVzQ2xhdXNlXCI7XG5pbXBvcnQgeyBXaGVyZUNsYXVzZSB9IGZyb20gXCIuL2NsYXVzZXMvV2hlcmVDbGF1c2VcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL0NvbmRpdGlvblwiO1xuaW1wb3J0IHtcbiAgRnJvbVNlbGVjdG9yLFxuICBHcm91cEJ5U2VsZWN0b3IsXG4gIExpbWl0U2VsZWN0b3IsXG4gIE9mZnNldFNlbGVjdG9yLFxuICBPcmRlckJ5U2VsZWN0b3IsXG4gIFNlbGVjdFNlbGVjdG9yLFxufSBmcm9tIFwiLi9zZWxlY3RvcnNcIjtcbmltcG9ydCB7IFN0YXRlbWVudCB9IGZyb20gXCIuL1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDbGF1c2VGYWN0b3J5PFksIFEsIEEgZXh0ZW5kcyBBZGFwdGVyPFksIFEsIGFueSwgYW55Pj4ge1xuICAvKipcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIHtAbGluayBGcm9tQ2xhdXNlfVxuICAgKiBAcGFyYW0ge1N0YXRlbWVudH0gc3RhdGVtZW50XG4gICAqIEBwYXJhbSB7RnJvbVNlbGVjdG9yfSBzZWxlY3RvclxuICAgKi9cbiAgYWJzdHJhY3QgZnJvbTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PFE+LFxuICAgIHNlbGVjdG9yOiBGcm9tU2VsZWN0b3I8TT5cbiAgKTogRnJvbUNsYXVzZTxRLCBNPjtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIGZvciB7QGxpbmsgR3JvdXBCeUNsYXVzZX1cbiAgICogQHBhcmFtIHtTdGF0ZW1lbnR9IHN0YXRlbWVudFxuICAgKiBAcGFyYW0ge0dyb3VwQnlTZWxlY3Rvcn0gc2VsZWN0b3JcbiAgICovXG4gIGFic3RyYWN0IGdyb3VwQnkoXG4gICAgc3RhdGVtZW50OiBTdGF0ZW1lbnQ8UT4sXG4gICAgc2VsZWN0b3I6IEdyb3VwQnlTZWxlY3RvclxuICApOiBHcm91cEJ5Q2xhdXNlPFE+O1xuICAvKipcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIHtAbGluayBJbnNlcnRDbGF1c2V9XG4gICAqIEBwYXJhbSB7U3RhdGVtZW50fSBzdGF0ZW1lbnRcbiAgICovXG4gIGFic3RyYWN0IGluc2VydDxNIGV4dGVuZHMgTW9kZWw+KCk6IEluc2VydENsYXVzZTxRLCBNPjtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIGZvciB7QGxpbmsgTGltaXRDbGF1c2V9XG4gICAqIEBwYXJhbSB7U3RhdGVtZW50fSBzdGF0ZW1lbnRcbiAgICogQHBhcmFtIHtMaW1pdFNlbGVjdG9yfSBzZWxlY3RvclxuICAgKi9cbiAgYWJzdHJhY3QgbGltaXQoXG4gICAgc3RhdGVtZW50OiBTdGF0ZW1lbnQ8UT4sXG4gICAgc2VsZWN0b3I6IExpbWl0U2VsZWN0b3JcbiAgKTogTGltaXRDbGF1c2U8UT47XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCBmb3Ige0BsaW5rIE9mZnNldENsYXVzZX1cbiAgICogQHBhcmFtIHtTdGF0ZW1lbnR9IHN0YXRlbWVudFxuICAgKiBAcGFyYW0ge09mZnNldFNlbGVjdG9yfSBzZWxlY3RvclxuICAgKi9cbiAgYWJzdHJhY3Qgb2Zmc2V0KFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PFE+LFxuICAgIHNlbGVjdG9yOiBPZmZzZXRTZWxlY3RvclxuICApOiBPZmZzZXRDbGF1c2U8UT47XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCBmb3Ige0BsaW5rIE9yZGVyQnlDbGF1c2V9XG4gICAqIEBwYXJhbSB7U3RhdGVtZW50fSBzdGF0ZW1lbnRcbiAgICogQHBhcmFtIHtPcmRlckJ5U2VsZWN0b3J9IHNlbGVjdG9yXG4gICAqL1xuICBhYnN0cmFjdCBvcmRlckJ5KFxuICAgIHN0YXRlbWVudDogU3RhdGVtZW50PFE+LFxuICAgIHNlbGVjdG9yOiBPcmRlckJ5U2VsZWN0b3JbXVxuICApOiBPcmRlckJ5Q2xhdXNlPFE+O1xuICAvKipcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIHtAbGluayBTZWxlY3RDbGF1c2V9XG4gICAqIEBwYXJhbSB7U3RhdGVtZW50fSBzdGF0ZW1lbnRcbiAgICogQHBhcmFtIHtTZWxlY3RTZWxlY3Rvcn0gW3NlbGVjdG9yXVxuICAgKi9cbiAgYWJzdHJhY3Qgc2VsZWN0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgc2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvclxuICApOiBTZWxlY3RDbGF1c2U8USwgTT47XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCBmb3Ige0BsaW5rIFZhbHVlc0NsYXVzZX1cbiAgICogQHBhcmFtIHtTdGF0ZW1lbnR9IHN0YXRlbWVudFxuICAgKiBAcGFyYW0ge01bXX0gdmFsdWVzXG4gICAqL1xuICBhYnN0cmFjdCB2YWx1ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxRPixcbiAgICB2YWx1ZXM6IE1bXVxuICApOiBWYWx1ZXNDbGF1c2U8USwgTT47XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCBmb3Ige0BsaW5rIFdoZXJlQ2xhdXNlfVxuICAgKiBAcGFyYW0ge1N0YXRlbWVudH0gc3RhdGVtZW50XG4gICAqIEBwYXJhbSB7Q29uZGl0aW9ufSBjb25kaXRpb25cbiAgICovXG4gIGFic3RyYWN0IHdoZXJlKHN0YXRlbWVudDogU3RhdGVtZW50PFE+LCBjb25kaXRpb246IENvbmRpdGlvbik6IFdoZXJlQ2xhdXNlPFE+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYWRhcHRlcjogQSkge31cbn1cbiIsImltcG9ydCB7IFBhZ2luZ0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnQgfSBmcm9tIFwiLi9TdGF0ZW1lbnRcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBhZ2luYXRvcjxWLCBRPiB7XG4gIHByb3RlY3RlZCBfY3VycmVudFBhZ2UhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfdG90YWxQYWdlcyE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9yZWNvcmRDb3VudCE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGxpbWl0ITogbnVtYmVyO1xuXG4gIHByaXZhdGUgX3N0YXRlbWVudD86IFE7XG5cbiAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlO1xuICB9XG5cbiAgZ2V0IHRvdGFsKCkge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xuICB9XG5cbiAgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZENvdW50O1xuICB9XG5cbiAgZ2V0IHN0YXRlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuX3N0YXRlbWVudCkgdGhpcy5fc3RhdGVtZW50ID0gdGhpcy5wcmVwYXJlKHRoaXMuX3Jhd1N0YXRlbWVudCk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlbWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgYWRhcHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0LmdldEFkYXB0ZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3RhdDogU3RhdGVtZW50PFE+LFxuICAgIHJlYWRvbmx5IHNpemU6IG51bWJlcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3Jhd1N0YXRlbWVudDogUVxuICApIHt9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHByZXBhcmUocmF3U3RhdGVtZW50OiBRKTogUTtcblxuICBhc3luYyBuZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2UodGhpcy5jdXJyZW50ICsgMSk7XG4gIH1cblxuICBhc3luYyBwcmV2aW91cygpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlKHRoaXMuY3VycmVudCAtIDEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlUGFnZShwYWdlOiBudW1iZXIpIHtcbiAgICBpZiAocGFnZSA8IDEgfHwgIU51bWJlci5pc0ludGVnZXIocGFnZSkpXG4gICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXG4gICAgICAgIFwicGFnZSBudW1iZXIgY2Fubm90IGJlIHVuZGVyIDEgYW5kIG11c3QgYmUgYW4gaW50ZWdlclwiXG4gICAgICApO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdG90YWxQYWdlcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwYWdlID4gdGhpcy5fdG90YWxQYWdlcylcbiAgICAgIHRocm93IG5ldyBQYWdpbmdFcnJvcihcbiAgICAgICAgYFJlcXVlc3RlZCBtb3JlIHBhZ2VzIHRoYW4gYXZhaWxhYmxlLiBUb3RhbCBwYWdlczogJHt0aGlzLl90b3RhbFBhZ2VzfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHBhZ2U7XG4gIH1cblxuICBhYnN0cmFjdCBwYWdlKHBhZ2U/OiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxWW10+O1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZXNSZWdpc3RyeSB9IGZyb20gXCIuL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IEluamVjdGFibGVzIH0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNb2R1bGUgc3VtbWFyeVxuICogQGRlc2NyaXB0aW9uIE1vZHVsZSBkZXNjcmlwdGlvblxuICogQG1vZHVsZSB0cy13b3Jrc3BhY2VcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IE5hbWVzcGFjZSBzdW1tYXJ5XG4gKiBAZGVzY3JpcHRpb24gTmFtZXNwYWNlIGRlc2NyaXB0aW9uXG4gKiBAbmFtZXNwYWNlIE5hbWVzcGFjZVxuICogQG1lbWJlck9mIG1vZHVsZTp0cy13b3Jrc3BhY2VcbiAqL1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pZGVudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BlcnNpc3RlbmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9xdWVyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdG9yc1wiO1xuXG5JbmplY3RhYmxlcy5zZXRSZWdpc3RyeShuZXcgSW5qZWN0YWJsZXNSZWdpc3RyeSgpKTtcblxuLyoqXG4gKiBAc3VtbWFyeSBzdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uXG4gKiBAZGVzY3JpcHRpb24gdGhpcyBpcyBob3cgeW91IHNob3VsZCBkb2N1bWVudCBhIGNvbnN0YW50XG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp0cy13b3Jrc3BhY2VcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiT3JkZXJEaXJlY3Rpb24iLCJDYXNjYWRlIiwiUGVyc2lzdGVuY2VLZXlzIiwiUm9sZXMiLCJPcGVyYXRvciIsIkdyb3VwT3BlcmF0b3IiLCJDb25zdCIsIlByaW9yaXR5IiwiU3RhdGVtZW50VHlwZSIsIkRlY29yYXRpb24iLCJNb2RlbCIsIkRlZmF1bHRGbGF2b3VyIiwiSW50ZXJuYWxFcnJvciIsIkNvbnRleHQiLCJEZWZhdWx0UmVwb3NpdG9yeUZsYWdzIiwiT3BlcmF0aW9uS2V5cyIsIk5vdEZvdW5kRXJyb3IiLCJEQktleXMiLCJhcHBseSIsIm1ldGFkYXRhIiwiUmVwIiwid3JhcE1ldGhvZFdpdGhDb250ZXh0IiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIlZhbGlkYXRpb25FcnJvciIsImZpbmRQcmltYXJ5S2V5IiwiUmVmbGVjdGlvbiIsImluamVjdCIsImluamVjdGFibGUiLCJCYXNlRXJyb3IiLCJzZiIsIkluamVjdGFibGVSZWdpc3RyeUltcCIsIkluamVjdGFibGVzIiwiX19kZWNvcmF0ZSIsInJlcXVpcmVkIiwiVmFsaWRhdGlvbiIsIlZhbGlkYXRpb25LZXlzIiwicHJvcE1ldGFkYXRhIiwiQ29uZmxpY3RFcnJvciIsIm9uQ3JlYXRlVXBkYXRlIiwib25DcmVhdGUiLCJwb3B1bGF0ZSIsInByb3AiLCJ0eXBlIiwib25VcGRhdGUiLCJvbkRlbGV0ZSIsImFmdGVyQW55IiwicG9wIiwibGlzdCIsInJlYWRvbmx5IiwidGltZXN0YW1wIiwiREJPcGVyYXRpb25zIiwiREVGQVVMVF9FUlJPUl9NRVNTQUdFUyIsIkNsYXVzZVNlcXVlbmNlVmFsaWRhdG9yIiwiVmFsaWRhdG9yIiwiaXNFcXVhbCIsInZhbGlkYXRvciIsIm1pbmxlbmd0aCIsInN0cmluZ0Zvcm1hdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBRUE7Ozs7OztJQU1HO0FBQ1NBO0lBQVosQ0FBQSxVQUFZLGNBQWMsRUFBQTtJQUN4Qjs7O0lBR0c7SUFDSCxJQUFBLGNBQUEsQ0FBQSxLQUFBLENBQUEsR0FBQSxLQUFXO0lBQ1g7OztJQUdHO0lBQ0gsSUFBQSxjQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsTUFBWTtJQUNkLENBQUMsRUFYV0Esc0JBQWMsS0FBZEEsc0JBQWMsR0FXekIsRUFBQSxDQUFBLENBQUE7QUFFV0M7SUFBWixDQUFBLFVBQVksT0FBTyxFQUFBO0lBQ2pCLElBQUEsT0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1CO0lBQ25CLElBQUEsT0FBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLE1BQWE7SUFDZixDQUFDLEVBSFdBLGVBQU8sS0FBUEEsZUFBTyxHQUdsQixFQUFBLENBQUEsQ0FBQTtBQUVZLFVBQUEsY0FBYyxHQUFvQjtRQUM3QyxNQUFNLEVBQUVBLGVBQU8sQ0FBQyxPQUFPO1FBQ3ZCLE1BQU0sRUFBRUEsZUFBTyxDQUFDLElBQUk7OztB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