@decaf-ts/for-fabric 0.3.43 → 0.3.45

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 (61) hide show
  1. package/dist/for-fabric.cjs +20 -15
  2. package/dist/for-fabric.js +20 -15
  3. package/lib/client/FabricClientAdapter.cjs +10 -6
  4. package/lib/client/FabricClientAdapter.d.ts +6 -4
  5. package/lib/client/FabricClientDispatch.cjs +29 -16
  6. package/lib/client/FabricClientDispatch.d.ts +6 -1
  7. package/lib/client/constants.cjs +2 -1
  8. package/lib/client/types.cjs +1 -1
  9. package/lib/client/types.d.ts +1 -0
  10. package/lib/contract/OtherProductImageContract.cjs +30 -0
  11. package/lib/contract/OtherProductImageContract.d.ts +5 -0
  12. package/lib/contract/index.cjs +3 -1
  13. package/lib/contract/models/OtherLeaflet.cjs +115 -0
  14. package/lib/contract/models/OtherLeaflet.d.ts +16 -0
  15. package/lib/contract/models/OtherLeafletFile.cjs +65 -0
  16. package/lib/contract/models/OtherLeafletFile.d.ts +10 -0
  17. package/lib/contract/models/OtherMarket.cjs +4 -3
  18. package/lib/contract/models/OtherProductImage.cjs +11 -2
  19. package/lib/contract/models/OtherProductImage.d.ts +1 -0
  20. package/lib/contract/models/OtherProductShared.cjs +4 -1
  21. package/lib/contract/models/OtherProductStrength.cjs +4 -3
  22. package/lib/contracts/ContractAdapter.cjs +50 -1
  23. package/lib/contracts/ContractAdapter.d.ts +9 -0
  24. package/lib/contracts/crud/crud-contract.cjs +13 -1
  25. package/lib/contracts/crud/crud-contract.d.ts +1 -0
  26. package/lib/contracts/crud/serialized-crud-contract.cjs +12 -1
  27. package/lib/contracts/crud/serialized-crud-contract.d.ts +1 -0
  28. package/lib/esm/client/FabricClientAdapter.d.ts +6 -4
  29. package/lib/esm/client/FabricClientAdapter.js +10 -6
  30. package/lib/esm/client/FabricClientDispatch.d.ts +6 -1
  31. package/lib/esm/client/FabricClientDispatch.js +29 -16
  32. package/lib/esm/client/constants.js +2 -1
  33. package/lib/esm/client/types.d.ts +1 -0
  34. package/lib/esm/client/types.js +1 -1
  35. package/lib/esm/contract/OtherProductImageContract.d.ts +5 -0
  36. package/lib/esm/contract/OtherProductImageContract.js +27 -0
  37. package/lib/esm/contract/index.js +3 -1
  38. package/lib/esm/contract/models/OtherLeaflet.d.ts +16 -0
  39. package/lib/esm/contract/models/OtherLeaflet.js +112 -0
  40. package/lib/esm/contract/models/OtherLeafletFile.d.ts +10 -0
  41. package/lib/esm/contract/models/OtherLeafletFile.js +62 -0
  42. package/lib/esm/contract/models/OtherMarket.js +5 -4
  43. package/lib/esm/contract/models/OtherProductImage.d.ts +1 -0
  44. package/lib/esm/contract/models/OtherProductImage.js +12 -3
  45. package/lib/esm/contract/models/OtherProductShared.js +5 -2
  46. package/lib/esm/contract/models/OtherProductStrength.js +5 -4
  47. package/lib/esm/contracts/ContractAdapter.d.ts +9 -0
  48. package/lib/esm/contracts/ContractAdapter.js +52 -3
  49. package/lib/esm/contracts/crud/crud-contract.d.ts +1 -0
  50. package/lib/esm/contracts/crud/crud-contract.js +13 -1
  51. package/lib/esm/contracts/crud/serialized-crud-contract.d.ts +1 -0
  52. package/lib/esm/contracts/crud/serialized-crud-contract.js +12 -1
  53. package/lib/esm/shared/types.d.ts +7 -0
  54. package/lib/esm/shared/types.js +1 -1
  55. package/lib/esm/version.d.ts +1 -1
  56. package/lib/esm/version.js +1 -1
  57. package/lib/shared/types.cjs +1 -1
  58. package/lib/shared/types.d.ts +7 -0
  59. package/lib/version.cjs +1 -1
  60. package/lib/version.d.ts +1 -1
  61. package/package.json +1 -1
@@ -2256,7 +2256,8 @@
2256
2256
  allowManualEndorsingOrgs: false,
2257
2257
  allowGatewayOverride: false,
2258
2258
  rebuildWithTransient: true,
2259
- encryptTransient: false
2259
+ encryptTransient: false,
2260
+ syntheticEvents: true
2260
2261
  });
2261
2262
  const log = new logging.MiniLogger("fabric-fs");
2262
2263
  async function contentOfLoadFile(contentOrPath, fileReader) {
@@ -3372,7 +3373,8 @@
3372
3373
  async evaluateTransaction(ctx, api, args, transientData, endorsingOrganizations, className) {
3373
3374
  return this.transaction(ctx, api, false, args, transientData, endorsingOrganizations, className);
3374
3375
  }
3375
- async close() {
3376
+ async shutdown(...args) {
3377
+ await super.shutdown(...args);
3376
3378
  if (this.client) {
3377
3379
  this.log.verbose(`Closing ${this.config.mspId} gateway client`);
3378
3380
  this.client.close();
@@ -3473,7 +3475,7 @@
3473
3475
  return gateway;
3474
3476
  }
3475
3477
  Dispatch() {
3476
- return new FabricClientAdapter["_baseDispatch"];
3478
+ return new FabricClientAdapter["_baseDispatch"](this.client);
3477
3479
  }
3478
3480
  static parseError(err) {
3479
3481
  let msg = typeof err === "string" ? err : err.message;
@@ -3591,15 +3593,18 @@
3591
3593
  }
3592
3594
  async initialize() {
3593
3595
  if (!this.adapter) throw new dbDecorators.InternalError(`No adapter or config observed for dispatch`);
3594
- const context = await this.adapter.context("dispatch", {
3595
- correlationId: this.adapter.config.chaincodeName
3596
- }, decoratorValidation.Model);
3597
- const {ctx: ctx} = this.logCtx([ context ], this.initialize);
3598
- const gateway = await FabricClientAdapter.getGateway(ctx, this.adapter.config, this.client);
3599
- const network = gateway.getNetwork(this.adapter.config.channel);
3600
- if (!this.adapter) throw new dbDecorators.InternalError(`No adapter observed for dispatch`);
3601
- this.listeningStack = await network.getChaincodeEvents(this.adapter.config.chaincodeName);
3602
- this.handleEvents(ctx);
3596
+ const syntheticEvents = this.adapter.config.syntheticEvents !== false;
3597
+ if (!syntheticEvents) {
3598
+ const context = await this.adapter.context("dispatch", {
3599
+ correlationId: this.adapter.config.chaincodeName
3600
+ }, decoratorValidation.Model);
3601
+ const {ctx: ctx} = this.logCtx([ context ], this.initialize);
3602
+ const gateway = await FabricClientAdapter.getGateway(ctx, this.adapter.config, this.client);
3603
+ const network = gateway.getNetwork(this.adapter.config.channel);
3604
+ if (!this.adapter) throw new dbDecorators.InternalError(`No adapter observed for dispatch`);
3605
+ this.listeningStack = await network.getChaincodeEvents(this.adapter.config.chaincodeName);
3606
+ this.handleEvents(ctx);
3607
+ }
3603
3608
  [ dbDecorators.OperationKeys.CREATE, dbDecorators.OperationKeys.UPDATE, dbDecorators.OperationKeys.DELETE, dbDecorators.BulkCrudOperationKeys.CREATE_ALL, dbDecorators.BulkCrudOperationKeys.UPDATE_ALL, dbDecorators.BulkCrudOperationKeys.DELETE_ALL ].forEach(toWrap => {
3604
3609
  if (!this.adapter) throw new dbDecorators.InternalError(`No adapter provided for the fallback of fully segregated models`);
3605
3610
  if (!this.adapter[toWrap]) throw new dbDecorators.InternalError(`Method ${toWrap} not found in ${this.adapter.alias} adapter to bind Observables Dispatch`);
@@ -3632,7 +3637,7 @@
3632
3637
  apply: async (target, thisArg, argArray) => {
3633
3638
  const result = await target.apply(thisArg, argArray);
3634
3639
  const clazz = argArray[0];
3635
- if (!decoratorValidation.Model.isTransient(clazz)) return result;
3640
+ if (!syntheticEvents && !decoratorValidation.Model.isTransient(clazz)) return result;
3636
3641
  const {log: log, ctxArgs: ctxArgs, ctx: ctx} = thisArg["logCtx"](argArray.slice(argArray.length - 1), target);
3637
3642
  const ids = argArray[1];
3638
3643
  const resultArgs = [ clazz, bulkToSingle(toWrap), ids ];
@@ -3647,7 +3652,7 @@
3647
3652
  }
3648
3653
  }
3649
3654
  if (FabricClientAdapter) FabricClientAdapter["_baseDispatch"] = FabricClientDispatch;
3650
- const VERSION = "0.3.43";
3655
+ const VERSION = "0.3.45";
3651
3656
  const PACKAGE_NAME = "@decaf-ts/for-fabric";
3652
3657
  decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
3653
3658
  exports.AllowanceError = AllowanceError;
@@ -3737,4 +3742,4 @@
3737
3742
  exports.writeDesignDocs = writeDesignDocs;
3738
3743
  exports.writeIndexes = writeIndexes;
3739
3744
  });
3740
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRSZXBvc2l0b3J5LnRzIiwiLi4vc3JjL2NvbnRyYWN0cy9lcmMyMC9tb2RlbHMudHMiLCIuLi9zcmMvc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvY2xpZW50L2VyYzIwL0ZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jbGllbnQvaWRzL2lkLWV4dHJhY3Rpb24udHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0lkZW50aXR5Q3JlZGVudGlhbHMudHMiLCIuLi9zcmMvc2hhcmVkL2NvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvSWRlbnRpdHkudHMiLCIuLi9zcmMvY2xpZW50L3V0aWxzLnRzIiwiLi4vc3JjL2NsaWVudC9jcnlwdG8udHMiLCIuLi9zcmMvc2hhcmVkL2Vycm9ycy50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljRW5yb2xsbWVudFNlcnZpY2UudHMiLCIuLi9zcmMvY2xpZW50L3NlcnZpY2VzL1JlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyLnRzIiwiLi4vc3JjL3NoYXJlZC9lcmMyMC9lcmMyMC1jb25zdGFudHMudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0ZhYnJpY0Jhc2VNb2RlbC50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbC50cyIsIi4uL3NyYy9zaGFyZWQvb3ZlcnJpZGVzL292ZXJyaWRlcy50cyIsIi4uL3NyYy9zaGFyZWQvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9zaGFyZWQvRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIudHMiLCIuLi9zcmMvc2hhcmVkL2V2ZW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbWF0aC50cyIsIi4uL3NyYy9zaGFyZWQvU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIudHMiLCIuLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZhYnJpY0lkZW50aXR5U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2NsaWVudC9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2ZhYnJpYy1mcy50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50U3RhdGVtZW50LnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgSW5kZXggPSBDcmVhdGVJbmRleFJlcXVlc3Q7XG5cbmZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG4gIGNvbnN0IGRpcm5hbWU6IHN0cmluZyA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGRpcm5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGRpcm5hbWUpO1xuICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1vZGVsSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPlxuKTogSW5kZXhbXSB7XG4gIHJldHVybiBnZW5lcmF0ZUluZGV4ZXMoW21dKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBhY2N1bT86IFJlY29yZDxzdHJpbmcsIENvdWNoREJEZXNpZ25Eb2M+XG4pOiBDb3VjaERCRGVzaWduRG9jW10ge1xuICBjb25zdCB2aWV3cyA9IGdlbmVyYXRlVmlld3MoW21dKTtcbiAgY29uc3Qgc3RvcmFnZTogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz4gPSBhY2N1bSB8fCB7fTtcbiAgdmlld3MuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgc3RvcmFnZVtkb2MuX2lkXSA9IGRvYztcbiAgfSk7XG4gIHJldHVybiB2aWV3cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNb2RlbEZpbGUoZmlsZTogYW55KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZXhwb3J0cyA9IHJlcXVpcmUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGZpbGUucGFyZW50UGF0aCwgZmlsZS5uYW1lKSk7XG5cbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhleHBvcnRzKS5maWx0ZXIoKGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbSA9IG5ldyAoZSBhcyBDb25zdHJ1Y3RvcikoKTtcbiAgICAgIHJldHVybiBtIGluc3RhbmNlb2YgTW9kZWw7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSkgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W107XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTW9kZWxGb2xkZXJzKFxuICAuLi5mb2xkZXJzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTxNb2RlbENvbnN0cnVjdG9yPGFueT5bXT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IGZpbGVzID0gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhmb2xkZXIsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGY6IGFueSkgPT4gZi5pc0ZpbGUoKSAmJiBmLm5hbWUuZW5kc1dpdGgoXCJqc1wiKSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5yZWFkTW9kZWxGaWxlKGZpbGUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW5kZXhlcyhcbiAgaW5kZXhlczogSW5kZXhbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgaW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1pbmRleGVzLyR7aW5kZXgubmFtZX0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGluZGV4LCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURlc2lnbkRvY3MoXG4gIGRlc2lnbkRvY3M6IENvdWNoREJEZXNpZ25Eb2NbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIGlmICghZGVzaWduRG9jcy5sZW5ndGgpIHJldHVybjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBkZXNpZ25Eb2NzLmZvckVhY2goKGRvYykgPT4ge1xuICAgIGNvbnN0IGRvY0lkID0gZG9jLl9pZC5yZXBsYWNlKC9eX2Rlc2lnblxcLy8sIFwiXCIpO1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1kZXNpZ25fZG9jcy8ke2RvY0lkfS5qc29uYFxuICAgICAgKVxuICAgICk7XG4gICAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IC4uLmRvYyB9O1xuICAgIGRlbGV0ZSBwYXlsb2FkLl9yZXY7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQ291Y2hEQkRlc2lnbkRvYyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgd3JpdGVEZXNpZ25Eb2NzIH0gZnJvbSBcIi4uL2luZGV4ZXMvZ2VuZXJhdGlvblwiO1xuXG4vL1xuLy8gZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbi8vICAgbmFtZTogXCJjb2xsZWN0aW9uTWFyYmxlc1wiO1xuLy8gICBwb2xpY3k6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgcmVxdWlyZWRQZWVyQ291bnQ6IDA7XG4vLyAgIG1heFBlZXJDb3VudDogMztcbi8vICAgYmxvY2tUb0xpdmU6IDA7XG4vLyAgIG1lbWJlck9ubHlSZWFkOiB0cnVlO1xuLy8gICBtZW1iZXJPbmx5V3JpdGU6IHRydWU7XG4vLyAgIGVuZG9yc2VtZW50UG9saWN5OiB7XG4vLyAgICAgaWRlbnRpdGllczogW1xuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzFNU1BcIiB9IH0sXG4vLyAgICAgICB7IHJvbGU6IHsgbmFtZTogXCJtZW1iZXJcIjsgbXNwSWQ6IFwiT3JnMk1TUFwiIH0gfSxcbi8vICAgICBdO1xuLy8gICAgIHJ1bGU6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgfTtcbi8vIH07XG5cbmV4cG9ydCB0eXBlIEZhYnJpY1BvbGljeUlkZW50aXR5ID0ge1xuICByb2xlOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1zcElkOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k6IHtcbiAgICBpZGVudGl0aWVzOiBGYWJyaWNQb2xpY3lJZGVudGl0eVtdO1xuICAgIHJ1bGU6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFByaXZhdGVDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k/OiB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdGlvbkZvcihcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcG9saWN5OiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbixcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY29sbGVjdGlvbk5hbWUsXG4gICAgcG9saWN5OiBwb2xpY3ksXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICBtc3BJZDogc3RyaW5nLFxuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nID0gYCR7bXNwSWR9UHJpdmF0ZWAsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDAsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCcke21zcElkfS5tZW1iZXInKWAsXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZVxuICApO1xuXG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgT1IoJyR7bXNwSWR9LnBlZXInKWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgbXNwSWRzOiBzdHJpbmdbXSxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlciA9IDEsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyID0gMixcbiAgYmxvY2tUb0xpdmU6IG51bWJlciA9IDAsXG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuID0gdHJ1ZSxcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuID0gdHJ1ZVxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICBjb25zdCBjID0gY29sbGVjdGlvbkZvcihcbiAgICBjb2xsZWN0aW9uTmFtZSxcbiAgICBgT1IoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ubWVtYmVyJ2ApLmpvaW4oXCIsXCIpfSlgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcbiAgYy5lbmRvcnNlbWVudFBvbGljeSA9IHtcbiAgICBzaWduYXR1cmVQb2xpY3k6IGBBTkQoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ucGVlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgfTtcbiAgcmV0dXJuIGM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0Q29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkczogc3RyaW5nW10sXG4gIG92ZXJyaWRlczoge1xuICAgIHByaXZhdGVDb2xzPzogUGFydGlhbDxQcml2YXRlQ29sbGVjdGlvbj47XG4gICAgc2hhcmVkQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICB9ID0ge30sXG4gIG1pcnJvcjogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgbGV0IHsgcHJpdmF0ZUNvbHMsIHNoYXJlZENvbHMgfSA9IE1vZGVsLmNvbGxlY3Rpb25zRm9yKG0pO1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVDb2xsZWN0aW9uKGFyZzogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHJldHVybiBhcmc7XG4gICAgICByZXR1cm4gYXJnKG0sIG1zcElkc1swXSkgYXMgc3RyaW5nO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGVDb2xzID0gcHJpdmF0ZUNvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcbiAgc2hhcmVkQ29scyA9IHNoYXJlZENvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcblxuICBjb25zdCBwcml2YXRlRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAwLFxuICAgICAgbWF4UGVlckNvdW50OiAwLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8ucHJpdmF0ZUNvbHMgfHwge31cbiAgKTtcbiAgY29uc3Qgc2hhcmVkRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAxLFxuICAgICAgbWF4UGVlckNvdW50OiAyLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8uc2hhcmVkQ29scyB8fCB7fVxuICApO1xuXG4gIGNvbnN0IG1pcnJvck1ldGEgPSBtaXJyb3IgPyBNb2RlbC5taXJyb3JlZEF0KG0pIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHByaXZhdGVzID0gbXNwSWRzXG4gICAgLm1hcCgobXNwSWQpID0+XG4gICAgICAocHJpdmF0ZUNvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgICBwcml2YXRlRGVmYXVsdHM7XG4gICAgICAgIHJldHVybiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgICAgICAgICBtc3BJZCxcbiAgICAgICAgICBwLFxuICAgICAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgICAgICBibG9ja1RvTGl2ZSxcbiAgICAgICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApXG4gICAgLmZsYXQoKTtcblxuICBpZiAobWlycm9yTWV0YSAmJiBtaXJyb3JNZXRhLm1zcElkKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPVxuICAgICAgdHlwZW9mIG1pcnJvck1ldGEucmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtaXJyb3JNZXRhLnJlc29sdmVyXG4gICAgICAgIDogbWlycm9yTWV0YS5yZXNvbHZlcihtLCBtaXJyb3JNZXRhLm1zcElkKTtcbiAgICBpZiAoXG4gICAgICByZXNvbHZlZCAmJlxuICAgICAgIXByaXZhdGVzLnNvbWUoXG4gICAgICAgIChwKSA9PiBwLm5hbWUgPT09IHJlc29sdmVkICYmIHAucG9saWN5LmluY2x1ZGVzKG1pcnJvck1ldGEubXNwSWQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgcHJpdmF0ZXMucHVzaChcbiAgICAgICAgcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbWlycm9yTWV0YS5tc3BJZCxcbiAgICAgICAgICByZXNvbHZlZCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzaGFyZWQgPSAoc2hhcmVkQ29scyBhcyBzdHJpbmdbXSkubWFwKChwKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlLFxuICAgIH0gPSBzaGFyZWREZWZhdWx0cztcbiAgICByZXR1cm4gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgICAgIG1zcElkcyxcbiAgICAgIHAsXG4gICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICBtZW1iZXJPbmx5V3JpdGVcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVzLFxuICAgIHNoYXJlZCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbnMoXG4gIGNvbHM6IFByaXZhdGVDb2xsZWN0aW9uW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGZpbGVOYW1lID0gXCJjb2xsZWN0aW9uc19jb25maWdcIlxuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpIGFzIHN0cmluZztcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG4gIH1cblxuICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihwLCBgLi9NRVRBLUlORi8ke2ZpbGVOYW1lfS5qc29uYCkpO1xuICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkoY29scywgdW5kZWZpbmVkLCAyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzKFxuICBkb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRvY3M/Lmxlbmd0aCkgcmV0dXJuO1xuICB3cml0ZURlc2lnbkRvY3MoZG9jcywgcCwgY29sbGVjdGlvbik7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dE9mLFxuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgRmxhZ3NPZixcbiAgT2JzZXJ2ZXJIYW5kbGVyLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGFnaW5hdG9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VyaWFsaXplZFBhZ2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgdHlwZSBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBlbmZvcmNlREJEZWNvcmF0b3JzLFxuICBPcGVyYXRpb25LZXlzLFxuICBQcmltYXJ5S2V5VHlwZSxcbiAgcmVkdWNlRXJyb3JzVG9QcmludCxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvdWNoREJLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGZvciBGYWJyaWMgY2xpZW50IG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGdlbmVyaWMgUmVwb3NpdG9yeSB0byBwcmVwYXJlIGNvbnRleHQgYW5kIGFyZ3VtZW50cyBmb3IgQ1JVRCBvcGVyYXRpb25zIGV4ZWN1dGVkIHZpYSBhIEZhYnJpYyBjbGllbnQgQWRhcHRlciwgd2lyaW5nIFJlcG9zaXRvcnlGbGFncyBhbmQgRmFicmljLXNwZWNpZmljIG92ZXJyaWRlcy5cbiAqIEB0ZW1wbGF0ZSBNIGV4dGVuZHMgTW9kZWwgLSBUaGUgbW9kZWwgdHlwZSBoYW5kbGVkIGJ5IHRoaXMgcmVwb3NpdG9yeVxuICogQHBhcmFtIHtBZGFwdGVyPGFueSwgTWFuZ29RdWVyeSwgRmFicmljRmxhZ3MsIENvbnRleHQ8RmFicmljRmxhZ3M+Pn0gW2FkYXB0ZXJdIC0gT3B0aW9uYWwgYWRhcHRlciBpbnN0YW5jZSB1c2VkIHRvIGV4ZWN1dGUgb3BlcmF0aW9uc1xuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIHJlcG9zaXRvcnlcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRmFicmljQ2xpZW50UmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbiAqIGltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1mYWJyaWNcIjtcbiAqXG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgTW9kZWwgeyBpZCE6IHN0cmluZzsgbmFtZSE6IHN0cmluZzsgfVxuICogY29uc3QgcmVwbyA9IG5ldyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PFVzZXI+KCk7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBpZDogXCIxXCIsIG5hbWU6IFwiQWxpY2VcIiB9KSk7XG4gKiBjb25zdCBsb2FkZWQgPSBhd2FpdCByZXBvLnJlYWQoXCIxXCIpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgRmFicmljQ2xpZW50UmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PlJlcG86IGNyZWF0ZVByZWZpeChtb2RlbCwgLi4uYXJncylcbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsLCBmbGFncylcbiAqICAgQWRhcHRlci0tPj5SZXBvOiByZXN1bHRcbiAqICAgUmVwby0tPj5BcHA6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEEgZXh0ZW5kcyBGYWJyaWNDbGllbnRBZGFwdGVyID0gRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIEE+IHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9vdmVycmlkZXMgPSBPYmplY3QuYXNzaWduKHt9LCBzdXBlcltcIl9vdmVycmlkZXNcIl0sIHtcbiAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgIGFsbG93UmF3U3RhdGVtZW50czogZmFsc2UsXG4gICAgZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllczogdHJ1ZSxcbiAgICBmb3JjZVByZXBhcmVDb21wbGV4UXVlcmllczogdHJ1ZSxcbiAgICBhbGxvd0dlbmVyYXRpb25PdmVycmlkZTogZmFsc2UsXG4gICAgcmVidWlsZFdpdGhUcmFuc2llbnQ6IGZhbHNlLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQSwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHN1cGVyKGFkYXB0ZXIsIGNsYXp6KTtcbiAgfVxuXG4gIG92ZXJyaWRlIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEZsYWdzT2Y8Q29udGV4dE9mPEE+Pj4pOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXJcbiAgICAgIC5vdmVycmlkZShPYmplY3QuYXNzaWduKHt9LCBmbGFncywgdGhpcy5fb3ZlcnJpZGVzKSlcbiAgICAgIC5mb3IoZmxhZ3MgYXMgYW55KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gc3VwZXIuT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdpbmF0ZUJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdpbmF0ZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmF0aW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIHBhZ2Ugc2l6ZSAke3JlZi5saW1pdH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2luYXRlQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyLFxuICAgICAgeyBsaW1pdDogcmVmLmxpbWl0LCBvZmZzZXQ6IHJlZi5vZmZzZXQsIGJvb2ttYXJrOiByZWYuYm9va21hcmsgfSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5saXN0QnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGxpc3RpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ30gJHtvcmRlcn1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5saXN0QnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgdmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmZpbmRCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBhbGwgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggJHtrZXkgYXMgc3RyaW5nfSAke3ZhbHVlfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmZpbmRCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZE9uZUJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICB2YWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kT25lQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgT25lICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoICR7a2V5IGFzIHN0cmluZ30gJHt2YWx1ZX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kT25lQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmQoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQsIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBieSBkZWZhdWx0IHF1ZXJ5IGF0dHJpYnV0ZXNgXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kLm5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIG9yZGVyLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHBhZ2UoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBkaXJlY3Rpb246IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIHJlZjogT21pdDxEaXJlY3Rpb25MaW1pdE9mZnNldCwgXCJkaXJlY3Rpb25cIj4gPSB7XG4gICAgICBvZmZzZXQ6IDEsXG4gICAgICBsaW1pdDogMTAsXG4gICAgfSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPFNlcmlhbGl6ZWRQYWdlPE0+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLCB0cnVlKVxuICAgICkuZm9yKHRoaXMucGFnZSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgcGFnaW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBieSBkZWZhdWx0IHF1ZXJ5IGF0dHJpYnV0ZXNgXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5wYWdlLm5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIHJlZixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzdGF0ZW1lbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnN0YXRlbWVudCk7XG4gICAgbG9nLnZlcmJvc2UoYEV4ZWN1dGluZyBwcmVwYXJlZCBzdGF0ZW1lbnQgJHtuYW1lfWApO1xuICAgIGNvbnN0IGNhbGxBcmdzID0gY3R4QXJncy5zbGljZSgwLCAtMSk7XG4gICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShcbiAgICAgIHRoaXMuYWRhcHRlci5kZWNvZGUoXG4gICAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgIGN0eCxcbiAgICAgICAgICBQZXJzaXN0ZW5jZUtleXMuU1RBVEVNRU5ULFxuICAgICAgICAgIFtuYW1lLCBKU09OLnN0cmluZ2lmeShjYWxsQXJncyldLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdGhpcy5jbGFzcy5uYW1lXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gbmV3IHRoaXMuY2xhc3MocilcbiAgICAgICAgICA6IHJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICAgID8gbmV3IHRoaXMuY2xhc3MocmVzdWx0KVxuICAgICAgOiBQYWdpbmF0b3IuaXNTZXJpYWxpemVkUGFnZShyZXN1bHQpXG4gICAgICAgID8gT2JqZWN0LmFzc2lnbihyZXN1bHQsIHtcbiAgICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLm1hcCgoZDogYW55KSA9PiBuZXcgdGhpcy5jbGFzcyhkKSksXG4gICAgICAgICAgfSlcbiAgICAgICAgOiByZXN1bHQ7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudE9mKFxuICAgIGtleT86IGtleW9mIE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY291bnRPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY291bnRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9JHtrZXkgPyBgIGJ5ICR7a2V5IGFzIHN0cmluZ31gIDogXCJcIn1gXG4gICAgKTtcbiAgICBjb25zdCBzdG10QXJncyA9IGtleSA/IFtrZXksIC4uLmN0eEFyZ3NdIDogY3R4QXJncztcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCAuLi5zdG10QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtYXhPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWF4T2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWF4IG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtaW5PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWluT2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWluIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBhdmdPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5hdmdPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgYXZnIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzdW1PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdW1PZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgc3VtIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkaXN0aW5jdE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZGlzdGluY3RPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBkaXN0aW5jdCB2YWx1ZXMgb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZ3JvdXBPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTVtdPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5ncm91cE9mKTtcbiAgICBsb2cudmVyYm9zZShgZ3JvdXBpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ31gKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgaGVhbHRoY2hlY2soLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmhlYWx0aGNoZWNrKHRoaXMuY2xhc3MsIC4uLmN0eEFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIGN0eCk7XG4gICAgY29uc3QgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHByZXBhcmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgaWQsXG4gICAgICByZWNvcmQsXG4gICAgICB0cmFuc2llbnQsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZXN1bHQsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnQsIGN0eCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBjdHhBcmdzLCBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCBjdHgpO1xuICAgIGNvbnN0IHsgaWQsIHRyYW5zaWVudCB9ID0gcHJlcGFyZWQ7XG4gICAgbGV0IHJlY29yZCA9IHByZXBhcmVkLnJlY29yZDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgdXBkYXRpbmcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIGlkICR7aWR9YFxuICAgICk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIHRyYW5zaWVudCxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudCwgY3R4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxbTVtdLCAuLi5hbnlbXSwgQ29udGV4dE9mPEE+XT4ge1xuICAgIGNvbnN0IHsgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgaWdub3JlSGFuZGxlcnMgPSBjdHguZ2V0KFwiaWdub3JlSGFuZGxlcnNcIik7XG4gICAgY29uc3QgaWdub3JlVmFsaWRhdGUgPSBjdHguZ2V0KFwiaWdub3JlVmFsaWRhdGlvblwiKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG5cbiAgICBtb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhhbmRsZXJzKVxuICAgICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgUmVwb3NpdG9yeTxNLCBBPiwgYW55PihcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAoIWlnbm9yZVZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBpZ25vcmVkUHJvcHMgPSBjdHguZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKC4uLmlnbm9yZWRQcm9wcykpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IHJlZHVjZUVycm9yc1RvUHJpbnQoZXJyb3JzKTtcblxuICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyAke21vZGVscy5sZW5ndGh9IG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobW9kZWwpID0+IHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKSk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCBjdHgpKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGNvbnN0IHBheWxvYWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgY29uc3QgdHJhbnNpZW50cyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC50cmFuc2llbnQpO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkcyBhcyBQcmltYXJ5S2V5VHlwZVtdLFxuICAgICAgcGF5bG9hZHMsXG4gICAgICB0cmFuc2llbnRzLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgY3JlYXRlZC5tYXAoYXN5bmMgKHIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHIsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnRzW2ldLCBjdHgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICkge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYHJlYWRpbmcgJHtrZXlzLmxlbmd0aH0gJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLmNsYXNzLCBrZXlzLCAuLi5jdHhBcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIGtleXNbaV0sIHt9LCBjdHgpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgVXBkYXRpbmcgJHttb2RlbHMubGVuZ3RofSBuZXcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuXG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiB0aGlzLmVuc3VyZUxlZ2FjeU1pcnJvckZsYWcoY3R4LCBtb2RlbCkpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgY3R4KSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZHMgYXMgUHJpbWFyeUtleVR5cGVbXSxcbiAgICAgIHByZXBhcmVkLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgcHJlcGFyZWQubWFwKChyKSA9PiByLnRyYW5zaWVudCksXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB1cGRhdGVkLm1hcChhc3luYyAodSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICAgICAgdSxcbiAgICAgICAgICB0aGlzLmNsYXNzLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHByZXBhcmVkW2ldLnRyYW5zaWVudCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHg6IENvbnRleHRPZjxBPiwgbW9kZWw6IE0pOiB2b2lkIHtcbiAgICBpZiAoTW9kZWwubWlycm9yZWRBdChtb2RlbCkpIHtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHsgbGVnYWN5OiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrLCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB0b2tlbiBtZXRhZGF0YSBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBFUkMyMCB0b2tlbiBkZWZpbml0aW9uIHdpdGhpbiB0aGUgRmFicmljIEVSQzIwIHNhbXBsZSwgaW5jbHVkaW5nIG5hbWUsIHN5bWJvbCwgZGVjaW1hbHMsIGFuZCB0aGUgb3duaW5nIGlkZW50aXR5LiBVc2VkIHRvIGRlZmluZSB0aGUgdW5pcXVlIHRva2VuIG1hbmFnZWQgYnkgdGhlIGNvbnRyYWN0LlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFRva2VuPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBUb2tlblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRva2VuID0gbmV3IEVSQzIwVG9rZW4oeyBuYW1lOiBcIk15VG9rZW5cIiwgc3ltYm9sOiBcIk1US1wiLCBkZWNpbWFsczogMTgsIG93bmVyOiBcIng1MDk6Oi4uLlwiIH0pO1xuICogLy8gUGVyc2lzdCB0aHJvdWdoIGEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby5jcmVhdGUodG9rZW4sIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobmV3IEVSQzIwVG9rZW4oey4uLn0pLCBjdHgpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkPW5hbWUsIHJlY29yZCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogc3RvcmVkXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdGFibGUoXCJlcmMyMF90b2tlbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBUb2tlbiBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHVuaXF1ZSBuYW1lXG4gICAqIEBzdW1tYXJ5IFNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBFUkMyMCB0b2tlbiBkZWZpbml0aW9uOyB0eXBpY2FsbHkgYSBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVyXG4gICAqL1xuICBuYW1lITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmluZyBpZGVudGl0eSBvZiB0aGUgdG9rZW5cbiAgICogQHN1bW1hcnkgWC41MDkgc3ViamVjdCBvciBNU1AgaWRlbnRpdHkgc3RyaW5nIHRoYXQgZGVub3RlcyB3aG8gb3ducy9jb250cm9scyB0aGUgdG9rZW4gZGVmaW5pdGlvblxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBTaG9ydCB0aWNrZXItbGlrZSBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VuIChlLmcuLCBNVEspXG4gICAqL1xuICBzeW1ib2whOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY2ltYWwgcHJlY2lzaW9uIGZvciB0b2tlbiBhbW91bnRzXG4gICAqIEBzdW1tYXJ5IE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRva2VuIGJhbGFuY2VzXG4gICAqL1xuICBkZWNpbWFscyE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgd2FsbGV0IG1vZGVsXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgaG9sZGVyIGFjY291bnQgZm9yIGFuIEVSQzIwIHRva2VuIHdpdGhpbiB0aGUgRmFicmljIG5ldHdvcmssIHRyYWNraW5nIGJhbGFuY2UgYW5kIHRva2VuIGFzc29jaWF0aW9uLlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFdhbGxldD59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEVSQzIwV2FsbGV0XG4gKiBAZXhhbXBsZVxuICogY29uc3Qgd2FsbGV0ID0gbmV3IEVSQzIwV2FsbGV0KHsgaWQ6IFwiYWNjdDFcIiwgdG9rZW46IFwiTXlUb2tlblwiLCBiYWxhbmNlOiAxMDAwIH0pO1xuICogLy8gVXBkYXRlIGJhbGFuY2UgdmlhIHJlcG9zaXRvcnk6IGF3YWl0IHJlcG8udXBkYXRlKHdhbGxldCwgY3R4KVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwb1xuICogICBBcHAtPj5SZXBvOiByZWFkKFwiYWNjdDFcIiwgY3R4KVxuICogICBSZXBvLS0+PkFwcDogRVJDMjBXYWxsZXRcbiAqL1xuQHRhYmxlKFwiZXJjMjBfd2FsbGV0c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFUkMyMFdhbGxldCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdhbGxldCB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIHdhbGxldDsgY29tbW9ubHkgcmVmZXJlbmNlcyBhbiBhY2NvdW50IG9yIGlkZW50aXR5XG4gICAqL1xuICBpZCE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc3NvY2lhdGVkIHRva2VuIG5hbWVcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgRVJDMjBUb2tlbiB0aGlzIHdhbGxldCBob2xkczsgbWFpbnRhaW5lZCBhcyBhIHJlbGF0aW9uc2hpcCBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMvZGVsZXRlc1xuICAgKi9cbiAgdG9rZW4hOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gYmFsYW5jZSBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHN1bW1hcnkgQ3VycmVudCBhbW91bnQgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gaGVsZCBieSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSE6IG51bWJlcjtcblxuICBAY29sdW1uKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYXB0aXZlIGZsYWcgb3IgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBPcHRpb25hbCBmaWVsZCB1c2VkIGJ5IHNvbWUgZmxvd3MgdG8gbWFyayBub24tdHJhbnNmZXJhYmxlIGZ1bmRzIG9yIG1hbmFnZWQgY3VzdG9keVxuICAgKi9cbiAgY2FwdGl2ZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgYWxsb3dhbmNlIG1vZGVsXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBhbiBhcHByb3ZhbCByZWxhdGlvbnNoaXAgd2hlcmUgYW4gb3duZXIgYWxsb3dzIGEgc3BlbmRlciB0byB0cmFuc2ZlciB1cCB0byBhIGNlcnRhaW4gdmFsdWUgZnJvbSB0aGUgb3duZXIncyB3YWxsZXQuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEFsbG93YW5jZT59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEFsbG93YW5jZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFsbG93YW5jZSA9IG5ldyBBbGxvd2FuY2UoeyBvd25lcjogXCJhY2N0MVwiLCBzcGVuZGVyOiBcImFjY3QyXCIsIHZhbHVlOiA1MCB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIEFwcC0+PkFwcDogbmV3IEFsbG93YW5jZSh7IG93bmVyLCBzcGVuZGVyLCB2YWx1ZSB9KVxuICovXG5AdGFibGUoXCJlcmMyMF9hbGxvd2FuY2VzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEFsbG93YW5jZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsbG93YW5jZSB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIGFsbG93YW5jZTsgdHlwaWNhbGx5IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHByb3ZhbCByZWxhdGlvbnNoaXBcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCB0aGF0IGF1dGhvcml6ZXMgdGhlIGFsbG93YW5jZVxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbmRlciB3YWxsZXQgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBXYWxsZXQgYWxsb3dlZCB0byBzcGVuZCB1cCB0byB0aGUgYXBwcm92ZWQgdmFsdWUgZnJvbSB0aGUgb3duZXJcbiAgICovXG4gIHNwZW5kZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwcm92ZWQgdmFsdWVcbiAgICogQHN1bW1hcnkgTWF4aW11bSB0b2tlbiBhbW91bnQgdGhlIHNwZW5kZXIgbWF5IHRyYW5zZmVyIG9uIGJlaGFsZiBvZiB0aGUgb3duZXJcbiAgICovXG4gIHZhbHVlITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxBbGxvd2FuY2U+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGllbnQtc2lkZSBKU09OIHNlcmlhbGl6ZXIgZm9yIERlY2FmIG1vZGVscyB0YXJnZXRpbmcgSHlwZXJsZWRnZXIgRmFicmljXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIEpTT05TZXJpYWxpemVyIHRvIGVtYmVkIG1vZGVsIG1ldGFkYXRhIChhbmNob3IpIHJlcXVpcmVkIHRvIHJlY29uc3RydWN0IGluc3RhbmNlcyBvbiB0aGUgY2xpZW50LCBhbmQgdG8gc2FmZWx5IHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBGYWJyaWMtYm91bmQgbW9kZWxzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBEZWNhZiBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyBzZXJpYWxpemVyXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50czsgcHJvdmlkZWQgZm9yIGRvY3VtZW50YXRpb24gY29tcGxldGVuZXNzXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIENsaWVudFNlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXI8VXNlcj4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHVzZXIgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VyaWFsaXplciBhcyBDbGllbnRTZXJpYWxpemVyXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0+PlNlcmlhbGl6ZXI6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0tPj5BcHA6IEpTT04gc3RyaW5nXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IGRlc2VyaWFsaXplKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5TZXJpYWxpemVyOiBKU09OLnBhcnNlKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5Nb2RlbDogTW9kZWwuYnVpbGQocGFyc2VkLCBhbmNob3IpXG4gKiAgIE1vZGVsLS0+PkFwcDogaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudFNlcmlhbGl6ZXI8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYSBtb2RlbCBmb3IgSlNPTiBzZXJpYWxpemF0aW9uIGVtYmVkZGluZyBjbGFzcyBhbmNob3JcbiAgICogQHN1bW1hcnkgQ2xvbmVzIHRoZSBtb2RlbCBhbmQgaW5qZWN0cyB0aGUgY2xhc3MgbWV0YWRhdGEgYW5jaG9yIHNvIGl0IGNhbiBiZSByZWNvbnN0cnVjdGVkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIEZhbGxzIGJhY2sgdG8gcHJvdmlkZWQgdGFibGUgbmFtZSBpZiBtZXRhZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHNlcmlhbGl6ZXJcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttb2RlbE5hbWVdIC0gT3B0aW9uYWwgdGFibGUgbmFtZSB0byB1c2Ugd2hlbiBtZXRhZGF0YSBjYW5ub3QgYmUgZGVyaXZlZFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBBIHBsYWluIG9iamVjdCByZWFkeSB0byBiZSBKU09OLnN0cmluZ2lmeSdkXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgICBpZiAoIW1ldGFkYXRhIHx8IG1ldGFkYXRhID09PSBcIk9iamVjdFwiKVxuICAgICAgaWYgKG1vZGVsTmFtZSkgbWV0YWRhdGEgPSBtb2RlbE5hbWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICApO1xuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGE7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gaXRzIEpTT04gc2VyaWFsaXphdGlvblxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIEpTT04gc3RyaW5nLCByZXRyaWV2ZXMgdGhlIGVtYmVkZGVkIG1vZGVsIGFuY2hvciwgYW5kIHVzZXMgTW9kZWwuYnVpbGQgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgSlNPTiBzdHJpbmcgcHJldmlvdXNseSBwcm9kdWNlZCBieSBzZXJpYWxpemVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZXMgYSBtb2RlbCB0byBhIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB2aWEgcHJlU2VyaWFsaXplLCBlbWJlZGRpbmcgbWV0YWRhdGEgbmVlZGVkIGZvciByZWNvbnN0cnVjdGlvbiwgYW5kIHJldHVybnMgYSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhYmxlXSAtIE9wdGlvbmFsIHRhYmxlIG5hbWUgdG8gaW5jbHVkZSBhcyBhbmNob3Igd2hlbiBtZXRhZGF0YSBpcyB1bmF2YWlsYWJsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBtb2RlbCB3aXRoIGFuY2hvciBtZXRhZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgbW9kZWxOYW1lKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRVJDMjBUb2tlbiwgRVJDMjBXYWxsZXQgfSBmcm9tIFwiLi4vLi4vY29udHJhY3RzL2VyYzIwL21vZGVsc1wiO1xuaW1wb3J0IHsgTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4uL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIENvbnRleHRPZixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIEV2ZW50SWRzLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFNlcXVlbmNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuLyoqXG4gKiBSZXBvc2l0b3J5IGZvciBpbnRlcmFjdGluZyB3aXRoIEVSQzIwIGNvbnRyYWN0cyBvbiBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrLlxuICogRXh0ZW5kcyB0aGUgYmFzZSBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGNsYXNzIGFuZCB1dGlsaXplcyB0aGUgQ2xpZW50U2VyaWFsaXplciBmb3IgZGF0YSBzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5PFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PEVSQzIwV2FsbGV0LCBBPiB7XG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeS5zZXJpYWxpemVyO1xuXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBvZiBhbiBldmVudC5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGRhdGFiYXNlIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnM8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgKTtcblxuICAgIHRhYmxlID0gKFxuICAgICAgdHlwZW9mIHRhYmxlID09PSBcInN0cmluZ1wiID8gTW9kZWwuZ2V0KHRhYmxlKSA6IHRhYmxlXG4gICAgKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBsZXQgcGFyc2VkSWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlZElkID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgIHBhcnNlZElkID0gaWQubWFwKFxuICAgICAgICAoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZShNb2RlbC5zZXF1ZW5jZUZvcih0YWJsZSkudHlwZSwgaSkgYXMgc3RyaW5nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRJZCA9IFNlcXVlbmNlLnBhcnNlVmFsdWUoXG4gICAgICAgIE1vZGVsLnNlcXVlbmNlRm9yKHRhYmxlKS50eXBlLFxuICAgICAgICBpZFxuICAgICAgKSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBwYXJzZWRJZCEsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgVWludDhBcnJheSBpbnRvIGEgc3RyaW5nIHVzaW5nIHRoZSBUZXh0RGVjb2Rlci5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgVWludDhBcnJheSB0byBkZWNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBFUkMyMFdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlRva2VuTmFtZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b2tlbk5hbWUoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b2tlbk5hbWVcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudG9rZW5OYW1lXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIlRva2VuTmFtZVwiKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzeW1ib2wgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIHN5bWJvbCBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlN5bWJvbFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc3ltYm9sIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHN5bWJvbCguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInN5bWJvbFwiLCB0cnVlKSkuZm9yKHRoaXMuc3ltYm9sKTtcbiAgICBjb25zdCBzeW1ib2wgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiU3ltYm9sXCIpO1xuICAgIHJldHVybiB0aGlzLmRlY29kZShzeW1ib2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIkRlY2ltYWxzXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGRlY2ltYWxzKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZGVjaW1hbHNcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZGVjaW1hbHNcbiAgICApO1xuICAgIGNvbnN0IGRlY2ltYWxzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkRlY2ltYWxzXCIpO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoZGVjaW1hbHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiVG90YWxTdXBwbHlcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QgYW5kIGRlY29kZXMgdGhlIHJldHVybmVkIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b3RhbFN1cHBseShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b3RhbFN1cHBseVwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50b3RhbFN1cHBseVxuICAgICk7XG4gICAgY29uc3QgdG90YWwgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiVG90YWxTdXBwbHlcIik7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZSh0b3RhbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIGEgc3BlY2lmaWVkIG93bmVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgYSBnaXZlbiBvd25lci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQmFsYW5jZU9mXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHByb3ZpZGVkIG93bmVyJ3MgYWRkcmVzcyBhcyBhIHBhcmFtZXRlci5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjb252ZXJ0ZWQgdG8gYSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBFUkMyMCB0b2tlbiBvd25lci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgb3duZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBiYWxhbmNlT2YoXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJiYWxhbmNlXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmJhbGFuY2VPZlxuICAgICk7XG4gICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJCYWxhbmNlT2ZcIiwgW1xuICAgICAgb3duZXIsXG4gICAgXSk7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShiYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYSByZWNpcGllbnQuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdHJhbnNmZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhIHJlY2lwaWVudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgcmVjaXBpZW50J3MgYWRkcmVzcyBhbmQgdGhlIHRyYW5zZmVyIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gdHJhbnNmZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyKFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwidHJhbnNmZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudHJhbnNmZXJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZmVycmVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJUcmFuc2ZlclwiLCBbXG4gICAgICB0byxcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKHRyYW5zZmVycmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHRyYW5zZmVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKiBGb3IgdGhpcyB0cmFuc2ZlciB0byB3b3JrIHRoZSBzcGVuZGVyICggYWNjb3VudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGlzIGZ1bmN0aW9uICkgbmVlZCB0byBoYXZlIHRoZSB2YWx1ZSBhcHByb3ZlZCBhcyBhbiBhbGxvd2FuY2UgYnkgdGhlIHNlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJGcm9tXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNlbmRlcidzIGFkZHJlc3MsIHJlY2lwaWVudCdzIGFkZHJlc3MsIGFuZCB0aGUgdHJhbnNmZXIgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB0byAtIFRoZSBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIHRyYW5zZmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckZyb20oXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwidHJhbnNmZXJGcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLnRyYW5zZmVyRnJvbSk7XG4gICAgY29uc3QgdHJhbnNmZXJyZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIlRyYW5zZmVyRnJvbVwiLFxuICAgICAgW2Zyb20sIHRvLCB2YWx1ZS50b1N0cmluZygpXVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGUodHJhbnNmZXJyZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJlIHNwZW50IGJ5IGEgc3BlY2lmaWVkIHNwZW5kZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBhcHByb3ZlIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYmUgc3BlbnQgYnkgYSBzcGVjaWZpZWQgc3BlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQXBwcm92ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhbmQgdGhlIGFwcHJvdmFsIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHNwZW5kZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlbmRlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYXBwcm92ZSBmb3IgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgYXBwcm92YWwgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGFwcHJvdmUoc3BlbmRlcjogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFwcHJvdmVcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYXBwcm92ZSk7XG4gICAgY29uc3QgYXBwcm92ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkFwcHJvdmVcIiwgW1xuICAgICAgc3BlbmRlcixcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGFwcHJvdmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIGEgc3BlbmRlci5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgYWxsb3dhbmNlIG9mIEVSQzIwIHRva2VucyB0aGF0IHRoZSBzcGVjaWZpZWQgb3duZXIgaGFzIGFwcHJvdmVkIGZvciBhIHNwZW5kZXIuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkFsbG93YW5jZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBvd25lcidzIGFkZHJlc3MgYW5kIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIEVSQzIwIHRva2VuIG93bmVyLlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYWxsb3dhbmNlKG93bmVyOiBzdHJpbmcsIHNwZW5kZXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFsbG93YW5jZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5hbGxvd2FuY2UpO1xuICAgIGNvbnN0IGFsbG93YW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQWxsb3dhbmNlXCIsIFtcbiAgICAgIG93bmVyLFxuICAgICAgc3BlbmRlcixcbiAgICBdKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKGFsbG93YW5jZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBwcm92aWRlZCB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBpbml0aWFsaXplIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBnaXZlbiB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiSW5pdGlhbGl6ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzZXJpYWxpemVkIHRva2VuIGRhdGEgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgRVJDMjAgdG9rZW4gaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJhY3Qgd2l0aC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSh0b2tlbjogRVJDMjBUb2tlbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJpbml0aWFsaXplXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IGluaXRpbGlhemVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJJbml0aWFsaXplXCIsXG4gICAgICBbRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHRva2VuKV1cbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGluaXRpbGlhemVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBFUkMyMCBjb250cmFjdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHZlcmlmeSBpZiB0aGUgRVJDMjAgY29udHJhY3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNoZWNrSW5pdGlhbGl6ZWRcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpbml0aWFsaXphdGlvbiBjaGVjayBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBjaGVja0luaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJjaGVja0luaXRpYWxpemVkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJDaGVja0luaXRpYWxpemVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnRzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gbWludCBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJNaW50XCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIG1pbnRpbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IHVwZGF0ZXMgdGhlIG1pbnRlcidzIG51bWJlciBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBtaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWludGluZyBwcm9jZXNzIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIG1pbnQoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwibWludFwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5taW50KTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIk1pbnRcIiwgW2Ftb3VudC50b1N0cmluZygpXSk7XG4gIH1cblxuICAvKipcbiAgICogQnVybnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIHRoZSBtaW50ZXIncyBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gYnVybiBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJCdXJuXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIGJ1cm5pbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgbWludGVyJ3MgbnVtYmVyIG9mIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJ1cm4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidXJuaW5nIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYnVybihhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJidXJuXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm4pO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQnVyblwiLCBbYW1vdW50LnRvU3RyaW5nKCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJucyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gYSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGJ1cm4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQnVybkZyb21cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgYWNjb3VudCdzIGFkZHJlc3MgYW5kIHRoZSBidXJuaW5nIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgc3BlY2lmaWVkIGFjY291bnQncyBudW1iZXIgb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIFRoZSBhZGRyZXNzIG9mIHRoZSBhY2NvdW50IGZyb20gd2hpY2ggdG8gYnVybiB0aGUgRVJDMjAgdG9rZW5zLlxuICAgKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYnVybi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1cm5pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBidXJuRnJvbShhY2NvdW50OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImJ1cm5Gcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm5Gcm9tKTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkJ1cm5Gcm9tXCIsIFtcbiAgICAgIGFjY291bnQsXG4gICAgICBhbW91bnQudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGJhbGFuY2Ugb2YgRVJDMjAgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIEVSQzIwIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNsaWVudEFjY291bnRCYWxhbmNlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0LCB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGFueSBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiBFUkMyMCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgY2xpZW50QWNjb3VudEJhbGFuY2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudEJhbGFuY2VcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2xpZW50QWNjb3VudEJhbGFuY2UpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJDbGllbnRBY2NvdW50QmFsYW5jZVwiXG4gICAgKTtcblxuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoc2VyaWFsaXplZEFjY291bnRCYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjbGllbnQncyBhY2NvdW50IElEIGZyb20gdGhlIGJsb2NrY2hhaW4gbmV0d29yay5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBjbGllbnQncyBhY2NvdW50IElELlxuICAgKiBJdCBjYWxscyB0aGUgXCJDbGllbnRBY2NvdW50SURcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgcmV0dXJuZWQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQgSUQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBjbGllbnRBY2NvdW50SUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudElkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNsaWVudEFjY291bnRJRCk7XG4gICAgY29uc3QgY2xpZW50QWNjb3VudElEID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkNsaWVudEFjY291bnRJRFwiXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRlY29kZShjbGllbnRBY2NvdW50SUQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIFByaW1hcnlLZXlUeXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBjb21wb3NlQXR0cmlidXRlVmFsdWUgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJZHM8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtb2RlbHM6IE0gfCBNW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdLFxuICBpZHM6IFByaW1hcnlLZXlUeXBlIHwgUHJpbWFyeUtleVR5cGVbXVxuKSB7XG4gIGxldCBwazoga2V5b2YgTTtcbiAgbGV0IGNvbXBvc2VkOiBhbnk7XG4gIGxldCBwa1Byb3BzOiBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgZnVuY3Rpb24gZXh0cmFjdElkKG06IE0gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZHM6IFByaW1hcnlLZXlUeXBlKSB7XG4gICAgcGsgPSBwayB8fCBNb2RlbC5wayhjbGF6eik7XG4gICAgcGtQcm9wcyA9IHBrUHJvcHMgfHwgTW9kZWwuc2VxdWVuY2VGb3IoY2xhenopO1xuICAgIGNvbXBvc2VkID0gY29tcG9zZWQgfHwgTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcblxuICAgIGlmIChjb21wb3NlZCkge1xuICAgICAgcmV0dXJuIGNvbXBvc2VBdHRyaWJ1dGVWYWx1ZShtIGFzIGFueSwgY29tcG9zZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gKG0gYXMgYW55KVtwa10gfHwgaWRzO1xuICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgY291bGQgbm90IHJlYnVpbGQgaWQgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZGVscykpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSB8fCBpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiaW5jb25zaXN0ZW50IHBhcmFtZXRlcnMuIGJvdGggbXVzdCBiZSBhcnJheXMgb2YgZXF1YWwgbGVuZ3RoXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1vZGVscy5tYXAoKG0sIGkpID0+IGV4dHJhY3RJZChtLCBpZHNbaV0pKTtcbiAgfVxuICByZXR1cm4gZXh0cmFjdElkKG1vZGVscywgaWRzIGFzIFByaW1hcnlLZXlUeXBlKTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbCwgY29sdW1uLCBwayB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVzY3JpcHRpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpdHkgY3JlZGVudGlhbCBtb2RlbCBzdG9yaW5nIGNyeXB0b2dyYXBoaWMgbWF0ZXJpYWxzXG4gKiBAc3VtbWFyeSBIb2xkcyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQgcHJpdmF0ZSBrZXkgaW5mb3JtYXRpb24gZm9yIGEgRmFicmljIGlkZW50aXR5LCBtYW5hZ2VkIGFzIGEgc2VwYXJhdGUgZW50aXR5IGxpbmtlZCBmcm9tIElkZW50aXR5XG4gKiBAcGFyYW0ge01vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+fSBbYXJnXSAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIG1vZGVsIGZpZWxkc1xuICogQGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgY3JlZGVudGlhbHMgZW50cnlcbiAqIGNvbnN0IGNyZWRzID0gbmV3IElkZW50aXR5Q3JlZGVudGlhbHMoeyBpZDogXCJjcmVkczFcIiwgY2VydGlmaWNhdGU6IFwiLi4uXCIsIHJvb3RDZXJ0aWZpY2F0ZTogXCIuLi5cIiwgcHJpdmF0ZUtleTogXCIuLi5cIiB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqICAgQXBwLT4+TW9kZWw6IG5ldyBJZGVudGl0eUNyZWRlbnRpYWxzKHsgaWQsIGNlcnRpZmljYXRlLCByb290Q2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICogQHNlZSBtb2RlbFxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHMgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcbiAgICogQHN1bW1hcnkgUHJpbWFyeSBrZXkgZm9yIHJlZmVyZW5jaW5nIHRoaXMgY3JlZGVudGlhbHMgZW50cnlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcIilcbiAgQGNvbHVtbigpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUgZm9yIHRoZSBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBMZWFmIGNlcnRpZmljYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWRlbnRpdHlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIFguNTA5IGNlcnRpZmljYXRlIGZvciB0aGUgaWRlbnRpdHlcIilcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIGNlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcm9vdCBvciBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUm9vdCBvZiB0cnVzdCB1c2VkIHRvIHZhbGlkYXRlIHRoZSBsZWFmIGNlcnRpZmljYXRlXG4gICAqL1xuICBAZGVzY3JpcHRpb24oXCJQRU0tZW5jb2RlZCByb290IG9yIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZVwiKVxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgcm9vdENlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpdHkgY2VydGlmaWNhdGVcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIHByaXZhdGUga2V5XCIpXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBwcml2YXRlS2V5ITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIHRvIG1hcmsgRmFicmljLXNwZWNpZmljIG1vZGVsIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIGtleXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBsYXllciB0byBwZXJzaXN0IEZhYnJpYy1yZWxhdGVkIGZsYWdzIG9uIG1vZGVsc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBGYWJyaWNNb2RlbEtleXMge1xuICAvKiogUHJpdmF0ZSBkYXRhIG1hcmtlciB1c2VkIHRvIHRhZyBwcm9wZXJ0aWVzIG9yIG1vZGVscyBmb3IgRmFicmljIHByaXZhdGUgY29sbGVjdGlvbnMgKi9cbiAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxuICBTSEFSRUQgPSBcInNoYXJlZFwiLFxuICAvKiogTmFtZXNwYWNlIHByZWZpeCB1c2VkIGZvciBGYWJyaWMtc3BlY2lmaWMgbWV0YWRhdGEga2V5cyAqL1xuICBGQUJSSUMgPSBcImZhYnJpY1wiLFxuICBPV05FRF9CWSA9IFwib3duZWQtYnlcIixcbiAgVFJBTlNBQ1RJT05fSUQgPSBcInRyYW5zYWN0aW9uLWlkXCIsXG4gIE1JUlJPUiA9IFwibWlycm9yXCIsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgZm9yIEZhYnJpYyBjcmVkZW50aWFsc1xuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgaWRlbnRpdHkgZm9ybWF0cyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVR5cGUge1xuICAvKiogU3RhbmRhcmQgWC41MDkgaWRlbnRpdHkgZm9ybWF0IHVzZWQgYnkgSHlwZXJsZWRnZXIgRmFicmljICovXG4gIFg1MDkgPSBcIlguNTA5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgRmFicmljIGFkYXB0ZXIgZmxhdm91clxuICogQHN1bW1hcnkgVXNlZCB0byB0YWcgYWRhcHRlcnMvcmVwb3NpdG9yaWVzIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQGNvbnN0IEZhYnJpY0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZhYnJpY0ZsYXZvdXIgPSBcImhsZi1mYWJyaWNcIjtcbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgQ2FzY2FkZSxcbiAgY29sdW1uLFxuICBpbmRleCxcbiAgb25lVG9PbmUsXG4gIHBrLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCB0eXBlIE1vZGVsQXJnLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElkZW50aXR5Q3JlZGVudGlhbHMgfSBmcm9tIFwiLi9JZGVudGl0eUNyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBtb2RlbCByZXByZXNlbnRpbmcgYSBGYWJyaWMgd2FsbGV0IGVudHJ5XG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYW4gaWRlbnRpdHkgc3RvcmVkIGluIGEgRmFicmljIHdhbGxldCwgaW5jbHVkaW5nIGl0cyBNU1AgaWRlbnRpZmllciwgY3JlZGVudGlhbCBsaW5rYWdlLCBhbmQgdHlwZSBpbmZvcm1hdGlvbi4gQnVpbHQgb24gQmFzZU1vZGVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIERlY2FmIHZhbGlkYXRpb24gYW5kIHBlcnNpc3RlbmNlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxJZGVudGl0eT59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAqIGNvbnN0IGlkID0gbmV3IElkZW50aXR5KHsgaWQ6IFwidXNlcjFcIiwgbXNwSWQ6IFwiT3JnMU1TUFwiLCB0eXBlOiBJZGVudGl0eVR5cGUuWDUwOSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5XG4gKiAgIEFwcC0+Pk1vZGVsOiBuZXcgSWRlbnRpdHkoeyBpZCwgbXNwSWQsIHR5cGUgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHkgaW4gdGhlIHdhbGxldFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGlkZW50aXR5IHJlY29yZFxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlkZW50aXR5XCIpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGluayB0byB0aGUgaWRlbnRpdHkgY3JlZGVudGlhbHMgc3RvcmVkIHNlcGFyYXRlbHlcbiAgICogQHN1bW1hcnkgT25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdG8gdGhlIGNyZWRlbnRpYWxzIGVudGl0eTsgY2FzY2FkZXMgb24gdXBkYXRlIGFuZCBkZWxldGVcbiAgICovXG4gIEBvbmVUb09uZShJZGVudGl0eUNyZWRlbnRpYWxzLCB7XG4gICAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gICAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIH0pXG4gIGNyZWRlbnRpYWxzITogSWRlbnRpdHlDcmVkZW50aWFscztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFRoZSBNU1AgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXNzdWVkIHRoaXMgaWRlbnRpdHlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBtc3BJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgb2YgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHRoZSBpZGVudGl0eSBlbmNvZGluZy9mb3JtYXQ7IGRlZmF1bHRzIHRvIFguNTA5XG4gICAqL1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgdHlwZTogSWRlbnRpdHlUeXBlID0gSWRlbnRpdHlUeXBlLlg1MDk7XG5cbiAgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxJZGVudGl0eT4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBDcnlwdG9TZXR0aW5nLCBJQ3J5cHRvU3VpdGUsIFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSFNNT3B0aW9ucyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IGNyeXB0bywgeyBYNTA5Q2VydGlmaWNhdGUgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBYNTA5Q2VydGlmaWNhdGUgYXMgWDUwOUNlcnQgfSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggZmlsZXMsIGNyeXB0byBpZGVudGl0aWVzLCBhbmQgRmFicmljIFNESyBoZWxwZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdG8gcmVhZCBjcmVkZW50aWFscyBhbmQga2V5cyBmcm9tIGRpc2sgb3IgcmF3IGNvbnRlbnQsIGNvbnN0cnVjdCBGYWJyaWMgZ2F0ZXdheSBJZGVudGl0aWVzIGFuZCBTaWduZXJzLCBhbmQgcGVyZm9ybSBjb21tb24gZmlsZXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIEZhYnJpYyBjbGllbnQgdG9vbGluZy5cbiAqIEBjbGFzcyBDb3JlVXRpbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGFuIGlkZW50aXR5IGFuZCBzaWduZXIgZnJvbSBkaXJlY3Rvcmllc1xuICogY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0SWRlbnRpdHkoJ09yZzFNU1AnLCAnL21zcC9zaWduY2VydHMnKTtcbiAqIGNvbnN0IHNpZ25lciA9IGF3YWl0IENvcmVVdGlscy5nZXRTaWduZXIoJy9tc3Ava2V5c3RvcmUnKTtcbiAqIC8vIEJ1aWxkIGEgQ0EgdXNlclxuICogY29uc3QgdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoJ2FwcFVzZXInLCBwZW1LZXksIHBlbUNlcnQsICdPcmcxTVNQJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyBsb2dnZXI6IExvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENvcmVVdGlscy5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyBjcnlwdG9TdWl0ZTogSUNyeXB0b1N1aXRlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZSBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIHJhdyBjb250ZW50XG4gICAqIEBzdW1tYXJ5IElmIHRoZSBpbnB1dCBpcyBhIFVpbnQ4QXJyYXkgb3IgUEVNIGNvbnRlbnQsIHJldHVybnMgaXQgYXMtaXM7IG90aGVyd2lzZSB1c2VzIGEgcHJvdmlkZWQgYXN5bmMgZmlsZVJlYWRlciB0byBsb2FkIHRoZSBjb250ZW50IGZyb20gZGlzay5cbiAgICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIEVpdGhlciBhIHJhdyBjb250ZW50IGJ1ZmZlci9zdHJpbmcgb3IgYSBmaWxlc3lzdGVtIHBhdGhcbiAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IGZpbGVSZWFkZXIgLSBBc3luYyBmdW5jdGlvbiB0byByZWFkIGZpbGUgY29udGVudCB3aGVuIGEgcGF0aCBpcyBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgZG93bnN0cmVhbVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4gICkge1xuICAgIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gICAgaWYgKFxuICAgICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIEJ1ZmZlclxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgbG9hZHMgYSBmaWxlIHVzaW5nIGZzLnByb21pc2VzIHdoZW4gYSBwYXRoIHN0cmluZyBpcyBwcm92aWRlZDsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdpdmVuIEJ1ZmZlciBkaXJlY3RseS5cbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50T3JQYXRoIC0gUGF0aCB0byBhIGZpbGUgb24gZGlzayBvciBhbiBhbHJlYWR5LWxvYWRlZCBCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmd8VWludDhBcnJheXxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyL3N0cmluZyBkZXBlbmRpbmcgb24gcmVhZGVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgRmFicmljIENBIFVzZXIgb2JqZWN0IHdpdGggZW5yb2xsbWVudFxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZmFicmljLWNvbW1vbiBVc2VyLCBzZXRzIGEgY3J5cHRvIHN1aXRlLCBpbXBvcnRzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSwgYW5kIHNldHMgZW5yb2xsbWVudCB3aXRoIGNlcnRpZmljYXRlIGFuZCBNU1AgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBDQSB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gVGhlIGVucm9sbGVkIEZhYnJpYyBVc2VyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q0FVc2VyKFxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBoc20/OiBIU01PcHRpb25zIH1cbiAgKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ3JlYXRpbmcgQ0EgezB9IHVzZXIgezF9IHdpdGggY2VydGlmaWNhdGUgezJ9XCIsXG4gICAgICAgIG1zcElkLFxuICAgICAgICB1c2VyTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGVcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IHtcbiAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgbGliOiBvcHRpb25zLmhzbS5saWJyYXJ5LFxuICAgICAgICAgIHNsb3Q6IG9wdGlvbnMuaHNtLnNsb3QsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgcGluOiBTdHJpbmcob3B0aW9ucy5oc20ucGluKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3J5cHRvU3VpdGUgPSB0aGlzLmdldENyeXB0b1N1aXRlKGNvbmZpZyk7XG5cbiAgICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgICBjb25zdCBlbnJvbGxtZW50S2V5ID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SFNNRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgY2VydGlmaWNhdGUsIG9wdGlvbnMuaHNtKVxuICAgICAgOiB0aGlzLmdldFNvZnR3YXJlRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgcHJpdmF0ZUtleSk7XG4gICAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGVucm9sbG1lbnRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q3J5cHRvU3VpdGUob3B0aW9ucz86IENyeXB0b1NldHRpbmcpOiBJQ3J5cHRvU3VpdGUge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgICBpZiAoQ29yZVV0aWxzLmNyeXB0b1N1aXRlKSByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuXG4gICAgQ29yZVV0aWxzLmNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZShvcHRpb25zKTtcbiAgICByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgcHJpdmF0ZUtleT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQcml2YXRlIGtleSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gSFNNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBsaWVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SFNNRW5yb2xsbWVudEtleShcbiAgICBjcnlwdG9TdWl0ZTogYW55LFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgaHNtOiBIU01PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHNraSA9XG4gICAgICBoc20ua2V5SWRIZXggJiYgaHNtLmtleUlkSGV4LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gQnVmZmVyLmZyb20oaHNtLmtleUlkSGV4LCBcImhleFwiKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2VydGlmaWNhdGVTS0koY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1aXRlLmdldEtleShza2kpO1xuICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5LmlzUHJpdmF0ZSA9PT0gXCJmdW5jdGlvblwiICYmICFrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcml2YXRlIGtleSBmcm9tIEhTTVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCB4NTA5ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgandrID0geDUwOS5wdWJsaWNLZXkuZXhwb3J0KHsgZm9ybWF0OiBcImp3a1wiIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKGp3ay54IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShqd2sueSB8fCBcIlwiLCBcImJhc2U2NHVybFwiKTtcbiAgICByZXR1cm4gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtwcmVmaXgsIHgsIHldKSlcbiAgICAgIC5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgYSBGYWJyaWMgR2F0ZXdheSBJZGVudGl0eSBmcm9tIGFuIE1TUCBJRCBhbmQgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUmVhZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IHBhdGggb3IgYWNjZXB0cyByYXcgY29udGVudCBhbmQgcmV0dXJucyBhbiBJZGVudGl0eSBvYmplY3Qgc3VpdGFibGUgZm9yIHRoZSBGYWJyaWMgR2F0ZXdheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgZmlsZSwgb3IgUEVNIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBpZGVudGl0eSBjb250YWluaW5nIG1zcElkIGFuZCBjZXJ0aWZpY2F0ZSBjcmVkZW50aWFsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldElkZW50aXR5KFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgICBzaWduZXJGaWxlUmVhZGVyXG4gICAgKSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAgIC8vIC0tXG5cbiAgICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gICAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gICAgbGV0IHN1YnRsZTogYW55O1xuICAgIGlmIChcbiAgICAgIChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93ICYmXG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgYXMgeyBDcnlwdG86IGFueSB9KS5DcnlwdG9cbiAgICApIHtcbiAgICAgIHN1YnRsZSA9ICgoZ2xvYmFsVGhpcyBhcyBhbnkpLkNyeXB0byBhcyBhbnkpLnN1YnRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICAgIH1cblxuICAgIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHIgPSBwZW1cbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNlcnRpZmljYXRlIFNlcmlhbCBOdW1iZXIgYW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcilcbiAqIGluIHRoZSBmb3JtYXQgRmFicmljIENBIGV4cGVjdHMgKHBsYWluIGhleCwgbm8gY29sb25zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGNlcnQ6IHN0cmluZyk6IHtcbiAgYWtpOiBzdHJpbmc7XG4gIHNlcmlhbDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHg1MDlDZXJ0aWZpY2F0ZSA9IG5ldyBYNTA5Q2VydChjZXJ0KTtcblxuICAvLyBGaW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcikgZXh0ZW5zaW9uIGJ5IGl0cyBPSUQ6IDIuNS4yOS4zNVxuICBjb25zdCBha2lFeHQgPSB4NTA5Q2VydGlmaWNhdGUuZXh0ZW5zaW9ucz8uZmluZChcbiAgICAoZSkgPT4gZS50eXBlID09PSBcIjIuNS4yOS4zNVwiXG4gICk7XG4gIGlmICghYWtpRXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdXRob3JpdHkgS2V5IElkZW50aWZpZXIgKEFLSSkgZXh0ZW5zaW9uIG5vdCBmb3VuZCBpbiBjZXJ0aWZpY2F0ZS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBha2lFeHQudmFsdWUgaXMgdGhlIGV4dGVuc2lvbiBjb250ZW50IGluIERFUiBieXRlcy4gQ29udmVydCBpdCB0byBhIGhleCBzdHJpbmcuXG4gIGxldCBha2kgPSBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShha2lFeHQudmFsdWUpKVxuICAgIC50b1N0cmluZyhcImhleFwiKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBDb21tb24gY2FzZTpcbiAgICogVGhlIERFUi1lbmNvZGVkIEFLSSBleHRlbnNpb24gb2Z0ZW4gc3RhcnRzIHdpdGg6XG4gICAqICAgMzAgMTYgODAgMTQgPDIwLWJ5dGUga2V5SWRlbnRpZmllcj5cbiAgICogSW4gaGV4LCB0aGF0J3MgXCIzMDE2ODAxNFwiICsgNDAgaGV4IGNoYXJzICgyMCBieXRlcykuXG4gICAqXG4gICAqIEZhYnJpYyBDQSBleHBlY3RzIE9OTFkgdGhlIDIwLWJ5dGUga2V5SWRlbnRpZmllciAoNDAgaGV4IGNoYXJzKSxcbiAgICogc28gd2Ugc3RyaXAgdGhlIFwiMzAxNjgwMTRcIiBwcmVmaXggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgaWYgKGFraS5zdGFydHNXaXRoKFwiMzAxNjgwMTRcIikgJiYgYWtpLmxlbmd0aCA+PSA4ICsgNDApXG4gICAgYWtpID0gYWtpLnNsaWNlKDgsIDggKyA0MCk7XG5cbiAgcmV0dXJuIHsgYWtpLCBzZXJpYWw6IHg1MDlDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIgfTtcbn1cbiIsImltcG9ydCAqIGFzIHg1MDkgZnJvbSBcIkBwZWN1bGlhci94NTA5XCI7XG5pbXBvcnQgeyBDcnlwdG8sIENyeXB0b0tleSB9IGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgY3J5cHRvID0gbmV3IENyeXB0bygpO1xueDUwOS5jcnlwdG9Qcm92aWRlci5zZXQoY3J5cHRvKTtcblxuZXhwb3J0IGVudW0gQkFTRV9BTFBIQUJFVCB7XG4gIEJBU0UyID0gXCIwMVwiLFxuICBCQVNFOCA9IFwiMDEyMzQ1NjdcIixcbiAgQkFTRTExID0gXCIwMTIzNDU2Nzg5YVwiLFxuICBCQVNFMTYgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIixcbiAgQkFTRTMyID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWlwiLFxuICBCQVNFMzJfWiA9IFwieWJuZHJmZzhlamttY3BxeG90MXV3aXN6YTM0NWg3NjlcIixcbiAgQkFTRTM2ID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTU4ID0gXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIsXG4gIEJBU0U2MiA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIixcbiAgQkFTRTY0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIEJBU0U2NyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXy4hflwiLFxufVxuXG5leHBvcnQgdHlwZSBrZXlPYmplY3QgPSB7XG4gIGl2OiBBcnJheUJ1ZmZlcjtcbiAga2V5OiBDcnlwdG9LZXk7XG59O1xuXG5leHBvcnQgZW51bSBDUllQVE8ge1xuICBIQVNIID0gXCJTSEEtMjU2XCIsXG4gIElURVJBVElPTlMgPSAxMDAwLFxuICBLRVlMRU5HVEggPSA0OCxcbiAgREVSSVZFRF9JVl9MRU5HVEggPSAxNixcbiAgREVSSVZFRF9LRVlfTEVOR1RIID0gMzIsIC8vIEJlY2F1c2UgU0hBLTI1NiB1c2VkIGhhcyBhIG5hdGl2ZSBzaXplIG9mIDMyIGJ5dGVzXG4gIEFMR09SWVRITSA9IFwiQUVTLUdDTVwiLFxuICBLRVlfQUxHT1JZVEhNID0gXCJQQktERjJcIixcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VFbmNvZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaUZhY3RvcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWxwaGFiZXQ6IEJBU0VfQUxQSEFCRVQpIHtcbiAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggPj0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoXCJBbHBoYWJldCB0b28gbG9uZ1wiKTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5iYXNlTWFwLmxlbmd0aDsgaisrKSB0aGlzLmJhc2VNYXBbal0gPSAyNTU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gYWxwaGFiZXQuY2hhckF0KGkpO1xuICAgICAgY29uc3QgeGMgPSB4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAodGhpcy5iYXNlTWFwW3hjXSAhPT0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoeCArIFwiIGlzIGFtYmlndW91c1wiKTtcblxuICAgICAgdGhpcy5iYXNlTWFwW3hjXSA9IGk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgdGhpcy5sZWFkZXIgPSB0aGlzLmFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB0aGlzLmZhY3RvciA9IE1hdGgubG9nKHRoaXMuYmFzZSkgLyBNYXRoLmxvZygyNTYpOyAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICAgIHRoaXMuaUZhY3RvciA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyh0aGlzLmJhc2UpOyAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICB9XG5cbiAgZW5jb2RlKHNvdXJjZTogVWludDhBcnJheSB8IERhdGFWaWV3IHwgYW55W10gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgc291cmNlID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgc291cmNlLmJ1ZmZlcixcbiAgICAgICAgc291cmNlLmJ5dGVPZmZzZXQsXG4gICAgICAgIHNvdXJjZS5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBVaW50OEFycmF5LmZyb20oc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IHBiZWdpbiA9IDA7XG4gICAgY29uc3QgcGVuZCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKys7XG4gICAgICB6ZXJvZXMrKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTU4IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogdGhpcy5pRmFjdG9yICsgMSkgPj4+IDA7XG4gICAgY29uc3QgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW3BiZWdpbl07XG4gICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQxID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDEgIT09IC0xO1xuICAgICAgICBpdDEtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMDtcbiAgICAgICAgYjU4W2l0MV0gPSBjYXJyeSAlIHRoaXMuYmFzZSA+Pj4gMDtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyB0aGlzLmJhc2UpID4+PiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcblxuICAgICAgbGVuZ3RoID0gaTtcbiAgICAgIHBiZWdpbisrO1xuICAgIH1cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgbGV0IGl0MiA9IHNpemUgLSBsZW5ndGg7XG4gICAgd2hpbGUgKGl0MiAhPT0gc2l6ZSAmJiBiNThbaXQyXSA9PT0gMCkgaXQyKys7XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIGxldCBzdHIgPSB0aGlzLmxlYWRlci5yZXBlYXQoemVyb2VzKTtcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHtcbiAgICAgIHN0ciArPSB0aGlzLmFscGhhYmV0LmNoYXJBdChiNThbaXQyXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVVuc2FmZShzb3VyY2U6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICBsZXQgcHN6ID0gMDtcbiAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSB0aGlzLmxlYWRlcikge1xuICAgICAgemVyb2VzKys7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICBjb25zdCBzaXplID0gKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIHRoaXMuZmFjdG9yICsgMSkgPj4+IDA7IC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICBjb25zdCBiMjU2ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVycy5cbiAgICB3aGlsZSAoc291cmNlW3Bzel0pIHtcbiAgICAgIC8vIERlY29kZSBjaGFyYWN0ZXJcbiAgICAgIGxldCBjYXJyeSA9IHRoaXMuYmFzZU1hcFtzb3VyY2UuY2hhckNvZGVBdChwc3opXTtcbiAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQzID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDMgIT09IC0xO1xuICAgICAgICBpdDMtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKHRoaXMuYmFzZSAqIGIyNTZbaXQzXSkgPj4+IDA7XG4gICAgICAgIGIyNTZbaXQzXSA9IGNhcnJ5ICUgMjU2ID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcHN6Kys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICBsZXQgaXQ0ID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkgaXQ0Kys7XG5cbiAgICBjb25zdCB2Y2ggPSBuZXcgVWludDhBcnJheSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpO1xuICAgIGxldCBqID0gemVyb2VzO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHZjaFtqKytdID0gYjI1NltpdDQrK107XG5cbiAgICByZXR1cm4gdmNoO1xuICB9XG5cbiAgZGVjb2RlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kZWNvZGVVbnNhZmUoc291cmNlKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gYnVmZmVyO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1iYXNlXCIgKyB0aGlzLmJhc2UgKyBcIiBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyeXB0b1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYjU4ZW5jb2RlciA9IG5ldyBCYXNlRW5jb2RlcihCQVNFX0FMUEhBQkVULkJBU0U1OCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENyeXB0b1V0aWxzLm5hbWUpO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGU6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHN0cmluZ0Zvcm1hdChcIlBhcnNpbmcgY2VydGlmaWNhdGU6IHswfVwiLCBjZXJ0aWZpY2F0ZSkpO1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IHsgc3ViamVjdCwgaXNzdWVyIH0gPSBjZXJ0O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNlcnRpZmljYXRlIHBhcnNlZCB3aXRoIHN1YmplY3QgezB9IGFuZCBpc3N1ZXIgezF9XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGlzc3VlclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGB4NTA5OjovJHtzdWJqZWN0LnJlcGxhY2VBbGwoXCIsIFwiLCBcIi9cIil9OjovJHtpc3N1ZXIucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX1gO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYjU4ZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5iNThlbmNvZGVyLmRlY29kZShzdHIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdEtleShcbiAgICB0eXBlOiBcInByaXZhdGVcIiB8IFwicHVibGljXCIsXG4gICAgcGVtOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgdXNhZ2VzPzogYW55W11cbiAgKSB7XG4gICAgY29uc3Qgc3VidGxlID0gY3J5cHRvLnN1YnRsZTtcblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tQkVHSU4gKCR7dHlwZS50b1VwcGVyQ2FzZSgpfSBLRVl8Q0VSVElGSUNBVEUpLS0tLS1gKSxcbiAgICAgICAgXCJcIlxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKGAtLS0tLUVORCAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHRoaXMuc3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdXNhZ2VzID8gdXNhZ2VzIDogW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwcml2YXRlXCIsIHBlbSwgdXNhZ2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBleHRyYWN0UHVibGljS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwdWJsaWNcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24ocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgYnVmZiA9IChhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgaGFzaDogXCJTSEEtMjU2XCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApKSBhcyBBcnJheUJ1ZmZlcjtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdmVyaWZ5KFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGF0YTogQnVmZmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNlcnQucHVibGljS2V5LmV4cG9ydCgpO1xuICAgIHNpZ25hdHVyZSA9IChcbiAgICAgIHR5cGVvZiBzaWduYXR1cmUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShzaWduYXR1cmUsIFwiaGV4XCIpIDogc2lnbmF0dXJlXG4gICAgKSBhcyBCdWZmZXI7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBzaWduYXR1cmUgYXMgYW55LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHQoY2VydGlmaWNhdGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmYgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTdWJ0bGVDcnlwdG8oKSB7XG4gICAgcmV0dXJuIGlzQnJvd3NlcigpXG4gICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93LmNyeXB0by5zdWJ0bGVcbiAgICAgIDogY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0KHByaXZhdGVLZXk6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBkYXRhID0gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCBcImhleFwiKSA6IGRhdGFcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgYSByYW5kb20gbWFzdGVyIGtleVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gSWYgZGF0YSBpcyBub3QgcGFzc2VkLCBhIHJhbmRvbSBBcnJheUJ1ZmZlciB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkYXRhIGVuY3J5dGlvbiBkYXRhXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRNYXN0ZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRNYXN0ZXIoZGF0YT86IEFycmF5QnVmZmVyKTogUHJvbWlzZTxrZXlPYmplY3Q+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlbkdlbmVzaXMgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgZGF0YSA9IHRleHRFbmNvZGVyLmVuY29kZShnZW5HZW5lc2lzKS5idWZmZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkYXRhLFxuICAgICAgQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZXJpdmVCaXRzXCJdXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGltcG9ydGVkS2V5LFxuICAgICAgaXY6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBrZXkgZnJvbSBhbm90aGVyIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2FsdFxuICAgKiBAcGFyYW0ge0NyeXB0b0tleX0ga2V5IE9yaWdpbmFsIGtleVxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RGVyaXZhdGlvbktleVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERlcml2YXRpb25LZXkoc2FsdDogc3RyaW5nLCBrZXk6IENyeXB0b0tleSkge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qgc2FsdEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZShzYWx0KTtcbiAgICBjb25zdCBzYWx0SGFzaGVkID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kaWdlc3QoXG4gICAgICBcIlNIQS0yNTZcIixcbiAgICAgIHNhbHRCdWZmZXJcbiAgICApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG5hbWU6IENSWVBUTy5LRVlfQUxHT1JZVEhNIGFzIHN0cmluZyxcbiAgICAgIGhhc2g6IENSWVBUTy5IQVNILFxuICAgICAgc2FsdDogc2FsdEhhc2hlZCxcbiAgICAgIGl0ZXJhdGlvbnM6IENSWVBUTy5JVEVSQVRJT05TLFxuICAgIH07XG4gICAgY29uc3QgZGVyaXZhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVyaXZlQml0cyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIGtleSxcbiAgICAgIENSWVBUTy5LRVlMRU5HVEggKiA4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRLZXkoZGVyaXZhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgdGhlIGtleSBhbmQgSVYgZnJvbSB0aGUgQ3J5dG9LZXkgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGVyaXZhdGlvblxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0S2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0S2V5KGRlcml2YXRpb246IEFycmF5QnVmZmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IGl2bGVuID0gMTY7XG4gICAgY29uc3Qga2V5bGVuID0gMzI7XG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGRlcml2YXRpb24uc2xpY2UoMCwga2V5bGVuKTtcbiAgICBjb25zdCBpdiA9IGRlcml2YXRpb24uc2xpY2Uoa2V5bGVuKTtcbiAgICBjb25zdCBpbXBvcnRlZEVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkZXJpdmVkS2V5LFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRFbmNyeXB0aW9uS2V5LFxuICAgICAgaXY6IGl2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZWNyeXB0IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtrZXlPYmplY3R9IGtleU9iamVjdFxuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHRQaW4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSB0ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gICAgY29uc3QgZW5jcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICB0ZXh0QnVmZmVyXG4gICAgKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZX0gZW5jcnlwdGVkVGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZWNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVjcnlwdFBpbihcbiAgICBlbmNyeXB0ZWRUZXh0OiBBcnJheUJ1ZmZlcixcbiAgICBrZXlPYmplY3Q6IGtleU9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICBlbmNyeXB0ZWRUZXh0XG4gICAgKTtcbiAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZFRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuLy8gaW1wb3J0IHsgTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuLi9jb250cmFjdHMvcHJpdmF0ZS1kYXRhXCI7XG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gb3ZlcmZsb3cgZXJyb3IgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgT3ZlcmZsb3dFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJmbG93RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT3ZlcmZsb3dFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFsYW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEJhbGFuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQWxsb3dhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSByZWdpc3RyYXRpbmcgbmV3IGVudGl0aWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBSZWdpc3RyYXRpb25FcnJvclxuICpcbiAqIEBjYXRlZ29ydCBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVnaXN0cmF0aW9uRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvbnRleHRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nQ29udGV4dEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciA9IFwiTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRVwiKSB7XG4gICAgc3VwZXIoVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MubmFtZSwgbXNnLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXAuXG4gKlxuICogQHRocm93cyB7Tm90SW5pdGlhbGl6ZWRFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqIGlmICghaXNJbml0aWFsaXplZCkge1xuICogICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcignQXBwbGljYXRpb24gaXMgbm90IGluaXRpYWxpemVkJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gTm90SW5pdGlhbGl6ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90SW5pdGlhbGl6ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90SW5pdGlhbGl6ZWRFcnJvci5uYW1lLCBtc2csIDQwOSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdQS0NTUzExTGliIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdQS0NTUzExTGliLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZG9yc2VtZW50RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFbmRvcnNlbWVudEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE12Y2NSZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE12Y2NSZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRQb2xpY3lFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50UG9saWN5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25MaW1pdHNFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yLm5hbWUsXG4gICAgY29kZSA9IDU5MFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBUcmFuc2FjdGlvblRpbWVvdXRFcnJvci5uYW1lLCA1OTEpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yLm5hbWUsIDU5Mik7XG4gIH1cbn1cbiIsImltcG9ydCBGYWJyaWNDQVNlcnZpY2VzIGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQge1xuICBBZmZpbGlhdGlvblNlcnZpY2UsXG4gIElkZW50aXR5U2VydmljZSxcbiAgSUVucm9sbFJlc3BvbnNlLFxuICBJUmVnaXN0ZXJSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQgeyBDQUNvbmZpZywgQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvbW9kZWwvSWRlbnRpdHlcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IENBX1JPTEUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4uL2NyeXB0b1wiO1xuaW1wb3J0IHtcbiAgQ2VydGlmaWNhdGVSZXNwb25zZSxcbiAgRmFicmljSWRlbnRpdHksXG4gIEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gIElkZW50aXR5UmVzcG9uc2UsXG59IGZyb20gXCIuLi8uLi9zaGFyZWQvZmFicmljLXR5cGVzXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcywgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIeXBlcmxlZGdlciBGYWJyaWMgQ0EgaWRlbnRpdHkgdHlwZXMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgcmVjb2duaXplZCBieSBGYWJyaWMgQ0EgZm9yIHJlZ2lzdHJhdGlvbiBhbmQgaWRlbnRpdHkgbWFuYWdlbWVudC5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGVudW0gSEZDQUlkZW50aXR5VHlwZSB7XG4gIFBFRVIgPSBcInBlZXJcIixcbiAgT1JERVJFUiA9IFwib3JkZXJlclwiLFxuICBDTElFTlQgPSBcImNsaWVudFwiLFxuICBVU0VSID0gXCJ1c2VyXCIsXG4gIEFETUlOID0gXCJhZG1pblwiLFxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5L3ZhbHVlIGF0dHJpYnV0ZSB1c2VkIGR1cmluZyBDQSByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBlbnRyeSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIEZhYnJpYyBDQSBpZGVudGl0eSBkdXJpbmcgcmVnaXN0cmF0aW9uLCBvcHRpb25hbGx5IG1hcmtpbmcgaXQgZm9yIGluY2x1c2lvbiBpbiBlY2VydC5cbiAqIEBpbnRlcmZhY2UgSUtleVZhbHVlQXR0cmlidXRlXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIEF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2VjZXJ0XSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGVucm9sbG1lbnQgY2VydGlmaWNhdGUgKEVDZXJ0KS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJS2V5VmFsdWVBdHRyaWJ1dGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGVjZXJ0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhbmRhcmQgRmFicmljIENBIGlkZW50aXR5IGF0dHJpYnV0ZSBrZXlzLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB3ZWxsLWtub3duIEZhYnJpYyBDQSBhdHRyaWJ1dGUga2V5cyB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBpZGVudGl0aWVzIGZvciBkZWxlZ2F0aW9ucyBhbmQgcGVybWlzc2lvbnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIEhGQ0FJZGVudGl0eUF0dHJpYnV0ZXMge1xuICBIRlJFR0lTVFJBUlJPTEVTID0gXCJoZi5SZWdpc3RyYXIuUm9sZXNcIixcbiAgSEZSRUdJU1RSQVJERUxFR0FURVJPTEVTID0gXCJoZi5SZWdpc3RyYXIuRGVsZWdhdGVSb2xlc1wiLFxuICBIRlJFR0lTVFJBUkFUVFJJQlVURVMgPSBcImhmLlJlZ2lzdHJhci5BdHRyaWJ1dGVzXCIsXG4gIEhGSU5URVJNRURJQVRFQ0EgPSBcImhmLkludGVybWVkaWF0ZUNBXCIsXG4gIEhGUkVWT0tFUiA9IFwiaGYuUmV2b2tlclwiLFxuICBIRkFGRklMSUFUSU9OTUdSID0gXCJoZi5BZmZpbGlhdGlvbk1nclwiLFxuICBIRkdFTkNSTCA9IFwiaGYuR2VuQ1JMXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNlcnZpY2Ugd3JhcHBlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEZhYnJpYyBDQS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGhpZ2gtbGV2ZWwgb3BlcmF0aW9ucyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhZ2FpbnN0IGEgSHlwZXJsZWRnZXIgRmFicmljIENlcnRpZmljYXRlIEF1dGhvcml0eSwgaW5jbHVkaW5nIHJlZ2lzdHJhdGlvbiwgZW5yb2xsbWVudCwgcmV2b2NhdGlvbiwgYW5kIGFkbWluaXN0cmF0aXZlIHF1ZXJpZXMuIEVuY2Fwc3VsYXRlcyBsb3dlci1sZXZlbCBGYWJyaWMgQ0EgY2xpZW50IGNhbGxzIHdpdGggY29uc2lzdGVudCBsb2dnaW5nIGFuZCBlcnJvciBtYXBwaW5nLlxuICogQHBhcmFtIHtDQUNvbmZpZ30gY2FDb25maWcgLSBDb25uZWN0aW9uIGFuZCBUTFMgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhcmdldCBDQS5cbiAqIEBjbGFzcyBGYWJyaWNFbnJvbGxtZW50U2VydmljZVxuICogQGV4YW1wbGVcbiAqIC8vIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgdXNlclxuICogY29uc3Qgc3ZjID0gbmV3IEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlKHtcbiAqICAgdXJsOiAnaHR0cHM6Ly9sb2NhbGhvc3Q6NzA1NCcsXG4gKiAgIGNhTmFtZTogJ09yZzFDQScsXG4gKiAgIHRsczogeyB0cnVzdGVkUm9vdHM6IFsnL3BhdGgvdG8vY2EucGVtJ10sIHZlcmlmeTogZmFsc2UgfSxcbiAqICAgY2FDZXJ0OiAnL3BhdGgvdG8vYWRtaW4vY2VydERpcicsXG4gKiAgIGNhS2V5OiAnL3BhdGgvdG8vYWRtaW4va2V5RGlyJ1xuICogfSk7XG4gKiBhd2FpdCBzdmMucmVnaXN0ZXIoeyB1c2VyTmFtZTogJ2FsaWNlJywgcGFzc3dvcmQ6ICdzM2NyM3QnIH0sIGZhbHNlLCAnb3JnMS5kZXBhcnRtZW50MScsIENBX1JPTEUuVVNFUik7XG4gKiBjb25zdCBpZCA9IGF3YWl0IHN2Yy5lbnJvbGwoJ2FsaWNlJywgJ3MzY3IzdCcpO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBhdXRvbnVtYmVyXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBTdmMgYXMgRmFicmljRW5yb2xsbWVudFNlcnZpY2VcbiAqICAgcGFydGljaXBhbnQgQ0EgYXMgRmFicmljIENBXG4gKiAgIEFwcC0+PlN2YzogcmVnaXN0ZXIoY3JlZGVudGlhbHMsIC4uLilcbiAqICAgU3ZjLT4+Q0E6IHJlZ2lzdGVyKHJlcXVlc3QsIGFkbWluVXNlcilcbiAqICAgQ0EtLT4+U3ZjOiBlbnJvbGxtZW50U2VjcmV0XG4gKiAgIFN2Yy0tPj5BcHA6IHNlY3JldFxuICogICBBcHAtPj5TdmM6IGVucm9sbChlbnJvbGxtZW50SWQsIHNlY3JldClcbiAqICAgU3ZjLT4+Q0E6IGVucm9sbCh7ZW5yb2xsbWVudElELCBzZWNyZXR9KVxuICogICBDQS0tPj5TdmM6IGNlcnRpZmljYXRlc1xuICogICBTdmMtLT4+QXBwOiBJZGVudGl0eVxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRW5yb2xsbWVudFNlcnZpY2UgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gIHByaXZhdGUgY2E/OiBGYWJyaWNDQVNlcnZpY2VzO1xuXG4gIHByaXZhdGUgY2VydGlmaWNhdGVTZXJ2aWNlPzogYW55O1xuXG4gIHByaXZhdGUgYWZmaWxpYXRpb25TZXJ2aWNlPzogQWZmaWxpYXRpb25TZXJ2aWNlO1xuXG4gIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlPzogSWRlbnRpdHlTZXJ2aWNlO1xuXG4gIHByaXZhdGUgY2xpZW50PzogYW55O1xuXG4gIHByaXZhdGUgdXNlcj86IFVzZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjYUNvbmZpZzogQ0FDb25maWcpIHtcbiAgICBDb3JlVXRpbHMuZ2V0Q3J5cHRvU3VpdGUoXG4gICAgICBjYUNvbmZpZy5oc21cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgICBsaWI6IGNhQ29uZmlnLmhzbS5saWJyYXJ5LFxuICAgICAgICAgICAgc2xvdDogY2FDb25maWcuaHNtLnNsb3QsXG4gICAgICAgICAgICBsYWJlbDogY2FDb25maWcuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgICBwaW46IFN0cmluZyhjYUNvbmZpZy5oc20ucGluKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIFVzZXIoKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgaWYgKHRoaXMudXNlcikgcmV0dXJuIHRoaXMudXNlcjtcbiAgICBjb25zdCB7IGNhTmFtZSwgY2FDZXJ0LCBjYUtleSwgdXJsLCBoc20gfSA9IHRoaXMuY2FDb25maWc7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuVXNlcik7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBDQSB1c2VyIGZvciAke2NhTmFtZX0gYXQgJHt1cmx9YCk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtjYUNlcnR9YCk7XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FDZXJ0KTtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFoc20pIHtcbiAgICAgIGlmICghY2FLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1pc3NpbmcgY2FLZXkgY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9LiBQcm92aWRlIGEga2V5IGRpcmVjdG9yeSBvciBjb25maWd1cmUgSFNNIHN1cHBvcnQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGtleSBmcm9tICR7Y2FLZXl9YCk7XG4gICAgICBrZXkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBVc2luZyBIU00gY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9IHdpdGggbGlicmFyeSAke2hzbS5saWJyYXJ5fWBcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgTG9hZGluZyBBZG1pbiB1c2VyIGZvciBjYSAke2NhTmFtZX1gKTtcbiAgICB0aGlzLnVzZXIgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Q0FVc2VyKFwiYWRtaW5cIiwga2V5LCBjZXJ0aWZpY2F0ZSwgY2FOYW1lLCB7XG4gICAgICBoc20sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMudXNlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBDQSgpOiBQcm9taXNlPEZhYnJpY0NBU2VydmljZXM+IHtcbiAgICBpZiAodGhpcy5jYSkgcmV0dXJuIHRoaXMuY2E7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuQ0EpO1xuICAgIGNvbnN0IHsgdXJsLCB0bHMsIGNhTmFtZSB9ID0gdGhpcy5jYUNvbmZpZztcblxuICAgIC8vIEZPUiBTb21lIFJlYXNvbiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxzIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhpcyB3b3JrcyBmb3Igbm93XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHRydXN0ZWRSb290cywgdmVyaWZ5IH0gPSB0bHMgYXMgVExTT3B0aW9ucztcblxuICAgIGNvbnN0IHJvb3QgPSAodHJ1c3RlZFJvb3RzIGFzIHN0cmluZ1tdKVswXSBhcyBzdHJpbmc7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtyb290fS4gY3dkOiAke3Byb2Nlc3MuY3dkKCl9YCk7XG5cbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaWxlQ29udGVudChyb290KTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjYU5hbWV9IHVuZGVyICR7dXJsfWApO1xuICAgIHRoaXMuY2EgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY2E7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ2xpZW50KCk6IFByb21pc2U8eyBuZXdDZXJ0aWZpY2F0ZVNlcnZpY2U6IGFueSB9PiB7XG4gICAgaWYgKHRoaXMuY2xpZW50KSByZXR1cm4gdGhpcy5jbGllbnQ7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgdGhpcy5jbGllbnQgPSAoY2EgYXMgYW55KVtcIl9GYWJyaWNDQVNlcnZpY2VzXCJdO1xuICAgIHJldHVybiB0aGlzLmNsaWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBDZXJ0aWZpY2F0ZSgpIHtcbiAgICBpZiAoIXRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlKVxuICAgICAgdGhpcy5jZXJ0aWZpY2F0ZVNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DbGllbnQoKSkubmV3Q2VydGlmaWNhdGVTZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIEFmZmlsaWF0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlKVxuICAgICAgdGhpcy5hZmZpbGlhdGlvblNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DQSgpKS5uZXdBZmZpbGlhdGlvblNlcnZpY2UoKTtcbiAgICByZXR1cm4gdGhpcy5hZmZpbGlhdGlvblNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgSWRlbnRpdGllcygpIHtcbiAgICBpZiAoIXRoaXMuaWRlbnRpdHlTZXJ2aWNlKVxuICAgICAgdGhpcy5pZGVudGl0eVNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DQSgpKS5uZXdJZGVudGl0eVNlcnZpY2UoKTtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eVNlcnZpY2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIENBIGNlcnRpZmljYXRlIHNlcnZpY2UgdG8gbGlzdCBjZXJ0aWZpY2F0ZXMsIG9wdGlvbmFsbHkgbWFwcGluZyB0byBQRU0gc3RyaW5ncyBvbmx5LlxuICAgKiBAcGFyYW0ge0dldENlcnRpZmljYXRlc1JlcXVlc3R9IFtyZXF1ZXN0XSAtIE9wdGlvbmFsIGZpbHRlciByZXF1ZXN0IGZvciBjZXJ0aWZpY2F0ZSBsb29rdXAuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RvTWFwPXRydWVdIC0gV2hlbiB0cnVlLCByZXR1cm5zIGFycmF5IG9mIFBFTSBzdHJpbmdzOyBvdGhlcndpc2UgcmV0dXJucyBmdWxsIHJlc3BvbnNlIG9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmdbXSB8IENlcnRpZmljYXRlUmVzcG9uc2U+fSBBcnJheSBvZiBQRU0gc3RyaW5ncyBvciB0aGUgZnVsbCBjZXJ0aWZpY2F0ZSByZXNwb25zZS5cbiAgICovXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyhcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICBkb01hcCA9IHRydWVcbiAgKTogUHJvbWlzZTxzdHJpbmdbXSB8IENlcnRpZmljYXRlUmVzcG9uc2U+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZVNlcnZpY2UgPSBhd2FpdCB0aGlzLkNlcnRpZmljYXRlKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENlcnRpZmljYXRlcyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgY2VydGlmaWNhdGVzJHtyZXF1ZXN0ID8gYCBmb3IgJHtyZXF1ZXN0LmlkfWAgOiBcIlwifSBmb3IgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZTogQ2VydGlmaWNhdGVSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IGNlcnRpZmljYXRlU2VydmljZS5nZXRDZXJ0aWZpY2F0ZXMocmVxdWVzdCB8fCB7fSwgdXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdCBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBRdWVyaWVzIHRoZSBDQSBpZGVudGl0eSBzZXJ2aWNlIHRvIGZldGNoIGFsbCBpZGVudGl0aWVzIGFuZCByZXR1cm5zIHRoZSBsaXN0IGFzIEZhYnJpY0lkZW50aXR5IG9iamVjdHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHlbXT59IFRoZSBsaXN0IG9mIGlkZW50aXRpZXMgcmVnaXN0ZXJlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyBnZXRJZGVudGl0aWVzKCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGlkZW50aXRpZXNTZXJ2aWNlID0gYXdhaXQgdGhpcy5JZGVudGl0aWVzKCk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIElkZW50aXRpZXMgdW5kZXIgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IGlkZW50aXRpZXNTZXJ2aWNlLmdldEFsbChhd2FpdCB0aGlzLlVzZXIoKSlcbiAgICApLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5pZGVudGl0aWVzLmxlbmd0aH0gSWRlbnRpdGllczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmlkZW50aXRpZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGFmZmlsaWF0aW9ucyBmcm9tIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgZm9yIHRoZSBsaXN0IG9mIGFmZmlsaWF0aW9ucyBhdmFpbGFibGUgdW5kZXIgdGhlIGNvbmZpZ3VyZWQgQ0EuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFmZmlsaWF0aW9ucyByZXN1bHQgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIGdldEFmZmlsaWF0aW9ucygpIHtcbiAgICBjb25zdCBhZmZpbGlhdGlvblNlcnZpY2UgPSBhd2FpdCB0aGlzLkFmZmlsaWF0aW9ucygpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldEFmZmlsaWF0aW9ucyk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY2FDb25maWcuY2FOYW1lfWApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGFmZmlsaWF0aW9uU2VydmljZS5nZXRBbGwoYXdhaXQgdGhpcy5Vc2VyKCkpKVxuICAgICAgLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5hLmxlbmd0aH0gQWZmaWxpYXRpb25zOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1gXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKGVucm9sbG1lbnRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhLm5ld0lkZW50aXR5U2VydmljZSgpLmdldE9uZShlbnJvbGxtZW50SWQsIHVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCByZWdpc3RyYXRpb246IHN0cmluZztcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZWdpc3Rlcik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGVucm9sbG1lbnRJRDogdXNlck5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiBwYXNzd29yZCxcbiAgICAgICAgYWZmaWxpYXRpb246IGFmZmlsaWF0aW9uLFxuICAgICAgICB1c2VyUm9sZTogdXNlclJvbGUsXG4gICAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgICAgbWF4RW5yb2xsbWVudHM6IG1heEVucm9sbG1lbnRzLFxuICAgICAgfSBhcyBJUmVnaXN0ZXJSZXF1ZXN0O1xuICAgICAgcmVnaXN0cmF0aW9uID0gYXdhaXQgY2EucmVnaXN0ZXIocHJvcHMsIHVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZ1xuICApOiBJZGVudGl0eSB7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljRW5yb2xsbWVudFNlcnZpY2UsIHt9KS5mb3IoXG4gICAgICB0aGlzLmlkZW50aXR5RnJvbUVucm9sbG1lbnRcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBHZW5lcmF0aW5nIElkZW50aXR5IGZyb20gY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX0gaW4gbXNwICR7bXNwSWR9YFxuICAgICk7XG4gICAgY29uc3QgY2xpZW50SWQgPSBDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgaWQgPSBDcnlwdG9VdGlscy5lbmNvZGUoY2xpZW50SWQpO1xuICAgIGxvZy5kZWJ1ZyhgSWRlbnRpdHkgJHtjbGllbnRJZH0gYW5kIGVuY29kZWRJZCAke2lkfWApO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eSh7XG4gICAgICBpZDogaWQsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleToga2V5LnRvQnl0ZXMoKSxcbiAgICAgICAgcm9vdENlcnRpZmljYXRlOiByb290Q2VydGlmaWNhdGUsXG4gICAgICAgIGNyZWF0ZWRPbjogbm93LFxuICAgICAgICB1cGRhdGVkT246IG5vdyxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgICBjcmVhdGVkT246IG5vdyxcbiAgICAgIHVwZGF0ZWRPbjogbm93LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbnJvbGwgYW4gaWRlbnRpdHkgd2l0aCB0aGUgQ0EgdXNpbmcgYSByZWdpc3RyYXRpb24gc2VjcmV0LlxuICAgKiBAc3VtbWFyeSBFeGNoYW5nZXMgdGhlIGVucm9sbG1lbnQgSUQgYW5kIHNlY3JldCBmb3IgY2VydGlmaWNhdGVzLCByZXR1cm5pbmcgYSBjb25zdHJ1Y3RlZCBJZGVudGl0eSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gZW5yb2xsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uIC0gRW5yb2xsbWVudCBzZWNyZXQgcmV0dXJuZWQgYXQgcmVnaXN0cmF0aW9uIHRpbWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkgb2JqZWN0IHdpdGggY3JlZGVudGlhbHMuXG4gICAqL1xuICBhc3luYyBlbnJvbGwoZW5yb2xsbWVudElkOiBzdHJpbmcsIHJlZ2lzdHJhdGlvbjogc3RyaW5nKSB7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5lbnJvbGwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICAgIGxvZy5kZWJ1ZyhgRW5yb2xsaW5nICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgY29uc3QgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlID0gYXdhaXQgY2EuZW5yb2xsKHtcbiAgICAgICAgZW5yb2xsbWVudElEOiBlbnJvbGxtZW50SWQsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHJlZ2lzdHJhdGlvbixcbiAgICAgIH0pO1xuICAgICAgaWRlbnRpdHkgPSBGYWJyaWNFbnJvbGxtZW50U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNhQ29uZmlnLmNhTmFtZVxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY2FDb25maWcuY2FOYW1lfSBhcyAke2lkZW50aXR5LmlkfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYW5kIGVucm9sbCBhIG5ldyBpZGVudGl0eSBpbiBvbmUgc3RlcC5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgbmV3IGVucm9sbG1lbnQgSUQgd2l0aCB0aGUgQ0EgYW5kIGltbWVkaWF0ZWx5IGV4Y2hhbmdlcyB0aGUgc2VjcmV0IHRvIGVucm9sbCwgcmV0dXJuaW5nIHRoZSBjcmVhdGVkIElkZW50aXR5LlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBtb2RlbCAtIENyZWRlbnRpYWxzIGZvciB0aGUgbmV3IGlkZW50aXR5IGNvbnRhaW5pbmcgdXNlck5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N1cGVyVXNlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJlZ2lzdGVyIHRoZSBpZGVudGl0eSBhcyBhIHN1cGVyIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWZmaWxpYXRpb249XCJcIl0gLSBBZmZpbGlhdGlvbiBzdHJpbmcgKGUuZy4sIG9yZzEuZGVwYXJ0bWVudDEpLlxuICAgKiBAcGFyYW0ge0NBX1JPTEUgfCBzdHJpbmd9IFt1c2VyUm9sZV0gLSBSb2xlIHRvIGFzc2lnbiB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7SUtleVZhbHVlQXR0cmlidXRlfSBbYXR0cnNdIC0gT3B0aW9uYWwgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW21heEVucm9sbG1lbnRzXSAtIE1heGltdW0gbnVtYmVyIG9mIGVucm9sbG1lbnRzIGFsbG93ZWQgZm9yIHRoZSBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyQW5kRW5yb2xsKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlclxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgdGhpcy5yZWdpc3RlcihcbiAgICAgIG1vZGVsLFxuICAgICAgaXNTdXBlclVzZXIsXG4gICAgICBhZmZpbGlhdGlvbixcbiAgICAgIHVzZXJSb2xlLFxuICAgICAgYXR0cnMsXG4gICAgICBtYXhFbnJvbGxtZW50c1xuICAgICk7XG4gICAgY29uc3QgeyB1c2VyTmFtZSB9ID0gbW9kZWw7XG4gICAgcmV0dXJuIHRoaXMuZW5yb2xsKHVzZXJOYW1lIGFzIHN0cmluZywgcmVnaXN0cmF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2VzIHRoZSBlbnJvbGxtZW50IG9mIGFuIGlkZW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCBlbnJvbGxtZW50IElELlxuICAgKlxuICAgKiBAcGFyYW0gZW5yb2xsbWVudElkIC0gVGhlIGVucm9sbG1lbnQgSUQgb2YgdGhlIGlkZW50aXR5IHRvIGJlIHJldm9rZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXN1bHQgb2YgdGhlIHJldm9jYXRpb24gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAdGhyb3dzIHtOb3RGb3VuZEVycm9yfSBJZiB0aGUgZW5yb2xsbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZG9lcyBub3QgZXhpc3QuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0aGUgcmV2b2NhdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgYXN5bmMgcmV2b2tlKGVucm9sbG1lbnRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgY2EucmV2b2tlKFxuICAgICAgICB7IGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsIHJlYXNvbjogXCJVc2VyIERlbGV0YXRpb25cIiB9LFxuICAgICAgICB1c2VyXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQuc3VjY2VzcylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke3Jlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKX1gXG4gICAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IElSZWdpc3RlclJlcXVlc3QsIElLZXlWYWx1ZUF0dHJpYnV0ZSB9IGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBtaW4sXG4gIG1pbmxlbmd0aCxcbiAgTW9kZWwsXG4gIHJlcXVpcmVkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIGV4dGVuZHMgTW9kZWwge1xuICBAcmVxdWlyZWQoKVxuICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIjtcbiAgQG1pbmxlbmd0aCgxKVxuICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdO1xuICBAcmVxdWlyZWQoKVxuICBlbnJvbGxtZW50SUQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpXG4gIGVucm9sbG1lbnRTZWNyZXQhOiBzdHJpbmc7XG4gIEBtaW4oMClcbiAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXI7XG4gIEByZXF1aXJlZCgpXG4gIHJvbGUhOiBzdHJpbmc7XG5cbiAgYnVpbGQoKTogSVJlZ2lzdGVyUmVxdWVzdCB7XG4gICAgY29uc3QgZXJycyA9IHRoaXMuaGFzRXJyb3JzKCk7XG4gICAgaWYgKGVycnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJycy50b1N0cmluZygpKTtcbiAgICBjb25zdCByZXNwb25zZTogSVJlZ2lzdGVyUmVxdWVzdCA9IHtcbiAgICAgIGVucm9sbG1lbnRJRDogdGhpcy5lbnJvbGxtZW50SUQsXG4gICAgICBlbnJvbGxtZW50U2VjcmV0OiB0aGlzLmVucm9sbG1lbnRTZWNyZXQsXG4gICAgICByb2xlOiB0aGlzLnJvbGUsXG4gICAgICBhZmZpbGlhdGlvbjogdGhpcy5hZmZpbGlhdGlvbixcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgdGhpcy5tYXhFbnJvbGxtZW50cyAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHJlc3BvbnNlLm1heEVucm9sbG1lbnRzID0gdGhpcy5tYXhFbnJvbGxtZW50cztcbiAgICBpZiAodGhpcy5hdHRycykgcmVzcG9uc2UuYXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIHNldEFmZmlsaWF0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFmZmlsaWF0aW9uID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRBdHRyKGF0dHI6IElLZXlWYWx1ZUF0dHJpYnV0ZSkge1xuICAgIHRoaXMuYXR0cnMgPSB0aGlzLmF0dHJzIHx8IFtdO1xuICAgIHRoaXMuYXR0cnMucHVzaChhdHRyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEF0dHJzKHZhbHVlOiBJS2V5VmFsdWVBdHRyaWJ1dGVbXSkge1xuICAgIHRoaXMuYXR0cnMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEVucm9sbG1lbnRJRCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbnJvbGxtZW50SUQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEVucm9sbG1lbnRTZWNyZXQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW5yb2xsbWVudFNlY3JldCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TWF4RW5yb2xsbWVudHModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMubWF4RW5yb2xsbWVudHMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFJvbGUodmFsdWU6IENBX1JPTEUgfCBzdHJpbmcpIHtcbiAgICB0aGlzLnJvbGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXZlbnRzIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBldmVudHMgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqIFRoZSBldmVudHMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgRUlQLTIwIHN0YW5kYXJkLlxuICovXG5leHBvcnQgZW51bSBFUkMyMEV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBgdHJhbnNmZXJgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdHJhbnNmZXJyZWQuXG4gICAqL1xuICBUUkFOU0ZFUiA9IFwiVHJhbnNmZXJcIixcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGBhcHByb3ZlYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvdmVkIHNwZW5kZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIGFwcHJvdmVkIGZvciB0aGUgc3BlbmRlci5cbiAgICovXG4gIEFQUFJPVkFMID0gXCJBcHByb3ZhbFwiLFxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBjbGFzcyBGYWJyaWNCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIG9mIGNyZWF0aW9uXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGVcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB2ZXJzaW9uKClcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEJ5LCB1cGRhdGVkQnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRmFicmljQmFzZU1vZGVsIH0gZnJvbSBcIi4vRmFicmljQmFzZU1vZGVsXCI7XG5cbkB1c2VzKEZhYnJpY0ZsYXZvdXIpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCBleHRlbmRzIEZhYnJpY0Jhc2VNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgY3JlYXRvclwiKVxuICBAY29sdW1uKClcbiAgQGNyZWF0ZWRCeSgpXG4gIGNyZWF0ZWRCeSE6IHN0cmluZztcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHVzZXIgdGhhdCBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsXCIpXG4gIEBjb2x1bW4oKVxuICBAdXBkYXRlZEJ5KClcbiAgdXBkYXRlZEJ5ITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERCS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyLCBNaXJyb3JNZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5cbk1vZGVsLnByb3RvdHlwZS5pc1NoYXJlZCA9IGZ1bmN0aW9uIGlzU2hhcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gTW9kZWwuaXNTaGFyZWQodGhpcy5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG59O1xuXG5Nb2RlbC5wcm90b3R5cGUuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gTW9kZWwuaXNQcml2YXRlKHRoaXMuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xufTtcblxuTW9kZWwucHJvdG90eXBlLnNlZ3JlZ2F0ZSA9IGZ1bmN0aW9uIHNlZ3JlZ2F0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBTZWdyZWdhdGVkTW9kZWw8TT4ge1xuICByZXR1cm4gTW9kZWwuc2VncmVnYXRlKHRoaXMpO1xufTtcblxuKE1vZGVsIGFzIGFueSkuc2VncmVnYXRlID0gZnVuY3Rpb24gc2VncmVnYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNXG4pOiBTZWdyZWdhdGVkTW9kZWw8TT4ge1xuICBpZiAoIU1vZGVsLmlzVHJhbnNpZW50KG1vZGVsKSkgcmV0dXJuIHsgbW9kZWw6IG1vZGVsIH07XG4gIGNvbnN0IGRlY29yYXRlZFByb3BlcnRpZXMgPVxuICAgIE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSB8fCBbXTtcblxuICBjb25zdCB0cmFuc2llbnRQcm9wcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgREJLZXlzLlRSQU5TSUVOVFxuICApO1xuICBjb25zdCBwcml2YXRlUHJvcGVydGllcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgRmFicmljTW9kZWxLZXlzLlBSSVZBVEVcbiAgKTtcbiAgY29uc3Qgc2hhcmVkUHJvcGVydGllcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgRmFicmljTW9kZWxLZXlzLlNIQVJFRFxuICApO1xuXG4gIGNvbnN0IHJlc3VsdDogU2VncmVnYXRlZE1vZGVsPE0+ID0ge1xuICAgIG1vZGVsOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBwdWJsaWM6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHRyYW5zaWVudDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgcHJpdmF0ZXM6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHNoYXJlZDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gIH07XG5cbiAgY29uc3QgdHJhbnNpZW50S2V5cyA9IE9iamVjdC5rZXlzKHRyYW5zaWVudFByb3BzIHx8IHt9KTtcbiAgY29uc3QgcHJpdmF0ZUtleXMgPSBPYmplY3Qua2V5cyhwcml2YXRlUHJvcGVydGllcyB8fCB7fSk7XG4gIGNvbnN0IHNoYXJlZEtleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRQcm9wZXJ0aWVzIHx8IHt9KTtcblxuICAvLyBjb25zdCBwa0tleSA9IE1vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlY29yYXRlZFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1vZGVsW2tleSBhcyBrZXlvZiBNXTtcbiAgICBjb25zdCBpc1RyYW5zaWVudCA9IHRyYW5zaWVudEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBpc1B1YmxpYyA9ICFpc1RyYW5zaWVudDtcbiAgICBjb25zdCBpc1ByaXZhdGUgPSBwcml2YXRlS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIGNvbnN0IGlzU2hhcmVkID0gc2hhcmVkS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIC8vIGNvbnN0IGlzUHJpbWFyeUtleSA9IGtleSA9PT0gcGtLZXk7XG5cbiAgICBpZiAoaXNUcmFuc2llbnQgfHwgaXNQcml2YXRlIHx8IGlzU2hhcmVkKSB7XG4gICAgICByZXN1bHQudHJhbnNpZW50ID0gcmVzdWx0LnRyYW5zaWVudCB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQudHJhbnNpZW50IGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICByZXN1bHQucHJpdmF0ZXMgPSByZXN1bHQucHJpdmF0ZXMgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnByaXZhdGVzIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNTaGFyZWQpIHtcbiAgICAgIHJlc3VsdC5zaGFyZWQgPSByZXN1bHQuc2hhcmVkIHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC5zaGFyZWQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgcmVzdWx0LnB1YmxpYyA9IChyZXN1bHQucHVibGljIHx8IHt9KSBhcyBhbnk7XG4gICAgICAocmVzdWx0LnB1YmxpYyBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXN1bHQubW9kZWwgPSBNb2RlbC5idWlsZChyZXN1bHQucHVibGljLCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgcmV0dXJuIHJlc3VsdCBhcyBTZWdyZWdhdGVkTW9kZWw8TT47XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5pc1ByaXZhdGUgPSBmdW5jdGlvbiBpc1ByaXZhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIU1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgRmFicmljTW9kZWxLZXlzLlBSSVZBVEVcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmlzU2hhcmVkID0gZnVuY3Rpb24gaXNTaGFyZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIU1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgRmFicmljTW9kZWxLZXlzLlNIQVJFRFxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkubWlycm9yZWQgPSBmdW5jdGlvbiBtaXJyb3JlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5vd25lck9mID0gZnVuY3Rpb24gb3duZXJPZjxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSlcbiAgKTtcbiAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbW9kZWxbbWV0YSBhcyBrZXlvZiBNXSBhcyBzdHJpbmc7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5taXJyb3JlZEF0ID0gZnVuY3Rpb24gbWlycm9yZWRBdDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBNaXJyb3JNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIG1vZGVsID0gdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsO1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsIGFzIGFueSxcbiAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmNvbGxlY3Rpb25zRm9yID0gZnVuY3Rpb24gY29sbGVjdGlvbnNGb3I8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKToge1xuICBwcml2YXRlQ29sczogKHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcilbXTtcbiAgc2hhcmVkQ29sczogKHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcilbXTtcbn0ge1xuICBjb25zdCBwcml2YXRlS2V5czogc3RyaW5nW10gPSBbRmFicmljTW9kZWxLZXlzLlBSSVZBVEVdIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaGFyZWRLZXlzOiBzdHJpbmdbXSA9IFtGYWJyaWNNb2RlbEtleXMuU0hBUkVEXSBhcyBzdHJpbmdbXTtcblxuICBjb25zdCBwcml2YXRlS2V5ID0gTWV0YWRhdGEua2V5KC4uLnByaXZhdGVLZXlzKTtcbiAgY29uc3Qgc2hhcmVkS2V5ID0gTWV0YWRhdGEua2V5KC4uLnNoYXJlZEtleXMpO1xuXG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcblxuICBjb25zdCBwcml2YXRlTWV0YTogeyBjb2xsZWN0aW9uczogc3RyaW5nW10gfSA9IE1ldGFkYXRhLmdldChcbiAgICBjb25zdHIgYXMgYW55LFxuICAgIHByaXZhdGVLZXlcbiAgKTtcbiAgY29uc3Qgc2hhcmVkTWV0YTogeyBjb2xsZWN0aW9uczogc3RyaW5nW10gfSA9IE1ldGFkYXRhLmdldChcbiAgICBjb25zdHIgYXMgYW55LFxuICAgIHNoYXJlZEtleVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgcHJpdmF0ZUNvbHM6IHByaXZhdGVNZXRhPy5jb2xsZWN0aW9ucyB8fCBbXSxcbiAgICBzaGFyZWRDb2xzOiBzaGFyZWRNZXRhPy5jb2xsZWN0aW9ucyB8fCBbXSxcbiAgfTtcbn0uYmluZChNb2RlbCk7XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIFJlcG8sXG4gIENvbnRleHQsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIENvbnRleHRPZixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIHRoZSBNU1AgSUQgZnJvbSBlaXRoZXIgYSBzdHJpbmcgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcGFyYW0gaWRlbnRpdHkgLSBUaGUgaWRlbnRpdHkgdmFsdWUgd2hpY2ggY2FuIGJlIGEgc3RyaW5nIE1TUCBJRCBvciBDbGllbnRJZGVudGl0eSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBNU1AgSUQgYXMgYSBzdHJpbmcsIG9yIHVuZGVmaW5lZCBpZiBub3QgYXZhaWxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TXNwSWQoXG4gIGlkZW50aXR5OiBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBpZGVudGl0eSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gaWRlbnRpdHkuZ2V0TVNQSUQoKTtcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIG1hcmtpbmcgbWV0aG9kcyB0aGF0IHJlcXVpcmUgb3duZXJzaGlwIGF1dGhvcml6YXRpb24uXG4gKiBDaGVja3MgdGhlIG93bmVyIG9mIHRoZSB0b2tlbiBiZWZvcmUgYWxsb3dpbmcgdGhlIG1ldGhvZCB0byBiZSBleGVjdXRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVG9rZW5Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHtcbiAqICAgQE93bmVyKClcbiAqICAgYXN5bmMgTWludChjdHg6IENvbnRleHQsIGFtb3VudDogbnVtYmVyKSB7XG4gKiAgICAgLy8gTWludCB0b2tlbiBsb2dpY1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBjaGVja3Mgb3duZXJzaGlwIGF1dGhvcml6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPd25lcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgdGhpczogRmFicmljRVJDMjBDb250cmFjdCxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKSB7XG4gICAgICBjb25zdCBjdHg6IEhMQ29udGV4dCA9IGFyZ3NbMF07XG4gICAgICBjb25zdCBhY291bnRJZCA9IGN0eC5jbGllbnRJZGVudGl0eS5nZXRJRCgpO1xuXG4gICAgICBjb25zdCBzZWxlY3QgPSBhd2FpdCAodGhpcyBhcyBGYWJyaWNFUkMyMENvbnRyYWN0KVtcbiAgICAgICAgXCJ0b2tlblJlcG9zaXRvcnlcIlxuICAgICAgXS5zZWxlY3QoKTtcblxuICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgc2VsZWN0LmV4ZWN1dGUoY3R4KTtcblxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcIk5vIHRva2VucyBhdmFpYWxibGVcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVG8gbWFueSB0b2tlbiBhdmFpbGFibGUgOiAke3Rva2Vucy5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbnNbMF0ub3duZXIgIT0gYWNvdW50SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgICAgICBgVXNlciBub3QgYXV0aG9yaXplZCB0byBydW4gJHtwcm9wZXJ0eUtleX0gb24gdGhlIHRva2VuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcblxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3duZWRCeU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGNvbnN0IG93bmVyID0gY3JlYXRvci5tc3BpZDtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgZ2VuZXJhdGVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKG93bmVkQnlPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZE9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcbiAgbW9kZWxba2V5XSA9IHN0dWIuZ2V0VHhJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgb25VcGRhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsXG4gICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSURcbiAgICAgICAgICApLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIE1pcnJvckNvbmRpdGlvbiA9IChtc3A6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTWlycm9yTWV0YWRhdGEgPSB7XG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvbjtcbiAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZztcbiAgbXNwSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsTWlycm9yTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJlc29sdmVyOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIGN0eDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPlxuKSB7XG4gIGxldCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgPSByZXNvbHZlcjtcbiAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgY3R4LmdldChcInN0dWJcIikuZ2V0Q3JlYXRvcigpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGNvbGxlY3Rpb24gPSBhd2FpdCByZXNvbHZlcihtb2RlbCwgb3duZXIsIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gbWlycm9yIG5hbWU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbGxlY3Rpb24gfHwgdHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gY29sbGVjdGlvbiBmb3VuZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIC8vIFB1dCBtaXJyb3IgZmxhZ3MgZGlyZWN0bHkgb24gY29udGV4dCBzbyBhZGFwdGVyLnByZXBhcmUoKSBhbmQgYWRhcHRlci5jcmVhdGUoKSBjYW4gc2VlIHRoZW1cbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBjb25zdCBtaXJyb3IgPSBhd2FpdCByZXBvLmNyZWF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkIHdpdGggJHtNb2RlbC5wayhtb2RlbCkgYXMgc3RyaW5nfTogJHttaXJyb3JbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCBtaXJyb3IgZmxhZ3MgZnJvbSBjb250ZXh0XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgICAgYXBwbHlVcGRhdGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VGb3JVcGRhdGU6IGZhbHNlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBhd2FpdCByZXBvLnVwZGF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB1cGRhdGVkOiAkeyhtb2RlbCBhcyBhbnkpW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3AgPSBNb2RlbC5wayhtb2RlbCkgYXMga2V5b2YgTTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrUHJvcF07XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgc2VncmVnYXRlZDogY29sbGVjdGlvbixcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkIGFzIGFueSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNYXkgYWxyZWFkeSBiZSBkZWxldGVkIGJ5IGFkYXB0ZXIuZGVsZXRlU2VncmVnYXRlZENvbGxlY3Rpb25zXG4gICAgfVxuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gZGVsZXRlZDogJHtTdHJpbmcoaWQpfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pcnJvcldyaXRlR3VhcmQ8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGlmIChtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG5cbiAgaWYgKCFtc3ApIHJldHVybjtcblxuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IG1hdGNoZXMgPSBtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgcmVhZDogTVNQICR7bXNwfSBtYXRjaGVzLCByb3V0aW5nIHJlYWRzIHRvIG1pcnJvciBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn1gXG4gICAgKTtcbiAgICAvLyBSb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3IgY29sbGVjdGlvblxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgICBmYWJyaWNDdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICAgIGZhYnJpY0N0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbiAgfVxuICAvLyBXaGVuIE1TUCBkb2VzIE5PVCBtYXRjaCwgbm9ybWFsIHJlYWQgZmxvdyDigJQgYWxsIGRhdGEgaXMgaW4gcHVibGljIHN0YXRlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3IoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgbXNwSWRPckNvbmRpdGlvbj86IHN0cmluZyB8IE1pcnJvckNvbmRpdGlvbixcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4pIHtcbiAgY29uc3QgaXNDb25kaXRpb25Pbmx5ID1cbiAgICB0eXBlb2YgbXNwSWRPckNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1zcElkT3JDb25kaXRpb24pO1xuICBjb25zdCBtc3BJZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAobXNwSWRPckNvbmRpdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBjb25zdCBjb25kID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyAobXNwSWRPckNvbmRpdGlvbiBhcyBNaXJyb3JDb25kaXRpb24pXG4gICAgOiBjb25kaXRpb247XG5cbiAgZnVuY3Rpb24gbWlycm9yKFxuICAgIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogTWlycm9yTWV0YWRhdGEgPSB7XG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUiksXG4gICAgICAgIG1ldGFcbiAgICAgICksXG4gICAgICAvLyBSZWFkIGhhbmRsZXIgcnVucyBlYXJseSAocHJpb3JpdHkgMzApIHRvIHNldCB1cCBjb250ZXh0IGJlZm9yZSBhbnkgcmVhZHNcbiAgICAgIG9uUmVhZChyZWFkTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDMwIH0pLFxuICAgICAgLy8gV3JpdGUgZ3VhcmRzIOKAlCByZWplY3QgbWF0Y2hpbmcgTVNQcyBiZWZvcmUgYW55IHByb2Nlc3NpbmdcbiAgICAgIG9uQ3JlYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uVXBkYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uRGVsZXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIC8vIE1pcnJvciBzeW5jIGhhbmRsZXJzIOKAlCB3cml0ZSBmdWxsIG1vZGVsIGFmdGVyIG90aGVyIGhhbmRsZXJzIChwcmlvcml0eSAxMDApXG4gICAgICBvbkNyZWF0ZShjcmVhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25VcGRhdGUodXBkYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uRGVsZXRlKGRlbGV0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1pcnJvcixcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uLCBtc3BJZCwgY29uZF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcD86IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTW9kZWxDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGAke3RvUGFzY2FsQ2FzZShjb25zdHIubmFtZSl9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5hbWVzcGFjZUNvbGxlY3Rpb24obmFtZXNwYWNlOiBzdHJpbmcpOiBDb2xsZWN0aW9uUmVzb2x2ZXIge1xuICByZXR1cm4gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPiwgbXNwSWQ/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvcmdOYW1lID1cbiAgICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gICAgaWYgKCFvcmdOYW1lKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICAgKTtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYF9fJHt0b1Bhc2NhbENhc2Uob3JnTmFtZSl9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW9yaXR5IGZvciBlYXJseSBjb2xsZWN0aW9uIGV4dHJhY3Rpb24gKGJlZm9yZSBwayBnZW5lcmF0aW9uIGF0IHByaW9yaXR5IDYwKVxuICogQHN1bW1hcnkgVGhpcyBwcmlvcml0eSBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgYmVmb3JlIGFueSBzZXF1ZW5jZVxuICogb3BlcmF0aW9ucyBvY2N1ciwgYWxsb3dpbmcgc2VxdWVuY2VzIHRvIGJlIHJlcGxpY2F0ZWQgdG8gcHJpdmF0ZS9zaGFyZWQgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSA9IDM1O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZWdyZWdhdGlvbkZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBNLFxuICBjb2xsZWN0aW9uczogc3RyaW5nW10sXG4gIGN0eDogYW55XG4pIHtcbiAgLy8gUmVnaXN0ZXIgY29sbGVjdGlvbnMgZWFybHkgdXNpbmcgcmVhZEZyb20gLSB0aGlzIGFsbG93cyBzZXF1ZW5jZSBjb2RlXG4gIC8vIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvIGR1cmluZyBwayBnZW5lcmF0aW9uXG4gIGlmIChjb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgKGN0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb25zKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vZGVsIGlzIGZ1bGx5IHNlZ3JlZ2F0ZWQgKGFsbCBub24tcGsgcHJvcGVydGllcyBhcmUgcHJpdmF0ZS9zaGFyZWQvdHJhbnNpZW50KS5cbiAgLy8gVXNlIE1vZGVsLnNlZ3JlZ2F0ZSgpIHdoaWNoIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIGRldGVybWluZSB3aGF0J3MgdHJhbnNpZW50LFxuICAvLyByYXRoZXIgdGhhbiByZWFkaW5nIERCS2V5cy5UUkFOU0lFTlQgbWV0YWRhdGEgd2hpY2ggbWF5IG5vdCBhY2N1bXVsYXRlIGNvcnJlY3RseVxuICAvLyB3aGVuIGNsYXNzLWxldmVsIEBwcml2YXRlRGF0YSBhcHBsaWVzIGRlY29yYXRvcnMgaXRlcmF0aXZlbHkuXG4gIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgIGlmICghaGFzUHVibGljUHJvcGVydGllcyhjbGF6ei5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikpIHtcbiAgICAgIGN0eC5tYXJrRnVsbHlTZWdyZWdhdGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU1pcnJvckZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4pIHtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgY29uc3QgbWF0Y2hlcyA9XG4gICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybjtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShcbiAgICBuZXcgY2xhenooKSxcbiAgICBtaXJyb3JNZXRhLnJlc29sdmVyLFxuICAgIGN0eFxuICApO1xuICAvLyBNaXJyb3IgTVNQIG1hdGNoZXMg4oCUIHJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvclxuICAvLyBjb2xsZWN0aW9uLiBDbGVhciBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbGxlY3Rpb25zIHNvIHF1ZXJpZXNcbiAgLy8gZ28gT05MWSB0byB0aGUgbWlycm9yLCBub3QgdG8gdGhlIHJlZ3VsYXIgcHJpdmF0ZS9zaGFyZWQgb25lcy5cbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBjdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1B1YmxpY1Byb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBib29sZWFuIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMoY2xhenopIHx8IFtdO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgY29uc3QgdHJhbnNpZW50TWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICBjb25zdCBwcml2YXRlTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKSkgfHwge307XG4gIGNvbnN0IHNoYXJlZE1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuU0hBUkVEKSkgfHwge307XG5cbiAgcmV0dXJuIGF0dHJpYnV0ZXMuc29tZSgoYXR0cikgPT4ge1xuICAgIGlmIChhdHRyID09PSBwaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHRyYW5zaWVudE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBwcml2YXRlTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHNoYXJlZE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVhcmx5IGhhbmRsZXIgdG8gZXh0cmFjdCBhbmQgcmVnaXN0ZXIgY29sbGVjdGlvbnMgaW4gY29udGV4dFxuICogQHN1bW1hcnkgUnVucyB3aXRoIHByaW9yaXR5IDwgNDAgdG8gZXh0cmFjdCBjb2xsZWN0aW9uIG5hbWVzIGJlZm9yZSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MCkuXG4gKiBUaGlzIGFsbG93cyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtDb250ZXh0T2Y8UmVwb3NpdG9yeTxNLCBhbnk+Pn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdfSBkYXRhIC0gVGhlIHNlZ3JlZ2F0ZWQgZGF0YSBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0ga2V5cyAtIFRoZSBwcm9wZXJ0eSBrZXkocykgYmVpbmcgc2VncmVnYXRlZFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApIHtcbiAgICAvLyBDYW4ndCBleHRyYWN0IGNvbGxlY3Rpb25zIHdpdGhvdXQgTVNQLCB3aWxsIGJlIGNhdWdodCBieSBsYXRlciBoYW5kbGVyc1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbGxlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG1ldGFkYXRhIG9mIGRhdGFBcnJheSkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IG1ldGFkYXRhLmNvbGxlY3Rpb25zO1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoY29sbGVjdGlvbiAmJiAhY29sbGVjdGlvbnMuaW5jbHVkZXMoY29sbGVjdGlvbikpIHtcbiAgICAgIGNvbGxlY3Rpb25zLnB1c2goY29sbGVjdGlvbik7XG4gICAgfVxuICB9XG4gIGFwcGx5U2VncmVnYXRpb25GbGFncyhtb2RlbCwgY29sbGVjdGlvbnMsIGNvbnRleHQpO1xuXG4gIC8vIFN0b3JlIHNlZ3JlZ2F0aW9uIG1ldGFkYXRhIG9uIHRoZSBhZGFwdGVyIChwZXJzaXN0cyBhY3Jvc3MgY29udGV4dCBjaGFpbnMpLlxuICAvLyBUaGUgU2VxdWVuY2UgY3JlYXRlcyBpdHMgb3duIGNvbnRleHQgdmlhIGxvZ0N0eCwgbG9zaW5nIGNvbnRleHQtc3RvcmVkIGZsYWdzLlxuICBjb25zdCBzZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBcInBrXCIpO1xuICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgc2VxTmFtZSxcbiAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgIGNvbGxlY3Rpb25zXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dE9mPHR5cGVvZiB0aGlzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czoga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBba2V5c10pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICAvLyBWYWxpZGF0ZSBhbGwga2V5cyByZXNvbHZlIHRvIHRoZSBzYW1lIGNvbGxlY3Rpb25cbiAga2V5QXJyYXkuZm9yRWFjaCgoX2ssIGkpID0+IHtcbiAgICBjb25zdCBjID1cbiAgICAgIHR5cGVvZiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnNcbiAgICAgICAgOiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGMgIT09IGNvbGxlY3Rpb24pXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICApO1xuICB9KTtcblxuICBjb25zdCBrZXlTdHJpbmdzID0ga2V5QXJyYXkubWFwKChrZXkpID0+IFN0cmluZyhrZXkpKTtcbiAgLy8gU3RvcmUgdGhlIHNlZ3JlZ2F0ZWQgbW9kZWwg4oCUIHByZXBhcmUoKSB3aWxsIGZpbHRlciB0byBjb2xsZWN0aW9uLXNwZWNpZmljIGZpZWxkc1xuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLndyaXRlVG8oY29sbGVjdGlvbiwga2V5U3RyaW5ncyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uUmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljRmxhZ3M+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9IE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGV4dHJhY3RNc3BJZChjb250ZXh0LmdldChcImlkZW50aXR5XCIpKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogYXdhaXQgY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dE9mPHR5cGVvZiB0aGlzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5OiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG9sZE1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleSkgPyBrZXkgOiBba2V5XSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIGtleUFycmF5LmZvckVhY2goKGssIGkpID0+IHtcbiAgICBjb25zdCBjID1cbiAgICAgIHR5cGVvZiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnNcbiAgICAgICAgOiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGMgIT09IGNvbGxlY3Rpb24pXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICApO1xuICB9KTtcblxuICBjb25zdCBrZXlTdHJpbmdzID0gKGtleUFycmF5IGFzIChrZXlvZiBNKVtdKS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgbW9kZWwg4oCUIHByZXBhcmUoKSB3aWxsIGZpbHRlciB0byBjb2xsZWN0aW9uLXNwZWNpZmljIGZpZWxkc1xuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLndyaXRlVG8oY29sbGVjdGlvbiwga2V5U3RyaW5ncyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIFYgZXh0ZW5kcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWIHwgVltdLFxuICBrZXk6IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXSkgYXMgVltdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleSkgPyBrZXkgOiBba2V5XSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIHNlZ3JlZ2F0ZWQoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgdHlwZTogRmFicmljTW9kZWxLZXlzLlBSSVZBVEUgfCBGYWJyaWNNb2RlbEtleXMuU0hBUkVELFxuICBmaWx0ZXI/OiAocHJvcE5hbWU6IHN0cmluZykgPT4gYm9vbGVhblxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbm5lclNlZ3JlZ2F0ZWQodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgZnVuY3Rpb24gc2VncmVnYXRlZERlYyh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICAgIGNvbnN0IGtleSA9IE1ldGFkYXRhLmtleSh0eXBlLCBwcm9wZXJ0eUtleSk7XG4gICAgICBjb25zdCBjb25zdHI6IENvbnN0cnVjdG9yID0gdGFyZ2V0LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yO1xuXG4gICAgICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5KSB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gbmV3IFNldChtZXRhLmNvbGxlY3Rpb25zIHx8IFtdKTtcbiAgICAgIGNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcbiAgICAgIG1ldGEuY29sbGVjdGlvbnMgPSBbLi4uY29sbGVjdGlvbnNdO1xuICAgICAgTWV0YWRhdGEuc2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5LCBtZXRhKTtcblxuICAgICAgY29uc3QgY29uc3RyTWV0YSA9IE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUpIHx8IHt9O1xuICAgICAgY29uc3QgY29uc3RyQ29sbGVjdGlvbnMgPSBuZXcgU2V0KGNvbnN0ck1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29uc3RyQ29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgY29uc3RyTWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb25zdHJDb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCB0eXBlLCBjb25zdHJNZXRhKTtcblxuICAgICAgY29uc3QgdHJhbnNpZW50TWV0YSA9XG4gICAgICAgIE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICAgICAgY29uc3QgdXBkYXRlZFRyYW5zaWVudE1ldGEgPSB7XG4gICAgICAgIC4uLnRyYW5zaWVudE1ldGEsXG4gICAgICAgIFtwcm9wZXJ0eUtleSBhcyBhbnldOiB7fSxcbiAgICAgIH07XG4gICAgICBNZXRhZGF0YS5zZXQoXG4gICAgICAgIGNvbnN0ciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgREJLZXlzLlRSQU5TSUVOVCxcbiAgICAgICAgdXBkYXRlZFRyYW5zaWVudE1ldGFcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjczogYW55W10gPSBbXTtcbiAgICBpZiAoIXByb3BlcnR5S2V5KSB7XG4gICAgICAvLyBkZWNvcmF0ZWQgYXQgdGhlIGNsYXNzIGxldmVsXG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyh0YXJnZXQgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgcHJvcGVydGllcz8uZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIocCkpIHtcbiAgICAgICAgICBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIHR5cGUpKCh0YXJnZXQgYXMgYW55KS5wcm90b3R5cGUsIHApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdyb3VwTmFtZSA9XG4gICAgICAgIHR5cGVvZiBjb2xsZWN0aW9uID09PSBcInN0cmluZ1wiID8gY29sbGVjdGlvbiA6IGNvbGxlY3Rpb24udG9TdHJpbmcoKTtcbiAgICAgIC8vIFVzZSBkaWZmZXJlbnQgZ3JvdXAgbmFtZXMgZm9yIGV4dHJhY3Rpb24gdnMgZGF0YSBoYW5kbGVycyB0byBwcmV2ZW50IG1lcmdpbmdcbiAgICAgIGNvbnN0IGV4dHJhY3RHcm91cE5hbWUgPSBgJHtncm91cE5hbWV9OmV4dHJhY3RgO1xuICAgICAgY29uc3QgZGF0YUdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZGF0YWA7XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25NZXRhID0geyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9O1xuICAgICAgY29uc3QgZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0ID0ge1xuICAgICAgICBwcmlvcml0eTogU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFksXG4gICAgICAgIGdyb3VwOiBleHRyYWN0R3JvdXBOYW1lLFxuICAgICAgfTtcbiAgICAgIGRlY3MucHVzaChcbiAgICAgICAgcHJvcCgpLFxuICAgICAgICB0cmFuc2llbnQoKSxcbiAgICAgICAgc2VncmVnYXRlZERlYyxcbiAgICAgICAgLy8gRWFybHkgZXh0cmFjdGlvbiBoYW5kbGVycyAtIHJ1biBCRUZPUkUgcGsgZ2VuZXJhdGlvbiAocHJpb3JpdHkgNjApXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBjb2xsZWN0aW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiBjb250ZXh0IGZvciBzZXF1ZW5jZSByZXBsaWNhdGlvblxuICAgICAgICAvLyBXZSByZWdpc3RlciBmb3IgZWFjaCBvcGVyYXRpb24gZXhwbGljaXRseSB0byBlbnN1cmUgcHJvcGVyIGhhbmRsZXIgbG9va3VwXG4gICAgICAgIG9uKFxuICAgICAgICAgIERCT3BlcmF0aW9ucy5BTEwsXG4gICAgICAgICAgZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyBhcyBhbnksXG4gICAgICAgICAgZWFybHlFeHRyYWN0aW9uTWV0YSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnRcbiAgICAgICAgKSxcbiAgICAgICAgLy8gTWFpbiBoYW5kbGVycyBmb3Igc2VncmVnYXRlZCBkYXRhIG9wZXJhdGlvbnMgKHByaW9yaXR5IDk1KVxuICAgICAgICBvbkNyZWF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlLFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uUmVhZChcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uUmVhZCBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25VcGRhdGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPblVwZGF0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25EZWxldGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPbkRlbGV0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5KC4uLmRlY3MpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZURhdGEoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlciA9IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb25cbikge1xuICBmdW5jdGlvbiBwcml2YXRlRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gc2VncmVnYXRlZChjb2xsZWN0aW9uLCBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHByaXZhdGVEYXRhLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb25dLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHNoYXJlZERhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVjdXJzaXZlbHkgc29ydHMgb2JqZWN0IGtleXMgd2l0aG91dCByZW9yZGVyaW5nIGFycmF5c1xuICogQHBhcmFtIHthbnl9IG9iaiAtIFRoZSB2YWx1ZSB0byBwcm9jZXNzXG4gKiBAcmV0dXJuIHthbnl9IEEgY29weSB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cyBidXQgcHJlc2VydmVkIGFycmF5IG9yZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqOiBhbnkpOiBhbnkge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubWFwKHNvcnRLZXlzT25seVJlY3Vyc2l2ZSk7XG4gIGlmIChvYmouY29uc3RydWN0b3IgIT09IE9iamVjdCkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcbiAgICAuc29ydCgpXG4gICAgLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXkpID0+IHtcbiAgICAgIGFjY1trZXldID0gc29ydEtleXNPbmx5UmVjdXJzaXZlKG9ialtrZXldKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmlzdGljIEpTT04gc2VyaWFsaXplciBmb3IgRmFicmljIG1vZGVsc1xuICogQHN1bW1hcnkgRW5zdXJlcyBzdGFibGUsIGRldGVybWluaXN0aWMgSlNPTiBvdXRwdXQgYnkgc29ydGluZyBvYmplY3Qga2V5cyByZWN1cnNpdmVseSBiZWZvcmUgc3RyaW5naWZpY2F0aW9uLCB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIEZhYnJpYyBlbmRvcnNlbWVudCBhbmQgaGFzaGluZy4gRXh0ZW5kcyBKU09OU2VyaWFsaXplciB0byBwbHVnIGludG8gZXhpc3RpbmcgRGVjYWYgbW9kZWwgc2VyaWFsaXphdGlvbiBmbG93LlxuICogQHRlbXBsYXRlIE0gLSBUaGUgRGVjYWYgTW9kZWwgc3VidHlwZSBzZXJpYWxpemVkIGJ5IHRoaXMgaW5zdGFuY2VcbiAqIEBwYXJhbSB7dm9pZH0gW2NvbnN0cnVjdG9yXSBObyBwdWJsaWMgY29uc3RydWN0b3IgYXJndW1lbnRzXG4gKiBAY2xhc3MgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IERldGVybWluaXN0aWNTZXJpYWxpemVyPE15TW9kZWw+KCk7XG4gKiBjb25zdCBqc29uID0gc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwpO1xuICogY29uc3QgcmVidWlsdCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoanNvbik7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBEUyBhcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogICBDYWxsZXItPj5EUzogc2VyaWFsaXplKG1vZGVsKVxuICogICBEUy0+PkRTOiBwcmVTZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHNvcnQta2V5cy1yZWN1cnNpdmVcbiAqICAgRFMtPj5EUzoganNvbi1zdHJpbmdpZnktZGV0ZXJtaW5pc3RpY1xuICogICBEUy0tPj5DYWxsZXI6IHN0cmluZ1xuICogICBDYWxsZXItPj5EUzogZGVzZXJpYWxpemUoc3RyaW5nKVxuICogICBEUy0tPj5DYWxsZXI6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNKSB7XG4gICAgLy8gVE9ETzogbmVzdGVkIHByZXNlcmlhbGl6YXRpb24gKHNvIGluY3JlYXNlIHBlcmZvcm1hbmNlIHdoZW4gZGVzZXJpYWxpemluZylcbiAgICAvLyBUT0RPOiBWZXJpZnkgd2h5IHRoZXJlIGlzIG5vIG1ldGFkYXRhXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgbGV0IG1ldGFkYXRhO1xuICAgIHRyeSB7XG4gICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIG1ldGFkYXRhID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBjb25zdCBwcmVTZXJpYWxpemUgPSBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gb2JqO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoKG8pID0+IHByZVNlcmlhbGl6ZS5jYWxsKHNlbGYsIG8pKTtcbiAgICAgIHJldHVybiB0aGlzLnByZVNlcmlhbGl6ZS5jYWxsKHRoaXMsIG9iaik7XG4gICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgTW9kZWwucmVsYXRpb25zKG1vZGVsKS5mb3JFYWNoKChyKSA9PiB7XG4gICAgICB0b1NlcmlhbGl6ZVtyXSA9IHByZVNlcmlhbGl6ZSh0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlYnVpbGRzIGEgbW9kZWwgZnJvbSBhIHNlcmlhbGl6YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbHMgdG8gcGFyc2UgdGhlIHN0cmluZywgb3IgdG8gYnVpbGQgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZyk6IE0ge1xuICAgIGNvbnN0IGRlc2VyaWFsaXphdGlvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBkZXNlcmlhbGl6YXRpb25bTW9kZWxLZXlzLkFOQ0hPUl07XG4gICAgaWYgKCFjbGFzc05hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBjbGFzcyByZWZlcmVuY2UgaW4gc2VyaWFsaXplZCBtb2RlbFwiKTtcbiAgICBjb25zdCBtb2RlbDogTSA9IE1vZGVsLmJ1aWxkKGRlc2VyaWFsaXphdGlvbiwgY2xhc3NOYW1lKSBhcyB1bmtub3duIGFzIE07XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXJpYWxpemUgYSBtb2RlbCBpbnRvIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgbW9kZWwgd2l0aCBwcmVTZXJpYWxpemUsIHNvcnRzIGtleXMgcmVjdXJzaXZlbHksIGFuZCBzdHJpbmdpZmllcyBkZXRlcm1pbmlzdGljYWxseSBmb3Igc3RhYmxlIG9yZGVyaW5nXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRGV0ZXJtaW5pc3RpYyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKFwianNvbi1zdHJpbmdpZnktZGV0ZXJtaW5pc3RpY1wiKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5KHNvcnRLZXlzT25seVJlY3Vyc2l2ZSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCkpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQnVsa0NydWRPcGVyYXRpb25LZXlzLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIEZhYnJpYyBldmVudCBuYW1lIGZyb20gY29tcG9uZW50c1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBldmVudCBuYW1lIGJ5IGpvaW5pbmcgdGFibGUsIGV2ZW50LCBhbmQgb3B0aW9uYWwgb3duZXIgd2l0aCB1bmRlcnNjb3Jlc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlL2NvbGxlY3Rpb24gbmFtZVxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nfSBldmVudCAtIFRoZSBldmVudCB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gW293bmVyXSAtIE9wdGlvbmFsIG93bmVyIGlkZW50aWZpZXJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBldmVudCBuYW1lIGluIGZvcm1hdCBcInRhYmxlX2V2ZW50XCIgb3IgXCJ0YWJsZV9ldmVudF9vd25lclwiXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRmFicmljRXZlbnROYW1lKFxuICB0YWJsZTogc3RyaW5nLFxuICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgb3duZXI/OiBzdHJpbmdcbikge1xuICBjb25zdCBwYXJhbXMgPSBbdGFibGUsIGV2ZW50XTtcbiAgaWYgKG93bmVyKSBwYXJhbXMucHVzaChvd25lcik7XG4gIHJldHVybiBwYXJhbXMuam9pbihcIl9cIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIEZhYnJpYyBldmVudCBuYW1lIGludG8gaXRzIGNvbXBvbmVudHNcbiAqIEBzdW1tYXJ5IFNwbGl0cyBhbiBldmVudCBuYW1lIGJ5IHVuZGVyc2NvcmVzIGFuZCBleHRyYWN0cyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZXZlbnQgbmFtZSB0byBwYXJzZVxuICogQHJldHVybiB7e3RhYmxlOiBzdHJpbmcsIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLCBvd25lcjogc3RyaW5nfX0gVGhlIHBhcnNlZCBjb21wb25lbnRzIGFzIGEgc3RydWN0dXJlZCBvYmplY3RcbiAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBldmVudCBuYW1lIGZvcm1hdCBpcyBpbnZhbGlkXG4gKiBAZnVuY3Rpb24gcGFyc2VFdmVudE5hbWVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IFBhcnNlciBhcyBwYXJzZUV2ZW50TmFtZVxuICogICBDYWxsZXItPj5QYXJzZXI6IHBhcnNlRXZlbnROYW1lKG5hbWUpXG4gKiAgIFBhcnNlci0+PlBhcnNlcjogc3BsaXQgbmFtZSBieSBcIl9cIlxuICogICBhbHQgcGFydHMgbGVuZ3RoIGludmFsaWRcbiAqICAgICBQYXJzZXItLT4+Q2FsbGVyOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gKiAgIGVsc2VcbiAqICAgICBQYXJzZXItLT4+Q2FsbGVyOiB7IHRhYmxlLCBldmVudCwgb3duZXI/IH1cbiAqICAgZW5kXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZShuYW1lOiBzdHJpbmcpOiB7XG4gIHRhYmxlPzogc3RyaW5nO1xuICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZztcbiAgb3duZXI/OiBzdHJpbmc7XG59IHtcbiAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KFwiX1wiKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHMubGVuZ3RoID4gMylcbiAgICByZXR1cm4geyB0YWJsZTogdW5kZWZpbmVkLCBldmVudDogbmFtZSwgb3duZXI6IHVuZGVmaW5lZCB9O1xuICByZXR1cm4ge1xuICAgIHRhYmxlOiBwYXJ0c1swXSxcbiAgICBldmVudDogcGFydHNbMV0sXG4gICAgb3duZXI6IHBhcnRzWzJdLFxuICB9IGFzIHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICAgIG93bmVyPzogc3RyaW5nO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgc3RyaW5nRm9ybWF0IH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT3ZlcmZsb3dFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgYWRkaXRpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBBZGRzIHR3byBudW1iZXJzIGFuZCB2ZXJpZmllcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBGaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzdW0gb2YgYSBhbmQgYlxuICogQGZ1bmN0aW9uIGFkZFxuICogQHRocm93cyB7T3ZlcmZsb3dFcnJvcn0gb24gYWRkaXRpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhICsgYjtcbiAgaWYgKGEgIT09IGMgLSBiIHx8IGIgIT09IGMgLSBhKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYEFkZGl0aW9uIG92ZXJmbG93OiAke2F9ICsgJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBPdmVyZmxvdy1zYWZlIHN1YnRyYWN0aW9uIG9wZXJhdGlvblxuICogQHN1bW1hcnkgU3VidHJhY3RzIGIgZnJvbSBhIGFuZCB2YWxpZGF0ZXMgbm8gb3ZlcmZsb3cgYnkgcmV2ZXJzZS1jaGVja2luZyB0aGUgb3BlcmFuZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhIC0gTWludWVuZFxuICogQHBhcmFtIHtudW1iZXJ9IGIgLSBTdWJ0cmFoZW5kXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaWZmZXJlbmNlIGEgLSBiXG4gKiBAZnVuY3Rpb24gc3ViXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBzdWJ0YWN0aW9uIG92ZXJmbG93XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWIoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBjID0gYSAtIGI7XG4gIGlmIChhICE9PSBjICsgYiB8fCBiICE9PSBhIC0gYykge1xuICAgIHRocm93IG5ldyBPdmVyZmxvd0Vycm9yKGBTdWJ0cmFjdGlvbiBvdmVyZmxvdzogJHthfSAtICR7Yn1gKTtcbiAgfVxuICByZXR1cm4gYztcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBTYWZlIEludGVnZXIgUGFyc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKlxuICogQGZ1bmN0aW9uIHNhZmVQYXJzZUludFxuICpcbiAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gaWYgcGFyc2VJbnQgcmV0dXJucyBOYU5cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYWZlUGFyc2VJbnQoc3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gY2hlY2sgaWYgc3RyaW5nIG9ubHkgaGF2ZSBkaWdpdHNcbiAgY29uc3QgZGlnaXRSZWdleCA9IC9eXFxkKyQvO1xuICBpZiAoIWRpZ2l0UmVnZXgudGVzdChzdHJpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHN0cmluZ0Zvcm1hdChcIkZhaWxlZCB0byBwYXJzZTogezB9XCIsIFwic3RyaW5nIGNvbnRhaW5zIGRpZ2l0c1wiKVxuICAgICk7XG4gIH1cbiAgY29uc3QgcGFyc2VkaW50ID0gcGFyc2VJbnQoc3RyaW5nKTtcbiAgaWYgKGlzTmFOKHBhcnNlZGludCkpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgaXMgbm90IGEgcGFyc2FibGUgaW50ZWdlclwiKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZGludDtcbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHNvcnRLZXlzT25seVJlY3Vyc2l2ZSB9IGZyb20gXCIuL0RldGVybWluaXN0aWNTZXJpYWxpemVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcsIHRhYmxlTmFtZT86IHN0cmluZyk6IE0ge1xuICAgIGNvbnN0IGRlc2VyaWFsaXphdGlvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICAvLyBjb25zdCBjbGFzc05hbWUgPSB0YWJsZU5hbWU7XG4gICAgLy8gaWYgKCFjbGFzc05hbWUpXG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBjbGFzcyByZWZlcmVuY2UgaW4gc2VyaWFsaXplZCBtb2RlbFwiKTtcblxuICAgIC8vIC8vIHRoaXMgd2lsbCByZXR1cm4gdW5kZWZpbmVkIHZhbHVlc1xuICAgIC8vIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcblxuICAgIC8vIC8vIFBvcHVsYXRlIE1vZGVsXG4gICAgLy8gY29uc3QgcHJvY2Vzc2VkRGVzZWFsaXphdGlvbiA9IE9iamVjdC5rZXlzKG1vZGVsKS5yZWR1Y2UoXG4gICAgLy8gICAoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgIC8vICAgICAoYWNjdW0gYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSA9XG4gICAgLy8gICAgICAgZGVzZXJpYWxpemF0aW9uW1JlcG9zaXRvcnkuY29sdW1uKGFjY3VtLCBrZXkpXTtcbiAgICAvLyAgICAgcmV0dXJuIGFjY3VtO1xuICAgIC8vICAgfSxcbiAgICAvLyAgIG1vZGVsXG4gICAgLy8gKTtcblxuICAgIC8vIGNvbnN0IHJlc3VsdCA9IE1vZGVsLmJ1aWxkKFxuICAgIC8vICAgcHJvY2Vzc2VkRGVzZWFsaXphdGlvbixcbiAgICAvLyAgIGNsYXNzTmFtZVxuICAgIC8vICkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gZGVzZXJpYWxpemF0aW9uO1xuICB9XG5cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBwdXRBbmNob3IgPSB0cnVlKTogc3RyaW5nIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIGNvbnN0IHByZVNlcmlhbGl6YXRpb24gPSB0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgcHV0QW5jaG9yKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5KHNvcnRLZXlzT25seVJlY3Vyc2l2ZShwcmVTZXJpYWxpemF0aW9uKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBwdXRBbmNob3I6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgLy8gVE9ETzogbmVzdGVkIHByZXNlcmlhbGl6YXRpb24gKHNvIGluY3JlYXNlIHBlcmZvcm1hbmNlIHdoZW4gZGVzZXJpYWxpemluZylcbiAgICAvLyBUT0RPOiBWZXJpZnkgd2h5IHRoZXJlIGlzIG5vIG1ldGFkYXRhXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgbGV0IG1ldGFkYXRhO1xuICAgIHRyeSB7XG4gICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIG1ldGFkYXRhID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAocHV0QW5jaG9yKVxuICAgICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YSB8fCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgZnVuY3Rpb24gcHJlU2VyaWFsaXplKFxuICAgICAgdGhpczogU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8YW55PixcbiAgICAgIG9iajogYW55XG4gICAgKTogYW55IHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gb2JqO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAocHJlU2VyaWFsaXplKTtcbiAgICAgIHJldHVybiB0aGlzLnByZVNlcmlhbGl6ZShvYmopO1xuICAgIH1cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplLmNhbGwodGhpcywgdG9TZXJpYWxpemVbcl0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvbkVycm9yLFxuICBDbGllbnRCYXNlZFNlcnZpY2UsXG4gIENvbnRleHQsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCBGYWJyaWNDQVNlcnZpY2VzLCB7XG4gIEFmZmlsaWF0aW9uU2VydmljZSxcbiAgSUF0dHJpYnV0ZVJlcXVlc3QsXG4gIElkZW50aXR5U2VydmljZSxcbiAgSUVucm9sbFJlc3BvbnNlLFxuICBJSWRlbnRpdHlSZXF1ZXN0LFxuICBJUmVnaXN0ZXJSZXF1ZXN0LFxuICBJUmV2b2tlUmVxdWVzdCxcbiAgSVNlcnZpY2VSZXNwb25zZSxcbiAgVExTT3B0aW9ucyxcbn0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IENBQ29uZmlnLCBDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29yZVV0aWxzLCBnZXRBa2lBbmRTZXJpYWxGcm9tQ2VydCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgQ2VydGlmaWNhdGVSZXNwb25zZSxcbiAgRmFicmljSWRlbnRpdHksXG4gIEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gIElkZW50aXR5UmVzcG9uc2UsXG59IGZyb20gXCIuLi8uLi9zaGFyZWQvZmFicmljLXR5cGVzXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IENBX1JPTEUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IElLZXlWYWx1ZUF0dHJpYnV0ZSB9IGZyb20gXCIuL0ZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW5kZXhcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4uL2NyeXB0b1wiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljSWRlbnRpdHlTZXJ2aWNlIGV4dGVuZHMgQ2xpZW50QmFzZWRTZXJ2aWNlPFxuICBGYWJyaWNDQVNlcnZpY2VzLFxuICBDQUNvbmZpZ1xuPiB7XG4gIHByb3RlY3RlZCBfdXNlciE6IFVzZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcm9vdENsaWVudCgpOiB7IG5ld0NlcnRpZmljYXRlU2VydmljZTogYW55IH0ge1xuICAgIHJldHVybiAodGhpcy5jbGllbnQgYXMgYW55KVtcIl9GYWJyaWNDYVNlcnZpY2VzXCJdIGFzIGFueTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdXNlcigpOiBVc2VyIHtcbiAgICBpZiAoIXRoaXMuX3VzZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJGYWJyaWMgaWRlbnRpdHkgc2VydmljZSBub3QgcHJvcGVybHkgc2V0dXA6IG1pc3NpbmcgdXNlclwiXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBjZXJ0aWZpY2F0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENsaWVudC5uZXdDZXJ0aWZpY2F0ZVNlcnZpY2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgYWZmaWxpYXRpb25zKCk6IEFmZmlsaWF0aW9uU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Lm5ld0FmZmlsaWF0aW9uU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpZGVudGl0aWVzKCk6IElkZW50aXR5U2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Lm5ld0lkZW50aXR5U2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFVzZXIoY2ZnOiBDQUNvbmZpZywgY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRVc2VyKTtcbiAgICBjb25zdCB7IGNhTmFtZSwgY2FDZXJ0LCBjYUtleSwgdXJsLCBoc20gfSA9IGNmZztcblxuICAgIGxvZy5pbmZvKGBDcmVhdGluZyBDQSB1c2VyIGZvciAke2NhTmFtZX0gYXQgJHt1cmx9YCk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgQ0EgY2VydGlmaWNhdGUgZnJvbSAke2NhQ2VydH1gKTtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChjYUNlcnQpO1xuICAgIGxldCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWhzbSkge1xuICAgICAgaWYgKCFjYUtleSkge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWlzc2luZyBjYUtleSBjb25maWd1cmF0aW9uIGZvciBDQSAke2NhTmFtZX0uIFByb3ZpZGUgYSBrZXkgZGlyZWN0b3J5IG9yIGNvbmZpZ3VyZSBIU00gc3VwcG9ydC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0Ega2V5IGZyb20gJHtjYUtleX1gKTtcbiAgICAgIGtleSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChjYUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFVzaW5nIEhTTSBjb25maWd1cmF0aW9uIGZvciBDQSAke2NhTmFtZX0gd2l0aCBsaWJyYXJ5ICR7aHNtLmxpYnJhcnl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBMb2FkaW5nIEFkbWluIHVzZXIgZm9yIGNhICR7Y2FOYW1lfWApO1xuICAgIHRoaXMuX3VzZXIgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Q0FVc2VyKFwiYWRtaW5cIiwga2V5LCBjZXJ0aWZpY2F0ZSwgY2FOYW1lLCB7XG4gICAgICBoc20sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8eyBjb25maWc6IENBQ29uZmlnOyBjbGllbnQ6IEZhYnJpY0NBU2VydmljZXMgfT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5JTklUSUFMSVpBVElPTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IFtjb25maWddID0gYXJncztcbiAgICBpZiAoIWNvbmZpZykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIEZhYnJpYyBDQSBjb25maWd1cmF0aW9uXCIpO1xuXG4gICAgY29uc3QgeyB1cmwsIHRscywgY2FOYW1lIH0gPSBjb25maWc7XG4gICAgbG9nLmluZm8oYEluaXRpYWxpemluZyBDQSBDbGllbnQgZm9yIENBICR7Y29uZmlnLmNhTmFtZX0gYXQgJHtjb25maWcudXJsfWApO1xuICAgIGNvbnN0IHsgdHJ1c3RlZFJvb3RzLCB2ZXJpZnkgfSA9IHRscyBhcyBUTFNPcHRpb25zO1xuXG4gICAgY29uc3Qgcm9vdCA9ICh0cnVzdGVkUm9vdHMgYXMgc3RyaW5nW10pWzBdIGFzIHN0cmluZztcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0EgY2VydGlmaWNhdGUgZnJvbSAke3Jvb3R9LiBjd2Q6ICR7cHJvY2Vzcy5jd2QoKX1gKTtcblxuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpbGVDb250ZW50KHJvb3QpO1xuXG4gICAgbG9nLmRlYnVnKGBDQSBDZXJ0aWZpY2F0ZTogJHtjZXJ0aWZpY2F0ZS50b1N0cmluZygpfWApO1xuXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IEZhYnJpY0NBU2VydmljZXMoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIHRydXN0ZWRSb290czogQnVmZmVyLmZyb20oY2VydGlmaWNhdGUpLFxuICAgICAgICB2ZXJpZnksXG4gICAgICB9IGFzIFRMU09wdGlvbnMsXG4gICAgICBjYU5hbWVcbiAgICApO1xuXG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuZ2V0VXNlcihjb25maWcsIGN0eCk7XG4gICAgbG9nLmRlYnVnKGBDQSB1c2VyIGxvYWRlZDogJHt1c2VyLmdldE5hbWUoKX1gKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlnLFxuICAgICAgY2xpZW50LFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT4pOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzKFxuICAgIHJlcXVlc3Q6IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICBkb01hcDogTUFQLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXM8TUFQIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICBkb01hcDogTUFQLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXM8TUFQIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmVxdWVzdD86IEdldENlcnRpZmljYXRlc1JlcXVlc3QgfCBNQVAsXG4gICAgZG9NYXA6IE1BUCA9IHRydWUgYXMgTUFQLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW10+IHtcbiAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENvbnRleHQpIHtcbiAgICAgIGFyZ3MgPSBbcmVxdWVzdF07XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgICAgcmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgZG9NYXAgPSByZXF1ZXN0O1xuICAgICAgcmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb01hcCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGFyZ3MgPSBbZG9NYXAgYXMgTWF5YmVDb250ZXh0dWFsQXJnPGFueT4sIC4uLmFyZ3NdO1xuICAgICAgZG9NYXAgPSB0cnVlIGFzIE1BUDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZ2V0Q2VydGlmaWNhdGVzXG4gICAgKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgUmV0cmlldmluZyBjZXJ0aWZpY2F0ZXMke3JlcXVlc3QgPyBgIGZvciAke3JlcXVlc3QuaWR9YCA6IFwiXCJ9IGZvciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZTogQ2VydGlmaWNhdGVSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IHRoaXMuY2VydGlmaWNhdGVzLmdldENlcnRpZmljYXRlcyhyZXF1ZXN0IHx8IHt9LCB0aGlzLnVzZXIpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLnZlcmJvc2UoYEZvdW5kICR7cmVzcG9uc2UuY2VydHMubGVuZ3RofSBjZXJ0aWZpY2F0ZXNgKTtcbiAgICBsb2cuZGVidWcocmVzcG9uc2UuY2VydHMpO1xuICAgIHJldHVybiAoXG4gICAgICBkb01hcCA/IHJlc3BvbnNlLmNlcnRzLm1hcCgoYykgPT4gYy5QRU0pIDogcmVzcG9uc2VcbiAgICApIGFzIE1BUCBleHRlbmRzIGZhbHNlID8gQ2VydGlmaWNhdGVSZXNwb25zZSA6IHN0cmluZ1tdO1xuICB9XG5cbiAgYXN5bmMgZ2V0SWRlbnRpdGllcyhjdHg6IENvbnRleHQpOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+IHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldElkZW50aXRpZXMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIElkZW50aXRpZXMgdW5kZXIgQ0EgJHt0aGlzLmNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElkZW50aXR5UmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5pZGVudGl0aWVzLmdldEFsbCh0aGlzLnVzZXIpKVxuICAgICAgLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5pZGVudGl0aWVzLmxlbmd0aH0gSWRlbnRpdGllc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5pZGVudGl0aWVzKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuaWRlbnRpdGllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmUgYWZmaWxpYXRpb25zIGZyb20gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBRdWVyaWVzIHRoZSBDQSBmb3IgdGhlIGxpc3Qgb2YgYWZmaWxpYXRpb25zIGF2YWlsYWJsZSB1bmRlciB0aGUgY29uZmlndXJlZCBDQS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWZmaWxpYXRpb25zIHJlc3VsdCBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZ2V0QWZmaWxpYXRpb25zKGN0eDogQ29udGV4dCkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0QWZmaWxpYXRpb25zKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBBZmZpbGlhdGlvbnMgdW5kZXIgQ0EgJHt0aGlzLmNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hZmZpbGlhdGlvbnMuZ2V0QWxsKHRoaXMudXNlcikpLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5hLmxlbmd0aH0gQWZmaWxpYXRpb25zYCk7XG4gICAgbG9nLmRlYnVnKEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXJyb3IoZTogRXJyb3IpIHtcbiAgICBjb25zdCByZWdleHAgPSAvLipjb2RlOlxccyhcXGQrKS4qP21lc3NhZ2U6XFxzW1wiJ10oLispW1wiJ10vZ3M7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhlLm1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IoZSk7XG4gICAgY29uc3QgWywgY29kZSwgbWVzc2FnZV0gPSBtYXRjaDtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgXCI3NFwiOlxuICAgICAgY2FzZSBcIjcxXCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgXCIyMFwiOlxuICAgICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGlkZW50aXR5IGRldGFpbHMgZnJvbSB0aGUgQ0EgYnkgZW5yb2xsbWVudCBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCB2YWxpZGF0ZXMgYSBzaW5nbGUgaWRlbnRpdHksIHRocm93aW5nIE5vdEZvdW5kRXJyb3Igd2hlbiBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBsb29rdXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHk+fSBUaGUgaWRlbnRpdHkgZGV0YWlscyBzdG9yZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgcmVhZChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLlJFQUQsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnJlYWRcbiAgICApO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIGlkZW50aXR5IHdpdGggZW5yb2xsbWVudCBJRCAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0T25lKGVucm9sbG1lbnRJZCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyBGYWJyaWNJZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgaWRlbnRpdHkgd2l0aCB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSByZWdpc3RyYXRpb24gcmVxdWVzdCBmb3IgYSBuZXcgZW5yb2xsbWVudCBJRCwgcmV0dXJuaW5nIHRoZSBlbnJvbGxtZW50IHNlY3JldCB1cG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgZm9yIHRoZSBuZXcgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFRoZSBlbnJvbGxtZW50IHNlY3JldCBmb3IgdGhlIHJlZ2lzdGVyZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlcihcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVnaXN0ZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJcbiAgICApO1xuXG4gICAgbGV0IHJlZ2lzdHJhdGlvbjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCBwYXNzd29yZCB9ID0gbW9kZWw7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgZW5yb2xsbWVudElEOiB1c2VyTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHBhc3N3b3JkLFxuICAgICAgICBhZmZpbGlhdGlvbjogYWZmaWxpYXRpb24sXG4gICAgICAgIHVzZXJSb2xlOiB1c2VyUm9sZSxcbiAgICAgICAgYXR0cnM6IGF0dHJzLFxuICAgICAgICBtYXhFbnJvbGxtZW50czogbWF4RW5yb2xsbWVudHMsXG4gICAgICB9IGFzIElSZWdpc3RlclJlcXVlc3Q7XG4gICAgICByZWdpc3RyYXRpb24gPSBhd2FpdCB0aGlzLmNsaWVudC5yZWdpc3Rlcihwcm9wcywgdGhpcy51c2VyKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVnaXN0cmF0aW9uIGZvciAke3VzZXJOYW1lfSBjcmVhdGVkIHdpdGggdXNlciB0eXBlICR7dXNlclJvbGUgPz8gXCJVbmRlZmluZWQgUm9sZVwifSAke2lzU3VwZXJVc2VyID8gXCJhcyBzdXBlciB1c2VyXCIgOiBcIlwifWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlLFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY3R4OiBDb250ZXh0XG4gICk6IElkZW50aXR5IHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmlkZW50aXR5RnJvbUVucm9sbG1lbnQpO1xuICAgIGNvbnN0IHsgY2VydGlmaWNhdGUsIGtleSwgcm9vdENlcnRpZmljYXRlIH0gPSBlbnJvbGxtZW50O1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEdlbmVyYXRpbmcgSWRlbnRpdHkgZnJvbSBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlfSBpbiBtc3AgJHttc3BJZH1gXG4gICAgKTtcbiAgICBjb25zdCBjbGllbnRJZCA9IENyeXB0b1V0aWxzLmZhYnJpY0lkRnJvbUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKTtcbiAgICBjb25zdCBpZCA9IENyeXB0b1V0aWxzLmVuY29kZShjbGllbnRJZCk7XG4gICAgbG9nLmRlYnVnKGBJZGVudGl0eSAke2NsaWVudElkfSBhbmQgZW5jb2RlZElkICR7aWR9YCk7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eSh7XG4gICAgICBpZDogaWQsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleToga2V5LnRvQnl0ZXMoKSxcbiAgICAgICAgcm9vdENlcnRpZmljYXRlOiByb290Q2VydGlmaWNhdGUsXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbnJvbGwgYW4gaWRlbnRpdHkgd2l0aCB0aGUgQ0EgdXNpbmcgYSByZWdpc3RyYXRpb24gc2VjcmV0LlxuICAgKiBAc3VtbWFyeSBFeGNoYW5nZXMgdGhlIGVucm9sbG1lbnQgSUQgYW5kIHNlY3JldCBmb3IgY2VydGlmaWNhdGVzLCByZXR1cm5pbmcgYSBjb25zdHJ1Y3RlZCBJZGVudGl0eSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gZW5yb2xsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uIC0gRW5yb2xsbWVudCBzZWNyZXQgcmV0dXJuZWQgYXQgcmVnaXN0cmF0aW9uIHRpbWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkgb2JqZWN0IHdpdGggY3JlZGVudGlhbHMuXG4gICAqL1xuICBhc3luYyBlbnJvbGwoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmVnaXN0cmF0aW9uOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcImVucm9sbFwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5lbnJvbGxcbiAgICApO1xuICAgIGxldCBpZGVudGl0eTogSWRlbnRpdHk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhgRW5yb2xsaW5nICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgY29uc3QgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZW5yb2xsKHtcbiAgICAgICAgZW5yb2xsbWVudElEOiBlbnJvbGxtZW50SWQsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHJlZ2lzdHJhdGlvbixcbiAgICAgIH0pO1xuICAgICAgaWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBlbnJvbGxlZCAke2Vucm9sbG1lbnRJZH0gdW5kZXIgJHt0aGlzLmNvbmZpZy5jYU5hbWV9IGFzICR7aWRlbnRpdHkuaWR9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IGlkZW50aXR5IGluIG9uZSBzdGVwLlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBuZXcgZW5yb2xsbWVudCBJRCB3aXRoIHRoZSBDQSBhbmQgaW1tZWRpYXRlbHkgZXhjaGFuZ2VzIHRoZSBzZWNyZXQgdG8gZW5yb2xsLCByZXR1cm5pbmcgdGhlIGNyZWF0ZWQgSWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgZm9yIHRoZSBuZXcgaWRlbnRpdHkgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5LlxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJBbmRFbnJvbGwoXG4gICAgbW9kZWw6IENyZWRlbnRpYWxzLFxuICAgIGlzU3VwZXJVc2VyOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCIsXG4gICAgdXNlclJvbGU/OiBDQV9ST0xFIHwgc3RyaW5nLFxuICAgIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlLFxuICAgIG1heEVucm9sbG1lbnRzPzogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVnaXN0ZXItZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnJlZ2lzdGVyQW5kRW5yb2xsXG4gICAgKTtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCB0aGlzLnJlZ2lzdGVyKFxuICAgICAgbW9kZWwsXG4gICAgICBpc1N1cGVyVXNlcixcbiAgICAgIGFmZmlsaWF0aW9uLFxuICAgICAgdXNlclJvbGUsXG4gICAgICBhdHRycyxcbiAgICAgIG1heEVucm9sbG1lbnRzLFxuICAgICAgY3R4XG4gICAgKTtcbiAgICBjb25zdCB7IHVzZXJOYW1lIH0gPSBtb2RlbDtcbiAgICByZXR1cm4gdGhpcy5lbnJvbGwodXNlck5hbWUgYXMgc3RyaW5nLCByZWdpc3RyYXRpb24sIGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlLWVucm9sbCBhbiBleGlzdGluZyBpZGVudGl0eSB1c2luZyBpdHMgY3VycmVudCBlbnJvbGxtZW50LlxuICAgKiBAc3VtbWFyeSBSZW5ld3MgdGhlIGVucm9sbG1lbnQgY2VydGlmaWNhdGUgYnkgY2FsbGluZyB0aGUgQ0EgcmVlbnJvbGwuXG4gICAqIEBwYXJhbSB7VXNlcn0gY3VycmVudFVzZXIgLSBBbHJlYWR5IGVucm9sbGVkIHVzZXIsIG11c3QgaGF2ZSBhIHNpZ25pbmcgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgcmVuZXdlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBuZXcgY3JlZGVudGlhbHMuXG4gICAqL1xuICBhc3luYyB1cGRhdGVJZGVudGl0eShcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICBpZGVudGl0eTogeyBjZXJ0aWZpY2F0ZTogc3RyaW5nOyBwcml2YXRlS2V5OiBzdHJpbmcgfSxcbiAgICBpZGVudGl0eVJlcXVlc3Q6IElJZGVudGl0eVJlcXVlc3QsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJlZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnVwZGF0ZUlkZW50aXR5XG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cuaW5mbyhgUmVuZXdpbmcgaWRlbnRpdHkgZm9yICR7ZW5yb2xsbWVudElkfWApO1xuXG4gICAgICAvLyBVcGRhdGUgYXR0cmlidXRlcyBpbiB0aGUgQ0EgcmVnaXN0cnkgKGFkbWluIG9wZXJhdGlvbikuIFRoaXMgY2hhbmdlcyB0aGUgXCJzb3VyY2Ugb2YgdHJ1dGhcIi5cbiAgICAgIGNvbnN0IGlkZW50aXR5U2VydmljZSA9IHRoaXMuY2xpZW50Lm5ld0lkZW50aXR5U2VydmljZSgpO1xuXG4gICAgICBjb25zdCBjYVVzZXJJZGVudGl0eSA9IChhd2FpdCBpZGVudGl0eVNlcnZpY2UuZ2V0T25lKFxuICAgICAgICBlbnJvbGxtZW50SWQsXG4gICAgICAgIHRoaXMudXNlclxuICAgICAgKSkgYXMgeyByZXN1bHQ6IHsgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGVbXSB9IH07XG5cbiAgICAgIGF3YWl0IGlkZW50aXR5U2VydmljZS51cGRhdGUoZW5yb2xsbWVudElkLCBpZGVudGl0eVJlcXVlc3QsIHRoaXMudXNlcik7IC8vIGFzIElTZXJ2aWNlUmVzcG9uc2UgJiB7IHJlc3VsdDogSUlkZW50aXR5UmVxdWVzdCB9O1xuXG4gICAgICAvLyBSZWVucm9sbCBhcyB0aGUgdXNlci4gUmVxdWVzdCBtdXN0IGJlIHNpZ25lZCB1c2luZyB0aGUgZXhpc3RpbmcgY2VydGlmaWNhdGUuXG4gICAgICBjb25zdCByZWVucm9sbFVzZXIgPSBVc2VyLmNyZWF0ZVVzZXIoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgXCJcIiwgLy8gZW5yb2xsbWVudFNlY3JldCBub3QgcmVxdWlyZWQgZm9yIHJlZW5yb2xsXG4gICAgICAgIHRoaXMudXNlci5nZXRNc3BpZCgpLFxuICAgICAgICBpZGVudGl0eS5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgaWRlbnRpdHkucHJpdmF0ZUtleVxuICAgICAgKTtcbiAgICAgIHJlZW5yb2xsVXNlci5zZXRDcnlwdG9TdWl0ZSh0aGlzLnVzZXIuZ2V0Q3J5cHRvU3VpdGUoKSk7XG5cbiAgICAgIGNvbnN0IGVucm9sbG1lbnRBdHRyczogSUF0dHJpYnV0ZVJlcXVlc3RbXSA9IChcbiAgICAgICAgY2FVc2VySWRlbnRpdHkucmVzdWx0LmF0dHJzIHx8IFtdXG4gICAgICApLm1hcCgoeyBuYW1lIH0pID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgIH0pKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudCA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZW5yb2xsKFxuICAgICAgICByZWVucm9sbFVzZXIsXG4gICAgICAgIGVucm9sbG1lbnRBdHRyc1xuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVuZXdlZElkZW50aXR5ID0gRmFicmljSWRlbnRpdHlTZXJ2aWNlLmlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgICAgIGVucm9sbG1lbnQsXG4gICAgICAgIHRoaXMuY29uZmlnLmNhTmFtZSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuXG4gICAgICAvLyBSZXZva2UgdGhlIHByZXZpb3VzIGNlcnRpZmljYXRlIG9ubHksIHNvIHRoZSBvbGQgY2VydCBiZWNvbWVzIGludmFsaWQuXG4gICAgICBsb2cuZGVidWcoYFJldm9raW5nIHByZXZpb3VzIGNlcnRpZmljYXRlcyBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCB7IGFraSwgc2VyaWFsIH0gPSBnZXRBa2lBbmRTZXJpYWxGcm9tQ2VydChpZGVudGl0eS5jZXJ0aWZpY2F0ZSk7XG4gICAgICBhd2FpdCB0aGlzLnJldm9rZShlbnJvbGxtZW50SWQsIHsgYWtpLCBzZXJpYWwgfSwgYXJncyk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgUmVuZXcgaWRlbnRpdHkgc3VjY2Vzc2Z1bCBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICByZXR1cm4gcmVuZXdlZElkZW50aXR5O1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2VzIHRoZSBlbnJvbGxtZW50IG9mIGFuIGlkZW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCBlbnJvbGxtZW50IElELlxuICAgKlxuICAgKiBAcGFyYW0gZW5yb2xsbWVudElkIC0gVGhlIGVucm9sbG1lbnQgSUQgb2YgdGhlIGlkZW50aXR5IHRvIGJlIHJldm9rZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXN1bHQgb2YgdGhlIHJldm9jYXRpb24gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAdGhyb3dzIHtOb3RGb3VuZEVycm9yfSBJZiB0aGUgZW5yb2xsbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZG9lcyBub3QgZXhpc3QuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0aGUgcmV2b2NhdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgYXN5bmMgcmV2b2tlKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIHJldm9rZU9wdGlvbnM6IE9taXQ8SVJldm9rZVJlcXVlc3QsIFwiZW5yb2xsbWVudElEXCI+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8SVNlcnZpY2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZXZva2VcIiwgdHJ1ZSkpLmZvcih0aGlzLnJldm9rZSk7XG4gICAgbG9nLnZlcmJvc2UoYFJldm9raW5nIGlkZW50aXR5IHdpdGggZW5yb2xsbWVudCBJRCAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMucmVhZChlbnJvbGxtZW50SWQpO1xuICAgIGlmICghaWRlbnRpdHkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH1gXG4gICAgICApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9XG4gICAgICAgIEJvb2xlYW4ocmV2b2tlT3B0aW9ucy5zZXJpYWwpIHx8IEJvb2xlYW4ocmV2b2tlT3B0aW9ucy5ha2kpXG4gICAgICAgICAgPyBcIlJldm9rZSBVc2VyIENlcnRpZmljYXRlXCJcbiAgICAgICAgICA6IFwiVXNlciBEZWxldGlvblwiO1xuXG4gICAgICBjb25zdCByZXZva2VSZXF1ZXN0OiBJUmV2b2tlUmVxdWVzdCA9IHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgICAuLi5yZXZva2VPcHRpb25zLFxuICAgICAgICBlbnJvbGxtZW50SUQ6IGlkZW50aXR5LmlkLFxuICAgICAgfTtcblxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5jbGllbnQucmV2b2tlKHJldm9rZVJlcXVlc3QsIHRoaXMudXNlcik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV2b2tlIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV2b2tlIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHJvbGUgdHlwZXMgdXNlZCBkdXJpbmcgZW5yb2xsbWVudCBhbmQgcmVnaXN0cmF0aW9uLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUgc3RhbmRhcmQgSHlwZXJsZWRnZXIgRmFicmljIENBIHJvbGVzIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIGlkZW50aXRpZXMgd2hlbiByZWdpc3RlcmluZyB3aXRoIHRoZSBDQSBzZXJ2aWNlLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBDQV9ST0xFIHtcbiAgLyoqIEFkbWluaXN0cmF0b3Igcm9sZSB3aXRoIGVsZXZhdGVkIHByaXZpbGVnZXMgZm9yIG1hbmFnaW5nIGlkZW50aXRpZXMgYW5kIGFmZmlsaWF0aW9ucyAqL1xuICBBRE1JTiA9IFwiYWRtaW5cIixcbiAgLyoqIFN0YW5kYXJkIHVzZXIgcm9sZSBmb3IgYXBwbGljYXRpb24gY2xpZW50cyBpbnRlcmFjdGluZyB3aXRoIHRoZSBuZXR3b3JrICovXG4gIFVTRVIgPSBcInVzZXJcIixcbiAgLyoqIENsaWVudCByb2xlIHR5cGljYWxseSB1c2VkIGZvciBTREstYmFzZWQgaW50ZXJhY3Rpb25zIGFuZCBzZXJ2aWNlIGFjY291bnRzICovXG4gIENMSUVOVCA9IFwiY2xpZW50XCIsXG59XG4iLCJpbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3M6IEZhYnJpY0NsaWVudEZsYWdzID0gT2JqZWN0LmFzc2lnbih7XG4gIGV2YWx1YXRlVGltZW91dDogNSxcbiAgZW5kb3JzZVRpbWVvdXQ6IDE1LFxuICBzdWJtaXRUaW1lb3V0OiA1LFxuICBjb21taXRUaW1lb3V0OiA2MCxcbiAgbGVnYWN5OiBmYWxzZSxcbiAgYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzOiBmYWxzZSxcbiAgYWxsb3dHYXRld2F5T3ZlcnJpZGU6IGZhbHNlLFxuICByZWJ1aWxkV2l0aFRyYW5zaWVudDogdHJ1ZSxcbiAgZW5jcnlwdFRyYW5zaWVudDogZmFsc2UsXG59KSBhcyBhbnk7XG4iLCJpbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSWRlbnRpdHksIFNpZ25lciwgc2lnbmVycyB9IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5jb25zdCBsb2cgPSBuZXcgTWluaUxvZ2dlcihcImZhYnJpYy1mc1wiKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTG9hZHMgY29udGVudCBmcm9tIGEgZmlsZSBvciByZXR1cm5zIHRoZSBjb250ZW50IGlmIGFscmVhZHkgbG9hZGVkXG4gKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBhbHJlYWR5IGNvbnRlbnQgb3IgYSBwYXRoIHRvIGEgZmlsZSwgYW5kIGxvYWRzIHRoZSBmaWxlIGlmIG5lZWRlZFxuICogQHBhcmFtIHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50T3JQYXRoIC0gVGhlIGNvbnRlbnQgb3IgcGF0aCB0byBsb2FkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaWxlUmVhZGVyIC0gRnVuY3Rpb24gdG8gcmVhZCB0aGUgZmlsZSBpZiBjb250ZW50T3JQYXRoIGlzIGEgcGF0aFxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmcgfCBVaW50OEFycmF5IHwgQnVmZmVyPn0gVGhlIGNvbnRlbnRcbiAqIEBmdW5jdGlvbiBjb250ZW50T2ZMb2FkRmlsZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGUoXG4gIGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IFVpbnQ4QXJyYXksXG4gIGZpbGVSZWFkZXI6IChwYXRoOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj5cbikge1xuICBpZiAoY29udGVudE9yUGF0aCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBjb250ZW50T3JQYXRoO1xuICBpZiAoXG4gICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgKVxuICApXG4gICAgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIGZpbGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW1cbiAqIEBzdW1tYXJ5IExvYWRzIGEgZmlsZSB1c2luZyB0aGUgTm9kZS5qcyBmaWxlIHN5c3RlbSBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSBjb250ZW50T3JQYXRoIC0gVGhlIGNvbnRlbnQgb3IgcGF0aCB0byBsb2FkXG4gKiBAcmV0dXJuIHtQcm9taXNlPEJ1ZmZlcj59IFRoZSBmaWxlIGNvbnRlbnQgYXMgYSBCdWZmZXJcbiAqIEBmdW5jdGlvbiByZWFkRmlsZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gIGlmICh0eXBlb2YgY29udGVudE9yUGF0aCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG5cbiAgY29uc3QgZmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShwYXRoKTtcbiAgfTtcblxuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIENlcnRpZmljYXRlIEF1dGhvcml0eSB1c2VyXG4gKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIHVzZXIgd2l0aCB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMgZm9yIGludGVyYWN0aW5nIHdpdGggYSBGYWJyaWMgQ0FcbiAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gVGhlIHByaXZhdGUga2V5IGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gY2VydGlmaWNhdGUgLSBUaGUgY2VydGlmaWNhdGUgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEByZXR1cm4ge1Byb21pc2U8VXNlcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHVzZXJcbiAqIEBmdW5jdGlvbiBnZXRDQVVzZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENBVXNlcihcbiAgdXNlck5hbWU6IHN0cmluZyxcbiAgcHJpdmF0ZUtleTogc3RyaW5nLFxuICBjZXJ0aWZpY2F0ZTogc3RyaW5nLFxuICBtc3BJZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXI+IHtcbiAgbG9nLmRlYnVnKFxuICAgIGBDcmVhdGluZyBhIENBICR7bXNwSWR9IHVzZXIgJHt1c2VyTmFtZX0gd2l0aCBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlfWBcbiAgKTtcbiAgY29uc3QgdXNlciA9IG5ldyBVc2VyKHVzZXJOYW1lKTtcbiAgY29uc3QgY3J5cHRvU3VpdGUgPSBVc2VyLm5ld0NyeXB0b1N1aXRlKCk7XG4gIHVzZXIuc2V0Q3J5cHRvU3VpdGUoY3J5cHRvU3VpdGUpO1xuICBjb25zdCBpbXBvcnRlZEtleSA9IGNyeXB0b1N1aXRlLmNyZWF0ZUtleUZyb21SYXcocHJpdmF0ZUtleSk7XG4gIGF3YWl0IHVzZXIuc2V0RW5yb2xsbWVudChpbXBvcnRlZEtleSwgY2VydGlmaWNhdGUsIG1zcElkKTtcbiAgcmV0dXJuIHVzZXI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgYW4gaWRlbnRpdHkgZnJvbSBhIGNlcnRpZmljYXRlIGRpcmVjdG9yeVxuICogQHN1bW1hcnkgTG9hZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IGFuZCBjcmVhdGVzIGFuIElkZW50aXR5IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gVGhlIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBJRFxuICogQHBhcmFtIHtzdHJpbmd9IGNlcnREaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNlcnRpZmljYXRlXG4gKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGlkZW50aXR5XG4gKiBAZnVuY3Rpb24gZ2V0SWRlbnRpdHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldElkZW50aXR5KFxuICBtc3BJZDogc3RyaW5nLFxuICBjZXJ0RGlyZWN0b3J5UGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPElkZW50aXR5PiB7XG4gIGNvbnN0IGlkZW50aXR5RmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgZ2V0Rmlyc3REaXJGaWxlTmFtZShwYXRoKTtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGNlcnRQYXRoKTtcbiAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gIH07XG5cbiAgY29uc3QgY3JlZGVudGlhbHM6IFVpbnQ4QXJyYXkgPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY2VydERpcmVjdG9yeVBhdGgsXG4gICAgaWRlbnRpdHlGaWxlUmVhZGVyXG4gICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgcmV0dXJuIHsgbXNwSWQsIGNyZWRlbnRpYWxzIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlyc3QgZmlsZSBpbiBhIGRpcmVjdG9yeVxuICogQHN1bW1hcnkgUmVhZHMgYSBkaXJlY3RvcnkgYW5kIHJldHVybnMgdGhlIHBhdGggdG8gdGhlIGZpcnN0IGZpbGUgZm91bmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGVcbiAqIEBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiBqb2luKGRpclBhdGgsIGZpbGVzWzBdKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29udGVudCBvZiB0aGUgZmlyc3QgZmlsZSBpbiBhIGRpcmVjdG9yeVxuICogQHN1bW1hcnkgUmVhZHMgYSBkaXJlY3RvcnksIGZpbmRzIHRoZSBmaXJzdCBmaWxlLCBhbmQgcmV0dXJucyBpdHMgY29udGVudCBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGRpclBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGVcbiAqIEBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoXG4gIGRpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwicGF0aFwiKSk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgYSBzaWduZXIgZnJvbSBhIGtleSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhIFNpZ25lciBmb3IgRmFicmljIHRyYW5zYWN0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleURpcmVjdG9yeVBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcHJpdmF0ZSBrZXlcbiAqIEByZXR1cm4ge1Byb21pc2U8U2lnbmVyPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNpZ25lclxuICogQGZ1bmN0aW9uIGdldFNpZ25lclxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2lnbmVyKGtleURpcmVjdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8U2lnbmVyPiB7XG4gIGNvbnN0IHNpZ25lckZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBrZXlQYXRoID0gYXdhaXQgZ2V0Rmlyc3REaXJGaWxlTmFtZShwYXRoKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gIH07XG5cbiAgY29uc3QgcHJpdmF0ZUtleVBlbSA9IChhd2FpdCBjb250ZW50T2ZMb2FkRmlsZShcbiAgICBrZXlEaXJlY3RvcnlQYXRoLFxuICAgIHNpZ25lckZpbGVSZWFkZXJcbiAgKSkgYXMgQnVmZmVyO1xuICAvLyBOb2RlIGJhc2VkIGltcGxlbWVudGF0aW9uXG4gIC8vIHByaXZhdGVLZXkgPSBjcmVhdGVQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAvLyAtLVxuXG4gIC8vIHdlYiBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleVBlbSk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICBjb25zdCBrID0gKHByaXZhdGVLZXkgYXMgYW55KVtrZXlzWzBdXTtcbiAgLy8gLS1cblxuICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0cmFjdHMgYSBwcml2YXRlIGtleSBmcm9tIGEgUEVNIGJ1ZmZlclxuICogQHN1bW1hcnkgQ29udmVydHMgYSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleSB0byBhIENyeXB0b0tleSBvYmplY3RcbiAqIEBwYXJhbSB7QnVmZmVyfSBwZW0gLSBUaGUgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAqIEByZXR1cm4ge1Byb21pc2U8Q3J5cHRvS2V5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIENyeXB0b0tleVxuICogQGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBFeHRyYWN0UHJpdmF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBTdWJ0bGVDcnlwdG9cbiAqXG4gKiAgIENhbGxlci0+PkV4dHJhY3RQcml2YXRlS2V5OiBleHRyYWN0UHJpdmF0ZUtleShwZW0pXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IEdldCBTdWJ0bGVDcnlwdG8gaW1wbGVtZW50YXRpb25cbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogUGFyc2UgUEVNIGZvcm1hdFxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDb252ZXJ0IHRvIGJpbmFyeSBERVJcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5TdWJ0bGVDcnlwdG86IGltcG9ydEtleShwa2NzOCwgYmluYXJ5RGVyLCBvcHRpb25zKVxuICogICBTdWJ0bGVDcnlwdG8tLT4+RXh0cmFjdFByaXZhdGVLZXk6IENyeXB0b0tleVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0tPj5DYWxsZXI6IENyeXB0b0tleVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFByaXZhdGVLZXkocGVtOiBCdWZmZXIpIHtcbiAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gIGxldCBzdWJ0bGU7XG4gIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgIHN1YnRsZSA9IChnbG9iYWxUaGlzIGFzIGFueSkuY3J5cHRvLnN1YnRsZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsaWIgPSAoYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChsaWJOYW1lKSkpIGFzIGFueTtcbiAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICB9XG5cbiAgaWYgKCFzdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsb2FkIFN1YnRsZUNyeXB0byBtb2R1bGVcIik7XG5cbiAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmID0gbmV3IEFycmF5QnVmZmVyKHN0ci5sZW5ndGgpO1xuICAgIGNvbnN0IGJ1ZlZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgIGJ1ZlZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIGNvbnN0IHN0ciA9IHBlbVxuICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAucmVwbGFjZShcIi0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKVxuICAgIC5yZXBsYWNlQWxsKFwiXFxuXCIsIFwiXCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oc3RyLCBcImJhc2U2NFwiKS50b1N0cmluZyhcImJpbmFyeVwiKTtcbiAgY29uc3QgYmluYXJ5RGVyID0gc3RyMmFiKGRlY29kZWQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgc3VidGxlLmltcG9ydEtleShcbiAgICAgIFwicGtjczhcIixcbiAgICAgIGJpbmFyeURlcixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBuYW1lZEN1cnZlOiBcIlAtMjU2XCIsXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICAgIFtcInNpZ25cIl1cbiAgICApO1xuXG4gICAgcmV0dXJuIGtleTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEFkYXB0ZXJGbGFncyxcbiAgQ29uZGl0aW9uLFxuICBDb250ZXh0LFxuICBHcm91cE9wZXJhdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICBRdWVyeUNsYXVzZSxcbiAgUXVlcnlFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgU2VsZWN0U2VsZWN0b3IsXG4gIFNlcXVlbmNlLFxuICBTdGF0ZW1lbnQsXG4gIFN0YXRlbWVudEV4ZWN1dG9yLFxuICBWaWV3S2luZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgQ291Y2hEQk9wZXJhdG9yLFxuICBDb3VjaERCR3JvdXBPcGVyYXRvcixcbiAgQ291Y2hEQlF1ZXJ5TGltaXQsXG4gIE1hbmdvUXVlcnksXG4gIE1hbmdvT3BlcmF0b3IsXG4gIE1hbmdvU2VsZWN0b3IsXG4gIHRyYW5zbGF0ZU9wZXJhdG9ycyxcbiAgZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lLFxuICBnZW5lcmF0ZVZpZXdOYW1lLFxuICBmaW5kVmlld01ldGFkYXRhLFxuICBDb3VjaERCVmlld01ldGFkYXRhLFxuICBWaWV3UmVzcG9uc2UsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHRvQ2FtZWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBEQktleXMsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbnR5cGUgRmFicmljVmlld0Rlc2NyaXB0b3IgPSB7XG4gIGRkb2M6IHN0cmluZztcbiAgdmlldzogc3RyaW5nO1xuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufTtcblxudHlwZSBGYWJyaWNBZ2dyZWdhdGVJbmZvID1cbiAgfCB7XG4gICAgICBraW5kOiBWaWV3S2luZDtcbiAgICAgIG1ldGE6IENvdWNoREJWaWV3TWV0YWRhdGE7XG4gICAgICBkZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICAgIGNvdW50RGlzdGluY3Q/OiBib29sZWFuO1xuICAgIH1cbiAgfCB7XG4gICAgICBraW5kOiBcImF2Z1wiO1xuICAgICAgYXR0cmlidXRlOiBzdHJpbmc7XG4gICAgICBzdW1EZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICAgIGNvdW50RGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgfTtcblxuY29uc3QgZXNjYXBlUmVnRXhwID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpO1xuXG5mdW5jdGlvbiBuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXFx1MDAwMFwiO1xuICBjb25zdCBjaGFycyA9IEFycmF5LmZyb20odmFsdWUpO1xuICBmb3IgKGxldCBpID0gY2hhcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhcnNbaV0uY29kZVBvaW50QXQoMCk7XG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKGNvZGUgPCAweDEwZmZmZikge1xuICAgICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlICsgMSk7XG4gICAgICByZXR1cm4gY2hhcnMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHt2YWx1ZX1cXHUwMDAwYDtcbn1cblxuZnVuY3Rpb24gcHJlZml4UmFuZ2UocHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogcHJlZml4LFxuICAgIGVuZDogbmV4dExleGljb2dyYXBoaWNTdHJpbmcocHJlZml4KSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBNLFxuICBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICBSLFxuICBNYW5nb1F1ZXJ5XG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogRmFicmljQ2xpZW50QWRhcHRlciwgb3ZlcnJpZGVzPzogUGFydGlhbDxBZGFwdGVyRmxhZ3M+KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzcXVhc2goXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzcXVhc2hlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8TT4gfCB1bmRlZmluZWQgPSBzdXBlci5zcXVhc2goXG4gICAgICBjdHggYXMgbmV2ZXJcbiAgICApO1xuICAgIGlmICghc3F1YXNoZWQpIHJldHVybiBzcXVhc2hlZDtcblxuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXJhbXMsIGFyZ3MgfSA9IHNxdWFzaGVkO1xuICAgIGNvbnN0IHsgZGlyZWN0aW9uLCBsaW1pdCB9ID0gcGFyYW1zO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24sIGxpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlk6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6XG4gICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24sIGxpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgbWV0aG9kICR7bWV0aG9kfWApO1xuICAgIH1cblxuICAgIHJldHVybiBzcXVhc2hlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlUHJlcGFyZWQoXG4gICAgLi4uYXJnejogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmZyb21TZWxlY3RvciwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICBjb25zdCB7IG1ldGhvZCwgYXJncyB9ID0gdGhpcy5wcmVwYXJlZCBhcyBQcmVwYXJlZFN0YXRlbWVudDxhbnk+O1xuICAgIHJldHVybiByZXBvLnN0YXRlbWVudChtZXRob2QsIC4uLmFyZ3MsIC4uLmFyZ3opO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcHJlcGFyZShcbiAgICBjdHg/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFN0YXRlbWVudEV4ZWN1dG9yPE0sIFI+PiB7XG4gICAgY3R4ID1cbiAgICAgIGN0eCB8fFxuICAgICAgKGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBQZXJzaXN0ZW5jZUtleXMuUVVFUlksXG4gICAgICAgIHRoaXMub3ZlcnJpZGVzIHx8IHt9LFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgKSk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmlzU2ltcGxlUXVlcnkoKSAmJlxuICAgICAgKGN0eCBhcyBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPikuZ2V0KFwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllc1wiKVxuICAgICkge1xuICAgICAgY29uc3Qgc3F1YXNoZWQgPSB0aGlzLnNxdWFzaChjdHggYXMgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pO1xuICAgICAgaWYgKHNxdWFzaGVkKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZWQgPSBzcXVhc2hlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHt9IGFzIGFueTtcblxuICAgIGNvbnN0IHByZXBhcmVkOiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+ID0ge1xuICAgICAgY2xhc3M6IHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgYXJncyxcbiAgICAgIHBhcmFtcyxcbiAgICB9IGFzIGFueTtcblxuICAgIGNvbnN0IG1ldGhvZDogc3RyaW5nW10gPSBbUXVlcnlDbGF1c2UuRklORF9CWV07XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wcmVwYXJlQ29uZGl0aW9uKHRoaXMud2hlcmVDb25kaXRpb24sIGN0eCBhcyBuZXZlcik7XG4gICAgICBtZXRob2QucHVzaChwYXJzZWQubWV0aG9kKTtcbiAgICAgIGlmIChwYXJzZWQuYXJncyAmJiBwYXJzZWQuYXJncy5sZW5ndGgpXG4gICAgICAgIGFyZ3MucHVzaCguLi4ocGFyc2VkLmFyZ3MgYXMgKHN0cmluZyB8IG51bWJlcilbXSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIG1ldGhvZC5wdXNoKFxuICAgICAgICBRdWVyeUNsYXVzZS5TRUxFQ1QsXG4gICAgICAgIHRoaXMuc2VsZWN0U2VsZWN0b3Iuam9pbihgICR7UXVlcnlDbGF1c2UuQU5ELnRvTG93ZXJDYXNlKCl9IGApXG4gICAgICApO1xuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcnM/Lmxlbmd0aCkge1xuICAgICAgbWV0aG9kLnB1c2goUXVlcnlDbGF1c2UuT1JERVJfQlksIHRoaXMub3JkZXJCeVNlbGVjdG9yc1swXVswXSBhcyBzdHJpbmcpO1xuICAgICAgYXJncy5wdXNoKHRoaXMub3JkZXJCeVNlbGVjdG9yc1swXVsxXSBhcyBhbnkpO1xuICAgIH1cbiAgICBwcmVwYXJlZC5tZXRob2QgPSB0b0NhbWVsQ2FzZShtZXRob2Quam9pbihcIiBcIikpO1xuICAgIHByZXBhcmVkLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnByZXBhcmVkID0gcHJlcGFyZWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZCBmcm9tIENvdWNoREIvRmFicmljXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIHRoZSBJRCBmcm9tIGEgQ291Y2hEQiBkb2N1bWVudCBhbmQgcmV2ZXJ0cyBpdCB0byBhIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJvY2Vzc1JlY29yZChcbiAgICByOiBhbnksXG4gICAgcGtBdHRyOiBrZXlvZiBNLFxuICAgIHNlcXVlbmNlVHlwZTogXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWQsXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApIHtcbiAgICBpZiAocltDb3VjaERCS2V5cy5JRF0pIHtcbiAgICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcltDb3VjaERCS2V5cy5JRF0uc3BsaXQoQ291Y2hEQktleXMuU0VQQVJBVE9SKTtcbiAgICAgIGNvbnN0IGlkID0ga2V5QXJncy5qb2luKFwiX1wiKTtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KFxuICAgICAgICByLFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgICAgU2VxdWVuY2UucGFyc2VWYWx1ZShzZXF1ZW5jZVR5cGUsIGlkKSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeVxuICAgKiBAc3VtbWFyeSBTZW5kcyBhIHJhdyBNYW5nbyBxdWVyeSB0byBGYWJyaWMgYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0c1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgYWdncmVnYXRvciA9IChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGVJbmZvO1xuICAgIGlmICgocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlICYmIGFnZ3JlZ2F0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBZ2dyZWdhdGU8Uj4oYWdncmVnYXRvciwgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KFxuICAgICAgcmF3SW5wdXQsXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBjdHhcbiAgICApO1xuXG4gICAgY29uc3QgcGtBdHRyID0gTW9kZWwucGsodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS5nZXQoXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuSUQsIHBrQXR0ciBhcyBzdHJpbmcpXG4gICAgKT8udHlwZTtcblxuICAgIGlmICghdGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIHBrQXR0ciwgdHlwZSwgY3R4KSkgYXMgUjtcbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkKCk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCBhZ2dyZWdhdGVRdWVyeSA9IHRoaXMuYnVpbGRBZ2dyZWdhdGVRdWVyeSgpO1xuICAgIGlmIChhZ2dyZWdhdGVRdWVyeSkgcmV0dXJuIGFnZ3JlZ2F0ZVF1ZXJ5O1xuICAgIGNvbnN0IHNlbGVjdG9yczogTWFuZ29TZWxlY3RvciA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHNlbGVjdG9ycyB9O1xuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKSBxdWVyeS5maWVsZHMgPSB0aGlzLnNlbGVjdFNlbGVjdG9yIGFzIHN0cmluZ1tdO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbjogTWFuZ29TZWxlY3RvciA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIENvbmRpdGlvbi5hbmQoXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBDb25kaXRpb24uYXR0cmlidXRlPE0+KENvdWNoREJLZXlzLlRBQkxFIGFzIGtleW9mIE0pLmVxKFxuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgc2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKSBhcyBNYW5nb09wZXJhdG9yW107XG4gICAgICBpZiAoXG4gICAgICAgIHNlbGVjdG9yS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhDb3VjaERCR3JvdXBPcGVyYXRvcikuaW5kZXhPZihzZWxlY3RvcktleXNbMF0pICE9PSAtMVxuICAgICAgKVxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yS2V5c1swXSkge1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gYXMgTWFuZ29TZWxlY3RvclxuICAgICAgICAgICAgICApLnJlZHVjZSgoYWNjdW06IE1hbmdvU2VsZWN0b3JbXSwgdmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVG9vIG1hbnkga2V5cyBpbiBxdWVyeSBzZWxlY3Rvci4gc2hvdWxkIGJlIG9uZVwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQpXG4gICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLih2YWxba10gYXMgYW55W10pKTtcbiAgICAgICAgICAgICAgICBlbHNlIGFjY3VtLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICAgIH0sIFtdKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IGNvbmRpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuT1I6IHtcbiAgICAgICAgICAgIGNvbnN0IHM6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgIHNbQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhxdWVyeS5zZWxlY3RvcikubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXJ5LnNlbGVjdG9yW2tleV0pXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBmb3IgKGNvbnN0IFtzZWxlY3RvcktleSwgZGlyZWN0aW9uXSBvZiB0aGlzLm9yZGVyQnlTZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcktleSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+ID0ge307XG4gICAgICAgIHJlY1tzZWxlY3Rvcl0gPSBkaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb247XG4gICAgICAgIChxdWVyeS5zb3J0IGFzIFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPltdKS5wdXNoKHJlYyk7XG4gICAgICAgIGlmICghcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdKSB7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHRoaXMubGltaXRTZWxlY3RvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGNvdWNoZGIgbGltaXQgb2YgJHtDb3VjaERCUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcXVlcnkubGltaXQgPSBDb3VjaERCUXVlcnlMaW1pdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcikgcXVlcnkuc2tpcCA9IHRoaXMub2Zmc2V0U2VsZWN0b3I7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3Igc3RydWN0dXJlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBNYW5nb1F1ZXJ5IHtcbiAgICBmdW5jdGlvbiBtZXJnZShcbiAgICAgIG9wOiBNYW5nb09wZXJhdG9yLFxuICAgICAgb2JqMTogTWFuZ29TZWxlY3RvcixcbiAgICAgIG9iajI6IE1hbmdvU2VsZWN0b3JcbiAgICApOiBNYW5nb1F1ZXJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHt9IGFzIE1hbmdvU2VsZWN0b3IgfTtcbiAgICAgIHJlc3VsdC5zZWxlY3RvcltvcF0gPSBbb2JqMSwgb2JqMl07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5TVEFSVFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgcmFuZ2UgPSBwcmVmaXhSYW5nZShjb21wYXJpc29uKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJfRVFdID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5TTUFMTEVSXSA9IHJhbmdlLmVuZDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5FTkRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge1xuICAgICAgICBbQ291Y2hEQk9wZXJhdG9yLlJFR0VYUF06IGAke2VzY2FwZVJlZ0V4cChjb21wYXJpc29uKX0kYCxcbiAgICAgIH0gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5CRVRXRUVOKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cjEgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbXBhcmlzb24pIHx8IGNvbXBhcmlzb24ubGVuZ3RoICE9PSAyKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkJFVFdFRU4gb3BlcmF0b3IgcmVxdWlyZXMgW21pbiwgbWF4XSBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbXBhcmlzb247XG4gICAgICBjb25zdCBvcEJldHdlZW46IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BCZXR3ZWVuW2F0dHJdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5CSUdHRVJfRVEpXG4gICAgICBdID0gbWluO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLlNNQUxMRVJfRVEpXG4gICAgICBdID0gbWF4O1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wQmV0d2VlbiB9O1xuICAgIH1cblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhbiBhZ2dyZWdhdGUgcXVlcnkgaWYgYWdncmVnYXRpb24gaXMgcmVxdWVzdGVkXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBmb3IgYWdncmVnYXRlIG9wZXJhdGlvbnMgYW5kIHJldHVybnMgYSBzcGVjaWFsIE1hbmdvUXVlcnkgZm9yIHRoZW1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZ2dyZWdhdGVRdWVyeSgpOiBNYW5nb1F1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmF2Z1NlbGVjdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBTdHJpbmcodGhpcy5hdmdTZWxlY3Rvcik7XG4gICAgICBjb25zdCBzdW1JbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwic3VtXCIsIGF0dHJpYnV0ZSk7XG4gICAgICBjb25zdCBjb3VudEluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJjb3VudFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKCFzdW1JbmZvIHx8ICFjb3VudEluZm8pXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgIGBBdmcgb3BlcmF0aW9uIHJlcXVpcmVzIHN1bSBhbmQgY291bnQgdmlld3MgZm9yIGF0dHJpYnV0ZSAke2F0dHJpYnV0ZX1gXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeSh7XG4gICAgICAgIGtpbmQ6IFwiYXZnXCIsXG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgc3VtRGVzY3JpcHRvcjogc3VtSW5mby5kZXNjcmlwdG9yLFxuICAgICAgICBjb3VudERlc2NyaXB0b3I6IGNvdW50SW5mby5kZXNjcmlwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID1cbiAgICAgICAgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgPT0gbnVsbFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBTdHJpbmcodGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IpO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImRpc3RpbmN0XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbmZvLmNvdW50RGlzdGluY3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yVXNlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICEhdGhpcy5taW5TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLm1heFNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuc3VtU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5kaXN0aW5jdFNlbGVjdG9yO1xuXG4gICAgY29uc3QgYWdncmVnYXRvckNoZWNrczogQXJyYXk8W1ZpZXdLaW5kLCBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW1xuICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICh0aGlzLmNvdW50U2VsZWN0b3IgPz8gdW5kZWZpbmVkKSBhcyBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZCxcbiAgICAgIF0sXG4gICAgICBbXCJtYXhcIiwgdGhpcy5tYXhTZWxlY3Rvcl0sXG4gICAgICBbXCJtaW5cIiwgdGhpcy5taW5TZWxlY3Rvcl0sXG4gICAgICBbXCJzdW1cIiwgdGhpcy5zdW1TZWxlY3Rvcl0sXG4gICAgICBbXCJkaXN0aW5jdFwiLCB0aGlzLmRpc3RpbmN0U2VsZWN0b3JdLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IFtraW5kLCBzZWxlY3Rvcl0gb2YgYWdncmVnYXRvckNoZWNrcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gc2VsZWN0b3IgPyBTdHJpbmcoc2VsZWN0b3IpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihraW5kLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgIH1cblxuICAgIGlmIChhZ2dyZWdhdG9yVXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIGBObyBDb3VjaERCIHZpZXcgbWV0YWRhdGEgZm91bmQgZm9yIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICAgICl9IGFnZ3JlZ2F0b3JgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yIGZvciBhIHZpZXctYmFzZWQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcbiAgICBraW5kOiBWaWV3S2luZCxcbiAgICBhdHRyaWJ1dGU/OiBzdHJpbmdcbiAgKTogRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGFzID0gZmluZFZpZXdNZXRhZGF0YSh0aGlzLmZyb21TZWxlY3Rvciwga2luZCwgYXR0cmlidXRlKTtcbiAgICBpZiAoIW1ldGFzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhID0gbWV0YXNbMF07XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGdlbmVyYXRlVmlld05hbWUodGFibGVOYW1lLCBtZXRhLmF0dHJpYnV0ZSwga2luZCwgbWV0YSk7XG4gICAgY29uc3QgZGRvYyA9IG1ldGEuZGRvYyB8fCBnZW5lcmF0ZURlc2lnbkRvY05hbWUodGFibGVOYW1lLCB2aWV3TmFtZSk7XG4gICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIHJlZHVjZTogbWV0YS5yZWR1Y2UgIT09IHVuZGVmaW5lZCA/IHRydWUgOiAhbWV0YS5yZXR1cm5Eb2NzLFxuICAgIH07XG4gICAgaWYgKGtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCBraW5kID09PSBcImdyb3VwQnlcIikgb3B0aW9ucy5ncm91cCA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQsXG4gICAgICBtZXRhLFxuICAgICAgZGVzY3JpcHRvcjoge1xuICAgICAgICBkZG9jLFxuICAgICAgICB2aWV3OiB2aWV3TmFtZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgc3BlY2lhbCBhZ2dyZWdhdGUgTWFuZ29RdWVyeSBtYXJrZXJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlUXVlcnkoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9yOiB7fSxcbiAgICAgIGFnZ3JlZ2F0ZTogdHJ1ZSxcbiAgICAgIGFnZ3JlZ2F0ZUluZm86IGluZm8sXG4gICAgfSBhcyBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBjYXN0IHRvIEZhYnJpY0NsaWVudEFkYXB0ZXIgZm9yIHZpZXcgYWNjZXNzXG4gICAqL1xuICBwcml2YXRlIGdldEZhYnJpY0FkYXB0ZXIoKTogRmFicmljQ2xpZW50QWRhcHRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhbiBhZ2dyZWdhdGUgcXVlcnkgdmlhIGFkYXB0ZXIncyB2aWV3IG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWdncmVnYXRlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoIXRoaXMuaXNWaWV3QWdncmVnYXRlKGluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVBdmVyYWdlPFI+KGluZm8sIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLmRkb2MsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLnZpZXcsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLm9wdGlvbnMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oaW5mbywgcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGF2ZXJhZ2UgY2FsY3VsYXRpb24gZnJvbSBzdW0gYW5kIGNvdW50IHZpZXdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUF2ZXJhZ2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmIChpbmZvLmtpbmQgIT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkF2ZXJhZ2UgZGVzY3JpcHRvciBpcyBub3QgdmFsaWRcIik7XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IFtzdW1EZXNjLCBjb3VudERlc2NdID0gW2luZm8uc3VtRGVzY3JpcHRvciwgaW5mby5jb3VudERlc2NyaXB0b3JdO1xuICAgIGNvbnN0IFtzdW1SZXNwb25zZSwgY291bnRSZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgc3VtRGVzYy5kZG9jLFxuICAgICAgICBzdW1EZXNjLnZpZXcsXG4gICAgICAgIHN1bURlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIGNvdW50RGVzYy5kZG9jLFxuICAgICAgICBjb3VudERlc2MudmlldyxcbiAgICAgICAgY291bnREZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICBdKTtcbiAgICBjb25zdCBzdW0gPSBzdW1SZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgY29uc3QgY291bnQgPSBjb3VudFJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBpZiAoIWNvdW50KSByZXR1cm4gMCBhcyB1bmtub3duIGFzIFI7XG4gICAgcmV0dXJuIChzdW0gLyBjb3VudCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgdGhlIHZpZXcgcmVzcG9uc2UgYmFzZWQgb24gYWdncmVnYXRlIGtpbmRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIHJlc3BvbnNlOiBWaWV3UmVzcG9uc2VcbiAgKTogUiB7XG4gICAgaWYgKGluZm8ua2luZCA9PT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBcIkF2ZXJhZ2UgcmVzdWx0cyBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgcHJvY2Vzc2luZyByb3dzXCJcbiAgICAgICk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3BvbnNlLnJvd3MgfHwgW107XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCBtZXRhID0gdmlld0luZm8ubWV0YTtcbiAgICBpZiAodmlld0luZm8uY291bnREaXN0aW5jdCkge1xuICAgICAgcmV0dXJuIChyb3dzLmxlbmd0aCB8fCAwKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICh2aWV3SW5mby5raW5kID09PSBcImRpc3RpbmN0XCIgfHwgdmlld0luZm8ua2luZCA9PT0gXCJncm91cEJ5XCIpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cua2V5ID8/IHJvdy52YWx1ZSkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAobWV0YS5yZXR1cm5Eb2NzKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LnZhbHVlID8/IHJvdy5kb2MgPz8gcm93KSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAodmlld0luZm8ua2luZCA9PT0gXCJjb3VudFwiID8gMCA6IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIChyb3dzWzBdLnZhbHVlID8/IHJvd3NbMF0ua2V5ID8/IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbmZvIGlzIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGVcbiAgICovXG4gIHByaXZhdGUgaXNWaWV3QWdncmVnYXRlKFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogaW5mbyBpcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4ge1xuICAgIHJldHVybiBpbmZvLmtpbmQgIT09IFwiYXZnXCI7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGFnaW5hdG9yLFxuICBQcmVwYXJlZFN0YXRlbWVudCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFnaW5hdG9yPFxuICBNLFxuICBNW10sXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBib29rbWFyaz86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgIHF1ZXJ5OiBNYW5nb1F1ZXJ5IHwgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFJhdyBxdWVyeSBhY2Nlc3MgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLiBvbmx5IHByZXBhcmVkIHN0YXRlbWVudHMgYXJlIG5hdGl2ZWx5IGF2YWlsYWJsZWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcGFnZShcbiAgICBwYWdlOiBudW1iZXIgPSAxLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHN1cGVyLnBhZ2UocGFnZSwgLi4uYXJncyk7IC8vIHRoaXMgd2lsbCBmYWlsIGZvciBub24tcHJlcGFyZWQgc3RhdGVtZW50c1xuICB9XG59XG4iLCJpbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgdHlwZSBNYW5nb1F1ZXJ5LFxuICB0eXBlIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCAqIGFzIGdycGMgZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7XG4gIE1vZGVsLFxuICB0eXBlIE1vZGVsQ29uc3RydWN0b3IsXG4gIHR5cGUgU2VyaWFsaXplcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVidWcsIGZpbmFsLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICB0eXBlIFBlZXJDb25maWcsXG4gIHR5cGUgU2VncmVnYXRlZE1vZGVsLFxuICB0eXBlIE1zcERldGFpbHMsXG59IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNvbm5lY3QsXG4gIHR5cGUgQ29ubmVjdE9wdGlvbnMsXG4gIEdhdGV3YXksXG4gIE5ldHdvcmssXG4gIFByb3Bvc2FsT3B0aW9ucyxcbiAgQ29udHJhY3QgYXMgQ29udHJha3QsXG4gIHR5cGUgU2lnbmVyLFxuICBHYXRld2F5RXJyb3IsXG4gIEVuZG9yc2VFcnJvcixcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgR2F0ZXdheSBhcyBMZWdhY3lHYXRld2F5LCBXYWxsZXRzIH0gZnJvbSBcImZhYnJpYy1uZXR3b3JrXCI7XG5pbXBvcnQgdHlwZSB7IEVuZG9yc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7XG4gIGdldElkZW50aXR5LFxuICBnZXRTaWduZXIsXG4gIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50LFxuICByZWFkRmlsZSBhcyByZWFkRnNGaWxlLFxufSBmcm9tIFwiLi9mYWJyaWMtZnNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgdHlwZSBQcmltYXJ5S2V5VHlwZSxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIEFkYXB0ZXIsXG4gIHR5cGUgQWRhcHRlckZsYWdzLFxuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE1pZ3JhdGlvbkVycm9yLFxuICBPYnNlcnZlckVycm9yLFxuICBQYWdpbmdFcnJvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBRdWVyeUVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBTdGF0ZW1lbnQsXG4gIHR5cGUgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFBhZ2luYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBDb250ZXh0dWFsQXJncyxcbiAgdHlwZSBQcmVwYXJlZE1vZGVsLFxuICBBbGxPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0ZsYXZvdXIgfSBmcm9tIFwiLi4vc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2xpZW50U2VyaWFsaXplciB9IGZyb20gXCIuLi9zaGFyZWQvQ2xpZW50U2VyaWFsaXplclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RGlzcGF0Y2ggfSBmcm9tIFwiLi9GYWJyaWNDbGllbnREaXNwYXRjaFwiO1xuLy8gaW1wb3J0IHsgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbSB9IGZyb20gXCIuL2ZhYnJpYy1oc21cIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFN0YXRlbWVudCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFN0YXRlbWVudFwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50UGFnaW5hdG9yIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgRW5kb3JzZW1lbnRFcnJvcixcbiAgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcixcbiAgTXZjY1JlYWRDb25mbGljdEVycm9yLFxuICBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IsXG4gIFRyYW5zYWN0aW9uVGltZW91dEVycm9yLFxufSBmcm9tIFwiLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuL2NyeXB0b1wiO1xuaW1wb3J0IHsgZXh0cmFjdElkcyB9IGZyb20gXCIuL2lkcy9pZC1leHRyYWN0aW9uXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi9zaGFyZWQvaW5kZXhcIjtcblxudHlwZSBMZWdhY3lQZWVyVGFyZ2V0ID0ge1xuICBtc3BJZDogc3RyaW5nO1xuICBwZWVyRW5kcG9pbnQ6IHN0cmluZztcbiAgcGVlckhvc3RBbGlhcz86IHN0cmluZztcbiAgdGxzQ2VydD86IHN0cmluZyB8IEJ1ZmZlcjtcbn07XG5cbnR5cGUgTGVnYWN5UGVlcldpdGhOYW1lID0gTGVnYWN5UGVlclRhcmdldCAmIHsgbmFtZTogc3RyaW5nIH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzXG4gKiBAc3VtbWFyeSBUaGUgRmFicmljQWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyIHRvIHByb3ZpZGUgYSBzZWFtbGVzcyBpbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzLlxuICogSXQgaGFuZGxlcyBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIHRyYW5zYWN0aW9uIHN1Ym1pc3Npb24sIGFuZCBDUlVEIG9wZXJhdGlvbnMgYWdhaW5zdCBGYWJyaWMgY2hhaW5jb2RlLlxuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHRlbXBsYXRlIEZhYnJpY0ZsYWdzIC0gRmxhZ3Mgc3BlY2lmaWMgdG8gRmFicmljIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBDb250ZXh0PEZhYnJpY0ZsYWdzPiAtIENvbnRleHQgdHlwZSBjb250YWluaW5nIEZhYnJpYy1zcGVjaWZpYyBmbGFnc1xuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGFsaWFzIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gKiBjb25zdCBjb25maWc6IFBlZXJDb25maWcgPSB7XG4gKiAgIG1zcElkOiAnT3JnMU1TUCcsXG4gKiAgIHBlZXJFbmRwb2ludDogJ2xvY2FsaG9zdDo3MDUxJyxcbiAqICAgY2hhbm5lbE5hbWU6ICdteWNoYW5uZWwnLFxuICogICBjaGFpbmNvZGVOYW1lOiAnbXljYycsXG4gKiAgIGNvbnRyYWN0TmFtZTogJ215Y29udHJhY3QnLFxuICogICB0bHNDZXJ0UGF0aDogJy9wYXRoL3RvL3Rscy9jZXJ0JyxcbiAqICAgY2VydERpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9jZXJ0L2RpcicsXG4gKiAgIGtleURpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9rZXkvZGlyJ1xuICogfTtcbiAqXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IEZhYnJpY0FkYXB0ZXIoY29uZmlnLCAnb3JnMS1hZGFwdGVyJyk7XG4gKlxuICogLy8gVXNlIHRoZSBhZGFwdGVyIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGFwdGVyLnJlYWQoJ3VzZXJzJywgJ3VzZXIxJywgbXlTZXJpYWxpemVyKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwsIHRyYW5zaWVudCwgc2VyaWFsaXplcilcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHN1Ym1pdFRyYW5zYWN0aW9uKE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbc2VyaWFsaXplZE1vZGVsXSwgdHJhbnNpZW50KVxuICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gKiAgIEdhdGV3YXktPj5OZXR3b3JrOiBnZXROZXR3b3JrKGNoYW5uZWxOYW1lKVxuICogICBOZXR3b3JrLT4+Q29udHJhY3Q6IGdldENvbnRyYWN0KGNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSlcbiAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IGRlY29kZShyZXN1bHQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRlY29kZWRSZXN1bHQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2xpZW50OiBkZXNlcmlhbGl6ZWRSZXN1bHRcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBQZWVyQ29uZmlnLFxuICBDbGllbnQsXG4gIE1hbmdvUXVlcnksXG4gIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgdGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIFVpbnQ4QXJyYXkgdG8gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICBwcml2YXRlIHN0YXRpYyBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXIoKTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIGxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0NsaWVudEFkYXB0ZXIuc2VyaWFsaXplcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQWRhcHRlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBhZGFwdGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBDb25maWd1cmF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGVlckNvbmZpZywgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRGYWJyaWNDbGllbnRGbGFncywgY29uZmlnKSxcbiAgICAgIEZhYnJpY0ZsYXZvdXIsXG4gICAgICBhbGlhc1xuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEFkYXB0ZXJGbGFncz5cbiAgKTogU3RhdGVtZW50PE0sIEZhYnJpY0NsaWVudEFkYXB0ZXIsIGFueSwgTWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50U3RhdGVtZW50KHRoaXMsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsPihcbiAgICBxdWVyeTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IE1hbmdvUXVlcnksXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQYWdpbmF0b3I8TSwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRQYWdpbmF0b3IodGhpcywgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZhYnJpY0NsaWVudEZsYWdzPiB7XG4gICAgY29uc3QgbWVyZ2VkRmxhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZywgZmxhZ3MpO1xuICAgIGNvbnN0IGYgPSBPYmplY3QuYXNzaWduKFxuICAgICAgYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgbWVyZ2VkRmxhZ3MsIC4uLmFyZ3MpXG4gICAgKTtcbiAgICByZXR1cm4gZjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNvbnRleHQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBBbGxPcGVyYXRpb25LZXlzLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgQ29uc3RydWN0b3I8TT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxhbnk+PlxuICApOiBQcm9taXNlPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY29udGV4dCk7XG4gICAgbG9nLnNpbGx5KFxuICAgICAgYGNyZWF0aW5nIG5ldyBjb250ZXh0IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uIG9uICR7bW9kZWwgPyAoQXJyYXkuaXNBcnJheShtb2RlbCkgPyBtb2RlbC5tYXAoKG0pID0+IE1vZGVsLnRhYmxlTmFtZShtKSkgOiBNb2RlbC50YWJsZU5hbWUobW9kZWwpKSA6IFwibm9cIn0gdGFibGUgJHtvdmVycmlkZXMgJiYgT2JqZWN0LmtleXMob3ZlcnJpZGVzKSA/IE9iamVjdC5rZXlzKG92ZXJyaWRlcykubGVuZ3RoIDogXCJub1wifSB3aXRoIGZsYWcgb3ZlcnJpZGVzYFxuICAgICk7XG4gICAgbGV0IGN0eCA9IGFyZ3MucG9wKCk7XG4gICAgaWYgKHR5cGVvZiBjdHggIT09IFwidW5kZWZpbmVkXCIgJiYgIShjdHggaW5zdGFuY2VvZiBDb250ZXh0KSkge1xuICAgICAgYXJncy5wdXNoKGN0eCk7XG4gICAgICBjdHggPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGVzID0gY3R4XG4gICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGN0eC50b092ZXJyaWRlcygpLCBvdmVycmlkZXMpXG4gICAgICA6IG92ZXJyaWRlcztcbiAgICBjb25zdCBmbGFncyA9IGF3YWl0IHRoaXMuZmxhZ3MoXG4gICAgICB0eXBlb2Ygb3BlcmF0aW9uID09PSBcInN0cmluZ1wiID8gb3BlcmF0aW9uIDogb3BlcmF0aW9uLm5hbWUsXG4gICAgICBtb2RlbCxcbiAgICAgIG92ZXJyaWRlcyBhcyBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICAgIC4uLlsuLi5hcmdzLCBjdHhdLmZpbHRlcihCb29sZWFuKVxuICAgICk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBpZiAoIShjdHggaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgICAgICAuLi5jdHhbXCJjYWNoZVwiXSxcbiAgICAgICAgICAuLi5mbGFncyxcbiAgICAgICAgICBwYXJlbnRDb250ZXh0OiBjdHgsXG4gICAgICAgIH0pIGFzIGFueTtcbiAgICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICAgIGNoaWxkQ29udGV4dHM6IFtcbiAgICAgICAgICAgIC4uLihjdHguZ2V0T3JVbmRlZmluZWQoXCJjaGlsZENvbnRleHRzXCIpIHx8IFtdKSxcbiAgICAgICAgICAgIG5ld0N0eCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0N0eDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRPcCA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IGN0eC5nZXRPclVuZGVmaW5lZChcImFmZmVjdGVkVGFibGVzXCIpO1xuICAgICAgaWYgKFxuICAgICAgICAhY3VycmVudE9wIHx8XG4gICAgICAgIGN1cnJlbnRPcCAhPT0gb3BlcmF0aW9uIHx8XG4gICAgICAgIChtb2RlbCAmJiBtb2RlbCAhPT0gY3VycmVudE1vZGVsKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgICAgICAuLi5jdHhbXCJjYWNoZVwiXSxcbiAgICAgICAgICAuLi5mbGFncyxcbiAgICAgICAgICBwYXJlbnRDb250ZXh0OiBjdHgsXG4gICAgICAgIH0pIGFzIGFueTtcblxuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN0eC5hY2N1bXVsYXRlKGZsYWdzKSBhcyBhbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgIC4uLmZsYWdzLFxuICAgIH0pIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVjb2RlcyBhIFVpbnQ4QXJyYXkgdG8gYSBzdHJpbmdcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYmluYXJ5IGRhdGEgcmVjZWl2ZWQgZnJvbSBGYWJyaWMgdG8gYSBzdHJpbmcgdXNpbmcgVVRGLTggZW5jb2RpbmdcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhIC0gVGhlIGJpbmFyeSBkYXRhIHRvIGRlY29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZWNvZGVkIHN0cmluZ1xuICAgKi9cbiAgZGVjb2RlKGRhdGE6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxcbiAgICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgICAgIGFueSxcbiAgICAgIEFkYXB0ZXI8UGVlckNvbmZpZywgQ2xpZW50LCBNYW5nb1F1ZXJ5LCBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgICA+LFxuICA+KCk6IENvbnN0cnVjdG9yPFI+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50UmVwb3NpdG9yeSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFI+O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBbQ29uc3RydWN0b3I8TT4sIFByaW1hcnlLZXlUeXBlLCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5hbnlbXSwgQ29udGV4dF0ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJldHVybiBbY2xhenosIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSByZWNvcmRzIGZvciBjcmVhdGlvblxuICAgKiBAc3VtbWFyeSBBZGRzIG5lY2Vzc2FyeSBDb3VjaERCIGZpZWxkcyB0byBtdWx0aXBsZSByZWNvcmRzIGJlZm9yZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGlkcyAtIFRoZSBJRHMgb2YgdGhlIHJlY29yZHNcbiAgICogQHBhcmFtIG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gcHJlcGFyZVxuICAgKiBAcmV0dXJuIEEgdHVwbGUgY29udGFpbmluZyB0aGUgdGFibGVOYW1lLCBpZHMsIGFuZCBwcmVwYXJlZCByZWNvcmRzXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGlkcyBhbmQgbW9kZWxzIGFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKGlkLCBjb3VudCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsc1tjb3VudF0pO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUFsbFByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVBbGxQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWRzLCByZWNvcmRzLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIC8vSEVSRSFcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB0cmFuc2llbnQgPSBjdHhBcmdzLnNoaWZ0KCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy5jcmVhdGVBbGxcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cuaW5mbyhgYWRkaW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICBbXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0pID0+IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobSwgY2xhenoubmFtZSkpXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgdHJhbnNpZW50UGF5bG9hZCBhcyBhbnksXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuXG4gICAgbGV0IHJlczogUmVjb3JkPHN0cmluZywgYW55PltdO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBjdHgsXG4gICAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICAgIHJlc1swXVtNb2RlbC5wayhjbGF6eikgYXMgc3RyaW5nXSB8fCBpZHNbMF1cbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgICBNb2RlbC5tZXJnZShPYmplY3QuYXNzaWduKHt9LCBtIGFzIGFueSwgdHJhbnNpZW50W2ldIHx8IHt9KSwgcmVzW2ldKVxuICAgICAgICAgICksXG4gICAgICAgICAgaWRzXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byByZWFkIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gcmVhZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJlYWRBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLmluZm8oYHJlYWRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdXBkYXRlIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzXG4gICAqIEBwYXJhbSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IG1vZGVscyAtIEFycmF5IG9mIHVwZGF0ZWQgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLnVwZGF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgdXBkYXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgIFtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKSlcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWRzWzBdKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnRbaV0gfHwge30pLCByZXNbaV0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50Pn0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge1NlcmlhbGl6ZXI8YW55Pn0gc2VyaWFsaXplciAtIFNlcmlhbGl6ZXIgZm9yIHRoZSBtb2RlbCBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuZGVsZXRlQWxsKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZHNbMF1cbiAgICApO1xuICAgIGlmIChzaG91bGRIeWRyYXRlKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJlYWRBbGwoY2xhenosIGlkcywgLi4uY3R4QXJncyk7XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYGRlbGV0aW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoaWRzKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2hvdWxkSHlkcmF0ZVxuICAgICAgICA/IHJlc3VsdFxuICAgICAgICA6IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzKSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBwZXJzaXN0ZW5jZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIGludG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRhdGFiYXNlIHN0b3JhZ2UsXG4gICAqIGhhbmRsaW5nIGNvbHVtbiBtYXBwaW5nIGFuZCBzZXBhcmF0aW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIGRhdGFcbiAgICovXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogU2VncmVnYXRlZE1vZGVsPE0+ICYgUHJlcGFyZWRNb2RlbCB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5wcmVwYXJlKTtcbiAgICBjb25zdCBzcGxpdCA9IE1vZGVsLnNlZ3JlZ2F0ZShtb2RlbCk7XG4gICAgaWYgKChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0pIHtcbiAgICAgIGxvZy5zaWxseShcbiAgICAgICAgYFBhc3NpbmcgYWxvbmcgcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7KG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNwbGl0Lm1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG1pcnJvck1ldGEgPSBNb2RlbC5taXJyb3JlZEF0KG1vZGVsKTtcbiAgICBpZiAobWlycm9yTWV0YSkge1xuICAgICAgY29uc3QgbWlycm9yTXNwID0gbWlycm9yTWV0YS5tc3BJZDtcbiAgICAgIGlmICghbWlycm9yTXNwKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gbWlycm9yIE1TUCBjb3VsZCBiZSBmb3VuZGApO1xuICAgICAgbGV0IG1zcHMgPSB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSB8fCBbXTtcbiAgICAgIG1zcHMgPSBBcnJheS5pc0FycmF5KG1zcHMpID8gbXNwcyA6IFttc3BzXTtcbiAgICAgIGNvbnN0IG1lcmdlZCA9IFsuLi5uZXcgU2V0KFsuLi5tc3BzLCBtaXJyb3JNc3BdKV07XG4gICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgIGVuZG9yc2luZ09yZ3M6IG1lcmdlZCxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogbWVyZ2VkLFxuICAgICAgICBsZWdhY3k6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkOiBzcGxpdC5tb2RlbCxcbiAgICAgIG1vZGVsOiBzcGxpdC5tb2RlbCxcbiAgICAgIGlkOiBtb2RlbFtNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPildIGFzIHN0cmluZyxcbiAgICAgIHRyYW5zaWVudDogc3BsaXQudHJhbnNpZW50LFxuICAgICAgcHJpdmF0ZXM6IHNwbGl0LnByaXZhdGVzLFxuICAgICAgc2hhcmVkOiBzcGxpdC5zaGFyZWQsXG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IE0ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmV2ZXJ0KTtcbiAgICBpZiAoXG4gICAgICB0cmFuc2llbnQgJiZcbiAgICAgIHRoaXMuc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgICAgIGN0eCxcbiAgICAgICAgY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gdHlwZW9mIHYgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIC5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKGtleSBpbiBvYmogJiYgKG9iaiBhcyBhbnkpW2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgICBgb3ZlcndyaXRpbmcgZXhpc3RpbmcgJHtrZXl9LiBpZiB0aGlzIGlzIG5vdCBhIGRlZmF1bHQgdmFsdWUsIHRoaXMgbWF5IHBvc2UgYSBwcm9ibGVtYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAob2JqIGFzIE0pW2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPikob2JqKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgb3BlcmF0aW9uPzogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghY3R4KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBjaGlsZFJlYnVpbGQgPVxuICAgICAgdHlwZW9mIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4oXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoY2hpbGRSZWJ1aWxkKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCByZXNvbHZlZE9wID0gdGhpcy5yZXNvbHZlT3BlcmF0aW9uKGN0eCwgb3BlcmF0aW9uKTtcbiAgICBpZiAoIXJlc29sdmVkT3ApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBvcCA9IHJlc29sdmVkT3AudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoXG4gICAgICBvcC5pbmNsdWRlcyhcInJlYWRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwiZmluZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJxdWVyeVwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJzdGF0ZW1lbnRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwicGFnZVwiKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVPcGVyYXRpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAob3BlcmF0aW9uKSByZXR1cm4gb3BlcmF0aW9uO1xuICAgIGlmICh0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcIm9wZXJhdGlvblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBoYXNUcmFuc2llbnQ6IGJvb2xlYW4sXG4gICAgaWQ/OiBQcmltYXJ5S2V5VHlwZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWhhc1RyYW5zaWVudCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICAgIGNvbnN0IGNvbXBvc2VkID0gTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcbiAgICBjb25zdCBnZW5lcmF0ZWQgPSBNb2RlbC5nZW5lcmF0ZWQoY2xhenosIHBrKTtcbiAgICBjb25zdCBoYXNJZCA9IGlkICE9PSB1bmRlZmluZWQgJiYgaWQgIT09IG51bGw7XG4gICAgaWYgKCFoYXNJZCAmJiBjb21wb3NlZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFoYXNJZCAmJiBnZW5lcmF0ZWQpIHtcbiAgICAgIGN0eC5sb2dnZXIud2FybihcbiAgICAgICAgYENhbm5vdCByZWZyZXNoIHJlY29yZCB3aXRoIHByaXZhdGUgZ2VuZXJhdGVkIHByaW1hcnkga2V5YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0lkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRpcmVjdCA9XG4gICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIHx8XG4gICAgICAoY3R4LmdldE9yVW5kZWZpbmVkKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCk7XG4gICAgaWYgKGRpcmVjdCAmJiBkaXJlY3QubGVuZ3RoKSByZXR1cm4gZGlyZWN0O1xuICAgIHJldHVybiAoXG4gICAgICAoY3R4LmdldEZyb21DaGlsZHJlbihcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpIHx8XG4gICAgICAoY3R4LmdldEZyb21DaGlsZHJlbihcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29uZmlnLmFsbG93R2F0ZXdheU92ZXJyaWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gY3JlYXRlIGEgcmVjb3JkIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBvdmVycmlkZSBhc3luYyBjcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy5jcmVhdGVcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLnZlcmJvc2UoYGFkZGluZyBlbnRyeSB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBbdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCwgY2xhenoubmFtZSldLFxuICAgICAgdHJhbnNpZW50UGF5bG9hZCBhcyBhbnksXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwsIHRyYW5zaWVudCB8fCB7fSksXG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjbGF6elxuICAgICAgICAgICksXG4gICAgICAgICAgaWRcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkO1xuICB9XG5cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgaGVhbHRoY2hlY2s8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cudmVyYm9zZShgcmVhZGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIFwiaGVhbHRoY2hlY2tcIixcbiAgICAgIFtdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byByZWFkIGEgcmVjb3JkIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgcmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICB9XG5cbiAgdXBkYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZVByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAvLyByZWNvcmRbQ291Y2hEQktleXMuSURdID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgdXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICB0cmFuc2llbnQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMudXBkYXRlXG4gICAgKTtcbiAgICBsb2cuaW5mbyhgQ0xJRU5UIFVQREFURSBjbGFzcyA6ICR7dHlwZW9mIGNsYXp6fWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLnZlcmJvc2UoYHVwZGF0aW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lIHx8IGNsYXp6KV0sIC8vIFRPRE8gc2hvdWxkIGJlIHJlY2V2aW5nIGNsYXNzIGJ1dCBpcyByZWNlaXZpbmcgc3RyaW5nXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBkZWxldGUgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyIHRvIGRlbGV0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuZGVsZXRlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgTW9kZWwuaXNUcmFuc2llbnQoY2xhenopIHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHNob3VsZEh5ZHJhdGUgPSB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgY2xhenosXG4gICAgICBjdHgsXG4gICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgaWRcbiAgICApO1xuICAgIGlmIChzaG91bGRIeWRyYXRlKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJlYWQoY2xhenosIGlkLCBjdHgpO1xuICAgIH1cblxuICAgIGxvZy52ZXJib3NlKGBkZWxldGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgW2lkLnRvU3RyaW5nKCldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICByZXR1cm4gc2hvdWxkSHlkcmF0ZVxuICAgICAgPyByZXN1bHRcbiAgICAgIDogdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHBlcmZvcm0gYSBxdWVyeSB1c2luZyBNYW5nbyBRdWVyeSBzeW50YXhcbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgcmV0dXJuIHR5cGVcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSByYXdJbnB1dCAtIFRoZSBNYW5nbyBRdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJvY2VzcyAtIFdoZXRoZXIgdG8gcHJvY2VzcyB0aGUgcmVzdWx0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gICAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+RmFicmljQWRhcHRlcjogcmF3KHJhd0lucHV0LCBwcm9jZXNzKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBKU09OLnN0cmluZ2lmeShyYXdJbnB1dClcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZXZhbHVhdGVUcmFuc2FjdGlvbihcInF1ZXJ5XCIsIFtpbnB1dF0pXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShcInF1ZXJ5XCIsIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBKU09OLnBhcnNlKGRlY29kZShyZXN1bHQpKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdCBiYXNlZCBvbiB0eXBlXG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IHByb2Nlc3NlZCByZXN1bHRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIGFzeW5jIHJhdzxWLCBEIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmF3SW5wdXQ6IE1hbmdvUXVlcnksXG4gICAgZG9jc09ubHk6IEQgPSB0cnVlIGFzIEQsXG4gICAgY2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxWPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IGNsYXp6Lm5hbWU7XG4gICAgbG9nLmluZm8oYFBlcmZvcm1pbmcgcmF3IHN0YXRlbWVudCBvbiB0YWJsZSAke01vZGVsLnRhYmxlTmFtZShjbGF6eil9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwicmF3XCIsXG4gICAgICAgIFtKU09OLnN0cmluZ2lmeShyYXdJbnB1dCksIGRvY3NPbmx5XSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRhYmxlTmFtZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgcmVzdWx0OiAke2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VSZWNvcmQgPSAocmVjb3JkOiBSZWNvcmQ8YW55LCBhbnk+KSA9PiB7XG4gICAgICBpZiAoTW9kZWwuaXNNb2RlbChyZWNvcmQpKSByZXR1cm4gTW9kZWwuYnVpbGQocmVjb3JkKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkgcmV0dXJuIHJlc3VsdCBhcyBWO1xuICAgICAgY29uc3QgZWwgPSByZXN1bHRbMF07XG4gICAgICBpZiAoTW9kZWwuaXNNb2RlbChlbCkpXG4gICAgICAgIC8vIGlmIHRoZSBmaXJzdCBvbmUgaXMgYSBtb2RlbCwgYWxsIGFyZSBtb2RlbHNcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoKGVsKSA9PiBNb2RlbC5idWlsZChlbCkpIGFzIFY7XG4gICAgICByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlUmVjb3JkKHJlc3VsdCBhcyBhbnkpIGFzIFY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgQ291Y2hEQiB2aWV3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcXVlcnkgYSBkZXNpZ24gZG9jdW1lbnQgdmlld1xuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB2aWV3IHJlc3BvbnNlIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRkb2MgLSBEZXNpZ24gZG9jdW1lbnQgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmlld05hbWUgLSBWaWV3IG5hbWVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvcHRpb25zIC0gVmlldyBxdWVyeSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Li4uQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+fSBhcmdzIC0gT3B0aW9uYWwgY29udGV4dHVhbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxWaWV3UmVzcG9uc2U8Uj4+fSBUaGUgdmlldyByZXNwb25zZVxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgdmlldzxSPihcbiAgICBkZG9jOiBzdHJpbmcsXG4gICAgdmlld05hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFZpZXdSZXNwb25zZTxSPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudmlldyk7XG4gICAgbG9nLmluZm8oYFF1ZXJ5aW5nIHZpZXcgJHtkZG9jfS8ke3ZpZXdOYW1lfWApO1xuICAgIGxldCB0cmFuc2FjdGlvblJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgY3R4LFxuICAgICAgICBcInZpZXdcIixcbiAgICAgICAgW2Rkb2MsIHZpZXdOYW1lLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKV0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBWaWV3UmVzcG9uc2U8Uj47XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUodHJhbnNhY3Rpb25SZXN1bHQpKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIHZpZXcgcmVzdWx0OiAke2V9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgb3IgY3JlYXRlcyBhIGdSUEMgY2xpZW50IGZvciB0aGUgRmFicmljIHBlZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGNhY2hlZCBjbGllbnQgb3IgY3JlYXRlcyBhIG5ldyBvbmUgaWYgbm9uZSBleGlzdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxDbGllbnQ+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZ1JQQyBjbGllbnRcbiAgICovXG4gIG92ZXJyaWRlIGdldENsaWVudCgpOiBDbGllbnQge1xuICAgIGlmICghdGhpcy5fY2xpZW50KVxuICAgICAgdGhpcy5fY2xpZW50ID0gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDbGllbnQodGhpcy5jb25maWcpO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBHYXRld2F5IGluc3RhbmNlIGZvciB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBHYXRld2F5IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IGNsaWVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIEdhdGV3YXkoY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPik6IFByb21pc2U8R2F0ZXdheT4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmdldEdhdGV3YXkoY3R4LCB0aGlzLmNvbmZpZywgdGhpcy5jbGllbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKCFjbGFzc05hbWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGAke2NsYXNzTmFtZX1Db250cmFjdGA7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBDb250cmFjdCBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBDb250cmFjdCBpbnN0YW5jZSB1c2luZyB0aGUgY3VycmVudCBHYXRld2F5XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q29udHJha3Q+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgQ29udHJhY3QgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBDb250cmFjdChcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGNvbnRyYWN0TmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPENvbnRyYWt0PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0Q29udHJhY3QoXG4gICAgICBhd2FpdCB0aGlzLkdhdGV3YXkoY3R4KSxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgY29udHJhY3ROYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgU3VibWl0cyBvciBldmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiBvbiB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VibWl0IC0gV2hldGhlciB0byBzdWJtaXQgKHRydWUpIG9yIGV2YWx1YXRlIChmYWxzZSkgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gICAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gICAqXG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3QoKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZ2V0Q29udHJhY3QoKVxuICAgKiAgIGFsdCBzdWJtaXQgdHJhbnNhY3Rpb25cbiAgICogICAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogc3VibWl0KGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIGVsc2UgZXZhbHVhdGUgdHJhbnNhY3Rpb25cbiAgICogICAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZXZhbHVhdGUoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZW5kXG4gICAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICAgKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAgICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY2xvc2UoKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHRyYW5zYWN0aW9uKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgc3VibWl0ID0gdHJ1ZSxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBzdHJpbmdbXSxcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudHJhbnNhY3Rpb24pO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBhd2FpdCB0aGlzLkdhdGV3YXkoY3R4KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udHJhY3QgPSBhd2FpdCB0aGlzLkNvbnRyYWN0KFxuICAgICAgICBjdHgsXG4gICAgICAgIHRoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSlcbiAgICAgICk7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYCR7c3VibWl0ID8gXCJTdWJtaXRcIiA6IFwiRXZhbHVhdGVcIn10aW5nIHRyYW5zYWN0aW9uICR7dGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKSB8fCB0aGlzLmNvbmZpZy5jb250cmFjdE5hbWV9LiR7YXBpfWBcbiAgICAgICk7XG4gICAgICBsb2cuZGVidWcoYGFyZ3M6ICR7YXJncz8ubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpLmpvaW4oXCJcXG5cIikgfHwgXCJub25lXCJ9YCk7XG4gICAgICBjb25zdCBtZXRob2QgPSBzdWJtaXQgPyBjb250cmFjdC5zdWJtaXQgOiBjb250cmFjdC5ldmFsdWF0ZTtcblxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyA9IGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/Lmxlbmd0aFxuICAgICAgICA/IGVuZG9yc2luZ09yZ2FuaXphdGlvbnNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwcm9wb3NhbE9wdGlvbnM6IFByb3Bvc2FsT3B0aW9ucyA9IHtcbiAgICAgICAgYXJndW1lbnRzOiBhcmdzIHx8IFtdLFxuICAgICAgICB0cmFuc2llbnREYXRhOiBPYmplY3QuZW50cmllcyh0cmFuc2llbnREYXRhKS5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIHR5cGVvZiB0cmFuc2llbnREYXRhXG4gICAgICAgICksXG4gICAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM6IGN0eC5nZXRPclVuZGVmaW5lZChcImFsbG93TWFudWFsRW5kb3JzaW5nT3Jnc1wiKVxuICAgICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9ucyB8fCB1bmRlZmluZWRcbiAgICAgICAgICA6IHVuZGVmaW5lZCwgLy8gbXNwSWQgbGlzdFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IG1ldGhvZC5jYWxsKGNvbnRyYWN0LCBhcGksIHByb3Bvc2FsT3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nICR7dGhpcy5jb25maWcubXNwSWR9IGdhdGV3YXkgY29ubmVjdGlvbmApO1xuICAgICAgZ2F0ZXdheS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVXNlTGVnYWN5R2F0ZXdheShjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhY3R4LmdldE9yVW5kZWZpbmVkKFwibGVnYWN5XCIpICYmICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVMZWdhY3lBcmdzKGFyZ3M/OiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKGFyZ3MgfHwgW10pLm1hcCgoYXJnKSA9PlxuICAgICAgdHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIiA/IGFyZyA6IEpTT04uc3RyaW5naWZ5KGFyZylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExlZ2FjeVRyYW5zaWVudChcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICApOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRyYW5zaWVudERhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEpO1xuICAgIGlmICghZW50cmllcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgbWFwW2tleV0gPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlTGVnYWN5TXNwQ291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb25maWd1cmVkID0gdGhpcy5jb25maWcubGVnYWN5TXNwQ291bnQgPz8gMTtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIoY29uZmlndXJlZCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSB8fCBwYXJzZWQgPCAxKSByZXR1cm4gMTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihwYXJzZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwaWNrTGVnYWN5Q2FuZGlkYXRlcyhcbiAgICBjYW5kaWRhdGVzOiBNc3BEZXRhaWxzW10sXG4gICAgbGltaXQ6IG51bWJlclxuICApOiBNc3BEZXRhaWxzW10ge1xuICAgIGlmICghY2FuZGlkYXRlcy5sZW5ndGggfHwgbGltaXQgPD0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IFsuLi5jYW5kaWRhdGVzXTtcbiAgICBjb25zdCB0YXJnZXQgPSBNYXRoLm1pbihsaW1pdCwgYXZhaWxhYmxlLmxlbmd0aCk7XG4gICAgY29uc3QgcGlja2VkOiBNc3BEZXRhaWxzW10gPSBbXTtcbiAgICB3aGlsZSAocGlja2VkLmxlbmd0aCA8IHRhcmdldCAmJiBhdmFpbGFibGUubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpZHggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICAgIGNvbnN0IFtzZWxlY3Rpb25dID0gYXZhaWxhYmxlLnNwbGljZShpZHgsIDEpO1xuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBwaWNrZWQucHVzaChzZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGlja2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExlZ2FjeVBlZXJDb25maWdzKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogTGVnYWN5UGVlclRhcmdldFtdIHtcbiAgICBjb25zdCBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdID0gW1xuICAgICAge1xuICAgICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICAgIHBlZXJFbmRwb2ludDogdGhpcy5jb25maWcucGVlckVuZHBvaW50LFxuICAgICAgICBwZWVySG9zdEFsaWFzOiB0aGlzLmNvbmZpZy5wZWVySG9zdEFsaWFzLFxuICAgICAgICB0bHNDZXJ0OiB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgbGV0IGVuZG9yc2luZ09yZ3MgPSB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSB8fCBbXTtcbiAgICBlbmRvcnNpbmdPcmdzID0gQXJyYXkuaXNBcnJheShlbmRvcnNpbmdPcmdzKVxuICAgICAgPyBlbmRvcnNpbmdPcmdzXG4gICAgICA6IFtlbmRvcnNpbmdPcmdzXTtcbiAgICBjb25zdCBlbmRvcnNlcnMgPVxuICAgICAgZW5kb3JzaW5nT3Jncy5maWx0ZXIoKG9yZyk6IG9yZyBpcyBzdHJpbmcgPT4gQm9vbGVhbihvcmcpKSB8fCBbXTtcbiAgICBjb25zdCBleHRyYXMgPSBlbmRvcnNlcnMuZmlsdGVyKChvcmcpID0+IG9yZyAhPT0gdGhpcy5jb25maWcubXNwSWQpO1xuICAgIGlmICghZXh0cmFzLmxlbmd0aCkgcmV0dXJuIHBlZXJzO1xuXG4gICAgY29uc3QgbWFwID0gdGhpcy5jb25maWcubXNwTWFwO1xuICAgIGNvbnN0IGxlZ2FjeUNvdW50ID0gdGhpcy5yZXNvbHZlTGVnYWN5TXNwQ291bnQoKTtcbiAgICBmb3IgKGNvbnN0IG1zcCBvZiBleHRyYXMpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBtYXA/Llttc3BdO1xuICAgICAgaWYgKCFjYW5kaWRhdGVzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy5waWNrTGVnYWN5Q2FuZGlkYXRlcyhjYW5kaWRhdGVzLCBsZWdhY3lDb3VudCk7XG4gICAgICBpZiAoIXNlbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgIGBObyB2YWxpZCBwZWVyIG1hcHBpbmcgYXZhaWxhYmxlIGZvciBNU1AgJHttc3B9LiBQcm92aWRlIGl0IHZpYSBjb25maWcubXNwTWFwYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaG9pY2Ugb2Ygc2VsZWN0aW9ucykge1xuICAgICAgICBpZiAoIWNob2ljZS5lbmRwb2ludCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgcGVlciBtYXBwaW5nIGZvciBNU1AgJHttc3B9OiBtaXNzaW5nIGVuZHBvaW50YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcGVlcnMucHVzaCh7XG4gICAgICAgICAgbXNwSWQ6IG1zcCxcbiAgICAgICAgICBwZWVyRW5kcG9pbnQ6IGNob2ljZS5lbmRwb2ludCxcbiAgICAgICAgICBwZWVySG9zdEFsaWFzOiBjaG9pY2UuYWxpYXMsXG4gICAgICAgICAgdGxzQ2VydDogY2hvaWNlLnRsc0NlcnQgfHwgdGhpcy5jb25maWcudGxzQ2VydCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBmY246IHN0cmluZyxcbiAgICBhcmdzOiBzdHJpbmdbXSxcbiAgICB0cmFuc2llbnRNYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQsXG4gICAgcGVlckNvbmZpZ3M6IExlZ2FjeVBlZXJUYXJnZXRbXSxcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKTtcbiAgICBjb25zdCBwZWVycyA9IHRoaXMubm9ybWFsaXplTGVnYWN5UGVlcnMocGVlckNvbmZpZ3MpO1xuICAgIGNvbnN0IGlkZW50aXR5TWF0ZXJpYWwgPSBhd2FpdCB0aGlzLnJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsKCk7XG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgV2FsbGV0cy5uZXdJbk1lbW9yeVdhbGxldCgpO1xuICAgIGNvbnN0IGlkZW50aXR5TGFiZWwgPSBgJHt0aGlzLmNvbmZpZy5tc3BJZH0tbGVnYWN5YDtcbiAgICBhd2FpdCB3YWxsZXQucHV0KGlkZW50aXR5TGFiZWwsIHtcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBpZGVudGl0eU1hdGVyaWFsLnByaXZhdGVLZXksXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgdHlwZTogXCJYLjUwOVwiLFxuICAgIH0gYXMgSWRlbnRpdHkpO1xuXG4gICAgY29uc3QgY29ubmVjdGlvblByb2ZpbGUgPSBhd2FpdCB0aGlzLmJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnMpO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBuZXcgTGVnYWN5R2F0ZXdheSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGdhdGV3YXkuY29ubmVjdChjb25uZWN0aW9uUHJvZmlsZSwge1xuICAgICAgICBpZGVudGl0eTogaWRlbnRpdHlMYWJlbCxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICBkaXNjb3Zlcnk6IHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGFzTG9jYWxob3N0OiB0aGlzLnNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdChwZWVycyksXG4gICAgICAgIH0sXG4gICAgICAgIHRsc0luZm86IHtcbiAgICAgICAgICBjZXJ0aWZpY2F0ZTogaWRlbnRpdHlNYXRlcmlhbC5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgICBrZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBuZXR3b3JrID0gYXdhaXQgZ2F0ZXdheS5nZXROZXR3b3JrKHRoaXMuY29uZmlnLmNoYW5uZWwpO1xuICAgICAgY29uc3QgY29udHJhY3QgPSBuZXR3b3JrLmdldENvbnRyYWN0KFxuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpXG4gICAgICApO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBjb250cmFjdC5jcmVhdGVUcmFuc2FjdGlvbihmY24pO1xuXG4gICAgICBpZiAodHJhbnNpZW50TWFwKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zaWVudCh0cmFuc2llbnRNYXApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRvcnNlcnMgPSBwZWVyc1xuICAgICAgICAubWFwKChwZWVyKSA9PiBuZXR3b3JrLmdldENoYW5uZWwoKS5nZXRFbmRvcnNlcihwZWVyLm5hbWUpKVxuICAgICAgICAuZmlsdGVyKChlbmRvcnNlcik6IGVuZG9yc2VyIGlzIEVuZG9yc2VyID0+IEJvb2xlYW4oZW5kb3JzZXIpKTtcbiAgICAgIGlmIChlbmRvcnNlcnMubGVuZ3RoKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldEVuZG9yc2luZ1BlZXJzKGVuZG9yc2Vycyk7XG4gICAgICB9XG5cbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgTGVnYWN5IHN1Ym1pdHRpbmcgJHt0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpIHx8IHRoaXMuY29uZmlnLmNvbnRyYWN0TmFtZX0uJHtmY259IHZpYSBwZWVycyAke3BlZXJzLm1hcCgocCkgPT4gcC5wZWVyRW5kcG9pbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbi5zdWJtaXQoLi4uYXJncyk7XG4gICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGdhdGV3YXkuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTGVnYWN5UGVlcnMoXG4gICAgcGVlcnM6IExlZ2FjeVBlZXJUYXJnZXRbXVxuICApOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IG5ldyBNYXA8c3RyaW5nLCBMZWdhY3lQZWVyV2l0aE5hbWU+KCk7XG4gICAgY29uc3QgYWRkUGVlciA9IChwZWVyOiBMZWdhY3lQZWVyVGFyZ2V0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtwZWVyLnBlZXJFbmRwb2ludH18JHtwZWVyLnBlZXJIb3N0QWxpYXMgfHwgXCJcIn1gO1xuICAgICAgaWYgKGRlZHVwZWQuaGFzKGtleSkpIHJldHVybjtcbiAgICAgIGNvbnN0IG5hbWUgPSBgcGVlci0ke3BlZXIubXNwSWR9LSR7ZGVkdXBlZC5zaXplfWA7XG4gICAgICBkZWR1cGVkLnNldChrZXksIHtcbiAgICAgICAgLi4ucGVlcixcbiAgICAgICAgbmFtZSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwZWVycy5mb3JFYWNoKGFkZFBlZXIpO1xuICAgIGFkZFBlZXIoe1xuICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICBwZWVySG9zdEFsaWFzOiB0aGlzLmNvbmZpZy5wZWVySG9zdEFsaWFzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZGVkdXBlZC52YWx1ZXMoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsKCk6IFByb21pc2U8e1xuICAgIGNlcnRpZmljYXRlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZUtleTogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoXG4gICAgKTtcbiAgICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICB0aGlzLmNvbmZpZy5rZXlDZXJ0T3JEaXJlY3RvcnlQYXRoXG4gICAgKTtcbiAgICByZXR1cm4geyBjZXJ0aWZpY2F0ZSwgcHJpdmF0ZUtleSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlKHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSkge1xuICAgIGNvbnN0IHBlZXJFbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgY2hhbm5lbFBlZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3Qgb3JnczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3QgcGVlciBvZiBwZWVycykge1xuICAgICAgY29uc3QgdGxzUGVtID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICAgIHBlZXIudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0XG4gICAgICApO1xuICAgICAgY29uc3QgaG9zdG5hbWUgPVxuICAgICAgICBwZWVyLnBlZXJIb3N0QWxpYXMgfHwgdGhpcy5leHRyYWN0SG9zdChwZWVyLnBlZXJFbmRwb2ludCk7XG4gICAgICBwZWVyRW50cmllc1twZWVyLm5hbWVdID0ge1xuICAgICAgICB1cmw6IHRoaXMuZW5zdXJlR3JwY1VybChwZWVyLnBlZXJFbmRwb2ludCksXG4gICAgICAgIHRsc0NBQ2VydHM6IHsgcGVtOiB0bHNQZW0gfSxcbiAgICAgICAgZ3JwY09wdGlvbnM6IHtcbiAgICAgICAgICBcInNzbC10YXJnZXQtbmFtZS1vdmVycmlkZVwiOiBob3N0bmFtZSxcbiAgICAgICAgICBob3N0bmFtZU92ZXJyaWRlOiBob3N0bmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjaGFubmVsUGVlcnNbcGVlci5uYW1lXSA9IHtcbiAgICAgICAgZW5kb3JzaW5nUGVlcjogdHJ1ZSxcbiAgICAgICAgY2hhaW5jb2RlUXVlcnk6IHRydWUsXG4gICAgICAgIGxlZGdlclF1ZXJ5OiB0cnVlLFxuICAgICAgICBldmVudFNvdXJjZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdID0gb3Jnc1twZWVyLm1zcElkXSB8fCB7XG4gICAgICAgIG1zcGlkOiBwZWVyLm1zcElkLFxuICAgICAgICBwZWVyczogW10sXG4gICAgICB9O1xuICAgICAgb3Jnc1twZWVyLm1zcElkXS5wZWVycy5wdXNoKHBlZXIubmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IFwibGVnYWN5LW1hbnVhbFwiLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgICAgY2xpZW50OiB7XG4gICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB9LFxuICAgICAgb3JnYW5pemF0aW9uczogb3JncyxcbiAgICAgIHBlZXJzOiBwZWVyRW50cmllcyxcbiAgICAgIG9yZGVyZXJzOiB7fSxcbiAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgIFt0aGlzLmNvbmZpZy5jaGFubmVsXToge1xuICAgICAgICAgIHBlZXJzOiBjaGFubmVsUGVlcnMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdChwZWVyczogTGVnYWN5UGVlcldpdGhOYW1lW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVlcnMuZXZlcnkoKHBlZXIpID0+IHRoaXMuaXNMb2NhbEVuZHBvaW50KHBlZXIucGVlckVuZHBvaW50KSk7XG4gIH1cblxuICBwcml2YXRlIGlzTG9jYWxFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZXh0cmFjdEhvc3QoZW5kcG9pbnQpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGhvc3QgPT09IFwibG9jYWxob3N0XCIgfHwgaG9zdCA9PT0gXCIxMjcuMC4wLjFcIjtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEhvc3QoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2FuaXRpemVkID0gZW5kcG9pbnQucmVwbGFjZSgvXmdycGNzPzpcXC9cXC8vLCBcIlwiKTtcbiAgICByZXR1cm4gc2FuaXRpemVkLnNwbGl0KFwiOlwiKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlR3JwY1VybChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoL15ncnBjcz86XFwvXFwvL2kudGVzdChlbmRwb2ludCkpIHJldHVybiBlbmRwb2ludDtcbiAgICByZXR1cm4gYGdycGNzOi8vJHtlbmRwb2ludH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkUGVtSW5wdXQoc291cmNlPzogc3RyaW5nIHwgQnVmZmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIGNlcnRpZmljYXRlIG9yIGtleSBtYXRlcmlhbFwiKTtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNvdXJjZSkpIHJldHVybiBzb3VyY2UudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgIGNvbnN0IHRyaW1tZWQgPSBzb3VyY2UudHJpbSgpO1xuICAgIGlmICgvLS0tLS1CRUdJTiBbQS1aIF0rLS0tLS0vLnRlc3QodHJpbW1lZCkpIHJldHVybiB0cmltbWVkO1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChzb3VyY2UpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgaWYgKHN0YXRzPy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIChhd2FpdCByZWFkRnNGaWxlKHNvdXJjZSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvclxuICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yXG4gICAqL1xuICBvdmVycmlkZSBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KGVycjogRXJyb3IgfCBzdHJpbmcpOiBFIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5wYXJzZUVycm9yPEU+KGVycik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgYSB0cmFuc2FjdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBsZWRnZXIgc3RhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBBcnJheTxzdHJpbmc+LFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBpZiAodGhpcy5zaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eCkpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUFyZ3MgPSB0aGlzLnByZXBhcmVMZWdhY3lBcmdzKGFyZ3MpO1xuICAgICAgY29uc3QgdHJhbnNpZW50TWFwID0gdGhpcy5idWlsZExlZ2FjeVRyYW5zaWVudCh0cmFuc2llbnREYXRhKTtcbiAgICAgIGNvbnN0IHBlZXJDb25maWdzID0gdGhpcy5idWlsZExlZ2FjeVBlZXJDb25maWdzKGN0eCk7XG4gICAgICByZXR1cm4gdGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMoXG4gICAgICAgIGN0eCxcbiAgICAgICAgYXBpLFxuICAgICAgICBsZWdhY3lBcmdzLFxuICAgICAgICB0cmFuc2llbnRNYXAsXG4gICAgICAgIHBlZXJDb25maWdzLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgdHJ1ZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBsZWRnZXIgc3RhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIGV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgZmFsc2UsXG4gICAgICBhcmdzLFxuICAgICAgdHJhbnNpZW50RGF0YSxcbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMsXG4gICAgICBjbGFzc05hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENsb3NlcyB0aGUgZ1JQQyBjbGllbnQgaWYgaXQgZXhpc3RzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjbGllbnQgaXMgY2xvc2VkXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjbGllbnRgKTtcbiAgICAgIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgY2hhaW5jb2RlIGNvbnRyYWN0IGZyb20gdGhlIHNwZWNpZmllZCBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDb250cmFrdH0gVGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29udHJhY3QoXG4gICAgZ2F0ZXdheTogR2F0ZXdheSxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IENvbnRyYWt0IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDb250cmFjdCk7XG4gICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yayhnYXRld2F5LCBjb25maWcuY2hhbm5lbCk7XG4gICAgbGV0IGNvbnRyYWN0OiBDb250cmFrdDtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgUmV0cmlldmluZyBjaGFpbmNvZGUgJHtjb25maWcuY2hhaW5jb2RlTmFtZX0gY29udHJhY3QgJHtjb250cmFjdE5hbWUgfHwgY29uZmlnLmNvbnRyYWN0TmFtZX0gZnJvbSBuZXR3b3JrICR7Y29uZmlnLmNoYW5uZWx9YFxuICAgICAgKTtcbiAgICAgIGNvbnRyYWN0TmFtZSA9IGNvbnRyYWN0TmFtZSA/IGNvbnRyYWN0TmFtZSA6IGNvbmZpZy5jb250cmFjdE5hbWU7XG4gICAgICBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY29uZmlnLmNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIE5ldHdvcmsgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdG8gYSBzcGVjaWZpYyBjaGFubmVsIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEByZXR1cm4ge05ldHdvcmt9IFRoZSBOZXR3b3JrIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0TmV0d29yayhnYXRld2F5OiBHYXRld2F5LCBjaGFubmVsTmFtZTogc3RyaW5nKTogTmV0d29yayB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXROZXR3b3JrKTtcbiAgICBsZXQgbmV0d29yazogTmV0d29yaztcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNoYW5uZWwgJHtjaGFubmVsTmFtZX1gKTtcbiAgICAgIG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtDbGllbnR9IFtjbGllbnRdIC0gT3B0aW9uYWwgZ1JQQyBjbGllbnQsIHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRHYXRld2F5KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsaWVudD86IENsaWVudFxuICApIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNsaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRDbGllbnQoY29uZmlnKSksXG4gICAgICBjb25maWcsXG4gICAgICBjdHhcbiAgICApKSBhcyBHYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNsaWVudCB3aXRoIFRMUyBjcmVkZW50aWFscyBmb3Igc2VjdXJlIGNvbW11bmljYXRpb25cbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NsaWVudH0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBzdGF0aWMgZ2V0Q2xpZW50KGNvbmZpZzogUGVlckNvbmZpZyk6IENsaWVudCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2xpZW50KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgVExTIGNyZWRlbnRpYWxzIGZvciBtc3AgJHtjb25maWcubXNwSWR9YCk7XG4gICAgbGV0IHBhdGhPckNlcnQ6IHN0cmluZyB8IEJ1ZmZlciA9IGNvbmZpZy50bHNDZXJ0IGFzIHN0cmluZyB8IEJ1ZmZlcjtcblxuICAgIGlmICh0eXBlb2YgcGF0aE9yQ2VydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoT3JDZXJ0Lm1hdGNoKFxuICAgICAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20ocGF0aE9yQ2VydCwgXCJ1dGY4XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20oZnMucmVhZEZpbGVTeW5jKHBhdGhPckNlcnQsIFwidXRmOFwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCB0aGUgdGxzIGNlcnRpZmljYXRlIGZyb20gJHtwYXRoT3JDZXJ0fTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGxzQ3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbChwYXRoT3JDZXJ0KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgR2F0ZXdheSBDbGllbnQgZm9yIHVybCAke2NvbmZpZy5wZWVyRW5kcG9pbnR9YCk7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoY29uZmlnLnBlZXJFbmRwb2ludCwgdGxzQ3JlZGVudGlhbHMsIHtcbiAgICAgIFwiZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICAgIFwiZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSBjb25uZWN0aW9uIHdpdGggaWRlbnRpdHkgYW5kIHNpZ25lclxuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gVGhlIGdSUEMgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29ubmVjdGVkIEdhdGV3YXlcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IElkZW50aXR5XG4gICAqICAgcGFydGljaXBhbnQgU2lnbmVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0FkYXB0ZXI6IGdldENvbm5lY3Rpb24oY2xpZW50LCBjb25maWcpXG4gICAqICAgRmFicmljQWRhcHRlci0+PklkZW50aXR5OiBnZXRJZGVudGl0eShtc3BJZCwgY2VydERpcmVjdG9yeVBhdGgpXG4gICAqICAgSWRlbnRpdHktLT4+RmFicmljQWRhcHRlcjogaWRlbnRpdHlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+U2lnbmVyOiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aClcbiAgICogICBTaWduZXItLT4+RmFicmljQWRhcHRlcjogc2lnbmVyXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IENyZWF0ZSBDb25uZWN0T3B0aW9uc1xuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KG9wdGlvbnMpXG4gICAqICAgR2F0ZXdheS0tPj5GYWJyaWNBZGFwdGVyOiBnYXRld2F5XG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DYWxsZXI6IGdhdGV3YXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb25uZWN0aW9uKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0Q29ubmVjdGlvbik7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgUGVlciBJZGVudGl0eSBmb3IgJHtjb25maWcubXNwSWR9IHVuZGVyICR7Y29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRofWBcbiAgICApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgZ2V0SWRlbnRpdHkoXG4gICAgICBjb25maWcubXNwSWQsXG4gICAgICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgcHJlcGFyaW5nIHRyYW5zYWN0aW9uIHNpZ25lciBmb3IgJHtDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShpZGVudGl0eS5jcmVkZW50aWFscy50b1N0cmluZygpKX1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgRmFicmljIElEIGZyb20gY2VydGlmaWNhdGVgLCBlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmVyOiBTaWduZXI7XG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7fTtcbiAgICBpZiAoIWNvbmZpZy5oc20pIHtcbiAgICAgIHNpZ25lciA9IGF3YWl0IGdldFNpZ25lcihjb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zdCBoc20gPSBuZXcgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbShjb25maWcuaHNtLmxpYnJhcnkpO1xuICAgICAgLy8gY29uc3QgaWRlbnRpZmllciA9IGhzbS5nZXRTS0lGcm9tQ2VydGlmaWNhdGVQYXRoKFxuICAgICAgLy8gICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc3QgcGtjczExU2lnbmVyID0gaHNtLm5ld1NpZ25lcih7XG4gICAgICAvLyAgIGxhYmVsOiBjb25maWcuaHNtLnRva2VuTGFiZWwgYXMgc3RyaW5nLFxuICAgICAgLy8gICBwaW46IFN0cmluZyhjb25maWcuaHNtLnBpbikgYXMgc3RyaW5nLFxuICAgICAgLy8gICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgLy8gICAvLyB1c2VyVHlwZTogMSAvKkNLVV9VU0VSICovLFxuICAgICAgLy8gfSk7XG4gICAgICAvLyBzaWduZXIgPSBwa2NzMTFTaWduZXIuc2lnbmVyO1xuICAgICAgLy8gY2xvc2UgPSBwa2NzMTFTaWduZXIuY2xvc2U7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIkhTTSBOT1QgSU1QTEVNRU5URURcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNsaWVudCxcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICAgIHNpZ25lcjogc2lnbmVyLFxuICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0cyBmb3IgZGlmZmVyZW50IGdSUEMgY2FsbHNcbiAgICAgIGV2YWx1YXRlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZXZhbHVhdGVUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGVuZG9yc2VPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJlbmRvcnNlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgc3VibWl0T3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwic3VibWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBjb21taXRTdGF0dXNPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJjb21taXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDEgbWludXRlXG4gICAgICB9LFxuICAgIH0gYXMgQ29ubmVjdE9wdGlvbnM7XG5cbiAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjb25maWcubXNwSWR9YCk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGNvbm5lY3Qob3B0aW9ucyk7XG5cbiAgICAvLyBUT0RPOiByZXBsYWNlP1xuICAgIGlmIChjb25maWcuaHNtKSB7XG4gICAgICBnYXRld2F5LmNsb3NlID0gbmV3IFByb3h5KGdhdGV3YXkuY2xvc2UsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0OiAoKSA9PiB2b2lkLCB0aGlzQXJnOiBhbnksIGFyZ0FycmF5OiBhbnlbXSk6IGFueSB7XG4gICAgICAgICAgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KTtcbiAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBGYWJyaWNDbGllbnREaXNwYXRjaCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLlxuICAgKiBAcmV0dXJucyB7RGlzcGF0Y2h9IEEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAcmVtYXJrcyBUaGUgRGlzcGF0Y2ggaW5zdGFuY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgbG9naWMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLCBzdWNoIGFzIHN1Ym1pdHRpbmcgdHJhbnNhY3Rpb25zIG9yIHF1ZXJ5aW5nIGRhdGEuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGZhYnJpY0Rpc3BhdGNoID0gZmFicmljQ2xpZW50QWRhcHRlci5EaXNwYXRjaCgpO1xuICAgKiBmYWJyaWNEaXNwYXRjaC5zdWJtaXRUcmFuc2FjdGlvbignY3JlYXRlUHJvZHVjdCcsIHsgbmFtZTogJ1Byb2R1Y3QgQScsIHByaWNlOiAxMDAgfSk7XG4gICAqL1xuICBvdmVycmlkZSBEaXNwYXRjaCgpOiBGYWJyaWNDbGllbnREaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgaW50byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhbnkgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBCYXNlRXJyb3IgdXNpbmcgdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oXG4gICAgZXJyOiBFcnJvciB8IHN0cmluZyB8IEdhdGV3YXlFcnJvclxuICApOiBFIHtcbiAgICAvLyBpZiAoXG4gICAgLy8gICBNSVNTSU5HX1BSSVZBVEVfREFUQV9SRUdFWC50ZXN0KFxuICAgIC8vICAgICB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2VcbiAgICAvLyAgIClcbiAgICAvLyApXG4gICAgLy8gICByZXR1cm4gbmV3IFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzKGVycikgYXMgRTtcblxuICAgIGxldCBtc2cgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEdhdGV3YXlFcnJvciAmJiBlcnIuZGV0YWlscy5sZW5ndGggJiYgZXJyLmNvZGUgPT09IDEwKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXJyIGluc3RhbmNlb2YgRW5kb3JzZUVycm9yICYmXG4gICAgICBlcnIuZGV0YWlscy5sZW5ndGggJiZcbiAgICAgIGVyci5jb2RlID09PSAxMCAmJlxuICAgICAgZXJyLmRldGFpbHNbMF0ubWVzc2FnZT8uaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKVxuICAgICkge1xuICAgICAgbXNnID0gYCR7ZXJyLmRldGFpbHNbMF0ubWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJNVkNDX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IE12Y2NSZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiREVBRExJTkVfRVhDRUVERURcIikpXG4gICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uVGltZW91dEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJFTkRPUlNFTUVOVF9QT0xJQ1lfRkFJTFVSRVwiKSlcbiAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiUEhBTlRPTV9SRUFEX0NPTkZMSUNUXCIpKVxuICAgICAgcmV0dXJuIG5ldyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICBzd2l0Y2ggKChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICByZXR1cm4gbmV3IEVuZG9yc2VtZW50RXJyb3IoZXJyKSBhcyBFO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoVmFsaWRhdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTm90Rm91bmRFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbmZsaWN0RXJyb3IubmFtZSkpIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhCYWRSZXF1ZXN0RXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEJhZFJlcXVlc3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhRdWVyeUVycm9yLm5hbWUpKSByZXR1cm4gbmV3IFF1ZXJ5RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUGFnaW5nRXJyb3IubmFtZSkpIHJldHVybiBuZXcgUGFnaW5nRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhNaWdyYXRpb25FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBNaWdyYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhPYnNlcnZlckVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE9ic2VydmVyRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQXV0aG9yaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoRm9yYmlkZGVuRXJyb3IubmFtZSkpIHJldHVybiBuZXcgRm9yYmlkZGVuRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29ubmVjdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoU2VyaWFsaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIEU7XG4gIH1cbn1cblxuRmFicmljQ2xpZW50QWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoRmFicmljRmxhdm91cik7XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDb250ZXh0dWFsQXJncyxcbiAgRGlzcGF0Y2gsXG4gIEV2ZW50SWRzLFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBDb250ZXh0LFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQZWVyQ29uZmlnIH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlRXZlbnQsXG4gIENsb3NlYWJsZUFzeW5jSXRlcmFibGUsXG59IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IHBhcnNlRXZlbnROYW1lIH0gZnJvbSBcIi4uL3NoYXJlZC9ldmVudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXZlbnQgZGlzcGF0Y2hlciBmb3IgSHlwZXJsZWRnZXIgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGFuZCBwcm9jZXNzZXMgZXZlbnRzIGVtaXR0ZWQgYnkgRmFicmljIGNoYWluY29kZSwgZGlzcGF0Y2hpbmcgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICogQGNsYXNzIEZhYnJpY0NsaWVudERpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gKiBjb25zdCBjbGllbnQgPSBhd2FpdCBGYWJyaWNBZGFwdGVyLmdldENsaWVudChwZWVyQ29uZmlnKTtcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudCk7XG4gKlxuICogLy8gQ29uZmlndXJlIHRoZSBkaXNwYXRjaCB3aXRoIHBlZXIgY29uZmlndXJhdGlvblxuICogZGlzcGF0Y2guY29uZmlndXJlKHBlZXJDb25maWcpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGFuIG9ic2VydmVyIGZvciBhIHNwZWNpZmljIHRhYmxlIGFuZCBldmVudFxuICogZGlzcGF0Y2gub2JzZXJ2ZSgndXNlcnMnLCAnY3JlYXRlJywgKGlkKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBVc2VyIGNyZWF0ZWQ6ICR7aWR9YCk7XG4gKiB9KTtcbiAqXG4gKiAvLyBTdGFydCBsaXN0ZW5pbmcgZm9yIGV2ZW50c1xuICogYXdhaXQgZGlzcGF0Y2guc3RhcnQoKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICogICBwYXJ0aWNpcGFudCBOZXR3b3JrXG4gKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICpcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IG5ldyBGYWJyaWNEaXNwYXRjaChjbGllbnQpXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBjb25maWd1cmUocGVlckNvbmZpZylcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IG9ic2VydmUodGFibGUsIGV2ZW50LCBjYWxsYmFjaylcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IHN0YXJ0KClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaW5pdGlhbGl6ZSgpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+R2F0ZXdheTogZ2V0R2F0ZXdheShjb25maWcsIGNsaWVudClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbClcbiAqICAgTmV0d29yay0+Pk5ldHdvcms6IGdldENoYWluY29kZUV2ZW50cyhjaGFpbmNvZGVOYW1lKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICogICBsb29wIEZvciBlYWNoIGV2ZW50XG4gKiAgICAgQ2hhaW5jb2RlLS0+PkZhYnJpY0Rpc3BhdGNoOiBDaGFpbmNvZGVFdmVudFxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZVBheWxvYWQocGF5bG9hZClcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZClcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0tPj5DbGllbnQ6IGNhbGxiYWNrKGlkKVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudERpc3BhdGNoIGV4dGVuZHMgRGlzcGF0Y2g8RmFicmljQ2xpZW50QWRhcHRlcj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGxpc3RlbmluZyBzdGFjayBmb3IgY2hhaW5jb2RlIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBsaXN0ZW5pbmdTdGFjaz86IENsb3NlYWJsZUFzeW5jSXRlcmFibGU8Q2hhaW5jb2RlRXZlbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIGV2ZW50IHBheWxvYWRzIGZyb20gYnl0ZXMgdG8gc3RyaW5nc1xuICAgKi9cbiAgcHJpdmF0ZSBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBkaXNwYXRjaGVyIGZvciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2xpZW50OiBDbGllbnQpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbG9zZXMgdGhlIGV2ZW50IGxpc3RlbmluZyBjb25uZWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN0b3BzIGxpc3RlbmluZyBmb3IgY2hhaW5jb2RlIGV2ZW50cyBhbmQgcmVsZWFzZXMgcmVzb3VyY2VzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY2xvc2UoXG4gICAgLi4uY3R4QXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzOiBsb2dnZWRBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChjdHhBcmdzLCBQZXJzaXN0ZW5jZUtleXMuU0hVVERPV04sIHRydWUpXG4gICAgKS5mb3IodGhpcy5jbG9zZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLmNsb3NlKC4uLmxvZ2dlZEFyZ3MpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNsb3NlIEZhYnJpYyBwcm94aWVzIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGlmICh0aGlzLmxpc3RlbmluZ1N0YWNrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmxpc3RlbmluZ1N0YWNrLmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNsb3NlIEZhYnJpYyBldmVudCBsaXN0ZW5lcmAsIGUgYXMgRXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBldmVudCBwYXlsb2FkIGZyb20gYmluYXJ5IGZvcm1hdFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgY29udGFpbmluZyBKU09OIHRvIGFuIG9iamVjdCB3aXRoIGFuIGlkIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ganNvbkJ5dGVzIC0gVGhlIGJpbmFyeSBwYXlsb2FkIGZyb20gdGhlIGNoYWluY29kZSBldmVudFxuICAgKiBAcmV0dXJuIHt7IGlkOiBzdHJpbmcgfX0gVGhlIHBhcnNlZCBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIHJlY29yZCBJRFxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVBheWxvYWQoanNvbkJ5dGVzOiBVaW50OEFycmF5KTogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSB7XG4gICAgY29uc3QganNvbiA9IHRoaXMuZGVjb2Rlci5kZWNvZGUoanNvbkJ5dGVzKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIG9ic2VydmluZyBhbiBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRoaXMgZGlzcGF0Y2ggdG8gYW4gYWRhcHRlciB0byBtb25pdG9yIGl0cyBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+fSBvYnNlcnZlciAtIFRoZSBhZGFwdGVyIHRvIG9ic2VydmVcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG92ZXJyaWRlIG9ic2VydmUob2JzZXJ2ZXI6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pik6ICgpID0+IHZvaWQge1xuICAgIGlmICghKG9ic2VydmVyIGluc3RhbmNlb2YgRmFicmljQ2xpZW50QWRhcHRlcikpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgXCJPbmx5IEZhYnJpY0NsaWVudEFkYXB0ZXIgY2FuIGJlIG9ic2VydmVkIGJ5IGRpc3BhdGNoXCJcbiAgICAgICk7XG4gICAgc3VwZXIub2JzZXJ2ZShvYnNlcnZlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHthbnl9IHBheWxvYWQgLSBUaGUgZXZlbnQgcGF5bG9hZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gQWRhcHRlci5sb2dDdHg8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+KFxuICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMsXG4gICAgICBldmVudCxcbiAgICAgIGZhbHNlLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2g7IHNraXBwaW5nIG9ic2VydmVyIHVwZGF0ZSBmb3IgJHt0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyBtb2RlbCA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCl9OiR7ZXZlbnR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZWZyZXNoKG1vZGVsLCBldmVudCwgaWQsIC4uLmN0eEFyZ3MpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBkaXNwYXRjaDogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGluY29taW5nIGNoYWluY29kZSBldmVudHNcbiAgICogQHN1bW1hcnkgTGlzdGVucyBmb3IgZXZlbnRzIGZyb20gdGhlIGNoYWluY29kZSBhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV2ZW50IGhhbmRsaW5nIHN0b3BzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0Rpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRTdGFja1xuICAgKiAgIHBhcnRpY2lwYW50IEV2ZW50UGFyc2VyXG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJzXG4gICAqXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaGFuZGxlRXZlbnRzKClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50U3RhY2s6IGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIGxpc3RlbmluZ1N0YWNrKVxuICAgKiAgIEV2ZW50U3RhY2stLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5FdmVudFBhcnNlcjogcGFyc2VFdmVudE5hbWUoZXZ0LmV2ZW50TmFtZSlcbiAgICogICBFdmVudFBhcnNlci0tPj5GYWJyaWNEaXNwYXRjaDogeyB0YWJsZSwgZXZlbnQsIG93bmVyIH1cbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBDaGVjayBpZiBldmVudCBpcyBmb3IgdGhpcyBNU1BcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZVBheWxvYWQoZXZ0LnBheWxvYWQpXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5PYnNlcnZlcnM6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIHBheWxvYWQuaWQpXG4gICAqICAgT2JzZXJ2ZXJzLS0+PkZhYnJpY0Rpc3BhdGNoOiBDYWxsYmFja3MgZXhlY3V0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVFdmVudHMoXG4gICAgY3R4QXJnPzogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmxpc3RlbmluZ1N0YWNrKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBFdmVudCBzdGFjayBub3QgaW5pdGlhbGl6ZWQuIEVuc3VyZSB0aGF0IFwic3RhcnRMaXN0ZW5pbmdcIiBpcyBjYWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdGhpcyBvcGVyYXRpb24uYFxuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5hZGFwdGVyIHx8ICF0aGlzLmFkYXB0ZXIuY29uZmlnKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgZm91bmQuIHNob3VsZCBiZSBpbXBvc3NpYmxlYCk7XG5cbiAgICBjb25zdCBjdHggPVxuICAgICAgY3R4QXJnIHx8XG4gICAgICAoYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgKHRoaXMubW9kZWxzICYmIHRoaXMubW9kZWxzWzBdKSB8fCAoTW9kZWwgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcilcbiAgICAgICkpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmhhbmRsZUV2ZW50cyk7XG5cbiAgICBsb2cuaW5mbyhcbiAgICAgIGBMaXN0ZW5pbmcgZm9yIGluY29taW5nIGV2ZW50cyBvbiBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCIuLi5gXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2dCBvZiB0aGlzLmxpc3RlbmluZ1N0YWNrKSB7XG4gICAgICAgIGNvbnN0IHsgdGFibGUsIGV2ZW50LCBvd25lciB9ID0gcGFyc2VFdmVudE5hbWUoZXZ0LmV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnPy5tc3BFdmVudE9ubHkgJiZcbiAgICAgICAgICBvd25lciAmJlxuICAgICAgICAgIG93bmVyICE9PSB0aGlzLmFkYXB0ZXIuY29uZmlnPy5tc3BJZFxuICAgICAgICApXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IHsgaWQ6IHN0cmluZzsgcmVzdWx0PzogYW55IH0gPSB0aGlzLnBhcnNlUGF5bG9hZChcbiAgICAgICAgICBldnQucGF5bG9hZFxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldE1vZGVsID0gdGFibGVcbiAgICAgICAgICAgID8gTW9kZWwuZ2V0KHRhYmxlKVxuICAgICAgICAgICAgOiBNb2RlbC5nZXQodGhpcy5tb2RlbHNbMF0ubmFtZSk7XG4gICAgICAgICAgY29uc3QgbW9kZWxSZWYgPSB0YXJnZXRNb2RlbCA/PyAodGFibGUgfHwgdGhpcy5tb2RlbHNbMF0/Lm5hbWUpO1xuICAgICAgICAgIGNvbnN0IG9ic2VydmVyQXJncyA9IHBheWxvYWQucmVzdWx0ID8gW3BheWxvYWQucmVzdWx0LCBjdHhdIDogW2N0eF07XG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICBtb2RlbFJlZiBhcyBDb25zdHJ1Y3RvciB8IHN0cmluZyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgcGF5bG9hZC5pZCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAuLi4ob2JzZXJ2ZXJBcmdzIGFzIENvbnRleHR1YWxBcmdzPGFueT4pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdXBkYXRlIG9ic2VydmFibGVzIGZvciB0YWJsZSAke3RhYmxlfSBldmVudCAke2V2ZW50fSBpZDogJHtwYXlsb2FkLmlkfTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBsb2cuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBldmVudCBmb3IgY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoY3R4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lclxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29yayBhbmQgc3RhcnRzIGxpc3RlbmluZyBmb3IgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvciBjb25maWcgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgXCJkaXNwYXRjaFwiLFxuICAgICAge1xuICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICB9LFxuICAgICAgTW9kZWwgYXMgYW55XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBhd2FpdCBGYWJyaWNDbGllbnRBZGFwdGVyLmdldEdhdGV3YXkoXG4gICAgICBjdHgsXG4gICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnIGFzIFBlZXJDb25maWcsXG4gICAgICB0aGlzLmNsaWVudFxuICAgICk7XG4gICAgY29uc3QgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWwpO1xuICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG4gICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IGF3YWl0IG5ldHdvcmsuZ2V0Q2hhaW5jb2RlRXZlbnRzKFxuICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lXG4gICAgKTtcbiAgICB0aGlzLmhhbmRsZUV2ZW50cyhjdHgpO1xuXG4gICAgLy8gZmFsbGJhY2sgZm9yIGZ1bGx5IHNlZ3JlZ2F0ZWQgbW9kZWxzICh0aGUgYWRhcHRlciBkb2VzbnQgc2VudCBldmVudHMgaWYgc28pXG5cbiAgICAoXG4gICAgICBbXG4gICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBdIGFzIChrZXlvZiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pW11cbiAgICApLmZvckVhY2goKHRvV3JhcCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyBhZGFwdGVyIHByb3ZpZGVkIGZvciB0aGUgZmFsbGJhY2sgb2YgZnVsbHkgc2VncmVnYXRlZCBtb2RlbHNgXG4gICAgICAgICk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlclt0b1dyYXBdKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWV0aG9kICR7dG9XcmFwfSBub3QgZm91bmQgaW4gJHt0aGlzLmFkYXB0ZXIuYWxpYXN9IGFkYXB0ZXIgdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcblxuICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMuYWRhcHRlciwgdG9XcmFwKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gdGhpcy5hZGFwdGVyO1xuICAgICAgd2hpbGUgKCFkZXNjcmlwdG9yICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHRvV3JhcCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGVzY3JpcHRvciB8fCAhZGVzY3JpcHRvci53cml0YWJsZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0aG9kICR7dG9XcmFwfSB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBidWxrVG9TaW5nbGUobWV0aG9kOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5VUERBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkRFTEVURTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgYXJlIHJlYWQgb25seSBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLmFkYXB0ZXJbdG9XcmFwXSA9IG5ldyBQcm94eSh0aGlzLmFkYXB0ZXJbdG9XcmFwXSwge1xuICAgICAgICBhcHBseTogYXN5bmMgKFxuICAgICAgICAgIHRhcmdldDogYW55LFxuICAgICAgICAgIHRoaXNBcmc6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgICAgICAgYXJnQXJyYXk6IGFueVtdXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIC8vIFJ1biB0aGUgb3JpZ2luYWwgbWV0aG9kIHVuY2hhbmdlZCBzbyB0cmFuc2llbnQgZGF0YSBpcyBwcmVzZXJ2ZWRcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJnQXJyYXkpO1xuXG4gICAgICAgICAgY29uc3QgY2xheno6IENvbnN0cnVjdG9yPGFueT4gPSBhcmdBcnJheVswXTtcbiAgICAgICAgICAvLyBGdWxseS1wdWJsaWMgbW9kZWxzIGVtaXQgYSBjaGFpbmNvZGUgZXZlbnQgb24gdGhlIGNvbnRyYWN0IHNpZGU7XG4gICAgICAgICAgLy8gc2tpcCB0aGUgbG9jYWwgZmFsbGJhY2sgdG8gYXZvaWQgZG91YmxlLW5vdGlmaWNhdGlvbi5cbiAgICAgICAgICBpZiAoIU1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSkgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICAgIC8vIENvbnRleHQgaXMgYWx3YXlzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYXJnQXJyYXlcbiAgICAgICAgICBjb25zdCB7IGxvZywgY3R4QXJncywgY3R4IH0gPSB0aGlzQXJnW1wibG9nQ3R4XCJdKFxuICAgICAgICAgICAgYXJnQXJyYXkuc2xpY2UoYXJnQXJyYXkubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICB0YXJnZXRcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGlkcyA9IGFyZ0FycmF5WzFdO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEFyZ3M6IGFueVtdID0gW2NsYXp6LCBidWxrVG9TaW5nbGUodG9XcmFwKSwgaWRzXTtcblxuICAgICAgICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJvYnNlcnZlRnVsbFJlc3VsdFwiKSkge1xuICAgICAgICAgICAgcmVzdWx0QXJncy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgICAgICAgLi4uKHJlc3VsdEFyZ3MgYXMgUGFyYW1ldGVyczx0eXBlb2YgdGhpcy51cGRhdGVPYnNlcnZlcnM+KSxcbiAgICAgICAgICAgIC4uLmN0eEFyZ3NcbiAgICAgICAgICApLmNhdGNoKChlOiB1bmtub3duKSA9PlxuICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRpc3BhdGNoIG9ic2VydmVyIHJlZnJlc2ggZm9yICR7dG9XcmFwfSBvbiAke2NsYXp6Lm5hbWUgfHwgY2xhenp9IGZvciAke2lkc306ICR7ZX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuaWYgKEZhYnJpY0NsaWVudEFkYXB0ZXIpXG4gIEZhYnJpY0NsaWVudEFkYXB0ZXJbXCJfYmFzZURpc3BhdGNoXCJdID0gRmFicmljQ2xpZW50RGlzcGF0Y2g7XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbImVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZSIsImZpbGVQYXRoIiwiZnMiLCJyZXF1aXJlIiwicGF0aCIsImRpcm5hbWUiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwiZ2VuZXJhdGVNb2RlbEluZGV4ZXMiLCJtIiwiZ2VuZXJhdGVJbmRleGVzIiwiZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3MiLCJhY2N1bSIsInZpZXdzIiwiZ2VuZXJhdGVWaWV3cyIsInN0b3JhZ2UiLCJmb3JFYWNoIiwiZG9jIiwiX2lkIiwicmVhZE1vZGVsRmlsZSIsImZpbGUiLCJleHBvcnRzIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJwYXJlbnRQYXRoIiwibmFtZSIsInZhbHVlcyIsIk9iamVjdCIsImZpbHRlciIsImUiLCJNb2RlbCIsImFzeW5jIiwicmVhZE1vZGVsRm9sZGVycyIsImZvbGRlcnMiLCJyZXN1bHQiLCJmb2xkZXIiLCJmaWxlcyIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsInJlY3Vyc2l2ZSIsImYiLCJpc0ZpbGUiLCJlbmRzV2l0aCIsInB1c2giLCJ3cml0ZUluZGV4ZXMiLCJpbmRleGVzIiwicCIsImNvbGxlY3Rpb24iLCJpbmRleCIsInJlc29sdmUiLCJ3cml0ZUZpbGVTeW5jIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuZGVmaW5lZCIsIndyaXRlRGVzaWduRG9jcyIsImRlc2lnbkRvY3MiLCJsZW5ndGgiLCJkb2NJZCIsInJlcGxhY2UiLCJwYXlsb2FkIiwiX3JldiIsImNvbGxlY3Rpb25Gb3IiLCJjb2xsZWN0aW9uTmFtZSIsInBvbGljeSIsInJlcXVpcmVkUGVlckNvdW50IiwibWF4UGVlckNvdW50IiwiYmxvY2tUb0xpdmUiLCJtZW1iZXJPbmx5UmVhZCIsIm1lbWJlck9ubHlXcml0ZSIsInByaXZhdGVDb2xsZWN0aW9uRm9yIiwibXNwSWQiLCJjIiwiZW5kb3JzZW1lbnRQb2xpY3kiLCJzaWduYXR1cmVQb2xpY3kiLCJzaGFyZWRDb2xsZWN0aW9uRm9yIiwibXNwSWRzIiwibWFwIiwiZXh0cmFjdENvbGxlY3Rpb25zIiwib3ZlcnJpZGVzIiwibWlycm9yIiwicHJpdmF0ZUNvbHMiLCJzaGFyZWRDb2xzIiwiY29sbGVjdGlvbnNGb3IiLCJyZXNvbHZlQ29sbGVjdGlvbiIsImFyZyIsIkludGVybmFsRXJyb3IiLCJwcml2YXRlRGVmYXVsdHMiLCJhc3NpZ24iLCJzaGFyZWREZWZhdWx0cyIsIm1pcnJvck1ldGEiLCJtaXJyb3JlZEF0IiwicHJpdmF0ZXMiLCJmbGF0IiwicmVzb2x2ZWQiLCJyZXNvbHZlciIsInNvbWUiLCJpbmNsdWRlcyIsInNoYXJlZCIsIndyaXRlQ29sbGVjdGlvbnMiLCJjb2xzIiwiZmlsZU5hbWUiLCJ3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzIiwiZG9jcyIsIkZhYnJpY0NsaWVudFJlcG9zaXRvcnkiLCJSZXBvc2l0b3J5IiwiY29uc3RydWN0b3IiLCJhZGFwdGVyIiwiY2xhenoiLCJzdXBlciIsInRoaXMiLCJfb3ZlcnJpZGVzIiwiaWdub3JlVmFsaWRhdGlvbiIsImlnbm9yZUhhbmRsZXJzIiwiYWxsb3dSYXdTdGF0ZW1lbnRzIiwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllcyIsImZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzIiwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUiLCJyZWJ1aWxkV2l0aFRyYW5zaWVudCIsIm92ZXJyaWRlIiwiZmxhZ3MiLCJmb3IiLCJPYnNlcnZlckhhbmRsZXIiLCJwYWdpbmF0ZUJ5Iiwia2V5Iiwib3JkZXIiLCJyZWYiLCJvZmZzZXQiLCJsaW1pdCIsImFyZ3MiLCJsb2ciLCJjdHhBcmdzIiwibG9nQ3R4IiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiUEFHRV9CWSIsInZlcmJvc2UiLCJ0YWJsZU5hbWUiLCJjbGFzcyIsInN0YXRlbWVudCIsImJvb2ttYXJrIiwibGlzdEJ5IiwiTElTVF9CWSIsImZpbmRCeSIsInZhbHVlIiwiRklORF9CWSIsImZpbmRPbmVCeSIsIkZJTkRfT05FX0JZIiwiZmluZCIsIk9yZGVyRGlyZWN0aW9uIiwiQVNDIiwiRklORCIsInBhZ2UiLCJkaXJlY3Rpb24iLCJQQUdFIiwiY3R4IiwiUGVyc2lzdGVuY2VLZXlzIiwiU1RBVEVNRU5UIiwiY2FsbEFyZ3MiLCJzbGljZSIsInBhcnNlIiwiZGVjb2RlIiwiZXZhbHVhdGVUcmFuc2FjdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsInIiLCJDb3VjaERCS2V5cyIsIlRBQkxFIiwiUGFnaW5hdG9yIiwiaXNTZXJpYWxpemVkUGFnZSIsImRhdGEiLCJkIiwiY291bnRPZiIsIkNPVU5UX09GIiwic3RtdEFyZ3MiLCJtYXhPZiIsIk1BWF9PRiIsIm1pbk9mIiwiTUlOX09GIiwiYXZnT2YiLCJBVkdfT0YiLCJzdW1PZiIsIlNVTV9PRiIsImRpc3RpbmN0T2YiLCJESVNUSU5DVF9PRiIsImdyb3VwT2YiLCJHUk9VUF9PRiIsImhlYWx0aGNoZWNrIiwiY3JlYXRlIiwibW9kZWwiLCJkZWJ1ZyIsImVuc3VyZUxlZ2FjeU1pcnJvckZsYWciLCJwcmVwYXJlZCIsInByZXBhcmUiLCJyZWNvcmQiLCJpZCIsInRyYW5zaWVudCIsInJldmVydCIsInVwZGF0ZSIsImNyZWF0ZUFsbFByZWZpeCIsIm1vZGVscyIsIk9wZXJhdGlvbktleXMiLCJDUkVBVEUiLCJnZXQiLCJpZ25vcmVWYWxpZGF0ZSIsIlByb21pc2UiLCJhbGwiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiT04iLCJpZ25vcmVkUHJvcHMiLCJlcnJvcnMiLCJoYXNFcnJvcnMiLCJlcnJvck1lc3NhZ2VzIiwicmVkdWNlRXJyb3JzVG9QcmludCIsIlZhbGlkYXRpb25FcnJvciIsImNyZWF0ZUFsbCIsImlkcyIsInBheWxvYWRzIiwidHJhbnNpZW50cyIsImNyZWF0ZWQiLCJpIiwicmVhZEFsbCIsImtleXMiLCJyZWNvcmRzIiwidXBkYXRlQWxsIiwidXBkYXRlZCIsInUiLCJhY2N1bXVsYXRlIiwibGVnYWN5IiwiRVJDMjBUb2tlbiIsIkJhc2VNb2RlbCIsIl9fZGVjb3JhdGUiLCJwayIsInR5cGUiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJjb2x1bW4iLCJyZXF1aXJlZCIsInRhYmxlIiwiRVJDMjBXYWxsZXQiLCJBbGxvd2FuY2UiLCJDbGllbnRTZXJpYWxpemVyIiwiSlNPTlNlcmlhbGl6ZXIiLCJwcmVTZXJpYWxpemUiLCJtb2RlbE5hbWUiLCJ0b1NlcmlhbGl6ZSIsIm1ldGFkYXRhIiwiTWV0YWRhdGEiLCJTZXJpYWxpemF0aW9uRXJyb3IiLCJNb2RlbEtleXMiLCJBTkNIT1IiLCJkZXNlcmlhbGl6ZSIsInN0ciIsImRlc2VyaWFsaXphdGlvbiIsImNsYXNzTmFtZSIsIkVycm9yIiwiYnVpbGQiLCJzZXJpYWxpemUiLCJGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkiLCJzZXJpYWxpemVyIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwidXBkYXRlT2JzZXJ2ZXJzIiwiZXZlbnQiLCJvYnNlcnZlckhhbmRsZXIiLCJjb3VudCIsInBhcnNlZElkIiwiU2VxdWVuY2UiLCJwYXJzZVZhbHVlIiwic2VxdWVuY2VGb3IiLCJ0b2tlbk5hbWUiLCJzeW1ib2wiLCJkZWNpbWFscyIsIk51bWJlciIsInRvdGFsU3VwcGx5IiwidG90YWwiLCJiYWxhbmNlT2YiLCJvd25lciIsImJhbGFuY2UiLCJ0cmFuc2ZlciIsInRvIiwidHJhbnNmZXJyZWQiLCJzdWJtaXRUcmFuc2FjdGlvbiIsInRvU3RyaW5nIiwidHJhbnNmZXJGcm9tIiwiZnJvbSIsImNvbnRleHRBcmdzIiwiQ29udGV4dCIsImFwcHJvdmUiLCJzcGVuZGVyIiwiYXBwcm92ZWQiLCJhbGxvd2FuY2UiLCJpbml0aWFsaXplIiwidG9rZW4iLCJpbml0aWxpYXplZCIsImNoZWNrSW5pdGlhbGl6ZWQiLCJtaW50IiwiYW1vdW50IiwiYnVybiIsImJ1cm5Gcm9tIiwiYWNjb3VudCIsImNsaWVudEFjY291bnRCYWxhbmNlIiwic2VyaWFsaXplZEFjY291bnRCYWxhbmNlIiwiY2xpZW50QWNjb3VudElEIiwiZXh0cmFjdElkcyIsImNvbXBvc2VkIiwicGtQcm9wcyIsImV4dHJhY3RJZCIsImNvbXBvc2VBdHRyaWJ1dGVWYWx1ZSIsIklkZW50aXR5Q3JlZGVudGlhbHMiLCJkZXNjcmlwdGlvbiIsIkZhYnJpY01vZGVsS2V5cyIsIklkZW50aXR5VHlwZSIsIkZhYnJpY0ZsYXZvdXIiLCJJZGVudGl0eSIsIlg1MDkiLCJvbmVUb09uZSIsIkNhc2NhZGUiLCJDQVNDQURFIiwiZGVsZXRlIiwiQ29yZVV0aWxzIiwibG9nZ2VyIiwiTWluaUxvZ2dlciIsImNvbnRlbnRPZkxvYWRGaWxlIiwiY29udGVudE9yUGF0aCIsImZpbGVSZWFkZXIiLCJVaW50OEFycmF5IiwibWF0Y2giLCJyZWFkRmlsZSIsInByb21pc2VzIiwibm9ybWFsaXplSW1wb3J0IiwiaW1wb3J0IiwiZ2V0Q0FVc2VyIiwidXNlck5hbWUiLCJwcml2YXRlS2V5IiwiY2VydGlmaWNhdGUiLCJvcHRpb25zIiwic3RyaW5nRm9ybWF0IiwidXNlciIsIlVzZXIiLCJjb25maWciLCJoc20iLCJzb2Z0d2FyZSIsImxpYiIsImxpYnJhcnkiLCJzbG90IiwibGFiZWwiLCJ0b2tlbkxhYmVsIiwicGluIiwiY3J5cHRvU3VpdGUiLCJnZXRDcnlwdG9TdWl0ZSIsInNldENyeXB0b1N1aXRlIiwiZW5yb2xsbWVudEtleSIsImdldEhTTUVucm9sbG1lbnRLZXkiLCJnZXRTb2Z0d2FyZUVucm9sbG1lbnRLZXkiLCJzZXRFbnJvbGxtZW50IiwibmV3Q3J5cHRvU3VpdGUiLCJjcmVhdGVLZXlGcm9tUmF3Iiwic2tpIiwia2V5SWRIZXgiLCJ0cmltIiwiQnVmZmVyIiwiZ2V0Q2VydGlmaWNhdGVTS0kiLCJnZXRLZXkiLCJpc1ByaXZhdGUiLCJ4NTA5IiwiWDUwOUNlcnRpZmljYXRlIiwiandrIiwicHVibGljS2V5IiwiZXhwb3J0IiwiZm9ybWF0IiwicHJlZml4IiwieCIsInkiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiY29uY2F0IiwiZGlnZXN0IiwiZ2V0SWRlbnRpdHkiLCJjZXJ0RGlyZWN0b3J5UGF0aCIsImlkZW50aXR5RmlsZVJlYWRlciIsImNlcnRQYXRoIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZSIsImNyZWRlbnRpYWxzIiwiZGlyUGF0aCIsInJlYWRkaXIiLCJnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCIsImdldEZpbGVDb250ZW50IiwiZ2V0U2lnbmVyIiwia2V5RGlyZWN0b3J5UGF0aCIsInNpZ25lckZpbGVSZWFkZXIiLCJrZXlQYXRoIiwicHJpdmF0ZUtleVBlbSIsImV4dHJhY3RQcml2YXRlS2V5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiayIsInNpZ25lcnMiLCJuZXdQcml2YXRlS2V5U2lnbmVyIiwicGVtIiwibGliTmFtZSIsInN1YnRsZSIsImdsb2JhbFRoaXMiLCJ3aW5kb3ciLCJDcnlwdG8iLCJ3ZWJjcnlwdG8iLCJzdHIyYWIiLCJidWYiLCJBcnJheUJ1ZmZlciIsImJ1ZlZpZXciLCJzdHJMZW4iLCJjaGFyQ29kZUF0IiwicmVwbGFjZUFsbCIsImRlY29kZWQiLCJiaW5hcnlEZXIiLCJpbXBvcnRLZXkiLCJuYW1lZEN1cnZlIiwiZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQiLCJjZXJ0IiwieDUwOUNlcnRpZmljYXRlIiwiWDUwOUNlcnQiLCJha2lFeHQiLCJleHRlbnNpb25zIiwiYWtpIiwidG9VcHBlckNhc2UiLCJzdGFydHNXaXRoIiwic2VyaWFsIiwic2VyaWFsTnVtYmVyIiwiY3J5cHRvUHJvdmlkZXIiLCJzZXQiLCJCQVNFX0FMUEhBQkVUIiwiQ1JZUFRPIiwiQmFzZUVuY29kZXIiLCJhbHBoYWJldCIsImJhc2VNYXAiLCJqIiwiY2hhckF0IiwieGMiLCJiYXNlIiwibGVhZGVyIiwiZmFjdG9yIiwiTWF0aCIsImlGYWN0b3IiLCJlbmNvZGUiLCJzb3VyY2UiLCJpc1ZpZXciLCJidWZmZXIiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInplcm9lcyIsInBiZWdpbiIsInBlbmQiLCJzaXplIiwiYjU4IiwiY2FycnkiLCJpdDEiLCJpdDIiLCJyZXBlYXQiLCJkZWNvZGVVbnNhZmUiLCJwc3oiLCJiMjU2IiwiaXQzIiwiaXQ0IiwidmNoIiwiQ3J5cHRvVXRpbHMiLCJiNThlbmNvZGVyIiwiQkFTRTU4IiwiZmFicmljSWRGcm9tQ2VydGlmaWNhdGUiLCJzdWJqZWN0IiwiaXNzdWVyIiwic3RyaW5nVG9BcnJheUJ1ZmZlciIsImV4dHJhY3RLZXkiLCJ1c2FnZXMiLCJSZWdFeHAiLCJleHRyYWN0UHVibGljS2V5Iiwic2lnbiIsImJ1ZmYiLCJoYXNoIiwiYiIsInBhZFN0YXJ0IiwidmVyaWZ5Iiwic2lnbmF0dXJlIiwiZW5jcnlwdCIsImdldFN1YnRsZUNyeXB0byIsImlzQnJvd3NlciIsImRlY3J5cHQiLCJnZXRNYXN0ZXIiLCJ0ZXh0RW5jb2RlciIsIlRleHRFbmNvZGVyIiwiZ2VuR2VuZXNpcyIsInJhbmRvbVVVSUQiLCJpbXBvcnRlZEtleSIsIktFWV9BTEdPUllUSE0iLCJpdiIsImdldERlcml2YXRpb25LZXkiLCJzYWx0Iiwic2FsdEJ1ZmZlciIsInNhbHRIYXNoZWQiLCJwYXJhbXMiLCJIQVNIIiwiaXRlcmF0aW9ucyIsIklURVJBVElPTlMiLCJkZXJpdmF0aW9uIiwiZGVyaXZlQml0cyIsIktFWUxFTkdUSCIsIml2bGVuIiwia2V5bGVuIiwiZGVyaXZlZEtleSIsImltcG9ydGVkRW5jcnlwdGlvbktleSIsIkFMR09SWVRITSIsImVuY3J5cHRQaW4iLCJ0ZXh0Iiwia2V5T2JqZWN0IiwidGV4dEJ1ZmZlciIsImVuY3J5cHRlZFRleHQiLCJkZWNyeXB0UGluIiwidGV4dERlY29kZXIiLCJkZWNyeXB0ZWRUZXh0IiwiT3ZlcmZsb3dFcnJvciIsIm1zZyIsIkJhbGFuY2VFcnJvciIsIkFsbG93YW5jZUVycm9yIiwiUmVnaXN0cmF0aW9uRXJyb3IiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJNaXNzaW5nQ29udGV4dEVycm9yIiwiVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MiLCJCYXNlRXJyb3IiLCJOb3RJbml0aWFsaXplZEVycm9yIiwiTWlzc2luZ1BLQ1NTMTFMaWIiLCJFbmRvcnNlbWVudEVycm9yIiwibWVzc2FnZSIsIk12Y2NSZWFkQ29uZmxpY3RFcnJvciIsIlBoYW50b21SZWFkQ29uZmxpY3RFcnJvciIsIkVuZG9yc2VtZW50UG9saWN5RXJyb3IiLCJUcmFuc2FjdGlvbkxpbWl0c0Vycm9yIiwiY29kZSIsIlRyYW5zYWN0aW9uVGltZW91dEVycm9yIiwiVHJhbnNhY3Rpb25CdWZmZXJTaXplRXJyb3IiLCJIRkNBSWRlbnRpdHlUeXBlIiwiSEZDQUlkZW50aXR5QXR0cmlidXRlcyIsIkZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIiwiTG9nZ2VkQ2xhc3MiLCJjYUNvbmZpZyIsImNhTmFtZSIsImNhQ2VydCIsImNhS2V5IiwidXJsIiwiQ0EiLCJjYSIsInRscyIsInRydXN0ZWRSb290cyIsInJvb3QiLCJGYWJyaWNDQVNlcnZpY2VzIiwiQ2xpZW50IiwiY2xpZW50IiwiQ2VydGlmaWNhdGUiLCJjZXJ0aWZpY2F0ZVNlcnZpY2UiLCJuZXdDZXJ0aWZpY2F0ZVNlcnZpY2UiLCJBZmZpbGlhdGlvbnMiLCJhZmZpbGlhdGlvblNlcnZpY2UiLCJuZXdBZmZpbGlhdGlvblNlcnZpY2UiLCJJZGVudGl0aWVzIiwiaWRlbnRpdHlTZXJ2aWNlIiwibmV3SWRlbnRpdHlTZXJ2aWNlIiwiZ2V0Q2VydGlmaWNhdGVzIiwicmVxdWVzdCIsImRvTWFwIiwicmVzcG9uc2UiLCJjZXJ0cyIsIlBFTSIsImdldElkZW50aXRpZXMiLCJpZGVudGl0aWVzU2VydmljZSIsImdldEFsbCIsImlkZW50aXRpZXMiLCJwYXJzZUVycm9yIiwicmVnZXhwIiwiZXhlYyIsIkNvbmZsaWN0RXJyb3IiLCJnZXRBZmZpbGlhdGlvbnMiLCJhIiwicmVhZCIsImVucm9sbG1lbnRJZCIsImdldE9uZSIsIk5vdEZvdW5kRXJyb3IiLCJzdWNjZXNzIiwicmVnaXN0ZXIiLCJpc1N1cGVyVXNlciIsImFmZmlsaWF0aW9uIiwidXNlclJvbGUiLCJhdHRycyIsIm1heEVucm9sbG1lbnRzIiwicmVnaXN0cmF0aW9uIiwicGFzc3dvcmQiLCJwcm9wcyIsImVucm9sbG1lbnRJRCIsImVucm9sbG1lbnRTZWNyZXQiLCJpbmZvIiwiaWRlbnRpdHlGcm9tRW5yb2xsbWVudCIsImVucm9sbG1lbnQiLCJyb290Q2VydGlmaWNhdGUiLCJMb2dnaW5nIiwiY2xpZW50SWQiLCJub3ciLCJEYXRlIiwidG9CeXRlcyIsImNyZWF0ZWRPbiIsInVwZGF0ZWRPbiIsImVucm9sbCIsImlkZW50aXR5IiwicmVnaXN0ZXJBbmRFbnJvbGwiLCJyZXZva2UiLCJyZWFzb24iLCJSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciIsImVycnMiLCJyb2xlIiwic2V0QWZmaWxpYXRpb24iLCJhZGRBdHRyIiwiYXR0ciIsInNldEF0dHJzIiwic2V0RW5yb2xsbWVudElEIiwic2V0RW5yb2xsbWVudFNlY3JldCIsInNldE1heEVucm9sbG1lbnRzIiwic2V0Um9sZSIsIm1pbmxlbmd0aCIsIm1pbiIsIkVSQzIwRXZlbnRzIiwiRmFicmljQmFzZU1vZGVsIiwiY3JlYXRlZEF0IiwidXBkYXRlZEF0IiwidmVyc2lvbiIsInVzZXMiLCJGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsIiwiY3JlYXRlZEJ5IiwidXBkYXRlZEJ5IiwiaXNTaGFyZWQiLCJzZWdyZWdhdGUiLCJpc1RyYW5zaWVudCIsImRlY29yYXRlZFByb3BlcnRpZXMiLCJnZXRBdHRyaWJ1dGVzIiwidHJhbnNpZW50UHJvcHMiLCJEQktleXMiLCJUUkFOU0lFTlQiLCJwcml2YXRlUHJvcGVydGllcyIsIlBSSVZBVEUiLCJzaGFyZWRQcm9wZXJ0aWVzIiwiU0hBUkVEIiwicHVibGljIiwidHJhbnNpZW50S2V5cyIsInByaXZhdGVLZXlzIiwic2hhcmVkS2V5cyIsImlzUHVibGljIiwiYmluZCIsIm1pcnJvcmVkIiwiRkFCUklDIiwiTUlSUk9SIiwib3duZXJPZiIsIm1ldGEiLCJPV05FRF9CWSIsInNoYXJlZEtleSIsImNvbnN0ciIsInByaXZhdGVNZXRhIiwic2hhcmVkTWV0YSIsImNvbGxlY3Rpb25zIiwiZXh0cmFjdE1zcElkIiwiZ2V0TVNQSUQiLCJPd25lciIsInRhcmdldCIsInByb3BlcnR5S2V5IiwiZGVzY3JpcHRvciIsIm9yaWdpbmFsTWV0aG9kIiwiYWNvdW50SWQiLCJjbGllbnRJZGVudGl0eSIsImdldElEIiwic2VsZWN0IiwidG9rZW5zIiwiZXhlY3V0ZSIsImFwcGx5Iiwib3duZWRCeU9uQ3JlYXRlIiwiY29udGV4dCIsInN0dWIiLCJjcmVhdG9yIiwiZ2V0Q3JlYXRvciIsIm1zcGlkIiwic2V0T3duZWRCeUtleVZhbHVlIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJvd25lZEJ5Iiwib2JqIiwiYXR0cmlidXRlIiwiZ2VuZXJhdGVkIiwicmVhZG9ubHkiLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSIsIkRlY29yYXRpb24iLCJkZWZpbmUiLCJkZWNvcmF0b3IiLCJ0cmFuc2FjdGlvbklkT25DcmVhdGUiLCJnZXRUeElEIiwidHJhbnNhY3Rpb25JZCIsIm9uVXBkYXRlIiwiVFJBTlNBQ1RJT05fSUQiLCJldmFsTWlycm9yTWV0YWRhdGEiLCJjcmVhdGVNaXJyb3JIYW5kbGVyIiwiZmFicmljQ3R4Iiwic291cmNlTW9kZWwiLCJwdXQiLCJyZXBvIiwibWlycm9yQ29sbGVjdGlvbiIsInVwZGF0ZU1pcnJvckhhbmRsZXIiLCJhcHBseVVwZGF0ZVZhbGlkYXRpb24iLCJtZXJnZUZvclVwZGF0ZSIsImRlbGV0ZU1pcnJvckhhbmRsZXIiLCJwa1Byb3AiLCJzZWdyZWdhdGVkIiwibWlycm9yV3JpdGVHdWFyZCIsIm1zcCIsImNvbmRpdGlvbiIsInJlYWRNaXJyb3JIYW5kbGVyIiwibWF0Y2hlcyIsInJlYWRGcm9tIiwibXNwSWRPckNvbmRpdGlvbiIsImlzQ29uZGl0aW9uT25seSIsIkJvb2xlYW4iLCJjb25kIiwib25SZWFkIiwicHJpb3JpdHkiLCJvbkRlbGV0ZSIsIk1vZGVsQ29sbGVjdGlvbiIsIm9yZ05hbWUiLCJ0b1Bhc2NhbENhc2UiLCJOYW1lc3BhY2VDb2xsZWN0aW9uIiwibmFtZXNwYWNlIiwiSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbiIsIlNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZIiwiYXBwbHlTZWdyZWdhdGlvbkZsYWdzIiwiaXNGdWxseVNlZ3JlZ2F0ZWQiLCJoYXNQdWJsaWNQcm9wZXJ0aWVzIiwibWFya0Z1bGx5U2VncmVnYXRlZCIsImFwcGx5TWlycm9yRmxhZ3MiLCJhdHRyaWJ1dGVzIiwidHJhbnNpZW50TWV0YSIsImV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnMiLCJkYXRhQXJyYXkiLCJjb2xsZWN0aW9uUmVzb2x2ZXIiLCJzZXFOYW1lIiwic2VxdWVuY2VOYW1lIiwic2V0U2VxdWVuY2VTZWdyZWdhdGlvbiIsInNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUiLCJrZXlBcnJheSIsIl9rIiwiVW5zdXBwb3J0ZWRFcnJvciIsImtleVN0cmluZ3MiLCJ3cml0ZVRvIiwic2VncmVnYXRlZERhdGFPblJlYWQiLCJzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIiwib2xkTW9kZWwiLCJzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIiwiaW5uZXJTZWdyZWdhdGVkIiwic2VncmVnYXRlZERlYyIsIlNldCIsImFkZCIsImNvbnN0ck1ldGEiLCJjb25zdHJDb2xsZWN0aW9ucyIsInVwZGF0ZWRUcmFuc2llbnRNZXRhIiwiZGVjcyIsInByb3BlcnRpZXMiLCJncm91cE5hbWUiLCJleHRyYWN0R3JvdXBOYW1lIiwiZGF0YUdyb3VwTmFtZSIsImVhcmx5RXh0cmFjdGlvbk1ldGEiLCJlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQiLCJncm91cCIsInByb3AiLCJvbiIsIkRCT3BlcmF0aW9ucyIsIkFMTCIsInByaXZhdGVEYXRhIiwic2hhcmVkRGF0YSIsInNvcnRLZXlzT25seVJlY3Vyc2l2ZSIsInNvcnQiLCJyZWR1Y2UiLCJhY2MiLCJEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsImVycm9yIiwic2VsZiIsIm8iLCJjYWxsIiwicmVsYXRpb25zIiwiZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUiLCJwYXJzZUV2ZW50TmFtZSIsInBhcnRzIiwic3BsaXQiLCJzdWIiLCJzYWZlUGFyc2VJbnQiLCJzdHJpbmciLCJkaWdpdFJlZ2V4IiwidGVzdCIsInBhcnNlZGludCIsInBhcnNlSW50IiwiaXNOYU4iLCJTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsInB1dEFuY2hvciIsInByZVNlcmlhbGl6YXRpb24iLCJGYWJyaWNJZGVudGl0eVNlcnZpY2UiLCJDbGllbnRCYXNlZFNlcnZpY2UiLCJyb290Q2xpZW50IiwiX3VzZXIiLCJjZXJ0aWZpY2F0ZXMiLCJhZmZpbGlhdGlvbnMiLCJnZXRVc2VyIiwiY2ZnIiwiSU5JVElBTElaQVRJT04iLCJnZXROYW1lIiwiUkVBRCIsInVwZGF0ZUlkZW50aXR5IiwiaWRlbnRpdHlSZXF1ZXN0IiwiY2FVc2VySWRlbnRpdHkiLCJyZWVucm9sbFVzZXIiLCJjcmVhdGVVc2VyIiwiZ2V0TXNwaWQiLCJlbnJvbGxtZW50QXR0cnMiLCJvcHRpb25hbCIsInJlZW5yb2xsIiwicmVuZXdlZElkZW50aXR5IiwicmV2b2tlT3B0aW9ucyIsInJldm9rZVJlcXVlc3QiLCJDQV9ST0xFIiwiRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIiwiZXZhbHVhdGVUaW1lb3V0IiwiZW5kb3JzZVRpbWVvdXQiLCJzdWJtaXRUaW1lb3V0IiwiY29tbWl0VGltZW91dCIsImFsbG93TWFudWFsRW5kb3JzaW5nT3JncyIsImFsbG93R2F0ZXdheU92ZXJyaWRlIiwiZW5jcnlwdFRyYW5zaWVudCIsImVzY2FwZVJlZ0V4cCIsIm5leHRMZXhpY29ncmFwaGljU3RyaW5nIiwiY2hhcnMiLCJjb2RlUG9pbnRBdCIsImZyb21Db2RlUG9pbnQiLCJwcmVmaXhSYW5nZSIsInN0YXJ0IiwiZW5kIiwiRmFicmljQ2xpZW50U3RhdGVtZW50IiwiU3RhdGVtZW50Iiwic3F1YXNoIiwic3F1YXNoZWQiLCJtZXRob2QiLCJleGVjdXRlUHJlcGFyZWQiLCJhcmd6IiwiZm9yTW9kZWwiLCJmcm9tU2VsZWN0b3IiLCJhbGlhcyIsIlFVRVJZIiwiaXNTaW1wbGVRdWVyeSIsIlF1ZXJ5Q2xhdXNlIiwid2hlcmVDb25kaXRpb24iLCJwYXJzZWQiLCJwcmVwYXJlQ29uZGl0aW9uIiwic2VsZWN0U2VsZWN0b3IiLCJTRUxFQ1QiLCJBTkQiLCJ0b0xvd2VyQ2FzZSIsIm9yZGVyQnlTZWxlY3RvcnMiLCJPUkRFUl9CWSIsInRvQ2FtZWxDYXNlIiwicHJvY2Vzc1JlY29yZCIsInBrQXR0ciIsInNlcXVlbmNlVHlwZSIsIklEIiwia2V5QXJncyIsIlNFUEFSQVRPUiIsInJhdyIsInJhd0lucHV0IiwiYWdncmVnYXRvciIsImFnZ3JlZ2F0ZUluZm8iLCJhZ2dyZWdhdGUiLCJleGVjdXRlQWdncmVnYXRlIiwicmVzdWx0cyIsImFnZ3JlZ2F0ZVF1ZXJ5IiwiYnVpbGRBZ2dyZWdhdGVRdWVyeSIsInNlbGVjdG9ycyIsInF1ZXJ5Iiwic2VsZWN0b3IiLCJmaWVsZHMiLCJwYXJzZUNvbmRpdGlvbiIsIkNvbmRpdGlvbiIsImFuZCIsImVxIiwic2VsZWN0b3JLZXlzIiwiQ291Y2hEQkdyb3VwT3BlcmF0b3IiLCJpbmRleE9mIiwidmFsIiwiT1IiLCJzIiwiZW50cmllcyIsIndhcm4iLCJzZWxlY3RvcktleSIsInJlYyIsIkNvdWNoREJPcGVyYXRvciIsIkJJR0dFUiIsImxpbWl0U2VsZWN0b3IiLCJDb3VjaERCUXVlcnlMaW1pdCIsIm9mZnNldFNlbGVjdG9yIiwic2tpcCIsIm1lcmdlIiwib3AiLCJvYmoxIiwib2JqMiIsImF0dHIxIiwib3BlcmF0b3IiLCJjb21wYXJpc29uIiwiT3BlcmF0b3IiLCJTVEFSVFNfV0lUSCIsIlF1ZXJ5RXJyb3IiLCJyYW5nZSIsIkJJR0dFUl9FUSIsIlNNQUxMRVIiLCJFTkRTX1dJVEgiLCJSRUdFWFAiLCJCRVRXRUVOIiwibWF4Iiwib3BCZXR3ZWVuIiwidHJhbnNsYXRlT3BlcmF0b3JzIiwiU01BTExFUl9FUSIsIkdyb3VwT3BlcmF0b3IiLCJOT1QiLCJvcDEiLCJvcDIiLCJhdmdTZWxlY3RvciIsInN1bUluZm8iLCJjcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yIiwiY291bnRJbmZvIiwiY3JlYXRlQWdncmVnYXRlUXVlcnkiLCJraW5kIiwic3VtRGVzY3JpcHRvciIsImNvdW50RGVzY3JpcHRvciIsImNvdW50RGlzdGluY3RTZWxlY3RvciIsImNvdW50RGlzdGluY3QiLCJhZ2dyZWdhdG9yVXNlZCIsImNvdW50U2VsZWN0b3IiLCJtaW5TZWxlY3RvciIsIm1heFNlbGVjdG9yIiwic3VtU2VsZWN0b3IiLCJkaXN0aW5jdFNlbGVjdG9yIiwiYWdncmVnYXRvckNoZWNrcyIsIm1ldGFzIiwiZmluZFZpZXdNZXRhZGF0YSIsInZpZXdOYW1lIiwiZ2VuZXJhdGVWaWV3TmFtZSIsImRkb2MiLCJnZW5lcmF0ZURlc2lnbkRvY05hbWUiLCJyZXR1cm5Eb2NzIiwidmlldyIsImdldEZhYnJpY0FkYXB0ZXIiLCJpc1ZpZXdBZ2dyZWdhdGUiLCJoYW5kbGVBdmVyYWdlIiwiZmFicmljQWRhcHRlciIsInZpZXdJbmZvIiwicHJvY2Vzc1ZpZXdSZXNwb25zZSIsInN1bURlc2MiLCJjb3VudERlc2MiLCJzdW1SZXNwb25zZSIsImNvdW50UmVzcG9uc2UiLCJzdW0iLCJyb3dzIiwicm93IiwiRmFicmljQ2xpZW50UGFnaW5hdG9yIiwicmF3U3RhdGVtZW50IiwiRmFicmljQ2xpZW50QWRhcHRlciIsIkFkYXB0ZXIiLCJvcGVyYXRpb24iLCJtZXJnZWRGbGFncyIsInNpbGx5IiwicG9wIiwidG9PdmVycmlkZXMiLCJuZXdDdHgiLCJwYXJlbnRDb250ZXh0IiwiY2hpbGRDb250ZXh0cyIsImdldE9yVW5kZWZpbmVkIiwiY3VycmVudE9wIiwiY3VycmVudE1vZGVsIiwicmVwb3NpdG9yeSIsImNyZWF0ZVByZWZpeCIsInVwZGF0ZUFsbFByZWZpeCIsInNoaWZ0IiwiaGFzVHJhbnNpZW50IiwibmVlZHNGdWxsUGF5bG9hZCIsInNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbiIsInRyYW5zaWVudFBheWxvYWQiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJDUkVBVEVfQUxMIiwiZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInJlcyIsInNob3VsZFJlZnJlc2hBZnRlcldyaXRlIiwiUkVBRF9BTEwiLCJVUERBVEVfQUxMIiwiZGVsZXRlQWxsIiwic2hvdWxkSHlkcmF0ZSIsIkRFTEVURV9BTEwiLCJNRVRBREFUQSIsIm1pcnJvck1zcCIsIm1zcHMiLCJtZXJnZWQiLCJlbmRvcnNpbmdPcmdzIiwiZW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50IiwidiIsImNoaWxkUmVidWlsZCIsImdldEZyb21DaGlsZHJlbiIsInJlc29sdmVkT3AiLCJyZXNvbHZlT3BlcmF0aW9uIiwiaGFzSWQiLCJkaXJlY3QiLCJkZXNlcmlhbGl6ZWQiLCJ1cGRhdGVQcmVmaXgiLCJVUERBVEUiLCJERUxFVEUiLCJkb2NzT25seSIsInRyYW5zYWN0aW9uUmVzdWx0IiwicGFyc2VSZWNvcmQiLCJpc01vZGVsIiwiZWwiLCJnZXRDbGllbnQiLCJfY2xpZW50IiwiR2F0ZXdheSIsImdldEdhdGV3YXkiLCJnZXRDb250cmFjdE5hbWUiLCJDb250cmFjdCIsImNvbnRyYWN0TmFtZSIsImdldENvbnRyYWN0IiwidHJhbnNhY3Rpb24iLCJhcGkiLCJzdWJtaXQiLCJ0cmFuc2llbnREYXRhIiwiZ2F0ZXdheSIsImNvbnRyYWN0IiwiZXZhbHVhdGUiLCJwcm9wb3NhbE9wdGlvbnMiLCJhcmd1bWVudHMiLCJjbG9zZSIsInNob3VsZFVzZUxlZ2FjeUdhdGV3YXkiLCJwcmVwYXJlTGVnYWN5QXJncyIsImJ1aWxkTGVnYWN5VHJhbnNpZW50IiwicmVzb2x2ZUxlZ2FjeU1zcENvdW50IiwiY29uZmlndXJlZCIsImxlZ2FjeU1zcENvdW50IiwiaXNGaW5pdGUiLCJmbG9vciIsInBpY2tMZWdhY3lDYW5kaWRhdGVzIiwiY2FuZGlkYXRlcyIsImF2YWlsYWJsZSIsInBpY2tlZCIsImlkeCIsInJhbmRvbSIsInNlbGVjdGlvbiIsInNwbGljZSIsImJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MiLCJwZWVycyIsInBlZXJFbmRwb2ludCIsInBlZXJIb3N0QWxpYXMiLCJ0bHNDZXJ0IiwiZW5kb3JzZXJzIiwib3JnIiwiZXh0cmFzIiwibXNwTWFwIiwibGVnYWN5Q291bnQiLCJzZWxlY3Rpb25zIiwiY2hvaWNlIiwiZW5kcG9pbnQiLCJzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMiLCJmY24iLCJ0cmFuc2llbnRNYXAiLCJwZWVyQ29uZmlncyIsIm5vcm1hbGl6ZUxlZ2FjeVBlZXJzIiwiaWRlbnRpdHlNYXRlcmlhbCIsInJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsIiwid2FsbGV0IiwiV2FsbGV0cyIsIm5ld0luTWVtb3J5V2FsbGV0IiwiaWRlbnRpdHlMYWJlbCIsImNvbm5lY3Rpb25Qcm9maWxlIiwiYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZSIsIkxlZ2FjeUdhdGV3YXkiLCJjb25uZWN0IiwiZGlzY292ZXJ5IiwiZW5hYmxlZCIsImFzTG9jYWxob3N0Iiwic2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0IiwidGxzSW5mbyIsIm5ldHdvcmsiLCJnZXROZXR3b3JrIiwiY2hhbm5lbCIsImNoYWluY29kZU5hbWUiLCJjcmVhdGVUcmFuc2FjdGlvbiIsInNldFRyYW5zaWVudCIsInBlZXIiLCJnZXRDaGFubmVsIiwiZ2V0RW5kb3JzZXIiLCJlbmRvcnNlciIsInNldEVuZG9yc2luZ1BlZXJzIiwiZGlzY29ubmVjdCIsImRlZHVwZWQiLCJNYXAiLCJhZGRQZWVyIiwiaGFzIiwicmVhZFBlbUlucHV0IiwiY2VydENlcnRPckRpcmVjdG9yeVBhdGgiLCJrZXlDZXJ0T3JEaXJlY3RvcnlQYXRoIiwicGVlckVudHJpZXMiLCJjaGFubmVsUGVlcnMiLCJvcmdzIiwidGxzUGVtIiwiaG9zdG5hbWUiLCJleHRyYWN0SG9zdCIsImVuc3VyZUdycGNVcmwiLCJ0bHNDQUNlcnRzIiwiZ3JwY09wdGlvbnMiLCJob3N0bmFtZU92ZXJyaWRlIiwiZW5kb3JzaW5nUGVlciIsImNoYWluY29kZVF1ZXJ5IiwibGVkZ2VyUXVlcnkiLCJldmVudFNvdXJjZSIsIm9yZ2FuaXphdGlvbiIsIm9yZ2FuaXphdGlvbnMiLCJvcmRlcmVycyIsImNoYW5uZWxzIiwiZXZlcnkiLCJpc0xvY2FsRW5kcG9pbnQiLCJob3N0Iiwic2FuaXRpemVkIiwiaXNCdWZmZXIiLCJ0cmltbWVkIiwic3RhdHMiLCJzdGF0IiwiY2F0Y2giLCJpc0RpcmVjdG9yeSIsInJlYWRGc0ZpbGUiLCJlcnIiLCJsZWdhY3lBcmdzIiwiY2hhbm5lbE5hbWUiLCJnZXRDb25uZWN0aW9uIiwicGF0aE9yQ2VydCIsInJlYWRGaWxlU3luYyIsInRsc0NyZWRlbnRpYWxzIiwiZ3JwYyIsImNyZWF0ZVNzbCIsInNpemVMaW1pdCIsInNpZ25lciIsImV2YWx1YXRlT3B0aW9ucyIsImRlYWRsaW5lIiwiZW5kb3JzZU9wdGlvbnMiLCJzdWJtaXRPcHRpb25zIiwiY29tbWl0U3RhdHVzT3B0aW9ucyIsIlByb3h5IiwidGhpc0FyZyIsImFyZ0FycmF5IiwiUmVmbGVjdCIsIkRpc3BhdGNoIiwiR2F0ZXdheUVycm9yIiwiZGV0YWlscyIsIkVuZG9yc2VFcnJvciIsIkJhZFJlcXVlc3RFcnJvciIsIlBhZ2luZ0Vycm9yIiwiTWlncmF0aW9uRXJyb3IiLCJPYnNlcnZlckVycm9yIiwiRm9yYmlkZGVuRXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJmaW5hbCIsIkQiLCJfYSIsImRlY29yYXRpb24iLCJzZXRDdXJyZW50IiwiRmFicmljQ2xpZW50RGlzcGF0Y2giLCJsb2dnZWRBcmdzIiwiU0hVVERPV04iLCJsaXN0ZW5pbmdTdGFjayIsInBhcnNlUGF5bG9hZCIsImpzb25CeXRlcyIsImpzb24iLCJvYnNlcnZlIiwib2JzZXJ2ZXIiLCJ1bk9ic2VydmUiLCJyZWZyZXNoIiwiaGFuZGxlRXZlbnRzIiwiY3R4QXJnIiwiY29ycmVsYXRpb25JZCIsImV2dCIsImV2ZW50TmFtZSIsIm1zcEV2ZW50T25seSIsInRhcmdldE1vZGVsIiwibW9kZWxSZWYiLCJvYnNlcnZlckFyZ3MiLCJnZXRDaGFpbmNvZGVFdmVudHMiLCJ0b1dyYXAiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwcm90byIsImdldFByb3RvdHlwZU9mIiwiYnVsa1RvU2luZ2xlIiwicmVzdWx0QXJncyIsIlZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJyZWdpc3RlckxpYnJhcnkiXSwibWFwcGluZ3MiOiI7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
3745
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRSZXBvc2l0b3J5LnRzIiwiLi4vc3JjL2NvbnRyYWN0cy9lcmMyMC9tb2RlbHMudHMiLCIuLi9zcmMvc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvY2xpZW50L2VyYzIwL0ZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jbGllbnQvaWRzL2lkLWV4dHJhY3Rpb24udHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0lkZW50aXR5Q3JlZGVudGlhbHMudHMiLCIuLi9zcmMvc2hhcmVkL2NvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvSWRlbnRpdHkudHMiLCIuLi9zcmMvY2xpZW50L3V0aWxzLnRzIiwiLi4vc3JjL2NsaWVudC9jcnlwdG8udHMiLCIuLi9zcmMvc2hhcmVkL2Vycm9ycy50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljRW5yb2xsbWVudFNlcnZpY2UudHMiLCIuLi9zcmMvY2xpZW50L3NlcnZpY2VzL1JlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyLnRzIiwiLi4vc3JjL3NoYXJlZC9lcmMyMC9lcmMyMC1jb25zdGFudHMudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0ZhYnJpY0Jhc2VNb2RlbC50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbC50cyIsIi4uL3NyYy9zaGFyZWQvb3ZlcnJpZGVzL292ZXJyaWRlcy50cyIsIi4uL3NyYy9zaGFyZWQvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9zaGFyZWQvRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIudHMiLCIuLi9zcmMvc2hhcmVkL2V2ZW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbWF0aC50cyIsIi4uL3NyYy9zaGFyZWQvU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIudHMiLCIuLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZhYnJpY0lkZW50aXR5U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2NsaWVudC9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2ZhYnJpYy1mcy50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50U3RhdGVtZW50LnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgSW5kZXggPSBDcmVhdGVJbmRleFJlcXVlc3Q7XG5cbmZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG4gIGNvbnN0IGRpcm5hbWU6IHN0cmluZyA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGRpcm5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGRpcm5hbWUpO1xuICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1vZGVsSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPlxuKTogSW5kZXhbXSB7XG4gIHJldHVybiBnZW5lcmF0ZUluZGV4ZXMoW21dKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBhY2N1bT86IFJlY29yZDxzdHJpbmcsIENvdWNoREJEZXNpZ25Eb2M+XG4pOiBDb3VjaERCRGVzaWduRG9jW10ge1xuICBjb25zdCB2aWV3cyA9IGdlbmVyYXRlVmlld3MoW21dKTtcbiAgY29uc3Qgc3RvcmFnZTogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz4gPSBhY2N1bSB8fCB7fTtcbiAgdmlld3MuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgc3RvcmFnZVtkb2MuX2lkXSA9IGRvYztcbiAgfSk7XG4gIHJldHVybiB2aWV3cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNb2RlbEZpbGUoZmlsZTogYW55KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZXhwb3J0cyA9IHJlcXVpcmUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGZpbGUucGFyZW50UGF0aCwgZmlsZS5uYW1lKSk7XG5cbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhleHBvcnRzKS5maWx0ZXIoKGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbSA9IG5ldyAoZSBhcyBDb25zdHJ1Y3RvcikoKTtcbiAgICAgIHJldHVybiBtIGluc3RhbmNlb2YgTW9kZWw7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSkgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W107XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTW9kZWxGb2xkZXJzKFxuICAuLi5mb2xkZXJzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTxNb2RlbENvbnN0cnVjdG9yPGFueT5bXT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IGZpbGVzID0gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhmb2xkZXIsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGY6IGFueSkgPT4gZi5pc0ZpbGUoKSAmJiBmLm5hbWUuZW5kc1dpdGgoXCJqc1wiKSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5yZWFkTW9kZWxGaWxlKGZpbGUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW5kZXhlcyhcbiAgaW5kZXhlczogSW5kZXhbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgaW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1pbmRleGVzLyR7aW5kZXgubmFtZX0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGluZGV4LCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURlc2lnbkRvY3MoXG4gIGRlc2lnbkRvY3M6IENvdWNoREJEZXNpZ25Eb2NbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIGlmICghZGVzaWduRG9jcy5sZW5ndGgpIHJldHVybjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBkZXNpZ25Eb2NzLmZvckVhY2goKGRvYykgPT4ge1xuICAgIGNvbnN0IGRvY0lkID0gZG9jLl9pZC5yZXBsYWNlKC9eX2Rlc2lnblxcLy8sIFwiXCIpO1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1kZXNpZ25fZG9jcy8ke2RvY0lkfS5qc29uYFxuICAgICAgKVxuICAgICk7XG4gICAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IC4uLmRvYyB9O1xuICAgIGRlbGV0ZSBwYXlsb2FkLl9yZXY7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQ291Y2hEQkRlc2lnbkRvYyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgd3JpdGVEZXNpZ25Eb2NzIH0gZnJvbSBcIi4uL2luZGV4ZXMvZ2VuZXJhdGlvblwiO1xuXG4vL1xuLy8gZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbi8vICAgbmFtZTogXCJjb2xsZWN0aW9uTWFyYmxlc1wiO1xuLy8gICBwb2xpY3k6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgcmVxdWlyZWRQZWVyQ291bnQ6IDA7XG4vLyAgIG1heFBlZXJDb3VudDogMztcbi8vICAgYmxvY2tUb0xpdmU6IDA7XG4vLyAgIG1lbWJlck9ubHlSZWFkOiB0cnVlO1xuLy8gICBtZW1iZXJPbmx5V3JpdGU6IHRydWU7XG4vLyAgIGVuZG9yc2VtZW50UG9saWN5OiB7XG4vLyAgICAgaWRlbnRpdGllczogW1xuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzFNU1BcIiB9IH0sXG4vLyAgICAgICB7IHJvbGU6IHsgbmFtZTogXCJtZW1iZXJcIjsgbXNwSWQ6IFwiT3JnMk1TUFwiIH0gfSxcbi8vICAgICBdO1xuLy8gICAgIHJ1bGU6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgfTtcbi8vIH07XG5cbmV4cG9ydCB0eXBlIEZhYnJpY1BvbGljeUlkZW50aXR5ID0ge1xuICByb2xlOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1zcElkOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k6IHtcbiAgICBpZGVudGl0aWVzOiBGYWJyaWNQb2xpY3lJZGVudGl0eVtdO1xuICAgIHJ1bGU6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFByaXZhdGVDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k/OiB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdGlvbkZvcihcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcG9saWN5OiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbixcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY29sbGVjdGlvbk5hbWUsXG4gICAgcG9saWN5OiBwb2xpY3ksXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICBtc3BJZDogc3RyaW5nLFxuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nID0gYCR7bXNwSWR9UHJpdmF0ZWAsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDAsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCcke21zcElkfS5tZW1iZXInKWAsXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZVxuICApO1xuXG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgT1IoJyR7bXNwSWR9LnBlZXInKWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgbXNwSWRzOiBzdHJpbmdbXSxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlciA9IDEsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyID0gMixcbiAgYmxvY2tUb0xpdmU6IG51bWJlciA9IDAsXG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuID0gdHJ1ZSxcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuID0gdHJ1ZVxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICBjb25zdCBjID0gY29sbGVjdGlvbkZvcihcbiAgICBjb2xsZWN0aW9uTmFtZSxcbiAgICBgT1IoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ubWVtYmVyJ2ApLmpvaW4oXCIsXCIpfSlgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcbiAgYy5lbmRvcnNlbWVudFBvbGljeSA9IHtcbiAgICBzaWduYXR1cmVQb2xpY3k6IGBBTkQoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ucGVlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgfTtcbiAgcmV0dXJuIGM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0Q29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkczogc3RyaW5nW10sXG4gIG92ZXJyaWRlczoge1xuICAgIHByaXZhdGVDb2xzPzogUGFydGlhbDxQcml2YXRlQ29sbGVjdGlvbj47XG4gICAgc2hhcmVkQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICB9ID0ge30sXG4gIG1pcnJvcjogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgbGV0IHsgcHJpdmF0ZUNvbHMsIHNoYXJlZENvbHMgfSA9IE1vZGVsLmNvbGxlY3Rpb25zRm9yKG0pO1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVDb2xsZWN0aW9uKGFyZzogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHJldHVybiBhcmc7XG4gICAgICByZXR1cm4gYXJnKG0sIG1zcElkc1swXSkgYXMgc3RyaW5nO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGVDb2xzID0gcHJpdmF0ZUNvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcbiAgc2hhcmVkQ29scyA9IHNoYXJlZENvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcblxuICBjb25zdCBwcml2YXRlRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAwLFxuICAgICAgbWF4UGVlckNvdW50OiAwLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8ucHJpdmF0ZUNvbHMgfHwge31cbiAgKTtcbiAgY29uc3Qgc2hhcmVkRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAxLFxuICAgICAgbWF4UGVlckNvdW50OiAyLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8uc2hhcmVkQ29scyB8fCB7fVxuICApO1xuXG4gIGNvbnN0IG1pcnJvck1ldGEgPSBtaXJyb3IgPyBNb2RlbC5taXJyb3JlZEF0KG0pIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHByaXZhdGVzID0gbXNwSWRzXG4gICAgLm1hcCgobXNwSWQpID0+XG4gICAgICAocHJpdmF0ZUNvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgICBwcml2YXRlRGVmYXVsdHM7XG4gICAgICAgIHJldHVybiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgICAgICAgICBtc3BJZCxcbiAgICAgICAgICBwLFxuICAgICAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgICAgICBibG9ja1RvTGl2ZSxcbiAgICAgICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApXG4gICAgLmZsYXQoKTtcblxuICBpZiAobWlycm9yTWV0YSAmJiBtaXJyb3JNZXRhLm1zcElkKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPVxuICAgICAgdHlwZW9mIG1pcnJvck1ldGEucmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtaXJyb3JNZXRhLnJlc29sdmVyXG4gICAgICAgIDogbWlycm9yTWV0YS5yZXNvbHZlcihtLCBtaXJyb3JNZXRhLm1zcElkKTtcbiAgICBpZiAoXG4gICAgICByZXNvbHZlZCAmJlxuICAgICAgIXByaXZhdGVzLnNvbWUoXG4gICAgICAgIChwKSA9PiBwLm5hbWUgPT09IHJlc29sdmVkICYmIHAucG9saWN5LmluY2x1ZGVzKG1pcnJvck1ldGEubXNwSWQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgcHJpdmF0ZXMucHVzaChcbiAgICAgICAgcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbWlycm9yTWV0YS5tc3BJZCxcbiAgICAgICAgICByZXNvbHZlZCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzaGFyZWQgPSAoc2hhcmVkQ29scyBhcyBzdHJpbmdbXSkubWFwKChwKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlLFxuICAgIH0gPSBzaGFyZWREZWZhdWx0cztcbiAgICByZXR1cm4gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgICAgIG1zcElkcyxcbiAgICAgIHAsXG4gICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICBtZW1iZXJPbmx5V3JpdGVcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVzLFxuICAgIHNoYXJlZCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbnMoXG4gIGNvbHM6IFByaXZhdGVDb2xsZWN0aW9uW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGZpbGVOYW1lID0gXCJjb2xsZWN0aW9uc19jb25maWdcIlxuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpIGFzIHN0cmluZztcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG4gIH1cblxuICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihwLCBgLi9NRVRBLUlORi8ke2ZpbGVOYW1lfS5qc29uYCkpO1xuICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkoY29scywgdW5kZWZpbmVkLCAyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzKFxuICBkb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRvY3M/Lmxlbmd0aCkgcmV0dXJuO1xuICB3cml0ZURlc2lnbkRvY3MoZG9jcywgcCwgY29sbGVjdGlvbik7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dE9mLFxuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgRmxhZ3NPZixcbiAgT2JzZXJ2ZXJIYW5kbGVyLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGFnaW5hdG9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VyaWFsaXplZFBhZ2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgdHlwZSBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBlbmZvcmNlREJEZWNvcmF0b3JzLFxuICBPcGVyYXRpb25LZXlzLFxuICBQcmltYXJ5S2V5VHlwZSxcbiAgcmVkdWNlRXJyb3JzVG9QcmludCxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvdWNoREJLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGZvciBGYWJyaWMgY2xpZW50IG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGdlbmVyaWMgUmVwb3NpdG9yeSB0byBwcmVwYXJlIGNvbnRleHQgYW5kIGFyZ3VtZW50cyBmb3IgQ1JVRCBvcGVyYXRpb25zIGV4ZWN1dGVkIHZpYSBhIEZhYnJpYyBjbGllbnQgQWRhcHRlciwgd2lyaW5nIFJlcG9zaXRvcnlGbGFncyBhbmQgRmFicmljLXNwZWNpZmljIG92ZXJyaWRlcy5cbiAqIEB0ZW1wbGF0ZSBNIGV4dGVuZHMgTW9kZWwgLSBUaGUgbW9kZWwgdHlwZSBoYW5kbGVkIGJ5IHRoaXMgcmVwb3NpdG9yeVxuICogQHBhcmFtIHtBZGFwdGVyPGFueSwgTWFuZ29RdWVyeSwgRmFicmljRmxhZ3MsIENvbnRleHQ8RmFicmljRmxhZ3M+Pn0gW2FkYXB0ZXJdIC0gT3B0aW9uYWwgYWRhcHRlciBpbnN0YW5jZSB1c2VkIHRvIGV4ZWN1dGUgb3BlcmF0aW9uc1xuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIHJlcG9zaXRvcnlcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRmFicmljQ2xpZW50UmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbiAqIGltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1mYWJyaWNcIjtcbiAqXG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgTW9kZWwgeyBpZCE6IHN0cmluZzsgbmFtZSE6IHN0cmluZzsgfVxuICogY29uc3QgcmVwbyA9IG5ldyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PFVzZXI+KCk7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBpZDogXCIxXCIsIG5hbWU6IFwiQWxpY2VcIiB9KSk7XG4gKiBjb25zdCBsb2FkZWQgPSBhd2FpdCByZXBvLnJlYWQoXCIxXCIpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgRmFicmljQ2xpZW50UmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PlJlcG86IGNyZWF0ZVByZWZpeChtb2RlbCwgLi4uYXJncylcbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsLCBmbGFncylcbiAqICAgQWRhcHRlci0tPj5SZXBvOiByZXN1bHRcbiAqICAgUmVwby0tPj5BcHA6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEEgZXh0ZW5kcyBGYWJyaWNDbGllbnRBZGFwdGVyID0gRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIEE+IHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9vdmVycmlkZXMgPSBPYmplY3QuYXNzaWduKHt9LCBzdXBlcltcIl9vdmVycmlkZXNcIl0sIHtcbiAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgIGFsbG93UmF3U3RhdGVtZW50czogZmFsc2UsXG4gICAgZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllczogdHJ1ZSxcbiAgICBmb3JjZVByZXBhcmVDb21wbGV4UXVlcmllczogdHJ1ZSxcbiAgICBhbGxvd0dlbmVyYXRpb25PdmVycmlkZTogZmFsc2UsXG4gICAgcmVidWlsZFdpdGhUcmFuc2llbnQ6IGZhbHNlLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQSwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHN1cGVyKGFkYXB0ZXIsIGNsYXp6KTtcbiAgfVxuXG4gIG92ZXJyaWRlIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEZsYWdzT2Y8Q29udGV4dE9mPEE+Pj4pOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXJcbiAgICAgIC5vdmVycmlkZShPYmplY3QuYXNzaWduKHt9LCBmbGFncywgdGhpcy5fb3ZlcnJpZGVzKSlcbiAgICAgIC5mb3IoZmxhZ3MgYXMgYW55KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gc3VwZXIuT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdpbmF0ZUJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdpbmF0ZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmF0aW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIHBhZ2Ugc2l6ZSAke3JlZi5saW1pdH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2luYXRlQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyLFxuICAgICAgeyBsaW1pdDogcmVmLmxpbWl0LCBvZmZzZXQ6IHJlZi5vZmZzZXQsIGJvb2ttYXJrOiByZWYuYm9va21hcmsgfSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5saXN0QnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGxpc3RpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ30gJHtvcmRlcn1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5saXN0QnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgdmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmZpbmRCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBhbGwgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggJHtrZXkgYXMgc3RyaW5nfSAke3ZhbHVlfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmZpbmRCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZE9uZUJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICB2YWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kT25lQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgT25lICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoICR7a2V5IGFzIHN0cmluZ30gJHt2YWx1ZX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kT25lQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmQoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQsIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBieSBkZWZhdWx0IHF1ZXJ5IGF0dHJpYnV0ZXNgXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kLm5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIG9yZGVyLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHBhZ2UoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBkaXJlY3Rpb246IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIHJlZjogT21pdDxEaXJlY3Rpb25MaW1pdE9mZnNldCwgXCJkaXJlY3Rpb25cIj4gPSB7XG4gICAgICBvZmZzZXQ6IDEsXG4gICAgICBsaW1pdDogMTAsXG4gICAgfSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPFNlcmlhbGl6ZWRQYWdlPE0+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLCB0cnVlKVxuICAgICkuZm9yKHRoaXMucGFnZSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgcGFnaW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBieSBkZWZhdWx0IHF1ZXJ5IGF0dHJpYnV0ZXNgXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5wYWdlLm5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIHJlZixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzdGF0ZW1lbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnN0YXRlbWVudCk7XG4gICAgbG9nLnZlcmJvc2UoYEV4ZWN1dGluZyBwcmVwYXJlZCBzdGF0ZW1lbnQgJHtuYW1lfWApO1xuICAgIGNvbnN0IGNhbGxBcmdzID0gY3R4QXJncy5zbGljZSgwLCAtMSk7XG4gICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShcbiAgICAgIHRoaXMuYWRhcHRlci5kZWNvZGUoXG4gICAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgIGN0eCxcbiAgICAgICAgICBQZXJzaXN0ZW5jZUtleXMuU1RBVEVNRU5ULFxuICAgICAgICAgIFtuYW1lLCBKU09OLnN0cmluZ2lmeShjYWxsQXJncyldLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdGhpcy5jbGFzcy5uYW1lXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gbmV3IHRoaXMuY2xhc3MocilcbiAgICAgICAgICA6IHJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICAgID8gbmV3IHRoaXMuY2xhc3MocmVzdWx0KVxuICAgICAgOiBQYWdpbmF0b3IuaXNTZXJpYWxpemVkUGFnZShyZXN1bHQpXG4gICAgICAgID8gT2JqZWN0LmFzc2lnbihyZXN1bHQsIHtcbiAgICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLm1hcCgoZDogYW55KSA9PiBuZXcgdGhpcy5jbGFzcyhkKSksXG4gICAgICAgICAgfSlcbiAgICAgICAgOiByZXN1bHQ7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudE9mKFxuICAgIGtleT86IGtleW9mIE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY291bnRPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY291bnRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9JHtrZXkgPyBgIGJ5ICR7a2V5IGFzIHN0cmluZ31gIDogXCJcIn1gXG4gICAgKTtcbiAgICBjb25zdCBzdG10QXJncyA9IGtleSA/IFtrZXksIC4uLmN0eEFyZ3NdIDogY3R4QXJncztcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCAuLi5zdG10QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtYXhPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWF4T2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWF4IG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtaW5PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWluT2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWluIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBhdmdPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5hdmdPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgYXZnIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzdW1PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdW1PZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgc3VtIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkaXN0aW5jdE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZGlzdGluY3RPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBkaXN0aW5jdCB2YWx1ZXMgb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZ3JvdXBPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTVtdPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5ncm91cE9mKTtcbiAgICBsb2cudmVyYm9zZShgZ3JvdXBpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ31gKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgaGVhbHRoY2hlY2soLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmhlYWx0aGNoZWNrKHRoaXMuY2xhc3MsIC4uLmN0eEFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIGN0eCk7XG4gICAgY29uc3QgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHByZXBhcmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgaWQsXG4gICAgICByZWNvcmQsXG4gICAgICB0cmFuc2llbnQsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZXN1bHQsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnQsIGN0eCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBjdHhBcmdzLCBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCBjdHgpO1xuICAgIGNvbnN0IHsgaWQsIHRyYW5zaWVudCB9ID0gcHJlcGFyZWQ7XG4gICAgbGV0IHJlY29yZCA9IHByZXBhcmVkLnJlY29yZDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgdXBkYXRpbmcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIGlkICR7aWR9YFxuICAgICk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIHRyYW5zaWVudCxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudCwgY3R4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxbTVtdLCAuLi5hbnlbXSwgQ29udGV4dE9mPEE+XT4ge1xuICAgIGNvbnN0IHsgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgaWdub3JlSGFuZGxlcnMgPSBjdHguZ2V0KFwiaWdub3JlSGFuZGxlcnNcIik7XG4gICAgY29uc3QgaWdub3JlVmFsaWRhdGUgPSBjdHguZ2V0KFwiaWdub3JlVmFsaWRhdGlvblwiKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG5cbiAgICBtb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhhbmRsZXJzKVxuICAgICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgUmVwb3NpdG9yeTxNLCBBPiwgYW55PihcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAoIWlnbm9yZVZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBpZ25vcmVkUHJvcHMgPSBjdHguZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKC4uLmlnbm9yZWRQcm9wcykpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IHJlZHVjZUVycm9yc1RvUHJpbnQoZXJyb3JzKTtcblxuICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyAke21vZGVscy5sZW5ndGh9IG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobW9kZWwpID0+IHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKSk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCBjdHgpKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGNvbnN0IHBheWxvYWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgY29uc3QgdHJhbnNpZW50cyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC50cmFuc2llbnQpO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkcyBhcyBQcmltYXJ5S2V5VHlwZVtdLFxuICAgICAgcGF5bG9hZHMsXG4gICAgICB0cmFuc2llbnRzLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgY3JlYXRlZC5tYXAoYXN5bmMgKHIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHIsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnRzW2ldLCBjdHgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICkge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYHJlYWRpbmcgJHtrZXlzLmxlbmd0aH0gJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLmNsYXNzLCBrZXlzLCAuLi5jdHhBcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIGtleXNbaV0sIHt9LCBjdHgpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgVXBkYXRpbmcgJHttb2RlbHMubGVuZ3RofSBuZXcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuXG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiB0aGlzLmVuc3VyZUxlZ2FjeU1pcnJvckZsYWcoY3R4LCBtb2RlbCkpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgY3R4KSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZHMgYXMgUHJpbWFyeUtleVR5cGVbXSxcbiAgICAgIHByZXBhcmVkLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgcHJlcGFyZWQubWFwKChyKSA9PiByLnRyYW5zaWVudCksXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB1cGRhdGVkLm1hcChhc3luYyAodSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICAgICAgdSxcbiAgICAgICAgICB0aGlzLmNsYXNzLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHByZXBhcmVkW2ldLnRyYW5zaWVudCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHg6IENvbnRleHRPZjxBPiwgbW9kZWw6IE0pOiB2b2lkIHtcbiAgICBpZiAoTW9kZWwubWlycm9yZWRBdChtb2RlbCkpIHtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHsgbGVnYWN5OiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrLCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB0b2tlbiBtZXRhZGF0YSBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBFUkMyMCB0b2tlbiBkZWZpbml0aW9uIHdpdGhpbiB0aGUgRmFicmljIEVSQzIwIHNhbXBsZSwgaW5jbHVkaW5nIG5hbWUsIHN5bWJvbCwgZGVjaW1hbHMsIGFuZCB0aGUgb3duaW5nIGlkZW50aXR5LiBVc2VkIHRvIGRlZmluZSB0aGUgdW5pcXVlIHRva2VuIG1hbmFnZWQgYnkgdGhlIGNvbnRyYWN0LlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFRva2VuPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBUb2tlblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRva2VuID0gbmV3IEVSQzIwVG9rZW4oeyBuYW1lOiBcIk15VG9rZW5cIiwgc3ltYm9sOiBcIk1US1wiLCBkZWNpbWFsczogMTgsIG93bmVyOiBcIng1MDk6Oi4uLlwiIH0pO1xuICogLy8gUGVyc2lzdCB0aHJvdWdoIGEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby5jcmVhdGUodG9rZW4sIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobmV3IEVSQzIwVG9rZW4oey4uLn0pLCBjdHgpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkPW5hbWUsIHJlY29yZCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogc3RvcmVkXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdGFibGUoXCJlcmMyMF90b2tlbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBUb2tlbiBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHVuaXF1ZSBuYW1lXG4gICAqIEBzdW1tYXJ5IFNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBFUkMyMCB0b2tlbiBkZWZpbml0aW9uOyB0eXBpY2FsbHkgYSBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVyXG4gICAqL1xuICBuYW1lITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmluZyBpZGVudGl0eSBvZiB0aGUgdG9rZW5cbiAgICogQHN1bW1hcnkgWC41MDkgc3ViamVjdCBvciBNU1AgaWRlbnRpdHkgc3RyaW5nIHRoYXQgZGVub3RlcyB3aG8gb3ducy9jb250cm9scyB0aGUgdG9rZW4gZGVmaW5pdGlvblxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBTaG9ydCB0aWNrZXItbGlrZSBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VuIChlLmcuLCBNVEspXG4gICAqL1xuICBzeW1ib2whOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY2ltYWwgcHJlY2lzaW9uIGZvciB0b2tlbiBhbW91bnRzXG4gICAqIEBzdW1tYXJ5IE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRva2VuIGJhbGFuY2VzXG4gICAqL1xuICBkZWNpbWFscyE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgd2FsbGV0IG1vZGVsXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgaG9sZGVyIGFjY291bnQgZm9yIGFuIEVSQzIwIHRva2VuIHdpdGhpbiB0aGUgRmFicmljIG5ldHdvcmssIHRyYWNraW5nIGJhbGFuY2UgYW5kIHRva2VuIGFzc29jaWF0aW9uLlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFdhbGxldD59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEVSQzIwV2FsbGV0XG4gKiBAZXhhbXBsZVxuICogY29uc3Qgd2FsbGV0ID0gbmV3IEVSQzIwV2FsbGV0KHsgaWQ6IFwiYWNjdDFcIiwgdG9rZW46IFwiTXlUb2tlblwiLCBiYWxhbmNlOiAxMDAwIH0pO1xuICogLy8gVXBkYXRlIGJhbGFuY2UgdmlhIHJlcG9zaXRvcnk6IGF3YWl0IHJlcG8udXBkYXRlKHdhbGxldCwgY3R4KVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwb1xuICogICBBcHAtPj5SZXBvOiByZWFkKFwiYWNjdDFcIiwgY3R4KVxuICogICBSZXBvLS0+PkFwcDogRVJDMjBXYWxsZXRcbiAqL1xuQHRhYmxlKFwiZXJjMjBfd2FsbGV0c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFUkMyMFdhbGxldCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdhbGxldCB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIHdhbGxldDsgY29tbW9ubHkgcmVmZXJlbmNlcyBhbiBhY2NvdW50IG9yIGlkZW50aXR5XG4gICAqL1xuICBpZCE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc3NvY2lhdGVkIHRva2VuIG5hbWVcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgRVJDMjBUb2tlbiB0aGlzIHdhbGxldCBob2xkczsgbWFpbnRhaW5lZCBhcyBhIHJlbGF0aW9uc2hpcCBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMvZGVsZXRlc1xuICAgKi9cbiAgdG9rZW4hOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gYmFsYW5jZSBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHN1bW1hcnkgQ3VycmVudCBhbW91bnQgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gaGVsZCBieSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSE6IG51bWJlcjtcblxuICBAY29sdW1uKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYXB0aXZlIGZsYWcgb3IgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBPcHRpb25hbCBmaWVsZCB1c2VkIGJ5IHNvbWUgZmxvd3MgdG8gbWFyayBub24tdHJhbnNmZXJhYmxlIGZ1bmRzIG9yIG1hbmFnZWQgY3VzdG9keVxuICAgKi9cbiAgY2FwdGl2ZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgYWxsb3dhbmNlIG1vZGVsXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBhbiBhcHByb3ZhbCByZWxhdGlvbnNoaXAgd2hlcmUgYW4gb3duZXIgYWxsb3dzIGEgc3BlbmRlciB0byB0cmFuc2ZlciB1cCB0byBhIGNlcnRhaW4gdmFsdWUgZnJvbSB0aGUgb3duZXIncyB3YWxsZXQuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEFsbG93YW5jZT59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEFsbG93YW5jZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFsbG93YW5jZSA9IG5ldyBBbGxvd2FuY2UoeyBvd25lcjogXCJhY2N0MVwiLCBzcGVuZGVyOiBcImFjY3QyXCIsIHZhbHVlOiA1MCB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIEFwcC0+PkFwcDogbmV3IEFsbG93YW5jZSh7IG93bmVyLCBzcGVuZGVyLCB2YWx1ZSB9KVxuICovXG5AdGFibGUoXCJlcmMyMF9hbGxvd2FuY2VzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEFsbG93YW5jZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsbG93YW5jZSB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIGFsbG93YW5jZTsgdHlwaWNhbGx5IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHByb3ZhbCByZWxhdGlvbnNoaXBcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCB0aGF0IGF1dGhvcml6ZXMgdGhlIGFsbG93YW5jZVxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbmRlciB3YWxsZXQgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBXYWxsZXQgYWxsb3dlZCB0byBzcGVuZCB1cCB0byB0aGUgYXBwcm92ZWQgdmFsdWUgZnJvbSB0aGUgb3duZXJcbiAgICovXG4gIHNwZW5kZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwcm92ZWQgdmFsdWVcbiAgICogQHN1bW1hcnkgTWF4aW11bSB0b2tlbiBhbW91bnQgdGhlIHNwZW5kZXIgbWF5IHRyYW5zZmVyIG9uIGJlaGFsZiBvZiB0aGUgb3duZXJcbiAgICovXG4gIHZhbHVlITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxBbGxvd2FuY2U+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGllbnQtc2lkZSBKU09OIHNlcmlhbGl6ZXIgZm9yIERlY2FmIG1vZGVscyB0YXJnZXRpbmcgSHlwZXJsZWRnZXIgRmFicmljXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIEpTT05TZXJpYWxpemVyIHRvIGVtYmVkIG1vZGVsIG1ldGFkYXRhIChhbmNob3IpIHJlcXVpcmVkIHRvIHJlY29uc3RydWN0IGluc3RhbmNlcyBvbiB0aGUgY2xpZW50LCBhbmQgdG8gc2FmZWx5IHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBGYWJyaWMtYm91bmQgbW9kZWxzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBEZWNhZiBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyBzZXJpYWxpemVyXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50czsgcHJvdmlkZWQgZm9yIGRvY3VtZW50YXRpb24gY29tcGxldGVuZXNzXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIENsaWVudFNlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXI8VXNlcj4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHVzZXIgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VyaWFsaXplciBhcyBDbGllbnRTZXJpYWxpemVyXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0+PlNlcmlhbGl6ZXI6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0tPj5BcHA6IEpTT04gc3RyaW5nXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IGRlc2VyaWFsaXplKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5TZXJpYWxpemVyOiBKU09OLnBhcnNlKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5Nb2RlbDogTW9kZWwuYnVpbGQocGFyc2VkLCBhbmNob3IpXG4gKiAgIE1vZGVsLS0+PkFwcDogaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudFNlcmlhbGl6ZXI8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYSBtb2RlbCBmb3IgSlNPTiBzZXJpYWxpemF0aW9uIGVtYmVkZGluZyBjbGFzcyBhbmNob3JcbiAgICogQHN1bW1hcnkgQ2xvbmVzIHRoZSBtb2RlbCBhbmQgaW5qZWN0cyB0aGUgY2xhc3MgbWV0YWRhdGEgYW5jaG9yIHNvIGl0IGNhbiBiZSByZWNvbnN0cnVjdGVkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIEZhbGxzIGJhY2sgdG8gcHJvdmlkZWQgdGFibGUgbmFtZSBpZiBtZXRhZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHNlcmlhbGl6ZXJcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttb2RlbE5hbWVdIC0gT3B0aW9uYWwgdGFibGUgbmFtZSB0byB1c2Ugd2hlbiBtZXRhZGF0YSBjYW5ub3QgYmUgZGVyaXZlZFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBBIHBsYWluIG9iamVjdCByZWFkeSB0byBiZSBKU09OLnN0cmluZ2lmeSdkXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgICBpZiAoIW1ldGFkYXRhIHx8IG1ldGFkYXRhID09PSBcIk9iamVjdFwiKVxuICAgICAgaWYgKG1vZGVsTmFtZSkgbWV0YWRhdGEgPSBtb2RlbE5hbWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICApO1xuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGE7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gaXRzIEpTT04gc2VyaWFsaXphdGlvblxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIEpTT04gc3RyaW5nLCByZXRyaWV2ZXMgdGhlIGVtYmVkZGVkIG1vZGVsIGFuY2hvciwgYW5kIHVzZXMgTW9kZWwuYnVpbGQgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgSlNPTiBzdHJpbmcgcHJldmlvdXNseSBwcm9kdWNlZCBieSBzZXJpYWxpemVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZXMgYSBtb2RlbCB0byBhIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB2aWEgcHJlU2VyaWFsaXplLCBlbWJlZGRpbmcgbWV0YWRhdGEgbmVlZGVkIGZvciByZWNvbnN0cnVjdGlvbiwgYW5kIHJldHVybnMgYSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhYmxlXSAtIE9wdGlvbmFsIHRhYmxlIG5hbWUgdG8gaW5jbHVkZSBhcyBhbmNob3Igd2hlbiBtZXRhZGF0YSBpcyB1bmF2YWlsYWJsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBtb2RlbCB3aXRoIGFuY2hvciBtZXRhZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgbW9kZWxOYW1lKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRVJDMjBUb2tlbiwgRVJDMjBXYWxsZXQgfSBmcm9tIFwiLi4vLi4vY29udHJhY3RzL2VyYzIwL21vZGVsc1wiO1xuaW1wb3J0IHsgTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4uL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIENvbnRleHRPZixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIEV2ZW50SWRzLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFNlcXVlbmNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuLyoqXG4gKiBSZXBvc2l0b3J5IGZvciBpbnRlcmFjdGluZyB3aXRoIEVSQzIwIGNvbnRyYWN0cyBvbiBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrLlxuICogRXh0ZW5kcyB0aGUgYmFzZSBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGNsYXNzIGFuZCB1dGlsaXplcyB0aGUgQ2xpZW50U2VyaWFsaXplciBmb3IgZGF0YSBzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5PFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PEVSQzIwV2FsbGV0LCBBPiB7XG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeS5zZXJpYWxpemVyO1xuXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBvZiBhbiBldmVudC5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGRhdGFiYXNlIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnM8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgKTtcblxuICAgIHRhYmxlID0gKFxuICAgICAgdHlwZW9mIHRhYmxlID09PSBcInN0cmluZ1wiID8gTW9kZWwuZ2V0KHRhYmxlKSA6IHRhYmxlXG4gICAgKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBsZXQgcGFyc2VkSWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlZElkID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgIHBhcnNlZElkID0gaWQubWFwKFxuICAgICAgICAoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZShNb2RlbC5zZXF1ZW5jZUZvcih0YWJsZSkudHlwZSwgaSkgYXMgc3RyaW5nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRJZCA9IFNlcXVlbmNlLnBhcnNlVmFsdWUoXG4gICAgICAgIE1vZGVsLnNlcXVlbmNlRm9yKHRhYmxlKS50eXBlLFxuICAgICAgICBpZFxuICAgICAgKSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBwYXJzZWRJZCEsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgVWludDhBcnJheSBpbnRvIGEgc3RyaW5nIHVzaW5nIHRoZSBUZXh0RGVjb2Rlci5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgVWludDhBcnJheSB0byBkZWNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBFUkMyMFdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlRva2VuTmFtZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b2tlbk5hbWUoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b2tlbk5hbWVcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudG9rZW5OYW1lXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIlRva2VuTmFtZVwiKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzeW1ib2wgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIHN5bWJvbCBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlN5bWJvbFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc3ltYm9sIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHN5bWJvbCguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInN5bWJvbFwiLCB0cnVlKSkuZm9yKHRoaXMuc3ltYm9sKTtcbiAgICBjb25zdCBzeW1ib2wgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiU3ltYm9sXCIpO1xuICAgIHJldHVybiB0aGlzLmRlY29kZShzeW1ib2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIkRlY2ltYWxzXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGRlY2ltYWxzKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZGVjaW1hbHNcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZGVjaW1hbHNcbiAgICApO1xuICAgIGNvbnN0IGRlY2ltYWxzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkRlY2ltYWxzXCIpO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoZGVjaW1hbHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiVG90YWxTdXBwbHlcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QgYW5kIGRlY29kZXMgdGhlIHJldHVybmVkIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b3RhbFN1cHBseShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b3RhbFN1cHBseVwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50b3RhbFN1cHBseVxuICAgICk7XG4gICAgY29uc3QgdG90YWwgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiVG90YWxTdXBwbHlcIik7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZSh0b3RhbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIGEgc3BlY2lmaWVkIG93bmVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgYSBnaXZlbiBvd25lci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQmFsYW5jZU9mXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHByb3ZpZGVkIG93bmVyJ3MgYWRkcmVzcyBhcyBhIHBhcmFtZXRlci5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjb252ZXJ0ZWQgdG8gYSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBFUkMyMCB0b2tlbiBvd25lci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgb3duZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBiYWxhbmNlT2YoXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJiYWxhbmNlXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmJhbGFuY2VPZlxuICAgICk7XG4gICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJCYWxhbmNlT2ZcIiwgW1xuICAgICAgb3duZXIsXG4gICAgXSk7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShiYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYSByZWNpcGllbnQuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdHJhbnNmZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhIHJlY2lwaWVudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgcmVjaXBpZW50J3MgYWRkcmVzcyBhbmQgdGhlIHRyYW5zZmVyIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gdHJhbnNmZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyKFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwidHJhbnNmZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudHJhbnNmZXJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZmVycmVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJUcmFuc2ZlclwiLCBbXG4gICAgICB0byxcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKHRyYW5zZmVycmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHRyYW5zZmVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKiBGb3IgdGhpcyB0cmFuc2ZlciB0byB3b3JrIHRoZSBzcGVuZGVyICggYWNjb3VudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGlzIGZ1bmN0aW9uICkgbmVlZCB0byBoYXZlIHRoZSB2YWx1ZSBhcHByb3ZlZCBhcyBhbiBhbGxvd2FuY2UgYnkgdGhlIHNlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJGcm9tXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNlbmRlcidzIGFkZHJlc3MsIHJlY2lwaWVudCdzIGFkZHJlc3MsIGFuZCB0aGUgdHJhbnNmZXIgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB0byAtIFRoZSBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIHRyYW5zZmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckZyb20oXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwidHJhbnNmZXJGcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLnRyYW5zZmVyRnJvbSk7XG4gICAgY29uc3QgdHJhbnNmZXJyZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIlRyYW5zZmVyRnJvbVwiLFxuICAgICAgW2Zyb20sIHRvLCB2YWx1ZS50b1N0cmluZygpXVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGUodHJhbnNmZXJyZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJlIHNwZW50IGJ5IGEgc3BlY2lmaWVkIHNwZW5kZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBhcHByb3ZlIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYmUgc3BlbnQgYnkgYSBzcGVjaWZpZWQgc3BlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQXBwcm92ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhbmQgdGhlIGFwcHJvdmFsIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHNwZW5kZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlbmRlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYXBwcm92ZSBmb3IgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgYXBwcm92YWwgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGFwcHJvdmUoc3BlbmRlcjogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFwcHJvdmVcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYXBwcm92ZSk7XG4gICAgY29uc3QgYXBwcm92ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkFwcHJvdmVcIiwgW1xuICAgICAgc3BlbmRlcixcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGFwcHJvdmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIGEgc3BlbmRlci5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgYWxsb3dhbmNlIG9mIEVSQzIwIHRva2VucyB0aGF0IHRoZSBzcGVjaWZpZWQgb3duZXIgaGFzIGFwcHJvdmVkIGZvciBhIHNwZW5kZXIuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkFsbG93YW5jZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBvd25lcidzIGFkZHJlc3MgYW5kIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIEVSQzIwIHRva2VuIG93bmVyLlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYWxsb3dhbmNlKG93bmVyOiBzdHJpbmcsIHNwZW5kZXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFsbG93YW5jZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5hbGxvd2FuY2UpO1xuICAgIGNvbnN0IGFsbG93YW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQWxsb3dhbmNlXCIsIFtcbiAgICAgIG93bmVyLFxuICAgICAgc3BlbmRlcixcbiAgICBdKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKGFsbG93YW5jZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBwcm92aWRlZCB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBpbml0aWFsaXplIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBnaXZlbiB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiSW5pdGlhbGl6ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzZXJpYWxpemVkIHRva2VuIGRhdGEgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgRVJDMjAgdG9rZW4gaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJhY3Qgd2l0aC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSh0b2tlbjogRVJDMjBUb2tlbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJpbml0aWFsaXplXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IGluaXRpbGlhemVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJJbml0aWFsaXplXCIsXG4gICAgICBbRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHRva2VuKV1cbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGluaXRpbGlhemVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBFUkMyMCBjb250cmFjdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHZlcmlmeSBpZiB0aGUgRVJDMjAgY29udHJhY3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNoZWNrSW5pdGlhbGl6ZWRcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpbml0aWFsaXphdGlvbiBjaGVjayBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBjaGVja0luaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJjaGVja0luaXRpYWxpemVkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJDaGVja0luaXRpYWxpemVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnRzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gbWludCBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJNaW50XCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIG1pbnRpbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IHVwZGF0ZXMgdGhlIG1pbnRlcidzIG51bWJlciBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBtaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWludGluZyBwcm9jZXNzIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIG1pbnQoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwibWludFwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5taW50KTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIk1pbnRcIiwgW2Ftb3VudC50b1N0cmluZygpXSk7XG4gIH1cblxuICAvKipcbiAgICogQnVybnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIHRoZSBtaW50ZXIncyBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gYnVybiBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJCdXJuXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIGJ1cm5pbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgbWludGVyJ3MgbnVtYmVyIG9mIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJ1cm4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidXJuaW5nIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYnVybihhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJidXJuXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm4pO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQnVyblwiLCBbYW1vdW50LnRvU3RyaW5nKCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJucyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gYSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGJ1cm4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQnVybkZyb21cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgYWNjb3VudCdzIGFkZHJlc3MgYW5kIHRoZSBidXJuaW5nIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgc3BlY2lmaWVkIGFjY291bnQncyBudW1iZXIgb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIFRoZSBhZGRyZXNzIG9mIHRoZSBhY2NvdW50IGZyb20gd2hpY2ggdG8gYnVybiB0aGUgRVJDMjAgdG9rZW5zLlxuICAgKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYnVybi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1cm5pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBidXJuRnJvbShhY2NvdW50OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImJ1cm5Gcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm5Gcm9tKTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkJ1cm5Gcm9tXCIsIFtcbiAgICAgIGFjY291bnQsXG4gICAgICBhbW91bnQudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGJhbGFuY2Ugb2YgRVJDMjAgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIEVSQzIwIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNsaWVudEFjY291bnRCYWxhbmNlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0LCB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGFueSBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiBFUkMyMCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgY2xpZW50QWNjb3VudEJhbGFuY2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudEJhbGFuY2VcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2xpZW50QWNjb3VudEJhbGFuY2UpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJDbGllbnRBY2NvdW50QmFsYW5jZVwiXG4gICAgKTtcblxuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoc2VyaWFsaXplZEFjY291bnRCYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjbGllbnQncyBhY2NvdW50IElEIGZyb20gdGhlIGJsb2NrY2hhaW4gbmV0d29yay5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBjbGllbnQncyBhY2NvdW50IElELlxuICAgKiBJdCBjYWxscyB0aGUgXCJDbGllbnRBY2NvdW50SURcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgcmV0dXJuZWQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQgSUQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBjbGllbnRBY2NvdW50SUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudElkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNsaWVudEFjY291bnRJRCk7XG4gICAgY29uc3QgY2xpZW50QWNjb3VudElEID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkNsaWVudEFjY291bnRJRFwiXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRlY29kZShjbGllbnRBY2NvdW50SUQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIFByaW1hcnlLZXlUeXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBjb21wb3NlQXR0cmlidXRlVmFsdWUgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJZHM8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtb2RlbHM6IE0gfCBNW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdLFxuICBpZHM6IFByaW1hcnlLZXlUeXBlIHwgUHJpbWFyeUtleVR5cGVbXVxuKSB7XG4gIGxldCBwazoga2V5b2YgTTtcbiAgbGV0IGNvbXBvc2VkOiBhbnk7XG4gIGxldCBwa1Byb3BzOiBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgZnVuY3Rpb24gZXh0cmFjdElkKG06IE0gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZHM6IFByaW1hcnlLZXlUeXBlKSB7XG4gICAgcGsgPSBwayB8fCBNb2RlbC5wayhjbGF6eik7XG4gICAgcGtQcm9wcyA9IHBrUHJvcHMgfHwgTW9kZWwuc2VxdWVuY2VGb3IoY2xhenopO1xuICAgIGNvbXBvc2VkID0gY29tcG9zZWQgfHwgTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcblxuICAgIGlmIChjb21wb3NlZCkge1xuICAgICAgcmV0dXJuIGNvbXBvc2VBdHRyaWJ1dGVWYWx1ZShtIGFzIGFueSwgY29tcG9zZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gKG0gYXMgYW55KVtwa10gfHwgaWRzO1xuICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgY291bGQgbm90IHJlYnVpbGQgaWQgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZGVscykpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSB8fCBpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiaW5jb25zaXN0ZW50IHBhcmFtZXRlcnMuIGJvdGggbXVzdCBiZSBhcnJheXMgb2YgZXF1YWwgbGVuZ3RoXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1vZGVscy5tYXAoKG0sIGkpID0+IGV4dHJhY3RJZChtLCBpZHNbaV0pKTtcbiAgfVxuICByZXR1cm4gZXh0cmFjdElkKG1vZGVscywgaWRzIGFzIFByaW1hcnlLZXlUeXBlKTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbCwgY29sdW1uLCBwayB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVzY3JpcHRpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpdHkgY3JlZGVudGlhbCBtb2RlbCBzdG9yaW5nIGNyeXB0b2dyYXBoaWMgbWF0ZXJpYWxzXG4gKiBAc3VtbWFyeSBIb2xkcyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQgcHJpdmF0ZSBrZXkgaW5mb3JtYXRpb24gZm9yIGEgRmFicmljIGlkZW50aXR5LCBtYW5hZ2VkIGFzIGEgc2VwYXJhdGUgZW50aXR5IGxpbmtlZCBmcm9tIElkZW50aXR5XG4gKiBAcGFyYW0ge01vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+fSBbYXJnXSAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIG1vZGVsIGZpZWxkc1xuICogQGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgY3JlZGVudGlhbHMgZW50cnlcbiAqIGNvbnN0IGNyZWRzID0gbmV3IElkZW50aXR5Q3JlZGVudGlhbHMoeyBpZDogXCJjcmVkczFcIiwgY2VydGlmaWNhdGU6IFwiLi4uXCIsIHJvb3RDZXJ0aWZpY2F0ZTogXCIuLi5cIiwgcHJpdmF0ZUtleTogXCIuLi5cIiB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqICAgQXBwLT4+TW9kZWw6IG5ldyBJZGVudGl0eUNyZWRlbnRpYWxzKHsgaWQsIGNlcnRpZmljYXRlLCByb290Q2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICogQHNlZSBtb2RlbFxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHMgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcbiAgICogQHN1bW1hcnkgUHJpbWFyeSBrZXkgZm9yIHJlZmVyZW5jaW5nIHRoaXMgY3JlZGVudGlhbHMgZW50cnlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcIilcbiAgQGNvbHVtbigpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUgZm9yIHRoZSBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBMZWFmIGNlcnRpZmljYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWRlbnRpdHlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIFguNTA5IGNlcnRpZmljYXRlIGZvciB0aGUgaWRlbnRpdHlcIilcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIGNlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcm9vdCBvciBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUm9vdCBvZiB0cnVzdCB1c2VkIHRvIHZhbGlkYXRlIHRoZSBsZWFmIGNlcnRpZmljYXRlXG4gICAqL1xuICBAZGVzY3JpcHRpb24oXCJQRU0tZW5jb2RlZCByb290IG9yIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZVwiKVxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgcm9vdENlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpdHkgY2VydGlmaWNhdGVcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIHByaXZhdGUga2V5XCIpXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBwcml2YXRlS2V5ITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIHRvIG1hcmsgRmFicmljLXNwZWNpZmljIG1vZGVsIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIGtleXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBsYXllciB0byBwZXJzaXN0IEZhYnJpYy1yZWxhdGVkIGZsYWdzIG9uIG1vZGVsc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBGYWJyaWNNb2RlbEtleXMge1xuICAvKiogUHJpdmF0ZSBkYXRhIG1hcmtlciB1c2VkIHRvIHRhZyBwcm9wZXJ0aWVzIG9yIG1vZGVscyBmb3IgRmFicmljIHByaXZhdGUgY29sbGVjdGlvbnMgKi9cbiAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxuICBTSEFSRUQgPSBcInNoYXJlZFwiLFxuICAvKiogTmFtZXNwYWNlIHByZWZpeCB1c2VkIGZvciBGYWJyaWMtc3BlY2lmaWMgbWV0YWRhdGEga2V5cyAqL1xuICBGQUJSSUMgPSBcImZhYnJpY1wiLFxuICBPV05FRF9CWSA9IFwib3duZWQtYnlcIixcbiAgVFJBTlNBQ1RJT05fSUQgPSBcInRyYW5zYWN0aW9uLWlkXCIsXG4gIE1JUlJPUiA9IFwibWlycm9yXCIsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgZm9yIEZhYnJpYyBjcmVkZW50aWFsc1xuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgaWRlbnRpdHkgZm9ybWF0cyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVR5cGUge1xuICAvKiogU3RhbmRhcmQgWC41MDkgaWRlbnRpdHkgZm9ybWF0IHVzZWQgYnkgSHlwZXJsZWRnZXIgRmFicmljICovXG4gIFg1MDkgPSBcIlguNTA5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgRmFicmljIGFkYXB0ZXIgZmxhdm91clxuICogQHN1bW1hcnkgVXNlZCB0byB0YWcgYWRhcHRlcnMvcmVwb3NpdG9yaWVzIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQGNvbnN0IEZhYnJpY0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZhYnJpY0ZsYXZvdXIgPSBcImhsZi1mYWJyaWNcIjtcbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgQ2FzY2FkZSxcbiAgY29sdW1uLFxuICBpbmRleCxcbiAgb25lVG9PbmUsXG4gIHBrLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCB0eXBlIE1vZGVsQXJnLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElkZW50aXR5Q3JlZGVudGlhbHMgfSBmcm9tIFwiLi9JZGVudGl0eUNyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBtb2RlbCByZXByZXNlbnRpbmcgYSBGYWJyaWMgd2FsbGV0IGVudHJ5XG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYW4gaWRlbnRpdHkgc3RvcmVkIGluIGEgRmFicmljIHdhbGxldCwgaW5jbHVkaW5nIGl0cyBNU1AgaWRlbnRpZmllciwgY3JlZGVudGlhbCBsaW5rYWdlLCBhbmQgdHlwZSBpbmZvcm1hdGlvbi4gQnVpbHQgb24gQmFzZU1vZGVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIERlY2FmIHZhbGlkYXRpb24gYW5kIHBlcnNpc3RlbmNlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxJZGVudGl0eT59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAqIGNvbnN0IGlkID0gbmV3IElkZW50aXR5KHsgaWQ6IFwidXNlcjFcIiwgbXNwSWQ6IFwiT3JnMU1TUFwiLCB0eXBlOiBJZGVudGl0eVR5cGUuWDUwOSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5XG4gKiAgIEFwcC0+Pk1vZGVsOiBuZXcgSWRlbnRpdHkoeyBpZCwgbXNwSWQsIHR5cGUgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHkgaW4gdGhlIHdhbGxldFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGlkZW50aXR5IHJlY29yZFxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlkZW50aXR5XCIpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGluayB0byB0aGUgaWRlbnRpdHkgY3JlZGVudGlhbHMgc3RvcmVkIHNlcGFyYXRlbHlcbiAgICogQHN1bW1hcnkgT25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdG8gdGhlIGNyZWRlbnRpYWxzIGVudGl0eTsgY2FzY2FkZXMgb24gdXBkYXRlIGFuZCBkZWxldGVcbiAgICovXG4gIEBvbmVUb09uZShJZGVudGl0eUNyZWRlbnRpYWxzLCB7XG4gICAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gICAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIH0pXG4gIGNyZWRlbnRpYWxzITogSWRlbnRpdHlDcmVkZW50aWFscztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFRoZSBNU1AgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXNzdWVkIHRoaXMgaWRlbnRpdHlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBtc3BJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgb2YgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHRoZSBpZGVudGl0eSBlbmNvZGluZy9mb3JtYXQ7IGRlZmF1bHRzIHRvIFguNTA5XG4gICAqL1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgdHlwZTogSWRlbnRpdHlUeXBlID0gSWRlbnRpdHlUeXBlLlg1MDk7XG5cbiAgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxJZGVudGl0eT4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBDcnlwdG9TZXR0aW5nLCBJQ3J5cHRvU3VpdGUsIFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSFNNT3B0aW9ucyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IGNyeXB0bywgeyBYNTA5Q2VydGlmaWNhdGUgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBYNTA5Q2VydGlmaWNhdGUgYXMgWDUwOUNlcnQgfSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggZmlsZXMsIGNyeXB0byBpZGVudGl0aWVzLCBhbmQgRmFicmljIFNESyBoZWxwZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdG8gcmVhZCBjcmVkZW50aWFscyBhbmQga2V5cyBmcm9tIGRpc2sgb3IgcmF3IGNvbnRlbnQsIGNvbnN0cnVjdCBGYWJyaWMgZ2F0ZXdheSBJZGVudGl0aWVzIGFuZCBTaWduZXJzLCBhbmQgcGVyZm9ybSBjb21tb24gZmlsZXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIEZhYnJpYyBjbGllbnQgdG9vbGluZy5cbiAqIEBjbGFzcyBDb3JlVXRpbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGFuIGlkZW50aXR5IGFuZCBzaWduZXIgZnJvbSBkaXJlY3Rvcmllc1xuICogY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0SWRlbnRpdHkoJ09yZzFNU1AnLCAnL21zcC9zaWduY2VydHMnKTtcbiAqIGNvbnN0IHNpZ25lciA9IGF3YWl0IENvcmVVdGlscy5nZXRTaWduZXIoJy9tc3Ava2V5c3RvcmUnKTtcbiAqIC8vIEJ1aWxkIGEgQ0EgdXNlclxuICogY29uc3QgdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoJ2FwcFVzZXInLCBwZW1LZXksIHBlbUNlcnQsICdPcmcxTVNQJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyBsb2dnZXI6IExvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENvcmVVdGlscy5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyBjcnlwdG9TdWl0ZTogSUNyeXB0b1N1aXRlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZSBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIHJhdyBjb250ZW50XG4gICAqIEBzdW1tYXJ5IElmIHRoZSBpbnB1dCBpcyBhIFVpbnQ4QXJyYXkgb3IgUEVNIGNvbnRlbnQsIHJldHVybnMgaXQgYXMtaXM7IG90aGVyd2lzZSB1c2VzIGEgcHJvdmlkZWQgYXN5bmMgZmlsZVJlYWRlciB0byBsb2FkIHRoZSBjb250ZW50IGZyb20gZGlzay5cbiAgICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIEVpdGhlciBhIHJhdyBjb250ZW50IGJ1ZmZlci9zdHJpbmcgb3IgYSBmaWxlc3lzdGVtIHBhdGhcbiAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IGZpbGVSZWFkZXIgLSBBc3luYyBmdW5jdGlvbiB0byByZWFkIGZpbGUgY29udGVudCB3aGVuIGEgcGF0aCBpcyBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgZG93bnN0cmVhbVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4gICkge1xuICAgIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gICAgaWYgKFxuICAgICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIEJ1ZmZlclxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgbG9hZHMgYSBmaWxlIHVzaW5nIGZzLnByb21pc2VzIHdoZW4gYSBwYXRoIHN0cmluZyBpcyBwcm92aWRlZDsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdpdmVuIEJ1ZmZlciBkaXJlY3RseS5cbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50T3JQYXRoIC0gUGF0aCB0byBhIGZpbGUgb24gZGlzayBvciBhbiBhbHJlYWR5LWxvYWRlZCBCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmd8VWludDhBcnJheXxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyL3N0cmluZyBkZXBlbmRpbmcgb24gcmVhZGVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgRmFicmljIENBIFVzZXIgb2JqZWN0IHdpdGggZW5yb2xsbWVudFxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZmFicmljLWNvbW1vbiBVc2VyLCBzZXRzIGEgY3J5cHRvIHN1aXRlLCBpbXBvcnRzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSwgYW5kIHNldHMgZW5yb2xsbWVudCB3aXRoIGNlcnRpZmljYXRlIGFuZCBNU1AgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBDQSB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gVGhlIGVucm9sbGVkIEZhYnJpYyBVc2VyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q0FVc2VyKFxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBoc20/OiBIU01PcHRpb25zIH1cbiAgKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ3JlYXRpbmcgQ0EgezB9IHVzZXIgezF9IHdpdGggY2VydGlmaWNhdGUgezJ9XCIsXG4gICAgICAgIG1zcElkLFxuICAgICAgICB1c2VyTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGVcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IHtcbiAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgbGliOiBvcHRpb25zLmhzbS5saWJyYXJ5LFxuICAgICAgICAgIHNsb3Q6IG9wdGlvbnMuaHNtLnNsb3QsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgcGluOiBTdHJpbmcob3B0aW9ucy5oc20ucGluKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3J5cHRvU3VpdGUgPSB0aGlzLmdldENyeXB0b1N1aXRlKGNvbmZpZyk7XG5cbiAgICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgICBjb25zdCBlbnJvbGxtZW50S2V5ID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SFNNRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgY2VydGlmaWNhdGUsIG9wdGlvbnMuaHNtKVxuICAgICAgOiB0aGlzLmdldFNvZnR3YXJlRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgcHJpdmF0ZUtleSk7XG4gICAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGVucm9sbG1lbnRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q3J5cHRvU3VpdGUob3B0aW9ucz86IENyeXB0b1NldHRpbmcpOiBJQ3J5cHRvU3VpdGUge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgICBpZiAoQ29yZVV0aWxzLmNyeXB0b1N1aXRlKSByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuXG4gICAgQ29yZVV0aWxzLmNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZShvcHRpb25zKTtcbiAgICByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgcHJpdmF0ZUtleT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQcml2YXRlIGtleSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gSFNNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBsaWVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SFNNRW5yb2xsbWVudEtleShcbiAgICBjcnlwdG9TdWl0ZTogYW55LFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgaHNtOiBIU01PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHNraSA9XG4gICAgICBoc20ua2V5SWRIZXggJiYgaHNtLmtleUlkSGV4LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gQnVmZmVyLmZyb20oaHNtLmtleUlkSGV4LCBcImhleFwiKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2VydGlmaWNhdGVTS0koY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1aXRlLmdldEtleShza2kpO1xuICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5LmlzUHJpdmF0ZSA9PT0gXCJmdW5jdGlvblwiICYmICFrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcml2YXRlIGtleSBmcm9tIEhTTVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCB4NTA5ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgandrID0geDUwOS5wdWJsaWNLZXkuZXhwb3J0KHsgZm9ybWF0OiBcImp3a1wiIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKGp3ay54IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShqd2sueSB8fCBcIlwiLCBcImJhc2U2NHVybFwiKTtcbiAgICByZXR1cm4gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtwcmVmaXgsIHgsIHldKSlcbiAgICAgIC5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgYSBGYWJyaWMgR2F0ZXdheSBJZGVudGl0eSBmcm9tIGFuIE1TUCBJRCBhbmQgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUmVhZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IHBhdGggb3IgYWNjZXB0cyByYXcgY29udGVudCBhbmQgcmV0dXJucyBhbiBJZGVudGl0eSBvYmplY3Qgc3VpdGFibGUgZm9yIHRoZSBGYWJyaWMgR2F0ZXdheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgZmlsZSwgb3IgUEVNIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBpZGVudGl0eSBjb250YWluaW5nIG1zcElkIGFuZCBjZXJ0aWZpY2F0ZSBjcmVkZW50aWFsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldElkZW50aXR5KFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgICBzaWduZXJGaWxlUmVhZGVyXG4gICAgKSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAgIC8vIC0tXG5cbiAgICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gICAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gICAgbGV0IHN1YnRsZTogYW55O1xuICAgIGlmIChcbiAgICAgIChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93ICYmXG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgYXMgeyBDcnlwdG86IGFueSB9KS5DcnlwdG9cbiAgICApIHtcbiAgICAgIHN1YnRsZSA9ICgoZ2xvYmFsVGhpcyBhcyBhbnkpLkNyeXB0byBhcyBhbnkpLnN1YnRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICAgIH1cblxuICAgIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHIgPSBwZW1cbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNlcnRpZmljYXRlIFNlcmlhbCBOdW1iZXIgYW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcilcbiAqIGluIHRoZSBmb3JtYXQgRmFicmljIENBIGV4cGVjdHMgKHBsYWluIGhleCwgbm8gY29sb25zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGNlcnQ6IHN0cmluZyk6IHtcbiAgYWtpOiBzdHJpbmc7XG4gIHNlcmlhbDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHg1MDlDZXJ0aWZpY2F0ZSA9IG5ldyBYNTA5Q2VydChjZXJ0KTtcblxuICAvLyBGaW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcikgZXh0ZW5zaW9uIGJ5IGl0cyBPSUQ6IDIuNS4yOS4zNVxuICBjb25zdCBha2lFeHQgPSB4NTA5Q2VydGlmaWNhdGUuZXh0ZW5zaW9ucz8uZmluZChcbiAgICAoZSkgPT4gZS50eXBlID09PSBcIjIuNS4yOS4zNVwiXG4gICk7XG4gIGlmICghYWtpRXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdXRob3JpdHkgS2V5IElkZW50aWZpZXIgKEFLSSkgZXh0ZW5zaW9uIG5vdCBmb3VuZCBpbiBjZXJ0aWZpY2F0ZS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBha2lFeHQudmFsdWUgaXMgdGhlIGV4dGVuc2lvbiBjb250ZW50IGluIERFUiBieXRlcy4gQ29udmVydCBpdCB0byBhIGhleCBzdHJpbmcuXG4gIGxldCBha2kgPSBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShha2lFeHQudmFsdWUpKVxuICAgIC50b1N0cmluZyhcImhleFwiKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBDb21tb24gY2FzZTpcbiAgICogVGhlIERFUi1lbmNvZGVkIEFLSSBleHRlbnNpb24gb2Z0ZW4gc3RhcnRzIHdpdGg6XG4gICAqICAgMzAgMTYgODAgMTQgPDIwLWJ5dGUga2V5SWRlbnRpZmllcj5cbiAgICogSW4gaGV4LCB0aGF0J3MgXCIzMDE2ODAxNFwiICsgNDAgaGV4IGNoYXJzICgyMCBieXRlcykuXG4gICAqXG4gICAqIEZhYnJpYyBDQSBleHBlY3RzIE9OTFkgdGhlIDIwLWJ5dGUga2V5SWRlbnRpZmllciAoNDAgaGV4IGNoYXJzKSxcbiAgICogc28gd2Ugc3RyaXAgdGhlIFwiMzAxNjgwMTRcIiBwcmVmaXggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgaWYgKGFraS5zdGFydHNXaXRoKFwiMzAxNjgwMTRcIikgJiYgYWtpLmxlbmd0aCA+PSA4ICsgNDApXG4gICAgYWtpID0gYWtpLnNsaWNlKDgsIDggKyA0MCk7XG5cbiAgcmV0dXJuIHsgYWtpLCBzZXJpYWw6IHg1MDlDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIgfTtcbn1cbiIsImltcG9ydCAqIGFzIHg1MDkgZnJvbSBcIkBwZWN1bGlhci94NTA5XCI7XG5pbXBvcnQgeyBDcnlwdG8sIENyeXB0b0tleSB9IGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgY3J5cHRvID0gbmV3IENyeXB0bygpO1xueDUwOS5jcnlwdG9Qcm92aWRlci5zZXQoY3J5cHRvKTtcblxuZXhwb3J0IGVudW0gQkFTRV9BTFBIQUJFVCB7XG4gIEJBU0UyID0gXCIwMVwiLFxuICBCQVNFOCA9IFwiMDEyMzQ1NjdcIixcbiAgQkFTRTExID0gXCIwMTIzNDU2Nzg5YVwiLFxuICBCQVNFMTYgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIixcbiAgQkFTRTMyID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWlwiLFxuICBCQVNFMzJfWiA9IFwieWJuZHJmZzhlamttY3BxeG90MXV3aXN6YTM0NWg3NjlcIixcbiAgQkFTRTM2ID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTU4ID0gXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIsXG4gIEJBU0U2MiA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIixcbiAgQkFTRTY0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIEJBU0U2NyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXy4hflwiLFxufVxuXG5leHBvcnQgdHlwZSBrZXlPYmplY3QgPSB7XG4gIGl2OiBBcnJheUJ1ZmZlcjtcbiAga2V5OiBDcnlwdG9LZXk7XG59O1xuXG5leHBvcnQgZW51bSBDUllQVE8ge1xuICBIQVNIID0gXCJTSEEtMjU2XCIsXG4gIElURVJBVElPTlMgPSAxMDAwLFxuICBLRVlMRU5HVEggPSA0OCxcbiAgREVSSVZFRF9JVl9MRU5HVEggPSAxNixcbiAgREVSSVZFRF9LRVlfTEVOR1RIID0gMzIsIC8vIEJlY2F1c2UgU0hBLTI1NiB1c2VkIGhhcyBhIG5hdGl2ZSBzaXplIG9mIDMyIGJ5dGVzXG4gIEFMR09SWVRITSA9IFwiQUVTLUdDTVwiLFxuICBLRVlfQUxHT1JZVEhNID0gXCJQQktERjJcIixcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VFbmNvZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaUZhY3RvcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWxwaGFiZXQ6IEJBU0VfQUxQSEFCRVQpIHtcbiAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggPj0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoXCJBbHBoYWJldCB0b28gbG9uZ1wiKTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5iYXNlTWFwLmxlbmd0aDsgaisrKSB0aGlzLmJhc2VNYXBbal0gPSAyNTU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gYWxwaGFiZXQuY2hhckF0KGkpO1xuICAgICAgY29uc3QgeGMgPSB4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAodGhpcy5iYXNlTWFwW3hjXSAhPT0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoeCArIFwiIGlzIGFtYmlndW91c1wiKTtcblxuICAgICAgdGhpcy5iYXNlTWFwW3hjXSA9IGk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgdGhpcy5sZWFkZXIgPSB0aGlzLmFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB0aGlzLmZhY3RvciA9IE1hdGgubG9nKHRoaXMuYmFzZSkgLyBNYXRoLmxvZygyNTYpOyAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICAgIHRoaXMuaUZhY3RvciA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyh0aGlzLmJhc2UpOyAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICB9XG5cbiAgZW5jb2RlKHNvdXJjZTogVWludDhBcnJheSB8IERhdGFWaWV3IHwgYW55W10gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgc291cmNlID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgc291cmNlLmJ1ZmZlcixcbiAgICAgICAgc291cmNlLmJ5dGVPZmZzZXQsXG4gICAgICAgIHNvdXJjZS5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBVaW50OEFycmF5LmZyb20oc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IHBiZWdpbiA9IDA7XG4gICAgY29uc3QgcGVuZCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKys7XG4gICAgICB6ZXJvZXMrKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTU4IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogdGhpcy5pRmFjdG9yICsgMSkgPj4+IDA7XG4gICAgY29uc3QgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW3BiZWdpbl07XG4gICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQxID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDEgIT09IC0xO1xuICAgICAgICBpdDEtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMDtcbiAgICAgICAgYjU4W2l0MV0gPSBjYXJyeSAlIHRoaXMuYmFzZSA+Pj4gMDtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyB0aGlzLmJhc2UpID4+PiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcblxuICAgICAgbGVuZ3RoID0gaTtcbiAgICAgIHBiZWdpbisrO1xuICAgIH1cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgbGV0IGl0MiA9IHNpemUgLSBsZW5ndGg7XG4gICAgd2hpbGUgKGl0MiAhPT0gc2l6ZSAmJiBiNThbaXQyXSA9PT0gMCkgaXQyKys7XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIGxldCBzdHIgPSB0aGlzLmxlYWRlci5yZXBlYXQoemVyb2VzKTtcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHtcbiAgICAgIHN0ciArPSB0aGlzLmFscGhhYmV0LmNoYXJBdChiNThbaXQyXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVVuc2FmZShzb3VyY2U6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICBsZXQgcHN6ID0gMDtcbiAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSB0aGlzLmxlYWRlcikge1xuICAgICAgemVyb2VzKys7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICBjb25zdCBzaXplID0gKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIHRoaXMuZmFjdG9yICsgMSkgPj4+IDA7IC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICBjb25zdCBiMjU2ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVycy5cbiAgICB3aGlsZSAoc291cmNlW3Bzel0pIHtcbiAgICAgIC8vIERlY29kZSBjaGFyYWN0ZXJcbiAgICAgIGxldCBjYXJyeSA9IHRoaXMuYmFzZU1hcFtzb3VyY2UuY2hhckNvZGVBdChwc3opXTtcbiAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQzID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDMgIT09IC0xO1xuICAgICAgICBpdDMtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKHRoaXMuYmFzZSAqIGIyNTZbaXQzXSkgPj4+IDA7XG4gICAgICAgIGIyNTZbaXQzXSA9IGNhcnJ5ICUgMjU2ID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcHN6Kys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICBsZXQgaXQ0ID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkgaXQ0Kys7XG5cbiAgICBjb25zdCB2Y2ggPSBuZXcgVWludDhBcnJheSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpO1xuICAgIGxldCBqID0gemVyb2VzO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHZjaFtqKytdID0gYjI1NltpdDQrK107XG5cbiAgICByZXR1cm4gdmNoO1xuICB9XG5cbiAgZGVjb2RlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kZWNvZGVVbnNhZmUoc291cmNlKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gYnVmZmVyO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1iYXNlXCIgKyB0aGlzLmJhc2UgKyBcIiBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyeXB0b1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYjU4ZW5jb2RlciA9IG5ldyBCYXNlRW5jb2RlcihCQVNFX0FMUEhBQkVULkJBU0U1OCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENyeXB0b1V0aWxzLm5hbWUpO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGU6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHN0cmluZ0Zvcm1hdChcIlBhcnNpbmcgY2VydGlmaWNhdGU6IHswfVwiLCBjZXJ0aWZpY2F0ZSkpO1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IHsgc3ViamVjdCwgaXNzdWVyIH0gPSBjZXJ0O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNlcnRpZmljYXRlIHBhcnNlZCB3aXRoIHN1YmplY3QgezB9IGFuZCBpc3N1ZXIgezF9XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGlzc3VlclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGB4NTA5OjovJHtzdWJqZWN0LnJlcGxhY2VBbGwoXCIsIFwiLCBcIi9cIil9OjovJHtpc3N1ZXIucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX1gO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYjU4ZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5iNThlbmNvZGVyLmRlY29kZShzdHIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdEtleShcbiAgICB0eXBlOiBcInByaXZhdGVcIiB8IFwicHVibGljXCIsXG4gICAgcGVtOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgdXNhZ2VzPzogYW55W11cbiAgKSB7XG4gICAgY29uc3Qgc3VidGxlID0gY3J5cHRvLnN1YnRsZTtcblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tQkVHSU4gKCR7dHlwZS50b1VwcGVyQ2FzZSgpfSBLRVl8Q0VSVElGSUNBVEUpLS0tLS1gKSxcbiAgICAgICAgXCJcIlxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKGAtLS0tLUVORCAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHRoaXMuc3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdXNhZ2VzID8gdXNhZ2VzIDogW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwcml2YXRlXCIsIHBlbSwgdXNhZ2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBleHRyYWN0UHVibGljS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwdWJsaWNcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24ocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgYnVmZiA9IChhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgaGFzaDogXCJTSEEtMjU2XCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApKSBhcyBBcnJheUJ1ZmZlcjtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdmVyaWZ5KFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGF0YTogQnVmZmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNlcnQucHVibGljS2V5LmV4cG9ydCgpO1xuICAgIHNpZ25hdHVyZSA9IChcbiAgICAgIHR5cGVvZiBzaWduYXR1cmUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShzaWduYXR1cmUsIFwiaGV4XCIpIDogc2lnbmF0dXJlXG4gICAgKSBhcyBCdWZmZXI7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBzaWduYXR1cmUgYXMgYW55LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHQoY2VydGlmaWNhdGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmYgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTdWJ0bGVDcnlwdG8oKSB7XG4gICAgcmV0dXJuIGlzQnJvd3NlcigpXG4gICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93LmNyeXB0by5zdWJ0bGVcbiAgICAgIDogY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0KHByaXZhdGVLZXk6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBkYXRhID0gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCBcImhleFwiKSA6IGRhdGFcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgYSByYW5kb20gbWFzdGVyIGtleVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gSWYgZGF0YSBpcyBub3QgcGFzc2VkLCBhIHJhbmRvbSBBcnJheUJ1ZmZlciB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkYXRhIGVuY3J5dGlvbiBkYXRhXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRNYXN0ZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRNYXN0ZXIoZGF0YT86IEFycmF5QnVmZmVyKTogUHJvbWlzZTxrZXlPYmplY3Q+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlbkdlbmVzaXMgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgZGF0YSA9IHRleHRFbmNvZGVyLmVuY29kZShnZW5HZW5lc2lzKS5idWZmZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkYXRhLFxuICAgICAgQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZXJpdmVCaXRzXCJdXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGltcG9ydGVkS2V5LFxuICAgICAgaXY6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBrZXkgZnJvbSBhbm90aGVyIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2FsdFxuICAgKiBAcGFyYW0ge0NyeXB0b0tleX0ga2V5IE9yaWdpbmFsIGtleVxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RGVyaXZhdGlvbktleVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERlcml2YXRpb25LZXkoc2FsdDogc3RyaW5nLCBrZXk6IENyeXB0b0tleSkge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qgc2FsdEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZShzYWx0KTtcbiAgICBjb25zdCBzYWx0SGFzaGVkID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kaWdlc3QoXG4gICAgICBcIlNIQS0yNTZcIixcbiAgICAgIHNhbHRCdWZmZXJcbiAgICApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG5hbWU6IENSWVBUTy5LRVlfQUxHT1JZVEhNIGFzIHN0cmluZyxcbiAgICAgIGhhc2g6IENSWVBUTy5IQVNILFxuICAgICAgc2FsdDogc2FsdEhhc2hlZCxcbiAgICAgIGl0ZXJhdGlvbnM6IENSWVBUTy5JVEVSQVRJT05TLFxuICAgIH07XG4gICAgY29uc3QgZGVyaXZhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVyaXZlQml0cyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIGtleSxcbiAgICAgIENSWVBUTy5LRVlMRU5HVEggKiA4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRLZXkoZGVyaXZhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgdGhlIGtleSBhbmQgSVYgZnJvbSB0aGUgQ3J5dG9LZXkgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGVyaXZhdGlvblxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0S2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0S2V5KGRlcml2YXRpb246IEFycmF5QnVmZmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IGl2bGVuID0gMTY7XG4gICAgY29uc3Qga2V5bGVuID0gMzI7XG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGRlcml2YXRpb24uc2xpY2UoMCwga2V5bGVuKTtcbiAgICBjb25zdCBpdiA9IGRlcml2YXRpb24uc2xpY2Uoa2V5bGVuKTtcbiAgICBjb25zdCBpbXBvcnRlZEVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkZXJpdmVkS2V5LFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRFbmNyeXB0aW9uS2V5LFxuICAgICAgaXY6IGl2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZWNyeXB0IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtrZXlPYmplY3R9IGtleU9iamVjdFxuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHRQaW4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSB0ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gICAgY29uc3QgZW5jcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICB0ZXh0QnVmZmVyXG4gICAgKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZX0gZW5jcnlwdGVkVGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZWNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVjcnlwdFBpbihcbiAgICBlbmNyeXB0ZWRUZXh0OiBBcnJheUJ1ZmZlcixcbiAgICBrZXlPYmplY3Q6IGtleU9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICBlbmNyeXB0ZWRUZXh0XG4gICAgKTtcbiAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZFRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuLy8gaW1wb3J0IHsgTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuLi9jb250cmFjdHMvcHJpdmF0ZS1kYXRhXCI7XG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gb3ZlcmZsb3cgZXJyb3IgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgT3ZlcmZsb3dFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJmbG93RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT3ZlcmZsb3dFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFsYW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEJhbGFuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQWxsb3dhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSByZWdpc3RyYXRpbmcgbmV3IGVudGl0aWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBSZWdpc3RyYXRpb25FcnJvclxuICpcbiAqIEBjYXRlZ29ydCBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVnaXN0cmF0aW9uRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvbnRleHRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nQ29udGV4dEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciA9IFwiTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRVwiKSB7XG4gICAgc3VwZXIoVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MubmFtZSwgbXNnLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXAuXG4gKlxuICogQHRocm93cyB7Tm90SW5pdGlhbGl6ZWRFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqIGlmICghaXNJbml0aWFsaXplZCkge1xuICogICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcignQXBwbGljYXRpb24gaXMgbm90IGluaXRpYWxpemVkJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gTm90SW5pdGlhbGl6ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90SW5pdGlhbGl6ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90SW5pdGlhbGl6ZWRFcnJvci5uYW1lLCBtc2csIDQwOSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdQS0NTUzExTGliIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdQS0NTUzExTGliLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZG9yc2VtZW50RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFbmRvcnNlbWVudEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE12Y2NSZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE12Y2NSZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRQb2xpY3lFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50UG9saWN5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25MaW1pdHNFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yLm5hbWUsXG4gICAgY29kZSA9IDU5MFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBUcmFuc2FjdGlvblRpbWVvdXRFcnJvci5uYW1lLCA1OTEpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yLm5hbWUsIDU5Mik7XG4gIH1cbn1cbiIsImltcG9ydCBGYWJyaWNDQVNlcnZpY2VzIGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQge1xuICBBZmZpbGlhdGlvblNlcnZpY2UsXG4gIElkZW50aXR5U2VydmljZSxcbiAgSUVucm9sbFJlc3BvbnNlLFxuICBJUmVnaXN0ZXJSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQgeyBDQUNvbmZpZywgQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvbW9kZWwvSWRlbnRpdHlcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IENBX1JPTEUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4uL2NyeXB0b1wiO1xuaW1wb3J0IHtcbiAgQ2VydGlmaWNhdGVSZXNwb25zZSxcbiAgRmFicmljSWRlbnRpdHksXG4gIEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gIElkZW50aXR5UmVzcG9uc2UsXG59IGZyb20gXCIuLi8uLi9zaGFyZWQvZmFicmljLXR5cGVzXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcywgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIeXBlcmxlZGdlciBGYWJyaWMgQ0EgaWRlbnRpdHkgdHlwZXMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgcmVjb2duaXplZCBieSBGYWJyaWMgQ0EgZm9yIHJlZ2lzdHJhdGlvbiBhbmQgaWRlbnRpdHkgbWFuYWdlbWVudC5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGVudW0gSEZDQUlkZW50aXR5VHlwZSB7XG4gIFBFRVIgPSBcInBlZXJcIixcbiAgT1JERVJFUiA9IFwib3JkZXJlclwiLFxuICBDTElFTlQgPSBcImNsaWVudFwiLFxuICBVU0VSID0gXCJ1c2VyXCIsXG4gIEFETUlOID0gXCJhZG1pblwiLFxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5L3ZhbHVlIGF0dHJpYnV0ZSB1c2VkIGR1cmluZyBDQSByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBlbnRyeSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIEZhYnJpYyBDQSBpZGVudGl0eSBkdXJpbmcgcmVnaXN0cmF0aW9uLCBvcHRpb25hbGx5IG1hcmtpbmcgaXQgZm9yIGluY2x1c2lvbiBpbiBlY2VydC5cbiAqIEBpbnRlcmZhY2UgSUtleVZhbHVlQXR0cmlidXRlXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIEF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2VjZXJ0XSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGVucm9sbG1lbnQgY2VydGlmaWNhdGUgKEVDZXJ0KS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJS2V5VmFsdWVBdHRyaWJ1dGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGVjZXJ0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhbmRhcmQgRmFicmljIENBIGlkZW50aXR5IGF0dHJpYnV0ZSBrZXlzLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB3ZWxsLWtub3duIEZhYnJpYyBDQSBhdHRyaWJ1dGUga2V5cyB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBpZGVudGl0aWVzIGZvciBkZWxlZ2F0aW9ucyBhbmQgcGVybWlzc2lvbnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIEhGQ0FJZGVudGl0eUF0dHJpYnV0ZXMge1xuICBIRlJFR0lTVFJBUlJPTEVTID0gXCJoZi5SZWdpc3RyYXIuUm9sZXNcIixcbiAgSEZSRUdJU1RSQVJERUxFR0FURVJPTEVTID0gXCJoZi5SZWdpc3RyYXIuRGVsZWdhdGVSb2xlc1wiLFxuICBIRlJFR0lTVFJBUkFUVFJJQlVURVMgPSBcImhmLlJlZ2lzdHJhci5BdHRyaWJ1dGVzXCIsXG4gIEhGSU5URVJNRURJQVRFQ0EgPSBcImhmLkludGVybWVkaWF0ZUNBXCIsXG4gIEhGUkVWT0tFUiA9IFwiaGYuUmV2b2tlclwiLFxuICBIRkFGRklMSUFUSU9OTUdSID0gXCJoZi5BZmZpbGlhdGlvbk1nclwiLFxuICBIRkdFTkNSTCA9IFwiaGYuR2VuQ1JMXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNlcnZpY2Ugd3JhcHBlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEZhYnJpYyBDQS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGhpZ2gtbGV2ZWwgb3BlcmF0aW9ucyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhZ2FpbnN0IGEgSHlwZXJsZWRnZXIgRmFicmljIENlcnRpZmljYXRlIEF1dGhvcml0eSwgaW5jbHVkaW5nIHJlZ2lzdHJhdGlvbiwgZW5yb2xsbWVudCwgcmV2b2NhdGlvbiwgYW5kIGFkbWluaXN0cmF0aXZlIHF1ZXJpZXMuIEVuY2Fwc3VsYXRlcyBsb3dlci1sZXZlbCBGYWJyaWMgQ0EgY2xpZW50IGNhbGxzIHdpdGggY29uc2lzdGVudCBsb2dnaW5nIGFuZCBlcnJvciBtYXBwaW5nLlxuICogQHBhcmFtIHtDQUNvbmZpZ30gY2FDb25maWcgLSBDb25uZWN0aW9uIGFuZCBUTFMgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhcmdldCBDQS5cbiAqIEBjbGFzcyBGYWJyaWNFbnJvbGxtZW50U2VydmljZVxuICogQGV4YW1wbGVcbiAqIC8vIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgdXNlclxuICogY29uc3Qgc3ZjID0gbmV3IEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlKHtcbiAqICAgdXJsOiAnaHR0cHM6Ly9sb2NhbGhvc3Q6NzA1NCcsXG4gKiAgIGNhTmFtZTogJ09yZzFDQScsXG4gKiAgIHRsczogeyB0cnVzdGVkUm9vdHM6IFsnL3BhdGgvdG8vY2EucGVtJ10sIHZlcmlmeTogZmFsc2UgfSxcbiAqICAgY2FDZXJ0OiAnL3BhdGgvdG8vYWRtaW4vY2VydERpcicsXG4gKiAgIGNhS2V5OiAnL3BhdGgvdG8vYWRtaW4va2V5RGlyJ1xuICogfSk7XG4gKiBhd2FpdCBzdmMucmVnaXN0ZXIoeyB1c2VyTmFtZTogJ2FsaWNlJywgcGFzc3dvcmQ6ICdzM2NyM3QnIH0sIGZhbHNlLCAnb3JnMS5kZXBhcnRtZW50MScsIENBX1JPTEUuVVNFUik7XG4gKiBjb25zdCBpZCA9IGF3YWl0IHN2Yy5lbnJvbGwoJ2FsaWNlJywgJ3MzY3IzdCcpO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBhdXRvbnVtYmVyXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBTdmMgYXMgRmFicmljRW5yb2xsbWVudFNlcnZpY2VcbiAqICAgcGFydGljaXBhbnQgQ0EgYXMgRmFicmljIENBXG4gKiAgIEFwcC0+PlN2YzogcmVnaXN0ZXIoY3JlZGVudGlhbHMsIC4uLilcbiAqICAgU3ZjLT4+Q0E6IHJlZ2lzdGVyKHJlcXVlc3QsIGFkbWluVXNlcilcbiAqICAgQ0EtLT4+U3ZjOiBlbnJvbGxtZW50U2VjcmV0XG4gKiAgIFN2Yy0tPj5BcHA6IHNlY3JldFxuICogICBBcHAtPj5TdmM6IGVucm9sbChlbnJvbGxtZW50SWQsIHNlY3JldClcbiAqICAgU3ZjLT4+Q0E6IGVucm9sbCh7ZW5yb2xsbWVudElELCBzZWNyZXR9KVxuICogICBDQS0tPj5TdmM6IGNlcnRpZmljYXRlc1xuICogICBTdmMtLT4+QXBwOiBJZGVudGl0eVxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRW5yb2xsbWVudFNlcnZpY2UgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gIHByaXZhdGUgY2E/OiBGYWJyaWNDQVNlcnZpY2VzO1xuXG4gIHByaXZhdGUgY2VydGlmaWNhdGVTZXJ2aWNlPzogYW55O1xuXG4gIHByaXZhdGUgYWZmaWxpYXRpb25TZXJ2aWNlPzogQWZmaWxpYXRpb25TZXJ2aWNlO1xuXG4gIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlPzogSWRlbnRpdHlTZXJ2aWNlO1xuXG4gIHByaXZhdGUgY2xpZW50PzogYW55O1xuXG4gIHByaXZhdGUgdXNlcj86IFVzZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjYUNvbmZpZzogQ0FDb25maWcpIHtcbiAgICBDb3JlVXRpbHMuZ2V0Q3J5cHRvU3VpdGUoXG4gICAgICBjYUNvbmZpZy5oc21cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgICBsaWI6IGNhQ29uZmlnLmhzbS5saWJyYXJ5LFxuICAgICAgICAgICAgc2xvdDogY2FDb25maWcuaHNtLnNsb3QsXG4gICAgICAgICAgICBsYWJlbDogY2FDb25maWcuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgICBwaW46IFN0cmluZyhjYUNvbmZpZy5oc20ucGluKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIFVzZXIoKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgaWYgKHRoaXMudXNlcikgcmV0dXJuIHRoaXMudXNlcjtcbiAgICBjb25zdCB7IGNhTmFtZSwgY2FDZXJ0LCBjYUtleSwgdXJsLCBoc20gfSA9IHRoaXMuY2FDb25maWc7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuVXNlcik7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBDQSB1c2VyIGZvciAke2NhTmFtZX0gYXQgJHt1cmx9YCk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtjYUNlcnR9YCk7XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FDZXJ0KTtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFoc20pIHtcbiAgICAgIGlmICghY2FLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1pc3NpbmcgY2FLZXkgY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9LiBQcm92aWRlIGEga2V5IGRpcmVjdG9yeSBvciBjb25maWd1cmUgSFNNIHN1cHBvcnQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGtleSBmcm9tICR7Y2FLZXl9YCk7XG4gICAgICBrZXkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQoY2FLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBVc2luZyBIU00gY29uZmlndXJhdGlvbiBmb3IgQ0EgJHtjYU5hbWV9IHdpdGggbGlicmFyeSAke2hzbS5saWJyYXJ5fWBcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgTG9hZGluZyBBZG1pbiB1c2VyIGZvciBjYSAke2NhTmFtZX1gKTtcbiAgICB0aGlzLnVzZXIgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Q0FVc2VyKFwiYWRtaW5cIiwga2V5LCBjZXJ0aWZpY2F0ZSwgY2FOYW1lLCB7XG4gICAgICBoc20sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMudXNlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBDQSgpOiBQcm9taXNlPEZhYnJpY0NBU2VydmljZXM+IHtcbiAgICBpZiAodGhpcy5jYSkgcmV0dXJuIHRoaXMuY2E7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuQ0EpO1xuICAgIGNvbnN0IHsgdXJsLCB0bHMsIGNhTmFtZSB9ID0gdGhpcy5jYUNvbmZpZztcblxuICAgIC8vIEZPUiBTb21lIFJlYXNvbiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxzIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhpcyB3b3JrcyBmb3Igbm93XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHRydXN0ZWRSb290cywgdmVyaWZ5IH0gPSB0bHMgYXMgVExTT3B0aW9ucztcblxuICAgIGNvbnN0IHJvb3QgPSAodHJ1c3RlZFJvb3RzIGFzIHN0cmluZ1tdKVswXSBhcyBzdHJpbmc7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIENBIGNlcnRpZmljYXRlIGZyb20gJHtyb290fS4gY3dkOiAke3Byb2Nlc3MuY3dkKCl9YCk7XG5cbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaWxlQ29udGVudChyb290KTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjYU5hbWV9IHVuZGVyICR7dXJsfWApO1xuICAgIHRoaXMuY2EgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY2E7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ2xpZW50KCk6IFByb21pc2U8eyBuZXdDZXJ0aWZpY2F0ZVNlcnZpY2U6IGFueSB9PiB7XG4gICAgaWYgKHRoaXMuY2xpZW50KSByZXR1cm4gdGhpcy5jbGllbnQ7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgdGhpcy5jbGllbnQgPSAoY2EgYXMgYW55KVtcIl9GYWJyaWNDQVNlcnZpY2VzXCJdO1xuICAgIHJldHVybiB0aGlzLmNsaWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBDZXJ0aWZpY2F0ZSgpIHtcbiAgICBpZiAoIXRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlKVxuICAgICAgdGhpcy5jZXJ0aWZpY2F0ZVNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DbGllbnQoKSkubmV3Q2VydGlmaWNhdGVTZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIEFmZmlsaWF0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlKVxuICAgICAgdGhpcy5hZmZpbGlhdGlvblNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DQSgpKS5uZXdBZmZpbGlhdGlvblNlcnZpY2UoKTtcbiAgICByZXR1cm4gdGhpcy5hZmZpbGlhdGlvblNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgSWRlbnRpdGllcygpIHtcbiAgICBpZiAoIXRoaXMuaWRlbnRpdHlTZXJ2aWNlKVxuICAgICAgdGhpcy5pZGVudGl0eVNlcnZpY2UgPSAoYXdhaXQgdGhpcy5DQSgpKS5uZXdJZGVudGl0eVNlcnZpY2UoKTtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eVNlcnZpY2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIENBIGNlcnRpZmljYXRlIHNlcnZpY2UgdG8gbGlzdCBjZXJ0aWZpY2F0ZXMsIG9wdGlvbmFsbHkgbWFwcGluZyB0byBQRU0gc3RyaW5ncyBvbmx5LlxuICAgKiBAcGFyYW0ge0dldENlcnRpZmljYXRlc1JlcXVlc3R9IFtyZXF1ZXN0XSAtIE9wdGlvbmFsIGZpbHRlciByZXF1ZXN0IGZvciBjZXJ0aWZpY2F0ZSBsb29rdXAuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RvTWFwPXRydWVdIC0gV2hlbiB0cnVlLCByZXR1cm5zIGFycmF5IG9mIFBFTSBzdHJpbmdzOyBvdGhlcndpc2UgcmV0dXJucyBmdWxsIHJlc3BvbnNlIG9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmdbXSB8IENlcnRpZmljYXRlUmVzcG9uc2U+fSBBcnJheSBvZiBQRU0gc3RyaW5ncyBvciB0aGUgZnVsbCBjZXJ0aWZpY2F0ZSByZXNwb25zZS5cbiAgICovXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyhcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICBkb01hcCA9IHRydWVcbiAgKTogUHJvbWlzZTxzdHJpbmdbXSB8IENlcnRpZmljYXRlUmVzcG9uc2U+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZVNlcnZpY2UgPSBhd2FpdCB0aGlzLkNlcnRpZmljYXRlKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENlcnRpZmljYXRlcyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgY2VydGlmaWNhdGVzJHtyZXF1ZXN0ID8gYCBmb3IgJHtyZXF1ZXN0LmlkfWAgOiBcIlwifSBmb3IgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZTogQ2VydGlmaWNhdGVSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IGNlcnRpZmljYXRlU2VydmljZS5nZXRDZXJ0aWZpY2F0ZXMocmVxdWVzdCB8fCB7fSwgdXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdCBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBRdWVyaWVzIHRoZSBDQSBpZGVudGl0eSBzZXJ2aWNlIHRvIGZldGNoIGFsbCBpZGVudGl0aWVzIGFuZCByZXR1cm5zIHRoZSBsaXN0IGFzIEZhYnJpY0lkZW50aXR5IG9iamVjdHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHlbXT59IFRoZSBsaXN0IG9mIGlkZW50aXRpZXMgcmVnaXN0ZXJlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyBnZXRJZGVudGl0aWVzKCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGlkZW50aXRpZXNTZXJ2aWNlID0gYXdhaXQgdGhpcy5JZGVudGl0aWVzKCk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIElkZW50aXRpZXMgdW5kZXIgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IGlkZW50aXRpZXNTZXJ2aWNlLmdldEFsbChhd2FpdCB0aGlzLlVzZXIoKSlcbiAgICApLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5pZGVudGl0aWVzLmxlbmd0aH0gSWRlbnRpdGllczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmlkZW50aXRpZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGFmZmlsaWF0aW9ucyBmcm9tIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgZm9yIHRoZSBsaXN0IG9mIGFmZmlsaWF0aW9ucyBhdmFpbGFibGUgdW5kZXIgdGhlIGNvbmZpZ3VyZWQgQ0EuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFmZmlsaWF0aW9ucyByZXN1bHQgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIGdldEFmZmlsaWF0aW9ucygpIHtcbiAgICBjb25zdCBhZmZpbGlhdGlvblNlcnZpY2UgPSBhd2FpdCB0aGlzLkFmZmlsaWF0aW9ucygpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldEFmZmlsaWF0aW9ucyk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY2FDb25maWcuY2FOYW1lfWApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGFmZmlsaWF0aW9uU2VydmljZS5nZXRBbGwoYXdhaXQgdGhpcy5Vc2VyKCkpKVxuICAgICAgLnJlc3VsdDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRm91bmQgJHtyZXNwb25zZS5hLmxlbmd0aH0gQWZmaWxpYXRpb25zOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1gXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKGVucm9sbG1lbnRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhLm5ld0lkZW50aXR5U2VydmljZSgpLmdldE9uZShlbnJvbGxtZW50SWQsIHVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCByZWdpc3RyYXRpb246IHN0cmluZztcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZWdpc3Rlcik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGVucm9sbG1lbnRJRDogdXNlck5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiBwYXNzd29yZCxcbiAgICAgICAgYWZmaWxpYXRpb246IGFmZmlsaWF0aW9uLFxuICAgICAgICB1c2VyUm9sZTogdXNlclJvbGUsXG4gICAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgICAgbWF4RW5yb2xsbWVudHM6IG1heEVucm9sbG1lbnRzLFxuICAgICAgfSBhcyBJUmVnaXN0ZXJSZXF1ZXN0O1xuICAgICAgcmVnaXN0cmF0aW9uID0gYXdhaXQgY2EucmVnaXN0ZXIocHJvcHMsIHVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZ1xuICApOiBJZGVudGl0eSB7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljRW5yb2xsbWVudFNlcnZpY2UsIHt9KS5mb3IoXG4gICAgICB0aGlzLmlkZW50aXR5RnJvbUVucm9sbG1lbnRcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBHZW5lcmF0aW5nIElkZW50aXR5IGZyb20gY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX0gaW4gbXNwICR7bXNwSWR9YFxuICAgICk7XG4gICAgY29uc3QgY2xpZW50SWQgPSBDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgaWQgPSBDcnlwdG9VdGlscy5lbmNvZGUoY2xpZW50SWQpO1xuICAgIGxvZy5kZWJ1ZyhgSWRlbnRpdHkgJHtjbGllbnRJZH0gYW5kIGVuY29kZWRJZCAke2lkfWApO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eSh7XG4gICAgICBpZDogaWQsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleToga2V5LnRvQnl0ZXMoKSxcbiAgICAgICAgcm9vdENlcnRpZmljYXRlOiByb290Q2VydGlmaWNhdGUsXG4gICAgICAgIGNyZWF0ZWRPbjogbm93LFxuICAgICAgICB1cGRhdGVkT246IG5vdyxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgICBjcmVhdGVkT246IG5vdyxcbiAgICAgIHVwZGF0ZWRPbjogbm93LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbnJvbGwgYW4gaWRlbnRpdHkgd2l0aCB0aGUgQ0EgdXNpbmcgYSByZWdpc3RyYXRpb24gc2VjcmV0LlxuICAgKiBAc3VtbWFyeSBFeGNoYW5nZXMgdGhlIGVucm9sbG1lbnQgSUQgYW5kIHNlY3JldCBmb3IgY2VydGlmaWNhdGVzLCByZXR1cm5pbmcgYSBjb25zdHJ1Y3RlZCBJZGVudGl0eSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gZW5yb2xsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uIC0gRW5yb2xsbWVudCBzZWNyZXQgcmV0dXJuZWQgYXQgcmVnaXN0cmF0aW9uIHRpbWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkgb2JqZWN0IHdpdGggY3JlZGVudGlhbHMuXG4gICAqL1xuICBhc3luYyBlbnJvbGwoZW5yb2xsbWVudElkOiBzdHJpbmcsIHJlZ2lzdHJhdGlvbjogc3RyaW5nKSB7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5lbnJvbGwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICAgIGxvZy5kZWJ1ZyhgRW5yb2xsaW5nICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgY29uc3QgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlID0gYXdhaXQgY2EuZW5yb2xsKHtcbiAgICAgICAgZW5yb2xsbWVudElEOiBlbnJvbGxtZW50SWQsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHJlZ2lzdHJhdGlvbixcbiAgICAgIH0pO1xuICAgICAgaWRlbnRpdHkgPSBGYWJyaWNFbnJvbGxtZW50U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNhQ29uZmlnLmNhTmFtZVxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY2FDb25maWcuY2FOYW1lfSBhcyAke2lkZW50aXR5LmlkfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYW5kIGVucm9sbCBhIG5ldyBpZGVudGl0eSBpbiBvbmUgc3RlcC5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgbmV3IGVucm9sbG1lbnQgSUQgd2l0aCB0aGUgQ0EgYW5kIGltbWVkaWF0ZWx5IGV4Y2hhbmdlcyB0aGUgc2VjcmV0IHRvIGVucm9sbCwgcmV0dXJuaW5nIHRoZSBjcmVhdGVkIElkZW50aXR5LlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBtb2RlbCAtIENyZWRlbnRpYWxzIGZvciB0aGUgbmV3IGlkZW50aXR5IGNvbnRhaW5pbmcgdXNlck5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N1cGVyVXNlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJlZ2lzdGVyIHRoZSBpZGVudGl0eSBhcyBhIHN1cGVyIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWZmaWxpYXRpb249XCJcIl0gLSBBZmZpbGlhdGlvbiBzdHJpbmcgKGUuZy4sIG9yZzEuZGVwYXJ0bWVudDEpLlxuICAgKiBAcGFyYW0ge0NBX1JPTEUgfCBzdHJpbmd9IFt1c2VyUm9sZV0gLSBSb2xlIHRvIGFzc2lnbiB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7SUtleVZhbHVlQXR0cmlidXRlfSBbYXR0cnNdIC0gT3B0aW9uYWwgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW21heEVucm9sbG1lbnRzXSAtIE1heGltdW0gbnVtYmVyIG9mIGVucm9sbG1lbnRzIGFsbG93ZWQgZm9yIHRoZSBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyQW5kRW5yb2xsKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlclxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgdGhpcy5yZWdpc3RlcihcbiAgICAgIG1vZGVsLFxuICAgICAgaXNTdXBlclVzZXIsXG4gICAgICBhZmZpbGlhdGlvbixcbiAgICAgIHVzZXJSb2xlLFxuICAgICAgYXR0cnMsXG4gICAgICBtYXhFbnJvbGxtZW50c1xuICAgICk7XG4gICAgY29uc3QgeyB1c2VyTmFtZSB9ID0gbW9kZWw7XG4gICAgcmV0dXJuIHRoaXMuZW5yb2xsKHVzZXJOYW1lIGFzIHN0cmluZywgcmVnaXN0cmF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2VzIHRoZSBlbnJvbGxtZW50IG9mIGFuIGlkZW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCBlbnJvbGxtZW50IElELlxuICAgKlxuICAgKiBAcGFyYW0gZW5yb2xsbWVudElkIC0gVGhlIGVucm9sbG1lbnQgSUQgb2YgdGhlIGlkZW50aXR5IHRvIGJlIHJldm9rZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXN1bHQgb2YgdGhlIHJldm9jYXRpb24gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAdGhyb3dzIHtOb3RGb3VuZEVycm9yfSBJZiB0aGUgZW5yb2xsbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZG9lcyBub3QgZXhpc3QuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0aGUgcmV2b2NhdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgYXN5bmMgcmV2b2tlKGVucm9sbG1lbnRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuVXNlcigpO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgY2EucmV2b2tlKFxuICAgICAgICB7IGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsIHJlYXNvbjogXCJVc2VyIERlbGV0YXRpb25cIiB9LFxuICAgICAgICB1c2VyXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQuc3VjY2VzcylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldm9rZSBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke3Jlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKX1gXG4gICAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IElSZWdpc3RlclJlcXVlc3QsIElLZXlWYWx1ZUF0dHJpYnV0ZSB9IGZyb20gXCJmYWJyaWMtY2EtY2xpZW50XCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBtaW4sXG4gIG1pbmxlbmd0aCxcbiAgTW9kZWwsXG4gIHJlcXVpcmVkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIGV4dGVuZHMgTW9kZWwge1xuICBAcmVxdWlyZWQoKVxuICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIjtcbiAgQG1pbmxlbmd0aCgxKVxuICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdO1xuICBAcmVxdWlyZWQoKVxuICBlbnJvbGxtZW50SUQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpXG4gIGVucm9sbG1lbnRTZWNyZXQhOiBzdHJpbmc7XG4gIEBtaW4oMClcbiAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXI7XG4gIEByZXF1aXJlZCgpXG4gIHJvbGUhOiBzdHJpbmc7XG5cbiAgYnVpbGQoKTogSVJlZ2lzdGVyUmVxdWVzdCB7XG4gICAgY29uc3QgZXJycyA9IHRoaXMuaGFzRXJyb3JzKCk7XG4gICAgaWYgKGVycnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJycy50b1N0cmluZygpKTtcbiAgICBjb25zdCByZXNwb25zZTogSVJlZ2lzdGVyUmVxdWVzdCA9IHtcbiAgICAgIGVucm9sbG1lbnRJRDogdGhpcy5lbnJvbGxtZW50SUQsXG4gICAgICBlbnJvbGxtZW50U2VjcmV0OiB0aGlzLmVucm9sbG1lbnRTZWNyZXQsXG4gICAgICByb2xlOiB0aGlzLnJvbGUsXG4gICAgICBhZmZpbGlhdGlvbjogdGhpcy5hZmZpbGlhdGlvbixcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgdGhpcy5tYXhFbnJvbGxtZW50cyAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHJlc3BvbnNlLm1heEVucm9sbG1lbnRzID0gdGhpcy5tYXhFbnJvbGxtZW50cztcbiAgICBpZiAodGhpcy5hdHRycykgcmVzcG9uc2UuYXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIHNldEFmZmlsaWF0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFmZmlsaWF0aW9uID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRBdHRyKGF0dHI6IElLZXlWYWx1ZUF0dHJpYnV0ZSkge1xuICAgIHRoaXMuYXR0cnMgPSB0aGlzLmF0dHJzIHx8IFtdO1xuICAgIHRoaXMuYXR0cnMucHVzaChhdHRyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEF0dHJzKHZhbHVlOiBJS2V5VmFsdWVBdHRyaWJ1dGVbXSkge1xuICAgIHRoaXMuYXR0cnMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEVucm9sbG1lbnRJRCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbnJvbGxtZW50SUQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEVucm9sbG1lbnRTZWNyZXQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW5yb2xsbWVudFNlY3JldCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TWF4RW5yb2xsbWVudHModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMubWF4RW5yb2xsbWVudHMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFJvbGUodmFsdWU6IENBX1JPTEUgfCBzdHJpbmcpIHtcbiAgICB0aGlzLnJvbGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXZlbnRzIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBldmVudHMgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqIFRoZSBldmVudHMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgRUlQLTIwIHN0YW5kYXJkLlxuICovXG5leHBvcnQgZW51bSBFUkMyMEV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBgdHJhbnNmZXJgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdHJhbnNmZXJyZWQuXG4gICAqL1xuICBUUkFOU0ZFUiA9IFwiVHJhbnNmZXJcIixcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGBhcHByb3ZlYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvdmVkIHNwZW5kZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIGFwcHJvdmVkIGZvciB0aGUgc3BlbmRlci5cbiAgICovXG4gIEFQUFJPVkFMID0gXCJBcHByb3ZhbFwiLFxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBjbGFzcyBGYWJyaWNCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIG9mIGNyZWF0aW9uXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGVcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB2ZXJzaW9uKClcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEJ5LCB1cGRhdGVkQnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRmFicmljQmFzZU1vZGVsIH0gZnJvbSBcIi4vRmFicmljQmFzZU1vZGVsXCI7XG5cbkB1c2VzKEZhYnJpY0ZsYXZvdXIpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCBleHRlbmRzIEZhYnJpY0Jhc2VNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgY3JlYXRvclwiKVxuICBAY29sdW1uKClcbiAgQGNyZWF0ZWRCeSgpXG4gIGNyZWF0ZWRCeSE6IHN0cmluZztcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHVzZXIgdGhhdCBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsXCIpXG4gIEBjb2x1bW4oKVxuICBAdXBkYXRlZEJ5KClcbiAgdXBkYXRlZEJ5ITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERCS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyLCBNaXJyb3JNZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5cbk1vZGVsLnByb3RvdHlwZS5pc1NoYXJlZCA9IGZ1bmN0aW9uIGlzU2hhcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gTW9kZWwuaXNTaGFyZWQodGhpcy5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG59O1xuXG5Nb2RlbC5wcm90b3R5cGUuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gTW9kZWwuaXNQcml2YXRlKHRoaXMuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xufTtcblxuTW9kZWwucHJvdG90eXBlLnNlZ3JlZ2F0ZSA9IGZ1bmN0aW9uIHNlZ3JlZ2F0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBTZWdyZWdhdGVkTW9kZWw8TT4ge1xuICByZXR1cm4gTW9kZWwuc2VncmVnYXRlKHRoaXMpO1xufTtcblxuKE1vZGVsIGFzIGFueSkuc2VncmVnYXRlID0gZnVuY3Rpb24gc2VncmVnYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNXG4pOiBTZWdyZWdhdGVkTW9kZWw8TT4ge1xuICBpZiAoIU1vZGVsLmlzVHJhbnNpZW50KG1vZGVsKSkgcmV0dXJuIHsgbW9kZWw6IG1vZGVsIH07XG4gIGNvbnN0IGRlY29yYXRlZFByb3BlcnRpZXMgPVxuICAgIE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSB8fCBbXTtcblxuICBjb25zdCB0cmFuc2llbnRQcm9wcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgREJLZXlzLlRSQU5TSUVOVFxuICApO1xuICBjb25zdCBwcml2YXRlUHJvcGVydGllcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgRmFicmljTW9kZWxLZXlzLlBSSVZBVEVcbiAgKTtcbiAgY29uc3Qgc2hhcmVkUHJvcGVydGllcyA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgRmFicmljTW9kZWxLZXlzLlNIQVJFRFxuICApO1xuXG4gIGNvbnN0IHJlc3VsdDogU2VncmVnYXRlZE1vZGVsPE0+ID0ge1xuICAgIG1vZGVsOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBwdWJsaWM6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHRyYW5zaWVudDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgcHJpdmF0ZXM6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHNoYXJlZDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gIH07XG5cbiAgY29uc3QgdHJhbnNpZW50S2V5cyA9IE9iamVjdC5rZXlzKHRyYW5zaWVudFByb3BzIHx8IHt9KTtcbiAgY29uc3QgcHJpdmF0ZUtleXMgPSBPYmplY3Qua2V5cyhwcml2YXRlUHJvcGVydGllcyB8fCB7fSk7XG4gIGNvbnN0IHNoYXJlZEtleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRQcm9wZXJ0aWVzIHx8IHt9KTtcblxuICAvLyBjb25zdCBwa0tleSA9IE1vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlY29yYXRlZFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1vZGVsW2tleSBhcyBrZXlvZiBNXTtcbiAgICBjb25zdCBpc1RyYW5zaWVudCA9IHRyYW5zaWVudEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBpc1B1YmxpYyA9ICFpc1RyYW5zaWVudDtcbiAgICBjb25zdCBpc1ByaXZhdGUgPSBwcml2YXRlS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIGNvbnN0IGlzU2hhcmVkID0gc2hhcmVkS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIC8vIGNvbnN0IGlzUHJpbWFyeUtleSA9IGtleSA9PT0gcGtLZXk7XG5cbiAgICBpZiAoaXNUcmFuc2llbnQgfHwgaXNQcml2YXRlIHx8IGlzU2hhcmVkKSB7XG4gICAgICByZXN1bHQudHJhbnNpZW50ID0gcmVzdWx0LnRyYW5zaWVudCB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQudHJhbnNpZW50IGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICByZXN1bHQucHJpdmF0ZXMgPSByZXN1bHQucHJpdmF0ZXMgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnByaXZhdGVzIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNTaGFyZWQpIHtcbiAgICAgIHJlc3VsdC5zaGFyZWQgPSByZXN1bHQuc2hhcmVkIHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC5zaGFyZWQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgcmVzdWx0LnB1YmxpYyA9IChyZXN1bHQucHVibGljIHx8IHt9KSBhcyBhbnk7XG4gICAgICAocmVzdWx0LnB1YmxpYyBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXN1bHQubW9kZWwgPSBNb2RlbC5idWlsZChyZXN1bHQucHVibGljLCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgcmV0dXJuIHJlc3VsdCBhcyBTZWdyZWdhdGVkTW9kZWw8TT47XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5pc1ByaXZhdGUgPSBmdW5jdGlvbiBpc1ByaXZhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIU1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgRmFicmljTW9kZWxLZXlzLlBSSVZBVEVcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmlzU2hhcmVkID0gZnVuY3Rpb24gaXNTaGFyZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIU1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgRmFicmljTW9kZWxLZXlzLlNIQVJFRFxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkubWlycm9yZWQgPSBmdW5jdGlvbiBtaXJyb3JlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5vd25lck9mID0gZnVuY3Rpb24gb3duZXJPZjxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSlcbiAgKTtcbiAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbW9kZWxbbWV0YSBhcyBrZXlvZiBNXSBhcyBzdHJpbmc7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5taXJyb3JlZEF0ID0gZnVuY3Rpb24gbWlycm9yZWRBdDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBNaXJyb3JNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIG1vZGVsID0gdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsO1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsIGFzIGFueSxcbiAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmNvbGxlY3Rpb25zRm9yID0gZnVuY3Rpb24gY29sbGVjdGlvbnNGb3I8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKToge1xuICBwcml2YXRlQ29sczogKHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcilbXTtcbiAgc2hhcmVkQ29sczogKHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcilbXTtcbn0ge1xuICBjb25zdCBwcml2YXRlS2V5czogc3RyaW5nW10gPSBbRmFicmljTW9kZWxLZXlzLlBSSVZBVEVdIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaGFyZWRLZXlzOiBzdHJpbmdbXSA9IFtGYWJyaWNNb2RlbEtleXMuU0hBUkVEXSBhcyBzdHJpbmdbXTtcblxuICBjb25zdCBwcml2YXRlS2V5ID0gTWV0YWRhdGEua2V5KC4uLnByaXZhdGVLZXlzKTtcbiAgY29uc3Qgc2hhcmVkS2V5ID0gTWV0YWRhdGEua2V5KC4uLnNoYXJlZEtleXMpO1xuXG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcblxuICBjb25zdCBwcml2YXRlTWV0YTogeyBjb2xsZWN0aW9uczogc3RyaW5nW10gfSA9IE1ldGFkYXRhLmdldChcbiAgICBjb25zdHIgYXMgYW55LFxuICAgIHByaXZhdGVLZXlcbiAgKTtcbiAgY29uc3Qgc2hhcmVkTWV0YTogeyBjb2xsZWN0aW9uczogc3RyaW5nW10gfSA9IE1ldGFkYXRhLmdldChcbiAgICBjb25zdHIgYXMgYW55LFxuICAgIHNoYXJlZEtleVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgcHJpdmF0ZUNvbHM6IHByaXZhdGVNZXRhPy5jb2xsZWN0aW9ucyB8fCBbXSxcbiAgICBzaGFyZWRDb2xzOiBzaGFyZWRNZXRhPy5jb2xsZWN0aW9ucyB8fCBbXSxcbiAgfTtcbn0uYmluZChNb2RlbCk7XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIFJlcG8sXG4gIENvbnRleHQsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIENvbnRleHRPZixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIHRoZSBNU1AgSUQgZnJvbSBlaXRoZXIgYSBzdHJpbmcgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcGFyYW0gaWRlbnRpdHkgLSBUaGUgaWRlbnRpdHkgdmFsdWUgd2hpY2ggY2FuIGJlIGEgc3RyaW5nIE1TUCBJRCBvciBDbGllbnRJZGVudGl0eSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBNU1AgSUQgYXMgYSBzdHJpbmcsIG9yIHVuZGVmaW5lZCBpZiBub3QgYXZhaWxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TXNwSWQoXG4gIGlkZW50aXR5OiBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBpZGVudGl0eSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gaWRlbnRpdHkuZ2V0TVNQSUQoKTtcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIG1hcmtpbmcgbWV0aG9kcyB0aGF0IHJlcXVpcmUgb3duZXJzaGlwIGF1dGhvcml6YXRpb24uXG4gKiBDaGVja3MgdGhlIG93bmVyIG9mIHRoZSB0b2tlbiBiZWZvcmUgYWxsb3dpbmcgdGhlIG1ldGhvZCB0byBiZSBleGVjdXRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVG9rZW5Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHtcbiAqICAgQE93bmVyKClcbiAqICAgYXN5bmMgTWludChjdHg6IENvbnRleHQsIGFtb3VudDogbnVtYmVyKSB7XG4gKiAgICAgLy8gTWludCB0b2tlbiBsb2dpY1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBjaGVja3Mgb3duZXJzaGlwIGF1dGhvcml6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPd25lcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgdGhpczogRmFicmljRVJDMjBDb250cmFjdCxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKSB7XG4gICAgICBjb25zdCBjdHg6IEhMQ29udGV4dCA9IGFyZ3NbMF07XG4gICAgICBjb25zdCBhY291bnRJZCA9IGN0eC5jbGllbnRJZGVudGl0eS5nZXRJRCgpO1xuXG4gICAgICBjb25zdCBzZWxlY3QgPSBhd2FpdCAodGhpcyBhcyBGYWJyaWNFUkMyMENvbnRyYWN0KVtcbiAgICAgICAgXCJ0b2tlblJlcG9zaXRvcnlcIlxuICAgICAgXS5zZWxlY3QoKTtcblxuICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgc2VsZWN0LmV4ZWN1dGUoY3R4KTtcblxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcIk5vIHRva2VucyBhdmFpYWxibGVcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVG8gbWFueSB0b2tlbiBhdmFpbGFibGUgOiAke3Rva2Vucy5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbnNbMF0ub3duZXIgIT0gYWNvdW50SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgICAgICBgVXNlciBub3QgYXV0aG9yaXplZCB0byBydW4gJHtwcm9wZXJ0eUtleX0gb24gdGhlIHRva2VuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcblxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3duZWRCeU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGNvbnN0IG93bmVyID0gY3JlYXRvci5tc3BpZDtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgZ2VuZXJhdGVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKG93bmVkQnlPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZE9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcbiAgbW9kZWxba2V5XSA9IHN0dWIuZ2V0VHhJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgb25VcGRhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsXG4gICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSURcbiAgICAgICAgICApLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIE1pcnJvckNvbmRpdGlvbiA9IChtc3A6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTWlycm9yTWV0YWRhdGEgPSB7XG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvbjtcbiAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZztcbiAgbXNwSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsTWlycm9yTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJlc29sdmVyOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIGN0eDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPlxuKSB7XG4gIGxldCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgPSByZXNvbHZlcjtcbiAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgY3R4LmdldChcInN0dWJcIikuZ2V0Q3JlYXRvcigpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGNvbGxlY3Rpb24gPSBhd2FpdCByZXNvbHZlcihtb2RlbCwgb3duZXIsIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gbWlycm9yIG5hbWU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbGxlY3Rpb24gfHwgdHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gY29sbGVjdGlvbiBmb3VuZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIC8vIFB1dCBtaXJyb3IgZmxhZ3MgZGlyZWN0bHkgb24gY29udGV4dCBzbyBhZGFwdGVyLnByZXBhcmUoKSBhbmQgYWRhcHRlci5jcmVhdGUoKSBjYW4gc2VlIHRoZW1cbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBjb25zdCBtaXJyb3IgPSBhd2FpdCByZXBvLmNyZWF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkIHdpdGggJHtNb2RlbC5wayhtb2RlbCkgYXMgc3RyaW5nfTogJHttaXJyb3JbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCBtaXJyb3IgZmxhZ3MgZnJvbSBjb250ZXh0XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgICAgYXBwbHlVcGRhdGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VGb3JVcGRhdGU6IGZhbHNlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBhd2FpdCByZXBvLnVwZGF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB1cGRhdGVkOiAkeyhtb2RlbCBhcyBhbnkpW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3AgPSBNb2RlbC5wayhtb2RlbCkgYXMga2V5b2YgTTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrUHJvcF07XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgc2VncmVnYXRlZDogY29sbGVjdGlvbixcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkIGFzIGFueSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNYXkgYWxyZWFkeSBiZSBkZWxldGVkIGJ5IGFkYXB0ZXIuZGVsZXRlU2VncmVnYXRlZENvbGxlY3Rpb25zXG4gICAgfVxuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gZGVsZXRlZDogJHtTdHJpbmcoaWQpfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pcnJvcldyaXRlR3VhcmQ8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGlmIChtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG5cbiAgaWYgKCFtc3ApIHJldHVybjtcblxuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IG1hdGNoZXMgPSBtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgcmVhZDogTVNQICR7bXNwfSBtYXRjaGVzLCByb3V0aW5nIHJlYWRzIHRvIG1pcnJvciBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn1gXG4gICAgKTtcbiAgICAvLyBSb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3IgY29sbGVjdGlvblxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgICBmYWJyaWNDdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICAgIGZhYnJpY0N0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbiAgfVxuICAvLyBXaGVuIE1TUCBkb2VzIE5PVCBtYXRjaCwgbm9ybWFsIHJlYWQgZmxvdyDigJQgYWxsIGRhdGEgaXMgaW4gcHVibGljIHN0YXRlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3IoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgbXNwSWRPckNvbmRpdGlvbj86IHN0cmluZyB8IE1pcnJvckNvbmRpdGlvbixcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4pIHtcbiAgY29uc3QgaXNDb25kaXRpb25Pbmx5ID1cbiAgICB0eXBlb2YgbXNwSWRPckNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1zcElkT3JDb25kaXRpb24pO1xuICBjb25zdCBtc3BJZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAobXNwSWRPckNvbmRpdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBjb25zdCBjb25kID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyAobXNwSWRPckNvbmRpdGlvbiBhcyBNaXJyb3JDb25kaXRpb24pXG4gICAgOiBjb25kaXRpb247XG5cbiAgZnVuY3Rpb24gbWlycm9yKFxuICAgIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogTWlycm9yTWV0YWRhdGEgPSB7XG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUiksXG4gICAgICAgIG1ldGFcbiAgICAgICksXG4gICAgICAvLyBSZWFkIGhhbmRsZXIgcnVucyBlYXJseSAocHJpb3JpdHkgMzApIHRvIHNldCB1cCBjb250ZXh0IGJlZm9yZSBhbnkgcmVhZHNcbiAgICAgIG9uUmVhZChyZWFkTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDMwIH0pLFxuICAgICAgLy8gV3JpdGUgZ3VhcmRzIOKAlCByZWplY3QgbWF0Y2hpbmcgTVNQcyBiZWZvcmUgYW55IHByb2Nlc3NpbmdcbiAgICAgIG9uQ3JlYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uVXBkYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uRGVsZXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIC8vIE1pcnJvciBzeW5jIGhhbmRsZXJzIOKAlCB3cml0ZSBmdWxsIG1vZGVsIGFmdGVyIG90aGVyIGhhbmRsZXJzIChwcmlvcml0eSAxMDApXG4gICAgICBvbkNyZWF0ZShjcmVhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25VcGRhdGUodXBkYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uRGVsZXRlKGRlbGV0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1pcnJvcixcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uLCBtc3BJZCwgY29uZF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcD86IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTW9kZWxDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGAke3RvUGFzY2FsQ2FzZShjb25zdHIubmFtZSl9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5hbWVzcGFjZUNvbGxlY3Rpb24obmFtZXNwYWNlOiBzdHJpbmcpOiBDb2xsZWN0aW9uUmVzb2x2ZXIge1xuICByZXR1cm4gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPiwgbXNwSWQ/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvcmdOYW1lID1cbiAgICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gICAgaWYgKCFvcmdOYW1lKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICAgKTtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYF9fJHt0b1Bhc2NhbENhc2Uob3JnTmFtZSl9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW9yaXR5IGZvciBlYXJseSBjb2xsZWN0aW9uIGV4dHJhY3Rpb24gKGJlZm9yZSBwayBnZW5lcmF0aW9uIGF0IHByaW9yaXR5IDYwKVxuICogQHN1bW1hcnkgVGhpcyBwcmlvcml0eSBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgYmVmb3JlIGFueSBzZXF1ZW5jZVxuICogb3BlcmF0aW9ucyBvY2N1ciwgYWxsb3dpbmcgc2VxdWVuY2VzIHRvIGJlIHJlcGxpY2F0ZWQgdG8gcHJpdmF0ZS9zaGFyZWQgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSA9IDM1O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZWdyZWdhdGlvbkZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBNLFxuICBjb2xsZWN0aW9uczogc3RyaW5nW10sXG4gIGN0eDogYW55XG4pIHtcbiAgLy8gUmVnaXN0ZXIgY29sbGVjdGlvbnMgZWFybHkgdXNpbmcgcmVhZEZyb20gLSB0aGlzIGFsbG93cyBzZXF1ZW5jZSBjb2RlXG4gIC8vIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvIGR1cmluZyBwayBnZW5lcmF0aW9uXG4gIGlmIChjb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgKGN0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb25zKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vZGVsIGlzIGZ1bGx5IHNlZ3JlZ2F0ZWQgKGFsbCBub24tcGsgcHJvcGVydGllcyBhcmUgcHJpdmF0ZS9zaGFyZWQvdHJhbnNpZW50KS5cbiAgLy8gVXNlIE1vZGVsLnNlZ3JlZ2F0ZSgpIHdoaWNoIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIGRldGVybWluZSB3aGF0J3MgdHJhbnNpZW50LFxuICAvLyByYXRoZXIgdGhhbiByZWFkaW5nIERCS2V5cy5UUkFOU0lFTlQgbWV0YWRhdGEgd2hpY2ggbWF5IG5vdCBhY2N1bXVsYXRlIGNvcnJlY3RseVxuICAvLyB3aGVuIGNsYXNzLWxldmVsIEBwcml2YXRlRGF0YSBhcHBsaWVzIGRlY29yYXRvcnMgaXRlcmF0aXZlbHkuXG4gIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgIGlmICghaGFzUHVibGljUHJvcGVydGllcyhjbGF6ei5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikpIHtcbiAgICAgIGN0eC5tYXJrRnVsbHlTZWdyZWdhdGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU1pcnJvckZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4pIHtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgY29uc3QgbWF0Y2hlcyA9XG4gICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybjtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShcbiAgICBuZXcgY2xhenooKSxcbiAgICBtaXJyb3JNZXRhLnJlc29sdmVyLFxuICAgIGN0eFxuICApO1xuICAvLyBNaXJyb3IgTVNQIG1hdGNoZXMg4oCUIHJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvclxuICAvLyBjb2xsZWN0aW9uLiBDbGVhciBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbGxlY3Rpb25zIHNvIHF1ZXJpZXNcbiAgLy8gZ28gT05MWSB0byB0aGUgbWlycm9yLCBub3QgdG8gdGhlIHJlZ3VsYXIgcHJpdmF0ZS9zaGFyZWQgb25lcy5cbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBjdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1B1YmxpY1Byb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBib29sZWFuIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMoY2xhenopIHx8IFtdO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgY29uc3QgdHJhbnNpZW50TWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICBjb25zdCBwcml2YXRlTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKSkgfHwge307XG4gIGNvbnN0IHNoYXJlZE1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuU0hBUkVEKSkgfHwge307XG5cbiAgcmV0dXJuIGF0dHJpYnV0ZXMuc29tZSgoYXR0cikgPT4ge1xuICAgIGlmIChhdHRyID09PSBwaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHRyYW5zaWVudE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBwcml2YXRlTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHNoYXJlZE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVhcmx5IGhhbmRsZXIgdG8gZXh0cmFjdCBhbmQgcmVnaXN0ZXIgY29sbGVjdGlvbnMgaW4gY29udGV4dFxuICogQHN1bW1hcnkgUnVucyB3aXRoIHByaW9yaXR5IDwgNDAgdG8gZXh0cmFjdCBjb2xsZWN0aW9uIG5hbWVzIGJlZm9yZSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MCkuXG4gKiBUaGlzIGFsbG93cyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtDb250ZXh0T2Y8UmVwb3NpdG9yeTxNLCBhbnk+Pn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdfSBkYXRhIC0gVGhlIHNlZ3JlZ2F0ZWQgZGF0YSBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0ga2V5cyAtIFRoZSBwcm9wZXJ0eSBrZXkocykgYmVpbmcgc2VncmVnYXRlZFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApIHtcbiAgICAvLyBDYW4ndCBleHRyYWN0IGNvbGxlY3Rpb25zIHdpdGhvdXQgTVNQLCB3aWxsIGJlIGNhdWdodCBieSBsYXRlciBoYW5kbGVyc1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbGxlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG1ldGFkYXRhIG9mIGRhdGFBcnJheSkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IG1ldGFkYXRhLmNvbGxlY3Rpb25zO1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoY29sbGVjdGlvbiAmJiAhY29sbGVjdGlvbnMuaW5jbHVkZXMoY29sbGVjdGlvbikpIHtcbiAgICAgIGNvbGxlY3Rpb25zLnB1c2goY29sbGVjdGlvbik7XG4gICAgfVxuICB9XG4gIGFwcGx5U2VncmVnYXRpb25GbGFncyhtb2RlbCwgY29sbGVjdGlvbnMsIGNvbnRleHQpO1xuXG4gIC8vIFN0b3JlIHNlZ3JlZ2F0aW9uIG1ldGFkYXRhIG9uIHRoZSBhZGFwdGVyIChwZXJzaXN0cyBhY3Jvc3MgY29udGV4dCBjaGFpbnMpLlxuICAvLyBUaGUgU2VxdWVuY2UgY3JlYXRlcyBpdHMgb3duIGNvbnRleHQgdmlhIGxvZ0N0eCwgbG9zaW5nIGNvbnRleHQtc3RvcmVkIGZsYWdzLlxuICBjb25zdCBzZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBcInBrXCIpO1xuICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgc2VxTmFtZSxcbiAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgIGNvbGxlY3Rpb25zXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dE9mPHR5cGVvZiB0aGlzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czoga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBba2V5c10pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICAvLyBWYWxpZGF0ZSBhbGwga2V5cyByZXNvbHZlIHRvIHRoZSBzYW1lIGNvbGxlY3Rpb25cbiAga2V5QXJyYXkuZm9yRWFjaCgoX2ssIGkpID0+IHtcbiAgICBjb25zdCBjID1cbiAgICAgIHR5cGVvZiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnNcbiAgICAgICAgOiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGMgIT09IGNvbGxlY3Rpb24pXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICApO1xuICB9KTtcblxuICBjb25zdCBrZXlTdHJpbmdzID0ga2V5QXJyYXkubWFwKChrZXkpID0+IFN0cmluZyhrZXkpKTtcbiAgLy8gU3RvcmUgdGhlIHNlZ3JlZ2F0ZWQgbW9kZWwg4oCUIHByZXBhcmUoKSB3aWxsIGZpbHRlciB0byBjb2xsZWN0aW9uLXNwZWNpZmljIGZpZWxkc1xuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLndyaXRlVG8oY29sbGVjdGlvbiwga2V5U3RyaW5ncyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uUmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljRmxhZ3M+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9IE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGV4dHJhY3RNc3BJZChjb250ZXh0LmdldChcImlkZW50aXR5XCIpKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogYXdhaXQgY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dE9mPHR5cGVvZiB0aGlzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5OiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG9sZE1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleSkgPyBrZXkgOiBba2V5XSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIGtleUFycmF5LmZvckVhY2goKGssIGkpID0+IHtcbiAgICBjb25zdCBjID1cbiAgICAgIHR5cGVvZiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnNcbiAgICAgICAgOiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGMgIT09IGNvbGxlY3Rpb24pXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICApO1xuICB9KTtcblxuICBjb25zdCBrZXlTdHJpbmdzID0gKGtleUFycmF5IGFzIChrZXlvZiBNKVtdKS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgbW9kZWwg4oCUIHByZXBhcmUoKSB3aWxsIGZpbHRlciB0byBjb2xsZWN0aW9uLXNwZWNpZmljIGZpZWxkc1xuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLndyaXRlVG8oY29sbGVjdGlvbiwga2V5U3RyaW5ncyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIFYgZXh0ZW5kcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWIHwgVltdLFxuICBrZXk6IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXSkgYXMgVltdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleSkgPyBrZXkgOiBba2V5XSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIHNlZ3JlZ2F0ZWQoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgdHlwZTogRmFicmljTW9kZWxLZXlzLlBSSVZBVEUgfCBGYWJyaWNNb2RlbEtleXMuU0hBUkVELFxuICBmaWx0ZXI/OiAocHJvcE5hbWU6IHN0cmluZykgPT4gYm9vbGVhblxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbm5lclNlZ3JlZ2F0ZWQodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgZnVuY3Rpb24gc2VncmVnYXRlZERlYyh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICAgIGNvbnN0IGtleSA9IE1ldGFkYXRhLmtleSh0eXBlLCBwcm9wZXJ0eUtleSk7XG4gICAgICBjb25zdCBjb25zdHI6IENvbnN0cnVjdG9yID0gdGFyZ2V0LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yO1xuXG4gICAgICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5KSB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gbmV3IFNldChtZXRhLmNvbGxlY3Rpb25zIHx8IFtdKTtcbiAgICAgIGNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcbiAgICAgIG1ldGEuY29sbGVjdGlvbnMgPSBbLi4uY29sbGVjdGlvbnNdO1xuICAgICAgTWV0YWRhdGEuc2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5LCBtZXRhKTtcblxuICAgICAgY29uc3QgY29uc3RyTWV0YSA9IE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUpIHx8IHt9O1xuICAgICAgY29uc3QgY29uc3RyQ29sbGVjdGlvbnMgPSBuZXcgU2V0KGNvbnN0ck1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29uc3RyQ29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgY29uc3RyTWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb25zdHJDb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCB0eXBlLCBjb25zdHJNZXRhKTtcblxuICAgICAgY29uc3QgdHJhbnNpZW50TWV0YSA9XG4gICAgICAgIE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICAgICAgY29uc3QgdXBkYXRlZFRyYW5zaWVudE1ldGEgPSB7XG4gICAgICAgIC4uLnRyYW5zaWVudE1ldGEsXG4gICAgICAgIFtwcm9wZXJ0eUtleSBhcyBhbnldOiB7fSxcbiAgICAgIH07XG4gICAgICBNZXRhZGF0YS5zZXQoXG4gICAgICAgIGNvbnN0ciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgREJLZXlzLlRSQU5TSUVOVCxcbiAgICAgICAgdXBkYXRlZFRyYW5zaWVudE1ldGFcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjczogYW55W10gPSBbXTtcbiAgICBpZiAoIXByb3BlcnR5S2V5KSB7XG4gICAgICAvLyBkZWNvcmF0ZWQgYXQgdGhlIGNsYXNzIGxldmVsXG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyh0YXJnZXQgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgcHJvcGVydGllcz8uZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIocCkpIHtcbiAgICAgICAgICBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIHR5cGUpKCh0YXJnZXQgYXMgYW55KS5wcm90b3R5cGUsIHApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdyb3VwTmFtZSA9XG4gICAgICAgIHR5cGVvZiBjb2xsZWN0aW9uID09PSBcInN0cmluZ1wiID8gY29sbGVjdGlvbiA6IGNvbGxlY3Rpb24udG9TdHJpbmcoKTtcbiAgICAgIC8vIFVzZSBkaWZmZXJlbnQgZ3JvdXAgbmFtZXMgZm9yIGV4dHJhY3Rpb24gdnMgZGF0YSBoYW5kbGVycyB0byBwcmV2ZW50IG1lcmdpbmdcbiAgICAgIGNvbnN0IGV4dHJhY3RHcm91cE5hbWUgPSBgJHtncm91cE5hbWV9OmV4dHJhY3RgO1xuICAgICAgY29uc3QgZGF0YUdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZGF0YWA7XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25NZXRhID0geyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9O1xuICAgICAgY29uc3QgZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0ID0ge1xuICAgICAgICBwcmlvcml0eTogU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFksXG4gICAgICAgIGdyb3VwOiBleHRyYWN0R3JvdXBOYW1lLFxuICAgICAgfTtcbiAgICAgIGRlY3MucHVzaChcbiAgICAgICAgcHJvcCgpLFxuICAgICAgICB0cmFuc2llbnQoKSxcbiAgICAgICAgc2VncmVnYXRlZERlYyxcbiAgICAgICAgLy8gRWFybHkgZXh0cmFjdGlvbiBoYW5kbGVycyAtIHJ1biBCRUZPUkUgcGsgZ2VuZXJhdGlvbiAocHJpb3JpdHkgNjApXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBjb2xsZWN0aW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiBjb250ZXh0IGZvciBzZXF1ZW5jZSByZXBsaWNhdGlvblxuICAgICAgICAvLyBXZSByZWdpc3RlciBmb3IgZWFjaCBvcGVyYXRpb24gZXhwbGljaXRseSB0byBlbnN1cmUgcHJvcGVyIGhhbmRsZXIgbG9va3VwXG4gICAgICAgIG9uKFxuICAgICAgICAgIERCT3BlcmF0aW9ucy5BTEwsXG4gICAgICAgICAgZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyBhcyBhbnksXG4gICAgICAgICAgZWFybHlFeHRyYWN0aW9uTWV0YSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnRcbiAgICAgICAgKSxcbiAgICAgICAgLy8gTWFpbiBoYW5kbGVycyBmb3Igc2VncmVnYXRlZCBkYXRhIG9wZXJhdGlvbnMgKHByaW9yaXR5IDk1KVxuICAgICAgICBvbkNyZWF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlLFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uUmVhZChcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uUmVhZCBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25VcGRhdGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPblVwZGF0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25EZWxldGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPbkRlbGV0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5KC4uLmRlY3MpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZURhdGEoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlciA9IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb25cbikge1xuICBmdW5jdGlvbiBwcml2YXRlRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gc2VncmVnYXRlZChjb2xsZWN0aW9uLCBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHByaXZhdGVEYXRhLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb25dLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHNoYXJlZERhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVjdXJzaXZlbHkgc29ydHMgb2JqZWN0IGtleXMgd2l0aG91dCByZW9yZGVyaW5nIGFycmF5c1xuICogQHBhcmFtIHthbnl9IG9iaiAtIFRoZSB2YWx1ZSB0byBwcm9jZXNzXG4gKiBAcmV0dXJuIHthbnl9IEEgY29weSB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cyBidXQgcHJlc2VydmVkIGFycmF5IG9yZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqOiBhbnkpOiBhbnkge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubWFwKHNvcnRLZXlzT25seVJlY3Vyc2l2ZSk7XG4gIGlmIChvYmouY29uc3RydWN0b3IgIT09IE9iamVjdCkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcbiAgICAuc29ydCgpXG4gICAgLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXkpID0+IHtcbiAgICAgIGFjY1trZXldID0gc29ydEtleXNPbmx5UmVjdXJzaXZlKG9ialtrZXldKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmlzdGljIEpTT04gc2VyaWFsaXplciBmb3IgRmFicmljIG1vZGVsc1xuICogQHN1bW1hcnkgRW5zdXJlcyBzdGFibGUsIGRldGVybWluaXN0aWMgSlNPTiBvdXRwdXQgYnkgc29ydGluZyBvYmplY3Qga2V5cyByZWN1cnNpdmVseSBiZWZvcmUgc3RyaW5naWZpY2F0aW9uLCB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIEZhYnJpYyBlbmRvcnNlbWVudCBhbmQgaGFzaGluZy4gRXh0ZW5kcyBKU09OU2VyaWFsaXplciB0byBwbHVnIGludG8gZXhpc3RpbmcgRGVjYWYgbW9kZWwgc2VyaWFsaXphdGlvbiBmbG93LlxuICogQHRlbXBsYXRlIE0gLSBUaGUgRGVjYWYgTW9kZWwgc3VidHlwZSBzZXJpYWxpemVkIGJ5IHRoaXMgaW5zdGFuY2VcbiAqIEBwYXJhbSB7dm9pZH0gW2NvbnN0cnVjdG9yXSBObyBwdWJsaWMgY29uc3RydWN0b3IgYXJndW1lbnRzXG4gKiBAY2xhc3MgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IERldGVybWluaXN0aWNTZXJpYWxpemVyPE15TW9kZWw+KCk7XG4gKiBjb25zdCBqc29uID0gc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwpO1xuICogY29uc3QgcmVidWlsdCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoanNvbik7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBEUyBhcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogICBDYWxsZXItPj5EUzogc2VyaWFsaXplKG1vZGVsKVxuICogICBEUy0+PkRTOiBwcmVTZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHNvcnQta2V5cy1yZWN1cnNpdmVcbiAqICAgRFMtPj5EUzoganNvbi1zdHJpbmdpZnktZGV0ZXJtaW5pc3RpY1xuICogICBEUy0tPj5DYWxsZXI6IHN0cmluZ1xuICogICBDYWxsZXItPj5EUzogZGVzZXJpYWxpemUoc3RyaW5nKVxuICogICBEUy0tPj5DYWxsZXI6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNKSB7XG4gICAgLy8gVE9ETzogbmVzdGVkIHByZXNlcmlhbGl6YXRpb24gKHNvIGluY3JlYXNlIHBlcmZvcm1hbmNlIHdoZW4gZGVzZXJpYWxpemluZylcbiAgICAvLyBUT0RPOiBWZXJpZnkgd2h5IHRoZXJlIGlzIG5vIG1ldGFkYXRhXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgbGV0IG1ldGFkYXRhO1xuICAgIHRyeSB7XG4gICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIG1ldGFkYXRhID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBjb25zdCBwcmVTZXJpYWxpemUgPSBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gb2JqO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoKG8pID0+IHByZVNlcmlhbGl6ZS5jYWxsKHNlbGYsIG8pKTtcbiAgICAgIHJldHVybiB0aGlzLnByZVNlcmlhbGl6ZS5jYWxsKHRoaXMsIG9iaik7XG4gICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgTW9kZWwucmVsYXRpb25zKG1vZGVsKS5mb3JFYWNoKChyKSA9PiB7XG4gICAgICB0b1NlcmlhbGl6ZVtyXSA9IHByZVNlcmlhbGl6ZSh0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlYnVpbGRzIGEgbW9kZWwgZnJvbSBhIHNlcmlhbGl6YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbHMgdG8gcGFyc2UgdGhlIHN0cmluZywgb3IgdG8gYnVpbGQgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZyk6IE0ge1xuICAgIGNvbnN0IGRlc2VyaWFsaXphdGlvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBkZXNlcmlhbGl6YXRpb25bTW9kZWxLZXlzLkFOQ0hPUl07XG4gICAgaWYgKCFjbGFzc05hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBjbGFzcyByZWZlcmVuY2UgaW4gc2VyaWFsaXplZCBtb2RlbFwiKTtcbiAgICBjb25zdCBtb2RlbDogTSA9IE1vZGVsLmJ1aWxkKGRlc2VyaWFsaXphdGlvbiwgY2xhc3NOYW1lKSBhcyB1bmtub3duIGFzIE07XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXJpYWxpemUgYSBtb2RlbCBpbnRvIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgbW9kZWwgd2l0aCBwcmVTZXJpYWxpemUsIHNvcnRzIGtleXMgcmVjdXJzaXZlbHksIGFuZCBzdHJpbmdpZmllcyBkZXRlcm1pbmlzdGljYWxseSBmb3Igc3RhYmxlIG9yZGVyaW5nXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRGV0ZXJtaW5pc3RpYyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKFwianNvbi1zdHJpbmdpZnktZGV0ZXJtaW5pc3RpY1wiKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5KHNvcnRLZXlzT25seVJlY3Vyc2l2ZSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCkpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQnVsa0NydWRPcGVyYXRpb25LZXlzLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIEZhYnJpYyBldmVudCBuYW1lIGZyb20gY29tcG9uZW50c1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBldmVudCBuYW1lIGJ5IGpvaW5pbmcgdGFibGUsIGV2ZW50LCBhbmQgb3B0aW9uYWwgb3duZXIgd2l0aCB1bmRlcnNjb3Jlc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlL2NvbGxlY3Rpb24gbmFtZVxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nfSBldmVudCAtIFRoZSBldmVudCB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gW293bmVyXSAtIE9wdGlvbmFsIG93bmVyIGlkZW50aWZpZXJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBldmVudCBuYW1lIGluIGZvcm1hdCBcInRhYmxlX2V2ZW50XCIgb3IgXCJ0YWJsZV9ldmVudF9vd25lclwiXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRmFicmljRXZlbnROYW1lKFxuICB0YWJsZTogc3RyaW5nLFxuICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgb3duZXI/OiBzdHJpbmdcbikge1xuICBjb25zdCBwYXJhbXMgPSBbdGFibGUsIGV2ZW50XTtcbiAgaWYgKG93bmVyKSBwYXJhbXMucHVzaChvd25lcik7XG4gIHJldHVybiBwYXJhbXMuam9pbihcIl9cIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIEZhYnJpYyBldmVudCBuYW1lIGludG8gaXRzIGNvbXBvbmVudHNcbiAqIEBzdW1tYXJ5IFNwbGl0cyBhbiBldmVudCBuYW1lIGJ5IHVuZGVyc2NvcmVzIGFuZCBleHRyYWN0cyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZXZlbnQgbmFtZSB0byBwYXJzZVxuICogQHJldHVybiB7e3RhYmxlOiBzdHJpbmcsIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLCBvd25lcjogc3RyaW5nfX0gVGhlIHBhcnNlZCBjb21wb25lbnRzIGFzIGEgc3RydWN0dXJlZCBvYmplY3RcbiAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBldmVudCBuYW1lIGZvcm1hdCBpcyBpbnZhbGlkXG4gKiBAZnVuY3Rpb24gcGFyc2VFdmVudE5hbWVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IFBhcnNlciBhcyBwYXJzZUV2ZW50TmFtZVxuICogICBDYWxsZXItPj5QYXJzZXI6IHBhcnNlRXZlbnROYW1lKG5hbWUpXG4gKiAgIFBhcnNlci0+PlBhcnNlcjogc3BsaXQgbmFtZSBieSBcIl9cIlxuICogICBhbHQgcGFydHMgbGVuZ3RoIGludmFsaWRcbiAqICAgICBQYXJzZXItLT4+Q2FsbGVyOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gKiAgIGVsc2VcbiAqICAgICBQYXJzZXItLT4+Q2FsbGVyOiB7IHRhYmxlLCBldmVudCwgb3duZXI/IH1cbiAqICAgZW5kXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZShuYW1lOiBzdHJpbmcpOiB7XG4gIHRhYmxlPzogc3RyaW5nO1xuICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZztcbiAgb3duZXI/OiBzdHJpbmc7XG59IHtcbiAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KFwiX1wiKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHMubGVuZ3RoID4gMylcbiAgICByZXR1cm4geyB0YWJsZTogdW5kZWZpbmVkLCBldmVudDogbmFtZSwgb3duZXI6IHVuZGVmaW5lZCB9O1xuICByZXR1cm4ge1xuICAgIHRhYmxlOiBwYXJ0c1swXSxcbiAgICBldmVudDogcGFydHNbMV0sXG4gICAgb3duZXI6IHBhcnRzWzJdLFxuICB9IGFzIHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICAgIG93bmVyPzogc3RyaW5nO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgc3RyaW5nRm9ybWF0IH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT3ZlcmZsb3dFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgYWRkaXRpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBBZGRzIHR3byBudW1iZXJzIGFuZCB2ZXJpZmllcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBGaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzdW0gb2YgYSBhbmQgYlxuICogQGZ1bmN0aW9uIGFkZFxuICogQHRocm93cyB7T3ZlcmZsb3dFcnJvcn0gb24gYWRkaXRpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhICsgYjtcbiAgaWYgKGEgIT09IGMgLSBiIHx8IGIgIT09IGMgLSBhKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYEFkZGl0aW9uIG92ZXJmbG93OiAke2F9ICsgJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBPdmVyZmxvdy1zYWZlIHN1YnRyYWN0aW9uIG9wZXJhdGlvblxuICogQHN1bW1hcnkgU3VidHJhY3RzIGIgZnJvbSBhIGFuZCB2YWxpZGF0ZXMgbm8gb3ZlcmZsb3cgYnkgcmV2ZXJzZS1jaGVja2luZyB0aGUgb3BlcmFuZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhIC0gTWludWVuZFxuICogQHBhcmFtIHtudW1iZXJ9IGIgLSBTdWJ0cmFoZW5kXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaWZmZXJlbmNlIGEgLSBiXG4gKiBAZnVuY3Rpb24gc3ViXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBzdWJ0YWN0aW9uIG92ZXJmbG93XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWIoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBjID0gYSAtIGI7XG4gIGlmIChhICE9PSBjICsgYiB8fCBiICE9PSBhIC0gYykge1xuICAgIHRocm93IG5ldyBPdmVyZmxvd0Vycm9yKGBTdWJ0cmFjdGlvbiBvdmVyZmxvdzogJHthfSAtICR7Yn1gKTtcbiAgfVxuICByZXR1cm4gYztcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBTYWZlIEludGVnZXIgUGFyc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKlxuICogQGZ1bmN0aW9uIHNhZmVQYXJzZUludFxuICpcbiAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gaWYgcGFyc2VJbnQgcmV0dXJucyBOYU5cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYWZlUGFyc2VJbnQoc3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gY2hlY2sgaWYgc3RyaW5nIG9ubHkgaGF2ZSBkaWdpdHNcbiAgY29uc3QgZGlnaXRSZWdleCA9IC9eXFxkKyQvO1xuICBpZiAoIWRpZ2l0UmVnZXgudGVzdChzdHJpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHN0cmluZ0Zvcm1hdChcIkZhaWxlZCB0byBwYXJzZTogezB9XCIsIFwic3RyaW5nIGNvbnRhaW5zIGRpZ2l0c1wiKVxuICAgICk7XG4gIH1cbiAgY29uc3QgcGFyc2VkaW50ID0gcGFyc2VJbnQoc3RyaW5nKTtcbiAgaWYgKGlzTmFOKHBhcnNlZGludCkpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgaXMgbm90IGEgcGFyc2FibGUgaW50ZWdlclwiKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZGludDtcbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHNvcnRLZXlzT25seVJlY3Vyc2l2ZSB9IGZyb20gXCIuL0RldGVybWluaXN0aWNTZXJpYWxpemVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcsIHRhYmxlTmFtZT86IHN0cmluZyk6IE0ge1xuICAgIGNvbnN0IGRlc2VyaWFsaXphdGlvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICAvLyBjb25zdCBjbGFzc05hbWUgPSB0YWJsZU5hbWU7XG4gICAgLy8gaWYgKCFjbGFzc05hbWUpXG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBjbGFzcyByZWZlcmVuY2UgaW4gc2VyaWFsaXplZCBtb2RlbFwiKTtcblxuICAgIC8vIC8vIHRoaXMgd2lsbCByZXR1cm4gdW5kZWZpbmVkIHZhbHVlc1xuICAgIC8vIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcblxuICAgIC8vIC8vIFBvcHVsYXRlIE1vZGVsXG4gICAgLy8gY29uc3QgcHJvY2Vzc2VkRGVzZWFsaXphdGlvbiA9IE9iamVjdC5rZXlzKG1vZGVsKS5yZWR1Y2UoXG4gICAgLy8gICAoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgIC8vICAgICAoYWNjdW0gYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSA9XG4gICAgLy8gICAgICAgZGVzZXJpYWxpemF0aW9uW1JlcG9zaXRvcnkuY29sdW1uKGFjY3VtLCBrZXkpXTtcbiAgICAvLyAgICAgcmV0dXJuIGFjY3VtO1xuICAgIC8vICAgfSxcbiAgICAvLyAgIG1vZGVsXG4gICAgLy8gKTtcblxuICAgIC8vIGNvbnN0IHJlc3VsdCA9IE1vZGVsLmJ1aWxkKFxuICAgIC8vICAgcHJvY2Vzc2VkRGVzZWFsaXphdGlvbixcbiAgICAvLyAgIGNsYXNzTmFtZVxuICAgIC8vICkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gZGVzZXJpYWxpemF0aW9uO1xuICB9XG5cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBwdXRBbmNob3IgPSB0cnVlKTogc3RyaW5nIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIGNvbnN0IHByZVNlcmlhbGl6YXRpb24gPSB0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgcHV0QW5jaG9yKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5KHNvcnRLZXlzT25seVJlY3Vyc2l2ZShwcmVTZXJpYWxpemF0aW9uKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBwdXRBbmNob3I6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgLy8gVE9ETzogbmVzdGVkIHByZXNlcmlhbGl6YXRpb24gKHNvIGluY3JlYXNlIHBlcmZvcm1hbmNlIHdoZW4gZGVzZXJpYWxpemluZylcbiAgICAvLyBUT0RPOiBWZXJpZnkgd2h5IHRoZXJlIGlzIG5vIG1ldGFkYXRhXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgbGV0IG1ldGFkYXRhO1xuICAgIHRyeSB7XG4gICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIG1ldGFkYXRhID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAocHV0QW5jaG9yKVxuICAgICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YSB8fCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgZnVuY3Rpb24gcHJlU2VyaWFsaXplKFxuICAgICAgdGhpczogU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8YW55PixcbiAgICAgIG9iajogYW55XG4gICAgKTogYW55IHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gb2JqO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAocHJlU2VyaWFsaXplKTtcbiAgICAgIHJldHVybiB0aGlzLnByZVNlcmlhbGl6ZShvYmopO1xuICAgIH1cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplLmNhbGwodGhpcywgdG9TZXJpYWxpemVbcl0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvbkVycm9yLFxuICBDbGllbnRCYXNlZFNlcnZpY2UsXG4gIENvbnRleHQsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCBGYWJyaWNDQVNlcnZpY2VzLCB7XG4gIEFmZmlsaWF0aW9uU2VydmljZSxcbiAgSUF0dHJpYnV0ZVJlcXVlc3QsXG4gIElkZW50aXR5U2VydmljZSxcbiAgSUVucm9sbFJlc3BvbnNlLFxuICBJSWRlbnRpdHlSZXF1ZXN0LFxuICBJUmVnaXN0ZXJSZXF1ZXN0LFxuICBJUmV2b2tlUmVxdWVzdCxcbiAgSVNlcnZpY2VSZXNwb25zZSxcbiAgVExTT3B0aW9ucyxcbn0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IENBQ29uZmlnLCBDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29yZVV0aWxzLCBnZXRBa2lBbmRTZXJpYWxGcm9tQ2VydCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgQ2VydGlmaWNhdGVSZXNwb25zZSxcbiAgRmFicmljSWRlbnRpdHksXG4gIEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gIElkZW50aXR5UmVzcG9uc2UsXG59IGZyb20gXCIuLi8uLi9zaGFyZWQvZmFicmljLXR5cGVzXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IENBX1JPTEUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IElLZXlWYWx1ZUF0dHJpYnV0ZSB9IGZyb20gXCIuL0ZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW5kZXhcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4uL2NyeXB0b1wiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljSWRlbnRpdHlTZXJ2aWNlIGV4dGVuZHMgQ2xpZW50QmFzZWRTZXJ2aWNlPFxuICBGYWJyaWNDQVNlcnZpY2VzLFxuICBDQUNvbmZpZ1xuPiB7XG4gIHByb3RlY3RlZCBfdXNlciE6IFVzZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcm9vdENsaWVudCgpOiB7IG5ld0NlcnRpZmljYXRlU2VydmljZTogYW55IH0ge1xuICAgIHJldHVybiAodGhpcy5jbGllbnQgYXMgYW55KVtcIl9GYWJyaWNDYVNlcnZpY2VzXCJdIGFzIGFueTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdXNlcigpOiBVc2VyIHtcbiAgICBpZiAoIXRoaXMuX3VzZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJGYWJyaWMgaWRlbnRpdHkgc2VydmljZSBub3QgcHJvcGVybHkgc2V0dXA6IG1pc3NpbmcgdXNlclwiXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBjZXJ0aWZpY2F0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENsaWVudC5uZXdDZXJ0aWZpY2F0ZVNlcnZpY2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgYWZmaWxpYXRpb25zKCk6IEFmZmlsaWF0aW9uU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Lm5ld0FmZmlsaWF0aW9uU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpZGVudGl0aWVzKCk6IElkZW50aXR5U2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Lm5ld0lkZW50aXR5U2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFVzZXIoY2ZnOiBDQUNvbmZpZywgY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRVc2VyKTtcbiAgICBjb25zdCB7IGNhTmFtZSwgY2FDZXJ0LCBjYUtleSwgdXJsLCBoc20gfSA9IGNmZztcblxuICAgIGxvZy5pbmZvKGBDcmVhdGluZyBDQSB1c2VyIGZvciAke2NhTmFtZX0gYXQgJHt1cmx9YCk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgQ0EgY2VydGlmaWNhdGUgZnJvbSAke2NhQ2VydH1gKTtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChjYUNlcnQpO1xuICAgIGxldCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWhzbSkge1xuICAgICAgaWYgKCFjYUtleSkge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWlzc2luZyBjYUtleSBjb25maWd1cmF0aW9uIGZvciBDQSAke2NhTmFtZX0uIFByb3ZpZGUgYSBrZXkgZGlyZWN0b3J5IG9yIGNvbmZpZ3VyZSBIU00gc3VwcG9ydC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0Ega2V5IGZyb20gJHtjYUtleX1gKTtcbiAgICAgIGtleSA9IGF3YWl0IENvcmVVdGlscy5nZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChjYUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFVzaW5nIEhTTSBjb25maWd1cmF0aW9uIGZvciBDQSAke2NhTmFtZX0gd2l0aCBsaWJyYXJ5ICR7aHNtLmxpYnJhcnl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBMb2FkaW5nIEFkbWluIHVzZXIgZm9yIGNhICR7Y2FOYW1lfWApO1xuICAgIHRoaXMuX3VzZXIgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Q0FVc2VyKFwiYWRtaW5cIiwga2V5LCBjZXJ0aWZpY2F0ZSwgY2FOYW1lLCB7XG4gICAgICBoc20sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8eyBjb25maWc6IENBQ29uZmlnOyBjbGllbnQ6IEZhYnJpY0NBU2VydmljZXMgfT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5JTklUSUFMSVpBVElPTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IFtjb25maWddID0gYXJncztcbiAgICBpZiAoIWNvbmZpZykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIEZhYnJpYyBDQSBjb25maWd1cmF0aW9uXCIpO1xuXG4gICAgY29uc3QgeyB1cmwsIHRscywgY2FOYW1lIH0gPSBjb25maWc7XG4gICAgbG9nLmluZm8oYEluaXRpYWxpemluZyBDQSBDbGllbnQgZm9yIENBICR7Y29uZmlnLmNhTmFtZX0gYXQgJHtjb25maWcudXJsfWApO1xuICAgIGNvbnN0IHsgdHJ1c3RlZFJvb3RzLCB2ZXJpZnkgfSA9IHRscyBhcyBUTFNPcHRpb25zO1xuXG4gICAgY29uc3Qgcm9vdCA9ICh0cnVzdGVkUm9vdHMgYXMgc3RyaW5nW10pWzBdIGFzIHN0cmluZztcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgQ0EgY2VydGlmaWNhdGUgZnJvbSAke3Jvb3R9LiBjd2Q6ICR7cHJvY2Vzcy5jd2QoKX1gKTtcblxuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpbGVDb250ZW50KHJvb3QpO1xuXG4gICAgbG9nLmRlYnVnKGBDQSBDZXJ0aWZpY2F0ZTogJHtjZXJ0aWZpY2F0ZS50b1N0cmluZygpfWApO1xuXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IEZhYnJpY0NBU2VydmljZXMoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIHRydXN0ZWRSb290czogQnVmZmVyLmZyb20oY2VydGlmaWNhdGUpLFxuICAgICAgICB2ZXJpZnksXG4gICAgICB9IGFzIFRMU09wdGlvbnMsXG4gICAgICBjYU5hbWVcbiAgICApO1xuXG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuZ2V0VXNlcihjb25maWcsIGN0eCk7XG4gICAgbG9nLmRlYnVnKGBDQSB1c2VyIGxvYWRlZDogJHt1c2VyLmdldE5hbWUoKX1gKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlnLFxuICAgICAgY2xpZW50LFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT4pOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzKFxuICAgIHJlcXVlc3Q6IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICBkb01hcDogTUFQLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXM8TUFQIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICBkb01hcDogTUFQLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXM8TUFQIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmVxdWVzdD86IEdldENlcnRpZmljYXRlc1JlcXVlc3QgfCBNQVAsXG4gICAgZG9NYXA6IE1BUCA9IHRydWUgYXMgTUFQLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW10+IHtcbiAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENvbnRleHQpIHtcbiAgICAgIGFyZ3MgPSBbcmVxdWVzdF07XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgICAgcmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgZG9NYXAgPSByZXF1ZXN0O1xuICAgICAgcmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb01hcCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGFyZ3MgPSBbZG9NYXAgYXMgTWF5YmVDb250ZXh0dWFsQXJnPGFueT4sIC4uLmFyZ3NdO1xuICAgICAgZG9NYXAgPSB0cnVlIGFzIE1BUDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZ2V0Q2VydGlmaWNhdGVzXG4gICAgKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgUmV0cmlldmluZyBjZXJ0aWZpY2F0ZXMke3JlcXVlc3QgPyBgIGZvciAke3JlcXVlc3QuaWR9YCA6IFwiXCJ9IGZvciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZTogQ2VydGlmaWNhdGVSZXNwb25zZSA9IChcbiAgICAgIGF3YWl0IHRoaXMuY2VydGlmaWNhdGVzLmdldENlcnRpZmljYXRlcyhyZXF1ZXN0IHx8IHt9LCB0aGlzLnVzZXIpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLnZlcmJvc2UoYEZvdW5kICR7cmVzcG9uc2UuY2VydHMubGVuZ3RofSBjZXJ0aWZpY2F0ZXNgKTtcbiAgICBsb2cuZGVidWcocmVzcG9uc2UuY2VydHMpO1xuICAgIHJldHVybiAoXG4gICAgICBkb01hcCA/IHJlc3BvbnNlLmNlcnRzLm1hcCgoYykgPT4gYy5QRU0pIDogcmVzcG9uc2VcbiAgICApIGFzIE1BUCBleHRlbmRzIGZhbHNlID8gQ2VydGlmaWNhdGVSZXNwb25zZSA6IHN0cmluZ1tdO1xuICB9XG5cbiAgYXN5bmMgZ2V0SWRlbnRpdGllcyhjdHg6IENvbnRleHQpOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+IHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldElkZW50aXRpZXMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIElkZW50aXRpZXMgdW5kZXIgQ0EgJHt0aGlzLmNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElkZW50aXR5UmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5pZGVudGl0aWVzLmdldEFsbCh0aGlzLnVzZXIpKVxuICAgICAgLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5pZGVudGl0aWVzLmxlbmd0aH0gSWRlbnRpdGllc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5pZGVudGl0aWVzKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuaWRlbnRpdGllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmUgYWZmaWxpYXRpb25zIGZyb20gdGhlIENBLlxuICAgKiBAc3VtbWFyeSBRdWVyaWVzIHRoZSBDQSBmb3IgdGhlIGxpc3Qgb2YgYWZmaWxpYXRpb25zIGF2YWlsYWJsZSB1bmRlciB0aGUgY29uZmlndXJlZCBDQS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWZmaWxpYXRpb25zIHJlc3VsdCBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZ2V0QWZmaWxpYXRpb25zKGN0eDogQ29udGV4dCkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0QWZmaWxpYXRpb25zKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBBZmZpbGlhdGlvbnMgdW5kZXIgQ0EgJHt0aGlzLmNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hZmZpbGlhdGlvbnMuZ2V0QWxsKHRoaXMudXNlcikpLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5hLmxlbmd0aH0gQWZmaWxpYXRpb25zYCk7XG4gICAgbG9nLmRlYnVnKEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXJyb3IoZTogRXJyb3IpIHtcbiAgICBjb25zdCByZWdleHAgPSAvLipjb2RlOlxccyhcXGQrKS4qP21lc3NhZ2U6XFxzW1wiJ10oLispW1wiJ10vZ3M7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhlLm1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IoZSk7XG4gICAgY29uc3QgWywgY29kZSwgbWVzc2FnZV0gPSBtYXRjaDtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgXCI3NFwiOlxuICAgICAgY2FzZSBcIjcxXCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgXCIyMFwiOlxuICAgICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGlkZW50aXR5IGRldGFpbHMgZnJvbSB0aGUgQ0EgYnkgZW5yb2xsbWVudCBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCB2YWxpZGF0ZXMgYSBzaW5nbGUgaWRlbnRpdHksIHRocm93aW5nIE5vdEZvdW5kRXJyb3Igd2hlbiBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBsb29rdXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHk+fSBUaGUgaWRlbnRpdHkgZGV0YWlscyBzdG9yZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgcmVhZChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLlJFQUQsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnJlYWRcbiAgICApO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIGlkZW50aXR5IHdpdGggZW5yb2xsbWVudCBJRCAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0T25lKGVucm9sbG1lbnRJZCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyBGYWJyaWNJZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgaWRlbnRpdHkgd2l0aCB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSByZWdpc3RyYXRpb24gcmVxdWVzdCBmb3IgYSBuZXcgZW5yb2xsbWVudCBJRCwgcmV0dXJuaW5nIHRoZSBlbnJvbGxtZW50IHNlY3JldCB1cG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgZm9yIHRoZSBuZXcgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFRoZSBlbnJvbGxtZW50IHNlY3JldCBmb3IgdGhlIHJlZ2lzdGVyZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlcihcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVnaXN0ZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJcbiAgICApO1xuXG4gICAgbGV0IHJlZ2lzdHJhdGlvbjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCBwYXNzd29yZCB9ID0gbW9kZWw7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgZW5yb2xsbWVudElEOiB1c2VyTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHBhc3N3b3JkLFxuICAgICAgICBhZmZpbGlhdGlvbjogYWZmaWxpYXRpb24sXG4gICAgICAgIHVzZXJSb2xlOiB1c2VyUm9sZSxcbiAgICAgICAgYXR0cnM6IGF0dHJzLFxuICAgICAgICBtYXhFbnJvbGxtZW50czogbWF4RW5yb2xsbWVudHMsXG4gICAgICB9IGFzIElSZWdpc3RlclJlcXVlc3Q7XG4gICAgICByZWdpc3RyYXRpb24gPSBhd2FpdCB0aGlzLmNsaWVudC5yZWdpc3Rlcihwcm9wcywgdGhpcy51c2VyKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVnaXN0cmF0aW9uIGZvciAke3VzZXJOYW1lfSBjcmVhdGVkIHdpdGggdXNlciB0eXBlICR7dXNlclJvbGUgPz8gXCJVbmRlZmluZWQgUm9sZVwifSAke2lzU3VwZXJVc2VyID8gXCJhcyBzdXBlciB1c2VyXCIgOiBcIlwifWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlLFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY3R4OiBDb250ZXh0XG4gICk6IElkZW50aXR5IHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmlkZW50aXR5RnJvbUVucm9sbG1lbnQpO1xuICAgIGNvbnN0IHsgY2VydGlmaWNhdGUsIGtleSwgcm9vdENlcnRpZmljYXRlIH0gPSBlbnJvbGxtZW50O1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEdlbmVyYXRpbmcgSWRlbnRpdHkgZnJvbSBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlfSBpbiBtc3AgJHttc3BJZH1gXG4gICAgKTtcbiAgICBjb25zdCBjbGllbnRJZCA9IENyeXB0b1V0aWxzLmZhYnJpY0lkRnJvbUNlcnRpZmljYXRlKGNlcnRpZmljYXRlKTtcbiAgICBjb25zdCBpZCA9IENyeXB0b1V0aWxzLmVuY29kZShjbGllbnRJZCk7XG4gICAgbG9nLmRlYnVnKGBJZGVudGl0eSAke2NsaWVudElkfSBhbmQgZW5jb2RlZElkICR7aWR9YCk7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eSh7XG4gICAgICBpZDogaWQsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleToga2V5LnRvQnl0ZXMoKSxcbiAgICAgICAgcm9vdENlcnRpZmljYXRlOiByb290Q2VydGlmaWNhdGUsXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbnJvbGwgYW4gaWRlbnRpdHkgd2l0aCB0aGUgQ0EgdXNpbmcgYSByZWdpc3RyYXRpb24gc2VjcmV0LlxuICAgKiBAc3VtbWFyeSBFeGNoYW5nZXMgdGhlIGVucm9sbG1lbnQgSUQgYW5kIHNlY3JldCBmb3IgY2VydGlmaWNhdGVzLCByZXR1cm5pbmcgYSBjb25zdHJ1Y3RlZCBJZGVudGl0eSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVucm9sbG1lbnRJZCAtIEVucm9sbG1lbnQgSUQgdG8gZW5yb2xsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uIC0gRW5yb2xsbWVudCBzZWNyZXQgcmV0dXJuZWQgYXQgcmVnaXN0cmF0aW9uIHRpbWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkgb2JqZWN0IHdpdGggY3JlZGVudGlhbHMuXG4gICAqL1xuICBhc3luYyBlbnJvbGwoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmVnaXN0cmF0aW9uOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcImVucm9sbFwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5lbnJvbGxcbiAgICApO1xuICAgIGxldCBpZGVudGl0eTogSWRlbnRpdHk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhgRW5yb2xsaW5nICR7ZW5yb2xsbWVudElkfWApO1xuICAgICAgY29uc3QgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZW5yb2xsKHtcbiAgICAgICAgZW5yb2xsbWVudElEOiBlbnJvbGxtZW50SWQsXG4gICAgICAgIGVucm9sbG1lbnRTZWNyZXQ6IHJlZ2lzdHJhdGlvbixcbiAgICAgIH0pO1xuICAgICAgaWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBlbnJvbGxlZCAke2Vucm9sbG1lbnRJZH0gdW5kZXIgJHt0aGlzLmNvbmZpZy5jYU5hbWV9IGFzICR7aWRlbnRpdHkuaWR9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IGlkZW50aXR5IGluIG9uZSBzdGVwLlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBuZXcgZW5yb2xsbWVudCBJRCB3aXRoIHRoZSBDQSBhbmQgaW1tZWRpYXRlbHkgZXhjaGFuZ2VzIHRoZSBzZWNyZXQgdG8gZW5yb2xsLCByZXR1cm5pbmcgdGhlIGNyZWF0ZWQgSWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgZm9yIHRoZSBuZXcgaWRlbnRpdHkgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5LlxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJBbmRFbnJvbGwoXG4gICAgbW9kZWw6IENyZWRlbnRpYWxzLFxuICAgIGlzU3VwZXJVc2VyOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCIsXG4gICAgdXNlclJvbGU/OiBDQV9ST0xFIHwgc3RyaW5nLFxuICAgIGF0dHJzPzogSUtleVZhbHVlQXR0cmlidXRlLFxuICAgIG1heEVucm9sbG1lbnRzPzogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVnaXN0ZXItZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnJlZ2lzdGVyQW5kRW5yb2xsXG4gICAgKTtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCB0aGlzLnJlZ2lzdGVyKFxuICAgICAgbW9kZWwsXG4gICAgICBpc1N1cGVyVXNlcixcbiAgICAgIGFmZmlsaWF0aW9uLFxuICAgICAgdXNlclJvbGUsXG4gICAgICBhdHRycyxcbiAgICAgIG1heEVucm9sbG1lbnRzLFxuICAgICAgY3R4XG4gICAgKTtcbiAgICBjb25zdCB7IHVzZXJOYW1lIH0gPSBtb2RlbDtcbiAgICByZXR1cm4gdGhpcy5lbnJvbGwodXNlck5hbWUgYXMgc3RyaW5nLCByZWdpc3RyYXRpb24sIGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlLWVucm9sbCBhbiBleGlzdGluZyBpZGVudGl0eSB1c2luZyBpdHMgY3VycmVudCBlbnJvbGxtZW50LlxuICAgKiBAc3VtbWFyeSBSZW5ld3MgdGhlIGVucm9sbG1lbnQgY2VydGlmaWNhdGUgYnkgY2FsbGluZyB0aGUgQ0EgcmVlbnJvbGwuXG4gICAqIEBwYXJhbSB7VXNlcn0gY3VycmVudFVzZXIgLSBBbHJlYWR5IGVucm9sbGVkIHVzZXIsIG11c3QgaGF2ZSBhIHNpZ25pbmcgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgcmVuZXdlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBuZXcgY3JlZGVudGlhbHMuXG4gICAqL1xuICBhc3luYyB1cGRhdGVJZGVudGl0eShcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICBpZGVudGl0eTogeyBjZXJ0aWZpY2F0ZTogc3RyaW5nOyBwcml2YXRlS2V5OiBzdHJpbmcgfSxcbiAgICBpZGVudGl0eVJlcXVlc3Q6IElJZGVudGl0eVJlcXVlc3QsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJlZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLnVwZGF0ZUlkZW50aXR5XG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cuaW5mbyhgUmVuZXdpbmcgaWRlbnRpdHkgZm9yICR7ZW5yb2xsbWVudElkfWApO1xuXG4gICAgICAvLyBVcGRhdGUgYXR0cmlidXRlcyBpbiB0aGUgQ0EgcmVnaXN0cnkgKGFkbWluIG9wZXJhdGlvbikuIFRoaXMgY2hhbmdlcyB0aGUgXCJzb3VyY2Ugb2YgdHJ1dGhcIi5cbiAgICAgIGNvbnN0IGlkZW50aXR5U2VydmljZSA9IHRoaXMuY2xpZW50Lm5ld0lkZW50aXR5U2VydmljZSgpO1xuXG4gICAgICBjb25zdCBjYVVzZXJJZGVudGl0eSA9IChhd2FpdCBpZGVudGl0eVNlcnZpY2UuZ2V0T25lKFxuICAgICAgICBlbnJvbGxtZW50SWQsXG4gICAgICAgIHRoaXMudXNlclxuICAgICAgKSkgYXMgeyByZXN1bHQ6IHsgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGVbXSB9IH07XG5cbiAgICAgIGF3YWl0IGlkZW50aXR5U2VydmljZS51cGRhdGUoZW5yb2xsbWVudElkLCBpZGVudGl0eVJlcXVlc3QsIHRoaXMudXNlcik7IC8vIGFzIElTZXJ2aWNlUmVzcG9uc2UgJiB7IHJlc3VsdDogSUlkZW50aXR5UmVxdWVzdCB9O1xuXG4gICAgICAvLyBSZWVucm9sbCBhcyB0aGUgdXNlci4gUmVxdWVzdCBtdXN0IGJlIHNpZ25lZCB1c2luZyB0aGUgZXhpc3RpbmcgY2VydGlmaWNhdGUuXG4gICAgICBjb25zdCByZWVucm9sbFVzZXIgPSBVc2VyLmNyZWF0ZVVzZXIoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgXCJcIiwgLy8gZW5yb2xsbWVudFNlY3JldCBub3QgcmVxdWlyZWQgZm9yIHJlZW5yb2xsXG4gICAgICAgIHRoaXMudXNlci5nZXRNc3BpZCgpLFxuICAgICAgICBpZGVudGl0eS5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgaWRlbnRpdHkucHJpdmF0ZUtleVxuICAgICAgKTtcbiAgICAgIHJlZW5yb2xsVXNlci5zZXRDcnlwdG9TdWl0ZSh0aGlzLnVzZXIuZ2V0Q3J5cHRvU3VpdGUoKSk7XG5cbiAgICAgIGNvbnN0IGVucm9sbG1lbnRBdHRyczogSUF0dHJpYnV0ZVJlcXVlc3RbXSA9IChcbiAgICAgICAgY2FVc2VySWRlbnRpdHkucmVzdWx0LmF0dHJzIHx8IFtdXG4gICAgICApLm1hcCgoeyBuYW1lIH0pID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgIH0pKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudCA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZW5yb2xsKFxuICAgICAgICByZWVucm9sbFVzZXIsXG4gICAgICAgIGVucm9sbG1lbnRBdHRyc1xuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVuZXdlZElkZW50aXR5ID0gRmFicmljSWRlbnRpdHlTZXJ2aWNlLmlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgICAgIGVucm9sbG1lbnQsXG4gICAgICAgIHRoaXMuY29uZmlnLmNhTmFtZSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuXG4gICAgICAvLyBSZXZva2UgdGhlIHByZXZpb3VzIGNlcnRpZmljYXRlIG9ubHksIHNvIHRoZSBvbGQgY2VydCBiZWNvbWVzIGludmFsaWQuXG4gICAgICBsb2cuZGVidWcoYFJldm9raW5nIHByZXZpb3VzIGNlcnRpZmljYXRlcyBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCB7IGFraSwgc2VyaWFsIH0gPSBnZXRBa2lBbmRTZXJpYWxGcm9tQ2VydChpZGVudGl0eS5jZXJ0aWZpY2F0ZSk7XG4gICAgICBhd2FpdCB0aGlzLnJldm9rZShlbnJvbGxtZW50SWQsIHsgYWtpLCBzZXJpYWwgfSwgYXJncyk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgUmVuZXcgaWRlbnRpdHkgc3VjY2Vzc2Z1bCBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICByZXR1cm4gcmVuZXdlZElkZW50aXR5O1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2VzIHRoZSBlbnJvbGxtZW50IG9mIGFuIGlkZW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCBlbnJvbGxtZW50IElELlxuICAgKlxuICAgKiBAcGFyYW0gZW5yb2xsbWVudElkIC0gVGhlIGVucm9sbG1lbnQgSUQgb2YgdGhlIGlkZW50aXR5IHRvIGJlIHJldm9rZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXN1bHQgb2YgdGhlIHJldm9jYXRpb24gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAdGhyb3dzIHtOb3RGb3VuZEVycm9yfSBJZiB0aGUgZW5yb2xsbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZG9lcyBub3QgZXhpc3QuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0aGUgcmV2b2NhdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgYXN5bmMgcmV2b2tlKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIHJldm9rZU9wdGlvbnM6IE9taXQ8SVJldm9rZVJlcXVlc3QsIFwiZW5yb2xsbWVudElEXCI+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8SVNlcnZpY2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZXZva2VcIiwgdHJ1ZSkpLmZvcih0aGlzLnJldm9rZSk7XG4gICAgbG9nLnZlcmJvc2UoYFJldm9raW5nIGlkZW50aXR5IHdpdGggZW5yb2xsbWVudCBJRCAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMucmVhZChlbnJvbGxtZW50SWQpO1xuICAgIGlmICghaWRlbnRpdHkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH1gXG4gICAgICApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9XG4gICAgICAgIEJvb2xlYW4ocmV2b2tlT3B0aW9ucy5zZXJpYWwpIHx8IEJvb2xlYW4ocmV2b2tlT3B0aW9ucy5ha2kpXG4gICAgICAgICAgPyBcIlJldm9rZSBVc2VyIENlcnRpZmljYXRlXCJcbiAgICAgICAgICA6IFwiVXNlciBEZWxldGlvblwiO1xuXG4gICAgICBjb25zdCByZXZva2VSZXF1ZXN0OiBJUmV2b2tlUmVxdWVzdCA9IHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgICAuLi5yZXZva2VPcHRpb25zLFxuICAgICAgICBlbnJvbGxtZW50SUQ6IGlkZW50aXR5LmlkLFxuICAgICAgfTtcblxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5jbGllbnQucmV2b2tlKHJldm9rZVJlcXVlc3QsIHRoaXMudXNlcik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV2b2tlIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV2b2tlIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHJvbGUgdHlwZXMgdXNlZCBkdXJpbmcgZW5yb2xsbWVudCBhbmQgcmVnaXN0cmF0aW9uLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUgc3RhbmRhcmQgSHlwZXJsZWRnZXIgRmFicmljIENBIHJvbGVzIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIGlkZW50aXRpZXMgd2hlbiByZWdpc3RlcmluZyB3aXRoIHRoZSBDQSBzZXJ2aWNlLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBDQV9ST0xFIHtcbiAgLyoqIEFkbWluaXN0cmF0b3Igcm9sZSB3aXRoIGVsZXZhdGVkIHByaXZpbGVnZXMgZm9yIG1hbmFnaW5nIGlkZW50aXRpZXMgYW5kIGFmZmlsaWF0aW9ucyAqL1xuICBBRE1JTiA9IFwiYWRtaW5cIixcbiAgLyoqIFN0YW5kYXJkIHVzZXIgcm9sZSBmb3IgYXBwbGljYXRpb24gY2xpZW50cyBpbnRlcmFjdGluZyB3aXRoIHRoZSBuZXR3b3JrICovXG4gIFVTRVIgPSBcInVzZXJcIixcbiAgLyoqIENsaWVudCByb2xlIHR5cGljYWxseSB1c2VkIGZvciBTREstYmFzZWQgaW50ZXJhY3Rpb25zIGFuZCBzZXJ2aWNlIGFjY291bnRzICovXG4gIENMSUVOVCA9IFwiY2xpZW50XCIsXG59XG4iLCJpbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3M6IEZhYnJpY0NsaWVudEZsYWdzID0gT2JqZWN0LmFzc2lnbih7XG4gIGV2YWx1YXRlVGltZW91dDogNSxcbiAgZW5kb3JzZVRpbWVvdXQ6IDE1LFxuICBzdWJtaXRUaW1lb3V0OiA1LFxuICBjb21taXRUaW1lb3V0OiA2MCxcbiAgbGVnYWN5OiBmYWxzZSxcbiAgYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzOiBmYWxzZSxcbiAgYWxsb3dHYXRld2F5T3ZlcnJpZGU6IGZhbHNlLFxuICByZWJ1aWxkV2l0aFRyYW5zaWVudDogdHJ1ZSxcbiAgZW5jcnlwdFRyYW5zaWVudDogZmFsc2UsXG4gIHN5bnRoZXRpY0V2ZW50czogdHJ1ZSxcbn0pIGFzIGFueTtcbiIsImltcG9ydCB7IGlzQnJvd3NlciwgTWluaUxvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5pbXBvcnQgeyBJZGVudGl0eSwgU2lnbmVyLCBzaWduZXJzIH0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplSW1wb3J0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmNvbnN0IGxvZyA9IG5ldyBNaW5pTG9nZ2VyKFwiZmFicmljLWZzXCIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMb2FkcyBjb250ZW50IGZyb20gYSBmaWxlIG9yIHJldHVybnMgdGhlIGNvbnRlbnQgaWYgYWxyZWFkeSBsb2FkZWRcbiAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgdGhlIGlucHV0IGlzIGFscmVhZHkgY29udGVudCBvciBhIHBhdGggdG8gYSBmaWxlLCBhbmQgbG9hZHMgdGhlIGZpbGUgaWYgbmVlZGVkXG4gKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnRPclBhdGggLSBUaGUgY29udGVudCBvciBwYXRoIHRvIGxvYWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbGVSZWFkZXIgLSBGdW5jdGlvbiB0byByZWFkIHRoZSBmaWxlIGlmIGNvbnRlbnRPclBhdGggaXMgYSBwYXRoXG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+fSBUaGUgY29udGVudFxuICogQGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb250ZW50T2ZMb2FkRmlsZShcbiAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgZmlsZVJlYWRlcjogKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBVaW50OEFycmF5IHwgQnVmZmVyPlxuKSB7XG4gIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gIGlmIChcbiAgICBjb250ZW50T3JQYXRoLm1hdGNoKFxuICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICApXG4gIClcbiAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbVxuICogQHN1bW1hcnkgTG9hZHMgYSBmaWxlIHVzaW5nIHRoZSBOb2RlLmpzIGZpbGUgc3lzdGVtIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IGNvbnRlbnRPclBhdGggLSBUaGUgY29udGVudCBvciBwYXRoIHRvIGxvYWRcbiAqIEByZXR1cm4ge1Byb21pc2U8QnVmZmVyPn0gVGhlIGZpbGUgY29udGVudCBhcyBhIEJ1ZmZlclxuICogQGZ1bmN0aW9uIHJlYWRGaWxlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlsZShjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICBjb25zdCBmaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICB9O1xuXG4gIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHVzZXJcbiAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgdXNlciB3aXRoIHRoZSBnaXZlbiBjcmVkZW50aWFscyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEZhYnJpYyBDQVxuICogQHBhcmFtIHtzdHJpbmd9IHVzZXJOYW1lIC0gVGhlIHVzZXIgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHByaXZhdGVLZXkgLSBUaGUgcHJpdmF0ZSBrZXkgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0aWZpY2F0ZSAtIFRoZSBjZXJ0aWZpY2F0ZSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gVGhlIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBJRFxuICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgdXNlclxuICogQGZ1bmN0aW9uIGdldENBVXNlclxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q0FVc2VyKFxuICB1c2VyTmFtZTogc3RyaW5nLFxuICBwcml2YXRlS2V5OiBzdHJpbmcsXG4gIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gIG1zcElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlcj4ge1xuICBsb2cuZGVidWcoXG4gICAgYENyZWF0aW5nIGEgQ0EgJHttc3BJZH0gdXNlciAke3VzZXJOYW1lfSB3aXRoIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9YFxuICApO1xuICBjb25zdCB1c2VyID0gbmV3IFVzZXIodXNlck5hbWUpO1xuICBjb25zdCBjcnlwdG9TdWl0ZSA9IFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgdXNlci5zZXRDcnlwdG9TdWl0ZShjcnlwdG9TdWl0ZSk7XG4gIGNvbnN0IGltcG9ydGVkS2V5ID0gY3J5cHRvU3VpdGUuY3JlYXRlS2V5RnJvbVJhdyhwcml2YXRlS2V5KTtcbiAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGltcG9ydGVkS2V5LCBjZXJ0aWZpY2F0ZSwgbXNwSWQpO1xuICByZXR1cm4gdXNlcjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyBhbiBpZGVudGl0eSBmcm9tIGEgY2VydGlmaWNhdGUgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIGNlcnRpZmljYXRlIGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYW4gSWRlbnRpdHkgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcGFyYW0ge3N0cmluZ30gY2VydERpcmVjdG9yeVBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGVcbiAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgaWRlbnRpdHlcbiAqIEBmdW5jdGlvbiBnZXRJZGVudGl0eVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SWRlbnRpdHkoXG4gIG1zcElkOiBzdHJpbmcsXG4gIGNlcnREaXJlY3RvcnlQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3QgY2VydFBhdGggPSBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoY2VydFBhdGgpO1xuICAgIHJldHVybiBjcmVkZW50aWFscztcbiAgfTtcblxuICBjb25zdCBjcmVkZW50aWFsczogVWludDhBcnJheSA9IChhd2FpdCBjb250ZW50T2ZMb2FkRmlsZShcbiAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICBpZGVudGl0eUZpbGVSZWFkZXJcbiAgKSkgYXMgVWludDhBcnJheTtcblxuICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlIGluIGEgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBSZWFkcyBhIGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgcGF0aCB0byB0aGUgZmlyc3QgZmlsZSBmb3VuZFxuICogQHBhcmFtIHtzdHJpbmd9IGRpclBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlyc3QgZmlsZVxuICogQGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWUoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwicGF0aFwiKSk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlIGluIGEgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBSZWFkcyBhIGRpcmVjdG9yeSwgZmluZHMgdGhlIGZpcnN0IGZpbGUsIGFuZCByZXR1cm5zIGl0cyBjb250ZW50IGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29udGVudCBvZiB0aGUgZmlyc3QgZmlsZVxuICogQGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChcbiAgZGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pKSkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyBhIHNpZ25lciBmcm9tIGEga2V5IGRpcmVjdG9yeVxuICogQHN1bW1hcnkgTG9hZHMgYSBwcml2YXRlIGtleSBmcm9tIGEgZGlyZWN0b3J5IGFuZCBjcmVhdGVzIGEgU2lnbmVyIGZvciBGYWJyaWMgdHJhbnNhY3Rpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleVxuICogQHJldHVybiB7UHJvbWlzZTxTaWduZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgc2lnbmVyXG4gKiBAZnVuY3Rpb24gZ2V0U2lnbmVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgY29uc3Qgc2lnbmVyRmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShrZXlQYXRoKTtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlS2V5UGVtID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgc2lnbmVyRmlsZVJlYWRlclxuICApKSBhcyBCdWZmZXI7XG4gIC8vIE5vZGUgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgLy8gcHJpdmF0ZUtleSA9IGNyZWF0ZVByaXZhdGVLZXkocHJpdmF0ZUtleVBlbSk7XG4gIC8vIC0tXG5cbiAgLy8gd2ViIGJhc2VkIGltcGxlbWVudGF0aW9uXG4gIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCBleHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJpdmF0ZUtleSk7XG4gIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAvLyAtLVxuXG4gIHJldHVybiBzaWduZXJzLm5ld1ByaXZhdGVLZXlTaWduZXIoayBhcyBhbnkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyBhIHByaXZhdGUga2V5IGZyb20gYSBQRU0gYnVmZmVyXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5IHRvIGEgQ3J5cHRvS2V5IG9iamVjdFxuICogQHBhcmFtIHtCdWZmZXJ9IHBlbSAtIFRoZSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleVxuICogQHJldHVybiB7UHJvbWlzZTxDcnlwdG9LZXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgQ3J5cHRvS2V5XG4gKiBAZnVuY3Rpb24gZXh0cmFjdFByaXZhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEV4dHJhY3RQcml2YXRlS2V5XG4gKiAgIHBhcnRpY2lwYW50IFN1YnRsZUNyeXB0b1xuICpcbiAqICAgQ2FsbGVyLT4+RXh0cmFjdFByaXZhdGVLZXk6IGV4dHJhY3RQcml2YXRlS2V5KHBlbSlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogR2V0IFN1YnRsZUNyeXB0byBpbXBsZW1lbnRhdGlvblxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBQYXJzZSBQRU0gZm9ybWF0XG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IENvbnZlcnQgdG8gYmluYXJ5IERFUlxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PlN1YnRsZUNyeXB0bzogaW1wb3J0S2V5KHBrY3M4LCBiaW5hcnlEZXIsIG9wdGlvbnMpXG4gKiAgIFN1YnRsZUNyeXB0by0tPj5FeHRyYWN0UHJpdmF0ZUtleTogQ3J5cHRvS2V5XG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LS0+PkNhbGxlcjogQ3J5cHRvS2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleShwZW06IEJ1ZmZlcikge1xuICBjb25zdCBsaWJOYW1lID0gXCJjcnlwdG9cIjtcbiAgbGV0IHN1YnRsZTtcbiAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgc3VidGxlID0gKGdsb2JhbFRoaXMgYXMgYW55KS5jcnlwdG8uc3VidGxlO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxpYiA9IChhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KGxpYk5hbWUpKSkgYXMgYW55O1xuICAgIHN1YnRsZSA9IGxpYi5zdWJ0bGUgfHwgbGliLndlYmNyeXB0by5zdWJ0bGU7XG4gIH1cblxuICBpZiAoIXN1YnRsZSkgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGxvYWQgU3VidGxlQ3J5cHRvIG1vZHVsZVwiKTtcblxuICBmdW5jdGlvbiBzdHIyYWIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgY29uc3Qgc3RyID0gcGVtXG4gICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAucmVwbGFjZShcIi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIik7XG4gIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICBjb25zdCBiaW5hcnlEZXIgPSBzdHIyYWIoZGVjb2RlZCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQWRhcHRlckZsYWdzLFxuICBDb25kaXRpb24sXG4gIENvbnRleHQsXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgT3BlcmF0b3IsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFF1ZXJ5Q2xhdXNlLFxuICBRdWVyeUVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBTZWxlY3RTZWxlY3RvcixcbiAgU2VxdWVuY2UsXG4gIFN0YXRlbWVudCxcbiAgU3RhdGVtZW50RXhlY3V0b3IsXG4gIFZpZXdLaW5kLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICBDb3VjaERCT3BlcmF0b3IsXG4gIENvdWNoREJHcm91cE9wZXJhdG9yLFxuICBDb3VjaERCUXVlcnlMaW1pdCxcbiAgTWFuZ29RdWVyeSxcbiAgTWFuZ29PcGVyYXRvcixcbiAgTWFuZ29TZWxlY3RvcixcbiAgdHJhbnNsYXRlT3BlcmF0b3JzLFxuICBnZW5lcmF0ZURlc2lnbkRvY05hbWUsXG4gIGdlbmVyYXRlVmlld05hbWUsXG4gIGZpbmRWaWV3TWV0YWRhdGEsXG4gIENvdWNoREJWaWV3TWV0YWRhdGEsXG4gIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgdG9DYW1lbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IERCS2V5cywgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxudHlwZSBGYWJyaWNWaWV3RGVzY3JpcHRvciA9IHtcbiAgZGRvYzogc3RyaW5nO1xuICB2aWV3OiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG59O1xuXG50eXBlIEZhYnJpY0FnZ3JlZ2F0ZUluZm8gPVxuICB8IHtcbiAgICAgIGtpbmQ6IFZpZXdLaW5kO1xuICAgICAgbWV0YTogQ291Y2hEQlZpZXdNZXRhZGF0YTtcbiAgICAgIGRlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgICAgY291bnREaXN0aW5jdD86IGJvb2xlYW47XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IFwiYXZnXCI7XG4gICAgICBhdHRyaWJ1dGU6IHN0cmluZztcbiAgICAgIHN1bURlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgICAgY291bnREZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICB9O1xuXG5jb25zdCBlc2NhcGVSZWdFeHAgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG5cbmZ1bmN0aW9uIG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcXHUwMDAwXCI7XG4gIGNvbnN0IGNoYXJzID0gQXJyYXkuZnJvbSh2YWx1ZSk7XG4gIGZvciAobGV0IGkgPSBjaGFycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyc1tpXS5jb2RlUG9pbnRBdCgwKTtcbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAoY29kZSA8IDB4MTBmZmZmKSB7XG4gICAgICBjaGFyc1tpXSA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUgKyAxKTtcbiAgICAgIHJldHVybiBjaGFycy5zbGljZSgwLCBpICsgMSkuam9pbihcIlwiKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3ZhbHVlfVxcdTAwMDBgO1xufVxuXG5mdW5jdGlvbiBwcmVmaXhSYW5nZShwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBwcmVmaXgsXG4gICAgZW5kOiBuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyhwcmVmaXgpLFxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50U3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBTdGF0ZW1lbnQ8XG4gIE0sXG4gIEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gIFIsXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLCBvdmVycmlkZXM/OiBQYXJ0aWFsPEFkYXB0ZXJGbGFncz4pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBvdmVycmlkZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNxdWFzaChcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNxdWFzaGVkOiBQcmVwYXJlZFN0YXRlbWVudDxNPiB8IHVuZGVmaW5lZCA9IHN1cGVyLnNxdWFzaChcbiAgICAgIGN0eCBhcyBuZXZlclxuICAgICk7XG4gICAgaWYgKCFzcXVhc2hlZCkgcmV0dXJuIHNxdWFzaGVkO1xuXG4gICAgY29uc3QgeyBtZXRob2QsIHBhcmFtcywgYXJncyB9ID0gc3F1YXNoZWQ7XG4gICAgY29uc3QgeyBkaXJlY3Rpb24sIGxpbWl0IH0gPSBwYXJhbXM7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQ6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbiwgbGltaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbiwgbGltaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCBtZXRob2QgJHttZXRob2R9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNxdWFzaGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGV4ZWN1dGVQcmVwYXJlZChcbiAgICAuLi5hcmd6OiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKHRoaXMuZnJvbVNlbGVjdG9yLCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGNvbnN0IHsgbWV0aG9kLCBhcmdzIH0gPSB0aGlzLnByZXBhcmVkIGFzIFByZXBhcmVkU3RhdGVtZW50PGFueT47XG4gICAgcmV0dXJuIHJlcG8uc3RhdGVtZW50KG1ldGhvZCwgLi4uYXJncywgLi4uYXJneik7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwcmVwYXJlKFxuICAgIGN0eD86IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8U3RhdGVtZW50RXhlY3V0b3I8TSwgUj4+IHtcbiAgICBjdHggPVxuICAgICAgY3R4IHx8XG4gICAgICAoYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIFBlcnNpc3RlbmNlS2V5cy5RVUVSWSxcbiAgICAgICAgdGhpcy5vdmVycmlkZXMgfHwge30sXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICApKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuaXNTaW1wbGVRdWVyeSgpICYmXG4gICAgICAoY3R4IGFzIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KS5nZXQoXCJmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzXCIpXG4gICAgKSB7XG4gICAgICBjb25zdCBzcXVhc2hlZCA9IHRoaXMuc3F1YXNoKGN0eCBhcyBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPik7XG4gICAgICBpZiAoc3F1YXNoZWQpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlZCA9IHNxdWFzaGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJnczogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdO1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge30gYXMgYW55O1xuXG4gICAgY29uc3QgcHJlcGFyZWQ6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gPSB7XG4gICAgICBjbGFzczogdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBhcmdzLFxuICAgICAgcGFyYW1zLFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgbWV0aG9kOiBzdHJpbmdbXSA9IFtRdWVyeUNsYXVzZS5GSU5EX0JZXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnByZXBhcmVDb25kaXRpb24odGhpcy53aGVyZUNvbmRpdGlvbiwgY3R4IGFzIG5ldmVyKTtcbiAgICAgIG1ldGhvZC5wdXNoKHBhcnNlZC5tZXRob2QpO1xuICAgICAgaWYgKHBhcnNlZC5hcmdzICYmIHBhcnNlZC5hcmdzLmxlbmd0aClcbiAgICAgICAgYXJncy5wdXNoKC4uLihwYXJzZWQuYXJncyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgbWV0aG9kLnB1c2goXG4gICAgICAgIFF1ZXJ5Q2xhdXNlLlNFTEVDVCxcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5qb2luKGAgJHtRdWVyeUNsYXVzZS5BTkQudG9Mb3dlckNhc2UoKX0gYClcbiAgICAgICk7XG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBtZXRob2QucHVzaChRdWVyeUNsYXVzZS5PUkRFUl9CWSwgdGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzBdIGFzIHN0cmluZyk7XG4gICAgICBhcmdzLnB1c2godGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzFdIGFzIGFueSk7XG4gICAgfVxuICAgIHByZXBhcmVkLm1ldGhvZCA9IHRvQ2FtZWxDYXNlKG1ldGhvZC5qb2luKFwiIFwiKSk7XG4gICAgcHJlcGFyZWQucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMucHJlcGFyZWQgPSBwcmVwYXJlZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgcmVjb3JkIGZyb20gQ291Y2hEQi9GYWJyaWNcbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgdGhlIElEIGZyb20gYSBDb3VjaERCIGRvY3VtZW50IGFuZCByZXZlcnRzIGl0IHRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVjb3JkKFxuICAgIHI6IGFueSxcbiAgICBwa0F0dHI6IGtleW9mIE0sXG4gICAgc2VxdWVuY2VUeXBlOiBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHVuZGVmaW5lZCxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICkge1xuICAgIGlmIChyW0NvdWNoREJLZXlzLklEXSkge1xuICAgICAgY29uc3QgWywgLi4ua2V5QXJnc10gPSByW0NvdWNoREJLZXlzLklEXS5zcGxpdChDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQoXG4gICAgICAgIHIsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgICBTZXF1ZW5jZS5wYXJzZVZhbHVlKHNlcXVlbmNlVHlwZSwgaWQpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IE1hbmdvIHF1ZXJ5XG4gICAqIEBzdW1tYXJ5IFNlbmRzIGEgcmF3IE1hbmdvIHF1ZXJ5IHRvIEZhYnJpYyBhbmQgcHJvY2Vzc2VzIHRoZSByZXN1bHRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcbiAgICBjb25zdCBhZ2dyZWdhdG9yID0gKHJhd0lucHV0IGFzIGFueSk/LmFnZ3JlZ2F0ZUluZm87XG4gICAgaWYgKChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGUgJiYgYWdncmVnYXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFnZ3JlZ2F0ZTxSPihhZ2dyZWdhdG9yLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoXG4gICAgICByYXdJbnB1dCxcbiAgICAgIHRydWUsXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGN0eFxuICAgICk7XG5cbiAgICBjb25zdCBwa0F0dHIgPSBNb2RlbC5wayh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLmdldChcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5JRCwgcGtBdHRyIGFzIHN0cmluZylcbiAgICApPy50eXBlO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKChyKSA9PiB0aGlzLnByb2Nlc3NSZWNvcmQociwgcGtBdHRyLCB0eXBlLCBjdHgpKSBhcyBSO1xuICAgIHJldHVybiByZXN1bHRzIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIENvdWNoREIgTWFuZ28gcXVlcnkgZnJvbSB0aGUgc3RhdGVtZW50XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHRoZSBzdGF0ZW1lbnQncyBjb25kaXRpb25zLCBzZWxlY3RvcnMsIGFuZCBvcHRpb25zIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5XG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGQoKTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYnVpbGQpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZVF1ZXJ5ID0gdGhpcy5idWlsZEFnZ3JlZ2F0ZVF1ZXJ5KCk7XG4gICAgaWYgKGFnZ3JlZ2F0ZVF1ZXJ5KSByZXR1cm4gYWdncmVnYXRlUXVlcnk7XG4gICAgY29uc3Qgc2VsZWN0b3JzOiBNYW5nb1NlbGVjdG9yID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjogc2VsZWN0b3JzIH07XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpIHF1ZXJ5LmZpZWxkcyA9IHRoaXMuc2VsZWN0U2VsZWN0b3IgYXMgc3RyaW5nW107XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgY29uZGl0aW9uOiBNYW5nb1NlbGVjdG9yID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8TT4oQ291Y2hEQktleXMuVEFCTEUgYXMga2V5b2YgTSkuZXEoXG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkuc2VsZWN0b3I7XG4gICAgICBjb25zdCBzZWxlY3RvcktleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pIGFzIE1hbmdvT3BlcmF0b3JbXTtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0b3JLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBPYmplY3QudmFsdWVzKENvdWNoREJHcm91cE9wZXJhdG9yKS5pbmRleE9mKHNlbGVjdG9yS2V5c1swXSkgIT09IC0xXG4gICAgICApXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0b3JLZXlzWzBdKSB7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSBhcyBNYW5nb1NlbGVjdG9yXG4gICAgICAgICAgICAgICkucmVkdWNlKChhY2N1bTogTWFuZ29TZWxlY3RvcltdLCB2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUb28gbWFueSBrZXlzIGluIHF1ZXJ5IHNlbGVjdG9yLiBzaG91bGQgYmUgb25lXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGsgPT09IENvdWNoREJHcm91cE9wZXJhdG9yLkFORClcbiAgICAgICAgICAgICAgICAgIGFjY3VtLnB1c2goLi4uKHZhbFtrXSBhcyBhbnlbXSkpO1xuICAgICAgICAgICAgICAgIGVsc2UgYWNjdW0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgfSwgW10pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gY29uZGl0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5PUjoge1xuICAgICAgICAgICAgY29uc3QgczogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgc1tDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHF1ZXJ5LnNlbGVjdG9yKS5tYXAoKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IHM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBPYmplY3QuZW50cmllcyhjb25kaXRpb24pLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAocXVlcnkuc2VsZWN0b3Jba2V5XSlcbiAgICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgICBgQSAke2tleX0gcXVlcnkgcGFyYW0gaXMgYWJvdXQgdG8gYmUgb3ZlcnJpZGRlbjogJHtxdWVyeS5zZWxlY3RvcltrZXldfSBieSAke3ZhbH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW2tleV0gPSB2YWw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcnM/Lmxlbmd0aCkge1xuICAgICAgcXVlcnkuc29ydCA9IHF1ZXJ5LnNvcnQgfHwgW107XG4gICAgICBxdWVyeS5zZWxlY3RvciA9IHF1ZXJ5LnNlbGVjdG9yIHx8ICh7fSBhcyBNYW5nb1NlbGVjdG9yKTtcbiAgICAgIGZvciAoY29uc3QgW3NlbGVjdG9yS2V5LCBkaXJlY3Rpb25dIG9mIHRoaXMub3JkZXJCeVNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9IHNlbGVjdG9yS2V5IGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcmVjOiBSZWNvcmQ8c3RyaW5nLCBPcmRlckRpcmVjdGlvbj4gPSB7fTtcbiAgICAgICAgcmVjW3NlbGVjdG9yXSA9IGRpcmVjdGlvbiBhcyBPcmRlckRpcmVjdGlvbjtcbiAgICAgICAgKHF1ZXJ5LnNvcnQgYXMgUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+W10pLnB1c2gocmVjKTtcbiAgICAgICAgaWYgKCFxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0pIHtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgICAgIChxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLkJJR0dFUl0gPVxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxpbWl0U2VsZWN0b3IpIHtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gdGhpcy5saW1pdFNlbGVjdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybihcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgY291Y2hkYiBsaW1pdCBvZiAke0NvdWNoREJRdWVyeUxpbWl0fWBcbiAgICAgICk7XG4gICAgICBxdWVyeS5saW1pdCA9IENvdWNoREJRdWVyeUxpbWl0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKSBxdWVyeS5za2lwID0gdGhpcy5vZmZzZXRTZWxlY3RvcjtcblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvciBzdHJ1Y3R1cmVcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbjxNPik6IE1hbmdvUXVlcnkge1xuICAgIGZ1bmN0aW9uIG1lcmdlKFxuICAgICAgb3A6IE1hbmdvT3BlcmF0b3IsXG4gICAgICBvYmoxOiBNYW5nb1NlbGVjdG9yLFxuICAgICAgb2JqMjogTWFuZ29TZWxlY3RvclxuICAgICk6IE1hbmdvUXVlcnkge1xuICAgICAgY29uc3QgcmVzdWx0OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjoge30gYXMgTWFuZ29TZWxlY3RvciB9O1xuICAgICAgcmVzdWx0LnNlbGVjdG9yW29wXSA9IFtvYmoxLCBvYmoyXTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT47XG4gICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgIH07XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLlNUQVJUU19XSVRIKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIxICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIlNUQVJUU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIlNUQVJUU19XSVRIIHJlcXVpcmVzIGEgc3RyaW5nIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCByYW5nZSA9IHByZWZpeFJhbmdlKGNvbXBhcmlzb24pO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChzZWxlY3RvclthdHRyMV0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLkJJR0dFUl9FUV0gPSByYW5nZS5zdGFydDtcbiAgICAgIChzZWxlY3RvclthdHRyMV0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLlNNQUxMRVJdID0gcmFuZ2UuZW5kO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLkVORFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJFTkRTX1dJVEggcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICBpZiAodHlwZW9mIGNvbXBhcmlzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGEgc3RyaW5nIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCBzZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvclthdHRyMV0gPSB7XG4gICAgICAgIFtDb3VjaERCT3BlcmF0b3IuUkVHRVhQXTogYCR7ZXNjYXBlUmVnRXhwKGNvbXBhcmlzb24pfSRgLFxuICAgICAgfSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLkJFVFdFRU4pIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBhdHRyMSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29tcGFyaXNvbikgfHwgY29tcGFyaXNvbi5sZW5ndGggIT09IDIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiQkVUV0VFTiBvcGVyYXRvciByZXF1aXJlcyBbbWluLCBtYXhdIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCBbbWluLCBtYXhdID0gY29tcGFyaXNvbjtcbiAgICAgIGNvbnN0IG9wQmV0d2VlbjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcEJldHdlZW5bYXR0cl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLkJJR0dFUl9FUSlcbiAgICAgIF0gPSBtaW47XG4gICAgICAob3BCZXR3ZWVuW2F0dHJdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuU01BTExFUl9FUSlcbiAgICAgIF0gPSBtYXg7XG4gICAgICByZXR1cm4geyBzZWxlY3Rvcjogb3BCZXR3ZWVuIH07XG4gICAgfVxuXG4gICAgbGV0IG9wOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICBpZiAoXG4gICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIG9wW2F0dHIxIGFzIHN0cmluZ10gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW2F0dHIxIGFzIHN0cmluZ10gYXMgTWFuZ29TZWxlY3RvcilbdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKV0gPVxuICAgICAgICBjb21wYXJpc29uO1xuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgb3AgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3IgYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICAoYXR0cjEgYXMgdW5rbm93biBhcyB7IGF0dHIxOiBzdHJpbmcgfSkuYXR0cjFcbiAgICAgIF0gPSBjb21wYXJpc29uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcDE6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IG9wMjogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihjb21wYXJpc29uIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBvcCA9IG1lcmdlKHRyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvciksIG9wMSwgb3AyKS5zZWxlY3RvcjtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzZWxlY3Rvcjogb3AgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSBpZiBhZ2dyZWdhdGlvbiBpcyByZXF1ZXN0ZWRcbiAgICogQHN1bW1hcnkgQ2hlY2tzIGZvciBhZ2dyZWdhdGUgb3BlcmF0aW9ucyBhbmQgcmV0dXJucyBhIHNwZWNpYWwgTWFuZ29RdWVyeSBmb3IgdGhlbVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFnZ3JlZ2F0ZVF1ZXJ5KCk6IE1hbmdvUXVlcnkgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuYXZnU2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IFN0cmluZyh0aGlzLmF2Z1NlbGVjdG9yKTtcbiAgICAgIGNvbnN0IHN1bUluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJzdW1cIiwgYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IGNvdW50SW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImNvdW50XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoIXN1bUluZm8gfHwgIWNvdW50SW5mbylcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgICAgYEF2ZyBvcGVyYXRpb24gcmVxdWlyZXMgc3VtIGFuZCBjb3VudCB2aWV3cyBmb3IgYXR0cmlidXRlICR7YXR0cmlidXRlfWBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KHtcbiAgICAgICAga2luZDogXCJhdmdcIixcbiAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICBzdW1EZXNjcmlwdG9yOiBzdW1JbmZvLmRlc2NyaXB0b3IsXG4gICAgICAgIGNvdW50RGVzY3JpcHRvcjogY291bnRJbmZvLmRlc2NyaXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPVxuICAgICAgICB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciA9PSBudWxsXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IFN0cmluZyh0aGlzLmNvdW50RGlzdGluY3RTZWxlY3Rvcik7XG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwiZGlzdGluY3RcIiwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgIGluZm8uY291bnREaXN0aW5jdCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFnZ3JlZ2F0b3JVc2VkID1cbiAgICAgIHR5cGVvZiB0aGlzLmNvdW50U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgISF0aGlzLm1pblNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMubWF4U2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5zdW1TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLmRpc3RpbmN0U2VsZWN0b3I7XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yQ2hlY2tzOiBBcnJheTxbVmlld0tpbmQsIFNlbGVjdFNlbGVjdG9yPE0+IHwgdW5kZWZpbmVkXT4gPSBbXG4gICAgICBbXG4gICAgICAgIFwiY291bnRcIixcbiAgICAgICAgKHRoaXMuY291bnRTZWxlY3RvciA/PyB1bmRlZmluZWQpIGFzIFNlbGVjdFNlbGVjdG9yPE0+IHwgdW5kZWZpbmVkLFxuICAgICAgXSxcbiAgICAgIFtcIm1heFwiLCB0aGlzLm1heFNlbGVjdG9yXSxcbiAgICAgIFtcIm1pblwiLCB0aGlzLm1pblNlbGVjdG9yXSxcbiAgICAgIFtcInN1bVwiLCB0aGlzLnN1bVNlbGVjdG9yXSxcbiAgICAgIFtcImRpc3RpbmN0XCIsIHRoaXMuZGlzdGluY3RTZWxlY3Rvcl0sXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgW2tpbmQsIHNlbGVjdG9yXSBvZiBhZ2dyZWdhdG9yQ2hlY2tzKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBzZWxlY3RvciA/IFN0cmluZyhzZWxlY3RvcikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKGtpbmQsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoaW5mbyk7XG4gICAgfVxuXG4gICAgaWYgKGFnZ3JlZ2F0b3JVc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgYE5vIENvdWNoREIgdmlldyBtZXRhZGF0YSBmb3VuZCBmb3IgdGFibGUgJHtNb2RlbC50YWJsZU5hbWUoXG4gICAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICAgKX0gYWdncmVnYXRvcmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gYWdncmVnYXRlIGRlc2NyaXB0b3IgZm9yIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFxuICAgIGtpbmQ6IFZpZXdLaW5kLFxuICAgIGF0dHJpYnV0ZT86IHN0cmluZ1xuICApOiBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YXMgPSBmaW5kVmlld01ldGFkYXRhKHRoaXMuZnJvbVNlbGVjdG9yLCBraW5kLCBhdHRyaWJ1dGUpO1xuICAgIGlmICghbWV0YXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGEgPSBtZXRhc1swXTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHZpZXdOYW1lID0gZ2VuZXJhdGVWaWV3TmFtZSh0YWJsZU5hbWUsIG1ldGEuYXR0cmlidXRlLCBraW5kLCBtZXRhKTtcbiAgICBjb25zdCBkZG9jID0gbWV0YS5kZG9jIHx8IGdlbmVyYXRlRGVzaWduRG9jTmFtZSh0YWJsZU5hbWUsIHZpZXdOYW1lKTtcbiAgICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgcmVkdWNlOiBtZXRhLnJlZHVjZSAhPT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICFtZXRhLnJldHVybkRvY3MsXG4gICAgfTtcbiAgICBpZiAoa2luZCA9PT0gXCJkaXN0aW5jdFwiIHx8IGtpbmQgPT09IFwiZ3JvdXBCeVwiKSBvcHRpb25zLmdyb3VwID0gdHJ1ZTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZCxcbiAgICAgIG1ldGEsXG4gICAgICBkZXNjcmlwdG9yOiB7XG4gICAgICAgIGRkb2MsXG4gICAgICAgIHZpZXc6IHZpZXdOYW1lLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBzcGVjaWFsIGFnZ3JlZ2F0ZSBNYW5nb1F1ZXJ5IG1hcmtlclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBZ2dyZWdhdGVRdWVyeShcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvXG4gICk6IE1hbmdvUXVlcnkgJiB7IGFnZ3JlZ2F0ZTogdHJ1ZTsgYWdncmVnYXRlSW5mbzogRmFicmljQWdncmVnYXRlSW5mbyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3I6IHt9LFxuICAgICAgYWdncmVnYXRlOiB0cnVlLFxuICAgICAgYWdncmVnYXRlSW5mbzogaW5mbyxcbiAgICB9IGFzIE1hbmdvUXVlcnkgJiB7IGFnZ3JlZ2F0ZTogdHJ1ZTsgYWdncmVnYXRlSW5mbzogRmFicmljQWdncmVnYXRlSW5mbyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyIGNhc3QgdG8gRmFicmljQ2xpZW50QWRhcHRlciBmb3IgdmlldyBhY2Nlc3NcbiAgICovXG4gIHByaXZhdGUgZ2V0RmFicmljQWRhcHRlcigpOiBGYWJyaWNDbGllbnRBZGFwdGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSB2aWEgYWRhcHRlcidzIHZpZXcgbWV0aG9kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVBZ2dyZWdhdGU8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmICghdGhpcy5pc1ZpZXdBZ2dyZWdhdGUoaW5mbykpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF2ZXJhZ2U8Uj4oaW5mbywgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IHZpZXdJbmZvID0gaW5mbyBhcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT47XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3IuZGRvYyxcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3IudmlldyxcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3Iub3B0aW9ucyxcbiAgICAgIGN0eFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihpbmZvLCByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgYXZlcmFnZSBjYWxjdWxhdGlvbiBmcm9tIHN1bSBhbmQgY291bnQgdmlld3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQXZlcmFnZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgaWYgKGluZm8ua2luZCAhPT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiQXZlcmFnZSBkZXNjcmlwdG9yIGlzIG5vdCB2YWxpZFwiKTtcbiAgICBjb25zdCBmYWJyaWNBZGFwdGVyID0gdGhpcy5nZXRGYWJyaWNBZGFwdGVyKCk7XG4gICAgY29uc3QgW3N1bURlc2MsIGNvdW50RGVzY10gPSBbaW5mby5zdW1EZXNjcmlwdG9yLCBpbmZvLmNvdW50RGVzY3JpcHRvcl07XG4gICAgY29uc3QgW3N1bVJlc3BvbnNlLCBjb3VudFJlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgICBzdW1EZXNjLmRkb2MsXG4gICAgICAgIHN1bURlc2MudmlldyxcbiAgICAgICAgc3VtRGVzYy5vcHRpb25zLFxuICAgICAgICBjdHhcbiAgICAgICksXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgY291bnREZXNjLmRkb2MsXG4gICAgICAgIGNvdW50RGVzYy52aWV3LFxuICAgICAgICBjb3VudERlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgIF0pO1xuICAgIGNvbnN0IHN1bSA9IHN1bVJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBjb25zdCBjb3VudCA9IGNvdW50UmVzcG9uc2Uucm93cz8uWzBdPy52YWx1ZSA/PyAwO1xuICAgIGlmICghY291bnQpIHJldHVybiAwIGFzIHVua25vd24gYXMgUjtcbiAgICByZXR1cm4gKHN1bSAvIGNvdW50KSBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyB0aGUgdmlldyByZXNwb25zZSBiYXNlZCBvbiBhZ2dyZWdhdGUga2luZFxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzVmlld1Jlc3BvbnNlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgcmVzcG9uc2U6IFZpZXdSZXNwb25zZVxuICApOiBSIHtcbiAgICBpZiAoaW5mby5raW5kID09PSBcImF2Z1wiKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIFwiQXZlcmFnZSByZXN1bHRzIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBwcm9jZXNzaW5nIHJvd3NcIlxuICAgICAgKTtcbiAgICBjb25zdCByb3dzID0gcmVzcG9uc2Uucm93cyB8fCBbXTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IG1ldGEgPSB2aWV3SW5mby5tZXRhO1xuICAgIGlmICh2aWV3SW5mby5jb3VudERpc3RpbmN0KSB7XG4gICAgICByZXR1cm4gKHJvd3MubGVuZ3RoIHx8IDApIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKHZpZXdJbmZvLmtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCB2aWV3SW5mby5raW5kID09PSBcImdyb3VwQnlcIikge1xuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5rZXkgPz8gcm93LnZhbHVlKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmIChtZXRhLnJldHVybkRvY3MpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cudmFsdWUgPz8gcm93LmRvYyA/PyByb3cpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICh2aWV3SW5mby5raW5kID09PSBcImNvdW50XCIgPyAwIDogbnVsbCkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gKHJvd3NbMF0udmFsdWUgPz8gcm93c1swXS5rZXkgPz8gbnVsbCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGluZm8gaXMgYSB2aWV3LWJhc2VkIGFnZ3JlZ2F0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZpZXdBZ2dyZWdhdGUoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBpbmZvIGlzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PiB7XG4gICAgcmV0dXJuIGluZm8ua2luZCAhPT0gXCJhdmdcIjtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQYWdpbmF0b3IsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50UGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIE1bXSxcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGJvb2ttYXJrPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgcXVlcnk6IE1hbmdvUXVlcnkgfCBQcmVwYXJlZFN0YXRlbWVudDxhbnk+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBgUmF3IHF1ZXJ5IGFjY2VzcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuIG9ubHkgcHJlcGFyZWQgc3RhdGVtZW50cyBhcmUgbmF0aXZlbHkgYXZhaWxhYmxlYFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBwYWdlKFxuICAgIHBhZ2U6IG51bWJlciA9IDEsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gc3VwZXIucGFnZShwYWdlLCAuLi5hcmdzKTsgLy8gdGhpcyB3aWxsIGZhaWwgZm9yIG5vbi1wcmVwYXJlZCBzdGF0ZW1lbnRzXG4gIH1cbn1cbiIsImltcG9ydCBcIi4uL3NoYXJlZC9vdmVycmlkZXNcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICB0eXBlIE1hbmdvUXVlcnksXG4gIHR5cGUgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0ICogYXMgZ3JwYyBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIHR5cGUgTW9kZWxDb25zdHJ1Y3RvcixcbiAgdHlwZSBTZXJpYWxpemVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBkZWJ1ZywgZmluYWwsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIHR5cGUgUGVlckNvbmZpZyxcbiAgdHlwZSBTZWdyZWdhdGVkTW9kZWwsXG4gIHR5cGUgTXNwRGV0YWlscyxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgY29ubmVjdCxcbiAgdHlwZSBDb25uZWN0T3B0aW9ucyxcbiAgR2F0ZXdheSxcbiAgTmV0d29yayxcbiAgUHJvcG9zYWxPcHRpb25zLFxuICBDb250cmFjdCBhcyBDb250cmFrdCxcbiAgdHlwZSBTaWduZXIsXG4gIEdhdGV3YXlFcnJvcixcbiAgRW5kb3JzZUVycm9yLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBHYXRld2F5IGFzIExlZ2FjeUdhdGV3YXksIFdhbGxldHMgfSBmcm9tIFwiZmFicmljLW5ldHdvcmtcIjtcbmltcG9ydCB0eXBlIHsgRW5kb3JzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgZ2V0SWRlbnRpdHksXG4gIGdldFNpZ25lcixcbiAgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQsXG4gIHJlYWRGaWxlIGFzIHJlYWRGc0ZpbGUsXG59IGZyb20gXCIuL2ZhYnJpYy1mc1wiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQmFkUmVxdWVzdEVycm9yLFxuICB0eXBlIFByaW1hcnlLZXlUeXBlLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRmxhZ3MsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFN0YXRlbWVudCxcbiAgdHlwZSBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUGFnaW5hdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIENvbnRleHR1YWxBcmdzLFxuICB0eXBlIFByZXBhcmVkTW9kZWwsXG4gIEFsbE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDbGllbnRTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnREaXNwYXRjaCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudERpc3BhdGNoXCI7XG4vLyBpbXBvcnQgeyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tIH0gZnJvbSBcIi4vZmFicmljLWhzbVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50U3RhdGVtZW50IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBFbmRvcnNlbWVudEVycm9yLFxuICBFbmRvcnNlbWVudFBvbGljeUVycm9yLFxuICBNdmNjUmVhZENvbmZsaWN0RXJyb3IsXG4gIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcixcbiAgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IsXG59IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4vY3J5cHRvXCI7XG5pbXBvcnQgeyBleHRyYWN0SWRzIH0gZnJvbSBcIi4vaWRzL2lkLWV4dHJhY3Rpb25cIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uL3NoYXJlZC9pbmRleFwiO1xuXG50eXBlIExlZ2FjeVBlZXJUYXJnZXQgPSB7XG4gIG1zcElkOiBzdHJpbmc7XG4gIHBlZXJFbmRwb2ludDogc3RyaW5nO1xuICBwZWVySG9zdEFsaWFzPzogc3RyaW5nO1xuICB0bHNDZXJ0Pzogc3RyaW5nIHwgQnVmZmVyO1xufTtcblxudHlwZSBMZWdhY3lQZWVyV2l0aE5hbWUgPSBMZWdhY3lQZWVyVGFyZ2V0ICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3NcbiAqIEBzdW1tYXJ5IFRoZSBGYWJyaWNBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXIgdG8gcHJvdmlkZSBhIHNlYW1sZXNzIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3MuXG4gKiBJdCBoYW5kbGVzIGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgdHJhbnNhY3Rpb24gc3VibWlzc2lvbiwgYW5kIENSVUQgb3BlcmF0aW9ucyBhZ2FpbnN0IEZhYnJpYyBjaGFpbmNvZGUuXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAdGVtcGxhdGUgRmFicmljRmxhZ3MgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8RmFicmljRmxhZ3M+IC0gQ29udGV4dCB0eXBlIGNvbnRhaW5pbmcgRmFicmljLXNwZWNpZmljIGZsYWdzXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gYWxpYXMgLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAqIGNvbnN0IGNvbmZpZzogUGVlckNvbmZpZyA9IHtcbiAqICAgbXNwSWQ6ICdPcmcxTVNQJyxcbiAqICAgcGVlckVuZHBvaW50OiAnbG9jYWxob3N0OjcwNTEnLFxuICogICBjaGFubmVsTmFtZTogJ215Y2hhbm5lbCcsXG4gKiAgIGNoYWluY29kZU5hbWU6ICdteWNjJyxcbiAqICAgY29udHJhY3ROYW1lOiAnbXljb250cmFjdCcsXG4gKiAgIHRsc0NlcnRQYXRoOiAnL3BhdGgvdG8vdGxzL2NlcnQnLFxuICogICBjZXJ0RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2NlcnQvZGlyJyxcbiAqICAga2V5RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2tleS9kaXInXG4gKiB9O1xuICpcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgRmFicmljQWRhcHRlcihjb25maWcsICdvcmcxLWFkYXB0ZXInKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlcjEnLCBteVNlcmlhbGl6ZXIpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCwgdHJhbnNpZW50LCBzZXJpYWxpemVyKVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc3VibWl0VHJhbnNhY3Rpb24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFtzZXJpYWxpemVkTW9kZWxdLCB0cmFuc2llbnQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbE5hbWUpXG4gKiAgIE5ldHdvcmstPj5Db250cmFjdDogZ2V0Q29udHJhY3QoY2hhaW5jb2RlTmFtZSwgY29udHJhY3ROYW1lKVxuICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZGVjb2RlKHJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVjb2RlZFJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IGRlc2VyaWFsaXplZFJlc3VsdFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIFBlZXJDb25maWcsXG4gIENsaWVudCxcbiAgTWFuZ29RdWVyeSxcbiAgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyB0ZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgVWludDhBcnJheSB0byBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljQ2xpZW50QWRhcHRlcik7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PiA9XG4gICAgRmFicmljQ2xpZW50QWRhcHRlci5zZXJpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQZWVyQ29uZmlnLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzLCBjb25maWcpLFxuICAgICAgRmFicmljRmxhdm91cixcbiAgICAgIGFsaWFzXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPlxuICApOiBTdGF0ZW1lbnQ8TSwgRmFicmljQ2xpZW50QWRhcHRlciwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQodGhpcywgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHF1ZXJ5OiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgTWFuZ29RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICk6IFBhZ2luYXRvcjxNLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFBhZ2luYXRvcih0aGlzLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10gfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgICBjb25zdCBtZXJnZWRGbGFncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCBmbGFncyk7XG4gICAgY29uc3QgZiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBtZXJnZWRGbGFncywgLi4uYXJncylcbiAgICApO1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IEFsbE9wZXJhdGlvbktleXMsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PGFueT4+XG4gICk6IFByb21pc2U8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuc2lsbHkoXG4gICAgICBgY3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbCA/IChBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsLm1hcCgobSkgPT4gTW9kZWwudGFibGVOYW1lKG0pKSA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCkpIDogXCJub1wifSB0YWJsZSAke292ZXJyaWRlcyAmJiBPYmplY3Qua2V5cyhvdmVycmlkZXMpID8gT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGggOiBcIm5vXCJ9IHdpdGggZmxhZyBvdmVycmlkZXNgXG4gICAgKTtcbiAgICBsZXQgY3R4ID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIGN0eCAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICBhcmdzLnB1c2goY3R4KTtcbiAgICAgIGN0eCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZXMgPSBjdHhcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY3R4LnRvT3ZlcnJpZGVzKCksIG92ZXJyaWRlcylcbiAgICAgIDogb3ZlcnJpZGVzO1xuICAgIGNvbnN0IGZsYWdzID0gYXdhaXQgdGhpcy5mbGFncyhcbiAgICAgIHR5cGVvZiBvcGVyYXRpb24gPT09IFwic3RyaW5nXCIgPyBvcGVyYXRpb24gOiBvcGVyYXRpb24ubmFtZSxcbiAgICAgIG1vZGVsLFxuICAgICAgb3ZlcnJpZGVzIGFzIFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgICAgLi4uWy4uLmFyZ3MsIGN0eF0uZmlsdGVyKEJvb2xlYW4pXG4gICAgKTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE9wID0gY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpO1xuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZmZWN0ZWRUYWJsZXNcIik7XG4gICAgICBpZiAoXG4gICAgICAgICFjdXJyZW50T3AgfHxcbiAgICAgICAgY3VycmVudE9wICE9PSBvcGVyYXRpb24gfHxcbiAgICAgICAgKG1vZGVsICYmIG1vZGVsICE9PSBjdXJyZW50TW9kZWwpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuXG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3R4LmFjY3VtdWxhdGUoZmxhZ3MpIGFzIGFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgLi4uZmxhZ3MsXG4gICAgfSkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNvZGVzIGEgVWludDhBcnJheSB0byBhIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBiaW5hcnkgZGF0YSByZWNlaXZlZCBmcm9tIEZhYnJpYyB0byBhIHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGEgLSBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nXG4gICAqL1xuICBkZWNvZGUoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvc2l0b3J5PFxuICAgIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICAgICAgYW55LFxuICAgICAgQWRhcHRlcjxQZWVyQ29uZmlnLCBDbGllbnQsIE1hbmdvUXVlcnksIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICAgID4sXG4gID4oKTogQ29uc3RydWN0b3I8Uj4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFtDb25zdHJ1Y3RvcjxNPiwgUHJpbWFyeUtleVR5cGUsIFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmFueVtdLCBDb250ZXh0XSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIHJlY29yZHMgZm9yIGNyZWF0aW9uXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmVjZXNzYXJ5IENvdWNoREIgZmllbGRzIHRvIG11bHRpcGxlIHJlY29yZHMgYmVmb3JlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIElEcyBvZiB0aGUgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSB0YWJsZU5hbWUsIGlkcywgYW5kIHByZXBhcmVkIHJlY29yZHNcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgaWRzIGFuZCBtb2RlbHMgYXJyYXlzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgLy9IRVJFIVxuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy5pbmZvKGBhZGRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgIFtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKSlcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgICAgY2xhenosXG4gICAgICAgIGN0eCxcbiAgICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgICAgcmVzWzBdW01vZGVsLnBrKGNsYXp6KSBhcyBzdHJpbmddIHx8IGlkc1swXVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnRbaV0gfHwge30pLCByZXNbaV0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byByZWFkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgcmVhZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMudXBkYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgW1xuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtb2RlbHMubWFwKChtKSA9PiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpKVxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcblxuICAgIGxldCByZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZHNbMF0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudFtpXSB8fCB7fSksIHJlc1tpXSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+fSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7U2VyaWFsaXplcjxhbnk+fSBzZXJpYWxpemVyIC0gU2VyaWFsaXplciBmb3IgdGhlIG1vZGVsIGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkc1swXVxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZEFsbChjbGF6eiwgaWRzLCAuLi5jdHhBcmdzKTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXMpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBTZWdyZWdhdGVkTW9kZWw8TT4gJiBQcmVwYXJlZE1vZGVsIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHsobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BsaXQubW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQobW9kZWwpO1xuICAgIGlmIChtaXJyb3JNZXRhKSB7XG4gICAgICBjb25zdCBtaXJyb3JNc3AgPSBtaXJyb3JNZXRhLm1zcElkO1xuICAgICAgaWYgKCFtaXJyb3JNc3ApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBtaXJyb3IgTVNQIGNvdWxkIGJlIGZvdW5kYCk7XG4gICAgICBsZXQgbXNwcyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgICAgbXNwcyA9IEFycmF5LmlzQXJyYXkobXNwcykgPyBtc3BzIDogW21zcHNdO1xuICAgICAgY29uc3QgbWVyZ2VkID0gWy4uLm5ldyBTZXQoWy4uLm1zcHMsIG1pcnJvck1zcF0pXTtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgZW5kb3JzaW5nT3JnczogbWVyZ2VkLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBtZXJnZWQsXG4gICAgICAgIGxlZ2FjeTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHNwbGl0Lm1vZGVsLFxuICAgICAgbW9kZWw6IHNwbGl0Lm1vZGVsLFxuICAgICAgaWQ6IG1vZGVsW01vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KV0gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OiBzcGxpdC50cmFuc2llbnQsXG4gICAgICBwcml2YXRlczogc3BsaXQucHJpdmF0ZXMsXG4gICAgICBzaGFyZWQ6IHNwbGl0LnNoYXJlZCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogTSB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZXZlcnQpO1xuICAgIGlmIChcbiAgICAgIHRyYW5zaWVudCAmJlxuICAgICAgdGhpcy5zaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICAgICAgY3R4LFxuICAgICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiB0eXBlb2YgdiAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIG9iaiAmJiAob2JqIGFzIGFueSlba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBvdmVyd3JpdGluZyBleGlzdGluZyAke2tleX0uIGlmIHRoaXMgaXMgbm90IGEgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtYXkgcG9zZSBhIHByb2JsZW1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjdHgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNoaWxkUmVidWlsZCA9XG4gICAgICB0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjaGlsZFJlYnVpbGQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlc29sdmVkT3AgPSB0aGlzLnJlc29sdmVPcGVyYXRpb24oY3R4LCBvcGVyYXRpb24pO1xuICAgIGlmICghcmVzb2x2ZWRPcCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG9wID0gcmVzb2x2ZWRPcC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIG9wLmluY2x1ZGVzKFwicmVhZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJmaW5kXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInF1ZXJ5XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInN0YXRlbWVudFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJwYWdlXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZU9wZXJhdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChvcGVyYXRpb24pIHJldHVybiBvcGVyYXRpb247XG4gICAgaWYgKHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwib3BlcmF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGhhc1RyYW5zaWVudDogYm9vbGVhbixcbiAgICBpZD86IFByaW1hcnlLZXlUeXBlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghaGFzVHJhbnNpZW50KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWQgPSBNb2RlbC5jb21wb3NlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGdlbmVyYXRlZCA9IE1vZGVsLmdlbmVyYXRlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGhhc0lkID0gaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbDtcbiAgICBpZiAoIWhhc0lkICYmIGNvbXBvc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWhhc0lkICYmIGdlbmVyYXRlZCkge1xuICAgICAgY3R4LmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2Fubm90IHJlZnJlc2ggcmVjb3JkIHdpdGggcHJpdmF0ZSBnZW5lcmF0ZWQgcHJpbWFyeSBrZXlgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGlyZWN0ID1cbiAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgfHxcbiAgICAgIChjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZGlyZWN0ICYmIGRpcmVjdC5sZW5ndGgpIHJldHVybiBkaXJlY3Q7XG4gICAgcmV0dXJuIChcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgfHxcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZVxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgYWRkaW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lKV0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyBoZWFsdGhjaGVjazxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5oZWFsdGhjaGVjayk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJoZWFsdGhjaGVja1wiLFxuICAgICAgW10sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyByZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICB1cGRhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIC8vIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyB1cGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy51cGRhdGVcbiAgICApO1xuICAgIGxvZy5pbmZvKGBDTElFTlQgVVBEQVRFIGNsYXNzIDogJHt0eXBlb2YgY2xhenp9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgdXBkYXRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUgfHwgY2xhenopXSwgLy8gVE9ETyBzaG91bGQgYmUgcmVjZXZpbmcgY2xhc3MgYnV0IGlzIHJlY2VpdmluZyBzdHJpbmdcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXIgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZFxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZChjbGF6eiwgaWQsIGN0eCk7XG4gICAgfVxuXG4gICAgbG9nLnZlcmJvc2UoYGRlbGV0aW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICA/IHJlc3VsdFxuICAgICAgOiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcGVyZm9ybSBhIHF1ZXJ5IHVzaW5nIE1hbmdvIFF1ZXJ5IHN5bnRheFxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcm9jZXNzIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXN1bHRcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiByYXcocmF3SW5wdXQsIHByb2Nlc3MpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBldmFsdWF0ZVRyYW5zYWN0aW9uKFwicXVlcnlcIiwgW2lucHV0XSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKFwicXVlcnlcIiwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04ucGFyc2UoZGVjb2RlKHJlc3VsdCkpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0IGJhc2VkIG9uIHR5cGVcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogcHJvY2Vzc2VkIHJlc3VsdFxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgcmF3PFYsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICBkb2NzT25seTogRCA9IHRydWUgYXMgRCxcbiAgICBjbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gY2xhenoubmFtZTtcbiAgICBsb2cuaW5mbyhgUGVyZm9ybWluZyByYXcgc3RhdGVtZW50IG9uIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKGNsYXp6KX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJyYXdcIixcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHJhd0lucHV0KSwgZG9jc09ubHldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVJlY29yZCA9IChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pID0+IHtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKHJlY29yZCkpIHJldHVybiBNb2RlbC5idWlsZChyZWNvcmQpO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgICBjb25zdCBlbCA9IHJlc3VsdFswXTtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKGVsKSlcbiAgICAgICAgLy8gaWYgdGhlIGZpcnN0IG9uZSBpcyBhIG1vZGVsLCBhbGwgYXJlIG1vZGVsc1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCgoZWwpID0+IE1vZGVsLmJ1aWxkKGVsKSkgYXMgVjtcbiAgICAgIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VSZWNvcmQocmVzdWx0IGFzIGFueSkgYXMgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBDb3VjaERCIHZpZXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBxdWVyeSBhIGRlc2lnbiBkb2N1bWVudCB2aWV3XG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHZpZXcgcmVzcG9uc2UgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGRvYyAtIERlc2lnbiBkb2N1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TmFtZSAtIFZpZXcgbmFtZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBWaWV3IHF1ZXJ5IG9wdGlvbnNcbiAgICogQHBhcmFtIHsuLi5Db250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj59IGFyZ3MgLSBPcHRpb25hbCBjb250ZXh0dWFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFZpZXdSZXNwb25zZTxSPj59IFRoZSB2aWV3IHJlc3BvbnNlXG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyB2aWV3PFI+KFxuICAgIGRkb2M6IHN0cmluZyxcbiAgICB2aWV3TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8Vmlld1Jlc3BvbnNlPFI+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy52aWV3KTtcbiAgICBsb2cuaW5mbyhgUXVlcnlpbmcgdmlldyAke2Rkb2N9LyR7dmlld05hbWV9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwidmlld1wiLFxuICAgICAgICBbZGRvYywgdmlld05hbWUsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpXSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFZpZXdSZXNwb25zZTxSPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgdmlldyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBjcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIHRoZSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY2FjaGVkIGNsaWVudCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBub25lIGV4aXN0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENsaWVudD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IENsaWVudCB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpXG4gICAgICB0aGlzLl9jbGllbnQgPSBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENsaWVudCh0aGlzLmNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IEdhdGV3YXkgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgY2xpZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgR2F0ZXdheShjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTogUHJvbWlzZTxHYXRld2F5PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShjdHgsIHRoaXMuY29uZmlnLCB0aGlzLmNsaWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRyYWN0TmFtZShjbGFzc05hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWNsYXNzTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYCR7Y2xhc3NOYW1lfUNvbnRyYWN0YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IENvbnRyYWN0IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IEdhdGV3YXlcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb250cmFrdD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIENvbnRyYWN0KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8Q29udHJha3Q+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDb250cmFjdChcbiAgICAgIGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBjb250cmFjdE5hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBTdWJtaXRzIG9yIGV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWJtaXQgLSBXaGV0aGVyIHRvIHN1Ym1pdCAodHJ1ZSkgb3IgZXZhbHVhdGUgKGZhbHNlKSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBnZXRDb250cmFjdCgpXG4gICAqICAgYWx0IHN1Ym1pdCB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZWxzZSBldmFsdWF0ZSB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbmRcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjbG9zZSgpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBzdWJtaXQgPSB0cnVlLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IHN0cmluZ1tdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50cmFuc2FjdGlvbik7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IGF3YWl0IHRoaXMuQ29udHJhY3QoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKVxuICAgICAgKTtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgJHtzdWJtaXQgPyBcIlN1Ym1pdFwiIDogXCJFdmFsdWF0ZVwifXRpbmcgdHJhbnNhY3Rpb24gJHt0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpIHx8IHRoaXMuY29uZmlnLmNvbnRyYWN0TmFtZX0uJHthcGl9YFxuICAgICAgKTtcbiAgICAgIGxvZy5kZWJ1ZyhgYXJnczogJHthcmdzPy5tYXAoKGEpID0+IGEudG9TdHJpbmcoKSkuam9pbihcIlxcblwiKSB8fCBcIm5vbmVcIn1gKTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHN1Ym1pdCA/IGNvbnRyYWN0LnN1Ym1pdCA6IGNvbnRyYWN0LmV2YWx1YXRlO1xuXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zID0gZW5kb3JzaW5nT3JnYW5pemF0aW9ucz8ubGVuZ3RoXG4gICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3Bvc2FsT3B0aW9uczogUHJvcG9zYWxPcHRpb25zID0ge1xuICAgICAgICBhcmd1bWVudHM6IGFyZ3MgfHwgW10sXG4gICAgICAgIHRyYW5zaWVudERhdGE6IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEpLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgdHlwZW9mIHRyYW5zaWVudERhdGFcbiAgICAgICAgKSxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogY3R4LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzXCIpXG4gICAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zIHx8IHVuZGVmaW5lZFxuICAgICAgICAgIDogdW5kZWZpbmVkLCAvLyBtc3BJZCBsaXN0XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgbWV0aG9kLmNhbGwoY29udHJhY3QsIGFwaSwgcHJvcG9zYWxPcHRpb25zKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjb25uZWN0aW9uYCk7XG4gICAgICBnYXRld2F5LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFjdHguZ2V0T3JVbmRlZmluZWQoXCJsZWdhY3lcIikgJiYgISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUxlZ2FjeUFyZ3MoYXJncz86IGFueVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAoYXJncyB8fCBbXSkubWFwKChhcmcpID0+XG4gICAgICB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiID8gYXJnIDogSlNPTi5zdHJpbmdpZnkoYXJnKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5VHJhbnNpZW50KFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICk6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNpZW50RGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSk7XG4gICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICBtYXBba2V5XSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVMZWdhY3lNc3BDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSB0aGlzLmNvbmZpZy5sZWdhY3lNc3BDb3VudCA/PyAxO1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihjb25maWd1cmVkKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpIHx8IHBhcnNlZCA8IDEpIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLmZsb29yKHBhcnNlZCk7XG4gIH1cblxuICBwcml2YXRlIHBpY2tMZWdhY3lDYW5kaWRhdGVzKFxuICAgIGNhbmRpZGF0ZXM6IE1zcERldGFpbHNbXSxcbiAgICBsaW1pdDogbnVtYmVyXG4gICk6IE1zcERldGFpbHNbXSB7XG4gICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYXZhaWxhYmxlID0gWy4uLmNhbmRpZGF0ZXNdO1xuICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWluKGxpbWl0LCBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICBjb25zdCBwaWNrZWQ6IE1zcERldGFpbHNbXSA9IFtdO1xuICAgIHdoaWxlIChwaWNrZWQubGVuZ3RoIDwgdGFyZ2V0ICYmIGF2YWlsYWJsZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgICAgY29uc3QgW3NlbGVjdGlvbl0gPSBhdmFpbGFibGUuc3BsaWNlKGlkeCwgMSk7XG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHBpY2tlZC5wdXNoKHNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBMZWdhY3lQZWVyVGFyZ2V0W10ge1xuICAgIGNvbnN0IHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W10gPSBbXG4gICAgICB7XG4gICAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgICAgIHRsc0NlcnQ6IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBsZXQgZW5kb3JzaW5nT3JncyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgIGVuZG9yc2luZ09yZ3MgPSBBcnJheS5pc0FycmF5KGVuZG9yc2luZ09yZ3MpXG4gICAgICA/IGVuZG9yc2luZ09yZ3NcbiAgICAgIDogW2VuZG9yc2luZ09yZ3NdO1xuICAgIGNvbnN0IGVuZG9yc2VycyA9XG4gICAgICBlbmRvcnNpbmdPcmdzLmZpbHRlcigob3JnKTogb3JnIGlzIHN0cmluZyA9PiBCb29sZWFuKG9yZykpIHx8IFtdO1xuICAgIGNvbnN0IGV4dHJhcyA9IGVuZG9yc2Vycy5maWx0ZXIoKG9yZykgPT4gb3JnICE9PSB0aGlzLmNvbmZpZy5tc3BJZCk7XG4gICAgaWYgKCFleHRyYXMubGVuZ3RoKSByZXR1cm4gcGVlcnM7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLmNvbmZpZy5tc3BNYXA7XG4gICAgY29uc3QgbGVnYWN5Q291bnQgPSB0aGlzLnJlc29sdmVMZWdhY3lNc3BDb3VudCgpO1xuICAgIGZvciAoY29uc3QgbXNwIG9mIGV4dHJhcykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG1hcD8uW21zcF07XG4gICAgICBpZiAoIWNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnBpY2tMZWdhY3lDYW5kaWRhdGVzKGNhbmRpZGF0ZXMsIGxlZ2FjeUNvdW50KTtcbiAgICAgIGlmICghc2VsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHZhbGlkIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNob2ljZSBvZiBzZWxlY3Rpb25zKSB7XG4gICAgICAgIGlmICghY2hvaWNlLmVuZHBvaW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBwZWVyIG1hcHBpbmcgZm9yIE1TUCAke21zcH06IG1pc3NpbmcgZW5kcG9pbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwZWVycy5wdXNoKHtcbiAgICAgICAgICBtc3BJZDogbXNwLFxuICAgICAgICAgIHBlZXJFbmRwb2ludDogY2hvaWNlLmVuZHBvaW50LFxuICAgICAgICAgIHBlZXJIb3N0QWxpYXM6IGNob2ljZS5hbGlhcyxcbiAgICAgICAgICB0bHNDZXJ0OiBjaG9pY2UudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGVlcnM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGZjbjogc3RyaW5nLFxuICAgIGFyZ3M6IHN0cmluZ1tdLFxuICAgIHRyYW5zaWVudE1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCxcbiAgICBwZWVyQ29uZmlnczogTGVnYWN5UGVlclRhcmdldFtdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMpO1xuICAgIGNvbnN0IHBlZXJzID0gdGhpcy5ub3JtYWxpemVMZWdhY3lQZWVycyhwZWVyQ29uZmlncyk7XG4gICAgY29uc3QgaWRlbnRpdHlNYXRlcmlhbCA9IGF3YWl0IHRoaXMucmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBXYWxsZXRzLm5ld0luTWVtb3J5V2FsbGV0KCk7XG4gICAgY29uc3QgaWRlbnRpdHlMYWJlbCA9IGAke3RoaXMuY29uZmlnLm1zcElkfS1sZWdhY3lgO1xuICAgIGF3YWl0IHdhbGxldC5wdXQoaWRlbnRpdHlMYWJlbCwge1xuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB0eXBlOiBcIlguNTA5XCIsXG4gICAgfSBhcyBJZGVudGl0eSk7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uUHJvZmlsZSA9IGF3YWl0IHRoaXMuYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVycyk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IG5ldyBMZWdhY3lHYXRld2F5KCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ2F0ZXdheS5jb25uZWN0KGNvbm5lY3Rpb25Qcm9maWxlLCB7XG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eUxhYmVsLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXNMb2NhbGhvc3Q6IHRoaXMuc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGxzSW5mbzoge1xuICAgICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICAgIGtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBhd2FpdCBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5jb25maWcuY2hhbm5lbCk7XG4gICAgICBjb25zdCBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoXG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIHRoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSlcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGNvbnRyYWN0LmNyZWF0ZVRyYW5zYWN0aW9uKGZjbik7XG5cbiAgICAgIGlmICh0cmFuc2llbnRNYXApIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpZW50KHRyYW5zaWVudE1hcCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZG9yc2VycyA9IHBlZXJzXG4gICAgICAgIC5tYXAoKHBlZXIpID0+IG5ldHdvcmsuZ2V0Q2hhbm5lbCgpLmdldEVuZG9yc2VyKHBlZXIubmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGVuZG9yc2VyKTogZW5kb3JzZXIgaXMgRW5kb3JzZXIgPT4gQm9vbGVhbihlbmRvcnNlcikpO1xuICAgICAgaWYgKGVuZG9yc2Vycy5sZW5ndGgpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0RW5kb3JzaW5nUGVlcnMoZW5kb3JzZXJzKTtcbiAgICAgIH1cblxuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBMZWdhY3kgc3VibWl0dGluZyAke3RoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSkgfHwgdGhpcy5jb25maWcuY29udHJhY3ROYW1lfS4ke2Zjbn0gdmlhIHBlZXJzICR7cGVlcnMubWFwKChwKSA9PiBwLnBlZXJFbmRwb2ludCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uLnN1Ym1pdCguLi5hcmdzKTtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20ocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ2F0ZXdheS5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMZWdhY3lQZWVycyhcbiAgICBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdXG4gICk6IExlZ2FjeVBlZXJXaXRoTmFtZVtdIHtcbiAgICBjb25zdCBkZWR1cGVkID0gbmV3IE1hcDxzdHJpbmcsIExlZ2FjeVBlZXJXaXRoTmFtZT4oKTtcbiAgICBjb25zdCBhZGRQZWVyID0gKHBlZXI6IExlZ2FjeVBlZXJUYXJnZXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BlZXIucGVlckVuZHBvaW50fXwke3BlZXIucGVlckhvc3RBbGlhcyB8fCBcIlwifWA7XG4gICAgICBpZiAoZGVkdXBlZC5oYXMoa2V5KSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmFtZSA9IGBwZWVyLSR7cGVlci5tc3BJZH0tJHtkZWR1cGVkLnNpemV9YDtcbiAgICAgIGRlZHVwZWQuc2V0KGtleSwge1xuICAgICAgICAuLi5wZWVyLFxuICAgICAgICBuYW1lLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHBlZXJzLmZvckVhY2goYWRkUGVlcik7XG4gICAgYWRkUGVlcih7XG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShkZWR1cGVkLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTogUHJvbWlzZTx7XG4gICAgY2VydGlmaWNhdGU6IHN0cmluZztcbiAgICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIHJldHVybiB7IGNlcnRpZmljYXRlLCBwcml2YXRlS2V5IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKSB7XG4gICAgY29uc3QgcGVlckVudHJpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBjaGFubmVsUGVlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBvcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICBjb25zdCB0bHNQZW0gPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgICAgcGVlci50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnRcbiAgICAgICk7XG4gICAgICBjb25zdCBob3N0bmFtZSA9XG4gICAgICAgIHBlZXIucGVlckhvc3RBbGlhcyB8fCB0aGlzLmV4dHJhY3RIb3N0KHBlZXIucGVlckVuZHBvaW50KTtcbiAgICAgIHBlZXJFbnRyaWVzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIHVybDogdGhpcy5lbnN1cmVHcnBjVXJsKHBlZXIucGVlckVuZHBvaW50KSxcbiAgICAgICAgdGxzQ0FDZXJ0czogeyBwZW06IHRsc1BlbSB9LFxuICAgICAgICBncnBjT3B0aW9uczoge1xuICAgICAgICAgIFwic3NsLXRhcmdldC1uYW1lLW92ZXJyaWRlXCI6IGhvc3RuYW1lLFxuICAgICAgICAgIGhvc3RuYW1lT3ZlcnJpZGU6IGhvc3RuYW1lLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNoYW5uZWxQZWVyc1twZWVyLm5hbWVdID0ge1xuICAgICAgICBlbmRvcnNpbmdQZWVyOiB0cnVlLFxuICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZSxcbiAgICAgICAgbGVkZ2VyUXVlcnk6IHRydWUsXG4gICAgICAgIGV2ZW50U291cmNlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0gPSBvcmdzW3BlZXIubXNwSWRdIHx8IHtcbiAgICAgICAgbXNwaWQ6IHBlZXIubXNwSWQsXG4gICAgICAgIHBlZXJzOiBbXSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdLnBlZXJzLnB1c2gocGVlci5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogXCJsZWdhY3ktbWFudWFsXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICBjbGllbnQ6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIH0sXG4gICAgICBvcmdhbml6YXRpb25zOiBvcmdzLFxuICAgICAgcGVlcnM6IHBlZXJFbnRyaWVzLFxuICAgICAgb3JkZXJlcnM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmNoYW5uZWxdOiB7XG4gICAgICAgICAgcGVlcnM6IGNoYW5uZWxQZWVycyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwZWVycy5ldmVyeSgocGVlcikgPT4gdGhpcy5pc0xvY2FsRW5kcG9pbnQocGVlci5wZWVyRW5kcG9pbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMb2NhbEVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5leHRyYWN0SG9zdChlbmRwb2ludCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gaG9zdCA9PT0gXCJsb2NhbGhvc3RcIiB8fCBob3N0ID09PSBcIjEyNy4wLjAuMVwiO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG9zdChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBlbmRwb2ludC5yZXBsYWNlKC9eZ3JwY3M/OlxcL1xcLy8sIFwiXCIpO1xuICAgIHJldHVybiBzYW5pdGl6ZWQuc3BsaXQoXCI6XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVHcnBjVXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICgvXmdycGNzPzpcXC9cXC8vaS50ZXN0KGVuZHBvaW50KSkgcmV0dXJuIGVuZHBvaW50O1xuICAgIHJldHVybiBgZ3JwY3M6Ly8ke2VuZHBvaW50fWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRQZW1JbnB1dChzb3VyY2U/OiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgY2VydGlmaWNhdGUgb3Iga2V5IG1hdGVyaWFsXCIpO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc291cmNlKSkgcmV0dXJuIHNvdXJjZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgY29uc3QgdHJpbW1lZCA9IHNvdXJjZS50cmltKCk7XG4gICAgaWYgKC8tLS0tLUJFR0lOIFtBLVogXSstLS0tLS8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHNvdXJjZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBpZiAoc3RhdHM/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gKGF3YWl0IHJlYWRGc0ZpbGUoc291cmNlKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvciB8IHN0cmluZyk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLnBhcnNlRXJyb3I8RT4oZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGlmICh0aGlzLnNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4KSkge1xuICAgICAgY29uc3QgbGVnYWN5QXJncyA9IHRoaXMucHJlcGFyZUxlZ2FjeUFyZ3MoYXJncyk7XG4gICAgICBjb25zdCB0cmFuc2llbnRNYXAgPSB0aGlzLmJ1aWxkTGVnYWN5VHJhbnNpZW50KHRyYW5zaWVudERhdGEpO1xuICAgICAgY29uc3QgcGVlckNvbmZpZ3MgPSB0aGlzLmJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoY3R4KTtcbiAgICAgIHJldHVybiB0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICAgICAgY3R4LFxuICAgICAgICBhcGksXG4gICAgICAgIGxlZ2FjeUFyZ3MsXG4gICAgICAgIHRyYW5zaWVudE1hcCxcbiAgICAgICAgcGVlckNvbmZpZ3MsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICB0cnVlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENsb3NlcyB0aGUgYWN0aXZlIGRpc3BhdGNoICh3aGljaCBpbiB0dXJuIGNsb3NlcyBhbnkgZ2F0ZXdheVxuICAgKiBldmVudCBzdWJzY3JpcHRpb24pIHZpYSB0aGUgYmFzZSBjbGFzcywgdGhlbiBjbG9zZXMgdGhlIGdSUEMgY2xpZW50LlxuICAgKiBXb3JrcyBjb3JyZWN0bHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBzeW50aGV0aWNFdmVudHNgIGlzIGVuYWJsZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzaHV0ZG93biguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmFzZSBjbGFzcyBoYW5kbGVzIGRpc3BhdGNoLmNsb3NlKCkgaW50ZXJuYWxseS5cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93biguLi5hcmdzKTtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjbGllbnRgKTtcbiAgICAgIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgY2hhaW5jb2RlIGNvbnRyYWN0IGZyb20gdGhlIHNwZWNpZmllZCBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDb250cmFrdH0gVGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29udHJhY3QoXG4gICAgZ2F0ZXdheTogR2F0ZXdheSxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IENvbnRyYWt0IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDb250cmFjdCk7XG4gICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yayhnYXRld2F5LCBjb25maWcuY2hhbm5lbCk7XG4gICAgbGV0IGNvbnRyYWN0OiBDb250cmFrdDtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgUmV0cmlldmluZyBjaGFpbmNvZGUgJHtjb25maWcuY2hhaW5jb2RlTmFtZX0gY29udHJhY3QgJHtjb250cmFjdE5hbWUgfHwgY29uZmlnLmNvbnRyYWN0TmFtZX0gZnJvbSBuZXR3b3JrICR7Y29uZmlnLmNoYW5uZWx9YFxuICAgICAgKTtcbiAgICAgIGNvbnRyYWN0TmFtZSA9IGNvbnRyYWN0TmFtZSA/IGNvbnRyYWN0TmFtZSA6IGNvbmZpZy5jb250cmFjdE5hbWU7XG4gICAgICBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY29uZmlnLmNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIE5ldHdvcmsgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdG8gYSBzcGVjaWZpYyBjaGFubmVsIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEByZXR1cm4ge05ldHdvcmt9IFRoZSBOZXR3b3JrIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0TmV0d29yayhnYXRld2F5OiBHYXRld2F5LCBjaGFubmVsTmFtZTogc3RyaW5nKTogTmV0d29yayB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXROZXR3b3JrKTtcbiAgICBsZXQgbmV0d29yazogTmV0d29yaztcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNoYW5uZWwgJHtjaGFubmVsTmFtZX1gKTtcbiAgICAgIG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtDbGllbnR9IFtjbGllbnRdIC0gT3B0aW9uYWwgZ1JQQyBjbGllbnQsIHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRHYXRld2F5KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsaWVudD86IENsaWVudFxuICApIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNsaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRDbGllbnQoY29uZmlnKSksXG4gICAgICBjb25maWcsXG4gICAgICBjdHhcbiAgICApKSBhcyBHYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNsaWVudCB3aXRoIFRMUyBjcmVkZW50aWFscyBmb3Igc2VjdXJlIGNvbW11bmljYXRpb25cbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NsaWVudH0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBzdGF0aWMgZ2V0Q2xpZW50KGNvbmZpZzogUGVlckNvbmZpZyk6IENsaWVudCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2xpZW50KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgVExTIGNyZWRlbnRpYWxzIGZvciBtc3AgJHtjb25maWcubXNwSWR9YCk7XG4gICAgbGV0IHBhdGhPckNlcnQ6IHN0cmluZyB8IEJ1ZmZlciA9IGNvbmZpZy50bHNDZXJ0IGFzIHN0cmluZyB8IEJ1ZmZlcjtcblxuICAgIGlmICh0eXBlb2YgcGF0aE9yQ2VydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoT3JDZXJ0Lm1hdGNoKFxuICAgICAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20ocGF0aE9yQ2VydCwgXCJ1dGY4XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20oZnMucmVhZEZpbGVTeW5jKHBhdGhPckNlcnQsIFwidXRmOFwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCB0aGUgdGxzIGNlcnRpZmljYXRlIGZyb20gJHtwYXRoT3JDZXJ0fTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGxzQ3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbChwYXRoT3JDZXJ0KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgR2F0ZXdheSBDbGllbnQgZm9yIHVybCAke2NvbmZpZy5wZWVyRW5kcG9pbnR9YCk7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoY29uZmlnLnBlZXJFbmRwb2ludCwgdGxzQ3JlZGVudGlhbHMsIHtcbiAgICAgIFwiZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICAgIFwiZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSBjb25uZWN0aW9uIHdpdGggaWRlbnRpdHkgYW5kIHNpZ25lclxuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gVGhlIGdSUEMgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29ubmVjdGVkIEdhdGV3YXlcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IElkZW50aXR5XG4gICAqICAgcGFydGljaXBhbnQgU2lnbmVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0FkYXB0ZXI6IGdldENvbm5lY3Rpb24oY2xpZW50LCBjb25maWcpXG4gICAqICAgRmFicmljQWRhcHRlci0+PklkZW50aXR5OiBnZXRJZGVudGl0eShtc3BJZCwgY2VydERpcmVjdG9yeVBhdGgpXG4gICAqICAgSWRlbnRpdHktLT4+RmFicmljQWRhcHRlcjogaWRlbnRpdHlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+U2lnbmVyOiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aClcbiAgICogICBTaWduZXItLT4+RmFicmljQWRhcHRlcjogc2lnbmVyXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IENyZWF0ZSBDb25uZWN0T3B0aW9uc1xuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KG9wdGlvbnMpXG4gICAqICAgR2F0ZXdheS0tPj5GYWJyaWNBZGFwdGVyOiBnYXRld2F5XG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DYWxsZXI6IGdhdGV3YXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb25uZWN0aW9uKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0Q29ubmVjdGlvbik7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgUGVlciBJZGVudGl0eSBmb3IgJHtjb25maWcubXNwSWR9IHVuZGVyICR7Y29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRofWBcbiAgICApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgZ2V0SWRlbnRpdHkoXG4gICAgICBjb25maWcubXNwSWQsXG4gICAgICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgcHJlcGFyaW5nIHRyYW5zYWN0aW9uIHNpZ25lciBmb3IgJHtDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShpZGVudGl0eS5jcmVkZW50aWFscy50b1N0cmluZygpKX1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgRmFicmljIElEIGZyb20gY2VydGlmaWNhdGVgLCBlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmVyOiBTaWduZXI7XG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7fTtcbiAgICBpZiAoIWNvbmZpZy5oc20pIHtcbiAgICAgIHNpZ25lciA9IGF3YWl0IGdldFNpZ25lcihjb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zdCBoc20gPSBuZXcgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbShjb25maWcuaHNtLmxpYnJhcnkpO1xuICAgICAgLy8gY29uc3QgaWRlbnRpZmllciA9IGhzbS5nZXRTS0lGcm9tQ2VydGlmaWNhdGVQYXRoKFxuICAgICAgLy8gICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc3QgcGtjczExU2lnbmVyID0gaHNtLm5ld1NpZ25lcih7XG4gICAgICAvLyAgIGxhYmVsOiBjb25maWcuaHNtLnRva2VuTGFiZWwgYXMgc3RyaW5nLFxuICAgICAgLy8gICBwaW46IFN0cmluZyhjb25maWcuaHNtLnBpbikgYXMgc3RyaW5nLFxuICAgICAgLy8gICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgLy8gICAvLyB1c2VyVHlwZTogMSAvKkNLVV9VU0VSICovLFxuICAgICAgLy8gfSk7XG4gICAgICAvLyBzaWduZXIgPSBwa2NzMTFTaWduZXIuc2lnbmVyO1xuICAgICAgLy8gY2xvc2UgPSBwa2NzMTFTaWduZXIuY2xvc2U7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIkhTTSBOT1QgSU1QTEVNRU5URURcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNsaWVudCxcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICAgIHNpZ25lcjogc2lnbmVyLFxuICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0cyBmb3IgZGlmZmVyZW50IGdSUEMgY2FsbHNcbiAgICAgIGV2YWx1YXRlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZXZhbHVhdGVUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGVuZG9yc2VPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJlbmRvcnNlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgc3VibWl0T3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwic3VibWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBjb21taXRTdGF0dXNPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJjb21taXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDEgbWludXRlXG4gICAgICB9LFxuICAgIH0gYXMgQ29ubmVjdE9wdGlvbnM7XG5cbiAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjb25maWcubXNwSWR9YCk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGNvbm5lY3Qob3B0aW9ucyk7XG5cbiAgICAvLyBUT0RPOiByZXBsYWNlP1xuICAgIGlmIChjb25maWcuaHNtKSB7XG4gICAgICBnYXRld2F5LmNsb3NlID0gbmV3IFByb3h5KGdhdGV3YXkuY2xvc2UsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0OiAoKSA9PiB2b2lkLCB0aGlzQXJnOiBhbnksIGFyZ0FycmF5OiBhbnlbXSk6IGFueSB7XG4gICAgICAgICAgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KTtcbiAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBGYWJyaWNDbGllbnREaXNwYXRjaCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLlxuICAgKiBAcmV0dXJucyB7RGlzcGF0Y2h9IEEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAcmVtYXJrcyBUaGUgRGlzcGF0Y2ggaW5zdGFuY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgbG9naWMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLCBzdWNoIGFzIHN1Ym1pdHRpbmcgdHJhbnNhY3Rpb25zIG9yIHF1ZXJ5aW5nIGRhdGEuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGZhYnJpY0Rpc3BhdGNoID0gZmFicmljQ2xpZW50QWRhcHRlci5EaXNwYXRjaCgpO1xuICAgKiBmYWJyaWNEaXNwYXRjaC5zdWJtaXRUcmFuc2FjdGlvbignY3JlYXRlUHJvZHVjdCcsIHsgbmFtZTogJ1Byb2R1Y3QgQScsIHByaWNlOiAxMDAgfSk7XG4gICAqL1xuICBvdmVycmlkZSBEaXNwYXRjaCgpOiBGYWJyaWNDbGllbnREaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvciB1c2luZyB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihcbiAgICBlcnI6IEVycm9yIHwgc3RyaW5nIHwgR2F0ZXdheUVycm9yXG4gICk6IEUge1xuICAgIC8vIGlmIChcbiAgICAvLyAgIE1JU1NJTkdfUFJJVkFURV9EQVRBX1JFR0VYLnRlc3QoXG4gICAgLy8gICAgIHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZVxuICAgIC8vICAgKVxuICAgIC8vIClcbiAgICAvLyAgIHJldHVybiBuZXcgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MoZXJyKSBhcyBFO1xuXG4gICAgbGV0IG1zZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgR2F0ZXdheUVycm9yICYmIGVyci5kZXRhaWxzLmxlbmd0aCAmJiBlcnIuY29kZSA9PT0gMTApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlcnIgaW5zdGFuY2VvZiBFbmRvcnNlRXJyb3IgJiZcbiAgICAgIGVyci5kZXRhaWxzLmxlbmd0aCAmJlxuICAgICAgZXJyLmNvZGUgPT09IDEwICYmXG4gICAgICBlcnIuZGV0YWlsc1swXS5tZXNzYWdlPy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpXG4gICAgKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIk1WQ0NfUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgTXZjY1JlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJERUFETElORV9FWENFRURFRFwiKSlcbiAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkVORE9SU0VNRU5UX1BPTElDWV9GQUlMVVJFXCIpKVxuICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudFBvbGljeUVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJQSEFOVE9NX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgIHN3aXRjaCAoKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRFcnJvcihlcnIpIGFzIEU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhWYWxpZGF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxufVxuXG5GYWJyaWNDbGllbnRBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIENvbnRleHR1YWxBcmdzLFxuICBEaXNwYXRjaCxcbiAgRXZlbnRJZHMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIENvbnRleHQsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFBlZXJDb25maWcgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVFdmVudCxcbiAgQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZSxcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgcGFyc2VFdmVudE5hbWUgfSBmcm9tIFwiLi4vc2hhcmVkL2V2ZW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBkaXNwYXRjaGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICogQHN1bW1hcnkgTGlzdGVucyBmb3IgYW5kIHByb2Nlc3NlcyBldmVudHMgZW1pdHRlZCBieSBGYWJyaWMgY2hhaW5jb2RlLCBkaXNwYXRjaGluZyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IEZhYnJpY0FkYXB0ZXIuZ2V0Q2xpZW50KHBlZXJDb25maWcpO1xuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KTtcbiAqXG4gKiAvLyBDb25maWd1cmUgdGhlIGRpc3BhdGNoIHdpdGggcGVlciBjb25maWd1cmF0aW9uXG4gKiBkaXNwYXRjaC5jb25maWd1cmUocGVlckNvbmZpZyk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgc3BlY2lmaWMgdGFibGUgYW5kIGV2ZW50XG4gKiBkaXNwYXRjaC5vYnNlcnZlKCd1c2VycycsICdjcmVhdGUnLCAoaWQpID0+IHtcbiAqICAgY29uc29sZS5sb2coYFVzZXIgY3JlYXRlZDogJHtpZH1gKTtcbiAqIH0pO1xuICpcbiAqIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgZXZlbnRzXG4gKiBhd2FpdCBkaXNwYXRjaC5zdGFydCgpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudClcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IGNvbmZpZ3VyZShwZWVyQ29uZmlnKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogb2JzZXJ2ZSh0YWJsZSwgZXZlbnQsIGNhbGxiYWNrKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogc3RhcnQoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBpbml0aWFsaXplKClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5HYXRld2F5OiBnZXRHYXRld2F5KGNvbmZpZywgY2xpZW50KVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsKVxuICogICBOZXR3b3JrLT4+TmV0d29yazogZ2V0Q2hhaW5jb2RlRXZlbnRzKGNoYWluY29kZU5hbWUpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gKiAgIGxvb3AgRm9yIGVhY2ggZXZlbnRcbiAqICAgICBDaGFpbmNvZGUtLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChwYXlsb2FkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLS0+PkNsaWVudDogY2FsbGJhY2soaWQpXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxGYWJyaWNDbGllbnRBZGFwdGVyPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgbGlzdGVuaW5nIHN0YWNrIGZvciBjaGFpbmNvZGUgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbmluZ1N0YWNrPzogQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZTxDaGFpbmNvZGVFdmVudD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgZXZlbnQgcGF5bG9hZHMgZnJvbSBieXRlcyB0byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGRpc3BhdGNoZXIgZm9yIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjbGllbnQ6IENsaWVudCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZXZlbnQgbGlzdGVuaW5nIGNvbm5lY3Rpb25cbiAgICogQHN1bW1hcnkgU3RvcHMgbGlzdGVuaW5nIGZvciBjaGFpbmNvZGUgZXZlbnRzIGFuZCByZWxlYXNlcyByZXNvdXJjZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjbG9zZShcbiAgICAuLi5jdHhBcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3M6IGxvZ2dlZEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGN0eEFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TSFVURE9XTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNsb3NlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuY2xvc2UoLi4ubG9nZ2VkQXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIHByb3hpZXMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlzdGVuaW5nU3RhY2suY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGV2ZW50IHBheWxvYWQgZnJvbSBiaW5hcnkgZm9ybWF0XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgVWludDhBcnJheSBjb250YWluaW5nIEpTT04gdG8gYW4gb2JqZWN0IHdpdGggYW4gaWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBqc29uQnl0ZXMgLSBUaGUgYmluYXJ5IHBheWxvYWQgZnJvbSB0aGUgY2hhaW5jb2RlIGV2ZW50XG4gICAqIEByZXR1cm4ge3sgaWQ6IHN0cmluZyB9fSBUaGUgcGFyc2VkIHBheWxvYWQgY29udGFpbmluZyB0aGUgcmVjb3JkIElEXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUGF5bG9hZChqc29uQnl0ZXM6IFVpbnQ4QXJyYXkpOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9IHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5kZWNvZGVyLmRlY29kZShqc29uQnl0ZXMpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb3ZlcnJpZGUgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogKCkgPT4gdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBGYWJyaWNDbGllbnRBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgRmFicmljQ2xpZW50QWRhcHRlciBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIlxuICAgICAgKTtcbiAgICBzdXBlci5vYnNlcnZlKG9ic2VydmVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge2FueX0gcGF5bG9hZCAtIFRoZSBldmVudCBwYXlsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8YW55PiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBBZGFwdGVyLmxvZ0N0eDxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4oXG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyxcbiAgICAgIGV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3R5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKX06JHtldmVudH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2gobW9kZWwsIGV2ZW50LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSB0aGUgY2hhaW5jb2RlIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlbnQgaGFuZGxpbmcgc3RvcHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFN0YWNrXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRQYXJzZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAgICpcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRTdGFjazogZm9yIGF3YWl0IChjb25zdCBldnQgb2YgbGlzdGVuaW5nU3RhY2spXG4gICAqICAgRXZlbnRTdGFjay0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50UGFyc2VyOiBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKVxuICAgKiAgIEV2ZW50UGFyc2VyLS0+PkZhYnJpY0Rpc3BhdGNoOiB7IHRhYmxlLCBldmVudCwgb3duZXIgfVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IENoZWNrIGlmIGV2ZW50IGlzIGZvciB0aGlzIE1TUFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChldnQucGF5bG9hZClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+Pk9ic2VydmVyczogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgcGF5bG9hZC5pZClcbiAgICogICBPYnNlcnZlcnMtLT4+RmFicmljRGlzcGF0Y2g6IENhbGxiYWNrcyBleGVjdXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUV2ZW50cyhcbiAgICBjdHhBcmc/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubGlzdGVuaW5nU3RhY2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEV2ZW50IHN0YWNrIG5vdCBpbml0aWFsaXplZC4gRW5zdXJlIHRoYXQgXCJzdGFydExpc3RlbmluZ1wiIGlzIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGlzIG9wZXJhdGlvbi5gXG4gICAgICApO1xuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIgfHwgIXRoaXMuYWRhcHRlci5jb25maWcpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBmb3VuZC4gc2hvdWxkIGJlIGltcG9zc2libGVgKTtcblxuICAgIGNvbnN0IGN0eCA9XG4gICAgICBjdHhBcmcgfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICAodGhpcy5tb2RlbHMgJiYgdGhpcy5tb2RlbHNbMF0pIHx8IChNb2RlbCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yKVxuICAgICAgKSk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaGFuZGxlRXZlbnRzKTtcblxuICAgIGxvZy5pbmZvKFxuICAgICAgYExpc3RlbmluZyBmb3IgaW5jb21pbmcgZXZlbnRzIG9uIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIi4uLmBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZSwgZXZlbnQsIG93bmVyIH0gPSBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcEV2ZW50T25seSAmJlxuICAgICAgICAgIG93bmVyICYmXG4gICAgICAgICAgb3duZXIgIT09IHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcElkXG4gICAgICAgIClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSA9IHRoaXMucGFyc2VQYXlsb2FkKFxuICAgICAgICAgIGV2dC5wYXlsb2FkXG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSB0YWJsZVxuICAgICAgICAgICAgPyBNb2RlbC5nZXQodGFibGUpXG4gICAgICAgICAgICA6IE1vZGVsLmdldCh0aGlzLm1vZGVsc1swXS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBtb2RlbFJlZiA9IHRhcmdldE1vZGVsID8/ICh0YWJsZSB8fCB0aGlzLm1vZGVsc1swXT8ubmFtZSk7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBcmdzID0gcGF5bG9hZC5yZXN1bHQgPyBbcGF5bG9hZC5yZXN1bHQsIGN0eF0gOiBbY3R4XTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIG1vZGVsUmVmIGFzIENvbnN0cnVjdG9yIHwgc3RyaW5nLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkLmlkIGFzIHN0cmluZyxcbiAgICAgICAgICAgIC4uLihvYnNlcnZlckFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8YW55PilcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB1cGRhdGUgb2JzZXJ2YWJsZXMgZm9yIHRhYmxlICR7dGFibGV9IGV2ZW50ICR7ZXZlbnR9IGlkOiAke3BheWxvYWQuaWR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGV2ZW50IGZvciBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCI6ICR7ZX1gXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgZXZlbnQgZGlzcGF0Y2hpbmcgZm9yIHRoZSBvYnNlcnZlZCBhZGFwdGVyLiBXaGVuXG4gICAqIGBzeW50aGV0aWNFdmVudHNgIGlzIHRydWUgKHRoZSBkZWZhdWx0KSBubyBnYXRld2F5IGNvbm5lY3Rpb24gaXMgb3BlbmVkO1xuICAgKiBpbnN0ZWFkIGV2ZXJ5IENSVUQgb3BlcmF0aW9uIGlzIHdyYXBwZWQgd2l0aCBhIFByb3h5IHRoYXQgZmlyZXNcbiAgICogYHVwZGF0ZU9ic2VydmVyc2AgZm9yICoqYWxsKiogbW9kZWxzLiBXaGVuIGBzeW50aGV0aWNFdmVudHNgIGlzIGZhbHNlIHRoZVxuICAgKiBleGlzdGluZyBnYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZVxuICAgKiBsb2NhbCBQcm94eSBmYWxsYmFjayBpcyBsaW1pdGVkIHRvIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzIG9ubHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9yIGNvbmZpZyBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcblxuICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50cyA9IHRoaXMuYWRhcHRlci5jb25maWcuc3ludGhldGljRXZlbnRzICE9PSBmYWxzZTtcblxuICAgIGlmICghc3ludGhldGljRXZlbnRzKSB7XG4gICAgICAvLyBHYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gKG5vbi1zeW50aGV0aWMgcGF0aClcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgXCJkaXNwYXRjaFwiLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBNb2RlbCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmluaXRpYWxpemUpO1xuICAgICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShcbiAgICAgICAgY3R4LFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnIGFzIFBlZXJDb25maWcsXG4gICAgICAgIHRoaXMuY2xpZW50XG4gICAgICApO1xuICAgICAgY29uc3QgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWwpO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IGF3YWl0IG5ldHdvcmsuZ2V0Q2hhaW5jb2RlRXZlbnRzKFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLmhhbmRsZUV2ZW50cyhjdHgpO1xuICAgIH1cblxuICAgIC8vIFByb3h5IENSVUQgbWV0aG9kcy5cbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gdHJ1ZSAg4oaSIG5vdGlmeSBmb3IgQUxMIG1vZGVscyAocmVwbGFjZXMgZ2F0ZXdheSBldmVudHMgZW50aXJlbHkpXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IGZhbHNlIOKGkiBub3RpZnkgb25seSBmb3IgZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHNcbiAgICAvLyAgICh0aGUgZ2F0ZXdheSBzdWJzY3JpcHRpb24gaGFuZGxlcyBwdWJsaWMgbW9kZWxzKVxuICAgIChcbiAgICAgIFtcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIF0gYXMgKGtleW9mIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgodG9XcmFwKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE5vIGFkYXB0ZXIgcHJvdmlkZWQgZm9yIHRoZSBmYWxsYmFjayBvZiBmdWxseSBzZWdyZWdhdGVkIG1vZGVsc2BcbiAgICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyW3RvV3JhcF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHt0b1dyYXB9IG5vdCBmb3VuZCBpbiAke3RoaXMuYWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5hZGFwdGVyLCB0b1dyYXApO1xuICAgICAgbGV0IHByb3RvOiBhbnkgPSB0aGlzLmFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgdG9XcmFwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHt0b1dyYXB9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIHRoaXMuYWRhcHRlclt0b1dyYXBdID0gbmV3IFByb3h5KHRoaXMuYWRhcHRlclt0b1dyYXBdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAoXG4gICAgICAgICAgdGFyZ2V0OiBhbnksXG4gICAgICAgICAgdGhpc0FyZzogRmFicmljQ2xpZW50QWRhcHRlcixcbiAgICAgICAgICBhcmdBcnJheTogYW55W11cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgLy8gUnVuIHRoZSBvcmlnaW5hbCBtZXRob2QgdW5jaGFuZ2VkIHNvIHRyYW5zaWVudCBkYXRhIGlzIHByZXNlcnZlZFxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG5cbiAgICAgICAgICBjb25zdCBjbGF6ejogQ29uc3RydWN0b3I8YW55PiA9IGFyZ0FycmF5WzBdO1xuICAgICAgICAgIC8vIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIGZhbHNlLCBwdWJsaWMgbW9kZWxzIGVtaXQgYSBjaGFpbmNvZGUgZXZlbnRcbiAgICAgICAgICAvLyBvbiB0aGUgY29udHJhY3Qgc2lkZTsgc2tpcCB0aGUgbG9jYWwgZmFsbGJhY2sgdG8gYXZvaWRcbiAgICAgICAgICAvLyBkb3VibGUtbm90aWZpY2F0aW9uLiBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyB0cnVlIHdlIGhhbmRsZSBhbGwgbW9kZWxzLlxuICAgICAgICAgIGlmICghc3ludGhldGljRXZlbnRzICYmICFNb2RlbC5pc1RyYW5zaWVudChjbGF6eikpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgICAvLyBDb250ZXh0IGlzIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50IG9mIGFyZ0FycmF5XG4gICAgICAgICAgY29uc3QgeyBsb2csIGN0eEFyZ3MsIGN0eCB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShcbiAgICAgICAgICAgIGFyZ0FycmF5LnNsaWNlKGFyZ0FycmF5Lmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpZHMgPSBhcmdBcnJheVsxXTtcbiAgICAgICAgICBjb25zdCByZXN1bHRBcmdzOiBhbnlbXSA9IFtjbGF6eiwgYnVsa1RvU2luZ2xlKHRvV3JhcCksIGlkc107XG5cbiAgICAgICAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwib2JzZXJ2ZUZ1bGxSZXN1bHRcIikpIHtcbiAgICAgICAgICAgIHJlc3VsdEFyZ3MucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIC4uLihyZXN1bHRBcmdzIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHRoaXMudXBkYXRlT2JzZXJ2ZXJzPiksXG4gICAgICAgICAgICAuLi5jdHhBcmdzXG4gICAgICAgICAgKS5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke3RvV3JhcH0gb24gJHtjbGF6ei5uYW1lIHx8IGNsYXp6fSBmb3IgJHtpZHN9OiAke2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmlmIChGYWJyaWNDbGllbnRBZGFwdGVyKVxuICBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSA9IEZhYnJpY0NsaWVudERpc3BhdGNoO1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6WyJlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UiLCJmaWxlUGF0aCIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJkaXJuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTW9kZWxJbmRleGVzIiwibSIsImdlbmVyYXRlSW5kZXhlcyIsImdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzIiwiYWNjdW0iLCJ2aWV3cyIsImdlbmVyYXRlVmlld3MiLCJzdG9yYWdlIiwiZm9yRWFjaCIsImRvYyIsIl9pZCIsInJlYWRNb2RlbEZpbGUiLCJmaWxlIiwiZXhwb3J0cyIsImpvaW4iLCJwcm9jZXNzIiwiY3dkIiwicGFyZW50UGF0aCIsIm5hbWUiLCJ2YWx1ZXMiLCJPYmplY3QiLCJmaWx0ZXIiLCJlIiwiTW9kZWwiLCJhc3luYyIsInJlYWRNb2RlbEZvbGRlcnMiLCJmb2xkZXJzIiwicmVzdWx0IiwiZm9sZGVyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJyZWN1cnNpdmUiLCJmIiwiaXNGaWxlIiwiZW5kc1dpdGgiLCJwdXNoIiwid3JpdGVJbmRleGVzIiwiaW5kZXhlcyIsInAiLCJjb2xsZWN0aW9uIiwiaW5kZXgiLCJyZXNvbHZlIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJ3cml0ZURlc2lnbkRvY3MiLCJkZXNpZ25Eb2NzIiwibGVuZ3RoIiwiZG9jSWQiLCJyZXBsYWNlIiwicGF5bG9hZCIsIl9yZXYiLCJjb2xsZWN0aW9uRm9yIiwiY29sbGVjdGlvbk5hbWUiLCJwb2xpY3kiLCJyZXF1aXJlZFBlZXJDb3VudCIsIm1heFBlZXJDb3VudCIsImJsb2NrVG9MaXZlIiwibWVtYmVyT25seVJlYWQiLCJtZW1iZXJPbmx5V3JpdGUiLCJwcml2YXRlQ29sbGVjdGlvbkZvciIsIm1zcElkIiwiYyIsImVuZG9yc2VtZW50UG9saWN5Iiwic2lnbmF0dXJlUG9saWN5Iiwic2hhcmVkQ29sbGVjdGlvbkZvciIsIm1zcElkcyIsIm1hcCIsImV4dHJhY3RDb2xsZWN0aW9ucyIsIm92ZXJyaWRlcyIsIm1pcnJvciIsInByaXZhdGVDb2xzIiwic2hhcmVkQ29scyIsImNvbGxlY3Rpb25zRm9yIiwicmVzb2x2ZUNvbGxlY3Rpb24iLCJhcmciLCJJbnRlcm5hbEVycm9yIiwicHJpdmF0ZURlZmF1bHRzIiwiYXNzaWduIiwic2hhcmVkRGVmYXVsdHMiLCJtaXJyb3JNZXRhIiwibWlycm9yZWRBdCIsInByaXZhdGVzIiwiZmxhdCIsInJlc29sdmVkIiwicmVzb2x2ZXIiLCJzb21lIiwiaW5jbHVkZXMiLCJzaGFyZWQiLCJ3cml0ZUNvbGxlY3Rpb25zIiwiY29scyIsImZpbGVOYW1lIiwid3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyIsImRvY3MiLCJGYWJyaWNDbGllbnRSZXBvc2l0b3J5IiwiUmVwb3NpdG9yeSIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImNsYXp6Iiwic3VwZXIiLCJ0aGlzIiwiX292ZXJyaWRlcyIsImlnbm9yZVZhbGlkYXRpb24iLCJpZ25vcmVIYW5kbGVycyIsImFsbG93UmF3U3RhdGVtZW50cyIsImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXMiLCJmb3JjZVByZXBhcmVDb21wbGV4UXVlcmllcyIsImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlIiwicmVidWlsZFdpdGhUcmFuc2llbnQiLCJvdmVycmlkZSIsImZsYWdzIiwiZm9yIiwiT2JzZXJ2ZXJIYW5kbGVyIiwicGFnaW5hdGVCeSIsImtleSIsIm9yZGVyIiwicmVmIiwib2Zmc2V0IiwibGltaXQiLCJhcmdzIiwibG9nIiwiY3R4QXJncyIsImxvZ0N0eCIsIlByZXBhcmVkU3RhdGVtZW50S2V5cyIsIlBBR0VfQlkiLCJ2ZXJib3NlIiwidGFibGVOYW1lIiwiY2xhc3MiLCJzdGF0ZW1lbnQiLCJib29rbWFyayIsImxpc3RCeSIsIkxJU1RfQlkiLCJmaW5kQnkiLCJ2YWx1ZSIsIkZJTkRfQlkiLCJmaW5kT25lQnkiLCJGSU5EX09ORV9CWSIsImZpbmQiLCJPcmRlckRpcmVjdGlvbiIsIkFTQyIsIkZJTkQiLCJwYWdlIiwiZGlyZWN0aW9uIiwiUEFHRSIsImN0eCIsIlBlcnNpc3RlbmNlS2V5cyIsIlNUQVRFTUVOVCIsImNhbGxBcmdzIiwic2xpY2UiLCJwYXJzZSIsImRlY29kZSIsImV2YWx1YXRlVHJhbnNhY3Rpb24iLCJBcnJheSIsImlzQXJyYXkiLCJyIiwiQ291Y2hEQktleXMiLCJUQUJMRSIsIlBhZ2luYXRvciIsImlzU2VyaWFsaXplZFBhZ2UiLCJkYXRhIiwiZCIsImNvdW50T2YiLCJDT1VOVF9PRiIsInN0bXRBcmdzIiwibWF4T2YiLCJNQVhfT0YiLCJtaW5PZiIsIk1JTl9PRiIsImF2Z09mIiwiQVZHX09GIiwic3VtT2YiLCJTVU1fT0YiLCJkaXN0aW5jdE9mIiwiRElTVElOQ1RfT0YiLCJncm91cE9mIiwiR1JPVVBfT0YiLCJoZWFsdGhjaGVjayIsImNyZWF0ZSIsIm1vZGVsIiwiZGVidWciLCJlbnN1cmVMZWdhY3lNaXJyb3JGbGFnIiwicHJlcGFyZWQiLCJwcmVwYXJlIiwicmVjb3JkIiwiaWQiLCJ0cmFuc2llbnQiLCJyZXZlcnQiLCJ1cGRhdGUiLCJjcmVhdGVBbGxQcmVmaXgiLCJtb2RlbHMiLCJPcGVyYXRpb25LZXlzIiwiQ1JFQVRFIiwiZ2V0IiwiaWdub3JlVmFsaWRhdGUiLCJQcm9taXNlIiwiYWxsIiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIk9OIiwiaWdub3JlZFByb3BzIiwiZXJyb3JzIiwiaGFzRXJyb3JzIiwiZXJyb3JNZXNzYWdlcyIsInJlZHVjZUVycm9yc1RvUHJpbnQiLCJWYWxpZGF0aW9uRXJyb3IiLCJjcmVhdGVBbGwiLCJpZHMiLCJwYXlsb2FkcyIsInRyYW5zaWVudHMiLCJjcmVhdGVkIiwiaSIsInJlYWRBbGwiLCJrZXlzIiwicmVjb3JkcyIsInVwZGF0ZUFsbCIsInVwZGF0ZWQiLCJ1IiwiYWNjdW11bGF0ZSIsImxlZ2FjeSIsIkVSQzIwVG9rZW4iLCJCYXNlTW9kZWwiLCJfX2RlY29yYXRlIiwicGsiLCJ0eXBlIiwiU3RyaW5nIiwicHJvdG90eXBlIiwiY29sdW1uIiwicmVxdWlyZWQiLCJ0YWJsZSIsIkVSQzIwV2FsbGV0IiwiQWxsb3dhbmNlIiwiQ2xpZW50U2VyaWFsaXplciIsIkpTT05TZXJpYWxpemVyIiwicHJlU2VyaWFsaXplIiwibW9kZWxOYW1lIiwidG9TZXJpYWxpemUiLCJtZXRhZGF0YSIsIk1ldGFkYXRhIiwiU2VyaWFsaXphdGlvbkVycm9yIiwiTW9kZWxLZXlzIiwiQU5DSE9SIiwiZGVzZXJpYWxpemUiLCJzdHIiLCJkZXNlcmlhbGl6YXRpb24iLCJjbGFzc05hbWUiLCJFcnJvciIsImJ1aWxkIiwic2VyaWFsaXplIiwiRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5Iiwic2VyaWFsaXplciIsImRlY29kZXIiLCJUZXh0RGVjb2RlciIsInVwZGF0ZU9ic2VydmVycyIsImV2ZW50Iiwib2JzZXJ2ZXJIYW5kbGVyIiwiY291bnQiLCJwYXJzZWRJZCIsIlNlcXVlbmNlIiwicGFyc2VWYWx1ZSIsInNlcXVlbmNlRm9yIiwidG9rZW5OYW1lIiwic3ltYm9sIiwiZGVjaW1hbHMiLCJOdW1iZXIiLCJ0b3RhbFN1cHBseSIsInRvdGFsIiwiYmFsYW5jZU9mIiwib3duZXIiLCJiYWxhbmNlIiwidHJhbnNmZXIiLCJ0byIsInRyYW5zZmVycmVkIiwic3VibWl0VHJhbnNhY3Rpb24iLCJ0b1N0cmluZyIsInRyYW5zZmVyRnJvbSIsImZyb20iLCJjb250ZXh0QXJncyIsIkNvbnRleHQiLCJhcHByb3ZlIiwic3BlbmRlciIsImFwcHJvdmVkIiwiYWxsb3dhbmNlIiwiaW5pdGlhbGl6ZSIsInRva2VuIiwiaW5pdGlsaWF6ZWQiLCJjaGVja0luaXRpYWxpemVkIiwibWludCIsImFtb3VudCIsImJ1cm4iLCJidXJuRnJvbSIsImFjY291bnQiLCJjbGllbnRBY2NvdW50QmFsYW5jZSIsInNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSIsImNsaWVudEFjY291bnRJRCIsImV4dHJhY3RJZHMiLCJjb21wb3NlZCIsInBrUHJvcHMiLCJleHRyYWN0SWQiLCJjb21wb3NlQXR0cmlidXRlVmFsdWUiLCJJZGVudGl0eUNyZWRlbnRpYWxzIiwiZGVzY3JpcHRpb24iLCJGYWJyaWNNb2RlbEtleXMiLCJJZGVudGl0eVR5cGUiLCJGYWJyaWNGbGF2b3VyIiwiSWRlbnRpdHkiLCJYNTA5Iiwib25lVG9PbmUiLCJDYXNjYWRlIiwiQ0FTQ0FERSIsImRlbGV0ZSIsIkNvcmVVdGlscyIsImxvZ2dlciIsIk1pbmlMb2dnZXIiLCJjb250ZW50T2ZMb2FkRmlsZSIsImNvbnRlbnRPclBhdGgiLCJmaWxlUmVhZGVyIiwiVWludDhBcnJheSIsIm1hdGNoIiwicmVhZEZpbGUiLCJwcm9taXNlcyIsIm5vcm1hbGl6ZUltcG9ydCIsImltcG9ydCIsImdldENBVXNlciIsInVzZXJOYW1lIiwicHJpdmF0ZUtleSIsImNlcnRpZmljYXRlIiwib3B0aW9ucyIsInN0cmluZ0Zvcm1hdCIsInVzZXIiLCJVc2VyIiwiY29uZmlnIiwiaHNtIiwic29mdHdhcmUiLCJsaWIiLCJsaWJyYXJ5Iiwic2xvdCIsImxhYmVsIiwidG9rZW5MYWJlbCIsInBpbiIsImNyeXB0b1N1aXRlIiwiZ2V0Q3J5cHRvU3VpdGUiLCJzZXRDcnlwdG9TdWl0ZSIsImVucm9sbG1lbnRLZXkiLCJnZXRIU01FbnJvbGxtZW50S2V5IiwiZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5Iiwic2V0RW5yb2xsbWVudCIsIm5ld0NyeXB0b1N1aXRlIiwiY3JlYXRlS2V5RnJvbVJhdyIsInNraSIsImtleUlkSGV4IiwidHJpbSIsIkJ1ZmZlciIsImdldENlcnRpZmljYXRlU0tJIiwiZ2V0S2V5IiwiaXNQcml2YXRlIiwieDUwOSIsIlg1MDlDZXJ0aWZpY2F0ZSIsImp3ayIsInB1YmxpY0tleSIsImV4cG9ydCIsImZvcm1hdCIsInByZWZpeCIsIngiLCJ5IiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsImNvbmNhdCIsImRpZ2VzdCIsImdldElkZW50aXR5IiwiY2VydERpcmVjdG9yeVBhdGgiLCJpZGVudGl0eUZpbGVSZWFkZXIiLCJjZXJ0UGF0aCIsImdldEZpcnN0RGlyRmlsZU5hbWUiLCJjcmVkZW50aWFscyIsImRpclBhdGgiLCJyZWFkZGlyIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQiLCJnZXRGaWxlQ29udGVudCIsImdldFNpZ25lciIsImtleURpcmVjdG9yeVBhdGgiLCJzaWduZXJGaWxlUmVhZGVyIiwia2V5UGF0aCIsInByaXZhdGVLZXlQZW0iLCJleHRyYWN0UHJpdmF0ZUtleSIsImdldE93blByb3BlcnR5U3ltYm9scyIsImsiLCJzaWduZXJzIiwibmV3UHJpdmF0ZUtleVNpZ25lciIsInBlbSIsImxpYk5hbWUiLCJzdWJ0bGUiLCJnbG9iYWxUaGlzIiwid2luZG93IiwiQ3J5cHRvIiwid2ViY3J5cHRvIiwic3RyMmFiIiwiYnVmIiwiQXJyYXlCdWZmZXIiLCJidWZWaWV3Iiwic3RyTGVuIiwiY2hhckNvZGVBdCIsInJlcGxhY2VBbGwiLCJkZWNvZGVkIiwiYmluYXJ5RGVyIiwiaW1wb3J0S2V5IiwibmFtZWRDdXJ2ZSIsImdldEFraUFuZFNlcmlhbEZyb21DZXJ0IiwiY2VydCIsIng1MDlDZXJ0aWZpY2F0ZSIsIlg1MDlDZXJ0IiwiYWtpRXh0IiwiZXh0ZW5zaW9ucyIsImFraSIsInRvVXBwZXJDYXNlIiwic3RhcnRzV2l0aCIsInNlcmlhbCIsInNlcmlhbE51bWJlciIsImNyeXB0b1Byb3ZpZGVyIiwic2V0IiwiQkFTRV9BTFBIQUJFVCIsIkNSWVBUTyIsIkJhc2VFbmNvZGVyIiwiYWxwaGFiZXQiLCJiYXNlTWFwIiwiaiIsImNoYXJBdCIsInhjIiwiYmFzZSIsImxlYWRlciIsImZhY3RvciIsIk1hdGgiLCJpRmFjdG9yIiwiZW5jb2RlIiwic291cmNlIiwiaXNWaWV3IiwiYnVmZmVyIiwiYnl0ZU9mZnNldCIsImJ5dGVMZW5ndGgiLCJ6ZXJvZXMiLCJwYmVnaW4iLCJwZW5kIiwic2l6ZSIsImI1OCIsImNhcnJ5IiwiaXQxIiwiaXQyIiwicmVwZWF0IiwiZGVjb2RlVW5zYWZlIiwicHN6IiwiYjI1NiIsIml0MyIsIml0NCIsInZjaCIsIkNyeXB0b1V0aWxzIiwiYjU4ZW5jb2RlciIsIkJBU0U1OCIsImZhYnJpY0lkRnJvbUNlcnRpZmljYXRlIiwic3ViamVjdCIsImlzc3VlciIsInN0cmluZ1RvQXJyYXlCdWZmZXIiLCJleHRyYWN0S2V5IiwidXNhZ2VzIiwiUmVnRXhwIiwiZXh0cmFjdFB1YmxpY0tleSIsInNpZ24iLCJidWZmIiwiaGFzaCIsImIiLCJwYWRTdGFydCIsInZlcmlmeSIsInNpZ25hdHVyZSIsImVuY3J5cHQiLCJnZXRTdWJ0bGVDcnlwdG8iLCJpc0Jyb3dzZXIiLCJkZWNyeXB0IiwiZ2V0TWFzdGVyIiwidGV4dEVuY29kZXIiLCJUZXh0RW5jb2RlciIsImdlbkdlbmVzaXMiLCJyYW5kb21VVUlEIiwiaW1wb3J0ZWRLZXkiLCJLRVlfQUxHT1JZVEhNIiwiaXYiLCJnZXREZXJpdmF0aW9uS2V5Iiwic2FsdCIsInNhbHRCdWZmZXIiLCJzYWx0SGFzaGVkIiwicGFyYW1zIiwiSEFTSCIsIml0ZXJhdGlvbnMiLCJJVEVSQVRJT05TIiwiZGVyaXZhdGlvbiIsImRlcml2ZUJpdHMiLCJLRVlMRU5HVEgiLCJpdmxlbiIsImtleWxlbiIsImRlcml2ZWRLZXkiLCJpbXBvcnRlZEVuY3J5cHRpb25LZXkiLCJBTEdPUllUSE0iLCJlbmNyeXB0UGluIiwidGV4dCIsImtleU9iamVjdCIsInRleHRCdWZmZXIiLCJlbmNyeXB0ZWRUZXh0IiwiZGVjcnlwdFBpbiIsInRleHREZWNvZGVyIiwiZGVjcnlwdGVkVGV4dCIsIk92ZXJmbG93RXJyb3IiLCJtc2ciLCJCYWxhbmNlRXJyb3IiLCJBbGxvd2FuY2VFcnJvciIsIlJlZ2lzdHJhdGlvbkVycm9yIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiTWlzc2luZ0NvbnRleHRFcnJvciIsIlVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIiwiQmFzZUVycm9yIiwiTm90SW5pdGlhbGl6ZWRFcnJvciIsIk1pc3NpbmdQS0NTUzExTGliIiwiRW5kb3JzZW1lbnRFcnJvciIsIm1lc3NhZ2UiLCJNdmNjUmVhZENvbmZsaWN0RXJyb3IiLCJQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IiLCJFbmRvcnNlbWVudFBvbGljeUVycm9yIiwiVHJhbnNhY3Rpb25MaW1pdHNFcnJvciIsImNvZGUiLCJUcmFuc2FjdGlvblRpbWVvdXRFcnJvciIsIlRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yIiwiSEZDQUlkZW50aXR5VHlwZSIsIkhGQ0FJZGVudGl0eUF0dHJpYnV0ZXMiLCJGYWJyaWNFbnJvbGxtZW50U2VydmljZSIsIkxvZ2dlZENsYXNzIiwiY2FDb25maWciLCJjYU5hbWUiLCJjYUNlcnQiLCJjYUtleSIsInVybCIsIkNBIiwiY2EiLCJ0bHMiLCJ0cnVzdGVkUm9vdHMiLCJyb290IiwiRmFicmljQ0FTZXJ2aWNlcyIsIkNsaWVudCIsImNsaWVudCIsIkNlcnRpZmljYXRlIiwiY2VydGlmaWNhdGVTZXJ2aWNlIiwibmV3Q2VydGlmaWNhdGVTZXJ2aWNlIiwiQWZmaWxpYXRpb25zIiwiYWZmaWxpYXRpb25TZXJ2aWNlIiwibmV3QWZmaWxpYXRpb25TZXJ2aWNlIiwiSWRlbnRpdGllcyIsImlkZW50aXR5U2VydmljZSIsIm5ld0lkZW50aXR5U2VydmljZSIsImdldENlcnRpZmljYXRlcyIsInJlcXVlc3QiLCJkb01hcCIsInJlc3BvbnNlIiwiY2VydHMiLCJQRU0iLCJnZXRJZGVudGl0aWVzIiwiaWRlbnRpdGllc1NlcnZpY2UiLCJnZXRBbGwiLCJpZGVudGl0aWVzIiwicGFyc2VFcnJvciIsInJlZ2V4cCIsImV4ZWMiLCJDb25mbGljdEVycm9yIiwiZ2V0QWZmaWxpYXRpb25zIiwiYSIsInJlYWQiLCJlbnJvbGxtZW50SWQiLCJnZXRPbmUiLCJOb3RGb3VuZEVycm9yIiwic3VjY2VzcyIsInJlZ2lzdGVyIiwiaXNTdXBlclVzZXIiLCJhZmZpbGlhdGlvbiIsInVzZXJSb2xlIiwiYXR0cnMiLCJtYXhFbnJvbGxtZW50cyIsInJlZ2lzdHJhdGlvbiIsInBhc3N3b3JkIiwicHJvcHMiLCJlbnJvbGxtZW50SUQiLCJlbnJvbGxtZW50U2VjcmV0IiwiaW5mbyIsImlkZW50aXR5RnJvbUVucm9sbG1lbnQiLCJlbnJvbGxtZW50Iiwicm9vdENlcnRpZmljYXRlIiwiTG9nZ2luZyIsImNsaWVudElkIiwibm93IiwiRGF0ZSIsInRvQnl0ZXMiLCJjcmVhdGVkT24iLCJ1cGRhdGVkT24iLCJlbnJvbGwiLCJpZGVudGl0eSIsInJlZ2lzdGVyQW5kRW5yb2xsIiwicmV2b2tlIiwicmVhc29uIiwiUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIiLCJlcnJzIiwicm9sZSIsInNldEFmZmlsaWF0aW9uIiwiYWRkQXR0ciIsImF0dHIiLCJzZXRBdHRycyIsInNldEVucm9sbG1lbnRJRCIsInNldEVucm9sbG1lbnRTZWNyZXQiLCJzZXRNYXhFbnJvbGxtZW50cyIsInNldFJvbGUiLCJtaW5sZW5ndGgiLCJtaW4iLCJFUkMyMEV2ZW50cyIsIkZhYnJpY0Jhc2VNb2RlbCIsImNyZWF0ZWRBdCIsInVwZGF0ZWRBdCIsInZlcnNpb24iLCJ1c2VzIiwiRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCIsImNyZWF0ZWRCeSIsInVwZGF0ZWRCeSIsImlzU2hhcmVkIiwic2VncmVnYXRlIiwiaXNUcmFuc2llbnQiLCJkZWNvcmF0ZWRQcm9wZXJ0aWVzIiwiZ2V0QXR0cmlidXRlcyIsInRyYW5zaWVudFByb3BzIiwiREJLZXlzIiwiVFJBTlNJRU5UIiwicHJpdmF0ZVByb3BlcnRpZXMiLCJQUklWQVRFIiwic2hhcmVkUHJvcGVydGllcyIsIlNIQVJFRCIsInB1YmxpYyIsInRyYW5zaWVudEtleXMiLCJwcml2YXRlS2V5cyIsInNoYXJlZEtleXMiLCJpc1B1YmxpYyIsImJpbmQiLCJtaXJyb3JlZCIsIkZBQlJJQyIsIk1JUlJPUiIsIm93bmVyT2YiLCJtZXRhIiwiT1dORURfQlkiLCJzaGFyZWRLZXkiLCJjb25zdHIiLCJwcml2YXRlTWV0YSIsInNoYXJlZE1ldGEiLCJjb2xsZWN0aW9ucyIsImV4dHJhY3RNc3BJZCIsImdldE1TUElEIiwiT3duZXIiLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJvcmlnaW5hbE1ldGhvZCIsImFjb3VudElkIiwiY2xpZW50SWRlbnRpdHkiLCJnZXRJRCIsInNlbGVjdCIsInRva2VucyIsImV4ZWN1dGUiLCJhcHBseSIsIm93bmVkQnlPbkNyZWF0ZSIsImNvbnRleHQiLCJzdHViIiwiY3JlYXRvciIsImdldENyZWF0b3IiLCJtc3BpZCIsInNldE93bmVkQnlLZXlWYWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwib3duZWRCeSIsIm9iaiIsImF0dHJpYnV0ZSIsImdlbmVyYXRlZCIsInJlYWRvbmx5Iiwib25DcmVhdGUiLCJwcm9wTWV0YWRhdGEiLCJEZWNvcmF0aW9uIiwiZGVmaW5lIiwiZGVjb3JhdG9yIiwidHJhbnNhY3Rpb25JZE9uQ3JlYXRlIiwiZ2V0VHhJRCIsInRyYW5zYWN0aW9uSWQiLCJvblVwZGF0ZSIsIlRSQU5TQUNUSU9OX0lEIiwiZXZhbE1pcnJvck1ldGFkYXRhIiwiY3JlYXRlTWlycm9ySGFuZGxlciIsImZhYnJpY0N0eCIsInNvdXJjZU1vZGVsIiwicHV0IiwicmVwbyIsIm1pcnJvckNvbGxlY3Rpb24iLCJ1cGRhdGVNaXJyb3JIYW5kbGVyIiwiYXBwbHlVcGRhdGVWYWxpZGF0aW9uIiwibWVyZ2VGb3JVcGRhdGUiLCJkZWxldGVNaXJyb3JIYW5kbGVyIiwicGtQcm9wIiwic2VncmVnYXRlZCIsIm1pcnJvcldyaXRlR3VhcmQiLCJtc3AiLCJjb25kaXRpb24iLCJyZWFkTWlycm9ySGFuZGxlciIsIm1hdGNoZXMiLCJyZWFkRnJvbSIsIm1zcElkT3JDb25kaXRpb24iLCJpc0NvbmRpdGlvbk9ubHkiLCJCb29sZWFuIiwiY29uZCIsIm9uUmVhZCIsInByaW9yaXR5Iiwib25EZWxldGUiLCJNb2RlbENvbGxlY3Rpb24iLCJvcmdOYW1lIiwidG9QYXNjYWxDYXNlIiwiTmFtZXNwYWNlQ29sbGVjdGlvbiIsIm5hbWVzcGFjZSIsIkltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb24iLCJTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSIsImFwcGx5U2VncmVnYXRpb25GbGFncyIsImlzRnVsbHlTZWdyZWdhdGVkIiwiaGFzUHVibGljUHJvcGVydGllcyIsIm1hcmtGdWxseVNlZ3JlZ2F0ZWQiLCJhcHBseU1pcnJvckZsYWdzIiwiYXR0cmlidXRlcyIsInRyYW5zaWVudE1ldGEiLCJleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIiwiZGF0YUFycmF5IiwiY29sbGVjdGlvblJlc29sdmVyIiwic2VxTmFtZSIsInNlcXVlbmNlTmFtZSIsInNldFNlcXVlbmNlU2VncmVnYXRpb24iLCJzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlIiwia2V5QXJyYXkiLCJfayIsIlVuc3VwcG9ydGVkRXJyb3IiLCJrZXlTdHJpbmdzIiwid3JpdGVUbyIsInNlZ3JlZ2F0ZWREYXRhT25SZWFkIiwic2VncmVnYXRlZERhdGFPblVwZGF0ZSIsIm9sZE1vZGVsIiwic2VncmVnYXRlZERhdGFPbkRlbGV0ZSIsImlubmVyU2VncmVnYXRlZCIsInNlZ3JlZ2F0ZWREZWMiLCJTZXQiLCJhZGQiLCJjb25zdHJNZXRhIiwiY29uc3RyQ29sbGVjdGlvbnMiLCJ1cGRhdGVkVHJhbnNpZW50TWV0YSIsImRlY3MiLCJwcm9wZXJ0aWVzIiwiZ3JvdXBOYW1lIiwiZXh0cmFjdEdyb3VwTmFtZSIsImRhdGFHcm91cE5hbWUiLCJlYXJseUV4dHJhY3Rpb25NZXRhIiwiZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0IiwiZ3JvdXAiLCJwcm9wIiwib24iLCJEQk9wZXJhdGlvbnMiLCJBTEwiLCJwcml2YXRlRGF0YSIsInNoYXJlZERhdGEiLCJzb3J0S2V5c09ubHlSZWN1cnNpdmUiLCJzb3J0IiwicmVkdWNlIiwiYWNjIiwiRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJlcnJvciIsInNlbGYiLCJvIiwiY2FsbCIsInJlbGF0aW9ucyIsImdlbmVyYXRlRmFicmljRXZlbnROYW1lIiwicGFyc2VFdmVudE5hbWUiLCJwYXJ0cyIsInNwbGl0Iiwic3ViIiwic2FmZVBhcnNlSW50Iiwic3RyaW5nIiwiZGlnaXRSZWdleCIsInRlc3QiLCJwYXJzZWRpbnQiLCJwYXJzZUludCIsImlzTmFOIiwiU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJwdXRBbmNob3IiLCJwcmVTZXJpYWxpemF0aW9uIiwiRmFicmljSWRlbnRpdHlTZXJ2aWNlIiwiQ2xpZW50QmFzZWRTZXJ2aWNlIiwicm9vdENsaWVudCIsIl91c2VyIiwiY2VydGlmaWNhdGVzIiwiYWZmaWxpYXRpb25zIiwiZ2V0VXNlciIsImNmZyIsIklOSVRJQUxJWkFUSU9OIiwiZ2V0TmFtZSIsIlJFQUQiLCJ1cGRhdGVJZGVudGl0eSIsImlkZW50aXR5UmVxdWVzdCIsImNhVXNlcklkZW50aXR5IiwicmVlbnJvbGxVc2VyIiwiY3JlYXRlVXNlciIsImdldE1zcGlkIiwiZW5yb2xsbWVudEF0dHJzIiwib3B0aW9uYWwiLCJyZWVucm9sbCIsInJlbmV3ZWRJZGVudGl0eSIsInJldm9rZU9wdGlvbnMiLCJyZXZva2VSZXF1ZXN0IiwiQ0FfUk9MRSIsIkRlZmF1bHRGYWJyaWNDbGllbnRGbGFncyIsImV2YWx1YXRlVGltZW91dCIsImVuZG9yc2VUaW1lb3V0Iiwic3VibWl0VGltZW91dCIsImNvbW1pdFRpbWVvdXQiLCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3MiLCJhbGxvd0dhdGV3YXlPdmVycmlkZSIsImVuY3J5cHRUcmFuc2llbnQiLCJzeW50aGV0aWNFdmVudHMiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwidG9Mb3dlckNhc2UiLCJvcmRlckJ5U2VsZWN0b3JzIiwiT1JERVJfQlkiLCJ0b0NhbWVsQ2FzZSIsInByb2Nlc3NSZWNvcmQiLCJwa0F0dHIiLCJzZXF1ZW5jZVR5cGUiLCJJRCIsImtleUFyZ3MiLCJTRVBBUkFUT1IiLCJyYXciLCJyYXdJbnB1dCIsImFnZ3JlZ2F0b3IiLCJhZ2dyZWdhdGVJbmZvIiwiYWdncmVnYXRlIiwiZXhlY3V0ZUFnZ3JlZ2F0ZSIsInJlc3VsdHMiLCJhZ2dyZWdhdGVRdWVyeSIsImJ1aWxkQWdncmVnYXRlUXVlcnkiLCJzZWxlY3RvcnMiLCJxdWVyeSIsInNlbGVjdG9yIiwiZmllbGRzIiwicGFyc2VDb25kaXRpb24iLCJDb25kaXRpb24iLCJhbmQiLCJlcSIsInNlbGVjdG9yS2V5cyIsIkNvdWNoREJHcm91cE9wZXJhdG9yIiwiaW5kZXhPZiIsInZhbCIsIk9SIiwicyIsImVudHJpZXMiLCJ3YXJuIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudFBhZ2luYXRvciIsInJhd1N0YXRlbWVudCIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsInBvcCIsInRvT3ZlcnJpZGVzIiwibmV3Q3R4IiwicGFyZW50Q29udGV4dCIsImNoaWxkQ29udGV4dHMiLCJnZXRPclVuZGVmaW5lZCIsImN1cnJlbnRPcCIsImN1cnJlbnRNb2RlbCIsInJlcG9zaXRvcnkiLCJjcmVhdGVQcmVmaXgiLCJ1cGRhdGVBbGxQcmVmaXgiLCJzaGlmdCIsImhhc1RyYW5zaWVudCIsIm5lZWRzRnVsbFBheWxvYWQiLCJzaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24iLCJ0cmFuc2llbnRQYXlsb2FkIiwiQnVsa0NydWRPcGVyYXRpb25LZXlzIiwiQ1JFQVRFX0FMTCIsImdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMiLCJyZXMiLCJzaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZSIsIlJFQURfQUxMIiwiVVBEQVRFX0FMTCIsImRlbGV0ZUFsbCIsInNob3VsZEh5ZHJhdGUiLCJERUxFVEVfQUxMIiwiTUVUQURBVEEiLCJtaXJyb3JNc3AiLCJtc3BzIiwibWVyZ2VkIiwiZW5kb3JzaW5nT3JncyIsImVuZG9yc2luZ09yZ2FuaXphdGlvbnMiLCJzaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudCIsInYiLCJjaGlsZFJlYnVpbGQiLCJnZXRGcm9tQ2hpbGRyZW4iLCJyZXNvbHZlZE9wIiwicmVzb2x2ZU9wZXJhdGlvbiIsImhhc0lkIiwiZGlyZWN0IiwiZGVzZXJpYWxpemVkIiwidXBkYXRlUHJlZml4IiwiVVBEQVRFIiwiREVMRVRFIiwiZG9jc09ubHkiLCJ0cmFuc2FjdGlvblJlc3VsdCIsInBhcnNlUmVjb3JkIiwiaXNNb2RlbCIsImVsIiwiZ2V0Q2xpZW50IiwiX2NsaWVudCIsIkdhdGV3YXkiLCJnZXRHYXRld2F5IiwiZ2V0Q29udHJhY3ROYW1lIiwiQ29udHJhY3QiLCJjb250cmFjdE5hbWUiLCJnZXRDb250cmFjdCIsInRyYW5zYWN0aW9uIiwiYXBpIiwic3VibWl0IiwidHJhbnNpZW50RGF0YSIsImdhdGV3YXkiLCJjb250cmFjdCIsImV2YWx1YXRlIiwicHJvcG9zYWxPcHRpb25zIiwiYXJndW1lbnRzIiwiY2xvc2UiLCJzaG91bGRVc2VMZWdhY3lHYXRld2F5IiwicHJlcGFyZUxlZ2FjeUFyZ3MiLCJidWlsZExlZ2FjeVRyYW5zaWVudCIsInJlc29sdmVMZWdhY3lNc3BDb3VudCIsImNvbmZpZ3VyZWQiLCJsZWdhY3lNc3BDb3VudCIsImlzRmluaXRlIiwiZmxvb3IiLCJwaWNrTGVnYWN5Q2FuZGlkYXRlcyIsImNhbmRpZGF0ZXMiLCJhdmFpbGFibGUiLCJwaWNrZWQiLCJpZHgiLCJyYW5kb20iLCJzZWxlY3Rpb24iLCJzcGxpY2UiLCJidWlsZExlZ2FjeVBlZXJDb25maWdzIiwicGVlcnMiLCJwZWVyRW5kcG9pbnQiLCJwZWVySG9zdEFsaWFzIiwidGxzQ2VydCIsImVuZG9yc2VycyIsIm9yZyIsImV4dHJhcyIsIm1zcE1hcCIsImxlZ2FjeUNvdW50Iiwic2VsZWN0aW9ucyIsImNob2ljZSIsImVuZHBvaW50Iiwic3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzIiwiZmNuIiwidHJhbnNpZW50TWFwIiwicGVlckNvbmZpZ3MiLCJub3JtYWxpemVMZWdhY3lQZWVycyIsImlkZW50aXR5TWF0ZXJpYWwiLCJyZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCIsIndhbGxldCIsIldhbGxldHMiLCJuZXdJbk1lbW9yeVdhbGxldCIsImlkZW50aXR5TGFiZWwiLCJjb25uZWN0aW9uUHJvZmlsZSIsImJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUiLCJMZWdhY3lHYXRld2F5IiwiY29ubmVjdCIsImRpc2NvdmVyeSIsImVuYWJsZWQiLCJhc0xvY2FsaG9zdCIsInNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdCIsInRsc0luZm8iLCJuZXR3b3JrIiwiZ2V0TmV0d29yayIsImNoYW5uZWwiLCJjaGFpbmNvZGVOYW1lIiwiY3JlYXRlVHJhbnNhY3Rpb24iLCJzZXRUcmFuc2llbnQiLCJwZWVyIiwiZ2V0Q2hhbm5lbCIsImdldEVuZG9yc2VyIiwiZW5kb3JzZXIiLCJzZXRFbmRvcnNpbmdQZWVycyIsImRpc2Nvbm5lY3QiLCJkZWR1cGVkIiwiTWFwIiwiYWRkUGVlciIsImhhcyIsInJlYWRQZW1JbnB1dCIsImNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIiwia2V5Q2VydE9yRGlyZWN0b3J5UGF0aCIsInBlZXJFbnRyaWVzIiwiY2hhbm5lbFBlZXJzIiwib3JncyIsInRsc1BlbSIsImhvc3RuYW1lIiwiZXh0cmFjdEhvc3QiLCJlbnN1cmVHcnBjVXJsIiwidGxzQ0FDZXJ0cyIsImdycGNPcHRpb25zIiwiaG9zdG5hbWVPdmVycmlkZSIsImVuZG9yc2luZ1BlZXIiLCJjaGFpbmNvZGVRdWVyeSIsImxlZGdlclF1ZXJ5IiwiZXZlbnRTb3VyY2UiLCJvcmdhbml6YXRpb24iLCJvcmdhbml6YXRpb25zIiwib3JkZXJlcnMiLCJjaGFubmVscyIsImV2ZXJ5IiwiaXNMb2NhbEVuZHBvaW50IiwiaG9zdCIsInNhbml0aXplZCIsImlzQnVmZmVyIiwidHJpbW1lZCIsInN0YXRzIiwic3RhdCIsImNhdGNoIiwiaXNEaXJlY3RvcnkiLCJyZWFkRnNGaWxlIiwiZXJyIiwibGVnYWN5QXJncyIsInNodXRkb3duIiwiY2hhbm5lbE5hbWUiLCJnZXRDb25uZWN0aW9uIiwicGF0aE9yQ2VydCIsInJlYWRGaWxlU3luYyIsInRsc0NyZWRlbnRpYWxzIiwiZ3JwYyIsImNyZWF0ZVNzbCIsInNpemVMaW1pdCIsInNpZ25lciIsImV2YWx1YXRlT3B0aW9ucyIsImRlYWRsaW5lIiwiZW5kb3JzZU9wdGlvbnMiLCJzdWJtaXRPcHRpb25zIiwiY29tbWl0U3RhdHVzT3B0aW9ucyIsIlByb3h5IiwidGhpc0FyZyIsImFyZ0FycmF5IiwiUmVmbGVjdCIsIkRpc3BhdGNoIiwiR2F0ZXdheUVycm9yIiwiZGV0YWlscyIsIkVuZG9yc2VFcnJvciIsIkJhZFJlcXVlc3RFcnJvciIsIlBhZ2luZ0Vycm9yIiwiTWlncmF0aW9uRXJyb3IiLCJPYnNlcnZlckVycm9yIiwiRm9yYmlkZGVuRXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJmaW5hbCIsIkQiLCJfYSIsImRlY29yYXRpb24iLCJzZXRDdXJyZW50IiwiRmFicmljQ2xpZW50RGlzcGF0Y2giLCJsb2dnZWRBcmdzIiwiU0hVVERPV04iLCJsaXN0ZW5pbmdTdGFjayIsInBhcnNlUGF5bG9hZCIsImpzb25CeXRlcyIsImpzb24iLCJvYnNlcnZlIiwib2JzZXJ2ZXIiLCJ1bk9ic2VydmUiLCJyZWZyZXNoIiwiaGFuZGxlRXZlbnRzIiwiY3R4QXJnIiwiY29ycmVsYXRpb25JZCIsImV2dCIsImV2ZW50TmFtZSIsIm1zcEV2ZW50T25seSIsInRhcmdldE1vZGVsIiwibW9kZWxSZWYiLCJvYnNlcnZlckFyZ3MiLCJnZXRDaGFpbmNvZGVFdmVudHMiLCJ0b1dyYXAiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwcm90byIsImdldFByb3RvdHlwZU9mIiwiYnVsa1RvU2luZ2xlIiwicmVzdWx0QXJncyIsIlZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJyZWdpc3RlckxpYnJhcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFXQSxTQUFTQSx5QkFBeUJDO1FBRWhDLE1BQU1DLEtBQUtDLFFBQVE7UUFFbkIsTUFBTUMsT0FBT0QsUUFBUTtRQUNyQixNQUFNRSxVQUFrQkQsS0FBS0MsUUFBUUo7UUFDckMsSUFBSUMsR0FBR0ksV0FBV0QsVUFBVTtZQUMxQixPQUFPO0FBQ1Q7UUFDQUwseUJBQXlCSztRQUN6QkgsR0FBR0ssVUFBVUY7QUFDZjtJQUVNLFNBQVVHLHFCQUNkQztRQUVBLE9BQU9DLFdBQUFBLGdCQUFnQixFQUFDRDtBQUMxQjtJQUVNLFNBQVVFLHdCQUNkRixHQUNBRztRQUVBLE1BQU1DLFFBQVFDLFdBQUFBLGNBQWMsRUFBQ0w7UUFDN0IsTUFBTU0sVUFBNENILFNBQVMsQ0FBQTtRQUMzREMsTUFBTUcsUUFBU0M7WUFDYkYsUUFBUUUsSUFBSUMsT0FBT0Q7O1FBRXJCLE9BQU9KO0FBQ1Q7SUFFTSxTQUFVTSxjQUFjQztRQUU1QixNQUFNaEIsT0FBT0QsUUFBUTtRQUVyQixNQUFNa0IsWUFBVWxCLFFBQVFDLEtBQUtrQixLQUFLQyxRQUFRQyxPQUFPSixLQUFLSyxZQUFZTCxLQUFLTTtRQUV2RSxNQUFNQyxTQUFTQyxPQUFPRCxPQUFPTixXQUFTUSxPQUFRQztZQUM1QztnQkFDRSxNQUFNckIsSUFBSSxJQUFLcUI7Z0JBQ2YsT0FBT3JCLGFBQWFzQixvQkFBQUE7QUFFdEIsY0FBRSxPQUFPRDtnQkFDUCxPQUFPO0FBQ1Q7O1FBRUYsT0FBT0g7QUFDVDtJQUVPSyxlQUFlQyxvQkFDakJDO1FBR0gsTUFBTWhDLEtBQUtDLFFBQVE7UUFFbkIsTUFBTWdDLFNBQWtDO1FBRXhDLEtBQUssTUFBTUMsVUFBVUYsU0FBUztZQUM1QixNQUFNRyxRQUFRbkMsR0FDWG9DLFlBQVlGLFFBQVE7Z0JBQ25CRyxlQUFlO2dCQUNmQyxXQUFXO2VBRVpYLE9BQVFZLEtBQVdBLEVBQUVDLFlBQVlELEVBQUVmLEtBQUtpQixTQUFTO1lBQ3BELEtBQUssTUFBTXZCLFFBQVFpQixPQUFPO2dCQUN4QkYsT0FBT1MsUUFBUXpCLGNBQWNDO0FBQy9CO0FBQ0Y7UUFDQSxPQUFPZTtBQUNUO0lBRU0sU0FBVVUsYUFDZEMsU0FDQUMsSUFBWXhCLFFBQVFDLE9BQ3BCd0I7UUFHQSxNQUFNOUMsS0FBS0MsUUFBUTtRQUVuQixNQUFNQyxPQUFPRCxRQUFRO1FBRXJCMkMsUUFBUTlCLFFBQVNpQztZQUNmLE1BQU03QixPQUFPaEIsS0FBSzhDLFFBQ2hCOUMsS0FBS2tCLEtBQ0h5QixHQUNBLDhCQUE4QkMsYUFBYSxlQUFlQSxnQkFBZ0IsYUFBYUMsTUFBTXZCO1lBR2pHMUIseUJBQXlCb0I7WUFDekJsQixHQUFHaUQsY0FBYy9CLE1BQU1nQyxLQUFLQyxVQUFVSixPQUFPSyxXQUFXOztBQUU1RDtJQUVNLFNBQVVDLGdCQUNkQyxZQUNBVCxJQUFZeEIsUUFBUUMsT0FDcEJ3QjtRQUVBLEtBQUtRLFdBQVdDLFFBQVE7UUFFeEIsTUFBTXZELEtBQUtDLFFBQVE7UUFFbkIsTUFBTUMsT0FBT0QsUUFBUTtRQUVyQnFELFdBQVd4QyxRQUFTQztZQUNsQixNQUFNeUMsUUFBUXpDLElBQUlDLElBQUl5QyxRQUFRLGNBQWM7WUFDNUMsTUFBTXZDLE9BQU9oQixLQUFLOEMsUUFDaEI5QyxLQUFLa0IsS0FDSHlCLEdBQ0EsOEJBQThCQyxhQUFhLGVBQWVBLGdCQUFnQixpQkFBaUJVO1lBRy9GMUQseUJBQXlCb0I7WUFDekIsTUFBTXdDLFVBQVU7bUJBQUszQzs7bUJBQ2QyQyxRQUFRQztZQUNmM0QsR0FBR2lELGNBQWMvQixNQUFNZ0MsS0FBS0MsVUFBVU8sU0FBU04sV0FBVzs7QUFFOUQ7SUNyRU0sU0FBVVEsY0FDZEMsZ0JBQ0FDLFFBQ0FDLG1CQUNBQyxjQUNBQyxhQUNBQyxnQkFDQUM7UUFFQSxPQUFPO1lBQ0wzQyxNQUFNcUM7WUFDTkMsUUFBUUE7WUFDUkM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7O0FBRUo7SUFFTSxTQUFVQyxxQkFDZEMsT0FDQVIsaUJBQXlCLEdBQUdRLGdCQUM1Qk4sb0JBQTRCLEdBQzVCQyxlQUF1QixHQUN2QkMsY0FBc0IsR0FDdEJDLGlCQUEwQixNQUMxQkMsa0JBQTJCO1FBRTNCLE1BQU1HLElBQUlWLGNBQ1JDLGdCQUNBLE9BQU9RLGtCQUNQTixtQkFDQUMsY0FDQUMsYUFDQUMsZ0JBQ0FDO1FBR0ZHLEVBQUVDLG9CQUFvQjtZQUNwQkMsaUJBQWlCLE9BQU9IOztRQUUxQixPQUFPQztBQUNUO0lBRU0sU0FBVUcsb0JBQ2RDLFFBQ0FiLGdCQUNBRSxvQkFBNEIsR0FDNUJDLGVBQXVCLEdBQ3ZCQyxjQUFzQixHQUN0QkMsaUJBQTBCLE1BQzFCQyxrQkFBMkI7UUFFM0IsTUFBTUcsSUFBSVYsY0FDUkMsZ0JBQ0EsTUFBTWEsT0FBT0MsSUFBS3BFLEtBQU0sSUFBSUEsYUFBYWEsS0FBSyxTQUM5QzJDLG1CQUNBQyxjQUNBQyxhQUNBQyxnQkFDQUM7UUFFRkcsRUFBRUMsb0JBQW9CO1lBQ3BCQyxpQkFBaUIsT0FBT0UsT0FBT0MsSUFBS3BFLEtBQU0sSUFBSUEsV0FBV2EsS0FBSzs7UUFFaEUsT0FBT2tEO0FBQ1Q7SUFFT3hDLGVBQWU4QyxtQkFDcEJyRSxHQUNBbUUsUUFDQUcsWUFHSSxDQUFBLEdBQ0pDLFNBQWtCO1FBRWxCLEtBQUlDLGFBQUVBLGFBQVdDLFlBQUVBLGNBQWVuRCxvQkFBQUEsTUFBTW9ELGVBQWUxRTtRQUV2RCxTQUFTMkUsa0JBQWtCQztZQUN6QjtnQkFDRSxXQUFXQSxRQUFRLFVBQVUsT0FBT0E7Z0JBQ3BDLE9BQU9BLElBQUk1RSxHQUFHbUUsT0FBTztBQUN2QixjQUFFLE9BQU85QztnQkFDUCxNQUFNLElBQUl3RCxhQUFBQSxjQUFjeEQ7QUFDMUI7QUFDRjtRQUVBbUQsY0FBY0EsWUFBWUosSUFBSU87UUFDOUJGLGFBQWFBLFdBQVdMLElBQUlPO1FBRTVCLE1BQU1HLGtCQUFrQjNELE9BQU80RCxPQUM3QixJQUNBO1lBQ0V2QixtQkFBbUI7WUFDbkJDLGNBQWM7WUFDZEMsYUFBYTtZQUNiQyxnQkFBZ0I7WUFDaEJDLGlCQUFpQjtXQUVuQlUsV0FBV0UsZUFBZTtRQUU1QixNQUFNUSxpQkFBaUI3RCxPQUFPNEQsT0FDNUIsSUFDQTtZQUNFdkIsbUJBQW1CO1lBQ25CQyxjQUFjO1lBQ2RDLGFBQWE7WUFDYkMsZ0JBQWdCO1lBQ2hCQyxpQkFBaUI7V0FFbkJVLFdBQVdHLGNBQWM7UUFHM0IsTUFBTVEsYUFBYVYsU0FBU2pELG9CQUFBQSxNQUFNNEQsV0FBV2xGLEtBQUs2QztRQUVsRCxNQUFNc0MsV0FBV2hCLE9BQ2RDLElBQUtOLFNBQ0hVLFlBQXlCSixJQUFLOUI7WUFDN0IsT0FBTWtCLG1CQUFFQSxtQkFBaUJDLGNBQUVBLGNBQVlDLGFBQUVBLGFBQVdDLGdCQUFFQSxrQkFDcERtQjtZQUNGLE9BQU9qQixxQkFDTEMsT0FDQXhCLEdBQ0FrQixtQkFDQUMsY0FDQUMsYUFDQUMsZ0JBQ0E7WUFJTHlCO1FBRUgsSUFBSUgsY0FBY0EsV0FBV25CLE9BQU87WUFDbEMsTUFBTXVCLGtCQUNHSixXQUFXSyxhQUFhLFdBQzNCTCxXQUFXSyxXQUNYTCxXQUFXSyxTQUFTdEYsR0FBR2lGLFdBQVduQjtZQUN4QyxJQUNFdUIsYUFDQ0YsU0FBU0ksS0FDUGpELEtBQU1BLEVBQUVyQixTQUFTb0UsWUFBWS9DLEVBQUVpQixPQUFPaUMsU0FBU1AsV0FBV25CLFNBRTdEO2dCQUNBLE9BQU1OLG1CQUFFQSxtQkFBaUJDLGNBQUVBLGNBQVlDLGFBQUVBLGFBQVdDLGdCQUFFQSxrQkFDcERtQjtnQkFDRkssU0FBU2hELEtBQ1AwQixxQkFDRW9CLFdBQVduQixPQUNYdUIsVUFDQTdCLG1CQUNBQyxjQUNBQyxhQUNBQyxnQkFDQTtBQUdOO0FBQ0Y7UUFFQSxNQUFNOEIsU0FBVWhCLFdBQXdCTCxJQUFLOUI7WUFDM0MsT0FBTWtCLG1CQUNKQSxtQkFBaUJDLGNBQ2pCQSxjQUFZQyxhQUNaQSxhQUFXQyxnQkFDWEEsZ0JBQWNDLGlCQUNkQSxtQkFDRW9CO1lBQ0osT0FBT2Qsb0JBQ0xDLFFBQ0E3QixHQUNBa0IsbUJBQ0FDLGNBQ0FDLGFBQ0FDLGdCQUNBQzs7UUFJSixPQUFPO1lBQ0x1QjtZQUNBTTs7QUFFSjtJQUVNLFNBQVVDLGlCQUNkQyxNQUNBckQsSUFBWXhCLFFBQVFDLE9BQ3BCNkUsV0FBVztRQUdYLE1BQU1uRyxLQUFLQyxRQUFRO1FBRW5CLE1BQU1DLE9BQU9ELFFBQVE7UUFFckIsU0FBU0gseUJBQXlCQztZQUNoQyxNQUFNSSxVQUFrQkQsS0FBS0MsUUFBUUo7WUFDckMsSUFBSUMsR0FBR0ksV0FBV0QsVUFBVTtnQkFDMUIsT0FBTztBQUNUO1lBQ0FMLHlCQUF5Qks7WUFDekJILEdBQUdLLFVBQVVGO0FBQ2Y7UUFFQSxNQUFNZSxPQUFPaEIsS0FBSzhDLFFBQVE5QyxLQUFLa0IsS0FBS3lCLEdBQUcsY0FBY3NEO1FBQ3JEckcseUJBQXlCb0I7UUFDekJsQixHQUFHaUQsY0FBYy9CLE1BQU1nQyxLQUFLQyxVQUFVK0MsTUFBTTlDLFdBQVc7QUFDekQ7SUFFTSxTQUFVZ0QsMEJBQ2RDLE1BQ0F4RCxJQUFZeEIsUUFBUUMsT0FDcEJ3QjtRQUVBLEtBQUt1RCxNQUFNOUMsUUFBUTtRQUNuQkYsZ0JBQWdCZ0QsTUFBTXhELEdBQUdDO0FBQzNCO0lDL05NLE1BQU93RCwrQkFHSEMsS0FBQUE7UUFXUixXQUFBQyxDQUFZQyxTQUFhQztZQUN2QkMsTUFBTUYsU0FBU0M7WUFYRUUsS0FBQUMsYUFBYW5GLE9BQU80RCxPQUFPLENBQUEsR0FBSXFCLE1BQU0sZUFBZTtnQkFDckVHLGtCQUFrQjtnQkFDbEJDLGdCQUFnQjtnQkFDaEJDLG9CQUFvQjtnQkFDcEJDLDJCQUEyQjtnQkFDM0JDLDRCQUE0QjtnQkFDNUJDLHlCQUF5QjtnQkFDekJDLHNCQUFzQjs7QUFLeEI7UUFFUyxRQUFBQyxDQUFTQztZQUNoQixPQUFPWCxNQUNKVSxTQUFTM0YsT0FBTzRELE9BQU8sQ0FBQSxHQUFJZ0MsT0FBT1YsS0FBS0MsYUFDdkNVLElBQUlEO0FBQ1Q7UUFFbUIsZUFBQUU7WUFDakIsT0FBT2IsTUFBTWE7QUFDZjtRQUVTLGdCQUFNQyxDQUNiQyxLQUNBQyxPQUNBQyxNQUErQztZQUM3Q0MsUUFBUTtZQUNSQyxPQUFPO2NBRU5DO1lBRUgsT0FBTUMsS0FBRUEsS0FBR0MsU0FBRUEsa0JBQ0xyQixLQUFLc0IsT0FBT0gsTUFBTUksS0FBQUEsc0JBQXNCQyxTQUFTLE9BQ3ZEYixJQUFJWCxLQUFLYTtZQUNYTyxJQUFJSyxRQUNGLGNBQWN4RyxvQkFBQUEsTUFBTXlHLFVBQVUxQixLQUFLMkIseUJBQXlCWCxJQUFJRTtZQUVsRSxPQUFPbEIsS0FBSzRCLFVBQ1Y1QixLQUFLYSxXQUFXakcsTUFDaEJrRyxLQUNBQyxPQUNBO2dCQUFFRyxPQUFPRixJQUFJRTtnQkFBT0QsUUFBUUQsSUFBSUM7Z0JBQVFZLFVBQVViLElBQUlhO2tCQUNuRFI7QUFFUDtRQUVTLFlBQU1TLENBQ2JoQixLQUNBQyxVQUNHSTtZQUVILE9BQU1DLEtBQUVBLEtBQUdDLFNBQUVBLGtCQUNMckIsS0FBS3NCLE9BQU9ILE1BQU1JLEtBQUFBLHNCQUFzQlEsU0FBUyxPQUN2RHBCLElBQUlYLEtBQUs4QjtZQUNYVixJQUFJSyxRQUNGLFdBQVd4RyxvQkFBQUEsTUFBTXlHLFVBQVUxQixLQUFLMkIsYUFBYWIsT0FBaUJDO1lBRWhFLGFBQWNmLEtBQUs0QixVQUNqQjVCLEtBQUs4QixPQUFPbEgsTUFDWmtHLEtBQ0FDLFVBQ0dNO0FBRVA7UUFFUyxZQUFNVyxDQUNibEIsS0FDQW1CLFVBQ0dkO1lBRUgsT0FBTUMsS0FBRUEsS0FBR0MsU0FBRUEsa0JBQ0xyQixLQUFLc0IsT0FBT0gsTUFBTUksS0FBQUEsc0JBQXNCVyxTQUFTLE9BQ3ZEdkIsSUFBSVgsS0FBS2dDO1lBQ1haLElBQUlLLFFBQ0YsZUFBZXhHLG9CQUFBQSxNQUFNeUcsVUFBVTFCLEtBQUsyQixlQUFlYixPQUFpQm1CO1lBRXRFLGFBQWNqQyxLQUFLNEIsVUFDakI1QixLQUFLZ0MsT0FBT3BILE1BQ1prRyxLQUNBbUIsVUFDR1o7QUFFUDtRQUVTLGVBQU1jLENBQ2JyQixLQUNBbUIsVUFDR2Q7WUFFSCxPQUFNQyxLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHJCLEtBQUtzQixPQUFPSCxNQUFNSSxLQUFBQSxzQkFBc0JhLGFBQWEsT0FDM0R6QixJQUFJWCxLQUFLbUM7WUFDWGYsSUFBSUssUUFDRixlQUFleEcsb0JBQUFBLE1BQU15RyxVQUFVMUIsS0FBSzJCLGVBQWViLE9BQWlCbUI7WUFFdEUsYUFBY2pDLEtBQUs0QixVQUNqQjVCLEtBQUttQyxVQUFVdkgsTUFDZmtHLEtBQ0FtQixVQUNHWjtBQUVQO1FBRVMsVUFBTWdCLENBQ2JKLE9BQ0FsQixRQUF3QnVCLEtBQUFBLGVBQWVDLFFBQ3BDcEI7WUFFSCxPQUFNQyxLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHJCLEtBQUtzQixPQUFPSCxNQUFNSSxLQUFBQSxzQkFBc0JpQixNQUFNLE9BQ3BEN0IsSUFBSVgsS0FBS3FDO1lBQ1hqQixJQUFJSyxRQUNGLFdBQVd4RyxvQkFBQUEsTUFBTXlHLFVBQVUxQixLQUFLMkI7WUFFbEMsYUFBYzNCLEtBQUs0QixVQUNqQjVCLEtBQUtxQyxLQUFLekgsTUFDVnFILE9BQ0FsQixVQUNHTTtBQUVQO1FBRVMsVUFBTW9CLENBQ2JSLE9BQ0FTLFlBQTRCSixLQUFBQSxlQUFlQyxLQUMzQ3ZCLE1BQStDO1lBQzdDQyxRQUFRO1lBQ1JDLE9BQU87Y0FFTkM7WUFFSCxPQUFNQyxLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHJCLEtBQUtzQixPQUFPSCxNQUFNSSxLQUFBQSxzQkFBc0JvQixNQUFNLE9BQ3BEaEMsSUFBSVgsS0FBS3lDO1lBQ1hyQixJQUFJSyxRQUNGLFVBQVV4RyxvQkFBQUEsTUFBTXlHLFVBQVUxQixLQUFLMkI7WUFFakMsYUFBYzNCLEtBQUs0QixVQUNqQjVCLEtBQUt5QyxLQUFLN0gsTUFDVnFILE9BQ0FTLFdBQ0ExQixRQUNHSztBQUVQO1FBRVMsZUFBTU8sQ0FDYmhILFNBQ0d1RztZQUVILE9BQU1DLEtBQUVBLEtBQUd3QixLQUFFQSxLQUFHdkIsU0FBRUEsa0JBQ1ZyQixLQUFLc0IsT0FBT0gsTUFBTTBCLEtBQUFBLGdCQUFnQkMsV0FBVyxPQUNuRG5DLElBQUlYLEtBQUs0QjtZQUNYUixJQUFJSyxRQUFRLGdDQUFnQzdHO1lBQzVDLE1BQU1tSSxXQUFXMUIsUUFBUTJCLE1BQU0sSUFBSTtZQUNuQyxNQUFNM0gsU0FBU2lCLEtBQUsyRyxNQUNsQmpELEtBQUtILFFBQVFxRCxhQUNMbEQsS0FBS0gsUUFBUXNELG9CQUNqQlAsS0FDQUMsS0FBQUEsZ0JBQWdCQyxXQUNoQixFQUFDbEksTUFBTTBCLEtBQUtDLFVBQVV3RyxhQUN0QnZHLFdBQ0FBLFdBQ0F3RCxLQUFLMkIsTUFBTS9HO1lBS2pCLElBQUl3SSxNQUFNQyxRQUFRaEksU0FBUztnQkFDekIsT0FBT0EsT0FBTzBDLElBQUt1RixLQUNoQkEsRUFBVUMsV0FBQUEsWUFBWUMsVUFDdEJGLEVBQVVDLFdBQUFBLFlBQVlDLFdBQVd2SSxvQkFBQUEsTUFBTXlHLFVBQVUxQixLQUFLMkIsU0FDbkQsSUFBSTNCLEtBQUsyQixNQUFNMkIsS0FDZkE7QUFFUjtZQUNBLE9BQVFqSSxPQUFla0ksV0FBQUEsWUFBWUMsVUFDaENuSSxPQUFla0ksV0FBQUEsWUFBWUMsV0FBV3ZJLG9CQUFBQSxNQUFNeUcsVUFBVTFCLEtBQUsyQixTQUMxRCxJQUFJM0IsS0FBSzJCLE1BQU10RyxVQUNmb0ksS0FBQUEsVUFBVUMsaUJBQWlCckksVUFDekJQLE9BQU80RCxPQUFPckQsUUFBUTtnQkFDcEJzSSxNQUFNdEksT0FBT3NJLEtBQUs1RixJQUFLNkYsS0FBVyxJQUFJNUQsS0FBSzJCLE1BQU1pQztpQkFFbkR2STtBQUNSO1FBRVMsYUFBTXdJLENBQ2IvQyxRQUNHSztZQUVILE9BQU1DLEtBQUVBLEtBQUdDLFNBQUVBLGtCQUNMckIsS0FBS3NCLE9BQU9ILE1BQU1JLEtBQUFBLHNCQUFzQnVDLFVBQVUsT0FDeERuRCxJQUFJWCxLQUFLNkQ7WUFDWHpDLElBQUlLLFFBQ0YsWUFBWXhHLG9CQUFBQSxNQUFNeUcsVUFBVTFCLEtBQUsyQixTQUFTYixNQUFNLE9BQU9BLFFBQWtCO1lBRTNFLE1BQU1pRCxXQUFXakQsTUFBTSxFQUFDQSxRQUFRTyxZQUFXQTtZQUMzQyxPQUFPckIsS0FBSzRCLFVBQVVMLEtBQUFBLHNCQUFzQnVDLGFBQWFDO0FBQzNEO1FBRVMsV0FBTUMsQ0FDYmxELFFBQ0dLO1lBRUgsT0FBTUMsS0FBRUEsS0FBR0MsU0FBRUEsa0JBQ0xyQixLQUFLc0IsT0FBT0gsTUFBTUksS0FBQUEsc0JBQXNCMEMsUUFBUSxPQUN0RHRELElBQUlYLEtBQUtnRTtZQUNYNUMsSUFBSUssUUFDRixrQkFBa0JYLFVBQW9CN0Ysb0JBQUFBLE1BQU15RyxVQUFVMUIsS0FBSzJCO1lBRTdELE9BQU8zQixLQUFLNEIsVUFBVUwsS0FBQUEsc0JBQXNCMEMsUUFBUW5ELFFBQVFPO0FBQzlEO1FBRVMsV0FBTTZDLENBQ2JwRCxRQUNHSztZQUVILE9BQU1DLEtBQUVBLEtBQUdDLFNBQUVBLGtCQUNMckIsS0FBS3NCLE9BQU9ILE1BQU1JLEtBQUFBLHNCQUFzQjRDLFFBQVEsT0FDdER4RCxJQUFJWCxLQUFLa0U7WUFDWDlDLElBQUlLLFFBQ0Ysa0JBQWtCWCxVQUFvQjdGLG9CQUFBQSxNQUFNeUcsVUFBVTFCLEtBQUsyQjtZQUU3RCxPQUFPM0IsS0FBSzRCLFVBQVVMLEtBQUFBLHNCQUFzQjRDLFFBQVFyRCxRQUFRTztBQUM5RDtRQUVTLFdBQU0rQyxDQUNidEQsUUFDR0s7WUFFSCxPQUFNQyxLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHJCLEtBQUtzQixPQUFPSCxNQUFNSSxLQUFBQSxzQkFBc0I4QyxRQUFRLE9BQ3REMUQsSUFBSVgsS0FBS29FO1lBQ1hoRCxJQUFJSyxRQUNGLHNCQUFzQlgsVUFBb0I3RixvQkFBQUEsTUFBTXlHLFVBQVUxQixLQUFLMkI7WUFFakUsT0FBTzNCLEtBQUs0QixVQUFVTCxLQUFBQSxzQkFBc0I4QyxRQUFRdkQsUUFBUU87QUFDOUQ7UUFFUyxXQUFNaUQsQ0FDYnhELFFBQ0dLO1lBRUgsT0FBTUMsS0FBRUEsS0FBR0MsU0FBRUEsa0JBQ0xyQixLQUFLc0IsT0FBT0gsTUFBTUksS0FBQUEsc0JBQXNCZ0QsUUFBUSxPQUN0RDVELElBQUlYLEtBQUtzRTtZQUNYbEQsSUFBSUssUUFDRixzQkFBc0JYLFVBQW9CN0Ysb0JBQUFBLE1BQU15RyxVQUFVMUIsS0FBSzJCO1lBRWpFLE9BQU8zQixLQUFLNEIsVUFBVUwsS0FBQUEsc0JBQXNCZ0QsUUFBUXpELFFBQVFPO0FBQzlEO1FBRVMsZ0JBQU1tRCxDQUNiMUQsUUFDR0s7WUFFSCxPQUFNQyxLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHJCLEtBQUtzQixPQUFPSCxNQUFNSSxLQUFBQSxzQkFBc0JrRCxhQUFhLE9BQzNEOUQsSUFBSVgsS0FBS3dFO1lBQ1hwRCxJQUFJSyxRQUNGLDhCQUE4QlgsVUFBb0I3RixvQkFBQUEsTUFBTXlHLFVBQVUxQixLQUFLMkI7WUFFekUsT0FBTzNCLEtBQUs0QixVQUFVTCxLQUFBQSxzQkFBc0JrRCxhQUFhM0QsUUFBUU87QUFDbkU7UUFFUyxhQUFNcUQsQ0FDYjVELFFBQ0dLO1lBRUgsT0FBTUMsS0FBRUEsS0FBR0MsU0FBRUEsa0JBQ0xyQixLQUFLc0IsT0FBT0gsTUFBTUksS0FBQUEsc0JBQXNCb0QsVUFBVSxPQUN4RGhFLElBQUlYLEtBQUswRTtZQUNYdEQsSUFBSUssUUFBUSxZQUFZeEcsMEJBQU15RyxVQUFVMUIsS0FBSzJCLGFBQWFiO1lBQzFELE9BQU9kLEtBQUs0QixVQUFVTCxLQUFBQSxzQkFBc0JvRCxVQUFVN0QsUUFBUU87QUFDaEU7UUFFQSxpQkFBTXVELElBQWV6RDtZQUNuQixPQUFNRSxTQUFFQSxXQUFZckIsS0FBS3NCLE9BQU9ILE1BQU1uQixLQUFLNEU7WUFFM0MsTUFBTXZKLGVBQWUyRSxLQUFLSCxRQUFRK0UsWUFBWTVFLEtBQUsyQixVQUFVTjtZQUU3RCxPQUFPaEc7QUFDVDtRQUVTLFlBQU13SixDQUNiQyxVQUNHM0Q7WUFFSCxPQUFNeUIsS0FBRUEsS0FBR3hCLEtBQUVBLEtBQUdDLFNBQUVBLFdBQVlyQixLQUFLc0IsT0FBT0gsTUFBTW5CLEtBQUs2RTtZQUNyRHpELElBQUkyRCxNQUNGLGdCQUFnQi9FLEtBQUsyQixNQUFNL0csaUJBQWlCSyxvQkFBQUEsTUFBTXlHLFVBQVUxQixLQUFLMkI7WUFFbkUzQixLQUFLZ0YsdUJBQXVCcEMsS0FBS2tDO1lBQ2pDLE1BQU1HLFdBQVdqRixLQUFLSCxRQUFRcUYsUUFBUUosT0FBT2xDO1lBQzdDLE9BQU11QyxRQUFFQSxRQUFNQyxJQUFFQSxJQUFFQyxXQUFFQSxhQUFjSjtZQUNsQyxNQUFNNUosZUFBZTJFLEtBQUtILFFBQVFnRixPQUNoQzdFLEtBQUsyQixPQUNMeUQsSUFDQUQsUUFDQUUsY0FDR2hFO1lBRUwsT0FBT3JCLEtBQUtILFFBQVF5RixPQUFVakssUUFBUTJFLEtBQUsyQixPQUFPeUQsSUFBSUMsV0FBV3pDO0FBQ25FO1FBRVMsWUFBTTJDLENBQ2JULFVBQ0czRDtZQUVILE9BQU1FLFNBQUVBLFNBQU9ELEtBQUVBLEtBQUd3QixLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQU9ILE1BQU1uQixLQUFLdUY7WUFDckR2RixLQUFLZ0YsdUJBQXVCcEMsS0FBS2tDO1lBQ2pDLE1BQU1HLFdBQVdqRixLQUFLSCxRQUFRcUYsUUFBUUosT0FBT2xDO1lBQzdDLE9BQU13QyxJQUFFQSxJQUFFQyxXQUFFQSxhQUFjSjtZQUMxQixJQUFJRSxTQUFTRixTQUFTRTtZQUN0Qi9ELElBQUkyRCxNQUNGLFlBQVkvRSxLQUFLMkIsTUFBTS9HLGlCQUFpQkssb0JBQUFBLE1BQU15RyxVQUFVMUIsS0FBSzJCLGtCQUFrQnlEO1lBRWpGRCxlQUFlbkYsS0FBS0gsUUFBUTBGLE9BQzFCdkYsS0FBSzJCLE9BQ0x5RCxJQUNBRCxRQUNBRSxjQUNHaEU7WUFFTCxPQUFPckIsS0FBS0gsUUFBUXlGLE9BQVVILFFBQVFuRixLQUFLMkIsT0FBT3lELElBQUlDLFdBQVd6QztBQUNuRTtRQUVtQixxQkFBTTRDLENBQ3ZCQyxXQUNHdEU7WUFFSCxPQUFNeUIsS0FBRUEsS0FBR3ZCLFNBQUVBLGtCQUNMckIsS0FBS3NCLE9BQU9ILE1BQU11RSxhQUFBQSxjQUFjQyxRQUFRLE9BQzlDaEYsSUFBSVgsS0FBS3dGO1lBQ1gsTUFBTXJGLGlCQUFpQnlDLElBQUlnRCxJQUFJO1lBQy9CLE1BQU1DLGlCQUFpQmpELElBQUlnRCxJQUFJO1lBQy9CLEtBQUtILE9BQU85SSxRQUFRLE9BQU8sRUFBQzhJLFdBQVdwRTtZQUV2Q29FLGVBQWVLLFFBQVFDLElBQ3JCTixPQUFPMUgsSUFBSTdDLE1BQU92QjtnQkFDaEJBLElBQUksSUFBSXFHLEtBQUsyQixNQUFNaEk7Z0JBQ25CLEtBQUt3RyxzQkFDRzZGLGFBQUFBLG9CQUNKaEcsTUFDQTRDLEtBQ0FqSixHQUNBK0wsYUFBQUEsY0FBY0MsUUFDZEQsYUFBQUEsY0FBY087Z0JBRWxCLE9BQU90TTs7WUFJWCxLQUFLa00sZ0JBQWdCO2dCQUNuQixNQUFNSyxlQUFldEQsSUFBSWdELElBQUksa0NBQWtDO2dCQUUvRCxNQUFNTyxlQUFlTCxRQUFRQyxJQUMzQk4sT0FBTzFILElBQUtwRSxLQUFNbU0sUUFBUTFKLFFBQVF6QyxFQUFFeU0sYUFBYUY7Z0JBR25ELE1BQU1HLGdCQUFnQkMsYUFBQUEsb0JBQW9CSDtnQkFFMUMsSUFBSUUsZUFBZSxNQUFNLElBQUlFLGFBQUFBLGdCQUFnQkY7QUFDL0M7WUFDQSxPQUFPLEVBQUNaLFdBQVdwRTtBQUNyQjtRQUVTLGVBQU1tRixDQUNiZixXQUNHdEU7WUFFSCxLQUFLc0UsT0FBTzlJLFFBQVEsT0FBTzhJO1lBQzNCLE9BQU03QyxLQUFFQSxLQUFHeEIsS0FBRUEsS0FBR0MsU0FBRUEsV0FBWXJCLEtBQUtzQixPQUFPSCxNQUFNbkIsS0FBS3dHO1lBQ3JEcEYsSUFBSTJELE1BQ0YsWUFBWVUsT0FBTzlJLGNBQWNxRCxLQUFLMkIsTUFBTS9HLGlCQUFpQkssMEJBQU15RyxVQUFVMUIsS0FBSzJCO1lBR3BGOEQsT0FBT3ZMLFFBQVM0SyxTQUFVOUUsS0FBS2dGLHVCQUF1QnBDLEtBQUtrQztZQUMzRCxNQUFNRyxXQUFXUSxPQUFPMUgsSUFBS3BFLEtBQU1xRyxLQUFLSCxRQUFRcUYsUUFBUXZMLEdBQUdpSjtZQUMzRCxNQUFNNkQsTUFBTXhCLFNBQVNsSCxJQUFLOUIsS0FBTUEsRUFBRW1KO1lBQ2xDLE1BQU1zQixXQUFXekIsU0FBU2xILElBQUs5QixLQUFNQSxFQUFFa0o7WUFDdkMsTUFBTXdCLGFBQWExQixTQUFTbEgsSUFBSzlCLEtBQU1BLEVBQUVvSjtZQUN6QyxNQUFNdUIsZ0JBQWdCNUcsS0FBS0gsUUFBUTJHLFVBQ2pDeEcsS0FBSzJCLE9BQ0w4RSxLQUNBQyxVQUNBQyxlQUNHdEY7WUFFTCxPQUFPeUUsUUFBUUMsSUFDYmEsUUFBUTdJLElBQUk3QyxPQUFPb0ksR0FBR3VEO2dCQUNwQixNQUFNekIsS0FBS3FCLElBQUlJO2dCQUNmLE9BQU83RyxLQUFLSCxRQUFReUYsT0FBVWhDLEdBQUd0RCxLQUFLMkIsT0FBT3lELElBQUl1QixXQUFXRSxJQUFJakU7O0FBR3RFO1FBRVMsYUFBTWtFLENBQ2JDLFNBQ0c1RjtZQUVILE9BQU15QixLQUFFQSxLQUFHeEIsS0FBRUEsS0FBR0MsU0FBRUEsV0FBWXJCLEtBQUtzQixPQUFPSCxNQUFNbkIsS0FBSzhHO1lBQ3JEMUYsSUFBSTJELE1BQ0YsV0FBV2dDLEtBQUtwSyxVQUFVcUQsS0FBSzJCLE1BQU0vRyxpQkFBaUJLLDBCQUFNeUcsVUFBVTFCLEtBQUsyQjtZQUU3RSxNQUFNcUYsZ0JBQWdCaEgsS0FBS0gsUUFBUWlILFFBQVE5RyxLQUFLMkIsT0FBT29GLFNBQVMxRjtZQUNoRSxPQUFPMkYsUUFBUWpKLElBQUksQ0FBQ3VGLEdBQUd1RCxNQUNyQjdHLEtBQUtILFFBQVF5RixPQUFPaEMsR0FBR3RELEtBQUsyQixPQUFPb0YsS0FBS0YsSUFBSSxDQUFBLEdBQUlqRTtBQUVwRDtRQUVTLGVBQU1xRSxDQUNieEIsV0FDR3RFO1lBRUgsT0FBTXlCLEtBQUVBLEtBQUd4QixLQUFFQSxLQUFHQyxTQUFFQSxXQUFZckIsS0FBS3NCLE9BQU9ILE1BQU1uQixLQUFLaUg7WUFDckQ3RixJQUFJMkQsTUFDRixZQUFZVSxPQUFPOUksY0FBY3FELEtBQUsyQixNQUFNL0csaUJBQWlCSywwQkFBTXlHLFVBQVUxQixLQUFLMkI7WUFHcEY4RCxPQUFPdkwsUUFBUzRLLFNBQVU5RSxLQUFLZ0YsdUJBQXVCcEMsS0FBS2tDO1lBQzNELE1BQU1HLFdBQVdRLE9BQU8xSCxJQUFLcEUsS0FBTXFHLEtBQUtILFFBQVFxRixRQUFRdkwsR0FBR2lKO1lBQzNELE1BQU02RCxNQUFNeEIsU0FBU2xILElBQUs5QixLQUFNQSxFQUFFbUo7WUFDbEMsTUFBTThCLGdCQUFnQmxILEtBQUtILFFBQVFvSCxVQUNqQ2pILEtBQUsyQixPQUNMOEUsS0FDQXhCLFNBQVNsSCxJQUFLdUYsS0FBTUEsRUFBRTZCLFNBQ3RCRixTQUFTbEgsSUFBS3VGLEtBQU1BLEVBQUUrQixlQUNuQmhFO1lBRUwsT0FBT3lFLFFBQVFDLElBQ2JtQixRQUFRbkosSUFBSTdDLE9BQU9pTSxHQUFHTjtnQkFDcEIsTUFBTXpCLEtBQUtxQixJQUFJSTtnQkFDZixPQUFPN0csS0FBS0gsUUFBUXlGLE9BQ2xCNkIsR0FDQW5ILEtBQUsyQixPQUNMeUQsSUFDQUgsU0FBUzRCLEdBQUd4QixXQUNaekM7O0FBSVI7UUFFUSxzQkFBQW9DLENBQXVCcEMsS0FBbUJrQztZQUNoRCxJQUFJN0osb0JBQUFBLE1BQU00RCxXQUFXaUcsUUFBUTtnQkFDM0JsQyxJQUFJd0UsV0FBVztvQkFBRUMsUUFBUTs7QUFDM0I7QUFDRjs7SUNwZUssSUFBTUMsYUFBTixNQUFNQSxtQkFBbUJDO1FBOEI5QixXQUFBM0gsQ0FBWWpHO1lBQ1ZvRyxNQUFNcEc7QUFDUjs7SUExQkE2TixNQUFBQSxXQUFBLEVBTENDLFFBQUc7UUFBRUMsTUFBTUM7bURBS0VMLFdBQUFNLFdBQUEsYUFBQTtJQVFkSixNQUFBQSxXQUFBLEVBTkNLLGVBQ0FDLG9CQUFBQSx1REFLY1IsV0FBQU0sV0FBQSxjQUFBO0lBT2ZKLE1BQUFBLFdBQUEsRUFOQ0ssZUFDQUMsb0JBQUFBLHVEQUtlUixXQUFBTSxXQUFBLGVBQUE7SUFPaEJKLE1BQUFBLFdBQUEsRUFOQ0ssZUFDQUMsb0JBQUFBLHVEQUtpQlIsV0FBQU0sV0FBQSxpQkFBQTtJQTVCUE4sYUFBVUUsaUJBQUEsRUFGdEJPLEtBQUFBLE1BQU0saUJBQ05qRCxrRkFDWXdDO0lBcUROLElBQU1VLGNBQU4sTUFBTUEsb0JBQW9CVDtRQStCL0IsV0FBQTNILENBQVlqRztZQUNWb0csTUFBTXBHO0FBQ1I7O0lBM0JBNk4sTUFBQUEsV0FBQSxFQUxDQyxRQUFHO1FBQUVDLE1BQU1DO21EQUtBSyxZQUFBSixXQUFBLFdBQUE7SUFRWkosTUFBQUEsV0FBQSxFQU5DSyxlQUNBQyxvQkFBQUEsdURBS2NFLFlBQUFKLFdBQUEsY0FBQTtJQVFmSixNQUFBQSxXQUFBLEVBTkNLLGVBQ0FDLG9CQUFBQSx1REFLZ0JFLFlBQUFKLFdBQUEsZ0JBQUE7SUFPakJKLE1BQUFBLFdBQUEsRUFMQ0ssS0FBQUEscURBS2dCRyxZQUFBSixXQUFBLGdCQUFBO0lBN0JOSSxjQUFXUixpQkFBQSxFQUZ2Qk8sS0FBQUEsTUFBTSxrQkFDTmpELGtGQUNZa0Q7SUFtRE4sSUFBTUMsWUFBTixNQUFNQSxrQkFBa0JWO1FBOEI3QixXQUFBM0gsQ0FBWWpHO1lBQ1ZvRyxNQUFNcEc7QUFDUjs7SUFwQkE2TixNQUFBQSxXQUFBLEVBWENDLFFBQUc7UUFBRUMsTUFBTUM7UUFLWEUsZUFDQUMsb0JBQUFBLHVEQUtjRyxVQUFBTCxXQUFBLGNBQUE7SUFRZkosTUFBQUEsV0FBQSxFQU5DSyxlQUNBQyxvQkFBQUEsdURBS2dCRyxVQUFBTCxXQUFBLGdCQUFBO0lBUWpCSixNQUFBQSxXQUFBLEVBTkNLLGVBQ0FDLG9CQUFBQSx1REFLY0csVUFBQUwsV0FBQSxjQUFBO0lBNUJKSyxZQUFTVCxpQkFBQSxFQUZyQk8sS0FBQUEsTUFBTSxxQkFDTmpELGtGQUNZbUQ7SUNoR1AsTUFBT0MseUJBQTBDQyxvQkFBQUE7UUFDckQsV0FBQXZJO1lBQ0VHO0FBQ0Y7UUFTbUIsWUFBQXFJLENBQWF0RCxPQUFVdUQ7WUFFeEMsTUFBTUMsY0FBbUN4TixPQUFPNEQsT0FBTyxDQUFBLEdBQUlvRztZQUMzRCxJQUFJeUQsV0FBV0MsV0FBQUEsU0FBU0gsVUFBVXZELE1BQU1sRjtZQUV4QyxLQUFLMkksWUFBWUEsYUFBYSxVQUM1QixJQUFJRixXQUFXRSxXQUFXRixnQkFFeEIsTUFBTSxJQUFJSSxhQUFBQSxtQkFDUiwrQkFBK0IzRCxNQUFNbEYsWUFBWWhGO1lBRXZEME4sWUFBWUksb0JBQUFBLFVBQVVDLFVBQVVKO1lBQ2hDLE9BQU9EO0FBQ1Q7UUFRUyxXQUFBTSxDQUFZQztZQUNuQixNQUFNQyxrQkFBa0J4TSxLQUFLMkcsTUFBTTRGO1lBQ25DLE1BQU1FLFlBQVlELGdCQUFnQkosb0JBQUFBLFVBQVVDO1lBQzVDLEtBQUtJLFdBQ0gsTUFBTSxJQUFJQyxNQUFNO1lBQ2xCLE1BQU1sRSxRQUFXN0osb0JBQUFBLE1BQU1nTyxNQUFNSCxpQkFBaUJDO1lBQzlDLE9BQU9qRTtBQUNUO1FBU1MsU0FBQW9FLENBQVVwRSxPQUFVdUQ7WUFDM0IsT0FBTy9MLEtBQUtDLFVBQVV5RCxLQUFLb0ksYUFBYXRELE9BQU91RDtBQUNqRDs7SUM1REksTUFBT2Msb0NBRUh6Sjs7WUFDT00sS0FBQW9KLGFBQWEsSUFBSWxCO0FBQW1COztZQUtwQ2xJLEtBQUFxSixVQUFVLElBQUlDLFlBQVk7QUFBUTtRQVl4QyxxQkFBTUMsQ0FDYnhCLE9BQ0F5QixPQUNBcEUsT0FDR2pFO1lBRUgsS0FBS25CLEtBQUt5SixpQkFDUixNQUFNLElBQUlqTCxhQUFBQSxjQUNSO1lBRUosT0FBTTRDLEtBQUVBLEtBQUdDLFNBQUVBLFdBQVlyQixLQUFLc0IsT0FBT0gsTUFBTW5CLEtBQUt1SjtZQUNoRG5JLElBQUlLLFFBQ0YsWUFBWXpCLEtBQUt5SixnQkFBZ0JDLHlCQUF5QjFKO1lBRzVEK0gsZUFDU0EsVUFBVSxXQUFXOU0sb0JBQUFBLE1BQU0ySyxJQUFJbUMsU0FBU0E7WUFFakQsSUFBSTRCO1lBRUosSUFBSXZFLE9BQU81SSxXQUFXO2dCQUNwQm1OLFdBQVduTjtBQUNiLG1CQUFPLElBQUk0RyxNQUFNQyxRQUFRK0IsS0FBSztnQkFDNUJ1RSxXQUFXdkUsR0FBR3JILElBQ1g4SSxLQUFNK0MsS0FBQUEsU0FBU0MsV0FBVzVPLG9CQUFBQSxNQUFNNk8sWUFBWS9CLE9BQU9MLE1BQU1iO0FBRTlELG1CQUFPO2dCQUNMOEMsV0FBV0MsS0FBQUEsU0FBU0MsV0FDbEI1TyxvQkFBQUEsTUFBTTZPLFlBQVkvQixPQUFPTCxNQUN6QnRDO0FBRUo7a0JBQ01wRixLQUFLeUosZ0JBQWdCRixnQkFDekJ4QixPQUNBeUIsT0FDQUcsYUFDR3RJO0FBRVA7UUFRQSxNQUFBNkIsQ0FBT1M7WUFDTCxPQUFPd0YsNEJBQTRCRSxRQUFRbkcsT0FBT1M7QUFDcEQ7UUFFQSxXQUFBL0QsQ0FBWUM7WUFDVkUsTUFBTUYsU0FBU21JO1lBbEVFaEksS0FBQW9KLGFBQ2pCRCw0QkFBNEJDO0FBa0U5QjtRQWFBLGVBQU1XLElBQWE1STtZQUNqQixPQUFNeUIsS0FBRUEsY0FBZTVDLEtBQUtzQixPQUFPSCxNQUFNLGFBQWEsT0FBT1IsSUFDM0RYLEtBQUsrSjtZQUVQLE1BQU1uUCxhQUFhb0YsS0FBS0gsUUFBUXNELG9CQUFvQlAsS0FBSztZQUN6RCxPQUFPNUMsS0FBS2tELE9BQU90STtBQUNyQjtRQVlBLFlBQU1vUCxJQUFVN0k7WUFDZCxPQUFNeUIsS0FBRUEsY0FBZTVDLEtBQUtzQixPQUFPSCxNQUFNLFVBQVUsT0FBT1IsSUFBSVgsS0FBS2dLO1lBQ25FLE1BQU1BLGVBQWVoSyxLQUFLSCxRQUFRc0Qsb0JBQW9CUCxLQUFLO1lBQzNELE9BQU81QyxLQUFLa0QsT0FBTzhHO0FBQ3JCO1FBWUEsY0FBTUMsSUFBWTlJO1lBQ2hCLE9BQU15QixLQUFFQSxjQUFlNUMsS0FBS3NCLE9BQU9ILE1BQU0sWUFBWSxPQUFPUixJQUMxRFgsS0FBS2lLO1lBRVAsTUFBTUEsaUJBQWlCakssS0FBS0gsUUFBUXNELG9CQUFvQlAsS0FBSztZQUM3RCxPQUFPc0gsT0FBT2xLLEtBQUtrRCxPQUFPK0c7QUFDNUI7UUFZQSxpQkFBTUUsSUFDRGhKO1lBRUgsT0FBTXlCLEtBQUVBLGNBQWU1QyxLQUFLc0IsT0FBT0gsTUFBTSxlQUFlLE9BQU9SLElBQzdEWCxLQUFLbUs7WUFFUCxNQUFNQyxjQUFjcEssS0FBS0gsUUFBUXNELG9CQUFvQlAsS0FBSztZQUMxRCxPQUFPc0gsT0FBT2xLLEtBQUtrRCxPQUFPa0g7QUFDNUI7UUFnQkEsZUFBTUMsQ0FDSkMsVUFDR25KO1lBRUgsT0FBTXlCLEtBQUVBLGNBQWU1QyxLQUFLc0IsT0FBT0gsTUFBTSxXQUFXLE9BQU9SLElBQ3pEWCxLQUFLcUs7WUFFUCxNQUFNRSxnQkFBZ0J2SyxLQUFLSCxRQUFRc0Qsb0JBQW9CUCxLQUFLLGFBQWEsRUFDdkUwSDtZQUVGLE9BQU9KLE9BQU9sSyxLQUFLa0QsT0FBT3FIO0FBQzVCO1FBaUJBLGNBQU1DLENBQ0pDLElBQ0F4SSxVQUNHZDtZQUVILE9BQU15QixLQUFFQSxjQUFlNUMsS0FBS3NCLE9BQU9ILE1BQU0sWUFBWSxPQUFPUixJQUMxRFgsS0FBS3dLO1lBRVAsTUFBTUUsb0JBQW9CMUssS0FBS0gsUUFBUThLLGtCQUFrQi9ILEtBQUssWUFBWSxFQUN4RTZILElBQ0F4SSxNQUFNMkk7WUFFUixPQUFPNUssS0FBS2tELE9BQU93SCxpQkFBaUIsU0FBUyxPQUFPO0FBQ3REO1FBbUJBLGtCQUFNRyxDQUNKQyxNQUNBTCxJQUNBeEk7WUFFQSxNQUFNOEksb0JBQW9CQyxLQUFBQSxRQUFRN0osS0FDaEMsZ0JBQ0FuQixLQUFLMkIsT0FDTCxJQUNBM0IsS0FBS0gsU0FDTEcsS0FBS0MsY0FBYyxDQUFBO1lBRXJCLE9BQU0yQyxLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQU95SixZQUFZNUosTUFBTW5CLEtBQUs2SztZQUNuRCxNQUFNSCxvQkFBb0IxSyxLQUFLSCxRQUFROEssa0JBQ3JDL0gsS0FDQSxnQkFDQSxFQUFDa0ksTUFBTUwsSUFBSXhJLE1BQU0ySTtZQUduQixPQUFPNUssS0FBS2tELE9BQU93SCxpQkFBaUIsU0FBUyxPQUFPO0FBQ3REO1FBZ0JBLGFBQU1PLENBQVFDLFNBQWlCako7WUFDN0IsTUFBTThJLG9CQUFvQkMsS0FBQUEsUUFBUTdKLEtBQ2hDLFdBQ0FuQixLQUFLMkIsT0FDTCxJQUNBM0IsS0FBS0gsU0FDTEcsS0FBS0MsY0FBYyxDQUFBO1lBRXJCLE9BQU0yQyxLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQU95SixZQUFZNUosTUFBTW5CLEtBQUtpTDtZQUNuRCxNQUFNRSxpQkFBaUJuTCxLQUFLSCxRQUFROEssa0JBQWtCL0gsS0FBSyxXQUFXLEVBQ3BFc0ksU0FDQWpKLE1BQU0ySTtZQUVSLE9BQU81SyxLQUFLa0QsT0FBT2lJLGNBQWMsU0FBUyxPQUFPO0FBQ25EO1FBaUJBLGVBQU1DLENBQVVkLE9BQWVZO1lBQzdCLE1BQU1ILG9CQUFvQkMsS0FBQUEsUUFBUTdKLEtBQ2hDLGFBQ0FuQixLQUFLMkIsT0FDTCxJQUNBM0IsS0FBS0gsU0FDTEcsS0FBS0MsY0FBYyxDQUFBO1lBRXJCLE9BQU0yQyxLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQU95SixZQUFZNUosTUFBTW5CLEtBQUtvTDtZQUNuRCxNQUFNQSxrQkFBa0JwTCxLQUFLSCxRQUFROEssa0JBQWtCL0gsS0FBSyxhQUFhLEVBQ3ZFMEgsT0FDQVk7WUFFRixPQUFPaEIsT0FBT2xLLEtBQUtrRCxPQUFPa0k7QUFDNUI7UUFnQkEsZ0JBQU1DLENBQVdDO1lBQ2YsTUFBTVAsb0JBQW9CQyxLQUFBQSxRQUFRN0osS0FDaEMsY0FDQW5CLEtBQUsyQixPQUNMLElBQ0EzQixLQUFLSCxTQUNMRyxLQUFLQyxjQUFjLENBQUE7WUFFckIsT0FBTTJDLEtBQUVBLE9BQVE1QyxLQUFLc0IsT0FBT3lKLFlBQVk1SixNQUFNbkIsS0FBS3FMO1lBQ25ELE1BQU1FLG9CQUFvQnZMLEtBQUtILFFBQVE4SyxrQkFDckMvSCxLQUNBLGNBQ0EsRUFBQ3VHLDRCQUE0QkMsV0FBV0YsVUFBVW9DO1lBR3BELE9BQU90TCxLQUFLa0QsT0FBT3FJLGlCQUFpQixTQUFTLE9BQU87QUFDdEQ7UUFZQSxzQkFBTUM7WUFDSixNQUFNVCxvQkFBb0JDLEtBQUFBLFFBQVE3SixLQUNoQyxvQkFDQW5CLEtBQUsyQixPQUNMLElBQ0EzQixLQUFLSCxTQUNMRyxLQUFLQyxjQUFjLENBQUE7WUFFckIsT0FBTTJDLEtBQUVBLE9BQVE1QyxLQUFLc0IsT0FBT3lKLFlBQVk1SixNQUFNbkIsS0FBS3dMO2tCQUM3Q3hMLEtBQUtILFFBQVFzRCxvQkFBb0JQLEtBQUs7QUFDOUM7UUFnQkEsVUFBTTZJLENBQUtDO1lBQ1QsTUFBTVgsb0JBQW9CQyxLQUFBQSxRQUFRN0osS0FDaEMsUUFDQW5CLEtBQUsyQixPQUNMLElBQ0EzQixLQUFLSCxTQUNMRyxLQUFLQyxjQUFjLENBQUE7WUFFckIsT0FBTTJDLEtBQUVBLE9BQVE1QyxLQUFLc0IsT0FBT3lKLFlBQVk1SixNQUFNbkIsS0FBS3lMO2tCQUM3Q3pMLEtBQUtILFFBQVE4SyxrQkFBa0IvSCxLQUFLLFFBQVEsRUFBQzhJLE9BQU9kO0FBQzVEO1FBZUEsVUFBTWUsQ0FBS0Q7WUFDVCxNQUFNWCxvQkFBb0JDLEtBQUFBLFFBQVE3SixLQUNoQyxRQUNBbkIsS0FBSzJCLE9BQ0wsSUFDQTNCLEtBQUtILFNBQ0xHLEtBQUtDLGNBQWMsQ0FBQTtZQUVyQixPQUFNMkMsS0FBRUEsT0FBUTVDLEtBQUtzQixPQUFPeUosWUFBWTVKLE1BQU1uQixLQUFLMkw7a0JBQzdDM0wsS0FBS0gsUUFBUThLLGtCQUFrQi9ILEtBQUssUUFBUSxFQUFDOEksT0FBT2Q7QUFDNUQ7UUFnQkEsY0FBTWdCLENBQVNDLFNBQWlCSDtZQUM5QixNQUFNWCxvQkFBb0JDLEtBQUFBLFFBQVE3SixLQUNoQyxZQUNBbkIsS0FBSzJCLE9BQ0wsSUFDQTNCLEtBQUtILFNBQ0xHLEtBQUtDLGNBQWMsQ0FBQTtZQUVyQixPQUFNMkMsS0FBRUEsT0FBUTVDLEtBQUtzQixPQUFPeUosWUFBWTVKLE1BQU1uQixLQUFLNEw7a0JBQzdDNUwsS0FBS0gsUUFBUThLLGtCQUFrQi9ILEtBQUssWUFBWSxFQUNwRGlKLFNBQ0FILE9BQU9kO0FBRVg7UUFhQSwwQkFBTWtCO1lBQ0osTUFBTWYsb0JBQW9CQyxLQUFBQSxRQUFRN0osS0FDaEMsa0JBQ0FuQixLQUFLMkIsT0FDTCxJQUNBM0IsS0FBS0gsU0FDTEcsS0FBS0MsY0FBYyxDQUFBO1lBRXJCLE9BQU0yQyxLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQU95SixZQUFZNUosTUFBTW5CLEtBQUs4TDtZQUNuRCxNQUFNQyxpQ0FBaUMvTCxLQUFLSCxRQUFRc0Qsb0JBQ2xEUCxLQUNBO1lBR0YsT0FBT3NILE9BQU9sSyxLQUFLa0QsT0FBTzZJO0FBQzVCO1FBYUEscUJBQU1DO1lBQ0osTUFBTWpCLG9CQUFvQkMsS0FBQUEsUUFBUTdKLEtBQ2hDLGFBQ0FuQixLQUFLMkIsT0FDTCxJQUNBM0IsS0FBS0gsU0FDTEcsS0FBS0MsY0FBYyxDQUFBO1lBRXJCLE9BQU0yQyxLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQU95SixZQUFZNUosTUFBTW5CLEtBQUtnTTtZQUNuRCxNQUFNQSx3QkFBd0JoTSxLQUFLSCxRQUFRc0Qsb0JBQ3pDUCxLQUNBO1lBR0YsT0FBTzVDLEtBQUtrRCxPQUFPOEk7QUFDckI7O2FDN2ZjQyxXQUNkbk0sT0FDQTJGLFFBQ0FnQjtRQUVBLElBQUlnQjtRQUNKLElBQUl5RTtRQUNKLElBQUlDO1FBRUosU0FBU0MsVUFBVXpTLEdBQTRCOE07WUFDN0NnQixLQUFLQSxNQUFNeE0sMEJBQU13TSxHQUFHM0g7WUFDcEJxTSxVQUFVQSxXQUFXbFIsMEJBQU02TyxZQUFZaEs7WUFDdkNvTSxXQUFXQSxZQUFZalIsb0JBQUFBLE1BQU1pUixTQUFTcE0sT0FBTzJIO1lBRTdDLElBQUl5RSxVQUFVO2dCQUNaLE9BQU9HLGFBQUFBLHNCQUFzQjFTLEdBQVV1UztBQUN6QztZQUVBLE1BQU05RyxLQUFNekwsRUFBVThOLE9BQU9oQjtZQUM3QixXQUFXckIsT0FBTyxhQUNoQixNQUFNLElBQUk1RyxhQUFBQSxjQUFjLDRCQUE0QjdFLEVBQUVpRyxZQUFZaEY7WUFDcEUsT0FBT3dLO0FBQ1Q7UUFFQSxJQUFJaEMsTUFBTUMsUUFBUW9DLFNBQVM7WUFDekIsS0FBS3JDLE1BQU1DLFFBQVFvRCxRQUFRQSxJQUFJOUosV0FBVzhJLE9BQU85SSxRQUMvQyxNQUFNLElBQUk2QixhQUFBQSxjQUNSO1lBRUosT0FBT2lILE9BQU8xSCxJQUFJLENBQUNwRSxHQUFHa04sTUFBTXVGLFVBQVV6UyxHQUFHOE0sSUFBSUk7QUFDL0M7UUFDQSxPQUFPdUYsVUFBVTNHLFFBQVFnQjtBQUMzQjtJQ2pCYTZGLFFBQUFBLHNCQUFOLE1BQU1BLDRCQUE0Qi9FO1FBcUN2QyxXQUFBM0gsQ0FBWXJCO1lBQ1Z3QixNQUFNeEI7QUFDUjs7SUEvQkFpSixNQUFBQSxXQUFBLEVBSEMrRSxXQUFBQSxZQUFZLGdEQUNaMUUsZUFDQUosc0RBQ1c2RSw0QkFBQTFFLFdBQUEsV0FBQTtJQVNaSixNQUFBQSxXQUFBLEVBSEMrRSxXQUFBQSxZQUFZLG1EQUNaMUUsZUFDQUMsMkVBQ29Cd0UsNEJBQUExRSxXQUFBLG9CQUFBO0lBU3JCSixNQUFBQSxXQUFBLEVBSEMrRSxXQUFBQSxZQUFZLGlEQUNaMUUsZUFDQUMsMkVBQ3dCd0UsNEJBQUExRSxXQUFBLHdCQUFBO0lBU3pCSixNQUFBQSxXQUFBLEVBSEMrRSxXQUFBQSxZQUFZLDRCQUNaMUUsZUFDQUMsMkVBQ21Cd0UsNEJBQUExRSxXQUFBLG1CQUFBO0lBbkNUMEUsUUFBQUEsc0JBQW1COUUsaUJBQUEsRUFEL0IxQyxrRkFDWXdIO0lDZERFLFFBQUFBLHVCQUFBQTtLQUFaLFNBQVlBO1FBRVZBLGdCQUFBLGFBQUE7UUFDQUEsZ0JBQUEsWUFBQTtRQUVBQSxnQkFBQSxZQUFBO1FBQ0FBLGdCQUFBLGNBQUE7UUFDQUEsZ0JBQUEsb0JBQUE7UUFDQUEsZ0JBQUEsWUFBQTtBQUNELE1BVEQsQ0FBWUEsUUFBQUEsb0JBQUFBLDBCQUFlLENBQUE7SUFpQmZDLFFBQUFBLG9CQUFBQTtLQUFaLFNBQVlBO1FBRVZBLGFBQUEsVUFBQTtBQUNELE1BSEQsQ0FBWUEsUUFBQUEsaUJBQUFBLHVCQUFZLENBQUE7SUFXakIsTUFBTUMsZ0JBQWdCO0lDTmhCQyxRQUFBQSxXQUFOLE1BQU1BLGlCQUFpQnBGO1FBb0M1QixXQUFBM0gsQ0FBWXJCO1lBQ1Z3QixNQUFNeEI7WUFIUnlCLEtBQUEwSCxPQUFxQitFLFFBQUFBLGFBQWFHO0FBSWxDOztJQS9CQXBGLE1BQUFBLFdBQUEsRUFGQytFLFdBQUFBLFlBQVksc0NBQ1o5RSxzREFDV2tGLGlCQUFBL0UsV0FBQSxXQUFBO0lBVVpKLE1BQUFBLFdBQUEsRUFKQ3FGLEtBQUFBLFNBQVNQLFFBQUFBLHFCQUFxQjtRQUM3Qi9HLFFBQVF1SCxLQUFBQSxRQUFRQztRQUNoQkMsUUFBUUYsS0FBQUEsUUFBUUM7d0NBRUpULFFBQUFBLHdCQUFvQkssaUJBQUEvRSxXQUFBLG9CQUFBO0lBU2xDSixNQUFBQSxXQUFBLEVBSENLLGVBQ0FDLGdDQUNBM0wseURBQ2N3USxpQkFBQS9FLFdBQUEsY0FBQTtJQVFmSixNQUFBQSxXQUFBLEVBRkNLLGVBQ0FDLDJFQUNzQzZFLGlCQUFBL0UsV0FBQSxhQUFBO0lBbEM1QitFLFFBQUFBLFdBQVFuRixpQkFBQSxFQURwQjFDLGtGQUNZNkg7VUNUQU07O1lBQ0lqTixLQUFBa04sU0FBaUIsSUFBSUMsUUFBQUEsV0FBV0YsVUFBVXJTO0FBQU07UUFJL0QsV0FBQWdGLElBQXVCO1FBU2YsOEJBQWF3TixDQUNuQkMsZUFDQUM7WUFFQSxJQUFJRCx5QkFBeUJFLFlBQVksT0FBT0Y7WUFDaEQsSUFDRUEsY0FBY0csTUFDWix5RUFHRixPQUFPSDtZQUNULGFBQWFDLFdBQVdEO0FBQzFCO1FBUUEscUJBQWFJLENBQVNKO1lBQ3BCLFdBQVdBLGtCQUFrQixVQUFVLE9BQU9BO1lBRTlDLE1BQU1DLGFBQWFwUyxNQUFPNUI7Z0JBQ3hCLE9BQU1vVSxVQUFFQSxrQkFBbUJDLEtBQUFBLGdCQUFnQkMsT0FBTztnQkFDbEQsYUFBYUYsU0FBU0QsU0FBU25VOztZQUdqQyxhQUFhZ1UsV0FBV0Q7QUFDMUI7UUFXQSxzQkFBYVEsQ0FDWEMsVUFDQUMsWUFDQUMsYUFDQXZRLE9BQ0F3UTtZQUVBak8sS0FBS2tOLE9BQU9uSSxNQUNWbUosb0JBQUFBLGFBQ0UsaURBQ0F6USxPQUNBcVEsVUFDQUU7WUFHSixNQUFNRyxPQUFPLElBQUlDLGFBQUFBLEtBQUtOO1lBQ3RCLE1BQU1PLFNBQVNKLFNBQVNLLE1BQ3BCO2dCQUNFQyxVQUFVO2dCQUNWQyxLQUFLUCxRQUFRSyxJQUFJRztnQkFDakJDLE1BQU1ULFFBQVFLLElBQUlJO2dCQUNsQkMsT0FBT1YsUUFBUUssSUFBSU07Z0JBQ25CQyxLQUFLbEgsT0FBT3NHLFFBQVFLLElBQUlPO2dCQUUxQnJTO1lBQ0osTUFBTXNTLGNBQWM5TyxLQUFLK08sZUFBZVY7WUFFeENGLEtBQUthLGVBQWVGO1lBQ3BCLE1BQU1HLGdCQUFnQmhCLFNBQVNLLFlBQ3JCdE8sS0FBS2tQLG9CQUFvQkosYUFBYWQsYUFBYUMsUUFBUUssT0FDakV0TyxLQUFLbVAseUJBQXlCTCxhQUFhZjtrQkFDekNJLEtBQUtpQixjQUFjSCxlQUFlakIsYUFBYXZRO1lBQ3JELE9BQU8wUTtBQUNUO1FBRUEscUJBQU9ZLENBQWVkO1lBQ3BCLEtBQUtBLFNBQVMsT0FBT0csYUFBQUEsS0FBS2lCO1lBQzFCLElBQUlwQyxVQUFVNkIsYUFBYSxPQUFPN0IsVUFBVTZCO1lBRTVDN0IsVUFBVTZCLGNBQWNWLGtCQUFLaUIsZUFBZXBCO1lBQzVDLE9BQU9oQixVQUFVNkI7QUFDbkI7UUFFUSwrQkFBT0ssQ0FDYkwsYUFDQWY7WUFFQSxLQUFLQSxZQUFZO2dCQUNmLE1BQU0sSUFBSS9FLE1BQ1I7QUFFSjtZQUNBLE9BQU84RixZQUFZUSxpQkFBaUJ2QjtBQUN0QztRQUVRLGdDQUFhbUIsQ0FDbkJKLGFBQ0FkLGFBQ0FNO1lBRUEsTUFBTWlCLE1BQ0pqQixJQUFJa0IsWUFBWWxCLElBQUlrQixTQUFTQyxPQUFPOVMsU0FBUyxJQUN6QytTLE9BQU81RSxLQUFLd0QsSUFBSWtCLFVBQVUsZUFDcEJ4UCxLQUFLMlAsa0JBQWtCM0I7WUFDbkMsTUFBTWxOLFlBQVlnTyxZQUFZYyxPQUFPTDtZQUNyQyxLQUFLek8sY0FBZUEsSUFBSStPLGNBQWMsZUFBZS9PLElBQUkrTyxhQUFjO2dCQUNyRSxNQUFNLElBQUk3RyxNQUFNO0FBQ2xCO1lBQ0EsT0FBT2xJO0FBQ1Q7UUFFQSw4QkFBYTZPLENBQWtCM0I7WUFDN0IsTUFBTThCLE9BQU8sSUFBSUMsU0FBQUEsZ0JBQWdCL0I7WUFDakMsTUFBTWdDLE1BQU1GLEtBQUtHLFVBQVVDLE9BQU87Z0JBQUVDLFFBQVE7O1lBQzVDLE1BQU1DLFNBQVNWLE9BQU81RSxLQUFLLEVBQUM7WUFDNUIsTUFBTXVGLElBQUlYLE9BQU81RSxLQUFLa0YsSUFBSUssS0FBSyxJQUFJO1lBQ25DLE1BQU1DLElBQUlaLE9BQU81RSxLQUFLa0YsSUFBSU0sS0FBSyxJQUFJO1lBQ25DLE9BQU9DLFNBQ0pDLFdBQVcsVUFDWGpMLE9BQU9tSyxPQUFPZSxPQUFPLEVBQUNMLFFBQVFDLEdBQUdDLE1BQ2pDSTtBQUNMO1FBU0Esd0JBQWFDLENBQ1hsVCxPQUNBbVQ7WUFFQSxNQUFNQyxxQkFBcUIzVixNQUFPNUI7Z0JBQ2hDLE9BQU1vVSxVQUFFQSxrQkFBbUJDLEtBQUFBLGdCQUFnQkMsT0FBTztnQkFDbEQsTUFBTWtELGlCQUFpQjlRLEtBQUsrUSxvQkFBb0J6WDtnQkFDaEQsTUFBTTBYLG9CQUFvQnRELFNBQVNELFNBQVNxRDtnQkFDNUMsT0FBT0U7O1lBR1QsTUFBTUEsb0JBQWlDaFIsS0FBS29OLGtCQUMxQ3dELG1CQUNBQztZQUdGLE9BQU87Z0JBQUVwVDtnQkFBT3VUOztBQUNsQjtRQUVBLGdDQUFhRCxDQUFvQkU7WUFDL0IsT0FBTXZELFVBQUVBLGtCQUFtQkMsS0FBQUEsZ0JBQWdCQyxPQUFPO1lBQ2xELE9BQU1wVCxNQUFFQSxjQUFlbVQsS0FBQUEsZ0JBQWdCQyxPQUFPO1lBQzlDLE1BQU1yUyxjQUFjbVMsU0FBU3dELFFBQVFEO1lBQ3JDLE9BQU96VyxLQUFLeVcsU0FBUzFWLE1BQU07QUFDN0I7UUFFQSx1Q0FBYTRWLENBQTJCRjtZQUN0QyxPQUFNdkQsVUFBRUEsa0JBQW1CQyxLQUFBQSxnQkFBZ0JDLE9BQU87WUFDbEQsT0FBTXBULE1BQUVBLGNBQWVtVCxLQUFBQSxnQkFBZ0JDLE9BQU87WUFDOUMsTUFBTXJTLGNBQWNtUyxTQUFTd0QsUUFBUUQ7WUFDckMsY0FBY3ZELFNBQVNELFNBQVNqVCxLQUFLeVcsU0FBUzFWLE1BQU0sTUFBTXFQO0FBQzVEO1FBRUEsMkJBQWF3RyxDQUFlalk7WUFDMUIsT0FBTXVVLFVBQUVBLGtCQUFtQkMsS0FBQUEsZ0JBQWdCQyxPQUFPO1lBQ2xELGNBQWNGLFNBQVNELFNBQVN0VSxXQUFXeVI7QUFDN0M7UUFFQSxzQkFBYXlHLENBQVVDO1lBQ3JCLE1BQU1DLG1CQUFtQnJXLE1BQU81QjtnQkFDOUIsT0FBTW9VLFVBQUVBLGtCQUFtQkMsS0FBQUEsZ0JBQWdCQyxPQUFPO2dCQUNsRCxNQUFNNEQsZ0JBQWdCeFIsS0FBSytRLG9CQUFvQnpYO2dCQUMvQyxhQUFhb1UsU0FBU0QsU0FBUytEOztZQUdqQyxNQUFNQyxzQkFBdUJ6UixLQUFLb04sa0JBQ2hDa0Usa0JBQ0FDO1lBRUYsTUFBTXhELG1CQUFtQi9OLEtBQUswUixrQkFBa0JEO1lBQ2hELE1BQU0xSyxPQUFPak0sT0FBTzZXLHNCQUFzQjVEO1lBQzFDLE1BQU02RCxJQUFLN0QsV0FBbUJoSCxLQUFLO1lBR25DLE9BQU84SyxjQUFBQSxRQUFRQyxvQkFBb0JGO0FBQ3JDO1FBRVEsOEJBQWFGLENBQWtCSztZQUNyQyxNQUFNQyxVQUFVO1lBQ2hCLElBQUlDO1lBQ0osSUFDR0MsV0FBbUJDLFVBQ2xCRCxXQUFtQkMsT0FBMkJDLFFBQ2hEO2dCQUNBSCxTQUFXQyxXQUFtQkUsT0FBZUg7QUFDL0MsbUJBQU87Z0JBQ0wsTUFBTXpELFlBQWFiLEtBQUFBLGdCQUFnQkMsT0FBT29FO2dCQUMxQ0MsU0FBU3pELElBQUl5RCxVQUFVekQsSUFBSTZELFVBQVVKO0FBQ3ZDO1lBRUEsS0FBS0EsUUFBUSxNQUFNLElBQUlqSixNQUFNO1lBRTdCLFNBQVNzSixPQUFPeko7Z0JBQ2QsTUFBTTBKLE1BQU0sSUFBSUMsWUFBWTNKLElBQUlsTTtnQkFDaEMsTUFBTThWLFVBQVUsSUFBSWxGLFdBQVdnRjtnQkFDL0IsS0FBSyxJQUFJMUwsSUFBSSxHQUFHNkwsU0FBUzdKLElBQUlsTSxRQUFRa0ssSUFBSTZMLFFBQVE3TCxLQUFLO29CQUNwRDRMLFFBQVE1TCxLQUFLZ0MsSUFBSThKLFdBQVc5TDtBQUM5QjtnQkFDQSxPQUFPMEw7QUFDVDtZQUVBLE1BQU0xSixNQUFNa0osSUFDVG5ILFNBQVMsUUFDVC9OLFFBQVEsK0JBQStCLElBQ3ZDK1YsV0FBVyxNQUFNLElBQ2pCL1YsUUFBUSw2QkFBNkI7WUFDeEMsTUFBTWdXLFVBQVVuRCxPQUFPNUUsS0FBS2pDLEtBQUssVUFBVStCLFNBQVM7WUFDcEQsTUFBTWtJLFlBQVlSLE9BQU9PO1lBQ3pCLE1BQU0vUixZQUFZbVIsT0FBT2MsVUFDdkIsU0FDQUQsV0FDQTtnQkFDRWxZLE1BQU07Z0JBQ05vWSxZQUFZO2VBRWQsTUFDQSxFQUFDO1lBR0gsT0FBT2xTO0FBQ1Q7O0lBT0ksU0FBVW1TLHdCQUF3QkM7UUFJdEMsTUFBTUMsa0JBQWtCLElBQUlDLEtBQUFBLGdCQUFTRjtRQUdyQyxNQUFNRyxTQUFTRixnQkFBZ0JHLFlBQVlqUixLQUN4Q3JILEtBQU1BLEVBQUUwTSxTQUFTO1FBRXBCLEtBQUsyTCxRQUFRO1lBQ1gsTUFBTSxJQUFJckssTUFDUjtBQUVKO1FBR0EsSUFBSXVLLE1BQU03RCxPQUFPNUUsS0FBSyxJQUFJeUMsV0FBVzhGLE9BQU9wUixRQUN6QzJJLFNBQVMsT0FDVDRJO1FBV0gsSUFBSUQsSUFBSUUsV0FBVyxlQUFlRixJQUFJNVcsVUFBVSxJQUFJLElBQ2xENFcsTUFBTUEsSUFBSXZRLE1BQU0sR0FBRyxJQUFJO1FBRXpCLE9BQU87WUFBRXVRO1lBQUtHLFFBQVFQLGdCQUFnQlE7O0FBQ3hDO0lDNVNBLE1BQU1wRCxTQUFTLElBQUk2QixVQUFBQTtJQUNuQnRDLGdCQUFLOEQsZUFBZUMsSUFBSXREO0lBRVp1RCxRQUFBQSxxQkFBQUE7S0FBWixTQUFZQTtRQUNWQSxjQUFBLFdBQUE7UUFDQUEsY0FBQSxXQUFBO1FBQ0FBLGNBQUEsWUFBQTtRQUNBQSxjQUFBLFlBQUE7UUFDQUEsY0FBQSxZQUFBO1FBQ0FBLGNBQUEsY0FBQTtRQUNBQSxjQUFBLFlBQUE7UUFDQUEsY0FBQSxZQUFBO1FBQ0FBLGNBQUEsWUFBQTtRQUNBQSxjQUFBLFlBQUE7UUFDQUEsY0FBQSxZQUFBO0FBQ0QsTUFaRCxDQUFZQSxRQUFBQSxrQkFBQUEsd0JBQWEsQ0FBQTtJQW1CYkMsUUFBQUEsY0FBQUE7S0FBWixTQUFZQTtRQUNWQSxPQUFBLFVBQUE7UUFDQUEsT0FBQUEsT0FBQSxnQkFBQSxPQUFBO1FBQ0FBLE9BQUFBLE9BQUEsZUFBQSxNQUFBO1FBQ0FBLE9BQUFBLE9BQUEsdUJBQUEsTUFBQTtRQUNBQSxPQUFBQSxPQUFBLHdCQUFBLE1BQUE7UUFDQUEsT0FBQSxlQUFBO1FBQ0FBLE9BQUEsbUJBQUE7QUFDRCxNQVJELENBQVlBLFFBQUFBLFdBQUFBLGlCQUFNLENBQUE7VUFVTEM7UUFPWCxXQUFBcFUsQ0FBb0JxVTtZQUFBalUsS0FBQWlVLFdBQUFBO1lBTkhqVSxLQUFBa1UsVUFBc0IsSUFBSTNHLFdBQVc7WUFPcEQsSUFBSXZOLEtBQUtpVSxTQUFTdFgsVUFBVSxLQUFLLE1BQU0sSUFBSXFNLE1BQU07WUFFakQsS0FBSyxJQUFJbUwsSUFBSSxHQUFHQSxJQUFJblUsS0FBS2tVLFFBQVF2WCxRQUFRd1gsS0FBS25VLEtBQUtrVSxRQUFRQyxLQUFLO1lBRWhFLEtBQUssSUFBSXROLElBQUksR0FBR0EsSUFBSW9OLFNBQVN0WCxRQUFRa0ssS0FBSztnQkFDeEMsTUFBTXdKLElBQUk0RCxTQUFTRyxPQUFPdk47Z0JBQzFCLE1BQU13TixLQUFLaEUsRUFBRXNDLFdBQVc7Z0JBQ3hCLElBQUkzUyxLQUFLa1UsUUFBUUcsUUFBUSxLQUFLLE1BQU0sSUFBSXJMLE1BQU1xSCxJQUFJO2dCQUVsRHJRLEtBQUtrVSxRQUFRRyxNQUFNeE47QUFDckI7WUFFQTdHLEtBQUtzVSxPQUFPdFUsS0FBS2lVLFNBQVN0WDtZQUMxQnFELEtBQUt1VSxTQUFTdlUsS0FBS2lVLFNBQVNHLE9BQU87WUFDbkNwVSxLQUFLd1UsU0FBU0MsS0FBS3JULElBQUlwQixLQUFLc1UsUUFBUUcsS0FBS3JULElBQUk7WUFDN0NwQixLQUFLMFUsVUFBVUQsS0FBS3JULElBQUksT0FBT3FULEtBQUtyVCxJQUFJcEIsS0FBS3NVO0FBQy9DO1FBRUEsTUFBQUssQ0FBT0M7WUFDTCxXQUFXQSxXQUFXLFVBQVU7Z0JBQzlCQSxTQUFTbEYsT0FBTzVFLEtBQUs4SjtBQUN2QixtQkFBTyxJQUFJcEMsWUFBWXFDLE9BQU9ELFNBQVM7Z0JBQ3JDQSxTQUFTLElBQUlySCxXQUNYcUgsT0FBT0UsUUFDUEYsT0FBT0csWUFDUEgsT0FBT0k7QUFFWCxtQkFBTyxJQUFJNVIsTUFBTUMsUUFBUXVSLFNBQVM7Z0JBQ2hDQSxTQUFTckgsV0FBV3pDLEtBQUs4SjtBQUMzQjtZQUVBLElBQUlBLE9BQU9qWSxXQUFXLEdBQUcsT0FBTztZQUdoQyxJQUFJc1ksU0FBUztZQUNiLElBQUl0WSxTQUFTO1lBQ2IsSUFBSXVZLFNBQVM7WUFDYixNQUFNQyxPQUFPUCxPQUFPalk7WUFDcEIsT0FBT3VZLFdBQVdDLFFBQVFQLE9BQU9NLFlBQVksR0FBRztnQkFDOUNBO2dCQUNBRDtBQUNGO1lBRUEsTUFBTUcsUUFBU0QsT0FBT0QsVUFBVWxWLEtBQUswVSxVQUFVLE1BQU87WUFDdEQsTUFBTVcsTUFBTSxJQUFJOUgsV0FBVzZIO1lBRTNCLE9BQU9GLFdBQVdDLE1BQU07Z0JBQ3RCLElBQUlHLFFBQVFWLE9BQU9NO2dCQUVuQixJQUFJck8sSUFBSTtnQkFDUixLQUNFLElBQUkwTyxNQUFNSCxPQUFPLElBQ2hCRSxVQUFVLEtBQUt6TyxJQUFJbEssV0FBVzRZLFNBQVMsR0FDeENBLE9BQU8xTyxLQUNQO29CQUNBeU8sU0FBVSxNQUFNRCxJQUFJRSxTQUFVO29CQUM5QkYsSUFBSUUsT0FBT0QsUUFBUXRWLEtBQUtzVSxTQUFTO29CQUNqQ2dCLFFBQVNBLFFBQVF0VixLQUFLc1UsU0FBVTtBQUNsQztnQkFDQSxJQUFJZ0IsVUFBVSxHQUFHLE1BQU0sSUFBSXRNLE1BQU07Z0JBRWpDck0sU0FBU2tLO2dCQUNUcU87QUFDRjtZQUVBLElBQUlNLE1BQU1KLE9BQU96WTtZQUNqQixPQUFPNlksUUFBUUosUUFBUUMsSUFBSUcsU0FBUyxHQUFHQTtZQUd2QyxJQUFJM00sTUFBTTdJLEtBQUt1VSxPQUFPa0IsT0FBT1I7WUFDN0IsTUFBT08sTUFBTUosUUFBUUksS0FBSztnQkFDeEIzTSxPQUFPN0ksS0FBS2lVLFNBQVNHLE9BQU9pQixJQUFJRztBQUNsQztZQUNBLE9BQU8zTTtBQUNUO1FBRVEsWUFBQTZNLENBQWFkO1lBQ25CLElBQUlBLE9BQU9qWSxXQUFXLEdBQUcsT0FBTyxJQUFJNFEsV0FBVztZQUUvQyxJQUFJb0ksTUFBTTtZQUVWLElBQUlWLFNBQVM7WUFDYixJQUFJdFksU0FBUztZQUNiLE9BQU9pWSxPQUFPZSxTQUFTM1YsS0FBS3VVLFFBQVE7Z0JBQ2xDVTtnQkFDQVU7QUFDRjtZQUVBLE1BQU1QLFFBQVNSLE9BQU9qWSxTQUFTZ1osT0FBTzNWLEtBQUt3VSxTQUFTLE1BQU87WUFDM0QsTUFBTW9CLE9BQU8sSUFBSXJJLFdBQVc2SDtZQUU1QixPQUFPUixPQUFPZSxNQUFNO2dCQUVsQixJQUFJTCxRQUFRdFYsS0FBS2tVLFFBQVFVLE9BQU9qQyxXQUFXZ0Q7Z0JBRTNDLElBQUlMLFVBQVUsS0FBSztnQkFFbkIsSUFBSXpPLElBQUk7Z0JBQ1IsS0FDRSxJQUFJZ1AsTUFBTVQsT0FBTyxJQUNoQkUsVUFBVSxLQUFLek8sSUFBSWxLLFdBQVdrWixTQUFTLEdBQ3hDQSxPQUFPaFAsS0FDUDtvQkFDQXlPLFNBQVV0VixLQUFLc1UsT0FBT3NCLEtBQUtDLFNBQVU7b0JBQ3JDRCxLQUFLQyxPQUFPUCxRQUFRLFFBQVE7b0JBQzVCQSxRQUFTQSxRQUFRLFFBQVM7QUFDNUI7Z0JBQ0EsSUFBSUEsVUFBVSxHQUFHLE1BQU0sSUFBSXRNLE1BQU07Z0JBRWpDck0sU0FBU2tLO2dCQUNUOE87QUFDRjtZQUVBLElBQUlHLE1BQU1WLE9BQU96WTtZQUNqQixPQUFPbVosUUFBUVYsUUFBUVEsS0FBS0UsU0FBUyxHQUFHQTtZQUV4QyxNQUFNQyxNQUFNLElBQUl4SSxXQUFXMEgsVUFBVUcsT0FBT1U7WUFDNUMsSUFBSTNCLElBQUljO1lBQ1IsT0FBT2EsUUFBUVYsTUFBTVcsSUFBSTVCLE9BQU95QixLQUFLRTtZQUVyQyxPQUFPQztBQUNUO1FBRUEsTUFBQTdTLENBQU8wUjtZQUNMLE1BQU1FLFNBQVM5VSxLQUFLMFYsYUFBYWQ7WUFDakMsSUFBSUUsUUFBUSxPQUFPQTtZQUNuQixNQUFNLElBQUk5TCxNQUFNLGFBQWFoSixLQUFLc1UsT0FBTztBQUMzQzs7VUFHVzBCOztZQUNhaFcsS0FBQWlXLGFBQWEsSUFBSWpDLFlBQVlGLFFBQUFBLGNBQWNvQztBQUFROztZQUNuRGxXLEtBQUFrTixTQUFTLElBQUlDLFFBQUFBLFdBQVc2SSxZQUFZcGI7QUFBTTtRQUNsRSxXQUFBZ0YsSUFBdUI7UUFFdkIsOEJBQU91VyxDQUF3Qm5JO1lBQzdCaE8sS0FBS2tOLE9BQU9uSSxNQUFNbUosb0JBQUFBLGFBQWEsNEJBQTRCRjtZQUMzRCxNQUFNa0YsT0FBTyxJQUFJcEQsZ0JBQUtDLGdCQUFnQi9CO1lBQ3RDLE9BQU1vSSxTQUFFQSxTQUFPQyxRQUFFQSxVQUFXbkQ7WUFDNUJsVCxLQUFLa04sT0FBT25JLE1BQ1ZtSixvQkFBQUEsYUFDRSxzREFDQWtJLFNBQ0FDO1lBR0osT0FBTyxVQUFVRCxRQUFReEQsV0FBVyxNQUFNLFVBQVV5RCxPQUFPekQsV0FBVyxNQUFNO0FBQzlFO1FBRUEsYUFBTytCLENBQU85TDtZQUNaLE9BQU83SSxLQUFLaVcsV0FBV3RCLE9BQU85TDtBQUNoQztRQUNBLGFBQU8zRixDQUFPMkY7WUFDWixNQUFNZ0ssVUFBVTdTLEtBQUtpVyxXQUFXL1MsT0FBTzJGO1lBQ3ZDLE1BQU14TixVQUFTLElBQUlpTyxhQUFjcEcsT0FBTzJQO1lBQ3hDLE9BQU94WDtBQUNUO1FBRUEsMEJBQU9pYixDQUFvQnpOO1lBQ3pCLE1BQU0wSixNQUFNLElBQUlDLFlBQVkzSixJQUFJbE07WUFDaEMsTUFBTThWLFVBQVUsSUFBSWxGLFdBQVdnRjtZQUMvQixLQUFLLElBQUkxTCxJQUFJLEdBQUc2TCxTQUFTN0osSUFBSWxNLFFBQVFrSyxJQUFJNkwsUUFBUTdMLEtBQUs7Z0JBQ3BENEwsUUFBUTVMLEtBQUtnQyxJQUFJOEosV0FBVzlMO0FBQzlCO1lBQ0EsT0FBTzBMO0FBQ1Q7UUFFUSx1QkFBYWdFLENBQ25CN08sTUFDQXFLLEtBQ0F5RTtZQUVBLE1BQU12RSxTQUFTMUIsT0FBTzBCO1lBRXRCLE1BQU1wSixNQUFNa0osSUFDVG5ILFNBQVMsUUFDVC9OLFFBQ0MsSUFBSTRaLE9BQU8sZUFBZS9PLEtBQUs4TCx3Q0FDL0IsSUFFRFosV0FBVyxNQUFNLElBQ2pCL1YsUUFDQyxJQUFJNFosT0FBTyxhQUFhL08sS0FBSzhMLHdDQUM3QjtZQUVKLE1BQU1YLFVBQVVuRCxPQUFPNUUsS0FBS2pDLEtBQUssVUFBVStCLFNBQVM7WUFDcEQsTUFBTWtJLFlBQVk5UyxLQUFLc1csb0JBQW9CekQ7WUFDM0MsTUFBTS9SLFlBQVltUixPQUFPYyxVQUN2QixTQUNBRCxXQUNBO2dCQUNFbFksTUFBTTtnQkFDTm9ZLFlBQVk7ZUFFZCxNQUNBd0QsU0FBU0EsU0FBUyxFQUFDO1lBR3JCLE9BQU8xVjtBQUNUO1FBRUEsOEJBQWE0USxDQUFrQkssS0FBc0J5RTtZQUNuRCxPQUFPeFcsS0FBS3VXLFdBQVcsV0FBV3hFLEtBQUt5RTtBQUN6QztRQUVBLDZCQUFhRSxDQUFpQjNFLEtBQXNCeUU7WUFDbEQsT0FBT3hXLEtBQUt1VyxXQUFXLFVBQVV4RSxLQUFLeUU7QUFDeEM7UUFFQSxpQkFBYUcsQ0FBSzVJLFlBQW9CcEs7WUFDcEMsTUFBTTdDLFlBQVlkLEtBQUswUixrQkFBa0IzRDtZQUN6QyxNQUFNNkksYUFBY3JHLE9BQU8wQixPQUFPMEUsS0FDaEM7Z0JBQ0UvYixNQUFNO2dCQUNOaWMsTUFBTTtlQUVSL1YsS0FDQTZDO1lBR0YsT0FBT1AsTUFBTTBILEtBQUssSUFBSXlDLFdBQVdxSixPQUM5QjdZLElBQUsrWSxLQUFNQSxFQUFFbE0sU0FBUyxJQUFJbU0sU0FBUyxHQUFHLE1BQ3RDdmMsS0FBSztBQUNWO1FBRUEsbUJBQWF3YyxDQUNYaEosYUFDQWlKLFdBQ0F0VDtZQUVBLE1BQU11UCxPQUFPLElBQUlwRCxnQkFBS0MsZ0JBQWdCL0I7WUFDdEMsTUFBTWxOLFlBQVlvUyxLQUFLakQsVUFBVUM7WUFDakMrRyxtQkFDU0EsY0FBYyxXQUFXdkgsT0FBTzVFLEtBQUttTSxXQUFXLFNBQVNBO1lBRWxFdFQsY0FBZUEsU0FBUyxXQUFXK0wsT0FBTzVFLEtBQUtuSCxRQUFRQTtZQUN2RCxPQUFPNE0sT0FBTzBCLE9BQU8rRSxPQUNuQjtnQkFDRXBjLE1BQU07Z0JBQ05pYyxNQUFNO2VBRVIvVixLQUNBbVcsV0FDQXRUO0FBRUo7UUFFQSxvQkFBYXVULENBQVFsSixhQUFxQnJLO1lBQ3hDLE1BQU11UCxPQUFPLElBQUlwRCxnQkFBS0MsZ0JBQWdCL0I7WUFDdEMsTUFBTWxOLFlBQVlvUyxLQUFLakQsVUFBVUM7WUFDakN2TSxjQUFlQSxTQUFTLFdBQVcrTCxPQUFPNUUsS0FBS25ILFFBQVFBO1lBQ3ZELE1BQU1pVCxhQUFhNVcsS0FBS21YLGtCQUFrQkQsUUFDeEM7Z0JBQ0V0YyxNQUFNO2VBRVJrRyxLQUNBNkM7WUFHRixPQUFPUCxNQUFNMEgsS0FBSyxJQUFJeUMsV0FBV3FKLE9BQzlCN1ksSUFBSytZLEtBQU1BLEVBQUVsTSxTQUFTLElBQUltTSxTQUFTLEdBQUcsTUFDdEN2YyxLQUFLO0FBQ1Y7UUFFUSxzQkFBTzJjO1lBQ2IsT0FBT0MsUUFBQUEsY0FDRmxGLFdBQW1CQyxPQUFPNUIsT0FBTzBCLFNBQ2xDMUIsT0FBTzBCO0FBQ2I7UUFFQSxvQkFBYW9GLENBQVF0SixZQUFvQnBLO1lBQ3ZDLE1BQU03QyxZQUFZZCxLQUFLMFIsa0JBQWtCM0Q7WUFDekNwSyxjQUNTQSxTQUFTLFdBQVcrTCxPQUFPNUUsS0FBS25ILE1BQU0sU0FBU0E7WUFFeEQsT0FBTzNELEtBQUttWCxrQkFBa0JFLFFBQzVCO2dCQUNFemMsTUFBTTtlQUVSa0csS0FDQTZDO0FBRUo7UUFXQSxzQkFBYTJULENBQVUzVDtZQUNyQixNQUFNNFQsY0FBYyxJQUFJQztZQUN4QixJQUFJN1QsU0FBU25ILFdBQVc7Z0JBQ3RCLE1BQU1pYixhQUFhbEgsT0FBT21IO2dCQUMxQi9ULE9BQU80VCxZQUFZNUMsT0FBTzhDLFlBQVkzQztBQUN4QztZQUVBLE1BQU02QyxvQkFBb0IzWCxLQUFLbVgsa0JBQWtCcEUsVUFDL0MsT0FDQXBQLE1BQ0FvUSxRQUFBQSxPQUFPNkQsZUFDUCxPQUNBLEVBQUM7WUFHSCxPQUFPO2dCQUNMOVcsS0FBSzZXO2dCQUNMRSxJQUFJbFU7O0FBRVI7UUFVQSw2QkFBYW1VLENBQWlCQyxNQUFjalg7WUFDMUMsTUFBTXlXLGNBQWMsSUFBSUM7WUFDeEIsTUFBTVEsYUFBYVQsWUFBWTVDLE9BQU9vRDtZQUN0QyxNQUFNRSxtQkFBbUJqWSxLQUFLbVgsa0JBQWtCekcsT0FDOUMsV0FDQXNIO1lBRUYsTUFBTUUsU0FBUztnQkFDYnRkLE1BQU1tWixRQUFBQSxPQUFPNkQ7Z0JBQ2JmLE1BQU05QyxRQUFBQSxPQUFPb0U7Z0JBQ2JKLE1BQU1FO2dCQUNORyxZQUFZckUsUUFBQUEsT0FBT3NFOztZQUVyQixNQUFNQyxtQkFBbUJ0WSxLQUFLbVgsa0JBQWtCb0IsV0FDOUNMLFFBQ0FwWCxLQUNBaVQsUUFBQUEsT0FBT3lFLFlBQVk7WUFFckIsT0FBT3hZLEtBQUs0UCxPQUFPMEk7QUFDckI7UUFTQSxtQkFBYTFJLENBQU8wSTtZQUVsQixNQUFNRyxRQUFRO1lBQ2QsTUFBTUMsU0FBUztZQUNmLE1BQU1DLGFBQWFMLFdBQVd0VixNQUFNLEdBQUcwVjtZQUN2QyxNQUFNYixLQUFLUyxXQUFXdFYsTUFBTTBWO1lBQzVCLE1BQU1FLDhCQUE4QjVZLEtBQUttWCxrQkFBa0JwRSxVQUN6RCxPQUNBNEYsWUFDQTtnQkFBRS9kLE1BQU1tWixRQUFBQSxPQUFPOEU7ZUFDZixPQUNBLEVBQUMsV0FBVztZQUVkLE9BQU87Z0JBQ0wvWCxLQUFLOFg7Z0JBQ0xmLElBQUlBOztBQUVSO1FBVUEsdUJBQWFpQixDQUNYQyxNQUNBQztZQUVBLE1BQU16QixjQUFjLElBQUlDO1lBQ3hCLE1BQU15QixhQUFhMUIsWUFBWTVDLE9BQU9vRTtZQUN0QyxNQUFNRyxzQkFBc0JsWixLQUFLbVgsa0JBQWtCRCxRQUNqRDtnQkFBRXRjLE1BQU1tWixRQUFBQSxPQUFPOEU7Z0JBQXFCaEIsSUFBSW1CLFVBQVVuQjtlQUNsRG1CLFVBQVVsWSxLQUNWbVk7WUFFRixPQUFPQztBQUNUO1FBVUEsdUJBQWFDLENBQ1hELGVBQ0FGO1lBRUEsTUFBTUksY0FBYyxJQUFJOVA7WUFDeEIsTUFBTStQLHNCQUFzQnJaLEtBQUttWCxrQkFBa0JFLFFBQ2pEO2dCQUFFemMsTUFBTW1aLFFBQUFBLE9BQU84RTtnQkFBcUJoQixJQUFJbUIsVUFBVW5CO2VBQ2xEbUIsVUFBVWxZLEtBQ1ZvWTtZQUVGLE9BQU9FLFlBQVlsVyxPQUFPbVc7QUFDNUI7O0lDMWJJLE1BQU9DLHNCQUFzQjlhLGFBQUFBO1FBQ2pDLFdBQUFvQixDQUFZMlo7WUFDVnhaLE1BQU13WixLQUFLRCxjQUFjMWU7QUFDM0I7O0lBYUksTUFBTzRlLHFCQUFxQmhiLGFBQUFBO1FBQ2hDLFdBQUFvQixDQUFZMlo7WUFDVnhaLE1BQU13WixLQUFLQyxhQUFhNWU7QUFDMUI7O0lBYUksTUFBTzZlLHVCQUF1QmpiLGFBQUFBO1FBQ2xDLFdBQUFvQixDQUFZMlo7WUFDVnhaLE1BQU13WixLQUFLRSxlQUFlN2U7QUFDNUI7O0lBWUksTUFBTzhlLDBCQUEwQkMsS0FBQUE7UUFDckMsV0FBQS9aLENBQVkyWjtZQUNWeFosTUFBTXdaLEtBQUtHLGtCQUFrQjllO0FBQy9COztJQTRCSSxNQUFPZ2YsNEJBQTRCcGIsYUFBQUE7UUFDdkMsV0FBQW9CLENBQVkyWjtZQUNWeFosTUFBTXdaLEtBQUtLLG9CQUFvQmhmLE1BQU07QUFDdkM7O0lBR0ksTUFBT2lmLHNDQUFzQ0MsYUFBQUE7UUFDakQsV0FBQWxhLENBQVkyWixNQUFzQjtZQUNoQ3haLE1BQU04Wiw4QkFBOEJqZixNQUFNMmUsS0FBSztBQUNqRDs7SUFnQ0ksTUFBT1EsNEJBQTRCRCxhQUFBQTtRQUN2QyxXQUFBbGEsQ0FBWTJaO1lBQ1Z4WixNQUFNZ2Esb0JBQW9CbmYsTUFBTTJlLEtBQUs7QUFDdkM7O0lBR0ksTUFBT1MsMEJBQTBCeGIsYUFBQUE7UUFDckMsV0FBQW9CLENBQVkyWjtZQUNWeFosTUFBTXdaLEtBQUtTLGtCQUFrQnBmLE1BQU07QUFDckM7O0lBR0ksTUFBT3FmLHlCQUF5QnpiLGFBQUFBO1FBQ3BDLFdBQUFvQixDQUFZc2E7WUFDVm5hLE1BQU1tYSxTQUFTRCxpQkFBaUJyZixNQUFNO0FBQ3hDOztJQUdJLE1BQU91Ziw4QkFBOEIzYixhQUFBQTtRQUN6QyxXQUFBb0IsQ0FBWXNhO1lBQ1ZuYSxNQUFNbWEsU0FBU0Msc0JBQXNCdmYsTUFBTTtBQUM3Qzs7SUFHSSxNQUFPd2YsaUNBQWlDNWIsYUFBQUE7UUFDNUMsV0FBQW9CLENBQVlzYTtZQUNWbmEsTUFBTW1hLFNBQVNFLHlCQUF5QnhmLE1BQU07QUFDaEQ7O0lBR0ksTUFBT3lmLCtCQUErQjdiLGFBQUFBO1FBQzFDLFdBQUFvQixDQUFZc2E7WUFDVm5hLE1BQU1tYSxTQUFTRyx1QkFBdUJ6ZixNQUFNO0FBQzlDOztJQUdJLE1BQU8wZiwrQkFBK0I5YixhQUFBQTtRQUMxQyxXQUFBb0IsQ0FDRXNhLFNBQ0F0ZixPQUFlMGYsdUJBQXVCMWYsTUFDdEMyZixPQUFPO1lBRVB4YSxNQUFNbWEsU0FBU3RmLE1BQU0yZjtBQUN2Qjs7SUFHSSxNQUFPQyxnQ0FBZ0NoYyxhQUFBQTtRQUMzQyxXQUFBb0IsQ0FBWXNhO1lBQ1ZuYSxNQUFNbWEsU0FBU00sd0JBQXdCNWYsTUFBTTtBQUMvQzs7SUFHSSxNQUFPNmYsbUNBQW1DamMsYUFBQUE7UUFDOUMsV0FBQW9CLENBQVlzYTtZQUNWbmEsTUFBTW1hLFNBQVNPLDJCQUEyQjdmLE1BQU07QUFDbEQ7O0lDdEpVOGYsUUFBQUEsd0JBQUFBO0tBQVosU0FBWUE7UUFDVkEsaUJBQUEsVUFBQTtRQUNBQSxpQkFBQSxhQUFBO1FBQ0FBLGlCQUFBLFlBQUE7UUFDQUEsaUJBQUEsVUFBQTtRQUNBQSxpQkFBQSxXQUFBO0FBQ0QsTUFORCxDQUFZQSxRQUFBQSxxQkFBQUEsMkJBQWdCLENBQUE7SUE4QmhCQyxRQUFBQSw4QkFBQUE7S0FBWixTQUFZQTtRQUNWQSx1QkFBQSxzQkFBQTtRQUNBQSx1QkFBQSw4QkFBQTtRQUNBQSx1QkFBQSwyQkFBQTtRQUNBQSx1QkFBQSxzQkFBQTtRQUNBQSx1QkFBQSxlQUFBO1FBQ0FBLHVCQUFBLHNCQUFBO1FBQ0FBLHVCQUFBLGNBQUE7QUFDRCxNQVJELENBQVlBLFFBQUFBLDJCQUFBQSxpQ0FBc0IsQ0FBQTtJQXlDNUIsTUFBT0MsZ0NBQWdDQyxRQUFBQTtRQWEzQyxXQUFBamIsQ0FBb0JrYjtZQUNsQjdOLFVBQVU4QixlQUNSK0wsU0FBU3hNLE1BQ0w7Z0JBQ0VDLFVBQVU7Z0JBQ1ZDLEtBQUtzTSxTQUFTeE0sSUFBSUc7Z0JBQ2xCQyxNQUFNb00sU0FBU3hNLElBQUlJO2dCQUNuQkMsT0FBT21NLFNBQVN4TSxJQUFJTTtnQkFDcEJDLEtBQUtsSCxPQUFPbVQsU0FBU3hNLElBQUlPO2dCQUUzQnJTO1lBRU51RDtZQVprQkMsS0FBQThhLFdBQUFBO0FBYXBCO1FBRVUsVUFBTTFNO1lBQ2QsSUFBSXBPLEtBQUttTyxNQUFNLE9BQU9uTyxLQUFLbU87WUFDM0IsT0FBTTRNLFFBQUVBLFFBQU1DLFFBQUVBLFFBQU1DLE9BQUVBLE9BQUtDLEtBQUVBLEtBQUc1TSxLQUFFQSxPQUFRdE8sS0FBSzhhO1lBQ2pELE1BQU0xWixNQUFNcEIsS0FBS29CLElBQUlULElBQUlYLEtBQUtvTztZQUM5QmhOLElBQUkyRCxNQUFNLHdCQUF3QmdXLGFBQWFHO1lBQy9DOVosSUFBSTJELE1BQU0sa0NBQWtDaVc7WUFDNUMsTUFBTWhOLG9CQUFvQmYsVUFBVWtFLDJCQUEyQjZKO1lBQy9ELElBQUlsYTtZQUNKLEtBQUt3TixLQUFLO2dCQUNSLEtBQUsyTSxPQUFPO29CQUNWLE1BQU0sSUFBSXpjLGFBQUFBLGNBQ1Isc0NBQXNDdWM7QUFFMUM7Z0JBQ0EzWixJQUFJMkQsTUFBTSwwQkFBMEJrVztnQkFDcENuYSxZQUFZbU0sVUFBVWtFLDJCQUEyQjhKO0FBQ25ELG1CQUFPO2dCQUNMN1osSUFBSTJELE1BQ0Ysa0NBQWtDZ1csdUJBQXVCek0sSUFBSUc7QUFFakU7WUFDQXJOLElBQUkyRCxNQUFNLDZCQUE2QmdXO1lBQ3ZDL2EsS0FBS21PLGFBQWFsQixVQUFVWSxVQUFVLFNBQVMvTSxLQUFLa04sYUFBYStNLFFBQVE7Z0JBQ3ZFek07O1lBRUYsT0FBT3RPLEtBQUttTztBQUNkO1FBRVUsUUFBTWdOO1lBQ2QsSUFBSW5iLEtBQUtvYixJQUFJLE9BQU9wYixLQUFLb2I7WUFDekIsTUFBTWhhLE1BQU1wQixLQUFLb0IsSUFBSVQsSUFBSVgsS0FBS21iO1lBQzlCLE9BQU1ELEtBQUVBLEtBQUdHLEtBQUVBLEtBQUdOLFFBQUVBLFVBQVcvYSxLQUFLOGE7WUFJbEMsS0FBSVEsY0FBRUEsY0FBWXRFLFFBQUVBLFVBQVdxRTtZQUUvQixNQUFNRSxPQUFRRCxhQUEwQjtZQUN4Q2xhLElBQUkyRCxNQUFNLGtDQUFrQ3dXLGNBQWM5Z0IsUUFBUUM7WUFFbEUsTUFBTXNULG9CQUFvQmYsVUFBVW1FLGVBQWVtSztZQUNuRG5hLElBQUkyRCxNQUFNLDZCQUE2QmdXLGdCQUFnQkc7WUFDdkRsYixLQUFLb2IsS0FBSyxJQUFJSSxpQkFDWk4sS0FDQTtnQkFDRUksY0FBYzVMLE9BQU81RSxLQUFLa0Q7Z0JBQzFCZ0o7ZUFFRitEO1lBRUYsT0FBTy9hLEtBQUtvYjtBQUNkO1FBRVUsWUFBTUs7WUFDZCxJQUFJemIsS0FBSzBiLFFBQVEsT0FBTzFiLEtBQUswYjtZQUM3QixNQUFNTixXQUFXcGIsS0FBS21iO1lBQ3RCbmIsS0FBSzBiLFNBQVVOLEdBQVc7WUFDMUIsT0FBT3BiLEtBQUswYjtBQUNkO1FBRVUsaUJBQU1DO1lBQ2QsS0FBSzNiLEtBQUs0YixvQkFDUjViLEtBQUs0Yiw0QkFBNEI1YixLQUFLeWIsVUFBVUk7WUFDbEQsT0FBTzdiLEtBQUs0YjtBQUNkO1FBRVUsa0JBQU1FO1lBQ2QsS0FBSzliLEtBQUsrYixvQkFDUi9iLEtBQUsrYiw0QkFBNEIvYixLQUFLbWIsTUFBTWE7WUFDOUMsT0FBT2hjLEtBQUsrYjtBQUNkO1FBRVUsZ0JBQU1FO1lBQ2QsS0FBS2pjLEtBQUtrYyxpQkFDUmxjLEtBQUtrYyx5QkFBeUJsYyxLQUFLbWIsTUFBTWdCO1lBQzNDLE9BQU9uYyxLQUFLa2M7QUFDZDtRQVNBLHFCQUFNRSxDQUNKQyxTQUNBQyxRQUFRO1lBRVIsTUFBTVYsMkJBQTJCNWIsS0FBSzJiO1lBQ3RDLE1BQU14TixhQUFhbk8sS0FBS29PO1lBQ3hCLE1BQU1oTixNQUFNcEIsS0FBS29CLElBQUlULElBQUlYLEtBQUtvYztZQUM5QmhiLElBQUkyRCxNQUNGLDBCQUEwQnNYLFVBQVUsUUFBUUEsUUFBUWpYLE9BQU8sYUFBYXBGLEtBQUs4YSxTQUFTQztZQUV4RixNQUFNd0Isa0JBQ0VYLG1CQUFtQlEsZ0JBQWdCQyxXQUFXLENBQUEsR0FBSWxPLE9BQ3hEOVM7WUFDRitGLElBQUkyRCxNQUNGLFNBQVN3WCxTQUFTQyxNQUFNN2Ysd0JBQXdCTCxLQUFLQyxVQUFVZ2dCO1lBRWpFLE9BQU9ELFFBQVFDLFNBQVNDLE1BQU16ZSxJQUFLTCxLQUFNQSxFQUFFK2UsT0FBT0Y7QUFDcEQ7UUFPQSxtQkFBTUc7WUFDSixNQUFNQywwQkFBMEIzYyxLQUFLaWM7WUFDckMsTUFBTTdhLE1BQU1wQixLQUFLb0IsSUFBSVQsSUFBSVgsS0FBSzBjO1lBQzlCdGIsSUFBSTJELE1BQU0sa0NBQWtDL0UsS0FBSzhhLFNBQVNDO1lBQzFELE1BQU13QixrQkFDRUksa0JBQWtCQyxhQUFhNWMsS0FBS29PLFNBQzFDL1M7WUFDRitGLElBQUkyRCxNQUNGLFNBQVN3WCxTQUFTTSxXQUFXbGdCLHNCQUFzQkwsS0FBS0MsVUFBVWdnQjtZQUVwRSxPQUFPQSxTQUFTTTtBQUNsQjtRQUVVLFVBQUFDLENBQVc5aEI7WUFDbkIsTUFBTStoQixTQUFTO1lBQ2YsTUFBTXZQLFFBQVF1UCxPQUFPQyxLQUFLaGlCLEVBQUVrZjtZQUM1QixLQUFLMU0sT0FBTyxPQUFPLElBQUlrTSxrQkFBa0IxZTtZQUN6QyxPQUFNLEVBQUd1ZixNQUFNTCxXQUFXMU07WUFDMUIsUUFBUStNO2NBQ04sS0FBSztjQUNMLEtBQUs7Z0JBQ0gsT0FBTyxJQUFJMEMsYUFBQUEsY0FBYy9DOztjQUMzQixLQUFLO2dCQUNILE9BQU8sSUFBSVAsS0FBQUEsbUJBQW1CTzs7Y0FDaEM7Z0JBQ0UsT0FBTyxJQUFJUixrQkFBa0JROztBQUVuQztRQU9BLHFCQUFNZ0Q7WUFDSixNQUFNbkIsMkJBQTJCL2IsS0FBSzhiO1lBQ3RDLE1BQU0xYSxNQUFNcEIsS0FBS29CLElBQUlULElBQUlYLEtBQUtrZDtZQUM5QjliLElBQUkyRCxNQUFNLG9DQUFvQy9FLEtBQUs4YSxTQUFTQztZQUM1RCxNQUFNd0Isa0JBQWtCUixtQkFBbUJhLGFBQWE1YyxLQUFLb08sU0FDMUQvUztZQUNIK0YsSUFBSTJELE1BQ0YsU0FBU3dYLFNBQVNZLEVBQUV4Z0Isd0JBQXdCTCxLQUFLQyxVQUFVZ2dCO1lBRTdELE9BQU9BO0FBQ1Q7UUFRQSxVQUFNYSxDQUFLQztZQUNULE1BQU1qQyxXQUFXcGIsS0FBS21iO1lBQ3RCLE1BQU1oTixhQUFhbk8sS0FBS29PO1lBQ3hCLElBQUkvUztZQUNKO2dCQUNFQSxlQUFlK2YsR0FBR2UscUJBQXFCbUIsT0FBT0QsY0FBY2xQO0FBQzlELGNBQUUsT0FBT25UO2dCQUNQLE1BQU0sSUFBSXVpQixhQUFBQSxjQUNSLG9DQUFvQ0YsaUJBQWlCcmlCO0FBRXpEO1lBRUEsS0FBS0ssT0FBT21pQixTQUNWLE1BQU0sSUFBSUQsYUFBQUEsY0FDUixvQ0FBb0NGLGlCQUFpQmhpQixPQUFPOEssT0FBTzNMLEtBQUs7WUFHNUUsT0FBT2EsT0FBT0E7QUFDaEI7UUFhQSxjQUFNb2lCLENBQ0ozWSxPQUNBNFksY0FBdUIsT0FDdkJDLGNBQXNCLElBQ3RCQyxVQUNBQyxPQUNBQztZQUVBLElBQUlDO1lBQ0osTUFBTTNjLE1BQU1wQixLQUFLb0IsSUFBSVQsSUFBSVgsS0FBS3lkO1lBQzlCO2dCQUNFLE9BQU0zUCxVQUFFQSxVQUFRa1EsVUFBRUEsWUFBYWxaO2dCQUMvQixNQUFNc1csV0FBV3BiLEtBQUttYjtnQkFDdEIsTUFBTWhOLGFBQWFuTyxLQUFLb087Z0JBQ3hCLE1BQU02UCxRQUFRO29CQUNaQyxjQUFjcFE7b0JBQ2RxUSxrQkFBa0JIO29CQUNsQkwsYUFBYUE7b0JBQ2JDLFVBQVVBO29CQUNWQyxPQUFPQTtvQkFDUEMsZ0JBQWdCQTs7Z0JBRWxCQyxxQkFBcUIzQyxHQUFHcUMsU0FBU1EsT0FBTzlQO2dCQUN4Qy9NLElBQUlnZCxLQUNGLG9CQUFvQnRRLG1DQUFtQzhQLFlBQVksb0JBQW9CRixjQUFjLGtCQUFrQjtBQUUzSCxjQUFFLE9BQU8xaUI7Z0JBQ1AsTUFBTWdGLEtBQUs4YyxXQUFXOWhCO0FBQ3hCO1lBQ0EsT0FBTytpQjtBQUNUO1FBRVUsNkJBQU9NLENBQ2ZDLFlBQ0E3Z0I7WUFFQSxPQUFNdVEsYUFBRUEsYUFBV2xOLEtBQUVBLEtBQUd5ZCxpQkFBRUEsbUJBQW9CRDtZQUM5QyxNQUFNbGQsTUFBTW9kLFFBQUFBLFFBQVE3ZCxJQUFJaWEseUJBQXlCLENBQUEsR0FBSWphLElBQ25EWCxLQUFLcWU7WUFFUGpkLElBQUkyRCxNQUNGLHdDQUF3Q2lKLHNCQUFzQnZRO1lBRWhFLE1BQU1naEIsV0FBV3pJLFlBQVlHLHdCQUF3Qm5JO1lBQ3JELE1BQU01SSxLQUFLNFEsWUFBWXJCLE9BQU84SjtZQUM5QnJkLElBQUkyRCxNQUFNLFlBQVkwWiwwQkFBMEJyWjtZQUNoRCxNQUFNc1osTUFBTSxJQUFJQztZQUNoQixPQUFPLElBQUloUyxRQUFBQSxTQUFTO2dCQUNsQnZILElBQUlBO2dCQUNKNEwsYUFBYTtvQkFDWDVMLElBQUlBO29CQUNKNEksYUFBYUE7b0JBQ2JELFlBQVlqTixJQUFJOGQ7b0JBQ2hCTCxpQkFBaUJBO29CQUNqQk0sV0FBV0g7b0JBQ1hJLFdBQVdKOztnQkFFYmpoQixPQUFPQTtnQkFDUG9oQixXQUFXSDtnQkFDWEksV0FBV0o7O0FBRWY7UUFTQSxZQUFNSyxDQUFPMUIsY0FBc0JVO1lBQ2pDLElBQUlpQjtZQUNKLE1BQU01ZCxNQUFNcEIsS0FBS29CLElBQUlULElBQUlYLEtBQUsrZTtZQUM5QjtnQkFDRSxNQUFNM0QsV0FBV3BiLEtBQUttYjtnQkFDdEIvWixJQUFJMkQsTUFBTSxhQUFhc1k7Z0JBQ3ZCLE1BQU1pQixtQkFBb0NsRCxHQUFHMkQsT0FBTztvQkFDbERiLGNBQWNiO29CQUNkYyxrQkFBa0JKOztnQkFFcEJpQixXQUFXcEUsd0JBQXdCeUQsdUJBQ2pDQyxZQUNBdGUsS0FBSzhhLFNBQVNDO2dCQUVoQjNaLElBQUlnZCxLQUNGLHlCQUF5QmYsc0JBQXNCcmQsS0FBSzhhLFNBQVNDLGFBQWFpRSxTQUFTNVo7QUFFdkYsY0FBRSxPQUFPcEs7Z0JBQ1AsTUFBTWdGLEtBQUs4YyxXQUFXOWhCO0FBQ3hCO1lBQ0EsT0FBT2drQjtBQUNUO1FBYUEsdUJBQU1DLENBQ0puYSxPQUNBNFksY0FBdUIsT0FDdkJDLGNBQXNCLElBQ3RCQyxVQUNBQyxPQUNBQztZQUVBLE1BQU1DLHFCQUFxQi9kLEtBQUt5ZCxTQUM5QjNZLE9BQ0E0WSxhQUNBQyxhQUNBQyxVQUNBQyxPQUNBQztZQUVGLE9BQU1oUSxVQUFFQSxZQUFhaEo7WUFDckIsT0FBTzlFLEtBQUsrZSxPQUFPalIsVUFBb0JpUTtBQUN6QztRQVlBLFlBQU1tQixDQUFPN0I7WUFDWCxNQUFNakMsV0FBV3BiLEtBQUttYjtZQUN0QixNQUFNaE4sYUFBYW5PLEtBQUtvTztZQUN4QixNQUFNNFEsaUJBQWlCaGYsS0FBS29kLEtBQUtDO1lBQ2pDLEtBQUsyQixVQUNILE1BQU0sSUFBSXpCLGFBQUFBLGNBQ1IscUNBQXFDRjtZQUV6QyxJQUFJaGlCO1lBQ0o7Z0JBQ0VBLGVBQWUrZixHQUFHOEQsT0FDaEI7b0JBQUVoQixjQUFjYyxTQUFTNVo7b0JBQUkrWixRQUFRO21CQUNyQ2hSO0FBRUosY0FBRSxPQUFPblQ7Z0JBQ1AsTUFBTSxJQUFJd0QsYUFBQUEsY0FDUix1Q0FBdUM2ZSxpQkFBaUJyaUI7QUFFNUQ7WUFDQSxLQUFLSyxPQUFPbWlCLFNBQ1YsTUFBTSxJQUFJaGYsYUFBQUEsY0FDUix1Q0FBdUM2ZSxpQkFBaUJoaUIsT0FBTzhLLE9BQU8zTCxLQUFLO1lBRS9FLE9BQU9hO0FBQ1Q7O0lDNWRJLE1BQU8rakIsbUNBQW1DbmtCLG9CQUFBQTtRQUFoRCxXQUFBMkU7O1lBRUVJLEtBQUEyZCxjQUFzQjtBQThEeEI7UUFsREUsS0FBQTFVO1lBQ0UsTUFBTW9XLE9BQU9yZixLQUFLb0c7WUFDbEIsSUFBSWlaLE1BQU0sTUFBTSxJQUFJOVksYUFBQUEsZ0JBQWdCOFksS0FBS3pVO1lBQ3pDLE1BQU0yUixXQUE2QjtnQkFDakMyQixjQUFjbGUsS0FBS2tlO2dCQUNuQkMsa0JBQWtCbmUsS0FBS21lO2dCQUN2Qm1CLE1BQU10ZixLQUFLc2Y7Z0JBQ1gzQixhQUFhM2QsS0FBSzJkOztZQUVwQixXQUFXM2QsS0FBSzhkLG1CQUFtQixhQUNqQ3ZCLFNBQVN1QixpQkFBaUI5ZCxLQUFLOGQ7WUFDakMsSUFBSTlkLEtBQUs2ZCxPQUFPdEIsU0FBU3NCLFFBQVE3ZCxLQUFLNmQ7WUFDdEMsT0FBT3RCO0FBQ1Q7UUFFQSxjQUFBZ0QsQ0FBZXRkO1lBQ2JqQyxLQUFLMmQsY0FBYzFiO1lBQ25CLE9BQU9qQztBQUNUO1FBRUEsT0FBQXdmLENBQVFDO1lBQ056ZixLQUFLNmQsUUFBUTdkLEtBQUs2ZCxTQUFTO1lBQzNCN2QsS0FBSzZkLE1BQU0vaEIsS0FBSzJqQjtZQUNoQixPQUFPemY7QUFDVDtRQUVBLFFBQUEwZixDQUFTemQ7WUFDUGpDLEtBQUs2ZCxRQUFRNWI7WUFDYixPQUFPakM7QUFDVDtRQUVBLGVBQUEyZixDQUFnQjFkO1lBQ2RqQyxLQUFLa2UsZUFBZWpjO1lBQ3BCLE9BQU9qQztBQUNUO1FBRUEsbUJBQUE0ZixDQUFvQjNkO1lBQ2xCakMsS0FBS21lLG1CQUFtQmxjO1lBQ3hCLE9BQU9qQztBQUNUO1FBRUEsaUJBQUE2ZixDQUFrQjVkO1lBQ2hCakMsS0FBSzhkLGlCQUFpQjdiO1lBQ3RCLE9BQU9qQztBQUNUO1FBRUEsT0FBQThmLENBQVE3ZDtZQUNOakMsS0FBS3NmLE9BQU9yZDtZQUNaLE9BQU9qQztBQUNUOztJQTdEQXdILE1BQUFBLFdBQUEsRUFEQ00sMkVBQ3dCc1gsMkJBQUF4WCxXQUFBLG9CQUFBO0lBRXpCSixNQUFBQSxXQUFBLEVBREN1WSxvQkFBQUEsVUFBVSw4Q0FDa0JYLDJCQUFBeFgsV0FBQSxjQUFBO0lBRTdCSixNQUFBQSxXQUFBLEVBRENNLDJFQUNxQnNYLDJCQUFBeFgsV0FBQSxxQkFBQTtJQUV0QkosTUFBQUEsV0FBQSxFQURDTSwyRUFDeUJzWCwyQkFBQXhYLFdBQUEseUJBQUE7SUFFMUJKLE1BQUFBLFdBQUEsRUFEQ3dZLG9CQUFBQSxJQUFJLCtDQUNtQlosMkJBQUF4WCxXQUFBLHVCQUFBO0lBRXhCSixNQUFBQSxXQUFBLEVBRENNLDJFQUNhc1gsMkJBQUF4WCxXQUFBLGFBQUE7SUNmSnFZLFFBQUFBLG1CQUFBQTtLQUFaLFNBQVlBO1FBUVZBLFlBQUEsY0FBQTtRQVNBQSxZQUFBLGNBQUE7QUFDRCxNQWxCRCxDQUFZQSxRQUFBQSxnQkFBQUEsc0JBQVcsQ0FBQTtJQ0FWQyxRQUFBQSxrQkFBTixNQUFNQSx3QkFBd0JqbEI7UUFnQm5DLFdBQUEyRSxDQUFZckI7WUFDVndCLE1BQU14QjtBQUNSOztJQWRBaUosTUFBQUEsV0FBQSxFQUhDK0UsV0FBQUEsWUFBWSw4Q0FDWjFFLGVBQ0FzWSxrREFDV3hCLFNBQUt1Qix3QkFBQXRZLFdBQUEsa0JBQUE7SUFLakJKLE1BQUFBLFdBQUEsRUFIQytFLFdBQUFBLFlBQVksNENBQ1oxRSxlQUNBdVksa0RBQ1d6QixTQUFLdUIsd0JBQUF0WSxXQUFBLGtCQUFBO0lBS2pCSixNQUFBQSxXQUFBLEVBSEMrRSxXQUFBQSxZQUFZLG9DQUNaMUUsZUFDQXdZLG1FQUNnQkgsd0JBQUF0WSxXQUFBLGdCQUFBO0lBZE5zWSxRQUFBQSxrQkFBZTFZLGlCQUFBLEVBRDNCOFksV0FBQUEsS0FBSzVULHFFQUNPd1Q7SUNBU0ssUUFBQUEsNEJBQWYsTUFBZUEsa0NBQWtDTDtRQVd0RCxXQUFBdGdCLENBQXNCckI7WUFDcEJ3QixNQUFNeEI7QUFDUjs7SUFUQWlKLE1BQUFBLFdBQUEsRUFIQytFLFdBQUFBLFlBQVksdUJBQ1oxRSxlQUNBMlksNkRBQ2tCRCxrQ0FBQTNZLFdBQUEsa0JBQUE7SUFLbkJKLE1BQUFBLFdBQUEsRUFIQytFLFdBQUFBLFlBQVksZ0RBQ1oxRSxlQUNBNFksNkRBQ2tCRixrQ0FBQTNZLFdBQUEsa0JBQUE7SUFUQzJZLFFBQUFBLDRCQUF5Qi9ZLGlCQUFBLEVBRDlDOFksV0FBQUEsS0FBSzVULHFFQUNnQjZUO0lDQXRCdGxCLG9CQUFBQSxNQUFNMk0sVUFBVThZLFdBQVcsU0FBU0E7UUFHbEMsT0FBT3psQiwwQkFBTXlsQixTQUFTMWdCLEtBQUtKO0FBQzdCO0lBRUEzRSxvQkFBQUEsTUFBTTJNLFVBQVVpSSxZQUFZLFNBQVNBO1FBR25DLE9BQU81VSwwQkFBTTRVLFVBQVU3UCxLQUFLSjtBQUM5QjtJQUVBM0Usb0JBQUFBLE1BQU0yTSxVQUFVK1ksWUFBWSxTQUFTQTtRQUduQyxPQUFPMWxCLG9CQUFBQSxNQUFNMGxCLFVBQVUzZ0I7QUFDekI7SUFFQy9FLG9CQUFBQSxNQUFjMGxCLFlBQVksU0FBU0EsVUFDbEM3YjtRQUVBLEtBQUs3SixvQkFBQUEsTUFBTTJsQixZQUFZOWIsUUFBUSxPQUFPO1lBQUVBLE9BQU9BOztRQUMvQyxNQUFNK2Isc0JBQ0pyWSxXQUFBQSxTQUFTc1ksY0FBY2hjLE1BQU1sRixnQkFBdUI7UUFFdEQsTUFBTW1oQixpQkFBaUJ2WSxXQUFBQSxTQUFTNUMsSUFDOUJkLE1BQU1sRixhQUNOb2hCLGFBQUFBLE9BQU9DO1FBRVQsTUFBTUMsb0JBQW9CMVksV0FBQUEsU0FBUzVDLElBQ2pDZCxNQUFNbEYsYUFDTjRNLFFBQUFBLGdCQUFnQjJVO1FBRWxCLE1BQU1DLG1CQUFtQjVZLFdBQUFBLFNBQVM1QyxJQUNoQ2QsTUFBTWxGLGFBQ040TSxRQUFBQSxnQkFBZ0I2VTtRQUdsQixNQUFNaG1CLFNBQTZCO1lBQ2pDeUosT0FBTyxDQUFBO1lBQ1B3YyxRQUFRLENBQUE7WUFDUmpjLFdBQVcsQ0FBQTtZQUNYdkcsVUFBVSxDQUFBO1lBQ1ZNLFFBQVEsQ0FBQTs7UUFHVixNQUFNbWlCLGdCQUFnQnptQixPQUFPaU0sS0FBS2dhLGtCQUFrQixDQUFBO1FBQ3BELE1BQU1TLGNBQWMxbUIsT0FBT2lNLEtBQUttYSxxQkFBcUIsQ0FBQTtRQUNyRCxNQUFNTyxhQUFhM21CLE9BQU9pTSxLQUFLcWEsb0JBQW9CLENBQUE7UUFHbkQsS0FBSyxNQUFNdGdCLE9BQU8rZixxQkFBcUI7WUFDckMsTUFBTTVlLFFBQVE2QyxNQUFNaEU7WUFDcEIsTUFBTThmLGNBQWNXLGNBQWNwaUIsU0FBUzJCO1lBQzNDLE1BQU00Z0IsWUFBWWQ7WUFDbEIsTUFBTS9RLFlBQVkyUixZQUFZcmlCLFNBQVMyQjtZQUN2QyxNQUFNNGYsV0FBV2UsV0FBV3RpQixTQUFTMkI7WUFHckMsSUFBSThmLGVBQWUvUSxhQUFhNlEsVUFBVTtnQkFDeENybEIsT0FBT2dLLFlBQVloSyxPQUFPZ0ssYUFBYyxDQUFBO2dCQUN2Q2hLLE9BQU9nSyxVQUFrQnZFLE9BQU9tQjtBQUNuQztZQUNBLElBQUk0TixXQUFXO2dCQUNieFUsT0FBT3lELFdBQVd6RCxPQUFPeUQsWUFBYSxDQUFBO2dCQUNyQ3pELE9BQU95RCxTQUFpQmdDLE9BQU9tQjtBQUNsQztZQUNBLElBQUl5ZSxVQUFVO2dCQUNacmxCLE9BQU8rRCxTQUFTL0QsT0FBTytELFVBQVcsQ0FBQTtnQkFDakMvRCxPQUFPK0QsT0FBZTBCLE9BQU9tQjtBQUNoQztZQUNBLElBQUl5ZixVQUFVO2dCQUNacm1CLE9BQU9pbUIsU0FBVWptQixPQUFPaW1CLFVBQVUsQ0FBQTtnQkFDakNqbUIsT0FBT2ltQixPQUFleGdCLE9BQU9tQjtBQUNoQztBQUNGO1FBRUE1RyxPQUFPeUosUUFBUTdKLG9CQUFBQSxNQUFNZ08sTUFBTTVOLE9BQU9pbUIsUUFBUXhjLE1BQU1sRixZQUFZaEY7UUFDNUQsT0FBT1M7QUFDVCxNQUFFc21CLEtBQUsxbUIsb0JBQUFBO0lBRU5BLG9CQUFBQSxNQUFjNFUsWUFBWSxTQUFTQSxVQUNsQy9LO1FBRUEsU0FBUzBELFdBQUFBLFNBQVM1QyxXQUNUZCxVQUFVLGFBQWNBLE1BQU1sRixjQUFzQmtGLE9BQzNEMEgsUUFBQUEsZ0JBQWdCMlU7QUFFcEIsTUFBRVEsS0FBSzFtQixvQkFBQUE7SUFFTkEsb0JBQUFBLE1BQWN5bEIsV0FBVyxTQUFTQSxTQUNqQzViO1FBRUEsU0FBUzBELFdBQUFBLFNBQVM1QyxXQUNUZCxVQUFVLGFBQWNBLE1BQU1sRixjQUFzQmtGLE9BQzNEMEgsUUFBQUEsZ0JBQWdCNlU7QUFFcEIsTUFBRU0sS0FBSzFtQixvQkFBQUE7SUFFTkEsb0JBQUFBLE1BQWMybUIsV0FBVyxTQUFTQSxTQUNqQzljO1FBRUEsT0FBTzBELFdBQUFBLFNBQVM1QyxXQUNQZCxVQUFVLGFBQWNBLE1BQU1sRixjQUFzQmtGLE9BQzNEMEQsV0FBQUEsU0FBUzFILElBQUkwTCxRQUFBQSxnQkFBZ0JxVixRQUFRclYsUUFBQUEsZ0JBQWdCc1Y7QUFFekQsTUFBRUgsS0FBSzFtQixvQkFBQUE7SUFFTkEsb0JBQUFBLE1BQWM4bUIsVUFBVSxTQUFTQSxRQUNoQ2pkO1FBRUEsTUFBTWtkLE9BQU94WixXQUFBQSxTQUFTNUMsSUFDcEJkLE1BQU1sRixhQUNONEksb0JBQVMxSCxJQUFJMEwsUUFBQUEsZ0JBQWdCcVYsUUFBUXJWLFFBQUFBLGdCQUFnQnlWO1FBRXZELEtBQUtELE1BQU0sT0FBT3hsQjtRQUNsQixPQUFPc0ksTUFBTWtkO0FBQ2YsTUFBRUwsS0FBSzFtQixvQkFBQUE7SUFFTkEsb0JBQUFBLE1BQWM0RCxhQUFhLFNBQVNBLFdBQ25DaUc7UUFFQUEsZUFBZUEsVUFBVSxhQUFjQSxNQUFNbEYsY0FBc0JrRjtRQUNuRSxPQUFPMEQsV0FBQUEsU0FBUzVDLElBQ2RkLE9BQ0EwRCxXQUFBQSxTQUFTMUgsSUFBSTBMLFFBQUFBLGdCQUFnQnFWLFFBQVFyVix3QkFBZ0JzVjtBQUV6RCxNQUFFSCxLQUFLMW1CLG9CQUFBQTtJQUVOQSxvQkFBQUEsTUFBY29ELGlCQUFpQixTQUFTQSxlQUN2Q3lHO1FBS0EsTUFBTTBjLGNBQXdCLEVBQUNoVixRQUFBQSxnQkFBZ0IyVTtRQUMvQyxNQUFNTSxhQUF1QixFQUFDalYsUUFBQUEsZ0JBQWdCNlU7UUFFOUMsTUFBTXRULGFBQWF2RixXQUFBQSxTQUFTMUgsT0FBTzBnQjtRQUNuQyxNQUFNVSxZQUFZMVosV0FBQUEsU0FBUzFILE9BQU8yZ0I7UUFFbEMsTUFBTVUsZ0JBQWdCcmQsVUFBVSxhQUFhQSxRQUFRQSxNQUFNbEY7UUFFM0QsTUFBTXdpQixjQUF5QzVaLFdBQUFBLFNBQVM1QyxJQUN0RHVjLFFBQ0FwVTtRQUVGLE1BQU1zVSxhQUF3QzdaLFdBQUFBLFNBQVM1QyxJQUNyRHVjLFFBQ0FEO1FBR0YsT0FBTztZQUNML2pCLGFBQWFpa0IsYUFBYUUsZUFBZTtZQUN6Q2xrQixZQUFZaWtCLFlBQVlDLGVBQWU7O0FBRTNDLE1BQUVYLEtBQUsxbUIsb0JBQUFBO0lDbkhELFNBQVVzbkIsYUFDZHZEO1FBRUEsS0FBS0EsVUFBVSxPQUFPeGlCO1FBQ3RCLFdBQVd3aUIsYUFBYSxVQUFVLE9BQU9BO1FBQ3pDLE9BQU9BLFNBQVN3RDtBQUNsQjthQWtCZ0JDO1FBQ2QsT0FBTyxTQUNMQyxRQUNBQyxhQUNBQztZQUVBLE1BQU1DLGlCQUFpQkQsV0FBVzNnQjtZQUVsQzJnQixXQUFXM2dCLFFBQVEvRyxrQkFFZGlHO2dCQUVILE1BQU15QixNQUFpQnpCLEtBQUs7Z0JBQzVCLE1BQU0yaEIsV0FBV2xnQixJQUFJbWdCLGVBQWVDO2dCQUVwQyxNQUFNQyxlQUFnQmpqQixLQUNwQixtQkFDQWlqQjtnQkFFRixNQUFNQyxlQUFlRCxPQUFPRSxRQUFRdmdCO2dCQUVwQyxJQUFJc2dCLE9BQU92bUIsVUFBVSxHQUFHO29CQUN0QixNQUFNLElBQUk0Z0IsYUFBQUEsY0FBYztBQUMxQjtnQkFFQSxJQUFJMkYsT0FBT3ZtQixTQUFTLEdBQUc7b0JBQ3JCLE1BQU0sSUFBSTRnQixhQUFBQSxjQUFjLDZCQUE2QjJGLE9BQU92bUI7QUFDOUQ7Z0JBRUEsSUFBSXVtQixPQUFPLEdBQUc1WSxTQUFTd1ksVUFBVTtvQkFDL0IsTUFBTSxJQUFJbkosS0FBQUEsbUJBQ1IsOEJBQThCZ0o7QUFFbEM7Z0JBRUEsYUFBYUUsZUFBZU8sTUFBTXBqQixNQUFNbUI7QUFDMUM7WUFFQSxPQUFPeWhCO0FBQ1Q7QUFDRjtJQUVPMW5CLGVBQWVtb0IsZ0JBTXBCQyxTQUNBM2YsTUFDQTdDLEtBQ0FnRTtRQUVBLE9BQU15ZSxNQUFFQSxRQUFTRDtRQUVqQixNQUFNRSxnQkFBZ0JELEtBQUtFO1FBQzNCLE1BQU1uWixRQUFRa1osUUFBUUU7UUFFdEIsTUFBTUMscUJBQXFCLFNBQ3pCakIsUUFDQUMsYUFDQTFnQjtZQUVBbkgsT0FBTzhvQixlQUFlbEIsUUFBUUMsYUFBYTtnQkFDekNrQixZQUFZO2dCQUNaQyxVQUFVO2dCQUNWQyxjQUFjO2dCQUNkOWhCLE9BQU9BOztBQUVYO1FBRUEwaEIsbUJBQW1CN2UsT0FBT2hFLEtBQWV3SjtBQUMzQzthQUVnQjBaO1FBQ2QsU0FBU0E7WUFDUCxPQUFPLFNBQVVDLEtBQVVDO2dCQUN6QixPQUFPZCxXQUFBQSxNQUNMdGIsb0JBQUFBLFlBQ0FxYyxhQUFBQSxhQUNBQyxhQUFBQSxZQUNBQyxhQUFBQSxTQUFTaEIsa0JBQ1RpQixXQUFBQSxhQUNFOWIsV0FBQUEsU0FBUzFILElBQUkwTCxRQUFBQSxnQkFBZ0JxVixRQUFRclYsd0JBQWdCeVYsV0FDckRpQyxXQVBHZCxDQVNMYSxLQUFLQztBQUNUO0FBQ0Y7UUFFQSxPQUFPSyxXQUFBQSxXQUFXNWpCLElBQUk2TCxRQUFBQSxnQkFBZ0J5VixVQUNuQ3VDLE9BQU87WUFDTkMsV0FBV1Q7WUFDWDdpQixNQUFNO1dBRVBpaUI7QUFDTDtJQUVPbG9CLGVBQWV3cEIsc0JBTXBCcEIsU0FDQTNmLE1BQ0E3QyxLQUNBZ0U7UUFFQSxPQUFNeWUsTUFBRUEsUUFBU0Q7UUFDakJ4ZSxNQUFNaEUsT0FBT3lpQixLQUFLb0I7QUFDcEI7YUFFZ0JDO1FBQ2QsU0FBU0E7WUFDUCxPQUFPLFNBQVVYLEtBQVVDO2dCQUN6QixPQUFPZCxXQUFBQSxNQUNMdGIsZ0NBQ0FzYyx5QkFDQUMsc0JBQVNLLHdCQUNURyxhQUFBQSxTQUFTSCx3QkFDVEosV0FBQUEsYUFDRTliLG9CQUFTMUgsSUFDUDBMLFFBQUFBLGdCQUFnQnFWLFFBQ2hCcUMsV0FDQTFYLFFBQUFBLGdCQUFnQnNZLGlCQUVsQlosV0FYR2QsQ0FhTGEsS0FBS0M7QUFDVDtBQUNGO1FBRUEsT0FBT0ssV0FBQUEsV0FBVzVqQixJQUFJNkwsUUFBQUEsZ0JBQWdCc1ksZ0JBQ25DTixPQUFPO1lBQ05DLFdBQVdHO1lBQ1h6akIsTUFBTTtXQUVQaWlCO0FBQ0w7SUFVT2xvQixlQUFlNnBCLG1CQUNwQmpnQixPQUNBN0YsVUFDQTJEO1FBRUEsSUFBSTFHLGFBQXNEK0M7UUFDMUQsV0FBVy9DLGVBQWUsVUFBVTtZQUNsQztnQkFDRSxNQUFNb08sUUFDSnJQLG9CQUFBQSxNQUFNOG1CLFFBQVFqZCxVQUFVbEMsSUFBSWdELElBQUksUUFBUTZkLGFBQWE3WTtnQkFDdkQsSUFBSTNMLG1CQUFtQkEsYUFBYSxZQUNsQy9DLG1CQUFtQitDLFNBQVM2RixPQUFPd0YsT0FBTzFIO0FBQzlDLGNBQUUsT0FBTzVIO2dCQUNQLE1BQU0sSUFBSXdELGFBQUFBLGNBQWMsNkNBQTZDeEQ7QUFDdkU7QUFDRjtRQUVBLEtBQUtrQixxQkFBcUJBLGVBQWUsVUFDdkMsTUFBTSxJQUFJc0MsYUFBQUEsY0FDUiw2QkFBNkJzRyxNQUFNbEYsWUFBWWhGO1FBRW5ELE9BQU9zQjtBQUNUO0lBRU9oQixlQUFlOHBCLG9CQUtwQjFCLFNBQ0EzZixNQUNBN0MsS0FDQWdFO1FBRUEsTUFBTTVJLG1CQUFtQjZvQixtQkFBbUJqZ0IsT0FBT25CLEtBQUsxRSxVQUFVcWtCO1FBQ2xFLE1BQU0yQixZQUFZM0I7UUFDbEIsTUFBTTRCLGNBQWNwZ0I7UUFFcEJtZ0IsVUFBVUUsSUFBSSxVQUFpQjtRQUMvQkYsVUFBVUUsSUFBSSxvQkFBMkJqcEI7UUFDekM7WUFDRSxNQUFNa3BCLE9BQU9wbEIsS0FBS1MsU0FDaEIzRixPQUFPNEQsT0FBTyxDQUFBLEdBQUtzQixLQUFhQyxZQUFZO2dCQUMxQy9CLFFBQVE7Z0JBQ1JtbkIsa0JBQWtCbnBCO2dCQUNsQmdFLGtCQUFrQjtnQkFDbEJDLGdCQUFnQjs7WUFHcEIsTUFBTWpDLGVBQWVrbkIsS0FBS3ZnQixPQUFPcWdCLGFBQWE1QjtZQUM5Q0EsUUFBUXBXLE9BQU9rUixLQUNiLGNBQWNuakIsb0JBQUFBLE1BQU15RyxVQUFVMUIsS0FBSzJCLHVCQUF1QjFHLG9CQUFBQSxNQUFNd00sR0FBRzNDLFdBQXFCNUcsT0FBT2pELG9CQUFBQSxNQUFNd00sR0FBRzNDO0FBRTVHO1lBRUVtZ0IsVUFBVUUsSUFBSSxVQUFpQjNvQjtZQUMvQnlvQixVQUFVRSxJQUFJLG9CQUEyQjNvQjtBQUMzQztBQUNGO0lBRU90QixlQUFlb3FCLG9CQUtwQmhDLFNBQ0EzZixNQUNBN0MsS0FDQWdFO1FBRUEsTUFBTTVJLG1CQUFtQjZvQixtQkFBbUJqZ0IsT0FBT25CLEtBQUsxRSxVQUFVcWtCO1FBQ2xFLE1BQU0yQixZQUFZM0I7UUFDbEIsTUFBTTRCLGNBQWNwZ0I7UUFDcEJtZ0IsVUFBVUUsSUFBSSxVQUFpQjtRQUMvQkYsVUFBVUUsSUFBSSxvQkFBMkJqcEI7UUFDekM7WUFDRSxNQUFNa3BCLE9BQU9wbEIsS0FBS1MsU0FDaEIzRixPQUFPNEQsT0FBTyxDQUFBLEdBQUtzQixLQUFhQyxZQUFZO2dCQUMxQy9CLFFBQVE7Z0JBQ1JtbkIsa0JBQWtCbnBCO2dCQUNsQmdFLGtCQUFrQjtnQkFDbEJDLGdCQUFnQjtnQkFDaEJvbEIsdUJBQXVCO2dCQUN2QkMsZ0JBQWdCOztrQkFHZEosS0FBSzdmLE9BQU8yZixhQUFhNUI7WUFDL0JBLFFBQVFwVyxPQUFPa1IsS0FDYixjQUFjbmpCLG9CQUFBQSxNQUFNeUcsVUFBVTFCLEtBQUsyQixtQkFBb0JtRCxNQUFjN0osb0JBQUFBLE1BQU13TSxHQUFHM0M7QUFFbEY7WUFDRW1nQixVQUFVRSxJQUFJLFVBQWlCM29CO1lBQy9CeW9CLFVBQVVFLElBQUksb0JBQTJCM29CO0FBQzNDO0FBQ0Y7SUFFT3RCLGVBQWV1cUIsb0JBS3BCbkMsU0FDQTNmLE1BQ0E3QyxLQUNBZ0U7UUFFQSxNQUFNNUksbUJBQW1CNm9CLG1CQUFtQmpnQixPQUFPbkIsS0FBSzFFLFVBQVVxa0I7UUFDbEUsTUFBTTJCLFlBQVkzQjtRQUNsQjJCLFVBQVVFLElBQUksVUFBaUI7UUFDL0JGLFVBQVVFLElBQUksb0JBQTJCanBCO1FBQ3pDK29CLFVBQVVFLElBQUksY0FBcUJqcEI7UUFDbkM7WUFDRSxNQUFNd3BCLFNBQVN6cUIsb0JBQUFBLE1BQU13TSxHQUFHM0M7WUFDeEIsTUFBTU0sS0FBS04sTUFBTTRnQjtZQUNqQixNQUFNTixPQUFPcGxCLEtBQUtTLFNBQ2hCM0YsT0FBTzRELE9BQU8sQ0FBQSxHQUFLc0IsS0FBYUMsWUFBWTtnQkFDMUMwbEIsWUFBWXpwQjtnQkFDWmdDLFFBQVE7Z0JBQ1JnQyxrQkFBa0I7Z0JBQ2xCQyxnQkFBZ0I7O1lBR3BCO3NCQUNRaWxCLEtBQUtwWSxPQUFPNUgsSUFBV2tlO0FBQy9CLGNBQUUsT0FFRjtZQUNBQSxRQUFRcFcsT0FBT2tSLEtBQ2IsY0FBY25qQixvQkFBQUEsTUFBTXlHLFVBQVUxQixLQUFLMkIsbUJBQW1CZ0csT0FBT3ZDO0FBRWpFO1lBQ0U2ZixVQUFVRSxJQUFJLFVBQWlCM29CO1lBQy9CeW9CLFVBQVVFLElBQUksb0JBQTJCM29CO1lBQ3pDeW9CLFVBQVVFLElBQUksY0FBcUIzb0I7QUFDckM7QUFDRjtJQUVPdEIsZUFBZTBxQixpQkFLcEJ0QyxTQUNBM2YsTUFFQTdDLEtBRUFnRTtRQUVBLE1BQU0rZ0IsTUFBTXRELGFBQ1ZlLFFBQVExZCxJQUFJO1FBRWQsS0FBS2lnQixLQUFLO1FBQ1YsSUFBSUEsUUFBUWxpQixLQUFLbEcsU0FBVWtHLEtBQUttaUIsYUFBYW5pQixLQUFLbWlCLFVBQVVELE1BQU87WUFDakUsTUFBTSxJQUFJbE0sS0FBQUEsbUJBQ1IsZ0JBQWdCa007QUFFcEI7QUFDRjtJQUVPM3FCLGVBQWU2cUIsa0JBS3BCekMsU0FDQTNmLE1BQ0E3QyxLQUNBZ0U7UUFFQSxNQUFNK2dCLE1BQU10RCxhQUNWZSxRQUFRMWQsSUFBSTtRQUdkLEtBQUtpZ0IsS0FBSztRQUVWLE1BQU0zcEIsbUJBQW1CNm9CLG1CQUFtQmpnQixPQUFPbkIsS0FBSzFFLFVBQVVxa0I7UUFDbEUsTUFBTTJCLFlBQVkzQjtRQUNsQixNQUFNMEMsVUFBVUgsUUFBUWxpQixLQUFLbEcsU0FBVWtHLEtBQUttaUIsYUFBYW5pQixLQUFLbWlCLFVBQVVEO1FBRXhFLElBQUlHLFNBQVM7WUFDWDFDLFFBQVFwVyxPQUFPa1IsS0FDYixvQkFBb0J5SCxtREFBbUQzcEI7WUFHekUrb0IsVUFBVUUsSUFBSSxVQUFpQjtZQUMvQkYsVUFBVUUsSUFBSSxvQkFBMkJqcEI7WUFDekMrb0IsVUFBVUUsSUFBSSxtQkFBbUI7WUFDakNGLFVBQVVnQixTQUFTL3BCO0FBQ3JCO0FBRUY7YUFFZ0JnQyxPQUNkaEMsWUFDQWdxQixrQkFDQUo7UUFFQSxNQUFNSyx5QkFDR0QscUJBQXFCLFlBQVlFLFFBQVFGO1FBQ2xELE1BQU16b0IsUUFBUTBvQixrQkFDVjNwQixZQUNDMHBCO1FBQ0wsTUFBTUcsT0FBT0Ysa0JBQ1JELG1CQUNESjtRQUVKLFNBQVM1bkIsT0FDUGUsVUFDQXhCLE9BQ0Fxb0I7WUFFQSxNQUFNOUQsT0FBdUI7Z0JBQzNCOEQsV0FBV0E7Z0JBQ1hyb0IsT0FBT0E7Z0JBQ1B3QixVQUFVQTs7WUFFWixPQUFPbWtCLFdBQUFBLE1BQ0w3YSxvQkFDRUMsV0FBQUEsU0FBUzFILElBQUkwTCx3QkFBZ0JxVixRQUFRclYsUUFBQUEsZ0JBQWdCc1YsU0FDckRFLE9BR0ZzRSxhQUFBQSxPQUFPUCxtQkFBMEIvRCxNQUFNO2dCQUFFdUUsVUFBVTtnQkFFbkRsQyxzQkFBU3VCLGtCQUF5QjVELE1BQU07Z0JBQUV1RSxVQUFVO2dCQUNwRDFCLGFBQUFBLFNBQVNlLGtCQUF5QjVELE1BQU07Z0JBQUV1RSxVQUFVO2dCQUNwREMsYUFBQUEsU0FBU1osa0JBQXlCNUQsTUFBTTtnQkFBRXVFLFVBQVU7Z0JBRXBEbEMsc0JBQVNXLHFCQUE0QmhELE1BQU07Z0JBQUV1RSxVQUFVO2dCQUN2RDFCLHNCQUFTUyxxQkFBNEJ0RCxNQUFNO2dCQUFFdUUsVUFBVTtnQkFDdkRDLHNCQUFTZixxQkFBNEJ6RCxNQUFNO2dCQUFFdUUsVUFBVTs7QUFFM0Q7UUFFQSxPQUFPaEMsV0FBQUEsV0FBVzVqQixJQUFJNkwsUUFBQUEsZ0JBQWdCc1YsUUFDbkMwQyxPQUFPO1lBQ05DLFdBQVd2bUI7WUFDWGlELE1BQU0sRUFBQ2pGLFlBQVl1QixPQUFPNG9CO1dBRTNCakQ7QUFDTDtVQVFhcUQsa0JBQXNDLENBQ2pEM2hCLE9BQ0FySDtRQUVBLE1BQU1pcEIsVUFDSmpwQixpQkFBaUJxSCxVQUFVLGFBQWE3SixvQkFBQUEsTUFBTThtQixRQUFRamQsU0FBU3RJO1FBQ2pFLE1BQU0ybEIsZ0JBQWdCcmQsVUFBVSxhQUFhQSxRQUFRQSxNQUFNbEY7UUFDM0QsS0FBSzhtQixTQUNILE1BQU0sSUFBSWxvQixhQUFBQSxjQUNSLFNBQVMyakIsT0FBT3ZuQjtRQUVwQixPQUFPLEdBQUcrckIsUUFBQUEsYUFBYXhFLE9BQU92bkIsUUFBUThyQixVQUFVQyxxQkFBYUQsV0FBVzs7SUFHcEUsU0FBVUUsb0JBQW9CQztRQUNsQyxPQUFPLENBQWtCL2hCLE9BQTJCckg7WUFDbEQsTUFBTWlwQixVQUNKanBCLGlCQUFpQnFILFVBQVUsYUFBYTdKLG9CQUFBQSxNQUFNOG1CLFFBQVFqZCxTQUFTdEk7WUFDakUsTUFBTTJsQixnQkFBZ0JyZCxVQUFVLGFBQWFBLFFBQVFBLE1BQU1sRjtZQUMzRCxLQUFLOG1CLFNBQ0gsTUFBTSxJQUFJbG9CLGFBQUFBLGNBQ1IsU0FBUzJqQixPQUFPdm5CO1lBRXBCLE9BQU8sR0FBR2lzQixZQUFZSCxVQUFVQyxRQUFBQSxhQUFhRCxXQUFXOztBQUU1RDtVQUVhSSw0QkFBZ0QsQ0FDM0RoaUIsT0FDQXJIO1FBRUEsTUFBTWlwQixVQUNKanBCLGlCQUFpQnFILFVBQVUsYUFBYTdKLG9CQUFBQSxNQUFNOG1CLFFBQVFqZCxTQUFTdEk7UUFDakUsS0FBS2txQixTQUNILE1BQU0sSUFBSWxvQixhQUFBQSxjQUNSLFNBQVNzRyxNQUFNbEYsWUFBWWhGO1FBRS9CLE9BQU8sS0FBSytyQixRQUFBQSxhQUFhRDs7SUFZcEIsTUFBTUssNENBQTRDO2FBRXpDQyxzQkFDZGxuQixPQUNBd2lCLGFBQ0ExZjtRQUlBLElBQUkwZixZQUFZM2xCLFNBQVMsR0FBRztZQUN6QmlHLElBQThCcWpCLFNBQVMzRDtBQUMxQztRQU1BLEtBQUsxZixJQUFJcWtCLHFCQUFxQjNFLFlBQVkzbEIsUUFBUTtZQUNoRCxLQUFLdXFCLG9CQUFvQnBuQixNQUFNRixjQUFnQztnQkFDN0RnRCxJQUFJdWtCO0FBQ047QUFDRjtBQUNGO0lBRU9qc0IsZUFBZWtzQixpQkFDcEJ0bkIsT0FDQStsQixLQUNBampCO1FBRUEsS0FBS2lqQixLQUFLO1FBQ1YsTUFBTWpuQixhQUFhM0Qsb0JBQUFBLE1BQU00RCxXQUFXaUI7UUFDcEMsS0FBS2xCLFlBQVk7UUFDakIsTUFBTW9uQixVQUNKSCxRQUFRam5CLFdBQVduQixTQUNsQm1CLFdBQVdrbkIsYUFBYWxuQixXQUFXa25CLFVBQVVEO1FBQ2hELEtBQUtHLFNBQVM7UUFDZCxNQUFNOXBCLG1CQUFtQjZvQixtQkFDdkIsSUFBSWpsQixPQUNKbEIsV0FBV0ssVUFDWDJEO1FBS0ZBLElBQUl1aUIsSUFBSSxpQkFBaUIzb0I7UUFDekJvRyxJQUFJdWlCLElBQUksc0JBQXNCM29CO1FBQzlCb0csSUFBSXVpQixJQUFJLG1CQUFtQjtRQUMzQnZpQixJQUFJdWlCLElBQUksVUFBaUI7UUFDekJ2aUIsSUFBSXVpQixJQUFJLG9CQUEyQmpwQjtRQUNuQzBHLElBQUlxakIsU0FBUy9wQjtBQUNmO0lBRUEsU0FBU2dyQixvQkFBcUNwbkI7UUFDNUMsTUFBTXVuQixhQUFhN2UsV0FBQUEsU0FBU3NZLGNBQWNoaEIsVUFBVTtRQUNwRCxNQUFNMkgsS0FBS3hNLG9CQUFBQSxNQUFNd00sR0FBRzNIO1FBQ3BCLE1BQU13bkIsZ0JBQWdCOWUsV0FBQUEsU0FBUzVDLElBQUk5RixPQUFja2hCLGFBQUFBLE9BQU9DLGNBQWMsQ0FBQTtRQUN0RSxNQUFNbUIsY0FDSjVaLG9CQUFTNUMsSUFBSTlGLE9BQWMwSSxvQkFBUzFILElBQUkwTCxRQUFBQSxnQkFBZ0IyVSxhQUFhLENBQUE7UUFDdkUsTUFBTWtCLGFBQ0o3WixvQkFBUzVDLElBQUk5RixPQUFjMEksb0JBQVMxSCxJQUFJMEwsUUFBQUEsZ0JBQWdCNlUsWUFBWSxDQUFBO1FBRXRFLE9BQU9nRyxXQUFXbm9CLEtBQU11Z0I7WUFDdEIsSUFBSUEsU0FBU2hZLElBQUksT0FBTztZQUN4QixJQUFJZ1ksUUFBUTZILGVBQWUsT0FBTztZQUNsQyxJQUFJN0gsUUFBUTJDLGFBQWEsT0FBTztZQUNoQyxJQUFJM0MsUUFBUTRDLFlBQVksT0FBTztZQUMvQixPQUFPOztBQUVYO0lBYU9ubkIsZUFBZXFzQiw2QkFFcEJqRSxTQUNBM2YsTUFDQW9ELE1BQ0FqQztRQUVBLE1BQU0waUIsWUFDSnBrQixNQUFNQyxRQUFRTSxRQUFRQSxPQUFPLEVBQUNBO1FBR2hDLE1BQU1raUIsTUFDSjVxQixvQkFBQUEsTUFBTThtQixRQUFRamQsVUFDZHlkLGFBQ0VlLFFBQVExZCxJQUFJO1FBRWhCLEtBQUtpZ0IsS0FBSztZQUVSO0FBQ0Y7UUFFQSxNQUFNdkQsY0FBd0I7UUFDOUIsS0FBSyxNQUFNL1osWUFBWWlmLFdBQVc7WUFDaEMsTUFBTUMscUJBQXFCbGYsU0FBUytaO1lBQ3BDLE1BQU1wbUIsb0JBQ0d1ckIsdUJBQXVCLFdBQzFCQSxxQkFDQUEsbUJBQW1CM2lCLE9BQU8rZ0IsS0FBS3ZDO1lBQ3JDLElBQUlwbkIsZUFBZW9tQixZQUFZbmpCLFNBQVNqRCxhQUFhO2dCQUNuRG9tQixZQUFZeG1CLEtBQUtJO0FBQ25CO0FBQ0Y7UUFDQThxQixzQkFBc0JsaUIsT0FBT3dkLGFBQWFnQjtRQUkxQyxNQUFNb0UsVUFBVXpzQixvQkFBQUEsTUFBTTBzQixhQUFhN2lCLE9BQU87UUFDekN3ZSxRQUFnQnNFLHVCQUNmRixTQUNDcEUsUUFBZ0IyRCxtQkFDakIzRTtBQUVKO0lBRU9wbkIsZUFBZTJzQix1QkFFcEJ2RSxTQUNBM2YsTUFDQW9ELE1BQ0FqQztRQUVBLE1BQU0waUIsWUFDSnBrQixNQUFNQyxRQUFRTSxRQUFRQSxPQUFPLEVBQUNBO1FBRWhDLE1BQU1ta0IsV0FBWTFrQixNQUFNQyxRQUFRMEQsUUFBUUEsT0FBTyxFQUFDQTtRQUNoRCxJQUFJK2dCLFNBQVNuckIsV0FBVzZxQixVQUFVN3FCLFFBQ2hDLE1BQU0sSUFBSTZCLGFBQUFBLGNBQ1I7UUFHSixNQUFNcW5CLE1BQ0o1cUIsb0JBQUFBLE1BQU04bUIsUUFBUWpkLFVBQ2R5ZCxhQUNFZSxRQUFRMWQsSUFBSTtRQUVoQixLQUFLaWdCLEtBQ0gsTUFBTSxJQUFJdGYsYUFBQUEsZ0JBQ1IsOENBQThDekIsTUFBTWxGLFlBQVloRjtRQUdwRSxNQUFNNnNCLHFCQUFxQkQsVUFBVSxHQUFHbEY7UUFDeEMsTUFBTXBtQixvQkFDR3VyQix1QkFBdUIsV0FDMUJBLHFCQUNBQSxtQkFBbUIzaUIsT0FBTytnQixLQUFLdkM7UUFHckN3RSxTQUFTNXRCLFFBQVEsQ0FBQzZ0QixJQUFJbGhCO1lBQ3BCLE1BQU1uSixXQUNHOHBCLFVBQVUzZ0IsR0FBR3liLGdCQUFnQixXQUNoQ2tGLFVBQVUzZ0IsR0FBR3liLGNBQ2JrRixVQUFVM2dCLEdBQUd5YixZQUFZeGQsT0FBTytnQixLQUFLdkM7WUFDM0MsSUFBSTVsQixNQUFNeEIsWUFDUixNQUFNLElBQUk4ckIsS0FBQUEsaUJBQ1Isd0NBQXdDdHFCLFFBQVF4Qjs7UUFJdEQsTUFBTStyQixhQUFhSCxTQUFTL3BCLElBQUsrQyxPQUFRNkcsT0FBTzdHO1FBRS9Dd2lCLFFBQWtDNEUsUUFBUWhzQixZQUFZK3JCO0FBQ3pEO0lBRU8vc0IsZUFBZWl0QixxQkFFcEI3RSxTQUNBM2YsTUFDQW9ELE1BQ0FqQztRQUVBLE1BQU0waUIsWUFDSnBrQixNQUFNQyxRQUFRTSxRQUFRQSxPQUFPLEVBQUNBO1FBRWhDLE1BQU1ta0IsV0FBWTFrQixNQUFNQyxRQUFRMEQsUUFBUUEsT0FBTyxFQUFDQTtRQUNoRCxJQUFJK2dCLFNBQVNuckIsV0FBVzZxQixVQUFVN3FCLFFBQ2hDLE1BQU0sSUFBSTZCLGFBQUFBLGNBQ1I7UUFHSixNQUFNcW5CLE1BQU01cUIsMEJBQU04bUIsUUFBUWpkLFVBQVV5ZCxhQUFhZSxRQUFRMWQsSUFBSTtRQUM3RCxLQUFLaWdCLEtBQ0gsTUFBTSxJQUFJdGYsYUFBQUEsZ0JBQ1IsOENBQThDekIsTUFBTWxGLFlBQVloRjtRQUdwRSxNQUFNNnNCLHFCQUFxQkQsVUFBVSxHQUFHbEY7UUFDeEMsTUFBTXBtQixvQkFDR3VyQix1QkFBdUIsV0FDMUJBLDJCQUNNQSxtQkFBbUIzaUIsT0FBTytnQixLQUFLdkM7UUFFMUNBLFFBQWtDMkMsU0FBUy9wQjtBQUM5QztJQUVPaEIsZUFBZWt0Qix1QkFFcEI5RSxTQUNBM2YsTUFDQTdDLEtBQ0FnRSxPQUVBdWpCO1FBRUEsTUFBTWIsWUFDSnBrQixNQUFNQyxRQUFRTSxRQUFRQSxPQUFPLEVBQUNBO1FBRWhDLE1BQU1ta0IsV0FBWTFrQixNQUFNQyxRQUFRdkMsT0FBT0EsTUFBTSxFQUFDQTtRQUM5QyxJQUFJZ25CLFNBQVNuckIsV0FBVzZxQixVQUFVN3FCLFFBQ2hDLE1BQU0sSUFBSTZCLGFBQUFBLGNBQ1I7UUFHSixNQUFNcW5CLE1BQ0o1cUIsb0JBQUFBLE1BQU04bUIsUUFBUWpkLFVBQ2R5ZCxhQUNFZSxRQUFRMWQsSUFBSTtRQUVoQixLQUFLaWdCLEtBQ0gsTUFBTSxJQUFJdGYsYUFBQUEsZ0JBQ1IsOENBQThDekIsTUFBTWxGLFlBQVloRjtRQUdwRSxNQUFNNnNCLHFCQUFxQkQsVUFBVSxHQUFHbEY7UUFDeEMsTUFBTXBtQixvQkFDR3VyQix1QkFBdUIsV0FDMUJBLHFCQUNBQSxtQkFBbUIzaUIsT0FBTytnQixLQUFLdkM7UUFFckN3RSxTQUFTNXRCLFFBQVEsQ0FBQzBYLEdBQUcvSztZQUNuQixNQUFNbkosV0FDRzhwQixVQUFVM2dCLEdBQUd5YixnQkFBZ0IsV0FDaENrRixVQUFVM2dCLEdBQUd5YixjQUNia0YsVUFBVTNnQixHQUFHeWIsWUFBWXhkLE9BQU8rZ0IsS0FBS3ZDO1lBQzNDLElBQUk1bEIsTUFBTXhCLFlBQ1IsTUFBTSxJQUFJOHJCLEtBQUFBLGlCQUNSLHdDQUF3Q3RxQixRQUFReEI7O1FBSXRELE1BQU0rckIsYUFBY0gsU0FBeUIvcEIsSUFBSytDLE9BQVE2RyxPQUFPN0c7UUFFaEV3aUIsUUFBa0M0RSxRQUFRaHNCLFlBQVkrckI7QUFDekQ7SUFFTy9zQixlQUFlb3RCLHVCQU1wQmhGLFNBQ0EzZixNQUNBN0MsS0FDQWdFO1FBRUEsTUFBTTBpQixZQUFhcGtCLE1BQU1DLFFBQVFNLFFBQVFBLE9BQU8sRUFBQ0E7UUFDakQsTUFBTW1rQixXQUFZMWtCLE1BQU1DLFFBQVF2QyxPQUFPQSxNQUFNLEVBQUNBO1FBQzlDLElBQUlnbkIsU0FBU25yQixXQUFXNnFCLFVBQVU3cUIsUUFDaEMsTUFBTSxJQUFJNkIsYUFBQUEsY0FDUjtRQUdKLE1BQU1xbkIsTUFDSjVxQixvQkFBQUEsTUFBTThtQixRQUFRamQsVUFDZHlkLGFBQ0VlLFFBQVExZCxJQUFJO1FBRWhCLEtBQUtpZ0IsS0FDSCxNQUFNLElBQUl0ZixhQUFBQSxnQkFDUiw4Q0FBOEN6QixNQUFNbEYsWUFBWWhGO1FBR3BFLE1BQU02c0IscUJBQXFCRCxVQUFVLEdBQUdsRjtRQUN4QyxNQUFNcG1CLG9CQUNHdXJCLHVCQUF1QixXQUMxQkEscUJBQ0FBLG1CQUFtQjNpQixPQUFPK2dCLEtBQUt2QztRQUVwQ0EsUUFBa0MyQyxTQUFTL3BCO0FBQzlDO0lBRUEsU0FBU3lwQixXQUNQenBCLFlBQ0F3TCxNQUNBM007UUFFQSxPQUFPLFNBQVN3dEIsZ0JBQWdCN0YsUUFBZ0JDO1lBQzlDLFNBQVM2RixjQUFjOUYsUUFBZ0JDO2dCQUNyQyxNQUFNN2hCLE1BQU0wSCxXQUFBQSxTQUFTMUgsSUFBSTRHLE1BQU1pYjtnQkFDL0IsTUFBTVIsU0FBc0JPLE9BQU85aUI7Z0JBRW5DLE1BQU1vaUIsT0FBT3haLFdBQUFBLFNBQVM1QyxJQUFJdWMsUUFBdUJyaEIsUUFBUSxDQUFBO2dCQUN6RCxNQUFNd2hCLGNBQWMsSUFBSW1HLElBQUl6RyxLQUFLTSxlQUFlO2dCQUNoREEsWUFBWW9HLElBQUl4c0I7Z0JBQ2hCOGxCLEtBQUtNLGNBQWMsS0FBSUE7Z0JBQ3ZCOVosV0FBQUEsU0FBU3FMLElBQUlzTyxRQUF1QnJoQixLQUFLa2hCO2dCQUV6QyxNQUFNMkcsYUFBYW5nQixXQUFBQSxTQUFTNUMsSUFBSXVjLFFBQXVCemEsU0FBUyxDQUFBO2dCQUNoRSxNQUFNa2hCLG9CQUFvQixJQUFJSCxJQUFJRSxXQUFXckcsZUFBZTtnQkFDNURzRyxrQkFBa0JGLElBQUl4c0I7Z0JBQ3RCeXNCLFdBQVdyRyxjQUFjLEtBQUlzRztnQkFDN0JwZ0IsV0FBQUEsU0FBU3FMLElBQUlzTyxRQUF1QnphLE1BQU1paEI7Z0JBRTFDLE1BQU1yQixnQkFDSjllLFdBQUFBLFNBQVM1QyxJQUFJdWMsUUFBdUJuQixhQUFBQSxPQUFPQyxjQUFjLENBQUE7Z0JBQzNELE1BQU00SCx1QkFBdUI7dUJBQ3hCdkI7b0JBQ0gzRSxDQUFDQSxjQUFxQixDQUFBOztnQkFFeEJuYSxXQUFBQSxTQUFTcUwsSUFDUHNPLFFBQ0FuQixhQUFBQSxPQUFPQyxXQUNQNEg7QUFFSjtZQUVBLE1BQU1DLE9BQWM7WUFDcEIsS0FBS25HLGFBQWE7Z0JBRWhCLE1BQU1vRyxhQUFhdmdCLFdBQUFBLFNBQVNzWSxjQUFjNEI7Z0JBQzFDcUcsWUFBWTd1QixRQUFTK0I7b0JBQ25CLEtBQUtsQixVQUFVQSxPQUFPa0IsSUFBSTt3QkFDeEIwcEIsV0FBV3pwQixZQUFZd0wsS0FBdkJpZSxDQUE4QmpELE9BQWU5YSxXQUFXM0w7QUFDMUQ7O2dCQUVGLE9BQU95bUI7QUFDVCxtQkFBTztnQkFDTCxNQUFNc0csbUJBQ0c5c0IsZUFBZSxXQUFXQSxhQUFhQSxXQUFXME87Z0JBRTNELE1BQU1xZSxtQkFBbUIsR0FBR0Q7Z0JBQzVCLE1BQU1FLGdCQUFnQixHQUFHRjtnQkFDekIsTUFBTUcsc0JBQXNCO29CQUFFN0csYUFBYXBtQjs7Z0JBQzNDLE1BQU1rdEIsMkJBQTJCO29CQUMvQjdDLFVBQVVRO29CQUNWc0MsT0FBT0o7O2dCQUVUSCxLQUFLaHRCLEtBQ0h3dEIsV0FBQUEsUUFDQWprQixhQUFBQSxhQUNBbWpCLGVBSUFlLGFBQUFBLEdBQ0VDLGFBQUFBLGFBQWFDLEtBQ2JsQyw4QkFDQTRCLHFCQUNBQywyQkFHRi9FLGFBQUFBLFNBQ0V3RCx3QkFDQTtvQkFBRXZGLGFBQWFwbUI7bUJBQ2Y7b0JBQ0VxcUIsVUFBVTtvQkFDVjhDLE9BQU9IO29CQUdYNUMsYUFBQUEsT0FDRTZCLHNCQUNBO29CQUFFN0YsYUFBYXBtQjttQkFDZjtvQkFDRXFxQixVQUFVO29CQUNWOEMsT0FBT0g7b0JBR1hyRSxhQUFBQSxTQUNFdUQsd0JBQ0E7b0JBQUU5RixhQUFhcG1CO21CQUNmO29CQUNFcXFCLFVBQVU7b0JBQ1Y4QyxPQUFPSDtvQkFHWDFDLGFBQUFBLFNBQ0U4Qix3QkFDQTtvQkFBRWhHLGFBQWFwbUI7bUJBQ2Y7b0JBQ0VxcUIsVUFBVTtvQkFDVjhDLE9BQU9IOztBQUlmO1lBQ0EsT0FBTzlGLFdBQUFBLFNBQVMwRixLQUFUMUYsQ0FBZVYsUUFBUUM7QUFDaEM7QUFDRjtJQUVNLFNBQVUrRyxZQUNkeHRCLGFBQTBDNHFCO1FBRTFDLFNBQVM0QyxZQUFZeHRCO1lBQ25CLE9BQU95cEIsV0FBV3pwQixZQUFZc1EsUUFBQUEsZ0JBQWdCMlU7QUFDaEQ7UUFFQSxPQUFPb0QsV0FBQUEsV0FBVzVqQixJQUFJNkwsUUFBQUEsZ0JBQWdCMlUsU0FDbkNxRCxPQUFPO1lBQ05DLFdBQVdpRjtZQUNYdm9CLE1BQU0sRUFBQ2pGO1dBRVJrbkI7QUFDTDtJQUVNLFNBQVV1RyxXQUFXenRCO1FBQ3pCLFNBQVN5dEIsV0FBV3p0QjtZQUNsQixPQUFPeXBCLFdBQVd6cEIsWUFBWXNRLFFBQUFBLGdCQUFnQjZVO0FBQ2hEO1FBRUEsT0FBT2tELFdBQUFBLFdBQVc1akIsSUFBSTZMLFFBQUFBLGdCQUFnQjZVLFFBQ25DbUQsT0FBTztZQUNOQyxXQUFXa0Y7WUFDWHhvQixNQUFNLEVBQUNqRjtXQUVSa25CO0FBQ0w7SUNwNkJNLFNBQVV3RyxzQkFBc0IzRjtRQUNwQyxJQUFJQSxRQUFRLGVBQWVBLFFBQVEsVUFBVSxPQUFPQTtRQUNwRCxJQUFJN2dCLE1BQU1DLFFBQVE0Z0IsTUFBTSxPQUFPQSxJQUFJbG1CLElBQUk2ckI7UUFDdkMsSUFBSTNGLElBQUlya0IsZ0JBQWdCOUUsUUFBUSxPQUFPbXBCO1FBQ3ZDLE9BQU9ucEIsT0FBT2lNLEtBQUtrZCxLQUNoQjRGLE9BQ0FDLE9BQU8sQ0FBQ0MsS0FBMEJqcEI7WUFDakNpcEIsSUFBSWpwQixPQUFPOG9CLHNCQUFzQjNGLElBQUluakI7WUFDckMsT0FBT2lwQjtXQUNOLENBQUE7QUFDUDtJQXdCTSxNQUFPQyxnQ0FFSDdoQixvQkFBQUE7UUFDUixXQUFBdkk7WUFDRUc7QUFDRjtRQUNtQixZQUFBcUksQ0FBYXREO1lBRzlCLE1BQU13RCxjQUFtQ3hOLE9BQU80RCxPQUFPLENBQUEsR0FBSW9HO1lBQzNELElBQUl5RDtZQUNKO2dCQUNFQSxXQUFXQyxXQUFBQSxTQUFTSCxVQUFVdkQsTUFBTWxGO0FBRXRDLGNBQUUsT0FBT3FxQjtnQkFDUDFoQixXQUFXL0w7QUFDYjtZQUNBOEwsWUFBWUksb0JBQUFBLFVBQVVDLFVBQVVKLFlBQVl6RCxNQUFNbEYsWUFBWWhGO1lBRTlELE1BQU13TixlQUFlLFNBQVNBLGFBRTVCNmI7Z0JBR0EsTUFBTWlHLE9BQU9scUI7Z0JBQ2IsV0FBV2lrQixRQUFRLFVBQVUsT0FBT0E7Z0JBQ3BDLElBQUk3Z0IsTUFBTUMsUUFBUTRnQixNQUFNLE9BQU9BLElBQUlsbUIsSUFBS29zQixLQUFNL2hCLGFBQWFnaUIsS0FBS0YsTUFBTUM7Z0JBQ3RFLE9BQU9ucUIsS0FBS29JLGFBQWFnaUIsS0FBS3BxQixNQUFNaWtCO0FBQ3RDLGNBQUV0QyxLQUFLM2hCO1lBRVAvRSxvQkFBQUEsTUFBTW92QixVQUFVdmxCLE9BQU81SyxRQUFTb0o7Z0JBQzlCZ0YsWUFBWWhGLEtBQUs4RSxhQUFhRSxZQUFZaEY7O1lBRTVDLE9BQU9nRjtBQUNUO1FBUVMsV0FBQU0sQ0FBWUM7WUFDbkIsTUFBTUMsa0JBQWtCeE0sS0FBSzJHLE1BQU00RjtZQUNuQyxNQUFNRSxZQUFZRCxnQkFBZ0JKLG9CQUFBQSxVQUFVQztZQUM1QyxLQUFLSSxXQUNILE1BQU0sSUFBSUMsTUFBTTtZQUNsQixNQUFNbEUsUUFBVzdKLG9CQUFBQSxNQUFNZ08sTUFBTUgsaUJBQWlCQztZQUM5QyxPQUFPakU7QUFDVDtRQVFTLFNBQUFvRSxDQUFVcEU7WUFDakIsTUFBTXZJLFlBQVlsRCxRQUFRO1lBQzFCLE9BQU9rRCxVQUFVcXRCLHNCQUFzQjVwQixLQUFLb0ksYUFBYXREO0FBQzNEOzthQy9GY3dsQix3QkFDZHZpQixPQUNBeUIsT0FDQWM7UUFFQSxNQUFNNE4sU0FBUyxFQUFDblEsT0FBT3lCO1FBQ3ZCLElBQUljLE9BQU80TixPQUFPcGMsS0FBS3dPO1FBQ3ZCLE9BQU80TixPQUFPMWQsS0FBSztBQUNyQjtJQXNCTSxTQUFVK3ZCLGVBQWUzdkI7UUFLN0IsTUFBTTR2QixRQUFRNXZCLEtBQUs2dkIsTUFBTTtRQUN6QixJQUFJRCxNQUFNN3RCLFNBQVMsS0FBSzZ0QixNQUFNN3RCLFNBQVMsR0FDckMsT0FBTztZQUFFb0wsT0FBT3ZMO1lBQVdnTixPQUFPNU87WUFBTTBQLE9BQU85Tjs7UUFDakQsT0FBTztZQUNMdUwsT0FBT3lpQixNQUFNO1lBQ2JoaEIsT0FBT2doQixNQUFNO1lBQ2JsZ0IsT0FBT2tnQixNQUFNOztBQU1qQjtJQzdDTSxTQUFVOUIsSUFBSXZMLEdBQVdyRztRQUM3QixNQUFNcFosSUFBSXlmLElBQUlyRztRQUNkLElBQUlxRyxNQUFNemYsSUFBSW9aLEtBQUtBLE1BQU1wWixJQUFJeWYsR0FBRztZQUM5QixNQUFNLElBQUk3RCxjQUFjLHNCQUFzQjZELE9BQU9yRztBQUN2RDtRQUNBLE9BQU9wWjtBQUNUO0lBWU0sU0FBVWd0QixJQUFJdk4sR0FBV3JHO1FBQzdCLE1BQU1wWixJQUFJeWYsSUFBSXJHO1FBQ2QsSUFBSXFHLE1BQU16ZixJQUFJb1osS0FBS0EsTUFBTXFHLElBQUl6ZixHQUFHO1lBQzlCLE1BQU0sSUFBSTRiLGNBQWMseUJBQXlCNkQsT0FBT3JHO0FBQzFEO1FBQ0EsT0FBT3BaO0FBQ1Q7SUFhTSxTQUFVaXRCLGFBQWFDO1FBRTNCLE1BQU1DLGFBQWE7UUFDbkIsS0FBS0EsV0FBV0MsS0FBS0YsU0FBUztZQUM1QixNQUFNLElBQUlya0IsYUFBQUEsZ0JBQ1IySCxvQkFBQUEsYUFBYSx3QkFBd0I7QUFFekM7UUFDQSxNQUFNNmMsWUFBWUMsU0FBU0o7UUFDM0IsSUFBSUssTUFBTUYsWUFBWTtZQUNwQixNQUFNLElBQUl4a0IsYUFBQUEsZ0JBQ1IySCxvQkFBQUEsYUFBYSx3QkFBd0I7QUFFekM7UUFDQSxPQUFPNmM7QUFDVDtJQzFETSxNQUFPRyxzQ0FFSC9pQixvQkFBQUE7UUFDUixXQUFBdkk7WUFDRUc7QUFDRjtRQUdTLFdBQUE2SSxDQUFZQyxLQUFhbkg7WUFDaEMsTUFBTW9ILGtCQUFrQnhNLEtBQUsyRyxNQUFNNEY7WUF3Qm5DLE9BQU9DO0FBQ1Q7UUFFUyxTQUFBSSxDQUFVcEUsT0FBVXFtQixZQUFZO1lBRXZDLE1BQU01dUIsWUFBWWxELFFBQVE7WUFDMUIsTUFBTSt4QixtQkFBbUJwckIsS0FBS29JLGFBQWF0RCxPQUFPcW1CO1lBQ2xELE9BQU81dUIsVUFBVXF0QixzQkFBc0J3QjtBQUN6QztRQUVtQixZQUFBaGpCLENBQWF0RCxPQUFVcW1CLFlBQXFCO1lBRzdELE1BQU03aUIsY0FBbUN4TixPQUFPNEQsT0FBTyxDQUFBLEdBQUlvRztZQUMzRCxJQUFJeUQ7WUFDSjtnQkFDRUEsV0FBV0MsV0FBQUEsU0FBU0gsVUFBVXZELE1BQU1sRjtBQUV0QyxjQUFFLE9BQU9xcUI7Z0JBQ1AxaEIsV0FBVy9MO0FBQ2I7WUFDQSxJQUFJMnVCLFdBQ0Y3aUIsWUFBWUksb0JBQUFBLFVBQVVDLFVBQVVKLFlBQVl6RCxNQUFNbEYsWUFBWWhGO1lBRWhFLFNBQVN3TixhQUVQNmI7Z0JBRUEsV0FBV0EsUUFBUSxVQUFVLE9BQU9BO2dCQUNwQyxJQUFJN2dCLE1BQU1DLFFBQVE0Z0IsTUFBTSxPQUFPQSxJQUFJbG1CLElBQUlxSztnQkFDdkMsT0FBT3BJLEtBQUtvSSxhQUFhNmI7QUFDM0I7WUFDQWhwQixvQkFBQUEsTUFBTW92QixVQUFVdmxCLE9BQU81SyxRQUFTb0o7Z0JBQzlCZ0YsWUFBWWhGLEtBQUs4RSxhQUFhZ2lCLEtBQUtwcUIsTUFBTXNJLFlBQVloRjs7WUFFdkQsT0FBT2dGO0FBQ1Q7O0lDdENJLE1BQU8raUIsOEJBQThCQyxLQUFBQTtRQU16QyxXQUFBMXJCO1lBQ0VHO0FBQ0Y7UUFFQSxjQUFjd3JCO1lBQ1osT0FBUXZyQixLQUFLMGIsT0FBZTtBQUM5QjtRQUVBLFFBQWN2TjtZQUNaLEtBQUtuTyxLQUFLd3JCLE9BQ1IsTUFBTSxJQUFJaHRCLGFBQUFBLGNBQ1I7WUFFSixPQUFPd0IsS0FBS3dyQjtBQUNkO1FBRUEsZ0JBQWNDO1lBQ1osT0FBT3pyQixLQUFLdXJCLFdBQVcxUDtBQUN6QjtRQUVBLGdCQUFjNlA7WUFDWixPQUFPMXJCLEtBQUswYixPQUFPTTtBQUNyQjtRQUVBLGNBQWNhO1lBQ1osT0FBTzdjLEtBQUswYixPQUFPUztBQUNyQjtRQUVVLGFBQU13UCxDQUFRQyxLQUFlaHBCO1lBQ3JDLE1BQU14QixNQUFNd0IsSUFBSXNLLE9BQU92TSxJQUFJWCxLQUFLMnJCO1lBQ2hDLE9BQU01USxRQUFFQSxRQUFNQyxRQUFFQSxRQUFNQyxPQUFFQSxPQUFLQyxLQUFFQSxLQUFHNU0sS0FBRUEsT0FBUXNkO1lBRTVDeHFCLElBQUlnZCxLQUFLLHdCQUF3QnJELGFBQWFHO1lBQzlDOVosSUFBSUssUUFBUSxrQ0FBa0N1WjtZQUM5QyxNQUFNaE4sb0JBQW9CZixVQUFVa0UsMkJBQTJCNko7WUFDL0QsSUFBSWxhO1lBQ0osS0FBS3dOLEtBQUs7Z0JBQ1IsS0FBSzJNLE9BQU87b0JBQ1YsTUFBTSxJQUFJemMsYUFBQUEsY0FDUixzQ0FBc0N1YztBQUUxQztnQkFDQTNaLElBQUkyRCxNQUFNLDBCQUEwQmtXO2dCQUNwQ25hLFlBQVltTSxVQUFVa0UsMkJBQTJCOEo7QUFDbkQsbUJBQU87Z0JBQ0w3WixJQUFJMkQsTUFDRixrQ0FBa0NnVyx1QkFBdUJ6TSxJQUFJRztBQUVqRTtZQUNBck4sSUFBSTJELE1BQU0sNkJBQTZCZ1c7WUFDdkMvYSxLQUFLd3JCLGNBQWN2ZSxVQUFVWSxVQUFVLFNBQVMvTSxLQUFLa04sYUFBYStNLFFBQVE7Z0JBQ3hFek07O1lBRUYsT0FBT3RPLEtBQUt3ckI7QUFDZDtRQUVTLGdCQUFNbmdCLElBQ1ZsSztZQUVILE9BQU1DLEtBQUVBLEtBQUd3QixLQUFFQSxjQUNMNUMsS0FBS3NCLE9BQU9ILE1BQU0wQixLQUFBQSxnQkFBZ0JncEIsZ0JBQWdCLE9BQ3hEbHJCLElBQUlYLEtBQUtxTDtZQUNYLE9BQU9nRCxVQUFVbE47WUFDakIsS0FBS2tOLFFBQVEsTUFBTSxJQUFJN1AsYUFBQUEsY0FBYztZQUVyQyxPQUFNMGMsS0FBRUEsS0FBR0csS0FBRUEsS0FBR04sUUFBRUEsVUFBVzFNO1lBQzdCak4sSUFBSWdkLEtBQUssaUNBQWlDL1AsT0FBTzBNLGFBQWExTSxPQUFPNk07WUFDckUsT0FBTUksY0FBRUEsY0FBWXRFLFFBQUVBLFVBQVdxRTtZQUVqQyxNQUFNRSxPQUFRRCxhQUEwQjtZQUN4Q2xhLElBQUkyRCxNQUFNLGtDQUFrQ3dXLGNBQWM5Z0IsUUFBUUM7WUFFbEUsTUFBTXNULG9CQUFvQmYsVUFBVW1FLGVBQWVtSztZQUVuRG5hLElBQUkyRCxNQUFNLG1CQUFtQmlKLFlBQVlwRDtZQUV6QyxNQUFNOFEsU0FBUyxJQUFJRixpQkFDakJOLEtBQ0E7Z0JBQ0VJLGNBQWM1TCxPQUFPNUUsS0FBS2tEO2dCQUMxQmdKO2VBRUYrRDtZQUdGLE1BQU01TSxhQUFhbk8sS0FBSzJyQixRQUFRdGQsUUFBUXpMO1lBQ3hDeEIsSUFBSTJELE1BQU0sbUJBQW1Cb0osS0FBSzJkO1lBQ2xDLE9BQU87Z0JBQ0x6ZDtnQkFDQXFOOztBQUVKO1FBZ0JBLHFCQUFNVSxDQUNKQyxTQUNBQyxRQUFhLFNBQ1ZuYjtZQUVILElBQUlrYixtQkFBbUJyUixLQUFBQSxTQUFTO2dCQUM5QjdKLE9BQU8sRUFBQ2tiO2dCQUNSQyxRQUFRO2dCQUNSRCxVQUFVN2Y7QUFDWixtQkFBTyxXQUFXNmYsWUFBWSxXQUFXO2dCQUN2Q0MsUUFBUUQ7Z0JBQ1JBLFVBQVU3ZjtBQUNaLG1CQUFPLFdBQVc4ZixVQUFVLFdBQVc7Z0JBQ3JDbmIsT0FBTyxFQUFDbWIsVUFBcUNuYjtnQkFDN0NtYixRQUFRO0FBQ1Y7WUFFQSxPQUFNbGIsS0FBRUEsY0FBZXBCLEtBQUtzQixPQUFPSCxNQUFNdUUsYUFBQUEsY0FBY3FtQixNQUFNLE9BQU9wckIsSUFDbEVYLEtBQUtvYztZQUVQaGIsSUFBSTJELE1BQ0YsMEJBQTBCc1gsVUFBVSxRQUFRQSxRQUFRalgsT0FBTyxhQUFhcEYsS0FBS3FPLE9BQU8wTTtZQUV0RixNQUFNd0Isa0JBQ0V2YyxLQUFLeXJCLGFBQWFyUCxnQkFBZ0JDLFdBQVcsSUFBSXJjLEtBQUttTyxPQUM1RDlTO1lBQ0YrRixJQUFJSyxRQUFRLFNBQVM4YSxTQUFTQyxNQUFNN2Y7WUFDcEN5RSxJQUFJMkQsTUFBTXdYLFNBQVNDO1lBQ25CLE9BQ0VGLFFBQVFDLFNBQVNDLE1BQU16ZSxJQUFLTCxLQUFNQSxFQUFFK2UsT0FBT0Y7QUFFL0M7UUFFQSxtQkFBTUcsQ0FBYzlaO1lBQ2xCLE1BQU14QixNQUFNd0IsSUFBSXNLLE9BQU92TSxJQUFJWCxLQUFLMGM7WUFDaEN0YixJQUFJSyxRQUFRLGtDQUFrQ3pCLEtBQUtxTyxPQUFPME07WUFDMUQsTUFBTXdCLGtCQUFvQ3ZjLEtBQUs2YyxXQUFXRCxPQUFPNWMsS0FBS21PLE9BQ25FOVM7WUFDSCtGLElBQUlLLFFBQVEsU0FBUzhhLFNBQVNNLFdBQVdsZ0I7WUFDekN5RSxJQUFJMkQsTUFBTXdYLFNBQVNNO1lBQ25CLE9BQU9OLFNBQVNNO0FBQ2xCO1FBT0EscUJBQU1LLENBQWdCdGE7WUFDcEIsTUFBTXhCLE1BQU13QixJQUFJc0ssT0FBT3ZNLElBQUlYLEtBQUtrZDtZQUNoQzliLElBQUlLLFFBQVEsb0NBQW9DekIsS0FBS3FPLE9BQU8wTTtZQUM1RCxNQUFNd0Isa0JBQWtCdmMsS0FBSzByQixhQUFhOU8sT0FBTzVjLEtBQUttTyxPQUFPOVM7WUFDN0QrRixJQUFJSyxRQUFRLFNBQVM4YSxTQUFTWSxFQUFFeGdCO1lBQ2hDeUUsSUFBSTJELE1BQU16SSxLQUFLQyxVQUFVZ2dCO1lBQ3pCLE9BQU9BO0FBQ1Q7UUFFVSxVQUFBTyxDQUFXOWhCO1lBQ25CLE1BQU0raEIsU0FBUztZQUNmLE1BQU12UCxRQUFRdVAsT0FBT0MsS0FBS2hpQixFQUFFa2Y7WUFDNUIsS0FBSzFNLE9BQU8sT0FBTyxJQUFJa00sa0JBQWtCMWU7WUFDekMsT0FBTSxFQUFHdWYsTUFBTUwsV0FBVzFNO1lBQzFCLFFBQVErTTtjQUNOLEtBQUs7Y0FDTCxLQUFLO2dCQUNILE9BQU8sSUFBSTBDLGFBQUFBLGNBQWMvQzs7Y0FDM0IsS0FBSztnQkFDSCxPQUFPLElBQUlQLEtBQUFBLG1CQUFtQk87O2NBQ2hDO2dCQUNFLE9BQU8sSUFBSVIsa0JBQWtCUTs7QUFFbkM7UUFRQSxVQUFNa0QsQ0FDSkMsaUJBQ0dsYztZQUVILE9BQU1DLEtBQUVBLGNBQWVwQixLQUFLc0IsT0FBT0gsTUFBTXVFLGFBQUFBLGNBQWNxbUIsTUFBTSxPQUFPcHJCLElBQ2xFWCxLQUFLb2Q7WUFFUGhjLElBQUlLLFFBQVEsMENBQTBDNGI7WUFDdEQsSUFBSWhpQjtZQUNKO2dCQUNFQSxlQUFlMkUsS0FBSzZjLFdBQVdTLE9BQU9ELGNBQWNyZCxLQUFLbU87QUFDM0QsY0FBRSxPQUFPblQ7Z0JBQ1AsTUFBTSxJQUFJdWlCLGFBQUFBLGNBQ1Isb0NBQW9DRixpQkFBaUJyaUI7QUFFekQ7WUFFQSxLQUFLSyxPQUFPbWlCLFNBQ1YsTUFBTSxJQUFJRCxhQUFBQSxjQUNSLG9DQUFvQ0YsaUJBQWlCaGlCLE9BQU84SyxPQUFPM0wsS0FBSztZQUc1RSxPQUFPYSxPQUFPQTtBQUNoQjtRQWFBLGNBQU1vaUIsQ0FDSjNZLE9BQ0E0WSxjQUF1QixPQUN2QkMsY0FBc0IsSUFDdEJDLFVBQ0FDLE9BQ0FDLG1CQUNHM2M7WUFFSCxPQUFNQyxLQUFFQSxjQUFlcEIsS0FBS3NCLE9BQU9ILE1BQU0sWUFBWSxPQUFPUixJQUMxRFgsS0FBS3lkO1lBR1AsSUFBSU07WUFDSjtnQkFDRSxPQUFNalEsVUFBRUEsVUFBUWtRLFVBQUVBLFlBQWFsWjtnQkFDL0IsTUFBTW1aLFFBQVE7b0JBQ1pDLGNBQWNwUTtvQkFDZHFRLGtCQUFrQkg7b0JBQ2xCTCxhQUFhQTtvQkFDYkMsVUFBVUE7b0JBQ1ZDLE9BQU9BO29CQUNQQyxnQkFBZ0JBOztnQkFFbEJDLHFCQUFxQi9kLEtBQUswYixPQUFPK0IsU0FBU1EsT0FBT2plLEtBQUttTztnQkFDdEQvTSxJQUFJZ2QsS0FDRixvQkFBb0J0USxtQ0FBbUM4UCxZQUFZLG9CQUFvQkYsY0FBYyxrQkFBa0I7QUFFM0gsY0FBRSxPQUFPMWlCO2dCQUNQLE1BQU1nRixLQUFLOGMsV0FBVzloQjtBQUN4QjtZQUNBLE9BQU8raUI7QUFDVDtRQUVVLDZCQUFPTSxDQUNmQyxZQUNBN2dCLE9BQ0FtRjtZQUVBLE1BQU14QixNQUFNd0IsSUFBSXNLLE9BQU92TSxJQUFJWCxLQUFLcWU7WUFDaEMsT0FBTXJRLGFBQUVBLGFBQVdsTixLQUFFQSxLQUFHeWQsaUJBQUVBLG1CQUFvQkQ7WUFDOUNsZCxJQUFJSyxRQUNGLHdDQUF3Q3VNLHNCQUFzQnZRO1lBRWhFLE1BQU1naEIsV0FBV3pJLFlBQVlHLHdCQUF3Qm5JO1lBQ3JELE1BQU01SSxLQUFLNFEsWUFBWXJCLE9BQU84SjtZQUM5QnJkLElBQUkyRCxNQUFNLFlBQVkwWiwwQkFBMEJyWjtZQUNoRCxPQUFPLElBQUl1SCxRQUFBQSxTQUFTO2dCQUNsQnZILElBQUlBO2dCQUNKNEwsYUFBYTtvQkFDWDVMLElBQUlBO29CQUNKNEksYUFBYUE7b0JBQ2JELFlBQVlqTixJQUFJOGQ7b0JBQ2hCTCxpQkFBaUJBOztnQkFFbkI5Z0IsT0FBT0E7O0FBRVg7UUFTQSxZQUFNc2hCLENBQ0oxQixjQUNBVSxpQkFDRzVjO1lBRUgsT0FBTUMsS0FBRUEsS0FBR3dCLEtBQUVBLGNBQWU1QyxLQUFLc0IsT0FBT0gsTUFBTSxVQUFVLE9BQU9SLElBQzdEWCxLQUFLK2U7WUFFUCxJQUFJQztZQUNKO2dCQUNFNWQsSUFBSTJELE1BQU0sYUFBYXNZO2dCQUN2QixNQUFNaUIsbUJBQW9DdGUsS0FBSzBiLE9BQU9xRCxPQUFPO29CQUMzRGIsY0FBY2I7b0JBQ2RjLGtCQUFrQko7O2dCQUVwQmlCLFdBQVdxTSxzQkFBc0JoTix1QkFDL0JDLFlBQ0F0ZSxLQUFLcU8sT0FBTzBNLFFBQ1puWTtnQkFFRnhCLElBQUlnZCxLQUNGLHlCQUF5QmYsc0JBQXNCcmQsS0FBS3FPLE9BQU8wTSxhQUFhaUUsU0FBUzVaO0FBRXJGLGNBQUUsT0FBT3BLO2dCQUNQLE1BQU1nRixLQUFLOGMsV0FBVzloQjtBQUN4QjtZQUNBLE9BQU9na0I7QUFDVDtRQWFBLHVCQUFNQyxDQUNKbmEsT0FDQTRZLGNBQXVCLE9BQ3ZCQyxjQUFzQixJQUN0QkMsVUFDQUMsT0FDQUMsbUJBQ0czYztZQUVILE9BQU15QixLQUFFQSxjQUFlNUMsS0FBS3NCLE9BQU9ILE1BQU0sbUJBQW1CLE9BQU9SLElBQ2pFWCxLQUFLaWY7WUFFUCxNQUFNbEIscUJBQXFCL2QsS0FBS3lkLFNBQzlCM1ksT0FDQTRZLGFBQ0FDLGFBQ0FDLFVBQ0FDLE9BQ0FDLGdCQUNBbGI7WUFFRixPQUFNa0wsVUFBRUEsWUFBYWhKO1lBQ3JCLE9BQU85RSxLQUFLK2UsT0FBT2pSLFVBQW9CaVEsY0FBY25iO0FBQ3ZEO1FBUUEsb0JBQU1vcEIsQ0FDSjNPLGNBQ0EyQixVQUNBaU4sb0JBQ0c5cUI7WUFFSCxPQUFNQyxLQUFFQSxLQUFHd0IsS0FBRUEsY0FBZTVDLEtBQUtzQixPQUFPSCxNQUFNLFlBQVksT0FBT1IsSUFDL0RYLEtBQUtnc0I7WUFHUDtnQkFDRTVxQixJQUFJZ2QsS0FBSyx5QkFBeUJmO2dCQUdsQyxNQUFNbkIsa0JBQWtCbGMsS0FBSzBiLE9BQU9TO2dCQUVwQyxNQUFNK1AsdUJBQXdCaFEsZ0JBQWdCb0IsT0FDNUNELGNBQ0FyZCxLQUFLbU87c0JBR0QrTixnQkFBZ0IzVyxPQUFPOFgsY0FBYzRPLGlCQUFpQmpzQixLQUFLbU87Z0JBR2pFLE1BQU1nZSxlQUFlL2QsYUFBQUEsS0FBS2dlLFdBQ3hCL08sY0FDQSxJQUNBcmQsS0FBS21PLEtBQUtrZSxZQUNWck4sU0FBU2hSLGFBQ1RnUixTQUFTalI7Z0JBRVhvZSxhQUFhbmQsZUFBZWhQLEtBQUttTyxLQUFLWTtnQkFFdEMsTUFBTXVkLG1CQUNKSixlQUFlN3dCLE9BQU93aUIsU0FBUyxJQUMvQjlmLElBQUksRUFBR25ELGlCQUFNO29CQUNiQTtvQkFDQTJ4QixVQUFVOztnQkFHWixNQUFNak8sbUJBQW1CdGUsS0FBSzBiLE9BQU84USxTQUNuQ0wsY0FDQUc7Z0JBR0YsTUFBTUcsa0JBQWtCcEIsc0JBQXNCaE4sdUJBQzVDQyxZQUNBdGUsS0FBS3FPLE9BQU8wTSxRQUNablk7Z0JBSUZ4QixJQUFJMkQsTUFBTSxzQ0FBc0NzWTtnQkFDaEQsT0FBTTlKLEtBQUVBLEtBQUdHLFFBQUVBLFVBQVdULHdCQUF3QitMLFNBQVNoUjtzQkFDbkRoTyxLQUFLa2YsT0FBTzdCLGNBQWM7b0JBQUU5SjtvQkFBS0c7bUJBQVV2UztnQkFFakRDLElBQUkyRCxNQUFNLGlDQUFpQ3NZO2dCQUMzQyxPQUFPb1A7QUFDVCxjQUFFLE9BQU96eEI7Z0JBQ1AsTUFBTWdGLEtBQUs4YyxXQUFXOWhCO0FBQ3hCO0FBQ0Y7UUFZQSxZQUFNa2tCLENBQ0o3QixjQUNBcVAsa0JBQ0d2ckI7WUFFSCxPQUFNQyxLQUFFQSxjQUFlcEIsS0FBS3NCLE9BQU9ILE1BQU0sVUFBVSxPQUFPUixJQUFJWCxLQUFLa2Y7WUFDbkU5ZCxJQUFJSyxRQUFRLHdDQUF3QzRiO1lBQ3BELE1BQU0yQixpQkFBaUJoZixLQUFLb2QsS0FBS0M7WUFDakMsS0FBSzJCLFVBQ0gsTUFBTSxJQUFJekIsYUFBQUEsY0FDUixxQ0FBcUNGO1lBRXpDLElBQUloaUI7WUFDSjtnQkFDRSxNQUFNOGpCLFNBQ0ppSCxRQUFRc0csY0FBY2haLFdBQVcwUyxRQUFRc0csY0FBY25aLE9BQ25ELDRCQUNBO2dCQUVOLE1BQU1vWixnQkFBZ0M7b0JBQ3BDeE47dUJBQ0d1TjtvQkFDSHhPLGNBQWNjLFNBQVM1Wjs7Z0JBR3pCL0osZUFBZTJFLEtBQUswYixPQUFPd0QsT0FBT3lOLGVBQWUzc0IsS0FBS21PO0FBQ3hELGNBQUUsT0FBT25UO2dCQUNQLE1BQU0sSUFBSXdELGFBQUFBLGNBQ1IsdUNBQXVDNmUsaUJBQWlCcmlCO0FBRTVEO1lBQ0EsS0FBS0ssT0FBT21pQixTQUNWLE1BQU0sSUFBSWhmLGFBQUFBLGNBQ1IsdUNBQXVDNmUsaUJBQWlCaGlCLE9BQU84SyxPQUFPM0wsS0FBSztZQUUvRSxPQUFPYTtBQUNUOztJQzFmVXV4QixRQUFBQSxlQUFBQTtLQUFaLFNBQVlBO1FBRVZBLFFBQUEsV0FBQTtRQUVBQSxRQUFBLFVBQUE7UUFFQUEsUUFBQSxZQUFBO0FBQ0QsTUFQRCxDQUFZQSxRQUFBQSxZQUFBQSxrQkFBTyxDQUFBO0lDTFosTUFBTUMsMkJBQThDL3hCLE9BQU80RCxPQUFPO1FBQ3ZFb3VCLGlCQUFpQjtRQUNqQkMsZ0JBQWdCO1FBQ2hCQyxlQUFlO1FBQ2ZDLGVBQWU7UUFDZjVsQixRQUFRO1FBQ1I2bEIsMEJBQTBCO1FBQzFCQyxzQkFBc0I7UUFDdEIzc0Isc0JBQXNCO1FBQ3RCNHNCLGtCQUFrQjtRQUNsQkMsaUJBQWlCOztJQ05uQixNQUFNanNCLE1BQU0sSUFBSStMLFFBQUFBLFdBQVc7SUFXcEJqUyxlQUFla1Msa0JBQ3BCQyxlQUNBQztRQUVBLElBQUlELHlCQUF5QkUsWUFBWSxPQUFPRjtRQUNoRCxJQUNFQSxjQUFjRyxNQUNaLHlFQUdGLE9BQU9IO1FBQ1QsYUFBYUMsV0FBV0Q7QUFDMUI7SUFVT25TLGVBQWV1UyxTQUFTSjtRQUM3QixXQUFXQSxrQkFBa0IsVUFBVSxPQUFPQTtRQUU5QyxNQUFNQyxhQUFhcFMsTUFBTzVCO1lBQ3hCLE9BQU1vVSxVQUFFQSxrQkFBbUJDLEtBQUFBLGdCQUFnQkMsT0FBTztZQUNsRCxhQUFhRixTQUFTRCxTQUFTblU7O1FBR2pDLGFBQWFnVSxXQUFXRDtBQUMxQjtJQWFPblMsZUFBZTJTLFVBQ3BCQyxVQUNBQyxZQUNBQyxhQUNBdlE7UUFFQTJELElBQUkyRCxNQUNGLGlCQUFpQnRILGNBQWNxUSw2QkFBNkJFO1FBRTlELE1BQU1HLE9BQU8sSUFBSUMsYUFBQUEsS0FBS047UUFDdEIsTUFBTWdCLGNBQWNWLGFBQUFBLEtBQUtpQjtRQUN6QmxCLEtBQUthLGVBQWVGO1FBQ3BCLE1BQU02SSxjQUFjN0ksWUFBWVEsaUJBQWlCdkI7Y0FDM0NJLEtBQUtpQixjQUFjdUksYUFBYTNKLGFBQWF2UTtRQUNuRCxPQUFPMFE7QUFDVDtJQVdPalQsZUFBZXlWLFlBQ3BCbFQsT0FDQW1UO1FBRUEsTUFBTUMscUJBQXFCM1YsTUFBTzVCO1lBQ2hDLE9BQU1vVSxVQUFFQSxrQkFBbUJDLEtBQUFBLGdCQUFnQkMsT0FBTztZQUNsRCxNQUFNa0QsaUJBQWlCQyxvQkFBb0J6WDtZQUMzQyxNQUFNMFgsb0JBQW9CdEQsU0FBU0QsU0FBU3FEO1lBQzVDLE9BQU9FOztRQUdULE1BQU1BLG9CQUFpQzVELGtCQUNyQ3dELG1CQUNBQztRQUdGLE9BQU87WUFBRXBUO1lBQU91VDs7QUFDbEI7SUFVTzlWLGVBQWU2VixvQkFBb0JFO1FBQ3hDLE9BQU12RCxVQUFFQSxrQkFBbUJDLEtBQUFBLGdCQUFnQkMsT0FBTztRQUNsRCxPQUFNcFQsTUFBRUEsY0FBZW1ULEtBQUFBLGdCQUFnQkMsT0FBTztRQUM5QyxNQUFNclMsY0FBY21TLFNBQVN3RCxRQUFRRDtRQUNyQyxPQUFPelcsS0FBS3lXLFNBQVMxVixNQUFNO0FBQzdCO0lBVU9MLGVBQWVpVywyQkFDcEJGO1FBRUEsT0FBTXZELFVBQUVBLGtCQUFtQkMsS0FBQUEsZ0JBQWdCQyxPQUFPO1FBQ2xELE9BQU1wVCxNQUFFQSxjQUFlbVQsS0FBQUEsZ0JBQWdCQyxPQUFPO1FBQzlDLE1BQU1yUyxjQUFjbVMsU0FBU3dELFFBQVFEO1FBQ3JDLGNBQWN2RCxTQUFTRCxTQUFTalQsS0FBS3lXLFNBQVMxVixNQUFNLE1BQU1xUDtBQUM1RDtJQVVPMVAsZUFBZW1XLFVBQVVDO1FBQzlCLE1BQU1DLG1CQUFtQnJXLE1BQU81QjtZQUM5QixPQUFNb1UsVUFBRUEsa0JBQW1CQyxLQUFBQSxnQkFBZ0JDLE9BQU87WUFDbEQsTUFBTTRELGdCQUFnQlQsb0JBQW9Celg7WUFDMUMsYUFBYW9VLFNBQVNELFNBQVMrRDs7UUFHakMsTUFBTUMsc0JBQXVCckUsa0JBQzNCa0Usa0JBQ0FDO1FBT0YsTUFBTXhELG1CQUFtQjJELGtCQUFrQkQ7UUFDM0MsTUFBTTFLLE9BQU9qTSxPQUFPNlcsc0JBQXNCNUQ7UUFDMUMsTUFBTTZELElBQUs3RCxXQUFtQmhILEtBQUs7UUFHbkMsT0FBTzhLLGNBQUFBLFFBQVFDLG9CQUFvQkY7QUFDckM7SUF1Qk8xVyxlQUFld1csa0JBQWtCSztRQUN0QyxNQUFNQyxVQUFVO1FBQ2hCLElBQUlDO1FBQ0osSUFBSW1GLFFBQUFBLGFBQWE7WUFDZm5GLFNBQVVDLFdBQW1CM0IsT0FBTzBCO0FBQ3RDLGVBQU87WUFDTCxNQUFNekQsWUFBYWIsS0FBQUEsZ0JBQWdCQyxPQUFPb0U7WUFDMUNDLFNBQVN6RCxJQUFJeUQsVUFBVXpELElBQUk2RCxVQUFVSjtBQUN2QztRQUVBLEtBQUtBLFFBQVEsTUFBTSxJQUFJakosTUFBTTtRQUU3QixTQUFTc0osT0FBT3pKO1lBQ2QsTUFBTTBKLE1BQU0sSUFBSUMsWUFBWTNKLElBQUlsTTtZQUNoQyxNQUFNOFYsVUFBVSxJQUFJbEYsV0FBV2dGO1lBQy9CLEtBQUssSUFBSTFMLElBQUksR0FBRzZMLFNBQVM3SixJQUFJbE0sUUFBUWtLLElBQUk2TCxRQUFRN0wsS0FBSztnQkFDcEQ0TCxRQUFRNUwsS0FBS2dDLElBQUk4SixXQUFXOUw7QUFDOUI7WUFDQSxPQUFPMEw7QUFDVDtRQUVBLE1BQU0xSixNQUFNa0osSUFDVG5ILFNBQVMsUUFDVC9OLFFBQVEsK0JBQStCLElBQ3ZDK1YsV0FBVyxNQUFNLElBQ2pCL1YsUUFBUSw2QkFBNkI7UUFDeEMsTUFBTWdXLFVBQVVuRCxPQUFPNUUsS0FBS2pDLEtBQUssVUFBVStCLFNBQVM7UUFDcEQsTUFBTWtJLFlBQVlSLE9BQU9PO1FBRXpCO1lBQ0UsTUFBTS9SLFlBQVltUixPQUFPYyxVQUN2QixTQUNBRCxXQUNBO2dCQUNFbFksTUFBTTtnQkFDTm9ZLFlBQVk7ZUFFZCxNQUNBLEVBQUM7WUFHSCxPQUFPbFM7QUFDVCxVQUFFLE9BQU85RjtZQUNQLE1BQU0sSUFBSXdELGFBQUFBLGNBQWN4RDtBQUMxQjtBQUNGO0lDOUtBLE1BQU1zeUIsZUFBZ0JyckIsU0FDcEJBLE1BQU1wRixRQUFRLHVCQUF1QjtJQUV2QyxTQUFTMHdCLHdCQUF3QnRyQjtRQUMvQixLQUFLQSxPQUFPLE9BQU87UUFDbkIsTUFBTXVyQixRQUFRcHFCLE1BQU0wSCxLQUFLN0k7UUFDekIsS0FBSyxJQUFJNEUsSUFBSTJtQixNQUFNN3dCLFNBQVMsR0FBR2tLLEtBQUssR0FBR0EsS0FBSyxHQUFHO1lBQzdDLE1BQU0wVCxPQUFPaVQsTUFBTTNtQixHQUFHNG1CLFlBQVk7WUFDbEMsSUFBSWxULFNBQVMvZCxXQUFXO1lBQ3hCLElBQUkrZCxPQUFPLFNBQVU7Z0JBQ25CaVQsTUFBTTNtQixLQUFLYyxPQUFPK2xCLGNBQWNuVCxPQUFPO2dCQUN2QyxPQUFPaVQsTUFBTXhxQixNQUFNLEdBQUc2RCxJQUFJLEdBQUdyTSxLQUFLO0FBQ3BDO0FBQ0Y7UUFDQSxPQUFPLEdBQUd5SDtBQUNaO0lBRUEsU0FBUzByQixZQUFZdmQ7UUFDbkIsT0FBTztZQUNMd2QsT0FBT3hkO1lBQ1B5ZCxLQUFLTix3QkFBd0JuZDs7QUFFakM7SUFFTSxNQUFPMGQsOEJBQWtEQyxLQUFBQTtRQU03RCxXQUFBbnVCLENBQVlDLFNBQThCNUI7WUFDeEM4QixNQUFNRixTQUFTNUI7QUFDakI7UUFFbUIsTUFBQSt2QixDQUNqQnByQjtZQUVBLE1BQU1xckIsV0FBNkNsdUIsTUFBTWl1QixPQUN2RHByQjtZQUVGLEtBQUtxckIsVUFBVSxPQUFPQTtZQUV0QixPQUFNQyxRQUFFQSxRQUFNaFcsUUFBRUEsUUFBTS9XLE1BQUVBLFFBQVM4c0I7WUFDakMsT0FBTXZyQixXQUFFQSxXQUFTeEIsT0FBRUEsU0FBVWdYO1lBQzdCLFFBQVFnVztjQUNOLEtBQUszc0IsS0FBQUEsc0JBQXNCaUI7Z0JBQ3pCOztjQUNGLEtBQUtqQixLQUFBQSxzQkFBc0JvQjtnQkFDekJ4QixLQUFLckYsS0FBSzRHLFdBQVd4QjtnQkFDckI7O2NBQ0YsS0FBS0ssS0FBQUEsc0JBQXNCVztnQkFDekI7O2NBQ0YsS0FBS1gsS0FBQUEsc0JBQXNCUTtnQkFDekJaLEtBQUtyRixLQUFLNEc7Z0JBQ1Y7O2NBQ0YsS0FBS25CLEtBQUFBLHNCQUFzQkM7Z0JBQ3pCTCxLQUFLckYsS0FBSzRHLFdBQVd4QjtnQkFDckI7O2NBQ0YsS0FBS0ssS0FBQUEsc0JBQXNCYTtnQkFDekI7O2NBQ0Y7Z0JBQ0UsTUFBTSxJQUFJNUQsYUFBQUEsY0FBYyxzQkFBc0IwdkI7O1lBR2xELE9BQU9EO0FBQ1Q7UUFFbUIscUJBQU1FLElBQ3BCQztZQUVILE1BQU1oSixPQUFPemxCLEtBQUFBLFdBQVcwdUIsU0FBU3J1QixLQUFLc3VCLGNBQWN0dUIsS0FBS0gsUUFBUTB1QjtZQUNqRSxPQUFNTCxRQUFFQSxRQUFNL3NCLE1BQUVBLFFBQVNuQixLQUFLaUY7WUFDOUIsT0FBT21nQixLQUFLeGpCLFVBQVVzc0IsV0FBVy9zQixTQUFTaXRCO0FBQzVDO1FBRVMsYUFBTWxwQixDQUNidEM7WUFFQUEsTUFDRUEsYUFDTzVDLEtBQUtILFFBQVF5akIsUUFDbEJ6Z0IscUJBQWdCMnJCLE9BQ2hCeHVCLEtBQUsvQixhQUFhLENBQUEsR0FDbEIrQixLQUFLc3VCO1lBR1QsSUFDRXR1QixLQUFLeXVCLG1CQUNKN3JCLElBQW1DZ0QsSUFBSSw4QkFDeEM7Z0JBQ0EsTUFBTXFvQixXQUFXanVCLEtBQUtndUIsT0FBT3ByQjtnQkFDN0IsSUFBSXFyQixVQUFVO29CQUNaanVCLEtBQUtpRixXQUFXZ3BCO29CQUNoQixPQUFPanVCO0FBQ1Q7QUFDRjtZQUNBLE1BQU1tQixPQUE0QjtZQUNsQyxNQUFNK1csU0FBYyxDQUFBO1lBRXBCLE1BQU1qVCxXQUFtQztnQkFDdkN0RCxPQUFPM0IsS0FBS3N1QjtnQkFDWm50QjtnQkFDQStXOztZQUdGLE1BQU1nVyxTQUFtQixFQUFDUSxLQUFBQSxZQUFZeHNCO1lBRXRDLElBQUlsQyxLQUFLMnVCLGdCQUFnQjtnQkFDdkIsTUFBTUMsU0FBUzV1QixLQUFLNnVCLGlCQUFpQjd1QixLQUFLMnVCLGdCQUFnQi9yQjtnQkFDMURzckIsT0FBT3B5QixLQUFLOHlCLE9BQU9WO2dCQUNuQixJQUFJVSxPQUFPenRCLFFBQVF5dEIsT0FBT3p0QixLQUFLeEUsUUFDN0J3RSxLQUFLckYsUUFBUzh5QixPQUFPenRCO0FBQ3pCO1lBQ0EsSUFBSW5CLEtBQUs4dUIsZ0JBQ1BaLE9BQU9weUIsS0FDTDR5QixLQUFBQSxZQUFZSyxRQUNaL3VCLEtBQUs4dUIsZUFBZXQwQixLQUFLLElBQUlrMEIsS0FBQUEsWUFBWU0sSUFBSUM7WUFFakQsSUFBSWp2QixLQUFLa3ZCLGtCQUFrQnZ5QixRQUFRO2dCQUNqQ3V4QixPQUFPcHlCLEtBQUs0eUIsS0FBQUEsWUFBWVMsVUFBVW52QixLQUFLa3ZCLGlCQUFpQixHQUFHO2dCQUMzRC90QixLQUFLckYsS0FBS2tFLEtBQUtrdkIsaUJBQWlCLEdBQUc7QUFDckM7WUFDQWpxQixTQUFTaXBCLFNBQVNrQixRQUFBQSxZQUFZbEIsT0FBTzF6QixLQUFLO1lBQzFDeUssU0FBU2lULFNBQVNBO1lBQ2xCbFksS0FBS2lGLFdBQVdBO1lBQ2hCLE9BQU9qRjtBQUNUO1FBTVUsYUFBQXF2QixDQUNSL3JCLEdBQ0Fnc0IsUUFDQUMsY0FDQTNzQjtZQUVBLElBQUlVLEVBQUVDLHVCQUFZaXNCLEtBQUs7Z0JBQ3JCLE9BQU0sS0FBTUMsV0FBV25zQixFQUFFQyxXQUFBQSxZQUFZaXNCLElBQUkvRSxNQUFNbG5CLFdBQUFBLFlBQVltc0I7Z0JBQzNELE1BQU10cUIsS0FBS3FxQixRQUFRajFCLEtBQUs7Z0JBQ3hCLE9BQU93RixLQUFLSCxRQUFReUYsT0FDbEJoQyxHQUNBdEQsS0FBS3N1QixjQUNMMWtCLEtBQUFBLFNBQVNDLFdBQVcwbEIsY0FBY25xQixLQUNsQzVJLFdBQ0FvRztBQUVKO1lBQ0EsT0FBT1U7QUFDVDtRQU1TLFNBQU1xc0IsQ0FBT0MsYUFBeUJ6dUI7WUFDN0MsT0FBTXlCLEtBQUVBLE9BQVE1QyxLQUFLc0IsT0FBT0gsTUFBTW5CLEtBQUsydkI7WUFDdkMsTUFBTUUsYUFBY0QsVUFBa0JFO1lBQ3RDLElBQUtGLFVBQWtCRyxhQUFhRixZQUFZO2dCQUM5QyxPQUFPN3ZCLEtBQUtnd0IsaUJBQW9CSCxZQUFZanRCO0FBQzlDO1lBQ0EsTUFBTXF0QixnQkFBdUJqd0IsS0FBS0gsUUFBUTh2QixJQUN4Q0MsVUFDQSxNQUNBNXZCLEtBQUtzdUIsY0FDTDFyQjtZQUdGLE1BQU0wc0IsU0FBU3IwQixvQkFBQUEsTUFBTXdNLEdBQUd6SCxLQUFLc3VCO1lBQzdCLE1BQU01bUIsT0FBT2MsV0FBQUEsU0FBUzVDLElBQ3BCNUYsS0FBS3N1QixjQUNMOWxCLG9CQUFTMUgsSUFBSWtnQixhQUFBQSxPQUFPd08sSUFBSUYsVUFDdkI1bkI7WUFFSCxLQUFLMUgsS0FBSzh1QixnQkFDUixPQUFPbUIsUUFBUWx5QixJQUFLdUYsS0FBTXRELEtBQUtxdkIsY0FBYy9yQixHQUFHZ3NCLFFBQVE1bkIsTUFBTTlFO1lBQ2hFLE9BQU9xdEI7QUFDVDtRQU1tQixLQUFBaG5CO1lBQ2pCLE1BQU03SCxNQUFNcEIsS0FBS29CLElBQUlULElBQUlYLEtBQUtpSjtZQUM5QixNQUFNaW5CLGlCQUFpQmx3QixLQUFLbXdCO1lBQzVCLElBQUlELGdCQUFnQixPQUFPQTtZQUMzQixNQUFNRSxZQUEyQixDQUFBO1lBQ2pDQSxVQUFVN3NCLFdBQUFBLFlBQVlDLFNBQVMsQ0FBQTtZQUMvQjRzQixVQUFVN3NCLFdBQUFBLFlBQVlDLFNBQVN2SSxvQkFBQUEsTUFBTXlHLFVBQVUxQixLQUFLc3VCO1lBQ3BELE1BQU0rQixRQUFvQjtnQkFBRUMsVUFBVUY7O1lBQ3RDLElBQUlwd0IsS0FBSzh1QixnQkFBZ0J1QixNQUFNRSxTQUFTdndCLEtBQUs4dUI7WUFFN0MsSUFBSTl1QixLQUFLMnVCLGdCQUFnQjtnQkFDdkIsTUFBTTdJLFlBQTJCOWxCLEtBQUt3d0IsZUFDcENDLEtBQUFBLFVBQVVDLElBQ1Ixd0IsS0FBSzJ1QixnQkFDTDhCLEtBQUFBLFVBQVV2TSxVQUFhM2dCLFdBQUFBLFlBQVlDLE9BQWtCbXRCLEdBQ25ETixNQUFNQyxTQUFTL3NCLFdBQUFBLFlBQVlDLFVBRy9COHNCO2dCQUNGLE1BQU1NLGVBQWU5MUIsT0FBT2lNLEtBQUsrZTtnQkFDakMsSUFDRThLLGFBQWFqMEIsV0FBVyxLQUN4QjdCLE9BQU9ELE9BQU9nMkIsV0FBQUEsc0JBQXNCQyxRQUFRRixhQUFhLFNBQVMsR0FFbEUsUUFBUUEsYUFBYTtrQkFDbkIsS0FBS0MsV0FBQUEscUJBQXFCN0I7b0JBQ3hCbEosVUFBVStLLFdBQUFBLHFCQUFxQjdCLE9BQU8sS0FDakNsMEIsT0FBT0QsT0FDUmlyQixVQUFVK0ssV0FBQUEscUJBQXFCN0IsTUFDL0JsRixPQUFPLENBQUNod0IsT0FBd0JpM0I7d0JBQ2hDLE1BQU1ocUIsT0FBT2pNLE9BQU9pTSxLQUFLZ3FCO3dCQUN6QixJQUFJaHFCLEtBQUtwSyxXQUFXLEdBQ2xCLE1BQU0sSUFBSXFNLE1BQ1I7d0JBRUosTUFBTTRJLElBQUk3SyxLQUFLO3dCQUNmLElBQUk2SyxNQUFNaWYsV0FBQUEscUJBQXFCN0IsS0FDN0JsMUIsTUFBTWdDLFFBQVNpMUIsSUFBSW5mLFVBQ2hCOVgsTUFBTWdDLEtBQUtpMUI7d0JBQ2hCLE9BQU9qM0I7dUJBQ047b0JBRUx1MkIsTUFBTUMsV0FBV3hLO29CQUNqQjs7a0JBQ0YsS0FBSytLLFdBQUFBLHFCQUFxQkc7b0JBQUk7d0JBQzVCLE1BQU1DLElBQXNCLENBQUE7d0JBQzVCQSxFQUFFSixXQUFBQSxxQkFBcUI3QixPQUFPLEVBQzVCbEosY0FDR2hyQixPQUFPbzJCLFFBQVFiLE1BQU1DLFVBQVV2eUIsSUFBSSxFQUFFK0MsS0FBS2l3Qjs0QkFDM0MsTUFBTTExQixTQUEyQixDQUFBOzRCQUNqQ0EsT0FBT3lGLE9BQU9pd0I7NEJBQ2QsT0FBTzExQjs7d0JBR1hnMUIsTUFBTUMsV0FBV1c7d0JBQ2pCO0FBQ0Y7O2tCQUNBO29CQUNFLE1BQU0sSUFBSWpvQixNQUFNO3VCQUVqQjtvQkFDSGxPLE9BQU9vMkIsUUFBUXBMLFdBQVc1ckIsUUFBUSxFQUFFNEcsS0FBS2l3Qjt3QkFDdkMsSUFBSVYsTUFBTUMsU0FBU3h2QixNQUNqQk0sSUFBSSt2QixLQUNGLEtBQUtyd0IsOENBQThDdXZCLE1BQU1DLFNBQVN4dkIsV0FBV2l3Qjt3QkFFakZWLE1BQU1DLFNBQVN4dkIsT0FBT2l3Qjs7QUFFMUI7QUFDRjtZQUVBLElBQUkvd0IsS0FBS2t2QixrQkFBa0J2eUIsUUFBUTtnQkFDakMwekIsTUFBTXhHLE9BQU93RyxNQUFNeEcsUUFBUTtnQkFDM0J3RyxNQUFNQyxXQUFXRCxNQUFNQyxZQUFhLENBQUE7Z0JBQ3BDLEtBQUssT0FBT2MsYUFBYTF1QixjQUFjMUMsS0FBS2t2QixrQkFBa0I7b0JBQzVELE1BQU1vQixXQUFXYztvQkFDakIsTUFBTUMsTUFBc0MsQ0FBQTtvQkFDNUNBLElBQUlmLFlBQVk1dEI7b0JBQ2YydEIsTUFBTXhHLEtBQTBDL3RCLEtBQUt1MUI7b0JBQ3RELEtBQUtoQixNQUFNQyxTQUFTQSxXQUFXO3dCQUM3QkQsTUFBTUMsU0FBU0EsWUFBWSxDQUFBO3dCQUMxQkQsTUFBTUMsU0FBU0EsVUFBNEJnQixXQUFBQSxnQkFBZ0JDLFVBQzFEO0FBQ0o7QUFDRjtBQUNGO1lBRUEsSUFBSXZ4QixLQUFLd3hCLGVBQWU7Z0JBQ3RCbkIsTUFBTW52QixRQUFRbEIsS0FBS3d4QjtBQUNyQixtQkFBTztnQkFDTHB3QixJQUFJK3ZCLEtBQ0YsNkRBQTZETSxXQUFBQTtnQkFFL0RwQixNQUFNbnZCLFFBQVF1d0IsV0FBQUE7QUFDaEI7WUFFQSxJQUFJenhCLEtBQUsweEIsZ0JBQWdCckIsTUFBTXNCLE9BQU8zeEIsS0FBSzB4QjtZQUUzQyxPQUFPckI7QUFDVDtRQU1tQixjQUFBRyxDQUFlMUs7WUFDaEMsU0FBUzhMLE1BQ1BDLElBQ0FDLE1BQ0FDO2dCQUVBLE1BQU0xMkIsU0FBcUI7b0JBQUVpMUIsVUFBVTs7Z0JBQ3ZDajFCLE9BQU9pMUIsU0FBU3VCLE1BQU0sRUFBQ0MsTUFBTUM7Z0JBQzdCLE9BQU8xMkI7QUFDVDtZQUVBLE9BQU0yMkIsT0FBRUEsT0FBS0MsVUFBRUEsVUFBUUMsWUFBRUEsY0FBZXBNO1lBTXhDLElBQUltTSxhQUFhRSxLQUFBQSxTQUFTQyxhQUFhO2dCQUNyQyxXQUFXSixVQUFVLFVBQ25CLE1BQU0sSUFBSUssS0FBQUEsV0FBVztnQkFDdkIsV0FBV0gsZUFBZSxVQUN4QixNQUFNLElBQUlHLEtBQUFBLFdBQVc7Z0JBQ3ZCLE1BQU1DLFFBQVEzRSxZQUFZdUU7Z0JBQzFCLE1BQU01QixXQUEwQixDQUFBO2dCQUNoQ0EsU0FBUzBCLFNBQVMsQ0FBQTtnQkFDakIxQixTQUFTMEIsT0FBeUJWLFdBQUFBLGdCQUFnQmlCLGFBQWFELE1BQU0xRTtnQkFDckUwQyxTQUFTMEIsT0FBeUJWLFdBQUFBLGdCQUFnQmtCLFdBQVdGLE1BQU16RTtnQkFDcEUsT0FBTztvQkFBRXlDOztBQUNYO1lBRUEsSUFBSTJCLGFBQWFFLEtBQUFBLFNBQVNNLFdBQVc7Z0JBQ25DLFdBQVdULFVBQVUsVUFDbkIsTUFBTSxJQUFJSyxLQUFBQSxXQUFXO2dCQUN2QixXQUFXSCxlQUFlLFVBQ3hCLE1BQU0sSUFBSUcsS0FBQUEsV0FBVztnQkFDdkIsTUFBTS9CLFdBQTBCLENBQUE7Z0JBQ2hDQSxTQUFTMEIsU0FBUztvQkFDaEIsQ0FBQ1YsV0FBQUEsZ0JBQWdCb0IsU0FBUyxHQUFHcEYsYUFBYTRFOztnQkFFNUMsT0FBTztvQkFBRTVCOztBQUNYO1lBRUEsSUFBSTJCLGFBQWFFLEtBQUFBLFNBQVNRLFNBQVM7Z0JBQ2pDLE1BQU1sVCxPQUFPdVM7Z0JBQ2IsS0FBSzV1QixNQUFNQyxRQUFRNnVCLGVBQWVBLFdBQVd2MUIsV0FBVyxHQUN0RCxNQUFNLElBQUkwMUIsS0FBQUEsV0FBVztnQkFDdkIsT0FBT3JTLEtBQUs0UyxPQUFPVjtnQkFDbkIsTUFBTVcsWUFBMkIsQ0FBQTtnQkFDakNBLFVBQVVwVCxRQUFRLENBQUE7Z0JBQ2pCb1QsVUFBVXBULE1BQ1RxVCxXQUFBQSxtQkFBbUJYLEtBQUFBLFNBQVNJLGNBQzFCdlM7Z0JBQ0g2UyxVQUFVcFQsTUFDVHFULFdBQUFBLG1CQUFtQlgsS0FBQUEsU0FBU1ksZUFDMUJIO2dCQUNKLE9BQU87b0JBQUV0QyxVQUFVdUM7O0FBQ3JCO1lBRUEsSUFBSWhCLEtBQW9CLENBQUE7WUFDeEIsSUFDRSxFQUFDbUIsS0FBQUEsY0FBY2hFLEtBQUtnRSxLQUFBQSxjQUFjaEMsSUFBSW1CLEtBQUFBLFNBQVNjLE1BQUtuQyxRQUNsRG1CLGVBQ0ssR0FDUDtnQkFDQUosR0FBR0csU0FBbUIsQ0FBQTtnQkFDckJILEdBQUdHLE9BQW1DYyxXQUFBQSxtQkFBbUJiLGFBQ3hEQztBQUNKLG1CQUFPLElBQUlELGFBQWFFLEtBQUFBLFNBQVNjLEtBQUs7Z0JBQ3BDcEIsS0FBSzd4QixLQUFLd3dCLGVBQWV3QixPQUF1QjFCO2dCQUNoRHVCLEdBQUdpQixXQUFBQSxtQkFBbUJYLEtBQUFBLFNBQVNjLFFBQVEsQ0FBQTtnQkFDdENwQixHQUFHaUIsV0FBQUEsbUJBQW1CWCxjQUFTYyxNQUM3QmpCLE1BQXVDQSxTQUN0Q0U7QUFDTixtQkFBTztnQkFDTCxNQUFNZ0IsTUFBV2x6QixLQUFLd3dCLGVBQWV3QixPQUF1QjFCO2dCQUM1RCxNQUFNNkMsTUFBV256QixLQUFLd3dCLGVBQWUwQixZQUE0QjVCO2dCQUNqRXVCLEtBQUtELE1BQU1rQiw4QkFBbUJiLFdBQVdpQixLQUFLQyxLQUFLN0M7QUFDckQ7WUFFQSxPQUFPO2dCQUFFQSxVQUFVdUI7O0FBQ3JCO1FBTVEsbUJBQUExQjtZQUNOLEtBQUtud0IsS0FBS3N1QixjQUFjLE9BQU85eEI7WUFDL0IsSUFBSXdELEtBQUtvekIsYUFBYTtnQkFDcEIsTUFBTWxQLFlBQVl2YyxPQUFPM0gsS0FBS296QjtnQkFDOUIsTUFBTUMsVUFBVXJ6QixLQUFLc3pCLDBCQUEwQixPQUFPcFA7Z0JBQ3RELE1BQU1xUCxZQUFZdnpCLEtBQUtzekIsMEJBQTBCLFNBQVNwUDtnQkFDMUQsS0FBS21QLFlBQVlFLFdBQ2YsTUFBTSxJQUFJbEIsS0FBQUEsV0FDUiw0REFBNERuTztnQkFFaEUsT0FBT2xrQixLQUFLd3pCLHFCQUFxQjtvQkFDL0JDLE1BQU07b0JBQ052UDtvQkFDQXdQLGVBQWVMLFFBQVF6UTtvQkFDdkIrUSxpQkFBaUJKLFVBQVUzUTs7QUFFL0I7WUFFQSxXQUFXNWlCLEtBQUs0ekIsMEJBQTBCLGFBQWE7Z0JBQ3JELE1BQU0xUCxZQUNKbGtCLEtBQUs0ekIseUJBQXlCLE9BQzFCcDNCLFlBQ0FtTCxPQUFPM0gsS0FBSzR6QjtnQkFDbEIsTUFBTXhWLE9BQU9wZSxLQUFLc3pCLDBCQUEwQixZQUFZcFA7Z0JBQ3hELElBQUk5RixNQUFNO29CQUNSQSxLQUFLeVYsZ0JBQWdCO29CQUNyQixPQUFPN3pCLEtBQUt3ekIscUJBQXFCcFY7QUFDbkM7QUFDRjtZQUVBLE1BQU0wVix3QkFDRzl6QixLQUFLK3pCLGtCQUFrQixzQkFDdkIvekIsS0FBSzR6QiwwQkFBMEIsaUJBQ3BDNXpCLEtBQUtnMEIsaUJBQ0xoMEIsS0FBS2kwQixpQkFDTGowQixLQUFLazBCLGlCQUNMbDBCLEtBQUttMEI7WUFFVCxNQUFNQyxtQkFBcUUsRUFDekUsRUFDRSxTQUNDcDBCLEtBQUsrekIsaUJBQWlCdjNCLGFBRXpCLEVBQUMsT0FBT3dELEtBQUtpMEIsZUFDYixFQUFDLE9BQU9qMEIsS0FBS2cwQixlQUNiLEVBQUMsT0FBT2gwQixLQUFLazBCLGVBQ2IsRUFBQyxZQUFZbDBCLEtBQUttMEI7WUFHcEIsS0FBSyxPQUFPVixNQUFNbkQsYUFBYThELGtCQUFrQjtnQkFDL0MsTUFBTWxRLFlBQVlvTSxXQUFXM29CLE9BQU8yb0IsWUFBWTl6QjtnQkFDaEQsTUFBTTRoQixPQUFPcGUsS0FBS3N6QiwwQkFBMEJHLE1BQU12UDtnQkFDbEQsSUFBSTlGLE1BQU0sT0FBT3BlLEtBQUt3ekIscUJBQXFCcFY7QUFDN0M7WUFFQSxJQUFJMFYsZ0JBQWdCO2dCQUNsQixNQUFNLElBQUl6QixLQUFBQSxXQUNSLDRDQUE0Q3AzQixvQkFBQUEsTUFBTXlHLFVBQ2hEMUIsS0FBS3N1QjtBQUdYO1lBQ0EsT0FBTzl4QjtBQUNUO1FBS1EseUJBQUE4MkIsQ0FDTkcsTUFDQXZQO1lBRUEsS0FBS2xrQixLQUFLc3VCLGNBQWMsT0FBTzl4QjtZQUMvQixNQUFNNjNCLFFBQVFDLFdBQUFBLGlCQUFpQnQwQixLQUFLc3VCLGNBQWNtRixNQUFNdlA7WUFDeEQsS0FBS21RLE1BQU0xM0IsUUFBUSxPQUFPSDtZQUMxQixNQUFNd2xCLE9BQU9xUyxNQUFNO1lBQ25CLE1BQU0zeUIsWUFBWXpHLG9CQUFBQSxNQUFNeUcsVUFBVTFCLEtBQUtzdUI7WUFDdkMsTUFBTWlHLFdBQVdDLFdBQUFBLGlCQUFpQjl5QixXQUFXc2dCLEtBQUtrQyxXQUFXdVAsTUFBTXpSO1lBQ25FLE1BQU15UyxPQUFPelMsS0FBS3lTLFFBQVFDLFdBQUFBLHNCQUFzQmh6QixXQUFXNnlCO1lBQzNELE1BQU10bUIsVUFBK0I7Z0JBQ25DNmIsUUFBUTlILEtBQUs4SCxXQUFXdHRCLFlBQVksUUFBUXdsQixLQUFLMlM7O1lBRW5ELElBQUlsQixTQUFTLGNBQWNBLFNBQVMsV0FBV3hsQixRQUFRb2IsUUFBUTtZQUMvRCxPQUFPO2dCQUNMb0s7Z0JBQ0F6UjtnQkFDQVksWUFBWTtvQkFDVjZSO29CQUNBRyxNQUFNTDtvQkFDTnRtQjs7O0FBR047UUFLUSxvQkFBQXVsQixDQUNOcFY7WUFFQSxPQUFPO2dCQUNMa1MsVUFBVSxDQUFBO2dCQUNWUCxXQUFXO2dCQUNYRCxlQUFlMVI7O0FBRW5CO1FBS1EsZ0JBQUF5VztZQUNOLE9BQU83MEIsS0FBS0g7QUFDZDtRQUtRLHNCQUFNbXdCLENBQ1o1UixNQUNBeGI7WUFFQSxLQUFLNUMsS0FBSzgwQixnQkFBZ0IxVyxPQUFPO2dCQUMvQixPQUFPcGUsS0FBSyswQixjQUFpQjNXLE1BQU14YjtBQUNyQztZQUNBLE1BQU1veUIsZ0JBQWdCaDFCLEtBQUs2MEI7WUFDM0IsTUFBTUksV0FBVzdXO1lBQ2pCLE1BQU03QixpQkFBaUJ5WSxjQUFjSixLQUNuQ0ssU0FBU3JTLFdBQVc2UixNQUNwQlEsU0FBU3JTLFdBQVdnUyxNQUNwQkssU0FBU3JTLFdBQVczVSxTQUNwQnJMO1lBRUYsT0FBTzVDLEtBQUtrMUIsb0JBQXVCOVcsTUFBTTdCO0FBQzNDO1FBS1EsbUJBQU13WSxDQUNaM1csTUFDQXhiO1lBRUEsSUFBSXdiLEtBQUtxVixTQUFTLE9BQ2hCLE1BQU0sSUFBSXBCLEtBQUFBLFdBQVc7WUFDdkIsTUFBTTJDLGdCQUFnQmgxQixLQUFLNjBCO1lBQzNCLE9BQU9NLFNBQVNDLGFBQWEsRUFBQ2hYLEtBQUtzVixlQUFldFYsS0FBS3VWO1lBQ3ZELE9BQU8wQixhQUFhQyx1QkFBdUJ4dkIsUUFBUUMsSUFBSSxFQUNyRGl2QixjQUFjSixLQUNaTyxRQUFRVixNQUNSVSxRQUFRUCxNQUNSTyxRQUFRbG5CLFNBQ1JyTCxNQUVGb3lCLGNBQWNKLEtBQ1pRLFVBQVVYLE1BQ1ZXLFVBQVVSLE1BQ1ZRLFVBQVVubkIsU0FDVnJMO1lBR0osTUFBTTJ5QixNQUFNRixZQUFZRyxPQUFPLElBQUl2ekIsU0FBUztZQUM1QyxNQUFNeUgsUUFBUTRyQixjQUFjRSxPQUFPLElBQUl2ekIsU0FBUztZQUNoRCxLQUFLeUgsT0FBTyxPQUFPO1lBQ25CLE9BQVE2ckIsTUFBTTdyQjtBQUNoQjtRQUtRLG1CQUFBd3JCLENBQ045VyxNQUNBN0I7WUFFQSxJQUFJNkIsS0FBS3FWLFNBQVMsT0FDaEIsTUFBTSxJQUFJcEIsS0FBQUEsV0FDUjtZQUVKLE1BQU1tRCxPQUFPalosU0FBU2laLFFBQVE7WUFDOUIsTUFBTVAsV0FBVzdXO1lBQ2pCLE1BQU00RCxPQUFPaVQsU0FBU2pUO1lBQ3RCLElBQUlpVCxTQUFTcEIsZUFBZTtnQkFDMUIsT0FBUTJCLEtBQUs3NEIsVUFBVTtBQUN6QjtZQUNBLElBQUlzNEIsU0FBU3hCLFNBQVMsY0FBY3dCLFNBQVN4QixTQUFTLFdBQVc7Z0JBQy9ELE9BQU8rQixLQUFLejNCLElBQUswM0IsT0FBUUEsSUFBSTMwQixPQUFPMjBCLElBQUl4ekI7QUFDMUM7WUFDQSxJQUFJK2YsS0FBSzJTLFlBQVk7Z0JBQ25CLE9BQU9hLEtBQUt6M0IsSUFBSzAzQixPQUFRQSxJQUFJeHpCLFNBQVN3ekIsSUFBSXQ3QixPQUFPczdCO0FBQ25EO1lBQ0EsS0FBS0QsS0FBSzc0QixRQUFRO2dCQUNoQixPQUFRczRCLFNBQVN4QixTQUFTLFVBQVUsSUFBSTtBQUMxQztZQUNBLE9BQVErQixLQUFLLEdBQUd2ekIsU0FBU3V6QixLQUFLLEdBQUcxMEIsT0FBTztBQUMxQztRQUtRLGVBQUFnMEIsQ0FDTjFXO1lBRUEsT0FBT0EsS0FBS3FWLFNBQVM7QUFDdkI7O0lDcG5CSSxNQUFPaUMsOEJBQStDanlCLEtBQUFBO1FBTzFELFdBQUE3RCxDQUNFQyxTQUNBd3dCLE9BQ0FqYixNQUNBdFY7WUFFQUMsTUFBTUYsU0FBU3d3QixPQUFPamIsTUFBTXRWO0FBQzlCO1FBR1UsT0FBQW9GLENBQVF5d0I7WUFDaEIsTUFBTSxJQUFJM04sS0FBQUEsaUJBQ1I7QUFFSjtRQUVTLElBQUF2bEIsQ0FDUEEsT0FBZSxNQUNadEI7WUFFSCxPQUFPcEIsTUFBTTBDLEtBQUtBLFNBQVN0QjtBQUM3Qjs7O0lDbUhJLE1BQU95MEIsNEJBQTRCQyxLQUFBQTs7WUFTeEI3MUIsS0FBQXFKLFVBQVUsSUFBSUMsWUFBWTtBQUFROztZQUVsQ3RKLEtBQUFvSixhQUFhLElBQUlsQjtBQUFtQjs7WUFFbENsSSxLQUFBb0IsTUFBTW9kLFFBQUFBLFFBQVE3ZCxJQUFJaTFCO0FBQXFCO1FBV3hELFdBQUFoMkIsQ0FBWXlPLFFBQW9Ca2dCO1lBQzlCeHVCLE1BQ0VqRixPQUFPNEQsT0FBTyxDQUFBLEdBQUltdUIsMEJBQTBCeGUsU0FDNUMzQixlQUNBNmhCO1lBYmV2dUIsS0FBQW9KLGFBQ2pCd3NCLG9CQUFvQnhzQjtBQWN0QjtRQUVTLFNBQUEya0IsQ0FDUDl2QjtZQUVBLE9BQU8sSUFBSTZ2QixzQkFBc0I5dEIsTUFBTS9CO0FBQ3pDO1FBRUEsU0FBQXdGLENBQ0U0c0IsT0FDQWpiLE1BQ0F0VjtZQUVBLE9BQU8sSUFBSTQxQixzQkFBc0IxMUIsTUFBTXF3QixPQUFPamIsTUFBTXRWO0FBQ3REO1FBRW1CLFdBQU1ZLENBQ3ZCbzFCLFdBQ0FoeEIsT0FDQXBFLFVBQ0dTO1lBRUgsTUFBTTQwQixjQUFjajdCLE9BQU80RCxPQUFPLENBQUEsR0FBSXNCLEtBQUtxTyxRQUFRM047WUFDbkQsTUFBTS9FLElBQUliLE9BQU80RCxhQUNUcUIsTUFBTVcsTUFBTW8xQixXQUFXaHhCLE9BQU9peEIsZ0JBQWdCNTBCO1lBRXRELE9BQU94RjtBQUNUO1FBRVMsYUFBTTJuQixDQUNid1MsV0FDQTczQixXQUNBNkcsVUFDRzNEO1lBRUgsTUFBTUMsTUFBTXBCLEtBQUtvQixJQUFJVCxJQUFJWCxLQUFLc2pCO1lBQzlCbGlCLElBQUk0MEIsTUFDRiw0QkFBNEJGLDBCQUEwQmh4QixRQUFTMUIsTUFBTUMsUUFBUXlCLFNBQVNBLE1BQU0vRyxJQUFLcEUsS0FBTXNCLG9CQUFBQSxNQUFNeUcsVUFBVS9ILE1BQU1zQixvQkFBQUEsTUFBTXlHLFVBQVVvRCxTQUFVLGNBQWM3RyxhQUFhbkQsT0FBT2lNLEtBQUs5SSxhQUFhbkQsT0FBT2lNLEtBQUs5SSxXQUFXdEIsU0FBUztZQUU3TyxJQUFJaUcsTUFBTXpCLEtBQUs4MEI7WUFDZixXQUFXcnpCLFFBQVEsaUJBQWlCQSxlQUFlb0ksS0FBQUEsVUFBVTtnQkFDM0Q3SixLQUFLckYsS0FBSzhHO2dCQUNWQSxNQUFNcEc7QUFDUjtZQUVBeUIsWUFBWTJFLE1BQ1I5SCxPQUFPNEQsT0FBTyxDQUFBLEdBQUlrRSxJQUFJc3pCLGVBQWVqNEIsYUFDckNBO1lBQ0osTUFBTXlDLGNBQWNWLEtBQUtVLGFBQ2hCbzFCLGNBQWMsV0FBV0EsWUFBWUEsVUFBVWw3QixNQUN0RGtLLE9BQ0E3RyxjQUNHLEtBQUlrRCxNQUFNeUIsTUFBSzdILE9BQU9xckI7WUFHM0IsSUFBSXhqQixLQUFLO2dCQUNQLE1BQU1BLGVBQWU1QyxLQUFLZ0wsVUFBVTtvQkFDbEMsTUFBTW1yQixVQUFTLElBQUluMkIsS0FBS2dMLFNBQVU1RCxXQUFXOzJCQUN4Q3hFLElBQUk7MkJBQ0psQzt3QkFDSDAxQixlQUFleHpCOztvQkFFakJBLElBQUl3RSxXQUFXO3dCQUNiaXZCLGVBQWUsS0FDVHp6QixJQUFJMHpCLGVBQWUsb0JBQW9CLElBQzNDSDs7b0JBR0osT0FBT0E7QUFDVDtnQkFDQSxNQUFNSSxZQUFZM3pCLElBQUkwekIsZUFBZTtnQkFDckMsTUFBTUUsZUFBZTV6QixJQUFJMHpCLGVBQWU7Z0JBQ3hDLEtBQ0dDLGFBQ0RBLGNBQWNULGFBQ2JoeEIsU0FBU0EsVUFBVTB4QixjQUNwQjtvQkFDQSxNQUFNTCxVQUFTLElBQUluMkIsS0FBS2dMLFNBQVU1RCxXQUFXOzJCQUN4Q3hFLElBQUk7MkJBQ0psQzt3QkFDSDAxQixlQUFleHpCOztvQkFHakJBLElBQUl3RSxXQUFXO3dCQUNiaXZCLGVBQWUsS0FDVHp6QixJQUFJMHpCLGVBQWUsb0JBQW9CLElBQzNDSDs7b0JBR0osT0FBT0E7QUFDVDtnQkFDQSxPQUFPdnpCLElBQUl3RSxXQUFXMUc7QUFDeEI7WUFFQSxRQUFPLElBQUlWLEtBQUtnTCxTQUFVNUQsV0FBVzttQkFDaEMxRzs7QUFFUDtRQVFBLE1BQUF3QyxDQUFPUztZQUNMLE9BQU9peUIsb0JBQW9CdnNCLFFBQVFuRyxPQUFPUztBQUM1QztRQUVTLFVBQUE4eUI7WUFNUCxPQUFPLzJCO0FBQ1Q7UUFFVSxZQUFBZzNCLENBQ1I1MkIsT0FDQXNGLElBQ0FOLFVBQ0czRDtZQUVILE9BQU1FLFNBQUVBLFdBQVlyQixLQUFLc0IsT0FBT0gsTUFBTW5CLEtBQUswMkI7WUFDM0MsTUFBTWgxQixZQUFZekcsb0JBQUFBLE1BQU15RyxVQUFVNUI7WUFDbEMsTUFBTXFGLFNBQThCLENBQUE7WUFDcENBLE9BQU81QixXQUFBQSxZQUFZQyxTQUFTOUI7WUFDNUI1RyxPQUFPNEQsT0FBT3lHLFFBQVFMO1lBQ3RCLE9BQU8sRUFBQ2hGLE9BQU9zRixJQUFJRCxXQUFXOUQ7QUFDaEM7UUFXVSxlQUFBbUUsQ0FDUjFGLE9BQ0EyRyxLQUNBaEIsV0FDR3RFO1lBRUgsTUFBTU8sWUFBWXpHLG9CQUFBQSxNQUFNeUcsVUFBVTVCO1lBQ2xDLElBQUkyRyxJQUFJOUosV0FBVzhJLE9BQU85SSxRQUN4QixNQUFNLElBQUk2QixhQUFBQSxjQUFjO1lBQzFCLE9BQU02QyxTQUFFQSxXQUFZckIsS0FBS3NCLE9BQU9ILE1BQU1uQixLQUFLd0Y7WUFDM0MsTUFBTXdCLFVBQVVQLElBQUkxSSxJQUFJLENBQUNxSCxJQUFJc0U7Z0JBQzNCLE1BQU12RSxTQUE4QixDQUFBO2dCQUNwQ0EsT0FBTzVCLFdBQUFBLFlBQVlDLFNBQVM5QjtnQkFDNUI1RyxPQUFPNEQsT0FBT3lHLFFBQVFNLE9BQU9pRTtnQkFDN0IsT0FBT3ZFOztZQUVULE9BQU8sRUFBQ3JGLE9BQU8yRyxLQUFLTyxZQUFZM0Y7QUFDbEM7UUFFVSxlQUFBczFCLENBQ1I3MkIsT0FDQTJHLEtBQ0FoQixXQUNHdEU7WUFFSCxNQUFNTyxZQUFZekcsb0JBQUFBLE1BQU15RyxVQUFVNUI7WUFDbEMsSUFBSTJHLElBQUk5SixXQUFXOEksT0FBTzlJLFFBQ3hCLE1BQU0sSUFBSTZCLGFBQUFBLGNBQWM7WUFDMUIsT0FBTTZDLFNBQUVBLFdBQVlyQixLQUFLc0IsT0FBT0gsTUFBTW5CLEtBQUsyMkI7WUFDM0MsTUFBTTN2QixVQUFVUCxJQUFJMUksSUFBSTtnQkFDdEIsTUFBTW9ILFNBQThCLENBQUE7Z0JBQ3BDQSxPQUFPNUIsV0FBQUEsWUFBWUMsU0FBUzlCO2dCQUM1QixPQUFPeUQ7O1lBRVQsT0FBTyxFQUFDckYsT0FBTzJHLEtBQUtPLFlBQVkzRjtBQUNsQztRQVdTLGVBQU1tRixDQUNiMUcsT0FDQTJHLEtBQ0FoQixXQUNHdEU7WUFFSCxJQUFJc0YsSUFBSTlKLFdBQVc4SSxPQUFPOUksUUFDeEIsTUFBTSxJQUFJNkIsYUFBQUEsY0FBYztZQUUxQixNQUFNNkMsVUFBVSxLQUFLRjtZQUNyQixNQUFNa0UsWUFBWWhFLFFBQVF1MUI7WUFDMUIsT0FBTXgxQixLQUFFQSxLQUFHd0IsS0FBRUEsT0FBUTVDLEtBQUtzQixPQUN4QkQsU0FDQXJCLEtBQUt3RztZQUVQLE1BQU05RSxZQUFZekcsb0JBQUFBLE1BQU15RyxVQUFVNUI7WUFFbENzQixJQUFJZ2QsS0FBSyxVQUFVM1gsSUFBSTlKLHFCQUFxQitFO1lBQzVDTixJQUFJSyxRQUFRLFFBQVFnRjtZQUNwQixNQUFNb3dCLGVBQWV4eEIsYUFBYXZLLE9BQU9pTSxLQUFLMUIsV0FBVzFJLFNBQVM7WUFDbEUsTUFBTW02QixtQkFDSkQsZ0JBQWdCNzJCLEtBQUsrMkIsNEJBQTRCbjBCO1lBQ25ELE1BQU1vMEIsbUJBQW1CSCxlQUFlO2dCQUFFbjFCLENBQUNBLFlBQVkyRDtnQkFBYyxDQUFBO1lBRXJFLE1BQU1oSyxlQUFlMkUsS0FBSzJLLGtCQUN4Qi9ILEtBQ0FxMEIsYUFBQUEsc0JBQXNCQyxZQUN0QixFQUNFNTZCLEtBQUtDLFVBQ0hrSixPQUFPMUgsSUFBS3BFLEtBQU1xRyxLQUFLb0osV0FBV0YsVUFBVXZQLEdBQUdtRyxNQUFNbEYsV0FHekRvOEIsa0JBQ0FoM0IsS0FBS20zQiwwQkFBMEJ2MEIsTUFDL0I5QyxNQUFNbEY7WUFHUixJQUFJdzhCO1lBQ0o7Z0JBQ0VBLE1BQU05NkIsS0FBSzJHLE1BQU1qRCxLQUFLa0QsT0FBTzdILFNBQVMwQyxJQUFLdUYsS0FBV2hILEtBQUsyRyxNQUFNSztBQUNuRSxjQUFFLE9BQU90STtnQkFDUCxNQUFNLElBQUl5TixhQUFBQSxtQkFBbUJ6TjtBQUMvQjtZQUVBLElBQ0VnRixLQUFLcTNCLHdCQUNIdjNCLE9BQ0E4QyxLQUNBazBCLGtCQUNBTSxJQUFJLEdBQUduOEIsb0JBQUFBLE1BQU13TSxHQUFHM0gsV0FBcUIyRyxJQUFJLEtBRTNDO2dCQUNBLE9BQU96RyxLQUFLOEcsUUFDVmhILE9BQ0FtTSxXQUNFbk0sT0FDQTJGLE9BQU8xSCxJQUFJLENBQUNwRSxHQUFHa04sTUFDYjVMLG9CQUFBQSxNQUFNMjJCLE1BQU05MkIsT0FBTzRELE9BQU8sQ0FBQSxHQUFJL0UsR0FBVTBMLFVBQVV3QixNQUFNLENBQUEsSUFBS3V3QixJQUFJdndCLE1BRW5FSixNQUVGN0Q7QUFFSjtZQUVBLE9BQU93MEI7QUFDVDtRQVNTLGFBQU10d0IsQ0FDYmhILE9BQ0EyRyxRQUNHdEY7WUFFSCxPQUFNQyxLQUFFQSxLQUFHd0IsS0FBRUEsT0FBUTVDLEtBQUtzQixPQUFPSCxNQUFNbkIsS0FBSzhHO1lBQzVDLE1BQU1wRixZQUFZekcsb0JBQUFBLE1BQU15RyxVQUFVNUI7WUFDbENzQixJQUFJZ2QsS0FBSyxXQUFXM1gsSUFBSTlKLHFCQUFxQitFO1lBQzdDTixJQUFJSyxRQUFRLFFBQVFnRjtZQUNwQixNQUFNcEwsZUFBZTJFLEtBQUttRCxvQkFDeEJQLEtBQ0FxMEIsYUFBQUEsc0JBQXNCSyxVQUN0QixFQUFDaDdCLEtBQUtDLFVBQVVrSyxRQUNoQmpLLFdBQ0FBLFdBQ0FzRCxNQUFNbEY7WUFFUjtnQkFDRSxPQUFPMEIsS0FBSzJHLE1BQU1qRCxLQUFLa0QsT0FBTzdILFNBQVMwQyxJQUFLdUYsS0FBV2hILEtBQUsyRyxNQUFNSztBQUNwRSxjQUFFLE9BQU90STtnQkFDUCxNQUFNLElBQUl5TixhQUFBQSxtQkFBbUJ6TjtBQUMvQjtBQUNGO1FBV1MsZUFBTWlNLENBQ2JuSCxPQUNBMkcsS0FDQWhCLFdBQ0d0RTtZQUVILElBQUlzRixJQUFJOUosV0FBVzhJLE9BQU85SSxRQUN4QixNQUFNLElBQUk2QixhQUFBQSxjQUFjO1lBQzFCLE1BQU02QyxVQUFVLEtBQUtGO1lBQ3JCLE1BQU1rRSxZQUFZaEUsUUFBUXUxQjtZQUMxQixPQUFNeDFCLEtBQUVBLEtBQUd3QixLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQ3hCRCxTQUNBckIsS0FBS2lIO1lBRVAsTUFBTXZGLFlBQVl6RyxvQkFBQUEsTUFBTXlHLFVBQVU1QjtZQUNsQ3NCLElBQUlnZCxLQUFLLFlBQVkzWCxJQUFJOUoscUJBQXFCK0U7WUFDOUNOLElBQUlLLFFBQVEsUUFBUWdGO1lBQ3BCLE1BQU1vd0IsZUFBZXh4QixhQUFhdkssT0FBT2lNLEtBQUsxQixXQUFXMUksU0FBUztZQUNsRSxNQUFNbTZCLG1CQUNKRCxnQkFBZ0I3MkIsS0FBSysyQiw0QkFBNEJuMEI7WUFDbkQsTUFBTW8wQixtQkFBbUJILGVBQWU7Z0JBQUVuMUIsQ0FBQ0EsWUFBWTJEO2dCQUFjLENBQUE7WUFFckUsTUFBTWhLLGVBQWUyRSxLQUFLMkssa0JBQ3hCL0gsS0FDQXEwQixhQUFBQSxzQkFBc0JNLFlBQ3RCLEVBQ0VqN0IsS0FBS0MsVUFDSGtKLE9BQU8xSCxJQUFLcEUsS0FBTXFHLEtBQUtvSixXQUFXRixVQUFVdlAsR0FBR21HLE1BQU1sRixXQUd6RG84QixrQkFDQWgzQixLQUFLbTNCLDBCQUEwQnYwQixNQUMvQjlDLE1BQU1sRjtZQUdSLElBQUl3OEI7WUFDSjtnQkFDRUEsTUFBTTk2QixLQUFLMkcsTUFBTWpELEtBQUtrRCxPQUFPN0gsU0FBUzBDLElBQUt1RixLQUFXaEgsS0FBSzJHLE1BQU1LO0FBQ25FLGNBQUUsT0FBT3RJO2dCQUNQLE1BQU0sSUFBSXlOLGFBQUFBLG1CQUFtQnpOO0FBQy9CO1lBRUEsSUFBSWdGLEtBQUtxM0Isd0JBQXdCdjNCLE9BQU84QyxLQUFLazBCLGtCQUFrQnJ3QixJQUFJLEtBQUs7Z0JBQ3RFLE9BQU96RyxLQUFLOEcsUUFDVmhILE9BQ0FtTSxXQUNFbk0sT0FDQTJGLE9BQU8xSCxJQUFJLENBQUNwRSxHQUFHa04sTUFDYjVMLG9CQUFBQSxNQUFNMjJCLE1BQU05MkIsT0FBTzRELE9BQU8sQ0FBQSxHQUFJL0UsR0FBVTBMLFVBQVV3QixNQUFNLENBQUEsSUFBS3V3QixJQUFJdndCLE1BRW5FSixNQUVGN0Q7QUFFSjtZQUNBLE9BQU93MEI7QUFDVDtRQVVTLGVBQU1JLENBQ2IxM0IsT0FDQTJHLFFBQ0d0RjtZQUVILE9BQU1DLEtBQUVBLEtBQUd3QixLQUFFQSxLQUFHdkIsU0FBRUEsV0FBWXJCLEtBQUtzQixPQUFPSCxNQUFNbkIsS0FBS3czQjtZQUNyRCxNQUFNOTFCLFlBQVl6RyxvQkFBQUEsTUFBTXlHLFVBQVU1QjtZQUVsQyxNQUFNZzNCLG1CQUNKNzdCLG9CQUFBQSxNQUFNMmxCLFlBQVk5Z0IsVUFBVUUsS0FBSysyQiw0QkFBNEJuMEI7WUFDL0QsSUFBSXZIO1lBQ0osTUFBTW84QixnQkFBZ0J6M0IsS0FBS3EzQix3QkFDekJ2M0IsT0FDQThDLEtBQ0FrMEIsa0JBQ0Fyd0IsSUFBSTtZQUVOLElBQUlneEIsZUFBZTtnQkFDakJwOEIsZUFBZTJFLEtBQUs4RyxRQUFRaEgsT0FBTzJHLFFBQVFwRjtBQUM3QztZQUVBRCxJQUFJZ2QsS0FBSyxZQUFZM1gsSUFBSTlKLHFCQUFxQitFO1lBQzlDTixJQUFJSyxRQUFRLFFBQVFnRjtZQUNwQixNQUFNMndCLFlBQVlwM0IsS0FBSzJLLGtCQUNyQi9ILEtBQ0FxMEIsYUFBQUEsc0JBQXNCUyxZQUN0QixFQUFDcDdCLEtBQUtDLFVBQVVrSyxRQUNoQmpLLFdBQ0F3RCxLQUFLbTNCLDBCQUEwQnYwQixNQUMvQjlDLE1BQU1sRjtZQUVSO2dCQUNFLE9BQU82OEIsZ0JBQ0hwOEIsU0FDQWlCLEtBQUsyRyxNQUFNakQsS0FBS2tELE9BQU9rMEIsTUFBTXI1QixJQUFLdUYsS0FBV2hILEtBQUsyRyxNQUFNSztBQUM5RCxjQUFFLE9BQU90STtnQkFDUCxNQUFNLElBQUl5TixhQUFBQSxtQkFBbUJ6TjtBQUMvQjtBQUNGO1FBV1MsT0FBQWtLLENBQ1BKLFVBQ0czRDtZQUVILE9BQU1DLEtBQUVBLEtBQUd3QixLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQU9ILE1BQU1uQixLQUFLa0Y7WUFDNUMsTUFBTXVsQixRQUFReHZCLG9CQUFBQSxNQUFNMGxCLFVBQVU3YjtZQUM5QixJQUFLQSxNQUFjakMscUJBQWdCODBCLFdBQVc7Z0JBQzVDdjJCLElBQUk0MEIsTUFDRiwwQ0FBMkNseEIsTUFBY2pDLHFCQUFnQjgwQjtnQkFFM0U3OEIsT0FBTzhvQixlQUFlNkcsTUFBTTNsQixPQUFPakMsS0FBQUEsZ0JBQWdCODBCLFVBQVU7b0JBQzNEOVQsWUFBWTtvQkFDWkMsVUFBVTtvQkFDVkMsY0FBYztvQkFDZDloQixPQUFRNkMsTUFBY2pDLEtBQUFBLGdCQUFnQjgwQjs7QUFFMUM7WUFFQSxNQUFNLzRCLGFBQWEzRCxvQkFBQUEsTUFBTTRELFdBQVdpRztZQUNwQyxJQUFJbEcsWUFBWTtnQkFDZCxNQUFNZzVCLFlBQVloNUIsV0FBV25CO2dCQUM3QixLQUFLbTZCLFdBQVcsTUFBTSxJQUFJcDVCLGFBQUFBLGNBQWM7Z0JBQ3hDLElBQUlxNUIsT0FBTzczQixLQUFLbTNCLDBCQUEwQnYwQixRQUFRO2dCQUNsRGkxQixPQUFPejBCLE1BQU1DLFFBQVF3MEIsUUFBUUEsT0FBTyxFQUFDQTtnQkFDckMsTUFBTUMsU0FBUyxLQUFJLElBQUlyUCxJQUFJLEtBQUlvUCxNQUFNRDtnQkFDckNoMUIsSUFBSXdFLFdBQVc7b0JBQ2Iyd0IsZUFBZUQ7b0JBQ2ZFLHdCQUF3QkY7b0JBQ3hCendCLFFBQVE7O0FBRVo7WUFFQSxPQUFPO2dCQUNMbEMsUUFBUXNsQixNQUFNM2xCO2dCQUNkQSxPQUFPMmxCLE1BQU0zbEI7Z0JBQ2JNLElBQUlOLE1BQU03SixvQkFBQUEsTUFBTXdNLEdBQUczQyxNQUFNbEY7Z0JBQ3pCeUYsV0FBV29sQixNQUFNcGxCO2dCQUNqQnZHLFVBQVUyckIsTUFBTTNyQjtnQkFDaEJNLFFBQVFxckIsTUFBTXJyQjs7QUFFbEI7UUFFUyxNQUFBa0csQ0FDUDJlLEtBQ0Fua0IsT0FDQXNGLElBQ0FDLGNBQ0dsRTtZQUVILE9BQU1DLEtBQUVBLEtBQUd3QixLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQU9ILE1BQU1uQixLQUFLc0Y7WUFDNUMsSUFDRUQsYUFDQXJGLEtBQUtpNEIsMkJBQ0hyMUIsS0FDQUEsSUFBSTB6QixlQUFlLGVBRXJCO2dCQUNBbDFCLElBQUlLLFFBQ0YsbUNBQW1DM0csT0FBT2lNLEtBQUsxQixXQUFXN0ssS0FBSztnQkFFakVNLE9BQU9vMkIsUUFBUTdyQixXQUNadEssT0FBTyxFQUFDLEVBQUdtOUIsY0FBY0EsTUFBTSxhQUMvQmgrQixRQUFRLEVBQUU0RyxLQUFLaXdCO29CQUNkLElBQUlqd0IsT0FBT21qQixPQUFRQSxJQUFZbmpCLFNBQVN0RSxXQUN0QzRFLElBQUkrdkIsS0FDRix3QkFBd0Jyd0I7b0JBRTNCbWpCLElBQVVuakIsT0FBa0Jpd0I7O0FBRW5DO1lBRUEsTUFBTTExQixTQUFTLElBQUt5RSxNQUF5Qm1rQjtZQUU3QyxPQUFPNW9CO0FBQ1Q7UUFFUSwwQkFBQTQ4QixDQUNOcjFCLEtBQ0FrekI7WUFFQSxLQUFLbHpCLEtBQUssT0FBTztZQUNqQixJQUFJQSxJQUFJMHpCLGVBQWUseUJBQXlCLE9BQU87WUFDdkQsTUFBTTZCLHNCQUNJdjFCLElBQVl3MUIsb0JBQW9CLGFBQ25DeDFCLElBQVl3MUIsZ0JBQWdCLDBCQUM3QjU3QjtZQUNOLElBQUkyN0IsY0FBYyxPQUFPO1lBQ3pCLE1BQU1FLGFBQWFyNEIsS0FBS3M0QixpQkFBaUIxMUIsS0FBS2t6QjtZQUM5QyxLQUFLdUMsWUFBWSxPQUFPO1lBQ3hCLE1BQU14RyxLQUFLd0csV0FBV3p0QixXQUFXcWtCO1lBQ2pDLE9BQ0U0QyxHQUFHMXlCLFNBQVMsV0FDWjB5QixHQUFHMXlCLFNBQVMsV0FDWjB5QixHQUFHMXlCLFNBQVMsWUFDWjB5QixHQUFHMXlCLFNBQVMsZ0JBQ1oweUIsR0FBRzF5QixTQUFTO0FBRWhCO1FBRVEsZ0JBQUFtNUIsQ0FDTjExQixLQUNBa3pCO1lBRUEsSUFBSUEsV0FBVyxPQUFPQTtZQUN0QixXQUFZbHpCLElBQVl3MUIsb0JBQW9CLFlBQVk7Z0JBQ3RELE9BQVF4MUIsSUFBWXcxQixnQkFBZ0I7QUFDdEM7WUFDQSxPQUFPNTdCO0FBQ1Q7UUFFUSx1QkFBQTY2QixDQUNOdjNCLE9BQ0E4QyxLQUNBaTBCLGNBQ0F6eEI7WUFFQSxLQUFLeXhCLGNBQWMsT0FBTztZQUMxQixNQUFNcHZCLEtBQUt4TSxvQkFBQUEsTUFBTXdNLEdBQUczSDtZQUNwQixNQUFNb00sV0FBV2pSLG9CQUFBQSxNQUFNaVIsU0FBU3BNLE9BQU8ySDtZQUN2QyxNQUFNMGMsWUFBWWxwQixvQkFBQUEsTUFBTWtwQixVQUFVcmtCLE9BQU8ySDtZQUN6QyxNQUFNOHdCLFFBQVFuekIsT0FBTzVJLGFBQWE0SSxPQUFPO1lBQ3pDLEtBQUttekIsU0FBU3JzQixVQUFVLE9BQU87WUFDL0IsS0FBS3FzQixTQUFTcFUsV0FBVztnQkFDdkJ2aEIsSUFBSXNLLE9BQU9pa0IsS0FDVDtnQkFFRixPQUFPO0FBQ1Q7WUFDQSxPQUFPb0g7QUFDVDtRQUVRLHlCQUFBcEIsQ0FDTnYwQjtZQUVBLE1BQU00MUIsU0FDSjUxQixJQUFJMHpCLGVBQWUsb0JBQ2xCMXpCLElBQUkwekIsZUFBZTtZQUN0QixJQUFJa0MsVUFBVUEsT0FBTzc3QixRQUFRLE9BQU82N0I7WUFDcEMsT0FDRzUxQixJQUFJdzFCLGdCQUFnQixvQkFDcEJ4MUIsSUFBSXcxQixnQkFBZ0I7QUFFekI7UUFFUSwyQkFBQXJCLENBRU5uMEI7WUFFQSxTQUFTNUMsS0FBS3FPLE9BQU84ZTtBQUN2QjtRQWFTLFlBQU10b0IsQ0FDYi9FLE9BQ0FzRixJQUNBTixPQUNBTyxZQUFpQyxDQUFBLE1BQzlCbEU7WUFFSCxNQUFNRSxVQUFVLEtBQUtGO1lBQ3JCLE9BQU1DLEtBQUVBLEtBQUd3QixLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQ3hCRCxTQUNBckIsS0FBSzZFO1lBRVAsTUFBTW5ELFlBQVl6RyxvQkFBQUEsTUFBTXlHLFVBQVU1QjtZQUNsQ3NCLElBQUlLLFFBQVEsbUJBQW1CQztZQUMvQk4sSUFBSTJELE1BQU0sT0FBT0s7WUFDakIsTUFBTXl4QixlQUFleHhCLGFBQWF2SyxPQUFPaU0sS0FBSzFCLFdBQVcxSSxTQUFTO1lBQ2xFLE1BQU1tNkIsbUJBQ0pELGdCQUFnQjcyQixLQUFLKzJCLDRCQUE0Qm4wQjtZQUNuRCxNQUFNbzBCLG1CQUFtQkgsZUFBZTtnQkFBRW4xQixDQUFDQSxZQUFZMkQ7Z0JBQWMsQ0FBQTtZQUNyRSxNQUFNaEssZUFBZTJFLEtBQUsySyxrQkFDeEIvSCxLQUNBOEMsYUFBQUEsY0FBY0MsUUFDZCxFQUFDM0YsS0FBS29KLFdBQVdGLFVBQVVwRSxPQUFPaEYsTUFBTWxGLFNBQ3hDbzhCLGtCQUNBaDNCLEtBQUttM0IsMEJBQTBCdjBCLE1BQy9COUMsTUFBTWxGO1lBRVIsTUFBTTY5QixlQUFlejRCLEtBQUtvSixXQUFXUixZQUFZNUksS0FBS2tELE9BQU83SDtZQUM3RCxJQUFJMkUsS0FBS3EzQix3QkFBd0J2M0IsT0FBTzhDLEtBQUtrMEIsa0JBQWtCMXhCLEtBQUs7Z0JBQ2xFLE9BQU9wRixLQUFLb2QsS0FDVnRkLE9BQ0FtTSxXQUNFbk0sT0FDQTdFLG9CQUFBQSxNQUFNMjJCLE1BQ0o5MkIsT0FBTzRELE9BQU8sQ0FBQSxHQUFJb0csT0FBT08sYUFBYSxLQUN0Q296QixjQUNBMzRCLFFBRUZzRixLQUVGeEM7QUFFSjtZQUNBLE9BQU82MUI7QUFDVDtRQUlBLGlCQUFNN3pCLENBQ0o5RSxVQUNHcUI7WUFFSCxPQUFNQyxLQUFFQSxLQUFHd0IsS0FBRUEsT0FBUTVDLEtBQUtzQixPQUFPSCxNQUFNbkIsS0FBSzRFO1lBQzVDLE1BQU1sRCxZQUFZekcsb0JBQUFBLE1BQU15RyxVQUFVNUI7WUFFbENzQixJQUFJSyxRQUFRLHNCQUFzQkM7WUFDbEMsTUFBTXJHLGVBQWUyRSxLQUFLbUQsb0JBQ3hCUCxLQUNBLGVBQ0EsSUFDQXBHLFdBQ0FBLFdBQ0FzRCxNQUFNbEY7WUFFUixPQUFPMEIsS0FBSzJHLE1BQU1qRCxLQUFLa0QsT0FBTzdIO0FBQ2hDO1FBV00sVUFBQStoQixDQUNKdGQsT0FDQXNGLE9BQ0dqRTtZQUVILE9BQU1DLEtBQUVBLEtBQUd3QixLQUFFQSxPQUFRNUMsS0FBS3NCLE9BQU9ILE1BQU1uQixLQUFLb2Q7WUFDNUMsTUFBTTFiLFlBQVl6RyxvQkFBQUEsTUFBTXlHLFVBQVU1QjtZQUVsQ3NCLElBQUlLLFFBQVEsc0JBQXNCQztZQUNsQ04sSUFBSTJELE1BQU0sT0FBT0s7WUFDakIsTUFBTS9KLGVBQWUyRSxLQUFLbUQsb0JBQ3hCUCxLQUNBOEMsYUFBQUEsY0FBY3FtQixNQUNkLEVBQUMzbUIsR0FBR3dGLGNBQ0pwTyxXQUNBQSxXQUNBc0QsTUFBTWxGO1lBRVIsT0FBT29GLEtBQUtvSixXQUFXUixZQUFZNUksS0FBS2tELE9BQU83SDtBQUNqRDtRQUVBLFlBQUFxOUIsQ0FDRTU0QixPQUNBc0YsSUFDQU4sVUFDRzNEO1lBRUgsTUFBTU8sWUFBWXpHLG9CQUFBQSxNQUFNeUcsVUFBVTVCO1lBQ2xDLE9BQU11QixTQUFFQSxXQUFZckIsS0FBS3NCLE9BQU9ILE1BQU1uQixLQUFLMDRCO1lBQzNDLE1BQU12ekIsU0FBOEIsQ0FBQTtZQUNwQ0EsT0FBTzVCLFdBQUFBLFlBQVlDLFNBQVM5QjtZQUU1QjVHLE9BQU80RCxPQUFPeUcsUUFBUUw7WUFDdEIsT0FBTyxFQUFDaEYsT0FBT3NGLElBQUlELFdBQVc5RDtBQUNoQztRQWFBLFlBQU1rRSxDQUNKekYsT0FDQXNGLElBQ0FOLE9BQ0FPLFlBQWlDLENBQUEsTUFDOUJsRTtZQUVILE1BQU1FLFVBQVUsS0FBS0Y7WUFDckIsT0FBTUMsS0FBRUEsS0FBR3dCLEtBQUVBLE9BQVE1QyxLQUFLc0IsT0FDeEJELFNBQ0FyQixLQUFLdUY7WUFFUG5FLElBQUlnZCxLQUFLLGdDQUFnQ3RlO1lBQ3pDLE1BQU00QixZQUFZekcsb0JBQUFBLE1BQU15RyxVQUFVNUI7WUFDbENzQixJQUFJSyxRQUFRLHFCQUFxQkM7WUFDakNOLElBQUkyRCxNQUFNLE9BQU9LO1lBQ2pCLE1BQU15eEIsZUFBZXh4QixhQUFhdkssT0FBT2lNLEtBQUsxQixXQUFXMUksU0FBUztZQUNsRSxNQUFNbTZCLG1CQUNKRCxnQkFBZ0I3MkIsS0FBSysyQiw0QkFBNEJuMEI7WUFDbkQsTUFBTW8wQixtQkFBbUJILGVBQWU7Z0JBQUVuMUIsQ0FBQ0EsWUFBWTJEO2dCQUFjLENBQUE7WUFDckUsTUFBTWhLLGVBQWUyRSxLQUFLMkssa0JBQ3hCL0gsS0FDQThDLGFBQUFBLGNBQWNpekIsUUFDZCxFQUFDMzRCLEtBQUtvSixXQUFXRixVQUFVcEUsT0FBT2hGLE1BQU1sRixRQUFRa0YsVUFDaERrM0Isa0JBQ0FoM0IsS0FBS20zQiwwQkFBMEJ2MEIsTUFDL0I5QyxNQUFNbEY7WUFFUixNQUFNNjlCLGVBQWV6NEIsS0FBS29KLFdBQVdSLFlBQVk1SSxLQUFLa0QsT0FBTzdIO1lBQzdELElBQUkyRSxLQUFLcTNCLHdCQUF3QnYzQixPQUFPOEMsS0FBS2swQixrQkFBa0IxeEIsS0FBSztnQkFDbEUsT0FBT3BGLEtBQUtvZCxLQUNWdGQsT0FDQW1NLFdBQ0VuTSxPQUNBN0Usb0JBQUFBLE1BQU0yMkIsTUFDSjkyQixPQUFPNEQsT0FBTyxDQUFBLEdBQUlvRyxPQUFPTyxhQUFhLEtBQ3RDb3pCLGNBQ0EzNEIsUUFFRnNGLEtBRUZ4QztBQUVKO1lBQ0EsT0FBTzYxQjtBQUNUO1FBV2UsWUFBQSxDQUNiMzRCLE9BQ0FzRixPQUNHakU7WUFFSCxPQUFNQyxLQUFFQSxLQUFHd0IsS0FBRUEsT0FBUTVDLEtBQUtzQixPQUFPSCxNQUFNbkIsS0FBS2dOO1lBQzVDLE1BQU10TCxZQUFZekcsb0JBQUFBLE1BQU15RyxVQUFVNUI7WUFDbEMsTUFBTWczQixtQkFDSjc3QixvQkFBQUEsTUFBTTJsQixZQUFZOWdCLFVBQVVFLEtBQUsrMkIsNEJBQTRCbjBCO1lBQy9ELElBQUl2SDtZQUNKLE1BQU1vOEIsZ0JBQWdCejNCLEtBQUtxM0Isd0JBQ3pCdjNCLE9BQ0E4QyxLQUNBazBCLGtCQUNBMXhCO1lBRUYsSUFBSXF5QixlQUFlO2dCQUNqQnA4QixlQUFlMkUsS0FBS29kLEtBQUt0ZCxPQUFPc0YsSUFBSXhDO0FBQ3RDO1lBRUF4QixJQUFJSyxRQUFRLHVCQUF1QkM7WUFDbkNOLElBQUkyRCxNQUFNLE9BQU9LO1lBQ2pCLE1BQU1neUIsWUFBWXAzQixLQUFLMkssa0JBQ3JCL0gsS0FDQThDLGFBQUFBLGNBQWNrekIsUUFDZCxFQUFDeHpCLEdBQUd3RixjQUNKcE8sV0FDQXdELEtBQUttM0IsMEJBQTBCdjBCLE1BQy9COUMsTUFBTWxGO1lBRVIsT0FBTzY4QixnQkFDSHA4QixTQUNBMkUsS0FBS29KLFdBQVdSLFlBQVk1SSxLQUFLa0QsT0FBT2swQjtBQUM5QztRQTRCQSxTQUFNekgsQ0FDSkMsVUFDQWlKLFdBQWMsTUFDZC80QixVQUNHcUI7WUFFSCxPQUFNQyxLQUFFQSxLQUFHd0IsS0FBRUEsT0FBUTVDLEtBQUtzQixPQUFPSCxNQUFNbkIsS0FBSzJ2QjtZQUM1QyxNQUFNanVCLFlBQVk1QixNQUFNbEY7WUFDeEJ3RyxJQUFJZ2QsS0FBSyxxQ0FBcUNuakIsb0JBQUFBLE1BQU15RyxVQUFVNUI7WUFDOUQsSUFBSWc1QjtZQUNKO2dCQUNFQSwwQkFBMEI5NEIsS0FBS21ELG9CQUM3QlAsS0FDQSxPQUNBLEVBQUN0RyxLQUFLQyxVQUFVcXpCLFdBQVdpSixZQUMzQnI4QixXQUNBQSxXQUNBa0Y7QUFFSixjQUFFLE9BQU8xRztnQkFDUCxNQUFNZ0YsS0FBSzhjLFdBQVc5aEI7QUFDeEI7WUFDQSxJQUFJSztZQUNKO2dCQUNFQSxTQUFTaUIsS0FBSzJHLE1BQU1qRCxLQUFLa0QsT0FBTzQxQjtBQUNsQyxjQUFFLE9BQU85OUI7Z0JBQ1AsTUFBTSxJQUFJeU4sYUFBQUEsbUJBQW1CLDZCQUE2QnpOO0FBQzVEO1lBRUEsTUFBTSs5QixjQUFlNXpCO2dCQUNuQixJQUFJbEssb0JBQUFBLE1BQU0rOUIsUUFBUTd6QixTQUFTLE9BQU9sSyxvQkFBQUEsTUFBTWdPLE1BQU05RDtnQkFDOUMsT0FBT0E7O1lBR1QsSUFBSS9CLE1BQU1DLFFBQVFoSSxTQUFTO2dCQUN6QixLQUFLQSxPQUFPc0IsUUFBUSxPQUFPdEI7Z0JBQzNCLE1BQU00OUIsS0FBSzU5QixPQUFPO2dCQUNsQixJQUFJSixvQkFBQUEsTUFBTSs5QixRQUFRQyxLQUVoQixPQUFPNTlCLE9BQU8wQyxJQUFLazdCLE1BQU9oK0Isb0JBQUFBLE1BQU1nTyxNQUFNZ3dCO2dCQUN4QyxPQUFPNTlCO0FBQ1Q7WUFFQSxPQUFPMDlCLFlBQVkxOUI7QUFDckI7UUFhTSxVQUFBdTVCLENBQ0pILE1BQ0FGLFVBQ0F0bUIsWUFDRzlNO1lBRUgsT0FBTUMsS0FBRUEsS0FBR3dCLEtBQUVBLE9BQVE1QyxLQUFLc0IsT0FBT0gsTUFBTW5CLEtBQUs0MEI7WUFDNUN4ekIsSUFBSWdkLEtBQUssaUJBQWlCcVcsUUFBUUY7WUFDbEMsSUFBSXVFO1lBQ0o7Z0JBQ0VBLDBCQUEwQjk0QixLQUFLbUQsb0JBQzdCUCxLQUNBLFFBQ0EsRUFBQzZ4QixNQUFNRixVQUFVajRCLEtBQUtDLFVBQVUwUixZQUNoQ3pSLFdBQ0FBLFdBQ0FBO0FBRUosY0FBRSxPQUFPeEI7Z0JBQ1AsTUFBTWdGLEtBQUs4YyxXQUFXOWhCO0FBQ3hCO1lBQ0EsSUFBSUs7WUFDSjtnQkFDRUEsU0FBU2lCLEtBQUsyRyxNQUFNakQsS0FBS2tELE9BQU80MUI7QUFDbEMsY0FBRSxPQUFPOTlCO2dCQUNQLE1BQU0sSUFBSXlOLGFBQUFBLG1CQUFtQixrQ0FBa0N6TjtBQUNqRTtZQUNBLE9BQU9LO0FBQ1Q7UUFPUyxTQUFBNjlCO1lBQ1AsS0FBS2w1QixLQUFLbTVCLFNBQ1JuNUIsS0FBS201QixVQUFVdkQsb0JBQW9Cc0QsVUFBVWw1QixLQUFLcU87WUFDcEQsT0FBT3JPLEtBQUttNUI7QUFDZDtRQU9VLGFBQU1DLENBQVF4MkI7WUFDdEIsT0FBT2d6QixvQkFBb0J5RCxXQUFXejJCLEtBQUs1QyxLQUFLcU8sUUFBUXJPLEtBQUswYjtBQUMvRDtRQUVRLGVBQUE0ZCxDQUFnQnZ3QjtZQUN0QixLQUFLQSxXQUFXLE9BQU92TTtZQUN2QixPQUFPLEdBQUd1TTtBQUNaO1FBT1UsY0FBTXd3QixDQUNkMzJCLEtBQ0E0MkI7WUFFQSxPQUFPNUQsb0JBQW9CNkQsa0JBQ25CejVCLEtBQUtvNUIsUUFBUXgyQixNQUNuQjVDLEtBQUtxTyxRQUNMbXJCO0FBRUo7UUE4QlUsaUJBQU1FLENBQ2Q5MkIsS0FDQSsyQixLQUNBQyxTQUFTLE1BQ1R6NEIsTUFDQTA0QixnQkFBd0MsQ0FBQSxHQUN4QzdCLHdCQUNBanZCO1lBRUEsTUFBTTNILE1BQU1wQixLQUFLb0IsSUFBSVQsSUFBSVgsS0FBSzA1QjtZQUM5QixNQUFNSSxnQkFBZ0I5NUIsS0FBS281QixRQUFReDJCO1lBQ25DO2dCQUNFLE1BQU1tM0IsaUJBQWlCLzVCLEtBQUt1NUIsU0FDMUIzMkIsS0FDQTVDLEtBQUtzNUIsZ0JBQWdCdndCO2dCQUV2QjNILElBQUlLLFFBQ0YsR0FBR200QixTQUFTLFdBQVcsOEJBQThCNTVCLEtBQUtzNUIsZ0JBQWdCdndCLGNBQWMvSSxLQUFLcU8sT0FBT21yQixnQkFBZ0JHO2dCQUV0SHY0QixJQUFJMkQsTUFBTSxTQUFTNUQsTUFBTXBELElBQUtvZixLQUFNQSxFQUFFdlMsWUFBWXBRLEtBQUssU0FBUztnQkFDaEUsTUFBTTB6QixTQUFTMEwsU0FBU0csU0FBU0gsU0FBU0csU0FBU0M7Z0JBRW5EaEMseUJBQXlCQSx3QkFBd0JyN0IsU0FDN0NxN0IseUJBQ0F4N0I7Z0JBQ0osTUFBTXk5QixrQkFBbUM7b0JBQ3ZDQyxXQUFXLzRCLFFBQVE7b0JBQ25CMDRCLGVBQWUvK0IsT0FBT28yQixRQUFRMkksZUFBZS9QLE9BQzNDLENBQUNDLE1BQU1qcEIsS0FBS2l3Qjt3QkFDVmhILElBQUlqcEIsT0FBT3hFLEtBQUtDLFVBQVV3MEI7d0JBQzFCLE9BQU9oSDt1QkFFVCxDQUFBO29CQUVGaU8sd0JBQXdCcDFCLElBQUkwekIsZUFBZSw4QkFDdkMwQiwwQkFBMEJ4N0IsWUFDMUJBOztnQkFHTixhQUFhMHhCLE9BQU85RCxLQUFLMlAsVUFBVUosS0FBS007QUFDMUMsY0FBRSxPQUFPai9CO2dCQUNQLE1BQU1nRixLQUFLOGMsV0FBVzloQjtBQUN4QjtnQkFDRWdGLEtBQUtvQixJQUFJMkQsTUFBTSxXQUFXL0UsS0FBS3FPLE9BQU81UTtnQkFDdENxOEIsUUFBUUs7QUFDVjtBQUNGO1FBRVEsc0JBQUFDLENBQXVCeDNCO1lBQzdCLFNBQVNBLElBQUkwekIsZUFBZSxlQUFldDJCLEtBQUtxTyxPQUFPOGU7QUFDekQ7UUFFUSxpQkFBQWtOLENBQWtCbDVCO1lBQ3hCLFFBQVFBLFFBQVEsSUFBSXBELElBQUtRLGNBQ2hCQSxRQUFRLFdBQVdBLE1BQU1qQyxLQUFLQyxVQUFVZ0M7QUFFbkQ7UUFFUSxvQkFBQSs3QixDQUNOVDtZQUVBLEtBQUtBLGVBQWUsT0FBT3I5QjtZQUMzQixNQUFNMDBCLFVBQVVwMkIsT0FBT28yQixRQUFRMkk7WUFDL0IsS0FBSzNJLFFBQVF2MEIsUUFBUSxPQUFPSDtZQUM1QixNQUFNdUIsTUFBOEIsQ0FBQTtZQUNwQyxLQUFLLE9BQU8rQyxLQUFLbUIsVUFBVWl2QixTQUFTO2dCQUNsQ256QixJQUFJK0MsT0FBTzRPLE9BQU81RSxLQUFLeE8sS0FBS0MsVUFBVTBGO0FBQ3hDO1lBQ0EsT0FBT2xFO0FBQ1Q7UUFFUSxxQkFBQXc4QjtZQUNOLE1BQU1DLGFBQWF4NkIsS0FBS3FPLE9BQU9vc0Isa0JBQWtCO1lBQ2pELE1BQU03TCxTQUFTMWtCLE9BQU9zd0I7WUFDdEIsS0FBS3R3QixPQUFPd3dCLFNBQVM5TCxXQUFXQSxTQUFTLEdBQUcsT0FBTztZQUNuRCxPQUFPbmEsS0FBS2ttQixNQUFNL0w7QUFDcEI7UUFFUSxvQkFBQWdNLENBQ05DLFlBQ0EzNUI7WUFFQSxLQUFLMjVCLFdBQVdsK0IsVUFBVXVFLFNBQVMsR0FBRyxPQUFPO1lBQzdDLE1BQU00NUIsWUFBWSxLQUFJRDtZQUN0QixNQUFNblksU0FBU2pPLEtBQUt1TCxJQUFJOWUsT0FBTzQ1QixVQUFVbitCO1lBQ3pDLE1BQU1vK0IsU0FBdUI7WUFDN0IsT0FBT0EsT0FBT3ArQixTQUFTK2xCLFVBQVVvWSxVQUFVbitCLFFBQVE7Z0JBQ2pELE1BQU1xK0IsTUFBTXZtQixLQUFLa21CLE1BQU1sbUIsS0FBS3dtQixXQUFXSCxVQUFVbitCO2dCQUNqRCxPQUFPdStCLGFBQWFKLFVBQVVLLE9BQU9ILEtBQUs7Z0JBQzFDLElBQUlFLFdBQVc7b0JBQ2JILE9BQU9qL0IsS0FBS28vQjtBQUNkO0FBQ0Y7WUFDQSxPQUFPSDtBQUNUO1FBRVEsc0JBQUFLLENBQ054NEI7WUFFQSxNQUFNeTRCLFFBQTRCLEVBQ2hDO2dCQUNFNTlCLE9BQU91QyxLQUFLcU8sT0FBTzVRO2dCQUNuQjY5QixjQUFjdDdCLEtBQUtxTyxPQUFPaXRCO2dCQUMxQkMsZUFBZXY3QixLQUFLcU8sT0FBT2t0QjtnQkFDM0JDLFNBQVN4N0IsS0FBS3FPLE9BQU9tdEI7O1lBSXpCLElBQUl6RCxnQkFBZ0IvM0IsS0FBS20zQiwwQkFBMEJ2MEIsUUFBUTtZQUMzRG0xQixnQkFBZ0IzMEIsTUFBTUMsUUFBUTAwQixpQkFDMUJBLGdCQUNBLEVBQUNBO1lBQ0wsTUFBTTBELFlBQ0oxRCxjQUFjaDlCLE9BQVEyZ0MsT0FBdUJ0VixRQUFRc1YsU0FBUztZQUNoRSxNQUFNQyxTQUFTRixVQUFVMWdDLE9BQVEyZ0MsT0FBUUEsUUFBUTE3QixLQUFLcU8sT0FBTzVRO1lBQzdELEtBQUtrK0IsT0FBT2gvQixRQUFRLE9BQU8wK0I7WUFFM0IsTUFBTXQ5QixNQUFNaUMsS0FBS3FPLE9BQU91dEI7WUFDeEIsTUFBTUMsY0FBYzc3QixLQUFLdTZCO1lBQ3pCLEtBQUssTUFBTTFVLE9BQU84VixRQUFRO2dCQUN4QixNQUFNZCxhQUFhOThCLE1BQU04bkI7Z0JBQ3pCLEtBQUtnVixZQUFZbCtCLFFBQVE7b0JBQ3ZCLE1BQU0sSUFBSXFyQixLQUFBQSxpQkFDUixxQ0FBcUNuQztBQUV6QztnQkFDQSxNQUFNaVcsYUFBYTk3QixLQUFLNDZCLHFCQUFxQkMsWUFBWWdCO2dCQUN6RCxLQUFLQyxXQUFXbi9CLFFBQVE7b0JBQ3RCLE1BQU0sSUFBSXFyQixLQUFBQSxpQkFDUiwyQ0FBMkNuQztBQUUvQztnQkFDQSxLQUFLLE1BQU1rVyxVQUFVRCxZQUFZO29CQUMvQixLQUFLQyxPQUFPQyxVQUFVO3dCQUNwQixNQUFNLElBQUloVSxLQUFBQSxpQkFDUixnQ0FBZ0NuQztBQUVwQztvQkFDQXdWLE1BQU12L0IsS0FBSzt3QkFDVDJCLE9BQU9vb0I7d0JBQ1B5VixjQUFjUyxPQUFPQzt3QkFDckJULGVBQWVRLE9BQU94Tjt3QkFDdEJpTixTQUFTTyxPQUFPUCxXQUFXeDdCLEtBQUtxTyxPQUFPbXRCOztBQUUzQztBQUNGO1lBRUEsT0FBT0g7QUFDVDtRQUVRLHVDQUFNWSxDQUNacjVCLEtBQ0FzNUIsS0FDQS82QixNQUNBZzdCLGNBQ0FDLGFBQ0FyekI7WUFFQSxNQUFNM0gsTUFBTXBCLEtBQUtvQixJQUFJVCxJQUFJWCxLQUFLaThCO1lBQzlCLE1BQU1aLFFBQVFyN0IsS0FBS3E4QixxQkFBcUJEO1lBQ3hDLE1BQU1FLHlCQUF5QnQ4QixLQUFLdThCO1lBQ3BDLE1BQU1DLGVBQWVDLGNBQUFBLFFBQVFDO1lBQzdCLE1BQU1DLGdCQUFnQixHQUFHMzhCLEtBQUtxTyxPQUFPNVE7a0JBQy9CKytCLE9BQU9yWCxJQUFJd1gsZUFBZTtnQkFDOUIzckIsYUFBYTtvQkFDWGhELGFBQWFzdUIsaUJBQWlCdHVCO29CQUM5QkQsWUFBWXV1QixpQkFBaUJ2dUI7O2dCQUUvQnRRLE9BQU91QyxLQUFLcU8sT0FBTzVRO2dCQUNuQmlLLE1BQU07O1lBR1IsTUFBTWsxQiwwQkFBMEI1OEIsS0FBSzY4Qiw2QkFBNkJ4QjtZQUNsRSxNQUFNdkIsVUFBVSxJQUFJZ0Q7WUFFcEI7c0JBQ1FoRCxRQUFRaUQsUUFBUUgsbUJBQW1CO29CQUN2QzVkLFVBQVUyZDtvQkFDVkg7b0JBQ0FRLFdBQVc7d0JBQ1RDLFNBQVM7d0JBQ1RDLGFBQWFsOUIsS0FBS205Qiw0QkFBNEI5Qjs7b0JBRWhEK0IsU0FBUzt3QkFDUHB2QixhQUFhc3VCLGlCQUFpQnR1Qjt3QkFDOUJsTixLQUFLdzdCLGlCQUFpQnZ1Qjs7O2dCQUkxQixNQUFNc3ZCLGdCQUFnQnZELFFBQVF3RCxXQUFXdDlCLEtBQUtxTyxPQUFPa3ZCO2dCQUNyRCxNQUFNeEQsV0FBV3NELFFBQVE1RCxZQUN2Qno1QixLQUFLcU8sT0FBT212QixlQUNaeDlCLEtBQUtzNUIsZ0JBQWdCdndCO2dCQUV2QixNQUFNMndCLGNBQWNLLFNBQVMwRCxrQkFBa0J2QjtnQkFFL0MsSUFBSUMsY0FBYztvQkFDaEJ6QyxZQUFZZ0UsYUFBYXZCO0FBQzNCO2dCQUVBLE1BQU1WLFlBQVlKLE1BQ2Z0OUIsSUFBSzQvQixRQUFTTixRQUFRTyxhQUFhQyxZQUFZRixLQUFLL2lDLE9BQ3BERyxPQUFRK2lDLFlBQW1DMVgsUUFBUTBYO2dCQUN0RCxJQUFJckMsVUFBVTkrQixRQUFRO29CQUNwQis4QixZQUFZcUUsa0JBQWtCdEM7QUFDaEM7Z0JBRUFyNkIsSUFBSUssUUFDRixxQkFBcUJ6QixLQUFLczVCLGdCQUFnQnZ3QixjQUFjL0ksS0FBS3FPLE9BQU9tckIsZ0JBQWdCMEMsaUJBQWlCYixNQUFNdDlCLElBQUs5QixLQUFNQSxFQUFFcS9CLGNBQWM5Z0MsS0FBSztnQkFHN0ksTUFBTWEsZUFBZXErQixZQUFZRSxVQUFVejRCO2dCQUMzQyxPQUFPb00sV0FBV3pDLEtBQUt6UDtBQUN6QixjQUFFLE9BQU9MO2dCQUNQLE1BQU1nRixLQUFLOGMsV0FBVzloQjtBQUN4QjtnQkFDRTgrQixRQUFRa0U7QUFDVjtBQUNGO1FBRVEsb0JBQUEzQixDQUNOaEI7WUFFQSxNQUFNNEMsVUFBVSxJQUFJQztZQUNwQixNQUFNQyxVQUFXUjtnQkFDZixNQUFNNzhCLE1BQU0sR0FBRzY4QixLQUFLckMsZ0JBQWdCcUMsS0FBS3BDLGlCQUFpQjtnQkFDMUQsSUFBSTBDLFFBQVFHLElBQUl0OUIsTUFBTTtnQkFDdEIsTUFBTWxHLE9BQU8sUUFBUStpQyxLQUFLbGdDLFNBQVN3Z0MsUUFBUTdvQjtnQkFDM0M2b0IsUUFBUXBxQixJQUFJL1MsS0FBSzt1QkFDWjY4QjtvQkFDSC9pQzs7O1lBSUp5Z0MsTUFBTW5oQyxRQUFRaWtDO1lBQ2RBLFFBQVE7Z0JBQ04xZ0MsT0FBT3VDLEtBQUtxTyxPQUFPNVE7Z0JBQ25CNjlCLGNBQWN0N0IsS0FBS3FPLE9BQU9pdEI7Z0JBQzFCQyxlQUFldjdCLEtBQUtxTyxPQUFPa3RCOztZQUc3QixPQUFPbjRCLE1BQU0wSCxLQUFLbXpCLFFBQVFwakM7QUFDNUI7UUFFUSxtQ0FBTTBoQztZQUlaLE1BQU12dUIsb0JBQW9CaE8sS0FBS3ErQixhQUM3QnIrQixLQUFLcU8sT0FBT2l3QjtZQUVkLE1BQU12d0IsbUJBQW1CL04sS0FBS3ErQixhQUM1QnIrQixLQUFLcU8sT0FBT2t3QjtZQUVkLE9BQU87Z0JBQUV2d0I7Z0JBQWFEOztBQUN4QjtRQUVRLGtDQUFNOHVCLENBQTZCeEI7WUFDekMsTUFBTW1ELGNBQW1DLENBQUE7WUFDekMsTUFBTUMsZUFBb0MsQ0FBQTtZQUMxQyxNQUFNQyxPQUE0QixDQUFBO1lBQ2xDLEtBQUssTUFBTWYsUUFBUXRDLE9BQU87Z0JBQ3hCLE1BQU1zRCxlQUFlMytCLEtBQUtxK0IsYUFDeEJWLEtBQUtuQyxXQUFXeDdCLEtBQUtxTyxPQUFPbXRCO2dCQUU5QixNQUFNb0QsV0FDSmpCLEtBQUtwQyxpQkFBaUJ2N0IsS0FBSzYrQixZQUFZbEIsS0FBS3JDO2dCQUM5Q2tELFlBQVliLEtBQUsvaUMsUUFBUTtvQkFDdkJzZ0IsS0FBS2xiLEtBQUs4K0IsY0FBY25CLEtBQUtyQztvQkFDN0J5RCxZQUFZO3dCQUFFaHRCLEtBQUs0c0I7O29CQUNuQkssYUFBYTt3QkFDWCw0QkFBNEJKO3dCQUM1Qkssa0JBQWtCTDs7O2dCQUd0QkgsYUFBYWQsS0FBSy9pQyxRQUFRO29CQUN4QnNrQyxlQUFlO29CQUNmQyxnQkFBZ0I7b0JBQ2hCQyxhQUFhO29CQUNiQyxhQUFhOztnQkFFZlgsS0FBS2YsS0FBS2xnQyxTQUFTaWhDLEtBQUtmLEtBQUtsZ0MsVUFBVTtvQkFDckNpbUIsT0FBT2lhLEtBQUtsZ0M7b0JBQ1o0OUIsT0FBTzs7Z0JBRVRxRCxLQUFLZixLQUFLbGdDLE9BQU80OUIsTUFBTXYvQixLQUFLNmhDLEtBQUsvaUM7QUFDbkM7WUFFQSxPQUFPO2dCQUNMQSxNQUFNO2dCQUNOeWxCLFNBQVM7Z0JBQ1QzRSxRQUFRO29CQUNONGpCLGNBQWN0L0IsS0FBS3FPLE9BQU81UTs7Z0JBRTVCOGhDLGVBQWViO2dCQUNmckQsT0FBT21EO2dCQUNQZ0IsVUFBVSxDQUFBO2dCQUNWQyxVQUFVO29CQUNSLENBQUN6L0IsS0FBS3FPLE9BQU9rdkIsVUFBVTt3QkFDckJsQyxPQUFPb0Q7Ozs7QUFJZjtRQUVRLDJCQUFBdEIsQ0FBNEI5QjtZQUNsQyxPQUFPQSxNQUFNcUUsTUFBTy9CLFFBQVMzOUIsS0FBSzIvQixnQkFBZ0JoQyxLQUFLckM7QUFDekQ7UUFFUSxlQUFBcUUsQ0FBZ0IzRDtZQUN0QixNQUFNNEQsT0FBTzUvQixLQUFLNitCLFlBQVk3QyxVQUFVL007WUFDeEMsT0FBTzJRLFNBQVMsZUFBZUEsU0FBUztBQUMxQztRQUVRLFdBQUFmLENBQVk3QztZQUNsQixNQUFNNkQsWUFBWTdELFNBQVNuL0IsUUFBUSxnQkFBZ0I7WUFDbkQsT0FBT2dqQyxVQUFVcFYsTUFBTSxLQUFLO0FBQzlCO1FBRVEsYUFBQXFVLENBQWM5QztZQUNwQixJQUFJLGdCQUFnQmxSLEtBQUtrUixXQUFXLE9BQU9BO1lBQzNDLE9BQU8sV0FBV0E7QUFDcEI7UUFFUSxrQkFBTXFDLENBQWF6cEI7WUFDekIsS0FBS0EsUUFBUSxNQUFNLElBQUlwVyxhQUFBQSxjQUFjO1lBQ3JDLElBQUlrUixPQUFPb3dCLFNBQVNsckIsU0FBUyxPQUFPQSxPQUFPaEssU0FBUztZQUNwRCxNQUFNbTFCLFVBQVVuckIsT0FBT25GO1lBQ3ZCLElBQUksMEJBQTBCcWIsS0FBS2lWLFVBQVUsT0FBT0E7WUFDcEQsTUFBTUMsY0FBYzVtQyxHQUFHc1UsU0FBU3V5QixLQUFLcnJCLFFBQVFzckIsTUFBTSxNQUFNMWpDO1lBQ3pELElBQUl3akMsT0FBT0csZUFBZTtnQkFDeEIsYUFBYWh2QiwyQkFBMkJ5RDtBQUMxQztZQUNBLGNBQWN3ckIsU0FBV3hyQixTQUFTaEs7QUFDcEM7UUFTUyxVQUFBa1MsQ0FBZ0N1akI7WUFDdkMsT0FBT3pLLG9CQUFvQjlZLFdBQWN1akI7QUFDM0M7UUFXQSx1QkFBTTExQixDQUNKL0gsS0FDQSsyQixLQUNBeDRCLE1BQ0EwNEIsZUFDQTdCLHdCQUNBanZCO1lBRUEsSUFBSS9JLEtBQUtvNkIsdUJBQXVCeDNCLE1BQU07Z0JBQ3BDLE1BQU0wOUIsYUFBYXRnQyxLQUFLcTZCLGtCQUFrQmw1QjtnQkFDMUMsTUFBTWc3QixlQUFlbjhCLEtBQUtzNkIscUJBQXFCVDtnQkFDL0MsTUFBTXVDLGNBQWNwOEIsS0FBS283Qix1QkFBdUJ4NEI7Z0JBQ2hELE9BQU81QyxLQUFLaThCLGtDQUNWcjVCLEtBQ0ErMkIsS0FDQTJHLFlBQ0FuRSxjQUNBQyxhQUNBcnpCO0FBRUo7WUFDQSxPQUFPL0ksS0FBSzA1QixZQUNWOTJCLEtBQ0ErMkIsS0FDQSxNQUNBeDRCLE1BQ0EwNEIsZUFDQTdCLHdCQUNBanZCO0FBRUo7UUFXQSx5QkFBTTVGLENBQ0pQLEtBQ0ErMkIsS0FDQXg0QixNQUNBMDRCLGVBQ0E3Qix3QkFDQWp2QjtZQUVBLE9BQU8vSSxLQUFLMDVCLFlBQ1Y5MkIsS0FDQSsyQixLQUNBLE9BQ0F4NEIsTUFDQTA0QixlQUNBN0Isd0JBQ0FqdkI7QUFFSjtRQVNTLGNBQU13M0IsSUFBWXAvQjtrQkFFbkJwQixNQUFNd2dDLFlBQVlwL0I7WUFDeEIsSUFBSW5CLEtBQUswYixRQUFRO2dCQUNmMWIsS0FBS29CLElBQUlLLFFBQVEsV0FBV3pCLEtBQUtxTyxPQUFPNVE7Z0JBQ3hDdUMsS0FBSzBiLE9BQU95ZTtBQUNkO0FBQ0Y7UUFTQSxrQkFBT1YsQ0FDTEssU0FDQXpyQixRQUNBbXJCO1lBRUEsTUFBTXA0QixNQUFNcEIsS0FBS29CLElBQUlULElBQUlYLEtBQUt5NUI7WUFDOUIsTUFBTTRELFVBQVVyOUIsS0FBS3M5QixXQUFXeEQsU0FBU3pyQixPQUFPa3ZCO1lBQ2hELElBQUl4RDtZQUNKO2dCQUNFMzRCLElBQUkyRCxNQUNGLHdCQUF3QnNKLE9BQU9tdkIsMEJBQTBCaEUsZ0JBQWdCbnJCLE9BQU9tckIsNkJBQTZCbnJCLE9BQU9rdkI7Z0JBRXRIL0QsZUFBZUEsZUFBZUEsZUFBZW5yQixPQUFPbXJCO2dCQUNwRE8sV0FBV3NELFFBQVE1RCxZQUFZcHJCLE9BQU9tdkIsZUFBZWhFO0FBQ3ZELGNBQUUsT0FBT3grQjtnQkFDUCxNQUFNZ0YsS0FBSzhjLFdBQVc5aEI7QUFDeEI7WUFDQSxPQUFPKytCO0FBQ1Q7UUFTQSxpQkFBT3VELENBQVd4RCxTQUFrQjBHO1lBQ2xDLE1BQU1wL0IsTUFBTW9kLFFBQUFBLFFBQVE3ZCxJQUFJWCxLQUFLczlCO1lBQzdCLElBQUlEO1lBQ0o7Z0JBQ0VqOEIsSUFBSTJELE1BQU0seUJBQXlCeTdCO2dCQUNuQ25ELFVBQVV2RCxRQUFRd0QsV0FBV2tEO0FBQy9CLGNBQUUsT0FBT3hsQztnQkFDUCxNQUFNZ0YsS0FBSzhjLFdBQVc5aEI7QUFDeEI7WUFFQSxPQUFPcWlDO0FBQ1Q7UUFTQSx1QkFBYWhFLENBQ1h6MkIsS0FDQXlMLFFBQ0FxTjtZQUVBLGFBQWMxYixLQUFLeWdDLGNBQ2pCL2tCLGdCQUFpQjFiLEtBQUtrNUIsVUFBVTdxQixTQUNoQ0EsUUFDQXpMO0FBRUo7UUFRQSxnQkFBT3MyQixDQUFVN3FCO1lBQ2YsTUFBTWpOLE1BQU1wQixLQUFLb0IsSUFBSVQsSUFBSVgsS0FBS2s1QjtZQUM5QjkzQixJQUFJMkQsTUFBTSxzQ0FBc0NzSixPQUFPNVE7WUFDdkQsSUFBSWlqQyxhQUE4QnJ5QixPQUFPbXRCO1lBRXpDLFdBQVdrRixlQUFlLFVBQVU7Z0JBQ2xDLElBQ0VBLFdBQVdsekIsTUFDVCx5RUFFRjtvQkFDQWt6QixhQUFhaHhCLE9BQU81RSxLQUFLNDFCLFlBQVk7QUFDdkMsdUJBQU87b0JBQ0w7d0JBQ0VBLGFBQWFoeEIsT0FBTzVFLEtBQUsxUixHQUFHdW5DLGFBQWFELFlBQVk7QUFDdkQsc0JBQUUsT0FBTzFsQzt3QkFDUCxNQUFNLElBQUl3RCxhQUFBQSxjQUNSLDJDQUEyQ2tpQyxlQUFlMWxDO0FBRTlEO0FBQ0Y7QUFDRjtZQUVBLE1BQU00bEMsaUJBQWlCQyxnQkFBSzd2QixZQUFZOHZCLFVBQVVKO1lBQ2xEdC9CLElBQUkyRCxNQUFNLHFDQUFxQ3NKLE9BQU9pdEI7WUFDdEQsT0FBTyxJQUFJN2YsS0FBQUEsT0FBT3BOLE9BQU9pdEIsY0FBY3NGLGdCQUFnQjtnQkFDckQsb0NBQW9DdnlCLE9BQU8weUIsYUFBYSxNQUFNLE9BQU87Z0JBQ3JFLGlDQUFpQzF5QixPQUFPMHlCLGFBQWEsTUFBTSxPQUFPOztBQUV0RTtRQTBCQSwwQkFBYU4sQ0FDWC9rQixRQUNBck4sUUFDQXpMO1lBRUEsTUFBTXhCLE1BQU1vZCxRQUFBQSxRQUFRN2QsSUFBSVgsS0FBS3lnQztZQUM3QnIvQixJQUFJMkQsTUFDRixnQ0FBZ0NzSixPQUFPNVEsZUFBZTRRLE9BQU9pd0I7WUFFL0QsTUFBTXRmLGlCQUFpQnJPLFlBQ3JCdEMsT0FBTzVRLE9BQ1A0USxPQUFPaXdCO1lBRVQ7Z0JBQ0VsOUIsSUFBSTJELE1BQ0Ysb0NBQW9DaVIsWUFBWUcsd0JBQXdCNkksU0FBU2hPLFlBQVlwRztBQUVqRyxjQUFFLE9BQU81UDtnQkFDUG9HLElBQUk2b0IsTUFBTSxnREFBZ0RqdkI7QUFDNUQ7WUFFQSxJQUFJZ21DO1lBQ0osTUFBTTdHLFFBQVE7WUFDZCxLQUFLOXJCLE9BQU9DLEtBQUs7Z0JBQ2YweUIsZUFBZTN2QixVQUFVaEQsT0FBT2t3QjtBQUNsQyxtQkFBTztnQkFhTCxNQUFNLElBQUl2VyxLQUFBQSxpQkFBaUI7QUFDN0I7WUFFQSxNQUFNL1osVUFBVTtnQkFDZHlOO2dCQUNBc0QsVUFBVUE7Z0JBQ1ZnaUIsUUFBUUE7Z0JBRVJDLGlCQUFpQixPQUNSO29CQUFFQyxVQUFVdmlCLEtBQUtELFFBQVEsTUFBTzliLElBQUlnRCxJQUFJOztnQkFFakR1N0IsZ0JBQWdCLE9BQ1A7b0JBQUVELFVBQVV2aUIsS0FBS0QsUUFBUSxNQUFPOWIsSUFBSWdELElBQUk7O2dCQUVqRHc3QixlQUFlLE9BQ047b0JBQUVGLFVBQVV2aUIsS0FBS0QsUUFBUSxNQUFPOWIsSUFBSWdELElBQUk7O2dCQUVqRHk3QixxQkFBcUIsT0FDWjtvQkFBRUgsVUFBVXZpQixLQUFLRCxRQUFRLE1BQU85YixJQUFJZ0QsSUFBSTs7O1lBSW5EeEUsSUFBSTJELE1BQU0saUJBQWlCc0osT0FBTzVRO1lBQ2xDLE1BQU1xOEIsVUFBVWlELGNBQUFBLFFBQVE5dUI7WUFHeEIsSUFBSUksT0FBT0MsS0FBSztnQkFDZHdyQixRQUFRSyxRQUFRLElBQUltSCxNQUFNeEgsUUFBUUssT0FBTztvQkFDdkMsS0FBQS9XLENBQU1WLFFBQW9CNmUsU0FBY0M7d0JBQ3RDQyxRQUFRcmUsTUFBTVYsUUFBUTZlLFNBQVNDO3dCQUMvQnJIO0FBQ0Y7O0FBRUo7WUFFQSxPQUFPTDtBQUNUO1FBV1MsUUFBQTRIO1lBQ1AsT0FBTyxJQUFJOUwsb0JBQW9CLGlCQUFpQjUxQixLQUFLMGI7QUFDdkQ7UUFTVSxpQkFBT29CLENBQ2Z1akI7WUFTQSxJQUFJOW1CLGFBQWE4bUIsUUFBUSxXQUFXQSxNQUFNQSxJQUFJbm1CO1lBQzlDLElBQUltbUIsZUFBZXNCLGNBQUFBLGdCQUFnQnRCLElBQUl1QixRQUFRamxDLFVBQVUwakMsSUFBSTlsQixTQUFTLElBQUk7Z0JBQ3hFaEIsTUFBTSxHQUFHOG1CLElBQUl1QixRQUFRLEdBQUcxbkI7QUFDMUI7WUFFQSxJQUNFbW1CLGVBQWV3QixjQUFBQSxnQkFDZnhCLElBQUl1QixRQUFRamxDLFVBQ1owakMsSUFBSTlsQixTQUFTLE1BQ2I4bEIsSUFBSXVCLFFBQVEsR0FBRzFuQixTQUFTL2EsU0FBUzZvQixLQUFBQSxpQkFBaUJwdEIsT0FDbEQ7Z0JBQ0EyZSxNQUFNLEdBQUc4bUIsSUFBSXVCLFFBQVEsR0FBRzFuQjtBQUMxQjtZQUVBLElBQUlYLElBQUlwYSxTQUFTLHVCQUNmLE9BQU8sSUFBSWdiLHNCQUFzQmttQjtZQUVuQyxJQUFJOW1CLElBQUlwYSxTQUFTLHNCQUNmLE9BQU8sSUFBSXFiLHdCQUF3QjZsQjtZQUVyQyxJQUFJOW1CLElBQUlwYSxTQUFTLCtCQUNmLE9BQU8sSUFBSWtiLHVCQUF1QmdtQjtZQUVwQyxJQUFJOW1CLElBQUlwYSxTQUFTLDBCQUNmLE9BQU8sSUFBSWliLHlCQUF5QmltQjtZQUV0QyxJQUFJQSxlQUFlcjNCLFNBQVVxM0IsSUFBWTlsQixNQUFNO2dCQUM3QyxRQUFTOGxCLElBQVk5bEI7a0JBQ25CLEtBQUs7b0JBQ0gsT0FBTyxJQUFJTixpQkFBaUJvbUI7O0FBRWxDO1lBRUEsSUFBSTltQixJQUFJcGEsU0FBU29ILGFBQUFBLGdCQUFnQjNMLE9BQy9CLE9BQU8sSUFBSTJMLGFBQUFBLGdCQUFnQjg1QjtZQUM3QixJQUFJOW1CLElBQUlwYSxTQUFTb2UsYUFBQUEsY0FBYzNpQixPQUFPLE9BQU8sSUFBSTJpQixhQUFBQSxjQUFjOGlCO1lBQy9ELElBQUk5bUIsSUFBSXBhLFNBQVM4ZCxhQUFBQSxjQUFjcmlCLE9BQU8sT0FBTyxJQUFJcWlCLGFBQUFBLGNBQWNvakI7WUFDL0QsSUFBSTltQixJQUFJcGEsU0FBUzJpQyxhQUFBQSxnQkFBZ0JsbkMsT0FDL0IsT0FBTyxJQUFJa25DLGFBQUFBLGdCQUFnQnpCO1lBQzdCLElBQUk5bUIsSUFBSXBhLFNBQVNrekIsS0FBQUEsV0FBV3ozQixPQUFPLE9BQU8sSUFBSXkzQixLQUFBQSxXQUFXZ087WUFDekQsSUFBSTltQixJQUFJcGEsU0FBUzRpQyxLQUFBQSxZQUFZbm5DLE9BQU8sT0FBTyxJQUFJbW5DLEtBQUFBLFlBQVkxQjtZQUMzRCxJQUFJOW1CLElBQUlwYSxTQUFTNm9CLEtBQUFBLGlCQUFpQnB0QixPQUNoQyxPQUFPLElBQUlvdEIsS0FBQUEsaUJBQWlCcVk7WUFDOUIsSUFBSTltQixJQUFJcGEsU0FBUzZpQyxLQUFBQSxlQUFlcG5DLE9BQU8sT0FBTyxJQUFJb25DLEtBQUFBLGVBQWUzQjtZQUNqRSxJQUFJOW1CLElBQUlwYSxTQUFTOGlDLEtBQUFBLGNBQWNybkMsT0FBTyxPQUFPLElBQUlxbkMsS0FBQUEsY0FBYzVCO1lBQy9ELElBQUk5bUIsSUFBSXBhLFNBQVN3YSxLQUFBQSxtQkFBbUIvZSxPQUNsQyxPQUFPLElBQUkrZSxLQUFBQSxtQkFBbUIwbUI7WUFDaEMsSUFBSTltQixJQUFJcGEsU0FBUytpQyxLQUFBQSxlQUFldG5DLE9BQU8sT0FBTyxJQUFJc25DLEtBQUFBLGVBQWU3QjtZQUNqRSxJQUFJOW1CLElBQUlwYSxTQUFTZ2pDLEtBQUFBLGdCQUFnQnZuQyxPQUMvQixPQUFPLElBQUl1bkMsS0FBQUEsZ0JBQWdCOUI7WUFDN0IsSUFBSTltQixJQUFJcGEsU0FBU3NKLGFBQUFBLG1CQUFtQjdOLE9BQ2xDLE9BQU8sSUFBSTZOLGFBQUFBLG1CQUFtQjQzQjtZQUNoQyxPQUFPLElBQUk3aEMsYUFBQUEsY0FBYzZoQztBQUMzQjs7SUExbENlNzRCLE1BQUFBLFdBQUEsRUFGZHpDLGlCQUNBcTlCLG9JQU15QnAzQixLQUFBQSw4REF1Q3pCNHFCLG9CQUFBaHVCLFdBQUEsVUFBQTtJQUlLSixNQUFBQSxXQUFBLEVBRkx6QyxpQkFDQXE5Qiw0R0FHeUJwM0IsS0FBQUEsOERBZXpCNHFCLG9CQUFBaHVCLFdBQUEsZUFBQTtJQVdLSixNQUFBQSxXQUFBLEVBRkx6QyxpQkFDQXE5QixvSEFJeUJwM0IsS0FBQUEsOERBZ0J6QjRxQixvQkFBQWh1QixXQUFBLFFBQUE7SUE0QktKLE1BQUFBLFdBQUEsRUFGTHpDLGlCQUNBcTlCLG9JQU15QnAzQixLQUFBQSw4REF3Q3pCNHFCLG9CQUFBaHVCLFdBQUEsVUFBQTtJQVdjSixNQUFBQSxXQUFBLEVBRmR6QyxpQkFDQXE5QixvSEFJeUJwM0IsS0FBQUEsOERBOEJ6QjRxQixvQkFBQWh1QixXQUFBLFVBQUE7SUE0QktKLE1BQUFBLFdBQUEsRUFETHpDLGdJQUdXczlCLE1BQUMsZUFBREEsT0FBQyxhQUFBQyxLQUFBeG5DLFFBQUFBLFFBRWFrUSxLQUFBQSw4REF3Q3pCNHFCLG9CQUFBaHVCLFdBQUEsT0FBQTtJQWFLSixNQUFBQSxXQUFBLEVBREx6Qyw0SEFLeUJpRyxLQUFBQSw4REF3QnpCNHFCLG9CQUFBaHVCLFdBQUEsUUFBQTtJQXd4QkhndUIsb0JBQW9CMk07SUFDcEIxTSxLQUFBQSxRQUFRMk0sV0FBVzkxQjtJQ3Z3RGIsTUFBTysxQiw2QkFBNkJmLEtBQUFBO1FBZ0J4QyxXQUFBOWhDLENBQXNCOGI7WUFDcEIzYjtZQURvQkMsS0FBQTBiLFNBQUFBO1lBUGQxYixLQUFBcUosVUFBVSxJQUFJQyxZQUFZO0FBU2xDO1FBT1MsV0FBTTZ3QixJQUNWOTRCO1lBRUgsT0FBTUQsS0FBRUEsS0FBS0MsU0FBU3FoQyxxQkFDZDFpQyxLQUFLc0IsT0FBT0QsU0FBU3dCLEtBQUFBLGdCQUFnQjgvQixVQUFVLE9BQ3JEaGlDLElBQUlYLEtBQUttNkI7WUFDWDtzQkFDUXA2QixNQUFNbzZCLFNBQVN1STtBQUN2QixjQUFFLE9BQU8xbkM7Z0JBQ1BvRyxJQUFJNm9CLE1BQU0saURBQWlEanZCO0FBQzdEO1lBQ0EsSUFBSWdGLEtBQUs0aUMsZ0JBQWdCO2dCQUN2QjswQkFDUTVpQyxLQUFLNGlDLGVBQWV6STtBQUM1QixrQkFBRSxPQUFPbi9CO29CQUNQb0csSUFBSTZvQixNQUFNLHlDQUF5Q2p2QjtBQUNyRDtvQkFDRWdGLEtBQUs0aUMsaUJBQWlCcG1DO0FBQ3hCO0FBQ0Y7QUFDRjtRQVFRLFlBQUFxbUMsQ0FBYUM7WUFDbkIsTUFBTUMsT0FBTy9pQyxLQUFLcUosUUFBUW5HLE9BQU80L0I7WUFDakMsT0FBT3htQyxLQUFLMkcsTUFBTTgvQjtBQUNwQjtRQVFTLE9BQUFDLENBQVFDO1lBQ2YsTUFBTUEsb0JBQW9Cck4sc0JBQ3hCLE1BQU0sSUFBSTVOLEtBQUFBLGlCQUNSO1lBRUpqb0IsTUFBTWlqQyxRQUFRQztZQUNkLE9BQU8sTUFBTWpqQyxLQUFLa2pDLFVBQVVEO0FBQzlCO1FBVVMscUJBQU0xNUIsQ0FDYnpFLE9BQ0EwRSxPQUNBcEUsT0FDR2pFO1lBRUgsT0FBTUMsS0FBRUEsS0FBR0MsU0FBRUEsV0FBWXcwQixhQUFRdjBCLE9BQy9CdEIsS0FBS3VKLGlCQUNMQyxPQUNBLFVBQ0dySTtZQUVMLEtBQUtuQixLQUFLSCxTQUFTO2dCQUNqQnVCLElBQUlLLFFBQ0YseUVBQXlFcUQsVUFBVSxXQUFXQSxRQUFRN0osb0JBQUFBLE1BQU15RyxVQUFVb0QsVUFBVTBFO2dCQUVsSTtBQUNGO1lBQ0E7c0JBQ1F4SixLQUFLSCxRQUFRc2pDLFFBQVFyK0IsT0FBTzBFLE9BQU9wRSxPQUFPL0Q7QUFDbEQsY0FBRSxPQUFPckc7Z0JBQ1AsTUFBTSxJQUFJd0QsYUFBQUEsY0FBYywrQkFBK0J4RDtBQUN6RDtBQUNGO1FBdUJVLGtCQUFNb29DLENBQ2RDO1lBRUEsS0FBS3JqQyxLQUFLNGlDLGdCQUNSLE1BQU0sSUFBSXBrQyxhQUFBQSxjQUNSO1lBR0osS0FBS3dCLEtBQUtILFlBQVlHLEtBQUtILFFBQVF3TyxRQUNqQyxNQUFNLElBQUk3UCxhQUFBQSxjQUFjO1lBRTFCLE1BQU1vRSxNQUNKeWdDLGdCQUNPcmpDLEtBQUtILFFBQVF5akIsUUFDbEI1ZCxhQUFBQSxjQUFjcW1CLE1BQ2Q7Z0JBQ0V1WCxlQUFldGpDLEtBQUtILFFBQVF3TyxPQUFPbXZCO2VBRXBDeDlCLEtBQUt5RixVQUFVekYsS0FBS3lGLE9BQU8sTUFBUXhLLG9CQUFBQTtZQUV4QyxNQUFNbUcsTUFBTXBCLEtBQUtvQixJQUFJVCxJQUFJWCxLQUFLb2pDO1lBRTlCaGlDLElBQUlnZCxLQUNGLCtDQUErQ3BlLEtBQUtILFFBQVF3TyxPQUFPbXZCLDhCQUE4Qng5QixLQUFLSCxRQUFRd08sT0FBT2t2QjtZQUd2SDtnQkFDRSxXQUFXLE1BQU1nRyxPQUFPdmpDLEtBQUs0aUMsZ0JBQWdCO29CQUMzQyxPQUFNNzZCLE9BQUVBLE9BQUt5QixPQUFFQSxPQUFLYyxPQUFFQSxTQUFVaWdCLGVBQWVnWixJQUFJQztvQkFDbkQsSUFDRXhqQyxLQUFLSCxRQUFRd08sUUFBUW8xQixnQkFDckJuNUIsU0FDQUEsVUFBVXRLLEtBQUtILFFBQVF3TyxRQUFRNVEsT0FFL0I7b0JBQ0YsTUFBTVgsVUFBd0NrRCxLQUFLNmlDLGFBQ2pEVSxJQUFJem1DO29CQUVOO3dCQUNFLE1BQU00bUMsY0FBYzM3QixRQUNoQjlNLG9CQUFBQSxNQUFNMkssSUFBSW1DLFNBQ1Y5TSxvQkFBQUEsTUFBTTJLLElBQUk1RixLQUFLeUYsT0FBTyxHQUFHN0s7d0JBQzdCLE1BQU0rb0MsV0FBV0QsZ0JBQWdCMzdCLFNBQVMvSCxLQUFLeUYsT0FBTyxJQUFJN0s7d0JBQzFELE1BQU1ncEMsZUFBZTltQyxRQUFRekIsU0FBUyxFQUFDeUIsUUFBUXpCLFFBQVF1SCxRQUFPLEVBQUNBOzhCQUN6RDVDLEtBQUt1SixnQkFDVG82QixVQUNBbjZCLE9BQ0ExTSxRQUFRc0ksT0FDSncrQjtBQUVSLHNCQUFFLE9BQU81b0M7d0JBQ1BvRyxJQUFJNm9CLE1BQ0YsdUNBQXVDbGlCLGVBQWV5QixhQUFhMU0sUUFBUXNJLE9BQU9wSztBQUV0RjtBQUNGO0FBQ0YsY0FBRSxPQUFPQTtnQkFDUG9HLElBQUk2b0IsTUFDRix1Q0FBdUNqcUIsS0FBS0gsUUFBUXdPLE9BQU9tdkIsOEJBQThCeDlCLEtBQUtILFFBQVF3TyxPQUFPa3ZCLGFBQWF2aUM7c0JBRXRIZ0YsS0FBS202QixNQUFNdjNCO0FBQ25CO0FBQ0Y7UUFZbUIsZ0JBQU15STtZQUN2QixLQUFLckwsS0FBS0gsU0FDUixNQUFNLElBQUlyQixhQUFBQSxjQUFjO1lBRTFCLE1BQU02dUIsa0JBQWtCcnRCLEtBQUtILFFBQVF3TyxPQUFPZ2Ysb0JBQW9CO1lBRWhFLEtBQUtBLGlCQUFpQjtnQkFFcEIsTUFBTS9KLGdCQUFnQnRqQixLQUFLSCxRQUFReWpCLFFBQ2pDLFlBQ0E7b0JBQ0VnZ0IsZUFBZXRqQyxLQUFLSCxRQUFRd08sT0FBT212QjttQkFFckN2aUM7Z0JBRUYsT0FBTTJILEtBQUVBLE9BQVE1QyxLQUFLc0IsT0FBTyxFQUFDZ2lCLFdBQVV0akIsS0FBS3FMO2dCQUM1QyxNQUFNeXVCLGdCQUFnQmxFLG9CQUFvQnlELFdBQ3hDejJCLEtBQ0E1QyxLQUFLSCxRQUFRd08sUUFDYnJPLEtBQUswYjtnQkFFUCxNQUFNMmhCLFVBQVV2RCxRQUFRd0QsV0FBV3Q5QixLQUFLSCxRQUFRd08sT0FBT2t2QjtnQkFDdkQsS0FBS3Y5QixLQUFLSCxTQUNSLE1BQU0sSUFBSXJCLGFBQUFBLGNBQWM7Z0JBQzFCd0IsS0FBSzRpQyx1QkFBdUJ2RixRQUFRd0csbUJBQ2xDN2pDLEtBQUtILFFBQVF3TyxPQUFPbXZCO2dCQUV0Qng5QixLQUFLb2pDLGFBQWF4Z0M7QUFDcEI7WUFPRSxFQUNFOEMsYUFBQUEsY0FBY0MsUUFDZEQsYUFBQUEsY0FBY2l6QixRQUNkanpCLGFBQUFBLGNBQWNrekIsUUFDZDNCLGFBQUFBLHNCQUFzQkMsWUFDdEJELGFBQUFBLHNCQUFzQk0sWUFDdEJOLGFBQUFBLHNCQUFzQlMsYUFFeEJ4OUIsUUFBUzRwQztnQkFDVCxLQUFLOWpDLEtBQUtILFNBQ1IsTUFBTSxJQUFJckIsYUFBQUEsY0FDUjtnQkFFSixLQUFLd0IsS0FBS0gsUUFBUWlrQyxTQUNoQixNQUFNLElBQUl0bEMsYUFBQUEsY0FDUixVQUFVc2xDLHVCQUF1QjlqQyxLQUFLSCxRQUFRMHVCO2dCQUdsRCxJQUFJM0wsYUFBYTluQixPQUFPaXBDLHlCQUF5Qi9qQyxLQUFLSCxTQUFTaWtDO2dCQUMvRCxJQUFJRSxRQUFhaGtDLEtBQUtIO2dCQUN0QixRQUFRK2lCLGNBQWNvaEIsVUFBVWxwQyxPQUFPOE0sV0FBVztvQkFDaERvOEIsUUFBUWxwQyxPQUFPbXBDLGVBQWVEO29CQUM5QnBoQixhQUFhOW5CLE9BQU9pcEMseUJBQXlCQyxPQUFPRjtBQUN0RDtnQkFFQSxLQUFLbGhCLGVBQWVBLFdBQVdrQixVQUFVO29CQUN2QzlqQixLQUFLb0IsSUFBSTZvQixNQUNQLHlCQUF5QjZaO29CQUUzQjtBQUNGO2dCQUNBLFNBQVNJLGFBQWFoVztvQkFDcEIsUUFBUUE7c0JBQ04sS0FBSytJLGFBQUFBLHNCQUFzQkM7d0JBQ3pCLE9BQU94eEIsYUFBQUEsY0FBY0M7O3NCQUN2QixLQUFLc3hCLGFBQUFBLHNCQUFzQk07d0JBQ3pCLE9BQU83eEIsYUFBQUEsY0FBY2l6Qjs7c0JBQ3ZCLEtBQUsxQixhQUFBQSxzQkFBc0JTO3dCQUN6QixPQUFPaHlCLGFBQUFBLGNBQWNrekI7O3NCQUN2Qjt3QkFDRSxPQUFPMUs7O0FBRWI7Z0JBR0FsdUIsS0FBS0gsUUFBUWlrQyxVQUFVLElBQUl4QyxNQUFNdGhDLEtBQUtILFFBQVFpa0MsU0FBUztvQkFDckQxZ0IsT0FBT2xvQixPQUNMd25CLFFBQ0E2ZSxTQUNBQzt3QkFHQSxNQUFNbm1DLGVBQWVxbkIsT0FBT1UsTUFBTW1lLFNBQVNDO3dCQUUzQyxNQUFNMWhDLFFBQTBCMGhDLFNBQVM7d0JBSXpDLEtBQUtuVSxvQkFBb0JweUIsMEJBQU0ybEIsWUFBWTlnQixRQUFRLE9BQU96RTt3QkFHMUQsT0FBTStGLEtBQUVBLEtBQUdDLFNBQUVBLFNBQU91QixLQUFFQSxPQUFRMitCLFFBQVEsVUFDcENDLFNBQVN4K0IsTUFBTXcrQixTQUFTN2tDLFNBQVMsSUFDakMrbEI7d0JBRUYsTUFBTWpjLE1BQU0rNkIsU0FBUzt3QkFDckIsTUFBTTJDLGFBQW9CLEVBQUNya0MsT0FBT29rQyxhQUFhSixTQUFTcjlCO3dCQUV4RCxJQUFJN0QsSUFBSTB6QixlQUFlLHNCQUFzQjs0QkFDM0M2TixXQUFXcm9DLEtBQUtUO0FBQ2xCO3dCQUNBMkUsS0FBS3VKLG1CQUNDNDZCLGVBQ0Q5aUMsU0FDSDYrQixNQUFPbGxDLEtBQ1BvRyxJQUFJNm9CLE1BQ0YsMkNBQTJDNlosYUFBYWhrQyxNQUFNbEYsUUFBUWtGLGFBQWEyRyxRQUFRekw7d0JBRy9GLE9BQU9LOzs7O0FBSWY7O0lBR0YsSUFBSXU2QixxQkFDRkEsb0JBQW9CLG1CQUFtQjZNO0lDNVlsQyxNQUFNMkIsVUFBVTtJQUNoQixNQUFNQyxlQUFlO0lBRTVCNzdCLFdBQUFBLFNBQVM4N0IsZ0JBQWdCRCxjQUFjRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9