@decaf-ts/for-fabric 0.4.8 → 0.4.9

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.
@@ -1540,8 +1540,9 @@
1540
1540
  }
1541
1541
  async function ownedByOnCreate(context, data, key, model) {
1542
1542
  const {stub: stub} = context;
1543
+ const allowGenerationOverride = context.get("allowGenerationOverride") || false;
1543
1544
  const creator = await stub.getCreator();
1544
- const owner = creator.mspid;
1545
+ const owner = allowGenerationOverride ? model[key] : creator.mspid;
1545
1546
  const setOwnedByKeyValue = function(target, propertyKey, value) {
1546
1547
  Object.defineProperty(target, propertyKey, {
1547
1548
  enumerable: true,
@@ -3684,7 +3685,7 @@
3684
3685
  }
3685
3686
  }
3686
3687
  if (FabricClientAdapter) FabricClientAdapter["_baseDispatch"] = FabricClientDispatch;
3687
- const VERSION = "0.4.8";
3688
+ const VERSION = "0.4.9";
3688
3689
  const PACKAGE_NAME = "@decaf-ts/for-fabric";
3689
3690
  decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
3690
3691
  exports.AllowanceError = AllowanceError;
@@ -3774,4 +3775,4 @@
3774
3775
  exports.writeDesignDocs = writeDesignDocs;
3775
3776
  exports.writeIndexes = writeIndexes;
3776
3777
  });
3777
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY29udHJhY3RzL2VyYzIwL21vZGVscy50cyIsIi4uL3NyYy9zaGFyZWQvQ2xpZW50U2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvZXJjMjAvRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnRzIiwiLi4vc3JjL2NsaWVudC9pZHMvaWQtZXh0cmFjdGlvbi50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvSWRlbnRpdHlDcmVkZW50aWFscy50cyIsIi4uL3NyYy9zaGFyZWQvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eS50cyIsIi4uL3NyYy9jbGllbnQvdXRpbHMudHMiLCIuLi9zcmMvY2xpZW50L2NyeXB0by50cyIsIi4uL3NyYy9zaGFyZWQvZXJyb3JzLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNFbnJvbGxtZW50U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL3NoYXJlZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9zaGFyZWQvZXZlbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljSWRlbnRpdHlTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvZmFicmljLWZzLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRTdGF0ZW1lbnQudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgSW5kZXggPSBDcmVhdGVJbmRleFJlcXVlc3Q7XG5cbmZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG4gIGNvbnN0IGRpcm5hbWU6IHN0cmluZyA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGRpcm5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGRpcm5hbWUpO1xuICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1vZGVsSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPlxuKTogSW5kZXhbXSB7XG4gIHJldHVybiBnZW5lcmF0ZUluZGV4ZXMoW21dKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBhY2N1bT86IFJlY29yZDxzdHJpbmcsIENvdWNoREJEZXNpZ25Eb2M+XG4pOiBDb3VjaERCRGVzaWduRG9jW10ge1xuICBjb25zdCB2aWV3cyA9IGdlbmVyYXRlVmlld3MoW21dKTtcbiAgY29uc3Qgc3RvcmFnZTogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz4gPSBhY2N1bSB8fCB7fTtcbiAgdmlld3MuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgc3RvcmFnZVtkb2MuX2lkXSA9IGRvYztcbiAgfSk7XG4gIHJldHVybiB2aWV3cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNb2RlbEZpbGUoZmlsZTogYW55KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZXhwb3J0cyA9IHJlcXVpcmUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGZpbGUucGFyZW50UGF0aCwgZmlsZS5uYW1lKSk7XG5cbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhleHBvcnRzKS5maWx0ZXIoKGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbSA9IG5ldyAoZSBhcyBDb25zdHJ1Y3RvcikoKTtcbiAgICAgIHJldHVybiBtIGluc3RhbmNlb2YgTW9kZWw7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSkgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W107XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTW9kZWxGb2xkZXJzKFxuICAuLi5mb2xkZXJzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTxNb2RlbENvbnN0cnVjdG9yPGFueT5bXT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IGZpbGVzID0gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhmb2xkZXIsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGY6IGFueSkgPT4gZi5pc0ZpbGUoKSAmJiBmLm5hbWUuZW5kc1dpdGgoXCJqc1wiKSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5yZWFkTW9kZWxGaWxlKGZpbGUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW5kZXhlcyhcbiAgaW5kZXhlczogSW5kZXhbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgaW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1pbmRleGVzLyR7aW5kZXgubmFtZX0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGluZGV4LCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURlc2lnbkRvY3MoXG4gIGRlc2lnbkRvY3M6IENvdWNoREJEZXNpZ25Eb2NbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIGlmICghZGVzaWduRG9jcy5sZW5ndGgpIHJldHVybjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBkZXNpZ25Eb2NzLmZvckVhY2goKGRvYykgPT4ge1xuICAgIGNvbnN0IGRvY0lkID0gZG9jLl9pZC5yZXBsYWNlKC9eX2Rlc2lnblxcLy8sIFwiXCIpO1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1kZXNpZ25fZG9jcy8ke2RvY0lkfS5qc29uYFxuICAgICAgKVxuICAgICk7XG4gICAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IC4uLmRvYyB9O1xuICAgIGRlbGV0ZSBwYXlsb2FkLl9yZXY7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQ291Y2hEQkRlc2lnbkRvYyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgd3JpdGVEZXNpZ25Eb2NzIH0gZnJvbSBcIi4uL2luZGV4ZXMvZ2VuZXJhdGlvblwiO1xuXG4vL1xuLy8gZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbi8vICAgbmFtZTogXCJjb2xsZWN0aW9uTWFyYmxlc1wiO1xuLy8gICBwb2xpY3k6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgcmVxdWlyZWRQZWVyQ291bnQ6IDA7XG4vLyAgIG1heFBlZXJDb3VudDogMztcbi8vICAgYmxvY2tUb0xpdmU6IDA7XG4vLyAgIG1lbWJlck9ubHlSZWFkOiB0cnVlO1xuLy8gICBtZW1iZXJPbmx5V3JpdGU6IHRydWU7XG4vLyAgIGVuZG9yc2VtZW50UG9saWN5OiB7XG4vLyAgICAgaWRlbnRpdGllczogW1xuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzFNU1BcIiB9IH0sXG4vLyAgICAgICB7IHJvbGU6IHsgbmFtZTogXCJtZW1iZXJcIjsgbXNwSWQ6IFwiT3JnMk1TUFwiIH0gfSxcbi8vICAgICBdO1xuLy8gICAgIHJ1bGU6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgfTtcbi8vIH07XG5cbmV4cG9ydCB0eXBlIEZhYnJpY1BvbGljeUlkZW50aXR5ID0ge1xuICByb2xlOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1zcElkOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k6IHtcbiAgICBpZGVudGl0aWVzOiBGYWJyaWNQb2xpY3lJZGVudGl0eVtdO1xuICAgIHJ1bGU6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFByaXZhdGVDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k/OiB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdGlvbkZvcihcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcG9saWN5OiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbixcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY29sbGVjdGlvbk5hbWUsXG4gICAgcG9saWN5OiBwb2xpY3ksXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICBtc3BJZDogc3RyaW5nLFxuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nID0gYCR7bXNwSWR9UHJpdmF0ZWAsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDAsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCcke21zcElkfS5tZW1iZXInKWAsXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZVxuICApO1xuXG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgT1IoJyR7bXNwSWR9LnBlZXInKWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgbXNwSWRzOiBzdHJpbmdbXSxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlciA9IDEsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyID0gMixcbiAgYmxvY2tUb0xpdmU6IG51bWJlciA9IDAsXG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuID0gdHJ1ZSxcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuID0gdHJ1ZVxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICBjb25zdCBjID0gY29sbGVjdGlvbkZvcihcbiAgICBjb2xsZWN0aW9uTmFtZSxcbiAgICBgT1IoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ubWVtYmVyJ2ApLmpvaW4oXCIsXCIpfSlgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcbiAgYy5lbmRvcnNlbWVudFBvbGljeSA9IHtcbiAgICBzaWduYXR1cmVQb2xpY3k6IGBBTkQoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ucGVlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgfTtcbiAgcmV0dXJuIGM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0Q29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkczogc3RyaW5nW10sXG4gIG92ZXJyaWRlczoge1xuICAgIHByaXZhdGVDb2xzPzogUGFydGlhbDxQcml2YXRlQ29sbGVjdGlvbj47XG4gICAgc2hhcmVkQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICB9ID0ge30sXG4gIG1pcnJvcjogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgbGV0IHsgcHJpdmF0ZUNvbHMsIHNoYXJlZENvbHMgfSA9IE1vZGVsLmNvbGxlY3Rpb25zRm9yKG0pO1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVDb2xsZWN0aW9uKGFyZzogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHJldHVybiBhcmc7XG4gICAgICByZXR1cm4gYXJnKG0sIG1zcElkc1swXSkgYXMgc3RyaW5nO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGVDb2xzID0gcHJpdmF0ZUNvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcbiAgc2hhcmVkQ29scyA9IHNoYXJlZENvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcblxuICBjb25zdCBwcml2YXRlRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAwLFxuICAgICAgbWF4UGVlckNvdW50OiAwLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8ucHJpdmF0ZUNvbHMgfHwge31cbiAgKTtcbiAgY29uc3Qgc2hhcmVkRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAxLFxuICAgICAgbWF4UGVlckNvdW50OiAyLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8uc2hhcmVkQ29scyB8fCB7fVxuICApO1xuXG4gIGNvbnN0IG1pcnJvck1ldGEgPSBtaXJyb3IgPyBNb2RlbC5taXJyb3JlZEF0KG0pIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHByaXZhdGVzID0gbXNwSWRzXG4gICAgLm1hcCgobXNwSWQpID0+XG4gICAgICAocHJpdmF0ZUNvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgICBwcml2YXRlRGVmYXVsdHM7XG4gICAgICAgIHJldHVybiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgICAgICAgICBtc3BJZCxcbiAgICAgICAgICBwLFxuICAgICAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgICAgICBibG9ja1RvTGl2ZSxcbiAgICAgICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApXG4gICAgLmZsYXQoKTtcblxuICBpZiAobWlycm9yTWV0YSAmJiBtaXJyb3JNZXRhLm1zcElkKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPVxuICAgICAgdHlwZW9mIG1pcnJvck1ldGEucmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtaXJyb3JNZXRhLnJlc29sdmVyXG4gICAgICAgIDogbWlycm9yTWV0YS5yZXNvbHZlcihtLCBtaXJyb3JNZXRhLm1zcElkKTtcbiAgICBpZiAoXG4gICAgICByZXNvbHZlZCAmJlxuICAgICAgIXByaXZhdGVzLnNvbWUoXG4gICAgICAgIChwKSA9PiBwLm5hbWUgPT09IHJlc29sdmVkICYmIHAucG9saWN5LmluY2x1ZGVzKG1pcnJvck1ldGEubXNwSWQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgcHJpdmF0ZXMucHVzaChcbiAgICAgICAgcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbWlycm9yTWV0YS5tc3BJZCxcbiAgICAgICAgICByZXNvbHZlZCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzaGFyZWQgPSAoc2hhcmVkQ29scyBhcyBzdHJpbmdbXSkubWFwKChwKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlLFxuICAgIH0gPSBzaGFyZWREZWZhdWx0cztcbiAgICByZXR1cm4gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgICAgIG1zcElkcyxcbiAgICAgIHAsXG4gICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICBtZW1iZXJPbmx5V3JpdGVcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVzLFxuICAgIHNoYXJlZCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbnMoXG4gIGNvbHM6IFByaXZhdGVDb2xsZWN0aW9uW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGZpbGVOYW1lID0gXCJjb2xsZWN0aW9uc19jb25maWdcIlxuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpIGFzIHN0cmluZztcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG4gIH1cblxuICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihwLCBgLi9NRVRBLUlORi8ke2ZpbGVOYW1lfS5qc29uYCkpO1xuICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkoY29scywgdW5kZWZpbmVkLCAyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzKFxuICBkb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRvY3M/Lmxlbmd0aCkgcmV0dXJuO1xuICB3cml0ZURlc2lnbkRvY3MoZG9jcywgcCwgY29sbGVjdGlvbik7XG59XG4iLCJpbXBvcnQge1xuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBhZ2luYXRvcixcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFNlcmlhbGl6ZWRQYWdlLFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50UGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIE1bXSxcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGJvb2ttYXJrPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgcXVlcnk6IE1hbmdvUXVlcnkgfCBQcmVwYXJlZFN0YXRlbWVudDxhbnk+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBgUmF3IHF1ZXJ5IGFjY2VzcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuIG9ubHkgcHJlcGFyZWQgc3RhdGVtZW50cyBhcmUgbmF0aXZlbHkgYXZhaWxhYmxlYFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBwYWdlKFxuICAgIHBhZ2U6IG51bWJlciA9IDEsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gc3VwZXIucGFnZShwYWdlLCAuLi5hcmdzKTsgLy8gdGhpcyB3aWxsIGZhaWwgZm9yIG5vbi1wcmVwYXJlZCBzdGF0ZW1lbnRzXG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgaXNTZXJpYWxpemVkUGFnZShvYmo6IFNlcmlhbGl6ZWRQYWdlPGFueT4gfCBhbnkpIHtcbiAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmVDb250ZXh0dWFsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBDb250ZXh0T2YsXG4gIERpcmVjdGlvbkxpbWl0T2Zmc2V0LFxuICBGbGFnc09mLFxuICBPYnNlcnZlckhhbmRsZXIsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQYWdpbmF0b3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICBSZXBvc2l0b3J5LFxuICBTZXJpYWxpemVkUGFnZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWR1Y2VFcnJvcnNUb1ByaW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgRmFicmljIGNsaWVudCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBnZW5lcmljIFJlcG9zaXRvcnkgdG8gcHJlcGFyZSBjb250ZXh0IGFuZCBhcmd1bWVudHMgZm9yIENSVUQgb3BlcmF0aW9ucyBleGVjdXRlZCB2aWEgYSBGYWJyaWMgY2xpZW50IEFkYXB0ZXIsIHdpcmluZyBSZXBvc2l0b3J5RmxhZ3MgYW5kIEZhYnJpYy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gKiBAdGVtcGxhdGUgTSBleHRlbmRzIE1vZGVsIC0gVGhlIG1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHJlcG9zaXRvcnlcbiAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIE1hbmdvUXVlcnksIEZhYnJpY0ZsYWdzLCBDb250ZXh0PEZhYnJpY0ZsYWdzPj59IFthZGFwdGVyXSAtIE9wdGlvbmFsIGFkYXB0ZXIgaW5zdGFuY2UgdXNlZCB0byBleGVjdXRlIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoZSByZXBvc2l0b3J5XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG4gKiBpbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItZmFicmljXCI7XG4gKlxuICogY2xhc3MgVXNlciBleHRlbmRzIE1vZGVsIHsgaWQhOiBzdHJpbmc7IG5hbWUhOiBzdHJpbmc7IH1cbiAqIGNvbnN0IHJlcG8gPSBuZXcgRmFicmljQ2xpZW50UmVwb3NpdG9yeTxVc2VyPigpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgaWQ6IFwiMVwiLCBuYW1lOiBcIkFsaWNlXCIgfSkpO1xuICogY29uc3QgbG9hZGVkID0gYXdhaXQgcmVwby5yZWFkKFwiMVwiKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBSZXBvIGFzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5SZXBvOiBjcmVhdGVQcmVmaXgobW9kZWwsIC4uLmFyZ3MpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkLCBtb2RlbCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogcmVzdWx0XG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50UmVwb3NpdG9yeTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlciA9IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4+IGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBBPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBfb3ZlcnJpZGVzID0gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXJbXCJfb3ZlcnJpZGVzXCJdLCB7XG4gICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICBhbGxvd1Jhd1N0YXRlbWVudHM6IGZhbHNlLFxuICAgIGZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXM6IHRydWUsXG4gICAgZm9yY2VQcmVwYXJlQ29tcGxleFF1ZXJpZXM6IHRydWUsXG4gICAgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGU6IGZhbHNlLFxuICAgIHJlYnVpbGRXaXRoVHJhbnNpZW50OiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sIGZvcmNlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBjbGF6eiwgZm9yY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgb3ZlcnJpZGUoZmxhZ3M6IFBhcnRpYWw8RmxhZ3NPZjxDb250ZXh0T2Y8QT4+Pik6IHRoaXMge1xuICAgIHJldHVybiBzdXBlclxuICAgICAgLm92ZXJyaWRlKE9iamVjdC5hc3NpZ24oe30sIGZsYWdzLCB0aGlzLl9vdmVycmlkZXMpKVxuICAgICAgLmZvcihmbGFncyBhcyBhbnkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBzdXBlci5PYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHBhZ2luYXRlQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbixcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2luYXRlQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luYXRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggcGFnZSBzaXplICR7cmVmLmxpbWl0fWBcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnaW5hdGVCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgb3JkZXIsXG4gICAgICB7IGxpbWl0OiByZWYubGltaXQsIG9mZnNldDogcmVmLm9mZnNldCwgYm9va21hcms6IHJlZi5ib29rbWFyayB9LFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBsaXN0QnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmxpc3RCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgbGlzdGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgJHtrZXkgYXMgc3RyaW5nfSAke29yZGVyfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmxpc3RCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgb3JkZXIsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICB2YWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZEJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIGFsbCAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZEJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kT25lQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmZpbmRPbmVCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBPbmUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggJHtrZXkgYXMgc3RyaW5nfSAke3ZhbHVlfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmZpbmRPbmVCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZChcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmZpbmQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5IGRlZmF1bHQgcXVlcnkgYXR0cmlidXRlc2BcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmZpbmQubmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgb3JkZXIsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcGFnZShcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIGRpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdlKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5IGRlZmF1bHQgcXVlcnkgYXR0cmlidXRlc2BcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2UubmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgcmVmLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHN0YXRlbWVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQZXJzaXN0ZW5jZUtleXMuU1RBVEVNRU5ULCB0cnVlKVxuICAgICkuZm9yKHRoaXMuc3RhdGVtZW50KTtcbiAgICBsb2cudmVyYm9zZShgRXhlY3V0aW5nIHByZXBhcmVkIHN0YXRlbWVudCAke25hbWV9YCk7XG4gICAgY29uc3QgY2FsbEFyZ3MgPSBjdHhBcmdzLnNsaWNlKDAsIC0xKTtcbiAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKFxuICAgICAgdGhpcy5hZGFwdGVyLmRlY29kZShcbiAgICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgY3R4LFxuICAgICAgICAgIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsXG4gICAgICAgICAgW25hbWUsIEpTT04uc3RyaW5naWZ5KGNhbGxBcmdzKV0sXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB0aGlzLmNsYXNzLm5hbWVcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgaHlkcmF0ZWQ6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gKG5ldyB0aGlzLmNsYXNzKHIpIGFzIE0pXG4gICAgICAgICAgOiByXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICApIHtcbiAgICAgIGh5ZHJhdGVkID0gbmV3IHRoaXMuY2xhc3MocmVzdWx0KSBhcyBNO1xuICAgIH0gZWxzZSBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UocmVzdWx0KSkge1xuICAgICAgaHlkcmF0ZWQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGQ6IGFueSkgPT4gbmV3IHRoaXMuY2xhc3MoZCkgYXMgTSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHlkcmF0ZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlBZnRlclJlYWQoaHlkcmF0ZWQsIGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGx5QWZ0ZXJSZWFkKHZhbHVlOiBhbnksIGN0eDogQ29udGV4dE9mPEE+KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIFJlcG9zaXRvcnk8TSwgQT4sIGFueT4oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGN0eCxcbiAgICAgICAgdmFsdWUgYXMgTSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZhbHVlLm1hcCgoZW50cnkpID0+IHRoaXMuYXBwbHlBZnRlclJlYWQoZW50cnksIGN0eCkpKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKEZhYnJpY0NsaWVudFBhZ2luYXRvci5pc1NlcmlhbGl6ZWRQYWdlKHZhbHVlKSkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUFmdGVyUmVhZCh2YWx1ZS5kYXRhLCBjdHgpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudE9mKFxuICAgIGtleT86IGtleW9mIE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+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+KS5nZXQoXCJmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzXCIpXG4gICAgKSB7XG4gICAgICBjb25zdCBzcXVhc2hlZCA9IHRoaXMuc3F1YXNoKGN0eCBhcyBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPik7XG4gICAgICBpZiAoc3F1YXNoZWQpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlZCA9IHNxdWFzaGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJnczogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdO1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge30gYXMgYW55O1xuXG4gICAgY29uc3QgcHJlcGFyZWQ6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gPSB7XG4gICAgICBjbGFzczogdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBhcmdzLFxuICAgICAgcGFyYW1zLFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgbWV0aG9kOiBzdHJpbmdbXSA9IFtRdWVyeUNsYXVzZS5GSU5EX0JZXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnByZXBhcmVDb25kaXRpb24odGhpcy53aGVyZUNvbmRpdGlvbiwgY3R4IGFzIG5ldmVyKTtcbiAgICAgIG1ldGhvZC5wdXNoKHBhcnNlZC5tZXRob2QpO1xuICAgICAgaWYgKHBhcnNlZC5hcmdzICYmIHBhcnNlZC5hcmdzLmxlbmd0aClcbiAgICAgICAgYXJncy5wdXNoKC4uLihwYXJzZWQuYXJncyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgbWV0aG9kLnB1c2goXG4gICAgICAgIFF1ZXJ5Q2xhdXNlLlNFTEVDVCxcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5qb2luKGAgJHtRdWVyeUNsYXVzZS5BTkQudG9Mb3dlckNhc2UoKX0gYClcbiAgICAgICk7XG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBtZXRob2QucHVzaChRdWVyeUNsYXVzZS5PUkRFUl9CWSwgdGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzBdIGFzIHN0cmluZyk7XG4gICAgICBhcmdzLnB1c2godGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzFdIGFzIGFueSk7XG4gICAgfVxuICAgIHByZXBhcmVkLm1ldGhvZCA9IHRvQ2FtZWxDYXNlKG1ldGhvZC5qb2luKFwiIFwiKSk7XG4gICAgcHJlcGFyZWQucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMucHJlcGFyZWQgPSBwcmVwYXJlZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgcmVjb3JkIGZyb20gQ291Y2hEQi9GYWJyaWNcbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgdGhlIElEIGZyb20gYSBDb3VjaERCIGRvY3VtZW50IGFuZCByZXZlcnRzIGl0IHRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcm9jZXNzUmVjb3JkKFxuICAgIHJlY29yZDogYW55LFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogTSB7XG4gICAgY29uc3QgcGtBdHRyID0gTW9kZWwucGsodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS5nZXQoXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuSUQsIHBrQXR0ciBhcyBzdHJpbmcpXG4gICAgKT8udHlwZTtcblxuICAgIGlmIChyZWNvcmRbQ291Y2hEQktleXMuSURdKSB7XG4gICAgICBjb25zdCBbLCAuLi5rZXlBcmdzXSA9IHJlY29yZFtDb3VjaERCS2V5cy5JRF0uc3BsaXQoQ291Y2hEQktleXMuU0VQQVJBVE9SKTtcbiAgICAgIGNvbnN0IGlkID0ga2V5QXJncy5qb2luKFwiX1wiKTtcbiAgICAgIHJlY29yZFtwa0F0dHJdID0gU2VxdWVuY2UucGFyc2VWYWx1ZSh0eXBlIGFzIGFueSwgaWQpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5wcm9jZXNzUmVjb3JkKHJlY29yZCwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnlcbiAgICogQHN1bW1hcnkgU2VuZHMgYSByYXcgTWFuZ28gcXVlcnkgdG8gRmFicmljIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0b3IgPSAocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlSW5mbztcbiAgICBpZiAoKHJhd0lucHV0IGFzIGFueSk/LmFnZ3JlZ2F0ZSAmJiBhZ2dyZWdhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQWdncmVnYXRlPFI+KGFnZ3JlZ2F0b3IsIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyhcbiAgICAgIHJhd0lucHV0LFxuICAgICAgdHJ1ZSxcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgY3R4XG4gICAgKTtcblxuICAgIGlmICghdGhpcy5zZWxlY3RTZWxlY3Rvcikge1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gcmVzdWx0cy5tYXAoKHIpID0+IHRoaXMucHJvY2Vzc1JlY29yZChyLCBjdHgpKTtcbiAgICAgIGlmICghY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZ0ZXJRdWVyeUhhbmRsZXJzXCIpKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWQgYXMgdW5rbm93biBhcyBSO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFwcGx5QWZ0ZXJIYW5kbGVyc1RvUmVzdWx0KHByb2Nlc3NlZCwgY3R4KSkgYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHMgYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBmcm9tIHRoZSBzdGF0ZW1lbnRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZCgpOiBNYW5nb1F1ZXJ5IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5idWlsZCk7XG4gICAgY29uc3QgYWdncmVnYXRlUXVlcnkgPSB0aGlzLmJ1aWxkQWdncmVnYXRlUXVlcnkoKTtcbiAgICBpZiAoYWdncmVnYXRlUXVlcnkpIHJldHVybiBhZ2dyZWdhdGVRdWVyeTtcbiAgICBjb25zdCBzZWxlY3RvcnM6IE1hbmdvU2VsZWN0b3IgPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgcXVlcnk6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiBzZWxlY3RvcnMgfTtcbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcikgcXVlcnkuZmllbGRzID0gdGhpcy5zZWxlY3RTZWxlY3RvciBhcyBzdHJpbmdbXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBjb25kaXRpb246IE1hbmdvU2VsZWN0b3IgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBDb25kaXRpb24uYW5kKFxuICAgICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgICAgQ29uZGl0aW9uLmF0dHJpYnV0ZTxNPihDb3VjaERCS2V5cy5UQUJMRSBhcyBrZXlvZiBNKS5lcShcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW0NvdWNoREJLZXlzLlRBQkxFXVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IHNlbGVjdG9yS2V5cyA9IE9iamVjdC5rZXlzKGNvbmRpdGlvbikgYXMgTWFuZ29PcGVyYXRvcltdO1xuICAgICAgaWYgKFxuICAgICAgICBzZWxlY3RvcktleXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIE9iamVjdC52YWx1ZXMoQ291Y2hEQkdyb3VwT3BlcmF0b3IpLmluZGV4T2Yoc2VsZWN0b3JLZXlzWzBdKSAhPT0gLTFcbiAgICAgIClcbiAgICAgICAgc3dpdGNoIChzZWxlY3RvcktleXNbMF0pIHtcbiAgICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICAuLi5PYmplY3QudmFsdWVzKFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdIGFzIE1hbmdvU2VsZWN0b3JcbiAgICAgICAgICAgICAgKS5yZWR1Y2UoKGFjY3VtOiBNYW5nb1NlbGVjdG9yW10sIHZhbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIlRvbyBtYW55IGtleXMgaW4gcXVlcnkgc2VsZWN0b3IuIHNob3VsZCBiZSBvbmVcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0ga2V5c1swXTtcbiAgICAgICAgICAgICAgICBpZiAoayA9PT0gQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EKVxuICAgICAgICAgICAgICAgICAgYWNjdW0ucHVzaCguLi4odmFsW2tdIGFzIGFueVtdKSk7XG4gICAgICAgICAgICAgICAgZWxzZSBhY2N1bS5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgICAgICB9LCBbXSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBjb25kaXRpb247XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLk9SOiB7XG4gICAgICAgICAgICBjb25zdCBzOiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICBzW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMocXVlcnkuc2VsZWN0b3IpLm1hcCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbikuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmIChxdWVyeS5zZWxlY3RvcltrZXldKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBBICR7a2V5fSBxdWVyeSBwYXJhbSBpcyBhYm91dCB0byBiZSBvdmVycmlkZGVuOiAke3F1ZXJ5LnNlbGVjdG9yW2tleV19IGJ5ICR7dmFsfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jba2V5XSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBxdWVyeS5zb3J0ID0gcXVlcnkuc29ydCB8fCBbXTtcbiAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcXVlcnkuc2VsZWN0b3IgfHwgKHt9IGFzIE1hbmdvU2VsZWN0b3IpO1xuICAgICAgZm9yIChjb25zdCBbc2VsZWN0b3JLZXksIGRpcmVjdGlvbl0gb2YgdGhpcy5vcmRlckJ5U2VsZWN0b3JzKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gc2VsZWN0b3JLZXkgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCByZWM6IFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPiA9IHt9O1xuICAgICAgICByZWNbc2VsZWN0b3JdID0gZGlyZWN0aW9uIGFzIE9yZGVyRGlyZWN0aW9uO1xuICAgICAgICAocXVlcnkuc29ydCBhcyBSZWNvcmQ8c3RyaW5nLCBPcmRlckRpcmVjdGlvbj5bXSkucHVzaChyZWMpO1xuICAgICAgICBpZiAoIXF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSkge1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAgICAgKHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSXSA9XG4gICAgICAgICAgICBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGltaXRTZWxlY3Rvcikge1xuICAgICAgcXVlcnkubGltaXQgPSB0aGlzLmxpbWl0U2VsZWN0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKFxuICAgICAgICBgTm8gbGltaXQgc2VsZWN0b3IgZGVmaW5lZC4gVXNpbmcgZGVmYXVsdCBjb3VjaGRiIGxpbWl0IG9mICR7Q291Y2hEQlF1ZXJ5TGltaXR9YFxuICAgICAgKTtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gQ291Y2hEQlF1ZXJ5TGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub2Zmc2V0U2VsZWN0b3IpIHF1ZXJ5LnNraXAgPSB0aGlzLm9mZnNldFNlbGVjdG9yO1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb25kaXRpb24gaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBDb25kaXRpb24gb2JqZWN0IGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogTWFuZ29RdWVyeSB7XG4gICAgZnVuY3Rpb24gbWVyZ2UoXG4gICAgICBvcDogTWFuZ29PcGVyYXRvcixcbiAgICAgIG9iajE6IE1hbmdvU2VsZWN0b3IsXG4gICAgICBvYmoyOiBNYW5nb1NlbGVjdG9yXG4gICAgKTogTWFuZ29RdWVyeSB7XG4gICAgICBjb25zdCByZXN1bHQ6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiB7fSBhcyBNYW5nb1NlbGVjdG9yIH07XG4gICAgICByZXN1bHQuc2VsZWN0b3Jbb3BdID0gW29iajEsIG9iajJdO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPjtcbiAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgfTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuU1RBUlRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiU1RBUlRTX1dJVEggcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICBpZiAodHlwZW9mIGNvbXBhcmlzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiU1RBUlRTX1dJVEggcmVxdWlyZXMgYSBzdHJpbmcgY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IHJhbmdlID0gcHJlZml4UmFuZ2UoY29tcGFyaXNvbik7XG4gICAgICBjb25zdCBzZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvclthdHRyMV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKHNlbGVjdG9yW2F0dHIxXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSX0VRXSA9IHJhbmdlLnN0YXJ0O1xuICAgICAgKHNlbGVjdG9yW2F0dHIxXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuU01BTExFUl0gPSByYW5nZS5lbmQ7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciB9O1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuRU5EU19XSVRIKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIxICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJFTkRTX1dJVEggcmVxdWlyZXMgYSBzdHJpbmcgY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHtcbiAgICAgICAgW0NvdWNoREJPcGVyYXRvci5SRUdFWFBdOiBgJHtlc2NhcGVSZWdFeHAoY29tcGFyaXNvbil9JGAsXG4gICAgICB9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciB9O1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuQkVUV0VFTikge1xuICAgICAgY29uc3QgYXR0ciA9IGF0dHIxIGFzIHN0cmluZztcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb21wYXJpc29uKSB8fCBjb21wYXJpc29uLmxlbmd0aCAhPT0gMilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJCRVRXRUVOIG9wZXJhdG9yIHJlcXVpcmVzIFttaW4sIG1heF0gY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb21wYXJpc29uO1xuICAgICAgY29uc3Qgb3BCZXR3ZWVuOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wQmV0d2VlblthdHRyXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BCZXR3ZWVuW2F0dHJdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuQklHR0VSX0VRKVxuICAgICAgXSA9IG1pbjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5TTUFMTEVSX0VRKVxuICAgICAgXSA9IG1heDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcEJldHdlZW4gfTtcbiAgICB9XG5cbiAgICBsZXQgb3A6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgIGlmIChcbiAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICApID09PSAtMVxuICAgICkge1xuICAgICAgb3BbYXR0cjEgYXMgc3RyaW5nXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbYXR0cjEgYXMgc3RyaW5nXSBhcyBNYW5nb1NlbGVjdG9yKVt0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpXSA9XG4gICAgICAgIGNvbXBhcmlzb247XG4gICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICBvcCA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvciBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIChhdHRyMSBhcyB1bmtub3duIGFzIHsgYXR0cjE6IHN0cmluZyB9KS5hdHRyMVxuICAgICAgXSA9IGNvbXBhcmlzb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wMTogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgb3AyOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvcjtcbiAgICAgIG9wID0gbWVyZ2UodHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKSwgb3AxLCBvcDIpLnNlbGVjdG9yO1xuICAgIH1cblxuICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYW4gYWdncmVnYXRlIHF1ZXJ5IGlmIGFnZ3JlZ2F0aW9uIGlzIHJlcXVlc3RlZFxuICAgKiBAc3VtbWFyeSBDaGVja3MgZm9yIGFnZ3JlZ2F0ZSBvcGVyYXRpb25zIGFuZCByZXR1cm5zIGEgc3BlY2lhbCBNYW5nb1F1ZXJ5IGZvciB0aGVtXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQWdncmVnYXRlUXVlcnkoKTogTWFuZ29RdWVyeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5hdmdTZWxlY3Rvcikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gU3RyaW5nKHRoaXMuYXZnU2VsZWN0b3IpO1xuICAgICAgY29uc3Qgc3VtSW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcInN1bVwiLCBhdHRyaWJ1dGUpO1xuICAgICAgY29uc3QgY291bnRJbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwiY291bnRcIiwgYXR0cmlidXRlKTtcbiAgICAgIGlmICghc3VtSW5mbyB8fCAhY291bnRJbmZvKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICBgQXZnIG9wZXJhdGlvbiByZXF1aXJlcyBzdW0gYW5kIGNvdW50IHZpZXdzIGZvciBhdHRyaWJ1dGUgJHthdHRyaWJ1dGV9YFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoe1xuICAgICAgICBraW5kOiBcImF2Z1wiLFxuICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgIHN1bURlc2NyaXB0b3I6IHN1bUluZm8uZGVzY3JpcHRvcixcbiAgICAgICAgY291bnREZXNjcmlwdG9yOiBjb3VudEluZm8uZGVzY3JpcHRvcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9XG4gICAgICAgIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yID09IG51bGxcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogU3RyaW5nKHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yKTtcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJkaXN0aW5jdFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgaW5mby5jb3VudERpc3RpbmN0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRvclVzZWQgPVxuICAgICAgdHlwZW9mIHRoaXMuY291bnRTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgdHlwZW9mIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAhIXRoaXMubWluU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5tYXhTZWxlY3RvciB8fFxuICAgICAgISF0aGlzLnN1bVNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuZGlzdGluY3RTZWxlY3RvcjtcblxuICAgIGNvbnN0IGFnZ3JlZ2F0b3JDaGVja3M6IEFycmF5PFtWaWV3S2luZCwgU2VsZWN0U2VsZWN0b3I8TT4gfCB1bmRlZmluZWRdPiA9IFtcbiAgICAgIFtcbiAgICAgICAgXCJjb3VudFwiLFxuICAgICAgICAodGhpcy5jb3VudFNlbGVjdG9yID8/IHVuZGVmaW5lZCkgYXMgU2VsZWN0U2VsZWN0b3I8TT4gfCB1bmRlZmluZWQsXG4gICAgICBdLFxuICAgICAgW1wibWF4XCIsIHRoaXMubWF4U2VsZWN0b3JdLFxuICAgICAgW1wibWluXCIsIHRoaXMubWluU2VsZWN0b3JdLFxuICAgICAgW1wic3VtXCIsIHRoaXMuc3VtU2VsZWN0b3JdLFxuICAgICAgW1wiZGlzdGluY3RcIiwgdGhpcy5kaXN0aW5jdFNlbGVjdG9yXSxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBba2luZCwgc2VsZWN0b3JdIG9mIGFnZ3JlZ2F0b3JDaGVja3MpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHNlbGVjdG9yID8gU3RyaW5nKHNlbGVjdG9yKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3Ioa2luZCwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChpbmZvKSByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICB9XG5cbiAgICBpZiAoYWdncmVnYXRvclVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBgTm8gQ291Y2hEQiB2aWV3IG1ldGFkYXRhIGZvdW5kIGZvciB0YWJsZSAke01vZGVsLnRhYmxlTmFtZShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgICApfSBhZ2dyZWdhdG9yYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBhZ2dyZWdhdGUgZGVzY3JpcHRvciBmb3IgYSB2aWV3LWJhc2VkIGFnZ3JlZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXG4gICAga2luZDogVmlld0tpbmQsXG4gICAgYXR0cmlidXRlPzogc3RyaW5nXG4gICk6IEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhcyA9IGZpbmRWaWV3TWV0YWRhdGEodGhpcy5mcm9tU2VsZWN0b3IsIGtpbmQsIGF0dHJpYnV0ZSk7XG4gICAgaWYgKCFtZXRhcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YSA9IG1ldGFzWzBdO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3Qgdmlld05hbWUgPSBnZW5lcmF0ZVZpZXdOYW1lKHRhYmxlTmFtZSwgbWV0YS5hdHRyaWJ1dGUsIGtpbmQsIG1ldGEpO1xuICAgIGNvbnN0IGRkb2MgPSBtZXRhLmRkb2MgfHwgZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lKHRhYmxlTmFtZSwgdmlld05hbWUpO1xuICAgIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICByZWR1Y2U6IG1ldGEucmVkdWNlICE9PSB1bmRlZmluZWQgPyB0cnVlIDogIW1ldGEucmV0dXJuRG9jcyxcbiAgICB9O1xuICAgIGlmIChraW5kID09PSBcImRpc3RpbmN0XCIgfHwga2luZCA9PT0gXCJncm91cEJ5XCIpIG9wdGlvbnMuZ3JvdXAgPSB0cnVlO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kLFxuICAgICAgbWV0YSxcbiAgICAgIGRlc2NyaXB0b3I6IHtcbiAgICAgICAgZGRvYyxcbiAgICAgICAgdmlldzogdmlld05hbWUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIHNwZWNpYWwgYWdncmVnYXRlIE1hbmdvUXVlcnkgbWFya2VyXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogTWFuZ29RdWVyeSAmIHsgYWdncmVnYXRlOiB0cnVlOyBhZ2dyZWdhdGVJbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3Rvcjoge30sXG4gICAgICBhZ2dyZWdhdGU6IHRydWUsXG4gICAgICBhZ2dyZWdhdGVJbmZvOiBpbmZvLFxuICAgIH0gYXMgTWFuZ29RdWVyeSAmIHsgYWdncmVnYXRlOiB0cnVlOyBhZ2dyZWdhdGVJbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIgY2FzdCB0byBGYWJyaWNDbGllbnRBZGFwdGVyIGZvciB2aWV3IGFjY2Vzc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRGYWJyaWNBZGFwdGVyKCk6IEZhYnJpY0NsaWVudEFkYXB0ZXIge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIgYXMgRmFicmljQ2xpZW50QWRhcHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYW4gYWdncmVnYXRlIHF1ZXJ5IHZpYSBhZGFwdGVyJ3MgdmlldyBtZXRob2RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUFnZ3JlZ2F0ZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgaWYgKCF0aGlzLmlzVmlld0FnZ3JlZ2F0ZShpbmZvKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXZlcmFnZTxSPihpbmZvLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCBmYWJyaWNBZGFwdGVyID0gdGhpcy5nZXRGYWJyaWNBZGFwdGVyKCk7XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci5kZG9jLFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci52aWV3LFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci5vcHRpb25zLFxuICAgICAgY3R4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVmlld1Jlc3BvbnNlPFI+KGluZm8sIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhdmVyYWdlIGNhbGN1bGF0aW9uIGZyb20gc3VtIGFuZCBjb3VudCB2aWV3c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVBdmVyYWdlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoaW5mby5raW5kICE9PSBcImF2Z1wiKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJBdmVyYWdlIGRlc2NyaXB0b3IgaXMgbm90IHZhbGlkXCIpO1xuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCBbc3VtRGVzYywgY291bnREZXNjXSA9IFtpbmZvLnN1bURlc2NyaXB0b3IsIGluZm8uY291bnREZXNjcmlwdG9yXTtcbiAgICBjb25zdCBbc3VtUmVzcG9uc2UsIGNvdW50UmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIHN1bURlc2MuZGRvYyxcbiAgICAgICAgc3VtRGVzYy52aWV3LFxuICAgICAgICBzdW1EZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICAgIGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgICBjb3VudERlc2MuZGRvYyxcbiAgICAgICAgY291bnREZXNjLnZpZXcsXG4gICAgICAgIGNvdW50RGVzYy5vcHRpb25zLFxuICAgICAgICBjdHhcbiAgICAgICksXG4gICAgXSk7XG4gICAgY29uc3Qgc3VtID0gc3VtUmVzcG9uc2Uucm93cz8uWzBdPy52YWx1ZSA/PyAwO1xuICAgIGNvbnN0IGNvdW50ID0gY291bnRSZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgaWYgKCFjb3VudCkgcmV0dXJuIDAgYXMgdW5rbm93biBhcyBSO1xuICAgIHJldHVybiAoc3VtIC8gY291bnQpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHRoZSB2aWV3IHJlc3BvbnNlIGJhc2VkIG9uIGFnZ3JlZ2F0ZSBraW5kXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICByZXNwb25zZTogVmlld1Jlc3BvbnNlXG4gICk6IFIge1xuICAgIGlmIChpbmZvLmtpbmQgPT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgXCJBdmVyYWdlIHJlc3VsdHMgc2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIHByb2Nlc3Npbmcgcm93c1wiXG4gICAgICApO1xuICAgIGNvbnN0IHJvd3MgPSByZXNwb25zZS5yb3dzIHx8IFtdO1xuICAgIGNvbnN0IHZpZXdJbmZvID0gaW5mbyBhcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT47XG4gICAgY29uc3QgbWV0YSA9IHZpZXdJbmZvLm1ldGE7XG4gICAgaWYgKHZpZXdJbmZvLmNvdW50RGlzdGluY3QpIHtcbiAgICAgIHJldHVybiAocm93cy5sZW5ndGggfHwgMCkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAodmlld0luZm8ua2luZCA9PT0gXCJkaXN0aW5jdFwiIHx8IHZpZXdJbmZvLmtpbmQgPT09IFwiZ3JvdXBCeVwiKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LmtleSA/PyByb3cudmFsdWUpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKG1ldGEucmV0dXJuRG9jcykge1xuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy52YWx1ZSA/PyByb3cuZG9jID8/IHJvdykgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAoIXJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gKHZpZXdJbmZvLmtpbmQgPT09IFwiY291bnRcIiA/IDAgOiBudWxsKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIHJldHVybiAocm93c1swXS52YWx1ZSA/PyByb3dzWzBdLmtleSA/PyBudWxsKSBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgaW5mbyBpcyBhIHZpZXctYmFzZWQgYWdncmVnYXRlXG4gICAqL1xuICBwcml2YXRlIGlzVmlld0FnZ3JlZ2F0ZShcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvXG4gICk6IGluZm8gaXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHtcbiAgICByZXR1cm4gaW5mby5raW5kICE9PSBcImF2Z1wiO1xuICB9XG59XG4iLCJpbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgdHlwZSBNYW5nb1F1ZXJ5LFxuICB0eXBlIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCAqIGFzIGdycGMgZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7XG4gIE1vZGVsLFxuICB0eXBlIE1vZGVsQ29uc3RydWN0b3IsXG4gIHR5cGUgU2VyaWFsaXplcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVidWcsIGZpbmFsLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICB0eXBlIFBlZXJDb25maWcsXG4gIHR5cGUgU2VncmVnYXRlZE1vZGVsLFxuICB0eXBlIE1zcERldGFpbHMsXG59IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNvbm5lY3QsXG4gIHR5cGUgQ29ubmVjdE9wdGlvbnMsXG4gIEdhdGV3YXksXG4gIE5ldHdvcmssXG4gIFByb3Bvc2FsT3B0aW9ucyxcbiAgQ29udHJhY3QgYXMgQ29udHJha3QsXG4gIHR5cGUgU2lnbmVyLFxuICBHYXRld2F5RXJyb3IsXG4gIEVuZG9yc2VFcnJvcixcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgR2F0ZXdheSBhcyBMZWdhY3lHYXRld2F5LCBXYWxsZXRzIH0gZnJvbSBcImZhYnJpYy1uZXR3b3JrXCI7XG5pbXBvcnQgdHlwZSB7IEVuZG9yc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7XG4gIGdldElkZW50aXR5LFxuICBnZXRTaWduZXIsXG4gIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50LFxuICByZWFkRmlsZSBhcyByZWFkRnNGaWxlLFxufSBmcm9tIFwiLi9mYWJyaWMtZnNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgdHlwZSBQcmltYXJ5S2V5VHlwZSxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIEFkYXB0ZXIsXG4gIHR5cGUgQWRhcHRlckZsYWdzLFxuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE1pZ3JhdGlvbkVycm9yLFxuICBPYnNlcnZlckVycm9yLFxuICBQYWdpbmdFcnJvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBRdWVyeUVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBTdGF0ZW1lbnQsXG4gIHR5cGUgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFBhZ2luYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBDb250ZXh0dWFsQXJncyxcbiAgdHlwZSBQcmVwYXJlZE1vZGVsLFxuICBBbGxPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0ZsYXZvdXIgfSBmcm9tIFwiLi4vc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2xpZW50U2VyaWFsaXplciB9IGZyb20gXCIuLi9zaGFyZWQvQ2xpZW50U2VyaWFsaXplclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RGlzcGF0Y2ggfSBmcm9tIFwiLi9GYWJyaWNDbGllbnREaXNwYXRjaFwiO1xuLy8gaW1wb3J0IHsgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbSB9IGZyb20gXCIuL2ZhYnJpYy1oc21cIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFN0YXRlbWVudCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFN0YXRlbWVudFwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50UGFnaW5hdG9yIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgRW5kb3JzZW1lbnRFcnJvcixcbiAgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcixcbiAgTXZjY1JlYWRDb25mbGljdEVycm9yLFxuICBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IsXG4gIFRyYW5zYWN0aW9uVGltZW91dEVycm9yLFxufSBmcm9tIFwiLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuL2NyeXB0b1wiO1xuaW1wb3J0IHsgZXh0cmFjdElkcyB9IGZyb20gXCIuL2lkcy9pZC1leHRyYWN0aW9uXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi9zaGFyZWQvaW5kZXhcIjtcblxudHlwZSBMZWdhY3lQZWVyVGFyZ2V0ID0ge1xuICBtc3BJZDogc3RyaW5nO1xuICBwZWVyRW5kcG9pbnQ6IHN0cmluZztcbiAgcGVlckhvc3RBbGlhcz86IHN0cmluZztcbiAgdGxzQ2VydD86IHN0cmluZyB8IEJ1ZmZlcjtcbn07XG5cbnR5cGUgTGVnYWN5UGVlcldpdGhOYW1lID0gTGVnYWN5UGVlclRhcmdldCAmIHsgbmFtZTogc3RyaW5nIH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzXG4gKiBAc3VtbWFyeSBUaGUgRmFicmljQWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyIHRvIHByb3ZpZGUgYSBzZWFtbGVzcyBpbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzLlxuICogSXQgaGFuZGxlcyBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIHRyYW5zYWN0aW9uIHN1Ym1pc3Npb24sIGFuZCBDUlVEIG9wZXJhdGlvbnMgYWdhaW5zdCBGYWJyaWMgY2hhaW5jb2RlLlxuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHRlbXBsYXRlIEZhYnJpY0ZsYWdzIC0gRmxhZ3Mgc3BlY2lmaWMgdG8gRmFicmljIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBDb250ZXh0PEZhYnJpY0ZsYWdzPiAtIENvbnRleHQgdHlwZSBjb250YWluaW5nIEZhYnJpYy1zcGVjaWZpYyBmbGFnc1xuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGFsaWFzIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gKiBjb25zdCBjb25maWc6IFBlZXJDb25maWcgPSB7XG4gKiAgIG1zcElkOiAnT3JnMU1TUCcsXG4gKiAgIHBlZXJFbmRwb2ludDogJ2xvY2FsaG9zdDo3MDUxJyxcbiAqICAgY2hhbm5lbE5hbWU6ICdteWNoYW5uZWwnLFxuICogICBjaGFpbmNvZGVOYW1lOiAnbXljYycsXG4gKiAgIGNvbnRyYWN0TmFtZTogJ215Y29udHJhY3QnLFxuICogICB0bHNDZXJ0UGF0aDogJy9wYXRoL3RvL3Rscy9jZXJ0JyxcbiAqICAgY2VydERpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9jZXJ0L2RpcicsXG4gKiAgIGtleURpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9rZXkvZGlyJ1xuICogfTtcbiAqXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IEZhYnJpY0FkYXB0ZXIoY29uZmlnLCAnb3JnMS1hZGFwdGVyJyk7XG4gKlxuICogLy8gVXNlIHRoZSBhZGFwdGVyIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGFwdGVyLnJlYWQoJ3VzZXJzJywgJ3VzZXIxJywgbXlTZXJpYWxpemVyKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwsIHRyYW5zaWVudCwgc2VyaWFsaXplcilcbiAqICAgRmFicmljQWRhcHRlci0+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+IHtcbiAgICBpZiAodGhpcy5zaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eCkpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUFyZ3MgPSB0aGlzLnByZXBhcmVMZWdhY3lBcmdzKGFyZ3MpO1xuICAgICAgY29uc3QgdHJhbnNpZW50TWFwID0gdGhpcy5idWlsZExlZ2FjeVRyYW5zaWVudCh0cmFuc2llbnREYXRhKTtcbiAgICAgIGNvbnN0IHBlZXJDb25maWdzID0gdGhpcy5idWlsZExlZ2FjeVBlZXJDb25maWdzKGN0eCk7XG4gICAgICByZXR1cm4gdGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMoXG4gICAgICAgIGN0eCxcbiAgICAgICAgYXBpLFxuICAgICAgICBsZWdhY3lBcmdzLFxuICAgICAgICB0cmFuc2llbnRNYXAsXG4gICAgICAgIHBlZXJDb25maWdzLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgdHJ1ZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBsZWRnZXIgc3RhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIGV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgZmFsc2UsXG4gICAgICBhcmdzLFxuICAgICAgdHJhbnNpZW50RGF0YSxcbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMsXG4gICAgICBjbGFzc05hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTaHV0cyBkb3duIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDbG9zZXMgdGhlIGFjdGl2ZSBkaXNwYXRjaCAod2hpY2ggaW4gdHVybiBjbG9zZXMgYW55IGdhdGV3YXlcbiAgICogZXZlbnQgc3Vic2NyaXB0aW9uKSB2aWEgdGhlIGJhc2UgY2xhc3MsIHRoZW4gY2xvc2VzIHRoZSBnUlBDIGNsaWVudC5cbiAgICogV29ya3MgY29ycmVjdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgc3ludGhldGljRXZlbnRzYCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgY29ubmVjdGlvbnMgYXJlIGNsb3NlZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2h1dGRvd24oLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJhc2UgY2xhc3MgaGFuZGxlcyBkaXNwYXRjaC5jbG9zZSgpIGludGVybmFsbHkuXG4gICAgYXdhaXQgc3VwZXIuc2h1dGRvd24oLi4uYXJncyk7XG4gICAgaWYgKHRoaXMuY2xpZW50KSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBDbG9zaW5nICR7dGhpcy5jb25maWcubXNwSWR9IGdhdGV3YXkgY2xpZW50YCk7XG4gICAgICB0aGlzLmNsaWVudC5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZyb20gYSBHYXRld2F5XG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIGNoYWluY29kZSBjb250cmFjdCBmcm9tIHRoZSBzcGVjaWZpZWQgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7Q29udHJha3R9IFRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldENvbnRyYWN0KFxuICAgIGdhdGV3YXk6IEdhdGV3YXksXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNvbnRyYWN0TmFtZT86IHN0cmluZ1xuICApOiBDb250cmFrdCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q29udHJhY3QpO1xuICAgIGNvbnN0IG5ldHdvcmsgPSB0aGlzLmdldE5ldHdvcmsoZ2F0ZXdheSwgY29uZmlnLmNoYW5uZWwpO1xuICAgIGxldCBjb250cmFjdDogQ29udHJha3Q7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFJldHJpZXZpbmcgY2hhaW5jb2RlICR7Y29uZmlnLmNoYWluY29kZU5hbWV9IGNvbnRyYWN0ICR7Y29udHJhY3ROYW1lIHx8IGNvbmZpZy5jb250cmFjdE5hbWV9IGZyb20gbmV0d29yayAke2NvbmZpZy5jaGFubmVsfWBcbiAgICAgICk7XG4gICAgICBjb250cmFjdE5hbWUgPSBjb250cmFjdE5hbWUgPyBjb250cmFjdE5hbWUgOiBjb25maWcuY29udHJhY3ROYW1lO1xuICAgICAgY29udHJhY3QgPSBuZXR3b3JrLmdldENvbnRyYWN0KGNvbmZpZy5jaGFpbmNvZGVOYW1lLCBjb250cmFjdE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3Q7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBOZXR3b3JrIGluc3RhbmNlIGZyb20gYSBHYXRld2F5XG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRvIGEgc3BlY2lmaWMgY2hhbm5lbCBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHBhcmFtIHtHYXRld2F5fSBnYXRld2F5IC0gVGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgKiBAcmV0dXJuIHtOZXR3b3JrfSBUaGUgTmV0d29yayBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldE5ldHdvcmsoZ2F0ZXdheTogR2F0ZXdheSwgY2hhbm5lbE5hbWU6IHN0cmluZyk6IE5ldHdvcmsge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0TmV0d29yayk7XG4gICAgbGV0IG5ldHdvcms6IE5ldHdvcms7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byBjaGFubmVsICR7Y2hhbm5lbE5hbWV9YCk7XG4gICAgICBuZXR3b3JrID0gZ2F0ZXdheS5nZXROZXR3b3JrKGNoYW5uZWxOYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV0d29yaztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHYXRld2F5IHVzaW5nIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBbY2xpZW50XSAtIE9wdGlvbmFsIGdSUEMgY2xpZW50LCB3aWxsIGJlIGNyZWF0ZWQgaWYgbm90IHByb3ZpZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0R2F0ZXdheShcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjbGllbnQ/OiBDbGllbnRcbiAgKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldENvbm5lY3Rpb24oXG4gICAgICBjbGllbnQgfHwgKGF3YWl0IHRoaXMuZ2V0Q2xpZW50KGNvbmZpZykpLFxuICAgICAgY29uZmlnLFxuICAgICAgY3R4XG4gICAgKSkgYXMgR2F0ZXdheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBjbGllbnQgd2l0aCBUTFMgY3JlZGVudGlhbHMgZm9yIHNlY3VyZSBjb21tdW5pY2F0aW9uXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDbGllbnR9IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgc3RhdGljIGdldENsaWVudChjb25maWc6IFBlZXJDb25maWcpOiBDbGllbnQge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENsaWVudCk7XG4gICAgbG9nLmRlYnVnKGBnZW5lcmF0aW5nIFRMUyBjcmVkZW50aWFscyBmb3IgbXNwICR7Y29uZmlnLm1zcElkfWApO1xuICAgIGxldCBwYXRoT3JDZXJ0OiBzdHJpbmcgfCBCdWZmZXIgPSBjb25maWcudGxzQ2VydCBhcyBzdHJpbmcgfCBCdWZmZXI7XG5cbiAgICBpZiAodHlwZW9mIHBhdGhPckNlcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcGF0aE9yQ2VydC5tYXRjaChcbiAgICAgICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcGF0aE9yQ2VydCA9IEJ1ZmZlci5mcm9tKHBhdGhPckNlcnQsIFwidXRmOFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGF0aE9yQ2VydCA9IEJ1ZmZlci5mcm9tKGZzLnJlYWRGaWxlU3luYyhwYXRoT3JDZXJ0LCBcInV0ZjhcIikpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgdGhlIHRscyBjZXJ0aWZpY2F0ZSBmcm9tICR7cGF0aE9yQ2VydH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRsc0NyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVTc2wocGF0aE9yQ2VydCk7XG4gICAgbG9nLmRlYnVnKGBnZW5lcmF0aW5nIEdhdGV3YXkgQ2xpZW50IGZvciB1cmwgJHtjb25maWcucGVlckVuZHBvaW50fWApO1xuICAgIHJldHVybiBuZXcgQ2xpZW50KGNvbmZpZy5wZWVyRW5kcG9pbnQsIHRsc0NyZWRlbnRpYWxzLCB7XG4gICAgICBcImdycGMubWF4X3JlY2VpdmVfbWVzc2FnZV9sZW5ndGhcIjogKGNvbmZpZy5zaXplTGltaXQgfHwgMTUpICogMTAyNCAqIDEwMjQsXG4gICAgICBcImdycGMubWF4X3NlbmRfbWVzc2FnZV9sZW5ndGhcIjogKGNvbmZpZy5zaXplTGltaXQgfHwgMTUpICogMTAyNCAqIDEwMjQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgY29ubmVjdGlvbiB3aXRoIGlkZW50aXR5IGFuZCBzaWduZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCAtIFRoZSBnUlBDIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbm5lY3RlZCBHYXRld2F5XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBJZGVudGl0eVxuICAgKiAgIHBhcnRpY2lwYW50IFNpZ25lclxuICAgKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAgICpcbiAgICogICBDYWxsZXItPj5GYWJyaWNBZGFwdGVyOiBnZXRDb25uZWN0aW9uKGNsaWVudCwgY29uZmlnKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5JZGVudGl0eTogZ2V0SWRlbnRpdHkobXNwSWQsIGNlcnREaXJlY3RvcnlQYXRoKVxuICAgKiAgIElkZW50aXR5LS0+PkZhYnJpY0FkYXB0ZXI6IGlkZW50aXR5XG4gICAqICAgRmFicmljQWRhcHRlci0+PlNpZ25lcjogZ2V0U2lnbmVyKGtleURpcmVjdG9yeVBhdGgpXG4gICAqICAgU2lnbmVyLS0+PkZhYnJpY0FkYXB0ZXI6IHNpZ25lclxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBDcmVhdGUgQ29ubmVjdE9wdGlvbnNcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdChvcHRpb25zKVxuICAgKiAgIEdhdGV3YXktLT4+RmFicmljQWRhcHRlcjogZ2F0ZXdheVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2FsbGVyOiBnYXRld2F5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q29ubmVjdGlvbihcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmdldENvbm5lY3Rpb24pO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIFBlZXIgSWRlbnRpdHkgZm9yICR7Y29uZmlnLm1zcElkfSB1bmRlciAke2NvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aH1gXG4gICAgKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IGdldElkZW50aXR5KFxuICAgICAgY29uZmlnLm1zcElkLFxuICAgICAgY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYHByZXBhcmluZyB0cmFuc2FjdGlvbiBzaWduZXIgZm9yICR7Q3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoaWRlbnRpdHkuY3JlZGVudGlhbHMudG9TdHJpbmcoKSl9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBleHRyYWN0IEZhYnJpYyBJRCBmcm9tIGNlcnRpZmljYXRlYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25lcjogU2lnbmVyO1xuICAgIGNvbnN0IGNsb3NlID0gKCkgPT4ge307XG4gICAgaWYgKCFjb25maWcuaHNtKSB7XG4gICAgICBzaWduZXIgPSBhd2FpdCBnZXRTaWduZXIoY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29uc3QgaHNtID0gbmV3IEhTTVNpZ25lckZhY3RvcnlDdXN0b20oY29uZmlnLmhzbS5saWJyYXJ5KTtcbiAgICAgIC8vIGNvbnN0IGlkZW50aWZpZXIgPSBoc20uZ2V0U0tJRnJvbUNlcnRpZmljYXRlUGF0aChcbiAgICAgIC8vICAgY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueVxuICAgICAgLy8gKTtcbiAgICAgIC8vIGNvbnN0IHBrY3MxMVNpZ25lciA9IGhzbS5uZXdTaWduZXIoe1xuICAgICAgLy8gICBsYWJlbDogY29uZmlnLmhzbS50b2tlbkxhYmVsIGFzIHN0cmluZyxcbiAgICAgIC8vICAgcGluOiBTdHJpbmcoY29uZmlnLmhzbS5waW4pIGFzIHN0cmluZyxcbiAgICAgIC8vICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIC8vICAgLy8gdXNlclR5cGU6IDEgLypDS1VfVVNFUiAqLyxcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gc2lnbmVyID0gcGtjczExU2lnbmVyLnNpZ25lcjtcbiAgICAgIC8vIGNsb3NlID0gcGtjczExU2lnbmVyLmNsb3NlO1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJIU00gTk9UIElNUExFTUVOVEVEXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBjbGllbnQsXG4gICAgICBpZGVudGl0eTogaWRlbnRpdHksXG4gICAgICBzaWduZXI6IHNpZ25lcixcbiAgICAgIC8vIERlZmF1bHQgdGltZW91dHMgZm9yIGRpZmZlcmVudCBnUlBDIGNhbGxzXG4gICAgICBldmFsdWF0ZU9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImV2YWx1YXRlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBlbmRvcnNlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZW5kb3JzZVRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gMTUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIHN1Ym1pdE9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcInN1Ym1pdFRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgY29tbWl0U3RhdHVzT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiY29tbWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxIG1pbnV0ZVxuICAgICAgfSxcbiAgICB9IGFzIENvbm5lY3RPcHRpb25zO1xuXG4gICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvICR7Y29uZmlnLm1zcElkfWApO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBjb25uZWN0KG9wdGlvbnMpO1xuXG4gICAgLy8gVE9ETzogcmVwbGFjZT9cbiAgICBpZiAoY29uZmlnLmhzbSkge1xuICAgICAgZ2F0ZXdheS5jbG9zZSA9IG5ldyBQcm94eShnYXRld2F5LmNsb3NlLCB7XG4gICAgICAgIGFwcGx5KHRhcmdldDogKCkgPT4gdm9pZCwgdGhpc0FyZzogYW55LCBhcmdBcnJheTogYW55W10pOiBhbnkge1xuICAgICAgICAgIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdBcnJheSk7XG4gICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBnYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNsaWVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBuZXcgRmFicmljQ2xpZW50RGlzcGF0Y2ggaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBGYWJyaWMgbmV0d29yay5cbiAgICogQHJldHVybnMge0Rpc3BhdGNofSBBIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSBjb25maWd1cmVkIGZvciB0aGUgRmFicmljIGNsaWVudC5cbiAgICogQHJlbWFya3MgVGhlIERpc3BhdGNoIGluc3RhbmNlIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGxvZ2ljIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBGYWJyaWMgbmV0d29yaywgc3VjaCBhcyBzdWJtaXR0aW5nIHRyYW5zYWN0aW9ucyBvciBxdWVyeWluZyBkYXRhLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBmYWJyaWNEaXNwYXRjaCA9IGZhYnJpY0NsaWVudEFkYXB0ZXIuRGlzcGF0Y2goKTtcbiAgICogZmFicmljRGlzcGF0Y2guc3VibWl0VHJhbnNhY3Rpb24oJ2NyZWF0ZVByb2R1Y3QnLCB7IG5hbWU6ICdQcm9kdWN0IEEnLCBwcmljZTogMTAwIH0pO1xuICAgKi9cbiAgb3ZlcnJpZGUgRGlzcGF0Y2goKTogRmFicmljQ2xpZW50RGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50QWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0odGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgaW50byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhbnkgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBCYXNlRXJyb3IgdXNpbmcgdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oXG4gICAgZXJyOiBFcnJvciB8IHN0cmluZyB8IEdhdGV3YXlFcnJvclxuICApOiBFIHtcbiAgICAvLyBpZiAoXG4gICAgLy8gICBNSVNTSU5HX1BSSVZBVEVfREFUQV9SRUdFWC50ZXN0KFxuICAgIC8vICAgICB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2VcbiAgICAvLyAgIClcbiAgICAvLyApXG4gICAgLy8gICByZXR1cm4gbmV3IFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzKGVycikgYXMgRTtcblxuICAgIGxldCBtc2cgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEdhdGV3YXlFcnJvciAmJiBlcnIuZGV0YWlscy5sZW5ndGggJiYgZXJyLmNvZGUgPT09IDEwKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXJyIGluc3RhbmNlb2YgRW5kb3JzZUVycm9yICYmXG4gICAgICBlcnIuZGV0YWlscy5sZW5ndGggJiZcbiAgICAgIGVyci5jb2RlID09PSAxMCAmJlxuICAgICAgZXJyLmRldGFpbHNbMF0ubWVzc2FnZT8uaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKVxuICAgICkge1xuICAgICAgbXNnID0gYCR7ZXJyLmRldGFpbHNbMF0ubWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJNVkNDX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IE12Y2NSZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiREVBRExJTkVfRVhDRUVERURcIikpXG4gICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uVGltZW91dEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJFTkRPUlNFTUVOVF9QT0xJQ1lfRkFJTFVSRVwiKSlcbiAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiUEhBTlRPTV9SRUFEX0NPTkZMSUNUXCIpKVxuICAgICAgcmV0dXJuIG5ldyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICBzd2l0Y2ggKChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICByZXR1cm4gbmV3IEVuZG9yc2VtZW50RXJyb3IoZXJyKSBhcyBFO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoVmFsaWRhdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTm90Rm91bmRFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbmZsaWN0RXJyb3IubmFtZSkpIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhCYWRSZXF1ZXN0RXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEJhZFJlcXVlc3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhRdWVyeUVycm9yLm5hbWUpKSByZXR1cm4gbmV3IFF1ZXJ5RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUGFnaW5nRXJyb3IubmFtZSkpIHJldHVybiBuZXcgUGFnaW5nRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhNaWdyYXRpb25FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBNaWdyYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhPYnNlcnZlckVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE9ic2VydmVyRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQXV0aG9yaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoRm9yYmlkZGVuRXJyb3IubmFtZSkpIHJldHVybiBuZXcgRm9yYmlkZGVuRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29ubmVjdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoU2VyaWFsaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIEU7XG4gIH1cbn1cblxuRmFicmljQ2xpZW50QWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoRmFicmljRmxhdm91cik7XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDb250ZXh0dWFsQXJncyxcbiAgRGlzcGF0Y2gsXG4gIEV2ZW50SWRzLFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBDb250ZXh0LFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQZWVyQ29uZmlnIH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlRXZlbnQsXG4gIENsb3NlYWJsZUFzeW5jSXRlcmFibGUsXG59IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IHBhcnNlRXZlbnROYW1lIH0gZnJvbSBcIi4uL3NoYXJlZC9ldmVudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXZlbnQgZGlzcGF0Y2hlciBmb3IgSHlwZXJsZWRnZXIgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGFuZCBwcm9jZXNzZXMgZXZlbnRzIGVtaXR0ZWQgYnkgRmFicmljIGNoYWluY29kZSwgZGlzcGF0Y2hpbmcgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICogQGNsYXNzIEZhYnJpY0NsaWVudERpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gKiBjb25zdCBjbGllbnQgPSBhd2FpdCBGYWJyaWNBZGFwdGVyLmdldENsaWVudChwZWVyQ29uZmlnKTtcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudCk7XG4gKlxuICogLy8gQ29uZmlndXJlIHRoZSBkaXNwYXRjaCB3aXRoIHBlZXIgY29uZmlndXJhdGlvblxuICogZGlzcGF0Y2guY29uZmlndXJlKHBlZXJDb25maWcpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGFuIG9ic2VydmVyIGZvciBhIHNwZWNpZmljIHRhYmxlIGFuZCBldmVudFxuICogZGlzcGF0Y2gub2JzZXJ2ZSgndXNlcnMnLCAnY3JlYXRlJywgKGlkKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBVc2VyIGNyZWF0ZWQ6ICR7aWR9YCk7XG4gKiB9KTtcbiAqXG4gKiAvLyBTdGFydCBsaXN0ZW5pbmcgZm9yIGV2ZW50c1xuICogYXdhaXQgZGlzcGF0Y2guc3RhcnQoKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICogICBwYXJ0aWNpcGFudCBOZXR3b3JrXG4gKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICpcbiAqICAgQ2xpZW50LT4+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/Lm5hbWUpO1xuICAgICAgICAgIGNvbnN0IG9ic2VydmVyQXJncyA9IHBheWxvYWQucmVzdWx0ID8gW3BheWxvYWQucmVzdWx0LCBjdHhdIDogW2N0eF07XG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICBtb2RlbFJlZiBhcyBDb25zdHJ1Y3RvciB8IHN0cmluZyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgcGF5bG9hZC5pZCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAuLi4ob2JzZXJ2ZXJBcmdzIGFzIENvbnRleHR1YWxBcmdzPGFueT4pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdXBkYXRlIG9ic2VydmFibGVzIGZvciB0YWJsZSAke3RhYmxlfSBldmVudCAke2V2ZW50fSBpZDogJHtwYXlsb2FkLmlkfTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBsb2cuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBldmVudCBmb3IgY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoY3R4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lclxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIGV2ZW50IGRpc3BhdGNoaW5nIGZvciB0aGUgb2JzZXJ2ZWQgYWRhcHRlci4gV2hlblxuICAgKiBgc3ludGhldGljRXZlbnRzYCBpcyB0cnVlICh0aGUgZGVmYXVsdCkgbm8gZ2F0ZXdheSBjb25uZWN0aW9uIGlzIG9wZW5lZDtcbiAgICogaW5zdGVhZCBldmVyeSBDUlVEIG9wZXJhdGlvbiBpcyB3cmFwcGVkIHdpdGggYSBQcm94eSB0aGF0IGZpcmVzXG4gICAqIGB1cGRhdGVPYnNlcnZlcnNgIGZvciAqKmFsbCoqIG1vZGVscy4gV2hlbiBgc3ludGhldGljRXZlbnRzYCBpcyBmYWxzZSB0aGVcbiAgICogZXhpc3RpbmcgZ2F0ZXdheS1iYXNlZCBjaGFpbmNvZGUtZXZlbnQgc3Vic2NyaXB0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCB0aGVcbiAgICogbG9jYWwgUHJveHkgZmFsbGJhY2sgaXMgbGltaXRlZCB0byBmdWxseS1zZWdyZWdhdGVkICh0cmFuc2llbnQpIG1vZGVscyBvbmx5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvciBjb25maWcgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG5cbiAgICBjb25zdCBzeW50aGV0aWNFdmVudHMgPSB0aGlzLmFkYXB0ZXIuY29uZmlnLnN5bnRoZXRpY0V2ZW50cyAhPT0gZmFsc2U7XG5cbiAgICBpZiAoIXN5bnRoZXRpY0V2ZW50cykge1xuICAgICAgLy8gR2F0ZXdheS1iYXNlZCBjaGFpbmNvZGUtZXZlbnQgc3Vic2NyaXB0aW9uIChub24tc3ludGhldGljIHBhdGgpXG4gICAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIFwiZGlzcGF0Y2hcIixcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgTW9kZWwgYXMgYW55XG4gICAgICApO1xuICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5pbml0aWFsaXplKTtcbiAgICAgIGNvbnN0IGdhdGV3YXkgPSBhd2FpdCBGYWJyaWNDbGllbnRBZGFwdGVyLmdldEdhdGV3YXkoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZyBhcyBQZWVyQ29uZmlnLFxuICAgICAgICB0aGlzLmNsaWVudFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICAgIHRoaXMubGlzdGVuaW5nU3RhY2sgPSBhd2FpdCBuZXR3b3JrLmdldENoYWluY29kZUV2ZW50cyhcbiAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lXG4gICAgICApO1xuICAgICAgdGhpcy5oYW5kbGVFdmVudHMoY3R4KTtcbiAgICB9XG5cbiAgICAvLyBQcm94eSBDUlVEIG1ldGhvZHMuXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IHRydWUgIOKGkiBub3RpZnkgZm9yIEFMTCBtb2RlbHMgKHJlcGxhY2VzIGdhdGV3YXkgZXZlbnRzIGVudGlyZWx5KVxuICAgIC8vIOKAoiBzeW50aGV0aWNFdmVudHMgPSBmYWxzZSDihpIgbm90aWZ5IG9ubHkgZm9yIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzXG4gICAgLy8gICAodGhlIGdhdGV3YXkgc3Vic2NyaXB0aW9uIGhhbmRsZXMgcHVibGljIG1vZGVscylcbiAgICAoXG4gICAgICBbXG4gICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBdIGFzIChrZXlvZiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pW11cbiAgICApLmZvckVhY2goKHRvV3JhcCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyBhZGFwdGVyIHByb3ZpZGVkIGZvciB0aGUgZmFsbGJhY2sgb2YgZnVsbHkgc2VncmVnYXRlZCBtb2RlbHNgXG4gICAgICAgICk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlclt0b1dyYXBdKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWV0aG9kICR7dG9XcmFwfSBub3QgZm91bmQgaW4gJHt0aGlzLmFkYXB0ZXIuYWxpYXN9IGFkYXB0ZXIgdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcblxuICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMuYWRhcHRlciwgdG9XcmFwKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gdGhpcy5hZGFwdGVyO1xuICAgICAgd2hpbGUgKCFkZXNjcmlwdG9yICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHRvV3JhcCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGVzY3JpcHRvciB8fCAhZGVzY3JpcHRvci53cml0YWJsZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0aG9kICR7dG9XcmFwfSB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBidWxrVG9TaW5nbGUobWV0aG9kOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5VUERBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkRFTEVURTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgYXJlIHJlYWQgb25seSBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLmFkYXB0ZXJbdG9XcmFwXSA9IG5ldyBQcm94eSh0aGlzLmFkYXB0ZXJbdG9XcmFwXSwge1xuICAgICAgICBhcHBseTogYXN5bmMgKFxuICAgICAgICAgIHRhcmdldDogYW55LFxuICAgICAgICAgIHRoaXNBcmc6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgICAgICAgYXJnQXJyYXk6IGFueVtdXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIC8vIFJ1biB0aGUgb3JpZ2luYWwgbWV0aG9kIHVuY2hhbmdlZCBzbyB0cmFuc2llbnQgZGF0YSBpcyBwcmVzZXJ2ZWRcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJnQXJyYXkpO1xuXG4gICAgICAgICAgY29uc3QgY2xheno6IENvbnN0cnVjdG9yPGFueT4gPSBhcmdBcnJheVswXTtcbiAgICAgICAgICAvLyBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyBmYWxzZSwgcHVibGljIG1vZGVscyBlbWl0IGEgY2hhaW5jb2RlIGV2ZW50XG4gICAgICAgICAgLy8gb24gdGhlIGNvbnRyYWN0IHNpZGU7IHNraXAgdGhlIGxvY2FsIGZhbGxiYWNrIHRvIGF2b2lkXG4gICAgICAgICAgLy8gZG91YmxlLW5vdGlmaWNhdGlvbi4gV2hlbiBzeW50aGV0aWNFdmVudHMgaXMgdHJ1ZSB3ZSBoYW5kbGUgYWxsIG1vZGVscy5cbiAgICAgICAgICBpZiAoIXN5bnRoZXRpY0V2ZW50cyAmJiAhTW9kZWwuaXNUcmFuc2llbnQoY2xhenopKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgICAgLy8gQ29udGV4dCBpcyBhbHdheXMgdGhlIGxhc3QgZWxlbWVudCBvZiBhcmdBcnJheVxuICAgICAgICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzLCBjdHggfSA9IHRoaXNBcmdbXCJsb2dDdHhcIl0oXG4gICAgICAgICAgICBhcmdBcnJheS5zbGljZShhcmdBcnJheS5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaWRzID0gYXJnQXJyYXlbMV07XG4gICAgICAgICAgY29uc3QgcmVzdWx0QXJnczogYW55W10gPSBbY2xhenosIGJ1bGtUb1NpbmdsZSh0b1dyYXApLCBpZHNdO1xuXG4gICAgICAgICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcIm9ic2VydmVGdWxsUmVzdWx0XCIpKSB7XG4gICAgICAgICAgICByZXN1bHRBcmdzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICAuLi4ocmVzdWx0QXJncyBhcyBQYXJhbWV0ZXJzPHR5cGVvZiB0aGlzLnVwZGF0ZU9ic2VydmVycz4pLFxuICAgICAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgICAgICkuY2F0Y2goKGU6IHVua25vd24pID0+XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGlzcGF0Y2ggb2JzZXJ2ZXIgcmVmcmVzaCBmb3IgJHt0b1dyYXB9IG9uICR7Y2xhenoubmFtZSB8fCBjbGF6en0gZm9yICR7aWRzfTogJHtlfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5pZiAoRmFicmljQ2xpZW50QWRhcHRlcilcbiAgRmFicmljQ2xpZW50QWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0gPSBGYWJyaWNDbGllbnREaXNwYXRjaDtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG4iXSwibmFtZXMiOlsiZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlIiwiZmlsZVBhdGgiLCJmcyIsInJlcXVpcmUiLCJwYXRoIiwiZGlybmFtZSIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJnZW5lcmF0ZU1vZGVsSW5kZXhlcyIsIm0iLCJnZW5lcmF0ZUluZGV4ZXMiLCJnZW5lcmF0ZU1vZGVsRGVzaWduRG9jcyIsImFjY3VtIiwidmlld3MiLCJnZW5lcmF0ZVZpZXdzIiwic3RvcmFnZSIsImZvckVhY2giLCJkb2MiLCJfaWQiLCJyZWFkTW9kZWxGaWxlIiwiZmlsZSIsImV4cG9ydHMiLCJqb2luIiwicHJvY2VzcyIsImN3ZCIsInBhcmVudFBhdGgiLCJuYW1lIiwidmFsdWVzIiwiT2JqZWN0IiwiZmlsdGVyIiwiZSIsIk1vZGVsIiwiYXN5bmMiLCJyZWFkTW9kZWxGb2xkZXJzIiwiZm9sZGVycyIsInJlc3VsdCIsImZvbGRlciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicmVjdXJzaXZlIiwiZiIsImlzRmlsZSIsImVuZHNXaXRoIiwicHVzaCIsIndyaXRlSW5kZXhlcyIsImluZGV4ZXMiLCJwIiwiY29sbGVjdGlvbiIsImluZGV4IiwicmVzb2x2ZSIsIndyaXRlRmlsZVN5bmMiLCJKU09OIiwic3RyaW5naWZ5IiwidW5kZWZpbmVkIiwid3JpdGVEZXNpZ25Eb2NzIiwiZGVzaWduRG9jcyIsImxlbmd0aCIsImRvY0lkIiwicmVwbGFjZSIsInBheWxvYWQiLCJfcmV2IiwiY29sbGVjdGlvbkZvciIsImNvbGxlY3Rpb25OYW1lIiwicG9saWN5IiwicmVxdWlyZWRQZWVyQ291bnQiLCJtYXhQZWVyQ291bnQiLCJibG9ja1RvTGl2ZSIsIm1lbWJlck9ubHlSZWFkIiwibWVtYmVyT25seVdyaXRlIiwicHJpdmF0ZUNvbGxlY3Rpb25Gb3IiLCJtc3BJZCIsImMiLCJlbmRvcnNlbWVudFBvbGljeSIsInNpZ25hdHVyZVBvbGljeSIsInNoYXJlZENvbGxlY3Rpb25Gb3IiLCJtc3BJZHMiLCJtYXAiLCJleHRyYWN0Q29sbGVjdGlvbnMiLCJvdmVycmlkZXMiLCJtaXJyb3IiLCJwcml2YXRlQ29scyIsInNoYXJlZENvbHMiLCJjb2xsZWN0aW9uc0ZvciIsInJlc29sdmVDb2xsZWN0aW9uIiwiYXJnIiwiSW50ZXJuYWxFcnJvciIsInByaXZhdGVEZWZhdWx0cyIsImFzc2lnbiIsInNoYXJlZERlZmF1bHRzIiwibWlycm9yTWV0YSIsIm1pcnJvcmVkQXQiLCJwcml2YXRlcyIsImZsYXQiLCJyZXNvbHZlZCIsInJlc29sdmVyIiwic29tZSIsImluY2x1ZGVzIiwic2hhcmVkIiwid3JpdGVDb2xsZWN0aW9ucyIsImNvbHMiLCJmaWxlTmFtZSIsIndyaXRlQ29sbGVjdGlvbkRlc2lnbkRvY3MiLCJkb2NzIiwiRmFicmljQ2xpZW50UGFnaW5hdG9yIiwiUGFnaW5hdG9yIiwiY29uc3RydWN0b3IiLCJhZGFwdGVyIiwicXVlcnkiLCJzaXplIiwiY2xhenoiLCJzdXBlciIsInByZXBhcmUiLCJyYXdTdGF0ZW1lbnQiLCJVbnN1cHBvcnRlZEVycm9yIiwicGFnZSIsImFyZ3MiLCJpc1NlcmlhbGl6ZWRQYWdlIiwib2JqIiwiQXJyYXkiLCJpc0FycmF5IiwiZGF0YSIsIkZhYnJpY0NsaWVudFJlcG9zaXRvcnkiLCJSZXBvc2l0b3J5IiwiZm9yY2UiLCJ0aGlzIiwiX292ZXJyaWRlcyIsImlnbm9yZVZhbGlkYXRpb24iLCJpZ25vcmVIYW5kbGVycyIsImFsbG93UmF3U3RhdGVtZW50cyIsImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXMiLCJmb3JjZVByZXBhcmVDb21wbGV4UXVlcmllcyIsImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlIiwicmVidWlsZFdpdGhUcmFuc2llbnQiLCJvdmVycmlkZSIsImZsYWdzIiwiZm9yIiwiT2JzZXJ2ZXJIYW5kbGVyIiwicGFnaW5hdGVCeSIsImtleSIsIm9yZGVyIiwicmVmIiwib2Zmc2V0IiwibGltaXQiLCJsb2ciLCJjdHhBcmdzIiwibG9nQ3R4IiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiUEFHRV9CWSIsInZlcmJvc2UiLCJ0YWJsZU5hbWUiLCJjbGFzcyIsInN0YXRlbWVudCIsImJvb2ttYXJrIiwibGlzdEJ5IiwiTElTVF9CWSIsImZpbmRCeSIsInZhbHVlIiwiRklORF9CWSIsImZpbmRPbmVCeSIsIkZJTkRfT05FX0JZIiwiZmluZCIsIk9yZGVyRGlyZWN0aW9uIiwiQVNDIiwiRklORCIsImRpcmVjdGlvbiIsIlBBR0UiLCJjdHgiLCJQZXJzaXN0ZW5jZUtleXMiLCJTVEFURU1FTlQiLCJjYWxsQXJncyIsInNsaWNlIiwicGFyc2UiLCJkZWNvZGUiLCJldmFsdWF0ZVRyYW5zYWN0aW9uIiwiaHlkcmF0ZWQiLCJyIiwiQ291Y2hEQktleXMiLCJUQUJMRSIsImQiLCJhcHBseUFmdGVyUmVhZCIsImdldE9yVW5kZWZpbmVkIiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIk9wZXJhdGlvbktleXMiLCJSRUFEIiwiQUZURVIiLCJQcm9taXNlIiwiYWxsIiwiZW50cnkiLCJjb3VudE9mIiwiQ09VTlRfT0YiLCJzdG10QXJncyIsIm1heE9mIiwiTUFYX09GIiwibWluT2YiLCJNSU5fT0YiLCJhdmdPZiIsIkFWR19PRiIsInN1bU9mIiwiU1VNX09GIiwiZGlzdGluY3RPZiIsIkRJU1RJTkNUX09GIiwiZ3JvdXBPZiIsIkdST1VQX09GIiwiaGVhbHRoY2hlY2siLCJjcmVhdGUiLCJtb2RlbCIsImRlYnVnIiwiZW5zdXJlTGVnYWN5TWlycm9yRmxhZyIsInByZXBhcmVkIiwicmVjb3JkIiwiaWQiLCJ0cmFuc2llbnQiLCJyZXZlcnQiLCJ1cGRhdGUiLCJjcmVhdGVBbGxQcmVmaXgiLCJtb2RlbHMiLCJDUkVBVEUiLCJnZXQiLCJpZ25vcmVWYWxpZGF0ZSIsIk9OIiwiaWdub3JlZFByb3BzIiwiZXJyb3JzIiwiaGFzRXJyb3JzIiwiZXJyb3JNZXNzYWdlcyIsInJlZHVjZUVycm9yc1RvUHJpbnQiLCJWYWxpZGF0aW9uRXJyb3IiLCJjcmVhdGVBbGwiLCJpZHMiLCJwYXlsb2FkcyIsInRyYW5zaWVudHMiLCJjcmVhdGVkIiwiaSIsInJlYWRBbGwiLCJrZXlzIiwicmVjb3JkcyIsInVwZGF0ZUFsbCIsInVwZGF0ZWQiLCJ1IiwiYWNjdW11bGF0ZSIsImxlZ2FjeSIsIkVSQzIwVG9rZW4iLCJCYXNlTW9kZWwiLCJfX2RlY29yYXRlIiwicGsiLCJ0eXBlIiwiU3RyaW5nIiwicHJvdG90eXBlIiwiY29sdW1uIiwicmVxdWlyZWQiLCJ0YWJsZSIsIkVSQzIwV2FsbGV0IiwiQWxsb3dhbmNlIiwiQ2xpZW50U2VyaWFsaXplciIsIkpTT05TZXJpYWxpemVyIiwicHJlU2VyaWFsaXplIiwibW9kZWxOYW1lIiwidG9TZXJpYWxpemUiLCJtZXRhZGF0YSIsIk1ldGFkYXRhIiwiU2VyaWFsaXphdGlvbkVycm9yIiwiTW9kZWxLZXlzIiwiQU5DSE9SIiwiZGVzZXJpYWxpemUiLCJzdHIiLCJkZXNlcmlhbGl6YXRpb24iLCJjbGFzc05hbWUiLCJFcnJvciIsImJ1aWxkIiwic2VyaWFsaXplIiwiRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5Iiwic2VyaWFsaXplciIsImRlY29kZXIiLCJUZXh0RGVjb2RlciIsInVwZGF0ZU9ic2VydmVycyIsImV2ZW50Iiwib2JzZXJ2ZXJIYW5kbGVyIiwiY291bnQiLCJwYXJzZWRJZCIsIlNlcXVlbmNlIiwicGFyc2VWYWx1ZSIsInNlcXVlbmNlRm9yIiwidG9rZW5OYW1lIiwic3ltYm9sIiwiZGVjaW1hbHMiLCJOdW1iZXIiLCJ0b3RhbFN1cHBseSIsInRvdGFsIiwiYmFsYW5jZU9mIiwib3duZXIiLCJiYWxhbmNlIiwidHJhbnNmZXIiLCJ0byIsInRyYW5zZmVycmVkIiwic3VibWl0VHJhbnNhY3Rpb24iLCJ0b1N0cmluZyIsInRyYW5zZmVyRnJvbSIsImZyb20iLCJjb250ZXh0QXJncyIsIkNvbnRleHQiLCJhcHByb3ZlIiwic3BlbmRlciIsImFwcHJvdmVkIiwiYWxsb3dhbmNlIiwiaW5pdGlhbGl6ZSIsInRva2VuIiwiaW5pdGlsaWF6ZWQiLCJjaGVja0luaXRpYWxpemVkIiwibWludCIsImFtb3VudCIsImJ1cm4iLCJidXJuRnJvbSIsImFjY291bnQiLCJjbGllbnRBY2NvdW50QmFsYW5jZSIsInNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSIsImNsaWVudEFjY291bnRJRCIsImV4dHJhY3RJZHMiLCJjb21wb3NlZCIsInBrUHJvcHMiLCJleHRyYWN0SWQiLCJjb21wb3NlQXR0cmlidXRlVmFsdWUiLCJJZGVudGl0eUNyZWRlbnRpYWxzIiwiZGVzY3JpcHRpb24iLCJGYWJyaWNNb2RlbEtleXMiLCJJZGVudGl0eVR5cGUiLCJGYWJyaWNGbGF2b3VyIiwiSWRlbnRpdHkiLCJYNTA5Iiwib25lVG9PbmUiLCJDYXNjYWRlIiwiQ0FTQ0FERSIsImRlbGV0ZSIsIkNvcmVVdGlscyIsImxvZ2dlciIsIk1pbmlMb2dnZXIiLCJjb250ZW50T2ZMb2FkRmlsZSIsImNvbnRlbnRPclBhdGgiLCJmaWxlUmVhZGVyIiwiVWludDhBcnJheSIsIm1hdGNoIiwicmVhZEZpbGUiLCJwcm9taXNlcyIsIm5vcm1hbGl6ZUltcG9ydCIsImltcG9ydCIsImdldENBVXNlciIsInVzZXJOYW1lIiwicHJpdmF0ZUtleSIsImNlcnRpZmljYXRlIiwib3B0aW9ucyIsInN0cmluZ0Zvcm1hdCIsInVzZXIiLCJVc2VyIiwiY29uZmlnIiwiaHNtIiwic29mdHdhcmUiLCJsaWIiLCJsaWJyYXJ5Iiwic2xvdCIsImxhYmVsIiwidG9rZW5MYWJlbCIsInBpbiIsImNyeXB0b1N1aXRlIiwiZ2V0Q3J5cHRvU3VpdGUiLCJzZXRDcnlwdG9TdWl0ZSIsImVucm9sbG1lbnRLZXkiLCJnZXRIU01FbnJvbGxtZW50S2V5IiwiZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5Iiwic2V0RW5yb2xsbWVudCIsIm5ld0NyeXB0b1N1aXRlIiwiY3JlYXRlS2V5RnJvbVJhdyIsInNraSIsImtleUlkSGV4IiwidHJpbSIsIkJ1ZmZlciIsImdldENlcnRpZmljYXRlU0tJIiwiZ2V0S2V5IiwiaXNQcml2YXRlIiwieDUwOSIsIlg1MDlDZXJ0aWZpY2F0ZSIsImp3ayIsInB1YmxpY0tleSIsImV4cG9ydCIsImZvcm1hdCIsInByZWZpeCIsIngiLCJ5IiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsImNvbmNhdCIsImRpZ2VzdCIsImdldElkZW50aXR5IiwiY2VydERpcmVjdG9yeVBhdGgiLCJpZGVudGl0eUZpbGVSZWFkZXIiLCJjZXJ0UGF0aCIsImdldEZpcnN0RGlyRmlsZU5hbWUiLCJjcmVkZW50aWFscyIsImRpclBhdGgiLCJyZWFkZGlyIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQiLCJnZXRGaWxlQ29udGVudCIsImdldFNpZ25lciIsImtleURpcmVjdG9yeVBhdGgiLCJzaWduZXJGaWxlUmVhZGVyIiwia2V5UGF0aCIsInByaXZhdGVLZXlQZW0iLCJleHRyYWN0UHJpdmF0ZUtleSIsImdldE93blByb3BlcnR5U3ltYm9scyIsImsiLCJzaWduZXJzIiwibmV3UHJpdmF0ZUtleVNpZ25lciIsInBlbSIsImxpYk5hbWUiLCJzdWJ0bGUiLCJnbG9iYWxUaGlzIiwid2luZG93IiwiQ3J5cHRvIiwid2ViY3J5cHRvIiwic3RyMmFiIiwiYnVmIiwiQXJyYXlCdWZmZXIiLCJidWZWaWV3Iiwic3RyTGVuIiwiY2hhckNvZGVBdCIsInJlcGxhY2VBbGwiLCJkZWNvZGVkIiwiYmluYXJ5RGVyIiwiaW1wb3J0S2V5IiwibmFtZWRDdXJ2ZSIsImdldEFraUFuZFNlcmlhbEZyb21DZXJ0IiwiY2VydCIsIng1MDlDZXJ0aWZpY2F0ZSIsIlg1MDlDZXJ0IiwiYWtpRXh0IiwiZXh0ZW5zaW9ucyIsImFraSIsInRvVXBwZXJDYXNlIiwic3RhcnRzV2l0aCIsInNlcmlhbCIsInNlcmlhbE51bWJlciIsImNyeXB0b1Byb3ZpZGVyIiwic2V0IiwiQkFTRV9BTFBIQUJFVCIsIkNSWVBUTyIsIkJhc2VFbmNvZGVyIiwiYWxwaGFiZXQiLCJiYXNlTWFwIiwiaiIsImNoYXJBdCIsInhjIiwiYmFzZSIsImxlYWRlciIsImZhY3RvciIsIk1hdGgiLCJpRmFjdG9yIiwiZW5jb2RlIiwic291cmNlIiwiaXNWaWV3IiwiYnVmZmVyIiwiYnl0ZU9mZnNldCIsImJ5dGVMZW5ndGgiLCJ6ZXJvZXMiLCJwYmVnaW4iLCJwZW5kIiwiYjU4IiwiY2FycnkiLCJpdDEiLCJpdDIiLCJyZXBlYXQiLCJkZWNvZGVVbnNhZmUiLCJwc3oiLCJiMjU2IiwiaXQzIiwiaXQ0IiwidmNoIiwiQ3J5cHRvVXRpbHMiLCJiNThlbmNvZGVyIiwiQkFTRTU4IiwiZmFicmljSWRGcm9tQ2VydGlmaWNhdGUiLCJzdWJqZWN0IiwiaXNzdWVyIiwic3RyaW5nVG9BcnJheUJ1ZmZlciIsImV4dHJhY3RLZXkiLCJ1c2FnZXMiLCJSZWdFeHAiLCJleHRyYWN0UHVibGljS2V5Iiwic2lnbiIsImJ1ZmYiLCJoYXNoIiwiYiIsInBhZFN0YXJ0IiwidmVyaWZ5Iiwic2lnbmF0dXJlIiwiZW5jcnlwdCIsImdldFN1YnRsZUNyeXB0byIsImlzQnJvd3NlciIsImRlY3J5cHQiLCJnZXRNYXN0ZXIiLCJ0ZXh0RW5jb2RlciIsIlRleHRFbmNvZGVyIiwiZ2VuR2VuZXNpcyIsInJhbmRvbVVVSUQiLCJpbXBvcnRlZEtleSIsIktFWV9BTEdPUllUSE0iLCJpdiIsImdldERlcml2YXRpb25LZXkiLCJzYWx0Iiwic2FsdEJ1ZmZlciIsInNhbHRIYXNoZWQiLCJwYXJhbXMiLCJIQVNIIiwiaXRlcmF0aW9ucyIsIklURVJBVElPTlMiLCJkZXJpdmF0aW9uIiwiZGVyaXZlQml0cyIsIktFWUxFTkdUSCIsIml2bGVuIiwia2V5bGVuIiwiZGVyaXZlZEtleSIsImltcG9ydGVkRW5jcnlwdGlvbktleSIsIkFMR09SWVRITSIsImVuY3J5cHRQaW4iLCJ0ZXh0Iiwia2V5T2JqZWN0IiwidGV4dEJ1ZmZlciIsImVuY3J5cHRlZFRleHQiLCJkZWNyeXB0UGluIiwidGV4dERlY29kZXIiLCJkZWNyeXB0ZWRUZXh0IiwiT3ZlcmZsb3dFcnJvciIsIm1zZyIsIkJhbGFuY2VFcnJvciIsIkFsbG93YW5jZUVycm9yIiwiUmVnaXN0cmF0aW9uRXJyb3IiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJNaXNzaW5nQ29udGV4dEVycm9yIiwiVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MiLCJCYXNlRXJyb3IiLCJOb3RJbml0aWFsaXplZEVycm9yIiwiTWlzc2luZ1BLQ1NTMTFMaWIiLCJFbmRvcnNlbWVudEVycm9yIiwibWVzc2FnZSIsIk12Y2NSZWFkQ29uZmxpY3RFcnJvciIsIlBoYW50b21SZWFkQ29uZmxpY3RFcnJvciIsIkVuZG9yc2VtZW50UG9saWN5RXJyb3IiLCJUcmFuc2FjdGlvbkxpbWl0c0Vycm9yIiwiY29kZSIsIlRyYW5zYWN0aW9uVGltZW91dEVycm9yIiwiVHJhbnNhY3Rpb25CdWZmZXJTaXplRXJyb3IiLCJIRkNBSWRlbnRpdHlUeXBlIiwiSEZDQUlkZW50aXR5QXR0cmlidXRlcyIsIkZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIiwiTG9nZ2VkQ2xhc3MiLCJjYUNvbmZpZyIsImNhTmFtZSIsImNhQ2VydCIsImNhS2V5IiwidXJsIiwiQ0EiLCJjYSIsInRscyIsInRydXN0ZWRSb290cyIsInJvb3QiLCJGYWJyaWNDQVNlcnZpY2VzIiwiQ2xpZW50IiwiY2xpZW50IiwiQ2VydGlmaWNhdGUiLCJjZXJ0aWZpY2F0ZVNlcnZpY2UiLCJuZXdDZXJ0aWZpY2F0ZVNlcnZpY2UiLCJBZmZpbGlhdGlvbnMiLCJhZmZpbGlhdGlvblNlcnZpY2UiLCJuZXdBZmZpbGlhdGlvblNlcnZpY2UiLCJJZGVudGl0aWVzIiwiaWRlbnRpdHlTZXJ2aWNlIiwibmV3SWRlbnRpdHlTZXJ2aWNlIiwiZ2V0Q2VydGlmaWNhdGVzIiwicmVxdWVzdCIsImRvTWFwIiwicmVzcG9uc2UiLCJjZXJ0cyIsIlBFTSIsImdldElkZW50aXRpZXMiLCJpZGVudGl0aWVzU2VydmljZSIsImdldEFsbCIsImlkZW50aXRpZXMiLCJwYXJzZUVycm9yIiwicmVnZXhwIiwiZXhlYyIsIkNvbmZsaWN0RXJyb3IiLCJnZXRBZmZpbGlhdGlvbnMiLCJhIiwicmVhZCIsImVucm9sbG1lbnRJZCIsImdldE9uZSIsIk5vdEZvdW5kRXJyb3IiLCJzdWNjZXNzIiwicmVnaXN0ZXIiLCJpc1N1cGVyVXNlciIsImFmZmlsaWF0aW9uIiwidXNlclJvbGUiLCJhdHRycyIsIm1heEVucm9sbG1lbnRzIiwicmVnaXN0cmF0aW9uIiwicGFzc3dvcmQiLCJwcm9wcyIsImVucm9sbG1lbnRJRCIsImVucm9sbG1lbnRTZWNyZXQiLCJpbmZvIiwiaWRlbnRpdHlGcm9tRW5yb2xsbWVudCIsImVucm9sbG1lbnQiLCJyb290Q2VydGlmaWNhdGUiLCJMb2dnaW5nIiwiY2xpZW50SWQiLCJub3ciLCJEYXRlIiwidG9CeXRlcyIsImNyZWF0ZWRPbiIsInVwZGF0ZWRPbiIsImVucm9sbCIsImlkZW50aXR5IiwicmVnaXN0ZXJBbmRFbnJvbGwiLCJyZXZva2UiLCJyZWFzb24iLCJSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciIsImVycnMiLCJyb2xlIiwic2V0QWZmaWxpYXRpb24iLCJhZGRBdHRyIiwiYXR0ciIsInNldEF0dHJzIiwic2V0RW5yb2xsbWVudElEIiwic2V0RW5yb2xsbWVudFNlY3JldCIsInNldE1heEVucm9sbG1lbnRzIiwic2V0Um9sZSIsIm1pbmxlbmd0aCIsIm1pbiIsIkVSQzIwRXZlbnRzIiwiRmFicmljQmFzZU1vZGVsIiwiY3JlYXRlZEF0IiwidXBkYXRlZEF0IiwidmVyc2lvbiIsInVzZXMiLCJGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsIiwiY3JlYXRlZEJ5IiwidXBkYXRlZEJ5IiwiaXNTaGFyZWQiLCJzZWdyZWdhdGUiLCJpc1RyYW5zaWVudCIsImRlY29yYXRlZFByb3BlcnRpZXMiLCJnZXRBdHRyaWJ1dGVzIiwidHJhbnNpZW50UHJvcHMiLCJEQktleXMiLCJUUkFOU0lFTlQiLCJwcml2YXRlUHJvcGVydGllcyIsIlBSSVZBVEUiLCJzaGFyZWRQcm9wZXJ0aWVzIiwiU0hBUkVEIiwicHVibGljIiwidHJhbnNpZW50S2V5cyIsInByaXZhdGVLZXlzIiwic2hhcmVkS2V5cyIsImlzUHVibGljIiwiYmluZCIsIm1pcnJvcmVkIiwiRkFCUklDIiwiTUlSUk9SIiwib3duZXJPZiIsIm1ldGEiLCJPV05FRF9CWSIsInNoYXJlZEtleSIsImNvbnN0ciIsInByaXZhdGVNZXRhIiwic2hhcmVkTWV0YSIsImNvbGxlY3Rpb25zIiwiZXh0cmFjdE1zcElkIiwiZ2V0TVNQSUQiLCJPd25lciIsInRhcmdldCIsInByb3BlcnR5S2V5IiwiZGVzY3JpcHRvciIsIm9yaWdpbmFsTWV0aG9kIiwiYWNvdW50SWQiLCJjbGllbnRJZGVudGl0eSIsImdldElEIiwic2VsZWN0IiwidG9rZW5zIiwiZXhlY3V0ZSIsImFwcGx5Iiwib3duZWRCeU9uQ3JlYXRlIiwiY29udGV4dCIsInN0dWIiLCJjcmVhdG9yIiwiZ2V0Q3JlYXRvciIsIm1zcGlkIiwic2V0T3duZWRCeUtleVZhbHVlIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJvd25lZEJ5IiwiYXR0cmlidXRlIiwiZ2VuZXJhdGVkIiwicmVhZG9ubHkiLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSIsIkRlY29yYXRpb24iLCJkZWZpbmUiLCJkZWNvcmF0b3IiLCJ0cmFuc2FjdGlvbklkT25DcmVhdGUiLCJnZXRUeElEIiwidHJhbnNhY3Rpb25JZCIsIm9uVXBkYXRlIiwiVFJBTlNBQ1RJT05fSUQiLCJldmFsTWlycm9yTWV0YWRhdGEiLCJjcmVhdGVNaXJyb3JIYW5kbGVyIiwiZmFicmljQ3R4Iiwic291cmNlTW9kZWwiLCJwdXQiLCJyZXBvIiwibWlycm9yQ29sbGVjdGlvbiIsInVwZGF0ZU1pcnJvckhhbmRsZXIiLCJhcHBseVVwZGF0ZVZhbGlkYXRpb24iLCJtZXJnZUZvclVwZGF0ZSIsImRlbGV0ZU1pcnJvckhhbmRsZXIiLCJwa1Byb3AiLCJzZWdyZWdhdGVkIiwibWlycm9yV3JpdGVHdWFyZCIsIm1zcCIsImNvbmRpdGlvbiIsInJlYWRNaXJyb3JIYW5kbGVyIiwibWF0Y2hlcyIsInJlYWRGcm9tIiwibXNwSWRPckNvbmRpdGlvbiIsImlzQ29uZGl0aW9uT25seSIsIkJvb2xlYW4iLCJjb25kIiwib25SZWFkIiwicHJpb3JpdHkiLCJvbkRlbGV0ZSIsIk1vZGVsQ29sbGVjdGlvbiIsIm9yZ05hbWUiLCJ0b1Bhc2NhbENhc2UiLCJOYW1lc3BhY2VDb2xsZWN0aW9uIiwibmFtZXNwYWNlIiwiSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbiIsIlNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZIiwiYXBwbHlTZWdyZWdhdGlvbkZsYWdzIiwiaXNGdWxseVNlZ3JlZ2F0ZWQiLCJoYXNQdWJsaWNQcm9wZXJ0aWVzIiwibWFya0Z1bGx5U2VncmVnYXRlZCIsImFwcGx5TWlycm9yRmxhZ3MiLCJhdHRyaWJ1dGVzIiwidHJhbnNpZW50TWV0YSIsImV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnMiLCJkYXRhQXJyYXkiLCJjb2xsZWN0aW9uUmVzb2x2ZXIiLCJzZXFOYW1lIiwic2VxdWVuY2VOYW1lIiwic2V0U2VxdWVuY2VTZWdyZWdhdGlvbiIsInNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUiLCJrZXlBcnJheSIsIl9rIiwia2V5U3RyaW5ncyIsIndyaXRlVG8iLCJzZWdyZWdhdGVkRGF0YU9uUmVhZCIsInNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUiLCJvbGRNb2RlbCIsInNlZ3JlZ2F0ZWREYXRhT25EZWxldGUiLCJpbm5lclNlZ3JlZ2F0ZWQiLCJzZWdyZWdhdGVkRGVjIiwiU2V0IiwiYWRkIiwiY29uc3RyTWV0YSIsImNvbnN0ckNvbGxlY3Rpb25zIiwidXBkYXRlZFRyYW5zaWVudE1ldGEiLCJkZWNzIiwicHJvcGVydGllcyIsImdyb3VwTmFtZSIsImV4dHJhY3RHcm91cE5hbWUiLCJkYXRhR3JvdXBOYW1lIiwiZWFybHlFeHRyYWN0aW9uTWV0YSIsImVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydCIsImdyb3VwIiwicHJvcCIsIm9uIiwiREJPcGVyYXRpb25zIiwiQUxMIiwicHJpdmF0ZURhdGEiLCJzaGFyZWREYXRhIiwic29ydEtleXNPbmx5UmVjdXJzaXZlIiwic29ydCIsInJlZHVjZSIsImFjYyIsIkRldGVybWluaXN0aWNTZXJpYWxpemVyIiwiZXJyb3IiLCJzZWxmIiwibyIsImNhbGwiLCJyZWxhdGlvbnMiLCJnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSIsInBhcnNlRXZlbnROYW1lIiwicGFydHMiLCJzcGxpdCIsInN1YiIsInNhZmVQYXJzZUludCIsInN0cmluZyIsImRpZ2l0UmVnZXgiLCJ0ZXN0IiwicGFyc2VkaW50IiwicGFyc2VJbnQiLCJpc05hTiIsIlNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyIiwicHV0QW5jaG9yIiwicHJlU2VyaWFsaXphdGlvbiIsIkZhYnJpY0lkZW50aXR5U2VydmljZSIsIkNsaWVudEJhc2VkU2VydmljZSIsInJvb3RDbGllbnQiLCJfdXNlciIsImNlcnRpZmljYXRlcyIsImFmZmlsaWF0aW9ucyIsImdldFVzZXIiLCJjZmciLCJJTklUSUFMSVpBVElPTiIsImdldE5hbWUiLCJ1cGRhdGVJZGVudGl0eSIsImlkZW50aXR5UmVxdWVzdCIsImNhVXNlcklkZW50aXR5IiwicmVlbnJvbGxVc2VyIiwiY3JlYXRlVXNlciIsImdldE1zcGlkIiwiZW5yb2xsbWVudEF0dHJzIiwib3B0aW9uYWwiLCJyZWVucm9sbCIsInJlbmV3ZWRJZGVudGl0eSIsInJldm9rZU9wdGlvbnMiLCJyZXZva2VSZXF1ZXN0IiwiQ0FfUk9MRSIsIkRlZmF1bHRGYWJyaWNDbGllbnRGbGFncyIsImV2YWx1YXRlVGltZW91dCIsImVuZG9yc2VUaW1lb3V0Iiwic3VibWl0VGltZW91dCIsImNvbW1pdFRpbWVvdXQiLCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3MiLCJhbGxvd0dhdGV3YXlPdmVycmlkZSIsImVuY3J5cHRUcmFuc2llbnQiLCJzeW50aGV0aWNFdmVudHMiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwidG9Mb3dlckNhc2UiLCJvcmRlckJ5U2VsZWN0b3JzIiwiT1JERVJfQlkiLCJ0b0NhbWVsQ2FzZSIsInByb2Nlc3NSZWNvcmQiLCJwa0F0dHIiLCJJRCIsImtleUFyZ3MiLCJTRVBBUkFUT1IiLCJyYXciLCJyYXdJbnB1dCIsImFnZ3JlZ2F0b3IiLCJhZ2dyZWdhdGVJbmZvIiwiYWdncmVnYXRlIiwiZXhlY3V0ZUFnZ3JlZ2F0ZSIsInJlc3VsdHMiLCJwcm9jZXNzZWQiLCJhcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdCIsImFnZ3JlZ2F0ZVF1ZXJ5IiwiYnVpbGRBZ2dyZWdhdGVRdWVyeSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwiZmllbGRzIiwicGFyc2VDb25kaXRpb24iLCJDb25kaXRpb24iLCJhbmQiLCJlcSIsInNlbGVjdG9yS2V5cyIsIkNvdWNoREJHcm91cE9wZXJhdG9yIiwiaW5kZXhPZiIsInZhbCIsIk9SIiwicyIsImVudHJpZXMiLCJ3YXJuIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsInBvcCIsInRvT3ZlcnJpZGVzIiwibmV3Q3R4IiwicGFyZW50Q29udGV4dCIsImNoaWxkQ29udGV4dHMiLCJjdXJyZW50T3AiLCJjdXJyZW50TW9kZWwiLCJyZXBvc2l0b3J5IiwiY3JlYXRlUHJlZml4IiwidXBkYXRlQWxsUHJlZml4Iiwic2hpZnQiLCJoYXNUcmFuc2llbnQiLCJuZWVkc0Z1bGxQYXlsb2FkIiwic2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uIiwidHJhbnNpZW50UGF5bG9hZCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIkNSRUFURV9BTEwiLCJnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zIiwicmVzIiwic2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUiLCJSRUFEX0FMTCIsIlVQREFURV9BTEwiLCJkZWxldGVBbGwiLCJzaG91bGRIeWRyYXRlIiwiREVMRVRFX0FMTCIsIk1FVEFEQVRBIiwibWlycm9yTXNwIiwibXNwcyIsIm1lcmdlZCIsImVuZG9yc2luZ09yZ3MiLCJlbmRvcnNpbmdPcmdhbml6YXRpb25zIiwic2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQiLCJ2IiwiY2hpbGRSZWJ1aWxkIiwiZ2V0RnJvbUNoaWxkcmVuIiwicmVzb2x2ZWRPcCIsInJlc29sdmVPcGVyYXRpb24iLCJoYXNJZCIsImRpcmVjdCIsImRlc2VyaWFsaXplZCIsInVwZGF0ZVByZWZpeCIsIlVQREFURSIsIkRFTEVURSIsImRvY3NPbmx5IiwidHJhbnNhY3Rpb25SZXN1bHQiLCJwYXJzZVJlY29yZCIsImlzTW9kZWwiLCJlbCIsImdldENsaWVudCIsIl9jbGllbnQiLCJHYXRld2F5IiwiZ2V0R2F0ZXdheSIsImdldENvbnRyYWN0TmFtZSIsIkNvbnRyYWN0IiwiY29udHJhY3ROYW1lIiwiZ2V0Q29udHJhY3QiLCJ0cmFuc2FjdGlvbiIsImFwaSIsInN1Ym1pdCIsInRyYW5zaWVudERhdGEiLCJnYXRld2F5IiwiY29udHJhY3QiLCJldmFsdWF0ZSIsInByb3Bvc2FsT3B0aW9ucyIsImFyZ3VtZW50cyIsImNsb3NlIiwic2hvdWxkVXNlTGVnYWN5R2F0ZXdheSIsInByZXBhcmVMZWdhY3lBcmdzIiwiYnVpbGRMZWdhY3lUcmFuc2llbnQiLCJyZXNvbHZlTGVnYWN5TXNwQ291bnQiLCJjb25maWd1cmVkIiwibGVnYWN5TXNwQ291bnQiLCJpc0Zpbml0ZSIsImZsb29yIiwicGlja0xlZ2FjeUNhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwiYXZhaWxhYmxlIiwicGlja2VkIiwiaWR4IiwicmFuZG9tIiwic2VsZWN0aW9uIiwic3BsaWNlIiwiYnVpbGRMZWdhY3lQZWVyQ29uZmlncyIsInBlZXJzIiwicGVlckVuZHBvaW50IiwicGVlckhvc3RBbGlhcyIsInRsc0NlcnQiLCJlbmRvcnNlcnMiLCJvcmciLCJleHRyYXMiLCJtc3BNYXAiLCJsZWdhY3lDb3VudCIsInNlbGVjdGlvbnMiLCJjaG9pY2UiLCJlbmRwb2ludCIsInN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyIsImZjbiIsInRyYW5zaWVudE1hcCIsInBlZXJDb25maWdzIiwibm9ybWFsaXplTGVnYWN5UGVlcnMiLCJpZGVudGl0eU1hdGVyaWFsIiwicmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwiLCJ3YWxsZXQiLCJXYWxsZXRzIiwibmV3SW5NZW1vcnlXYWxsZXQiLCJpZGVudGl0eUxhYmVsIiwiY29ubmVjdGlvblByb2ZpbGUiLCJidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlIiwiTGVnYWN5R2F0ZXdheSIsImNvbm5lY3QiLCJkaXNjb3ZlcnkiLCJlbmFibGVkIiwiYXNMb2NhbGhvc3QiLCJzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QiLCJ0bHNJbmZvIiwibmV0d29yayIsImdldE5ldHdvcmsiLCJjaGFubmVsIiwiY2hhaW5jb2RlTmFtZSIsImNyZWF0ZVRyYW5zYWN0aW9uIiwic2V0VHJhbnNpZW50IiwicGVlciIsImdldENoYW5uZWwiLCJnZXRFbmRvcnNlciIsImVuZG9yc2VyIiwic2V0RW5kb3JzaW5nUGVlcnMiLCJkaXNjb25uZWN0IiwiZGVkdXBlZCIsIk1hcCIsImFkZFBlZXIiLCJoYXMiLCJyZWFkUGVtSW5wdXQiLCJjZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCIsImtleUNlcnRPckRpcmVjdG9yeVBhdGgiLCJwZWVyRW50cmllcyIsImNoYW5uZWxQZWVycyIsIm9yZ3MiLCJ0bHNQZW0iLCJob3N0bmFtZSIsImV4dHJhY3RIb3N0IiwiZW5zdXJlR3JwY1VybCIsInRsc0NBQ2VydHMiLCJncnBjT3B0aW9ucyIsImhvc3RuYW1lT3ZlcnJpZGUiLCJlbmRvcnNpbmdQZWVyIiwiY2hhaW5jb2RlUXVlcnkiLCJsZWRnZXJRdWVyeSIsImV2ZW50U291cmNlIiwib3JnYW5pemF0aW9uIiwib3JnYW5pemF0aW9ucyIsIm9yZGVyZXJzIiwiY2hhbm5lbHMiLCJldmVyeSIsImlzTG9jYWxFbmRwb2ludCIsImhvc3QiLCJzYW5pdGl6ZWQiLCJpc0J1ZmZlciIsInRyaW1tZWQiLCJzdGF0cyIsInN0YXQiLCJjYXRjaCIsImlzRGlyZWN0b3J5IiwicmVhZEZzRmlsZSIsImVyciIsImxlZ2FjeUFyZ3MiLCJzaHV0ZG93biIsImNoYW5uZWxOYW1lIiwiZ2V0Q29ubmVjdGlvbiIsInBhdGhPckNlcnQiLCJyZWFkRmlsZVN5bmMiLCJ0bHNDcmVkZW50aWFscyIsImdycGMiLCJjcmVhdGVTc2wiLCJzaXplTGltaXQiLCJzaWduZXIiLCJldmFsdWF0ZU9wdGlvbnMiLCJkZWFkbGluZSIsImVuZG9yc2VPcHRpb25zIiwic3VibWl0T3B0aW9ucyIsImNvbW1pdFN0YXR1c09wdGlvbnMiLCJQcm94eSIsInRoaXNBcmciLCJhcmdBcnJheSIsIlJlZmxlY3QiLCJEaXNwYXRjaCIsIkdhdGV3YXlFcnJvciIsImRldGFpbHMiLCJFbmRvcnNlRXJyb3IiLCJCYWRSZXF1ZXN0RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZmluYWwiLCJEIiwiX2EiLCJkZWNvcmF0aW9uIiwic2V0Q3VycmVudCIsIkZhYnJpY0NsaWVudERpc3BhdGNoIiwibG9nZ2VkQXJncyIsIlNIVVRET1dOIiwibGlzdGVuaW5nU3RhY2siLCJwYXJzZVBheWxvYWQiLCJqc29uQnl0ZXMiLCJqc29uIiwib2JzZXJ2ZSIsIm9ic2VydmVyIiwidW5PYnNlcnZlIiwicmVmcmVzaCIsImhhbmRsZUV2ZW50cyIsImN0eEFyZyIsImNvcnJlbGF0aW9uSWQiLCJldnQiLCJldmVudE5hbWUiLCJtc3BFdmVudE9ubHkiLCJ0YXJnZXRNb2RlbCIsIm1vZGVsUmVmIiwib2JzZXJ2ZXJBcmdzIiwiZ2V0Q2hhaW5jb2RlRXZlbnRzIiwidG9XcmFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsImJ1bGtUb1NpbmdsZSIsInJlc3VsdEFyZ3MiLCJWRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBV0EsU0FBU0EseUJBQXlCQztRQUVoQyxNQUFNQyxLQUFLQyxRQUFRO1FBRW5CLE1BQU1DLE9BQU9ELFFBQVE7UUFDckIsTUFBTUUsVUFBa0JELEtBQUtDLFFBQVFKO1FBQ3JDLElBQUlDLEdBQUdJLFdBQVdELFVBQVU7WUFDMUIsT0FBTztBQUNUO1FBQ0FMLHlCQUF5Qks7UUFDekJILEdBQUdLLFVBQVVGO0FBQ2Y7SUFFTSxTQUFVRyxxQkFDZEM7UUFFQSxPQUFPQyxXQUFBQSxnQkFBZ0IsRUFBQ0Q7QUFDMUI7SUFFTSxTQUFVRSx3QkFDZEYsR0FDQUc7UUFFQSxNQUFNQyxRQUFRQyxXQUFBQSxjQUFjLEVBQUNMO1FBQzdCLE1BQU1NLFVBQTRDSCxTQUFTLENBQUE7UUFDM0RDLE1BQU1HLFFBQVNDO1lBQ2JGLFFBQVFFLElBQUlDLE9BQU9EOztRQUVyQixPQUFPSjtBQUNUO0lBRU0sU0FBVU0sY0FBY0M7UUFFNUIsTUFBTWhCLE9BQU9ELFFBQVE7UUFFckIsTUFBTWtCLFlBQVVsQixRQUFRQyxLQUFLa0IsS0FBS0MsUUFBUUMsT0FBT0osS0FBS0ssWUFBWUwsS0FBS007UUFFdkUsTUFBTUMsU0FBU0MsT0FBT0QsT0FBT04sV0FBU1EsT0FBUUM7WUFDNUM7Z0JBQ0UsTUFBTXJCLElBQUksSUFBS3FCO2dCQUNmLE9BQU9yQixhQUFhc0Isb0JBQUFBO0FBRXRCLGNBQUUsT0FBT0Q7Z0JBQ1AsT0FBTztBQUNUOztRQUVGLE9BQU9IO0FBQ1Q7SUFFT0ssZUFBZUMsb0JBQ2pCQztRQUdILE1BQU1oQyxLQUFLQyxRQUFRO1FBRW5CLE1BQU1nQyxTQUFrQztRQUV4QyxLQUFLLE1BQU1DLFVBQVVGLFNBQVM7WUFDNUIsTUFBTUcsUUFBUW5DLEdBQ1hvQyxZQUFZRixRQUFRO2dCQUNuQkcsZUFBZTtnQkFDZkMsV0FBVztlQUVaWCxPQUFRWSxLQUFXQSxFQUFFQyxZQUFZRCxFQUFFZixLQUFLaUIsU0FBUztZQUNwRCxLQUFLLE1BQU12QixRQUFRaUIsT0FBTztnQkFDeEJGLE9BQU9TLFFBQVF6QixjQUFjQztBQUMvQjtBQUNGO1FBQ0EsT0FBT2U7QUFDVDtJQUVNLFNBQVVVLGFBQ2RDLFNBQ0FDLElBQVl4QixRQUFRQyxPQUNwQndCO1FBR0EsTUFBTTlDLEtBQUtDLFFBQVE7UUFFbkIsTUFBTUMsT0FBT0QsUUFBUTtRQUVyQjJDLFFBQVE5QixRQUFTaUM7WUFDZixNQUFNN0IsT0FBT2hCLEtBQUs4QyxRQUNoQjlDLEtBQUtrQixLQUNIeUIsR0FDQSw4QkFBOEJDLGFBQWEsZUFBZUEsZ0JBQWdCLGFBQWFDLE1BQU12QjtZQUdqRzFCLHlCQUF5Qm9CO1lBQ3pCbEIsR0FBR2lELGNBQWMvQixNQUFNZ0MsS0FBS0MsVUFBVUosT0FBT0ssV0FBVzs7QUFFNUQ7SUFFTSxTQUFVQyxnQkFDZEMsWUFDQVQsSUFBWXhCLFFBQVFDLE9BQ3BCd0I7UUFFQSxLQUFLUSxXQUFXQyxRQUFRO1FBRXhCLE1BQU12RCxLQUFLQyxRQUFRO1FBRW5CLE1BQU1DLE9BQU9ELFFBQVE7UUFFckJxRCxXQUFXeEMsUUFBU0M7WUFDbEIsTUFBTXlDLFFBQVF6QyxJQUFJQyxJQUFJeUMsUUFBUSxjQUFjO1lBQzVDLE1BQU12QyxPQUFPaEIsS0FBSzhDLFFBQ2hCOUMsS0FBS2tCLEtBQ0h5QixHQUNBLDhCQUE4QkMsYUFBYSxlQUFlQSxnQkFBZ0IsaUJBQWlCVTtZQUcvRjFELHlCQUF5Qm9CO1lBQ3pCLE1BQU13QyxVQUFVO21CQUFLM0M7O21CQUNkMkMsUUFBUUM7WUFDZjNELEdBQUdpRCxjQUFjL0IsTUFBTWdDLEtBQUtDLFVBQVVPLFNBQVNOLFdBQVc7O0FBRTlEO0lDckVNLFNBQVVRLGNBQ2RDLGdCQUNBQyxRQUNBQyxtQkFDQUMsY0FDQUMsYUFDQUMsZ0JBQ0FDO1FBRUEsT0FBTztZQUNMM0MsTUFBTXFDO1lBQ05DLFFBQVFBO1lBQ1JDO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FDOztBQUVKO0lBRU0sU0FBVUMscUJBQ2RDLE9BQ0FSLGlCQUF5QixHQUFHUSxnQkFDNUJOLG9CQUE0QixHQUM1QkMsZUFBdUIsR0FDdkJDLGNBQXNCLEdBQ3RCQyxpQkFBMEIsTUFDMUJDLGtCQUEyQjtRQUUzQixNQUFNRyxJQUFJVixjQUNSQyxnQkFDQSxPQUFPUSxrQkFDUE4sbUJBQ0FDLGNBQ0FDLGFBQ0FDLGdCQUNBQztRQUdGRyxFQUFFQyxvQkFBb0I7WUFDcEJDLGlCQUFpQixPQUFPSDs7UUFFMUIsT0FBT0M7QUFDVDtJQUVNLFNBQVVHLG9CQUNkQyxRQUNBYixnQkFDQUUsb0JBQTRCLEdBQzVCQyxlQUF1QixHQUN2QkMsY0FBc0IsR0FDdEJDLGlCQUEwQixNQUMxQkMsa0JBQTJCO1FBRTNCLE1BQU1HLElBQUlWLGNBQ1JDLGdCQUNBLE1BQU1hLE9BQU9DLElBQUtwRSxLQUFNLElBQUlBLGFBQWFhLEtBQUssU0FDOUMyQyxtQkFDQUMsY0FDQUMsYUFDQUMsZ0JBQ0FDO1FBRUZHLEVBQUVDLG9CQUFvQjtZQUNwQkMsaUJBQWlCLE9BQU9FLE9BQU9DLElBQUtwRSxLQUFNLElBQUlBLFdBQVdhLEtBQUs7O1FBRWhFLE9BQU9rRDtBQUNUO0lBRU94QyxlQUFlOEMsbUJBQ3BCckUsR0FDQW1FLFFBQ0FHLFlBR0ksQ0FBQSxHQUNKQyxTQUFrQjtRQUVsQixLQUFJQyxhQUFFQSxhQUFXQyxZQUFFQSxjQUFlbkQsb0JBQUFBLE1BQU1vRCxlQUFlMUU7UUFFdkQsU0FBUzJFLGtCQUFrQkM7WUFDekI7Z0JBQ0UsV0FBV0EsUUFBUSxVQUFVLE9BQU9BO2dCQUNwQyxPQUFPQSxJQUFJNUUsR0FBR21FLE9BQU87QUFDdkIsY0FBRSxPQUFPOUM7Z0JBQ1AsTUFBTSxJQUFJd0QsYUFBQUEsY0FBY3hEO0FBQzFCO0FBQ0Y7UUFFQW1ELGNBQWNBLFlBQVlKLElBQUlPO1FBQzlCRixhQUFhQSxXQUFXTCxJQUFJTztRQUU1QixNQUFNRyxrQkFBa0IzRCxPQUFPNEQsT0FDN0IsSUFDQTtZQUNFdkIsbUJBQW1CO1lBQ25CQyxjQUFjO1lBQ2RDLGFBQWE7WUFDYkMsZ0JBQWdCO1lBQ2hCQyxpQkFBaUI7V0FFbkJVLFdBQVdFLGVBQWU7UUFFNUIsTUFBTVEsaUJBQWlCN0QsT0FBTzRELE9BQzVCLElBQ0E7WUFDRXZCLG1CQUFtQjtZQUNuQkMsY0FBYztZQUNkQyxhQUFhO1lBQ2JDLGdCQUFnQjtZQUNoQkMsaUJBQWlCO1dBRW5CVSxXQUFXRyxjQUFjO1FBRzNCLE1BQU1RLGFBQWFWLFNBQVNqRCxvQkFBQUEsTUFBTTRELFdBQVdsRixLQUFLNkM7UUFFbEQsTUFBTXNDLFdBQVdoQixPQUNkQyxJQUFLTixTQUNIVSxZQUF5QkosSUFBSzlCO1lBQzdCLE9BQU1rQixtQkFBRUEsbUJBQWlCQyxjQUFFQSxjQUFZQyxhQUFFQSxhQUFXQyxnQkFBRUEsa0JBQ3BEbUI7WUFDRixPQUFPakIscUJBQ0xDLE9BQ0F4QixHQUNBa0IsbUJBQ0FDLGNBQ0FDLGFBQ0FDLGdCQUNBO1lBSUx5QjtRQUVILElBQUlILGNBQWNBLFdBQVduQixPQUFPO1lBQ2xDLE1BQU11QixrQkFDR0osV0FBV0ssYUFBYSxXQUMzQkwsV0FBV0ssV0FDWEwsV0FBV0ssU0FBU3RGLEdBQUdpRixXQUFXbkI7WUFDeEMsSUFDRXVCLGFBQ0NGLFNBQVNJLEtBQ1BqRCxLQUFNQSxFQUFFckIsU0FBU29FLFlBQVkvQyxFQUFFaUIsT0FBT2lDLFNBQVNQLFdBQVduQixTQUU3RDtnQkFDQSxPQUFNTixtQkFBRUEsbUJBQWlCQyxjQUFFQSxjQUFZQyxhQUFFQSxhQUFXQyxnQkFBRUEsa0JBQ3BEbUI7Z0JBQ0ZLLFNBQVNoRCxLQUNQMEIscUJBQ0VvQixXQUFXbkIsT0FDWHVCLFVBQ0E3QixtQkFDQUMsY0FDQUMsYUFDQUMsZ0JBQ0E7QUFHTjtBQUNGO1FBRUEsTUFBTThCLFNBQVVoQixXQUF3QkwsSUFBSzlCO1lBQzNDLE9BQU1rQixtQkFDSkEsbUJBQWlCQyxjQUNqQkEsY0FBWUMsYUFDWkEsYUFBV0MsZ0JBQ1hBLGdCQUFjQyxpQkFDZEEsbUJBQ0VvQjtZQUNKLE9BQU9kLG9CQUNMQyxRQUNBN0IsR0FDQWtCLG1CQUNBQyxjQUNBQyxhQUNBQyxnQkFDQUM7O1FBSUosT0FBTztZQUNMdUI7WUFDQU07O0FBRUo7SUFFTSxTQUFVQyxpQkFDZEMsTUFDQXJELElBQVl4QixRQUFRQyxPQUNwQjZFLFdBQVc7UUFHWCxNQUFNbkcsS0FBS0MsUUFBUTtRQUVuQixNQUFNQyxPQUFPRCxRQUFRO1FBRXJCLFNBQVNILHlCQUF5QkM7WUFDaEMsTUFBTUksVUFBa0JELEtBQUtDLFFBQVFKO1lBQ3JDLElBQUlDLEdBQUdJLFdBQVdELFVBQVU7Z0JBQzFCLE9BQU87QUFDVDtZQUNBTCx5QkFBeUJLO1lBQ3pCSCxHQUFHSyxVQUFVRjtBQUNmO1FBRUEsTUFBTWUsT0FBT2hCLEtBQUs4QyxRQUFROUMsS0FBS2tCLEtBQUt5QixHQUFHLGNBQWNzRDtRQUNyRHJHLHlCQUF5Qm9CO1FBQ3pCbEIsR0FBR2lELGNBQWMvQixNQUFNZ0MsS0FBS0MsVUFBVStDLE1BQU05QyxXQUFXO0FBQ3pEO0lBRU0sU0FBVWdELDBCQUNkQyxNQUNBeEQsSUFBWXhCLFFBQVFDLE9BQ3BCd0I7UUFFQSxLQUFLdUQsTUFBTTlDLFFBQVE7UUFDbkJGLGdCQUFnQmdELE1BQU14RCxHQUFHQztBQUMzQjtJQ3pRTSxNQUFPd0QsOEJBQStDQyxLQUFBQTtRQU8xRCxXQUFBQyxDQUNFQyxTQUNBQyxPQUNBQyxNQUNBQztZQUVBQyxNQUFNSixTQUFTQyxPQUFPQyxNQUFNQztBQUM5QjtRQUdVLE9BQUFFLENBQVFDO1lBQ2hCLE1BQU0sSUFBSUMsS0FBQUEsaUJBQ1I7QUFFSjtRQUVTLElBQUFDLENBQ1BBLE9BQWUsTUFDWkM7WUFFSCxPQUFPTCxNQUFNSSxLQUFLQSxTQUFTQztBQUM3QjtRQUVBLHVCQUFnQkMsQ0FBaUJDO1lBQy9CLE9BQU9BLGNBQWNBLFFBQVEsWUFBWUMsTUFBTUMsUUFBUUYsSUFBSUc7QUFDN0Q7O0lDV0ksTUFBT0MsK0JBR0hDLEtBQUFBO1FBV1IsV0FBQWpCLENBQVlDLFNBQWFHLE9BQXdCYyxRQUFpQjtZQUNoRWIsTUFBTUosU0FBU0csT0FBT2M7WUFYTEMsS0FBQUMsYUFBYWxHLE9BQU80RCxPQUFPLENBQUEsR0FBSXVCLE1BQU0sZUFBZTtnQkFDckVnQixrQkFBa0I7Z0JBQ2xCQyxnQkFBZ0I7Z0JBQ2hCQyxvQkFBb0I7Z0JBQ3BCQywyQkFBMkI7Z0JBQzNCQyw0QkFBNEI7Z0JBQzVCQyx5QkFBeUI7Z0JBQ3pCQyxzQkFBc0I7O0FBS3hCO1FBRVMsUUFBQUMsQ0FBU0M7WUFDaEIsT0FBT3hCLE1BQ0p1QixTQUFTMUcsT0FBTzRELE9BQU8sQ0FBQSxHQUFJK0MsT0FBT1YsS0FBS0MsYUFDdkNVLElBQUlEO0FBQ1Q7UUFFbUIsZUFBQUU7WUFDakIsT0FBTzFCLE1BQU0wQjtBQUNmO1FBRVMsZ0JBQU1DLENBQ2JDLEtBQ0FDLE9BQ0FDLE1BQStDO1lBQzdDQyxRQUFRO1lBQ1JDLE9BQU87Y0FFTjNCO1lBRUgsT0FBTTRCLEtBQUVBLEtBQUdDLFNBQUVBLGtCQUNMcEIsS0FBS3FCLE9BQU85QixNQUFNK0IsS0FBQUEsc0JBQXNCQyxTQUFTLE9BQ3ZEWixJQUFJWCxLQUFLYTtZQUNYTSxJQUFJSyxRQUNGLGNBQWN0SCxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEIseUJBQXlCVixJQUFJRTtZQUVsRSxPQUFPbEIsS0FBSzJCLFVBQ1YzQixLQUFLYSxXQUFXaEgsTUFDaEJpSCxLQUNBQyxPQUNBO2dCQUFFRyxPQUFPRixJQUFJRTtnQkFBT0QsUUFBUUQsSUFBSUM7Z0JBQVFXLFVBQVVaLElBQUlZO2tCQUNuRFI7QUFFUDtRQUVTLFlBQU1TLENBQ2JmLEtBQ0FDLFVBQ0d4QjtZQUVILE9BQU00QixLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHBCLEtBQUtxQixPQUFPOUIsTUFBTStCLEtBQUFBLHNCQUFzQlEsU0FBUyxPQUN2RG5CLElBQUlYLEtBQUs2QjtZQUNYVixJQUFJSyxRQUNGLFdBQVd0SCxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEIsYUFBYVosT0FBaUJDO1lBRWhFLGFBQWNmLEtBQUsyQixVQUNqQjNCLEtBQUs2QixPQUFPaEksTUFDWmlILEtBQ0FDLFVBQ0dLO0FBRVA7UUFFUyxZQUFNVyxDQUNiakIsS0FDQWtCLFVBQ0d6QztZQUVILE9BQU00QixLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHBCLEtBQUtxQixPQUFPOUIsTUFBTStCLEtBQUFBLHNCQUFzQlcsU0FBUyxPQUN2RHRCLElBQUlYLEtBQUsrQjtZQUNYWixJQUFJSyxRQUNGLGVBQWV0SCxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEIsZUFBZVosT0FBaUJrQjtZQUV0RSxhQUFjaEMsS0FBSzJCLFVBQ2pCM0IsS0FBSytCLE9BQU9sSSxNQUNaaUgsS0FDQWtCLFVBQ0daO0FBRVA7UUFFUyxlQUFNYyxDQUNicEIsS0FDQWtCLFVBQ0d6QztZQUVILE9BQU00QixLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHBCLEtBQUtxQixPQUFPOUIsTUFBTStCLEtBQUFBLHNCQUFzQmEsYUFBYSxPQUMzRHhCLElBQUlYLEtBQUtrQztZQUNYZixJQUFJSyxRQUNGLGVBQWV0SCxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEIsZUFBZVosT0FBaUJrQjtZQUV0RSxhQUFjaEMsS0FBSzJCLFVBQ2pCM0IsS0FBS2tDLFVBQVVySSxNQUNmaUgsS0FDQWtCLFVBQ0daO0FBRVA7UUFFUyxVQUFNZ0IsQ0FDYkosT0FDQWpCLFFBQXdCc0IsS0FBQUEsZUFBZUMsUUFDcEMvQztZQUVILE9BQU00QixLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHBCLEtBQUtxQixPQUFPOUIsTUFBTStCLEtBQUFBLHNCQUFzQmlCLE1BQU0sT0FDcEQ1QixJQUFJWCxLQUFLb0M7WUFDWGpCLElBQUlLLFFBQ0YsV0FBV3RILG9CQUFBQSxNQUFNdUgsVUFBVXpCLEtBQUswQjtZQUVsQyxhQUFjMUIsS0FBSzJCLFVBQ2pCM0IsS0FBS29DLEtBQUt2SSxNQUNWbUksT0FDQWpCLFVBQ0dLO0FBRVA7UUFFUyxVQUFNOUIsQ0FDYjBDLE9BQ0FRLFlBQTRCSCxLQUFBQSxlQUFlQyxLQUMzQ3RCLE1BQStDO1lBQzdDQyxRQUFRO1lBQ1JDLE9BQU87Y0FFTjNCO1lBRUgsT0FBTTRCLEtBQUVBLEtBQUdDLFNBQUVBLGtCQUNMcEIsS0FBS3FCLE9BQU85QixNQUFNK0IsS0FBQUEsc0JBQXNCbUIsTUFBTSxPQUNwRDlCLElBQUlYLEtBQUtWO1lBQ1g2QixJQUFJSyxRQUNGLFVBQVV0SCxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEI7WUFFakMsYUFBYzFCLEtBQUsyQixVQUNqQjNCLEtBQUtWLEtBQUt6RixNQUNWbUksT0FDQVEsV0FDQXhCLFFBQ0dJO0FBRVA7UUFFUyxlQUFNTyxDQUNiOUgsU0FDRzBGO1lBRUgsT0FBTTRCLEtBQUVBLEtBQUd1QixLQUFFQSxLQUFHdEIsU0FBRUEsa0JBQ1ZwQixLQUFLcUIsT0FBTzlCLE1BQU1vRCxLQUFBQSxnQkFBZ0JDLFdBQVcsT0FDbkRqQyxJQUFJWCxLQUFLMkI7WUFDWFIsSUFBSUssUUFBUSxnQ0FBZ0MzSDtZQUM1QyxNQUFNZ0osV0FBV3pCLFFBQVEwQixNQUFNLElBQUk7WUFDbkMsTUFBTXhJLFNBQVNpQixLQUFLd0gsTUFDbEIvQyxLQUFLbEIsUUFBUWtFLGFBQ0xoRCxLQUFLbEIsUUFBUW1FLG9CQUNqQlAsS0FDQUMsS0FBQUEsZ0JBQWdCQyxXQUNoQixFQUFDL0ksTUFBTTBCLEtBQUtDLFVBQVVxSCxhQUN0QnBILFdBQ0FBLFdBQ0F1RSxLQUFLMEIsTUFBTTdIO1lBS2pCLElBQUlxSjtZQUNKLElBQUl4RCxNQUFNQyxRQUFRckYsU0FBUztnQkFDekI0SSxXQUFXNUksT0FBTzBDLElBQUttRyxLQUNwQkEsRUFBVUMsV0FBQUEsWUFBWUMsVUFDdEJGLEVBQVVDLFdBQUFBLFlBQVlDLFdBQVduSixvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEIsU0FDbEQsSUFBSTFCLEtBQUswQixNQUFNeUIsS0FDaEJBO0FBRVIsbUJBQU8sSUFDSjdJLE9BQWU4SSxXQUFBQSxZQUFZQyxVQUMzQi9JLE9BQWU4SSxXQUFBQSxZQUFZQyxXQUFXbkosb0JBQUFBLE1BQU11SCxVQUFVekIsS0FBSzBCLFFBQzVEO2dCQUNBd0IsV0FBVyxJQUFJbEQsS0FBSzBCLE1BQU1wSDtBQUM1QixtQkFBTyxJQUFJcUUsc0JBQXNCYSxpQkFBaUJsRixTQUFTO2dCQUN6RDRJLFdBQVduSixPQUFPNEQsT0FBT3JELFFBQVE7b0JBQy9Cc0YsTUFBTXRGLE9BQU9zRixLQUFLNUMsSUFBS3NHLEtBQVcsSUFBSXRELEtBQUswQixNQUFNNEI7O0FBRXJELG1CQUFPO2dCQUNMSixXQUFXNUk7QUFDYjtZQUVBLE9BQU8wRixLQUFLdUQsZUFBZUwsVUFBVVI7QUFDdkM7UUFFUSxvQkFBTWEsQ0FBZXZCLE9BQVlVO1lBQ3ZDLEtBQUtBLElBQUljLGVBQWUsdUJBQXVCLE9BQU94QjtZQUN0RCxJQUFJQSxpQkFBaUI5SCxvQkFBQUEsT0FBTztzQkFDcEJ1SixhQUFBQSxvQkFDSnpELE1BQ0EwQyxLQUNBVixPQUNBMEIsYUFBQUEsY0FBY0MsTUFDZEQsYUFBQUEsY0FBY0U7Z0JBRWhCLE9BQU81QjtBQUNUO1lBQ0EsSUFBSXRDLE1BQU1DLFFBQVFxQyxRQUFRO3NCQUNsQjZCLFFBQVFDLElBQUk5QixNQUFNaEYsSUFBSytHLFNBQVUvRCxLQUFLdUQsZUFBZVEsT0FBT3JCO2dCQUNsRSxPQUFPVjtBQUNUO1lBQ0EsSUFBSXJELHNCQUFzQmEsaUJBQWlCd0MsUUFBUTtzQkFDM0NoQyxLQUFLdUQsZUFBZXZCLE1BQU1wQyxNQUFNOEM7Z0JBQ3RDLE9BQU9WO0FBQ1Q7WUFDQSxPQUFPQTtBQUNUO1FBRVMsYUFBTWdDLENBQ2JsRCxRQUNHdkI7WUFFSCxPQUFNNEIsS0FBRUEsS0FBR0MsU0FBRUEsa0JBQ0xwQixLQUFLcUIsT0FBTzlCLE1BQU0rQixLQUFBQSxzQkFBc0IyQyxVQUFVLE9BQ3hEdEQsSUFBSVgsS0FBS2dFO1lBQ1g3QyxJQUFJSyxRQUNGLFlBQVl0SCxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEIsU0FBU1osTUFBTSxPQUFPQSxRQUFrQjtZQUUzRSxNQUFNb0QsV0FBV3BELE1BQU0sRUFBQ0EsUUFBUU0sWUFBV0E7WUFDM0MsT0FBT3BCLEtBQUsyQixVQUFVTCxLQUFBQSxzQkFBc0IyQyxhQUFhQztBQUMzRDtRQUVTLFdBQU1DLENBQ2JyRCxRQUNHdkI7WUFFSCxPQUFNNEIsS0FBRUEsS0FBR0MsU0FBRUEsa0JBQ0xwQixLQUFLcUIsT0FBTzlCLE1BQU0rQixLQUFBQSxzQkFBc0I4QyxRQUFRLE9BQ3REekQsSUFBSVgsS0FBS21FO1lBQ1hoRCxJQUFJSyxRQUNGLGtCQUFrQlYsVUFBb0I1RyxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEI7WUFFN0QsT0FBTzFCLEtBQUsyQixVQUFVTCxLQUFBQSxzQkFBc0I4QyxRQUFRdEQsUUFBUU07QUFDOUQ7UUFFUyxXQUFNaUQsQ0FDYnZELFFBQ0d2QjtZQUVILE9BQU00QixLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHBCLEtBQUtxQixPQUFPOUIsTUFBTStCLEtBQUFBLHNCQUFzQmdELFFBQVEsT0FDdEQzRCxJQUFJWCxLQUFLcUU7WUFDWGxELElBQUlLLFFBQ0Ysa0JBQWtCVixVQUFvQjVHLG9CQUFBQSxNQUFNdUgsVUFBVXpCLEtBQUswQjtZQUU3RCxPQUFPMUIsS0FBSzJCLFVBQVVMLEtBQUFBLHNCQUFzQmdELFFBQVF4RCxRQUFRTTtBQUM5RDtRQUVTLFdBQU1tRCxDQUNiekQsUUFDR3ZCO1lBRUgsT0FBTTRCLEtBQUVBLEtBQUdDLFNBQUVBLGtCQUNMcEIsS0FBS3FCLE9BQU85QixNQUFNK0IsS0FBQUEsc0JBQXNCa0QsUUFBUSxPQUN0RDdELElBQUlYLEtBQUt1RTtZQUNYcEQsSUFBSUssUUFDRixzQkFBc0JWLFVBQW9CNUcsb0JBQUFBLE1BQU11SCxVQUFVekIsS0FBSzBCO1lBRWpFLE9BQU8xQixLQUFLMkIsVUFBVUwsS0FBQUEsc0JBQXNCa0QsUUFBUTFELFFBQVFNO0FBQzlEO1FBRVMsV0FBTXFELENBQ2IzRCxRQUNHdkI7WUFFSCxPQUFNNEIsS0FBRUEsS0FBR0MsU0FBRUEsa0JBQ0xwQixLQUFLcUIsT0FBTzlCLE1BQU0rQixLQUFBQSxzQkFBc0JvRCxRQUFRLE9BQ3REL0QsSUFBSVgsS0FBS3lFO1lBQ1h0RCxJQUFJSyxRQUNGLHNCQUFzQlYsVUFBb0I1RyxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEI7WUFFakUsT0FBTzFCLEtBQUsyQixVQUFVTCxLQUFBQSxzQkFBc0JvRCxRQUFRNUQsUUFBUU07QUFDOUQ7UUFFUyxnQkFBTXVELENBQ2I3RCxRQUNHdkI7WUFFSCxPQUFNNEIsS0FBRUEsS0FBR0MsU0FBRUEsa0JBQ0xwQixLQUFLcUIsT0FBTzlCLE1BQU0rQixLQUFBQSxzQkFBc0JzRCxhQUFhLE9BQzNEakUsSUFBSVgsS0FBSzJFO1lBQ1h4RCxJQUFJSyxRQUNGLDhCQUE4QlYsVUFBb0I1RyxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEI7WUFFekUsT0FBTzFCLEtBQUsyQixVQUFVTCxLQUFBQSxzQkFBc0JzRCxhQUFhOUQsUUFBUU07QUFDbkU7UUFFUyxhQUFNeUQsQ0FDYi9ELFFBQ0d2QjtZQUVILE9BQU00QixLQUFFQSxLQUFHQyxTQUFFQSxrQkFDTHBCLEtBQUtxQixPQUFPOUIsTUFBTStCLEtBQUFBLHNCQUFzQndELFVBQVUsT0FDeERuRSxJQUFJWCxLQUFLNkU7WUFDWDFELElBQUlLLFFBQVEsWUFBWXRILDBCQUFNdUgsVUFBVXpCLEtBQUswQixhQUFhWjtZQUMxRCxPQUFPZCxLQUFLMkIsVUFBVUwsS0FBQUEsc0JBQXNCd0QsVUFBVWhFLFFBQVFNO0FBQ2hFO1FBRUEsaUJBQU0yRCxJQUFleEY7WUFDbkIsT0FBTTZCLFNBQUVBLFdBQVlwQixLQUFLcUIsT0FBTzlCLE1BQU1TLEtBQUsrRTtZQUUzQyxNQUFNekssZUFBZTBGLEtBQUtsQixRQUFRaUcsWUFBWS9FLEtBQUswQixVQUFVTjtZQUU3RCxPQUFPOUc7QUFDVDtRQUVTLFlBQU0wSyxDQUNiQyxVQUNHMUY7WUFFSCxPQUFNbUQsS0FBRUEsS0FBR3ZCLEtBQUVBLEtBQUdDLFNBQUVBLFdBQVlwQixLQUFLcUIsT0FBTzlCLE1BQU1TLEtBQUtnRjtZQUNyRDdELElBQUkrRCxNQUNGLGdCQUFnQmxGLEtBQUswQixNQUFNN0gsaUJBQWlCSyxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEI7WUFFbkUxQixLQUFLbUYsdUJBQXVCekMsS0FBS3VDO1lBQ2pDLE1BQU1HLFdBQVdwRixLQUFLbEIsUUFBUUssUUFBUThGLE9BQU92QztZQUM3QyxPQUFNMkMsUUFBRUEsUUFBTUMsSUFBRUEsSUFBRUMsV0FBRUEsYUFBY0g7WUFDbEMsTUFBTTlLLGVBQWUwRixLQUFLbEIsUUFBUWtHLE9BQ2hDaEYsS0FBSzBCLE9BQ0w0RCxJQUNBRCxRQUNBRSxjQUNHbkU7WUFFTCxPQUFPcEIsS0FBS2xCLFFBQVEwRyxPQUFVbEwsUUFBUTBGLEtBQUswQixPQUFPNEQsSUFBSUMsV0FBVzdDO0FBQ25FO1FBRVMsWUFBTStDLENBQ2JSLFVBQ0cxRjtZQUVILE9BQU02QixTQUFFQSxTQUFPRCxLQUFFQSxLQUFHdUIsS0FBRUEsT0FBUTFDLEtBQUtxQixPQUFPOUIsTUFBTVMsS0FBS3lGO1lBQ3JEekYsS0FBS21GLHVCQUF1QnpDLEtBQUt1QztZQUNqQyxNQUFNRyxXQUFXcEYsS0FBS2xCLFFBQVFLLFFBQVE4RixPQUFPdkM7WUFDN0MsT0FBTTRDLElBQUVBLElBQUVDLFdBQUVBLGFBQWNIO1lBQzFCLElBQUlDLFNBQVNELFNBQVNDO1lBQ3RCbEUsSUFBSStELE1BQ0YsWUFBWWxGLEtBQUswQixNQUFNN0gsaUJBQWlCSyxvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEIsa0JBQWtCNEQ7WUFFakZELGVBQWVyRixLQUFLbEIsUUFBUTJHLE9BQzFCekYsS0FBSzBCLE9BQ0w0RCxJQUNBRCxRQUNBRSxjQUNHbkU7WUFFTCxPQUFPcEIsS0FBS2xCLFFBQVEwRyxPQUFVSCxRQUFRckYsS0FBSzBCLE9BQU80RCxJQUFJQyxXQUFXN0M7QUFDbkU7UUFFbUIscUJBQU1nRCxDQUN2QkMsV0FDR3BHO1lBRUgsT0FBTW1ELEtBQUVBLEtBQUd0QixTQUFFQSxrQkFDTHBCLEtBQUtxQixPQUFPOUIsTUFBTW1FLGFBQUFBLGNBQWNrQyxRQUFRLE9BQzlDakYsSUFBSVgsS0FBSzBGO1lBQ1gsTUFBTXZGLGlCQUFpQnVDLElBQUltRCxJQUFJO1lBQy9CLE1BQU1DLGlCQUFpQnBELElBQUltRCxJQUFJO1lBQy9CLEtBQUtGLE9BQU8vSixRQUFRLE9BQU8sRUFBQytKLFdBQVd2RTtZQUV2Q3VFLGVBQWU5QixRQUFRQyxJQUNyQjZCLE9BQU8zSSxJQUFJN0MsTUFBT3ZCO2dCQUNoQkEsSUFBSSxJQUFJb0gsS0FBSzBCLE1BQU05STtnQkFDbkIsS0FBS3VILHNCQUNHc0QsYUFBQUEsb0JBQ0p6RCxNQUNBMEMsS0FDQTlKLEdBQ0E4SyxhQUFBQSxjQUFja0MsUUFDZGxDLGFBQUFBLGNBQWNxQztnQkFFbEIsT0FBT25OOztZQUlYLEtBQUtrTixnQkFBZ0I7Z0JBQ25CLE1BQU1FLGVBQWV0RCxJQUFJbUQsSUFBSSxrQ0FBa0M7Z0JBRS9ELE1BQU1JLGVBQWVwQyxRQUFRQyxJQUMzQjZCLE9BQU8zSSxJQUFLcEUsS0FBTWlMLFFBQVF4SSxRQUFRekMsRUFBRXNOLGFBQWFGO2dCQUduRCxNQUFNRyxnQkFBZ0JDLGFBQUFBLG9CQUFvQkg7Z0JBRTFDLElBQUlFLGVBQWUsTUFBTSxJQUFJRSxhQUFBQSxnQkFBZ0JGO0FBQy9DO1lBQ0EsT0FBTyxFQUFDUixXQUFXdkU7QUFDckI7UUFFUyxlQUFNa0YsQ0FDYlgsV0FDR3BHO1lBRUgsS0FBS29HLE9BQU8vSixRQUFRLE9BQU8rSjtZQUMzQixPQUFNakQsS0FBRUEsS0FBR3ZCLEtBQUVBLEtBQUdDLFNBQUVBLFdBQVlwQixLQUFLcUIsT0FBTzlCLE1BQU1TLEtBQUtzRztZQUNyRG5GLElBQUkrRCxNQUNGLFlBQVlTLE9BQU8vSixjQUFjb0UsS0FBSzBCLE1BQU03SCxpQkFBaUJLLDBCQUFNdUgsVUFBVXpCLEtBQUswQjtZQUdwRmlFLE9BQU94TSxRQUFTOEwsU0FBVWpGLEtBQUttRix1QkFBdUJ6QyxLQUFLdUM7WUFDM0QsTUFBTUcsV0FBV08sT0FBTzNJLElBQUtwRSxLQUFNb0gsS0FBS2xCLFFBQVFLLFFBQVF2RyxHQUFHOEo7WUFDM0QsTUFBTTZELE1BQU1uQixTQUFTcEksSUFBSzlCLEtBQU1BLEVBQUVvSztZQUNsQyxNQUFNa0IsV0FBV3BCLFNBQVNwSSxJQUFLOUIsS0FBTUEsRUFBRW1LO1lBQ3ZDLE1BQU1vQixhQUFhckIsU0FBU3BJLElBQUs5QixLQUFNQSxFQUFFcUs7WUFDekMsTUFBTW1CLGdCQUFnQjFHLEtBQUtsQixRQUFRd0gsVUFDakN0RyxLQUFLMEIsT0FDTDZFLEtBQ0FDLFVBQ0FDLGVBQ0dyRjtZQUVMLE9BQU95QyxRQUFRQyxJQUNiNEMsUUFBUTFKLElBQUk3QyxPQUFPZ0osR0FBR3dEO2dCQUNwQixNQUFNckIsS0FBS2lCLElBQUlJO2dCQUNmLE9BQU8zRyxLQUFLbEIsUUFBUTBHLE9BQVVyQyxHQUFHbkQsS0FBSzBCLE9BQU80RCxJQUFJbUIsV0FBV0UsSUFBSWpFOztBQUd0RTtRQUVTLGFBQU1rRSxDQUNiQyxTQUNHdEg7WUFFSCxPQUFNbUQsS0FBRUEsS0FBR3ZCLEtBQUVBLEtBQUdDLFNBQUVBLFdBQVlwQixLQUFLcUIsT0FBTzlCLE1BQU1TLEtBQUs0RztZQUNyRHpGLElBQUkrRCxNQUNGLFdBQVcyQixLQUFLakwsVUFBVW9FLEtBQUswQixNQUFNN0gsaUJBQWlCSywwQkFBTXVILFVBQVV6QixLQUFLMEI7WUFFN0UsTUFBTW9GLGdCQUFnQjlHLEtBQUtsQixRQUFROEgsUUFBUTVHLEtBQUswQixPQUFPbUYsU0FBU3pGO1lBQ2hFLE9BQU8wRixRQUFROUosSUFBSSxDQUFDbUcsR0FBR3dELE1BQ3JCM0csS0FBS2xCLFFBQVEwRyxPQUFPckMsR0FBR25ELEtBQUswQixPQUFPbUYsS0FBS0YsSUFBSSxDQUFBLEdBQUlqRTtBQUVwRDtRQUVTLGVBQU1xRSxDQUNicEIsV0FDR3BHO1lBRUgsT0FBTW1ELEtBQUVBLEtBQUd2QixLQUFFQSxLQUFHQyxTQUFFQSxXQUFZcEIsS0FBS3FCLE9BQU85QixNQUFNUyxLQUFLK0c7WUFDckQ1RixJQUFJK0QsTUFDRixZQUFZUyxPQUFPL0osY0FBY29FLEtBQUswQixNQUFNN0gsaUJBQWlCSywwQkFBTXVILFVBQVV6QixLQUFLMEI7WUFHcEZpRSxPQUFPeE0sUUFBUzhMLFNBQVVqRixLQUFLbUYsdUJBQXVCekMsS0FBS3VDO1lBQzNELE1BQU1HLFdBQVdPLE9BQU8zSSxJQUFLcEUsS0FBTW9ILEtBQUtsQixRQUFRSyxRQUFRdkcsR0FBRzhKO1lBQzNELE1BQU02RCxNQUFNbkIsU0FBU3BJLElBQUs5QixLQUFNQSxFQUFFb0s7WUFDbEMsTUFBTTBCLGdCQUFnQmhILEtBQUtsQixRQUFRaUksVUFDakMvRyxLQUFLMEIsT0FDTDZFLEtBQ0FuQixTQUFTcEksSUFBS21HLEtBQU1BLEVBQUVrQyxTQUN0QkQsU0FBU3BJLElBQUttRyxLQUFNQSxFQUFFb0MsZUFDbkJuRTtZQUVMLE9BQU95QyxRQUFRQyxJQUNia0QsUUFBUWhLLElBQUk3QyxPQUFPOE0sR0FBR047Z0JBQ3BCLE1BQU1yQixLQUFLaUIsSUFBSUk7Z0JBQ2YsT0FBTzNHLEtBQUtsQixRQUFRMEcsT0FDbEJ5QixHQUNBakgsS0FBSzBCLE9BQ0w0RCxJQUNBRixTQUFTdUIsR0FBR3BCLFdBQ1o3Qzs7QUFJUjtRQUVRLHNCQUFBeUMsQ0FBdUJ6QyxLQUFtQnVDO1lBQ2hELElBQUkvSyxvQkFBQUEsTUFBTTRELFdBQVdtSCxRQUFRO2dCQUMzQnZDLElBQUl3RSxXQUFXO29CQUFFQyxRQUFROztBQUMzQjtBQUNGOztJQ2xnQkssSUFBTUMsYUFBTixNQUFNQSxtQkFBbUJDO1FBOEI5QixXQUFBeEksQ0FBWWpHO1lBQ1ZzRyxNQUFNdEc7QUFDUjs7SUExQkEwTyxNQUFBQSxXQUFBLEVBTENDLFFBQUc7UUFBRUMsTUFBTUM7bURBS0VMLFdBQUFNLFdBQUEsYUFBQTtJQVFkSixNQUFBQSxXQUFBLEVBTkNLLGVBQ0FDLG9CQUFBQSx1REFLY1IsV0FBQU0sV0FBQSxjQUFBO0lBT2ZKLE1BQUFBLFdBQUEsRUFOQ0ssZUFDQUMsb0JBQUFBLHVEQUtlUixXQUFBTSxXQUFBLGVBQUE7SUFPaEJKLE1BQUFBLFdBQUEsRUFOQ0ssZUFDQUMsb0JBQUFBLHVEQUtpQlIsV0FBQU0sV0FBQSxpQkFBQTtJQTVCUE4sYUFBVUUsaUJBQUEsRUFGdEJPLEtBQUFBLE1BQU0saUJBQ041QyxrRkFDWW1DO0lBcUROLElBQU1VLGNBQU4sTUFBTUEsb0JBQW9CVDtRQStCL0IsV0FBQXhJLENBQVlqRztZQUNWc0csTUFBTXRHO0FBQ1I7O0lBM0JBME8sTUFBQUEsV0FBQSxFQUxDQyxRQUFHO1FBQUVDLE1BQU1DO21EQUtBSyxZQUFBSixXQUFBLFdBQUE7SUFRWkosTUFBQUEsV0FBQSxFQU5DSyxlQUNBQyxvQkFBQUEsdURBS2NFLFlBQUFKLFdBQUEsY0FBQTtJQVFmSixNQUFBQSxXQUFBLEVBTkNLLGVBQ0FDLG9CQUFBQSx1REFLZ0JFLFlBQUFKLFdBQUEsZ0JBQUE7SUFPakJKLE1BQUFBLFdBQUEsRUFMQ0ssS0FBQUEscURBS2dCRyxZQUFBSixXQUFBLGdCQUFBO0lBN0JOSSxjQUFXUixpQkFBQSxFQUZ2Qk8sS0FBQUEsTUFBTSxrQkFDTjVDLGtGQUNZNkM7SUFtRE4sSUFBTUMsWUFBTixNQUFNQSxrQkFBa0JWO1FBOEI3QixXQUFBeEksQ0FBWWpHO1lBQ1ZzRyxNQUFNdEc7QUFDUjs7SUFwQkEwTyxNQUFBQSxXQUFBLEVBWENDLFFBQUc7UUFBRUMsTUFBTUM7UUFLWEUsZUFDQUMsb0JBQUFBLHVEQUtjRyxVQUFBTCxXQUFBLGNBQUE7SUFRZkosTUFBQUEsV0FBQSxFQU5DSyxlQUNBQyxvQkFBQUEsdURBS2dCRyxVQUFBTCxXQUFBLGdCQUFBO0lBUWpCSixNQUFBQSxXQUFBLEVBTkNLLGVBQ0FDLG9CQUFBQSx1REFLY0csVUFBQUwsV0FBQSxjQUFBO0lBNUJKSyxZQUFTVCxpQkFBQSxFQUZyQk8sS0FBQUEsTUFBTSxxQkFDTjVDLGtGQUNZOEM7SUNoR1AsTUFBT0MseUJBQTBDQyxvQkFBQUE7UUFDckQsV0FBQXBKO1lBQ0VLO0FBQ0Y7UUFTbUIsWUFBQWdKLENBQWFqRCxPQUFVa0Q7WUFFeEMsTUFBTUMsY0FBbUNyTyxPQUFPNEQsT0FBTyxDQUFBLEdBQUlzSDtZQUMzRCxJQUFJb0QsV0FBV0MsV0FBQUEsU0FBU0gsVUFBVWxELE1BQU1wRztZQUV4QyxLQUFLd0osWUFBWUEsYUFBYSxVQUM1QixJQUFJRixXQUFXRSxXQUFXRixnQkFFeEIsTUFBTSxJQUFJSSxhQUFBQSxtQkFDUiwrQkFBK0J0RCxNQUFNcEcsWUFBWWhGO1lBRXZEdU8sWUFBWUksb0JBQUFBLFVBQVVDLFVBQVVKO1lBQ2hDLE9BQU9EO0FBQ1Q7UUFRUyxXQUFBTSxDQUFZQztZQUNuQixNQUFNQyxrQkFBa0JyTixLQUFLd0gsTUFBTTRGO1lBQ25DLE1BQU1FLFlBQVlELGdCQUFnQkosb0JBQUFBLFVBQVVDO1lBQzVDLEtBQUtJLFdBQ0gsTUFBTSxJQUFJQyxNQUFNO1lBQ2xCLE1BQU03RCxRQUFXL0ssb0JBQUFBLE1BQU02TyxNQUFNSCxpQkFBaUJDO1lBQzlDLE9BQU81RDtBQUNUO1FBU1MsU0FBQStELENBQVUvRCxPQUFVa0Q7WUFDM0IsT0FBTzVNLEtBQUtDLFVBQVV3RSxLQUFLa0ksYUFBYWpELE9BQU9rRDtBQUNqRDs7SUM1REksTUFBT2Msb0NBRUhwSjs7WUFDT0csS0FBQWtKLGFBQWEsSUFBSWxCO0FBQW1COztZQUtwQ2hJLEtBQUFtSixVQUFVLElBQUlDLFlBQVk7QUFBUTtRQVl4QyxxQkFBTUMsQ0FDYnhCLE9BQ0F5QixPQUNBaEUsT0FDRy9GO1lBRUgsS0FBS1MsS0FBS3VKLGlCQUNSLE1BQU0sSUFBSTlMLGFBQUFBLGNBQ1I7WUFFSixPQUFNMEQsS0FBRUEsS0FBR0MsU0FBRUEsV0FBWXBCLEtBQUtxQixPQUFPOUIsTUFBTVMsS0FBS3FKO1lBQ2hEbEksSUFBSUssUUFDRixZQUFZeEIsS0FBS3VKLGdCQUFnQkMseUJBQXlCeEo7WUFHNUQ2SCxlQUNTQSxVQUFVLFdBQVczTixvQkFBQUEsTUFBTTJMLElBQUlnQyxTQUFTQTtZQUVqRCxJQUFJNEI7WUFFSixJQUFJbkUsT0FBTzdKLFdBQVc7Z0JBQ3BCZ08sV0FBV2hPO0FBQ2IsbUJBQU8sSUFBSWlFLE1BQU1DLFFBQVEyRixLQUFLO2dCQUM1Qm1FLFdBQVduRSxHQUFHdEksSUFDWDJKLEtBQU0rQyxLQUFBQSxTQUFTQyxXQUFXelAsb0JBQUFBLE1BQU0wUCxZQUFZL0IsT0FBT0wsTUFBTWI7QUFFOUQsbUJBQU87Z0JBQ0w4QyxXQUFXQyxLQUFBQSxTQUFTQyxXQUNsQnpQLG9CQUFBQSxNQUFNMFAsWUFBWS9CLE9BQU9MLE1BQ3pCbEM7QUFFSjtrQkFDTXRGLEtBQUt1SixnQkFBZ0JGLGdCQUN6QnhCLE9BQ0F5QixPQUNBRyxhQUNHckk7QUFFUDtRQVFBLE1BQUE0QixDQUFPcEQ7WUFDTCxPQUFPcUosNEJBQTRCRSxRQUFRbkcsT0FBT3BEO0FBQ3BEO1FBRUEsV0FBQWYsQ0FBWUM7WUFDVkksTUFBTUosU0FBU2dKO1lBbEVFOUgsS0FBQWtKLGFBQ2pCRCw0QkFBNEJDO0FBa0U5QjtRQWFBLGVBQU1XLElBQWF0SztZQUNqQixPQUFNbUQsS0FBRUEsY0FBZTFDLEtBQUtxQixPQUFPOUIsTUFBTSxhQUFhLE9BQU9vQixJQUMzRFgsS0FBSzZKO1lBRVAsTUFBTWhRLGFBQWFtRyxLQUFLbEIsUUFBUW1FLG9CQUFvQlAsS0FBSztZQUN6RCxPQUFPMUMsS0FBS2dELE9BQU9uSjtBQUNyQjtRQVlBLFlBQU1pUSxJQUFVdks7WUFDZCxPQUFNbUQsS0FBRUEsY0FBZTFDLEtBQUtxQixPQUFPOUIsTUFBTSxVQUFVLE9BQU9vQixJQUFJWCxLQUFLOEo7WUFDbkUsTUFBTUEsZUFBZTlKLEtBQUtsQixRQUFRbUUsb0JBQW9CUCxLQUFLO1lBQzNELE9BQU8xQyxLQUFLZ0QsT0FBTzhHO0FBQ3JCO1FBWUEsY0FBTUMsSUFBWXhLO1lBQ2hCLE9BQU1tRCxLQUFFQSxjQUFlMUMsS0FBS3FCLE9BQU85QixNQUFNLFlBQVksT0FBT29CLElBQzFEWCxLQUFLK0o7WUFFUCxNQUFNQSxpQkFBaUIvSixLQUFLbEIsUUFBUW1FLG9CQUFvQlAsS0FBSztZQUM3RCxPQUFPc0gsT0FBT2hLLEtBQUtnRCxPQUFPK0c7QUFDNUI7UUFZQSxpQkFBTUUsSUFDRDFLO1lBRUgsT0FBTW1ELEtBQUVBLGNBQWUxQyxLQUFLcUIsT0FBTzlCLE1BQU0sZUFBZSxPQUFPb0IsSUFDN0RYLEtBQUtpSztZQUVQLE1BQU1DLGNBQWNsSyxLQUFLbEIsUUFBUW1FLG9CQUFvQlAsS0FBSztZQUMxRCxPQUFPc0gsT0FBT2hLLEtBQUtnRCxPQUFPa0g7QUFDNUI7UUFnQkEsZUFBTUMsQ0FDSkMsVUFDRzdLO1lBRUgsT0FBTW1ELEtBQUVBLGNBQWUxQyxLQUFLcUIsT0FBTzlCLE1BQU0sV0FBVyxPQUFPb0IsSUFDekRYLEtBQUttSztZQUVQLE1BQU1FLGdCQUFnQnJLLEtBQUtsQixRQUFRbUUsb0JBQW9CUCxLQUFLLGFBQWEsRUFDdkUwSDtZQUVGLE9BQU9KLE9BQU9oSyxLQUFLZ0QsT0FBT3FIO0FBQzVCO1FBaUJBLGNBQU1DLENBQ0pDLElBQ0F2SSxVQUNHekM7WUFFSCxPQUFNbUQsS0FBRUEsY0FBZTFDLEtBQUtxQixPQUFPOUIsTUFBTSxZQUFZLE9BQU9vQixJQUMxRFgsS0FBS3NLO1lBRVAsTUFBTUUsb0JBQW9CeEssS0FBS2xCLFFBQVEyTCxrQkFBa0IvSCxLQUFLLFlBQVksRUFDeEU2SCxJQUNBdkksTUFBTTBJO1lBRVIsT0FBTzFLLEtBQUtnRCxPQUFPd0gsaUJBQWlCLFNBQVMsT0FBTztBQUN0RDtRQW1CQSxrQkFBTUcsQ0FDSkMsTUFDQUwsSUFDQXZJO1lBRUEsTUFBTTZJLG9CQUFvQkMsS0FBQUEsUUFBUXZMLEtBQ2hDLGdCQUNBUyxLQUFLMEIsT0FDTCxJQUNBMUIsS0FBS2xCLFNBQ0xrQixLQUFLQyxjQUFjLENBQUE7WUFFckIsT0FBTXlDLEtBQUVBLE9BQVExQyxLQUFLcUIsT0FBT3dKLFlBQVl0TCxNQUFNUyxLQUFLMks7WUFDbkQsTUFBTUgsb0JBQW9CeEssS0FBS2xCLFFBQVEyTCxrQkFDckMvSCxLQUNBLGdCQUNBLEVBQUNrSSxNQUFNTCxJQUFJdkksTUFBTTBJO1lBR25CLE9BQU8xSyxLQUFLZ0QsT0FBT3dILGlCQUFpQixTQUFTLE9BQU87QUFDdEQ7UUFnQkEsYUFBTU8sQ0FBUUMsU0FBaUJoSjtZQUM3QixNQUFNNkksb0JBQW9CQyxLQUFBQSxRQUFRdkwsS0FDaEMsV0FDQVMsS0FBSzBCLE9BQ0wsSUFDQTFCLEtBQUtsQixTQUNMa0IsS0FBS0MsY0FBYyxDQUFBO1lBRXJCLE9BQU15QyxLQUFFQSxPQUFRMUMsS0FBS3FCLE9BQU93SixZQUFZdEwsTUFBTVMsS0FBSytLO1lBQ25ELE1BQU1FLGlCQUFpQmpMLEtBQUtsQixRQUFRMkwsa0JBQWtCL0gsS0FBSyxXQUFXLEVBQ3BFc0ksU0FDQWhKLE1BQU0wSTtZQUVSLE9BQU8xSyxLQUFLZ0QsT0FBT2lJLGNBQWMsU0FBUyxPQUFPO0FBQ25EO1FBaUJBLGVBQU1DLENBQVVkLE9BQWVZO1lBQzdCLE1BQU1ILG9CQUFvQkMsS0FBQUEsUUFBUXZMLEtBQ2hDLGFBQ0FTLEtBQUswQixPQUNMLElBQ0ExQixLQUFLbEIsU0FDTGtCLEtBQUtDLGNBQWMsQ0FBQTtZQUVyQixPQUFNeUMsS0FBRUEsT0FBUTFDLEtBQUtxQixPQUFPd0osWUFBWXRMLE1BQU1TLEtBQUtrTDtZQUNuRCxNQUFNQSxrQkFBa0JsTCxLQUFLbEIsUUFBUTJMLGtCQUFrQi9ILEtBQUssYUFBYSxFQUN2RTBILE9BQ0FZO1lBRUYsT0FBT2hCLE9BQU9oSyxLQUFLZ0QsT0FBT2tJO0FBQzVCO1FBZ0JBLGdCQUFNQyxDQUFXQztZQUNmLE1BQU1QLG9CQUFvQkMsS0FBQUEsUUFBUXZMLEtBQ2hDLGNBQ0FTLEtBQUswQixPQUNMLElBQ0ExQixLQUFLbEIsU0FDTGtCLEtBQUtDLGNBQWMsQ0FBQTtZQUVyQixPQUFNeUMsS0FBRUEsT0FBUTFDLEtBQUtxQixPQUFPd0osWUFBWXRMLE1BQU1TLEtBQUttTDtZQUNuRCxNQUFNRSxvQkFBb0JyTCxLQUFLbEIsUUFBUTJMLGtCQUNyQy9ILEtBQ0EsY0FDQSxFQUFDdUcsNEJBQTRCQyxXQUFXRixVQUFVb0M7WUFHcEQsT0FBT3BMLEtBQUtnRCxPQUFPcUksaUJBQWlCLFNBQVMsT0FBTztBQUN0RDtRQVlBLHNCQUFNQztZQUNKLE1BQU1ULG9CQUFvQkMsS0FBQUEsUUFBUXZMLEtBQ2hDLG9CQUNBUyxLQUFLMEIsT0FDTCxJQUNBMUIsS0FBS2xCLFNBQ0xrQixLQUFLQyxjQUFjLENBQUE7WUFFckIsT0FBTXlDLEtBQUVBLE9BQVExQyxLQUFLcUIsT0FBT3dKLFlBQVl0TCxNQUFNUyxLQUFLc0w7a0JBQzdDdEwsS0FBS2xCLFFBQVFtRSxvQkFBb0JQLEtBQUs7QUFDOUM7UUFnQkEsVUFBTTZJLENBQUtDO1lBQ1QsTUFBTVgsb0JBQW9CQyxLQUFBQSxRQUFRdkwsS0FDaEMsUUFDQVMsS0FBSzBCLE9BQ0wsSUFDQTFCLEtBQUtsQixTQUNMa0IsS0FBS0MsY0FBYyxDQUFBO1lBRXJCLE9BQU15QyxLQUFFQSxPQUFRMUMsS0FBS3FCLE9BQU93SixZQUFZdEwsTUFBTVMsS0FBS3VMO2tCQUM3Q3ZMLEtBQUtsQixRQUFRMkwsa0JBQWtCL0gsS0FBSyxRQUFRLEVBQUM4SSxPQUFPZDtBQUM1RDtRQWVBLFVBQU1lLENBQUtEO1lBQ1QsTUFBTVgsb0JBQW9CQyxLQUFBQSxRQUFRdkwsS0FDaEMsUUFDQVMsS0FBSzBCLE9BQ0wsSUFDQTFCLEtBQUtsQixTQUNMa0IsS0FBS0MsY0FBYyxDQUFBO1lBRXJCLE9BQU15QyxLQUFFQSxPQUFRMUMsS0FBS3FCLE9BQU93SixZQUFZdEwsTUFBTVMsS0FBS3lMO2tCQUM3Q3pMLEtBQUtsQixRQUFRMkwsa0JBQWtCL0gsS0FBSyxRQUFRLEVBQUM4SSxPQUFPZDtBQUM1RDtRQWdCQSxjQUFNZ0IsQ0FBU0MsU0FBaUJIO1lBQzlCLE1BQU1YLG9CQUFvQkMsS0FBQUEsUUFBUXZMLEtBQ2hDLFlBQ0FTLEtBQUswQixPQUNMLElBQ0ExQixLQUFLbEIsU0FDTGtCLEtBQUtDLGNBQWMsQ0FBQTtZQUVyQixPQUFNeUMsS0FBRUEsT0FBUTFDLEtBQUtxQixPQUFPd0osWUFBWXRMLE1BQU1TLEtBQUswTDtrQkFDN0MxTCxLQUFLbEIsUUFBUTJMLGtCQUFrQi9ILEtBQUssWUFBWSxFQUNwRGlKLFNBQ0FILE9BQU9kO0FBRVg7UUFhQSwwQkFBTWtCO1lBQ0osTUFBTWYsb0JBQW9CQyxLQUFBQSxRQUFRdkwsS0FDaEMsa0JBQ0FTLEtBQUswQixPQUNMLElBQ0ExQixLQUFLbEIsU0FDTGtCLEtBQUtDLGNBQWMsQ0FBQTtZQUVyQixPQUFNeUMsS0FBRUEsT0FBUTFDLEtBQUtxQixPQUFPd0osWUFBWXRMLE1BQU1TLEtBQUs0TDtZQUNuRCxNQUFNQyxpQ0FBaUM3TCxLQUFLbEIsUUFBUW1FLG9CQUNsRFAsS0FDQTtZQUdGLE9BQU9zSCxPQUFPaEssS0FBS2dELE9BQU82STtBQUM1QjtRQWFBLHFCQUFNQztZQUNKLE1BQU1qQixvQkFBb0JDLEtBQUFBLFFBQVF2TCxLQUNoQyxhQUNBUyxLQUFLMEIsT0FDTCxJQUNBMUIsS0FBS2xCLFNBQ0xrQixLQUFLQyxjQUFjLENBQUE7WUFFckIsT0FBTXlDLEtBQUVBLE9BQVExQyxLQUFLcUIsT0FBT3dKLFlBQVl0TCxNQUFNUyxLQUFLOEw7WUFDbkQsTUFBTUEsd0JBQXdCOUwsS0FBS2xCLFFBQVFtRSxvQkFDekNQLEtBQ0E7WUFHRixPQUFPMUMsS0FBS2dELE9BQU84STtBQUNyQjs7YUM3ZmNDLFdBQ2Q5TSxPQUNBMEcsUUFDQVk7UUFFQSxJQUFJZ0I7UUFDSixJQUFJeUU7UUFDSixJQUFJQztRQUVKLFNBQVNDLFVBQVV0VCxHQUE0QjJOO1lBQzdDZ0IsS0FBS0EsTUFBTXJOLDBCQUFNcU4sR0FBR3RJO1lBQ3BCZ04sVUFBVUEsV0FBVy9SLDBCQUFNMFAsWUFBWTNLO1lBQ3ZDK00sV0FBV0EsWUFBWTlSLG9CQUFBQSxNQUFNOFIsU0FBUy9NLE9BQU9zSTtZQUU3QyxJQUFJeUUsVUFBVTtnQkFDWixPQUFPRyxhQUFBQSxzQkFBc0J2VCxHQUFVb1Q7QUFDekM7WUFFQSxNQUFNMUcsS0FBTTFNLEVBQVUyTyxPQUFPaEI7WUFDN0IsV0FBV2pCLE9BQU8sYUFDaEIsTUFBTSxJQUFJN0gsYUFBQUEsY0FBYyw0QkFBNEI3RSxFQUFFaUcsWUFBWWhGO1lBQ3BFLE9BQU95TDtBQUNUO1FBRUEsSUFBSTVGLE1BQU1DLFFBQVFnRyxTQUFTO1lBQ3pCLEtBQUtqRyxNQUFNQyxRQUFRNEcsUUFBUUEsSUFBSTNLLFdBQVcrSixPQUFPL0osUUFDL0MsTUFBTSxJQUFJNkIsYUFBQUEsY0FDUjtZQUVKLE9BQU9rSSxPQUFPM0ksSUFBSSxDQUFDcEUsR0FBRytOLE1BQU11RixVQUFVdFQsR0FBRzJOLElBQUlJO0FBQy9DO1FBQ0EsT0FBT3VGLFVBQVV2RyxRQUFRWTtBQUMzQjtJQ2pCYTZGLFFBQUFBLHNCQUFOLE1BQU1BLDRCQUE0Qi9FO1FBcUN2QyxXQUFBeEksQ0FBWXJCO1lBQ1YwQixNQUFNMUI7QUFDUjs7SUEvQkE4SixNQUFBQSxXQUFBLEVBSEMrRSxXQUFBQSxZQUFZLGdEQUNaMUUsZUFDQUosc0RBQ1c2RSw0QkFBQTFFLFdBQUEsV0FBQTtJQVNaSixNQUFBQSxXQUFBLEVBSEMrRSxXQUFBQSxZQUFZLG1EQUNaMUUsZUFDQUMsMkVBQ29Cd0UsNEJBQUExRSxXQUFBLG9CQUFBO0lBU3JCSixNQUFBQSxXQUFBLEVBSEMrRSxXQUFBQSxZQUFZLGlEQUNaMUUsZUFDQUMsMkVBQ3dCd0UsNEJBQUExRSxXQUFBLHdCQUFBO0lBU3pCSixNQUFBQSxXQUFBLEVBSEMrRSxXQUFBQSxZQUFZLDRCQUNaMUUsZUFDQUMsMkVBQ21Cd0UsNEJBQUExRSxXQUFBLG1CQUFBO0lBbkNUMEUsUUFBQUEsc0JBQW1COUUsaUJBQUEsRUFEL0JyQyxrRkFDWW1IO0lDZERFLFFBQUFBLHVCQUFBQTtLQUFaLFNBQVlBO1FBRVZBLGdCQUFBLGFBQUE7UUFDQUEsZ0JBQUEsWUFBQTtRQUVBQSxnQkFBQSxZQUFBO1FBQ0FBLGdCQUFBLGNBQUE7UUFDQUEsZ0JBQUEsb0JBQUE7UUFDQUEsZ0JBQUEsWUFBQTtBQUNELE1BVEQsQ0FBWUEsUUFBQUEsb0JBQUFBLDBCQUFlLENBQUE7SUFpQmZDLFFBQUFBLG9CQUFBQTtLQUFaLFNBQVlBO1FBRVZBLGFBQUEsVUFBQTtBQUNELE1BSEQsQ0FBWUEsUUFBQUEsaUJBQUFBLHVCQUFZLENBQUE7SUFXakIsTUFBTUMsZ0JBQWdCO0lDTmhCQyxRQUFBQSxXQUFOLE1BQU1BLGlCQUFpQnBGO1FBb0M1QixXQUFBeEksQ0FBWXJCO1lBQ1YwQixNQUFNMUI7WUFIUndDLEtBQUF3SCxPQUFxQitFLFFBQUFBLGFBQWFHO0FBSWxDOztJQS9CQXBGLE1BQUFBLFdBQUEsRUFGQytFLFdBQUFBLFlBQVksc0NBQ1o5RSxzREFDV2tGLGlCQUFBL0UsV0FBQSxXQUFBO0lBVVpKLE1BQUFBLFdBQUEsRUFKQ3FGLEtBQUFBLFNBQVNQLFFBQUFBLHFCQUFxQjtRQUM3QjNHLFFBQVFtSCxLQUFBQSxRQUFRQztRQUNoQkMsUUFBUUYsS0FBQUEsUUFBUUM7d0NBRUpULFFBQUFBLHdCQUFvQkssaUJBQUEvRSxXQUFBLG9CQUFBO0lBU2xDSixNQUFBQSxXQUFBLEVBSENLLGVBQ0FDLGdDQUNBeE0seURBQ2NxUixpQkFBQS9FLFdBQUEsY0FBQTtJQVFmSixNQUFBQSxXQUFBLEVBRkNLLGVBQ0FDLDJFQUNzQzZFLGlCQUFBL0UsV0FBQSxhQUFBO0lBbEM1QitFLFFBQUFBLFdBQVFuRixpQkFBQSxFQURwQnJDLGtGQUNZd0g7VUNUQU07O1lBQ0kvTSxLQUFBZ04sU0FBaUIsSUFBSUMsUUFBQUEsV0FBV0YsVUFBVWxUO0FBQU07UUFJL0QsV0FBQWdGLElBQXVCO1FBU2YsOEJBQWFxTyxDQUNuQkMsZUFDQUM7WUFFQSxJQUFJRCx5QkFBeUJFLFlBQVksT0FBT0Y7WUFDaEQsSUFDRUEsY0FBY0csTUFDWix5RUFHRixPQUFPSDtZQUNULGFBQWFDLFdBQVdEO0FBQzFCO1FBUUEscUJBQWFJLENBQVNKO1lBQ3BCLFdBQVdBLGtCQUFrQixVQUFVLE9BQU9BO1lBRTlDLE1BQU1DLGFBQWFqVCxNQUFPNUI7Z0JBQ3hCLE9BQU1pVixVQUFFQSxrQkFBbUJDLEtBQUFBLGdCQUFnQkMsT0FBTztnQkFDbEQsYUFBYUYsU0FBU0QsU0FBU2hWOztZQUdqQyxhQUFhNlUsV0FBV0Q7QUFDMUI7UUFXQSxzQkFBYVEsQ0FDWEMsVUFDQUMsWUFDQUMsYUFDQXBSLE9BQ0FxUjtZQUVBL04sS0FBS2dOLE9BQU85SCxNQUNWOEksb0JBQUFBLGFBQ0UsaURBQ0F0UixPQUNBa1IsVUFDQUU7WUFHSixNQUFNRyxPQUFPLElBQUlDLGFBQUFBLEtBQUtOO1lBQ3RCLE1BQU1PLFNBQVNKLFNBQVNLLE1BQ3BCO2dCQUNFQyxVQUFVO2dCQUNWQyxLQUFLUCxRQUFRSyxJQUFJRztnQkFDakJDLE1BQU1ULFFBQVFLLElBQUlJO2dCQUNsQkMsT0FBT1YsUUFBUUssSUFBSU07Z0JBQ25CQyxLQUFLbEgsT0FBT3NHLFFBQVFLLElBQUlPO2dCQUUxQmxUO1lBQ0osTUFBTW1ULGNBQWM1TyxLQUFLNk8sZUFBZVY7WUFFeENGLEtBQUthLGVBQWVGO1lBQ3BCLE1BQU1HLGdCQUFnQmhCLFNBQVNLLFlBQ3JCcE8sS0FBS2dQLG9CQUFvQkosYUFBYWQsYUFBYUMsUUFBUUssT0FDakVwTyxLQUFLaVAseUJBQXlCTCxhQUFhZjtrQkFDekNJLEtBQUtpQixjQUFjSCxlQUFlakIsYUFBYXBSO1lBQ3JELE9BQU91UjtBQUNUO1FBRUEscUJBQU9ZLENBQWVkO1lBQ3BCLEtBQUtBLFNBQVMsT0FBT0csYUFBQUEsS0FBS2lCO1lBQzFCLElBQUlwQyxVQUFVNkIsYUFBYSxPQUFPN0IsVUFBVTZCO1lBRTVDN0IsVUFBVTZCLGNBQWNWLGtCQUFLaUIsZUFBZXBCO1lBQzVDLE9BQU9oQixVQUFVNkI7QUFDbkI7UUFFUSwrQkFBT0ssQ0FDYkwsYUFDQWY7WUFFQSxLQUFLQSxZQUFZO2dCQUNmLE1BQU0sSUFBSS9FLE1BQ1I7QUFFSjtZQUNBLE9BQU84RixZQUFZUSxpQkFBaUJ2QjtBQUN0QztRQUVRLGdDQUFhbUIsQ0FDbkJKLGFBQ0FkLGFBQ0FNO1lBRUEsTUFBTWlCLE1BQ0pqQixJQUFJa0IsWUFBWWxCLElBQUlrQixTQUFTQyxPQUFPM1QsU0FBUyxJQUN6QzRULE9BQU81RSxLQUFLd0QsSUFBSWtCLFVBQVUsZUFDcEJ0UCxLQUFLeVAsa0JBQWtCM0I7WUFDbkMsTUFBTWhOLFlBQVk4TixZQUFZYyxPQUFPTDtZQUNyQyxLQUFLdk8sY0FBZUEsSUFBSTZPLGNBQWMsZUFBZTdPLElBQUk2TyxhQUFjO2dCQUNyRSxNQUFNLElBQUk3RyxNQUFNO0FBQ2xCO1lBQ0EsT0FBT2hJO0FBQ1Q7UUFFQSw4QkFBYTJPLENBQWtCM0I7WUFDN0IsTUFBTThCLE9BQU8sSUFBSUMsU0FBQUEsZ0JBQWdCL0I7WUFDakMsTUFBTWdDLE1BQU1GLEtBQUtHLFVBQVVDLE9BQU87Z0JBQUVDLFFBQVE7O1lBQzVDLE1BQU1DLFNBQVNWLE9BQU81RSxLQUFLLEVBQUM7WUFDNUIsTUFBTXVGLElBQUlYLE9BQU81RSxLQUFLa0YsSUFBSUssS0FBSyxJQUFJO1lBQ25DLE1BQU1DLElBQUlaLE9BQU81RSxLQUFLa0YsSUFBSU0sS0FBSyxJQUFJO1lBQ25DLE9BQU9DLFNBQ0pDLFdBQVcsVUFDWDdLLE9BQU8rSixPQUFPZSxPQUFPLEVBQUNMLFFBQVFDLEdBQUdDLE1BQ2pDSTtBQUNMO1FBU0Esd0JBQWFDLENBQ1gvVCxPQUNBZ1U7WUFFQSxNQUFNQyxxQkFBcUJ4VyxNQUFPNUI7Z0JBQ2hDLE9BQU1pVixVQUFFQSxrQkFBbUJDLEtBQUFBLGdCQUFnQkMsT0FBTztnQkFDbEQsTUFBTWtELGlCQUFpQjVRLEtBQUs2USxvQkFBb0J0WTtnQkFDaEQsTUFBTXVZLG9CQUFvQnRELFNBQVNELFNBQVNxRDtnQkFDNUMsT0FBT0U7O1lBR1QsTUFBTUEsb0JBQWlDOVEsS0FBS2tOLGtCQUMxQ3dELG1CQUNBQztZQUdGLE9BQU87Z0JBQUVqVTtnQkFBT29VOztBQUNsQjtRQUVBLGdDQUFhRCxDQUFvQkU7WUFDL0IsT0FBTXZELFVBQUVBLGtCQUFtQkMsS0FBQUEsZ0JBQWdCQyxPQUFPO1lBQ2xELE9BQU1qVSxNQUFFQSxjQUFlZ1UsS0FBQUEsZ0JBQWdCQyxPQUFPO1lBQzlDLE1BQU1sVCxjQUFjZ1QsU0FBU3dELFFBQVFEO1lBQ3JDLE9BQU90WCxLQUFLc1gsU0FBU3ZXLE1BQU07QUFDN0I7UUFFQSx1Q0FBYXlXLENBQTJCRjtZQUN0QyxPQUFNdkQsVUFBRUEsa0JBQW1CQyxLQUFBQSxnQkFBZ0JDLE9BQU87WUFDbEQsT0FBTWpVLE1BQUVBLGNBQWVnVSxLQUFBQSxnQkFBZ0JDLE9BQU87WUFDOUMsTUFBTWxULGNBQWNnVCxTQUFTd0QsUUFBUUQ7WUFDckMsY0FBY3ZELFNBQVNELFNBQVM5VCxLQUFLc1gsU0FBU3ZXLE1BQU0sTUFBTWtRO0FBQzVEO1FBRUEsMkJBQWF3RyxDQUFlOVk7WUFDMUIsT0FBTW9WLFVBQUVBLGtCQUFtQkMsS0FBQUEsZ0JBQWdCQyxPQUFPO1lBQ2xELGNBQWNGLFNBQVNELFNBQVNuVixXQUFXc1M7QUFDN0M7UUFFQSxzQkFBYXlHLENBQVVDO1lBQ3JCLE1BQU1DLG1CQUFtQmxYLE1BQU81QjtnQkFDOUIsT0FBTWlWLFVBQUVBLGtCQUFtQkMsS0FBQUEsZ0JBQWdCQyxPQUFPO2dCQUNsRCxNQUFNNEQsZ0JBQWdCdFIsS0FBSzZRLG9CQUFvQnRZO2dCQUMvQyxhQUFhaVYsU0FBU0QsU0FBUytEOztZQUdqQyxNQUFNQyxzQkFBdUJ2UixLQUFLa04sa0JBQ2hDa0Usa0JBQ0FDO1lBRUYsTUFBTXhELG1CQUFtQjdOLEtBQUt3UixrQkFBa0JEO1lBQ2hELE1BQU0xSyxPQUFPOU0sT0FBTzBYLHNCQUFzQjVEO1lBQzFDLE1BQU02RCxJQUFLN0QsV0FBbUJoSCxLQUFLO1lBR25DLE9BQU84SyxjQUFBQSxRQUFRQyxvQkFBb0JGO0FBQ3JDO1FBRVEsOEJBQWFGLENBQWtCSztZQUNyQyxNQUFNQyxVQUFVO1lBQ2hCLElBQUlDO1lBQ0osSUFDR0MsV0FBbUJDLFVBQ2xCRCxXQUFtQkMsT0FBMkJDLFFBQ2hEO2dCQUNBSCxTQUFXQyxXQUFtQkUsT0FBZUg7QUFDL0MsbUJBQU87Z0JBQ0wsTUFBTXpELFlBQWFiLEtBQUFBLGdCQUFnQkMsT0FBT29FO2dCQUMxQ0MsU0FBU3pELElBQUl5RCxVQUFVekQsSUFBSTZELFVBQVVKO0FBQ3ZDO1lBRUEsS0FBS0EsUUFBUSxNQUFNLElBQUlqSixNQUFNO1lBRTdCLFNBQVNzSixPQUFPeko7Z0JBQ2QsTUFBTTBKLE1BQU0sSUFBSUMsWUFBWTNKLElBQUkvTTtnQkFDaEMsTUFBTTJXLFVBQVUsSUFBSWxGLFdBQVdnRjtnQkFDL0IsS0FBSyxJQUFJMUwsSUFBSSxHQUFHNkwsU0FBUzdKLElBQUkvTSxRQUFRK0ssSUFBSTZMLFFBQVE3TCxLQUFLO29CQUNwRDRMLFFBQVE1TCxLQUFLZ0MsSUFBSThKLFdBQVc5TDtBQUM5QjtnQkFDQSxPQUFPMEw7QUFDVDtZQUVBLE1BQU0xSixNQUFNa0osSUFDVG5ILFNBQVMsUUFDVDVPLFFBQVEsK0JBQStCLElBQ3ZDNFcsV0FBVyxNQUFNLElBQ2pCNVcsUUFBUSw2QkFBNkI7WUFDeEMsTUFBTTZXLFVBQVVuRCxPQUFPNUUsS0FBS2pDLEtBQUssVUFBVStCLFNBQVM7WUFDcEQsTUFBTWtJLFlBQVlSLE9BQU9PO1lBQ3pCLE1BQU03UixZQUFZaVIsT0FBT2MsVUFDdkIsU0FDQUQsV0FDQTtnQkFDRS9ZLE1BQU07Z0JBQ05pWixZQUFZO2VBRWQsTUFDQSxFQUFDO1lBR0gsT0FBT2hTO0FBQ1Q7O0lBT0ksU0FBVWlTLHdCQUF3QkM7UUFJdEMsTUFBTUMsa0JBQWtCLElBQUlDLEtBQUFBLGdCQUFTRjtRQUdyQyxNQUFNRyxTQUFTRixnQkFBZ0JHLFlBQVloUixLQUN4Q25JLEtBQU1BLEVBQUV1TixTQUFTO1FBRXBCLEtBQUsyTCxRQUFRO1lBQ1gsTUFBTSxJQUFJckssTUFDUjtBQUVKO1FBR0EsSUFBSXVLLE1BQU03RCxPQUFPNUUsS0FBSyxJQUFJeUMsV0FBVzhGLE9BQU9uUixRQUN6QzBJLFNBQVMsT0FDVDRJO1FBV0gsSUFBSUQsSUFBSUUsV0FBVyxlQUFlRixJQUFJelgsVUFBVSxJQUFJLElBQ2xEeVgsTUFBTUEsSUFBSXZRLE1BQU0sR0FBRyxJQUFJO1FBRXpCLE9BQU87WUFBRXVRO1lBQUtHLFFBQVFQLGdCQUFnQlE7O0FBQ3hDO0lDNVNBLE1BQU1wRCxTQUFTLElBQUk2QixVQUFBQTtJQUNuQnRDLGdCQUFLOEQsZUFBZUMsSUFBSXREO0lBRVp1RCxRQUFBQSxxQkFBQUE7S0FBWixTQUFZQTtRQUNWQSxjQUFBLFdBQUE7UUFDQUEsY0FBQSxXQUFBO1FBQ0FBLGNBQUEsWUFBQTtRQUNBQSxjQUFBLFlBQUE7UUFDQUEsY0FBQSxZQUFBO1FBQ0FBLGNBQUEsY0FBQTtRQUNBQSxjQUFBLFlBQUE7UUFDQUEsY0FBQSxZQUFBO1FBQ0FBLGNBQUEsWUFBQTtRQUNBQSxjQUFBLFlBQUE7UUFDQUEsY0FBQSxZQUFBO0FBQ0QsTUFaRCxDQUFZQSxRQUFBQSxrQkFBQUEsd0JBQWEsQ0FBQTtJQW1CYkMsUUFBQUEsY0FBQUE7S0FBWixTQUFZQTtRQUNWQSxPQUFBLFVBQUE7UUFDQUEsT0FBQUEsT0FBQSxnQkFBQSxPQUFBO1FBQ0FBLE9BQUFBLE9BQUEsZUFBQSxNQUFBO1FBQ0FBLE9BQUFBLE9BQUEsdUJBQUEsTUFBQTtRQUNBQSxPQUFBQSxPQUFBLHdCQUFBLE1BQUE7UUFDQUEsT0FBQSxlQUFBO1FBQ0FBLE9BQUEsbUJBQUE7QUFDRCxNQVJELENBQVlBLFFBQUFBLFdBQUFBLGlCQUFNLENBQUE7VUFVTEM7UUFPWCxXQUFBalYsQ0FBb0JrVjtZQUFBL1QsS0FBQStULFdBQUFBO1lBTkgvVCxLQUFBZ1UsVUFBc0IsSUFBSTNHLFdBQVc7WUFPcEQsSUFBSXJOLEtBQUsrVCxTQUFTblksVUFBVSxLQUFLLE1BQU0sSUFBSWtOLE1BQU07WUFFakQsS0FBSyxJQUFJbUwsSUFBSSxHQUFHQSxJQUFJalUsS0FBS2dVLFFBQVFwWSxRQUFRcVksS0FBS2pVLEtBQUtnVSxRQUFRQyxLQUFLO1lBRWhFLEtBQUssSUFBSXROLElBQUksR0FBR0EsSUFBSW9OLFNBQVNuWSxRQUFRK0ssS0FBSztnQkFDeEMsTUFBTXdKLElBQUk0RCxTQUFTRyxPQUFPdk47Z0JBQzFCLE1BQU13TixLQUFLaEUsRUFBRXNDLFdBQVc7Z0JBQ3hCLElBQUl6UyxLQUFLZ1UsUUFBUUcsUUFBUSxLQUFLLE1BQU0sSUFBSXJMLE1BQU1xSCxJQUFJO2dCQUVsRG5RLEtBQUtnVSxRQUFRRyxNQUFNeE47QUFDckI7WUFFQTNHLEtBQUtvVSxPQUFPcFUsS0FBSytULFNBQVNuWTtZQUMxQm9FLEtBQUtxVSxTQUFTclUsS0FBSytULFNBQVNHLE9BQU87WUFDbkNsVSxLQUFLc1UsU0FBU0MsS0FBS3BULElBQUluQixLQUFLb1UsUUFBUUcsS0FBS3BULElBQUk7WUFDN0NuQixLQUFLd1UsVUFBVUQsS0FBS3BULElBQUksT0FBT29ULEtBQUtwVCxJQUFJbkIsS0FBS29VO0FBQy9DO1FBRUEsTUFBQUssQ0FBT0M7WUFDTCxXQUFXQSxXQUFXLFVBQVU7Z0JBQzlCQSxTQUFTbEYsT0FBTzVFLEtBQUs4SjtBQUN2QixtQkFBTyxJQUFJcEMsWUFBWXFDLE9BQU9ELFNBQVM7Z0JBQ3JDQSxTQUFTLElBQUlySCxXQUNYcUgsT0FBT0UsUUFDUEYsT0FBT0csWUFDUEgsT0FBT0k7QUFFWCxtQkFBTyxJQUFJcFYsTUFBTUMsUUFBUStVLFNBQVM7Z0JBQ2hDQSxTQUFTckgsV0FBV3pDLEtBQUs4SjtBQUMzQjtZQUVBLElBQUlBLE9BQU85WSxXQUFXLEdBQUcsT0FBTztZQUdoQyxJQUFJbVosU0FBUztZQUNiLElBQUluWixTQUFTO1lBQ2IsSUFBSW9aLFNBQVM7WUFDYixNQUFNQyxPQUFPUCxPQUFPOVk7WUFDcEIsT0FBT29aLFdBQVdDLFFBQVFQLE9BQU9NLFlBQVksR0FBRztnQkFDOUNBO2dCQUNBRDtBQUNGO1lBRUEsTUFBTS9WLFFBQVNpVyxPQUFPRCxVQUFVaFYsS0FBS3dVLFVBQVUsTUFBTztZQUN0RCxNQUFNVSxNQUFNLElBQUk3SCxXQUFXck87WUFFM0IsT0FBT2dXLFdBQVdDLE1BQU07Z0JBQ3RCLElBQUlFLFFBQVFULE9BQU9NO2dCQUVuQixJQUFJck8sSUFBSTtnQkFDUixLQUNFLElBQUl5TyxNQUFNcFcsT0FBTyxJQUNoQm1XLFVBQVUsS0FBS3hPLElBQUkvSyxXQUFXd1osU0FBUyxHQUN4Q0EsT0FBT3pPLEtBQ1A7b0JBQ0F3TyxTQUFVLE1BQU1ELElBQUlFLFNBQVU7b0JBQzlCRixJQUFJRSxPQUFPRCxRQUFRblYsS0FBS29VLFNBQVM7b0JBQ2pDZSxRQUFTQSxRQUFRblYsS0FBS29VLFNBQVU7QUFDbEM7Z0JBQ0EsSUFBSWUsVUFBVSxHQUFHLE1BQU0sSUFBSXJNLE1BQU07Z0JBRWpDbE4sU0FBUytLO2dCQUNUcU87QUFDRjtZQUVBLElBQUlLLE1BQU1yVyxPQUFPcEQ7WUFDakIsT0FBT3laLFFBQVFyVyxRQUFRa1csSUFBSUcsU0FBUyxHQUFHQTtZQUd2QyxJQUFJMU0sTUFBTTNJLEtBQUtxVSxPQUFPaUIsT0FBT1A7WUFDN0IsTUFBT00sTUFBTXJXLFFBQVFxVyxLQUFLO2dCQUN4QjFNLE9BQU8zSSxLQUFLK1QsU0FBU0csT0FBT2dCLElBQUlHO0FBQ2xDO1lBQ0EsT0FBTzFNO0FBQ1Q7UUFFUSxZQUFBNE0sQ0FBYWI7WUFDbkIsSUFBSUEsT0FBTzlZLFdBQVcsR0FBRyxPQUFPLElBQUl5UixXQUFXO1lBRS9DLElBQUltSSxNQUFNO1lBRVYsSUFBSVQsU0FBUztZQUNiLElBQUluWixTQUFTO1lBQ2IsT0FBTzhZLE9BQU9jLFNBQVN4VixLQUFLcVUsUUFBUTtnQkFDbENVO2dCQUNBUztBQUNGO1lBRUEsTUFBTXhXLFFBQVMwVixPQUFPOVksU0FBUzRaLE9BQU94VixLQUFLc1UsU0FBUyxNQUFPO1lBQzNELE1BQU1tQixPQUFPLElBQUlwSSxXQUFXck87WUFFNUIsT0FBTzBWLE9BQU9jLE1BQU07Z0JBRWxCLElBQUlMLFFBQVFuVixLQUFLZ1UsUUFBUVUsT0FBT2pDLFdBQVcrQztnQkFFM0MsSUFBSUwsVUFBVSxLQUFLO2dCQUVuQixJQUFJeE8sSUFBSTtnQkFDUixLQUNFLElBQUkrTyxNQUFNMVcsT0FBTyxJQUNoQm1XLFVBQVUsS0FBS3hPLElBQUkvSyxXQUFXOFosU0FBUyxHQUN4Q0EsT0FBTy9PLEtBQ1A7b0JBQ0F3TyxTQUFVblYsS0FBS29VLE9BQU9xQixLQUFLQyxTQUFVO29CQUNyQ0QsS0FBS0MsT0FBT1AsUUFBUSxRQUFRO29CQUM1QkEsUUFBU0EsUUFBUSxRQUFTO0FBQzVCO2dCQUNBLElBQUlBLFVBQVUsR0FBRyxNQUFNLElBQUlyTSxNQUFNO2dCQUVqQ2xOLFNBQVMrSztnQkFDVDZPO0FBQ0Y7WUFFQSxJQUFJRyxNQUFNM1csT0FBT3BEO1lBQ2pCLE9BQU8rWixRQUFRM1csUUFBUXlXLEtBQUtFLFNBQVMsR0FBR0E7WUFFeEMsTUFBTUMsTUFBTSxJQUFJdkksV0FBVzBILFVBQVUvVixPQUFPMlc7WUFDNUMsSUFBSTFCLElBQUljO1lBQ1IsT0FBT1ksUUFBUTNXLE1BQU00VyxJQUFJM0IsT0FBT3dCLEtBQUtFO1lBRXJDLE9BQU9DO0FBQ1Q7UUFFQSxNQUFBNVMsQ0FBTzBSO1lBQ0wsTUFBTUUsU0FBUzVVLEtBQUt1VixhQUFhYjtZQUNqQyxJQUFJRSxRQUFRLE9BQU9BO1lBQ25CLE1BQU0sSUFBSTlMLE1BQU0sYUFBYTlJLEtBQUtvVSxPQUFPO0FBQzNDOztVQUdXeUI7O1lBQ2E3VixLQUFBOFYsYUFBYSxJQUFJaEMsWUFBWUYsUUFBQUEsY0FBY21DO0FBQVE7O1lBQ25EL1YsS0FBQWdOLFNBQVMsSUFBSUMsUUFBQUEsV0FBVzRJLFlBQVloYztBQUFNO1FBQ2xFLFdBQUFnRixJQUF1QjtRQUV2Qiw4QkFBT21YLENBQXdCbEk7WUFDN0I5TixLQUFLZ04sT0FBTzlILE1BQU04SSxvQkFBQUEsYUFBYSw0QkFBNEJGO1lBQzNELE1BQU1rRixPQUFPLElBQUlwRCxnQkFBS0MsZ0JBQWdCL0I7WUFDdEMsT0FBTW1JLFNBQUVBLFNBQU9DLFFBQUVBLFVBQVdsRDtZQUM1QmhULEtBQUtnTixPQUFPOUgsTUFDVjhJLG9CQUFBQSxhQUNFLHNEQUNBaUksU0FDQUM7WUFHSixPQUFPLFVBQVVELFFBQVF2RCxXQUFXLE1BQU0sVUFBVXdELE9BQU94RCxXQUFXLE1BQU07QUFDOUU7UUFFQSxhQUFPK0IsQ0FBTzlMO1lBQ1osT0FBTzNJLEtBQUs4VixXQUFXckIsT0FBTzlMO0FBQ2hDO1FBQ0EsYUFBTzNGLENBQU8yRjtZQUNaLE1BQU1nSyxVQUFVM1MsS0FBSzhWLFdBQVc5UyxPQUFPMkY7WUFDdkMsTUFBTXJPLFVBQVMsSUFBSThPLGFBQWNwRyxPQUFPMlA7WUFDeEMsT0FBT3JZO0FBQ1Q7UUFFQSwwQkFBTzZiLENBQW9CeE47WUFDekIsTUFBTTBKLE1BQU0sSUFBSUMsWUFBWTNKLElBQUkvTTtZQUNoQyxNQUFNMlcsVUFBVSxJQUFJbEYsV0FBV2dGO1lBQy9CLEtBQUssSUFBSTFMLElBQUksR0FBRzZMLFNBQVM3SixJQUFJL00sUUFBUStLLElBQUk2TCxRQUFRN0wsS0FBSztnQkFDcEQ0TCxRQUFRNUwsS0FBS2dDLElBQUk4SixXQUFXOUw7QUFDOUI7WUFDQSxPQUFPMEw7QUFDVDtRQUVRLHVCQUFhK0QsQ0FDbkI1TyxNQUNBcUssS0FDQXdFO1lBRUEsTUFBTXRFLFNBQVMxQixPQUFPMEI7WUFFdEIsTUFBTXBKLE1BQU1rSixJQUNUbkgsU0FBUyxRQUNUNU8sUUFDQyxJQUFJd2EsT0FBTyxlQUFlOU8sS0FBSzhMLHdDQUMvQixJQUVEWixXQUFXLE1BQU0sSUFDakI1VyxRQUNDLElBQUl3YSxPQUFPLGFBQWE5TyxLQUFLOEwsd0NBQzdCO1lBRUosTUFBTVgsVUFBVW5ELE9BQU81RSxLQUFLakMsS0FBSyxVQUFVK0IsU0FBUztZQUNwRCxNQUFNa0ksWUFBWTVTLEtBQUttVyxvQkFBb0J4RDtZQUMzQyxNQUFNN1IsWUFBWWlSLE9BQU9jLFVBQ3ZCLFNBQ0FELFdBQ0E7Z0JBQ0UvWSxNQUFNO2dCQUNOaVosWUFBWTtlQUVkLE1BQ0F1RCxTQUFTQSxTQUFTLEVBQUM7WUFHckIsT0FBT3ZWO0FBQ1Q7UUFFQSw4QkFBYTBRLENBQWtCSyxLQUFzQndFO1lBQ25ELE9BQU9yVyxLQUFLb1csV0FBVyxXQUFXdkUsS0FBS3dFO0FBQ3pDO1FBRUEsNkJBQWFFLENBQWlCMUUsS0FBc0J3RTtZQUNsRCxPQUFPclcsS0FBS29XLFdBQVcsVUFBVXZFLEtBQUt3RTtBQUN4QztRQUVBLGlCQUFhRyxDQUFLM0ksWUFBb0JqTztZQUNwQyxNQUFNa0IsWUFBWWQsS0FBS3dSLGtCQUFrQjNEO1lBQ3pDLE1BQU00SSxhQUFjcEcsT0FBTzBCLE9BQU95RSxLQUNoQztnQkFDRTNjLE1BQU07Z0JBQ042YyxNQUFNO2VBRVI1VixLQUNBbEI7WUFHRixPQUFPRixNQUFNa0wsS0FBSyxJQUFJeUMsV0FBV29KLE9BQzlCelosSUFBSzJaLEtBQU1BLEVBQUVqTSxTQUFTLElBQUlrTSxTQUFTLEdBQUcsTUFDdENuZCxLQUFLO0FBQ1Y7UUFFQSxtQkFBYW9kLENBQ1gvSSxhQUNBZ0osV0FDQWxYO1lBRUEsTUFBTW9ULE9BQU8sSUFBSXBELGdCQUFLQyxnQkFBZ0IvQjtZQUN0QyxNQUFNaE4sWUFBWWtTLEtBQUtqRCxVQUFVQztZQUNqQzhHLG1CQUNTQSxjQUFjLFdBQVd0SCxPQUFPNUUsS0FBS2tNLFdBQVcsU0FBU0E7WUFFbEVsWCxjQUFlQSxTQUFTLFdBQVc0UCxPQUFPNUUsS0FBS2hMLFFBQVFBO1lBQ3ZELE9BQU95USxPQUFPMEIsT0FBTzhFLE9BQ25CO2dCQUNFaGQsTUFBTTtnQkFDTjZjLE1BQU07ZUFFUjVWLEtBQ0FnVyxXQUNBbFg7QUFFSjtRQUVBLG9CQUFhbVgsQ0FBUWpKLGFBQXFCbE87WUFDeEMsTUFBTW9ULE9BQU8sSUFBSXBELGdCQUFLQyxnQkFBZ0IvQjtZQUN0QyxNQUFNaE4sWUFBWWtTLEtBQUtqRCxVQUFVQztZQUNqQ3BRLGNBQWVBLFNBQVMsV0FBVzRQLE9BQU81RSxLQUFLaEwsUUFBUUE7WUFDdkQsTUFBTTZXLGFBQWF6VyxLQUFLZ1gsa0JBQWtCRCxRQUN4QztnQkFDRWxkLE1BQU07ZUFFUmlILEtBQ0FsQjtZQUdGLE9BQU9GLE1BQU1rTCxLQUFLLElBQUl5QyxXQUFXb0osT0FDOUJ6WixJQUFLMlosS0FBTUEsRUFBRWpNLFNBQVMsSUFBSWtNLFNBQVMsR0FBRyxNQUN0Q25kLEtBQUs7QUFDVjtRQUVRLHNCQUFPdWQ7WUFDYixPQUFPQyxRQUFBQSxjQUNGakYsV0FBbUJDLE9BQU81QixPQUFPMEIsU0FDbEMxQixPQUFPMEI7QUFDYjtRQUVBLG9CQUFhbUYsQ0FBUXJKLFlBQW9Cak87WUFDdkMsTUFBTWtCLFlBQVlkLEtBQUt3UixrQkFBa0IzRDtZQUN6Q2pPLGNBQ1NBLFNBQVMsV0FBVzRQLE9BQU81RSxLQUFLaEwsTUFBTSxTQUFTQTtZQUV4RCxPQUFPSSxLQUFLZ1gsa0JBQWtCRSxRQUM1QjtnQkFDRXJkLE1BQU07ZUFFUmlILEtBQ0FsQjtBQUVKO1FBV0Esc0JBQWF1WCxDQUFVdlg7WUFDckIsTUFBTXdYLGNBQWMsSUFBSUM7WUFDeEIsSUFBSXpYLFNBQVNuRSxXQUFXO2dCQUN0QixNQUFNNmIsYUFBYWpILE9BQU9rSDtnQkFDMUIzWCxPQUFPd1gsWUFBWTNDLE9BQU82QyxZQUFZMUM7QUFDeEM7WUFFQSxNQUFNNEMsb0JBQW9CeFgsS0FBS2dYLGtCQUFrQm5FLFVBQy9DLE9BQ0FqVCxNQUNBaVUsUUFBQUEsT0FBTzRELGVBQ1AsT0FDQSxFQUFDO1lBR0gsT0FBTztnQkFDTDNXLEtBQUswVztnQkFDTEUsSUFBSTlYOztBQUVSO1FBVUEsNkJBQWErWCxDQUFpQkMsTUFBYzlXO1lBQzFDLE1BQU1zVyxjQUFjLElBQUlDO1lBQ3hCLE1BQU1RLGFBQWFULFlBQVkzQyxPQUFPbUQ7WUFDdEMsTUFBTUUsbUJBQW1COVgsS0FBS2dYLGtCQUFrQnhHLE9BQzlDLFdBQ0FxSDtZQUVGLE1BQU1FLFNBQVM7Z0JBQ2JsZSxNQUFNZ2EsUUFBQUEsT0FBTzREO2dCQUNiZixNQUFNN0MsUUFBQUEsT0FBT21FO2dCQUNiSixNQUFNRTtnQkFDTkcsWUFBWXBFLFFBQUFBLE9BQU9xRTs7WUFFckIsTUFBTUMsbUJBQW1CblksS0FBS2dYLGtCQUFrQm9CLFdBQzlDTCxRQUNBalgsS0FDQStTLFFBQUFBLE9BQU93RSxZQUFZO1lBRXJCLE9BQU9yWSxLQUFLMFAsT0FBT3lJO0FBQ3JCO1FBU0EsbUJBQWF6SSxDQUFPeUk7WUFFbEIsTUFBTUcsUUFBUTtZQUNkLE1BQU1DLFNBQVM7WUFDZixNQUFNQyxhQUFhTCxXQUFXclYsTUFBTSxHQUFHeVY7WUFDdkMsTUFBTWIsS0FBS1MsV0FBV3JWLE1BQU15VjtZQUM1QixNQUFNRSw4QkFBOEJ6WSxLQUFLZ1gsa0JBQWtCbkUsVUFDekQsT0FDQTJGLFlBQ0E7Z0JBQUUzZSxNQUFNZ2EsUUFBQUEsT0FBTzZFO2VBQ2YsT0FDQSxFQUFDLFdBQVc7WUFFZCxPQUFPO2dCQUNMNVgsS0FBSzJYO2dCQUNMZixJQUFJQTs7QUFFUjtRQVVBLHVCQUFhaUIsQ0FDWEMsTUFDQUM7WUFFQSxNQUFNekIsY0FBYyxJQUFJQztZQUN4QixNQUFNeUIsYUFBYTFCLFlBQVkzQyxPQUFPbUU7WUFDdEMsTUFBTUcsc0JBQXNCL1ksS0FBS2dYLGtCQUFrQkQsUUFDakQ7Z0JBQUVsZCxNQUFNZ2EsUUFBQUEsT0FBTzZFO2dCQUFxQmhCLElBQUltQixVQUFVbkI7ZUFDbERtQixVQUFVL1gsS0FDVmdZO1lBRUYsT0FBT0M7QUFDVDtRQVVBLHVCQUFhQyxDQUNYRCxlQUNBRjtZQUVBLE1BQU1JLGNBQWMsSUFBSTdQO1lBQ3hCLE1BQU04UCxzQkFBc0JsWixLQUFLZ1gsa0JBQWtCRSxRQUNqRDtnQkFBRXJkLE1BQU1nYSxRQUFBQSxPQUFPNkU7Z0JBQXFCaEIsSUFBSW1CLFVBQVVuQjtlQUNsRG1CLFVBQVUvWCxLQUNWaVk7WUFFRixPQUFPRSxZQUFZalcsT0FBT2tXO0FBQzVCOztJQzFiSSxNQUFPQyxzQkFBc0IxYixhQUFBQTtRQUNqQyxXQUFBb0IsQ0FBWXVhO1lBQ1ZsYSxNQUFNa2EsS0FBS0QsY0FBY3RmO0FBQzNCOztJQWFJLE1BQU93ZixxQkFBcUI1YixhQUFBQTtRQUNoQyxXQUFBb0IsQ0FBWXVhO1lBQ1ZsYSxNQUFNa2EsS0FBS0MsYUFBYXhmO0FBQzFCOztJQWFJLE1BQU95Zix1QkFBdUI3YixhQUFBQTtRQUNsQyxXQUFBb0IsQ0FBWXVhO1lBQ1ZsYSxNQUFNa2EsS0FBS0UsZUFBZXpmO0FBQzVCOztJQVlJLE1BQU8wZiwwQkFBMEJDLEtBQUFBO1FBQ3JDLFdBQUEzYSxDQUFZdWE7WUFDVmxhLE1BQU1rYSxLQUFLRyxrQkFBa0IxZjtBQUMvQjs7SUE0QkksTUFBTzRmLDRCQUE0QmhjLGFBQUFBO1FBQ3ZDLFdBQUFvQixDQUFZdWE7WUFDVmxhLE1BQU1rYSxLQUFLSyxvQkFBb0I1ZixNQUFNO0FBQ3ZDOztJQUdJLE1BQU82ZixzQ0FBc0NDLGFBQUFBO1FBQ2pELFdBQUE5YSxDQUFZdWEsTUFBc0I7WUFDaENsYSxNQUFNd2EsOEJBQThCN2YsTUFBTXVmLEtBQUs7QUFDakQ7O0lBZ0NJLE1BQU9RLDRCQUE0QkQsYUFBQUE7UUFDdkMsV0FBQTlhLENBQVl1YTtZQUNWbGEsTUFBTTBhLG9CQUFvQi9mLE1BQU11ZixLQUFLO0FBQ3ZDOztJQUdJLE1BQU9TLDBCQUEwQnBjLGFBQUFBO1FBQ3JDLFdBQUFvQixDQUFZdWE7WUFDVmxhLE1BQU1rYSxLQUFLUyxrQkFBa0JoZ0IsTUFBTTtBQUNyQzs7SUFHSSxNQUFPaWdCLHlCQUF5QnJjLGFBQUFBO1FBQ3BDLFdBQUFvQixDQUFZa2I7WUFDVjdhLE1BQU02YSxTQUFTRCxpQkFBaUJqZ0IsTUFBTTtBQUN4Qzs7SUFHSSxNQUFPbWdCLDhCQUE4QnZjLGFBQUFBO1FBQ3pDLFdBQUFvQixDQUFZa2I7WUFDVjdhLE1BQU02YSxTQUFTQyxzQkFBc0JuZ0IsTUFBTTtBQUM3Qzs7SUFHSSxNQUFPb2dCLGlDQUFpQ3hjLGFBQUFBO1FBQzVDLFdBQUFvQixDQUFZa2I7WUFDVjdhLE1BQU02YSxTQUFTRSx5QkFBeUJwZ0IsTUFBTTtBQUNoRDs7SUFHSSxNQUFPcWdCLCtCQUErQnpjLGFBQUFBO1FBQzFDLFdBQUFvQixDQUFZa2I7WUFDVjdhLE1BQU02YSxTQUFTRyx1QkFBdUJyZ0IsTUFBTTtBQUM5Qzs7SUFHSSxNQUFPc2dCLCtCQUErQjFjLGFBQUFBO1FBQzFDLFdBQUFvQixDQUNFa2IsU0FDQWxnQixPQUFlc2dCLHVCQUF1QnRnQixNQUN0Q3VnQixPQUFPO1lBRVBsYixNQUFNNmEsU0FBU2xnQixNQUFNdWdCO0FBQ3ZCOztJQUdJLE1BQU9DLGdDQUFnQzVjLGFBQUFBO1FBQzNDLFdBQUFvQixDQUFZa2I7WUFDVjdhLE1BQU02YSxTQUFTTSx3QkFBd0J4Z0IsTUFBTTtBQUMvQzs7SUFHSSxNQUFPeWdCLG1DQUFtQzdjLGFBQUFBO1FBQzlDLFdBQUFvQixDQUFZa2I7WUFDVjdhLE1BQU02YSxTQUFTTywyQkFBMkJ6Z0IsTUFBTTtBQUNsRDs7SUN0SlUwZ0IsUUFBQUEsd0JBQUFBO0tBQVosU0FBWUE7UUFDVkEsaUJBQUEsVUFBQTtRQUNBQSxpQkFBQSxhQUFBO1FBQ0FBLGlCQUFBLFlBQUE7UUFDQUEsaUJBQUEsVUFBQTtRQUNBQSxpQkFBQSxXQUFBO0FBQ0QsTUFORCxDQUFZQSxRQUFBQSxxQkFBQUEsMkJBQWdCLENBQUE7SUE4QmhCQyxRQUFBQSw4QkFBQUE7S0FBWixTQUFZQTtRQUNWQSx1QkFBQSxzQkFBQTtRQUNBQSx1QkFBQSw4QkFBQTtRQUNBQSx1QkFBQSwyQkFBQTtRQUNBQSx1QkFBQSxzQkFBQTtRQUNBQSx1QkFBQSxlQUFBO1FBQ0FBLHVCQUFBLHNCQUFBO1FBQ0FBLHVCQUFBLGNBQUE7QUFDRCxNQVJELENBQVlBLFFBQUFBLDJCQUFBQSxpQ0FBc0IsQ0FBQTtJQXlDNUIsTUFBT0MsZ0NBQWdDQyxRQUFBQTtRQWEzQyxXQUFBN2IsQ0FBb0I4YjtZQUNsQjVOLFVBQVU4QixlQUNSOEwsU0FBU3ZNLE1BQ0w7Z0JBQ0VDLFVBQVU7Z0JBQ1ZDLEtBQUtxTSxTQUFTdk0sSUFBSUc7Z0JBQ2xCQyxNQUFNbU0sU0FBU3ZNLElBQUlJO2dCQUNuQkMsT0FBT2tNLFNBQVN2TSxJQUFJTTtnQkFDcEJDLEtBQUtsSCxPQUFPa1QsU0FBU3ZNLElBQUlPO2dCQUUzQmxUO1lBRU55RDtZQVprQmMsS0FBQTJhLFdBQUFBO0FBYXBCO1FBRVUsVUFBTXpNO1lBQ2QsSUFBSWxPLEtBQUtpTyxNQUFNLE9BQU9qTyxLQUFLaU87WUFDM0IsT0FBTTJNLFFBQUVBLFFBQU1DLFFBQUVBLFFBQU1DLE9BQUVBLE9BQUtDLEtBQUVBLEtBQUczTSxLQUFFQSxPQUFRcE8sS0FBSzJhO1lBQ2pELE1BQU14WixNQUFNbkIsS0FBS21CLElBQUlSLElBQUlYLEtBQUtrTztZQUM5Qi9NLElBQUkrRCxNQUFNLHdCQUF3QjBWLGFBQWFHO1lBQy9DNVosSUFBSStELE1BQU0sa0NBQWtDMlY7WUFDNUMsTUFBTS9NLG9CQUFvQmYsVUFBVWtFLDJCQUEyQjRKO1lBQy9ELElBQUkvWjtZQUNKLEtBQUtzTixLQUFLO2dCQUNSLEtBQUswTSxPQUFPO29CQUNWLE1BQU0sSUFBSXJkLGFBQUFBLGNBQ1Isc0NBQXNDbWQ7QUFFMUM7Z0JBQ0F6WixJQUFJK0QsTUFBTSwwQkFBMEI0VjtnQkFDcENoYSxZQUFZaU0sVUFBVWtFLDJCQUEyQjZKO0FBQ25ELG1CQUFPO2dCQUNMM1osSUFBSStELE1BQ0Ysa0NBQWtDMFYsdUJBQXVCeE0sSUFBSUc7QUFFakU7WUFDQXBOLElBQUkrRCxNQUFNLDZCQUE2QjBWO1lBQ3ZDNWEsS0FBS2lPLGFBQWFsQixVQUFVWSxVQUFVLFNBQVM3TSxLQUFLZ04sYUFBYThNLFFBQVE7Z0JBQ3ZFeE07O1lBRUYsT0FBT3BPLEtBQUtpTztBQUNkO1FBRVUsUUFBTStNO1lBQ2QsSUFBSWhiLEtBQUtpYixJQUFJLE9BQU9qYixLQUFLaWI7WUFDekIsTUFBTTlaLE1BQU1uQixLQUFLbUIsSUFBSVIsSUFBSVgsS0FBS2diO1lBQzlCLE9BQU1ELEtBQUVBLEtBQUdHLEtBQUVBLEtBQUdOLFFBQUVBLFVBQVc1YSxLQUFLMmE7WUFJbEMsS0FBSVEsY0FBRUEsY0FBWXRFLFFBQUVBLFVBQVdxRTtZQUUvQixNQUFNRSxPQUFRRCxhQUEwQjtZQUN4Q2hhLElBQUkrRCxNQUFNLGtDQUFrQ2tXLGNBQWMxaEIsUUFBUUM7WUFFbEUsTUFBTW1VLG9CQUFvQmYsVUFBVW1FLGVBQWVrSztZQUNuRGphLElBQUkrRCxNQUFNLDZCQUE2QjBWLGdCQUFnQkc7WUFDdkQvYSxLQUFLaWIsS0FBSyxJQUFJSSxpQkFDWk4sS0FDQTtnQkFDRUksY0FBYzNMLE9BQU81RSxLQUFLa0Q7Z0JBQzFCK0k7ZUFFRitEO1lBRUYsT0FBTzVhLEtBQUtpYjtBQUNkO1FBRVUsWUFBTUs7WUFDZCxJQUFJdGIsS0FBS3ViLFFBQVEsT0FBT3ZiLEtBQUt1YjtZQUM3QixNQUFNTixXQUFXamIsS0FBS2diO1lBQ3RCaGIsS0FBS3ViLFNBQVVOLEdBQVc7WUFDMUIsT0FBT2piLEtBQUt1YjtBQUNkO1FBRVUsaUJBQU1DO1lBQ2QsS0FBS3hiLEtBQUt5YixvQkFDUnpiLEtBQUt5Yiw0QkFBNEJ6YixLQUFLc2IsVUFBVUk7WUFDbEQsT0FBTzFiLEtBQUt5YjtBQUNkO1FBRVUsa0JBQU1FO1lBQ2QsS0FBSzNiLEtBQUs0YixvQkFDUjViLEtBQUs0Yiw0QkFBNEI1YixLQUFLZ2IsTUFBTWE7WUFDOUMsT0FBTzdiLEtBQUs0YjtBQUNkO1FBRVUsZ0JBQU1FO1lBQ2QsS0FBSzliLEtBQUsrYixpQkFDUi9iLEtBQUsrYix5QkFBeUIvYixLQUFLZ2IsTUFBTWdCO1lBQzNDLE9BQU9oYyxLQUFLK2I7QUFDZDtRQVNBLHFCQUFNRSxDQUNKQyxTQUNBQyxRQUFRO1lBRVIsTUFBTVYsMkJBQTJCemIsS0FBS3diO1lBQ3RDLE1BQU12TixhQUFhak8sS0FBS2tPO1lBQ3hCLE1BQU0vTSxNQUFNbkIsS0FBS21CLElBQUlSLElBQUlYLEtBQUtpYztZQUM5QjlhLElBQUkrRCxNQUNGLDBCQUEwQmdYLFVBQVUsUUFBUUEsUUFBUTVXLE9BQU8sYUFBYXRGLEtBQUsyYSxTQUFTQztZQUV4RixNQUFNd0Isa0JBQ0VYLG1CQUFtQlEsZ0JBQWdCQyxXQUFXLENBQUEsR0FBSWpPLE9BQ3hEM1Q7WUFDRjZHLElBQUkrRCxNQUNGLFNBQVNrWCxTQUFTQyxNQUFNemdCLHdCQUF3QkwsS0FBS0MsVUFBVTRnQjtZQUVqRSxPQUFPRCxRQUFRQyxTQUFTQyxNQUFNcmYsSUFBS0wsS0FBTUEsRUFBRTJmLE9BQU9GO0FBQ3BEO1FBT0EsbUJBQU1HO1lBQ0osTUFBTUMsMEJBQTBCeGMsS0FBSzhiO1lBQ3JDLE1BQU0zYSxNQUFNbkIsS0FBS21CLElBQUlSLElBQUlYLEtBQUt1YztZQUM5QnBiLElBQUkrRCxNQUFNLGtDQUFrQ2xGLEtBQUsyYSxTQUFTQztZQUMxRCxNQUFNd0Isa0JBQ0VJLGtCQUFrQkMsYUFBYXpjLEtBQUtrTyxTQUMxQzVUO1lBQ0Y2RyxJQUFJK0QsTUFDRixTQUFTa1gsU0FBU00sV0FBVzlnQixzQkFBc0JMLEtBQUtDLFVBQVU0Z0I7WUFFcEUsT0FBT0EsU0FBU007QUFDbEI7UUFFVSxVQUFBQyxDQUFXMWlCO1lBQ25CLE1BQU0yaUIsU0FBUztZQUNmLE1BQU10UCxRQUFRc1AsT0FBT0MsS0FBSzVpQixFQUFFOGY7WUFDNUIsS0FBS3pNLE9BQU8sT0FBTyxJQUFJaU0sa0JBQWtCdGY7WUFDekMsT0FBTSxFQUFHbWdCLE1BQU1MLFdBQVd6TTtZQUMxQixRQUFROE07Y0FDTixLQUFLO2NBQ0wsS0FBSztnQkFDSCxPQUFPLElBQUkwQyxhQUFBQSxjQUFjL0M7O2NBQzNCLEtBQUs7Z0JBQ0gsT0FBTyxJQUFJUCxLQUFBQSxtQkFBbUJPOztjQUNoQztnQkFDRSxPQUFPLElBQUlSLGtCQUFrQlE7O0FBRW5DO1FBT0EscUJBQU1nRDtZQUNKLE1BQU1uQiwyQkFBMkI1YixLQUFLMmI7WUFDdEMsTUFBTXhhLE1BQU1uQixLQUFLbUIsSUFBSVIsSUFBSVgsS0FBSytjO1lBQzlCNWIsSUFBSStELE1BQU0sb0NBQW9DbEYsS0FBSzJhLFNBQVNDO1lBQzVELE1BQU13QixrQkFBa0JSLG1CQUFtQmEsYUFBYXpjLEtBQUtrTyxTQUMxRDVUO1lBQ0g2RyxJQUFJK0QsTUFDRixTQUFTa1gsU0FBU1ksRUFBRXBoQix3QkFBd0JMLEtBQUtDLFVBQVU0Z0I7WUFFN0QsT0FBT0E7QUFDVDtRQVFBLFVBQU1hLENBQUtDO1lBQ1QsTUFBTWpDLFdBQVdqYixLQUFLZ2I7WUFDdEIsTUFBTS9NLGFBQWFqTyxLQUFLa087WUFDeEIsSUFBSTVUO1lBQ0o7Z0JBQ0VBLGVBQWUyZ0IsR0FBR2UscUJBQXFCbUIsT0FBT0QsY0FBY2pQO0FBQzlELGNBQUUsT0FBT2hVO2dCQUNQLE1BQU0sSUFBSW1qQixhQUFBQSxjQUNSLG9DQUFvQ0YsaUJBQWlCampCO0FBRXpEO1lBRUEsS0FBS0ssT0FBTytpQixTQUNWLE1BQU0sSUFBSUQsYUFBQUEsY0FDUixvQ0FBb0NGLGlCQUFpQjVpQixPQUFPMkwsT0FBT3hNLEtBQUs7WUFHNUUsT0FBT2EsT0FBT0E7QUFDaEI7UUFhQSxjQUFNZ2pCLENBQ0pyWSxPQUNBc1ksY0FBdUIsT0FDdkJDLGNBQXNCLElBQ3RCQyxVQUNBQyxPQUNBQztZQUVBLElBQUlDO1lBQ0osTUFBTXpjLE1BQU1uQixLQUFLbUIsSUFBSVIsSUFBSVgsS0FBS3NkO1lBQzlCO2dCQUNFLE9BQU0xUCxVQUFFQSxVQUFRaVEsVUFBRUEsWUFBYTVZO2dCQUMvQixNQUFNZ1csV0FBV2piLEtBQUtnYjtnQkFDdEIsTUFBTS9NLGFBQWFqTyxLQUFLa087Z0JBQ3hCLE1BQU00UCxRQUFRO29CQUNaQyxjQUFjblE7b0JBQ2RvUSxrQkFBa0JIO29CQUNsQkwsYUFBYUE7b0JBQ2JDLFVBQVVBO29CQUNWQyxPQUFPQTtvQkFDUEMsZ0JBQWdCQTs7Z0JBRWxCQyxxQkFBcUIzQyxHQUFHcUMsU0FBU1EsT0FBTzdQO2dCQUN4QzlNLElBQUk4YyxLQUNGLG9CQUFvQnJRLG1DQUFtQzZQLFlBQVksb0JBQW9CRixjQUFjLGtCQUFrQjtBQUUzSCxjQUFFLE9BQU90akI7Z0JBQ1AsTUFBTStGLEtBQUsyYyxXQUFXMWlCO0FBQ3hCO1lBQ0EsT0FBTzJqQjtBQUNUO1FBRVUsNkJBQU9NLENBQ2ZDLFlBQ0F6aEI7WUFFQSxPQUFNb1IsYUFBRUEsYUFBV2hOLEtBQUVBLEtBQUdzZCxpQkFBRUEsbUJBQW9CRDtZQUM5QyxNQUFNaGQsTUFBTWtkLFFBQUFBLFFBQVExZCxJQUFJOFoseUJBQXlCLENBQUEsR0FBSTlaLElBQ25EWCxLQUFLa2U7WUFFUC9jLElBQUkrRCxNQUNGLHdDQUF3QzRJLHNCQUFzQnBSO1lBRWhFLE1BQU00aEIsV0FBV3pJLFlBQVlHLHdCQUF3QmxJO1lBQ3JELE1BQU14SSxLQUFLdVEsWUFBWXBCLE9BQU82SjtZQUM5Qm5kLElBQUkrRCxNQUFNLFlBQVlvWiwwQkFBMEJoWjtZQUNoRCxNQUFNaVosTUFBTSxJQUFJQztZQUNoQixPQUFPLElBQUkvUixRQUFBQSxTQUFTO2dCQUNsQm5ILElBQUlBO2dCQUNKd0wsYUFBYTtvQkFDWHhMLElBQUlBO29CQUNKd0ksYUFBYUE7b0JBQ2JELFlBQVkvTSxJQUFJMmQ7b0JBQ2hCTCxpQkFBaUJBO29CQUNqQk0sV0FBV0g7b0JBQ1hJLFdBQVdKOztnQkFFYjdoQixPQUFPQTtnQkFDUGdpQixXQUFXSDtnQkFDWEksV0FBV0o7O0FBRWY7UUFTQSxZQUFNSyxDQUFPMUIsY0FBc0JVO1lBQ2pDLElBQUlpQjtZQUNKLE1BQU0xZCxNQUFNbkIsS0FBS21CLElBQUlSLElBQUlYLEtBQUs0ZTtZQUM5QjtnQkFDRSxNQUFNM0QsV0FBV2piLEtBQUtnYjtnQkFDdEI3WixJQUFJK0QsTUFBTSxhQUFhZ1k7Z0JBQ3ZCLE1BQU1pQixtQkFBb0NsRCxHQUFHMkQsT0FBTztvQkFDbERiLGNBQWNiO29CQUNkYyxrQkFBa0JKOztnQkFFcEJpQixXQUFXcEUsd0JBQXdCeUQsdUJBQ2pDQyxZQUNBbmUsS0FBSzJhLFNBQVNDO2dCQUVoQnpaLElBQUk4YyxLQUNGLHlCQUF5QmYsc0JBQXNCbGQsS0FBSzJhLFNBQVNDLGFBQWFpRSxTQUFTdlo7QUFFdkYsY0FBRSxPQUFPckw7Z0JBQ1AsTUFBTStGLEtBQUsyYyxXQUFXMWlCO0FBQ3hCO1lBQ0EsT0FBTzRrQjtBQUNUO1FBYUEsdUJBQU1DLENBQ0o3WixPQUNBc1ksY0FBdUIsT0FDdkJDLGNBQXNCLElBQ3RCQyxVQUNBQyxPQUNBQztZQUVBLE1BQU1DLHFCQUFxQjVkLEtBQUtzZCxTQUM5QnJZLE9BQ0FzWSxhQUNBQyxhQUNBQyxVQUNBQyxPQUNBQztZQUVGLE9BQU0vUCxVQUFFQSxZQUFhM0k7WUFDckIsT0FBT2pGLEtBQUs0ZSxPQUFPaFIsVUFBb0JnUTtBQUN6QztRQVlBLFlBQU1tQixDQUFPN0I7WUFDWCxNQUFNakMsV0FBV2piLEtBQUtnYjtZQUN0QixNQUFNL00sYUFBYWpPLEtBQUtrTztZQUN4QixNQUFNMlEsaUJBQWlCN2UsS0FBS2lkLEtBQUtDO1lBQ2pDLEtBQUsyQixVQUNILE1BQU0sSUFBSXpCLGFBQUFBLGNBQ1IscUNBQXFDRjtZQUV6QyxJQUFJNWlCO1lBQ0o7Z0JBQ0VBLGVBQWUyZ0IsR0FBRzhELE9BQ2hCO29CQUFFaEIsY0FBY2MsU0FBU3ZaO29CQUFJMFosUUFBUTttQkFDckMvUTtBQUVKLGNBQUUsT0FBT2hVO2dCQUNQLE1BQU0sSUFBSXdELGFBQUFBLGNBQ1IsdUNBQXVDeWYsaUJBQWlCampCO0FBRTVEO1lBQ0EsS0FBS0ssT0FBTytpQixTQUNWLE1BQU0sSUFBSTVmLGFBQUFBLGNBQ1IsdUNBQXVDeWYsaUJBQWlCNWlCLE9BQU8yTCxPQUFPeE0sS0FBSztZQUUvRSxPQUFPYTtBQUNUOztJQzVkSSxNQUFPMmtCLG1DQUFtQy9rQixvQkFBQUE7UUFBaEQsV0FBQTJFOztZQUVFbUIsS0FBQXdkLGNBQXNCO0FBOER4QjtRQWxERSxLQUFBelU7WUFDRSxNQUFNbVcsT0FBT2xmLEtBQUtrRztZQUNsQixJQUFJZ1osTUFBTSxNQUFNLElBQUk3WSxhQUFBQSxnQkFBZ0I2WSxLQUFLeFU7WUFDekMsTUFBTTBSLFdBQTZCO2dCQUNqQzJCLGNBQWMvZCxLQUFLK2Q7Z0JBQ25CQyxrQkFBa0JoZSxLQUFLZ2U7Z0JBQ3ZCbUIsTUFBTW5mLEtBQUttZjtnQkFDWDNCLGFBQWF4ZCxLQUFLd2Q7O1lBRXBCLFdBQVd4ZCxLQUFLMmQsbUJBQW1CLGFBQ2pDdkIsU0FBU3VCLGlCQUFpQjNkLEtBQUsyZDtZQUNqQyxJQUFJM2QsS0FBSzBkLE9BQU90QixTQUFTc0IsUUFBUTFkLEtBQUswZDtZQUN0QyxPQUFPdEI7QUFDVDtRQUVBLGNBQUFnRCxDQUFlcGQ7WUFDYmhDLEtBQUt3ZCxjQUFjeGI7WUFDbkIsT0FBT2hDO0FBQ1Q7UUFFQSxPQUFBcWYsQ0FBUUM7WUFDTnRmLEtBQUswZCxRQUFRMWQsS0FBSzBkLFNBQVM7WUFDM0IxZCxLQUFLMGQsTUFBTTNpQixLQUFLdWtCO1lBQ2hCLE9BQU90ZjtBQUNUO1FBRUEsUUFBQXVmLENBQVN2ZDtZQUNQaEMsS0FBSzBkLFFBQVExYjtZQUNiLE9BQU9oQztBQUNUO1FBRUEsZUFBQXdmLENBQWdCeGQ7WUFDZGhDLEtBQUsrZCxlQUFlL2I7WUFDcEIsT0FBT2hDO0FBQ1Q7UUFFQSxtQkFBQXlmLENBQW9CemQ7WUFDbEJoQyxLQUFLZ2UsbUJBQW1CaGM7WUFDeEIsT0FBT2hDO0FBQ1Q7UUFFQSxpQkFBQTBmLENBQWtCMWQ7WUFDaEJoQyxLQUFLMmQsaUJBQWlCM2I7WUFDdEIsT0FBT2hDO0FBQ1Q7UUFFQSxPQUFBMmYsQ0FBUTNkO1lBQ05oQyxLQUFLbWYsT0FBT25kO1lBQ1osT0FBT2hDO0FBQ1Q7O0lBN0RBc0gsTUFBQUEsV0FBQSxFQURDTSwyRUFDd0JxWCwyQkFBQXZYLFdBQUEsb0JBQUE7SUFFekJKLE1BQUFBLFdBQUEsRUFEQ3NZLG9CQUFBQSxVQUFVLDhDQUNrQlgsMkJBQUF2WCxXQUFBLGNBQUE7SUFFN0JKLE1BQUFBLFdBQUEsRUFEQ00sMkVBQ3FCcVgsMkJBQUF2WCxXQUFBLHFCQUFBO0lBRXRCSixNQUFBQSxXQUFBLEVBRENNLDJFQUN5QnFYLDJCQUFBdlgsV0FBQSx5QkFBQTtJQUUxQkosTUFBQUEsV0FBQSxFQURDdVksb0JBQUFBLElBQUksK0NBQ21CWiwyQkFBQXZYLFdBQUEsdUJBQUE7SUFFeEJKLE1BQUFBLFdBQUEsRUFEQ00sMkVBQ2FxWCwyQkFBQXZYLFdBQUEsYUFBQTtJQ2ZKb1ksUUFBQUEsbUJBQUFBO0tBQVosU0FBWUE7UUFRVkEsWUFBQSxjQUFBO1FBU0FBLFlBQUEsY0FBQTtBQUNELE1BbEJELENBQVlBLFFBQUFBLGdCQUFBQSxzQkFBVyxDQUFBO0lDQVZDLFFBQUFBLGtCQUFOLE1BQU1BLHdCQUF3QjdsQjtRQWdCbkMsV0FBQTJFLENBQVlyQjtZQUNWMEIsTUFBTTFCO0FBQ1I7O0lBZEE4SixNQUFBQSxXQUFBLEVBSEMrRSxXQUFBQSxZQUFZLDhDQUNaMUUsZUFDQXFZLGtEQUNXeEIsU0FBS3VCLHdCQUFBclksV0FBQSxrQkFBQTtJQUtqQkosTUFBQUEsV0FBQSxFQUhDK0UsV0FBQUEsWUFBWSw0Q0FDWjFFLGVBQ0FzWSxrREFDV3pCLFNBQUt1Qix3QkFBQXJZLFdBQUEsa0JBQUE7SUFLakJKLE1BQUFBLFdBQUEsRUFIQytFLFdBQUFBLFlBQVksb0NBQ1oxRSxlQUNBdVksbUVBQ2dCSCx3QkFBQXJZLFdBQUEsZ0JBQUE7SUFkTnFZLFFBQUFBLGtCQUFlelksaUJBQUEsRUFEM0I2WSxXQUFBQSxLQUFLM1QscUVBQ091VDtJQ0FTSyxRQUFBQSw0QkFBZixNQUFlQSxrQ0FBa0NMO1FBV3RELFdBQUFsaEIsQ0FBc0JyQjtZQUNwQjBCLE1BQU0xQjtBQUNSOztJQVRBOEosTUFBQUEsV0FBQSxFQUhDK0UsV0FBQUEsWUFBWSx1QkFDWjFFLGVBQ0EwWSw2REFDa0JELGtDQUFBMVksV0FBQSxrQkFBQTtJQUtuQkosTUFBQUEsV0FBQSxFQUhDK0UsV0FBQUEsWUFBWSxnREFDWjFFLGVBQ0EyWSw2REFDa0JGLGtDQUFBMVksV0FBQSxrQkFBQTtJQVRDMFksUUFBQUEsNEJBQXlCOVksaUJBQUEsRUFEOUM2WSxXQUFBQSxLQUFLM1QscUVBQ2dCNFQ7SUNBdEJsbUIsb0JBQUFBLE1BQU13TixVQUFVNlksV0FBVyxTQUFTQTtRQUdsQyxPQUFPcm1CLDBCQUFNcW1CLFNBQVN2Z0IsS0FBS25CO0FBQzdCO0lBRUEzRSxvQkFBQUEsTUFBTXdOLFVBQVVpSSxZQUFZLFNBQVNBO1FBR25DLE9BQU96ViwwQkFBTXlWLFVBQVUzUCxLQUFLbkI7QUFDOUI7SUFFQTNFLG9CQUFBQSxNQUFNd04sVUFBVThZLFlBQVksU0FBU0E7UUFHbkMsT0FBT3RtQixvQkFBQUEsTUFBTXNtQixVQUFVeGdCO0FBQ3pCO0lBRUM5RixvQkFBQUEsTUFBY3NtQixZQUFZLFNBQVNBLFVBQ2xDdmI7UUFFQSxLQUFLL0ssb0JBQUFBLE1BQU11bUIsWUFBWXhiLFFBQVEsT0FBTztZQUFFQSxPQUFPQTs7UUFDL0MsTUFBTXliLHNCQUNKcFksV0FBQUEsU0FBU3FZLGNBQWMxYixNQUFNcEcsZ0JBQXVCO1FBRXRELE1BQU0raEIsaUJBQWlCdFksV0FBQUEsU0FBU3pDLElBQzlCWixNQUFNcEcsYUFDTmdpQixhQUFBQSxPQUFPQztRQUVULE1BQU1DLG9CQUFvQnpZLFdBQUFBLFNBQVN6QyxJQUNqQ1osTUFBTXBHLGFBQ055TixRQUFBQSxnQkFBZ0IwVTtRQUVsQixNQUFNQyxtQkFBbUIzWSxXQUFBQSxTQUFTekMsSUFDaENaLE1BQU1wRyxhQUNOeU4sUUFBQUEsZ0JBQWdCNFU7UUFHbEIsTUFBTTVtQixTQUE2QjtZQUNqQzJLLE9BQU8sQ0FBQTtZQUNQa2MsUUFBUSxDQUFBO1lBQ1I1YixXQUFXLENBQUE7WUFDWHhILFVBQVUsQ0FBQTtZQUNWTSxRQUFRLENBQUE7O1FBR1YsTUFBTStpQixnQkFBZ0JybkIsT0FBTzhNLEtBQUsrWixrQkFBa0IsQ0FBQTtRQUNwRCxNQUFNUyxjQUFjdG5CLE9BQU84TSxLQUFLa2EscUJBQXFCLENBQUE7UUFDckQsTUFBTU8sYUFBYXZuQixPQUFPOE0sS0FBS29hLG9CQUFvQixDQUFBO1FBR25ELEtBQUssTUFBTW5nQixPQUFPNGYscUJBQXFCO1lBQ3JDLE1BQU0xZSxRQUFRaUQsTUFBTW5FO1lBQ3BCLE1BQU0yZixjQUFjVyxjQUFjaGpCLFNBQVMwQztZQUMzQyxNQUFNeWdCLFlBQVlkO1lBQ2xCLE1BQU05USxZQUFZMFIsWUFBWWpqQixTQUFTMEM7WUFDdkMsTUFBTXlmLFdBQVdlLFdBQVdsakIsU0FBUzBDO1lBR3JDLElBQUkyZixlQUFlOVEsYUFBYTRRLFVBQVU7Z0JBQ3hDam1CLE9BQU9pTCxZQUFZakwsT0FBT2lMLGFBQWMsQ0FBQTtnQkFDdkNqTCxPQUFPaUwsVUFBa0J6RSxPQUFPa0I7QUFDbkM7WUFDQSxJQUFJMk4sV0FBVztnQkFDYnJWLE9BQU95RCxXQUFXekQsT0FBT3lELFlBQWEsQ0FBQTtnQkFDckN6RCxPQUFPeUQsU0FBaUIrQyxPQUFPa0I7QUFDbEM7WUFDQSxJQUFJdWUsVUFBVTtnQkFDWmptQixPQUFPK0QsU0FBUy9ELE9BQU8rRCxVQUFXLENBQUE7Z0JBQ2pDL0QsT0FBTytELE9BQWV5QyxPQUFPa0I7QUFDaEM7WUFDQSxJQUFJdWYsVUFBVTtnQkFDWmpuQixPQUFPNm1CLFNBQVU3bUIsT0FBTzZtQixVQUFVLENBQUE7Z0JBQ2pDN21CLE9BQU82bUIsT0FBZXJnQixPQUFPa0I7QUFDaEM7QUFDRjtRQUVBMUgsT0FBTzJLLFFBQVEvSyxvQkFBQUEsTUFBTTZPLE1BQU16TyxPQUFPNm1CLFFBQVFsYyxNQUFNcEcsWUFBWWhGO1FBQzVELE9BQU9TO0FBQ1QsTUFBRWtuQixLQUFLdG5CLG9CQUFBQTtJQUVOQSxvQkFBQUEsTUFBY3lWLFlBQVksU0FBU0EsVUFDbEMxSztRQUVBLFNBQVNxRCxXQUFBQSxTQUFTekMsV0FDVFosVUFBVSxhQUFjQSxNQUFNcEcsY0FBc0JvRyxPQUMzRHFILFFBQUFBLGdCQUFnQjBVO0FBRXBCLE1BQUVRLEtBQUt0bkIsb0JBQUFBO0lBRU5BLG9CQUFBQSxNQUFjcW1CLFdBQVcsU0FBU0EsU0FDakN0YjtRQUVBLFNBQVNxRCxXQUFBQSxTQUFTekMsV0FDVFosVUFBVSxhQUFjQSxNQUFNcEcsY0FBc0JvRyxPQUMzRHFILFFBQUFBLGdCQUFnQjRVO0FBRXBCLE1BQUVNLEtBQUt0bkIsb0JBQUFBO0lBRU5BLG9CQUFBQSxNQUFjdW5CLFdBQVcsU0FBU0EsU0FDakN4YztRQUVBLE9BQU9xRCxXQUFBQSxTQUFTekMsV0FDUFosVUFBVSxhQUFjQSxNQUFNcEcsY0FBc0JvRyxPQUMzRHFELFdBQUFBLFNBQVN4SCxJQUFJd0wsUUFBQUEsZ0JBQWdCb1YsUUFBUXBWLFFBQUFBLGdCQUFnQnFWO0FBRXpELE1BQUVILEtBQUt0bkIsb0JBQUFBO0lBRU5BLG9CQUFBQSxNQUFjMG5CLFVBQVUsU0FBU0EsUUFDaEMzYztRQUVBLE1BQU00YyxPQUFPdlosV0FBQUEsU0FBU3pDLElBQ3BCWixNQUFNcEcsYUFDTnlKLG9CQUFTeEgsSUFBSXdMLFFBQUFBLGdCQUFnQm9WLFFBQVFwVixRQUFBQSxnQkFBZ0J3VjtRQUV2RCxLQUFLRCxNQUFNLE9BQU9wbUI7UUFDbEIsT0FBT3dKLE1BQU00YztBQUNmLE1BQUVMLEtBQUt0bkIsb0JBQUFBO0lBRU5BLG9CQUFBQSxNQUFjNEQsYUFBYSxTQUFTQSxXQUNuQ21IO1FBRUFBLGVBQWVBLFVBQVUsYUFBY0EsTUFBTXBHLGNBQXNCb0c7UUFDbkUsT0FBT3FELFdBQUFBLFNBQVN6QyxJQUNkWixPQUNBcUQsV0FBQUEsU0FBU3hILElBQUl3TCxRQUFBQSxnQkFBZ0JvVixRQUFRcFYsd0JBQWdCcVY7QUFFekQsTUFBRUgsS0FBS3RuQixvQkFBQUE7SUFFTkEsb0JBQUFBLE1BQWNvRCxpQkFBaUIsU0FBU0EsZUFDdkMySDtRQUtBLE1BQU1vYyxjQUF3QixFQUFDL1UsUUFBQUEsZ0JBQWdCMFU7UUFDL0MsTUFBTU0sYUFBdUIsRUFBQ2hWLFFBQUFBLGdCQUFnQjRVO1FBRTlDLE1BQU1yVCxhQUFhdkYsV0FBQUEsU0FBU3hILE9BQU91Z0I7UUFDbkMsTUFBTVUsWUFBWXpaLFdBQUFBLFNBQVN4SCxPQUFPd2dCO1FBRWxDLE1BQU1VLGdCQUFnQi9jLFVBQVUsYUFBYUEsUUFBUUEsTUFBTXBHO1FBRTNELE1BQU1vakIsY0FBeUMzWixXQUFBQSxTQUFTekMsSUFDdERtYyxRQUNBblU7UUFFRixNQUFNcVUsYUFBd0M1WixXQUFBQSxTQUFTekMsSUFDckRtYyxRQUNBRDtRQUdGLE9BQU87WUFDTDNrQixhQUFhNmtCLGFBQWFFLGVBQWU7WUFDekM5a0IsWUFBWTZrQixZQUFZQyxlQUFlOztBQUUzQyxNQUFFWCxLQUFLdG5CLG9CQUFBQTtJQ25IRCxTQUFVa29CLGFBQ2R2RDtRQUVBLEtBQUtBLFVBQVUsT0FBT3BqQjtRQUN0QixXQUFXb2pCLGFBQWEsVUFBVSxPQUFPQTtRQUN6QyxPQUFPQSxTQUFTd0Q7QUFDbEI7YUFrQmdCQztRQUNkLE9BQU8sU0FDTEMsUUFDQUMsYUFDQUM7WUFFQSxNQUFNQyxpQkFBaUJELFdBQVd6Z0I7WUFFbEN5Z0IsV0FBV3pnQixRQUFRN0gsa0JBRWRvRjtnQkFFSCxNQUFNbUQsTUFBaUJuRCxLQUFLO2dCQUM1QixNQUFNb2pCLFdBQVdqZ0IsSUFBSWtnQixlQUFlQztnQkFFcEMsTUFBTUMsZUFBZ0I5aUIsS0FDcEIsbUJBQ0E4aUI7Z0JBRUYsTUFBTUMsZUFBZUQsT0FBT0UsUUFBUXRnQjtnQkFFcEMsSUFBSXFnQixPQUFPbm5CLFVBQVUsR0FBRztvQkFDdEIsTUFBTSxJQUFJd2hCLGFBQUFBLGNBQWM7QUFDMUI7Z0JBRUEsSUFBSTJGLE9BQU9ubkIsU0FBUyxHQUFHO29CQUNyQixNQUFNLElBQUl3aEIsYUFBQUEsY0FBYyw2QkFBNkIyRixPQUFPbm5CO0FBQzlEO2dCQUVBLElBQUltbkIsT0FBTyxHQUFHM1ksU0FBU3VZLFVBQVU7b0JBQy9CLE1BQU0sSUFBSW5KLEtBQUFBLG1CQUNSLDhCQUE4QmdKO0FBRWxDO2dCQUVBLGFBQWFFLGVBQWVPLE1BQU1qakIsTUFBTVQ7QUFDMUM7WUFFQSxPQUFPa2pCO0FBQ1Q7QUFDRjtJQUVPdG9CLGVBQWUrb0IsZ0JBTXBCQyxTQUNBdmpCLE1BQ0FrQixLQUNBbUU7UUFFQSxPQUFNbWUsTUFBRUEsUUFBU0Q7UUFFakIsTUFBTUUsZ0JBQWdCRCxLQUFLRTtRQUMzQixNQUFNbFosUUFBUWlaLFFBQVFFO1FBRXRCLE1BQU1DLHFCQUFxQixTQUN6QmpCLFFBQ0FDLGFBQ0F4Z0I7WUFFQWpJLE9BQU8wcEIsZUFBZWxCLFFBQVFDLGFBQWE7Z0JBQ3pDa0IsWUFBWTtnQkFDWkMsVUFBVTtnQkFDVkMsY0FBYztnQkFDZDVoQixPQUFPQTs7QUFFWDtRQUVBd2hCLG1CQUFtQnZlLE9BQU9uRSxLQUFlc0o7QUFDM0M7YUFFZ0J5WjtRQUNkLFNBQVNBO1lBQ1AsT0FBTyxTQUFVcGtCLEtBQVVxa0I7Z0JBQ3pCLE9BQU9iLFdBQUFBLE1BQ0xyYixvQkFBQUEsWUFDQW1jLGFBQUFBLGFBQ0FDLGFBQUFBLFlBQ0FDLGFBQUFBLFNBQVNmLGtCQUNUZ0IsV0FBQUEsYUFDRTViLFdBQUFBLFNBQVN4SCxJQUFJd0wsUUFBQUEsZ0JBQWdCb1YsUUFBUXBWLHdCQUFnQndWLFdBQ3JEZ0MsV0FQR2IsQ0FTTHhqQixLQUFLcWtCO0FBQ1Q7QUFDRjtRQUVBLE9BQU9LLFdBQUFBLFdBQVd4akIsSUFBSTJMLFFBQUFBLGdCQUFnQndWLFVBQ25Dc0MsT0FBTztZQUNOQyxXQUFXUjtZQUNYdGtCLE1BQU07V0FFUDBqQjtBQUNMO0lBRU85b0IsZUFBZW1xQixzQkFNcEJuQixTQUNBdmpCLE1BQ0FrQixLQUNBbUU7UUFFQSxPQUFNbWUsTUFBRUEsUUFBU0Q7UUFDakJsZSxNQUFNbkUsT0FBT3NpQixLQUFLbUI7QUFDcEI7YUFFZ0JDO1FBQ2QsU0FBU0E7WUFDUCxPQUFPLFNBQVUva0IsS0FBVXFrQjtnQkFDekIsT0FBT2IsV0FBQUEsTUFDTHJiLGdDQUNBb2MseUJBQ0FDLHNCQUFTSyx3QkFDVEcsYUFBQUEsU0FBU0gsd0JBQ1RKLFdBQUFBLGFBQ0U1YixvQkFBU3hILElBQ1B3TCxRQUFBQSxnQkFBZ0JvVixRQUNoQm9DLFdBQ0F4WCxRQUFBQSxnQkFBZ0JvWSxpQkFFbEJaLFdBWEdiLENBYUx4akIsS0FBS3FrQjtBQUNUO0FBQ0Y7UUFFQSxPQUFPSyxXQUFBQSxXQUFXeGpCLElBQUkyTCxRQUFBQSxnQkFBZ0JvWSxnQkFDbkNOLE9BQU87WUFDTkMsV0FBV0c7WUFDWGpsQixNQUFNO1dBRVAwakI7QUFDTDtJQVVPOW9CLGVBQWV3cUIsbUJBQ3BCMWYsT0FDQS9HLFVBQ0F3RTtRQUVBLElBQUl2SCxhQUFzRCtDO1FBQzFELFdBQVcvQyxlQUFlLFVBQVU7WUFDbEM7Z0JBQ0UsTUFBTWlQLFFBQ0psUSxvQkFBQUEsTUFBTTBuQixRQUFRM2MsVUFBVXZDLElBQUltRCxJQUFJLFFBQVF5ZCxhQUFhNVk7Z0JBQ3ZELElBQUl4TSxtQkFBbUJBLGFBQWEsWUFDbEMvQyxtQkFBbUIrQyxTQUFTK0csT0FBT21GLE9BQU8xSDtBQUM5QyxjQUFFLE9BQU96STtnQkFDUCxNQUFNLElBQUl3RCxhQUFBQSxjQUFjLDZDQUE2Q3hEO0FBQ3ZFO0FBQ0Y7UUFFQSxLQUFLa0IscUJBQXFCQSxlQUFlLFVBQ3ZDLE1BQU0sSUFBSXNDLGFBQUFBLGNBQ1IsNkJBQTZCd0gsTUFBTXBHLFlBQVloRjtRQUVuRCxPQUFPc0I7QUFDVDtJQUVPaEIsZUFBZXlxQixvQkFLcEJ6QixTQUNBdmpCLE1BQ0FrQixLQUNBbUU7UUFFQSxNQUFNOUosbUJBQW1Cd3BCLG1CQUFtQjFmLE9BQU9yRixLQUFLMUIsVUFBVWlsQjtRQUNsRSxNQUFNMEIsWUFBWTFCO1FBQ2xCLE1BQU0yQixjQUFjN2Y7UUFFcEI0ZixVQUFVRSxJQUFJLFVBQWlCO1FBQy9CRixVQUFVRSxJQUFJLG9CQUEyQjVwQjtRQUN6QztZQUNFLE1BQU02cEIsT0FBT2hsQixLQUFLUyxTQUNoQjFHLE9BQU80RCxPQUFPLENBQUEsR0FBS3FDLEtBQWFDLFlBQVk7Z0JBQzFDOUMsUUFBUTtnQkFDUjhuQixrQkFBa0I5cEI7Z0JBQ2xCK0Usa0JBQWtCO2dCQUNsQkMsZ0JBQWdCOztZQUdwQixNQUFNaEQsZUFBZTZuQixLQUFLaGdCLE9BQU84ZixhQUFhM0I7WUFDOUNBLFFBQVFuVyxPQUFPaVIsS0FDYixjQUFjL2pCLG9CQUFBQSxNQUFNdUgsVUFBVXpCLEtBQUswQix1QkFBdUJ4SCxvQkFBQUEsTUFBTXFOLEdBQUd0QyxXQUFxQjlILE9BQU9qRCxvQkFBQUEsTUFBTXFOLEdBQUd0QztBQUU1RztZQUVFNGYsVUFBVUUsSUFBSSxVQUFpQnRwQjtZQUMvQm9wQixVQUFVRSxJQUFJLG9CQUEyQnRwQjtBQUMzQztBQUNGO0lBRU90QixlQUFlK3FCLG9CQUtwQi9CLFNBQ0F2akIsTUFDQWtCLEtBQ0FtRTtRQUVBLE1BQU05SixtQkFBbUJ3cEIsbUJBQW1CMWYsT0FBT3JGLEtBQUsxQixVQUFVaWxCO1FBQ2xFLE1BQU0wQixZQUFZMUI7UUFDbEIsTUFBTTJCLGNBQWM3ZjtRQUNwQjRmLFVBQVVFLElBQUksVUFBaUI7UUFDL0JGLFVBQVVFLElBQUksb0JBQTJCNXBCO1FBQ3pDO1lBQ0UsTUFBTTZwQixPQUFPaGxCLEtBQUtTLFNBQ2hCMUcsT0FBTzRELE9BQU8sQ0FBQSxHQUFLcUMsS0FBYUMsWUFBWTtnQkFDMUM5QyxRQUFRO2dCQUNSOG5CLGtCQUFrQjlwQjtnQkFDbEIrRSxrQkFBa0I7Z0JBQ2xCQyxnQkFBZ0I7Z0JBQ2hCZ2xCLHVCQUF1QjtnQkFDdkJDLGdCQUFnQjs7a0JBR2RKLEtBQUt2ZixPQUFPcWYsYUFBYTNCO1lBQy9CQSxRQUFRblcsT0FBT2lSLEtBQ2IsY0FBYy9qQixvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEIsbUJBQW9CdUQsTUFBYy9LLG9CQUFBQSxNQUFNcU4sR0FBR3RDO0FBRWxGO1lBQ0U0ZixVQUFVRSxJQUFJLFVBQWlCdHBCO1lBQy9Cb3BCLFVBQVVFLElBQUksb0JBQTJCdHBCO0FBQzNDO0FBQ0Y7SUFFT3RCLGVBQWVrckIsb0JBS3BCbEMsU0FDQXZqQixNQUNBa0IsS0FDQW1FO1FBRUEsTUFBTTlKLG1CQUFtQndwQixtQkFBbUIxZixPQUFPckYsS0FBSzFCLFVBQVVpbEI7UUFDbEUsTUFBTTBCLFlBQVkxQjtRQUNsQjBCLFVBQVVFLElBQUksVUFBaUI7UUFDL0JGLFVBQVVFLElBQUksb0JBQTJCNXBCO1FBQ3pDMHBCLFVBQVVFLElBQUksY0FBcUI1cEI7UUFDbkM7WUFDRSxNQUFNbXFCLFNBQVNwckIsb0JBQUFBLE1BQU1xTixHQUFHdEM7WUFDeEIsTUFBTUssS0FBS0wsTUFBTXFnQjtZQUNqQixNQUFNTixPQUFPaGxCLEtBQUtTLFNBQ2hCMUcsT0FBTzRELE9BQU8sQ0FBQSxHQUFLcUMsS0FBYUMsWUFBWTtnQkFDMUNzbEIsWUFBWXBxQjtnQkFDWmdDLFFBQVE7Z0JBQ1IrQyxrQkFBa0I7Z0JBQ2xCQyxnQkFBZ0I7O1lBR3BCO3NCQUNRNmtCLEtBQUtsWSxPQUFPeEgsSUFBVzZkO0FBQy9CLGNBQUUsT0FFRjtZQUNBQSxRQUFRblcsT0FBT2lSLEtBQ2IsY0FBYy9qQixvQkFBQUEsTUFBTXVILFVBQVV6QixLQUFLMEIsbUJBQW1CK0YsT0FBT25DO0FBRWpFO1lBQ0V1ZixVQUFVRSxJQUFJLFVBQWlCdHBCO1lBQy9Cb3BCLFVBQVVFLElBQUksb0JBQTJCdHBCO1lBQ3pDb3BCLFVBQVVFLElBQUksY0FBcUJ0cEI7QUFDckM7QUFDRjtJQUVPdEIsZUFBZXFyQixpQkFLcEJyQyxTQUNBdmpCLE1BRUFrQixLQUVBbUU7UUFFQSxNQUFNd2dCLE1BQU1yRCxhQUNWZSxRQUFRdGQsSUFBSTtRQUVkLEtBQUs0ZixLQUFLO1FBQ1YsSUFBSUEsUUFBUTdsQixLQUFLbEQsU0FBVWtELEtBQUs4bEIsYUFBYTlsQixLQUFLOGxCLFVBQVVELE1BQU87WUFDakUsTUFBTSxJQUFJak0sS0FBQUEsbUJBQ1IsZ0JBQWdCaU07QUFFcEI7QUFDRjtJQUVPdHJCLGVBQWV3ckIsa0JBS3BCeEMsU0FDQXZqQixNQUNBa0IsS0FDQW1FO1FBRUEsTUFBTXdnQixNQUFNckQsYUFDVmUsUUFBUXRkLElBQUk7UUFHZCxLQUFLNGYsS0FBSztRQUVWLE1BQU10cUIsbUJBQW1Cd3BCLG1CQUFtQjFmLE9BQU9yRixLQUFLMUIsVUFBVWlsQjtRQUNsRSxNQUFNMEIsWUFBWTFCO1FBQ2xCLE1BQU15QyxVQUFVSCxRQUFRN2xCLEtBQUtsRCxTQUFVa0QsS0FBSzhsQixhQUFhOWxCLEtBQUs4bEIsVUFBVUQ7UUFFeEUsSUFBSUcsU0FBUztZQUNYekMsUUFBUW5XLE9BQU9pUixLQUNiLG9CQUFvQndILG1EQUFtRHRxQjtZQUd6RTBwQixVQUFVRSxJQUFJLFVBQWlCO1lBQy9CRixVQUFVRSxJQUFJLG9CQUEyQjVwQjtZQUN6QzBwQixVQUFVRSxJQUFJLG1CQUFtQjtZQUNqQ0YsVUFBVWdCLFNBQVMxcUI7QUFDckI7QUFFRjthQUVnQmdDLE9BQ2RoQyxZQUNBMnFCLGtCQUNBSjtRQUVBLE1BQU1LLHlCQUNHRCxxQkFBcUIsWUFBWUUsUUFBUUY7UUFDbEQsTUFBTXBwQixRQUFRcXBCLGtCQUNWdHFCLFlBQ0NxcUI7UUFDTCxNQUFNRyxPQUFPRixrQkFDUkQsbUJBQ0RKO1FBRUosU0FBU3ZvQixPQUNQZSxVQUNBeEIsT0FDQWdwQjtZQUVBLE1BQU03RCxPQUF1QjtnQkFDM0I2RCxXQUFXQTtnQkFDWGhwQixPQUFPQTtnQkFDUHdCLFVBQVVBOztZQUVaLE9BQU8ra0IsV0FBQUEsTUFDTDVhLG9CQUNFQyxXQUFBQSxTQUFTeEgsSUFBSXdMLHdCQUFnQm9WLFFBQVFwVixRQUFBQSxnQkFBZ0JxVixTQUNyREUsT0FHRnFFLGFBQUFBLE9BQU9QLG1CQUEwQjlELE1BQU07Z0JBQUVzRSxVQUFVO2dCQUVuRGxDLHNCQUFTdUIsa0JBQXlCM0QsTUFBTTtnQkFBRXNFLFVBQVU7Z0JBQ3BEMUIsYUFBQUEsU0FBU2Usa0JBQXlCM0QsTUFBTTtnQkFBRXNFLFVBQVU7Z0JBQ3BEQyxhQUFBQSxTQUFTWixrQkFBeUIzRCxNQUFNO2dCQUFFc0UsVUFBVTtnQkFFcERsQyxzQkFBU1cscUJBQTRCL0MsTUFBTTtnQkFBRXNFLFVBQVU7Z0JBQ3ZEMUIsc0JBQVNTLHFCQUE0QnJELE1BQU07Z0JBQUVzRSxVQUFVO2dCQUN2REMsc0JBQVNmLHFCQUE0QnhELE1BQU07Z0JBQUVzRSxVQUFVOztBQUUzRDtRQUVBLE9BQU9oQyxXQUFBQSxXQUFXeGpCLElBQUkyTCxRQUFBQSxnQkFBZ0JxVixRQUNuQ3lDLE9BQU87WUFDTkMsV0FBV2xuQjtZQUNYb0MsTUFBTSxFQUFDcEUsWUFBWXVCLE9BQU91cEI7V0FFM0JoRDtBQUNMO1VBUWFvRCxrQkFBc0MsQ0FDakRwaEIsT0FDQXZJO1FBRUEsTUFBTTRwQixVQUNKNXBCLGlCQUFpQnVJLFVBQVUsYUFBYS9LLG9CQUFBQSxNQUFNMG5CLFFBQVEzYyxTQUFTeEo7UUFDakUsTUFBTXVtQixnQkFBZ0IvYyxVQUFVLGFBQWFBLFFBQVFBLE1BQU1wRztRQUMzRCxLQUFLeW5CLFNBQ0gsTUFBTSxJQUFJN29CLGFBQUFBLGNBQ1IsU0FBU3VrQixPQUFPbm9CO1FBRXBCLE9BQU8sR0FBRzBzQixRQUFBQSxhQUFhdkUsT0FBT25vQixRQUFReXNCLFVBQVVDLHFCQUFhRCxXQUFXOztJQUdwRSxTQUFVRSxvQkFBb0JDO1FBQ2xDLE9BQU8sQ0FBa0J4aEIsT0FBMkJ2STtZQUNsRCxNQUFNNHBCLFVBQ0o1cEIsaUJBQWlCdUksVUFBVSxhQUFhL0ssb0JBQUFBLE1BQU0wbkIsUUFBUTNjLFNBQVN4SjtZQUNqRSxNQUFNdW1CLGdCQUFnQi9jLFVBQVUsYUFBYUEsUUFBUUEsTUFBTXBHO1lBQzNELEtBQUt5bkIsU0FDSCxNQUFNLElBQUk3b0IsYUFBQUEsY0FDUixTQUFTdWtCLE9BQU9ub0I7WUFFcEIsT0FBTyxHQUFHNHNCLFlBQVlILFVBQVVDLFFBQUFBLGFBQWFELFdBQVc7O0FBRTVEO1VBRWFJLDRCQUFnRCxDQUMzRHpoQixPQUNBdkk7UUFFQSxNQUFNNHBCLFVBQ0o1cEIsaUJBQWlCdUksVUFBVSxhQUFhL0ssb0JBQUFBLE1BQU0wbkIsUUFBUTNjLFNBQVN4SjtRQUNqRSxLQUFLNnFCLFNBQ0gsTUFBTSxJQUFJN29CLGFBQUFBLGNBQ1IsU0FBU3dILE1BQU1wRyxZQUFZaEY7UUFFL0IsT0FBTyxLQUFLMHNCLFFBQUFBLGFBQWFEOztJQVlwQixNQUFNSyw0Q0FBNEM7YUFFekNDLHNCQUNkM25CLE9BQ0FrakIsYUFDQXpmO1FBSUEsSUFBSXlmLFlBQVl2bUIsU0FBUyxHQUFHO1lBQ3pCOEcsSUFBOEJtakIsU0FBUzFEO0FBQzFDO1FBTUEsS0FBS3pmLElBQUlta0IscUJBQXFCMUUsWUFBWXZtQixRQUFRO1lBQ2hELEtBQUtrckIsb0JBQW9CN25CLE1BQU1KLGNBQWdDO2dCQUM3RDZELElBQUlxa0I7QUFDTjtBQUNGO0FBQ0Y7SUFFTzVzQixlQUFlNnNCLGlCQUNwQi9uQixPQUNBd21CLEtBQ0EvaUI7UUFFQSxLQUFLK2lCLEtBQUs7UUFDVixNQUFNNW5CLGFBQWEzRCxvQkFBQUEsTUFBTTRELFdBQVdtQjtRQUNwQyxLQUFLcEIsWUFBWTtRQUNqQixNQUFNK25CLFVBQ0pILFFBQVE1bkIsV0FBV25CLFNBQ2xCbUIsV0FBVzZuQixhQUFhN25CLFdBQVc2bkIsVUFBVUQ7UUFDaEQsS0FBS0csU0FBUztRQUNkLE1BQU16cUIsbUJBQW1Cd3BCLG1CQUN2QixJQUFJMWxCLE9BQ0pwQixXQUFXSyxVQUNYd0U7UUFLRkEsSUFBSXFpQixJQUFJLGlCQUFpQnRwQjtRQUN6QmlILElBQUlxaUIsSUFBSSxzQkFBc0J0cEI7UUFDOUJpSCxJQUFJcWlCLElBQUksbUJBQW1CO1FBQzNCcmlCLElBQUlxaUIsSUFBSSxVQUFpQjtRQUN6QnJpQixJQUFJcWlCLElBQUksb0JBQTJCNXBCO1FBQ25DdUgsSUFBSW1qQixTQUFTMXFCO0FBQ2Y7SUFFQSxTQUFTMnJCLG9CQUFxQzduQjtRQUM1QyxNQUFNZ29CLGFBQWEzZSxXQUFBQSxTQUFTcVksY0FBYzFoQixVQUFVO1FBQ3BELE1BQU1zSSxLQUFLck4sb0JBQUFBLE1BQU1xTixHQUFHdEk7UUFDcEIsTUFBTWlvQixnQkFBZ0I1ZSxXQUFBQSxTQUFTekMsSUFBSTVHLE9BQWM0aEIsYUFBQUEsT0FBT0MsY0FBYyxDQUFBO1FBQ3RFLE1BQU1tQixjQUNKM1osb0JBQVN6QyxJQUFJNUcsT0FBY3FKLG9CQUFTeEgsSUFBSXdMLFFBQUFBLGdCQUFnQjBVLGFBQWEsQ0FBQTtRQUN2RSxNQUFNa0IsYUFDSjVaLG9CQUFTekMsSUFBSTVHLE9BQWNxSixvQkFBU3hILElBQUl3TCxRQUFBQSxnQkFBZ0I0VSxZQUFZLENBQUE7UUFFdEUsT0FBTytGLFdBQVc5b0IsS0FBTW1oQjtZQUN0QixJQUFJQSxTQUFTL1gsSUFBSSxPQUFPO1lBQ3hCLElBQUkrWCxRQUFRNEgsZUFBZSxPQUFPO1lBQ2xDLElBQUk1SCxRQUFRMkMsYUFBYSxPQUFPO1lBQ2hDLElBQUkzQyxRQUFRNEMsWUFBWSxPQUFPO1lBQy9CLE9BQU87O0FBRVg7SUFhTy9uQixlQUFlZ3RCLDZCQUVwQmhFLFNBQ0F2akIsTUFDQWlILE1BQ0E1QjtRQUVBLE1BQU1taUIsWUFDSjFuQixNQUFNQyxRQUFRQyxRQUFRQSxPQUFPLEVBQUNBO1FBR2hDLE1BQU02bEIsTUFDSnZyQixvQkFBQUEsTUFBTTBuQixRQUFRM2MsVUFDZG1kLGFBQ0VlLFFBQVF0ZCxJQUFJO1FBRWhCLEtBQUs0ZixLQUFLO1lBRVI7QUFDRjtRQUVBLE1BQU10RCxjQUF3QjtRQUM5QixLQUFLLE1BQU05WixZQUFZK2UsV0FBVztZQUNoQyxNQUFNQyxxQkFBcUJoZixTQUFTOFo7WUFDcEMsTUFBTWhuQixvQkFDR2tzQix1QkFBdUIsV0FDMUJBLHFCQUNBQSxtQkFBbUJwaUIsT0FBT3dnQixLQUFLdEM7WUFDckMsSUFBSWhvQixlQUFlZ25CLFlBQVkvakIsU0FBU2pELGFBQWE7Z0JBQ25EZ25CLFlBQVlwbkIsS0FBS0k7QUFDbkI7QUFDRjtRQUNBeXJCLHNCQUFzQjNoQixPQUFPa2QsYUFBYWdCO1FBSTFDLE1BQU1tRSxVQUFVcHRCLG9CQUFBQSxNQUFNcXRCLGFBQWF0aUIsT0FBTztRQUN6Q2tlLFFBQWdCcUUsdUJBQ2ZGLFNBQ0NuRSxRQUFnQjBELG1CQUNqQjFFO0FBRUo7SUFFT2hvQixlQUFlc3RCLHVCQUVwQnRFLFNBQ0F2akIsTUFDQWlILE1BQ0E1QjtRQUVBLE1BQU1taUIsWUFDSjFuQixNQUFNQyxRQUFRQyxRQUFRQSxPQUFPLEVBQUNBO1FBRWhDLE1BQU04bkIsV0FBWWhvQixNQUFNQyxRQUFRa0gsUUFBUUEsT0FBTyxFQUFDQTtRQUNoRCxJQUFJNmdCLFNBQVM5ckIsV0FBV3dyQixVQUFVeHJCLFFBQ2hDLE1BQU0sSUFBSTZCLGFBQUFBLGNBQ1I7UUFHSixNQUFNZ29CLE1BQ0p2ckIsb0JBQUFBLE1BQU0wbkIsUUFBUTNjLFVBQ2RtZCxhQUNFZSxRQUFRdGQsSUFBSTtRQUVoQixLQUFLNGYsS0FDSCxNQUFNLElBQUlwZixhQUFBQSxnQkFDUiw4Q0FBOENwQixNQUFNcEcsWUFBWWhGO1FBR3BFLE1BQU13dEIscUJBQXFCRCxVQUFVLEdBQUdqRjtRQUN4QyxNQUFNaG5CLG9CQUNHa3NCLHVCQUF1QixXQUMxQkEscUJBQ0FBLG1CQUFtQnBpQixPQUFPd2dCLEtBQUt0QztRQUdyQ3VFLFNBQVN2dUIsUUFBUSxDQUFDd3VCLElBQUloaEI7WUFDcEIsTUFBTWhLLFdBQ0d5cUIsVUFBVXpnQixHQUFHd2IsZ0JBQWdCLFdBQ2hDaUYsVUFBVXpnQixHQUFHd2IsY0FDYmlGLFVBQVV6Z0IsR0FBR3diLFlBQVlsZCxPQUFPd2dCLEtBQUt0QztZQUMzQyxJQUFJeG1CLE1BQU14QixZQUNSLE1BQU0sSUFBSWtFLEtBQUFBLGlCQUNSLHdDQUF3QzFDLFFBQVF4Qjs7UUFJdEQsTUFBTXlzQixhQUFhRixTQUFTMXFCLElBQUs4RCxPQUFRMkcsT0FBTzNHO1FBRS9DcWlCLFFBQWtDMEUsUUFBUTFzQixZQUFZeXNCO0FBQ3pEO0lBRU96dEIsZUFBZTJ0QixxQkFFcEIzRSxTQUNBdmpCLE1BQ0FpSCxNQUNBNUI7UUFFQSxNQUFNbWlCLFlBQ0oxbkIsTUFBTUMsUUFBUUMsUUFBUUEsT0FBTyxFQUFDQTtRQUVoQyxNQUFNOG5CLFdBQVlob0IsTUFBTUMsUUFBUWtILFFBQVFBLE9BQU8sRUFBQ0E7UUFDaEQsSUFBSTZnQixTQUFTOXJCLFdBQVd3ckIsVUFBVXhyQixRQUNoQyxNQUFNLElBQUk2QixhQUFBQSxjQUNSO1FBR0osTUFBTWdvQixNQUFNdnJCLDBCQUFNMG5CLFFBQVEzYyxVQUFVbWQsYUFBYWUsUUFBUXRkLElBQUk7UUFDN0QsS0FBSzRmLEtBQ0gsTUFBTSxJQUFJcGYsYUFBQUEsZ0JBQ1IsOENBQThDcEIsTUFBTXBHLFlBQVloRjtRQUdwRSxNQUFNd3RCLHFCQUFxQkQsVUFBVSxHQUFHakY7UUFDeEMsTUFBTWhuQixvQkFDR2tzQix1QkFBdUIsV0FDMUJBLDJCQUNNQSxtQkFBbUJwaUIsT0FBT3dnQixLQUFLdEM7UUFFMUNBLFFBQWtDMEMsU0FBUzFxQjtBQUM5QztJQUVPaEIsZUFBZTR0Qix1QkFFcEI1RSxTQUNBdmpCLE1BQ0FrQixLQUNBbUUsT0FFQStpQjtRQUVBLE1BQU1aLFlBQ0oxbkIsTUFBTUMsUUFBUUMsUUFBUUEsT0FBTyxFQUFDQTtRQUVoQyxNQUFNOG5CLFdBQVlob0IsTUFBTUMsUUFBUW1CLE9BQU9BLE1BQU0sRUFBQ0E7UUFDOUMsSUFBSTRtQixTQUFTOXJCLFdBQVd3ckIsVUFBVXhyQixRQUNoQyxNQUFNLElBQUk2QixhQUFBQSxjQUNSO1FBR0osTUFBTWdvQixNQUNKdnJCLG9CQUFBQSxNQUFNMG5CLFFBQVEzYyxVQUNkbWQsYUFDRWUsUUFBUXRkLElBQUk7UUFFaEIsS0FBSzRmLEtBQ0gsTUFBTSxJQUFJcGYsYUFBQUEsZ0JBQ1IsOENBQThDcEIsTUFBTXBHLFlBQVloRjtRQUdwRSxNQUFNd3RCLHFCQUFxQkQsVUFBVSxHQUFHakY7UUFDeEMsTUFBTWhuQixvQkFDR2tzQix1QkFBdUIsV0FDMUJBLHFCQUNBQSxtQkFBbUJwaUIsT0FBT3dnQixLQUFLdEM7UUFFckN1RSxTQUFTdnVCLFFBQVEsQ0FBQ3VZLEdBQUcvSztZQUNuQixNQUFNaEssV0FDR3lxQixVQUFVemdCLEdBQUd3YixnQkFBZ0IsV0FDaENpRixVQUFVemdCLEdBQUd3YixjQUNiaUYsVUFBVXpnQixHQUFHd2IsWUFBWWxkLE9BQU93Z0IsS0FBS3RDO1lBQzNDLElBQUl4bUIsTUFBTXhCLFlBQ1IsTUFBTSxJQUFJa0UsS0FBQUEsaUJBQ1Isd0NBQXdDMUMsUUFBUXhCOztRQUl0RCxNQUFNeXNCLGFBQWNGLFNBQXlCMXFCLElBQUs4RCxPQUFRMkcsT0FBTzNHO1FBRWhFcWlCLFFBQWtDMEUsUUFBUTFzQixZQUFZeXNCO0FBQ3pEO0lBRU96dEIsZUFBZTh0Qix1QkFNcEI5RSxTQUNBdmpCLE1BQ0FrQixLQUNBbUU7UUFFQSxNQUFNbWlCLFlBQWExbkIsTUFBTUMsUUFBUUMsUUFBUUEsT0FBTyxFQUFDQTtRQUNqRCxNQUFNOG5CLFdBQVlob0IsTUFBTUMsUUFBUW1CLE9BQU9BLE1BQU0sRUFBQ0E7UUFDOUMsSUFBSTRtQixTQUFTOXJCLFdBQVd3ckIsVUFBVXhyQixRQUNoQyxNQUFNLElBQUk2QixhQUFBQSxjQUNSO1FBR0osTUFBTWdvQixNQUNKdnJCLG9CQUFBQSxNQUFNMG5CLFFBQVEzYyxVQUNkbWQsYUFDRWUsUUFBUXRkLElBQUk7UUFFaEIsS0FBSzRmLEtBQ0gsTUFBTSxJQUFJcGYsYUFBQUEsZ0JBQ1IsOENBQThDcEIsTUFBTXBHLFlBQVloRjtRQUdwRSxNQUFNd3RCLHFCQUFxQkQsVUFBVSxHQUFHakY7UUFDeEMsTUFBTWhuQixvQkFDR2tzQix1QkFBdUIsV0FDMUJBLHFCQUNBQSxtQkFBbUJwaUIsT0FBT3dnQixLQUFLdEM7UUFFcENBLFFBQWtDMEMsU0FBUzFxQjtBQUM5QztJQUVBLFNBQVNvcUIsV0FDUHBxQixZQUNBcU0sTUFDQXhOO1FBRUEsT0FBTyxTQUFTa3VCLGdCQUFnQjNGLFFBQWdCQztZQUM5QyxTQUFTMkYsY0FBYzVGLFFBQWdCQztnQkFDckMsTUFBTTFoQixNQUFNd0gsV0FBQUEsU0FBU3hILElBQUkwRyxNQUFNZ2I7Z0JBQy9CLE1BQU1SLFNBQXNCTyxPQUFPMWpCO2dCQUVuQyxNQUFNZ2pCLE9BQU92WixXQUFBQSxTQUFTekMsSUFBSW1jLFFBQXVCbGhCLFFBQVEsQ0FBQTtnQkFDekQsTUFBTXFoQixjQUFjLElBQUlpRyxJQUFJdkcsS0FBS00sZUFBZTtnQkFDaERBLFlBQVlrRyxJQUFJbHRCO2dCQUNoQjBtQixLQUFLTSxjQUFjLEtBQUlBO2dCQUN2QjdaLFdBQUFBLFNBQVNxTCxJQUFJcU8sUUFBdUJsaEIsS0FBSytnQjtnQkFFekMsTUFBTXlHLGFBQWFoZ0IsV0FBQUEsU0FBU3pDLElBQUltYyxRQUF1QnhhLFNBQVMsQ0FBQTtnQkFDaEUsTUFBTStnQixvQkFBb0IsSUFBSUgsSUFBSUUsV0FBV25HLGVBQWU7Z0JBQzVEb0csa0JBQWtCRixJQUFJbHRCO2dCQUN0Qm10QixXQUFXbkcsY0FBYyxLQUFJb0c7Z0JBQzdCamdCLFdBQUFBLFNBQVNxTCxJQUFJcU8sUUFBdUJ4YSxNQUFNOGdCO2dCQUUxQyxNQUFNcEIsZ0JBQ0o1ZSxXQUFBQSxTQUFTekMsSUFBSW1jLFFBQXVCbkIsYUFBQUEsT0FBT0MsY0FBYyxDQUFBO2dCQUMzRCxNQUFNMEgsdUJBQXVCO3VCQUN4QnRCO29CQUNIMUUsQ0FBQ0EsY0FBcUIsQ0FBQTs7Z0JBRXhCbGEsV0FBQUEsU0FBU3FMLElBQ1BxTyxRQUNBbkIsYUFBQUEsT0FBT0MsV0FDUDBIO0FBRUo7WUFFQSxNQUFNQyxPQUFjO1lBQ3BCLEtBQUtqRyxhQUFhO2dCQUVoQixNQUFNa0csYUFBYXBnQixXQUFBQSxTQUFTcVksY0FBYzRCO2dCQUMxQ21HLFlBQVl2dkIsUUFBUytCO29CQUNuQixLQUFLbEIsVUFBVUEsT0FBT2tCLElBQUk7d0JBQ3hCcXFCLFdBQVdwcUIsWUFBWXFNLEtBQXZCK2QsQ0FBOEJoRCxPQUFlN2EsV0FBV3hNO0FBQzFEOztnQkFFRixPQUFPcW5CO0FBQ1QsbUJBQU87Z0JBQ0wsTUFBTW9HLG1CQUNHeHRCLGVBQWUsV0FBV0EsYUFBYUEsV0FBV3VQO2dCQUUzRCxNQUFNa2UsbUJBQW1CLEdBQUdEO2dCQUM1QixNQUFNRSxnQkFBZ0IsR0FBR0Y7Z0JBQ3pCLE1BQU1HLHNCQUFzQjtvQkFBRTNHLGFBQWFobkI7O2dCQUMzQyxNQUFNNHRCLDJCQUEyQjtvQkFDL0I1QyxVQUFVUTtvQkFDVnFDLE9BQU9KOztnQkFFVEgsS0FBSzF0QixLQUNIa3VCLFdBQUFBLFFBQ0ExakIsYUFBQUEsYUFDQTRpQixlQUlBZSxhQUFBQSxHQUNFQyxhQUFBQSxhQUFhQyxLQUNiakMsOEJBQ0EyQixxQkFDQUMsMkJBR0Y5RSxhQUFBQSxTQUNFd0Qsd0JBQ0E7b0JBQUV0RixhQUFhaG5CO21CQUNmO29CQUNFZ3JCLFVBQVU7b0JBQ1Y2QyxPQUFPSDtvQkFHWDNDLGFBQUFBLE9BQ0U0QixzQkFDQTtvQkFBRTNGLGFBQWFobkI7bUJBQ2Y7b0JBQ0VnckIsVUFBVTtvQkFDVjZDLE9BQU9IO29CQUdYcEUsYUFBQUEsU0FDRXNELHdCQUNBO29CQUFFNUYsYUFBYWhuQjttQkFDZjtvQkFDRWdyQixVQUFVO29CQUNWNkMsT0FBT0g7b0JBR1h6QyxhQUFBQSxTQUNFNkIsd0JBQ0E7b0JBQUU5RixhQUFhaG5CO21CQUNmO29CQUNFZ3JCLFVBQVU7b0JBQ1Y2QyxPQUFPSDs7QUFJZjtZQUNBLE9BQU81RixXQUFBQSxTQUFTd0YsS0FBVHhGLENBQWVWLFFBQVFDO0FBQ2hDO0FBQ0Y7SUFFTSxTQUFVNkcsWUFDZGx1QixhQUEwQ3VyQjtRQUUxQyxTQUFTMkMsWUFBWWx1QjtZQUNuQixPQUFPb3FCLFdBQVdwcUIsWUFBWW1SLFFBQUFBLGdCQUFnQjBVO0FBQ2hEO1FBRUEsT0FBT21ELFdBQUFBLFdBQVd4akIsSUFBSTJMLFFBQUFBLGdCQUFnQjBVLFNBQ25Db0QsT0FBTztZQUNOQyxXQUFXZ0Y7WUFDWDlwQixNQUFNLEVBQUNwRTtXQUVSOG5CO0FBQ0w7SUFFTSxTQUFVcUcsV0FBV251QjtRQUN6QixTQUFTbXVCLFdBQVdudUI7WUFDbEIsT0FBT29xQixXQUFXcHFCLFlBQVltUixRQUFBQSxnQkFBZ0I0VTtBQUNoRDtRQUVBLE9BQU9pRCxXQUFBQSxXQUFXeGpCLElBQUkyTCxRQUFBQSxnQkFBZ0I0VSxRQUNuQ2tELE9BQU87WUFDTkMsV0FBV2lGO1lBQ1gvcEIsTUFBTSxFQUFDcEU7V0FFUjhuQjtBQUNMO0lDcDZCTSxTQUFVc0csc0JBQXNCOXBCO1FBQ3BDLElBQUlBLFFBQVEsZUFBZUEsUUFBUSxVQUFVLE9BQU9BO1FBQ3BELElBQUlDLE1BQU1DLFFBQVFGLE1BQU0sT0FBT0EsSUFBSXpDLElBQUl1c0I7UUFDdkMsSUFBSTlwQixJQUFJWixnQkFBZ0I5RSxRQUFRLE9BQU8wRjtRQUN2QyxPQUFPMUYsT0FBTzhNLEtBQUtwSCxLQUNoQitwQixPQUNBQyxPQUFPLENBQUNDLEtBQTBCNW9CO1lBQ2pDNG9CLElBQUk1b0IsT0FBT3lvQixzQkFBc0I5cEIsSUFBSXFCO1lBQ3JDLE9BQU80b0I7V0FDTixDQUFBO0FBQ1A7SUF3Qk0sTUFBT0MsZ0NBRUgxaEIsb0JBQUFBO1FBQ1IsV0FBQXBKO1lBQ0VLO0FBQ0Y7UUFDbUIsWUFBQWdKLENBQWFqRDtZQUc5QixNQUFNbUQsY0FBbUNyTyxPQUFPNEQsT0FBTyxDQUFBLEdBQUlzSDtZQUMzRCxJQUFJb0Q7WUFDSjtnQkFDRUEsV0FBV0MsV0FBQUEsU0FBU0gsVUFBVWxELE1BQU1wRztBQUV0QyxjQUFFLE9BQU8rcUI7Z0JBQ1B2aEIsV0FBVzVNO0FBQ2I7WUFDQTJNLFlBQVlJLG9CQUFBQSxVQUFVQyxVQUFVSixZQUFZcEQsTUFBTXBHLFlBQVloRjtZQUU5RCxNQUFNcU8sZUFBZSxTQUFTQSxhQUU1QnpJO2dCQUdBLE1BQU1vcUIsT0FBTzdwQjtnQkFDYixXQUFXUCxRQUFRLFVBQVUsT0FBT0E7Z0JBQ3BDLElBQUlDLE1BQU1DLFFBQVFGLE1BQU0sT0FBT0EsSUFBSXpDLElBQUs4c0IsS0FBTTVoQixhQUFhNmhCLEtBQUtGLE1BQU1DO2dCQUN0RSxPQUFPOXBCLEtBQUtrSSxhQUFhNmhCLEtBQUsvcEIsTUFBTVA7QUFDdEMsY0FBRStoQixLQUFLeGhCO1lBRVA5RixvQkFBQUEsTUFBTTh2QixVQUFVL2tCLE9BQU85TCxRQUFTZ0s7Z0JBQzlCaUYsWUFBWWpGLEtBQUsrRSxhQUFhRSxZQUFZakY7O1lBRTVDLE9BQU9pRjtBQUNUO1FBUVMsV0FBQU0sQ0FBWUM7WUFDbkIsTUFBTUMsa0JBQWtCck4sS0FBS3dILE1BQU00RjtZQUNuQyxNQUFNRSxZQUFZRCxnQkFBZ0JKLG9CQUFBQSxVQUFVQztZQUM1QyxLQUFLSSxXQUNILE1BQU0sSUFBSUMsTUFBTTtZQUNsQixNQUFNN0QsUUFBVy9LLG9CQUFBQSxNQUFNNk8sTUFBTUgsaUJBQWlCQztZQUM5QyxPQUFPNUQ7QUFDVDtRQVFTLFNBQUErRCxDQUFVL0Q7WUFDakIsTUFBTXpKLFlBQVlsRCxRQUFRO1lBQzFCLE9BQU9rRCxVQUFVK3RCLHNCQUFzQnZwQixLQUFLa0ksYUFBYWpEO0FBQzNEOzthQy9GY2dsQix3QkFDZHBpQixPQUNBeUIsT0FDQWM7UUFFQSxNQUFNMk4sU0FBUyxFQUFDbFEsT0FBT3lCO1FBQ3ZCLElBQUljLE9BQU8yTixPQUFPaGQsS0FBS3FQO1FBQ3ZCLE9BQU8yTixPQUFPdGUsS0FBSztBQUNyQjtJQXNCTSxTQUFVeXdCLGVBQWVyd0I7UUFLN0IsTUFBTXN3QixRQUFRdHdCLEtBQUt1d0IsTUFBTTtRQUN6QixJQUFJRCxNQUFNdnVCLFNBQVMsS0FBS3V1QixNQUFNdnVCLFNBQVMsR0FDckMsT0FBTztZQUFFaU0sT0FBT3BNO1lBQVc2TixPQUFPelA7WUFBTXVRLE9BQU8zTzs7UUFDakQsT0FBTztZQUNMb00sT0FBT3NpQixNQUFNO1lBQ2I3Z0IsT0FBTzZnQixNQUFNO1lBQ2IvZixPQUFPK2YsTUFBTTs7QUFNakI7SUM3Q00sU0FBVTlCLElBQUlyTCxHQUFXckc7UUFDN0IsTUFBTWhhLElBQUlxZ0IsSUFBSXJHO1FBQ2QsSUFBSXFHLE1BQU1yZ0IsSUFBSWdhLEtBQUtBLE1BQU1oYSxJQUFJcWdCLEdBQUc7WUFDOUIsTUFBTSxJQUFJN0QsY0FBYyxzQkFBc0I2RCxPQUFPckc7QUFDdkQ7UUFDQSxPQUFPaGE7QUFDVDtJQVlNLFNBQVUwdEIsSUFBSXJOLEdBQVdyRztRQUM3QixNQUFNaGEsSUFBSXFnQixJQUFJckc7UUFDZCxJQUFJcUcsTUFBTXJnQixJQUFJZ2EsS0FBS0EsTUFBTXFHLElBQUlyZ0IsR0FBRztZQUM5QixNQUFNLElBQUl3YyxjQUFjLHlCQUF5QjZELE9BQU9yRztBQUMxRDtRQUNBLE9BQU9oYTtBQUNUO0lBYU0sU0FBVTJ0QixhQUFhQztRQUUzQixNQUFNQyxhQUFhO1FBQ25CLEtBQUtBLFdBQVdDLEtBQUtGLFNBQVM7WUFDNUIsTUFBTSxJQUFJbGtCLGFBQUFBLGdCQUNSMkgsb0JBQUFBLGFBQWEsd0JBQXdCO0FBRXpDO1FBQ0EsTUFBTTBjLFlBQVlDLFNBQVNKO1FBQzNCLElBQUlLLE1BQU1GLFlBQVk7WUFDcEIsTUFBTSxJQUFJcmtCLGFBQUFBLGdCQUNSMkgsb0JBQUFBLGFBQWEsd0JBQXdCO0FBRXpDO1FBQ0EsT0FBTzBjO0FBQ1Q7SUMxRE0sTUFBT0csc0NBRUg1aUIsb0JBQUFBO1FBQ1IsV0FBQXBKO1lBQ0VLO0FBQ0Y7UUFHUyxXQUFBd0osQ0FBWUMsS0FBYWxIO1lBQ2hDLE1BQU1tSCxrQkFBa0JyTixLQUFLd0gsTUFBTTRGO1lBd0JuQyxPQUFPQztBQUNUO1FBRVMsU0FBQUksQ0FBVS9ELE9BQVU2bEIsWUFBWTtZQUV2QyxNQUFNdHZCLFlBQVlsRCxRQUFRO1lBQzFCLE1BQU15eUIsbUJBQW1CL3FCLEtBQUtrSSxhQUFhakQsT0FBTzZsQjtZQUNsRCxPQUFPdHZCLFVBQVUrdEIsc0JBQXNCd0I7QUFDekM7UUFFbUIsWUFBQTdpQixDQUFhakQsT0FBVTZsQixZQUFxQjtZQUc3RCxNQUFNMWlCLGNBQW1Dck8sT0FBTzRELE9BQU8sQ0FBQSxHQUFJc0g7WUFDM0QsSUFBSW9EO1lBQ0o7Z0JBQ0VBLFdBQVdDLFdBQUFBLFNBQVNILFVBQVVsRCxNQUFNcEc7QUFFdEMsY0FBRSxPQUFPK3FCO2dCQUNQdmhCLFdBQVc1TTtBQUNiO1lBQ0EsSUFBSXF2QixXQUNGMWlCLFlBQVlJLG9CQUFBQSxVQUFVQyxVQUFVSixZQUFZcEQsTUFBTXBHLFlBQVloRjtZQUVoRSxTQUFTcU8sYUFFUHpJO2dCQUVBLFdBQVdBLFFBQVEsVUFBVSxPQUFPQTtnQkFDcEMsSUFBSUMsTUFBTUMsUUFBUUYsTUFBTSxPQUFPQSxJQUFJekMsSUFBSWtMO2dCQUN2QyxPQUFPbEksS0FBS2tJLGFBQWF6STtBQUMzQjtZQUNBdkYsb0JBQUFBLE1BQU04dkIsVUFBVS9rQixPQUFPOUwsUUFBU2dLO2dCQUM5QmlGLFlBQVlqRixLQUFLK0UsYUFBYTZoQixLQUFLL3BCLE1BQU1vSSxZQUFZakY7O1lBRXZELE9BQU9pRjtBQUNUOztJQ3RDSSxNQUFPNGlCLDhCQUE4QkMsS0FBQUE7UUFNekMsV0FBQXBzQjtZQUNFSztBQUNGO1FBRUEsY0FBY2dzQjtZQUNaLE9BQVFsckIsS0FBS3ViLE9BQWU7QUFDOUI7UUFFQSxRQUFjdE47WUFDWixLQUFLak8sS0FBS21yQixPQUNSLE1BQU0sSUFBSTF0QixhQUFBQSxjQUNSO1lBRUosT0FBT3VDLEtBQUttckI7QUFDZDtRQUVBLGdCQUFjQztZQUNaLE9BQU9wckIsS0FBS2tyQixXQUFXeFA7QUFDekI7UUFFQSxnQkFBYzJQO1lBQ1osT0FBT3JyQixLQUFLdWIsT0FBT007QUFDckI7UUFFQSxjQUFjYTtZQUNaLE9BQU8xYyxLQUFLdWIsT0FBT1M7QUFDckI7UUFFVSxhQUFNc1AsQ0FBUUMsS0FBZTdvQjtZQUNyQyxNQUFNdkIsTUFBTXVCLElBQUlzSyxPQUFPck0sSUFBSVgsS0FBS3NyQjtZQUNoQyxPQUFNMVEsUUFBRUEsUUFBTUMsUUFBRUEsUUFBTUMsT0FBRUEsT0FBS0MsS0FBRUEsS0FBRzNNLEtBQUVBLE9BQVFtZDtZQUU1Q3BxQixJQUFJOGMsS0FBSyx3QkFBd0JyRCxhQUFhRztZQUM5QzVaLElBQUlLLFFBQVEsa0NBQWtDcVo7WUFDOUMsTUFBTS9NLG9CQUFvQmYsVUFBVWtFLDJCQUEyQjRKO1lBQy9ELElBQUkvWjtZQUNKLEtBQUtzTixLQUFLO2dCQUNSLEtBQUswTSxPQUFPO29CQUNWLE1BQU0sSUFBSXJkLGFBQUFBLGNBQ1Isc0NBQXNDbWQ7QUFFMUM7Z0JBQ0F6WixJQUFJK0QsTUFBTSwwQkFBMEI0VjtnQkFDcENoYSxZQUFZaU0sVUFBVWtFLDJCQUEyQjZKO0FBQ25ELG1CQUFPO2dCQUNMM1osSUFBSStELE1BQ0Ysa0NBQWtDMFYsdUJBQXVCeE0sSUFBSUc7QUFFakU7WUFDQXBOLElBQUkrRCxNQUFNLDZCQUE2QjBWO1lBQ3ZDNWEsS0FBS21yQixjQUFjcGUsVUFBVVksVUFBVSxTQUFTN00sS0FBS2dOLGFBQWE4TSxRQUFRO2dCQUN4RXhNOztZQUVGLE9BQU9wTyxLQUFLbXJCO0FBQ2Q7UUFFUyxnQkFBTWhnQixJQUNWNUw7WUFFSCxPQUFNNEIsS0FBRUEsS0FBR3VCLEtBQUVBLGNBQ0wxQyxLQUFLcUIsT0FBTzlCLE1BQU1vRCxLQUFBQSxnQkFBZ0I2b0IsZ0JBQWdCLE9BQ3hEN3FCLElBQUlYLEtBQUttTDtZQUNYLE9BQU9nRCxVQUFVNU87WUFDakIsS0FBSzRPLFFBQVEsTUFBTSxJQUFJMVEsYUFBQUEsY0FBYztZQUVyQyxPQUFNc2QsS0FBRUEsS0FBR0csS0FBRUEsS0FBR04sUUFBRUEsVUFBV3pNO1lBQzdCaE4sSUFBSThjLEtBQUssaUNBQWlDOVAsT0FBT3lNLGFBQWF6TSxPQUFPNE07WUFDckUsT0FBTUksY0FBRUEsY0FBWXRFLFFBQUVBLFVBQVdxRTtZQUVqQyxNQUFNRSxPQUFRRCxhQUEwQjtZQUN4Q2hhLElBQUkrRCxNQUFNLGtDQUFrQ2tXLGNBQWMxaEIsUUFBUUM7WUFFbEUsTUFBTW1VLG9CQUFvQmYsVUFBVW1FLGVBQWVrSztZQUVuRGphLElBQUkrRCxNQUFNLG1CQUFtQjRJLFlBQVlwRDtZQUV6QyxNQUFNNlEsU0FBUyxJQUFJRixpQkFDakJOLEtBQ0E7Z0JBQ0VJLGNBQWMzTCxPQUFPNUUsS0FBS2tEO2dCQUMxQitJO2VBRUYrRDtZQUdGLE1BQU0zTSxhQUFhak8sS0FBS3NyQixRQUFRbmQsUUFBUXpMO1lBQ3hDdkIsSUFBSStELE1BQU0sbUJBQW1CK0ksS0FBS3dkO1lBQ2xDLE9BQU87Z0JBQ0x0ZDtnQkFDQW9OOztBQUVKO1FBZ0JBLHFCQUFNVSxDQUNKQyxTQUNBQyxRQUFhLFNBQ1Y1YztZQUVILElBQUkyYyxtQkFBbUJwUixLQUFBQSxTQUFTO2dCQUM5QnZMLE9BQU8sRUFBQzJjO2dCQUNSQyxRQUFRO2dCQUNSRCxVQUFVemdCO0FBQ1osbUJBQU8sV0FBV3lnQixZQUFZLFdBQVc7Z0JBQ3ZDQyxRQUFRRDtnQkFDUkEsVUFBVXpnQjtBQUNaLG1CQUFPLFdBQVcwZ0IsVUFBVSxXQUFXO2dCQUNyQzVjLE9BQU8sRUFBQzRjLFVBQXFDNWM7Z0JBQzdDNGMsUUFBUTtBQUNWO1lBRUEsT0FBTWhiLEtBQUVBLGNBQWVuQixLQUFLcUIsT0FBTzlCLE1BQU1tRSxhQUFBQSxjQUFjQyxNQUFNLE9BQU9oRCxJQUNsRVgsS0FBS2ljO1lBRVA5YSxJQUFJK0QsTUFDRiwwQkFBMEJnWCxVQUFVLFFBQVFBLFFBQVE1VyxPQUFPLGFBQWF0RixLQUFLbU8sT0FBT3lNO1lBRXRGLE1BQU13QixrQkFDRXBjLEtBQUtvckIsYUFBYW5QLGdCQUFnQkMsV0FBVyxJQUFJbGMsS0FBS2lPLE9BQzVEM1Q7WUFDRjZHLElBQUlLLFFBQVEsU0FBUzRhLFNBQVNDLE1BQU16Z0I7WUFDcEN1RixJQUFJK0QsTUFBTWtYLFNBQVNDO1lBQ25CLE9BQ0VGLFFBQVFDLFNBQVNDLE1BQU1yZixJQUFLTCxLQUFNQSxFQUFFMmYsT0FBT0Y7QUFFL0M7UUFFQSxtQkFBTUcsQ0FBYzdaO1lBQ2xCLE1BQU12QixNQUFNdUIsSUFBSXNLLE9BQU9yTSxJQUFJWCxLQUFLdWM7WUFDaENwYixJQUFJSyxRQUFRLGtDQUFrQ3hCLEtBQUttTyxPQUFPeU07WUFDMUQsTUFBTXdCLGtCQUFvQ3BjLEtBQUswYyxXQUFXRCxPQUFPemMsS0FBS2lPLE9BQ25FM1Q7WUFDSDZHLElBQUlLLFFBQVEsU0FBUzRhLFNBQVNNLFdBQVc5Z0I7WUFDekN1RixJQUFJK0QsTUFBTWtYLFNBQVNNO1lBQ25CLE9BQU9OLFNBQVNNO0FBQ2xCO1FBT0EscUJBQU1LLENBQWdCcmE7WUFDcEIsTUFBTXZCLE1BQU11QixJQUFJc0ssT0FBT3JNLElBQUlYLEtBQUsrYztZQUNoQzViLElBQUlLLFFBQVEsb0NBQW9DeEIsS0FBS21PLE9BQU95TTtZQUM1RCxNQUFNd0Isa0JBQWtCcGMsS0FBS3FyQixhQUFhNU8sT0FBT3pjLEtBQUtpTyxPQUFPM1Q7WUFDN0Q2RyxJQUFJSyxRQUFRLFNBQVM0YSxTQUFTWSxFQUFFcGhCO1lBQ2hDdUYsSUFBSStELE1BQU0zSixLQUFLQyxVQUFVNGdCO1lBQ3pCLE9BQU9BO0FBQ1Q7UUFFVSxVQUFBTyxDQUFXMWlCO1lBQ25CLE1BQU0yaUIsU0FBUztZQUNmLE1BQU10UCxRQUFRc1AsT0FBT0MsS0FBSzVpQixFQUFFOGY7WUFDNUIsS0FBS3pNLE9BQU8sT0FBTyxJQUFJaU0sa0JBQWtCdGY7WUFDekMsT0FBTSxFQUFHbWdCLE1BQU1MLFdBQVd6TTtZQUMxQixRQUFROE07Y0FDTixLQUFLO2NBQ0wsS0FBSztnQkFDSCxPQUFPLElBQUkwQyxhQUFBQSxjQUFjL0M7O2NBQzNCLEtBQUs7Z0JBQ0gsT0FBTyxJQUFJUCxLQUFBQSxtQkFBbUJPOztjQUNoQztnQkFDRSxPQUFPLElBQUlSLGtCQUFrQlE7O0FBRW5DO1FBUUEsVUFBTWtELENBQ0pDLGlCQUNHM2Q7WUFFSCxPQUFNNEIsS0FBRUEsY0FBZW5CLEtBQUtxQixPQUFPOUIsTUFBTW1FLGFBQUFBLGNBQWNDLE1BQU0sT0FBT2hELElBQ2xFWCxLQUFLaWQ7WUFFUDliLElBQUlLLFFBQVEsMENBQTBDMGI7WUFDdEQsSUFBSTVpQjtZQUNKO2dCQUNFQSxlQUFlMEYsS0FBSzBjLFdBQVdTLE9BQU9ELGNBQWNsZCxLQUFLaU87QUFDM0QsY0FBRSxPQUFPaFU7Z0JBQ1AsTUFBTSxJQUFJbWpCLGFBQUFBLGNBQ1Isb0NBQW9DRixpQkFBaUJqakI7QUFFekQ7WUFFQSxLQUFLSyxPQUFPK2lCLFNBQ1YsTUFBTSxJQUFJRCxhQUFBQSxjQUNSLG9DQUFvQ0YsaUJBQWlCNWlCLE9BQU8yTCxPQUFPeE0sS0FBSztZQUc1RSxPQUFPYSxPQUFPQTtBQUNoQjtRQWFBLGNBQU1nakIsQ0FDSnJZLE9BQ0FzWSxjQUF1QixPQUN2QkMsY0FBc0IsSUFDdEJDLFVBQ0FDLE9BQ0FDLG1CQUNHcGU7WUFFSCxPQUFNNEIsS0FBRUEsY0FBZW5CLEtBQUtxQixPQUFPOUIsTUFBTSxZQUFZLE9BQU9vQixJQUMxRFgsS0FBS3NkO1lBR1AsSUFBSU07WUFDSjtnQkFDRSxPQUFNaFEsVUFBRUEsVUFBUWlRLFVBQUVBLFlBQWE1WTtnQkFDL0IsTUFBTTZZLFFBQVE7b0JBQ1pDLGNBQWNuUTtvQkFDZG9RLGtCQUFrQkg7b0JBQ2xCTCxhQUFhQTtvQkFDYkMsVUFBVUE7b0JBQ1ZDLE9BQU9BO29CQUNQQyxnQkFBZ0JBOztnQkFFbEJDLHFCQUFxQjVkLEtBQUt1YixPQUFPK0IsU0FBU1EsT0FBTzlkLEtBQUtpTztnQkFDdEQ5TSxJQUFJOGMsS0FDRixvQkFBb0JyUSxtQ0FBbUM2UCxZQUFZLG9CQUFvQkYsY0FBYyxrQkFBa0I7QUFFM0gsY0FBRSxPQUFPdGpCO2dCQUNQLE1BQU0rRixLQUFLMmMsV0FBVzFpQjtBQUN4QjtZQUNBLE9BQU8yakI7QUFDVDtRQUVVLDZCQUFPTSxDQUNmQyxZQUNBemhCLE9BQ0FnRztZQUVBLE1BQU12QixNQUFNdUIsSUFBSXNLLE9BQU9yTSxJQUFJWCxLQUFLa2U7WUFDaEMsT0FBTXBRLGFBQUVBLGFBQVdoTixLQUFFQSxLQUFHc2QsaUJBQUVBLG1CQUFvQkQ7WUFDOUNoZCxJQUFJSyxRQUNGLHdDQUF3Q3NNLHNCQUFzQnBSO1lBRWhFLE1BQU00aEIsV0FBV3pJLFlBQVlHLHdCQUF3QmxJO1lBQ3JELE1BQU14SSxLQUFLdVEsWUFBWXBCLE9BQU82SjtZQUM5Qm5kLElBQUkrRCxNQUFNLFlBQVlvWiwwQkFBMEJoWjtZQUNoRCxPQUFPLElBQUltSCxRQUFBQSxTQUFTO2dCQUNsQm5ILElBQUlBO2dCQUNKd0wsYUFBYTtvQkFDWHhMLElBQUlBO29CQUNKd0ksYUFBYUE7b0JBQ2JELFlBQVkvTSxJQUFJMmQ7b0JBQ2hCTCxpQkFBaUJBOztnQkFFbkIxaEIsT0FBT0E7O0FBRVg7UUFTQSxZQUFNa2lCLENBQ0oxQixjQUNBVSxpQkFDR3JlO1lBRUgsT0FBTTRCLEtBQUVBLEtBQUd1QixLQUFFQSxjQUFlMUMsS0FBS3FCLE9BQU85QixNQUFNLFVBQVUsT0FBT29CLElBQzdEWCxLQUFLNGU7WUFFUCxJQUFJQztZQUNKO2dCQUNFMWQsSUFBSStELE1BQU0sYUFBYWdZO2dCQUN2QixNQUFNaUIsbUJBQW9DbmUsS0FBS3ViLE9BQU9xRCxPQUFPO29CQUMzRGIsY0FBY2I7b0JBQ2RjLGtCQUFrQko7O2dCQUVwQmlCLFdBQVdtTSxzQkFBc0I5TSx1QkFDL0JDLFlBQ0FuZSxLQUFLbU8sT0FBT3lNLFFBQ1psWTtnQkFFRnZCLElBQUk4YyxLQUNGLHlCQUF5QmYsc0JBQXNCbGQsS0FBS21PLE9BQU95TSxhQUFhaUUsU0FBU3ZaO0FBRXJGLGNBQUUsT0FBT3JMO2dCQUNQLE1BQU0rRixLQUFLMmMsV0FBVzFpQjtBQUN4QjtZQUNBLE9BQU80a0I7QUFDVDtRQWFBLHVCQUFNQyxDQUNKN1osT0FDQXNZLGNBQXVCLE9BQ3ZCQyxjQUFzQixJQUN0QkMsVUFDQUMsT0FDQUMsbUJBQ0dwZTtZQUVILE9BQU1tRCxLQUFFQSxjQUFlMUMsS0FBS3FCLE9BQU85QixNQUFNLG1CQUFtQixPQUFPb0IsSUFDakVYLEtBQUs4ZTtZQUVQLE1BQU1sQixxQkFBcUI1ZCxLQUFLc2QsU0FDOUJyWSxPQUNBc1ksYUFDQUMsYUFDQUMsVUFDQUMsT0FDQUMsZ0JBQ0FqYjtZQUVGLE9BQU1rTCxVQUFFQSxZQUFhM0k7WUFDckIsT0FBT2pGLEtBQUs0ZSxPQUFPaFIsVUFBb0JnUSxjQUFjbGI7QUFDdkQ7UUFRQSxvQkFBTWdwQixDQUNKeE8sY0FDQTJCLFVBQ0E4TSxvQkFDR3BzQjtZQUVILE9BQU00QixLQUFFQSxLQUFHdUIsS0FBRUEsY0FBZTFDLEtBQUtxQixPQUFPOUIsTUFBTSxZQUFZLE9BQU9vQixJQUMvRFgsS0FBSzByQjtZQUdQO2dCQUNFdnFCLElBQUk4YyxLQUFLLHlCQUF5QmY7Z0JBR2xDLE1BQU1uQixrQkFBa0IvYixLQUFLdWIsT0FBT1M7Z0JBRXBDLE1BQU00UCx1QkFBd0I3UCxnQkFBZ0JvQixPQUM1Q0QsY0FDQWxkLEtBQUtpTztzQkFHRDhOLGdCQUFnQnRXLE9BQU95WCxjQUFjeU8saUJBQWlCM3JCLEtBQUtpTztnQkFHakUsTUFBTTRkLGVBQWUzZCxhQUFBQSxLQUFLNGQsV0FDeEI1TyxjQUNBLElBQ0FsZCxLQUFLaU8sS0FBSzhkLFlBQ1ZsTixTQUFTL1EsYUFDVCtRLFNBQVNoUjtnQkFFWGdlLGFBQWEvYyxlQUFlOU8sS0FBS2lPLEtBQUtZO2dCQUV0QyxNQUFNbWQsbUJBQ0pKLGVBQWV0eEIsT0FBT29qQixTQUFTLElBQy9CMWdCLElBQUksRUFBR25ELGlCQUFNO29CQUNiQTtvQkFDQW95QixVQUFVOztnQkFHWixNQUFNOU4sbUJBQW1CbmUsS0FBS3ViLE9BQU8yUSxTQUNuQ0wsY0FDQUc7Z0JBR0YsTUFBTUcsa0JBQWtCbkIsc0JBQXNCOU0sdUJBQzVDQyxZQUNBbmUsS0FBS21PLE9BQU95TSxRQUNabFk7Z0JBSUZ2QixJQUFJK0QsTUFBTSxzQ0FBc0NnWTtnQkFDaEQsT0FBTTdKLEtBQUVBLEtBQUdHLFFBQUVBLFVBQVdULHdCQUF3QjhMLFNBQVMvUTtzQkFDbkQ5TixLQUFLK2UsT0FBTzdCLGNBQWM7b0JBQUU3SjtvQkFBS0c7bUJBQVVqVTtnQkFFakQ0QixJQUFJK0QsTUFBTSxpQ0FBaUNnWTtnQkFDM0MsT0FBT2lQO0FBQ1QsY0FBRSxPQUFPbHlCO2dCQUNQLE1BQU0rRixLQUFLMmMsV0FBVzFpQjtBQUN4QjtBQUNGO1FBWUEsWUFBTThrQixDQUNKN0IsY0FDQWtQLGtCQUNHN3NCO1lBRUgsT0FBTTRCLEtBQUVBLGNBQWVuQixLQUFLcUIsT0FBTzlCLE1BQU0sVUFBVSxPQUFPb0IsSUFBSVgsS0FBSytlO1lBQ25FNWQsSUFBSUssUUFBUSx3Q0FBd0MwYjtZQUNwRCxNQUFNMkIsaUJBQWlCN2UsS0FBS2lkLEtBQUtDO1lBQ2pDLEtBQUsyQixVQUNILE1BQU0sSUFBSXpCLGFBQUFBLGNBQ1IscUNBQXFDRjtZQUV6QyxJQUFJNWlCO1lBQ0o7Z0JBQ0UsTUFBTTBrQixTQUNKZ0gsUUFBUW9HLGNBQWM1WSxXQUFXd1MsUUFBUW9HLGNBQWMvWSxPQUNuRCw0QkFDQTtnQkFFTixNQUFNZ1osZ0JBQWdDO29CQUNwQ3JOO3VCQUNHb047b0JBQ0hyTyxjQUFjYyxTQUFTdlo7O2dCQUd6QmhMLGVBQWUwRixLQUFLdWIsT0FBT3dELE9BQU9zTixlQUFlcnNCLEtBQUtpTztBQUN4RCxjQUFFLE9BQU9oVTtnQkFDUCxNQUFNLElBQUl3RCxhQUFBQSxjQUNSLHVDQUF1Q3lmLGlCQUFpQmpqQjtBQUU1RDtZQUNBLEtBQUtLLE9BQU8raUIsU0FDVixNQUFNLElBQUk1ZixhQUFBQSxjQUNSLHVDQUF1Q3lmLGlCQUFpQjVpQixPQUFPMkwsT0FBT3hNLEtBQUs7WUFFL0UsT0FBT2E7QUFDVDs7SUMxZlVneUIsUUFBQUEsZUFBQUE7S0FBWixTQUFZQTtRQUVWQSxRQUFBLFdBQUE7UUFFQUEsUUFBQSxVQUFBO1FBRUFBLFFBQUEsWUFBQTtBQUNELE1BUEQsQ0FBWUEsUUFBQUEsWUFBQUEsa0JBQU8sQ0FBQTtJQ0xaLE1BQU1DLDJCQUE4Q3h5QixPQUFPNEQsT0FBTztRQUN2RTZ1QixpQkFBaUI7UUFDakJDLGdCQUFnQjtRQUNoQkMsZUFBZTtRQUNmQyxlQUFlO1FBQ2Z4bEIsUUFBUTtRQUNSeWxCLDBCQUEwQjtRQUMxQkMsc0JBQXNCO1FBQ3RCcnNCLHNCQUFzQjtRQUN0QnNzQixrQkFBa0I7UUFDbEJDLGlCQUFpQjs7SUNObkIsTUFBTTVyQixNQUFNLElBQUk4TCxRQUFBQSxXQUFXO0lBV3BCOVMsZUFBZStTLGtCQUNwQkMsZUFDQUM7UUFFQSxJQUFJRCx5QkFBeUJFLFlBQVksT0FBT0Y7UUFDaEQsSUFDRUEsY0FBY0csTUFDWix5RUFHRixPQUFPSDtRQUNULGFBQWFDLFdBQVdEO0FBQzFCO0lBVU9oVCxlQUFlb1QsU0FBU0o7UUFDN0IsV0FBV0Esa0JBQWtCLFVBQVUsT0FBT0E7UUFFOUMsTUFBTUMsYUFBYWpULE1BQU81QjtZQUN4QixPQUFNaVYsVUFBRUEsa0JBQW1CQyxLQUFBQSxnQkFBZ0JDLE9BQU87WUFDbEQsYUFBYUYsU0FBU0QsU0FBU2hWOztRQUdqQyxhQUFhNlUsV0FBV0Q7QUFDMUI7SUFhT2hULGVBQWV3VCxVQUNwQkMsVUFDQUMsWUFDQUMsYUFDQXBSO1FBRUF5RSxJQUFJK0QsTUFDRixpQkFBaUJ4SSxjQUFja1IsNkJBQTZCRTtRQUU5RCxNQUFNRyxPQUFPLElBQUlDLGFBQUFBLEtBQUtOO1FBQ3RCLE1BQU1nQixjQUFjVixhQUFBQSxLQUFLaUI7UUFDekJsQixLQUFLYSxlQUFlRjtRQUNwQixNQUFNNEksY0FBYzVJLFlBQVlRLGlCQUFpQnZCO2NBQzNDSSxLQUFLaUIsY0FBY3NJLGFBQWExSixhQUFhcFI7UUFDbkQsT0FBT3VSO0FBQ1Q7SUFXTzlULGVBQWVzVyxZQUNwQi9ULE9BQ0FnVTtRQUVBLE1BQU1DLHFCQUFxQnhXLE1BQU81QjtZQUNoQyxPQUFNaVYsVUFBRUEsa0JBQW1CQyxLQUFBQSxnQkFBZ0JDLE9BQU87WUFDbEQsTUFBTWtELGlCQUFpQkMsb0JBQW9CdFk7WUFDM0MsTUFBTXVZLG9CQUFvQnRELFNBQVNELFNBQVNxRDtZQUM1QyxPQUFPRTs7UUFHVCxNQUFNQSxvQkFBaUM1RCxrQkFDckN3RCxtQkFDQUM7UUFHRixPQUFPO1lBQUVqVTtZQUFPb1U7O0FBQ2xCO0lBVU8zVyxlQUFlMFcsb0JBQW9CRTtRQUN4QyxPQUFNdkQsVUFBRUEsa0JBQW1CQyxLQUFBQSxnQkFBZ0JDLE9BQU87UUFDbEQsT0FBTWpVLE1BQUVBLGNBQWVnVSxLQUFBQSxnQkFBZ0JDLE9BQU87UUFDOUMsTUFBTWxULGNBQWNnVCxTQUFTd0QsUUFBUUQ7UUFDckMsT0FBT3RYLEtBQUtzWCxTQUFTdlcsTUFBTTtBQUM3QjtJQVVPTCxlQUFlOFcsMkJBQ3BCRjtRQUVBLE9BQU12RCxVQUFFQSxrQkFBbUJDLEtBQUFBLGdCQUFnQkMsT0FBTztRQUNsRCxPQUFNalUsTUFBRUEsY0FBZWdVLEtBQUFBLGdCQUFnQkMsT0FBTztRQUM5QyxNQUFNbFQsY0FBY2dULFNBQVN3RCxRQUFRRDtRQUNyQyxjQUFjdkQsU0FBU0QsU0FBUzlULEtBQUtzWCxTQUFTdlcsTUFBTSxNQUFNa1E7QUFDNUQ7SUFVT3ZRLGVBQWVnWCxVQUFVQztRQUM5QixNQUFNQyxtQkFBbUJsWCxNQUFPNUI7WUFDOUIsT0FBTWlWLFVBQUVBLGtCQUFtQkMsS0FBQUEsZ0JBQWdCQyxPQUFPO1lBQ2xELE1BQU00RCxnQkFBZ0JULG9CQUFvQnRZO1lBQzFDLGFBQWFpVixTQUFTRCxTQUFTK0Q7O1FBR2pDLE1BQU1DLHNCQUF1QnJFLGtCQUMzQmtFLGtCQUNBQztRQU9GLE1BQU14RCxtQkFBbUIyRCxrQkFBa0JEO1FBQzNDLE1BQU0xSyxPQUFPOU0sT0FBTzBYLHNCQUFzQjVEO1FBQzFDLE1BQU02RCxJQUFLN0QsV0FBbUJoSCxLQUFLO1FBR25DLE9BQU84SyxjQUFBQSxRQUFRQyxvQkFBb0JGO0FBQ3JDO0lBdUJPdlgsZUFBZXFYLGtCQUFrQks7UUFDdEMsTUFBTUMsVUFBVTtRQUNoQixJQUFJQztRQUNKLElBQUlrRixRQUFBQSxhQUFhO1lBQ2ZsRixTQUFVQyxXQUFtQjNCLE9BQU8wQjtBQUN0QyxlQUFPO1lBQ0wsTUFBTXpELFlBQWFiLEtBQUFBLGdCQUFnQkMsT0FBT29FO1lBQzFDQyxTQUFTekQsSUFBSXlELFVBQVV6RCxJQUFJNkQsVUFBVUo7QUFDdkM7UUFFQSxLQUFLQSxRQUFRLE1BQU0sSUFBSWpKLE1BQU07UUFFN0IsU0FBU3NKLE9BQU96SjtZQUNkLE1BQU0wSixNQUFNLElBQUlDLFlBQVkzSixJQUFJL007WUFDaEMsTUFBTTJXLFVBQVUsSUFBSWxGLFdBQVdnRjtZQUMvQixLQUFLLElBQUkxTCxJQUFJLEdBQUc2TCxTQUFTN0osSUFBSS9NLFFBQVErSyxJQUFJNkwsUUFBUTdMLEtBQUs7Z0JBQ3BENEwsUUFBUTVMLEtBQUtnQyxJQUFJOEosV0FBVzlMO0FBQzlCO1lBQ0EsT0FBTzBMO0FBQ1Q7UUFFQSxNQUFNMUosTUFBTWtKLElBQ1RuSCxTQUFTLFFBQ1Q1TyxRQUFRLCtCQUErQixJQUN2QzRXLFdBQVcsTUFBTSxJQUNqQjVXLFFBQVEsNkJBQTZCO1FBQ3hDLE1BQU02VyxVQUFVbkQsT0FBTzVFLEtBQUtqQyxLQUFLLFVBQVUrQixTQUFTO1FBQ3BELE1BQU1rSSxZQUFZUixPQUFPTztRQUV6QjtZQUNFLE1BQU03UixZQUFZaVIsT0FBT2MsVUFDdkIsU0FDQUQsV0FDQTtnQkFDRS9ZLE1BQU07Z0JBQ05pWixZQUFZO2VBRWQsTUFDQSxFQUFDO1lBR0gsT0FBT2hTO0FBQ1QsVUFBRSxPQUFPN0c7WUFDUCxNQUFNLElBQUl3RCxhQUFBQSxjQUFjeEQ7QUFDMUI7QUFDRjtJQzlLQSxNQUFNK3lCLGVBQWdCaHJCLFNBQ3BCQSxNQUFNbEcsUUFBUSx1QkFBdUI7SUFFdkMsU0FBU214Qix3QkFBd0JqckI7UUFDL0IsS0FBS0EsT0FBTyxPQUFPO1FBQ25CLE1BQU1rckIsUUFBUXh0QixNQUFNa0wsS0FBSzVJO1FBQ3pCLEtBQUssSUFBSTJFLElBQUl1bUIsTUFBTXR4QixTQUFTLEdBQUcrSyxLQUFLLEdBQUdBLEtBQUssR0FBRztZQUM3QyxNQUFNeVQsT0FBTzhTLE1BQU12bUIsR0FBR3dtQixZQUFZO1lBQ2xDLElBQUkvUyxTQUFTM2UsV0FBVztZQUN4QixJQUFJMmUsT0FBTyxTQUFVO2dCQUNuQjhTLE1BQU12bUIsS0FBS2MsT0FBTzJsQixjQUFjaFQsT0FBTztnQkFDdkMsT0FBTzhTLE1BQU1wcUIsTUFBTSxHQUFHNkQsSUFBSSxHQUFHbE4sS0FBSztBQUNwQztBQUNGO1FBQ0EsT0FBTyxHQUFHdUk7QUFDWjtJQUVBLFNBQVNxckIsWUFBWW5kO1FBQ25CLE9BQU87WUFDTG9kLE9BQU9wZDtZQUNQcWQsS0FBS04sd0JBQXdCL2M7O0FBRWpDO0lBRU0sTUFBT3NkLDhCQUFrREMsS0FBQUE7UUFNN0QsV0FBQTV1QixDQUFZQyxTQUE4QjVCO1lBQ3hDZ0MsTUFBTUosU0FBUzVCO0FBQ2pCO1FBRW1CLE1BQUF3d0IsQ0FDakJockI7WUFFQSxNQUFNaXJCLFdBQTZDenVCLE1BQU13dUIsT0FDdkRockI7WUFFRixLQUFLaXJCLFVBQVUsT0FBT0E7WUFFdEIsT0FBTUMsUUFBRUEsUUFBTTdWLFFBQUVBLFFBQU14WSxNQUFFQSxRQUFTb3VCO1lBQ2pDLE9BQU1uckIsV0FBRUEsV0FBU3RCLE9BQUVBLFNBQVU2VztZQUM3QixRQUFRNlY7Y0FDTixLQUFLdHNCLEtBQUFBLHNCQUFzQmlCO2dCQUN6Qjs7Y0FDRixLQUFLakIsS0FBQUEsc0JBQXNCbUI7Z0JBQ3pCbEQsS0FBS3hFLEtBQUt5SCxXQUFXdEI7Z0JBQ3JCOztjQUNGLEtBQUtJLEtBQUFBLHNCQUFzQlc7Z0JBQ3pCOztjQUNGLEtBQUtYLEtBQUFBLHNCQUFzQlE7Z0JBQ3pCdkMsS0FBS3hFLEtBQUt5SDtnQkFDVjs7Y0FDRixLQUFLbEIsS0FBQUEsc0JBQXNCQztnQkFDekJoQyxLQUFLeEUsS0FBS3lILFdBQVd0QjtnQkFDckI7O2NBQ0YsS0FBS0ksS0FBQUEsc0JBQXNCYTtnQkFDekI7O2NBQ0Y7Z0JBQ0UsTUFBTSxJQUFJMUUsYUFBQUEsY0FBYyxzQkFBc0Jtd0I7O1lBR2xELE9BQU9EO0FBQ1Q7UUFFbUIscUJBQU1FLElBQ3BCQztZQUVILE1BQU05SSxPQUFPbGxCLEtBQUFBLFdBQVdpdUIsU0FBUy90QixLQUFLZ3VCLGNBQWNodUIsS0FBS2xCLFFBQVFtdkI7WUFDakUsT0FBTUwsUUFBRUEsUUFBTXJ1QixNQUFFQSxRQUFTUyxLQUFLb0Y7WUFDOUIsT0FBTzRmLEtBQUtyakIsVUFBVWlzQixXQUFXcnVCLFNBQVN1dUI7QUFDNUM7UUFFUyxhQUFNM3VCLENBQ2J1RDtZQUVBQSxNQUNFQSxhQUNPMUMsS0FBS2xCLFFBQVFxa0IsUUFDbEJ4Z0IscUJBQWdCdXJCLE9BQ2hCbHVCLEtBQUs5QyxhQUFhLENBQUEsR0FDbEI4QyxLQUFLZ3VCO1lBR1QsSUFDRWh1QixLQUFLbXVCLG1CQUNKenJCLElBQW1DbUQsSUFBSSw4QkFDeEM7Z0JBQ0EsTUFBTThuQixXQUFXM3RCLEtBQUswdEIsT0FBT2hyQjtnQkFDN0IsSUFBSWlyQixVQUFVO29CQUNaM3RCLEtBQUtvRixXQUFXdW9CO29CQUNoQixPQUFPM3RCO0FBQ1Q7QUFDRjtZQUNBLE1BQU1ULE9BQTRCO1lBQ2xDLE1BQU13WSxTQUFjLENBQUE7WUFFcEIsTUFBTTNTLFdBQW1DO2dCQUN2QzFELE9BQU8xQixLQUFLZ3VCO2dCQUNaenVCO2dCQUNBd1k7O1lBR0YsTUFBTTZWLFNBQW1CLEVBQUNRLEtBQUFBLFlBQVluc0I7WUFFdEMsSUFBSWpDLEtBQUtxdUIsZ0JBQWdCO2dCQUN2QixNQUFNQyxTQUFTdHVCLEtBQUt1dUIsaUJBQWlCdnVCLEtBQUtxdUIsZ0JBQWdCM3JCO2dCQUMxRGtyQixPQUFPN3lCLEtBQUt1ekIsT0FBT1Y7Z0JBQ25CLElBQUlVLE9BQU8vdUIsUUFBUSt1QixPQUFPL3VCLEtBQUszRCxRQUM3QjJELEtBQUt4RSxRQUFTdXpCLE9BQU8vdUI7QUFDekI7WUFDQSxJQUFJUyxLQUFLd3VCLGdCQUNQWixPQUFPN3lCLEtBQ0xxekIsS0FBQUEsWUFBWUssUUFDWnp1QixLQUFLd3VCLGVBQWUvMEIsS0FBSyxJQUFJMjBCLEtBQUFBLFlBQVlNLElBQUlDO1lBRWpELElBQUkzdUIsS0FBSzR1QixrQkFBa0JoekIsUUFBUTtnQkFDakNneUIsT0FBTzd5QixLQUFLcXpCLEtBQUFBLFlBQVlTLFVBQVU3dUIsS0FBSzR1QixpQkFBaUIsR0FBRztnQkFDM0RydkIsS0FBS3hFLEtBQUtpRixLQUFLNHVCLGlCQUFpQixHQUFHO0FBQ3JDO1lBQ0F4cEIsU0FBU3dvQixTQUFTa0IsUUFBQUEsWUFBWWxCLE9BQU9uMEIsS0FBSztZQUMxQzJMLFNBQVMyUyxTQUFTQTtZQUNsQi9YLEtBQUtvRixXQUFXQTtZQUNoQixPQUFPcEY7QUFDVDtRQU1tQixhQUFBK3VCLENBQ2pCMXBCLFFBQ0EzQztZQUVBLE1BQU1zc0IsU0FBUzkwQixvQkFBQUEsTUFBTXFOLEdBQUd2SCxLQUFLZ3VCO1lBQzdCLE1BQU14bUIsT0FBT2MsV0FBQUEsU0FBU3pDLElBQ3BCN0YsS0FBS2d1QixjQUNMMWxCLG9CQUFTeEgsSUFBSStmLGFBQUFBLE9BQU9vTyxJQUFJRCxVQUN2QnhuQjtZQUVILElBQUluQyxPQUFPakMsdUJBQVk2ckIsS0FBSztnQkFDMUIsT0FBTSxLQUFNQyxXQUFXN3BCLE9BQU9qQyxXQUFBQSxZQUFZNnJCLElBQUk3RSxNQUFNaG5CLFdBQUFBLFlBQVkrckI7Z0JBQ2hFLE1BQU03cEIsS0FBSzRwQixRQUFRejFCLEtBQUs7Z0JBQ3hCNEwsT0FBTzJwQixVQUFVdGxCLEtBQUFBLFNBQVNDLFdBQVduQyxNQUFhbEM7QUFDcEQ7WUFFQSxPQUFPcEcsTUFBTTZ2QixjQUFjMXBCLFFBQVEzQztBQUNyQztRQU1TLFNBQU0wc0IsQ0FBT0MsYUFBeUI5dkI7WUFDN0MsT0FBTW1ELEtBQUVBLE9BQVExQyxLQUFLcUIsT0FBTzlCLE1BQU1TLEtBQUtvdkI7WUFDdkMsTUFBTUUsYUFBY0QsVUFBa0JFO1lBQ3RDLElBQUtGLFVBQWtCRyxhQUFhRixZQUFZO2dCQUM5QyxPQUFPdHZCLEtBQUt5dkIsaUJBQW9CSCxZQUFZNXNCO0FBQzlDO1lBQ0EsTUFBTWd0QixnQkFBdUIxdkIsS0FBS2xCLFFBQVFzd0IsSUFDeENDLFVBQ0EsTUFDQXJ2QixLQUFLZ3VCLGNBQ0x0ckI7WUFHRixLQUFLMUMsS0FBS3d1QixnQkFBZ0I7Z0JBQ3hCLE1BQU1tQixZQUFZRCxRQUFRMXlCLElBQUttRyxLQUFNbkQsS0FBSyt1QixjQUFjNXJCLEdBQUdUO2dCQUMzRCxLQUFLQSxJQUFJYyxlQUFlLHVCQUF1QjtvQkFDN0MsT0FBT21zQjtBQUNUO2dCQUNBLGFBQWMzdkIsS0FBSzR2QiwyQkFBMkJELFdBQVdqdEI7QUFDM0Q7WUFDQSxPQUFPZ3RCO0FBQ1Q7UUFNbUIsS0FBQTNtQjtZQUNqQixNQUFNNUgsTUFBTW5CLEtBQUttQixJQUFJUixJQUFJWCxLQUFLK0k7WUFDOUIsTUFBTThtQixpQkFBaUI3dkIsS0FBSzh2QjtZQUM1QixJQUFJRCxnQkFBZ0IsT0FBT0E7WUFDM0IsTUFBTUUsWUFBMkIsQ0FBQTtZQUNqQ0EsVUFBVTNzQixXQUFBQSxZQUFZQyxTQUFTLENBQUE7WUFDL0Iwc0IsVUFBVTNzQixXQUFBQSxZQUFZQyxTQUFTbkosb0JBQUFBLE1BQU11SCxVQUFVekIsS0FBS2d1QjtZQUNwRCxNQUFNanZCLFFBQW9CO2dCQUFFaXhCLFVBQVVEOztZQUN0QyxJQUFJL3ZCLEtBQUt3dUIsZ0JBQWdCenZCLE1BQU1reEIsU0FBU2p3QixLQUFLd3VCO1lBRTdDLElBQUl4dUIsS0FBS3F1QixnQkFBZ0I7Z0JBQ3ZCLE1BQU0zSSxZQUEyQjFsQixLQUFLa3dCLGVBQ3BDQyxLQUFBQSxVQUFVQyxJQUNScHdCLEtBQUtxdUIsZ0JBQ0w4QixLQUFBQSxVQUFVck0sVUFBYTFnQixXQUFBQSxZQUFZQyxPQUFrQmd0QixHQUNuRHR4QixNQUFNaXhCLFNBQVM1c0IsV0FBQUEsWUFBWUMsVUFHL0Iyc0I7Z0JBQ0YsTUFBTU0sZUFBZXYyQixPQUFPOE0sS0FBSzZlO2dCQUNqQyxJQUNFNEssYUFBYTEwQixXQUFXLEtBQ3hCN0IsT0FBT0QsT0FBT3kyQixXQUFBQSxzQkFBc0JDLFFBQVFGLGFBQWEsU0FBUyxHQUVsRSxRQUFRQSxhQUFhO2tCQUNuQixLQUFLQyxXQUFBQSxxQkFBcUI3QjtvQkFDeEJoSixVQUFVNkssV0FBQUEscUJBQXFCN0IsT0FBTyxLQUNqQzMwQixPQUFPRCxPQUNSNHJCLFVBQVU2SyxXQUFBQSxxQkFBcUI3QixNQUMvQmpGLE9BQU8sQ0FBQzF3QixPQUF3QjAzQjt3QkFDaEMsTUFBTTVwQixPQUFPOU0sT0FBTzhNLEtBQUs0cEI7d0JBQ3pCLElBQUk1cEIsS0FBS2pMLFdBQVcsR0FDbEIsTUFBTSxJQUFJa04sTUFDUjt3QkFFSixNQUFNNEksSUFBSTdLLEtBQUs7d0JBQ2YsSUFBSTZLLE1BQU02ZSxXQUFBQSxxQkFBcUI3QixLQUM3QjMxQixNQUFNZ0MsUUFBUzAxQixJQUFJL2UsVUFDaEIzWSxNQUFNZ0MsS0FBSzAxQjt3QkFDaEIsT0FBTzEzQjt1QkFDTjtvQkFFTGdHLE1BQU1peEIsV0FBV3RLO29CQUNqQjs7a0JBQ0YsS0FBSzZLLFdBQUFBLHFCQUFxQkc7b0JBQUk7d0JBQzVCLE1BQU1DLElBQXNCLENBQUE7d0JBQzVCQSxFQUFFSixXQUFBQSxxQkFBcUI3QixPQUFPLEVBQzVCaEosY0FDRzNyQixPQUFPNjJCLFFBQVE3eEIsTUFBTWl4QixVQUFVaHpCLElBQUksRUFBRThELEtBQUsydkI7NEJBQzNDLE1BQU1uMkIsU0FBMkIsQ0FBQTs0QkFDakNBLE9BQU93RyxPQUFPMnZCOzRCQUNkLE9BQU9uMkI7O3dCQUdYeUUsTUFBTWl4QixXQUFXVzt3QkFDakI7QUFDRjs7a0JBQ0E7b0JBQ0UsTUFBTSxJQUFJN25CLE1BQU07dUJBRWpCO29CQUNIL08sT0FBTzYyQixRQUFRbEwsV0FBV3ZzQixRQUFRLEVBQUUySCxLQUFLMnZCO3dCQUN2QyxJQUFJMXhCLE1BQU1peEIsU0FBU2x2QixNQUNqQkssSUFBSTB2QixLQUNGLEtBQUsvdkIsOENBQThDL0IsTUFBTWl4QixTQUFTbHZCLFdBQVcydkI7d0JBRWpGMXhCLE1BQU1peEIsU0FBU2x2QixPQUFPMnZCOztBQUUxQjtBQUNGO1lBRUEsSUFBSXp3QixLQUFLNHVCLGtCQUFrQmh6QixRQUFRO2dCQUNqQ21ELE1BQU15cUIsT0FBT3pxQixNQUFNeXFCLFFBQVE7Z0JBQzNCenFCLE1BQU1peEIsV0FBV2p4QixNQUFNaXhCLFlBQWEsQ0FBQTtnQkFDcEMsS0FBSyxPQUFPYyxhQUFhdHVCLGNBQWN4QyxLQUFLNHVCLGtCQUFrQjtvQkFDNUQsTUFBTW9CLFdBQVdjO29CQUNqQixNQUFNQyxNQUFzQyxDQUFBO29CQUM1Q0EsSUFBSWYsWUFBWXh0QjtvQkFDZnpELE1BQU15cUIsS0FBMEN6dUIsS0FBS2cyQjtvQkFDdEQsS0FBS2h5QixNQUFNaXhCLFNBQVNBLFdBQVc7d0JBQzdCanhCLE1BQU1peEIsU0FBU0EsWUFBWSxDQUFBO3dCQUMxQmp4QixNQUFNaXhCLFNBQVNBLFVBQTRCZ0IsV0FBQUEsZ0JBQWdCQyxVQUMxRDtBQUNKO0FBQ0Y7QUFDRjtZQUVBLElBQUlqeEIsS0FBS2t4QixlQUFlO2dCQUN0Qm55QixNQUFNbUMsUUFBUWxCLEtBQUtreEI7QUFDckIsbUJBQU87Z0JBQ0wvdkIsSUFBSTB2QixLQUNGLDZEQUE2RE0sV0FBQUE7Z0JBRS9EcHlCLE1BQU1tQyxRQUFRaXdCLFdBQUFBO0FBQ2hCO1lBRUEsSUFBSW54QixLQUFLb3hCLGdCQUFnQnJ5QixNQUFNc3lCLE9BQU9yeEIsS0FBS294QjtZQUUzQyxPQUFPcnlCO0FBQ1Q7UUFNbUIsY0FBQW14QixDQUFleEs7WUFDaEMsU0FBUzRMLE1BQ1BDLElBQ0FDLE1BQ0FDO2dCQUVBLE1BQU1uM0IsU0FBcUI7b0JBQUUwMUIsVUFBVTs7Z0JBQ3ZDMTFCLE9BQU8wMUIsU0FBU3VCLE1BQU0sRUFBQ0MsTUFBTUM7Z0JBQzdCLE9BQU9uM0I7QUFDVDtZQUVBLE9BQU1vM0IsT0FBRUEsT0FBS0MsVUFBRUEsVUFBUUMsWUFBRUEsY0FBZWxNO1lBTXhDLElBQUlpTSxhQUFhRSxLQUFBQSxTQUFTQyxhQUFhO2dCQUNyQyxXQUFXSixVQUFVLFVBQ25CLE1BQU0sSUFBSUssS0FBQUEsV0FBVztnQkFDdkIsV0FBV0gsZUFBZSxVQUN4QixNQUFNLElBQUlHLEtBQUFBLFdBQVc7Z0JBQ3ZCLE1BQU1DLFFBQVEzRSxZQUFZdUU7Z0JBQzFCLE1BQU01QixXQUEwQixDQUFBO2dCQUNoQ0EsU0FBUzBCLFNBQVMsQ0FBQTtnQkFDakIxQixTQUFTMEIsT0FBeUJWLFdBQUFBLGdCQUFnQmlCLGFBQWFELE1BQU0xRTtnQkFDckUwQyxTQUFTMEIsT0FBeUJWLFdBQUFBLGdCQUFnQmtCLFdBQVdGLE1BQU16RTtnQkFDcEUsT0FBTztvQkFBRXlDOztBQUNYO1lBRUEsSUFBSTJCLGFBQWFFLEtBQUFBLFNBQVNNLFdBQVc7Z0JBQ25DLFdBQVdULFVBQVUsVUFDbkIsTUFBTSxJQUFJSyxLQUFBQSxXQUFXO2dCQUN2QixXQUFXSCxlQUFlLFVBQ3hCLE1BQU0sSUFBSUcsS0FBQUEsV0FBVztnQkFDdkIsTUFBTS9CLFdBQTBCLENBQUE7Z0JBQ2hDQSxTQUFTMEIsU0FBUztvQkFDaEIsQ0FBQ1YsV0FBQUEsZ0JBQWdCb0IsU0FBUyxHQUFHcEYsYUFBYTRFOztnQkFFNUMsT0FBTztvQkFBRTVCOztBQUNYO1lBRUEsSUFBSTJCLGFBQWFFLEtBQUFBLFNBQVNRLFNBQVM7Z0JBQ2pDLE1BQU0vUyxPQUFPb1M7Z0JBQ2IsS0FBS2h5QixNQUFNQyxRQUFRaXlCLGVBQWVBLFdBQVdoMkIsV0FBVyxHQUN0RCxNQUFNLElBQUltMkIsS0FBQUEsV0FBVztnQkFDdkIsT0FBT2xTLEtBQUt5UyxPQUFPVjtnQkFDbkIsTUFBTVcsWUFBMkIsQ0FBQTtnQkFDakNBLFVBQVVqVCxRQUFRLENBQUE7Z0JBQ2pCaVQsVUFBVWpULE1BQ1RrVCxXQUFBQSxtQkFBbUJYLEtBQUFBLFNBQVNJLGNBQzFCcFM7Z0JBQ0gwUyxVQUFValQsTUFDVGtULFdBQUFBLG1CQUFtQlgsS0FBQUEsU0FBU1ksZUFDMUJIO2dCQUNKLE9BQU87b0JBQUV0QyxVQUFVdUM7O0FBQ3JCO1lBRUEsSUFBSWhCLEtBQW9CLENBQUE7WUFDeEIsSUFDRSxFQUFDbUIsS0FBQUEsY0FBY2hFLEtBQUtnRSxLQUFBQSxjQUFjaEMsSUFBSW1CLEtBQUFBLFNBQVNjLE1BQUtuQyxRQUNsRG1CLGVBQ0ssR0FDUDtnQkFDQUosR0FBR0csU0FBbUIsQ0FBQTtnQkFDckJILEdBQUdHLE9BQW1DYyxXQUFBQSxtQkFBbUJiLGFBQ3hEQztBQUNKLG1CQUFPLElBQUlELGFBQWFFLEtBQUFBLFNBQVNjLEtBQUs7Z0JBQ3BDcEIsS0FBS3Z4QixLQUFLa3dCLGVBQWV3QixPQUF1QjFCO2dCQUNoRHVCLEdBQUdpQixXQUFBQSxtQkFBbUJYLEtBQUFBLFNBQVNjLFFBQVEsQ0FBQTtnQkFDdENwQixHQUFHaUIsV0FBQUEsbUJBQW1CWCxjQUFTYyxNQUM3QmpCLE1BQXVDQSxTQUN0Q0U7QUFDTixtQkFBTztnQkFDTCxNQUFNZ0IsTUFBVzV5QixLQUFLa3dCLGVBQWV3QixPQUF1QjFCO2dCQUM1RCxNQUFNNkMsTUFBVzd5QixLQUFLa3dCLGVBQWUwQixZQUE0QjVCO2dCQUNqRXVCLEtBQUtELE1BQU1rQiw4QkFBbUJiLFdBQVdpQixLQUFLQyxLQUFLN0M7QUFDckQ7WUFFQSxPQUFPO2dCQUFFQSxVQUFVdUI7O0FBQ3JCO1FBTVEsbUJBQUF6QjtZQUNOLEtBQUs5dkIsS0FBS2d1QixjQUFjLE9BQU92eUI7WUFDL0IsSUFBSXVFLEtBQUs4eUIsYUFBYTtnQkFDcEIsTUFBTWhQLFlBQVlyYyxPQUFPekgsS0FBSzh5QjtnQkFDOUIsTUFBTUMsVUFBVS95QixLQUFLZ3pCLDBCQUEwQixPQUFPbFA7Z0JBQ3RELE1BQU1tUCxZQUFZanpCLEtBQUtnekIsMEJBQTBCLFNBQVNsUDtnQkFDMUQsS0FBS2lQLFlBQVlFLFdBQ2YsTUFBTSxJQUFJbEIsS0FBQUEsV0FDUiw0REFBNERqTztnQkFFaEUsT0FBTzlqQixLQUFLa3pCLHFCQUFxQjtvQkFDL0JDLE1BQU07b0JBQ05yUDtvQkFDQXNQLGVBQWVMLFFBQVF0UTtvQkFDdkI0USxpQkFBaUJKLFVBQVV4UTs7QUFFL0I7WUFFQSxXQUFXemlCLEtBQUtzekIsMEJBQTBCLGFBQWE7Z0JBQ3JELE1BQU14UCxZQUNKOWpCLEtBQUtzekIseUJBQXlCLE9BQzFCNzNCLFlBQ0FnTSxPQUFPekgsS0FBS3N6QjtnQkFDbEIsTUFBTXJWLE9BQU9qZSxLQUFLZ3pCLDBCQUEwQixZQUFZbFA7Z0JBQ3hELElBQUk3RixNQUFNO29CQUNSQSxLQUFLc1YsZ0JBQWdCO29CQUNyQixPQUFPdnpCLEtBQUtrekIscUJBQXFCalY7QUFDbkM7QUFDRjtZQUVBLE1BQU11Vix3QkFDR3h6QixLQUFLeXpCLGtCQUFrQixzQkFDdkJ6ekIsS0FBS3N6QiwwQkFBMEIsaUJBQ3BDdHpCLEtBQUswekIsaUJBQ0wxekIsS0FBSzJ6QixpQkFDTDN6QixLQUFLNHpCLGlCQUNMNXpCLEtBQUs2ekI7WUFFVCxNQUFNQyxtQkFBcUUsRUFDekUsRUFDRSxTQUNDOXpCLEtBQUt5ekIsaUJBQWlCaDRCLGFBRXpCLEVBQUMsT0FBT3VFLEtBQUsyekIsZUFDYixFQUFDLE9BQU8zekIsS0FBSzB6QixlQUNiLEVBQUMsT0FBTzF6QixLQUFLNHpCLGVBQ2IsRUFBQyxZQUFZNXpCLEtBQUs2ekI7WUFHcEIsS0FBSyxPQUFPVixNQUFNbkQsYUFBYThELGtCQUFrQjtnQkFDL0MsTUFBTWhRLFlBQVlrTSxXQUFXdm9CLE9BQU91b0IsWUFBWXYwQjtnQkFDaEQsTUFBTXdpQixPQUFPamUsS0FBS2d6QiwwQkFBMEJHLE1BQU1yUDtnQkFDbEQsSUFBSTdGLE1BQU0sT0FBT2plLEtBQUtrekIscUJBQXFCalY7QUFDN0M7WUFFQSxJQUFJdVYsZ0JBQWdCO2dCQUNsQixNQUFNLElBQUl6QixLQUFBQSxXQUNSLDRDQUE0QzczQixvQkFBQUEsTUFBTXVILFVBQ2hEekIsS0FBS2d1QjtBQUdYO1lBQ0EsT0FBT3Z5QjtBQUNUO1FBS1EseUJBQUF1M0IsQ0FDTkcsTUFDQXJQO1lBRUEsS0FBSzlqQixLQUFLZ3VCLGNBQWMsT0FBT3Z5QjtZQUMvQixNQUFNczRCLFFBQVFDLFdBQUFBLGlCQUFpQmgwQixLQUFLZ3VCLGNBQWNtRixNQUFNclA7WUFDeEQsS0FBS2lRLE1BQU1uNEIsUUFBUSxPQUFPSDtZQUMxQixNQUFNb21CLE9BQU9rUyxNQUFNO1lBQ25CLE1BQU10eUIsWUFBWXZILG9CQUFBQSxNQUFNdUgsVUFBVXpCLEtBQUtndUI7WUFDdkMsTUFBTWlHLFdBQVdDLFdBQUFBLGlCQUFpQnp5QixXQUFXb2dCLEtBQUtpQyxXQUFXcVAsTUFBTXRSO1lBQ25FLE1BQU1zUyxPQUFPdFMsS0FBS3NTLFFBQVFDLFdBQUFBLHNCQUFzQjN5QixXQUFXd3lCO1lBQzNELE1BQU1sbUIsVUFBK0I7Z0JBQ25DMGIsUUFBUTVILEtBQUs0SCxXQUFXaHVCLFlBQVksUUFBUW9tQixLQUFLd1M7O1lBRW5ELElBQUlsQixTQUFTLGNBQWNBLFNBQVMsV0FBV3BsQixRQUFRaWIsUUFBUTtZQUMvRCxPQUFPO2dCQUNMbUs7Z0JBQ0F0UjtnQkFDQVksWUFBWTtvQkFDVjBSO29CQUNBRyxNQUFNTDtvQkFDTmxtQjs7O0FBR047UUFLUSxvQkFBQW1sQixDQUNOalY7WUFFQSxPQUFPO2dCQUNMK1IsVUFBVSxDQUFBO2dCQUNWUixXQUFXO2dCQUNYRCxlQUFldFI7O0FBRW5CO1FBS1EsZ0JBQUFzVztZQUNOLE9BQU92MEIsS0FBS2xCO0FBQ2Q7UUFLUSxzQkFBTTJ3QixDQUNaeFIsTUFDQXZiO1lBRUEsS0FBSzFDLEtBQUt3MEIsZ0JBQWdCdlcsT0FBTztnQkFDL0IsT0FBT2plLEtBQUt5MEIsY0FBaUJ4VyxNQUFNdmI7QUFDckM7WUFDQSxNQUFNZ3lCLGdCQUFnQjEwQixLQUFLdTBCO1lBQzNCLE1BQU1JLFdBQVcxVztZQUNqQixNQUFNN0IsaUJBQWlCc1ksY0FBY0osS0FDbkNLLFNBQVNsUyxXQUFXMFIsTUFDcEJRLFNBQVNsUyxXQUFXNlIsTUFDcEJLLFNBQVNsUyxXQUFXMVUsU0FDcEJyTDtZQUVGLE9BQU8xQyxLQUFLNDBCLG9CQUF1QjNXLE1BQU03QjtBQUMzQztRQUtRLG1CQUFNcVksQ0FDWnhXLE1BQ0F2YjtZQUVBLElBQUl1YixLQUFLa1YsU0FBUyxPQUNoQixNQUFNLElBQUlwQixLQUFBQSxXQUFXO1lBQ3ZCLE1BQU0yQyxnQkFBZ0IxMEIsS0FBS3UwQjtZQUMzQixPQUFPTSxTQUFTQyxhQUFhLEVBQUM3VyxLQUFLbVYsZUFBZW5WLEtBQUtvVjtZQUN2RCxPQUFPMEIsYUFBYUMsdUJBQXVCbnhCLFFBQVFDLElBQUksRUFDckQ0d0IsY0FBY0osS0FDWk8sUUFBUVYsTUFDUlUsUUFBUVAsTUFDUk8sUUFBUTltQixTQUNSckwsTUFFRmd5QixjQUFjSixLQUNaUSxVQUFVWCxNQUNWVyxVQUFVUixNQUNWUSxVQUFVL21CLFNBQ1ZyTDtZQUdKLE1BQU11eUIsTUFBTUYsWUFBWUcsT0FBTyxJQUFJbHpCLFNBQVM7WUFDNUMsTUFBTXdILFFBQVF3ckIsY0FBY0UsT0FBTyxJQUFJbHpCLFNBQVM7WUFDaEQsS0FBS3dILE9BQU8sT0FBTztZQUNuQixPQUFReXJCLE1BQU16ckI7QUFDaEI7UUFLUSxtQkFBQW9yQixDQUNOM1csTUFDQTdCO1lBRUEsSUFBSTZCLEtBQUtrVixTQUFTLE9BQ2hCLE1BQU0sSUFBSXBCLEtBQUFBLFdBQ1I7WUFFSixNQUFNbUQsT0FBTzlZLFNBQVM4WSxRQUFRO1lBQzlCLE1BQU1QLFdBQVcxVztZQUNqQixNQUFNNEQsT0FBTzhTLFNBQVM5UztZQUN0QixJQUFJOFMsU0FBU3BCLGVBQWU7Z0JBQzFCLE9BQVEyQixLQUFLdDVCLFVBQVU7QUFDekI7WUFDQSxJQUFJKzRCLFNBQVN4QixTQUFTLGNBQWN3QixTQUFTeEIsU0FBUyxXQUFXO2dCQUMvRCxPQUFPK0IsS0FBS2w0QixJQUFLbTRCLE9BQVFBLElBQUlyMEIsT0FBT3EwQixJQUFJbnpCO0FBQzFDO1lBQ0EsSUFBSTZmLEtBQUt3UyxZQUFZO2dCQUNuQixPQUFPYSxLQUFLbDRCLElBQUttNEIsT0FBUUEsSUFBSW56QixTQUFTbXpCLElBQUkvN0IsT0FBTys3QjtBQUNuRDtZQUNBLEtBQUtELEtBQUt0NUIsUUFBUTtnQkFDaEIsT0FBUSs0QixTQUFTeEIsU0FBUyxVQUFVLElBQUk7QUFDMUM7WUFDQSxPQUFRK0IsS0FBSyxHQUFHbHpCLFNBQVNrekIsS0FBSyxHQUFHcDBCLE9BQU87QUFDMUM7UUFLUSxlQUFBMHpCLENBQ052VztZQUVBLE9BQU9BLEtBQUtrVixTQUFTO0FBQ3ZCOzs7SUNuZUksTUFBT2lDLDRCQUE0QkMsS0FBQUE7O1lBU3hCcjFCLEtBQUFtSixVQUFVLElBQUlDLFlBQVk7QUFBUTs7WUFFbENwSixLQUFBa0osYUFBYSxJQUFJbEI7QUFBbUI7O1lBRWxDaEksS0FBQW1CLE1BQU1rZCxRQUFBQSxRQUFRMWQsSUFBSXkwQjtBQUFxQjtRQVd4RCxXQUFBdjJCLENBQVlzUCxRQUFvQjhmO1lBQzlCL3VCLE1BQ0VuRixPQUFPNEQsT0FBTyxDQUFBLEdBQUk0dUIsMEJBQTBCcGUsU0FDNUMzQixlQUNBeWhCO1lBYmVqdUIsS0FBQWtKLGFBQ2pCa3NCLG9CQUFvQmxzQjtBQWN0QjtRQUVTLFNBQUF1a0IsQ0FDUHZ3QjtZQUVBLE9BQU8sSUFBSXN3QixzQkFBc0J4dEIsTUFBTTlDO0FBQ3pDO1FBRUEsU0FBQTBCLENBQ0VHLE9BQ0FDLE1BQ0FDO1lBRUEsT0FBTyxJQUFJTixzQkFBc0JxQixNQUFNakIsT0FBT0MsTUFBTUM7QUFDdEQ7UUFFbUIsV0FBTXlCLENBQ3ZCNDBCLFdBQ0Fyd0IsT0FDQXZFLFVBQ0duQjtZQUVILE1BQU1nMkIsY0FBY3g3QixPQUFPNEQsT0FBTyxDQUFBLEdBQUlxQyxLQUFLbU8sUUFBUXpOO1lBQ25ELE1BQU05RixJQUFJYixPQUFPNEQsYUFDVHVCLE1BQU13QixNQUFNNDBCLFdBQVdyd0IsT0FBT3N3QixnQkFBZ0JoMkI7WUFFdEQsT0FBTzNFO0FBQ1Q7UUFFUyxhQUFNdW9CLENBQ2JtUyxXQUNBcDRCLFdBQ0ErSCxVQUNHMUY7WUFFSCxNQUFNNEIsTUFBTW5CLEtBQUttQixJQUFJUixJQUFJWCxLQUFLbWpCO1lBQzlCaGlCLElBQUlxMEIsTUFDRiw0QkFBNEJGLDBCQUEwQnJ3QixRQUFTdkYsTUFBTUMsUUFBUXNGLFNBQVNBLE1BQU1qSSxJQUFLcEUsS0FBTXNCLG9CQUFBQSxNQUFNdUgsVUFBVTdJLE1BQU1zQixvQkFBQUEsTUFBTXVILFVBQVV3RCxTQUFVLGNBQWMvSCxhQUFhbkQsT0FBTzhNLEtBQUszSixhQUFhbkQsT0FBTzhNLEtBQUszSixXQUFXdEIsU0FBUztZQUU3TyxJQUFJOEcsTUFBTW5ELEtBQUtrMkI7WUFDZixXQUFXL3lCLFFBQVEsaUJBQWlCQSxlQUFlb0ksS0FBQUEsVUFBVTtnQkFDM0R2TCxLQUFLeEUsS0FBSzJIO2dCQUNWQSxNQUFNakg7QUFDUjtZQUVBeUIsWUFBWXdGLE1BQ1IzSSxPQUFPNEQsT0FBTyxDQUFBLEdBQUkrRSxJQUFJZ3pCLGVBQWV4NEIsYUFDckNBO1lBQ0osTUFBTXdELGNBQWNWLEtBQUtVLGFBQ2hCNDBCLGNBQWMsV0FBV0EsWUFBWUEsVUFBVXo3QixNQUN0RG9MLE9BQ0EvSCxjQUNHLEtBQUlxQyxNQUFNbUQsTUFBSzFJLE9BQU9nc0I7WUFHM0IsSUFBSXRqQixLQUFLO2dCQUNQLE1BQU1BLGVBQWUxQyxLQUFLOEssVUFBVTtvQkFDbEMsTUFBTTZxQixVQUFTLElBQUkzMUIsS0FBSzhLLFNBQVU1RCxXQUFXOzJCQUN4Q3hFLElBQUk7MkJBQ0poQzt3QkFDSGsxQixlQUFlbHpCOztvQkFFakJBLElBQUl3RSxXQUFXO3dCQUNiMnVCLGVBQWUsS0FDVG56QixJQUFJYyxlQUFlLG9CQUFvQixJQUMzQ215Qjs7b0JBR0osT0FBT0E7QUFDVDtnQkFDQSxNQUFNRyxZQUFZcHpCLElBQUljLGVBQWU7Z0JBQ3JDLE1BQU11eUIsZUFBZXJ6QixJQUFJYyxlQUFlO2dCQUN4QyxLQUNHc3lCLGFBQ0RBLGNBQWNSLGFBQ2Jyd0IsU0FBU0EsVUFBVTh3QixjQUNwQjtvQkFDQSxNQUFNSixVQUFTLElBQUkzMUIsS0FBSzhLLFNBQVU1RCxXQUFXOzJCQUN4Q3hFLElBQUk7MkJBQ0poQzt3QkFDSGsxQixlQUFlbHpCOztvQkFHakJBLElBQUl3RSxXQUFXO3dCQUNiMnVCLGVBQWUsS0FDVG56QixJQUFJYyxlQUFlLG9CQUFvQixJQUMzQ215Qjs7b0JBR0osT0FBT0E7QUFDVDtnQkFDQSxPQUFPanpCLElBQUl3RSxXQUFXeEc7QUFDeEI7WUFFQSxRQUFPLElBQUlWLEtBQUs4SyxTQUFVNUQsV0FBVzttQkFDaEN4Rzs7QUFFUDtRQVFBLE1BQUFzQyxDQUFPcEQ7WUFDTCxPQUFPdzFCLG9CQUFvQmpzQixRQUFRbkcsT0FBT3BEO0FBQzVDO1FBRVMsVUFBQW8yQjtZQU1QLE9BQU9uMkI7QUFDVDtRQUVVLFlBQUFvMkIsQ0FDUmgzQixPQUNBcUcsSUFDQUwsVUFDRzFGO1lBRUgsT0FBTTZCLFNBQUVBLFdBQVlwQixLQUFLcUIsT0FBTzlCLE1BQU1TLEtBQUtpMkI7WUFDM0MsTUFBTXgwQixZQUFZdkgsb0JBQUFBLE1BQU11SCxVQUFVeEM7WUFDbEMsTUFBTW9HLFNBQThCLENBQUE7WUFDcENBLE9BQU9qQyxXQUFBQSxZQUFZQyxTQUFTNUI7WUFDNUIxSCxPQUFPNEQsT0FBTzBILFFBQVFKO1lBQ3RCLE9BQU8sRUFBQ2hHLE9BQU9xRyxJQUFJRCxXQUFXakU7QUFDaEM7UUFXVSxlQUFBc0UsQ0FDUnpHLE9BQ0FzSCxLQUNBWixXQUNHcEc7WUFFSCxNQUFNa0MsWUFBWXZILG9CQUFBQSxNQUFNdUgsVUFBVXhDO1lBQ2xDLElBQUlzSCxJQUFJM0ssV0FBVytKLE9BQU8vSixRQUN4QixNQUFNLElBQUk2QixhQUFBQSxjQUFjO1lBQzFCLE9BQU0yRCxTQUFFQSxXQUFZcEIsS0FBS3FCLE9BQU85QixNQUFNUyxLQUFLMEY7WUFDM0MsTUFBTW9CLFVBQVVQLElBQUl2SixJQUFJLENBQUNzSSxJQUFJa0U7Z0JBQzNCLE1BQU1uRSxTQUE4QixDQUFBO2dCQUNwQ0EsT0FBT2pDLFdBQUFBLFlBQVlDLFNBQVM1QjtnQkFDNUIxSCxPQUFPNEQsT0FBTzBILFFBQVFNLE9BQU82RDtnQkFDN0IsT0FBT25FOztZQUVULE9BQU8sRUFBQ3BHLE9BQU9zSCxLQUFLTyxZQUFZMUY7QUFDbEM7UUFFVSxlQUFBODBCLENBQ1JqM0IsT0FDQXNILEtBQ0FaLFdBQ0dwRztZQUVILE1BQU1rQyxZQUFZdkgsb0JBQUFBLE1BQU11SCxVQUFVeEM7WUFDbEMsSUFBSXNILElBQUkzSyxXQUFXK0osT0FBTy9KLFFBQ3hCLE1BQU0sSUFBSTZCLGFBQUFBLGNBQWM7WUFDMUIsT0FBTTJELFNBQUVBLFdBQVlwQixLQUFLcUIsT0FBTzlCLE1BQU1TLEtBQUtrMkI7WUFDM0MsTUFBTXB2QixVQUFVUCxJQUFJdkosSUFBSTtnQkFDdEIsTUFBTXFJLFNBQThCLENBQUE7Z0JBQ3BDQSxPQUFPakMsV0FBQUEsWUFBWUMsU0FBUzVCO2dCQUM1QixPQUFPNEQ7O1lBRVQsT0FBTyxFQUFDcEcsT0FBT3NILEtBQUtPLFlBQVkxRjtBQUNsQztRQVdTLGVBQU1rRixDQUNickgsT0FDQXNILEtBQ0FaLFdBQ0dwRztZQUVILElBQUlnSCxJQUFJM0ssV0FBVytKLE9BQU8vSixRQUN4QixNQUFNLElBQUk2QixhQUFBQSxjQUFjO1lBRTFCLE1BQU0yRCxVQUFVLEtBQUs3QjtZQUNyQixNQUFNZ0csWUFBWW5FLFFBQVErMEI7WUFDMUIsT0FBTWgxQixLQUFFQSxLQUFHdUIsS0FBRUEsT0FBUTFDLEtBQUtxQixPQUN4QkQsU0FDQXBCLEtBQUtzRztZQUVQLE1BQU03RSxZQUFZdkgsb0JBQUFBLE1BQU11SCxVQUFVeEM7WUFFbENrQyxJQUFJOGMsS0FBSyxVQUFVMVgsSUFBSTNLLHFCQUFxQjZGO1lBQzVDTixJQUFJSyxRQUFRLFFBQVErRTtZQUNwQixNQUFNNnZCLGVBQWU3d0IsYUFBYXhMLE9BQU84TSxLQUFLdEIsV0FBVzNKLFNBQVM7WUFDbEUsTUFBTXk2QixtQkFDSkQsZ0JBQWdCcDJCLEtBQUtzMkIsNEJBQTRCNXpCO1lBQ25ELE1BQU02ekIsbUJBQW1CSCxlQUFlO2dCQUFFMzBCLENBQUNBLFlBQVk4RDtnQkFBYyxDQUFBO1lBRXJFLE1BQU1qTCxlQUFlMEYsS0FBS3lLLGtCQUN4Qi9ILEtBQ0E4ekIsYUFBQUEsc0JBQXNCQyxZQUN0QixFQUNFbDdCLEtBQUtDLFVBQ0htSyxPQUFPM0ksSUFBS3BFLEtBQU1vSCxLQUFLa0osV0FBV0YsVUFBVXBRLEdBQUdxRyxNQUFNcEYsV0FHekQwOEIsa0JBQ0F2MkIsS0FBSzAyQiwwQkFBMEJoMEIsTUFDL0J6RCxNQUFNcEY7WUFHUixJQUFJODhCO1lBQ0o7Z0JBQ0VBLE1BQU1wN0IsS0FBS3dILE1BQU0vQyxLQUFLZ0QsT0FBTzFJLFNBQVMwQyxJQUFLbUcsS0FBVzVILEtBQUt3SCxNQUFNSTtBQUNuRSxjQUFFLE9BQU9sSjtnQkFDUCxNQUFNLElBQUlzTyxhQUFBQSxtQkFBbUJ0TztBQUMvQjtZQUVBLElBQ0UrRixLQUFLNDJCLHdCQUNIMzNCLE9BQ0F5RCxLQUNBMnpCLGtCQUNBTSxJQUFJLEdBQUd6OEIsb0JBQUFBLE1BQU1xTixHQUFHdEksV0FBcUJzSCxJQUFJLEtBRTNDO2dCQUNBLE9BQU92RyxLQUFLNEcsUUFDVjNILE9BQ0E4TSxXQUNFOU0sT0FDQTBHLE9BQU8zSSxJQUFJLENBQUNwRSxHQUFHK04sTUFDYnpNLG9CQUFBQSxNQUFNbzNCLE1BQU12M0IsT0FBTzRELE9BQU8sQ0FBQSxHQUFJL0UsR0FBVTJNLFVBQVVvQixNQUFNLENBQUEsSUFBS2d3QixJQUFJaHdCLE1BRW5FSixNQUVGN0Q7QUFFSjtZQUVBLE9BQU9pMEI7QUFDVDtRQVNTLGFBQU0vdkIsQ0FDYjNILE9BQ0FzSCxRQUNHaEg7WUFFSCxPQUFNNEIsS0FBRUEsS0FBR3VCLEtBQUVBLE9BQVExQyxLQUFLcUIsT0FBTzlCLE1BQU1TLEtBQUs0RztZQUM1QyxNQUFNbkYsWUFBWXZILG9CQUFBQSxNQUFNdUgsVUFBVXhDO1lBQ2xDa0MsSUFBSThjLEtBQUssV0FBVzFYLElBQUkzSyxxQkFBcUI2RjtZQUM3Q04sSUFBSUssUUFBUSxRQUFRK0U7WUFDcEIsTUFBTWpNLGVBQWUwRixLQUFLaUQsb0JBQ3hCUCxLQUNBOHpCLGFBQUFBLHNCQUFzQkssVUFDdEIsRUFBQ3Q3QixLQUFLQyxVQUFVK0ssUUFDaEI5SyxXQUNBQSxXQUNBd0QsTUFBTXBGO1lBRVI7Z0JBQ0UsT0FBTzBCLEtBQUt3SCxNQUFNL0MsS0FBS2dELE9BQU8xSSxTQUFTMEMsSUFBS21HLEtBQVc1SCxLQUFLd0gsTUFBTUk7QUFDcEUsY0FBRSxPQUFPbEo7Z0JBQ1AsTUFBTSxJQUFJc08sYUFBQUEsbUJBQW1CdE87QUFDL0I7QUFDRjtRQVdTLGVBQU04TSxDQUNiOUgsT0FDQXNILEtBQ0FaLFdBQ0dwRztZQUVILElBQUlnSCxJQUFJM0ssV0FBVytKLE9BQU8vSixRQUN4QixNQUFNLElBQUk2QixhQUFBQSxjQUFjO1lBQzFCLE1BQU0yRCxVQUFVLEtBQUs3QjtZQUNyQixNQUFNZ0csWUFBWW5FLFFBQVErMEI7WUFDMUIsT0FBTWgxQixLQUFFQSxLQUFHdUIsS0FBRUEsT0FBUTFDLEtBQUtxQixPQUN4QkQsU0FDQXBCLEtBQUsrRztZQUVQLE1BQU10RixZQUFZdkgsb0JBQUFBLE1BQU11SCxVQUFVeEM7WUFDbENrQyxJQUFJOGMsS0FBSyxZQUFZMVgsSUFBSTNLLHFCQUFxQjZGO1lBQzlDTixJQUFJSyxRQUFRLFFBQVErRTtZQUNwQixNQUFNNnZCLGVBQWU3d0IsYUFBYXhMLE9BQU84TSxLQUFLdEIsV0FBVzNKLFNBQVM7WUFDbEUsTUFBTXk2QixtQkFDSkQsZ0JBQWdCcDJCLEtBQUtzMkIsNEJBQTRCNXpCO1lBQ25ELE1BQU02ekIsbUJBQW1CSCxlQUFlO2dCQUFFMzBCLENBQUNBLFlBQVk4RDtnQkFBYyxDQUFBO1lBRXJFLE1BQU1qTCxlQUFlMEYsS0FBS3lLLGtCQUN4Qi9ILEtBQ0E4ekIsYUFBQUEsc0JBQXNCTSxZQUN0QixFQUNFdjdCLEtBQUtDLFVBQ0htSyxPQUFPM0ksSUFBS3BFLEtBQU1vSCxLQUFLa0osV0FBV0YsVUFBVXBRLEdBQUdxRyxNQUFNcEYsV0FHekQwOEIsa0JBQ0F2MkIsS0FBSzAyQiwwQkFBMEJoMEIsTUFDL0J6RCxNQUFNcEY7WUFHUixJQUFJODhCO1lBQ0o7Z0JBQ0VBLE1BQU1wN0IsS0FBS3dILE1BQU0vQyxLQUFLZ0QsT0FBTzFJLFNBQVMwQyxJQUFLbUcsS0FBVzVILEtBQUt3SCxNQUFNSTtBQUNuRSxjQUFFLE9BQU9sSjtnQkFDUCxNQUFNLElBQUlzTyxhQUFBQSxtQkFBbUJ0TztBQUMvQjtZQUVBLElBQUkrRixLQUFLNDJCLHdCQUF3QjMzQixPQUFPeUQsS0FBSzJ6QixrQkFBa0I5dkIsSUFBSSxLQUFLO2dCQUN0RSxPQUFPdkcsS0FBSzRHLFFBQ1YzSCxPQUNBOE0sV0FDRTlNLE9BQ0EwRyxPQUFPM0ksSUFBSSxDQUFDcEUsR0FBRytOLE1BQ2J6TSxvQkFBQUEsTUFBTW8zQixNQUFNdjNCLE9BQU80RCxPQUFPLENBQUEsR0FBSS9FLEdBQVUyTSxVQUFVb0IsTUFBTSxDQUFBLElBQUtnd0IsSUFBSWh3QixNQUVuRUosTUFFRjdEO0FBRUo7WUFDQSxPQUFPaTBCO0FBQ1Q7UUFVUyxlQUFNSSxDQUNiOTNCLE9BQ0FzSCxRQUNHaEg7WUFFSCxPQUFNNEIsS0FBRUEsS0FBR3VCLEtBQUVBLEtBQUd0QixTQUFFQSxXQUFZcEIsS0FBS3FCLE9BQU85QixNQUFNUyxLQUFLKzJCO1lBQ3JELE1BQU10MUIsWUFBWXZILG9CQUFBQSxNQUFNdUgsVUFBVXhDO1lBRWxDLE1BQU1vM0IsbUJBQ0puOEIsb0JBQUFBLE1BQU11bUIsWUFBWXhoQixVQUFVZSxLQUFLczJCLDRCQUE0QjV6QjtZQUMvRCxJQUFJcEk7WUFDSixNQUFNMDhCLGdCQUFnQmgzQixLQUFLNDJCLHdCQUN6QjMzQixPQUNBeUQsS0FDQTJ6QixrQkFDQTl2QixJQUFJO1lBRU4sSUFBSXl3QixlQUFlO2dCQUNqQjE4QixlQUFlMEYsS0FBSzRHLFFBQVEzSCxPQUFPc0gsUUFBUW5GO0FBQzdDO1lBRUFELElBQUk4YyxLQUFLLFlBQVkxWCxJQUFJM0sscUJBQXFCNkY7WUFDOUNOLElBQUlLLFFBQVEsUUFBUStFO1lBQ3BCLE1BQU1vd0IsWUFBWTMyQixLQUFLeUssa0JBQ3JCL0gsS0FDQTh6QixhQUFBQSxzQkFBc0JTLFlBQ3RCLEVBQUMxN0IsS0FBS0MsVUFBVStLLFFBQ2hCOUssV0FDQXVFLEtBQUswMkIsMEJBQTBCaDBCLE1BQy9CekQsTUFBTXBGO1lBRVI7Z0JBQ0UsT0FBT205QixnQkFDSDE4QixTQUNBaUIsS0FBS3dILE1BQU0vQyxLQUFLZ0QsT0FBTzJ6QixNQUFNMzVCLElBQUttRyxLQUFXNUgsS0FBS3dILE1BQU1JO0FBQzlELGNBQUUsT0FBT2xKO2dCQUNQLE1BQU0sSUFBSXNPLGFBQUFBLG1CQUFtQnRPO0FBQy9CO0FBQ0Y7UUFXUyxPQUFBa0YsQ0FDUDhGLFVBQ0cxRjtZQUVILE9BQU00QixLQUFFQSxLQUFHdUIsS0FBRUEsT0FBUTFDLEtBQUtxQixPQUFPOUIsTUFBTVMsS0FBS2I7WUFDNUMsTUFBTWlyQixRQUFRbHdCLG9CQUFBQSxNQUFNc21CLFVBQVV2YjtZQUM5QixJQUFLQSxNQUFjdEMscUJBQWdCdTBCLFdBQVc7Z0JBQzVDLzFCLElBQUlxMEIsTUFDRiwwQ0FBMkN2d0IsTUFBY3RDLHFCQUFnQnUwQjtnQkFFM0VuOUIsT0FBTzBwQixlQUFlMkcsTUFBTW5sQixPQUFPdEMsS0FBQUEsZ0JBQWdCdTBCLFVBQVU7b0JBQzNEeFQsWUFBWTtvQkFDWkMsVUFBVTtvQkFDVkMsY0FBYztvQkFDZDVoQixPQUFRaUQsTUFBY3RDLEtBQUFBLGdCQUFnQnUwQjs7QUFFMUM7WUFFQSxNQUFNcjVCLGFBQWEzRCxvQkFBQUEsTUFBTTRELFdBQVdtSDtZQUNwQyxJQUFJcEgsWUFBWTtnQkFDZCxNQUFNczVCLFlBQVl0NUIsV0FBV25CO2dCQUM3QixLQUFLeTZCLFdBQVcsTUFBTSxJQUFJMTVCLGFBQUFBLGNBQWM7Z0JBQ3hDLElBQUkyNUIsT0FBT3AzQixLQUFLMDJCLDBCQUEwQmgwQixRQUFRO2dCQUNsRDAwQixPQUFPMTNCLE1BQU1DLFFBQVF5M0IsUUFBUUEsT0FBTyxFQUFDQTtnQkFDckMsTUFBTUMsU0FBUyxLQUFJLElBQUlqUCxJQUFJLEtBQUlnUCxNQUFNRDtnQkFDckN6MEIsSUFBSXdFLFdBQVc7b0JBQ2Jvd0IsZUFBZUQ7b0JBQ2ZFLHdCQUF3QkY7b0JBQ3hCbHdCLFFBQVE7O0FBRVo7WUFFQSxPQUFPO2dCQUNMOUIsUUFBUStrQixNQUFNbmxCO2dCQUNkQSxPQUFPbWxCLE1BQU1ubEI7Z0JBQ2JLLElBQUlMLE1BQU0vSyxvQkFBQUEsTUFBTXFOLEdBQUd0QyxNQUFNcEc7Z0JBQ3pCMEcsV0FBVzZrQixNQUFNN2tCO2dCQUNqQnhILFVBQVVxc0IsTUFBTXJzQjtnQkFDaEJNLFFBQVErckIsTUFBTS9yQjs7QUFFbEI7UUFFUyxNQUFBbUgsQ0FDUC9GLEtBQ0FSLE9BQ0FxRyxJQUNBQyxjQUNHaEc7WUFFSCxPQUFNNEIsS0FBRUEsS0FBR3VCLEtBQUVBLE9BQVExQyxLQUFLcUIsT0FBTzlCLE1BQU1TLEtBQUt3RjtZQUM1QyxJQUNFRCxhQUNBdkYsS0FBS3czQiwyQkFDSDkwQixLQUNBQSxJQUFJYyxlQUFlLGVBRXJCO2dCQUNBckMsSUFBSUssUUFDRixtQ0FBbUN6SCxPQUFPOE0sS0FBS3RCLFdBQVc5TCxLQUFLO2dCQUVqRU0sT0FBTzYyQixRQUFRcnJCLFdBQ1p2TCxPQUFPLEVBQUMsRUFBR3k5QixjQUFjQSxNQUFNLGFBQy9CdCtCLFFBQVEsRUFBRTJILEtBQUsydkI7b0JBQ2QsSUFBSTN2QixPQUFPckIsT0FBUUEsSUFBWXFCLFNBQVNyRixXQUN0QzBGLElBQUkwdkIsS0FDRix3QkFBd0IvdkI7b0JBRTNCckIsSUFBVXFCLE9BQWtCMnZCOztBQUVuQztZQUVBLE1BQU1uMkIsU0FBUyxJQUFLMkUsTUFBeUJRO1lBRTdDLE9BQU9uRjtBQUNUO1FBRVEsMEJBQUFrOUIsQ0FDTjkwQixLQUNBNHlCO1lBRUEsS0FBSzV5QixLQUFLLE9BQU87WUFDakIsSUFBSUEsSUFBSWMsZUFBZSx5QkFBeUIsT0FBTztZQUN2RCxNQUFNazBCLHNCQUNJaDFCLElBQVlpMUIsb0JBQW9CLGFBQ25DajFCLElBQVlpMUIsZ0JBQWdCLDBCQUM3Qmw4QjtZQUNOLElBQUlpOEIsY0FBYyxPQUFPO1lBQ3pCLE1BQU1FLGFBQWE1M0IsS0FBSzYzQixpQkFBaUJuMUIsS0FBSzR5QjtZQUM5QyxLQUFLc0MsWUFBWSxPQUFPO1lBQ3hCLE1BQU1yRyxLQUFLcUcsV0FBV2x0QixXQUFXaWtCO1lBQ2pDLE9BQ0U0QyxHQUFHbnpCLFNBQVMsV0FDWm16QixHQUFHbnpCLFNBQVMsV0FDWm16QixHQUFHbnpCLFNBQVMsWUFDWm16QixHQUFHbnpCLFNBQVMsZ0JBQ1ptekIsR0FBR256QixTQUFTO0FBRWhCO1FBRVEsZ0JBQUF5NUIsQ0FDTm4xQixLQUNBNHlCO1lBRUEsSUFBSUEsV0FBVyxPQUFPQTtZQUN0QixXQUFZNXlCLElBQVlpMUIsb0JBQW9CLFlBQVk7Z0JBQ3RELE9BQVFqMUIsSUFBWWkxQixnQkFBZ0I7QUFDdEM7WUFDQSxPQUFPbDhCO0FBQ1Q7UUFFUSx1QkFBQW03QixDQUNOMzNCLE9BQ0F5RCxLQUNBMHpCLGNBQ0E5d0I7WUFFQSxLQUFLOHdCLGNBQWMsT0FBTztZQUMxQixNQUFNN3VCLEtBQUtyTixvQkFBQUEsTUFBTXFOLEdBQUd0STtZQUNwQixNQUFNK00sV0FBVzlSLG9CQUFBQSxNQUFNOFIsU0FBUy9NLE9BQU9zSTtZQUN2QyxNQUFNd2MsWUFBWTdwQixvQkFBQUEsTUFBTTZwQixVQUFVOWtCLE9BQU9zSTtZQUN6QyxNQUFNdXdCLFFBQVF4eUIsT0FBTzdKLGFBQWE2SixPQUFPO1lBQ3pDLEtBQUt3eUIsU0FBUzlyQixVQUFVLE9BQU87WUFDL0IsS0FBSzhyQixTQUFTL1QsV0FBVztnQkFDdkJyaEIsSUFBSXNLLE9BQU82akIsS0FDVDtnQkFFRixPQUFPO0FBQ1Q7WUFDQSxPQUFPaUg7QUFDVDtRQUVRLHlCQUFBcEIsQ0FDTmgwQjtZQUVBLE1BQU1xMUIsU0FDSnIxQixJQUFJYyxlQUFlLG9CQUNsQmQsSUFBSWMsZUFBZTtZQUN0QixJQUFJdTBCLFVBQVVBLE9BQU9uOEIsUUFBUSxPQUFPbThCO1lBQ3BDLE9BQ0dyMUIsSUFBSWkxQixnQkFBZ0Isb0JBQ3BCajFCLElBQUlpMUIsZ0JBQWdCO0FBRXpCO1FBRVEsMkJBQUFyQixDQUVONXpCO1lBRUEsU0FBUzFDLEtBQUttTyxPQUFPMGU7QUFDdkI7UUFhUyxZQUFNN25CLENBQ2IvRixPQUNBcUcsSUFDQUwsT0FDQU0sWUFBaUMsQ0FBQSxNQUM5QmhHO1lBRUgsTUFBTTZCLFVBQVUsS0FBSzdCO1lBQ3JCLE9BQU00QixLQUFFQSxLQUFHdUIsS0FBRUEsT0FBUTFDLEtBQUtxQixPQUN4QkQsU0FDQXBCLEtBQUtnRjtZQUVQLE1BQU12RCxZQUFZdkgsb0JBQUFBLE1BQU11SCxVQUFVeEM7WUFDbENrQyxJQUFJSyxRQUFRLG1CQUFtQkM7WUFDL0JOLElBQUkrRCxNQUFNLE9BQU9JO1lBQ2pCLE1BQU04d0IsZUFBZTd3QixhQUFheEwsT0FBTzhNLEtBQUt0QixXQUFXM0osU0FBUztZQUNsRSxNQUFNeTZCLG1CQUNKRCxnQkFBZ0JwMkIsS0FBS3MyQiw0QkFBNEI1ekI7WUFDbkQsTUFBTTZ6QixtQkFBbUJILGVBQWU7Z0JBQUUzMEIsQ0FBQ0EsWUFBWThEO2dCQUFjLENBQUE7WUFDckUsTUFBTWpMLGVBQWUwRixLQUFLeUssa0JBQ3hCL0gsS0FDQWdCLGFBQUFBLGNBQWNrQyxRQUNkLEVBQUM1RixLQUFLa0osV0FBV0YsVUFBVS9ELE9BQU9oRyxNQUFNcEYsU0FDeEMwOEIsa0JBQ0F2MkIsS0FBSzAyQiwwQkFBMEJoMEIsTUFDL0J6RCxNQUFNcEY7WUFFUixNQUFNbStCLGVBQWVoNEIsS0FBS2tKLFdBQVdSLFlBQVkxSSxLQUFLZ0QsT0FBTzFJO1lBQzdELElBQUkwRixLQUFLNDJCLHdCQUF3QjMzQixPQUFPeUQsS0FBSzJ6QixrQkFBa0Ivd0IsS0FBSztnQkFDbEUsT0FBT3RGLEtBQUtpZCxLQUNWaGUsT0FDQThNLFdBQ0U5TSxPQUNBL0Usb0JBQUFBLE1BQU1vM0IsTUFDSnYzQixPQUFPNEQsT0FBTyxDQUFBLEdBQUlzSCxPQUFPTSxhQUFhLEtBQ3RDeXlCLGNBQ0EvNEIsUUFFRnFHLEtBRUY1QztBQUVKO1lBQ0EsT0FBT3MxQjtBQUNUO1FBSUEsaUJBQU1qekIsQ0FDSjlGLFVBQ0dNO1lBRUgsT0FBTTRCLEtBQUVBLEtBQUd1QixLQUFFQSxPQUFRMUMsS0FBS3FCLE9BQU85QixNQUFNUyxLQUFLK0U7WUFDNUMsTUFBTXRELFlBQVl2SCxvQkFBQUEsTUFBTXVILFVBQVV4QztZQUVsQ2tDLElBQUlLLFFBQVEsc0JBQXNCQztZQUNsQyxNQUFNbkgsZUFBZTBGLEtBQUtpRCxvQkFDeEJQLEtBQ0EsZUFDQSxJQUNBakgsV0FDQUEsV0FDQXdELE1BQU1wRjtZQUVSLE9BQU8wQixLQUFLd0gsTUFBTS9DLEtBQUtnRCxPQUFPMUk7QUFDaEM7UUFXTSxVQUFBMmlCLENBQ0poZSxPQUNBcUcsT0FDRy9GO1lBRUgsT0FBTTRCLEtBQUVBLEtBQUd1QixLQUFFQSxPQUFRMUMsS0FBS3FCLE9BQU85QixNQUFNUyxLQUFLaWQ7WUFDNUMsTUFBTXhiLFlBQVl2SCxvQkFBQUEsTUFBTXVILFVBQVV4QztZQUVsQ2tDLElBQUlLLFFBQVEsc0JBQXNCQztZQUNsQ04sSUFBSStELE1BQU0sT0FBT0k7WUFDakIsTUFBTWhMLGVBQWUwRixLQUFLaUQsb0JBQ3hCUCxLQUNBZ0IsYUFBQUEsY0FBY0MsTUFDZCxFQUFDMkIsR0FBR29GLGNBQ0pqUCxXQUNBQSxXQUNBd0QsTUFBTXBGO1lBRVIsT0FBT21HLEtBQUtrSixXQUFXUixZQUFZMUksS0FBS2dELE9BQU8xSTtBQUNqRDtRQUVBLFlBQUEyOUIsQ0FDRWg1QixPQUNBcUcsSUFDQUwsVUFDRzFGO1lBRUgsTUFBTWtDLFlBQVl2SCxvQkFBQUEsTUFBTXVILFVBQVV4QztZQUNsQyxPQUFNbUMsU0FBRUEsV0FBWXBCLEtBQUtxQixPQUFPOUIsTUFBTVMsS0FBS2k0QjtZQUMzQyxNQUFNNXlCLFNBQThCLENBQUE7WUFDcENBLE9BQU9qQyxXQUFBQSxZQUFZQyxTQUFTNUI7WUFFNUIxSCxPQUFPNEQsT0FBTzBILFFBQVFKO1lBQ3RCLE9BQU8sRUFBQ2hHLE9BQU9xRyxJQUFJRCxXQUFXakU7QUFDaEM7UUFhQSxZQUFNcUUsQ0FDSnhHLE9BQ0FxRyxJQUNBTCxPQUNBTSxZQUFpQyxDQUFBLE1BQzlCaEc7WUFFSCxNQUFNNkIsVUFBVSxLQUFLN0I7WUFDckIsT0FBTTRCLEtBQUVBLEtBQUd1QixLQUFFQSxPQUFRMUMsS0FBS3FCLE9BQ3hCRCxTQUNBcEIsS0FBS3lGO1lBRVB0RSxJQUFJOGMsS0FBSyxnQ0FBZ0NoZjtZQUN6QyxNQUFNd0MsWUFBWXZILG9CQUFBQSxNQUFNdUgsVUFBVXhDO1lBQ2xDa0MsSUFBSUssUUFBUSxxQkFBcUJDO1lBQ2pDTixJQUFJK0QsTUFBTSxPQUFPSTtZQUNqQixNQUFNOHdCLGVBQWU3d0IsYUFBYXhMLE9BQU84TSxLQUFLdEIsV0FBVzNKLFNBQVM7WUFDbEUsTUFBTXk2QixtQkFDSkQsZ0JBQWdCcDJCLEtBQUtzMkIsNEJBQTRCNXpCO1lBQ25ELE1BQU02ekIsbUJBQW1CSCxlQUFlO2dCQUFFMzBCLENBQUNBLFlBQVk4RDtnQkFBYyxDQUFBO1lBQ3JFLE1BQU1qTCxlQUFlMEYsS0FBS3lLLGtCQUN4Qi9ILEtBQ0FnQixhQUFBQSxjQUFjdzBCLFFBQ2QsRUFBQ2w0QixLQUFLa0osV0FBV0YsVUFBVS9ELE9BQU9oRyxNQUFNcEYsUUFBUW9GLFVBQ2hEczNCLGtCQUNBdjJCLEtBQUswMkIsMEJBQTBCaDBCLE1BQy9CekQsTUFBTXBGO1lBRVIsTUFBTW0rQixlQUFlaDRCLEtBQUtrSixXQUFXUixZQUFZMUksS0FBS2dELE9BQU8xSTtZQUM3RCxJQUFJMEYsS0FBSzQyQix3QkFBd0IzM0IsT0FBT3lELEtBQUsyekIsa0JBQWtCL3dCLEtBQUs7Z0JBQ2xFLE9BQU90RixLQUFLaWQsS0FDVmhlLE9BQ0E4TSxXQUNFOU0sT0FDQS9FLG9CQUFBQSxNQUFNbzNCLE1BQ0p2M0IsT0FBTzRELE9BQU8sQ0FBQSxHQUFJc0gsT0FBT00sYUFBYSxLQUN0Q3l5QixjQUNBLzRCLFFBRUZxRyxLQUVGNUM7QUFFSjtZQUNBLE9BQU9zMUI7QUFDVDtRQVdlLFlBQUEsQ0FDYi80QixPQUNBcUcsT0FDRy9GO1lBRUgsT0FBTTRCLEtBQUVBLEtBQUd1QixLQUFFQSxPQUFRMUMsS0FBS3FCLE9BQU85QixNQUFNUyxLQUFLOE07WUFDNUMsTUFBTXJMLFlBQVl2SCxvQkFBQUEsTUFBTXVILFVBQVV4QztZQUNsQyxNQUFNbzNCLG1CQUNKbjhCLG9CQUFBQSxNQUFNdW1CLFlBQVl4aEIsVUFBVWUsS0FBS3MyQiw0QkFBNEI1ekI7WUFDL0QsSUFBSXBJO1lBQ0osTUFBTTA4QixnQkFBZ0JoM0IsS0FBSzQyQix3QkFDekIzM0IsT0FDQXlELEtBQ0EyekIsa0JBQ0Evd0I7WUFFRixJQUFJMHhCLGVBQWU7Z0JBQ2pCMThCLGVBQWUwRixLQUFLaWQsS0FBS2hlLE9BQU9xRyxJQUFJNUM7QUFDdEM7WUFFQXZCLElBQUlLLFFBQVEsdUJBQXVCQztZQUNuQ04sSUFBSStELE1BQU0sT0FBT0k7WUFDakIsTUFBTXF4QixZQUFZMzJCLEtBQUt5SyxrQkFDckIvSCxLQUNBZ0IsYUFBQUEsY0FBY3kwQixRQUNkLEVBQUM3eUIsR0FBR29GLGNBQ0pqUCxXQUNBdUUsS0FBSzAyQiwwQkFBMEJoMEIsTUFDL0J6RCxNQUFNcEY7WUFFUixPQUFPbTlCLGdCQUNIMThCLFNBQ0EwRixLQUFLa0osV0FBV1IsWUFBWTFJLEtBQUtnRCxPQUFPMnpCO0FBQzlDO1FBNEJBLFNBQU12SCxDQUNKQyxVQUNBK0ksV0FBYyxNQUNkbjVCLFVBQ0dNO1lBRUgsT0FBTTRCLEtBQUVBLEtBQUd1QixLQUFFQSxPQUFRMUMsS0FBS3FCLE9BQU85QixNQUFNUyxLQUFLb3ZCO1lBQzVDLE1BQU0zdEIsWUFBWXhDLE1BQU1wRjtZQUN4QnNILElBQUk4YyxLQUFLLHFDQUFxQy9qQixvQkFBQUEsTUFBTXVILFVBQVV4QztZQUM5RCxJQUFJbzVCO1lBQ0o7Z0JBQ0VBLDBCQUEwQnI0QixLQUFLaUQsb0JBQzdCUCxLQUNBLE9BQ0EsRUFBQ25ILEtBQUtDLFVBQVU2ekIsV0FBVytJLFlBQzNCMzhCLFdBQ0FBLFdBQ0FnRztBQUVKLGNBQUUsT0FBT3hIO2dCQUNQLE1BQU0rRixLQUFLMmMsV0FBVzFpQjtBQUN4QjtZQUNBLElBQUlLO1lBQ0o7Z0JBQ0VBLFNBQVNpQixLQUFLd0gsTUFBTS9DLEtBQUtnRCxPQUFPcTFCO0FBQ2xDLGNBQUUsT0FBT3ArQjtnQkFDUCxNQUFNLElBQUlzTyxhQUFBQSxtQkFBbUIsNkJBQTZCdE87QUFDNUQ7WUFFQSxNQUFNcStCLGNBQWVqekI7Z0JBQ25CLElBQUluTCxvQkFBQUEsTUFBTXErQixRQUFRbHpCLFNBQVMsT0FBT25MLG9CQUFBQSxNQUFNNk8sTUFBTTFEO2dCQUM5QyxPQUFPQTs7WUFHVCxJQUFJM0YsTUFBTUMsUUFBUXJGLFNBQVM7Z0JBQ3pCLEtBQUtBLE9BQU9zQixRQUFRLE9BQU90QjtnQkFDM0IsTUFBTWsrQixLQUFLbCtCLE9BQU87Z0JBQ2xCLElBQUlKLG9CQUFBQSxNQUFNcStCLFFBQVFDLEtBRWhCLE9BQU9sK0IsT0FBTzBDLElBQUt3N0IsTUFBT3QrQixvQkFBQUEsTUFBTTZPLE1BQU15dkI7Z0JBQ3hDLE9BQU9sK0I7QUFDVDtZQUVBLE9BQU9nK0IsWUFBWWgrQjtBQUNyQjtRQWFNLFVBQUFnNkIsQ0FDSkgsTUFDQUYsVUFDQWxtQixZQUNHeE87WUFFSCxPQUFNNEIsS0FBRUEsS0FBR3VCLEtBQUVBLE9BQVExQyxLQUFLcUIsT0FBTzlCLE1BQU1TLEtBQUtzMEI7WUFDNUNuekIsSUFBSThjLEtBQUssaUJBQWlCa1csUUFBUUY7WUFDbEMsSUFBSW9FO1lBQ0o7Z0JBQ0VBLDBCQUEwQnI0QixLQUFLaUQsb0JBQzdCUCxLQUNBLFFBQ0EsRUFBQ3l4QixNQUFNRixVQUFVMTRCLEtBQUtDLFVBQVV1UyxZQUNoQ3RTLFdBQ0FBLFdBQ0FBO0FBRUosY0FBRSxPQUFPeEI7Z0JBQ1AsTUFBTStGLEtBQUsyYyxXQUFXMWlCO0FBQ3hCO1lBQ0EsSUFBSUs7WUFDSjtnQkFDRUEsU0FBU2lCLEtBQUt3SCxNQUFNL0MsS0FBS2dELE9BQU9xMUI7QUFDbEMsY0FBRSxPQUFPcCtCO2dCQUNQLE1BQU0sSUFBSXNPLGFBQUFBLG1CQUFtQixrQ0FBa0N0TztBQUNqRTtZQUNBLE9BQU9LO0FBQ1Q7UUFPUyxTQUFBbStCO1lBQ1AsS0FBS3o0QixLQUFLMDRCLFNBQ1IxNEIsS0FBSzA0QixVQUFVdEQsb0JBQW9CcUQsVUFBVXo0QixLQUFLbU87WUFDcEQsT0FBT25PLEtBQUswNEI7QUFDZDtRQU9VLGFBQU1DLENBQVFqMkI7WUFDdEIsT0FBTzB5QixvQkFBb0J3RCxXQUFXbDJCLEtBQUsxQyxLQUFLbU8sUUFBUW5PLEtBQUt1YjtBQUMvRDtRQUVRLGVBQUFzZCxDQUFnQmh3QjtZQUN0QixLQUFLQSxXQUFXLE9BQU9wTjtZQUN2QixPQUFPLEdBQUdvTjtBQUNaO1FBT1UsY0FBTWl3QixDQUNkcDJCLEtBQ0FxMkI7WUFFQSxPQUFPM0Qsb0JBQW9CNEQsa0JBQ25CaDVCLEtBQUsyNEIsUUFBUWoyQixNQUNuQjFDLEtBQUttTyxRQUNMNHFCO0FBRUo7UUE4QlUsaUJBQU1FLENBQ2R2MkIsS0FDQXcyQixLQUNBQyxTQUFTLE1BQ1Q1NUIsTUFDQTY1QixnQkFBd0MsQ0FBQSxHQUN4QzdCLHdCQUNBMXVCO1lBRUEsTUFBTTFILE1BQU1uQixLQUFLbUIsSUFBSVIsSUFBSVgsS0FBS2k1QjtZQUM5QixNQUFNSSxnQkFBZ0JyNUIsS0FBSzI0QixRQUFRajJCO1lBQ25DO2dCQUNFLE1BQU00MkIsaUJBQWlCdDVCLEtBQUs4NEIsU0FDMUJwMkIsS0FDQTFDLEtBQUs2NEIsZ0JBQWdCaHdCO2dCQUV2QjFILElBQUlLLFFBQ0YsR0FBRzIzQixTQUFTLFdBQVcsOEJBQThCbjVCLEtBQUs2NEIsZ0JBQWdCaHdCLGNBQWM3SSxLQUFLbU8sT0FBTzRxQixnQkFBZ0JHO2dCQUV0SC8zQixJQUFJK0QsTUFBTSxTQUFTM0YsTUFBTXZDLElBQUtnZ0IsS0FBTUEsRUFBRXRTLFlBQVlqUixLQUFLLFNBQVM7Z0JBQ2hFLE1BQU1tMEIsU0FBU3VMLFNBQVNHLFNBQVNILFNBQVNHLFNBQVNDO2dCQUVuRGhDLHlCQUF5QkEsd0JBQXdCMzdCLFNBQzdDMjdCLHlCQUNBOTdCO2dCQUNKLE1BQU0rOUIsa0JBQW1DO29CQUN2Q0MsV0FBV2w2QixRQUFRO29CQUNuQjY1QixlQUFlci9CLE9BQU82MkIsUUFBUXdJLGVBQWUzUCxPQUMzQyxDQUFDQyxNQUFNNW9CLEtBQUsydkI7d0JBQ1YvRyxJQUFJNW9CLE9BQU92RixLQUFLQyxVQUFVaTFCO3dCQUMxQixPQUFPL0c7dUJBRVQsQ0FBQTtvQkFFRjZOLHdCQUF3QjcwQixJQUFJYyxlQUFlLDhCQUN2Qyt6QiwwQkFBMEI5N0IsWUFDMUJBOztnQkFHTixhQUFhbXlCLE9BQU83RCxLQUFLdVAsVUFBVUosS0FBS007QUFDMUMsY0FBRSxPQUFPdi9CO2dCQUNQLE1BQU0rRixLQUFLMmMsV0FBVzFpQjtBQUN4QjtnQkFDRStGLEtBQUttQixJQUFJK0QsTUFBTSxXQUFXbEYsS0FBS21PLE9BQU96UjtnQkFDdEMyOEIsUUFBUUs7QUFDVjtBQUNGO1FBRVEsc0JBQUFDLENBQXVCajNCO1lBQzdCLFNBQVNBLElBQUljLGVBQWUsZUFBZXhELEtBQUttTyxPQUFPMGU7QUFDekQ7UUFFUSxpQkFBQStNLENBQWtCcjZCO1lBQ3hCLFFBQVFBLFFBQVEsSUFBSXZDLElBQUtRLGNBQ2hCQSxRQUFRLFdBQVdBLE1BQU1qQyxLQUFLQyxVQUFVZ0M7QUFFbkQ7UUFFUSxvQkFBQXE4QixDQUNOVDtZQUVBLEtBQUtBLGVBQWUsT0FBTzM5QjtZQUMzQixNQUFNbTFCLFVBQVU3MkIsT0FBTzYyQixRQUFRd0k7WUFDL0IsS0FBS3hJLFFBQVFoMUIsUUFBUSxPQUFPSDtZQUM1QixNQUFNdUIsTUFBOEIsQ0FBQTtZQUNwQyxLQUFLLE9BQU84RCxLQUFLa0IsVUFBVTR1QixTQUFTO2dCQUNsQzV6QixJQUFJOEQsT0FBTzBPLE9BQU81RSxLQUFLclAsS0FBS0MsVUFBVXdHO0FBQ3hDO1lBQ0EsT0FBT2hGO0FBQ1Q7UUFFUSxxQkFBQTg4QjtZQUNOLE1BQU1DLGFBQWEvNUIsS0FBS21PLE9BQU82ckIsa0JBQWtCO1lBQ2pELE1BQU0xTCxTQUFTdGtCLE9BQU8rdkI7WUFDdEIsS0FBSy92QixPQUFPaXdCLFNBQVMzTCxXQUFXQSxTQUFTLEdBQUcsT0FBTztZQUNuRCxPQUFPL1osS0FBSzJsQixNQUFNNUw7QUFDcEI7UUFFUSxvQkFBQTZMLENBQ05DLFlBQ0FsNUI7WUFFQSxLQUFLazVCLFdBQVd4K0IsVUFBVXNGLFNBQVMsR0FBRyxPQUFPO1lBQzdDLE1BQU1tNUIsWUFBWSxLQUFJRDtZQUN0QixNQUFNN1gsU0FBU2hPLEtBQUtzTCxJQUFJM2UsT0FBT201QixVQUFVeitCO1lBQ3pDLE1BQU0wK0IsU0FBdUI7WUFDN0IsT0FBT0EsT0FBTzErQixTQUFTMm1CLFVBQVU4WCxVQUFVeitCLFFBQVE7Z0JBQ2pELE1BQU0yK0IsTUFBTWhtQixLQUFLMmxCLE1BQU0zbEIsS0FBS2ltQixXQUFXSCxVQUFVeitCO2dCQUNqRCxPQUFPNitCLGFBQWFKLFVBQVVLLE9BQU9ILEtBQUs7Z0JBQzFDLElBQUlFLFdBQVc7b0JBQ2JILE9BQU92L0IsS0FBSzAvQjtBQUNkO0FBQ0Y7WUFDQSxPQUFPSDtBQUNUO1FBRVEsc0JBQUFLLENBQ05qNEI7WUFFQSxNQUFNazRCLFFBQTRCLEVBQ2hDO2dCQUNFbCtCLE9BQU9zRCxLQUFLbU8sT0FBT3pSO2dCQUNuQm0rQixjQUFjNzZCLEtBQUttTyxPQUFPMHNCO2dCQUMxQkMsZUFBZTk2QixLQUFLbU8sT0FBTzJzQjtnQkFDM0JDLFNBQVMvNkIsS0FBS21PLE9BQU80c0I7O1lBSXpCLElBQUl6RCxnQkFBZ0J0M0IsS0FBSzAyQiwwQkFBMEJoMEIsUUFBUTtZQUMzRDQwQixnQkFBZ0I1M0IsTUFBTUMsUUFBUTIzQixpQkFDMUJBLGdCQUNBLEVBQUNBO1lBQ0wsTUFBTTBELFlBQ0oxRCxjQUFjdDlCLE9BQVFpaEMsT0FBdUJqVixRQUFRaVYsU0FBUztZQUNoRSxNQUFNQyxTQUFTRixVQUFVaGhDLE9BQVFpaEMsT0FBUUEsUUFBUWo3QixLQUFLbU8sT0FBT3pSO1lBQzdELEtBQUt3K0IsT0FBT3QvQixRQUFRLE9BQU9nL0I7WUFFM0IsTUFBTTU5QixNQUFNZ0QsS0FBS21PLE9BQU9ndEI7WUFDeEIsTUFBTUMsY0FBY3A3QixLQUFLODVCO1lBQ3pCLEtBQUssTUFBTXJVLE9BQU95VixRQUFRO2dCQUN4QixNQUFNZCxhQUFhcDlCLE1BQU15b0I7Z0JBQ3pCLEtBQUsyVSxZQUFZeCtCLFFBQVE7b0JBQ3ZCLE1BQU0sSUFBSXlELEtBQUFBLGlCQUNSLHFDQUFxQ29tQjtBQUV6QztnQkFDQSxNQUFNNFYsYUFBYXI3QixLQUFLbTZCLHFCQUFxQkMsWUFBWWdCO2dCQUN6RCxLQUFLQyxXQUFXei9CLFFBQVE7b0JBQ3RCLE1BQU0sSUFBSXlELEtBQUFBLGlCQUNSLDJDQUEyQ29tQjtBQUUvQztnQkFDQSxLQUFLLE1BQU02VixVQUFVRCxZQUFZO29CQUMvQixLQUFLQyxPQUFPQyxVQUFVO3dCQUNwQixNQUFNLElBQUlsOEIsS0FBQUEsaUJBQ1IsZ0NBQWdDb21CO0FBRXBDO29CQUNBbVYsTUFBTTcvQixLQUFLO3dCQUNUMkIsT0FBTytvQjt3QkFDUG9WLGNBQWNTLE9BQU9DO3dCQUNyQlQsZUFBZVEsT0FBT3JOO3dCQUN0QjhNLFNBQVNPLE9BQU9QLFdBQVcvNkIsS0FBS21PLE9BQU80c0I7O0FBRTNDO0FBQ0Y7WUFFQSxPQUFPSDtBQUNUO1FBRVEsdUNBQU1ZLENBQ1o5NEIsS0FDQSs0QixLQUNBbDhCLE1BQ0FtOEIsY0FDQUMsYUFDQTl5QjtZQUVBLE1BQU0xSCxNQUFNbkIsS0FBS21CLElBQUlSLElBQUlYLEtBQUt3N0I7WUFDOUIsTUFBTVosUUFBUTU2QixLQUFLNDdCLHFCQUFxQkQ7WUFDeEMsTUFBTUUseUJBQXlCNzdCLEtBQUs4N0I7WUFDcEMsTUFBTUMsZUFBZUMsY0FBQUEsUUFBUUM7WUFDN0IsTUFBTUMsZ0JBQWdCLEdBQUdsOEIsS0FBS21PLE9BQU96UjtrQkFDL0JxL0IsT0FBT2hYLElBQUltWCxlQUFlO2dCQUM5QnByQixhQUFhO29CQUNYaEQsYUFBYSt0QixpQkFBaUIvdEI7b0JBQzlCRCxZQUFZZ3VCLGlCQUFpQmh1Qjs7Z0JBRS9CblIsT0FBT3NELEtBQUttTyxPQUFPelI7Z0JBQ25COEssTUFBTTs7WUFHUixNQUFNMjBCLDBCQUEwQm44QixLQUFLbzhCLDZCQUE2QnhCO1lBQ2xFLE1BQU12QixVQUFVLElBQUlnRDtZQUVwQjtzQkFDUWhELFFBQVFpRCxRQUFRSCxtQkFBbUI7b0JBQ3ZDdGQsVUFBVXFkO29CQUNWSDtvQkFDQVEsV0FBVzt3QkFDVEMsU0FBUzt3QkFDVEMsYUFBYXo4QixLQUFLMDhCLDRCQUE0QjlCOztvQkFFaEQrQixTQUFTO3dCQUNQN3VCLGFBQWErdEIsaUJBQWlCL3RCO3dCQUM5QmhOLEtBQUsrNkIsaUJBQWlCaHVCOzs7Z0JBSTFCLE1BQU0rdUIsZ0JBQWdCdkQsUUFBUXdELFdBQVc3OEIsS0FBS21PLE9BQU8ydUI7Z0JBQ3JELE1BQU14RCxXQUFXc0QsUUFBUTVELFlBQ3ZCaDVCLEtBQUttTyxPQUFPNHVCLGVBQ1ovOEIsS0FBSzY0QixnQkFBZ0Jod0I7Z0JBRXZCLE1BQU1vd0IsY0FBY0ssU0FBUzBELGtCQUFrQnZCO2dCQUUvQyxJQUFJQyxjQUFjO29CQUNoQnpDLFlBQVlnRSxhQUFhdkI7QUFDM0I7Z0JBRUEsTUFBTVYsWUFBWUosTUFDZjU5QixJQUFLa2dDLFFBQVNOLFFBQVFPLGFBQWFDLFlBQVlGLEtBQUtyakMsT0FDcERHLE9BQVFxakMsWUFBbUNyWCxRQUFRcVg7Z0JBQ3RELElBQUlyQyxVQUFVcC9CLFFBQVE7b0JBQ3BCcTlCLFlBQVlxRSxrQkFBa0J0QztBQUNoQztnQkFFQTc1QixJQUFJSyxRQUNGLHFCQUFxQnhCLEtBQUs2NEIsZ0JBQWdCaHdCLGNBQWM3SSxLQUFLbU8sT0FBTzRxQixnQkFBZ0IwQyxpQkFBaUJiLE1BQU01OUIsSUFBSzlCLEtBQU1BLEVBQUUyL0IsY0FBY3BoQyxLQUFLO2dCQUc3SSxNQUFNYSxlQUFlMitCLFlBQVlFLFVBQVU1NUI7Z0JBQzNDLE9BQU84TixXQUFXekMsS0FBS3RRO0FBQ3pCLGNBQUUsT0FBT0w7Z0JBQ1AsTUFBTStGLEtBQUsyYyxXQUFXMWlCO0FBQ3hCO2dCQUNFby9CLFFBQVFrRTtBQUNWO0FBQ0Y7UUFFUSxvQkFBQTNCLENBQ05oQjtZQUVBLE1BQU00QyxVQUFVLElBQUlDO1lBQ3BCLE1BQU1DLFVBQVdSO2dCQUNmLE1BQU1wOEIsTUFBTSxHQUFHbzhCLEtBQUtyQyxnQkFBZ0JxQyxLQUFLcEMsaUJBQWlCO2dCQUMxRCxJQUFJMEMsUUFBUUcsSUFBSTc4QixNQUFNO2dCQUN0QixNQUFNakgsT0FBTyxRQUFRcWpDLEtBQUt4Z0MsU0FBUzhnQyxRQUFReCtCO2dCQUMzQ3crQixRQUFRN3BCLElBQUk3UyxLQUFLO3VCQUNabzhCO29CQUNIcmpDOzs7WUFJSitnQyxNQUFNemhDLFFBQVF1a0M7WUFDZEEsUUFBUTtnQkFDTmhoQyxPQUFPc0QsS0FBS21PLE9BQU96UjtnQkFDbkJtK0IsY0FBYzc2QixLQUFLbU8sT0FBTzBzQjtnQkFDMUJDLGVBQWU5NkIsS0FBS21PLE9BQU8yc0I7O1lBRzdCLE9BQU9wN0IsTUFBTWtMLEtBQUs0eUIsUUFBUTFqQztBQUM1QjtRQUVRLG1DQUFNZ2lDO1lBSVosTUFBTWh1QixvQkFBb0I5TixLQUFLNDlCLGFBQzdCNTlCLEtBQUttTyxPQUFPMHZCO1lBRWQsTUFBTWh3QixtQkFBbUI3TixLQUFLNDlCLGFBQzVCNTlCLEtBQUttTyxPQUFPMnZCO1lBRWQsT0FBTztnQkFBRWh3QjtnQkFBYUQ7O0FBQ3hCO1FBRVEsa0NBQU11dUIsQ0FBNkJ4QjtZQUN6QyxNQUFNbUQsY0FBbUMsQ0FBQTtZQUN6QyxNQUFNQyxlQUFvQyxDQUFBO1lBQzFDLE1BQU1DLE9BQTRCLENBQUE7WUFDbEMsS0FBSyxNQUFNZixRQUFRdEMsT0FBTztnQkFDeEIsTUFBTXNELGVBQWVsK0IsS0FBSzQ5QixhQUN4QlYsS0FBS25DLFdBQVcvNkIsS0FBS21PLE9BQU80c0I7Z0JBRTlCLE1BQU1vRCxXQUNKakIsS0FBS3BDLGlCQUFpQjk2QixLQUFLbytCLFlBQVlsQixLQUFLckM7Z0JBQzlDa0QsWUFBWWIsS0FBS3JqQyxRQUFRO29CQUN2QmtoQixLQUFLL2EsS0FBS3ErQixjQUFjbkIsS0FBS3JDO29CQUM3QnlELFlBQVk7d0JBQUV6c0IsS0FBS3FzQjs7b0JBQ25CSyxhQUFhO3dCQUNYLDRCQUE0Qko7d0JBQzVCSyxrQkFBa0JMOzs7Z0JBR3RCSCxhQUFhZCxLQUFLcmpDLFFBQVE7b0JBQ3hCNGtDLGVBQWU7b0JBQ2ZDLGdCQUFnQjtvQkFDaEJDLGFBQWE7b0JBQ2JDLGFBQWE7O2dCQUVmWCxLQUFLZixLQUFLeGdDLFNBQVN1aEMsS0FBS2YsS0FBS3hnQyxVQUFVO29CQUNyQzZtQixPQUFPMlosS0FBS3hnQztvQkFDWmsrQixPQUFPOztnQkFFVHFELEtBQUtmLEtBQUt4Z0MsT0FBT2srQixNQUFNNy9CLEtBQUttaUMsS0FBS3JqQztBQUNuQztZQUVBLE9BQU87Z0JBQ0xBLE1BQU07Z0JBQ05xbUIsU0FBUztnQkFDVDNFLFFBQVE7b0JBQ05zakIsY0FBYzcrQixLQUFLbU8sT0FBT3pSOztnQkFFNUJvaUMsZUFBZWI7Z0JBQ2ZyRCxPQUFPbUQ7Z0JBQ1BnQixVQUFVLENBQUE7Z0JBQ1ZDLFVBQVU7b0JBQ1IsQ0FBQ2gvQixLQUFLbU8sT0FBTzJ1QixVQUFVO3dCQUNyQmxDLE9BQU9vRDs7OztBQUlmO1FBRVEsMkJBQUF0QixDQUE0QjlCO1lBQ2xDLE9BQU9BLE1BQU1xRSxNQUFPL0IsUUFBU2w5QixLQUFLay9CLGdCQUFnQmhDLEtBQUtyQztBQUN6RDtRQUVRLGVBQUFxRSxDQUFnQjNEO1lBQ3RCLE1BQU00RCxPQUFPbi9CLEtBQUtvK0IsWUFBWTdDLFVBQVU1TTtZQUN4QyxPQUFPd1EsU0FBUyxlQUFlQSxTQUFTO0FBQzFDO1FBRVEsV0FBQWYsQ0FBWTdDO1lBQ2xCLE1BQU02RCxZQUFZN0QsU0FBU3ovQixRQUFRLGdCQUFnQjtZQUNuRCxPQUFPc2pDLFVBQVVoVixNQUFNLEtBQUs7QUFDOUI7UUFFUSxhQUFBaVUsQ0FBYzlDO1lBQ3BCLElBQUksZ0JBQWdCOVEsS0FBSzhRLFdBQVcsT0FBT0E7WUFDM0MsT0FBTyxXQUFXQTtBQUNwQjtRQUVRLGtCQUFNcUMsQ0FBYWxwQjtZQUN6QixLQUFLQSxRQUFRLE1BQU0sSUFBSWpYLGFBQUFBLGNBQWM7WUFDckMsSUFBSStSLE9BQU82dkIsU0FBUzNxQixTQUFTLE9BQU9BLE9BQU9oSyxTQUFTO1lBQ3BELE1BQU00MEIsVUFBVTVxQixPQUFPbkY7WUFDdkIsSUFBSSwwQkFBMEJrYixLQUFLNlUsVUFBVSxPQUFPQTtZQUNwRCxNQUFNQyxjQUFjbG5DLEdBQUdtVixTQUFTZ3lCLEtBQUs5cUIsUUFBUStxQixNQUFNLE1BQU1oa0M7WUFDekQsSUFBSThqQyxPQUFPRyxlQUFlO2dCQUN4QixhQUFhenVCLDJCQUEyQnlEO0FBQzFDO1lBQ0EsY0FBY2lyQixTQUFXanJCLFNBQVNoSztBQUNwQztRQVNTLFVBQUFpUyxDQUFnQ2lqQjtZQUN2QyxPQUFPeEssb0JBQW9CelksV0FBY2lqQjtBQUMzQztRQVdBLHVCQUFNbjFCLENBQ0ovSCxLQUNBdzJCLEtBQ0EzNUIsTUFDQTY1QixlQUNBN0Isd0JBQ0ExdUI7WUFFQSxJQUFJN0ksS0FBSzI1Qix1QkFBdUJqM0IsTUFBTTtnQkFDcEMsTUFBTW05QixhQUFhNy9CLEtBQUs0NUIsa0JBQWtCcjZCO2dCQUMxQyxNQUFNbThCLGVBQWUxN0IsS0FBSzY1QixxQkFBcUJUO2dCQUMvQyxNQUFNdUMsY0FBYzM3QixLQUFLMjZCLHVCQUF1Qmo0QjtnQkFDaEQsT0FBTzFDLEtBQUt3N0Isa0NBQ1Y5NEIsS0FDQXcyQixLQUNBMkcsWUFDQW5FLGNBQ0FDLGFBQ0E5eUI7QUFFSjtZQUNBLE9BQU83SSxLQUFLaTVCLFlBQ1Z2MkIsS0FDQXcyQixLQUNBLE1BQ0EzNUIsTUFDQTY1QixlQUNBN0Isd0JBQ0ExdUI7QUFFSjtRQVdBLHlCQUFNNUYsQ0FDSlAsS0FDQXcyQixLQUNBMzVCLE1BQ0E2NUIsZUFDQTdCLHdCQUNBMXVCO1lBRUEsT0FBTzdJLEtBQUtpNUIsWUFDVnYyQixLQUNBdzJCLEtBQ0EsT0FDQTM1QixNQUNBNjVCLGVBQ0E3Qix3QkFDQTF1QjtBQUVKO1FBU1MsY0FBTWkzQixJQUFZdmdDO2tCQUVuQkwsTUFBTTRnQyxZQUFZdmdDO1lBQ3hCLElBQUlTLEtBQUt1YixRQUFRO2dCQUNmdmIsS0FBS21CLElBQUlLLFFBQVEsV0FBV3hCLEtBQUttTyxPQUFPelI7Z0JBQ3hDc0QsS0FBS3ViLE9BQU9tZTtBQUNkO0FBQ0Y7UUFTQSxrQkFBT1YsQ0FDTEssU0FDQWxyQixRQUNBNHFCO1lBRUEsTUFBTTUzQixNQUFNbkIsS0FBS21CLElBQUlSLElBQUlYLEtBQUtnNUI7WUFDOUIsTUFBTTRELFVBQVU1OEIsS0FBSzY4QixXQUFXeEQsU0FBU2xyQixPQUFPMnVCO1lBQ2hELElBQUl4RDtZQUNKO2dCQUNFbjRCLElBQUkrRCxNQUNGLHdCQUF3QmlKLE9BQU80dUIsMEJBQTBCaEUsZ0JBQWdCNXFCLE9BQU80cUIsNkJBQTZCNXFCLE9BQU8ydUI7Z0JBRXRIL0QsZUFBZUEsZUFBZUEsZUFBZTVxQixPQUFPNHFCO2dCQUNwRE8sV0FBV3NELFFBQVE1RCxZQUFZN3FCLE9BQU80dUIsZUFBZWhFO0FBQ3ZELGNBQUUsT0FBTzkrQjtnQkFDUCxNQUFNK0YsS0FBSzJjLFdBQVcxaUI7QUFDeEI7WUFDQSxPQUFPcS9CO0FBQ1Q7UUFTQSxpQkFBT3VELENBQVd4RCxTQUFrQjBHO1lBQ2xDLE1BQU01K0IsTUFBTWtkLFFBQUFBLFFBQVExZCxJQUFJWCxLQUFLNjhCO1lBQzdCLElBQUlEO1lBQ0o7Z0JBQ0V6N0IsSUFBSStELE1BQU0seUJBQXlCNjZCO2dCQUNuQ25ELFVBQVV2RCxRQUFRd0QsV0FBV2tEO0FBQy9CLGNBQUUsT0FBTzlsQztnQkFDUCxNQUFNK0YsS0FBSzJjLFdBQVcxaUI7QUFDeEI7WUFFQSxPQUFPMmlDO0FBQ1Q7UUFTQSx1QkFBYWhFLENBQ1hsMkIsS0FDQXlMLFFBQ0FvTjtZQUVBLGFBQWN2YixLQUFLZ2dDLGNBQ2pCemtCLGdCQUFpQnZiLEtBQUt5NEIsVUFBVXRxQixTQUNoQ0EsUUFDQXpMO0FBRUo7UUFRQSxnQkFBTysxQixDQUFVdHFCO1lBQ2YsTUFBTWhOLE1BQU1uQixLQUFLbUIsSUFBSVIsSUFBSVgsS0FBS3k0QjtZQUM5QnQzQixJQUFJK0QsTUFBTSxzQ0FBc0NpSixPQUFPelI7WUFDdkQsSUFBSXVqQyxhQUE4Qjl4QixPQUFPNHNCO1lBRXpDLFdBQVdrRixlQUFlLFVBQVU7Z0JBQ2xDLElBQ0VBLFdBQVczeUIsTUFDVCx5RUFFRjtvQkFDQTJ5QixhQUFhendCLE9BQU81RSxLQUFLcTFCLFlBQVk7QUFDdkMsdUJBQU87b0JBQ0w7d0JBQ0VBLGFBQWF6d0IsT0FBTzVFLEtBQUt2UyxHQUFHNm5DLGFBQWFELFlBQVk7QUFDdkQsc0JBQUUsT0FBT2htQzt3QkFDUCxNQUFNLElBQUl3RCxhQUFBQSxjQUNSLDJDQUEyQ3dpQyxlQUFlaG1DO0FBRTlEO0FBQ0Y7QUFDRjtZQUVBLE1BQU1rbUMsaUJBQWlCQyxnQkFBS3R2QixZQUFZdXZCLFVBQVVKO1lBQ2xEOStCLElBQUkrRCxNQUFNLHFDQUFxQ2lKLE9BQU8wc0I7WUFDdEQsT0FBTyxJQUFJdmYsS0FBQUEsT0FBT25OLE9BQU8wc0IsY0FBY3NGLGdCQUFnQjtnQkFDckQsb0NBQW9DaHlCLE9BQU9teUIsYUFBYSxNQUFNLE9BQU87Z0JBQ3JFLGlDQUFpQ255QixPQUFPbXlCLGFBQWEsTUFBTSxPQUFPOztBQUV0RTtRQTBCQSwwQkFBYU4sQ0FDWHprQixRQUNBcE4sUUFDQXpMO1lBRUEsTUFBTXZCLE1BQU1rZCxRQUFBQSxRQUFRMWQsSUFBSVgsS0FBS2dnQztZQUM3QjcrQixJQUFJK0QsTUFDRixnQ0FBZ0NpSixPQUFPelIsZUFBZXlSLE9BQU8wdkI7WUFFL0QsTUFBTWhmLGlCQUFpQnBPLFlBQ3JCdEMsT0FBT3pSLE9BQ1B5UixPQUFPMHZCO1lBRVQ7Z0JBQ0UxOEIsSUFBSStELE1BQ0Ysb0NBQW9DMlEsWUFBWUcsd0JBQXdCNkksU0FBUy9OLFlBQVlwRztBQUVqRyxjQUFFLE9BQU96UTtnQkFDUGtILElBQUl5b0IsTUFBTSxnREFBZ0QzdkI7QUFDNUQ7WUFFQSxJQUFJc21DO1lBQ0osTUFBTTdHLFFBQVE7WUFDZCxLQUFLdnJCLE9BQU9DLEtBQUs7Z0JBQ2ZteUIsZUFBZXB2QixVQUFVaEQsT0FBTzJ2QjtBQUNsQyxtQkFBTztnQkFhTCxNQUFNLElBQUl6K0IsS0FBQUEsaUJBQWlCO0FBQzdCO1lBRUEsTUFBTTBPLFVBQVU7Z0JBQ2R3TjtnQkFDQXNELFVBQVVBO2dCQUNWMGhCLFFBQVFBO2dCQUVSQyxpQkFBaUIsT0FDUjtvQkFBRUMsVUFBVWppQixLQUFLRCxRQUFRLE1BQU83YixJQUFJbUQsSUFBSTs7Z0JBRWpENjZCLGdCQUFnQixPQUNQO29CQUFFRCxVQUFVamlCLEtBQUtELFFBQVEsTUFBTzdiLElBQUltRCxJQUFJOztnQkFFakQ4NkIsZUFBZSxPQUNOO29CQUFFRixVQUFVamlCLEtBQUtELFFBQVEsTUFBTzdiLElBQUltRCxJQUFJOztnQkFFakQrNkIscUJBQXFCLE9BQ1o7b0JBQUVILFVBQVVqaUIsS0FBS0QsUUFBUSxNQUFPN2IsSUFBSW1ELElBQUk7OztZQUluRDFFLElBQUkrRCxNQUFNLGlCQUFpQmlKLE9BQU96UjtZQUNsQyxNQUFNMjhCLFVBQVVpRCxjQUFBQSxRQUFRdnVCO1lBR3hCLElBQUlJLE9BQU9DLEtBQUs7Z0JBQ2RpckIsUUFBUUssUUFBUSxJQUFJbUgsTUFBTXhILFFBQVFLLE9BQU87b0JBQ3ZDLEtBQUF6VyxDQUFNVixRQUFvQnVlLFNBQWNDO3dCQUN0Q0MsUUFBUS9kLE1BQU1WLFFBQVF1ZSxTQUFTQzt3QkFDL0JySDtBQUNGOztBQUVKO1lBRUEsT0FBT0w7QUFDVDtRQVdTLFFBQUE0SDtZQUNQLE9BQU8sSUFBSTdMLG9CQUFvQixpQkFBaUJwMUIsS0FBS3ViO0FBQ3ZEO1FBU1UsaUJBQU9vQixDQUNmaWpCO1lBU0EsSUFBSXhtQixhQUFhd21CLFFBQVEsV0FBV0EsTUFBTUEsSUFBSTdsQjtZQUM5QyxJQUFJNmxCLGVBQWVzQixjQUFBQSxnQkFBZ0J0QixJQUFJdUIsUUFBUXZsQyxVQUFVZ2tDLElBQUl4bEIsU0FBUyxJQUFJO2dCQUN4RWhCLE1BQU0sR0FBR3dtQixJQUFJdUIsUUFBUSxHQUFHcG5CO0FBQzFCO1lBRUEsSUFDRTZsQixlQUFld0IsY0FBQUEsZ0JBQ2Z4QixJQUFJdUIsUUFBUXZsQyxVQUNaZ2tDLElBQUl4bEIsU0FBUyxNQUNid2xCLElBQUl1QixRQUFRLEdBQUdwbkIsU0FBUzNiLFNBQVNpQixLQUFBQSxpQkFBaUJ4RixPQUNsRDtnQkFDQXVmLE1BQU0sR0FBR3dtQixJQUFJdUIsUUFBUSxHQUFHcG5CO0FBQzFCO1lBRUEsSUFBSVgsSUFBSWhiLFNBQVMsdUJBQ2YsT0FBTyxJQUFJNGIsc0JBQXNCNGxCO1lBRW5DLElBQUl4bUIsSUFBSWhiLFNBQVMsc0JBQ2YsT0FBTyxJQUFJaWMsd0JBQXdCdWxCO1lBRXJDLElBQUl4bUIsSUFBSWhiLFNBQVMsK0JBQ2YsT0FBTyxJQUFJOGIsdUJBQXVCMGxCO1lBRXBDLElBQUl4bUIsSUFBSWhiLFNBQVMsMEJBQ2YsT0FBTyxJQUFJNmIseUJBQXlCMmxCO1lBRXRDLElBQUlBLGVBQWU5MkIsU0FBVTgyQixJQUFZeGxCLE1BQU07Z0JBQzdDLFFBQVN3bEIsSUFBWXhsQjtrQkFDbkIsS0FBSztvQkFDSCxPQUFPLElBQUlOLGlCQUFpQjhsQjs7QUFFbEM7WUFFQSxJQUFJeG1CLElBQUloYixTQUFTaUksYUFBQUEsZ0JBQWdCeE0sT0FDL0IsT0FBTyxJQUFJd00sYUFBQUEsZ0JBQWdCdTVCO1lBQzdCLElBQUl4bUIsSUFBSWhiLFNBQVNnZixhQUFBQSxjQUFjdmpCLE9BQU8sT0FBTyxJQUFJdWpCLGFBQUFBLGNBQWN3aUI7WUFDL0QsSUFBSXhtQixJQUFJaGIsU0FBUzBlLGFBQUFBLGNBQWNqakIsT0FBTyxPQUFPLElBQUlpakIsYUFBQUEsY0FBYzhpQjtZQUMvRCxJQUFJeG1CLElBQUloYixTQUFTaWpDLGFBQUFBLGdCQUFnQnhuQyxPQUMvQixPQUFPLElBQUl3bkMsYUFBQUEsZ0JBQWdCekI7WUFDN0IsSUFBSXhtQixJQUFJaGIsU0FBUzJ6QixLQUFBQSxXQUFXbDRCLE9BQU8sT0FBTyxJQUFJazRCLEtBQUFBLFdBQVc2TjtZQUN6RCxJQUFJeG1CLElBQUloYixTQUFTa2pDLEtBQUFBLFlBQVl6bkMsT0FBTyxPQUFPLElBQUl5bkMsS0FBQUEsWUFBWTFCO1lBQzNELElBQUl4bUIsSUFBSWhiLFNBQVNpQixLQUFBQSxpQkFBaUJ4RixPQUNoQyxPQUFPLElBQUl3RixLQUFBQSxpQkFBaUJ1Z0M7WUFDOUIsSUFBSXhtQixJQUFJaGIsU0FBU21qQyxLQUFBQSxlQUFlMW5DLE9BQU8sT0FBTyxJQUFJMG5DLEtBQUFBLGVBQWUzQjtZQUNqRSxJQUFJeG1CLElBQUloYixTQUFTb2pDLEtBQUFBLGNBQWMzbkMsT0FBTyxPQUFPLElBQUkybkMsS0FBQUEsY0FBYzVCO1lBQy9ELElBQUl4bUIsSUFBSWhiLFNBQVNvYixLQUFBQSxtQkFBbUIzZixPQUNsQyxPQUFPLElBQUkyZixLQUFBQSxtQkFBbUJvbUI7WUFDaEMsSUFBSXhtQixJQUFJaGIsU0FBU3FqQyxLQUFBQSxlQUFlNW5DLE9BQU8sT0FBTyxJQUFJNG5DLEtBQUFBLGVBQWU3QjtZQUNqRSxJQUFJeG1CLElBQUloYixTQUFTc2pDLEtBQUFBLGdCQUFnQjduQyxPQUMvQixPQUFPLElBQUk2bkMsS0FBQUEsZ0JBQWdCOUI7WUFDN0IsSUFBSXhtQixJQUFJaGIsU0FBU21LLGFBQUFBLG1CQUFtQjFPLE9BQ2xDLE9BQU8sSUFBSTBPLGFBQUFBLG1CQUFtQnEzQjtZQUNoQyxPQUFPLElBQUluaUMsYUFBQUEsY0FBY21pQztBQUMzQjs7SUExbENldDRCLE1BQUFBLFdBQUEsRUFGZHBDLGlCQUNBeThCLG9JQU15QjcyQixLQUFBQSw4REF1Q3pCc3FCLG9CQUFBMXRCLFdBQUEsVUFBQTtJQUlLSixNQUFBQSxXQUFBLEVBRkxwQyxpQkFDQXk4Qiw0R0FHeUI3MkIsS0FBQUEsOERBZXpCc3FCLG9CQUFBMXRCLFdBQUEsZUFBQTtJQVdLSixNQUFBQSxXQUFBLEVBRkxwQyxpQkFDQXk4QixvSEFJeUI3MkIsS0FBQUEsOERBZ0J6QnNxQixvQkFBQTF0QixXQUFBLFFBQUE7SUE0QktKLE1BQUFBLFdBQUEsRUFGTHBDLGlCQUNBeThCLG9JQU15QjcyQixLQUFBQSw4REF3Q3pCc3FCLG9CQUFBMXRCLFdBQUEsVUFBQTtJQVdjSixNQUFBQSxXQUFBLEVBRmRwQyxpQkFDQXk4QixvSEFJeUI3MkIsS0FBQUEsOERBOEJ6QnNxQixvQkFBQTF0QixXQUFBLFVBQUE7SUE0QktKLE1BQUFBLFdBQUEsRUFETHBDLGdJQUdXMDhCLE1BQUMsZUFBREEsT0FBQyxhQUFBQyxLQUFBOW5DLFFBQUFBLFFBRWErUSxLQUFBQSw4REF3Q3pCc3FCLG9CQUFBMXRCLFdBQUEsT0FBQTtJQWFLSixNQUFBQSxXQUFBLEVBRExwQyw0SEFLeUI0RixLQUFBQSw4REF3QnpCc3FCLG9CQUFBMXRCLFdBQUEsUUFBQTtJQXd4QkgwdEIsb0JBQW9CME07SUFDcEJ6TSxLQUFBQSxRQUFRME0sV0FBV3YxQjtJQ3Z3RGIsTUFBT3cxQiw2QkFBNkJmLEtBQUFBO1FBZ0J4QyxXQUFBcGlDLENBQXNCMGM7WUFDcEJyYztZQURvQmMsS0FBQXViLFNBQUFBO1lBUGR2YixLQUFBbUosVUFBVSxJQUFJQyxZQUFZO0FBU2xDO1FBT1MsV0FBTXN3QixJQUNWdDRCO1lBRUgsT0FBTUQsS0FBRUEsS0FBS0MsU0FBUzZnQyxxQkFDZGppQyxLQUFLcUIsT0FBT0QsU0FBU3VCLEtBQUFBLGdCQUFnQnUvQixVQUFVLE9BQ3JEdmhDLElBQUlYLEtBQUswNUI7WUFDWDtzQkFDUXg2QixNQUFNdzZCLFNBQVN1STtBQUN2QixjQUFFLE9BQU9ob0M7Z0JBQ1BrSCxJQUFJeW9CLE1BQU0saURBQWlEM3ZCO0FBQzdEO1lBQ0EsSUFBSStGLEtBQUttaUMsZ0JBQWdCO2dCQUN2QjswQkFDUW5pQyxLQUFLbWlDLGVBQWV6STtBQUM1QixrQkFBRSxPQUFPei9CO29CQUNQa0gsSUFBSXlvQixNQUFNLHlDQUF5QzN2QjtBQUNyRDtvQkFDRStGLEtBQUttaUMsaUJBQWlCMW1DO0FBQ3hCO0FBQ0Y7QUFDRjtRQVFRLFlBQUEybUMsQ0FBYUM7WUFDbkIsTUFBTUMsT0FBT3RpQyxLQUFLbUosUUFBUW5HLE9BQU9xL0I7WUFDakMsT0FBTzltQyxLQUFLd0gsTUFBTXUvQjtBQUNwQjtRQVFTLE9BQUFDLENBQVFDO1lBQ2YsTUFBTUEsb0JBQW9CcE4sc0JBQ3hCLE1BQU0sSUFBSS8xQixLQUFBQSxpQkFDUjtZQUVKSCxNQUFNcWpDLFFBQVFDO1lBQ2QsT0FBTyxNQUFNeGlDLEtBQUt5aUMsVUFBVUQ7QUFDOUI7UUFVUyxxQkFBTW41QixDQUNicEUsT0FDQXFFLE9BQ0FoRSxPQUNHL0Y7WUFFSCxPQUFNNEIsS0FBRUEsS0FBR0MsU0FBRUEsV0FBWWkwQixhQUFRaDBCLE9BQy9CckIsS0FBS3FKLGlCQUNMQyxPQUNBLFVBQ0cvSjtZQUVMLEtBQUtTLEtBQUtsQixTQUFTO2dCQUNqQnFDLElBQUlLLFFBQ0YseUVBQXlFeUQsVUFBVSxXQUFXQSxRQUFRL0ssb0JBQUFBLE1BQU11SCxVQUFVd0QsVUFBVXFFO2dCQUVsSTtBQUNGO1lBQ0E7c0JBQ1F0SixLQUFLbEIsUUFBUTRqQyxRQUFRejlCLE9BQU9xRSxPQUFPaEUsT0FBT2xFO0FBQ2xELGNBQUUsT0FBT25IO2dCQUNQLE1BQU0sSUFBSXdELGFBQUFBLGNBQWMsK0JBQStCeEQ7QUFDekQ7QUFDRjtRQXVCVSxrQkFBTTBvQyxDQUNkQztZQUVBLEtBQUs1aUMsS0FBS21pQyxnQkFDUixNQUFNLElBQUkxa0MsYUFBQUEsY0FDUjtZQUdKLEtBQUt1QyxLQUFLbEIsWUFBWWtCLEtBQUtsQixRQUFRcVAsUUFDakMsTUFBTSxJQUFJMVEsYUFBQUEsY0FBYztZQUUxQixNQUFNaUYsTUFDSmtnQyxnQkFDTzVpQyxLQUFLbEIsUUFBUXFrQixRQUNsQnpmLGFBQUFBLGNBQWNDLE1BQ2Q7Z0JBQ0VrL0IsZUFBZTdpQyxLQUFLbEIsUUFBUXFQLE9BQU80dUI7ZUFFcEMvOEIsS0FBSzJGLFVBQVUzRixLQUFLMkYsT0FBTyxNQUFRekwsb0JBQUFBO1lBRXhDLE1BQU1pSCxNQUFNbkIsS0FBS21CLElBQUlSLElBQUlYLEtBQUsyaUM7WUFFOUJ4aEMsSUFBSThjLEtBQ0YsK0NBQStDamUsS0FBS2xCLFFBQVFxUCxPQUFPNHVCLDhCQUE4Qi84QixLQUFLbEIsUUFBUXFQLE9BQU8ydUI7WUFHdkg7Z0JBQ0UsV0FBVyxNQUFNZ0csT0FBTzlpQyxLQUFLbWlDLGdCQUFnQjtvQkFDM0MsT0FBTXQ2QixPQUFFQSxPQUFLeUIsT0FBRUEsT0FBS2MsT0FBRUEsU0FBVThmLGVBQWU0WSxJQUFJQztvQkFDbkQsSUFDRS9pQyxLQUFLbEIsUUFBUXFQLFFBQVE2MEIsZ0JBQ3JCNTRCLFNBQ0FBLFVBQVVwSyxLQUFLbEIsUUFBUXFQLFFBQVF6UixPQUUvQjtvQkFDRixNQUFNWCxVQUF3Q2lFLEtBQUtvaUMsYUFDakRVLElBQUkvbUM7b0JBRU47d0JBQ0UsTUFBTWtuQyxjQUFjcDdCLFFBQ2hCM04sb0JBQUFBLE1BQU0yTCxJQUFJZ0MsU0FDVjNOLG9CQUFBQSxNQUFNMkwsSUFBSTdGLEtBQUsyRixPQUFPLEdBQUc5TDt3QkFDN0IsTUFBTXFwQyxXQUFXRCxnQkFBZ0JwN0IsU0FBUzdILEtBQUsyRixPQUFPLElBQUk5TDt3QkFDMUQsTUFBTXNwQyxlQUFlcG5DLFFBQVF6QixTQUFTLEVBQUN5QixRQUFRekIsUUFBUW9JLFFBQU8sRUFBQ0E7OEJBQ3pEMUMsS0FBS3FKLGdCQUNUNjVCLFVBQ0E1NUIsT0FDQXZOLFFBQVF1SixPQUNKNjlCO0FBRVIsc0JBQUUsT0FBT2xwQzt3QkFDUGtILElBQUl5b0IsTUFDRix1Q0FBdUMvaEIsZUFBZXlCLGFBQWF2TixRQUFRdUosT0FBT3JMO0FBRXRGO0FBQ0Y7QUFDRixjQUFFLE9BQU9BO2dCQUNQa0gsSUFBSXlvQixNQUNGLHVDQUF1QzVwQixLQUFLbEIsUUFBUXFQLE9BQU80dUIsOEJBQThCLzhCLEtBQUtsQixRQUFRcVAsT0FBTzJ1QixhQUFhN2lDO3NCQUV0SCtGLEtBQUswNUIsTUFBTWgzQjtBQUNuQjtBQUNGO1FBWW1CLGdCQUFNeUk7WUFDdkIsS0FBS25MLEtBQUtsQixTQUNSLE1BQU0sSUFBSXJCLGFBQUFBLGNBQWM7WUFFMUIsTUFBTXN2QixrQkFBa0Ivc0IsS0FBS2xCLFFBQVFxUCxPQUFPNGUsb0JBQW9CO1lBRWhFLEtBQUtBLGlCQUFpQjtnQkFFcEIsTUFBTTVKLGdCQUFnQm5qQixLQUFLbEIsUUFBUXFrQixRQUNqQyxZQUNBO29CQUNFMGYsZUFBZTdpQyxLQUFLbEIsUUFBUXFQLE9BQU80dUI7bUJBRXJDN2lDO2dCQUVGLE9BQU13SSxLQUFFQSxPQUFRMUMsS0FBS3FCLE9BQU8sRUFBQzhoQixXQUFVbmpCLEtBQUttTDtnQkFDNUMsTUFBTWt1QixnQkFBZ0JqRSxvQkFBb0J3RCxXQUN4Q2wyQixLQUNBMUMsS0FBS2xCLFFBQVFxUCxRQUNibk8sS0FBS3ViO2dCQUVQLE1BQU1xaEIsVUFBVXZELFFBQVF3RCxXQUFXNzhCLEtBQUtsQixRQUFRcVAsT0FBTzJ1QjtnQkFDdkQsS0FBSzk4QixLQUFLbEIsU0FDUixNQUFNLElBQUlyQixhQUFBQSxjQUFjO2dCQUMxQnVDLEtBQUttaUMsdUJBQXVCdkYsUUFBUXdHLG1CQUNsQ3BqQyxLQUFLbEIsUUFBUXFQLE9BQU80dUI7Z0JBRXRCLzhCLEtBQUsyaUMsYUFBYWpnQztBQUNwQjtZQU9FLEVBQ0VnQixhQUFBQSxjQUFja0MsUUFDZGxDLGFBQUFBLGNBQWN3MEIsUUFDZHgwQixhQUFBQSxjQUFjeTBCLFFBQ2QzQixhQUFBQSxzQkFBc0JDLFlBQ3RCRCxhQUFBQSxzQkFBc0JNLFlBQ3RCTixhQUFBQSxzQkFBc0JTLGFBRXhCOTlCLFFBQVNrcUM7Z0JBQ1QsS0FBS3JqQyxLQUFLbEIsU0FDUixNQUFNLElBQUlyQixhQUFBQSxjQUNSO2dCQUVKLEtBQUt1QyxLQUFLbEIsUUFBUXVrQyxTQUNoQixNQUFNLElBQUk1bEMsYUFBQUEsY0FDUixVQUFVNGxDLHVCQUF1QnJqQyxLQUFLbEIsUUFBUW12QjtnQkFHbEQsSUFBSXhMLGFBQWExb0IsT0FBT3VwQyx5QkFBeUJ0akMsS0FBS2xCLFNBQVN1a0M7Z0JBQy9ELElBQUlFLFFBQWF2akMsS0FBS2xCO2dCQUN0QixRQUFRMmpCLGNBQWM4Z0IsVUFBVXhwQyxPQUFPMk4sV0FBVztvQkFDaEQ2N0IsUUFBUXhwQyxPQUFPeXBDLGVBQWVEO29CQUM5QjlnQixhQUFhMW9CLE9BQU91cEMseUJBQXlCQyxPQUFPRjtBQUN0RDtnQkFFQSxLQUFLNWdCLGVBQWVBLFdBQVdrQixVQUFVO29CQUN2QzNqQixLQUFLbUIsSUFBSXlvQixNQUNQLHlCQUF5QnlaO29CQUUzQjtBQUNGO2dCQUNBLFNBQVNJLGFBQWE3VjtvQkFDcEIsUUFBUUE7c0JBQ04sS0FBSzRJLGFBQUFBLHNCQUFzQkM7d0JBQ3pCLE9BQU8veUIsYUFBQUEsY0FBY2tDOztzQkFDdkIsS0FBSzR3QixhQUFBQSxzQkFBc0JNO3dCQUN6QixPQUFPcHpCLGFBQUFBLGNBQWN3MEI7O3NCQUN2QixLQUFLMUIsYUFBQUEsc0JBQXNCUzt3QkFDekIsT0FBT3Z6QixhQUFBQSxjQUFjeTBCOztzQkFDdkI7d0JBQ0UsT0FBT3ZLOztBQUViO2dCQUdBNXRCLEtBQUtsQixRQUFRdWtDLFVBQVUsSUFBSXhDLE1BQU03Z0MsS0FBS2xCLFFBQVF1a0MsU0FBUztvQkFDckRwZ0IsT0FBTzlvQixPQUNMb29CLFFBQ0F1ZSxTQUNBQzt3QkFHQSxNQUFNem1DLGVBQWVpb0IsT0FBT1UsTUFBTTZkLFNBQVNDO3dCQUUzQyxNQUFNOWhDLFFBQTBCOGhDLFNBQVM7d0JBSXpDLEtBQUtoVSxvQkFBb0I3eUIsMEJBQU11bUIsWUFBWXhoQixRQUFRLE9BQU8zRTt3QkFHMUQsT0FBTTZHLEtBQUVBLEtBQUdDLFNBQUVBLFNBQU9zQixLQUFFQSxPQUFRbytCLFFBQVEsVUFDcENDLFNBQVNqK0IsTUFBTWkrQixTQUFTbmxDLFNBQVMsSUFDakMybUI7d0JBRUYsTUFBTWhjLE1BQU13NkIsU0FBUzt3QkFDckIsTUFBTTJDLGFBQW9CLEVBQUN6a0MsT0FBT3drQyxhQUFhSixTQUFTOThCO3dCQUV4RCxJQUFJN0QsSUFBSWMsZUFBZSxzQkFBc0I7NEJBQzNDa2dDLFdBQVczb0MsS0FBS1Q7QUFDbEI7d0JBQ0EwRixLQUFLcUosbUJBQ0NxNkIsZUFDRHRpQyxTQUNIcStCLE1BQU94bEMsS0FDUGtILElBQUl5b0IsTUFDRiwyQ0FBMkN5WixhQUFhcGtDLE1BQU1wRixRQUFRb0YsYUFBYXNILFFBQVF0TTt3QkFHL0YsT0FBT0s7Ozs7QUFJZjs7SUFHRixJQUFJODZCLHFCQUNGQSxvQkFBb0IsbUJBQW1CNE07SUM1WWxDLE1BQU0yQixVQUFVO0lBQ2hCLE1BQU1DLGVBQWU7SUFFNUJ0N0IsV0FBQUEsU0FBU3U3QixnQkFBZ0JELGNBQWNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7In0=
3778
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY29udHJhY3RzL2VyYzIwL21vZGVscy50cyIsIi4uL3NyYy9zaGFyZWQvQ2xpZW50U2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvZXJjMjAvRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnRzIiwiLi4vc3JjL2NsaWVudC9pZHMvaWQtZXh0cmFjdGlvbi50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvSWRlbnRpdHlDcmVkZW50aWFscy50cyIsIi4uL3NyYy9zaGFyZWQvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eS50cyIsIi4uL3NyYy9jbGllbnQvdXRpbHMudHMiLCIuLi9zcmMvY2xpZW50L2NyeXB0by50cyIsIi4uL3NyYy9zaGFyZWQvZXJyb3JzLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNFbnJvbGxtZW50U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL3NoYXJlZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9zaGFyZWQvZXZlbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljSWRlbnRpdHlTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvZmFicmljLWZzLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRTdGF0ZW1lbnQudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgSW5kZXggPSBDcmVhdGVJbmRleFJlcXVlc3Q7XG5cbmZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG4gIGNvbnN0IGRpcm5hbWU6IHN0cmluZyA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGRpcm5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGRpcm5hbWUpO1xuICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1vZGVsSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPlxuKTogSW5kZXhbXSB7XG4gIHJldHVybiBnZW5lcmF0ZUluZGV4ZXMoW21dKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBhY2N1bT86IFJlY29yZDxzdHJpbmcsIENvdWNoREJEZXNpZ25Eb2M+XG4pOiBDb3VjaERCRGVzaWduRG9jW10ge1xuICBjb25zdCB2aWV3cyA9IGdlbmVyYXRlVmlld3MoW21dKTtcbiAgY29uc3Qgc3RvcmFnZTogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz4gPSBhY2N1bSB8fCB7fTtcbiAgdmlld3MuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgc3RvcmFnZVtkb2MuX2lkXSA9IGRvYztcbiAgfSk7XG4gIHJldHVybiB2aWV3cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNb2RlbEZpbGUoZmlsZTogYW55KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZXhwb3J0cyA9IHJlcXVpcmUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGZpbGUucGFyZW50UGF0aCwgZmlsZS5uYW1lKSk7XG5cbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhleHBvcnRzKS5maWx0ZXIoKGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbSA9IG5ldyAoZSBhcyBDb25zdHJ1Y3RvcikoKTtcbiAgICAgIHJldHVybiBtIGluc3RhbmNlb2YgTW9kZWw7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSkgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W107XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTW9kZWxGb2xkZXJzKFxuICAuLi5mb2xkZXJzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTxNb2RlbENvbnN0cnVjdG9yPGFueT5bXT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IGZpbGVzID0gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhmb2xkZXIsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGY6IGFueSkgPT4gZi5pc0ZpbGUoKSAmJiBmLm5hbWUuZW5kc1dpdGgoXCJqc1wiKSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5yZWFkTW9kZWxGaWxlKGZpbGUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW5kZXhlcyhcbiAgaW5kZXhlczogSW5kZXhbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgaW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1pbmRleGVzLyR7aW5kZXgubmFtZX0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGluZGV4LCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURlc2lnbkRvY3MoXG4gIGRlc2lnbkRvY3M6IENvdWNoREJEZXNpZ25Eb2NbXSxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgY29sbGVjdGlvbj86IHN0cmluZ1xuKSB7XG4gIGlmICghZGVzaWduRG9jcy5sZW5ndGgpIHJldHVybjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBkZXNpZ25Eb2NzLmZvckVhY2goKGRvYykgPT4ge1xuICAgIGNvbnN0IGRvY0lkID0gZG9jLl9pZC5yZXBsYWNlKC9eX2Rlc2lnblxcLy8sIFwiXCIpO1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIHAsXG4gICAgICAgIGAuL01FVEEtSU5GL3N0YXRlZGIvY291Y2hkYi8ke2NvbGxlY3Rpb24gPyBgY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9ufS9gIDogXCJcIn1kZXNpZ25fZG9jcy8ke2RvY0lkfS5qc29uYFxuICAgICAgKVxuICAgICk7XG4gICAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IC4uLmRvYyB9O1xuICAgIGRlbGV0ZSBwYXlsb2FkLl9yZXY7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCB1bmRlZmluZWQsIDIpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQ291Y2hEQkRlc2lnbkRvYyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgd3JpdGVEZXNpZ25Eb2NzIH0gZnJvbSBcIi4uL2luZGV4ZXMvZ2VuZXJhdGlvblwiO1xuXG4vL1xuLy8gZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbi8vICAgbmFtZTogXCJjb2xsZWN0aW9uTWFyYmxlc1wiO1xuLy8gICBwb2xpY3k6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgcmVxdWlyZWRQZWVyQ291bnQ6IDA7XG4vLyAgIG1heFBlZXJDb3VudDogMztcbi8vICAgYmxvY2tUb0xpdmU6IDA7XG4vLyAgIG1lbWJlck9ubHlSZWFkOiB0cnVlO1xuLy8gICBtZW1iZXJPbmx5V3JpdGU6IHRydWU7XG4vLyAgIGVuZG9yc2VtZW50UG9saWN5OiB7XG4vLyAgICAgaWRlbnRpdGllczogW1xuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzFNU1BcIiB9IH0sXG4vLyAgICAgICB7IHJvbGU6IHsgbmFtZTogXCJtZW1iZXJcIjsgbXNwSWQ6IFwiT3JnMk1TUFwiIH0gfSxcbi8vICAgICBdO1xuLy8gICAgIHJ1bGU6IFwiT1IoJ09yZzFNU1AubWVtYmVyJywgJ09yZzJNU1AubWVtYmVyJylcIjtcbi8vICAgfTtcbi8vIH07XG5cbmV4cG9ydCB0eXBlIEZhYnJpY1BvbGljeUlkZW50aXR5ID0ge1xuICByb2xlOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1zcElkOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k6IHtcbiAgICBpZGVudGl0aWVzOiBGYWJyaWNQb2xpY3lJZGVudGl0eVtdO1xuICAgIHJ1bGU6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFByaXZhdGVDb2xsZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBvbGljeTogc3RyaW5nO1xuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyO1xuICBtYXhQZWVyQ291bnQ6IG51bWJlcjtcbiAgYmxvY2tUb0xpdmU6IG51bWJlcjtcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW47XG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbjtcbiAgZW5kb3JzZW1lbnRQb2xpY3k/OiB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdGlvbkZvcihcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcG9saWN5OiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbixcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY29sbGVjdGlvbk5hbWUsXG4gICAgcG9saWN5OiBwb2xpY3ksXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICBtc3BJZDogc3RyaW5nLFxuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nID0gYCR7bXNwSWR9UHJpdmF0ZWAsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDAsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCcke21zcElkfS5tZW1iZXInKWAsXG4gICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgbWF4UGVlckNvdW50LFxuICAgIGJsb2NrVG9MaXZlLFxuICAgIG1lbWJlck9ubHlSZWFkLFxuICAgIG1lbWJlck9ubHlXcml0ZVxuICApO1xuXG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgT1IoJyR7bXNwSWR9LnBlZXInKWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgbXNwSWRzOiBzdHJpbmdbXSxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyxcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlciA9IDEsXG4gIG1heFBlZXJDb3VudDogbnVtYmVyID0gMixcbiAgYmxvY2tUb0xpdmU6IG51bWJlciA9IDAsXG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuID0gdHJ1ZSxcbiAgbWVtYmVyT25seVdyaXRlOiBib29sZWFuID0gdHJ1ZVxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICBjb25zdCBjID0gY29sbGVjdGlvbkZvcihcbiAgICBjb2xsZWN0aW9uTmFtZSxcbiAgICBgT1IoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ubWVtYmVyJ2ApLmpvaW4oXCIsXCIpfSlgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcbiAgYy5lbmRvcnNlbWVudFBvbGljeSA9IHtcbiAgICBzaWduYXR1cmVQb2xpY3k6IGBBTkQoJHttc3BJZHMubWFwKChtKSA9PiBgJyR7bX0ucGVlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgfTtcbiAgcmV0dXJuIGM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0Q29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkczogc3RyaW5nW10sXG4gIG92ZXJyaWRlczoge1xuICAgIHByaXZhdGVDb2xzPzogUGFydGlhbDxQcml2YXRlQ29sbGVjdGlvbj47XG4gICAgc2hhcmVkQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICB9ID0ge30sXG4gIG1pcnJvcjogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgbGV0IHsgcHJpdmF0ZUNvbHMsIHNoYXJlZENvbHMgfSA9IE1vZGVsLmNvbGxlY3Rpb25zRm9yKG0pO1xuXG4gIGZ1bmN0aW9uIHJlc29sdmVDb2xsZWN0aW9uKGFyZzogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHJldHVybiBhcmc7XG4gICAgICByZXR1cm4gYXJnKG0sIG1zcElkc1swXSkgYXMgc3RyaW5nO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGVDb2xzID0gcHJpdmF0ZUNvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcbiAgc2hhcmVkQ29scyA9IHNoYXJlZENvbHMubWFwKHJlc29sdmVDb2xsZWN0aW9uKTtcblxuICBjb25zdCBwcml2YXRlRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAwLFxuICAgICAgbWF4UGVlckNvdW50OiAwLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8ucHJpdmF0ZUNvbHMgfHwge31cbiAgKTtcbiAgY29uc3Qgc2hhcmVkRGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50OiAxLFxuICAgICAgbWF4UGVlckNvdW50OiAyLFxuICAgICAgYmxvY2tUb0xpdmU6IDAsXG4gICAgICBtZW1iZXJPbmx5UmVhZDogdHJ1ZSxcbiAgICAgIG1lbWJlck9ubHlXcml0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIG92ZXJyaWRlcz8uc2hhcmVkQ29scyB8fCB7fVxuICApO1xuXG4gIGNvbnN0IG1pcnJvck1ldGEgPSBtaXJyb3IgPyBNb2RlbC5taXJyb3JlZEF0KG0pIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHByaXZhdGVzID0gbXNwSWRzXG4gICAgLm1hcCgobXNwSWQpID0+XG4gICAgICAocHJpdmF0ZUNvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgICBwcml2YXRlRGVmYXVsdHM7XG4gICAgICAgIHJldHVybiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgICAgICAgICBtc3BJZCxcbiAgICAgICAgICBwLFxuICAgICAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgICAgICBibG9ja1RvTGl2ZSxcbiAgICAgICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApXG4gICAgLmZsYXQoKTtcblxuICBpZiAobWlycm9yTWV0YSAmJiBtaXJyb3JNZXRhLm1zcElkKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPVxuICAgICAgdHlwZW9mIG1pcnJvck1ldGEucmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtaXJyb3JNZXRhLnJlc29sdmVyXG4gICAgICAgIDogbWlycm9yTWV0YS5yZXNvbHZlcihtLCBtaXJyb3JNZXRhLm1zcElkKTtcbiAgICBpZiAoXG4gICAgICByZXNvbHZlZCAmJlxuICAgICAgIXByaXZhdGVzLnNvbWUoXG4gICAgICAgIChwKSA9PiBwLm5hbWUgPT09IHJlc29sdmVkICYmIHAucG9saWN5LmluY2x1ZGVzKG1pcnJvck1ldGEubXNwSWQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlcXVpcmVkUGVlckNvdW50LCBtYXhQZWVyQ291bnQsIGJsb2NrVG9MaXZlLCBtZW1iZXJPbmx5UmVhZCB9ID1cbiAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgcHJpdmF0ZXMucHVzaChcbiAgICAgICAgcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbWlycm9yTWV0YS5tc3BJZCxcbiAgICAgICAgICByZXNvbHZlZCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzaGFyZWQgPSAoc2hhcmVkQ29scyBhcyBzdHJpbmdbXSkubWFwKChwKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlLFxuICAgIH0gPSBzaGFyZWREZWZhdWx0cztcbiAgICByZXR1cm4gc2hhcmVkQ29sbGVjdGlvbkZvcihcbiAgICAgIG1zcElkcyxcbiAgICAgIHAsXG4gICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgIG1heFBlZXJDb3VudCxcbiAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICBtZW1iZXJPbmx5V3JpdGVcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVzLFxuICAgIHNoYXJlZCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbnMoXG4gIGNvbHM6IFByaXZhdGVDb2xsZWN0aW9uW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGZpbGVOYW1lID0gXCJjb2xsZWN0aW9uc19jb25maWdcIlxuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpIGFzIHN0cmluZztcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgICBmcy5ta2RpclN5bmMoZGlybmFtZSk7XG4gIH1cblxuICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihwLCBgLi9NRVRBLUlORi8ke2ZpbGVOYW1lfS5qc29uYCkpO1xuICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkoY29scywgdW5kZWZpbmVkLCAyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25EZXNpZ25Eb2NzKFxuICBkb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRvY3M/Lmxlbmd0aCkgcmV0dXJuO1xuICB3cml0ZURlc2lnbkRvY3MoZG9jcywgcCwgY29sbGVjdGlvbik7XG59XG4iLCJpbXBvcnQge1xuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBhZ2luYXRvcixcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFNlcmlhbGl6ZWRQYWdlLFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50UGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIE1bXSxcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGJvb2ttYXJrPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgcXVlcnk6IE1hbmdvUXVlcnkgfCBQcmVwYXJlZFN0YXRlbWVudDxhbnk+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBgUmF3IHF1ZXJ5IGFjY2VzcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuIG9ubHkgcHJlcGFyZWQgc3RhdGVtZW50cyBhcmUgbmF0aXZlbHkgYXZhaWxhYmxlYFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBwYWdlKFxuICAgIHBhZ2U6IG51bWJlciA9IDEsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gc3VwZXIucGFnZShwYWdlLCAuLi5hcmdzKTsgLy8gdGhpcyB3aWxsIGZhaWwgZm9yIG5vbi1wcmVwYXJlZCBzdGF0ZW1lbnRzXG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgaXNTZXJpYWxpemVkUGFnZShvYmo6IFNlcmlhbGl6ZWRQYWdlPGFueT4gfCBhbnkpIHtcbiAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmVDb250ZXh0dWFsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBDb250ZXh0T2YsXG4gIERpcmVjdGlvbkxpbWl0T2Zmc2V0LFxuICBGbGFnc09mLFxuICBPYnNlcnZlckhhbmRsZXIsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQYWdpbmF0b3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICBSZXBvc2l0b3J5LFxuICBTZXJpYWxpemVkUGFnZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWR1Y2VFcnJvcnNUb1ByaW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgRmFicmljIGNsaWVudCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBnZW5lcmljIFJlcG9zaXRvcnkgdG8gcHJlcGFyZSBjb250ZXh0IGFuZCBhcmd1bWVudHMgZm9yIENSVUQgb3BlcmF0aW9ucyBleGVjdXRlZCB2aWEgYSBGYWJyaWMgY2xpZW50IEFkYXB0ZXIsIHdpcmluZyBSZXBvc2l0b3J5RmxhZ3MgYW5kIEZhYnJpYy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gKiBAdGVtcGxhdGUgTSBleHRlbmRzIE1vZGVsIC0gVGhlIG1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHJlcG9zaXRvcnlcbiAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIE1hbmdvUXVlcnksIEZhYnJpY0ZsYWdzLCBDb250ZXh0PEZhYnJpY0ZsYWdzPj59IFthZGFwdGVyXSAtIE9wdGlvbmFsIGFkYXB0ZXIgaW5zdGFuY2UgdXNlZCB0byBleGVjdXRlIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoZSByZXBvc2l0b3J5XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG4gKiBpbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItZmFicmljXCI7XG4gKlxuICogY2xhc3MgVXNlciBleHRlbmRzIE1vZGVsIHsgaWQhOiBzdHJpbmc7IG5hbWUhOiBzdHJpbmc7IH1cbiAqIGNvbnN0IHJlcG8gPSBuZXcgRmFicmljQ2xpZW50UmVwb3NpdG9yeTxVc2VyPigpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgaWQ6IFwiMVwiLCBuYW1lOiBcIkFsaWNlXCIgfSkpO1xuICogY29uc3QgbG9hZGVkID0gYXdhaXQgcmVwby5yZWFkKFwiMVwiKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBSZXBvIGFzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5SZXBvOiBjcmVhdGVQcmVmaXgobW9kZWwsIC4uLmFyZ3MpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkLCBtb2RlbCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogcmVzdWx0XG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50UmVwb3NpdG9yeTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlciA9IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4+IGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBBPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBfb3ZlcnJpZGVzID0gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXJbXCJfb3ZlcnJpZGVzXCJdLCB7XG4gICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICBhbGxvd1Jhd1N0YXRlbWVudHM6IGZhbHNlLFxuICAgIGZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXM6IHRydWUsXG4gICAgZm9yY2VQcmVwYXJlQ29tcGxleFF1ZXJpZXM6IHRydWUsXG4gICAgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGU6IGZhbHNlLFxuICAgIHJlYnVpbGRXaXRoVHJhbnNpZW50OiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sIGZvcmNlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBjbGF6eiwgZm9yY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgb3ZlcnJpZGUoZmxhZ3M6IFBhcnRpYWw8RmxhZ3NPZjxDb250ZXh0T2Y8QT4+Pik6IHRoaXMge1xuICAgIHJldHVybiBzdXBlclxuICAgICAgLm92ZXJyaWRlKE9iamVjdC5hc3NpZ24oe30sIGZsYWdzLCB0aGlzLl9vdmVycmlkZXMpKVxuICAgICAgLmZvcihmbGFncyBhcyBhbnkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBzdXBlci5PYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHBhZ2luYXRlQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbixcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2luYXRlQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luYXRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggcGFnZSBzaXplICR7cmVmLmxpbWl0fWBcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnaW5hdGVCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgb3JkZXIsXG4gICAgICB7IGxpbWl0OiByZWYubGltaXQsIG9mZnNldDogcmVmLm9mZnNldCwgYm9va21hcms6IHJlZi5ib29rbWFyayB9LFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBsaXN0QnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmxpc3RCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgbGlzdGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgJHtrZXkgYXMgc3RyaW5nfSAke29yZGVyfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmxpc3RCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgb3JkZXIsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICB2YWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZEJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIGFsbCAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZEJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kT25lQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmZpbmRPbmVCeSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBPbmUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHdpdGggJHtrZXkgYXMgc3RyaW5nfSAke3ZhbHVlfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmZpbmRPbmVCeS5uYW1lLFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZChcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmZpbmQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5IGRlZmF1bHQgcXVlcnkgYXR0cmlidXRlc2BcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLmZpbmQubmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgb3JkZXIsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcGFnZShcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIGRpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdlKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5IGRlZmF1bHQgcXVlcnkgYXR0cmlidXRlc2BcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2UubmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgcmVmLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHN0YXRlbWVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQZXJzaXN0ZW5jZUtleXMuU1RBVEVNRU5ULCB0cnVlKVxuICAgICkuZm9yKHRoaXMuc3RhdGVtZW50KTtcbiAgICBsb2cudmVyYm9zZShgRXhlY3V0aW5nIHByZXBhcmVkIHN0YXRlbWVudCAke25hbWV9YCk7XG4gICAgY29uc3QgY2FsbEFyZ3MgPSBjdHhBcmdzLnNsaWNlKDAsIC0xKTtcbiAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKFxuICAgICAgdGhpcy5hZGFwdGVyLmRlY29kZShcbiAgICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgY3R4LFxuICAgICAgICAgIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsXG4gICAgICAgICAgW25hbWUsIEpTT04uc3RyaW5naWZ5KGNhbGxBcmdzKV0sXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB0aGlzLmNsYXNzLm5hbWVcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgaHlkcmF0ZWQ6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gKG5ldyB0aGlzLmNsYXNzKHIpIGFzIE0pXG4gICAgICAgICAgOiByXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICApIHtcbiAgICAgIGh5ZHJhdGVkID0gbmV3IHRoaXMuY2xhc3MocmVzdWx0KSBhcyBNO1xuICAgIH0gZWxzZSBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UocmVzdWx0KSkge1xuICAgICAgaHlkcmF0ZWQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGQ6IGFueSkgPT4gbmV3IHRoaXMuY2xhc3MoZCkgYXMgTSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHlkcmF0ZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlBZnRlclJlYWQoaHlkcmF0ZWQsIGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGx5QWZ0ZXJSZWFkKHZhbHVlOiBhbnksIGN0eDogQ29udGV4dE9mPEE+KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIFJlcG9zaXRvcnk8TSwgQT4sIGFueT4oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGN0eCxcbiAgICAgICAgdmFsdWUgYXMgTSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZhbHVlLm1hcCgoZW50cnkpID0+IHRoaXMuYXBwbHlBZnRlclJlYWQoZW50cnksIGN0eCkpKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKEZhYnJpY0NsaWVudFBhZ2luYXRvci5pc1NlcmlhbGl6ZWRQYWdlKHZhbHVlKSkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUFmdGVyUmVhZCh2YWx1ZS5kYXRhLCBjdHgpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudE9mKFxuICAgIGtleT86IGtleW9mIE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+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+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcblxuICBjb25zdCBhbGxvd0dlbmVyYXRpb25PdmVycmlkZSA9XG4gICAgY29udGV4dC5nZXQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGNvbnN0IG93bmVyID0gYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUgPyBtb2RlbFtrZXldIDogY3JlYXRvci5tc3BpZDtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/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+KS5nZXQoXCJmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzXCIpXG4gICAgKSB7XG4gICAgICBjb25zdCBzcXVhc2hlZCA9IHRoaXMuc3F1YXNoKGN0eCBhcyBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPik7XG4gICAgICBpZiAoc3F1YXNoZWQpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlZCA9IHNxdWFzaGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJnczogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdO1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge30gYXMgYW55O1xuXG4gICAgY29uc3QgcHJlcGFyZWQ6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gPSB7XG4gICAgICBjbGFzczogdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBhcmdzLFxuICAgICAgcGFyYW1zLFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgbWV0aG9kOiBzdHJpbmdbXSA9IFtRdWVyeUNsYXVzZS5GSU5EX0JZXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnByZXBhcmVDb25kaXRpb24odGhpcy53aGVyZUNvbmRpdGlvbiwgY3R4IGFzIG5ldmVyKTtcbiAgICAgIG1ldGhvZC5wdXNoKHBhcnNlZC5tZXRob2QpO1xuICAgICAgaWYgKHBhcnNlZC5hcmdzICYmIHBhcnNlZC5hcmdzLmxlbmd0aClcbiAgICAgICAgYXJncy5wdXNoKC4uLihwYXJzZWQuYXJncyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgbWV0aG9kLnB1c2goXG4gICAgICAgIFF1ZXJ5Q2xhdXNlLlNFTEVDVCxcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5qb2luKGAgJHtRdWVyeUNsYXVzZS5BTkQudG9Mb3dlckNhc2UoKX0gYClcbiAgICAgICk7XG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBtZXRob2QucHVzaChRdWVyeUNsYXVzZS5PUkRFUl9CWSwgdGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzBdIGFzIHN0cmluZyk7XG4gICAgICBhcmdzLnB1c2godGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzFdIGFzIGFueSk7XG4gICAgfVxuICAgIHByZXBhcmVkLm1ldGhvZCA9IHRvQ2FtZWxDYXNlKG1ldGhvZC5qb2luKFwiIFwiKSk7XG4gICAgcHJlcGFyZWQucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMucHJlcGFyZWQgPSBwcmVwYXJlZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgcmVjb3JkIGZyb20gQ291Y2hEQi9GYWJyaWNcbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgdGhlIElEIGZyb20gYSBDb3VjaERCIGRvY3VtZW50IGFuZCByZXZlcnRzIGl0IHRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcm9jZXNzUmVjb3JkKFxuICAgIHJlY29yZDogYW55LFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogTSB7XG4gICAgY29uc3QgcGtBdHRyID0gTW9kZWwucGsodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS5nZXQoXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuSUQsIHBrQXR0ciBhcyBzdHJpbmcpXG4gICAgKT8udHlwZTtcblxuICAgIGlmIChyZWNvcmRbQ291Y2hEQktleXMuSURdKSB7XG4gICAgICBjb25zdCBbLCAuLi5rZXlBcmdzXSA9IHJlY29yZFtDb3VjaERCS2V5cy5JRF0uc3BsaXQoQ291Y2hEQktleXMuU0VQQVJBVE9SKTtcbiAgICAgIGNvbnN0IGlkID0ga2V5QXJncy5qb2luKFwiX1wiKTtcbiAgICAgIHJlY29yZFtwa0F0dHJdID0gU2VxdWVuY2UucGFyc2VWYWx1ZSh0eXBlIGFzIGFueSwgaWQpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5wcm9jZXNzUmVjb3JkKHJlY29yZCwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnlcbiAgICogQHN1bW1hcnkgU2VuZHMgYSByYXcgTWFuZ28gcXVlcnkgdG8gRmFicmljIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0b3IgPSAocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlSW5mbztcbiAgICBpZiAoKHJhd0lucHV0IGFzIGFueSk/LmFnZ3JlZ2F0ZSAmJiBhZ2dyZWdhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQWdncmVnYXRlPFI+KGFnZ3JlZ2F0b3IsIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyhcbiAgICAgIHJhd0lucHV0LFxuICAgICAgdHJ1ZSxcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgY3R4XG4gICAgKTtcblxuICAgIGlmICghdGhpcy5zZWxlY3RTZWxlY3Rvcikge1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gcmVzdWx0cy5tYXAoKHIpID0+IHRoaXMucHJvY2Vzc1JlY29yZChyLCBjdHgpKTtcbiAgICAgIGlmICghY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZ0ZXJRdWVyeUhhbmRsZXJzXCIpKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWQgYXMgdW5rbm93biBhcyBSO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFwcGx5QWZ0ZXJIYW5kbGVyc1RvUmVzdWx0KHByb2Nlc3NlZCwgY3R4KSkgYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHMgYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBmcm9tIHRoZSBzdGF0ZW1lbnRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZCgpOiBNYW5nb1F1ZXJ5IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5idWlsZCk7XG4gICAgY29uc3QgYWdncmVnYXRlUXVlcnkgPSB0aGlzLmJ1aWxkQWdncmVnYXRlUXVlcnkoKTtcbiAgICBpZiAoYWdncmVnYXRlUXVlcnkpIHJldHVybiBhZ2dyZWdhdGVRdWVyeTtcbiAgICBjb25zdCBzZWxlY3RvcnM6IE1hbmdvU2VsZWN0b3IgPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgcXVlcnk6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiBzZWxlY3RvcnMgfTtcbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcikgcXVlcnkuZmllbGRzID0gdGhpcy5zZWxlY3RTZWxlY3RvciBhcyBzdHJpbmdbXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBjb25kaXRpb246IE1hbmdvU2VsZWN0b3IgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBDb25kaXRpb24uYW5kKFxuICAgICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgICAgQ29uZGl0aW9uLmF0dHJpYnV0ZTxNPihDb3VjaERCS2V5cy5UQUJMRSBhcyBrZXlvZiBNKS5lcShcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW0NvdWNoREJLZXlzLlRBQkxFXVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IHNlbGVjdG9yS2V5cyA9IE9iamVjdC5rZXlzKGNvbmRpdGlvbikgYXMgTWFuZ29PcGVyYXRvcltdO1xuICAgICAgaWYgKFxuICAgICAgICBzZWxlY3RvcktleXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIE9iamVjdC52YWx1ZXMoQ291Y2hEQkdyb3VwT3BlcmF0b3IpLmluZGV4T2Yoc2VsZWN0b3JLZXlzWzBdKSAhPT0gLTFcbiAgICAgIClcbiAgICAgICAgc3dpdGNoIChzZWxlY3RvcktleXNbMF0pIHtcbiAgICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICAuLi5PYmplY3QudmFsdWVzKFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbltDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdIGFzIE1hbmdvU2VsZWN0b3JcbiAgICAgICAgICAgICAgKS5yZWR1Y2UoKGFjY3VtOiBNYW5nb1NlbGVjdG9yW10sIHZhbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIlRvbyBtYW55IGtleXMgaW4gcXVlcnkgc2VsZWN0b3IuIHNob3VsZCBiZSBvbmVcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0ga2V5c1swXTtcbiAgICAgICAgICAgICAgICBpZiAoayA9PT0gQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EKVxuICAgICAgICAgICAgICAgICAgYWNjdW0ucHVzaCguLi4odmFsW2tdIGFzIGFueVtdKSk7XG4gICAgICAgICAgICAgICAgZWxzZSBhY2N1bS5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgICAgICB9LCBbXSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBjb25kaXRpb247XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIENvdWNoREJHcm91cE9wZXJhdG9yLk9SOiB7XG4gICAgICAgICAgICBjb25zdCBzOiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICBzW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMocXVlcnkuc2VsZWN0b3IpLm1hcCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbikuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmIChxdWVyeS5zZWxlY3RvcltrZXldKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBBICR7a2V5fSBxdWVyeSBwYXJhbSBpcyBhYm91dCB0byBiZSBvdmVycmlkZGVuOiAke3F1ZXJ5LnNlbGVjdG9yW2tleV19IGJ5ICR7dmFsfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jba2V5XSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBxdWVyeS5zb3J0ID0gcXVlcnkuc29ydCB8fCBbXTtcbiAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcXVlcnkuc2VsZWN0b3IgfHwgKHt9IGFzIE1hbmdvU2VsZWN0b3IpO1xuICAgICAgZm9yIChjb25zdCBbc2VsZWN0b3JLZXksIGRpcmVjdGlvbl0gb2YgdGhpcy5vcmRlckJ5U2VsZWN0b3JzKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gc2VsZWN0b3JLZXkgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCByZWM6IFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPiA9IHt9O1xuICAgICAgICByZWNbc2VsZWN0b3JdID0gZGlyZWN0aW9uIGFzIE9yZGVyRGlyZWN0aW9uO1xuICAgICAgICAocXVlcnkuc29ydCBhcyBSZWNvcmQ8c3RyaW5nLCBPcmRlckRpcmVjdGlvbj5bXSkucHVzaChyZWMpO1xuICAgICAgICBpZiAoIXF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSkge1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAgICAgKHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSXSA9XG4gICAgICAgICAgICBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGltaXRTZWxlY3Rvcikge1xuICAgICAgcXVlcnkubGltaXQgPSB0aGlzLmxpbWl0U2VsZWN0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKFxuICAgICAgICBgTm8gbGltaXQgc2VsZWN0b3IgZGVmaW5lZC4gVXNpbmcgZGVmYXVsdCBjb3VjaGRiIGxpbWl0IG9mICR7Q291Y2hEQlF1ZXJ5TGltaXR9YFxuICAgICAgKTtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gQ291Y2hEQlF1ZXJ5TGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub2Zmc2V0U2VsZWN0b3IpIHF1ZXJ5LnNraXAgPSB0aGlzLm9mZnNldFNlbGVjdG9yO1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb25kaXRpb24gaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBDb25kaXRpb24gb2JqZWN0IGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogTWFuZ29RdWVyeSB7XG4gICAgZnVuY3Rpb24gbWVyZ2UoXG4gICAgICBvcDogTWFuZ29PcGVyYXRvcixcbiAgICAgIG9iajE6IE1hbmdvU2VsZWN0b3IsXG4gICAgICBvYmoyOiBNYW5nb1NlbGVjdG9yXG4gICAgKTogTWFuZ29RdWVyeSB7XG4gICAgICBjb25zdCByZXN1bHQ6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiB7fSBhcyBNYW5nb1NlbGVjdG9yIH07XG4gICAgICByZXN1bHQuc2VsZWN0b3Jbb3BdID0gW29iajEsIG9iajJdO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPjtcbiAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgfTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuU1RBUlRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiU1RBUlRTX1dJVEggcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICBpZiAodHlwZW9mIGNvbXBhcmlzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiU1RBUlRTX1dJVEggcmVxdWlyZXMgYSBzdHJpbmcgY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IHJhbmdlID0gcHJlZml4UmFuZ2UoY29tcGFyaXNvbik7XG4gICAgICBjb25zdCBzZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvclthdHRyMV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKHNlbGVjdG9yW2F0dHIxXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSX0VRXSA9IHJhbmdlLnN0YXJ0O1xuICAgICAgKHNlbGVjdG9yW2F0dHIxXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuU01BTExFUl0gPSByYW5nZS5lbmQ7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciB9O1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuRU5EU19XSVRIKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIxICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJFTkRTX1dJVEggcmVxdWlyZXMgYSBzdHJpbmcgY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHtcbiAgICAgICAgW0NvdWNoREJPcGVyYXRvci5SRUdFWFBdOiBgJHtlc2NhcGVSZWdFeHAoY29tcGFyaXNvbil9JGAsXG4gICAgICB9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciB9O1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuQkVUV0VFTikge1xuICAgICAgY29uc3QgYXR0ciA9IGF0dHIxIGFzIHN0cmluZztcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb21wYXJpc29uKSB8fCBjb21wYXJpc29uLmxlbmd0aCAhPT0gMilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJCRVRXRUVOIG9wZXJhdG9yIHJlcXVpcmVzIFttaW4sIG1heF0gY29tcGFyaXNvblwiKTtcbiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb21wYXJpc29uO1xuICAgICAgY29uc3Qgb3BCZXR3ZWVuOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wQmV0d2VlblthdHRyXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BCZXR3ZWVuW2F0dHJdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuQklHR0VSX0VRKVxuICAgICAgXSA9IG1pbjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5TTUFMTEVSX0VRKVxuICAgICAgXSA9IG1heDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcEJldHdlZW4gfTtcbiAgICB9XG5cbiAgICBsZXQgb3A6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgIGlmIChcbiAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICApID09PSAtMVxuICAgICkge1xuICAgICAgb3BbYXR0cjEgYXMgc3RyaW5nXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbYXR0cjEgYXMgc3RyaW5nXSBhcyBNYW5nb1NlbGVjdG9yKVt0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpXSA9XG4gICAgICAgIGNvbXBhcmlzb247XG4gICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICBvcCA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvciBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIChhdHRyMSBhcyB1bmtub3duIGFzIHsgYXR0cjE6IHN0cmluZyB9KS5hdHRyMVxuICAgICAgXSA9IGNvbXBhcmlzb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wMTogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgb3AyOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvcjtcbiAgICAgIG9wID0gbWVyZ2UodHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKSwgb3AxLCBvcDIpLnNlbGVjdG9yO1xuICAgIH1cblxuICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYW4gYWdncmVnYXRlIHF1ZXJ5IGlmIGFnZ3JlZ2F0aW9uIGlzIHJlcXVlc3RlZFxuICAgKiBAc3VtbWFyeSBDaGVja3MgZm9yIGFnZ3JlZ2F0ZSBvcGVyYXRpb25zIGFuZCByZXR1cm5zIGEgc3BlY2lhbCBNYW5nb1F1ZXJ5IGZvciB0aGVtXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQWdncmVnYXRlUXVlcnkoKTogTWFuZ29RdWVyeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5hdmdTZWxlY3Rvcikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gU3RyaW5nKHRoaXMuYXZnU2VsZWN0b3IpO1xuICAgICAgY29uc3Qgc3VtSW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcInN1bVwiLCBhdHRyaWJ1dGUpO1xuICAgICAgY29uc3QgY291bnRJbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwiY291bnRcIiwgYXR0cmlidXRlKTtcbiAgICAgIGlmICghc3VtSW5mbyB8fCAhY291bnRJbmZvKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICBgQXZnIG9wZXJhdGlvbiByZXF1aXJlcyBzdW0gYW5kIGNvdW50IHZpZXdzIGZvciBhdHRyaWJ1dGUgJHthdHRyaWJ1dGV9YFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoe1xuICAgICAgICBraW5kOiBcImF2Z1wiLFxuICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgIHN1bURlc2NyaXB0b3I6IHN1bUluZm8uZGVzY3JpcHRvcixcbiAgICAgICAgY291bnREZXNjcmlwdG9yOiBjb3VudEluZm8uZGVzY3JpcHRvcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9XG4gICAgICAgIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yID09IG51bGxcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogU3RyaW5nKHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yKTtcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJkaXN0aW5jdFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgaW5mby5jb3VudERpc3RpbmN0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRvclVzZWQgPVxuICAgICAgdHlwZW9mIHRoaXMuY291bnRTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgdHlwZW9mIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAhIXRoaXMubWluU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5tYXhTZWxlY3RvciB8fFxuICAgICAgISF0aGlzLnN1bVNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuZGlzdGluY3RTZWxlY3RvcjtcblxuICAgIGNvbnN0IGFnZ3JlZ2F0b3JDaGVja3M6IEFycmF5PFtWaWV3S2luZCwgU2VsZWN0U2VsZWN0b3I8TT4gfCB1bmRlZmluZWRdPiA9IFtcbiAgICAgIFtcbiAgICAgICAgXCJjb3VudFwiLFxuICAgICAgICAodGhpcy5jb3VudFNlbGVjdG9yID8/IHVuZGVmaW5lZCkgYXMgU2VsZWN0U2VsZWN0b3I8TT4gfCB1bmRlZmluZWQsXG4gICAgICBdLFxuICAgICAgW1wibWF4XCIsIHRoaXMubWF4U2VsZWN0b3JdLFxuICAgICAgW1wibWluXCIsIHRoaXMubWluU2VsZWN0b3JdLFxuICAgICAgW1wic3VtXCIsIHRoaXMuc3VtU2VsZWN0b3JdLFxuICAgICAgW1wiZGlzdGluY3RcIiwgdGhpcy5kaXN0aW5jdFNlbGVjdG9yXSxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBba2luZCwgc2VsZWN0b3JdIG9mIGFnZ3JlZ2F0b3JDaGVja3MpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHNlbGVjdG9yID8gU3RyaW5nKHNlbGVjdG9yKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3Ioa2luZCwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChpbmZvKSByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICB9XG5cbiAgICBpZiAoYWdncmVnYXRvclVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBgTm8gQ291Y2hEQiB2aWV3IG1ldGFkYXRhIGZvdW5kIGZvciB0YWJsZSAke01vZGVsLnRhYmxlTmFtZShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgICApfSBhZ2dyZWdhdG9yYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBhZ2dyZWdhdGUgZGVzY3JpcHRvciBmb3IgYSB2aWV3LWJhc2VkIGFnZ3JlZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXG4gICAga2luZDogVmlld0tpbmQsXG4gICAgYXR0cmlidXRlPzogc3RyaW5nXG4gICk6IEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhcyA9IGZpbmRWaWV3TWV0YWRhdGEodGhpcy5mcm9tU2VsZWN0b3IsIGtpbmQsIGF0dHJpYnV0ZSk7XG4gICAgaWYgKCFtZXRhcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YSA9IG1ldGFzWzBdO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3Qgdmlld05hbWUgPSBnZW5lcmF0ZVZpZXdOYW1lKHRhYmxlTmFtZSwgbWV0YS5hdHRyaWJ1dGUsIGtpbmQsIG1ldGEpO1xuICAgIGNvbnN0IGRkb2MgPSBtZXRhLmRkb2MgfHwgZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lKHRhYmxlTmFtZSwgdmlld05hbWUpO1xuICAgIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICByZWR1Y2U6IG1ldGEucmVkdWNlICE9PSB1bmRlZmluZWQgPyB0cnVlIDogIW1ldGEucmV0dXJuRG9jcyxcbiAgICB9O1xuICAgIGlmIChraW5kID09PSBcImRpc3RpbmN0XCIgfHwga2luZCA9PT0gXCJncm91cEJ5XCIpIG9wdGlvbnMuZ3JvdXAgPSB0cnVlO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kLFxuICAgICAgbWV0YSxcbiAgICAgIGRlc2NyaXB0b3I6IHtcbiAgICAgICAgZGRvYyxcbiAgICAgICAgdmlldzogdmlld05hbWUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIHNwZWNpYWwgYWdncmVnYXRlIE1hbmdvUXVlcnkgbWFya2VyXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogTWFuZ29RdWVyeSAmIHsgYWdncmVnYXRlOiB0cnVlOyBhZ2dyZWdhdGVJbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3Rvcjoge30sXG4gICAgICBhZ2dyZWdhdGU6IHRydWUsXG4gICAgICBhZ2dyZWdhdGVJbmZvOiBpbmZvLFxuICAgIH0gYXMgTWFuZ29RdWVyeSAmIHsgYWdncmVnYXRlOiB0cnVlOyBhZ2dyZWdhdGVJbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIgY2FzdCB0byBGYWJyaWNDbGllbnRBZGFwdGVyIGZvciB2aWV3IGFjY2Vzc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRGYWJyaWNBZGFwdGVyKCk6IEZhYnJpY0NsaWVudEFkYXB0ZXIge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIgYXMgRmFicmljQ2xpZW50QWRhcHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYW4gYWdncmVnYXRlIHF1ZXJ5IHZpYSBhZGFwdGVyJ3MgdmlldyBtZXRob2RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUFnZ3JlZ2F0ZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgaWYgKCF0aGlzLmlzVmlld0FnZ3JlZ2F0ZShpbmZvKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXZlcmFnZTxSPihpbmZvLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCBmYWJyaWNBZGFwdGVyID0gdGhpcy5nZXRGYWJyaWNBZGFwdGVyKCk7XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci5kZG9jLFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci52aWV3LFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci5vcHRpb25zLFxuICAgICAgY3R4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVmlld1Jlc3BvbnNlPFI+KGluZm8sIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhdmVyYWdlIGNhbGN1bGF0aW9uIGZyb20gc3VtIGFuZCBjb3VudCB2aWV3c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVBdmVyYWdlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoaW5mby5raW5kICE9PSBcImF2Z1wiKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJBdmVyYWdlIGRlc2NyaXB0b3IgaXMgbm90IHZhbGlkXCIpO1xuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCBbc3VtRGVzYywgY291bnREZXNjXSA9IFtpbmZvLnN1bURlc2NyaXB0b3IsIGluZm8uY291bnREZXNjcmlwdG9yXTtcbiAgICBjb25zdCBbc3VtUmVzcG9uc2UsIGNvdW50UmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIHN1bURlc2MuZGRvYyxcbiAgICAgICAgc3VtRGVzYy52aWV3LFxuICAgICAgICBzdW1EZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICAgIGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgICBjb3VudERlc2MuZGRvYyxcbiAgICAgICAgY291bnREZXNjLnZpZXcsXG4gICAgICAgIGNvdW50RGVzYy5vcHRpb25zLFxuICAgICAgICBjdHhcbiAgICAgICksXG4gICAgXSk7XG4gICAgY29uc3Qgc3VtID0gc3VtUmVzcG9uc2Uucm93cz8uWzBdPy52YWx1ZSA/PyAwO1xuICAgIGNvbnN0IGNvdW50ID0gY291bnRSZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgaWYgKCFjb3VudCkgcmV0dXJuIDAgYXMgdW5rbm93biBhcyBSO1xuICAgIHJldHVybiAoc3VtIC8gY291bnQpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHRoZSB2aWV3IHJlc3BvbnNlIGJhc2VkIG9uIGFnZ3JlZ2F0ZSBraW5kXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICByZXNwb25zZTogVmlld1Jlc3BvbnNlXG4gICk6IFIge1xuICAgIGlmIChpbmZvLmtpbmQgPT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgXCJBdmVyYWdlIHJlc3VsdHMgc2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIHByb2Nlc3Npbmcgcm93c1wiXG4gICAgICApO1xuICAgIGNvbnN0IHJvd3MgPSByZXNwb25zZS5yb3dzIHx8IFtdO1xuICAgIGNvbnN0IHZpZXdJbmZvID0gaW5mbyBhcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT47XG4gICAgY29uc3QgbWV0YSA9IHZpZXdJbmZvLm1ldGE7XG4gICAgaWYgKHZpZXdJbmZvLmNvdW50RGlzdGluY3QpIHtcbiAgICAgIHJldHVybiAocm93cy5sZW5ndGggfHwgMCkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAodmlld0luZm8ua2luZCA9PT0gXCJkaXN0aW5jdFwiIHx8IHZpZXdJbmZvLmtpbmQgPT09IFwiZ3JvdXBCeVwiKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LmtleSA/PyByb3cudmFsdWUpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKG1ldGEucmV0dXJuRG9jcykge1xuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy52YWx1ZSA/PyByb3cuZG9jID8/IHJvdykgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAoIXJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gKHZpZXdJbmZvLmtpbmQgPT09IFwiY291bnRcIiA/IDAgOiBudWxsKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIHJldHVybiAocm93c1swXS52YWx1ZSA/PyByb3dzWzBdLmtleSA/PyBudWxsKSBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgaW5mbyBpcyBhIHZpZXctYmFzZWQgYWdncmVnYXRlXG4gICAqL1xuICBwcml2YXRlIGlzVmlld0FnZ3JlZ2F0ZShcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvXG4gICk6IGluZm8gaXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHtcbiAgICByZXR1cm4gaW5mby5raW5kICE9PSBcImF2Z1wiO1xuICB9XG59XG4iLCJpbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgdHlwZSBNYW5nb1F1ZXJ5LFxuICB0eXBlIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCAqIGFzIGdycGMgZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7XG4gIE1vZGVsLFxuICB0eXBlIE1vZGVsQ29uc3RydWN0b3IsXG4gIHR5cGUgU2VyaWFsaXplcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVidWcsIGZpbmFsLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICB0eXBlIFBlZXJDb25maWcsXG4gIHR5cGUgU2VncmVnYXRlZE1vZGVsLFxuICB0eXBlIE1zcERldGFpbHMsXG59IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNvbm5lY3QsXG4gIHR5cGUgQ29ubmVjdE9wdGlvbnMsXG4gIEdhdGV3YXksXG4gIE5ldHdvcmssXG4gIFByb3Bvc2FsT3B0aW9ucyxcbiAgQ29udHJhY3QgYXMgQ29udHJha3QsXG4gIHR5cGUgU2lnbmVyLFxuICBHYXRld2F5RXJyb3IsXG4gIEVuZG9yc2VFcnJvcixcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgR2F0ZXdheSBhcyBMZWdhY3lHYXRld2F5LCBXYWxsZXRzIH0gZnJvbSBcImZhYnJpYy1uZXR3b3JrXCI7XG5pbXBvcnQgdHlwZSB7IEVuZG9yc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7XG4gIGdldElkZW50aXR5LFxuICBnZXRTaWduZXIsXG4gIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50LFxuICByZWFkRmlsZSBhcyByZWFkRnNGaWxlLFxufSBmcm9tIFwiLi9mYWJyaWMtZnNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgdHlwZSBQcmltYXJ5S2V5VHlwZSxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIEFkYXB0ZXIsXG4gIHR5cGUgQWRhcHRlckZsYWdzLFxuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE1pZ3JhdGlvbkVycm9yLFxuICBPYnNlcnZlckVycm9yLFxuICBQYWdpbmdFcnJvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBRdWVyeUVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBTdGF0ZW1lbnQsXG4gIHR5cGUgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFBhZ2luYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBDb250ZXh0dWFsQXJncyxcbiAgdHlwZSBQcmVwYXJlZE1vZGVsLFxuICBBbGxPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0ZsYXZvdXIgfSBmcm9tIFwiLi4vc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2xpZW50U2VyaWFsaXplciB9IGZyb20gXCIuLi9zaGFyZWQvQ2xpZW50U2VyaWFsaXplclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RGlzcGF0Y2ggfSBmcm9tIFwiLi9GYWJyaWNDbGllbnREaXNwYXRjaFwiO1xuLy8gaW1wb3J0IHsgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbSB9IGZyb20gXCIuL2ZhYnJpYy1oc21cIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFN0YXRlbWVudCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFN0YXRlbWVudFwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50UGFnaW5hdG9yIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgRW5kb3JzZW1lbnRFcnJvcixcbiAgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcixcbiAgTXZjY1JlYWRDb25mbGljdEVycm9yLFxuICBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IsXG4gIFRyYW5zYWN0aW9uVGltZW91dEVycm9yLFxufSBmcm9tIFwiLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuL2NyeXB0b1wiO1xuaW1wb3J0IHsgZXh0cmFjdElkcyB9IGZyb20gXCIuL2lkcy9pZC1leHRyYWN0aW9uXCI7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gXCIuLi9zaGFyZWQvaW5kZXhcIjtcblxudHlwZSBMZWdhY3lQZWVyVGFyZ2V0ID0ge1xuICBtc3BJZDogc3RyaW5nO1xuICBwZWVyRW5kcG9pbnQ6IHN0cmluZztcbiAgcGVlckhvc3RBbGlhcz86IHN0cmluZztcbiAgdGxzQ2VydD86IHN0cmluZyB8IEJ1ZmZlcjtcbn07XG5cbnR5cGUgTGVnYWN5UGVlcldpdGhOYW1lID0gTGVnYWN5UGVlclRhcmdldCAmIHsgbmFtZTogc3RyaW5nIH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzXG4gKiBAc3VtbWFyeSBUaGUgRmFicmljQWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyIHRvIHByb3ZpZGUgYSBzZWFtbGVzcyBpbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzLlxuICogSXQgaGFuZGxlcyBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIHRyYW5zYWN0aW9uIHN1Ym1pc3Npb24sIGFuZCBDUlVEIG9wZXJhdGlvbnMgYWdhaW5zdCBGYWJyaWMgY2hhaW5jb2RlLlxuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHRlbXBsYXRlIEZhYnJpY0ZsYWdzIC0gRmxhZ3Mgc3BlY2lmaWMgdG8gRmFicmljIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBDb250ZXh0PEZhYnJpY0ZsYWdzPiAtIENvbnRleHQgdHlwZSBjb250YWluaW5nIEZhYnJpYy1zcGVjaWZpYyBmbGFnc1xuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGFsaWFzIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gKiBjb25zdCBjb25maWc6IFBlZXJDb25maWcgPSB7XG4gKiAgIG1zcElkOiAnT3JnMU1TUCcsXG4gKiAgIHBlZXJFbmRwb2ludDogJ2xvY2FsaG9zdDo3MDUxJyxcbiAqICAgY2hhbm5lbE5hbWU6ICdteWNoYW5uZWwnLFxuICogICBjaGFpbmNvZGVOYW1lOiAnbXljYycsXG4gKiAgIGNvbnRyYWN0TmFtZTogJ215Y29udHJhY3QnLFxuICogICB0bHNDZXJ0UGF0aDogJy9wYXRoL3RvL3Rscy9jZXJ0JyxcbiAqICAgY2VydERpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9jZXJ0L2RpcicsXG4gKiAgIGtleURpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9rZXkvZGlyJ1xuICogfTtcbiAqXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IEZhYnJpY0FkYXB0ZXIoY29uZmlnLCAnb3JnMS1hZGFwdGVyJyk7XG4gKlxuICogLy8gVXNlIHRoZSBhZGFwdGVyIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGFwdGVyLnJlYWQoJ3VzZXJzJywgJ3VzZXIxJywgbXlTZXJpYWxpemVyKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwsIHRyYW5zaWVudCwgc2VyaWFsaXplcilcbiAqICAgRmFicmljQWRhcHRlci0+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+IHtcbiAgICBpZiAodGhpcy5zaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eCkpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUFyZ3MgPSB0aGlzLnByZXBhcmVMZWdhY3lBcmdzKGFyZ3MpO1xuICAgICAgY29uc3QgdHJhbnNpZW50TWFwID0gdGhpcy5idWlsZExlZ2FjeVRyYW5zaWVudCh0cmFuc2llbnREYXRhKTtcbiAgICAgIGNvbnN0IHBlZXJDb25maWdzID0gdGhpcy5idWlsZExlZ2FjeVBlZXJDb25maWdzKGN0eCk7XG4gICAgICByZXR1cm4gdGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMoXG4gICAgICAgIGN0eCxcbiAgICAgICAgYXBpLFxuICAgICAgICBsZWdhY3lBcmdzLFxuICAgICAgICB0cmFuc2llbnRNYXAsXG4gICAgICAgIHBlZXJDb25maWdzLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgdHJ1ZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBsZWRnZXIgc3RhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIGV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgYXBpLFxuICAgICAgZmFsc2UsXG4gICAgICBhcmdzLFxuICAgICAgdHJhbnNpZW50RGF0YSxcbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMsXG4gICAgICBjbGFzc05hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTaHV0cyBkb3duIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDbG9zZXMgdGhlIGFjdGl2ZSBkaXNwYXRjaCAod2hpY2ggaW4gdHVybiBjbG9zZXMgYW55IGdhdGV3YXlcbiAgICogZXZlbnQgc3Vic2NyaXB0aW9uKSB2aWEgdGhlIGJhc2UgY2xhc3MsIHRoZW4gY2xvc2VzIHRoZSBnUlBDIGNsaWVudC5cbiAgICogV29ya3MgY29ycmVjdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgc3ludGhldGljRXZlbnRzYCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgY29ubmVjdGlvbnMgYXJlIGNsb3NlZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2h1dGRvd24oLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJhc2UgY2xhc3MgaGFuZGxlcyBkaXNwYXRjaC5jbG9zZSgpIGludGVybmFsbHkuXG4gICAgYXdhaXQgc3VwZXIuc2h1dGRvd24oLi4uYXJncyk7XG4gICAgaWYgKHRoaXMuY2xpZW50KSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBDbG9zaW5nICR7dGhpcy5jb25maWcubXNwSWR9IGdhdGV3YXkgY2xpZW50YCk7XG4gICAgICB0aGlzLmNsaWVudC5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZyb20gYSBHYXRld2F5XG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIGNoYWluY29kZSBjb250cmFjdCBmcm9tIHRoZSBzcGVjaWZpZWQgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7Q29udHJha3R9IFRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldENvbnRyYWN0KFxuICAgIGdhdGV3YXk6IEdhdGV3YXksXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNvbnRyYWN0TmFtZT86IHN0cmluZ1xuICApOiBDb250cmFrdCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q29udHJhY3QpO1xuICAgIGNvbnN0IG5ldHdvcmsgPSB0aGlzLmdldE5ldHdvcmsoZ2F0ZXdheSwgY29uZmlnLmNoYW5uZWwpO1xuICAgIGxldCBjb250cmFjdDogQ29udHJha3Q7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFJldHJpZXZpbmcgY2hhaW5jb2RlICR7Y29uZmlnLmNoYWluY29kZU5hbWV9IGNvbnRyYWN0ICR7Y29udHJhY3ROYW1lIHx8IGNvbmZpZy5jb250cmFjdE5hbWV9IGZyb20gbmV0d29yayAke2NvbmZpZy5jaGFubmVsfWBcbiAgICAgICk7XG4gICAgICBjb250cmFjdE5hbWUgPSBjb250cmFjdE5hbWUgPyBjb250cmFjdE5hbWUgOiBjb25maWcuY29udHJhY3ROYW1lO1xuICAgICAgY29udHJhY3QgPSBuZXR3b3JrLmdldENvbnRyYWN0KGNvbmZpZy5jaGFpbmNvZGVOYW1lLCBjb250cmFjdE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3Q7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBOZXR3b3JrIGluc3RhbmNlIGZyb20gYSBHYXRld2F5XG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRvIGEgc3BlY2lmaWMgY2hhbm5lbCBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHBhcmFtIHtHYXRld2F5fSBnYXRld2F5IC0gVGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgKiBAcmV0dXJuIHtOZXR3b3JrfSBUaGUgTmV0d29yayBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldE5ldHdvcmsoZ2F0ZXdheTogR2F0ZXdheSwgY2hhbm5lbE5hbWU6IHN0cmluZyk6IE5ldHdvcmsge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0TmV0d29yayk7XG4gICAgbGV0IG5ldHdvcms6IE5ldHdvcms7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byBjaGFubmVsICR7Y2hhbm5lbE5hbWV9YCk7XG4gICAgICBuZXR3b3JrID0gZ2F0ZXdheS5nZXROZXR3b3JrKGNoYW5uZWxOYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV0d29yaztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHYXRld2F5IHVzaW5nIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBbY2xpZW50XSAtIE9wdGlvbmFsIGdSUEMgY2xpZW50LCB3aWxsIGJlIGNyZWF0ZWQgaWYgbm90IHByb3ZpZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0R2F0ZXdheShcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjbGllbnQ/OiBDbGllbnRcbiAgKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldENvbm5lY3Rpb24oXG4gICAgICBjbGllbnQgfHwgKGF3YWl0IHRoaXMuZ2V0Q2xpZW50KGNvbmZpZykpLFxuICAgICAgY29uZmlnLFxuICAgICAgY3R4XG4gICAgKSkgYXMgR2F0ZXdheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBjbGllbnQgd2l0aCBUTFMgY3JlZGVudGlhbHMgZm9yIHNlY3VyZSBjb21tdW5pY2F0aW9uXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDbGllbnR9IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgc3RhdGljIGdldENsaWVudChjb25maWc6IFBlZXJDb25maWcpOiBDbGllbnQge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldENsaWVudCk7XG4gICAgbG9nLmRlYnVnKGBnZW5lcmF0aW5nIFRMUyBjcmVkZW50aWFscyBmb3IgbXNwICR7Y29uZmlnLm1zcElkfWApO1xuICAgIGxldCBwYXRoT3JDZXJ0OiBzdHJpbmcgfCBCdWZmZXIgPSBjb25maWcudGxzQ2VydCBhcyBzdHJpbmcgfCBCdWZmZXI7XG5cbiAgICBpZiAodHlwZW9mIHBhdGhPckNlcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcGF0aE9yQ2VydC5tYXRjaChcbiAgICAgICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcGF0aE9yQ2VydCA9IEJ1ZmZlci5mcm9tKHBhdGhPckNlcnQsIFwidXRmOFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGF0aE9yQ2VydCA9IEJ1ZmZlci5mcm9tKGZzLnJlYWRGaWxlU3luYyhwYXRoT3JDZXJ0LCBcInV0ZjhcIikpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgdGhlIHRscyBjZXJ0aWZpY2F0ZSBmcm9tICR7cGF0aE9yQ2VydH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRsc0NyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVTc2wocGF0aE9yQ2VydCk7XG4gICAgbG9nLmRlYnVnKGBnZW5lcmF0aW5nIEdhdGV3YXkgQ2xpZW50IGZvciB1cmwgJHtjb25maWcucGVlckVuZHBvaW50fWApO1xuICAgIHJldHVybiBuZXcgQ2xpZW50KGNvbmZpZy5wZWVyRW5kcG9pbnQsIHRsc0NyZWRlbnRpYWxzLCB7XG4gICAgICBcImdycGMubWF4X3JlY2VpdmVfbWVzc2FnZV9sZW5ndGhcIjogKGNvbmZpZy5zaXplTGltaXQgfHwgMTUpICogMTAyNCAqIDEwMjQsXG4gICAgICBcImdycGMubWF4X3NlbmRfbWVzc2FnZV9sZW5ndGhcIjogKGNvbmZpZy5zaXplTGltaXQgfHwgMTUpICogMTAyNCAqIDEwMjQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgY29ubmVjdGlvbiB3aXRoIGlkZW50aXR5IGFuZCBzaWduZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCAtIFRoZSBnUlBDIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbm5lY3RlZCBHYXRld2F5XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBJZGVudGl0eVxuICAgKiAgIHBhcnRpY2lwYW50IFNpZ25lclxuICAgKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAgICpcbiAgICogICBDYWxsZXItPj5GYWJyaWNBZGFwdGVyOiBnZXRDb25uZWN0aW9uKGNsaWVudCwgY29uZmlnKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5JZGVudGl0eTogZ2V0SWRlbnRpdHkobXNwSWQsIGNlcnREaXJlY3RvcnlQYXRoKVxuICAgKiAgIElkZW50aXR5LS0+PkZhYnJpY0FkYXB0ZXI6IGlkZW50aXR5XG4gICAqICAgRmFicmljQWRhcHRlci0+PlNpZ25lcjogZ2V0U2lnbmVyKGtleURpcmVjdG9yeVBhdGgpXG4gICAqICAgU2lnbmVyLS0+PkZhYnJpY0FkYXB0ZXI6IHNpZ25lclxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBDcmVhdGUgQ29ubmVjdE9wdGlvbnNcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdChvcHRpb25zKVxuICAgKiAgIEdhdGV3YXktLT4+RmFicmljQWRhcHRlcjogZ2F0ZXdheVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2FsbGVyOiBnYXRld2F5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q29ubmVjdGlvbihcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmdldENvbm5lY3Rpb24pO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIFBlZXIgSWRlbnRpdHkgZm9yICR7Y29uZmlnLm1zcElkfSB1bmRlciAke2NvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aH1gXG4gICAgKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IGdldElkZW50aXR5KFxuICAgICAgY29uZmlnLm1zcElkLFxuICAgICAgY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYHByZXBhcmluZyB0cmFuc2FjdGlvbiBzaWduZXIgZm9yICR7Q3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoaWRlbnRpdHkuY3JlZGVudGlhbHMudG9TdHJpbmcoKSl9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBleHRyYWN0IEZhYnJpYyBJRCBmcm9tIGNlcnRpZmljYXRlYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25lcjogU2lnbmVyO1xuICAgIGNvbnN0IGNsb3NlID0gKCkgPT4ge307XG4gICAgaWYgKCFjb25maWcuaHNtKSB7XG4gICAgICBzaWduZXIgPSBhd2FpdCBnZXRTaWduZXIoY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29uc3QgaHNtID0gbmV3IEhTTVNpZ25lckZhY3RvcnlDdXN0b20oY29uZmlnLmhzbS5saWJyYXJ5KTtcbiAgICAgIC8vIGNvbnN0IGlkZW50aWZpZXIgPSBoc20uZ2V0U0tJRnJvbUNlcnRpZmljYXRlUGF0aChcbiAgICAgIC8vICAgY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueVxuICAgICAgLy8gKTtcbiAgICAgIC8vIGNvbnN0IHBrY3MxMVNpZ25lciA9IGhzbS5uZXdTaWduZXIoe1xuICAgICAgLy8gICBsYWJlbDogY29uZmlnLmhzbS50b2tlbkxhYmVsIGFzIHN0cmluZyxcbiAgICAgIC8vICAgcGluOiBTdHJpbmcoY29uZmlnLmhzbS5waW4pIGFzIHN0cmluZyxcbiAgICAgIC8vICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIC8vICAgLy8gdXNlclR5cGU6IDEgLypDS1VfVVNFUiAqLyxcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gc2lnbmVyID0gcGtjczExU2lnbmVyLnNpZ25lcjtcbiAgICAgIC8vIGNsb3NlID0gcGtjczExU2lnbmVyLmNsb3NlO1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJIU00gTk9UIElNUExFTUVOVEVEXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBjbGllbnQsXG4gICAgICBpZGVudGl0eTogaWRlbnRpdHksXG4gICAgICBzaWduZXI6IHNpZ25lcixcbiAgICAgIC8vIERlZmF1bHQgdGltZW91dHMgZm9yIGRpZmZlcmVudCBnUlBDIGNhbGxzXG4gICAgICBldmFsdWF0ZU9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImV2YWx1YXRlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBlbmRvcnNlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZW5kb3JzZVRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gMTUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIHN1Ym1pdE9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcInN1Ym1pdFRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgY29tbWl0U3RhdHVzT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiY29tbWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxIG1pbnV0ZVxuICAgICAgfSxcbiAgICB9IGFzIENvbm5lY3RPcHRpb25zO1xuXG4gICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvICR7Y29uZmlnLm1zcElkfWApO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBjb25uZWN0KG9wdGlvbnMpO1xuXG4gICAgLy8gVE9ETzogcmVwbGFjZT9cbiAgICBpZiAoY29uZmlnLmhzbSkge1xuICAgICAgZ2F0ZXdheS5jbG9zZSA9IG5ldyBQcm94eShnYXRld2F5LmNsb3NlLCB7XG4gICAgICAgIGFwcGx5KHRhcmdldDogKCkgPT4gdm9pZCwgdGhpc0FyZzogYW55LCBhcmdBcnJheTogYW55W10pOiBhbnkge1xuICAgICAgICAgIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdBcnJheSk7XG4gICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBnYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNsaWVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBuZXcgRmFicmljQ2xpZW50RGlzcGF0Y2ggaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBGYWJyaWMgbmV0d29yay5cbiAgICogQHJldHVybnMge0Rpc3BhdGNofSBBIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSBjb25maWd1cmVkIGZvciB0aGUgRmFicmljIGNsaWVudC5cbiAgICogQHJlbWFya3MgVGhlIERpc3BhdGNoIGluc3RhbmNlIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGxvZ2ljIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBGYWJyaWMgbmV0d29yaywgc3VjaCBhcyBzdWJtaXR0aW5nIHRyYW5zYWN0aW9ucyBvciBxdWVyeWluZyBkYXRhLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBmYWJyaWNEaXNwYXRjaCA9IGZhYnJpY0NsaWVudEFkYXB0ZXIuRGlzcGF0Y2goKTtcbiAgICogZmFicmljRGlzcGF0Y2guc3VibWl0VHJhbnNhY3Rpb24oJ2NyZWF0ZVByb2R1Y3QnLCB7IG5hbWU6ICdQcm9kdWN0IEEnLCBwcmljZTogMTAwIH0pO1xuICAgKi9cbiAgb3ZlcnJpZGUgRGlzcGF0Y2goKTogRmFicmljQ2xpZW50RGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50QWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0odGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgaW50byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhbnkgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBCYXNlRXJyb3IgdXNpbmcgdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oXG4gICAgZXJyOiBFcnJvciB8IHN0cmluZyB8IEdhdGV3YXlFcnJvclxuICApOiBFIHtcbiAgICAvLyBpZiAoXG4gICAgLy8gICBNSVNTSU5HX1BSSVZBVEVfREFUQV9SRUdFWC50ZXN0KFxuICAgIC8vICAgICB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2VcbiAgICAvLyAgIClcbiAgICAvLyApXG4gICAgLy8gICByZXR1cm4gbmV3IFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzKGVycikgYXMgRTtcblxuICAgIGxldCBtc2cgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEdhdGV3YXlFcnJvciAmJiBlcnIuZGV0YWlscy5sZW5ndGggJiYgZXJyLmNvZGUgPT09IDEwKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXJyIGluc3RhbmNlb2YgRW5kb3JzZUVycm9yICYmXG4gICAgICBlcnIuZGV0YWlscy5sZW5ndGggJiZcbiAgICAgIGVyci5jb2RlID09PSAxMCAmJlxuICAgICAgZXJyLmRldGFpbHNbMF0ubWVzc2FnZT8uaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKVxuICAgICkge1xuICAgICAgbXNnID0gYCR7ZXJyLmRldGFpbHNbMF0ubWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJNVkNDX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IE12Y2NSZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiREVBRExJTkVfRVhDRUVERURcIikpXG4gICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uVGltZW91dEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJFTkRPUlNFTUVOVF9QT0xJQ1lfRkFJTFVSRVwiKSlcbiAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiUEhBTlRPTV9SRUFEX0NPTkZMSUNUXCIpKVxuICAgICAgcmV0dXJuIG5ldyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICBzd2l0Y2ggKChlcnIgYXMgYW55KS5jb2RlKSB7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICByZXR1cm4gbmV3IEVuZG9yc2VtZW50RXJyb3IoZXJyKSBhcyBFO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoVmFsaWRhdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTm90Rm91bmRFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbmZsaWN0RXJyb3IubmFtZSkpIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhCYWRSZXF1ZXN0RXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEJhZFJlcXVlc3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhRdWVyeUVycm9yLm5hbWUpKSByZXR1cm4gbmV3IFF1ZXJ5RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUGFnaW5nRXJyb3IubmFtZSkpIHJldHVybiBuZXcgUGFnaW5nRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhNaWdyYXRpb25FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBNaWdyYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhPYnNlcnZlckVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE9ic2VydmVyRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQXV0aG9yaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoRm9yYmlkZGVuRXJyb3IubmFtZSkpIHJldHVybiBuZXcgRm9yYmlkZGVuRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29ubmVjdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoU2VyaWFsaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIEU7XG4gIH1cbn1cblxuRmFicmljQ2xpZW50QWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoRmFicmljRmxhdm91cik7XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDb250ZXh0dWFsQXJncyxcbiAgRGlzcGF0Y2gsXG4gIEV2ZW50SWRzLFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBDb250ZXh0LFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQZWVyQ29uZmlnIH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlRXZlbnQsXG4gIENsb3NlYWJsZUFzeW5jSXRlcmFibGUsXG59IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IHBhcnNlRXZlbnROYW1lIH0gZnJvbSBcIi4uL3NoYXJlZC9ldmVudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXZlbnQgZGlzcGF0Y2hlciBmb3IgSHlwZXJsZWRnZXIgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGFuZCBwcm9jZXNzZXMgZXZlbnRzIGVtaXR0ZWQgYnkgRmFicmljIGNoYWluY29kZSwgZGlzcGF0Y2hpbmcgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICogQGNsYXNzIEZhYnJpY0NsaWVudERpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gKiBjb25zdCBjbGllbnQgPSBhd2FpdCBGYWJyaWNBZGFwdGVyLmdldENsaWVudChwZWVyQ29uZmlnKTtcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudCk7XG4gKlxuICogLy8gQ29uZmlndXJlIHRoZSBkaXNwYXRjaCB3aXRoIHBlZXIgY29uZmlndXJhdGlvblxuICogZGlzcGF0Y2guY29uZmlndXJlKHBlZXJDb25maWcpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGFuIG9ic2VydmVyIGZvciBhIHNwZWNpZmljIHRhYmxlIGFuZCBldmVudFxuICogZGlzcGF0Y2gub2JzZXJ2ZSgndXNlcnMnLCAnY3JlYXRlJywgKGlkKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBVc2VyIGNyZWF0ZWQ6ICR7aWR9YCk7XG4gKiB9KTtcbiAqXG4gKiAvLyBTdGFydCBsaXN0ZW5pbmcgZm9yIGV2ZW50c1xuICogYXdhaXQgZGlzcGF0Y2guc3RhcnQoKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICogICBwYXJ0aWNpcGFudCBOZXR3b3JrXG4gKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICpcbiAqICAgQ2xpZW50LT4+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/Lm5hbWUpO1xuICAgICAgICAgIGNvbnN0IG9ic2VydmVyQXJncyA9IHBheWxvYWQucmVzdWx0ID8gW3BheWxvYWQucmVzdWx0LCBjdHhdIDogW2N0eF07XG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICBtb2RlbFJlZiBhcyBDb25zdHJ1Y3RvciB8IHN0cmluZyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgcGF5bG9hZC5pZCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAuLi4ob2JzZXJ2ZXJBcmdzIGFzIENvbnRleHR1YWxBcmdzPGFueT4pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdXBkYXRlIG9ic2VydmFibGVzIGZvciB0YWJsZSAke3RhYmxlfSBldmVudCAke2V2ZW50fSBpZDogJHtwYXlsb2FkLmlkfTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBsb2cuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBldmVudCBmb3IgY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoY3R4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lclxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIGV2ZW50IGRpc3BhdGNoaW5nIGZvciB0aGUgb2JzZXJ2ZWQgYWRhcHRlci4gV2hlblxuICAgKiBgc3ludGhldGljRXZlbnRzYCBpcyB0cnVlICh0aGUgZGVmYXVsdCkgbm8gZ2F0ZXdheSBjb25uZWN0aW9uIGlzIG9wZW5lZDtcbiAgICogaW5zdGVhZCBldmVyeSBDUlVEIG9wZXJhdGlvbiBpcyB3cmFwcGVkIHdpdGggYSBQcm94eSB0aGF0IGZpcmVzXG4gICAqIGB1cGRhdGVPYnNlcnZlcnNgIGZvciAqKmFsbCoqIG1vZGVscy4gV2hlbiBgc3ludGhldGljRXZlbnRzYCBpcyBmYWxzZSB0aGVcbiAgICogZXhpc3RpbmcgZ2F0ZXdheS1iYXNlZCBjaGFpbmNvZGUtZXZlbnQgc3Vic2NyaXB0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCB0aGVcbiAgICogbG9jYWwgUHJveHkgZmFsbGJhY2sgaXMgbGltaXRlZCB0byBmdWxseS1zZWdyZWdhdGVkICh0cmFuc2llbnQpIG1vZGVscyBvbmx5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvciBjb25maWcgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG5cbiAgICBjb25zdCBzeW50aGV0aWNFdmVudHMgPSB0aGlzLmFkYXB0ZXIuY29uZmlnLnN5bnRoZXRpY0V2ZW50cyAhPT0gZmFsc2U7XG5cbiAgICBpZiAoIXN5bnRoZXRpY0V2ZW50cykge1xuICAgICAgLy8gR2F0ZXdheS1iYXNlZCBjaGFpbmNvZGUtZXZlbnQgc3Vic2NyaXB0aW9uIChub24tc3ludGhldGljIHBhdGgpXG4gICAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIFwiZGlzcGF0Y2hcIixcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgTW9kZWwgYXMgYW55XG4gICAgICApO1xuICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5pbml0aWFsaXplKTtcbiAgICAgIGNvbnN0IGdhdGV3YXkgPSBhd2FpdCBGYWJyaWNDbGllbnRBZGFwdGVyLmdldEdhdGV3YXkoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZyBhcyBQZWVyQ29uZmlnLFxuICAgICAgICB0aGlzLmNsaWVudFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICAgIHRoaXMubGlzdGVuaW5nU3RhY2sgPSBhd2FpdCBuZXR3b3JrLmdldENoYWluY29kZUV2ZW50cyhcbiAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lXG4gICAgICApO1xuICAgICAgdGhpcy5oYW5kbGVFdmVudHMoY3R4KTtcbiAgICB9XG5cbiAgICAvLyBQcm94eSBDUlVEIG1ldGhvZHMuXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IHRydWUgIOKGkiBub3RpZnkgZm9yIEFMTCBtb2RlbHMgKHJlcGxhY2VzIGdhdGV3YXkgZXZlbnRzIGVudGlyZWx5KVxuICAgIC8vIOKAoiBzeW50aGV0aWNFdmVudHMgPSBmYWxzZSDihpIgbm90aWZ5IG9ubHkgZm9yIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzXG4gICAgLy8gICAodGhlIGdhdGV3YXkgc3Vic2NyaXB0aW9uIGhhbmRsZXMgcHVibGljIG1vZGVscylcbiAgICAoXG4gICAgICBbXG4gICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBdIGFzIChrZXlvZiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pW11cbiAgICApLmZvckVhY2goKHRvV3JhcCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyBhZGFwdGVyIHByb3ZpZGVkIGZvciB0aGUgZmFsbGJhY2sgb2YgZnVsbHkgc2VncmVnYXRlZCBtb2RlbHNgXG4gICAgICAgICk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlclt0b1dyYXBdKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWV0aG9kICR7dG9XcmFwfSBub3QgZm91bmQgaW4gJHt0aGlzLmFkYXB0ZXIuYWxpYXN9IGFkYXB0ZXIgdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcblxuICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMuYWRhcHRlciwgdG9XcmFwKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gdGhpcy5hZGFwdGVyO1xuICAgICAgd2hpbGUgKCFkZXNjcmlwdG9yICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHRvV3JhcCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGVzY3JpcHRvciB8fCAhZGVzY3JpcHRvci53cml0YWJsZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0aG9kICR7dG9XcmFwfSB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBidWxrVG9TaW5nbGUobWV0aG9kOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5VUERBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkRFTEVURTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgYXJlIHJlYWQgb25seSBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLmFkYXB0ZXJbdG9XcmFwXSA9IG5ldyBQcm94eSh0aGlzLmFkYXB0ZXJbdG9XcmFwXSwge1xuICAgICAgICBhcHBseTogYXN5bmMgKFxuICAgICAgICAgIHRhcmdldDogYW55LFxuICAgICAgICAgIHRoaXNBcmc6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgICAgICAgYXJnQXJyYXk6IGFueVtdXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIC8vIFJ1biB0aGUgb3JpZ2luYWwgbWV0aG9kIHVuY2hhbmdlZCBzbyB0cmFuc2llbnQgZGF0YSBpcyBwcmVzZXJ2ZWRcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJnQXJyYXkpO1xuXG4gICAgICAgICAgY29uc3QgY2xheno6IENvbnN0cnVjdG9yPGFueT4gPSBhcmdBcnJheVswXTtcbiAgICAgICAgICAvLyBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyBmYWxzZSwgcHVibGljIG1vZGVscyBlbWl0IGEgY2hhaW5jb2RlIGV2ZW50XG4gICAgICAgICAgLy8gb24gdGhlIGNvbnRyYWN0IHNpZGU7IHNraXAgdGhlIGxvY2FsIGZhbGxiYWNrIHRvIGF2b2lkXG4gICAgICAgICAgLy8gZG91YmxlLW5vdGlmaWNhdGlvbi4gV2hlbiBzeW50aGV0aWNFdmVudHMgaXMgdHJ1ZSB3ZSBoYW5kbGUgYWxsIG1vZGVscy5cbiAgICAgICAgICBpZiAoIXN5bnRoZXRpY0V2ZW50cyAmJiAhTW9kZWwuaXNUcmFuc2llbnQoY2xhenopKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgICAgLy8gQ29udGV4dCBpcyBhbHdheXMgdGhlIGxhc3QgZWxlbWVudCBvZiBhcmdBcnJheVxuICAgICAgICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzLCBjdHggfSA9IHRoaXNBcmdbXCJsb2dDdHhcIl0oXG4gICAgICAgICAgICBhcmdBcnJheS5zbGljZShhcmdBcnJheS5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaWRzID0gYXJnQXJyYXlbMV07XG4gICAgICAgICAgY29uc3QgcmVzdWx0QXJnczogYW55W10gPSBbY2xhenosIGJ1bGtUb1NpbmdsZSh0b1dyYXApLCBpZHNdO1xuXG4gICAgICAgICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcIm9ic2VydmVGdWxsUmVzdWx0XCIpKSB7XG4gICAgICAgICAgICByZXN1bHRBcmdzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICAuLi4ocmVzdWx0QXJncyBhcyBQYXJhbWV0ZXJzPHR5cGVvZiB0aGlzLnVwZGF0ZU9ic2VydmVycz4pLFxuICAgICAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgICAgICkuY2F0Y2goKGU6IHVua25vd24pID0+XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGlzcGF0Y2ggb2JzZXJ2ZXIgcmVmcmVzaCBmb3IgJHt0b1dyYXB9IG9uICR7Y2xhenoubmFtZSB8fCBjbGF6en0gZm9yICR7aWRzfTogJHtlfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5pZiAoRmFicmljQ2xpZW50QWRhcHRlcilcbiAgRmFicmljQ2xpZW50QWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0gPSBGYWJyaWNDbGllbnREaXNwYXRjaDtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG4iXSwibmFtZXMiOlsiZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlIiwiZmlsZVBhdGgiLCJmcyIsInJlcXVpcmUiLCJwYXRoIiwiZGlybmFtZSIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJnZW5lcmF0ZU1vZGVsSW5kZXhlcyIsIm0iLCJnZW5lcmF0ZUluZGV4ZXMiLCJnZW5lcmF0ZU1vZGVsRGVzaWduRG9jcyIsImFjY3VtIiwidmlld3MiLCJnZW5lcmF0ZVZpZXdzIiwic3RvcmFnZSIsImZvckVhY2giLCJkb2MiLCJfaWQiLCJyZWFkTW9kZWxGaWxlIiwiZmlsZSIsImV4cG9ydHMiLCJqb2luIiwicHJvY2VzcyIsImN3ZCIsInBhcmVudFBhdGgiLCJuYW1lIiwidmFsdWVzIiwiT2JqZWN0IiwiZmlsdGVyIiwiZSIsIk1vZGVsIiwiYXN5bmMiLCJyZWFkTW9kZWxGb2xkZXJzIiwiZm9sZGVycyIsInJlc3VsdCIsImZvbGRlciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicmVjdXJzaXZlIiwiZiIsImlzRmlsZSIsImVuZHNXaXRoIiwicHVzaCIsIndyaXRlSW5kZXhlcyIsImluZGV4ZXMiLCJwIiwiY29sbGVjdGlvbiIsImluZGV4IiwicmVzb2x2ZSIsIndyaXRlRmlsZVN5bmMiLCJKU09OIiwic3RyaW5naWZ5IiwidW5kZWZpbmVkIiwid3JpdGVEZXNpZ25Eb2NzIiwiZGVzaWduRG9jcyIsImxlbmd0aCIsImRvY0lkIiwicmVwbGFjZSIsInBheWxvYWQiLCJfcmV2IiwiY29sbGVjdGlvbkZvciIsImNvbGxlY3Rpb25OYW1lIiwicG9saWN5IiwicmVxdWlyZWRQZWVyQ291bnQiLCJtYXhQZWVyQ291bnQiLCJibG9ja1RvTGl2ZSIsIm1lbWJlck9ubHlSZWFkIiwibWVtYmVyT25seVdyaXRlIiwicHJpdmF0ZUNvbGxlY3Rpb25Gb3IiLCJtc3BJZCIsImMiLCJlbmRvcnNlbWVudFBvbGljeSIsInNpZ25hdHVyZVBvbGljeSIsInNoYXJlZENvbGxlY3Rpb25Gb3IiLCJtc3BJZHMiLCJtYXAiLCJleHRyYWN0Q29sbGVjdGlvbnMiLCJvdmVycmlkZXMiLCJtaXJyb3IiLCJwcml2YXRlQ29scyIsInNoYXJlZENvbHMiLCJjb2xsZWN0aW9uc0ZvciIsInJlc29sdmVDb2xsZWN0aW9uIiwiYXJnIiwiSW50ZXJuYWxFcnJvciIsInByaXZhdGVEZWZhdWx0cyIsImFzc2lnbiIsInNoYXJlZERlZmF1bHRzIiwibWlycm9yTWV0YSIsIm1pcnJvcmVkQXQiLCJwcml2YXRlcyIsImZsYXQiLCJyZXNvbHZlZCIsInJlc29sdmVyIiwic29tZSIsImluY2x1ZGVzIiwic2hhcmVkIiwid3JpdGVDb2xsZWN0aW9ucyIsImNvbHMiLCJmaWxlTmFtZSIsIndyaXRlQ29sbGVjdGlvbkRlc2lnbkRvY3MiLCJkb2NzIiwiRmFicmljQ2xpZW50UGFnaW5hdG9yIiwiUGFnaW5hdG9yIiwiY29uc3RydWN0b3IiLCJhZGFwdGVyIiwicXVlcnkiLCJzaXplIiwiY2xhenoiLCJzdXBlciIsInByZXBhcmUiLCJyYXdTdGF0ZW1lbnQiLCJVbnN1cHBvcnRlZEVycm9yIiwicGFnZSIsImFyZ3MiLCJpc1NlcmlhbGl6ZWRQYWdlIiwib2JqIiwiQXJyYXkiLCJpc0FycmF5IiwiZGF0YSIsIkZhYnJpY0NsaWVudFJlcG9zaXRvcnkiLCJSZXBvc2l0b3J5IiwiZm9yY2UiLCJ0aGlzIiwiX292ZXJyaWRlcyIsImlnbm9yZVZhbGlkYXRpb24iLCJpZ25vcmVIYW5kbGVycyIsImFsbG93UmF3U3RhdGVtZW50cyIsImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXMiLCJmb3JjZVByZXBhcmVDb21wbGV4UXVlcmllcyIsImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlIiwicmVidWlsZFdpdGhUcmFuc2llbnQiLCJvdmVycmlkZSIsImZsYWdzIiwiZm9yIiwiT2JzZXJ2ZXJIYW5kbGVyIiwicGFnaW5hdGVCeSIsImtleSIsIm9yZGVyIiwicmVmIiwib2Zmc2V0IiwibGltaXQiLCJsb2ciLCJjdHhBcmdzIiwibG9nQ3R4IiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiUEFHRV9CWSIsInZlcmJvc2UiLCJ0YWJsZU5hbWUiLCJjbGFzcyIsInN0YXRlbWVudCIsImJvb2ttYXJrIiwibGlzdEJ5IiwiTElTVF9CWSIsImZpbmRCeSIsInZhbHVlIiwiRklORF9CWSIsImZpbmRPbmVCeSIsIkZJTkRfT05FX0JZIiwiZmluZCIsIk9yZGVyRGlyZWN0aW9uIiwiQVNDIiwiRklORCIsImRpcmVjdGlvbiIsIlBBR0UiLCJjdHgiLCJQZXJzaXN0ZW5jZUtleXMiLCJTVEFURU1FTlQiLCJjYWxsQXJncyIsInNsaWNlIiwicGFyc2UiLCJkZWNvZGUiLCJldmFsdWF0ZVRyYW5zYWN0aW9uIiwiaHlkcmF0ZWQiLCJyIiwiQ291Y2hEQktleXMiLCJUQUJMRSIsImQiLCJhcHBseUFmdGVyUmVhZCIsImdldE9yVW5kZWZpbmVkIiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIk9wZXJhdGlvbktleXMiLCJSRUFEIiwiQUZURVIiLCJQcm9taXNlIiwiYWxsIiwiZW50cnkiLCJjb3VudE9mIiwiQ09VTlRfT0YiLCJzdG10QXJncyIsIm1heE9mIiwiTUFYX09GIiwibWluT2YiLCJNSU5fT0YiLCJhdmdPZiIsIkFWR19PRiIsInN1bU9mIiwiU1VNX09GIiwiZGlzdGluY3RPZiIsIkRJU1RJTkNUX09GIiwiZ3JvdXBPZiIsIkdST1VQX09GIiwiaGVhbHRoY2hlY2siLCJjcmVhdGUiLCJtb2RlbCIsImRlYnVnIiwiZW5zdXJlTGVnYWN5TWlycm9yRmxhZyIsInByZXBhcmVkIiwicmVjb3JkIiwiaWQiLCJ0cmFuc2llbnQiLCJyZXZlcnQiLCJ1cGRhdGUiLCJjcmVhdGVBbGxQcmVmaXgiLCJtb2RlbHMiLCJDUkVBVEUiLCJnZXQiLCJpZ25vcmVWYWxpZGF0ZSIsIk9OIiwiaWdub3JlZFByb3BzIiwiZXJyb3JzIiwiaGFzRXJyb3JzIiwiZXJyb3JNZXNzYWdlcyIsInJlZHVjZUVycm9yc1RvUHJpbnQiLCJWYWxpZGF0aW9uRXJyb3IiLCJjcmVhdGVBbGwiLCJpZHMiLCJwYXlsb2FkcyIsInRyYW5zaWVudHMiLCJjcmVhdGVkIiwiaSIsInJlYWRBbGwiLCJrZXlzIiwicmVjb3JkcyIsInVwZGF0ZUFsbCIsInVwZGF0ZWQiLCJ1IiwiYWNjdW11bGF0ZSIsImxlZ2FjeSIsIkVSQzIwVG9rZW4iLCJCYXNlTW9kZWwiLCJfX2RlY29yYXRlIiwicGsiLCJ0eXBlIiwiU3RyaW5nIiwicHJvdG90eXBlIiwiY29sdW1uIiwicmVxdWlyZWQiLCJ0YWJsZSIsIkVSQzIwV2FsbGV0IiwiQWxsb3dhbmNlIiwiQ2xpZW50U2VyaWFsaXplciIsIkpTT05TZXJpYWxpemVyIiwicHJlU2VyaWFsaXplIiwibW9kZWxOYW1lIiwidG9TZXJpYWxpemUiLCJtZXRhZGF0YSIsIk1ldGFkYXRhIiwiU2VyaWFsaXphdGlvbkVycm9yIiwiTW9kZWxLZXlzIiwiQU5DSE9SIiwiZGVzZXJpYWxpemUiLCJzdHIiLCJkZXNlcmlhbGl6YXRpb24iLCJjbGFzc05hbWUiLCJFcnJvciIsImJ1aWxkIiwic2VyaWFsaXplIiwiRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5Iiwic2VyaWFsaXplciIsImRlY29kZXIiLCJUZXh0RGVjb2RlciIsInVwZGF0ZU9ic2VydmVycyIsImV2ZW50Iiwib2JzZXJ2ZXJIYW5kbGVyIiwiY291bnQiLCJwYXJzZWRJZCIsIlNlcXVlbmNlIiwicGFyc2VWYWx1ZSIsInNlcXVlbmNlRm9yIiwidG9rZW5OYW1lIiwic3ltYm9sIiwiZGVjaW1hbHMiLCJOdW1iZXIiLCJ0b3RhbFN1cHBseSIsInRvdGFsIiwiYmFsYW5jZU9mIiwib3duZXIiLCJiYWxhbmNlIiwidHJhbnNmZXIiLCJ0byIsInRyYW5zZmVycmVkIiwic3VibWl0VHJhbnNhY3Rpb24iLCJ0b1N0cmluZyIsInRyYW5zZmVyRnJvbSIsImZyb20iLCJjb250ZXh0QXJncyIsIkNvbnRleHQiLCJhcHByb3ZlIiwic3BlbmRlciIsImFwcHJvdmVkIiwiYWxsb3dhbmNlIiwiaW5pdGlhbGl6ZSIsInRva2VuIiwiaW5pdGlsaWF6ZWQiLCJjaGVja0luaXRpYWxpemVkIiwibWludCIsImFtb3VudCIsImJ1cm4iLCJidXJuRnJvbSIsImFjY291bnQiLCJjbGllbnRBY2NvdW50QmFsYW5jZSIsInNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSIsImNsaWVudEFjY291bnRJRCIsImV4dHJhY3RJZHMiLCJjb21wb3NlZCIsInBrUHJvcHMiLCJleHRyYWN0SWQiLCJjb21wb3NlQXR0cmlidXRlVmFsdWUiLCJJZGVudGl0eUNyZWRlbnRpYWxzIiwiZGVzY3JpcHRpb24iLCJGYWJyaWNNb2RlbEtleXMiLCJJZGVudGl0eVR5cGUiLCJGYWJyaWNGbGF2b3VyIiwiSWRlbnRpdHkiLCJYNTA5Iiwib25lVG9PbmUiLCJDYXNjYWRlIiwiQ0FTQ0FERSIsImRlbGV0ZSIsIkNvcmVVdGlscyIsImxvZ2dlciIsIk1pbmlMb2dnZXIiLCJjb250ZW50T2ZMb2FkRmlsZSIsImNvbnRlbnRPclBhdGgiLCJmaWxlUmVhZGVyIiwiVWludDhBcnJheSIsIm1hdGNoIiwicmVhZEZpbGUiLCJwcm9taXNlcyIsIm5vcm1hbGl6ZUltcG9ydCIsImltcG9ydCIsImdldENBVXNlciIsInVzZXJOYW1lIiwicHJpdmF0ZUtleSIsImNlcnRpZmljYXRlIiwib3B0aW9ucyIsInN0cmluZ0Zvcm1hdCIsInVzZXIiLCJVc2VyIiwiY29uZmlnIiwiaHNtIiwic29mdHdhcmUiLCJsaWIiLCJsaWJyYXJ5Iiwic2xvdCIsImxhYmVsIiwidG9rZW5MYWJlbCIsInBpbiIsImNyeXB0b1N1aXRlIiwiZ2V0Q3J5cHRvU3VpdGUiLCJzZXRDcnlwdG9TdWl0ZSIsImVucm9sbG1lbnRLZXkiLCJnZXRIU01FbnJvbGxtZW50S2V5IiwiZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5Iiwic2V0RW5yb2xsbWVudCIsIm5ld0NyeXB0b1N1aXRlIiwiY3JlYXRlS2V5RnJvbVJhdyIsInNraSIsImtleUlkSGV4IiwidHJpbSIsIkJ1ZmZlciIsImdldENlcnRpZmljYXRlU0tJIiwiZ2V0S2V5IiwiaXNQcml2YXRlIiwieDUwOSIsIlg1MDlDZXJ0aWZpY2F0ZSIsImp3ayIsInB1YmxpY0tleSIsImV4cG9ydCIsImZvcm1hdCIsInByZWZpeCIsIngiLCJ5IiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsImNvbmNhdCIsImRpZ2VzdCIsImdldElkZW50aXR5IiwiY2VydERpcmVjdG9yeVBhdGgiLCJpZGVudGl0eUZpbGVSZWFkZXIiLCJjZXJ0UGF0aCIsImdldEZpcnN0RGlyRmlsZU5hbWUiLCJjcmVkZW50aWFscyIsImRpclBhdGgiLCJyZWFkZGlyIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQiLCJnZXRGaWxlQ29udGVudCIsImdldFNpZ25lciIsImtleURpcmVjdG9yeVBhdGgiLCJzaWduZXJGaWxlUmVhZGVyIiwia2V5UGF0aCIsInByaXZhdGVLZXlQZW0iLCJleHRyYWN0UHJpdmF0ZUtleSIsImdldE93blByb3BlcnR5U3ltYm9scyIsImsiLCJzaWduZXJzIiwibmV3UHJpdmF0ZUtleVNpZ25lciIsInBlbSIsImxpYk5hbWUiLCJzdWJ0bGUiLCJnbG9iYWxUaGlzIiwid2luZG93IiwiQ3J5cHRvIiwid2ViY3J5cHRvIiwic3RyMmFiIiwiYnVmIiwiQXJyYXlCdWZmZXIiLCJidWZWaWV3Iiwic3RyTGVuIiwiY2hhckNvZGVBdCIsInJlcGxhY2VBbGwiLCJkZWNvZGVkIiwiYmluYXJ5RGVyIiwiaW1wb3J0S2V5IiwibmFtZWRDdXJ2ZSIsImdldEFraUFuZFNlcmlhbEZyb21DZXJ0IiwiY2VydCIsIng1MDlDZXJ0aWZpY2F0ZSIsIlg1MDlDZXJ0IiwiYWtpRXh0IiwiZXh0ZW5zaW9ucyIsImFraSIsInRvVXBwZXJDYXNlIiwic3RhcnRzV2l0aCIsInNlcmlhbCIsInNlcmlhbE51bWJlciIsImNyeXB0b1Byb3ZpZGVyIiwic2V0IiwiQkFTRV9BTFBIQUJFVCIsIkNSWVBUTyIsIkJhc2VFbmNvZGVyIiwiYWxwaGFiZXQiLCJiYXNlTWFwIiwiaiIsImNoYXJBdCIsInhjIiwiYmFzZSIsImxlYWRlciIsImZhY3RvciIsIk1hdGgiLCJpRmFjdG9yIiwiZW5jb2RlIiwic291cmNlIiwiaXNWaWV3IiwiYnVmZmVyIiwiYnl0ZU9mZnNldCIsImJ5dGVMZW5ndGgiLCJ6ZXJvZXMiLCJwYmVnaW4iLCJwZW5kIiwiYjU4IiwiY2FycnkiLCJpdDEiLCJpdDIiLCJyZXBlYXQiLCJkZWNvZGVVbnNhZmUiLCJwc3oiLCJiMjU2IiwiaXQzIiwiaXQ0IiwidmNoIiwiQ3J5cHRvVXRpbHMiLCJiNThlbmNvZGVyIiwiQkFTRTU4IiwiZmFicmljSWRGcm9tQ2VydGlmaWNhdGUiLCJzdWJqZWN0IiwiaXNzdWVyIiwic3RyaW5nVG9BcnJheUJ1ZmZlciIsImV4dHJhY3RLZXkiLCJ1c2FnZXMiLCJSZWdFeHAiLCJleHRyYWN0UHVibGljS2V5Iiwic2lnbiIsImJ1ZmYiLCJoYXNoIiwiYiIsInBhZFN0YXJ0IiwidmVyaWZ5Iiwic2lnbmF0dXJlIiwiZW5jcnlwdCIsImdldFN1YnRsZUNyeXB0byIsImlzQnJvd3NlciIsImRlY3J5cHQiLCJnZXRNYXN0ZXIiLCJ0ZXh0RW5jb2RlciIsIlRleHRFbmNvZGVyIiwiZ2VuR2VuZXNpcyIsInJhbmRvbVVVSUQiLCJpbXBvcnRlZEtleSIsIktFWV9BTEdPUllUSE0iLCJpdiIsImdldERlcml2YXRpb25LZXkiLCJzYWx0Iiwic2FsdEJ1ZmZlciIsInNhbHRIYXNoZWQiLCJwYXJhbXMiLCJIQVNIIiwiaXRlcmF0aW9ucyIsIklURVJBVElPTlMiLCJkZXJpdmF0aW9uIiwiZGVyaXZlQml0cyIsIktFWUxFTkdUSCIsIml2bGVuIiwia2V5bGVuIiwiZGVyaXZlZEtleSIsImltcG9ydGVkRW5jcnlwdGlvbktleSIsIkFMR09SWVRITSIsImVuY3J5cHRQaW4iLCJ0ZXh0Iiwia2V5T2JqZWN0IiwidGV4dEJ1ZmZlciIsImVuY3J5cHRlZFRleHQiLCJkZWNyeXB0UGluIiwidGV4dERlY29kZXIiLCJkZWNyeXB0ZWRUZXh0IiwiT3ZlcmZsb3dFcnJvciIsIm1zZyIsIkJhbGFuY2VFcnJvciIsIkFsbG93YW5jZUVycm9yIiwiUmVnaXN0cmF0aW9uRXJyb3IiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJNaXNzaW5nQ29udGV4dEVycm9yIiwiVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MiLCJCYXNlRXJyb3IiLCJOb3RJbml0aWFsaXplZEVycm9yIiwiTWlzc2luZ1BLQ1NTMTFMaWIiLCJFbmRvcnNlbWVudEVycm9yIiwibWVzc2FnZSIsIk12Y2NSZWFkQ29uZmxpY3RFcnJvciIsIlBoYW50b21SZWFkQ29uZmxpY3RFcnJvciIsIkVuZG9yc2VtZW50UG9saWN5RXJyb3IiLCJUcmFuc2FjdGlvbkxpbWl0c0Vycm9yIiwiY29kZSIsIlRyYW5zYWN0aW9uVGltZW91dEVycm9yIiwiVHJhbnNhY3Rpb25CdWZmZXJTaXplRXJyb3IiLCJIRkNBSWRlbnRpdHlUeXBlIiwiSEZDQUlkZW50aXR5QXR0cmlidXRlcyIsIkZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIiwiTG9nZ2VkQ2xhc3MiLCJjYUNvbmZpZyIsImNhTmFtZSIsImNhQ2VydCIsImNhS2V5IiwidXJsIiwiQ0EiLCJjYSIsInRscyIsInRydXN0ZWRSb290cyIsInJvb3QiLCJGYWJyaWNDQVNlcnZpY2VzIiwiQ2xpZW50IiwiY2xpZW50IiwiQ2VydGlmaWNhdGUiLCJjZXJ0aWZpY2F0ZVNlcnZpY2UiLCJuZXdDZXJ0aWZpY2F0ZVNlcnZpY2UiLCJBZmZpbGlhdGlvbnMiLCJhZmZpbGlhdGlvblNlcnZpY2UiLCJuZXdBZmZpbGlhdGlvblNlcnZpY2UiLCJJZGVudGl0aWVzIiwiaWRlbnRpdHlTZXJ2aWNlIiwibmV3SWRlbnRpdHlTZXJ2aWNlIiwiZ2V0Q2VydGlmaWNhdGVzIiwicmVxdWVzdCIsImRvTWFwIiwicmVzcG9uc2UiLCJjZXJ0cyIsIlBFTSIsImdldElkZW50aXRpZXMiLCJpZGVudGl0aWVzU2VydmljZSIsImdldEFsbCIsImlkZW50aXRpZXMiLCJwYXJzZUVycm9yIiwicmVnZXhwIiwiZXhlYyIsIkNvbmZsaWN0RXJyb3IiLCJnZXRBZmZpbGlhdGlvbnMiLCJhIiwicmVhZCIsImVucm9sbG1lbnRJZCIsImdldE9uZSIsIk5vdEZvdW5kRXJyb3IiLCJzdWNjZXNzIiwicmVnaXN0ZXIiLCJpc1N1cGVyVXNlciIsImFmZmlsaWF0aW9uIiwidXNlclJvbGUiLCJhdHRycyIsIm1heEVucm9sbG1lbnRzIiwicmVnaXN0cmF0aW9uIiwicGFzc3dvcmQiLCJwcm9wcyIsImVucm9sbG1lbnRJRCIsImVucm9sbG1lbnRTZWNyZXQiLCJpbmZvIiwiaWRlbnRpdHlGcm9tRW5yb2xsbWVudCIsImVucm9sbG1lbnQiLCJyb290Q2VydGlmaWNhdGUiLCJMb2dnaW5nIiwiY2xpZW50SWQiLCJub3ciLCJEYXRlIiwidG9CeXRlcyIsImNyZWF0ZWRPbiIsInVwZGF0ZWRPbiIsImVucm9sbCIsImlkZW50aXR5IiwicmVnaXN0ZXJBbmRFbnJvbGwiLCJyZXZva2UiLCJyZWFzb24iLCJSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciIsImVycnMiLCJyb2xlIiwic2V0QWZmaWxpYXRpb24iLCJhZGRBdHRyIiwiYXR0ciIsInNldEF0dHJzIiwic2V0RW5yb2xsbWVudElEIiwic2V0RW5yb2xsbWVudFNlY3JldCIsInNldE1heEVucm9sbG1lbnRzIiwic2V0Um9sZSIsIm1pbmxlbmd0aCIsIm1pbiIsIkVSQzIwRXZlbnRzIiwiRmFicmljQmFzZU1vZGVsIiwiY3JlYXRlZEF0IiwidXBkYXRlZEF0IiwidmVyc2lvbiIsInVzZXMiLCJGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsIiwiY3JlYXRlZEJ5IiwidXBkYXRlZEJ5IiwiaXNTaGFyZWQiLCJzZWdyZWdhdGUiLCJpc1RyYW5zaWVudCIsImRlY29yYXRlZFByb3BlcnRpZXMiLCJnZXRBdHRyaWJ1dGVzIiwidHJhbnNpZW50UHJvcHMiLCJEQktleXMiLCJUUkFOU0lFTlQiLCJwcml2YXRlUHJvcGVydGllcyIsIlBSSVZBVEUiLCJzaGFyZWRQcm9wZXJ0aWVzIiwiU0hBUkVEIiwicHVibGljIiwidHJhbnNpZW50S2V5cyIsInByaXZhdGVLZXlzIiwic2hhcmVkS2V5cyIsImlzUHVibGljIiwiYmluZCIsIm1pcnJvcmVkIiwiRkFCUklDIiwiTUlSUk9SIiwib3duZXJPZiIsIm1ldGEiLCJPV05FRF9CWSIsInNoYXJlZEtleSIsImNvbnN0ciIsInByaXZhdGVNZXRhIiwic2hhcmVkTWV0YSIsImNvbGxlY3Rpb25zIiwiZXh0cmFjdE1zcElkIiwiZ2V0TVNQSUQiLCJPd25lciIsInRhcmdldCIsInByb3BlcnR5S2V5IiwiZGVzY3JpcHRvciIsIm9yaWdpbmFsTWV0aG9kIiwiYWNvdW50SWQiLCJjbGllbnRJZGVudGl0eSIsImdldElEIiwic2VsZWN0IiwidG9rZW5zIiwiZXhlY3V0ZSIsImFwcGx5Iiwib3duZWRCeU9uQ3JlYXRlIiwiY29udGV4dCIsInN0dWIiLCJjcmVhdG9yIiwiZ2V0Q3JlYXRvciIsIm1zcGlkIiwic2V0T3duZWRCeUtleVZhbHVlIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJvd25lZEJ5IiwiYXR0cmlidXRlIiwiZ2VuZXJhdGVkIiwicmVhZG9ubHkiLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSIsIkRlY29yYXRpb24iLCJkZWZpbmUiLCJkZWNvcmF0b3IiLCJ0cmFuc2FjdGlvbklkT25DcmVhdGUiLCJnZXRUeElEIiwidHJhbnNhY3Rpb25JZCIsIm9uVXBkYXRlIiwiVFJBTlNBQ1RJT05fSUQiLCJldmFsTWlycm9yTWV0YWRhdGEiLCJjcmVhdGVNaXJyb3JIYW5kbGVyIiwiZmFicmljQ3R4Iiwic291cmNlTW9kZWwiLCJwdXQiLCJyZXBvIiwibWlycm9yQ29sbGVjdGlvbiIsInVwZGF0ZU1pcnJvckhhbmRsZXIiLCJhcHBseVVwZGF0ZVZhbGlkYXRpb24iLCJtZXJnZUZvclVwZGF0ZSIsImRlbGV0ZU1pcnJvckhhbmRsZXIiLCJwa1Byb3AiLCJzZWdyZWdhdGVkIiwibWlycm9yV3JpdGVHdWFyZCIsIm1zcCIsImNvbmRpdGlvbiIsInJlYWRNaXJyb3JIYW5kbGVyIiwibWF0Y2hlcyIsInJlYWRGcm9tIiwibXNwSWRPckNvbmRpdGlvbiIsImlzQ29uZGl0aW9uT25seSIsIkJvb2xlYW4iLCJjb25kIiwib25SZWFkIiwicHJpb3JpdHkiLCJvbkRlbGV0ZSIsIk1vZGVsQ29sbGVjdGlvbiIsIm9yZ05hbWUiLCJ0b1Bhc2NhbENhc2UiLCJOYW1lc3BhY2VDb2xsZWN0aW9uIiwibmFtZXNwYWNlIiwiSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbiIsIlNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZIiwiYXBwbHlTZWdyZWdhdGlvbkZsYWdzIiwiaXNGdWxseVNlZ3JlZ2F0ZWQiLCJoYXNQdWJsaWNQcm9wZXJ0aWVzIiwibWFya0Z1bGx5U2VncmVnYXRlZCIsImFwcGx5TWlycm9yRmxhZ3MiLCJhdHRyaWJ1dGVzIiwidHJhbnNpZW50TWV0YSIsImV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnMiLCJkYXRhQXJyYXkiLCJjb2xsZWN0aW9uUmVzb2x2ZXIiLCJzZXFOYW1lIiwic2VxdWVuY2VOYW1lIiwic2V0U2VxdWVuY2VTZWdyZWdhdGlvbiIsInNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUiLCJrZXlBcnJheSIsIl9rIiwia2V5U3RyaW5ncyIsIndyaXRlVG8iLCJzZWdyZWdhdGVkRGF0YU9uUmVhZCIsInNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUiLCJvbGRNb2RlbCIsInNlZ3JlZ2F0ZWREYXRhT25EZWxldGUiLCJpbm5lclNlZ3JlZ2F0ZWQiLCJzZWdyZWdhdGVkRGVjIiwiU2V0IiwiYWRkIiwiY29uc3RyTWV0YSIsImNvbnN0ckNvbGxlY3Rpb25zIiwidXBkYXRlZFRyYW5zaWVudE1ldGEiLCJkZWNzIiwicHJvcGVydGllcyIsImdyb3VwTmFtZSIsImV4dHJhY3RHcm91cE5hbWUiLCJkYXRhR3JvdXBOYW1lIiwiZWFybHlFeHRyYWN0aW9uTWV0YSIsImVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydCIsImdyb3VwIiwicHJvcCIsIm9uIiwiREJPcGVyYXRpb25zIiwiQUxMIiwicHJpdmF0ZURhdGEiLCJzaGFyZWREYXRhIiwic29ydEtleXNPbmx5UmVjdXJzaXZlIiwic29ydCIsInJlZHVjZSIsImFjYyIsIkRldGVybWluaXN0aWNTZXJpYWxpemVyIiwiZXJyb3IiLCJzZWxmIiwibyIsImNhbGwiLCJyZWxhdGlvbnMiLCJnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSIsInBhcnNlRXZlbnROYW1lIiwicGFydHMiLCJzcGxpdCIsInN1YiIsInNhZmVQYXJzZUludCIsInN0cmluZyIsImRpZ2l0UmVnZXgiLCJ0ZXN0IiwicGFyc2VkaW50IiwicGFyc2VJbnQiLCJpc05hTiIsIlNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyIiwicHV0QW5jaG9yIiwicHJlU2VyaWFsaXphdGlvbiIsIkZhYnJpY0lkZW50aXR5U2VydmljZSIsIkNsaWVudEJhc2VkU2VydmljZSIsInJvb3RDbGllbnQiLCJfdXNlciIsImNlcnRpZmljYXRlcyIsImFmZmlsaWF0aW9ucyIsImdldFVzZXIiLCJjZmciLCJJTklUSUFMSVpBVElPTiIsImdldE5hbWUiLCJ1cGRhdGVJZGVudGl0eSIsImlkZW50aXR5UmVxdWVzdCIsImNhVXNlcklkZW50aXR5IiwicmVlbnJvbGxVc2VyIiwiY3JlYXRlVXNlciIsImdldE1zcGlkIiwiZW5yb2xsbWVudEF0dHJzIiwib3B0aW9uYWwiLCJyZWVucm9sbCIsInJlbmV3ZWRJZGVudGl0eSIsInJldm9rZU9wdGlvbnMiLCJyZXZva2VSZXF1ZXN0IiwiQ0FfUk9MRSIsIkRlZmF1bHRGYWJyaWNDbGllbnRGbGFncyIsImV2YWx1YXRlVGltZW91dCIsImVuZG9yc2VUaW1lb3V0Iiwic3VibWl0VGltZW91dCIsImNvbW1pdFRpbWVvdXQiLCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3MiLCJhbGxvd0dhdGV3YXlPdmVycmlkZSIsImVuY3J5cHRUcmFuc2llbnQiLCJzeW50aGV0aWNFdmVudHMiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwidG9Mb3dlckNhc2UiLCJvcmRlckJ5U2VsZWN0b3JzIiwiT1JERVJfQlkiLCJ0b0NhbWVsQ2FzZSIsInByb2Nlc3NSZWNvcmQiLCJwa0F0dHIiLCJJRCIsImtleUFyZ3MiLCJTRVBBUkFUT1IiLCJyYXciLCJyYXdJbnB1dCIsImFnZ3JlZ2F0b3IiLCJhZ2dyZWdhdGVJbmZvIiwiYWdncmVnYXRlIiwiZXhlY3V0ZUFnZ3JlZ2F0ZSIsInJlc3VsdHMiLCJwcm9jZXNzZWQiLCJhcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdCIsImFnZ3JlZ2F0ZVF1ZXJ5IiwiYnVpbGRBZ2dyZWdhdGVRdWVyeSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwiZmllbGRzIiwicGFyc2VDb25kaXRpb24iLCJDb25kaXRpb24iLCJhbmQiLCJlcSIsInNlbGVjdG9yS2V5cyIsIkNvdWNoREJHcm91cE9wZXJhdG9yIiwiaW5kZXhPZiIsInZhbCIsIk9SIiwicyIsImVudHJpZXMiLCJ3YXJuIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsInBvcCIsInRvT3ZlcnJpZGVzIiwibmV3Q3R4IiwicGFyZW50Q29udGV4dCIsImNoaWxkQ29udGV4dHMiLCJjdXJyZW50T3AiLCJjdXJyZW50TW9kZWwiLCJyZXBvc2l0b3J5IiwiY3JlYXRlUHJlZml4IiwidXBkYXRlQWxsUHJlZml4Iiwic2hpZnQiLCJoYXNUcmFuc2llbnQiLCJuZWVkc0Z1bGxQYXlsb2FkIiwic2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uIiwidHJhbnNpZW50UGF5bG9hZCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIkNSRUFURV9BTEwiLCJnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zIiwicmVzIiwic2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUiLCJSRUFEX0FMTCIsIlVQREFURV9BTEwiLCJkZWxldGVBbGwiLCJzaG91bGRIeWRyYXRlIiwiREVMRVRFX0FMTCIsIk1FVEFEQVRBIiwibWlycm9yTXNwIiwibXNwcyIsIm1lcmdlZCIsImVuZG9yc2luZ09yZ3MiLCJlbmRvcnNpbmdPcmdhbml6YXRpb25zIiwic2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQiLCJ2IiwiY2hpbGRSZWJ1aWxkIiwiZ2V0RnJvbUNoaWxkcmVuIiwicmVzb2x2ZWRPcCIsInJlc29sdmVPcGVyYXRpb24iLCJoYXNJZCIsImRpcmVjdCIsImRlc2VyaWFsaXplZCIsInVwZGF0ZVByZWZpeCIsIlVQREFURSIsIkRFTEVURSIsImRvY3NPbmx5IiwidHJhbnNhY3Rpb25SZXN1bHQiLCJwYXJzZVJlY29yZCIsImlzTW9kZWwiLCJlbCIsImdldENsaWVudCIsIl9jbGllbnQiLCJHYXRld2F5IiwiZ2V0R2F0ZXdheSIsImdldENvbnRyYWN0TmFtZSIsIkNvbnRyYWN0IiwiY29udHJhY3ROYW1lIiwiZ2V0Q29udHJhY3QiLCJ0cmFuc2FjdGlvbiIsImFwaSIsInN1Ym1pdCIsInRyYW5zaWVudERhdGEiLCJnYXRld2F5IiwiY29udHJhY3QiLCJldmFsdWF0ZSIsInByb3Bvc2FsT3B0aW9ucyIsImFyZ3VtZW50cyIsImNsb3NlIiwic2hvdWxkVXNlTGVnYWN5R2F0ZXdheSIsInByZXBhcmVMZWdhY3lBcmdzIiwiYnVpbGRMZWdhY3lUcmFuc2llbnQiLCJyZXNvbHZlTGVnYWN5TXNwQ291bnQiLCJjb25maWd1cmVkIiwibGVnYWN5TXNwQ291bnQiLCJpc0Zpbml0ZSIsImZsb29yIiwicGlja0xlZ2FjeUNhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwiYXZhaWxhYmxlIiwicGlja2VkIiwiaWR4IiwicmFuZG9tIiwic2VsZWN0aW9uIiwic3BsaWNlIiwiYnVpbGRMZWdhY3lQZWVyQ29uZmlncyIsInBlZXJzIiwicGVlckVuZHBvaW50IiwicGVlckhvc3RBbGlhcyIsInRsc0NlcnQiLCJlbmRvcnNlcnMiLCJvcmciLCJleHRyYXMiLCJtc3BNYXAiLCJsZWdhY3lDb3VudCIsInNlbGVjdGlvbnMiLCJjaG9pY2UiLCJlbmRwb2ludCIsInN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyIsImZjbiIsInRyYW5zaWVudE1hcCIsInBlZXJDb25maWdzIiwibm9ybWFsaXplTGVnYWN5UGVlcnMiLCJpZGVudGl0eU1hdGVyaWFsIiwicmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwiLCJ3YWxsZXQiLCJXYWxsZXRzIiwibmV3SW5NZW1vcnlXYWxsZXQiLCJpZGVudGl0eUxhYmVsIiwiY29ubmVjdGlvblByb2ZpbGUiLCJidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlIiwiTGVnYWN5R2F0ZXdheSIsImNvbm5lY3QiLCJkaXNjb3ZlcnkiLCJlbmFibGVkIiwiYXNMb2NhbGhvc3QiLCJzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QiLCJ0bHNJbmZvIiwibmV0d29yayIsImdldE5ldHdvcmsiLCJjaGFubmVsIiwiY2hhaW5jb2RlTmFtZSIsImNyZWF0ZVRyYW5zYWN0aW9uIiwic2V0VHJhbnNpZW50IiwicGVlciIsImdldENoYW5uZWwiLCJnZXRFbmRvcnNlciIsImVuZG9yc2VyIiwic2V0RW5kb3JzaW5nUGVlcnMiLCJkaXNjb25uZWN0IiwiZGVkdXBlZCIsIk1hcCIsImFkZFBlZXIiLCJoYXMiLCJyZWFkUGVtSW5wdXQiLCJjZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCIsImtleUNlcnRPckRpcmVjdG9yeVBhdGgiLCJwZWVyRW50cmllcyIsImNoYW5uZWxQZWVycyIsIm9yZ3MiLCJ0bHNQZW0iLCJob3N0bmFtZSIsImV4dHJhY3RIb3N0IiwiZW5zdXJlR3JwY1VybCIsInRsc0NBQ2VydHMiLCJncnBjT3B0aW9ucyIsImhvc3RuYW1lT3ZlcnJpZGUiLCJlbmRvcnNpbmdQZWVyIiwiY2hhaW5jb2RlUXVlcnkiLCJsZWRnZXJRdWVyeSIsImV2ZW50U291cmNlIiwib3JnYW5pemF0aW9uIiwib3JnYW5pemF0aW9ucyIsIm9yZGVyZXJzIiwiY2hhbm5lbHMiLCJldmVyeSIsImlzTG9jYWxFbmRwb2ludCIsImhvc3QiLCJzYW5pdGl6ZWQiLCJpc0J1ZmZlciIsInRyaW1tZWQiLCJzdGF0cyIsInN0YXQiLCJjYXRjaCIsImlzRGlyZWN0b3J5IiwicmVhZEZzRmlsZSIsImVyciIsImxlZ2FjeUFyZ3MiLCJzaHV0ZG93biIsImNoYW5uZWxOYW1lIiwiZ2V0Q29ubmVjdGlvbiIsInBhdGhPckNlcnQiLCJyZWFkRmlsZVN5bmMiLCJ0bHNDcmVkZW50aWFscyIsImdycGMiLCJjcmVhdGVTc2wiLCJzaXplTGltaXQiLCJzaWduZXIiLCJldmFsdWF0ZU9wdGlvbnMiLCJkZWFkbGluZSIsImVuZG9yc2VPcHRpb25zIiwic3VibWl0T3B0aW9ucyIsImNvbW1pdFN0YXR1c09wdGlvbnMiLCJQcm94eSIsInRoaXNBcmciLCJhcmdBcnJheSIsIlJlZmxlY3QiLCJEaXNwYXRjaCIsIkdhdGV3YXlFcnJvciIsImRldGFpbHMiLCJFbmRvcnNlRXJyb3IiLCJCYWRSZXF1ZXN0RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZmluYWwiLCJEIiwiX2EiLCJkZWNvcmF0aW9uIiwic2V0Q3VycmVudCIsIkZhYnJpY0NsaWVudERpc3BhdGNoIiwibG9nZ2VkQXJncyIsIlNIVVRET1dOIiwibGlzdGVuaW5nU3RhY2siLCJwYXJzZVBheWxvYWQiLCJqc29uQnl0ZXMiLCJqc29uIiwib2JzZXJ2ZSIsIm9ic2VydmVyIiwidW5PYnNlcnZlIiwicmVmcmVzaCIsImhhbmRsZUV2ZW50cyIsImN0eEFyZyIsImNvcnJlbGF0aW9uSWQiLCJldnQiLCJldmVudE5hbWUiLCJtc3BFdmVudE9ubHkiLCJ0YXJnZXRNb2RlbCIsIm1vZGVsUmVmIiwib2JzZXJ2ZXJBcmdzIiwiZ2V0Q2hhaW5jb2RlRXZlbnRzIiwidG9XcmFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsImJ1bGtUb1NpbmdsZSIsInJlc3VsdEFyZ3MiLCJWRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBp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