@decaf-ts/for-fabric 0.5.1-query.2 → 0.5.1-query.3

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.
@@ -1543,7 +1543,7 @@
1543
1543
  const allowGenerationOverride = context.getOrUndefined("allowGenerationOverride") || false;
1544
1544
  const creator = await stub.getCreator();
1545
1545
  let owner = creator.mspid;
1546
- context.log.info(`Expected mspid to be ${model[key]} | ${owner}. \n Using allowGenerationOverride: ${allowGenerationOverride}`);
1546
+ context.logger.info(`Expected mspid to be ${model[key]} | ${owner}. \n Using allowGenerationOverride: ${allowGenerationOverride}`);
1547
1547
  if (allowGenerationOverride) owner = model[key] ? model[key] : owner;
1548
1548
  const setOwnedByKeyValue = function(target, propertyKey, value) {
1549
1549
  Object.defineProperty(target, propertyKey, {
@@ -3697,7 +3697,7 @@
3697
3697
  }
3698
3698
  }
3699
3699
  if (FabricClientAdapter) FabricClientAdapter["_baseDispatch"] = FabricClientDispatch;
3700
- const VERSION = "0.5.1";
3700
+ const VERSION = "0.5.1-query.2";
3701
3701
  const PACKAGE_NAME = "@decaf-ts/for-fabric";
3702
3702
  decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
3703
3703
  exports.AllowanceError = AllowanceError;
@@ -3787,4 +3787,4 @@
3787
3787
  exports.writeDesignDocs = writeDesignDocs;
3788
3788
  exports.writeIndexes = writeIndexes;
3789
3789
  });
3790
- //# 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+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcblxuICBjb25zdCBhbGxvd0dlbmVyYXRpb25PdmVycmlkZSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlO1xuXG4gIGNvbnN0IGNyZWF0b3IgPSBhd2FpdCBzdHViLmdldENyZWF0b3IoKTtcbiAgbGV0IG93bmVyID0gY3JlYXRvci5tc3BpZDtcbiAgY29udGV4dC5sb2cuaW5mbyhcbiAgICBgRXhwZWN0ZWQgbXNwaWQgdG8gYmUgJHttb2RlbFtrZXldfSB8ICR7b3duZXJ9LiBcXG4gVXNpbmcgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGU6ICR7YWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGV9YFxuICApO1xuXG4gIGlmIChhbGxvd0dlbmVyYXRpb25PdmVycmlkZSkgb3duZXIgPSBtb2RlbFtrZXldID8gbW9kZWxba2V5XSA6IG93bmVyO1xuXG4gIGNvbnN0IHNldE93bmVkQnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgc2V0T3duZWRCeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBvd25lcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBnZW5lcmF0ZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUob3duZWRCeU9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb3duZWRCeSxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2FjdGlvbklkT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuICBtb2RlbFtrZXldID0gc3R1Yi5nZXRUeElEKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICByZWFkb25seSgpLFxuICAgICAgICBvbkNyZWF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBvblVwZGF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoXG4gICAgICAgICAgTWV0YWRhdGEua2V5KFxuICAgICAgICAgICAgRmFicmljTW9kZWxLZXlzLkZBQlJJQyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRFxuICAgICAgICAgICksXG4gICAgICAgICAgYXR0cmlidXRlXG4gICAgICAgIClcbiAgICAgICkob2JqLCBhdHRyaWJ1dGUpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlRSQU5TQUNUSU9OX0lEKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB0cmFuc2FjdGlvbklkLFxuICAgICAgYXJnczogW10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgTWlycm9yQ29uZGl0aW9uID0gKG1zcDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uO1xuICByZXNvbHZlcjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nO1xuICBtc3BJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV2YWxNaXJyb3JNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgcmVzb2x2ZXI6IHVuZGVmaW5lZCB8IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgY3R4OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+XG4pIHtcbiAgbGV0IGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlc29sdmVyO1xuICBpZiAodHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3duZXIgPVxuICAgICAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fCBjdHguZ2V0KFwic3R1YlwiKS5nZXRDcmVhdG9yKCkudG9TdHJpbmcoKTtcbiAgICAgIGlmIChyZXNvbHZlciAmJiB0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgY29sbGVjdGlvbiA9IGF3YWl0IHJlc29sdmVyKG1vZGVsLCBvd25lciwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgY29sbGVjdGlvbiBtaXJyb3IgbmFtZTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29sbGVjdGlvbiB8fCB0eXBlb2YgY29sbGVjdGlvbiAhPT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBObyBjb2xsZWN0aW9uIGZvdW5kIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcbiAgcmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgLy8gUHV0IG1pcnJvciBmbGFncyBkaXJlY3RseSBvbiBjb250ZXh0IHNvIGFkYXB0ZXIucHJlcGFyZSgpIGFuZCBhZGFwdGVyLmNyZWF0ZSgpIGNhbiBzZWUgdGhlbVxuICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLm92ZXJyaWRlKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKHRoaXMgYXMgYW55KS5fb3ZlcnJpZGVzLCB7XG4gICAgICAgIG1pcnJvcjogdHJ1ZSxcbiAgICAgICAgbWlycm9yQ29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGNvbnN0IG1pcnJvciA9IGF3YWl0IHJlcG8uY3JlYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGNyZWF0ZWQgd2l0aCAke01vZGVsLnBrKG1vZGVsKSBhcyBzdHJpbmd9OiAke21pcnJvcltNb2RlbC5wayhtb2RlbCldfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENsZWFuIHVwIG1pcnJvciBmbGFncyBmcm9tIGNvbnRleHRcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgICBhcHBseVVwZGF0ZVZhbGlkYXRpb246IGZhbHNlLFxuICAgICAgICBtZXJnZUZvclVwZGF0ZTogZmFsc2UsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGF3YWl0IHJlcG8udXBkYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHVwZGF0ZWQ6ICR7KG1vZGVsIGFzIGFueSlbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHBrUHJvcCA9IE1vZGVsLnBrKG1vZGVsKSBhcyBrZXlvZiBNO1xuICAgIGNvbnN0IGlkID0gbW9kZWxbcGtQcm9wXTtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBzZWdyZWdhdGVkOiBjb2xsZWN0aW9uLFxuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVwby5kZWxldGUoaWQgYXMgYW55LCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1heSBhbHJlYWR5IGJlIGRlbGV0ZWQgYnkgYWRhcHRlci5kZWxldGVTZWdyZWdhdGVkQ29sbGVjdGlvbnNcbiAgICB9XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBkZWxldGVkOiAke1N0cmluZyhpZCl9YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwic2VncmVnYXRlZFwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWlycm9yV3JpdGVHdWFyZDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAga2V5OiBrZXlvZiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgaWYgKG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSkpIHtcbiAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgYE9yZ2FuaXphdGlvbiAke21zcH0gaXMgbm90IGF1dGhvcml6ZWQgdG8gbW9kaWZ5IG1pcnJvcmVkIGRhdGFgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcblxuICBpZiAoIW1zcCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3QgbWF0Y2hlcyA9IG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciByZWFkOiBNU1AgJHttc3B9IG1hdGNoZXMsIHJvdXRpbmcgcmVhZHMgdG8gbWlycm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9ufWBcbiAgICApO1xuICAgIC8vIFJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvciBjb2xsZWN0aW9uXG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xuICB9XG4gIC8vIFdoZW4gTVNQIGRvZXMgTk9UIG1hdGNoLCBub3JtYWwgcmVhZCBmbG93IOKAlCBhbGwgZGF0YSBpcyBpbiBwdWJsaWMgc3RhdGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvcihcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nLFxuICBtc3BJZE9yQ29uZGl0aW9uPzogc3RyaW5nIHwgTWlycm9yQ29uZGl0aW9uLFxuICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbikge1xuICBjb25zdCBpc0NvbmRpdGlvbk9ubHkgPVxuICAgIHR5cGVvZiBtc3BJZE9yQ29uZGl0aW9uICE9PSBcInN0cmluZ1wiICYmIEJvb2xlYW4obXNwSWRPckNvbmRpdGlvbik7XG4gIGNvbnN0IG1zcElkID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IChtc3BJZE9yQ29uZGl0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbmQgPSBpc0NvbmRpdGlvbk9ubHlcbiAgICA/IChtc3BJZE9yQ29uZGl0aW9uIGFzIE1pcnJvckNvbmRpdGlvbilcbiAgICA6IGNvbmRpdGlvbjtcblxuICBmdW5jdGlvbiBtaXJyb3IoXG4gICAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvblxuICApIHtcbiAgICBjb25zdCBtZXRhOiBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uLFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgcmVzb2x2ZXI6IHJlc29sdmVyLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgbWV0YWRhdGEoXG4gICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKSxcbiAgICAgICAgbWV0YVxuICAgICAgKSxcbiAgICAgIC8vIFJlYWQgaGFuZGxlciBydW5zIGVhcmx5IChwcmlvcml0eSAzMCkgdG8gc2V0IHVwIGNvbnRleHQgYmVmb3JlIGFueSByZWFkc1xuICAgICAgb25SZWFkKHJlYWRNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMzAgfSksXG4gICAgICAvLyBXcml0ZSBndWFyZHMg4oCUIHJlamVjdCBtYXRjaGluZyBNU1BzIGJlZm9yZSBhbnkgcHJvY2Vzc2luZ1xuICAgICAgb25DcmVhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25VcGRhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25EZWxldGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgLy8gTWlycm9yIHN5bmMgaGFuZGxlcnMg4oCUIHdyaXRlIGZ1bGwgbW9kZWwgYWZ0ZXIgb3RoZXIgaGFuZGxlcnMgKHByaW9yaXR5IDEwMClcbiAgICAgIG9uQ3JlYXRlKGNyZWF0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSksXG4gICAgICBvblVwZGF0ZSh1cGRhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25EZWxldGUoZGVsZXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWlycm9yLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb24sIG1zcElkLCBjb25kXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwPzogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBNb2RlbENvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgY29uc3QgY29uc3RyID0gdHlwZW9mIG1vZGVsID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbCA6IG1vZGVsLmNvbnN0cnVjdG9yO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHtjb25zdHIubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYCR7dG9QYXNjYWxDYXNlKGNvbnN0ci5uYW1lKX0ke29yZ05hbWUgPyB0b1Bhc2NhbENhc2Uob3JnTmFtZSkgOiBcIlwifWA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTmFtZXNwYWNlQ29sbGVjdGlvbihuYW1lc3BhY2U6IHN0cmluZyk6IENvbGxlY3Rpb25SZXNvbHZlciB7XG4gIHJldHVybiA8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LCBtc3BJZD86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG9yZ05hbWUgPVxuICAgICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIW9yZ05hbWUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgICApO1xuICAgIHJldHVybiBgJHtuYW1lc3BhY2V9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkPzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3Qgb3JnTmFtZSA9XG4gICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICk7XG4gIHJldHVybiBgX18ke3RvUGFzY2FsQ2FzZShvcmdOYW1lKX1Qcml2YXRlQ29sbGVjdGlvbmA7XG59O1xuXG5leHBvcnQgdHlwZSBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhID0ge1xuICBjb2xsZWN0aW9uczogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpb3JpdHkgZm9yIGVhcmx5IGNvbGxlY3Rpb24gZXh0cmFjdGlvbiAoYmVmb3JlIHBrIGdlbmVyYXRpb24gYXQgcHJpb3JpdHkgNjApXG4gKiBAc3VtbWFyeSBUaGlzIHByaW9yaXR5IGVuc3VyZXMgY29sbGVjdGlvbnMgYXJlIHJlZ2lzdGVyZWQgaW4gY29udGV4dCBiZWZvcmUgYW55IHNlcXVlbmNlXG4gKiBvcGVyYXRpb25zIG9jY3VyLCBhbGxvd2luZyBzZXF1ZW5jZXMgdG8gYmUgcmVwbGljYXRlZCB0byBwcml2YXRlL3NoYXJlZCBjb2xsZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZID0gMzU7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNlZ3JlZ2F0aW9uRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IE0sXG4gIGNvbGxlY3Rpb25zOiBzdHJpbmdbXSxcbiAgY3R4OiBhbnlcbikge1xuICAvLyBSZWdpc3RlciBjb2xsZWN0aW9ucyBlYXJseSB1c2luZyByZWFkRnJvbSAtIHRoaXMgYWxsb3dzIHNlcXVlbmNlIGNvZGVcbiAgLy8gdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8gZHVyaW5nIHBrIGdlbmVyYXRpb25cbiAgaWYgKGNvbGxlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAoY3R4IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbnMpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgbW9kZWwgaXMgZnVsbHkgc2VncmVnYXRlZCAoYWxsIG5vbi1wayBwcm9wZXJ0aWVzIGFyZSBwcml2YXRlL3NoYXJlZC90cmFuc2llbnQpLlxuICAvLyBVc2UgTW9kZWwuc2VncmVnYXRlKCkgd2hpY2ggaXMgdGhlIGNhbm9uaWNhbCB3YXkgdG8gZGV0ZXJtaW5lIHdoYXQncyB0cmFuc2llbnQsXG4gIC8vIHJhdGhlciB0aGFuIHJlYWRpbmcgREJLZXlzLlRSQU5TSUVOVCBtZXRhZGF0YSB3aGljaCBtYXkgbm90IGFjY3VtdWxhdGUgY29ycmVjdGx5XG4gIC8vIHdoZW4gY2xhc3MtbGV2ZWwgQHByaXZhdGVEYXRhIGFwcGxpZXMgZGVjb3JhdG9ycyBpdGVyYXRpdmVseS5cbiAgaWYgKCFjdHguaXNGdWxseVNlZ3JlZ2F0ZWQgJiYgY29sbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgaWYgKCFoYXNQdWJsaWNQcm9wZXJ0aWVzKGNsYXp6LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSkge1xuICAgICAgY3R4Lm1hcmtGdWxseVNlZ3JlZ2F0ZWQoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5TWlycm9yRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtc3A6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHRcbikge1xuICBpZiAoIW1zcCkgcmV0dXJuO1xuICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChjbGF6eik7XG4gIGlmICghbWlycm9yTWV0YSkgcmV0dXJuO1xuICBjb25zdCBtYXRjaGVzID1cbiAgICBtc3AgPT09IG1pcnJvck1ldGEubXNwSWQgfHxcbiAgICAobWlycm9yTWV0YS5jb25kaXRpb24gJiYgbWlycm9yTWV0YS5jb25kaXRpb24obXNwKSk7XG4gIGlmICghbWF0Y2hlcykgcmV0dXJuO1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKFxuICAgIG5ldyBjbGF6eigpLFxuICAgIG1pcnJvck1ldGEucmVzb2x2ZXIsXG4gICAgY3R4XG4gICk7XG4gIC8vIE1pcnJvciBNU1AgbWF0Y2hlcyDigJQgcm91dGUgcmVhZHMgZXhjbHVzaXZlbHkgdGhyb3VnaCB0aGUgbWlycm9yXG4gIC8vIGNvbGxlY3Rpb24uIENsZWFyIGFueSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY29sbGVjdGlvbnMgc28gcXVlcmllc1xuICAvLyBnbyBPTkxZIHRvIHRoZSBtaXJyb3IsIG5vdCB0byB0aGUgcmVndWxhciBwcml2YXRlL3NoYXJlZCBvbmVzLlxuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFwiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFN0YWNrXCIsIHVuZGVmaW5lZCk7XG4gIGN0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gIGN0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGN0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gaGFzUHVibGljUHJvcGVydGllczxNIGV4dGVuZHMgTW9kZWw+KGNsYXp6OiBDb25zdHJ1Y3RvcjxNPik6IGJvb2xlYW4ge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyhjbGF6eikgfHwgW107XG4gIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICBjb25zdCB0cmFuc2llbnRNZXRhID0gTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gIGNvbnN0IHByaXZhdGVNZXRhID1cbiAgICBNZXRhZGF0YS5nZXQoY2xhenogYXMgYW55LCBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpKSB8fCB7fTtcbiAgY29uc3Qgc2hhcmVkTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpKSB8fCB7fTtcblxuICByZXR1cm4gYXR0cmlidXRlcy5zb21lKChhdHRyKSA9PiB7XG4gICAgaWYgKGF0dHIgPT09IHBrKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gdHJhbnNpZW50TWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHByaXZhdGVNZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gc2hhcmVkTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRWFybHkgaGFuZGxlciB0byBleHRyYWN0IGFuZCByZWdpc3RlciBjb2xsZWN0aW9ucyBpbiBjb250ZXh0XG4gKiBAc3VtbWFyeSBSdW5zIHdpdGggcHJpb3JpdHkgPCA0MCB0byBleHRyYWN0IGNvbGxlY3Rpb24gbmFtZXMgYmVmb3JlIHBrIGdlbmVyYXRpb24gKHByaW9yaXR5IDYwKS5cbiAqIFRoaXMgYWxsb3dzIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8uXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnRleHRPZjxSZXBvc2l0b3J5PE0sIGFueT4+fSBjb250ZXh0IC0gVGhlIGV4ZWN1dGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ge1NlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW119IGRhdGEgLSBUaGUgc2VncmVnYXRlZCBkYXRhIG1ldGFkYXRhXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBrZXlzIC0gVGhlIHByb3BlcnR5IGtleShzKSBiZWluZyBzZWdyZWdhdGVkXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgcGVyLXNlcXVlbmNlIHNvIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgY2FuIGRlY2lkZVxuICAvLyB3aGVyZSB0byBzdG9yZS9yZXBsaWNhdGUgc2VxdWVuY2UgcmVjb3JkcyAocHVibGljIHZzIHByaXZhdGUvc2hhcmVkKS5cbiAgLy9cbiAgLy8gLSBgQHBrKClgIHNlcXVlbmNlcyB1c2UgdGhlIHNoYXJlZCBuYW1lIGAke3RhYmxlfV9wa2AgKG5vIGlkIGNvbXBvbmVudCkuXG4gIC8vIC0gYEBzZXF1ZW5jZSgpYCAvIHBlcnNpc3RlbnQgYEB2ZXJzaW9uKHRydWUpYCBzZXF1ZW5jZXMgYXJlIHBlci1tb2RlbC1pbnN0YW5jZTpcbiAgLy8gICBgJHt0YWJsZX1fJHtpZH1fJHtwcm9wZXJ0eX1gLlxuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSBhcyBrZXlvZiBNO1xuICBjb25zdCBwa1NlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG5cbiAgY29uc3QgaWRWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3BrS2V5IGFzIGFueV07XG4gIGNvbnN0IGNhbkJ1aWxkUGVySW5zdGFuY2UgPVxuICAgIHR5cGVvZiBpZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIGlkVmFsdWUgIT09IG51bGw7XG5cbiAgLy8gQWx3YXlzIHVuaW9uIGNvbGxlY3Rpb25zIGZvciB0aGUgcGsgc2VxdWVuY2Ugd2hlbiB0aGUgbW9kZWwgdXNlcyBzZWdyZWdhdGVkIGRhdGEuXG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBwa1NlcU5hbWUsXG4gICAgKGNvbnRleHQgYXMgYW55KS5pc0Z1bGx5U2VncmVnYXRlZCxcbiAgICBjb2xsZWN0aW9uc1xuICApO1xuXG4gIC8vIEZvciBwZXItcHJvcGVydHkgc2VxdWVuY2VzLCBvbmx5IHJlZ2lzdGVyIHdoZW4gd2UgY2FuIGNvbXB1dGUgYW4gaWQtc2NvcGVkIG5hbWUuXG4gIC8vIFRoaXMga2VlcHMgc2VxdWVuY2VzIGNvbnN0cmFpbmVkIHRvIHRoZSBjb2xsZWN0aW9ucyB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbi5cbiAgaWYgKGNhbkJ1aWxkUGVySW5zdGFuY2UpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BTZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgU3RyaW5nKGlkVmFsdWUpLFxuICAgICAgICBTdHJpbmcoaylcbiAgICAgICk7XG4gICAgICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgICAgIHByb3BTZXFOYW1lLFxuICAgICAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgICAgICBjb2xsZWN0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID0gTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2VncmVnYXRlZChcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICB0eXBlOiBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSB8IEZhYnJpY01vZGVsS2V5cy5TSEFSRUQsXG4gIGZpbHRlcj86IChwcm9wTmFtZTogc3RyaW5nKSA9PiBib29sZWFuXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gTWV0YWRhdGEua2V5KHR5cGUsIHByb3BlcnR5S2V5KTtcbiAgICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBuZXcgU2V0KG1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgbWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXksIG1ldGEpO1xuXG4gICAgICBjb25zdCBjb25zdHJNZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSkgfHwge307XG4gICAgICBjb25zdCBjb25zdHJDb2xsZWN0aW9ucyA9IG5ldyBTZXQoY29uc3RyTWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdHJDb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBjb25zdHJNZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbnN0ckNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUsIGNvbnN0ck1ldGEpO1xuXG4gICAgICBjb25zdCB0cmFuc2llbnRNZXRhID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVHJhbnNpZW50TWV0YSA9IHtcbiAgICAgICAgLi4udHJhbnNpZW50TWV0YSxcbiAgICAgICAgW3Byb3BlcnR5S2V5IGFzIGFueV06IHt9LFxuICAgICAgfTtcbiAgICAgIE1ldGFkYXRhLnNldChcbiAgICAgICAgY29uc3RyIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBEQktleXMuVFJBTlNJRU5ULFxuICAgICAgICB1cGRhdGVkVHJhbnNpZW50TWV0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNzOiBhbnlbXSA9IFtdO1xuICAgIGlmICghcHJvcGVydHlLZXkpIHtcbiAgICAgIC8vIGRlY29yYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICBwcm9wZXJ0aWVzPy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihwKSkge1xuICAgICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkoKHRhcmdldCBhcyBhbnkpLnByb3RvdHlwZSwgcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JvdXBOYW1lID1cbiAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCIgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgLy8gVXNlIGRpZmZlcmVudCBncm91cCBuYW1lcyBmb3IgZXh0cmFjdGlvbiB2cyBkYXRhIGhhbmRsZXJzIHRvIHByZXZlbnQgbWVyZ2luZ1xuICAgICAgY29uc3QgZXh0cmFjdEdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZXh0cmFjdGA7XG4gICAgICBjb25zdCBkYXRhR3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpkYXRhYDtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbk1ldGEgPSB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH07XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQgPSB7XG4gICAgICAgIHByaW9yaXR5OiBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSxcbiAgICAgICAgZ3JvdXA6IGV4dHJhY3RHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgZGVjcy5wdXNoKFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICAvLyBFYXJseSBleHRyYWN0aW9uIGhhbmRsZXJzIC0gcnVuIEJFRk9SRSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgZm9yIHNlcXVlbmNlIHJlcGxpY2F0aW9uXG4gICAgICAgIC8vIFdlIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBleHBsaWNpdGx5IHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxlciBsb29rdXBcbiAgICAgICAgb24oXG4gICAgICAgICAgREJPcGVyYXRpb25zLkFMTCxcbiAgICAgICAgICBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIGFzIGFueSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25NZXRhLFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydFxuICAgICAgICApLFxuICAgICAgICAvLyBNYWluIGhhbmRsZXJzIGZvciBzZWdyZWdhdGVkIGRhdGEgb3BlcmF0aW9ucyAocHJpb3JpdHkgOTUpXG4gICAgICAgIG9uQ3JlYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUsXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25SZWFkKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25SZWFkIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblVwZGF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvbkRlbGV0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjcykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRGF0YShcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyID0gSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvblxuKSB7XG4gIGZ1bmN0aW9uIHByaXZhdGVEYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuUFJJVkFURSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcHJpdmF0ZURhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gIGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlNIQVJFRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogc2hhcmVkRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzb3J0cyBvYmplY3Qga2V5cyB3aXRob3V0IHJlb3JkZXJpbmcgYXJyYXlzXG4gKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIHZhbHVlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge2FueX0gQSBjb3B5IHdpdGggc29ydGVkIG9iamVjdCBrZXlzIGJ1dCBwcmVzZXJ2ZWQgYXJyYXkgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoc29ydEtleXNPbmx5UmVjdXJzaXZlKTtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSByZXR1cm4gb2JqO1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5zb3J0KClcbiAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqW2tleV0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluaXN0aWMgSlNPTiBzZXJpYWxpemVyIGZvciBGYWJyaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHN0YWJsZSwgZGV0ZXJtaW5pc3RpYyBKU09OIG91dHB1dCBieSBzb3J0aW5nIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzdHJpbmdpZmljYXRpb24sIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgRmFicmljIGVuZG9yc2VtZW50IGFuZCBoYXNoaW5nLiBFeHRlbmRzIEpTT05TZXJpYWxpemVyIHRvIHBsdWcgaW50byBleGlzdGluZyBEZWNhZiBtb2RlbCBzZXJpYWxpemF0aW9uIGZsb3cuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBEZWNhZiBNb2RlbCBzdWJ0eXBlIHNlcmlhbGl6ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqIEBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8TXlNb2RlbD4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCk7XG4gKiBjb25zdCByZWJ1aWx0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqc29uKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiAgIENhbGxlci0+PkRTOiBzZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogc29ydC1rZXlzLXJlY3Vyc2l2ZVxuICogICBEUy0+PkRTOiBqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXG4gKiAgIERTLS0+PkNhbGxlcjogc3RyaW5nXG4gKiAgIENhbGxlci0+PkRTOiBkZXNlcmlhbGl6ZShzdHJpbmcpXG4gKiAgIERTLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0pIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IHByZVNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IERldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcCgobykgPT4gcHJlU2VyaWFsaXplLmNhbGwoc2VsZiwgbykpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplLmNhbGwodGhpcywgb2JqKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplKHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZSBhIG1vZGVsIGludG8gYSBkZXRlcm1pbmlzdGljIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB3aXRoIHByZVNlcmlhbGl6ZSwgc29ydHMga2V5cyByZWN1cnNpdmVseSwgYW5kIHN0cmluZ2lmaWVzIGRldGVybWluaXN0aWNhbGx5IGZvciBzdGFibGUgb3JkZXJpbmdcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZXRlcm1pbmlzdGljIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgRmFicmljIGV2ZW50IG5hbWUgZnJvbSBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IG5hbWUgYnkgam9pbmluZyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lciB3aXRoIHVuZGVyc2NvcmVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJdIC0gT3B0aW9uYWwgb3duZXIgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGV2ZW50IG5hbWUgaW4gZm9ybWF0IFwidGFibGVfZXZlbnRcIiBvciBcInRhYmxlX2V2ZW50X293bmVyXCJcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICBvd25lcj86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0YWJsZSwgZXZlbnRdO1xuICBpZiAob3duZXIpIHBhcmFtcy5wdXNoKG93bmVyKTtcbiAgcmV0dXJuIHBhcmFtcy5qb2luKFwiX1wiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgRmFicmljIGV2ZW50IG5hbWUgaW50byBpdHMgY29tcG9uZW50c1xuICogQHN1bW1hcnkgU3BsaXRzIGFuIGV2ZW50IG5hbWUgYnkgdW5kZXJzY29yZXMgYW5kIGV4dHJhY3RzIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHt7dGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsIG93bmVyOiBzdHJpbmd9fSBUaGUgcGFyc2VkIGNvbXBvbmVudHMgYXMgYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGV2ZW50IG5hbWUgZm9ybWF0IGlzIGludmFsaWRcbiAqIEBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIHBhcnNlRXZlbnROYW1lXG4gKiAgIENhbGxlci0+PlBhcnNlcjogcGFyc2VFdmVudE5hbWUobmFtZSlcbiAqICAgUGFyc2VyLT4+UGFyc2VyOiBzcGxpdCBuYW1lIGJ5IFwiX1wiXG4gKiAgIGFsdCBwYXJ0cyBsZW5ndGggaW52YWxpZFxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgZWxzZVxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHsgdGFibGUsIGV2ZW50LCBvd25lcj8gfVxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHtcbiAgdGFibGU/OiBzdHJpbmc7XG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICBvd25lcj86IHN0cmluZztcbn0ge1xuICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoXCJfXCIpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuICAgIHJldHVybiB7IHRhYmxlOiB1bmRlZmluZWQsIGV2ZW50OiBuYW1lLCBvd25lcjogdW5kZWZpbmVkIH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHBhcnRzWzBdLFxuICAgIGV2ZW50OiBwYXJ0c1sxXSxcbiAgICBvd25lcjogcGFydHNbMl0sXG4gIH0gYXMge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gICAgb3duZXI/OiBzdHJpbmc7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgc29ydEtleXNPbmx5UmVjdXJzaXZlIH0gZnJvbSBcIi4vRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgdGFibGVOYW1lPzogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIC8vIGNvbnN0IGNsYXNzTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAvLyBpZiAoIWNsYXNzTmFtZSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuXG4gICAgLy8gLy8gdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWQgdmFsdWVzXG4gICAgLy8gY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gLy8gUG9wdWxhdGUgTW9kZWxcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREZXNlYWxpemF0aW9uID0gT2JqZWN0LmtleXMobW9kZWwpLnJlZHVjZShcbiAgICAvLyAgIChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgLy8gICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAvLyAgICAgICBkZXNlcmlhbGl6YXRpb25bUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgIC8vICAgICByZXR1cm4gYWNjdW07XG4gICAgLy8gICB9LFxuICAgIC8vICAgbW9kZWxcbiAgICAvLyApO1xuXG4gICAgLy8gY29uc3QgcmVzdWx0ID0gTW9kZWwuYnVpbGQoXG4gICAgLy8gICBwcm9jZXNzZWREZXNlYWxpemF0aW9uLFxuICAgIC8vICAgY2xhc3NOYW1lXG4gICAgLy8gKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZXNlcmlhbGl6YXRpb247XG4gIH1cblxuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvciA9IHRydWUpOiBzdHJpbmcge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgY29uc3QgcHJlU2VyaWFsaXphdGlvbiA9IHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBwdXRBbmNob3IpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHByZVNlcmlhbGl6YXRpb24pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwdXRBbmNob3IpXG4gICAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChwcmVTZXJpYWxpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUuY2FsbCh0aGlzLCB0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENsaWVudEJhc2VkU2VydmljZSxcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IEZhYnJpY0NBU2VydmljZXMsIHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJQXR0cmlidXRlUmVxdWVzdCxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElJZGVudGl0eVJlcXVlc3QsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElSZXZva2VSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMsIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcIi4vRmFicmljRW5yb2xsbWVudFNlcnZpY2VcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNJZGVudGl0eVNlcnZpY2UgZXh0ZW5kcyBDbGllbnRCYXNlZFNlcnZpY2U8XG4gIEZhYnJpY0NBU2VydmljZXMsXG4gIENBQ29uZmlnXG4+IHtcbiAgcHJvdGVjdGVkIF91c2VyITogVXNlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByb290Q2xpZW50KCk6IHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfSB7XG4gICAgcmV0dXJuICh0aGlzLmNsaWVudCBhcyBhbnkpW1wiX0ZhYnJpY0NhU2VydmljZXNcIl0gYXMgYW55O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1c2VyKCk6IFVzZXIge1xuICAgIGlmICghdGhpcy5fdXNlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIkZhYnJpYyBpZGVudGl0eSBzZXJ2aWNlIG5vdCBwcm9wZXJseSBzZXR1cDogbWlzc2luZyB1c2VyXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNlcnRpZmljYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q2xpZW50Lm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhZmZpbGlhdGlvbnMoKTogQWZmaWxpYXRpb25TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlkZW50aXRpZXMoKTogSWRlbnRpdHlTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihjZmc6IENBQ29uZmlnLCBjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldFVzZXIpO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gY2ZnO1xuXG4gICAgbG9nLmluZm8oYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogQ0FDb25maWc7IGNsaWVudDogRmFicmljQ0FTZXJ2aWNlcyB9PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLklOSVRJQUxJWkFUSU9OLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgW2NvbmZpZ10gPSBhcmdzO1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgRmFicmljIENBIGNvbmZpZ3VyYXRpb25cIik7XG5cbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IGNvbmZpZztcbiAgICBsb2cuaW5mbyhgSW5pdGlhbGl6aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjb25maWcuY2FOYW1lfSBhdCAke2NvbmZpZy51cmx9YCk7XG4gICAgY29uc3QgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG5cbiAgICBsb2cuZGVidWcoYENBIENlcnRpZmljYXRlOiAke2NlcnRpZmljYXRlLnRvU3RyaW5nKCl9YCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKGNvbmZpZywgY3R4KTtcbiAgICBsb2cuZGVidWcoYENBIHVzZXIgbG9hZGVkOiAke3VzZXIuZ2V0TmFtZSgpfWApO1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBjbGllbnQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55Pik6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCB8IE1BUCxcbiAgICBkb01hcDogTUFQID0gdHJ1ZSBhcyBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT4ge1xuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYXJncyA9IFtyZXF1ZXN0XTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBkb01hcCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvTWFwICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgYXJncyA9IFtkb01hcCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiwgLi4uYXJnc107XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5nZXRDZXJ0aWZpY2F0ZXNcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgdGhpcy5jZXJ0aWZpY2F0ZXMuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHRoaXMudXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5jZXJ0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZVxuICAgICkgYXMgTUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW107XG4gIH1cblxuICBhc3luYyBnZXRJZGVudGl0aWVzKGN0eDogQ29udGV4dCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0QWxsKHRoaXMudXNlcikpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmlkZW50aXRpZXMpO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmFmZmlsaWF0aW9ucy5nZXRBbGwodGhpcy51c2VyKSkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnNgKTtcbiAgICBsb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8RmFicmljSWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVhZFxuICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRPbmUoZW5yb2xsbWVudElkLCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3RlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlclxuICAgICk7XG5cbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZ2lzdGVyKHByb3BzLCB0aGlzLnVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjdHg6IENvbnRleHRcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudCk7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZWdpc3RyYXRpb246IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmVucm9sbFxuICAgICk7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3Rlci1lbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJBbmRFbnJvbGxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbiwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmUtZW5yb2xsIGFuIGV4aXN0aW5nIGlkZW50aXR5IHVzaW5nIGl0cyBjdXJyZW50IGVucm9sbG1lbnQuXG4gICAqIEBzdW1tYXJ5IFJlbmV3cyB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSBieSBjYWxsaW5nIHRoZSBDQSByZWVucm9sbC5cbiAgICogQHBhcmFtIHtVc2VyfSBjdXJyZW50VXNlciAtIEFscmVhZHkgZW5yb2xsZWQgdXNlciwgbXVzdCBoYXZlIGEgc2lnbmluZyBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSByZW5ld2VkIGlkZW50aXR5IG9iamVjdCB3aXRoIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUlkZW50aXR5KFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIGlkZW50aXR5OiB7IGNlcnRpZmljYXRlOiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9LFxuICAgIGlkZW50aXR5UmVxdWVzdDogSUlkZW50aXR5UmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudXBkYXRlSWRlbnRpdHlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBSZW5ld2luZyBpZGVudGl0eSBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGluIHRoZSBDQSByZWdpc3RyeSAoYWRtaW4gb3BlcmF0aW9uKS4gVGhpcyBjaGFuZ2VzIHRoZSBcInNvdXJjZSBvZiB0cnV0aFwiLlxuICAgICAgY29uc3QgaWRlbnRpdHlTZXJ2aWNlID0gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG5cbiAgICAgIGNvbnN0IGNhVXNlcklkZW50aXR5ID0gKGF3YWl0IGlkZW50aXR5U2VydmljZS5nZXRPbmUoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgdGhpcy51c2VyXG4gICAgICApKSBhcyB7IHJlc3VsdDogeyBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdIH0gfTtcblxuICAgICAgYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLnVwZGF0ZShlbnJvbGxtZW50SWQsIGlkZW50aXR5UmVxdWVzdCwgdGhpcy51c2VyKTsgLy8gYXMgSVNlcnZpY2VSZXNwb25zZSAmIHsgcmVzdWx0OiBJSWRlbnRpdHlSZXF1ZXN0IH07XG5cbiAgICAgIC8vIFJlZW5yb2xsIGFzIHRoZSB1c2VyLiBSZXF1ZXN0IG11c3QgYmUgc2lnbmVkIHVzaW5nIHRoZSBleGlzdGluZyBjZXJ0aWZpY2F0ZS5cbiAgICAgIGNvbnN0IHJlZW5yb2xsVXNlciA9IFVzZXIuY3JlYXRlVXNlcihcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICBcIlwiLCAvLyBlbnJvbGxtZW50U2VjcmV0IG5vdCByZXF1aXJlZCBmb3IgcmVlbnJvbGxcbiAgICAgICAgdGhpcy51c2VyLmdldE1zcGlkKCksXG4gICAgICAgIGlkZW50aXR5LmNlcnRpZmljYXRlLFxuICAgICAgICBpZGVudGl0eS5wcml2YXRlS2V5XG4gICAgICApO1xuICAgICAgcmVlbnJvbGxVc2VyLnNldENyeXB0b1N1aXRlKHRoaXMudXNlci5nZXRDcnlwdG9TdWl0ZSgpKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudEF0dHJzOiBJQXR0cmlidXRlUmVxdWVzdFtdID0gKFxuICAgICAgICBjYVVzZXJJZGVudGl0eS5yZXN1bHQuYXR0cnMgfHwgW11cbiAgICAgICkubWFwKCh7IG5hbWUgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50ID0gYXdhaXQgdGhpcy5jbGllbnQucmVlbnJvbGwoXG4gICAgICAgIHJlZW5yb2xsVXNlcixcbiAgICAgICAgZW5yb2xsbWVudEF0dHJzXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZW5ld2VkSWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldm9rZSB0aGUgcHJldmlvdXMgY2VydGlmaWNhdGUgb25seSwgc28gdGhlIG9sZCBjZXJ0IGJlY29tZXMgaW52YWxpZC5cbiAgICAgIGxvZy5kZWJ1ZyhgUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGVzIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IHsgYWtpLCBzZXJpYWwgfSA9IGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGlkZW50aXR5LmNlcnRpZmljYXRlKTtcbiAgICAgIGF3YWl0IHRoaXMucmV2b2tlKGVucm9sbG1lbnRJZCwgeyBha2ksIHNlcmlhbCB9LCBhcmdzKTtcblxuICAgICAgbG9nLmRlYnVnKGBSZW5ldyBpZGVudGl0eSBzdWNjZXNzZnVsIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIHJldHVybiByZW5ld2VkSWRlbnRpdHk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmV2b2tlT3B0aW9uczogT21pdDxJUmV2b2tlUmVxdWVzdCwgXCJlbnJvbGxtZW50SURcIj4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJU2VydmljZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJldm9rZVwiLCB0cnVlKSkuZm9yKHRoaXMucmV2b2tlKTtcbiAgICBsb2cudmVyYm9zZShgUmV2b2tpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgQm9vbGVhbihyZXZva2VPcHRpb25zLnNlcmlhbCkgfHwgQm9vbGVhbihyZXZva2VPcHRpb25zLmFraSlcbiAgICAgICAgICA/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuY29uc3QgbG9nID0gbmV3IE1pbmlMb2dnZXIoXCJmYWJyaWMtZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvYWRzIGNvbnRlbnQgZnJvbSBhIGZpbGUgb3IgcmV0dXJucyB0aGUgY29udGVudCBpZiBhbHJlYWR5IGxvYWRlZFxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBjb250ZW50IG9yIGEgcGF0aCB0byBhIGZpbGUsIGFuZCBsb2FkcyB0aGUgZmlsZSBpZiBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsZVJlYWRlciAtIEZ1bmN0aW9uIHRvIHJlYWQgdGhlIGZpbGUgaWYgY29udGVudE9yUGF0aCBpcyBhIHBhdGhcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj59IFRoZSBjb250ZW50XG4gKiBAZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlKFxuICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4pIHtcbiAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgaWYgKFxuICAgIGNvbnRlbnRPclBhdGgubWF0Y2goXG4gICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgIClcbiAgKVxuICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gKiBAc3VtbWFyeSBMb2FkcyBhIGZpbGUgdXNpbmcgdGhlIE5vZGUuanMgZmlsZSBzeXN0ZW0gbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHJldHVybiB7UHJvbWlzZTxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyXG4gKiBAZnVuY3Rpb24gcmVhZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlKGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IEJ1ZmZlcikge1xuICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdXNlclxuICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSB1c2VyIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlck5hbWUgLSBUaGUgdXNlciBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJpdmF0ZUtleSAtIFRoZSBwcml2YXRlIGtleSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gVGhlIGNlcnRpZmljYXRlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCB1c2VyXG4gKiBAZnVuY3Rpb24gZ2V0Q0FVc2VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDQVVzZXIoXG4gIHVzZXJOYW1lOiBzdHJpbmcsXG4gIHByaXZhdGVLZXk6IHN0cmluZyxcbiAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgbXNwSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyPiB7XG4gIGxvZy5kZWJ1ZyhcbiAgICBgQ3JlYXRpbmcgYSBDQSAke21zcElkfSB1c2VyICR7dXNlck5hbWV9IHdpdGggY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX1gXG4gICk7XG4gIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gIGNvbnN0IGNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgY29uc3QgaW1wb3J0ZWRLZXkgPSBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoaW1wb3J0ZWRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gIHJldHVybiB1c2VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGlkZW50aXR5IGZyb20gYSBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhbiBJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpZGVudGl0eVxuICogQGZ1bmN0aW9uIGdldElkZW50aXR5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJZGVudGl0eShcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBjZXJ0UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICApKSBhcyBVaW50OEFycmF5O1xuXG4gIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBmaWxlIGZvdW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5LCBmaW5kcyB0aGUgZmlyc3QgZmlsZSwgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoam9pbihkaXJQYXRoLCBmaWxlc1swXSkpKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc2lnbmVyIGZyb20gYSBrZXkgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIHByaXZhdGUga2V5IGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYSBTaWduZXIgZm9yIEZhYnJpYyB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlEaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzaWduZXJcbiAqIEBmdW5jdGlvbiBnZXRTaWduZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGtleVBhdGgpO1xuICB9O1xuXG4gIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICBzaWduZXJGaWxlUmVhZGVyXG4gICkpIGFzIEJ1ZmZlcjtcbiAgLy8gTm9kZSBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICAvLyBwcml2YXRlS2V5ID0gY3JlYXRlUHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgLy8gLS1cblxuICAvLyB3ZWIgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcml2YXRlS2V5KTtcbiAgY29uc3QgayA9IChwcml2YXRlS2V5IGFzIGFueSlba2V5c1swXV07XG4gIC8vIC0tXG5cbiAgcmV0dXJuIHNpZ25lcnMubmV3UHJpdmF0ZUtleVNpZ25lcihrIGFzIGFueSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIFBFTSBidWZmZXJcbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgdG8gYSBDcnlwdG9LZXkgb2JqZWN0XG4gKiBAcGFyYW0ge0J1ZmZlcn0gcGVtIC0gVGhlIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPENyeXB0b0tleT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDcnlwdG9LZXlcbiAqIEBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRXh0cmFjdFByaXZhdGVLZXlcbiAqICAgcGFydGljaXBhbnQgU3VidGxlQ3J5cHRvXG4gKlxuICogICBDYWxsZXItPj5FeHRyYWN0UHJpdmF0ZUtleTogZXh0cmFjdFByaXZhdGVLZXkocGVtKVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBHZXQgU3VidGxlQ3J5cHRvIGltcGxlbWVudGF0aW9uXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IFBhcnNlIFBFTSBmb3JtYXRcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogQ29udmVydCB0byBiaW5hcnkgREVSXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+U3VidGxlQ3J5cHRvOiBpbXBvcnRLZXkocGtjczgsIGJpbmFyeURlciwgb3B0aW9ucylcbiAqICAgU3VidGxlQ3J5cHRvLS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDcnlwdG9LZXlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktLT4+Q2FsbGVyOiBDcnlwdG9LZXlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gIGNvbnN0IGxpYk5hbWUgPSBcImNyeXB0b1wiO1xuICBsZXQgc3VidGxlO1xuICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICBzdWJ0bGUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNyeXB0by5zdWJ0bGU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgc3VidGxlID0gbGliLnN1YnRsZSB8fCBsaWIud2ViY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gIGZ1bmN0aW9uIHN0cjJhYihzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RyTGVuID0gc3RyLmxlbmd0aDsgaSA8IHN0ckxlbjsgaSsrKSB7XG4gICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBjb25zdCBzdHIgPSBwZW1cbiAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIilcbiAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKTtcbiAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyRmxhZ3MsXG4gIENvbmRpdGlvbixcbiAgQ29udGV4dCxcbiAgR3JvdXBPcGVyYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBPcGVyYXRvcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgUXVlcnlDbGF1c2UsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFNlbGVjdFNlbGVjdG9yLFxuICBTZXF1ZW5jZSxcbiAgU3RhdGVtZW50LFxuICBTdGF0ZW1lbnRFeGVjdXRvcixcbiAgVmlld0tpbmQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIENvdWNoREJPcGVyYXRvcixcbiAgQ291Y2hEQkdyb3VwT3BlcmF0b3IsXG4gIENvdWNoREJRdWVyeUxpbWl0LFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb09wZXJhdG9yLFxuICBNYW5nb1NlbGVjdG9yLFxuICB0cmFuc2xhdGVPcGVyYXRvcnMsXG4gIGdlbmVyYXRlRGVzaWduRG9jTmFtZSxcbiAgZ2VuZXJhdGVWaWV3TmFtZSxcbiAgZmluZFZpZXdNZXRhZGF0YSxcbiAgQ291Y2hEQlZpZXdNZXRhZGF0YSxcbiAgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0NhbWVsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG50eXBlIEZhYnJpY1ZpZXdEZXNjcmlwdG9yID0ge1xuICBkZG9jOiBzdHJpbmc7XG4gIHZpZXc6IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pjtcbn07XG5cbnR5cGUgRmFicmljQWdncmVnYXRlSW5mbyA9XG4gIHwge1xuICAgICAga2luZDogVmlld0tpbmQ7XG4gICAgICBtZXRhOiBDb3VjaERCVmlld01ldGFkYXRhO1xuICAgICAgZGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERpc3RpbmN0PzogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAga2luZDogXCJhdmdcIjtcbiAgICAgIGF0dHJpYnV0ZTogc3RyaW5nO1xuICAgICAgc3VtRGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgIH07XG5cbmNvbnN0IGVzY2FwZVJlZ0V4cCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcblxuZnVuY3Rpb24gbmV4dExleGljb2dyYXBoaWNTdHJpbmcodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlxcdTAwMDBcIjtcbiAgY29uc3QgY2hhcnMgPSBBcnJheS5mcm9tKHZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IGNoYXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXJzW2ldLmNvZGVQb2ludEF0KDApO1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChjb2RlIDwgMHgxMGZmZmYpIHtcbiAgICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSArIDEpO1xuICAgICAgcmV0dXJuIGNoYXJzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7dmFsdWV9XFx1MDAwMGA7XG59XG5cbmZ1bmN0aW9uIHByZWZpeFJhbmdlKHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHByZWZpeCxcbiAgICBlbmQ6IG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHByZWZpeCksXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFN0YXRlbWVudDxcbiAgTSxcbiAgRmFicmljQ2xpZW50QWRhcHRlcixcbiAgUixcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPikge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3F1YXNoKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3F1YXNoZWQ6IFByZXBhcmVkU3RhdGVtZW50PE0+IHwgdW5kZWZpbmVkID0gc3VwZXIuc3F1YXNoKFxuICAgICAgY3R4IGFzIG5ldmVyXG4gICAgKTtcbiAgICBpZiAoIXNxdWFzaGVkKSByZXR1cm4gc3F1YXNoZWQ7XG5cbiAgICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zLCBhcmdzIH0gPSBzcXVhc2hlZDtcbiAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQgfSA9IHBhcmFtcztcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG1ldGhvZCAke21ldGhvZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3F1YXNoZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZVByZXBhcmVkKFxuICAgIC4uLmFyZ3o6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5mcm9tU2VsZWN0b3IsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgY29uc3QgeyBtZXRob2QsIGFyZ3MgfSA9IHRoaXMucHJlcGFyZWQgYXMgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PjtcbiAgICByZXR1cm4gcmVwby5zdGF0ZW1lbnQobWV0aG9kLCAuLi5hcmdzLCAuLi5hcmd6KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHByZXBhcmUoXG4gICAgY3R4PzogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxTdGF0ZW1lbnRFeGVjdXRvcjxNLCBSPj4ge1xuICAgIGN0eCA9XG4gICAgICBjdHggfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlFVRVJZLFxuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fCB7fSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICkpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1NpbXBsZVF1ZXJ5KCkgJiZcbiAgICAgIChjdHggYXMgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pLmdldChcImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXNcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHNxdWFzaGVkID0gdGhpcy5zcXVhc2goY3R4IGFzIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTtcbiAgICAgIGlmIChzcXVhc2hlZCkge1xuICAgICAgICB0aGlzLnByZXBhcmVkID0gc3F1YXNoZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7fSBhcyBhbnk7XG5cbiAgICBjb25zdCBwcmVwYXJlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiA9IHtcbiAgICAgIGNsYXNzOiB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGFyZ3MsXG4gICAgICBwYXJhbXMsXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBtZXRob2Q6IHN0cmluZ1tdID0gW1F1ZXJ5Q2xhdXNlLkZJTkRfQlldO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucHJlcGFyZUNvbmRpdGlvbih0aGlzLndoZXJlQ29uZGl0aW9uLCBjdHggYXMgbmV2ZXIpO1xuICAgICAgbWV0aG9kLnB1c2gocGFyc2VkLm1ldGhvZCk7XG4gICAgICBpZiAocGFyc2VkLmFyZ3MgJiYgcGFyc2VkLmFyZ3MubGVuZ3RoKVxuICAgICAgICBhcmdzLnB1c2goLi4uKHBhcnNlZC5hcmdzIGFzIChzdHJpbmcgfCBudW1iZXIpW10pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpXG4gICAgICBtZXRob2QucHVzaChcbiAgICAgICAgUXVlcnlDbGF1c2UuU0VMRUNULFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLmpvaW4oYCAke1F1ZXJ5Q2xhdXNlLkFORC50b0xvd2VyQ2FzZSgpfSBgKVxuICAgICAgKTtcbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIG1ldGhvZC5wdXNoKFF1ZXJ5Q2xhdXNlLk9SREVSX0JZLCB0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMF0gYXMgc3RyaW5nKTtcbiAgICAgIGFyZ3MucHVzaCh0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMV0gYXMgYW55KTtcbiAgICB9XG4gICAgcHJlcGFyZWQubWV0aG9kID0gdG9DYW1lbENhc2UobWV0aG9kLmpvaW4oXCIgXCIpKTtcbiAgICBwcmVwYXJlZC5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5wcmVwYXJlZCA9IHByZXBhcmVkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSByZWNvcmQgZnJvbSBDb3VjaERCL0ZhYnJpY1xuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyB0aGUgSUQgZnJvbSBhIENvdWNoREIgZG9jdW1lbnQgYW5kIHJldmVydHMgaXQgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByb2Nlc3NSZWNvcmQoXG4gICAgcmVjb3JkOiBhbnksXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBNIHtcbiAgICBjb25zdCBwa0F0dHIgPSBNb2RlbC5wayh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLmdldChcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5JRCwgcGtBdHRyIGFzIHN0cmluZylcbiAgICApPy50eXBlO1xuXG4gICAgaWYgKHJlY29yZFtDb3VjaERCS2V5cy5JRF0pIHtcbiAgICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcmVjb3JkW0NvdWNoREJLZXlzLklEXS5zcGxpdChDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgICAgcmVjb3JkW3BrQXR0cl0gPSBTZXF1ZW5jZS5wYXJzZVZhbHVlKHR5cGUgYXMgYW55LCBpZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NSZWNvcmQocmVjb3JkLCBjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeVxuICAgKiBAc3VtbWFyeSBTZW5kcyBhIHJhdyBNYW5nbyBxdWVyeSB0byBGYWJyaWMgYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0c1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgYWdncmVnYXRvciA9IChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGVJbmZvO1xuICAgIGlmICgocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlICYmIGFnZ3JlZ2F0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBZ2dyZWdhdGU8Uj4oYWdncmVnYXRvciwgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KFxuICAgICAgcmF3SW5wdXQsXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBjdHhcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIGN0eCkpO1xuICAgICAgaWYgKCFjdHguZ2V0T3JVbmRlZmluZWQoXCJhZnRlclF1ZXJ5SGFuZGxlcnNcIikpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZCBhcyB1bmtub3duIGFzIFI7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQocHJvY2Vzc2VkLCBjdHgpKSBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkKCk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCBhZ2dyZWdhdGVRdWVyeSA9IHRoaXMuYnVpbGRBZ2dyZWdhdGVRdWVyeSgpO1xuICAgIGlmIChhZ2dyZWdhdGVRdWVyeSkgcmV0dXJuIGFnZ3JlZ2F0ZVF1ZXJ5O1xuICAgIGNvbnN0IHNlbGVjdG9yczogTWFuZ29TZWxlY3RvciA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHNlbGVjdG9ycyB9O1xuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKSBxdWVyeS5maWVsZHMgPSB0aGlzLnNlbGVjdFNlbGVjdG9yIGFzIHN0cmluZ1tdO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbjogTWFuZ29TZWxlY3RvciA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIENvbmRpdGlvbi5hbmQoXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBDb25kaXRpb24uYXR0cmlidXRlPE0+KENvdWNoREJLZXlzLlRBQkxFIGFzIGtleW9mIE0pLmVxKFxuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgc2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKSBhcyBNYW5nb09wZXJhdG9yW107XG4gICAgICBpZiAoXG4gICAgICAgIHNlbGVjdG9yS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhDb3VjaERCR3JvdXBPcGVyYXRvcikuaW5kZXhPZihzZWxlY3RvcktleXNbMF0pICE9PSAtMVxuICAgICAgKVxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yS2V5c1swXSkge1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gYXMgTWFuZ29TZWxlY3RvclxuICAgICAgICAgICAgICApLnJlZHVjZSgoYWNjdW06IE1hbmdvU2VsZWN0b3JbXSwgdmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVG9vIG1hbnkga2V5cyBpbiBxdWVyeSBzZWxlY3Rvci4gc2hvdWxkIGJlIG9uZVwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQpXG4gICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLih2YWxba10gYXMgYW55W10pKTtcbiAgICAgICAgICAgICAgICBlbHNlIGFjY3VtLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICAgIH0sIFtdKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IGNvbmRpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuT1I6IHtcbiAgICAgICAgICAgIGNvbnN0IHM6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgIHNbQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhxdWVyeS5zZWxlY3RvcikubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXJ5LnNlbGVjdG9yW2tleV0pXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBmb3IgKGNvbnN0IFtzZWxlY3RvcktleSwgZGlyZWN0aW9uXSBvZiB0aGlzLm9yZGVyQnlTZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcktleSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+ID0ge307XG4gICAgICAgIHJlY1tzZWxlY3Rvcl0gPSBkaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb247XG4gICAgICAgIChxdWVyeS5zb3J0IGFzIFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPltdKS5wdXNoKHJlYyk7XG4gICAgICAgIGlmICghcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdKSB7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHRoaXMubGltaXRTZWxlY3RvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGNvdWNoZGIgbGltaXQgb2YgJHtDb3VjaERCUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcXVlcnkubGltaXQgPSBDb3VjaERCUXVlcnlMaW1pdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcikgcXVlcnkuc2tpcCA9IHRoaXMub2Zmc2V0U2VsZWN0b3I7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3Igc3RydWN0dXJlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBNYW5nb1F1ZXJ5IHtcbiAgICBmdW5jdGlvbiBtZXJnZShcbiAgICAgIG9wOiBNYW5nb09wZXJhdG9yLFxuICAgICAgb2JqMTogTWFuZ29TZWxlY3RvcixcbiAgICAgIG9iajI6IE1hbmdvU2VsZWN0b3JcbiAgICApOiBNYW5nb1F1ZXJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHt9IGFzIE1hbmdvU2VsZWN0b3IgfTtcbiAgICAgIHJlc3VsdC5zZWxlY3RvcltvcF0gPSBbb2JqMSwgb2JqMl07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5TVEFSVFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgcmFuZ2UgPSBwcmVmaXhSYW5nZShjb21wYXJpc29uKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJfRVFdID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5TTUFMTEVSXSA9IHJhbmdlLmVuZDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5FTkRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge1xuICAgICAgICBbQ291Y2hEQk9wZXJhdG9yLlJFR0VYUF06IGAke2VzY2FwZVJlZ0V4cChjb21wYXJpc29uKX0kYCxcbiAgICAgIH0gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5CRVRXRUVOKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cjEgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbXBhcmlzb24pIHx8IGNvbXBhcmlzb24ubGVuZ3RoICE9PSAyKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkJFVFdFRU4gb3BlcmF0b3IgcmVxdWlyZXMgW21pbiwgbWF4XSBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbXBhcmlzb247XG4gICAgICBjb25zdCBvcEJldHdlZW46IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BCZXR3ZWVuW2F0dHJdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5CSUdHRVJfRVEpXG4gICAgICBdID0gbWluO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLlNNQUxMRVJfRVEpXG4gICAgICBdID0gbWF4O1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wQmV0d2VlbiB9O1xuICAgIH1cblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhbiBhZ2dyZWdhdGUgcXVlcnkgaWYgYWdncmVnYXRpb24gaXMgcmVxdWVzdGVkXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBmb3IgYWdncmVnYXRlIG9wZXJhdGlvbnMgYW5kIHJldHVybnMgYSBzcGVjaWFsIE1hbmdvUXVlcnkgZm9yIHRoZW1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZ2dyZWdhdGVRdWVyeSgpOiBNYW5nb1F1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmF2Z1NlbGVjdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBTdHJpbmcodGhpcy5hdmdTZWxlY3Rvcik7XG4gICAgICBjb25zdCBzdW1JbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwic3VtXCIsIGF0dHJpYnV0ZSk7XG4gICAgICBjb25zdCBjb3VudEluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJjb3VudFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKCFzdW1JbmZvIHx8ICFjb3VudEluZm8pXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgIGBBdmcgb3BlcmF0aW9uIHJlcXVpcmVzIHN1bSBhbmQgY291bnQgdmlld3MgZm9yIGF0dHJpYnV0ZSAke2F0dHJpYnV0ZX1gXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeSh7XG4gICAgICAgIGtpbmQ6IFwiYXZnXCIsXG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgc3VtRGVzY3JpcHRvcjogc3VtSW5mby5kZXNjcmlwdG9yLFxuICAgICAgICBjb3VudERlc2NyaXB0b3I6IGNvdW50SW5mby5kZXNjcmlwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID1cbiAgICAgICAgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgPT0gbnVsbFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBTdHJpbmcodGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IpO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImRpc3RpbmN0XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbmZvLmNvdW50RGlzdGluY3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yVXNlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICEhdGhpcy5taW5TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLm1heFNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuc3VtU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5kaXN0aW5jdFNlbGVjdG9yO1xuXG4gICAgY29uc3QgYWdncmVnYXRvckNoZWNrczogQXJyYXk8W1ZpZXdLaW5kLCBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW1xuICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICh0aGlzLmNvdW50U2VsZWN0b3IgPz8gdW5kZWZpbmVkKSBhcyBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZCxcbiAgICAgIF0sXG4gICAgICBbXCJtYXhcIiwgdGhpcy5tYXhTZWxlY3Rvcl0sXG4gICAgICBbXCJtaW5cIiwgdGhpcy5taW5TZWxlY3Rvcl0sXG4gICAgICBbXCJzdW1cIiwgdGhpcy5zdW1TZWxlY3Rvcl0sXG4gICAgICBbXCJkaXN0aW5jdFwiLCB0aGlzLmRpc3RpbmN0U2VsZWN0b3JdLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IFtraW5kLCBzZWxlY3Rvcl0gb2YgYWdncmVnYXRvckNoZWNrcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gc2VsZWN0b3IgPyBTdHJpbmcoc2VsZWN0b3IpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihraW5kLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgIH1cblxuICAgIGlmIChhZ2dyZWdhdG9yVXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIGBObyBDb3VjaERCIHZpZXcgbWV0YWRhdGEgZm91bmQgZm9yIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICAgICl9IGFnZ3JlZ2F0b3JgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yIGZvciBhIHZpZXctYmFzZWQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcbiAgICBraW5kOiBWaWV3S2luZCxcbiAgICBhdHRyaWJ1dGU/OiBzdHJpbmdcbiAgKTogRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGFzID0gZmluZFZpZXdNZXRhZGF0YSh0aGlzLmZyb21TZWxlY3Rvciwga2luZCwgYXR0cmlidXRlKTtcbiAgICBpZiAoIW1ldGFzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhID0gbWV0YXNbMF07XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGdlbmVyYXRlVmlld05hbWUodGFibGVOYW1lLCBtZXRhLmF0dHJpYnV0ZSwga2luZCwgbWV0YSk7XG4gICAgY29uc3QgZGRvYyA9IG1ldGEuZGRvYyB8fCBnZW5lcmF0ZURlc2lnbkRvY05hbWUodGFibGVOYW1lLCB2aWV3TmFtZSk7XG4gICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIHJlZHVjZTogbWV0YS5yZWR1Y2UgIT09IHVuZGVmaW5lZCA/IHRydWUgOiAhbWV0YS5yZXR1cm5Eb2NzLFxuICAgIH07XG4gICAgaWYgKGtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCBraW5kID09PSBcImdyb3VwQnlcIikgb3B0aW9ucy5ncm91cCA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQsXG4gICAgICBtZXRhLFxuICAgICAgZGVzY3JpcHRvcjoge1xuICAgICAgICBkZG9jLFxuICAgICAgICB2aWV3OiB2aWV3TmFtZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgc3BlY2lhbCBhZ2dyZWdhdGUgTWFuZ29RdWVyeSBtYXJrZXJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlUXVlcnkoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9yOiB7fSxcbiAgICAgIGFnZ3JlZ2F0ZTogdHJ1ZSxcbiAgICAgIGFnZ3JlZ2F0ZUluZm86IGluZm8sXG4gICAgfSBhcyBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBjYXN0IHRvIEZhYnJpY0NsaWVudEFkYXB0ZXIgZm9yIHZpZXcgYWNjZXNzXG4gICAqL1xuICBwcml2YXRlIGdldEZhYnJpY0FkYXB0ZXIoKTogRmFicmljQ2xpZW50QWRhcHRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhbiBhZ2dyZWdhdGUgcXVlcnkgdmlhIGFkYXB0ZXIncyB2aWV3IG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWdncmVnYXRlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoIXRoaXMuaXNWaWV3QWdncmVnYXRlKGluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVBdmVyYWdlPFI+KGluZm8sIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLmRkb2MsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLnZpZXcsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLm9wdGlvbnMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oaW5mbywgcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGF2ZXJhZ2UgY2FsY3VsYXRpb24gZnJvbSBzdW0gYW5kIGNvdW50IHZpZXdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUF2ZXJhZ2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmIChpbmZvLmtpbmQgIT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkF2ZXJhZ2UgZGVzY3JpcHRvciBpcyBub3QgdmFsaWRcIik7XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IFtzdW1EZXNjLCBjb3VudERlc2NdID0gW2luZm8uc3VtRGVzY3JpcHRvciwgaW5mby5jb3VudERlc2NyaXB0b3JdO1xuICAgIGNvbnN0IFtzdW1SZXNwb25zZSwgY291bnRSZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgc3VtRGVzYy5kZG9jLFxuICAgICAgICBzdW1EZXNjLnZpZXcsXG4gICAgICAgIHN1bURlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIGNvdW50RGVzYy5kZG9jLFxuICAgICAgICBjb3VudERlc2MudmlldyxcbiAgICAgICAgY291bnREZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICBdKTtcbiAgICBjb25zdCBzdW0gPSBzdW1SZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgY29uc3QgY291bnQgPSBjb3VudFJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBpZiAoIWNvdW50KSByZXR1cm4gMCBhcyB1bmtub3duIGFzIFI7XG4gICAgcmV0dXJuIChzdW0gLyBjb3VudCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgdGhlIHZpZXcgcmVzcG9uc2UgYmFzZWQgb24gYWdncmVnYXRlIGtpbmRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIHJlc3BvbnNlOiBWaWV3UmVzcG9uc2VcbiAgKTogUiB7XG4gICAgaWYgKGluZm8ua2luZCA9PT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBcIkF2ZXJhZ2UgcmVzdWx0cyBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgcHJvY2Vzc2luZyByb3dzXCJcbiAgICAgICk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3BvbnNlLnJvd3MgfHwgW107XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCBtZXRhID0gdmlld0luZm8ubWV0YTtcbiAgICBpZiAodmlld0luZm8uY291bnREaXN0aW5jdCkge1xuICAgICAgcmV0dXJuIChyb3dzLmxlbmd0aCB8fCAwKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICh2aWV3SW5mby5raW5kID09PSBcImRpc3RpbmN0XCIgfHwgdmlld0luZm8ua2luZCA9PT0gXCJncm91cEJ5XCIpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cua2V5ID8/IHJvdy52YWx1ZSkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAobWV0YS5yZXR1cm5Eb2NzKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LnZhbHVlID8/IHJvdy5kb2MgPz8gcm93KSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAodmlld0luZm8ua2luZCA9PT0gXCJjb3VudFwiID8gMCA6IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIChyb3dzWzBdLnZhbHVlID8/IHJvd3NbMF0ua2V5ID8/IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbmZvIGlzIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGVcbiAgICovXG4gIHByaXZhdGUgaXNWaWV3QWdncmVnYXRlKFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogaW5mbyBpcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4ge1xuICAgIHJldHVybiBpbmZvLmtpbmQgIT09IFwiYXZnXCI7XG4gIH1cbn1cbiIsImltcG9ydCBcIi4uL3NoYXJlZC9vdmVycmlkZXNcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICB0eXBlIE1hbmdvUXVlcnksXG4gIHR5cGUgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0ICogYXMgZ3JwYyBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIHR5cGUgTW9kZWxDb25zdHJ1Y3RvcixcbiAgdHlwZSBTZXJpYWxpemVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBkZWJ1ZywgZmluYWwsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIHR5cGUgUGVlckNvbmZpZyxcbiAgdHlwZSBTZWdyZWdhdGVkTW9kZWwsXG4gIHR5cGUgTXNwRGV0YWlscyxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgY29ubmVjdCxcbiAgdHlwZSBDb25uZWN0T3B0aW9ucyxcbiAgR2F0ZXdheSxcbiAgTmV0d29yayxcbiAgUHJvcG9zYWxPcHRpb25zLFxuICBDb250cmFjdCBhcyBDb250cmFrdCxcbiAgdHlwZSBTaWduZXIsXG4gIEdhdGV3YXlFcnJvcixcbiAgRW5kb3JzZUVycm9yLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBHYXRld2F5IGFzIExlZ2FjeUdhdGV3YXksIFdhbGxldHMgfSBmcm9tIFwiZmFicmljLW5ldHdvcmtcIjtcbmltcG9ydCB0eXBlIHsgRW5kb3JzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgZ2V0SWRlbnRpdHksXG4gIGdldFNpZ25lcixcbiAgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQsXG4gIHJlYWRGaWxlIGFzIHJlYWRGc0ZpbGUsXG59IGZyb20gXCIuL2ZhYnJpYy1mc1wiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQmFkUmVxdWVzdEVycm9yLFxuICB0eXBlIFByaW1hcnlLZXlUeXBlLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRmxhZ3MsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFN0YXRlbWVudCxcbiAgdHlwZSBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUGFnaW5hdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIENvbnRleHR1YWxBcmdzLFxuICB0eXBlIFByZXBhcmVkTW9kZWwsXG4gIEFsbE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDbGllbnRTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnREaXNwYXRjaCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudERpc3BhdGNoXCI7XG4vLyBpbXBvcnQgeyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tIH0gZnJvbSBcIi4vZmFicmljLWhzbVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50U3RhdGVtZW50IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBFbmRvcnNlbWVudEVycm9yLFxuICBFbmRvcnNlbWVudFBvbGljeUVycm9yLFxuICBNdmNjUmVhZENvbmZsaWN0RXJyb3IsXG4gIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcixcbiAgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IsXG59IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4vY3J5cHRvXCI7XG5pbXBvcnQgeyBleHRyYWN0SWRzIH0gZnJvbSBcIi4vaWRzL2lkLWV4dHJhY3Rpb25cIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uL3NoYXJlZC9pbmRleFwiO1xuXG50eXBlIExlZ2FjeVBlZXJUYXJnZXQgPSB7XG4gIG1zcElkOiBzdHJpbmc7XG4gIHBlZXJFbmRwb2ludDogc3RyaW5nO1xuICBwZWVySG9zdEFsaWFzPzogc3RyaW5nO1xuICB0bHNDZXJ0Pzogc3RyaW5nIHwgQnVmZmVyO1xufTtcblxudHlwZSBMZWdhY3lQZWVyV2l0aE5hbWUgPSBMZWdhY3lQZWVyVGFyZ2V0ICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3NcbiAqIEBzdW1tYXJ5IFRoZSBGYWJyaWNBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXIgdG8gcHJvdmlkZSBhIHNlYW1sZXNzIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3MuXG4gKiBJdCBoYW5kbGVzIGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgdHJhbnNhY3Rpb24gc3VibWlzc2lvbiwgYW5kIENSVUQgb3BlcmF0aW9ucyBhZ2FpbnN0IEZhYnJpYyBjaGFpbmNvZGUuXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAdGVtcGxhdGUgRmFicmljRmxhZ3MgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8RmFicmljRmxhZ3M+IC0gQ29udGV4dCB0eXBlIGNvbnRhaW5pbmcgRmFicmljLXNwZWNpZmljIGZsYWdzXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gYWxpYXMgLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAqIGNvbnN0IGNvbmZpZzogUGVlckNvbmZpZyA9IHtcbiAqICAgbXNwSWQ6ICdPcmcxTVNQJyxcbiAqICAgcGVlckVuZHBvaW50OiAnbG9jYWxob3N0OjcwNTEnLFxuICogICBjaGFubmVsTmFtZTogJ215Y2hhbm5lbCcsXG4gKiAgIGNoYWluY29kZU5hbWU6ICdteWNjJyxcbiAqICAgY29udHJhY3ROYW1lOiAnbXljb250cmFjdCcsXG4gKiAgIHRsc0NlcnRQYXRoOiAnL3BhdGgvdG8vdGxzL2NlcnQnLFxuICogICBjZXJ0RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2NlcnQvZGlyJyxcbiAqICAga2V5RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2tleS9kaXInXG4gKiB9O1xuICpcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgRmFicmljQWRhcHRlcihjb25maWcsICdvcmcxLWFkYXB0ZXInKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlcjEnLCBteVNlcmlhbGl6ZXIpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCwgdHJhbnNpZW50LCBzZXJpYWxpemVyKVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc3VibWl0VHJhbnNhY3Rpb24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFtzZXJpYWxpemVkTW9kZWxdLCB0cmFuc2llbnQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbE5hbWUpXG4gKiAgIE5ldHdvcmstPj5Db250cmFjdDogZ2V0Q29udHJhY3QoY2hhaW5jb2RlTmFtZSwgY29udHJhY3ROYW1lKVxuICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZGVjb2RlKHJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVjb2RlZFJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IGRlc2VyaWFsaXplZFJlc3VsdFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIFBlZXJDb25maWcsXG4gIENsaWVudCxcbiAgTWFuZ29RdWVyeSxcbiAgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyB0ZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgVWludDhBcnJheSB0byBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljQ2xpZW50QWRhcHRlcik7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PiA9XG4gICAgRmFicmljQ2xpZW50QWRhcHRlci5zZXJpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQZWVyQ29uZmlnLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzLCBjb25maWcpLFxuICAgICAgRmFicmljRmxhdm91cixcbiAgICAgIGFsaWFzXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPlxuICApOiBTdGF0ZW1lbnQ8TSwgRmFicmljQ2xpZW50QWRhcHRlciwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQodGhpcywgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHF1ZXJ5OiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgTWFuZ29RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICk6IFBhZ2luYXRvcjxNLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFBhZ2luYXRvcih0aGlzLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10gfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgICBjb25zdCBtZXJnZWRGbGFncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCBmbGFncyk7XG4gICAgY29uc3QgZiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBtZXJnZWRGbGFncywgLi4uYXJncylcbiAgICApO1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IEFsbE9wZXJhdGlvbktleXMsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PGFueT4+XG4gICk6IFByb21pc2U8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuc2lsbHkoXG4gICAgICBgY3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbCA/IChBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsLm1hcCgobSkgPT4gTW9kZWwudGFibGVOYW1lKG0pKSA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCkpIDogXCJub1wifSB0YWJsZSAke292ZXJyaWRlcyAmJiBPYmplY3Qua2V5cyhvdmVycmlkZXMpID8gT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGggOiBcIm5vXCJ9IHdpdGggZmxhZyBvdmVycmlkZXNgXG4gICAgKTtcbiAgICBsZXQgY3R4ID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIGN0eCAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICBhcmdzLnB1c2goY3R4KTtcbiAgICAgIGN0eCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZXMgPSBjdHhcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY3R4LnRvT3ZlcnJpZGVzKCksIG92ZXJyaWRlcylcbiAgICAgIDogb3ZlcnJpZGVzO1xuICAgIGNvbnN0IGZsYWdzID0gYXdhaXQgdGhpcy5mbGFncyhcbiAgICAgIHR5cGVvZiBvcGVyYXRpb24gPT09IFwic3RyaW5nXCIgPyBvcGVyYXRpb24gOiBvcGVyYXRpb24ubmFtZSxcbiAgICAgIG1vZGVsLFxuICAgICAgb3ZlcnJpZGVzIGFzIFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgICAgLi4uWy4uLmFyZ3MsIGN0eF0uZmlsdGVyKEJvb2xlYW4pXG4gICAgKTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE9wID0gY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpO1xuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZmZWN0ZWRUYWJsZXNcIik7XG4gICAgICBpZiAoXG4gICAgICAgICFjdXJyZW50T3AgfHxcbiAgICAgICAgY3VycmVudE9wICE9PSBvcGVyYXRpb24gfHxcbiAgICAgICAgKG1vZGVsICYmIG1vZGVsICE9PSBjdXJyZW50TW9kZWwpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuXG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3R4LmFjY3VtdWxhdGUoZmxhZ3MpIGFzIGFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgLi4uZmxhZ3MsXG4gICAgfSkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNvZGVzIGEgVWludDhBcnJheSB0byBhIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBiaW5hcnkgZGF0YSByZWNlaXZlZCBmcm9tIEZhYnJpYyB0byBhIHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGEgLSBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nXG4gICAqL1xuICBkZWNvZGUoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvc2l0b3J5PFxuICAgIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICAgICAgYW55LFxuICAgICAgQWRhcHRlcjxQZWVyQ29uZmlnLCBDbGllbnQsIE1hbmdvUXVlcnksIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICAgID4sXG4gID4oKTogQ29uc3RydWN0b3I8Uj4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFtDb25zdHJ1Y3RvcjxNPiwgUHJpbWFyeUtleVR5cGUsIFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmFueVtdLCBDb250ZXh0XSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIHJlY29yZHMgZm9yIGNyZWF0aW9uXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmVjZXNzYXJ5IENvdWNoREIgZmllbGRzIHRvIG11bHRpcGxlIHJlY29yZHMgYmVmb3JlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIElEcyBvZiB0aGUgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSB0YWJsZU5hbWUsIGlkcywgYW5kIHByZXBhcmVkIHJlY29yZHNcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgaWRzIGFuZCBtb2RlbHMgYXJyYXlzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgLy9IRVJFIVxuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy5pbmZvKGBhZGRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgIFtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKSlcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgICAgY2xhenosXG4gICAgICAgIGN0eCxcbiAgICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgICAgcmVzWzBdW01vZGVsLnBrKGNsYXp6KSBhcyBzdHJpbmddIHx8IGlkc1swXVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnRbaV0gfHwge30pLCByZXNbaV0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byByZWFkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgcmVhZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMudXBkYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgW1xuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtb2RlbHMubWFwKChtKSA9PiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpKVxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcblxuICAgIGxldCByZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZHNbMF0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudFtpXSB8fCB7fSksIHJlc1tpXSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+fSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7U2VyaWFsaXplcjxhbnk+fSBzZXJpYWxpemVyIC0gU2VyaWFsaXplciBmb3IgdGhlIG1vZGVsIGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkc1swXVxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZEFsbChjbGF6eiwgaWRzLCAuLi5jdHhBcmdzKTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXMpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBTZWdyZWdhdGVkTW9kZWw8TT4gJiBQcmVwYXJlZE1vZGVsIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHsobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BsaXQubW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQobW9kZWwpO1xuICAgIGlmIChtaXJyb3JNZXRhKSB7XG4gICAgICBjb25zdCBtaXJyb3JNc3AgPSBtaXJyb3JNZXRhLm1zcElkO1xuICAgICAgaWYgKCFtaXJyb3JNc3ApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBtaXJyb3IgTVNQIGNvdWxkIGJlIGZvdW5kYCk7XG4gICAgICBsZXQgbXNwcyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgICAgbXNwcyA9IEFycmF5LmlzQXJyYXkobXNwcykgPyBtc3BzIDogW21zcHNdO1xuICAgICAgY29uc3QgbWVyZ2VkID0gWy4uLm5ldyBTZXQoWy4uLm1zcHMsIG1pcnJvck1zcF0pXTtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgZW5kb3JzaW5nT3JnczogbWVyZ2VkLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBtZXJnZWQsXG4gICAgICAgIGxlZ2FjeTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHNwbGl0Lm1vZGVsLFxuICAgICAgbW9kZWw6IHNwbGl0Lm1vZGVsLFxuICAgICAgaWQ6IG1vZGVsW01vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KV0gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OiBzcGxpdC50cmFuc2llbnQsXG4gICAgICBwcml2YXRlczogc3BsaXQucHJpdmF0ZXMsXG4gICAgICBzaGFyZWQ6IHNwbGl0LnNoYXJlZCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogTSB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZXZlcnQpO1xuICAgIGlmIChcbiAgICAgIHRyYW5zaWVudCAmJlxuICAgICAgdGhpcy5zaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICAgICAgY3R4LFxuICAgICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiB0eXBlb2YgdiAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIG9iaiAmJiAob2JqIGFzIGFueSlba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBvdmVyd3JpdGluZyBleGlzdGluZyAke2tleX0uIGlmIHRoaXMgaXMgbm90IGEgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtYXkgcG9zZSBhIHByb2JsZW1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjdHgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNoaWxkUmVidWlsZCA9XG4gICAgICB0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjaGlsZFJlYnVpbGQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlc29sdmVkT3AgPSB0aGlzLnJlc29sdmVPcGVyYXRpb24oY3R4LCBvcGVyYXRpb24pO1xuICAgIGlmICghcmVzb2x2ZWRPcCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG9wID0gcmVzb2x2ZWRPcC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIG9wLmluY2x1ZGVzKFwicmVhZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJmaW5kXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInF1ZXJ5XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInN0YXRlbWVudFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJwYWdlXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZU9wZXJhdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChvcGVyYXRpb24pIHJldHVybiBvcGVyYXRpb247XG4gICAgaWYgKHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwib3BlcmF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGhhc1RyYW5zaWVudDogYm9vbGVhbixcbiAgICBpZD86IFByaW1hcnlLZXlUeXBlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghaGFzVHJhbnNpZW50KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWQgPSBNb2RlbC5jb21wb3NlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGdlbmVyYXRlZCA9IE1vZGVsLmdlbmVyYXRlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGhhc0lkID0gaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbDtcbiAgICBpZiAoIWhhc0lkICYmIGNvbXBvc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWhhc0lkICYmIGdlbmVyYXRlZCkge1xuICAgICAgY3R4LmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2Fubm90IHJlZnJlc2ggcmVjb3JkIHdpdGggcHJpdmF0ZSBnZW5lcmF0ZWQgcHJpbWFyeSBrZXlgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGlyZWN0ID1cbiAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgfHxcbiAgICAgIChjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZGlyZWN0ICYmIGRpcmVjdC5sZW5ndGgpIHJldHVybiBkaXJlY3Q7XG4gICAgcmV0dXJuIChcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgfHxcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZVxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgYWRkaW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lKV0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyBoZWFsdGhjaGVjazxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5oZWFsdGhjaGVjayk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJoZWFsdGhjaGVja1wiLFxuICAgICAgW10sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyByZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICB1cGRhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIC8vIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyB1cGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy51cGRhdGVcbiAgICApO1xuICAgIGxvZy5pbmZvKGBDTElFTlQgVVBEQVRFIGNsYXNzIDogJHt0eXBlb2YgY2xhenp9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgdXBkYXRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUgfHwgY2xhenopXSwgLy8gVE9ETyBzaG91bGQgYmUgcmVjZXZpbmcgY2xhc3MgYnV0IGlzIHJlY2VpdmluZyBzdHJpbmdcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXIgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZFxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZChjbGF6eiwgaWQsIGN0eCk7XG4gICAgfVxuXG4gICAgbG9nLnZlcmJvc2UoYGRlbGV0aW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICA/IHJlc3VsdFxuICAgICAgOiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcGVyZm9ybSBhIHF1ZXJ5IHVzaW5nIE1hbmdvIFF1ZXJ5IHN5bnRheFxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcm9jZXNzIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXN1bHRcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiByYXcocmF3SW5wdXQsIHByb2Nlc3MpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBldmFsdWF0ZVRyYW5zYWN0aW9uKFwicXVlcnlcIiwgW2lucHV0XSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKFwicXVlcnlcIiwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04ucGFyc2UoZGVjb2RlKHJlc3VsdCkpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0IGJhc2VkIG9uIHR5cGVcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogcHJvY2Vzc2VkIHJlc3VsdFxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgcmF3PFYsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICBkb2NzT25seTogRCA9IHRydWUgYXMgRCxcbiAgICBjbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gY2xhenoubmFtZTtcbiAgICBsb2cuaW5mbyhgUGVyZm9ybWluZyByYXcgc3RhdGVtZW50IG9uIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKGNsYXp6KX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJyYXdcIixcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHJhd0lucHV0KSwgZG9jc09ubHldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVJlY29yZCA9IChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pID0+IHtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKHJlY29yZCkpIHJldHVybiBNb2RlbC5idWlsZChyZWNvcmQpO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgICBjb25zdCBlbCA9IHJlc3VsdFswXTtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKGVsKSlcbiAgICAgICAgLy8gaWYgdGhlIGZpcnN0IG9uZSBpcyBhIG1vZGVsLCBhbGwgYXJlIG1vZGVsc1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCgoZWwpID0+IE1vZGVsLmJ1aWxkKGVsKSkgYXMgVjtcbiAgICAgIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VSZWNvcmQocmVzdWx0IGFzIGFueSkgYXMgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBDb3VjaERCIHZpZXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBxdWVyeSBhIGRlc2lnbiBkb2N1bWVudCB2aWV3XG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHZpZXcgcmVzcG9uc2UgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGRvYyAtIERlc2lnbiBkb2N1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TmFtZSAtIFZpZXcgbmFtZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBWaWV3IHF1ZXJ5IG9wdGlvbnNcbiAgICogQHBhcmFtIHsuLi5Db250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj59IGFyZ3MgLSBPcHRpb25hbCBjb250ZXh0dWFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFZpZXdSZXNwb25zZTxSPj59IFRoZSB2aWV3IHJlc3BvbnNlXG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyB2aWV3PFI+KFxuICAgIGRkb2M6IHN0cmluZyxcbiAgICB2aWV3TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8Vmlld1Jlc3BvbnNlPFI+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy52aWV3KTtcbiAgICBsb2cuaW5mbyhgUXVlcnlpbmcgdmlldyAke2Rkb2N9LyR7dmlld05hbWV9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwidmlld1wiLFxuICAgICAgICBbZGRvYywgdmlld05hbWUsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpXSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFZpZXdSZXNwb25zZTxSPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgdmlldyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBjcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIHRoZSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY2FjaGVkIGNsaWVudCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBub25lIGV4aXN0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENsaWVudD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IENsaWVudCB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpXG4gICAgICB0aGlzLl9jbGllbnQgPSBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENsaWVudCh0aGlzLmNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IEdhdGV3YXkgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgY2xpZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgR2F0ZXdheShjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTogUHJvbWlzZTxHYXRld2F5PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShjdHgsIHRoaXMuY29uZmlnLCB0aGlzLmNsaWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRyYWN0TmFtZShjbGFzc05hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWNsYXNzTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYCR7Y2xhc3NOYW1lfUNvbnRyYWN0YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IENvbnRyYWN0IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IEdhdGV3YXlcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb250cmFrdD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIENvbnRyYWN0KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8Q29udHJha3Q+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDb250cmFjdChcbiAgICAgIGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBjb250cmFjdE5hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBTdWJtaXRzIG9yIGV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWJtaXQgLSBXaGV0aGVyIHRvIHN1Ym1pdCAodHJ1ZSkgb3IgZXZhbHVhdGUgKGZhbHNlKSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBnZXRDb250cmFjdCgpXG4gICAqICAgYWx0IHN1Ym1pdCB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZWxzZSBldmFsdWF0ZSB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbmRcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjbG9zZSgpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBzdWJtaXQgPSB0cnVlLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IHN0cmluZ1tdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50cmFuc2FjdGlvbik7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IGF3YWl0IHRoaXMuQ29udHJhY3QoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKVxuICAgICAgKTtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgJHtzdWJtaXQgPyBcIlN1Ym1pdFwiIDogXCJFdmFsdWF0ZVwifXRpbmcgdHJhbnNhY3Rpb24gJHt0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpIHx8IHRoaXMuY29uZmlnLmNvbnRyYWN0TmFtZX0uJHthcGl9YFxuICAgICAgKTtcbiAgICAgIGxvZy5kZWJ1ZyhgYXJnczogJHthcmdzPy5tYXAoKGEpID0+IGEudG9TdHJpbmcoKSkuam9pbihcIlxcblwiKSB8fCBcIm5vbmVcIn1gKTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHN1Ym1pdCA/IGNvbnRyYWN0LnN1Ym1pdCA6IGNvbnRyYWN0LmV2YWx1YXRlO1xuXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zID0gZW5kb3JzaW5nT3JnYW5pemF0aW9ucz8ubGVuZ3RoXG4gICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3Bvc2FsT3B0aW9uczogUHJvcG9zYWxPcHRpb25zID0ge1xuICAgICAgICBhcmd1bWVudHM6IGFyZ3MgfHwgW10sXG4gICAgICAgIHRyYW5zaWVudERhdGE6IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEpLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgdHlwZW9mIHRyYW5zaWVudERhdGFcbiAgICAgICAgKSxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogY3R4LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzXCIpXG4gICAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zIHx8IHVuZGVmaW5lZFxuICAgICAgICAgIDogdW5kZWZpbmVkLCAvLyBtc3BJZCBsaXN0XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgbWV0aG9kLmNhbGwoY29udHJhY3QsIGFwaSwgcHJvcG9zYWxPcHRpb25zKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjb25uZWN0aW9uYCk7XG4gICAgICBnYXRld2F5LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFjdHguZ2V0T3JVbmRlZmluZWQoXCJsZWdhY3lcIikgJiYgISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUxlZ2FjeUFyZ3MoYXJncz86IGFueVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAoYXJncyB8fCBbXSkubWFwKChhcmcpID0+XG4gICAgICB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiID8gYXJnIDogSlNPTi5zdHJpbmdpZnkoYXJnKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5VHJhbnNpZW50KFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICk6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNpZW50RGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSk7XG4gICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICBtYXBba2V5XSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVMZWdhY3lNc3BDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSB0aGlzLmNvbmZpZy5sZWdhY3lNc3BDb3VudCA/PyAxO1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihjb25maWd1cmVkKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpIHx8IHBhcnNlZCA8IDEpIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLmZsb29yKHBhcnNlZCk7XG4gIH1cblxuICBwcml2YXRlIHBpY2tMZWdhY3lDYW5kaWRhdGVzKFxuICAgIGNhbmRpZGF0ZXM6IE1zcERldGFpbHNbXSxcbiAgICBsaW1pdDogbnVtYmVyXG4gICk6IE1zcERldGFpbHNbXSB7XG4gICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYXZhaWxhYmxlID0gWy4uLmNhbmRpZGF0ZXNdO1xuICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWluKGxpbWl0LCBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICBjb25zdCBwaWNrZWQ6IE1zcERldGFpbHNbXSA9IFtdO1xuICAgIHdoaWxlIChwaWNrZWQubGVuZ3RoIDwgdGFyZ2V0ICYmIGF2YWlsYWJsZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgICAgY29uc3QgW3NlbGVjdGlvbl0gPSBhdmFpbGFibGUuc3BsaWNlKGlkeCwgMSk7XG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHBpY2tlZC5wdXNoKHNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBMZWdhY3lQZWVyVGFyZ2V0W10ge1xuICAgIGNvbnN0IHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W10gPSBbXG4gICAgICB7XG4gICAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgICAgIHRsc0NlcnQ6IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBsZXQgZW5kb3JzaW5nT3JncyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgIGVuZG9yc2luZ09yZ3MgPSBBcnJheS5pc0FycmF5KGVuZG9yc2luZ09yZ3MpXG4gICAgICA/IGVuZG9yc2luZ09yZ3NcbiAgICAgIDogW2VuZG9yc2luZ09yZ3NdO1xuICAgIGNvbnN0IGVuZG9yc2VycyA9XG4gICAgICBlbmRvcnNpbmdPcmdzLmZpbHRlcigob3JnKTogb3JnIGlzIHN0cmluZyA9PiBCb29sZWFuKG9yZykpIHx8IFtdO1xuICAgIGNvbnN0IGV4dHJhcyA9IGVuZG9yc2Vycy5maWx0ZXIoKG9yZykgPT4gb3JnICE9PSB0aGlzLmNvbmZpZy5tc3BJZCk7XG4gICAgaWYgKCFleHRyYXMubGVuZ3RoKSByZXR1cm4gcGVlcnM7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLmNvbmZpZy5tc3BNYXA7XG4gICAgY29uc3QgbGVnYWN5Q291bnQgPSB0aGlzLnJlc29sdmVMZWdhY3lNc3BDb3VudCgpO1xuICAgIGZvciAoY29uc3QgbXNwIG9mIGV4dHJhcykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG1hcD8uW21zcF07XG4gICAgICBpZiAoIWNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnBpY2tMZWdhY3lDYW5kaWRhdGVzKGNhbmRpZGF0ZXMsIGxlZ2FjeUNvdW50KTtcbiAgICAgIGlmICghc2VsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHZhbGlkIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNob2ljZSBvZiBzZWxlY3Rpb25zKSB7XG4gICAgICAgIGlmICghY2hvaWNlLmVuZHBvaW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBwZWVyIG1hcHBpbmcgZm9yIE1TUCAke21zcH06IG1pc3NpbmcgZW5kcG9pbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwZWVycy5wdXNoKHtcbiAgICAgICAgICBtc3BJZDogbXNwLFxuICAgICAgICAgIHBlZXJFbmRwb2ludDogY2hvaWNlLmVuZHBvaW50LFxuICAgICAgICAgIHBlZXJIb3N0QWxpYXM6IGNob2ljZS5hbGlhcyxcbiAgICAgICAgICB0bHNDZXJ0OiBjaG9pY2UudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGVlcnM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGZjbjogc3RyaW5nLFxuICAgIGFyZ3M6IHN0cmluZ1tdLFxuICAgIHRyYW5zaWVudE1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCxcbiAgICBwZWVyQ29uZmlnczogTGVnYWN5UGVlclRhcmdldFtdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMpO1xuICAgIGNvbnN0IHBlZXJzID0gdGhpcy5ub3JtYWxpemVMZWdhY3lQZWVycyhwZWVyQ29uZmlncyk7XG4gICAgY29uc3QgaWRlbnRpdHlNYXRlcmlhbCA9IGF3YWl0IHRoaXMucmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBXYWxsZXRzLm5ld0luTWVtb3J5V2FsbGV0KCk7XG4gICAgY29uc3QgaWRlbnRpdHlMYWJlbCA9IGAke3RoaXMuY29uZmlnLm1zcElkfS1sZWdhY3lgO1xuICAgIGF3YWl0IHdhbGxldC5wdXQoaWRlbnRpdHlMYWJlbCwge1xuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB0eXBlOiBcIlguNTA5XCIsXG4gICAgfSBhcyBJZGVudGl0eSk7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uUHJvZmlsZSA9IGF3YWl0IHRoaXMuYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVycyk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IG5ldyBMZWdhY3lHYXRld2F5KCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ2F0ZXdheS5jb25uZWN0KGNvbm5lY3Rpb25Qcm9maWxlLCB7XG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eUxhYmVsLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXNMb2NhbGhvc3Q6IHRoaXMuc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGxzSW5mbzoge1xuICAgICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICAgIGtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBhd2FpdCBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5jb25maWcuY2hhbm5lbCk7XG4gICAgICBjb25zdCBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoXG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIHRoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSlcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGNvbnRyYWN0LmNyZWF0ZVRyYW5zYWN0aW9uKGZjbik7XG5cbiAgICAgIGlmICh0cmFuc2llbnRNYXApIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpZW50KHRyYW5zaWVudE1hcCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZG9yc2VycyA9IHBlZXJzXG4gICAgICAgIC5tYXAoKHBlZXIpID0+IG5ldHdvcmsuZ2V0Q2hhbm5lbCgpLmdldEVuZG9yc2VyKHBlZXIubmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGVuZG9yc2VyKTogZW5kb3JzZXIgaXMgRW5kb3JzZXIgPT4gQm9vbGVhbihlbmRvcnNlcikpO1xuICAgICAgaWYgKGVuZG9yc2Vycy5sZW5ndGgpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0RW5kb3JzaW5nUGVlcnMoZW5kb3JzZXJzKTtcbiAgICAgIH1cblxuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBMZWdhY3kgc3VibWl0dGluZyAke3RoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSkgfHwgdGhpcy5jb25maWcuY29udHJhY3ROYW1lfS4ke2Zjbn0gdmlhIHBlZXJzICR7cGVlcnMubWFwKChwKSA9PiBwLnBlZXJFbmRwb2ludCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uLnN1Ym1pdCguLi5hcmdzKTtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20ocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ2F0ZXdheS5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMZWdhY3lQZWVycyhcbiAgICBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdXG4gICk6IExlZ2FjeVBlZXJXaXRoTmFtZVtdIHtcbiAgICBjb25zdCBkZWR1cGVkID0gbmV3IE1hcDxzdHJpbmcsIExlZ2FjeVBlZXJXaXRoTmFtZT4oKTtcbiAgICBjb25zdCBhZGRQZWVyID0gKHBlZXI6IExlZ2FjeVBlZXJUYXJnZXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BlZXIucGVlckVuZHBvaW50fXwke3BlZXIucGVlckhvc3RBbGlhcyB8fCBcIlwifWA7XG4gICAgICBpZiAoZGVkdXBlZC5oYXMoa2V5KSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmFtZSA9IGBwZWVyLSR7cGVlci5tc3BJZH0tJHtkZWR1cGVkLnNpemV9YDtcbiAgICAgIGRlZHVwZWQuc2V0KGtleSwge1xuICAgICAgICAuLi5wZWVyLFxuICAgICAgICBuYW1lLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHBlZXJzLmZvckVhY2goYWRkUGVlcik7XG4gICAgYWRkUGVlcih7XG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShkZWR1cGVkLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTogUHJvbWlzZTx7XG4gICAgY2VydGlmaWNhdGU6IHN0cmluZztcbiAgICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIHJldHVybiB7IGNlcnRpZmljYXRlLCBwcml2YXRlS2V5IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKSB7XG4gICAgY29uc3QgcGVlckVudHJpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBjaGFubmVsUGVlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBvcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICBjb25zdCB0bHNQZW0gPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgICAgcGVlci50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnRcbiAgICAgICk7XG4gICAgICBjb25zdCBob3N0bmFtZSA9XG4gICAgICAgIHBlZXIucGVlckhvc3RBbGlhcyB8fCB0aGlzLmV4dHJhY3RIb3N0KHBlZXIucGVlckVuZHBvaW50KTtcbiAgICAgIHBlZXJFbnRyaWVzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIHVybDogdGhpcy5lbnN1cmVHcnBjVXJsKHBlZXIucGVlckVuZHBvaW50KSxcbiAgICAgICAgdGxzQ0FDZXJ0czogeyBwZW06IHRsc1BlbSB9LFxuICAgICAgICBncnBjT3B0aW9uczoge1xuICAgICAgICAgIFwic3NsLXRhcmdldC1uYW1lLW92ZXJyaWRlXCI6IGhvc3RuYW1lLFxuICAgICAgICAgIGhvc3RuYW1lT3ZlcnJpZGU6IGhvc3RuYW1lLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNoYW5uZWxQZWVyc1twZWVyLm5hbWVdID0ge1xuICAgICAgICBlbmRvcnNpbmdQZWVyOiB0cnVlLFxuICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZSxcbiAgICAgICAgbGVkZ2VyUXVlcnk6IHRydWUsXG4gICAgICAgIGV2ZW50U291cmNlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0gPSBvcmdzW3BlZXIubXNwSWRdIHx8IHtcbiAgICAgICAgbXNwaWQ6IHBlZXIubXNwSWQsXG4gICAgICAgIHBlZXJzOiBbXSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdLnBlZXJzLnB1c2gocGVlci5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogXCJsZWdhY3ktbWFudWFsXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICBjbGllbnQ6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIH0sXG4gICAgICBvcmdhbml6YXRpb25zOiBvcmdzLFxuICAgICAgcGVlcnM6IHBlZXJFbnRyaWVzLFxuICAgICAgb3JkZXJlcnM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmNoYW5uZWxdOiB7XG4gICAgICAgICAgcGVlcnM6IGNoYW5uZWxQZWVycyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwZWVycy5ldmVyeSgocGVlcikgPT4gdGhpcy5pc0xvY2FsRW5kcG9pbnQocGVlci5wZWVyRW5kcG9pbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMb2NhbEVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5leHRyYWN0SG9zdChlbmRwb2ludCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gaG9zdCA9PT0gXCJsb2NhbGhvc3RcIiB8fCBob3N0ID09PSBcIjEyNy4wLjAuMVwiO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG9zdChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBlbmRwb2ludC5yZXBsYWNlKC9eZ3JwY3M/OlxcL1xcLy8sIFwiXCIpO1xuICAgIHJldHVybiBzYW5pdGl6ZWQuc3BsaXQoXCI6XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVHcnBjVXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICgvXmdycGNzPzpcXC9cXC8vaS50ZXN0KGVuZHBvaW50KSkgcmV0dXJuIGVuZHBvaW50O1xuICAgIHJldHVybiBgZ3JwY3M6Ly8ke2VuZHBvaW50fWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRQZW1JbnB1dChzb3VyY2U/OiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgY2VydGlmaWNhdGUgb3Iga2V5IG1hdGVyaWFsXCIpO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc291cmNlKSkgcmV0dXJuIHNvdXJjZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgY29uc3QgdHJpbW1lZCA9IHNvdXJjZS50cmltKCk7XG4gICAgaWYgKC8tLS0tLUJFR0lOIFtBLVogXSstLS0tLS8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHNvdXJjZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBpZiAoc3RhdHM/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gKGF3YWl0IHJlYWRGc0ZpbGUoc291cmNlKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvciB8IHN0cmluZyk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLnBhcnNlRXJyb3I8RT4oZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGlmICh0aGlzLnNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4KSkge1xuICAgICAgY29uc3QgbGVnYWN5QXJncyA9IHRoaXMucHJlcGFyZUxlZ2FjeUFyZ3MoYXJncyk7XG4gICAgICBjb25zdCB0cmFuc2llbnRNYXAgPSB0aGlzLmJ1aWxkTGVnYWN5VHJhbnNpZW50KHRyYW5zaWVudERhdGEpO1xuICAgICAgY29uc3QgcGVlckNvbmZpZ3MgPSB0aGlzLmJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoY3R4KTtcbiAgICAgIHJldHVybiB0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICAgICAgY3R4LFxuICAgICAgICBhcGksXG4gICAgICAgIGxlZ2FjeUFyZ3MsXG4gICAgICAgIHRyYW5zaWVudE1hcCxcbiAgICAgICAgcGVlckNvbmZpZ3MsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICB0cnVlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENsb3NlcyB0aGUgYWN0aXZlIGRpc3BhdGNoICh3aGljaCBpbiB0dXJuIGNsb3NlcyBhbnkgZ2F0ZXdheVxuICAgKiBldmVudCBzdWJzY3JpcHRpb24pIHZpYSB0aGUgYmFzZSBjbGFzcywgdGhlbiBjbG9zZXMgdGhlIGdSUEMgY2xpZW50LlxuICAgKiBXb3JrcyBjb3JyZWN0bHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBzeW50aGV0aWNFdmVudHNgIGlzIGVuYWJsZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzaHV0ZG93biguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmFzZSBjbGFzcyBoYW5kbGVzIGRpc3BhdGNoLmNsb3NlKCkgaW50ZXJuYWxseS5cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93biguLi5hcmdzKTtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjbGllbnRgKTtcbiAgICAgIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgY2hhaW5jb2RlIGNvbnRyYWN0IGZyb20gdGhlIHNwZWNpZmllZCBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDb250cmFrdH0gVGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29udHJhY3QoXG4gICAgZ2F0ZXdheTogR2F0ZXdheSxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IENvbnRyYWt0IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDb250cmFjdCk7XG4gICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yayhnYXRld2F5LCBjb25maWcuY2hhbm5lbCk7XG4gICAgbGV0IGNvbnRyYWN0OiBDb250cmFrdDtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgUmV0cmlldmluZyBjaGFpbmNvZGUgJHtjb25maWcuY2hhaW5jb2RlTmFtZX0gY29udHJhY3QgJHtjb250cmFjdE5hbWUgfHwgY29uZmlnLmNvbnRyYWN0TmFtZX0gZnJvbSBuZXR3b3JrICR7Y29uZmlnLmNoYW5uZWx9YFxuICAgICAgKTtcbiAgICAgIGNvbnRyYWN0TmFtZSA9IGNvbnRyYWN0TmFtZSA/IGNvbnRyYWN0TmFtZSA6IGNvbmZpZy5jb250cmFjdE5hbWU7XG4gICAgICBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY29uZmlnLmNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIE5ldHdvcmsgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdG8gYSBzcGVjaWZpYyBjaGFubmVsIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEByZXR1cm4ge05ldHdvcmt9IFRoZSBOZXR3b3JrIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0TmV0d29yayhnYXRld2F5OiBHYXRld2F5LCBjaGFubmVsTmFtZTogc3RyaW5nKTogTmV0d29yayB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXROZXR3b3JrKTtcbiAgICBsZXQgbmV0d29yazogTmV0d29yaztcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNoYW5uZWwgJHtjaGFubmVsTmFtZX1gKTtcbiAgICAgIG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtDbGllbnR9IFtjbGllbnRdIC0gT3B0aW9uYWwgZ1JQQyBjbGllbnQsIHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRHYXRld2F5KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsaWVudD86IENsaWVudFxuICApIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNsaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRDbGllbnQoY29uZmlnKSksXG4gICAgICBjb25maWcsXG4gICAgICBjdHhcbiAgICApKSBhcyBHYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNsaWVudCB3aXRoIFRMUyBjcmVkZW50aWFscyBmb3Igc2VjdXJlIGNvbW11bmljYXRpb25cbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NsaWVudH0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBzdGF0aWMgZ2V0Q2xpZW50KGNvbmZpZzogUGVlckNvbmZpZyk6IENsaWVudCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2xpZW50KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgVExTIGNyZWRlbnRpYWxzIGZvciBtc3AgJHtjb25maWcubXNwSWR9YCk7XG4gICAgbGV0IHBhdGhPckNlcnQ6IHN0cmluZyB8IEJ1ZmZlciA9IGNvbmZpZy50bHNDZXJ0IGFzIHN0cmluZyB8IEJ1ZmZlcjtcblxuICAgIGlmICh0eXBlb2YgcGF0aE9yQ2VydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoT3JDZXJ0Lm1hdGNoKFxuICAgICAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20ocGF0aE9yQ2VydCwgXCJ1dGY4XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20oZnMucmVhZEZpbGVTeW5jKHBhdGhPckNlcnQsIFwidXRmOFwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCB0aGUgdGxzIGNlcnRpZmljYXRlIGZyb20gJHtwYXRoT3JDZXJ0fTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGxzQ3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbChwYXRoT3JDZXJ0KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgR2F0ZXdheSBDbGllbnQgZm9yIHVybCAke2NvbmZpZy5wZWVyRW5kcG9pbnR9YCk7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoY29uZmlnLnBlZXJFbmRwb2ludCwgdGxzQ3JlZGVudGlhbHMsIHtcbiAgICAgIFwiZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICAgIFwiZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSBjb25uZWN0aW9uIHdpdGggaWRlbnRpdHkgYW5kIHNpZ25lclxuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gVGhlIGdSUEMgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29ubmVjdGVkIEdhdGV3YXlcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IElkZW50aXR5XG4gICAqICAgcGFydGljaXBhbnQgU2lnbmVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0FkYXB0ZXI6IGdldENvbm5lY3Rpb24oY2xpZW50LCBjb25maWcpXG4gICAqICAgRmFicmljQWRhcHRlci0+PklkZW50aXR5OiBnZXRJZGVudGl0eShtc3BJZCwgY2VydERpcmVjdG9yeVBhdGgpXG4gICAqICAgSWRlbnRpdHktLT4+RmFicmljQWRhcHRlcjogaWRlbnRpdHlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+U2lnbmVyOiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aClcbiAgICogICBTaWduZXItLT4+RmFicmljQWRhcHRlcjogc2lnbmVyXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IENyZWF0ZSBDb25uZWN0T3B0aW9uc1xuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KG9wdGlvbnMpXG4gICAqICAgR2F0ZXdheS0tPj5GYWJyaWNBZGFwdGVyOiBnYXRld2F5XG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DYWxsZXI6IGdhdGV3YXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb25uZWN0aW9uKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0Q29ubmVjdGlvbik7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgUGVlciBJZGVudGl0eSBmb3IgJHtjb25maWcubXNwSWR9IHVuZGVyICR7Y29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRofWBcbiAgICApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgZ2V0SWRlbnRpdHkoXG4gICAgICBjb25maWcubXNwSWQsXG4gICAgICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgcHJlcGFyaW5nIHRyYW5zYWN0aW9uIHNpZ25lciBmb3IgJHtDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShpZGVudGl0eS5jcmVkZW50aWFscy50b1N0cmluZygpKX1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgRmFicmljIElEIGZyb20gY2VydGlmaWNhdGVgLCBlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmVyOiBTaWduZXI7XG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7fTtcbiAgICBpZiAoIWNvbmZpZy5oc20pIHtcbiAgICAgIHNpZ25lciA9IGF3YWl0IGdldFNpZ25lcihjb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zdCBoc20gPSBuZXcgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbShjb25maWcuaHNtLmxpYnJhcnkpO1xuICAgICAgLy8gY29uc3QgaWRlbnRpZmllciA9IGhzbS5nZXRTS0lGcm9tQ2VydGlmaWNhdGVQYXRoKFxuICAgICAgLy8gICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc3QgcGtjczExU2lnbmVyID0gaHNtLm5ld1NpZ25lcih7XG4gICAgICAvLyAgIGxhYmVsOiBjb25maWcuaHNtLnRva2VuTGFiZWwgYXMgc3RyaW5nLFxuICAgICAgLy8gICBwaW46IFN0cmluZyhjb25maWcuaHNtLnBpbikgYXMgc3RyaW5nLFxuICAgICAgLy8gICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgLy8gICAvLyB1c2VyVHlwZTogMSAvKkNLVV9VU0VSICovLFxuICAgICAgLy8gfSk7XG4gICAgICAvLyBzaWduZXIgPSBwa2NzMTFTaWduZXIuc2lnbmVyO1xuICAgICAgLy8gY2xvc2UgPSBwa2NzMTFTaWduZXIuY2xvc2U7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIkhTTSBOT1QgSU1QTEVNRU5URURcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNsaWVudCxcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICAgIHNpZ25lcjogc2lnbmVyLFxuICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0cyBmb3IgZGlmZmVyZW50IGdSUEMgY2FsbHNcbiAgICAgIGV2YWx1YXRlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZXZhbHVhdGVUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGVuZG9yc2VPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJlbmRvcnNlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgc3VibWl0T3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwic3VibWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBjb21taXRTdGF0dXNPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJjb21taXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDEgbWludXRlXG4gICAgICB9LFxuICAgIH0gYXMgQ29ubmVjdE9wdGlvbnM7XG5cbiAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjb25maWcubXNwSWR9YCk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGNvbm5lY3Qob3B0aW9ucyk7XG5cbiAgICAvLyBUT0RPOiByZXBsYWNlP1xuICAgIGlmIChjb25maWcuaHNtKSB7XG4gICAgICBnYXRld2F5LmNsb3NlID0gbmV3IFByb3h5KGdhdGV3YXkuY2xvc2UsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0OiAoKSA9PiB2b2lkLCB0aGlzQXJnOiBhbnksIGFyZ0FycmF5OiBhbnlbXSk6IGFueSB7XG4gICAgICAgICAgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KTtcbiAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBGYWJyaWNDbGllbnREaXNwYXRjaCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLlxuICAgKiBAcmV0dXJucyB7RGlzcGF0Y2h9IEEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAcmVtYXJrcyBUaGUgRGlzcGF0Y2ggaW5zdGFuY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgbG9naWMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLCBzdWNoIGFzIHN1Ym1pdHRpbmcgdHJhbnNhY3Rpb25zIG9yIHF1ZXJ5aW5nIGRhdGEuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGZhYnJpY0Rpc3BhdGNoID0gZmFicmljQ2xpZW50QWRhcHRlci5EaXNwYXRjaCgpO1xuICAgKiBmYWJyaWNEaXNwYXRjaC5zdWJtaXRUcmFuc2FjdGlvbignY3JlYXRlUHJvZHVjdCcsIHsgbmFtZTogJ1Byb2R1Y3QgQScsIHByaWNlOiAxMDAgfSk7XG4gICAqL1xuICBvdmVycmlkZSBEaXNwYXRjaCgpOiBGYWJyaWNDbGllbnREaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvciB1c2luZyB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihcbiAgICBlcnI6IEVycm9yIHwgc3RyaW5nIHwgR2F0ZXdheUVycm9yXG4gICk6IEUge1xuICAgIC8vIGlmIChcbiAgICAvLyAgIE1JU1NJTkdfUFJJVkFURV9EQVRBX1JFR0VYLnRlc3QoXG4gICAgLy8gICAgIHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZVxuICAgIC8vICAgKVxuICAgIC8vIClcbiAgICAvLyAgIHJldHVybiBuZXcgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MoZXJyKSBhcyBFO1xuXG4gICAgbGV0IG1zZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgR2F0ZXdheUVycm9yICYmIGVyci5kZXRhaWxzLmxlbmd0aCAmJiBlcnIuY29kZSA9PT0gMTApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlcnIgaW5zdGFuY2VvZiBFbmRvcnNlRXJyb3IgJiZcbiAgICAgIGVyci5kZXRhaWxzLmxlbmd0aCAmJlxuICAgICAgZXJyLmNvZGUgPT09IDEwICYmXG4gICAgICBlcnIuZGV0YWlsc1swXS5tZXNzYWdlPy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpXG4gICAgKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIk1WQ0NfUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgTXZjY1JlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJERUFETElORV9FWENFRURFRFwiKSlcbiAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkVORE9SU0VNRU5UX1BPTElDWV9GQUlMVVJFXCIpKVxuICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudFBvbGljeUVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJQSEFOVE9NX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgIHN3aXRjaCAoKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRFcnJvcihlcnIpIGFzIEU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhWYWxpZGF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxufVxuXG5GYWJyaWNDbGllbnRBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIENvbnRleHR1YWxBcmdzLFxuICBEaXNwYXRjaCxcbiAgRXZlbnRJZHMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIENvbnRleHQsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFBlZXJDb25maWcgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVFdmVudCxcbiAgQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZSxcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgcGFyc2VFdmVudE5hbWUgfSBmcm9tIFwiLi4vc2hhcmVkL2V2ZW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBkaXNwYXRjaGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICogQHN1bW1hcnkgTGlzdGVucyBmb3IgYW5kIHByb2Nlc3NlcyBldmVudHMgZW1pdHRlZCBieSBGYWJyaWMgY2hhaW5jb2RlLCBkaXNwYXRjaGluZyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IEZhYnJpY0FkYXB0ZXIuZ2V0Q2xpZW50KHBlZXJDb25maWcpO1xuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KTtcbiAqXG4gKiAvLyBDb25maWd1cmUgdGhlIGRpc3BhdGNoIHdpdGggcGVlciBjb25maWd1cmF0aW9uXG4gKiBkaXNwYXRjaC5jb25maWd1cmUocGVlckNvbmZpZyk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgc3BlY2lmaWMgdGFibGUgYW5kIGV2ZW50XG4gKiBkaXNwYXRjaC5vYnNlcnZlKCd1c2VycycsICdjcmVhdGUnLCAoaWQpID0+IHtcbiAqICAgY29uc29sZS5sb2coYFVzZXIgY3JlYXRlZDogJHtpZH1gKTtcbiAqIH0pO1xuICpcbiAqIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgZXZlbnRzXG4gKiBhd2FpdCBkaXNwYXRjaC5zdGFydCgpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudClcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IGNvbmZpZ3VyZShwZWVyQ29uZmlnKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogb2JzZXJ2ZSh0YWJsZSwgZXZlbnQsIGNhbGxiYWNrKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogc3RhcnQoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBpbml0aWFsaXplKClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5HYXRld2F5OiBnZXRHYXRld2F5KGNvbmZpZywgY2xpZW50KVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsKVxuICogICBOZXR3b3JrLT4+TmV0d29yazogZ2V0Q2hhaW5jb2RlRXZlbnRzKGNoYWluY29kZU5hbWUpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gKiAgIGxvb3AgRm9yIGVhY2ggZXZlbnRcbiAqICAgICBDaGFpbmNvZGUtLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChwYXlsb2FkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLS0+PkNsaWVudDogY2FsbGJhY2soaWQpXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxGYWJyaWNDbGllbnRBZGFwdGVyPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgbGlzdGVuaW5nIHN0YWNrIGZvciBjaGFpbmNvZGUgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbmluZ1N0YWNrPzogQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZTxDaGFpbmNvZGVFdmVudD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgZXZlbnQgcGF5bG9hZHMgZnJvbSBieXRlcyB0byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGRpc3BhdGNoZXIgZm9yIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjbGllbnQ6IENsaWVudCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZXZlbnQgbGlzdGVuaW5nIGNvbm5lY3Rpb25cbiAgICogQHN1bW1hcnkgU3RvcHMgbGlzdGVuaW5nIGZvciBjaGFpbmNvZGUgZXZlbnRzIGFuZCByZWxlYXNlcyByZXNvdXJjZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjbG9zZShcbiAgICAuLi5jdHhBcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3M6IGxvZ2dlZEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGN0eEFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TSFVURE9XTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNsb3NlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuY2xvc2UoLi4ubG9nZ2VkQXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIHByb3hpZXMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlzdGVuaW5nU3RhY2suY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGV2ZW50IHBheWxvYWQgZnJvbSBiaW5hcnkgZm9ybWF0XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgVWludDhBcnJheSBjb250YWluaW5nIEpTT04gdG8gYW4gb2JqZWN0IHdpdGggYW4gaWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBqc29uQnl0ZXMgLSBUaGUgYmluYXJ5IHBheWxvYWQgZnJvbSB0aGUgY2hhaW5jb2RlIGV2ZW50XG4gICAqIEByZXR1cm4ge3sgaWQ6IHN0cmluZyB9fSBUaGUgcGFyc2VkIHBheWxvYWQgY29udGFpbmluZyB0aGUgcmVjb3JkIElEXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUGF5bG9hZChqc29uQnl0ZXM6IFVpbnQ4QXJyYXkpOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9IHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5kZWNvZGVyLmRlY29kZShqc29uQnl0ZXMpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb3ZlcnJpZGUgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogKCkgPT4gdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBGYWJyaWNDbGllbnRBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgRmFicmljQ2xpZW50QWRhcHRlciBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIlxuICAgICAgKTtcbiAgICBzdXBlci5vYnNlcnZlKG9ic2VydmVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge2FueX0gcGF5bG9hZCAtIFRoZSBldmVudCBwYXlsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8YW55PiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBBZGFwdGVyLmxvZ0N0eDxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4oXG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyxcbiAgICAgIGV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3R5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKX06JHtldmVudH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2gobW9kZWwsIGV2ZW50LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSB0aGUgY2hhaW5jb2RlIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlbnQgaGFuZGxpbmcgc3RvcHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFN0YWNrXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRQYXJzZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAgICpcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRTdGFjazogZm9yIGF3YWl0IChjb25zdCBldnQgb2YgbGlzdGVuaW5nU3RhY2spXG4gICAqICAgRXZlbnRTdGFjay0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50UGFyc2VyOiBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKVxuICAgKiAgIEV2ZW50UGFyc2VyLS0+PkZhYnJpY0Rpc3BhdGNoOiB7IHRhYmxlLCBldmVudCwgb3duZXIgfVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IENoZWNrIGlmIGV2ZW50IGlzIGZvciB0aGlzIE1TUFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChldnQucGF5bG9hZClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+Pk9ic2VydmVyczogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgcGF5bG9hZC5pZClcbiAgICogICBPYnNlcnZlcnMtLT4+RmFicmljRGlzcGF0Y2g6IENhbGxiYWNrcyBleGVjdXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUV2ZW50cyhcbiAgICBjdHhBcmc/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubGlzdGVuaW5nU3RhY2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEV2ZW50IHN0YWNrIG5vdCBpbml0aWFsaXplZC4gRW5zdXJlIHRoYXQgXCJzdGFydExpc3RlbmluZ1wiIGlzIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGlzIG9wZXJhdGlvbi5gXG4gICAgICApO1xuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIgfHwgIXRoaXMuYWRhcHRlci5jb25maWcpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBmb3VuZC4gc2hvdWxkIGJlIGltcG9zc2libGVgKTtcblxuICAgIGNvbnN0IGN0eCA9XG4gICAgICBjdHhBcmcgfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICAodGhpcy5tb2RlbHMgJiYgdGhpcy5tb2RlbHNbMF0pIHx8IChNb2RlbCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yKVxuICAgICAgKSk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaGFuZGxlRXZlbnRzKTtcblxuICAgIGxvZy5pbmZvKFxuICAgICAgYExpc3RlbmluZyBmb3IgaW5jb21pbmcgZXZlbnRzIG9uIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIi4uLmBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZSwgZXZlbnQsIG93bmVyIH0gPSBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcEV2ZW50T25seSAmJlxuICAgICAgICAgIG93bmVyICYmXG4gICAgICAgICAgb3duZXIgIT09IHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcElkXG4gICAgICAgIClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSA9IHRoaXMucGFyc2VQYXlsb2FkKFxuICAgICAgICAgIGV2dC5wYXlsb2FkXG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSB0YWJsZVxuICAgICAgICAgICAgPyBNb2RlbC5nZXQodGFibGUpXG4gICAgICAgICAgICA6IE1vZGVsLmdldCh0aGlzLm1vZGVsc1swXS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBtb2RlbFJlZiA9IHRhcmdldE1vZGVsID8/ICh0YWJsZSB8fCB0aGlzLm1vZGVsc1swXT8ubmFtZSk7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBcmdzID0gcGF5bG9hZC5yZXN1bHQgPyBbcGF5bG9hZC5yZXN1bHQsIGN0eF0gOiBbY3R4XTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIG1vZGVsUmVmIGFzIENvbnN0cnVjdG9yIHwgc3RyaW5nLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkLmlkIGFzIHN0cmluZyxcbiAgICAgICAgICAgIC4uLihvYnNlcnZlckFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8YW55PilcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB1cGRhdGUgb2JzZXJ2YWJsZXMgZm9yIHRhYmxlICR7dGFibGV9IGV2ZW50ICR7ZXZlbnR9IGlkOiAke3BheWxvYWQuaWR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGV2ZW50IGZvciBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCI6ICR7ZX1gXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgZXZlbnQgZGlzcGF0Y2hpbmcgZm9yIHRoZSBvYnNlcnZlZCBhZGFwdGVyLiBXaGVuXG4gICAqIGBzeW50aGV0aWNFdmVudHNgIGlzIHRydWUgKHRoZSBkZWZhdWx0KSBubyBnYXRld2F5IGNvbm5lY3Rpb24gaXMgb3BlbmVkO1xuICAgKiBpbnN0ZWFkIGV2ZXJ5IENSVUQgb3BlcmF0aW9uIGlzIHdyYXBwZWQgd2l0aCBhIFByb3h5IHRoYXQgZmlyZXNcbiAgICogYHVwZGF0ZU9ic2VydmVyc2AgZm9yICoqYWxsKiogbW9kZWxzLiBXaGVuIGBzeW50aGV0aWNFdmVudHNgIGlzIGZhbHNlIHRoZVxuICAgKiBleGlzdGluZyBnYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZVxuICAgKiBsb2NhbCBQcm94eSBmYWxsYmFjayBpcyBsaW1pdGVkIHRvIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzIG9ubHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9yIGNvbmZpZyBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcblxuICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50cyA9IHRoaXMuYWRhcHRlci5jb25maWcuc3ludGhldGljRXZlbnRzICE9PSBmYWxzZTtcblxuICAgIGlmICghc3ludGhldGljRXZlbnRzKSB7XG4gICAgICAvLyBHYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gKG5vbi1zeW50aGV0aWMgcGF0aClcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgXCJkaXNwYXRjaFwiLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBNb2RlbCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmluaXRpYWxpemUpO1xuICAgICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShcbiAgICAgICAgY3R4LFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnIGFzIFBlZXJDb25maWcsXG4gICAgICAgIHRoaXMuY2xpZW50XG4gICAgICApO1xuICAgICAgY29uc3QgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWwpO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IGF3YWl0IG5ldHdvcmsuZ2V0Q2hhaW5jb2RlRXZlbnRzKFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLmhhbmRsZUV2ZW50cyhjdHgpO1xuICAgIH1cblxuICAgIC8vIFByb3h5IENSVUQgbWV0aG9kcy5cbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gdHJ1ZSAg4oaSIG5vdGlmeSBmb3IgQUxMIG1vZGVscyAocmVwbGFjZXMgZ2F0ZXdheSBldmVudHMgZW50aXJlbHkpXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IGZhbHNlIOKGkiBub3RpZnkgb25seSBmb3IgZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHNcbiAgICAvLyAgICh0aGUgZ2F0ZXdheSBzdWJzY3JpcHRpb24gaGFuZGxlcyBwdWJsaWMgbW9kZWxzKVxuICAgIChcbiAgICAgIFtcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIF0gYXMgKGtleW9mIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgodG9XcmFwKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE5vIGFkYXB0ZXIgcHJvdmlkZWQgZm9yIHRoZSBmYWxsYmFjayBvZiBmdWxseSBzZWdyZWdhdGVkIG1vZGVsc2BcbiAgICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyW3RvV3JhcF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHt0b1dyYXB9IG5vdCBmb3VuZCBpbiAke3RoaXMuYWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5hZGFwdGVyLCB0b1dyYXApO1xuICAgICAgbGV0IHByb3RvOiBhbnkgPSB0aGlzLmFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgdG9XcmFwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHt0b1dyYXB9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIHRoaXMuYWRhcHRlclt0b1dyYXBdID0gbmV3IFByb3h5KHRoaXMuYWRhcHRlclt0b1dyYXBdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAoXG4gICAgICAgICAgdGFyZ2V0OiBhbnksXG4gICAgICAgICAgdGhpc0FyZzogRmFicmljQ2xpZW50QWRhcHRlcixcbiAgICAgICAgICBhcmdBcnJheTogYW55W11cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgLy8gUnVuIHRoZSBvcmlnaW5hbCBtZXRob2QgdW5jaGFuZ2VkIHNvIHRyYW5zaWVudCBkYXRhIGlzIHByZXNlcnZlZFxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG5cbiAgICAgICAgICBjb25zdCBjbGF6ejogQ29uc3RydWN0b3I8YW55PiA9IGFyZ0FycmF5WzBdO1xuICAgICAgICAgIC8vIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIGZhbHNlLCBwdWJsaWMgbW9kZWxzIGVtaXQgYSBjaGFpbmNvZGUgZXZlbnRcbiAgICAgICAgICAvLyBvbiB0aGUgY29udHJhY3Qgc2lkZTsgc2tpcCB0aGUgbG9jYWwgZmFsbGJhY2sgdG8gYXZvaWRcbiAgICAgICAgICAvLyBkb3VibGUtbm90aWZpY2F0aW9uLiBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyB0cnVlIHdlIGhhbmRsZSBhbGwgbW9kZWxzLlxuICAgICAgICAgIGlmICghc3ludGhldGljRXZlbnRzICYmICFNb2RlbC5pc1RyYW5zaWVudChjbGF6eikpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgICAvLyBDb250ZXh0IGlzIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50IG9mIGFyZ0FycmF5XG4gICAgICAgICAgY29uc3QgeyBsb2csIGN0eEFyZ3MsIGN0eCB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShcbiAgICAgICAgICAgIGFyZ0FycmF5LnNsaWNlKGFyZ0FycmF5Lmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpZHMgPSBhcmdBcnJheVsxXTtcbiAgICAgICAgICBjb25zdCByZXN1bHRBcmdzOiBhbnlbXSA9IFtjbGF6eiwgYnVsa1RvU2luZ2xlKHRvV3JhcCksIGlkc107XG5cbiAgICAgICAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwib2JzZXJ2ZUZ1bGxSZXN1bHRcIikpIHtcbiAgICAgICAgICAgIHJlc3VsdEFyZ3MucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIC4uLihyZXN1bHRBcmdzIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHRoaXMudXBkYXRlT2JzZXJ2ZXJzPiksXG4gICAgICAgICAgICAuLi5jdHhBcmdzXG4gICAgICAgICAgKS5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke3RvV3JhcH0gb24gJHtjbGF6ei5uYW1lIHx8IGNsYXp6fSBmb3IgJHtpZHN9OiAke2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmlmIChGYWJyaWNDbGllbnRBZGFwdGVyKVxuICBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSA9IEZhYnJpY0NsaWVudERpc3BhdGNoO1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6WyJlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UiLCJmaWxlUGF0aCIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJkaXJuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTW9kZWxJbmRleGVzIiwibSIsImdlbmVyYXRlSW5kZXhlcyIsImdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzIiwiYWNjdW0iLCJ2aWV3cyIsImdlbmVyYXRlVmlld3MiLCJzdG9yYWdlIiwiZm9yRWFjaCIsImRvYyIsIl9pZCIsInJlYWRNb2RlbEZpbGUiLCJmaWxlIiwiZXhwb3J0cyIsImpvaW4iLCJwcm9jZXNzIiwiY3dkIiwicGFyZW50UGF0aCIsIm5hbWUiLCJ2YWx1ZXMiLCJPYmplY3QiLCJmaWx0ZXIiLCJlIiwiTW9kZWwiLCJhc3luYyIsInJlYWRNb2RlbEZvbGRlcnMiLCJmb2xkZXJzIiwicmVzdWx0IiwiZm9sZGVyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJyZWN1cnNpdmUiLCJmIiwiaXNGaWxlIiwiZW5kc1dpdGgiLCJwdXNoIiwid3JpdGVJbmRleGVzIiwiaW5kZXhlcyIsInAiLCJjb2xsZWN0aW9uIiwiaW5kZXgiLCJyZXNvbHZlIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJ3cml0ZURlc2lnbkRvY3MiLCJkZXNpZ25Eb2NzIiwibGVuZ3RoIiwiZG9jSWQiLCJyZXBsYWNlIiwicGF5bG9hZCIsIl9yZXYiLCJjb2xsZWN0aW9uRm9yIiwiY29sbGVjdGlvbk5hbWUiLCJwb2xpY3kiLCJyZXF1aXJlZFBlZXJDb3VudCIsIm1heFBlZXJDb3VudCIsImJsb2NrVG9MaXZlIiwibWVtYmVyT25seVJlYWQiLCJtZW1iZXJPbmx5V3JpdGUiLCJwcml2YXRlQ29sbGVjdGlvbkZvciIsIm1zcElkIiwiYyIsImVuZG9yc2VtZW50UG9saWN5Iiwic2lnbmF0dXJlUG9saWN5Iiwic2hhcmVkQ29sbGVjdGlvbkZvciIsIm1zcElkcyIsIm1hcCIsImV4dHJhY3RDb2xsZWN0aW9ucyIsIm92ZXJyaWRlcyIsIm1pcnJvciIsInByaXZhdGVDb2xzIiwic2hhcmVkQ29scyIsImNvbGxlY3Rpb25zRm9yIiwicmVzb2x2ZUNvbGxlY3Rpb24iLCJhcmciLCJJbnRlcm5hbEVycm9yIiwicHJpdmF0ZURlZmF1bHRzIiwiYXNzaWduIiwic2hhcmVkRGVmYXVsdHMiLCJtaXJyb3JNZXRhIiwibWlycm9yZWRBdCIsInByaXZhdGVzIiwiZmxhdCIsInJlc29sdmVkIiwicmVzb2x2ZXIiLCJzb21lIiwiaW5jbHVkZXMiLCJzaGFyZWQiLCJ3cml0ZUNvbGxlY3Rpb25zIiwiY29scyIsImZpbGVOYW1lIiwid3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyIsImRvY3MiLCJGYWJyaWNDbGllbnRQYWdpbmF0b3IiLCJQYWdpbmF0b3IiLCJjb25zdHJ1Y3RvciIsImFkYXB0ZXIiLCJxdWVyeSIsInNpemUiLCJjbGF6eiIsInN1cGVyIiwicHJlcGFyZSIsInJhd1N0YXRlbWVudCIsIlVuc3VwcG9ydGVkRXJyb3IiLCJwYWdlIiwiYXJncyIsImlzU2VyaWFsaXplZFBhZ2UiLCJvYmoiLCJBcnJheSIsImlzQXJyYXkiLCJkYXRhIiwiRmFicmljQ2xpZW50UmVwb3NpdG9yeSIsIlJlcG9zaXRvcnkiLCJmb3JjZSIsInRoaXMiLCJfb3ZlcnJpZGVzIiwiaWdub3JlVmFsaWRhdGlvbiIsImlnbm9yZUhhbmRsZXJzIiwiYWxsb3dSYXdTdGF0ZW1lbnRzIiwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllcyIsImZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzIiwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUiLCJyZWJ1aWxkV2l0aFRyYW5zaWVudCIsIm92ZXJyaWRlIiwiZmxhZ3MiLCJmb3IiLCJPYnNlcnZlckhhbmRsZXIiLCJwYWdpbmF0ZUJ5Iiwia2V5Iiwib3JkZXIiLCJyZWYiLCJvZmZzZXQiLCJsaW1pdCIsImxvZyIsImN0eEFyZ3MiLCJsb2dDdHgiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJQQUdFX0JZIiwidmVyYm9zZSIsInRhYmxlTmFtZSIsImNsYXNzIiwic3RhdGVtZW50IiwiYm9va21hcmsiLCJsaXN0QnkiLCJMSVNUX0JZIiwiZmluZEJ5IiwidmFsdWUiLCJGSU5EX0JZIiwiZmluZE9uZUJ5IiwiRklORF9PTkVfQlkiLCJmaW5kIiwiT3JkZXJEaXJlY3Rpb24iLCJBU0MiLCJGSU5EIiwiZGlyZWN0aW9uIiwiUEFHRSIsImN0eCIsIlBlcnNpc3RlbmNlS2V5cyIsIlNUQVRFTUVOVCIsImNhbGxBcmdzIiwic2xpY2UiLCJwYXJzZSIsImRlY29kZSIsImV2YWx1YXRlVHJhbnNhY3Rpb24iLCJoeWRyYXRlZCIsInIiLCJDb3VjaERCS2V5cyIsIlRBQkxFIiwiZCIsImFwcGx5QWZ0ZXJSZWFkIiwiZ2V0T3JVbmRlZmluZWQiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJBRlRFUiIsIlByb21pc2UiLCJhbGwiLCJlbnRyeSIsImNvdW50T2YiLCJDT1VOVF9PRiIsInN0bXRBcmdzIiwibWF4T2YiLCJNQVhfT0YiLCJtaW5PZiIsIk1JTl9PRiIsImF2Z09mIiwiQVZHX09GIiwic3VtT2YiLCJTVU1fT0YiLCJkaXN0aW5jdE9mIiwiRElTVElOQ1RfT0YiLCJncm91cE9mIiwiR1JPVVBfT0YiLCJoZWFsdGhjaGVjayIsImNyZWF0ZSIsIm1vZGVsIiwiZGVidWciLCJlbnN1cmVMZWdhY3lNaXJyb3JGbGFnIiwicHJlcGFyZWQiLCJyZWNvcmQiLCJpZCIsInRyYW5zaWVudCIsInJldmVydCIsInVwZGF0ZSIsImNyZWF0ZUFsbFByZWZpeCIsIm1vZGVscyIsIkNSRUFURSIsImdldCIsImlnbm9yZVZhbGlkYXRlIiwiT04iLCJpZ25vcmVkUHJvcHMiLCJlcnJvcnMiLCJoYXNFcnJvcnMiLCJlcnJvck1lc3NhZ2VzIiwicmVkdWNlRXJyb3JzVG9QcmludCIsIlZhbGlkYXRpb25FcnJvciIsImNyZWF0ZUFsbCIsImlkcyIsInBheWxvYWRzIiwidHJhbnNpZW50cyIsImNyZWF0ZWQiLCJpIiwicmVhZEFsbCIsImtleXMiLCJyZWNvcmRzIiwidXBkYXRlQWxsIiwidXBkYXRlZCIsInUiLCJhY2N1bXVsYXRlIiwibGVnYWN5IiwiRVJDMjBUb2tlbiIsIkJhc2VNb2RlbCIsIl9fZGVjb3JhdGUiLCJwayIsInR5cGUiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJjb2x1bW4iLCJyZXF1aXJlZCIsInRhYmxlIiwiRVJDMjBXYWxsZXQiLCJBbGxvd2FuY2UiLCJDbGllbnRTZXJpYWxpemVyIiwiSlNPTlNlcmlhbGl6ZXIiLCJwcmVTZXJpYWxpemUiLCJtb2RlbE5hbWUiLCJ0b1NlcmlhbGl6ZSIsIm1ldGFkYXRhIiwiTWV0YWRhdGEiLCJTZXJpYWxpemF0aW9uRXJyb3IiLCJNb2RlbEtleXMiLCJBTkNIT1IiLCJkZXNlcmlhbGl6ZSIsInN0ciIsImRlc2VyaWFsaXphdGlvbiIsImNsYXNzTmFtZSIsIkVycm9yIiwiYnVpbGQiLCJzZXJpYWxpemUiLCJGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkiLCJzZXJpYWxpemVyIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwidXBkYXRlT2JzZXJ2ZXJzIiwiZXZlbnQiLCJvYnNlcnZlckhhbmRsZXIiLCJjb3VudCIsInBhcnNlZElkIiwiU2VxdWVuY2UiLCJwYXJzZVZhbHVlIiwic2VxdWVuY2VGb3IiLCJ0b2tlbk5hbWUiLCJzeW1ib2wiLCJkZWNpbWFscyIsIk51bWJlciIsInRvdGFsU3VwcGx5IiwidG90YWwiLCJiYWxhbmNlT2YiLCJvd25lciIsImJhbGFuY2UiLCJ0cmFuc2ZlciIsInRvIiwidHJhbnNmZXJyZWQiLCJzdWJtaXRUcmFuc2FjdGlvbiIsInRvU3RyaW5nIiwidHJhbnNmZXJGcm9tIiwiZnJvbSIsImNvbnRleHRBcmdzIiwiQ29udGV4dCIsImFwcHJvdmUiLCJzcGVuZGVyIiwiYXBwcm92ZWQiLCJhbGxvd2FuY2UiLCJpbml0aWFsaXplIiwidG9rZW4iLCJpbml0aWxpYXplZCIsImNoZWNrSW5pdGlhbGl6ZWQiLCJtaW50IiwiYW1vdW50IiwiYnVybiIsImJ1cm5Gcm9tIiwiYWNjb3VudCIsImNsaWVudEFjY291bnRCYWxhbmNlIiwic2VyaWFsaXplZEFjY291bnRCYWxhbmNlIiwiY2xpZW50QWNjb3VudElEIiwiZXh0cmFjdElkcyIsImNvbXBvc2VkIiwicGtQcm9wcyIsImV4dHJhY3RJZCIsImNvbXBvc2VBdHRyaWJ1dGVWYWx1ZSIsIklkZW50aXR5Q3JlZGVudGlhbHMiLCJkZXNjcmlwdGlvbiIsIkZhYnJpY01vZGVsS2V5cyIsIklkZW50aXR5VHlwZSIsIkZhYnJpY0ZsYXZvdXIiLCJJZGVudGl0eSIsIlg1MDkiLCJvbmVUb09uZSIsIkNhc2NhZGUiLCJDQVNDQURFIiwiZGVsZXRlIiwiQ29yZVV0aWxzIiwibG9nZ2VyIiwiTWluaUxvZ2dlciIsImNvbnRlbnRPZkxvYWRGaWxlIiwiY29udGVudE9yUGF0aCIsImZpbGVSZWFkZXIiLCJVaW50OEFycmF5IiwibWF0Y2giLCJyZWFkRmlsZSIsInByb21pc2VzIiwibm9ybWFsaXplSW1wb3J0IiwiaW1wb3J0IiwiZ2V0Q0FVc2VyIiwidXNlck5hbWUiLCJwcml2YXRlS2V5IiwiY2VydGlmaWNhdGUiLCJvcHRpb25zIiwic3RyaW5nRm9ybWF0IiwidXNlciIsIlVzZXIiLCJjb25maWciLCJoc20iLCJzb2Z0d2FyZSIsImxpYiIsImxpYnJhcnkiLCJzbG90IiwibGFiZWwiLCJ0b2tlbkxhYmVsIiwicGluIiwiY3J5cHRvU3VpdGUiLCJnZXRDcnlwdG9TdWl0ZSIsInNldENyeXB0b1N1aXRlIiwiZW5yb2xsbWVudEtleSIsImdldEhTTUVucm9sbG1lbnRLZXkiLCJnZXRTb2Z0d2FyZUVucm9sbG1lbnRLZXkiLCJzZXRFbnJvbGxtZW50IiwibmV3Q3J5cHRvU3VpdGUiLCJjcmVhdGVLZXlGcm9tUmF3Iiwic2tpIiwia2V5SWRIZXgiLCJ0cmltIiwiQnVmZmVyIiwiZ2V0Q2VydGlmaWNhdGVTS0kiLCJnZXRLZXkiLCJpc1ByaXZhdGUiLCJ4NTA5IiwiWDUwOUNlcnRpZmljYXRlIiwiandrIiwicHVibGljS2V5IiwiZXhwb3J0IiwiZm9ybWF0IiwicHJlZml4IiwieCIsInkiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiY29uY2F0IiwiZGlnZXN0IiwiZ2V0SWRlbnRpdHkiLCJjZXJ0RGlyZWN0b3J5UGF0aCIsImlkZW50aXR5RmlsZVJlYWRlciIsImNlcnRQYXRoIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZSIsImNyZWRlbnRpYWxzIiwiZGlyUGF0aCIsInJlYWRkaXIiLCJnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCIsImdldEZpbGVDb250ZW50IiwiZ2V0U2lnbmVyIiwia2V5RGlyZWN0b3J5UGF0aCIsInNpZ25lckZpbGVSZWFkZXIiLCJrZXlQYXRoIiwicHJpdmF0ZUtleVBlbSIsImV4dHJhY3RQcml2YXRlS2V5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiayIsInNpZ25lcnMiLCJuZXdQcml2YXRlS2V5U2lnbmVyIiwicGVtIiwibGliTmFtZSIsInN1YnRsZSIsImdsb2JhbFRoaXMiLCJ3aW5kb3ciLCJDcnlwdG8iLCJ3ZWJjcnlwdG8iLCJzdHIyYWIiLCJidWYiLCJBcnJheUJ1ZmZlciIsImJ1ZlZpZXciLCJzdHJMZW4iLCJjaGFyQ29kZUF0IiwicmVwbGFjZUFsbCIsImRlY29kZWQiLCJiaW5hcnlEZXIiLCJpbXBvcnRLZXkiLCJuYW1lZEN1cnZlIiwiZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQiLCJjZXJ0IiwieDUwOUNlcnRpZmljYXRlIiwiWDUwOUNlcnQiLCJha2lFeHQiLCJleHRlbnNpb25zIiwiYWtpIiwidG9VcHBlckNhc2UiLCJzdGFydHNXaXRoIiwic2VyaWFsIiwic2VyaWFsTnVtYmVyIiwiY3J5cHRvUHJvdmlkZXIiLCJzZXQiLCJCQVNFX0FMUEhBQkVUIiwiQ1JZUFRPIiwiQmFzZUVuY29kZXIiLCJhbHBoYWJldCIsImJhc2VNYXAiLCJqIiwiY2hhckF0IiwieGMiLCJiYXNlIiwibGVhZGVyIiwiZmFjdG9yIiwiTWF0aCIsImlGYWN0b3IiLCJlbmNvZGUiLCJzb3VyY2UiLCJpc1ZpZXciLCJidWZmZXIiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInplcm9lcyIsInBiZWdpbiIsInBlbmQiLCJiNTgiLCJjYXJyeSIsIml0MSIsIml0MiIsInJlcGVhdCIsImRlY29kZVVuc2FmZSIsInBzeiIsImIyNTYiLCJpdDMiLCJpdDQiLCJ2Y2giLCJDcnlwdG9VdGlscyIsImI1OGVuY29kZXIiLCJCQVNFNTgiLCJmYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZSIsInN1YmplY3QiLCJpc3N1ZXIiLCJzdHJpbmdUb0FycmF5QnVmZmVyIiwiZXh0cmFjdEtleSIsInVzYWdlcyIsIlJlZ0V4cCIsImV4dHJhY3RQdWJsaWNLZXkiLCJzaWduIiwiYnVmZiIsImhhc2giLCJiIiwicGFkU3RhcnQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJlbmNyeXB0IiwiZ2V0U3VidGxlQ3J5cHRvIiwiaXNCcm93c2VyIiwiZGVjcnlwdCIsImdldE1hc3RlciIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJnZW5HZW5lc2lzIiwicmFuZG9tVVVJRCIsImltcG9ydGVkS2V5IiwiS0VZX0FMR09SWVRITSIsIml2IiwiZ2V0RGVyaXZhdGlvbktleSIsInNhbHQiLCJzYWx0QnVmZmVyIiwic2FsdEhhc2hlZCIsInBhcmFtcyIsIkhBU0giLCJpdGVyYXRpb25zIiwiSVRFUkFUSU9OUyIsImRlcml2YXRpb24iLCJkZXJpdmVCaXRzIiwiS0VZTEVOR1RIIiwiaXZsZW4iLCJrZXlsZW4iLCJkZXJpdmVkS2V5IiwiaW1wb3J0ZWRFbmNyeXB0aW9uS2V5IiwiQUxHT1JZVEhNIiwiZW5jcnlwdFBpbiIsInRleHQiLCJrZXlPYmplY3QiLCJ0ZXh0QnVmZmVyIiwiZW5jcnlwdGVkVGV4dCIsImRlY3J5cHRQaW4iLCJ0ZXh0RGVjb2RlciIsImRlY3J5cHRlZFRleHQiLCJPdmVyZmxvd0Vycm9yIiwibXNnIiwiQmFsYW5jZUVycm9yIiwiQWxsb3dhbmNlRXJyb3IiLCJSZWdpc3RyYXRpb25FcnJvciIsIkF1dGhvcml6YXRpb25FcnJvciIsIk1pc3NpbmdDb250ZXh0RXJyb3IiLCJVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyIsIkJhc2VFcnJvciIsIk5vdEluaXRpYWxpemVkRXJyb3IiLCJNaXNzaW5nUEtDU1MxMUxpYiIsIkVuZG9yc2VtZW50RXJyb3IiLCJtZXNzYWdlIiwiTXZjY1JlYWRDb25mbGljdEVycm9yIiwiUGhhbnRvbVJlYWRDb25mbGljdEVycm9yIiwiRW5kb3JzZW1lbnRQb2xpY3lFcnJvciIsIlRyYW5zYWN0aW9uTGltaXRzRXJyb3IiLCJjb2RlIiwiVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IiLCJUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciIsIkhGQ0FJZGVudGl0eVR5cGUiLCJIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIiwiRmFicmljRW5yb2xsbWVudFNlcnZpY2UiLCJMb2dnZWRDbGFzcyIsImNhQ29uZmlnIiwiY2FOYW1lIiwiY2FDZXJ0IiwiY2FLZXkiLCJ1cmwiLCJDQSIsImNhIiwidGxzIiwidHJ1c3RlZFJvb3RzIiwicm9vdCIsIkZhYnJpY0NBU2VydmljZXMiLCJDbGllbnQiLCJjbGllbnQiLCJDZXJ0aWZpY2F0ZSIsImNlcnRpZmljYXRlU2VydmljZSIsIm5ld0NlcnRpZmljYXRlU2VydmljZSIsIkFmZmlsaWF0aW9ucyIsImFmZmlsaWF0aW9uU2VydmljZSIsIm5ld0FmZmlsaWF0aW9uU2VydmljZSIsIklkZW50aXRpZXMiLCJpZGVudGl0eVNlcnZpY2UiLCJuZXdJZGVudGl0eVNlcnZpY2UiLCJnZXRDZXJ0aWZpY2F0ZXMiLCJyZXF1ZXN0IiwiZG9NYXAiLCJyZXNwb25zZSIsImNlcnRzIiwiUEVNIiwiZ2V0SWRlbnRpdGllcyIsImlkZW50aXRpZXNTZXJ2aWNlIiwiZ2V0QWxsIiwiaWRlbnRpdGllcyIsInBhcnNlRXJyb3IiLCJyZWdleHAiLCJleGVjIiwiQ29uZmxpY3RFcnJvciIsImdldEFmZmlsaWF0aW9ucyIsImEiLCJyZWFkIiwiZW5yb2xsbWVudElkIiwiZ2V0T25lIiwiTm90Rm91bmRFcnJvciIsInN1Y2Nlc3MiLCJyZWdpc3RlciIsImlzU3VwZXJVc2VyIiwiYWZmaWxpYXRpb24iLCJ1c2VyUm9sZSIsImF0dHJzIiwibWF4RW5yb2xsbWVudHMiLCJyZWdpc3RyYXRpb24iLCJwYXNzd29yZCIsInByb3BzIiwiZW5yb2xsbWVudElEIiwiZW5yb2xsbWVudFNlY3JldCIsImluZm8iLCJpZGVudGl0eUZyb21FbnJvbGxtZW50IiwiZW5yb2xsbWVudCIsInJvb3RDZXJ0aWZpY2F0ZSIsIkxvZ2dpbmciLCJjbGllbnRJZCIsIm5vdyIsIkRhdGUiLCJ0b0J5dGVzIiwiY3JlYXRlZE9uIiwidXBkYXRlZE9uIiwiZW5yb2xsIiwiaWRlbnRpdHkiLCJyZWdpc3RlckFuZEVucm9sbCIsInJldm9rZSIsInJlYXNvbiIsIlJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIiwiZXJycyIsInJvbGUiLCJzZXRBZmZpbGlhdGlvbiIsImFkZEF0dHIiLCJhdHRyIiwic2V0QXR0cnMiLCJzZXRFbnJvbGxtZW50SUQiLCJzZXRFbnJvbGxtZW50U2VjcmV0Iiwic2V0TWF4RW5yb2xsbWVudHMiLCJzZXRSb2xlIiwibWlubGVuZ3RoIiwibWluIiwiRVJDMjBFdmVudHMiLCJGYWJyaWNCYXNlTW9kZWwiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJ2ZXJzaW9uIiwidXNlcyIsIkZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWwiLCJjcmVhdGVkQnkiLCJ1cGRhdGVkQnkiLCJpc1NoYXJlZCIsInNlZ3JlZ2F0ZSIsImlzVHJhbnNpZW50IiwiZGVjb3JhdGVkUHJvcGVydGllcyIsImdldEF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRQcm9wcyIsIkRCS2V5cyIsIlRSQU5TSUVOVCIsInByaXZhdGVQcm9wZXJ0aWVzIiwiUFJJVkFURSIsInNoYXJlZFByb3BlcnRpZXMiLCJTSEFSRUQiLCJwdWJsaWMiLCJ0cmFuc2llbnRLZXlzIiwicHJpdmF0ZUtleXMiLCJzaGFyZWRLZXlzIiwiaXNQdWJsaWMiLCJiaW5kIiwibWlycm9yZWQiLCJGQUJSSUMiLCJNSVJST1IiLCJvd25lck9mIiwibWV0YSIsIk9XTkVEX0JZIiwic2hhcmVkS2V5IiwiY29uc3RyIiwicHJpdmF0ZU1ldGEiLCJzaGFyZWRNZXRhIiwiY29sbGVjdGlvbnMiLCJleHRyYWN0TXNwSWQiLCJnZXRNU1BJRCIsIk93bmVyIiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJkZXNjcmlwdG9yIiwib3JpZ2luYWxNZXRob2QiLCJhY291bnRJZCIsImNsaWVudElkZW50aXR5IiwiZ2V0SUQiLCJzZWxlY3QiLCJ0b2tlbnMiLCJleGVjdXRlIiwiYXBwbHkiLCJvd25lZEJ5T25DcmVhdGUiLCJjb250ZXh0Iiwic3R1YiIsImNyZWF0b3IiLCJnZXRDcmVhdG9yIiwibXNwaWQiLCJzZXRPd25lZEJ5S2V5VmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIm93bmVkQnkiLCJhdHRyaWJ1dGUiLCJnZW5lcmF0ZWQiLCJyZWFkb25seSIsIm9uQ3JlYXRlIiwicHJvcE1ldGFkYXRhIiwiRGVjb3JhdGlvbiIsImRlZmluZSIsImRlY29yYXRvciIsInRyYW5zYWN0aW9uSWRPbkNyZWF0ZSIsImdldFR4SUQiLCJ0cmFuc2FjdGlvbklkIiwib25VcGRhdGUiLCJUUkFOU0FDVElPTl9JRCIsImV2YWxNaXJyb3JNZXRhZGF0YSIsImNyZWF0ZU1pcnJvckhhbmRsZXIiLCJmYWJyaWNDdHgiLCJzb3VyY2VNb2RlbCIsInB1dCIsInJlcG8iLCJtaXJyb3JDb2xsZWN0aW9uIiwidXBkYXRlTWlycm9ySGFuZGxlciIsImFwcGx5VXBkYXRlVmFsaWRhdGlvbiIsIm1lcmdlRm9yVXBkYXRlIiwiZGVsZXRlTWlycm9ySGFuZGxlciIsInBrUHJvcCIsInNlZ3JlZ2F0ZWQiLCJtaXJyb3JXcml0ZUd1YXJkIiwibXNwIiwiY29uZGl0aW9uIiwicmVhZE1pcnJvckhhbmRsZXIiLCJtYXRjaGVzIiwicmVhZEZyb20iLCJtc3BJZE9yQ29uZGl0aW9uIiwiaXNDb25kaXRpb25Pbmx5IiwiQm9vbGVhbiIsImNvbmQiLCJvblJlYWQiLCJwcmlvcml0eSIsIm9uRGVsZXRlIiwiTW9kZWxDb2xsZWN0aW9uIiwib3JnTmFtZSIsInRvUGFzY2FsQ2FzZSIsIk5hbWVzcGFjZUNvbGxlY3Rpb24iLCJuYW1lc3BhY2UiLCJJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uIiwiU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFkiLCJhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MiLCJpc0Z1bGx5U2VncmVnYXRlZCIsImhhc1B1YmxpY1Byb3BlcnRpZXMiLCJtYXJrRnVsbHlTZWdyZWdhdGVkIiwiYXBwbHlNaXJyb3JGbGFncyIsImF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRNZXRhIiwiZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyIsImRhdGFBcnJheSIsImNvbGxlY3Rpb25SZXNvbHZlciIsImtleUFycmF5IiwicGtLZXkiLCJwa1NlcU5hbWUiLCJzZXF1ZW5jZU5hbWUiLCJpZFZhbHVlIiwiY2FuQnVpbGRQZXJJbnN0YW5jZSIsInNldFNlcXVlbmNlU2VncmVnYXRpb24iLCJwcm9wU2VxTmFtZSIsInNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUiLCJfayIsImtleVN0cmluZ3MiLCJ3cml0ZVRvIiwic2VncmVnYXRlZERhdGFPblJlYWQiLCJzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIiwib2xkTW9kZWwiLCJzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIiwiaW5uZXJTZWdyZWdhdGVkIiwic2VncmVnYXRlZERlYyIsIlNldCIsImFkZCIsImNvbnN0ck1ldGEiLCJjb25zdHJDb2xsZWN0aW9ucyIsInVwZGF0ZWRUcmFuc2llbnRNZXRhIiwiZGVjcyIsInByb3BlcnRpZXMiLCJncm91cE5hbWUiLCJleHRyYWN0R3JvdXBOYW1lIiwiZGF0YUdyb3VwTmFtZSIsImVhcmx5RXh0cmFjdGlvbk1ldGEiLCJlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQiLCJncm91cCIsInByb3AiLCJvbiIsIkRCT3BlcmF0aW9ucyIsIkFMTCIsInByaXZhdGVEYXRhIiwic2hhcmVkRGF0YSIsInNvcnRLZXlzT25seVJlY3Vyc2l2ZSIsInNvcnQiLCJyZWR1Y2UiLCJhY2MiLCJEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsImVycm9yIiwic2VsZiIsIm8iLCJjYWxsIiwicmVsYXRpb25zIiwiZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUiLCJwYXJzZUV2ZW50TmFtZSIsInBhcnRzIiwic3BsaXQiLCJzdWIiLCJzYWZlUGFyc2VJbnQiLCJzdHJpbmciLCJkaWdpdFJlZ2V4IiwidGVzdCIsInBhcnNlZGludCIsInBhcnNlSW50IiwiaXNOYU4iLCJTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsInB1dEFuY2hvciIsInByZVNlcmlhbGl6YXRpb24iLCJGYWJyaWNJZGVudGl0eVNlcnZpY2UiLCJDbGllbnRCYXNlZFNlcnZpY2UiLCJyb290Q2xpZW50IiwiX3VzZXIiLCJjZXJ0aWZpY2F0ZXMiLCJhZmZpbGlhdGlvbnMiLCJnZXRVc2VyIiwiY2ZnIiwiSU5JVElBTElaQVRJT04iLCJnZXROYW1lIiwidXBkYXRlSWRlbnRpdHkiLCJpZGVudGl0eVJlcXVlc3QiLCJjYVVzZXJJZGVudGl0eSIsInJlZW5yb2xsVXNlciIsImNyZWF0ZVVzZXIiLCJnZXRNc3BpZCIsImVucm9sbG1lbnRBdHRycyIsIm9wdGlvbmFsIiwicmVlbnJvbGwiLCJyZW5ld2VkSWRlbnRpdHkiLCJyZXZva2VPcHRpb25zIiwicmV2b2tlUmVxdWVzdCIsIkNBX1JPTEUiLCJEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MiLCJldmFsdWF0ZVRpbWVvdXQiLCJlbmRvcnNlVGltZW91dCIsInN1Ym1pdFRpbWVvdXQiLCJjb21taXRUaW1lb3V0IiwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzIiwiYWxsb3dHYXRld2F5T3ZlcnJpZGUiLCJlbmNyeXB0VHJhbnNpZW50Iiwic3ludGhldGljRXZlbnRzIiwiZXNjYXBlUmVnRXhwIiwibmV4dExleGljb2dyYXBoaWNTdHJpbmciLCJjaGFycyIsImNvZGVQb2ludEF0IiwiZnJvbUNvZGVQb2ludCIsInByZWZpeFJhbmdlIiwic3RhcnQiLCJlbmQiLCJGYWJyaWNDbGllbnRTdGF0ZW1lbnQiLCJTdGF0ZW1lbnQiLCJzcXVhc2giLCJzcXVhc2hlZCIsIm1ldGhvZCIsImV4ZWN1dGVQcmVwYXJlZCIsImFyZ3oiLCJmb3JNb2RlbCIsImZyb21TZWxlY3RvciIsImFsaWFzIiwiUVVFUlkiLCJpc1NpbXBsZVF1ZXJ5IiwiUXVlcnlDbGF1c2UiLCJ3aGVyZUNvbmRpdGlvbiIsInBhcnNlZCIsInByZXBhcmVDb25kaXRpb24iLCJzZWxlY3RTZWxlY3RvciIsIlNFTEVDVCIsIkFORCIsInRvTG93ZXJDYXNlIiwib3JkZXJCeVNlbGVjdG9ycyIsIk9SREVSX0JZIiwidG9DYW1lbENhc2UiLCJwcm9jZXNzUmVjb3JkIiwicGtBdHRyIiwiSUQiLCJrZXlBcmdzIiwiU0VQQVJBVE9SIiwicmF3IiwicmF3SW5wdXQiLCJhZ2dyZWdhdG9yIiwiYWdncmVnYXRlSW5mbyIsImFnZ3JlZ2F0ZSIsImV4ZWN1dGVBZ2dyZWdhdGUiLCJyZXN1bHRzIiwicHJvY2Vzc2VkIiwiYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQiLCJhZ2dyZWdhdGVRdWVyeSIsImJ1aWxkQWdncmVnYXRlUXVlcnkiLCJzZWxlY3RvcnMiLCJzZWxlY3RvciIsImZpZWxkcyIsInBhcnNlQ29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYW5kIiwiZXEiLCJzZWxlY3RvcktleXMiLCJDb3VjaERCR3JvdXBPcGVyYXRvciIsImluZGV4T2YiLCJ2YWwiLCJPUiIsInMiLCJlbnRyaWVzIiwid2FybiIsInNlbGVjdG9yS2V5IiwicmVjIiwiQ291Y2hEQk9wZXJhdG9yIiwiQklHR0VSIiwibGltaXRTZWxlY3RvciIsIkNvdWNoREJRdWVyeUxpbWl0Iiwib2Zmc2V0U2VsZWN0b3IiLCJza2lwIiwibWVyZ2UiLCJvcCIsIm9iajEiLCJvYmoyIiwiYXR0cjEiLCJvcGVyYXRvciIsImNvbXBhcmlzb24iLCJPcGVyYXRvciIsIlNUQVJUU19XSVRIIiwiUXVlcnlFcnJvciIsInJhbmdlIiwiQklHR0VSX0VRIiwiU01BTExFUiIsIkVORFNfV0lUSCIsIlJFR0VYUCIsIkJFVFdFRU4iLCJtYXgiLCJvcEJldHdlZW4iLCJ0cmFuc2xhdGVPcGVyYXRvcnMiLCJTTUFMTEVSX0VRIiwiR3JvdXBPcGVyYXRvciIsIk5PVCIsIm9wMSIsIm9wMiIsImF2Z1NlbGVjdG9yIiwic3VtSW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IiLCJjb3VudEluZm8iLCJjcmVhdGVBZ2dyZWdhdGVRdWVyeSIsImtpbmQiLCJzdW1EZXNjcmlwdG9yIiwiY291bnREZXNjcmlwdG9yIiwiY291bnREaXN0aW5jdFNlbGVjdG9yIiwiY291bnREaXN0aW5jdCIsImFnZ3JlZ2F0b3JVc2VkIiwiY291bnRTZWxlY3RvciIsIm1pblNlbGVjdG9yIiwibWF4U2VsZWN0b3IiLCJzdW1TZWxlY3RvciIsImRpc3RpbmN0U2VsZWN0b3IiLCJhZ2dyZWdhdG9yQ2hlY2tzIiwibWV0YXMiLCJmaW5kVmlld01ldGFkYXRhIiwidmlld05hbWUiLCJnZW5lcmF0ZVZpZXdOYW1lIiwiZGRvYyIsImdlbmVyYXRlRGVzaWduRG9jTmFtZSIsInJldHVybkRvY3MiLCJ2aWV3IiwiZ2V0RmFicmljQWRhcHRlciIsImlzVmlld0FnZ3JlZ2F0ZSIsImhhbmRsZUF2ZXJhZ2UiLCJmYWJyaWNBZGFwdGVyIiwidmlld0luZm8iLCJwcm9jZXNzVmlld1Jlc3BvbnNlIiwic3VtRGVzYyIsImNvdW50RGVzYyIsInN1bVJlc3BvbnNlIiwiY291bnRSZXNwb25zZSIsInN1bSIsInJvd3MiLCJyb3ciLCJGYWJyaWNDbGllbnRBZGFwdGVyIiwiQWRhcHRlciIsIm9wZXJhdGlvbiIsIm1lcmdlZEZsYWdzIiwic2lsbHkiLCJwb3AiLCJ0b092ZXJyaWRlcyIsIm5ld0N0eCIsInBhcmVudENvbnRleHQiLCJjaGlsZENvbnRleHRzIiwiY3VycmVudE9wIiwiY3VycmVudE1vZGVsIiwicmVwb3NpdG9yeSIsImNyZWF0ZVByZWZpeCIsInVwZGF0ZUFsbFByZWZpeCIsInNoaWZ0IiwiaGFzVHJhbnNpZW50IiwibmVlZHNGdWxsUGF5bG9hZCIsInNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbiIsInRyYW5zaWVudFBheWxvYWQiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJDUkVBVEVfQUxMIiwiZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInJlcyIsInNob3VsZFJlZnJlc2hBZnRlcldyaXRlIiwiUkVBRF9BTEwiLCJVUERBVEVfQUxMIiwiZGVsZXRlQWxsIiwic2hvdWxkSHlkcmF0ZSIsIkRFTEVURV9BTEwiLCJNRVRBREFUQSIsIm1pcnJvck1zcCIsIm1zcHMiLCJtZXJnZWQiLCJlbmRvcnNpbmdPcmdzIiwiZW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50IiwidiIsImNoaWxkUmVidWlsZCIsImdldEZyb21DaGlsZHJlbiIsInJlc29sdmVkT3AiLCJyZXNvbHZlT3BlcmF0aW9uIiwiaGFzSWQiLCJkaXJlY3QiLCJkZXNlcmlhbGl6ZWQiLCJ1cGRhdGVQcmVmaXgiLCJVUERBVEUiLCJERUxFVEUiLCJkb2NzT25seSIsInRyYW5zYWN0aW9uUmVzdWx0IiwicGFyc2VSZWNvcmQiLCJpc01vZGVsIiwiZWwiLCJnZXRDbGllbnQiLCJfY2xpZW50IiwiR2F0ZXdheSIsImdldEdhdGV3YXkiLCJnZXRDb250cmFjdE5hbWUiLCJDb250cmFjdCIsImNvbnRyYWN0TmFtZSIsImdldENvbnRyYWN0IiwidHJhbnNhY3Rpb24iLCJhcGkiLCJzdWJtaXQiLCJ0cmFuc2llbnREYXRhIiwiZ2F0ZXdheSIsImNvbnRyYWN0IiwiZXZhbHVhdGUiLCJwcm9wb3NhbE9wdGlvbnMiLCJhcmd1bWVudHMiLCJjbG9zZSIsInNob3VsZFVzZUxlZ2FjeUdhdGV3YXkiLCJwcmVwYXJlTGVnYWN5QXJncyIsImJ1aWxkTGVnYWN5VHJhbnNpZW50IiwicmVzb2x2ZUxlZ2FjeU1zcENvdW50IiwiY29uZmlndXJlZCIsImxlZ2FjeU1zcENvdW50IiwiaXNGaW5pdGUiLCJmbG9vciIsInBpY2tMZWdhY3lDYW5kaWRhdGVzIiwiY2FuZGlkYXRlcyIsImF2YWlsYWJsZSIsInBpY2tlZCIsImlkeCIsInJhbmRvbSIsInNlbGVjdGlvbiIsInNwbGljZSIsImJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MiLCJwZWVycyIsInBlZXJFbmRwb2ludCIsInBlZXJIb3N0QWxpYXMiLCJ0bHNDZXJ0IiwiZW5kb3JzZXJzIiwib3JnIiwiZXh0cmFzIiwibXNwTWFwIiwibGVnYWN5Q291bnQiLCJzZWxlY3Rpb25zIiwiY2hvaWNlIiwiZW5kcG9pbnQiLCJzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMiLCJmY24iLCJ0cmFuc2llbnRNYXAiLCJwZWVyQ29uZmlncyIsIm5vcm1hbGl6ZUxlZ2FjeVBlZXJzIiwiaWRlbnRpdHlNYXRlcmlhbCIsInJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsIiwid2FsbGV0IiwiV2FsbGV0cyIsIm5ld0luTWVtb3J5V2FsbGV0IiwiaWRlbnRpdHlMYWJlbCIsImNvbm5lY3Rpb25Qcm9maWxlIiwiYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZSIsIkxlZ2FjeUdhdGV3YXkiLCJjb25uZWN0IiwiZGlzY292ZXJ5IiwiZW5hYmxlZCIsImFzTG9jYWxob3N0Iiwic2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0IiwidGxzSW5mbyIsIm5ldHdvcmsiLCJnZXROZXR3b3JrIiwiY2hhbm5lbCIsImNoYWluY29kZU5hbWUiLCJjcmVhdGVUcmFuc2FjdGlvbiIsInNldFRyYW5zaWVudCIsInBlZXIiLCJnZXRDaGFubmVsIiwiZ2V0RW5kb3JzZXIiLCJlbmRvcnNlciIsInNldEVuZG9yc2luZ1BlZXJzIiwiZGlzY29ubmVjdCIsImRlZHVwZWQiLCJNYXAiLCJhZGRQZWVyIiwiaGFzIiwicmVhZFBlbUlucHV0IiwiY2VydENlcnRPckRpcmVjdG9yeVBhdGgiLCJrZXlDZXJ0T3JEaXJlY3RvcnlQYXRoIiwicGVlckVudHJpZXMiLCJjaGFubmVsUGVlcnMiLCJvcmdzIiwidGxzUGVtIiwiaG9zdG5hbWUiLCJleHRyYWN0SG9zdCIsImVuc3VyZUdycGNVcmwiLCJ0bHNDQUNlcnRzIiwiZ3JwY09wdGlvbnMiLCJob3N0bmFtZU92ZXJyaWRlIiwiZW5kb3JzaW5nUGVlciIsImNoYWluY29kZVF1ZXJ5IiwibGVkZ2VyUXVlcnkiLCJldmVudFNvdXJjZSIsIm9yZ2FuaXphdGlvbiIsIm9yZ2FuaXphdGlvbnMiLCJvcmRlcmVycyIsImNoYW5uZWxzIiwiZXZlcnkiLCJpc0xvY2FsRW5kcG9pbnQiLCJob3N0Iiwic2FuaXRpemVkIiwiaXNCdWZmZXIiLCJ0cmltbWVkIiwic3RhdHMiLCJzdGF0IiwiY2F0Y2giLCJpc0RpcmVjdG9yeSIsInJlYWRGc0ZpbGUiLCJlcnIiLCJsZWdhY3lBcmdzIiwic2h1dGRvd24iLCJjaGFubmVsTmFtZSIsImdldENvbm5lY3Rpb24iLCJwYXRoT3JDZXJ0IiwicmVhZEZpbGVTeW5jIiwidGxzQ3JlZGVudGlhbHMiLCJncnBjIiwiY3JlYXRlU3NsIiwic2l6ZUxpbWl0Iiwic2lnbmVyIiwiZXZhbHVhdGVPcHRpb25zIiwiZGVhZGxpbmUiLCJlbmRvcnNlT3B0aW9ucyIsInN1Ym1pdE9wdGlvbnMiLCJjb21taXRTdGF0dXNPcHRpb25zIiwiUHJveHkiLCJ0aGlzQXJnIiwiYXJnQXJyYXkiLCJSZWZsZWN0IiwiRGlzcGF0Y2giLCJHYXRld2F5RXJyb3IiLCJkZXRhaWxzIiwiRW5kb3JzZUVycm9yIiwiQmFkUmVxdWVzdEVycm9yIiwiUGFnaW5nRXJyb3IiLCJNaWdyYXRpb25FcnJvciIsIk9ic2VydmVyRXJyb3IiLCJGb3JiaWRkZW5FcnJvciIsIkNvbm5lY3Rpb25FcnJvciIsImZpbmFsIiwiRCIsIl9hIiwiZGVjb3JhdGlvbiIsInNldEN1cnJlbnQiLCJGYWJyaWNDbGllbnREaXNwYXRjaCIsImxvZ2dlZEFyZ3MiLCJTSFVURE9XTiIsImxpc3RlbmluZ1N0YWNrIiwicGFyc2VQYXlsb2FkIiwianNvbkJ5dGVzIiwianNvbiIsIm9ic2VydmUiLCJvYnNlcnZlciIsInVuT2JzZXJ2ZSIsInJlZnJlc2giLCJoYW5kbGVFdmVudHMiLCJjdHhBcmciLCJjb3JyZWxhdGlvbklkIiwiZXZ0IiwiZXZlbnROYW1lIiwibXNwRXZlbnRPbmx5IiwidGFyZ2V0TW9kZWwiLCJtb2RlbFJlZiIsIm9ic2VydmVyQXJncyIsImdldENoYWluY29kZUV2ZW50cyIsInRvV3JhcCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJidWxrVG9TaW5nbGUiLCJyZXN1bHRBcmdzIiwiVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSIsInJlZ2lzdGVyTGlicmFyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQVdBLFNBQVNBLHlCQUF5QkM7UUFFaEMsTUFBTUMsS0FBS0MsUUFBUTtRQUVuQixNQUFNQyxPQUFPRCxRQUFRO1FBQ3JCLE1BQU1FLFVBQWtCRCxLQUFLQyxRQUFRSjtRQUNyQyxJQUFJQyxHQUFHSSxXQUFXRCxVQUFVO1lBQzFCLE9BQU87QUFDVDtRQUNBTCx5QkFBeUJLO1FBQ3pCSCxHQUFHSyxVQUFVRjtBQUNmO0lBRU0sU0FBVUcscUJBQ2RDO1FBRUEsT0FBT0MsV0FBQUEsZ0JBQWdCLEVBQUNEO0FBQzFCO0lBRU0sU0FBVUUsd0JBQ2RGLEdBQ0FHO1FBRUEsTUFBTUMsUUFBUUMsV0FBQUEsY0FBYyxFQUFDTDtRQUM3QixNQUFNTSxVQUE0Q0gsU0FBUyxDQUFBO1FBQzNEQyxNQUFNRyxRQUFTQztZQUNiRixRQUFRRSxJQUFJQyxPQUFPRDs7UUFFckIsT0FBT0o7QUFDVDtJQUVNLFNBQVVNLGNBQWNDO1FBRTVCLE1BQU1oQixPQUFPRCxRQUFRO1FBRXJCLE1BQU1rQixZQUFV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
3790
+ //# 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+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcblxuICBjb25zdCBhbGxvd0dlbmVyYXRpb25PdmVycmlkZSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlO1xuXG4gIGNvbnN0IGNyZWF0b3IgPSBhd2FpdCBzdHViLmdldENyZWF0b3IoKTtcbiAgbGV0IG93bmVyID0gY3JlYXRvci5tc3BpZDtcbiAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICBgRXhwZWN0ZWQgbXNwaWQgdG8gYmUgJHttb2RlbFtrZXldfSB8ICR7b3duZXJ9LiBcXG4gVXNpbmcgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGU6ICR7YWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGV9YFxuICApO1xuXG4gIGlmIChhbGxvd0dlbmVyYXRpb25PdmVycmlkZSkgb3duZXIgPSBtb2RlbFtrZXldID8gbW9kZWxba2V5XSA6IG93bmVyO1xuXG4gIGNvbnN0IHNldE93bmVkQnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgc2V0T3duZWRCeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBvd25lcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBnZW5lcmF0ZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUob3duZWRCeU9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb3duZWRCeSxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2FjdGlvbklkT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuICBtb2RlbFtrZXldID0gc3R1Yi5nZXRUeElEKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICByZWFkb25seSgpLFxuICAgICAgICBvbkNyZWF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBvblVwZGF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoXG4gICAgICAgICAgTWV0YWRhdGEua2V5KFxuICAgICAgICAgICAgRmFicmljTW9kZWxLZXlzLkZBQlJJQyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRFxuICAgICAgICAgICksXG4gICAgICAgICAgYXR0cmlidXRlXG4gICAgICAgIClcbiAgICAgICkob2JqLCBhdHRyaWJ1dGUpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlRSQU5TQUNUSU9OX0lEKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB0cmFuc2FjdGlvbklkLFxuICAgICAgYXJnczogW10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgTWlycm9yQ29uZGl0aW9uID0gKG1zcDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uO1xuICByZXNvbHZlcjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nO1xuICBtc3BJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV2YWxNaXJyb3JNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgcmVzb2x2ZXI6IHVuZGVmaW5lZCB8IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgY3R4OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+XG4pIHtcbiAgbGV0IGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlc29sdmVyO1xuICBpZiAodHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3duZXIgPVxuICAgICAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fCBjdHguZ2V0KFwic3R1YlwiKS5nZXRDcmVhdG9yKCkudG9TdHJpbmcoKTtcbiAgICAgIGlmIChyZXNvbHZlciAmJiB0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgY29sbGVjdGlvbiA9IGF3YWl0IHJlc29sdmVyKG1vZGVsLCBvd25lciwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgY29sbGVjdGlvbiBtaXJyb3IgbmFtZTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29sbGVjdGlvbiB8fCB0eXBlb2YgY29sbGVjdGlvbiAhPT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBObyBjb2xsZWN0aW9uIGZvdW5kIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcbiAgcmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgLy8gUHV0IG1pcnJvciBmbGFncyBkaXJlY3RseSBvbiBjb250ZXh0IHNvIGFkYXB0ZXIucHJlcGFyZSgpIGFuZCBhZGFwdGVyLmNyZWF0ZSgpIGNhbiBzZWUgdGhlbVxuICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLm92ZXJyaWRlKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKHRoaXMgYXMgYW55KS5fb3ZlcnJpZGVzLCB7XG4gICAgICAgIG1pcnJvcjogdHJ1ZSxcbiAgICAgICAgbWlycm9yQ29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGNvbnN0IG1pcnJvciA9IGF3YWl0IHJlcG8uY3JlYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGNyZWF0ZWQgd2l0aCAke01vZGVsLnBrKG1vZGVsKSBhcyBzdHJpbmd9OiAke21pcnJvcltNb2RlbC5wayhtb2RlbCldfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENsZWFuIHVwIG1pcnJvciBmbGFncyBmcm9tIGNvbnRleHRcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgICBhcHBseVVwZGF0ZVZhbGlkYXRpb246IGZhbHNlLFxuICAgICAgICBtZXJnZUZvclVwZGF0ZTogZmFsc2UsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGF3YWl0IHJlcG8udXBkYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHVwZGF0ZWQ6ICR7KG1vZGVsIGFzIGFueSlbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHBrUHJvcCA9IE1vZGVsLnBrKG1vZGVsKSBhcyBrZXlvZiBNO1xuICAgIGNvbnN0IGlkID0gbW9kZWxbcGtQcm9wXTtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBzZWdyZWdhdGVkOiBjb2xsZWN0aW9uLFxuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVwby5kZWxldGUoaWQgYXMgYW55LCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1heSBhbHJlYWR5IGJlIGRlbGV0ZWQgYnkgYWRhcHRlci5kZWxldGVTZWdyZWdhdGVkQ29sbGVjdGlvbnNcbiAgICB9XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBkZWxldGVkOiAke1N0cmluZyhpZCl9YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwic2VncmVnYXRlZFwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWlycm9yV3JpdGVHdWFyZDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAga2V5OiBrZXlvZiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgaWYgKG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSkpIHtcbiAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgYE9yZ2FuaXphdGlvbiAke21zcH0gaXMgbm90IGF1dGhvcml6ZWQgdG8gbW9kaWZ5IG1pcnJvcmVkIGRhdGFgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcblxuICBpZiAoIW1zcCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3QgbWF0Y2hlcyA9IG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciByZWFkOiBNU1AgJHttc3B9IG1hdGNoZXMsIHJvdXRpbmcgcmVhZHMgdG8gbWlycm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9ufWBcbiAgICApO1xuICAgIC8vIFJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvciBjb2xsZWN0aW9uXG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xuICB9XG4gIC8vIFdoZW4gTVNQIGRvZXMgTk9UIG1hdGNoLCBub3JtYWwgcmVhZCBmbG93IOKAlCBhbGwgZGF0YSBpcyBpbiBwdWJsaWMgc3RhdGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvcihcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nLFxuICBtc3BJZE9yQ29uZGl0aW9uPzogc3RyaW5nIHwgTWlycm9yQ29uZGl0aW9uLFxuICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbikge1xuICBjb25zdCBpc0NvbmRpdGlvbk9ubHkgPVxuICAgIHR5cGVvZiBtc3BJZE9yQ29uZGl0aW9uICE9PSBcInN0cmluZ1wiICYmIEJvb2xlYW4obXNwSWRPckNvbmRpdGlvbik7XG4gIGNvbnN0IG1zcElkID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IChtc3BJZE9yQ29uZGl0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbmQgPSBpc0NvbmRpdGlvbk9ubHlcbiAgICA/IChtc3BJZE9yQ29uZGl0aW9uIGFzIE1pcnJvckNvbmRpdGlvbilcbiAgICA6IGNvbmRpdGlvbjtcblxuICBmdW5jdGlvbiBtaXJyb3IoXG4gICAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvblxuICApIHtcbiAgICBjb25zdCBtZXRhOiBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uLFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgcmVzb2x2ZXI6IHJlc29sdmVyLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgbWV0YWRhdGEoXG4gICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKSxcbiAgICAgICAgbWV0YVxuICAgICAgKSxcbiAgICAgIC8vIFJlYWQgaGFuZGxlciBydW5zIGVhcmx5IChwcmlvcml0eSAzMCkgdG8gc2V0IHVwIGNvbnRleHQgYmVmb3JlIGFueSByZWFkc1xuICAgICAgb25SZWFkKHJlYWRNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMzAgfSksXG4gICAgICAvLyBXcml0ZSBndWFyZHMg4oCUIHJlamVjdCBtYXRjaGluZyBNU1BzIGJlZm9yZSBhbnkgcHJvY2Vzc2luZ1xuICAgICAgb25DcmVhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25VcGRhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25EZWxldGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgLy8gTWlycm9yIHN5bmMgaGFuZGxlcnMg4oCUIHdyaXRlIGZ1bGwgbW9kZWwgYWZ0ZXIgb3RoZXIgaGFuZGxlcnMgKHByaW9yaXR5IDEwMClcbiAgICAgIG9uQ3JlYXRlKGNyZWF0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSksXG4gICAgICBvblVwZGF0ZSh1cGRhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25EZWxldGUoZGVsZXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWlycm9yLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb24sIG1zcElkLCBjb25kXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwPzogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBNb2RlbENvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgY29uc3QgY29uc3RyID0gdHlwZW9mIG1vZGVsID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbCA6IG1vZGVsLmNvbnN0cnVjdG9yO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHtjb25zdHIubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYCR7dG9QYXNjYWxDYXNlKGNvbnN0ci5uYW1lKX0ke29yZ05hbWUgPyB0b1Bhc2NhbENhc2Uob3JnTmFtZSkgOiBcIlwifWA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTmFtZXNwYWNlQ29sbGVjdGlvbihuYW1lc3BhY2U6IHN0cmluZyk6IENvbGxlY3Rpb25SZXNvbHZlciB7XG4gIHJldHVybiA8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LCBtc3BJZD86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG9yZ05hbWUgPVxuICAgICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIW9yZ05hbWUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgICApO1xuICAgIHJldHVybiBgJHtuYW1lc3BhY2V9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkPzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3Qgb3JnTmFtZSA9XG4gICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICk7XG4gIHJldHVybiBgX18ke3RvUGFzY2FsQ2FzZShvcmdOYW1lKX1Qcml2YXRlQ29sbGVjdGlvbmA7XG59O1xuXG5leHBvcnQgdHlwZSBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhID0ge1xuICBjb2xsZWN0aW9uczogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpb3JpdHkgZm9yIGVhcmx5IGNvbGxlY3Rpb24gZXh0cmFjdGlvbiAoYmVmb3JlIHBrIGdlbmVyYXRpb24gYXQgcHJpb3JpdHkgNjApXG4gKiBAc3VtbWFyeSBUaGlzIHByaW9yaXR5IGVuc3VyZXMgY29sbGVjdGlvbnMgYXJlIHJlZ2lzdGVyZWQgaW4gY29udGV4dCBiZWZvcmUgYW55IHNlcXVlbmNlXG4gKiBvcGVyYXRpb25zIG9jY3VyLCBhbGxvd2luZyBzZXF1ZW5jZXMgdG8gYmUgcmVwbGljYXRlZCB0byBwcml2YXRlL3NoYXJlZCBjb2xsZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZID0gMzU7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNlZ3JlZ2F0aW9uRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IE0sXG4gIGNvbGxlY3Rpb25zOiBzdHJpbmdbXSxcbiAgY3R4OiBhbnlcbikge1xuICAvLyBSZWdpc3RlciBjb2xsZWN0aW9ucyBlYXJseSB1c2luZyByZWFkRnJvbSAtIHRoaXMgYWxsb3dzIHNlcXVlbmNlIGNvZGVcbiAgLy8gdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8gZHVyaW5nIHBrIGdlbmVyYXRpb25cbiAgaWYgKGNvbGxlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAoY3R4IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbnMpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgbW9kZWwgaXMgZnVsbHkgc2VncmVnYXRlZCAoYWxsIG5vbi1wayBwcm9wZXJ0aWVzIGFyZSBwcml2YXRlL3NoYXJlZC90cmFuc2llbnQpLlxuICAvLyBVc2UgTW9kZWwuc2VncmVnYXRlKCkgd2hpY2ggaXMgdGhlIGNhbm9uaWNhbCB3YXkgdG8gZGV0ZXJtaW5lIHdoYXQncyB0cmFuc2llbnQsXG4gIC8vIHJhdGhlciB0aGFuIHJlYWRpbmcgREJLZXlzLlRSQU5TSUVOVCBtZXRhZGF0YSB3aGljaCBtYXkgbm90IGFjY3VtdWxhdGUgY29ycmVjdGx5XG4gIC8vIHdoZW4gY2xhc3MtbGV2ZWwgQHByaXZhdGVEYXRhIGFwcGxpZXMgZGVjb3JhdG9ycyBpdGVyYXRpdmVseS5cbiAgaWYgKCFjdHguaXNGdWxseVNlZ3JlZ2F0ZWQgJiYgY29sbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgaWYgKCFoYXNQdWJsaWNQcm9wZXJ0aWVzKGNsYXp6LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSkge1xuICAgICAgY3R4Lm1hcmtGdWxseVNlZ3JlZ2F0ZWQoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5TWlycm9yRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtc3A6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHRcbikge1xuICBpZiAoIW1zcCkgcmV0dXJuO1xuICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChjbGF6eik7XG4gIGlmICghbWlycm9yTWV0YSkgcmV0dXJuO1xuICBjb25zdCBtYXRjaGVzID1cbiAgICBtc3AgPT09IG1pcnJvck1ldGEubXNwSWQgfHxcbiAgICAobWlycm9yTWV0YS5jb25kaXRpb24gJiYgbWlycm9yTWV0YS5jb25kaXRpb24obXNwKSk7XG4gIGlmICghbWF0Y2hlcykgcmV0dXJuO1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKFxuICAgIG5ldyBjbGF6eigpLFxuICAgIG1pcnJvck1ldGEucmVzb2x2ZXIsXG4gICAgY3R4XG4gICk7XG4gIC8vIE1pcnJvciBNU1AgbWF0Y2hlcyDigJQgcm91dGUgcmVhZHMgZXhjbHVzaXZlbHkgdGhyb3VnaCB0aGUgbWlycm9yXG4gIC8vIGNvbGxlY3Rpb24uIENsZWFyIGFueSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY29sbGVjdGlvbnMgc28gcXVlcmllc1xuICAvLyBnbyBPTkxZIHRvIHRoZSBtaXJyb3IsIG5vdCB0byB0aGUgcmVndWxhciBwcml2YXRlL3NoYXJlZCBvbmVzLlxuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFwiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFN0YWNrXCIsIHVuZGVmaW5lZCk7XG4gIGN0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gIGN0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGN0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gaGFzUHVibGljUHJvcGVydGllczxNIGV4dGVuZHMgTW9kZWw+KGNsYXp6OiBDb25zdHJ1Y3RvcjxNPik6IGJvb2xlYW4ge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyhjbGF6eikgfHwgW107XG4gIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICBjb25zdCB0cmFuc2llbnRNZXRhID0gTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gIGNvbnN0IHByaXZhdGVNZXRhID1cbiAgICBNZXRhZGF0YS5nZXQoY2xhenogYXMgYW55LCBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpKSB8fCB7fTtcbiAgY29uc3Qgc2hhcmVkTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpKSB8fCB7fTtcblxuICByZXR1cm4gYXR0cmlidXRlcy5zb21lKChhdHRyKSA9PiB7XG4gICAgaWYgKGF0dHIgPT09IHBrKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gdHJhbnNpZW50TWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHByaXZhdGVNZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gc2hhcmVkTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRWFybHkgaGFuZGxlciB0byBleHRyYWN0IGFuZCByZWdpc3RlciBjb2xsZWN0aW9ucyBpbiBjb250ZXh0XG4gKiBAc3VtbWFyeSBSdW5zIHdpdGggcHJpb3JpdHkgPCA0MCB0byBleHRyYWN0IGNvbGxlY3Rpb24gbmFtZXMgYmVmb3JlIHBrIGdlbmVyYXRpb24gKHByaW9yaXR5IDYwKS5cbiAqIFRoaXMgYWxsb3dzIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8uXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnRleHRPZjxSZXBvc2l0b3J5PE0sIGFueT4+fSBjb250ZXh0IC0gVGhlIGV4ZWN1dGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ge1NlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW119IGRhdGEgLSBUaGUgc2VncmVnYXRlZCBkYXRhIG1ldGFkYXRhXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBrZXlzIC0gVGhlIHByb3BlcnR5IGtleShzKSBiZWluZyBzZWdyZWdhdGVkXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgcGVyLXNlcXVlbmNlIHNvIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgY2FuIGRlY2lkZVxuICAvLyB3aGVyZSB0byBzdG9yZS9yZXBsaWNhdGUgc2VxdWVuY2UgcmVjb3JkcyAocHVibGljIHZzIHByaXZhdGUvc2hhcmVkKS5cbiAgLy9cbiAgLy8gLSBgQHBrKClgIHNlcXVlbmNlcyB1c2UgdGhlIHNoYXJlZCBuYW1lIGAke3RhYmxlfV9wa2AgKG5vIGlkIGNvbXBvbmVudCkuXG4gIC8vIC0gYEBzZXF1ZW5jZSgpYCAvIHBlcnNpc3RlbnQgYEB2ZXJzaW9uKHRydWUpYCBzZXF1ZW5jZXMgYXJlIHBlci1tb2RlbC1pbnN0YW5jZTpcbiAgLy8gICBgJHt0YWJsZX1fJHtpZH1fJHtwcm9wZXJ0eX1gLlxuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSBhcyBrZXlvZiBNO1xuICBjb25zdCBwa1NlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG5cbiAgY29uc3QgaWRWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3BrS2V5IGFzIGFueV07XG4gIGNvbnN0IGNhbkJ1aWxkUGVySW5zdGFuY2UgPVxuICAgIHR5cGVvZiBpZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIGlkVmFsdWUgIT09IG51bGw7XG5cbiAgLy8gQWx3YXlzIHVuaW9uIGNvbGxlY3Rpb25zIGZvciB0aGUgcGsgc2VxdWVuY2Ugd2hlbiB0aGUgbW9kZWwgdXNlcyBzZWdyZWdhdGVkIGRhdGEuXG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBwa1NlcU5hbWUsXG4gICAgKGNvbnRleHQgYXMgYW55KS5pc0Z1bGx5U2VncmVnYXRlZCxcbiAgICBjb2xsZWN0aW9uc1xuICApO1xuXG4gIC8vIEZvciBwZXItcHJvcGVydHkgc2VxdWVuY2VzLCBvbmx5IHJlZ2lzdGVyIHdoZW4gd2UgY2FuIGNvbXB1dGUgYW4gaWQtc2NvcGVkIG5hbWUuXG4gIC8vIFRoaXMga2VlcHMgc2VxdWVuY2VzIGNvbnN0cmFpbmVkIHRvIHRoZSBjb2xsZWN0aW9ucyB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbi5cbiAgaWYgKGNhbkJ1aWxkUGVySW5zdGFuY2UpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BTZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBTdHJpbmcoaWRWYWx1ZSksIFN0cmluZyhrKSk7XG4gICAgICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgICAgIHByb3BTZXFOYW1lLFxuICAgICAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgICAgICBjb2xsZWN0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID0gTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2VncmVnYXRlZChcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICB0eXBlOiBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSB8IEZhYnJpY01vZGVsS2V5cy5TSEFSRUQsXG4gIGZpbHRlcj86IChwcm9wTmFtZTogc3RyaW5nKSA9PiBib29sZWFuXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gTWV0YWRhdGEua2V5KHR5cGUsIHByb3BlcnR5S2V5KTtcbiAgICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBuZXcgU2V0KG1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgbWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXksIG1ldGEpO1xuXG4gICAgICBjb25zdCBjb25zdHJNZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSkgfHwge307XG4gICAgICBjb25zdCBjb25zdHJDb2xsZWN0aW9ucyA9IG5ldyBTZXQoY29uc3RyTWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdHJDb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBjb25zdHJNZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbnN0ckNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUsIGNvbnN0ck1ldGEpO1xuXG4gICAgICBjb25zdCB0cmFuc2llbnRNZXRhID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVHJhbnNpZW50TWV0YSA9IHtcbiAgICAgICAgLi4udHJhbnNpZW50TWV0YSxcbiAgICAgICAgW3Byb3BlcnR5S2V5IGFzIGFueV06IHt9LFxuICAgICAgfTtcbiAgICAgIE1ldGFkYXRhLnNldChcbiAgICAgICAgY29uc3RyIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBEQktleXMuVFJBTlNJRU5ULFxuICAgICAgICB1cGRhdGVkVHJhbnNpZW50TWV0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNzOiBhbnlbXSA9IFtdO1xuICAgIGlmICghcHJvcGVydHlLZXkpIHtcbiAgICAgIC8vIGRlY29yYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICBwcm9wZXJ0aWVzPy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihwKSkge1xuICAgICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkoKHRhcmdldCBhcyBhbnkpLnByb3RvdHlwZSwgcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JvdXBOYW1lID1cbiAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCIgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgLy8gVXNlIGRpZmZlcmVudCBncm91cCBuYW1lcyBmb3IgZXh0cmFjdGlvbiB2cyBkYXRhIGhhbmRsZXJzIHRvIHByZXZlbnQgbWVyZ2luZ1xuICAgICAgY29uc3QgZXh0cmFjdEdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZXh0cmFjdGA7XG4gICAgICBjb25zdCBkYXRhR3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpkYXRhYDtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbk1ldGEgPSB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH07XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQgPSB7XG4gICAgICAgIHByaW9yaXR5OiBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSxcbiAgICAgICAgZ3JvdXA6IGV4dHJhY3RHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgZGVjcy5wdXNoKFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICAvLyBFYXJseSBleHRyYWN0aW9uIGhhbmRsZXJzIC0gcnVuIEJFRk9SRSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgZm9yIHNlcXVlbmNlIHJlcGxpY2F0aW9uXG4gICAgICAgIC8vIFdlIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBleHBsaWNpdGx5IHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxlciBsb29rdXBcbiAgICAgICAgb24oXG4gICAgICAgICAgREJPcGVyYXRpb25zLkFMTCxcbiAgICAgICAgICBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIGFzIGFueSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25NZXRhLFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydFxuICAgICAgICApLFxuICAgICAgICAvLyBNYWluIGhhbmRsZXJzIGZvciBzZWdyZWdhdGVkIGRhdGEgb3BlcmF0aW9ucyAocHJpb3JpdHkgOTUpXG4gICAgICAgIG9uQ3JlYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUsXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25SZWFkKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25SZWFkIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblVwZGF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvbkRlbGV0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjcykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRGF0YShcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyID0gSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvblxuKSB7XG4gIGZ1bmN0aW9uIHByaXZhdGVEYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuUFJJVkFURSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcHJpdmF0ZURhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gIGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlNIQVJFRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogc2hhcmVkRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzb3J0cyBvYmplY3Qga2V5cyB3aXRob3V0IHJlb3JkZXJpbmcgYXJyYXlzXG4gKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIHZhbHVlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge2FueX0gQSBjb3B5IHdpdGggc29ydGVkIG9iamVjdCBrZXlzIGJ1dCBwcmVzZXJ2ZWQgYXJyYXkgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoc29ydEtleXNPbmx5UmVjdXJzaXZlKTtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSByZXR1cm4gb2JqO1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5zb3J0KClcbiAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqW2tleV0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluaXN0aWMgSlNPTiBzZXJpYWxpemVyIGZvciBGYWJyaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHN0YWJsZSwgZGV0ZXJtaW5pc3RpYyBKU09OIG91dHB1dCBieSBzb3J0aW5nIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzdHJpbmdpZmljYXRpb24sIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgRmFicmljIGVuZG9yc2VtZW50IGFuZCBoYXNoaW5nLiBFeHRlbmRzIEpTT05TZXJpYWxpemVyIHRvIHBsdWcgaW50byBleGlzdGluZyBEZWNhZiBtb2RlbCBzZXJpYWxpemF0aW9uIGZsb3cuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBEZWNhZiBNb2RlbCBzdWJ0eXBlIHNlcmlhbGl6ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqIEBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8TXlNb2RlbD4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCk7XG4gKiBjb25zdCByZWJ1aWx0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqc29uKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiAgIENhbGxlci0+PkRTOiBzZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogc29ydC1rZXlzLXJlY3Vyc2l2ZVxuICogICBEUy0+PkRTOiBqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXG4gKiAgIERTLS0+PkNhbGxlcjogc3RyaW5nXG4gKiAgIENhbGxlci0+PkRTOiBkZXNlcmlhbGl6ZShzdHJpbmcpXG4gKiAgIERTLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0pIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IHByZVNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IERldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcCgobykgPT4gcHJlU2VyaWFsaXplLmNhbGwoc2VsZiwgbykpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplLmNhbGwodGhpcywgb2JqKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplKHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZSBhIG1vZGVsIGludG8gYSBkZXRlcm1pbmlzdGljIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB3aXRoIHByZVNlcmlhbGl6ZSwgc29ydHMga2V5cyByZWN1cnNpdmVseSwgYW5kIHN0cmluZ2lmaWVzIGRldGVybWluaXN0aWNhbGx5IGZvciBzdGFibGUgb3JkZXJpbmdcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZXRlcm1pbmlzdGljIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgRmFicmljIGV2ZW50IG5hbWUgZnJvbSBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IG5hbWUgYnkgam9pbmluZyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lciB3aXRoIHVuZGVyc2NvcmVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJdIC0gT3B0aW9uYWwgb3duZXIgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGV2ZW50IG5hbWUgaW4gZm9ybWF0IFwidGFibGVfZXZlbnRcIiBvciBcInRhYmxlX2V2ZW50X293bmVyXCJcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICBvd25lcj86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0YWJsZSwgZXZlbnRdO1xuICBpZiAob3duZXIpIHBhcmFtcy5wdXNoKG93bmVyKTtcbiAgcmV0dXJuIHBhcmFtcy5qb2luKFwiX1wiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgRmFicmljIGV2ZW50IG5hbWUgaW50byBpdHMgY29tcG9uZW50c1xuICogQHN1bW1hcnkgU3BsaXRzIGFuIGV2ZW50IG5hbWUgYnkgdW5kZXJzY29yZXMgYW5kIGV4dHJhY3RzIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHt7dGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsIG93bmVyOiBzdHJpbmd9fSBUaGUgcGFyc2VkIGNvbXBvbmVudHMgYXMgYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGV2ZW50IG5hbWUgZm9ybWF0IGlzIGludmFsaWRcbiAqIEBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIHBhcnNlRXZlbnROYW1lXG4gKiAgIENhbGxlci0+PlBhcnNlcjogcGFyc2VFdmVudE5hbWUobmFtZSlcbiAqICAgUGFyc2VyLT4+UGFyc2VyOiBzcGxpdCBuYW1lIGJ5IFwiX1wiXG4gKiAgIGFsdCBwYXJ0cyBsZW5ndGggaW52YWxpZFxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgZWxzZVxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHsgdGFibGUsIGV2ZW50LCBvd25lcj8gfVxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHtcbiAgdGFibGU/OiBzdHJpbmc7XG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICBvd25lcj86IHN0cmluZztcbn0ge1xuICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoXCJfXCIpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuICAgIHJldHVybiB7IHRhYmxlOiB1bmRlZmluZWQsIGV2ZW50OiBuYW1lLCBvd25lcjogdW5kZWZpbmVkIH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHBhcnRzWzBdLFxuICAgIGV2ZW50OiBwYXJ0c1sxXSxcbiAgICBvd25lcjogcGFydHNbMl0sXG4gIH0gYXMge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gICAgb3duZXI/OiBzdHJpbmc7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgc29ydEtleXNPbmx5UmVjdXJzaXZlIH0gZnJvbSBcIi4vRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgdGFibGVOYW1lPzogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIC8vIGNvbnN0IGNsYXNzTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAvLyBpZiAoIWNsYXNzTmFtZSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuXG4gICAgLy8gLy8gdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWQgdmFsdWVzXG4gICAgLy8gY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gLy8gUG9wdWxhdGUgTW9kZWxcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREZXNlYWxpemF0aW9uID0gT2JqZWN0LmtleXMobW9kZWwpLnJlZHVjZShcbiAgICAvLyAgIChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgLy8gICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAvLyAgICAgICBkZXNlcmlhbGl6YXRpb25bUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgIC8vICAgICByZXR1cm4gYWNjdW07XG4gICAgLy8gICB9LFxuICAgIC8vICAgbW9kZWxcbiAgICAvLyApO1xuXG4gICAgLy8gY29uc3QgcmVzdWx0ID0gTW9kZWwuYnVpbGQoXG4gICAgLy8gICBwcm9jZXNzZWREZXNlYWxpemF0aW9uLFxuICAgIC8vICAgY2xhc3NOYW1lXG4gICAgLy8gKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZXNlcmlhbGl6YXRpb247XG4gIH1cblxuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvciA9IHRydWUpOiBzdHJpbmcge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgY29uc3QgcHJlU2VyaWFsaXphdGlvbiA9IHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBwdXRBbmNob3IpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHByZVNlcmlhbGl6YXRpb24pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwdXRBbmNob3IpXG4gICAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChwcmVTZXJpYWxpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUuY2FsbCh0aGlzLCB0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENsaWVudEJhc2VkU2VydmljZSxcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IEZhYnJpY0NBU2VydmljZXMsIHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJQXR0cmlidXRlUmVxdWVzdCxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElJZGVudGl0eVJlcXVlc3QsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElSZXZva2VSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMsIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcIi4vRmFicmljRW5yb2xsbWVudFNlcnZpY2VcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNJZGVudGl0eVNlcnZpY2UgZXh0ZW5kcyBDbGllbnRCYXNlZFNlcnZpY2U8XG4gIEZhYnJpY0NBU2VydmljZXMsXG4gIENBQ29uZmlnXG4+IHtcbiAgcHJvdGVjdGVkIF91c2VyITogVXNlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByb290Q2xpZW50KCk6IHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfSB7XG4gICAgcmV0dXJuICh0aGlzLmNsaWVudCBhcyBhbnkpW1wiX0ZhYnJpY0NhU2VydmljZXNcIl0gYXMgYW55O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1c2VyKCk6IFVzZXIge1xuICAgIGlmICghdGhpcy5fdXNlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIkZhYnJpYyBpZGVudGl0eSBzZXJ2aWNlIG5vdCBwcm9wZXJseSBzZXR1cDogbWlzc2luZyB1c2VyXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNlcnRpZmljYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q2xpZW50Lm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhZmZpbGlhdGlvbnMoKTogQWZmaWxpYXRpb25TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlkZW50aXRpZXMoKTogSWRlbnRpdHlTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihjZmc6IENBQ29uZmlnLCBjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldFVzZXIpO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gY2ZnO1xuXG4gICAgbG9nLmluZm8oYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogQ0FDb25maWc7IGNsaWVudDogRmFicmljQ0FTZXJ2aWNlcyB9PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLklOSVRJQUxJWkFUSU9OLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgW2NvbmZpZ10gPSBhcmdzO1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgRmFicmljIENBIGNvbmZpZ3VyYXRpb25cIik7XG5cbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IGNvbmZpZztcbiAgICBsb2cuaW5mbyhgSW5pdGlhbGl6aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjb25maWcuY2FOYW1lfSBhdCAke2NvbmZpZy51cmx9YCk7XG4gICAgY29uc3QgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG5cbiAgICBsb2cuZGVidWcoYENBIENlcnRpZmljYXRlOiAke2NlcnRpZmljYXRlLnRvU3RyaW5nKCl9YCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKGNvbmZpZywgY3R4KTtcbiAgICBsb2cuZGVidWcoYENBIHVzZXIgbG9hZGVkOiAke3VzZXIuZ2V0TmFtZSgpfWApO1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBjbGllbnQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55Pik6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCB8IE1BUCxcbiAgICBkb01hcDogTUFQID0gdHJ1ZSBhcyBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT4ge1xuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYXJncyA9IFtyZXF1ZXN0XTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBkb01hcCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvTWFwICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgYXJncyA9IFtkb01hcCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiwgLi4uYXJnc107XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5nZXRDZXJ0aWZpY2F0ZXNcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgdGhpcy5jZXJ0aWZpY2F0ZXMuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHRoaXMudXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5jZXJ0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZVxuICAgICkgYXMgTUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW107XG4gIH1cblxuICBhc3luYyBnZXRJZGVudGl0aWVzKGN0eDogQ29udGV4dCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0QWxsKHRoaXMudXNlcikpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmlkZW50aXRpZXMpO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmFmZmlsaWF0aW9ucy5nZXRBbGwodGhpcy51c2VyKSkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnNgKTtcbiAgICBsb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8RmFicmljSWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVhZFxuICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRPbmUoZW5yb2xsbWVudElkLCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3RlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlclxuICAgICk7XG5cbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZ2lzdGVyKHByb3BzLCB0aGlzLnVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjdHg6IENvbnRleHRcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudCk7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZWdpc3RyYXRpb246IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmVucm9sbFxuICAgICk7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3Rlci1lbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJBbmRFbnJvbGxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbiwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmUtZW5yb2xsIGFuIGV4aXN0aW5nIGlkZW50aXR5IHVzaW5nIGl0cyBjdXJyZW50IGVucm9sbG1lbnQuXG4gICAqIEBzdW1tYXJ5IFJlbmV3cyB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSBieSBjYWxsaW5nIHRoZSBDQSByZWVucm9sbC5cbiAgICogQHBhcmFtIHtVc2VyfSBjdXJyZW50VXNlciAtIEFscmVhZHkgZW5yb2xsZWQgdXNlciwgbXVzdCBoYXZlIGEgc2lnbmluZyBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSByZW5ld2VkIGlkZW50aXR5IG9iamVjdCB3aXRoIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUlkZW50aXR5KFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIGlkZW50aXR5OiB7IGNlcnRpZmljYXRlOiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9LFxuICAgIGlkZW50aXR5UmVxdWVzdDogSUlkZW50aXR5UmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudXBkYXRlSWRlbnRpdHlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBSZW5ld2luZyBpZGVudGl0eSBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGluIHRoZSBDQSByZWdpc3RyeSAoYWRtaW4gb3BlcmF0aW9uKS4gVGhpcyBjaGFuZ2VzIHRoZSBcInNvdXJjZSBvZiB0cnV0aFwiLlxuICAgICAgY29uc3QgaWRlbnRpdHlTZXJ2aWNlID0gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG5cbiAgICAgIGNvbnN0IGNhVXNlcklkZW50aXR5ID0gKGF3YWl0IGlkZW50aXR5U2VydmljZS5nZXRPbmUoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgdGhpcy51c2VyXG4gICAgICApKSBhcyB7IHJlc3VsdDogeyBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdIH0gfTtcblxuICAgICAgYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLnVwZGF0ZShlbnJvbGxtZW50SWQsIGlkZW50aXR5UmVxdWVzdCwgdGhpcy51c2VyKTsgLy8gYXMgSVNlcnZpY2VSZXNwb25zZSAmIHsgcmVzdWx0OiBJSWRlbnRpdHlSZXF1ZXN0IH07XG5cbiAgICAgIC8vIFJlZW5yb2xsIGFzIHRoZSB1c2VyLiBSZXF1ZXN0IG11c3QgYmUgc2lnbmVkIHVzaW5nIHRoZSBleGlzdGluZyBjZXJ0aWZpY2F0ZS5cbiAgICAgIGNvbnN0IHJlZW5yb2xsVXNlciA9IFVzZXIuY3JlYXRlVXNlcihcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICBcIlwiLCAvLyBlbnJvbGxtZW50U2VjcmV0IG5vdCByZXF1aXJlZCBmb3IgcmVlbnJvbGxcbiAgICAgICAgdGhpcy51c2VyLmdldE1zcGlkKCksXG4gICAgICAgIGlkZW50aXR5LmNlcnRpZmljYXRlLFxuICAgICAgICBpZGVudGl0eS5wcml2YXRlS2V5XG4gICAgICApO1xuICAgICAgcmVlbnJvbGxVc2VyLnNldENyeXB0b1N1aXRlKHRoaXMudXNlci5nZXRDcnlwdG9TdWl0ZSgpKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudEF0dHJzOiBJQXR0cmlidXRlUmVxdWVzdFtdID0gKFxuICAgICAgICBjYVVzZXJJZGVudGl0eS5yZXN1bHQuYXR0cnMgfHwgW11cbiAgICAgICkubWFwKCh7IG5hbWUgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50ID0gYXdhaXQgdGhpcy5jbGllbnQucmVlbnJvbGwoXG4gICAgICAgIHJlZW5yb2xsVXNlcixcbiAgICAgICAgZW5yb2xsbWVudEF0dHJzXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZW5ld2VkSWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldm9rZSB0aGUgcHJldmlvdXMgY2VydGlmaWNhdGUgb25seSwgc28gdGhlIG9sZCBjZXJ0IGJlY29tZXMgaW52YWxpZC5cbiAgICAgIGxvZy5kZWJ1ZyhgUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGVzIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IHsgYWtpLCBzZXJpYWwgfSA9IGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGlkZW50aXR5LmNlcnRpZmljYXRlKTtcbiAgICAgIGF3YWl0IHRoaXMucmV2b2tlKGVucm9sbG1lbnRJZCwgeyBha2ksIHNlcmlhbCB9LCBhcmdzKTtcblxuICAgICAgbG9nLmRlYnVnKGBSZW5ldyBpZGVudGl0eSBzdWNjZXNzZnVsIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIHJldHVybiByZW5ld2VkSWRlbnRpdHk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmV2b2tlT3B0aW9uczogT21pdDxJUmV2b2tlUmVxdWVzdCwgXCJlbnJvbGxtZW50SURcIj4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJU2VydmljZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJldm9rZVwiLCB0cnVlKSkuZm9yKHRoaXMucmV2b2tlKTtcbiAgICBsb2cudmVyYm9zZShgUmV2b2tpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgQm9vbGVhbihyZXZva2VPcHRpb25zLnNlcmlhbCkgfHwgQm9vbGVhbihyZXZva2VPcHRpb25zLmFraSlcbiAgICAgICAgICA/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuY29uc3QgbG9nID0gbmV3IE1pbmlMb2dnZXIoXCJmYWJyaWMtZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvYWRzIGNvbnRlbnQgZnJvbSBhIGZpbGUgb3IgcmV0dXJucyB0aGUgY29udGVudCBpZiBhbHJlYWR5IGxvYWRlZFxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBjb250ZW50IG9yIGEgcGF0aCB0byBhIGZpbGUsIGFuZCBsb2FkcyB0aGUgZmlsZSBpZiBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsZVJlYWRlciAtIEZ1bmN0aW9uIHRvIHJlYWQgdGhlIGZpbGUgaWYgY29udGVudE9yUGF0aCBpcyBhIHBhdGhcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj59IFRoZSBjb250ZW50XG4gKiBAZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlKFxuICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4pIHtcbiAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgaWYgKFxuICAgIGNvbnRlbnRPclBhdGgubWF0Y2goXG4gICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgIClcbiAgKVxuICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gKiBAc3VtbWFyeSBMb2FkcyBhIGZpbGUgdXNpbmcgdGhlIE5vZGUuanMgZmlsZSBzeXN0ZW0gbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHJldHVybiB7UHJvbWlzZTxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyXG4gKiBAZnVuY3Rpb24gcmVhZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlKGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IEJ1ZmZlcikge1xuICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdXNlclxuICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSB1c2VyIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlck5hbWUgLSBUaGUgdXNlciBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJpdmF0ZUtleSAtIFRoZSBwcml2YXRlIGtleSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gVGhlIGNlcnRpZmljYXRlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCB1c2VyXG4gKiBAZnVuY3Rpb24gZ2V0Q0FVc2VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDQVVzZXIoXG4gIHVzZXJOYW1lOiBzdHJpbmcsXG4gIHByaXZhdGVLZXk6IHN0cmluZyxcbiAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgbXNwSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyPiB7XG4gIGxvZy5kZWJ1ZyhcbiAgICBgQ3JlYXRpbmcgYSBDQSAke21zcElkfSB1c2VyICR7dXNlck5hbWV9IHdpdGggY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX1gXG4gICk7XG4gIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gIGNvbnN0IGNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgY29uc3QgaW1wb3J0ZWRLZXkgPSBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoaW1wb3J0ZWRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gIHJldHVybiB1c2VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGlkZW50aXR5IGZyb20gYSBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhbiBJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpZGVudGl0eVxuICogQGZ1bmN0aW9uIGdldElkZW50aXR5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJZGVudGl0eShcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBjZXJ0UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICApKSBhcyBVaW50OEFycmF5O1xuXG4gIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBmaWxlIGZvdW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5LCBmaW5kcyB0aGUgZmlyc3QgZmlsZSwgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoam9pbihkaXJQYXRoLCBmaWxlc1swXSkpKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc2lnbmVyIGZyb20gYSBrZXkgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIHByaXZhdGUga2V5IGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYSBTaWduZXIgZm9yIEZhYnJpYyB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlEaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzaWduZXJcbiAqIEBmdW5jdGlvbiBnZXRTaWduZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGtleVBhdGgpO1xuICB9O1xuXG4gIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICBzaWduZXJGaWxlUmVhZGVyXG4gICkpIGFzIEJ1ZmZlcjtcbiAgLy8gTm9kZSBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICAvLyBwcml2YXRlS2V5ID0gY3JlYXRlUHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgLy8gLS1cblxuICAvLyB3ZWIgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcml2YXRlS2V5KTtcbiAgY29uc3QgayA9IChwcml2YXRlS2V5IGFzIGFueSlba2V5c1swXV07XG4gIC8vIC0tXG5cbiAgcmV0dXJuIHNpZ25lcnMubmV3UHJpdmF0ZUtleVNpZ25lcihrIGFzIGFueSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIFBFTSBidWZmZXJcbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgdG8gYSBDcnlwdG9LZXkgb2JqZWN0XG4gKiBAcGFyYW0ge0J1ZmZlcn0gcGVtIC0gVGhlIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPENyeXB0b0tleT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDcnlwdG9LZXlcbiAqIEBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRXh0cmFjdFByaXZhdGVLZXlcbiAqICAgcGFydGljaXBhbnQgU3VidGxlQ3J5cHRvXG4gKlxuICogICBDYWxsZXItPj5FeHRyYWN0UHJpdmF0ZUtleTogZXh0cmFjdFByaXZhdGVLZXkocGVtKVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBHZXQgU3VidGxlQ3J5cHRvIGltcGxlbWVudGF0aW9uXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IFBhcnNlIFBFTSBmb3JtYXRcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogQ29udmVydCB0byBiaW5hcnkgREVSXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+U3VidGxlQ3J5cHRvOiBpbXBvcnRLZXkocGtjczgsIGJpbmFyeURlciwgb3B0aW9ucylcbiAqICAgU3VidGxlQ3J5cHRvLS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDcnlwdG9LZXlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktLT4+Q2FsbGVyOiBDcnlwdG9LZXlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gIGNvbnN0IGxpYk5hbWUgPSBcImNyeXB0b1wiO1xuICBsZXQgc3VidGxlO1xuICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICBzdWJ0bGUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNyeXB0by5zdWJ0bGU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgc3VidGxlID0gbGliLnN1YnRsZSB8fCBsaWIud2ViY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gIGZ1bmN0aW9uIHN0cjJhYihzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RyTGVuID0gc3RyLmxlbmd0aDsgaSA8IHN0ckxlbjsgaSsrKSB7XG4gICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBjb25zdCBzdHIgPSBwZW1cbiAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIilcbiAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKTtcbiAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyRmxhZ3MsXG4gIENvbmRpdGlvbixcbiAgQ29udGV4dCxcbiAgR3JvdXBPcGVyYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBPcGVyYXRvcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgUXVlcnlDbGF1c2UsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFNlbGVjdFNlbGVjdG9yLFxuICBTZXF1ZW5jZSxcbiAgU3RhdGVtZW50LFxuICBTdGF0ZW1lbnRFeGVjdXRvcixcbiAgVmlld0tpbmQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQktleXMsXG4gIENvdWNoREJPcGVyYXRvcixcbiAgQ291Y2hEQkdyb3VwT3BlcmF0b3IsXG4gIENvdWNoREJRdWVyeUxpbWl0LFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb09wZXJhdG9yLFxuICBNYW5nb1NlbGVjdG9yLFxuICB0cmFuc2xhdGVPcGVyYXRvcnMsXG4gIGdlbmVyYXRlRGVzaWduRG9jTmFtZSxcbiAgZ2VuZXJhdGVWaWV3TmFtZSxcbiAgZmluZFZpZXdNZXRhZGF0YSxcbiAgQ291Y2hEQlZpZXdNZXRhZGF0YSxcbiAgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0NhbWVsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG50eXBlIEZhYnJpY1ZpZXdEZXNjcmlwdG9yID0ge1xuICBkZG9jOiBzdHJpbmc7XG4gIHZpZXc6IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pjtcbn07XG5cbnR5cGUgRmFicmljQWdncmVnYXRlSW5mbyA9XG4gIHwge1xuICAgICAga2luZDogVmlld0tpbmQ7XG4gICAgICBtZXRhOiBDb3VjaERCVmlld01ldGFkYXRhO1xuICAgICAgZGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERpc3RpbmN0PzogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAga2luZDogXCJhdmdcIjtcbiAgICAgIGF0dHJpYnV0ZTogc3RyaW5nO1xuICAgICAgc3VtRGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgICBjb3VudERlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgIH07XG5cbmNvbnN0IGVzY2FwZVJlZ0V4cCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcblxuZnVuY3Rpb24gbmV4dExleGljb2dyYXBoaWNTdHJpbmcodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlxcdTAwMDBcIjtcbiAgY29uc3QgY2hhcnMgPSBBcnJheS5mcm9tKHZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IGNoYXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXJzW2ldLmNvZGVQb2ludEF0KDApO1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChjb2RlIDwgMHgxMGZmZmYpIHtcbiAgICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSArIDEpO1xuICAgICAgcmV0dXJuIGNoYXJzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7dmFsdWV9XFx1MDAwMGA7XG59XG5cbmZ1bmN0aW9uIHByZWZpeFJhbmdlKHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHByZWZpeCxcbiAgICBlbmQ6IG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHByZWZpeCksXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFN0YXRlbWVudDxcbiAgTSxcbiAgRmFicmljQ2xpZW50QWRhcHRlcixcbiAgUixcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEZhYnJpY0NsaWVudEFkYXB0ZXIsIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPikge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3F1YXNoKFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3F1YXNoZWQ6IFByZXBhcmVkU3RhdGVtZW50PE0+IHwgdW5kZWZpbmVkID0gc3VwZXIuc3F1YXNoKFxuICAgICAgY3R4IGFzIG5ldmVyXG4gICAgKTtcbiAgICBpZiAoIXNxdWFzaGVkKSByZXR1cm4gc3F1YXNoZWQ7XG5cbiAgICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zLCBhcmdzIH0gPSBzcXVhc2hlZDtcbiAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQgfSA9IHBhcmFtcztcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG1ldGhvZCAke21ldGhvZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3F1YXNoZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZVByZXBhcmVkKFxuICAgIC4uLmFyZ3o6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5mcm9tU2VsZWN0b3IsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgY29uc3QgeyBtZXRob2QsIGFyZ3MgfSA9IHRoaXMucHJlcGFyZWQgYXMgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PjtcbiAgICByZXR1cm4gcmVwby5zdGF0ZW1lbnQobWV0aG9kLCAuLi5hcmdzLCAuLi5hcmd6KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHByZXBhcmUoXG4gICAgY3R4PzogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogUHJvbWlzZTxTdGF0ZW1lbnRFeGVjdXRvcjxNLCBSPj4ge1xuICAgIGN0eCA9XG4gICAgICBjdHggfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlFVRVJZLFxuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fCB7fSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICkpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1NpbXBsZVF1ZXJ5KCkgJiZcbiAgICAgIChjdHggYXMgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pLmdldChcImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXNcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHNxdWFzaGVkID0gdGhpcy5zcXVhc2goY3R4IGFzIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTtcbiAgICAgIGlmIChzcXVhc2hlZCkge1xuICAgICAgICB0aGlzLnByZXBhcmVkID0gc3F1YXNoZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7fSBhcyBhbnk7XG5cbiAgICBjb25zdCBwcmVwYXJlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiA9IHtcbiAgICAgIGNsYXNzOiB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGFyZ3MsXG4gICAgICBwYXJhbXMsXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBtZXRob2Q6IHN0cmluZ1tdID0gW1F1ZXJ5Q2xhdXNlLkZJTkRfQlldO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucHJlcGFyZUNvbmRpdGlvbih0aGlzLndoZXJlQ29uZGl0aW9uLCBjdHggYXMgbmV2ZXIpO1xuICAgICAgbWV0aG9kLnB1c2gocGFyc2VkLm1ldGhvZCk7XG4gICAgICBpZiAocGFyc2VkLmFyZ3MgJiYgcGFyc2VkLmFyZ3MubGVuZ3RoKVxuICAgICAgICBhcmdzLnB1c2goLi4uKHBhcnNlZC5hcmdzIGFzIChzdHJpbmcgfCBudW1iZXIpW10pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpXG4gICAgICBtZXRob2QucHVzaChcbiAgICAgICAgUXVlcnlDbGF1c2UuU0VMRUNULFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLmpvaW4oYCAke1F1ZXJ5Q2xhdXNlLkFORC50b0xvd2VyQ2FzZSgpfSBgKVxuICAgICAgKTtcbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIG1ldGhvZC5wdXNoKFF1ZXJ5Q2xhdXNlLk9SREVSX0JZLCB0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMF0gYXMgc3RyaW5nKTtcbiAgICAgIGFyZ3MucHVzaCh0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMV0gYXMgYW55KTtcbiAgICB9XG4gICAgcHJlcGFyZWQubWV0aG9kID0gdG9DYW1lbENhc2UobWV0aG9kLmpvaW4oXCIgXCIpKTtcbiAgICBwcmVwYXJlZC5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5wcmVwYXJlZCA9IHByZXBhcmVkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSByZWNvcmQgZnJvbSBDb3VjaERCL0ZhYnJpY1xuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyB0aGUgSUQgZnJvbSBhIENvdWNoREIgZG9jdW1lbnQgYW5kIHJldmVydHMgaXQgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByb2Nlc3NSZWNvcmQoXG4gICAgcmVjb3JkOiBhbnksXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBNIHtcbiAgICBjb25zdCBwa0F0dHIgPSBNb2RlbC5wayh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLmdldChcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5JRCwgcGtBdHRyIGFzIHN0cmluZylcbiAgICApPy50eXBlO1xuXG4gICAgaWYgKHJlY29yZFtDb3VjaERCS2V5cy5JRF0pIHtcbiAgICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcmVjb3JkW0NvdWNoREJLZXlzLklEXS5zcGxpdChDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgICAgcmVjb3JkW3BrQXR0cl0gPSBTZXF1ZW5jZS5wYXJzZVZhbHVlKHR5cGUgYXMgYW55LCBpZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NSZWNvcmQocmVjb3JkLCBjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeVxuICAgKiBAc3VtbWFyeSBTZW5kcyBhIHJhdyBNYW5nbyBxdWVyeSB0byBGYWJyaWMgYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0c1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgYWdncmVnYXRvciA9IChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGVJbmZvO1xuICAgIGlmICgocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlICYmIGFnZ3JlZ2F0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBZ2dyZWdhdGU8Uj4oYWdncmVnYXRvciwgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KFxuICAgICAgcmF3SW5wdXQsXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBjdHhcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIGN0eCkpO1xuICAgICAgaWYgKCFjdHguZ2V0T3JVbmRlZmluZWQoXCJhZnRlclF1ZXJ5SGFuZGxlcnNcIikpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZCBhcyB1bmtub3duIGFzIFI7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQocHJvY2Vzc2VkLCBjdHgpKSBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkKCk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCBhZ2dyZWdhdGVRdWVyeSA9IHRoaXMuYnVpbGRBZ2dyZWdhdGVRdWVyeSgpO1xuICAgIGlmIChhZ2dyZWdhdGVRdWVyeSkgcmV0dXJuIGFnZ3JlZ2F0ZVF1ZXJ5O1xuICAgIGNvbnN0IHNlbGVjdG9yczogTWFuZ29TZWxlY3RvciA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHNlbGVjdG9ycyB9O1xuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKSBxdWVyeS5maWVsZHMgPSB0aGlzLnNlbGVjdFNlbGVjdG9yIGFzIHN0cmluZ1tdO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbjogTWFuZ29TZWxlY3RvciA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIENvbmRpdGlvbi5hbmQoXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBDb25kaXRpb24uYXR0cmlidXRlPE0+KENvdWNoREJLZXlzLlRBQkxFIGFzIGtleW9mIE0pLmVxKFxuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgc2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKSBhcyBNYW5nb09wZXJhdG9yW107XG4gICAgICBpZiAoXG4gICAgICAgIHNlbGVjdG9yS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhDb3VjaERCR3JvdXBPcGVyYXRvcikuaW5kZXhPZihzZWxlY3RvcktleXNbMF0pICE9PSAtMVxuICAgICAgKVxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yS2V5c1swXSkge1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gYXMgTWFuZ29TZWxlY3RvclxuICAgICAgICAgICAgICApLnJlZHVjZSgoYWNjdW06IE1hbmdvU2VsZWN0b3JbXSwgdmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVG9vIG1hbnkga2V5cyBpbiBxdWVyeSBzZWxlY3Rvci4gc2hvdWxkIGJlIG9uZVwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQpXG4gICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLih2YWxba10gYXMgYW55W10pKTtcbiAgICAgICAgICAgICAgICBlbHNlIGFjY3VtLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICAgIH0sIFtdKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IGNvbmRpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuT1I6IHtcbiAgICAgICAgICAgIGNvbnN0IHM6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgIHNbQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhxdWVyeS5zZWxlY3RvcikubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXJ5LnNlbGVjdG9yW2tleV0pXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBmb3IgKGNvbnN0IFtzZWxlY3RvcktleSwgZGlyZWN0aW9uXSBvZiB0aGlzLm9yZGVyQnlTZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcktleSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+ID0ge307XG4gICAgICAgIHJlY1tzZWxlY3Rvcl0gPSBkaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb247XG4gICAgICAgIChxdWVyeS5zb3J0IGFzIFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPltdKS5wdXNoKHJlYyk7XG4gICAgICAgIGlmICghcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdKSB7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHRoaXMubGltaXRTZWxlY3RvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGNvdWNoZGIgbGltaXQgb2YgJHtDb3VjaERCUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcXVlcnkubGltaXQgPSBDb3VjaERCUXVlcnlMaW1pdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcikgcXVlcnkuc2tpcCA9IHRoaXMub2Zmc2V0U2VsZWN0b3I7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3Igc3RydWN0dXJlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBNYW5nb1F1ZXJ5IHtcbiAgICBmdW5jdGlvbiBtZXJnZShcbiAgICAgIG9wOiBNYW5nb09wZXJhdG9yLFxuICAgICAgb2JqMTogTWFuZ29TZWxlY3RvcixcbiAgICAgIG9iajI6IE1hbmdvU2VsZWN0b3JcbiAgICApOiBNYW5nb1F1ZXJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHt9IGFzIE1hbmdvU2VsZWN0b3IgfTtcbiAgICAgIHJlc3VsdC5zZWxlY3RvcltvcF0gPSBbb2JqMSwgb2JqMl07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5TVEFSVFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgcmFuZ2UgPSBwcmVmaXhSYW5nZShjb21wYXJpc29uKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJfRVFdID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5TTUFMTEVSXSA9IHJhbmdlLmVuZDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5FTkRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge1xuICAgICAgICBbQ291Y2hEQk9wZXJhdG9yLlJFR0VYUF06IGAke2VzY2FwZVJlZ0V4cChjb21wYXJpc29uKX0kYCxcbiAgICAgIH0gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5CRVRXRUVOKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cjEgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbXBhcmlzb24pIHx8IGNvbXBhcmlzb24ubGVuZ3RoICE9PSAyKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkJFVFdFRU4gb3BlcmF0b3IgcmVxdWlyZXMgW21pbiwgbWF4XSBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbXBhcmlzb247XG4gICAgICBjb25zdCBvcEJldHdlZW46IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BCZXR3ZWVuW2F0dHJdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5CSUdHRVJfRVEpXG4gICAgICBdID0gbWluO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLlNNQUxMRVJfRVEpXG4gICAgICBdID0gbWF4O1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wQmV0d2VlbiB9O1xuICAgIH1cblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhbiBhZ2dyZWdhdGUgcXVlcnkgaWYgYWdncmVnYXRpb24gaXMgcmVxdWVzdGVkXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBmb3IgYWdncmVnYXRlIG9wZXJhdGlvbnMgYW5kIHJldHVybnMgYSBzcGVjaWFsIE1hbmdvUXVlcnkgZm9yIHRoZW1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZ2dyZWdhdGVRdWVyeSgpOiBNYW5nb1F1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmF2Z1NlbGVjdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBTdHJpbmcodGhpcy5hdmdTZWxlY3Rvcik7XG4gICAgICBjb25zdCBzdW1JbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwic3VtXCIsIGF0dHJpYnV0ZSk7XG4gICAgICBjb25zdCBjb3VudEluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJjb3VudFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKCFzdW1JbmZvIHx8ICFjb3VudEluZm8pXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgIGBBdmcgb3BlcmF0aW9uIHJlcXVpcmVzIHN1bSBhbmQgY291bnQgdmlld3MgZm9yIGF0dHJpYnV0ZSAke2F0dHJpYnV0ZX1gXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeSh7XG4gICAgICAgIGtpbmQ6IFwiYXZnXCIsXG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgc3VtRGVzY3JpcHRvcjogc3VtSW5mby5kZXNjcmlwdG9yLFxuICAgICAgICBjb3VudERlc2NyaXB0b3I6IGNvdW50SW5mby5kZXNjcmlwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID1cbiAgICAgICAgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgPT0gbnVsbFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBTdHJpbmcodGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IpO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImRpc3RpbmN0XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbmZvLmNvdW50RGlzdGluY3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yVXNlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICEhdGhpcy5taW5TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLm1heFNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuc3VtU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5kaXN0aW5jdFNlbGVjdG9yO1xuXG4gICAgY29uc3QgYWdncmVnYXRvckNoZWNrczogQXJyYXk8W1ZpZXdLaW5kLCBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW1xuICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICh0aGlzLmNvdW50U2VsZWN0b3IgPz8gdW5kZWZpbmVkKSBhcyBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZCxcbiAgICAgIF0sXG4gICAgICBbXCJtYXhcIiwgdGhpcy5tYXhTZWxlY3Rvcl0sXG4gICAgICBbXCJtaW5cIiwgdGhpcy5taW5TZWxlY3Rvcl0sXG4gICAgICBbXCJzdW1cIiwgdGhpcy5zdW1TZWxlY3Rvcl0sXG4gICAgICBbXCJkaXN0aW5jdFwiLCB0aGlzLmRpc3RpbmN0U2VsZWN0b3JdLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IFtraW5kLCBzZWxlY3Rvcl0gb2YgYWdncmVnYXRvckNoZWNrcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gc2VsZWN0b3IgPyBTdHJpbmcoc2VsZWN0b3IpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihraW5kLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgIH1cblxuICAgIGlmIChhZ2dyZWdhdG9yVXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIGBObyBDb3VjaERCIHZpZXcgbWV0YWRhdGEgZm91bmQgZm9yIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICAgICl9IGFnZ3JlZ2F0b3JgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yIGZvciBhIHZpZXctYmFzZWQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcbiAgICBraW5kOiBWaWV3S2luZCxcbiAgICBhdHRyaWJ1dGU/OiBzdHJpbmdcbiAgKTogRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGFzID0gZmluZFZpZXdNZXRhZGF0YSh0aGlzLmZyb21TZWxlY3Rvciwga2luZCwgYXR0cmlidXRlKTtcbiAgICBpZiAoIW1ldGFzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhID0gbWV0YXNbMF07XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGdlbmVyYXRlVmlld05hbWUodGFibGVOYW1lLCBtZXRhLmF0dHJpYnV0ZSwga2luZCwgbWV0YSk7XG4gICAgY29uc3QgZGRvYyA9IG1ldGEuZGRvYyB8fCBnZW5lcmF0ZURlc2lnbkRvY05hbWUodGFibGVOYW1lLCB2aWV3TmFtZSk7XG4gICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIHJlZHVjZTogbWV0YS5yZWR1Y2UgIT09IHVuZGVmaW5lZCA/IHRydWUgOiAhbWV0YS5yZXR1cm5Eb2NzLFxuICAgIH07XG4gICAgaWYgKGtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCBraW5kID09PSBcImdyb3VwQnlcIikgb3B0aW9ucy5ncm91cCA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQsXG4gICAgICBtZXRhLFxuICAgICAgZGVzY3JpcHRvcjoge1xuICAgICAgICBkZG9jLFxuICAgICAgICB2aWV3OiB2aWV3TmFtZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgc3BlY2lhbCBhZ2dyZWdhdGUgTWFuZ29RdWVyeSBtYXJrZXJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlUXVlcnkoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9yOiB7fSxcbiAgICAgIGFnZ3JlZ2F0ZTogdHJ1ZSxcbiAgICAgIGFnZ3JlZ2F0ZUluZm86IGluZm8sXG4gICAgfSBhcyBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBjYXN0IHRvIEZhYnJpY0NsaWVudEFkYXB0ZXIgZm9yIHZpZXcgYWNjZXNzXG4gICAqL1xuICBwcml2YXRlIGdldEZhYnJpY0FkYXB0ZXIoKTogRmFicmljQ2xpZW50QWRhcHRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhbiBhZ2dyZWdhdGUgcXVlcnkgdmlhIGFkYXB0ZXIncyB2aWV3IG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWdncmVnYXRlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoIXRoaXMuaXNWaWV3QWdncmVnYXRlKGluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVBdmVyYWdlPFI+KGluZm8sIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCB2aWV3SW5mbyA9IGluZm8gYXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLmRkb2MsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLnZpZXcsXG4gICAgICB2aWV3SW5mby5kZXNjcmlwdG9yLm9wdGlvbnMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oaW5mbywgcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGF2ZXJhZ2UgY2FsY3VsYXRpb24gZnJvbSBzdW0gYW5kIGNvdW50IHZpZXdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUF2ZXJhZ2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmIChpbmZvLmtpbmQgIT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkF2ZXJhZ2UgZGVzY3JpcHRvciBpcyBub3QgdmFsaWRcIik7XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IFtzdW1EZXNjLCBjb3VudERlc2NdID0gW2luZm8uc3VtRGVzY3JpcHRvciwgaW5mby5jb3VudERlc2NyaXB0b3JdO1xuICAgIGNvbnN0IFtzdW1SZXNwb25zZSwgY291bnRSZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgc3VtRGVzYy5kZG9jLFxuICAgICAgICBzdW1EZXNjLnZpZXcsXG4gICAgICAgIHN1bURlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIGNvdW50RGVzYy5kZG9jLFxuICAgICAgICBjb3VudERlc2MudmlldyxcbiAgICAgICAgY291bnREZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICBdKTtcbiAgICBjb25zdCBzdW0gPSBzdW1SZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgY29uc3QgY291bnQgPSBjb3VudFJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBpZiAoIWNvdW50KSByZXR1cm4gMCBhcyB1bmtub3duIGFzIFI7XG4gICAgcmV0dXJuIChzdW0gLyBjb3VudCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgdGhlIHZpZXcgcmVzcG9uc2UgYmFzZWQgb24gYWdncmVnYXRlIGtpbmRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIHJlc3BvbnNlOiBWaWV3UmVzcG9uc2VcbiAgKTogUiB7XG4gICAgaWYgKGluZm8ua2luZCA9PT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBcIkF2ZXJhZ2UgcmVzdWx0cyBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgcHJvY2Vzc2luZyByb3dzXCJcbiAgICAgICk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3BvbnNlLnJvd3MgfHwgW107XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCBtZXRhID0gdmlld0luZm8ubWV0YTtcbiAgICBpZiAodmlld0luZm8uY291bnREaXN0aW5jdCkge1xuICAgICAgcmV0dXJuIChyb3dzLmxlbmd0aCB8fCAwKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICh2aWV3SW5mby5raW5kID09PSBcImRpc3RpbmN0XCIgfHwgdmlld0luZm8ua2luZCA9PT0gXCJncm91cEJ5XCIpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cua2V5ID8/IHJvdy52YWx1ZSkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAobWV0YS5yZXR1cm5Eb2NzKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LnZhbHVlID8/IHJvdy5kb2MgPz8gcm93KSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAodmlld0luZm8ua2luZCA9PT0gXCJjb3VudFwiID8gMCA6IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIChyb3dzWzBdLnZhbHVlID8/IHJvd3NbMF0ua2V5ID8/IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbmZvIGlzIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGVcbiAgICovXG4gIHByaXZhdGUgaXNWaWV3QWdncmVnYXRlKFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogaW5mbyBpcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4ge1xuICAgIHJldHVybiBpbmZvLmtpbmQgIT09IFwiYXZnXCI7XG4gIH1cbn1cbiIsImltcG9ydCBcIi4uL3NoYXJlZC9vdmVycmlkZXNcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICB0eXBlIE1hbmdvUXVlcnksXG4gIHR5cGUgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0ICogYXMgZ3JwYyBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIHR5cGUgTW9kZWxDb25zdHJ1Y3RvcixcbiAgdHlwZSBTZXJpYWxpemVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBkZWJ1ZywgZmluYWwsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIHR5cGUgUGVlckNvbmZpZyxcbiAgdHlwZSBTZWdyZWdhdGVkTW9kZWwsXG4gIHR5cGUgTXNwRGV0YWlscyxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgY29ubmVjdCxcbiAgdHlwZSBDb25uZWN0T3B0aW9ucyxcbiAgR2F0ZXdheSxcbiAgTmV0d29yayxcbiAgUHJvcG9zYWxPcHRpb25zLFxuICBDb250cmFjdCBhcyBDb250cmFrdCxcbiAgdHlwZSBTaWduZXIsXG4gIEdhdGV3YXlFcnJvcixcbiAgRW5kb3JzZUVycm9yLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBHYXRld2F5IGFzIExlZ2FjeUdhdGV3YXksIFdhbGxldHMgfSBmcm9tIFwiZmFicmljLW5ldHdvcmtcIjtcbmltcG9ydCB0eXBlIHsgRW5kb3JzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgZ2V0SWRlbnRpdHksXG4gIGdldFNpZ25lcixcbiAgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQsXG4gIHJlYWRGaWxlIGFzIHJlYWRGc0ZpbGUsXG59IGZyb20gXCIuL2ZhYnJpYy1mc1wiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQmFkUmVxdWVzdEVycm9yLFxuICB0eXBlIFByaW1hcnlLZXlUeXBlLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRmxhZ3MsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFN0YXRlbWVudCxcbiAgdHlwZSBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUGFnaW5hdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIENvbnRleHR1YWxBcmdzLFxuICB0eXBlIFByZXBhcmVkTW9kZWwsXG4gIEFsbE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDbGllbnRTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnREaXNwYXRjaCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudERpc3BhdGNoXCI7XG4vLyBpbXBvcnQgeyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tIH0gZnJvbSBcIi4vZmFicmljLWhzbVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50U3RhdGVtZW50IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBFbmRvcnNlbWVudEVycm9yLFxuICBFbmRvcnNlbWVudFBvbGljeUVycm9yLFxuICBNdmNjUmVhZENvbmZsaWN0RXJyb3IsXG4gIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcixcbiAgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IsXG59IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4vY3J5cHRvXCI7XG5pbXBvcnQgeyBleHRyYWN0SWRzIH0gZnJvbSBcIi4vaWRzL2lkLWV4dHJhY3Rpb25cIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uL3NoYXJlZC9pbmRleFwiO1xuXG50eXBlIExlZ2FjeVBlZXJUYXJnZXQgPSB7XG4gIG1zcElkOiBzdHJpbmc7XG4gIHBlZXJFbmRwb2ludDogc3RyaW5nO1xuICBwZWVySG9zdEFsaWFzPzogc3RyaW5nO1xuICB0bHNDZXJ0Pzogc3RyaW5nIHwgQnVmZmVyO1xufTtcblxudHlwZSBMZWdhY3lQZWVyV2l0aE5hbWUgPSBMZWdhY3lQZWVyVGFyZ2V0ICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3NcbiAqIEBzdW1tYXJ5IFRoZSBGYWJyaWNBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXIgdG8gcHJvdmlkZSBhIHNlYW1sZXNzIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3MuXG4gKiBJdCBoYW5kbGVzIGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgdHJhbnNhY3Rpb24gc3VibWlzc2lvbiwgYW5kIENSVUQgb3BlcmF0aW9ucyBhZ2FpbnN0IEZhYnJpYyBjaGFpbmNvZGUuXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAdGVtcGxhdGUgRmFicmljRmxhZ3MgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8RmFicmljRmxhZ3M+IC0gQ29udGV4dCB0eXBlIGNvbnRhaW5pbmcgRmFicmljLXNwZWNpZmljIGZsYWdzXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gYWxpYXMgLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAqIGNvbnN0IGNvbmZpZzogUGVlckNvbmZpZyA9IHtcbiAqICAgbXNwSWQ6ICdPcmcxTVNQJyxcbiAqICAgcGVlckVuZHBvaW50OiAnbG9jYWxob3N0OjcwNTEnLFxuICogICBjaGFubmVsTmFtZTogJ215Y2hhbm5lbCcsXG4gKiAgIGNoYWluY29kZU5hbWU6ICdteWNjJyxcbiAqICAgY29udHJhY3ROYW1lOiAnbXljb250cmFjdCcsXG4gKiAgIHRsc0NlcnRQYXRoOiAnL3BhdGgvdG8vdGxzL2NlcnQnLFxuICogICBjZXJ0RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2NlcnQvZGlyJyxcbiAqICAga2V5RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2tleS9kaXInXG4gKiB9O1xuICpcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgRmFicmljQWRhcHRlcihjb25maWcsICdvcmcxLWFkYXB0ZXInKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlcjEnLCBteVNlcmlhbGl6ZXIpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCwgdHJhbnNpZW50LCBzZXJpYWxpemVyKVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc3VibWl0VHJhbnNhY3Rpb24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFtzZXJpYWxpemVkTW9kZWxdLCB0cmFuc2llbnQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbE5hbWUpXG4gKiAgIE5ldHdvcmstPj5Db250cmFjdDogZ2V0Q29udHJhY3QoY2hhaW5jb2RlTmFtZSwgY29udHJhY3ROYW1lKVxuICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZGVjb2RlKHJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVjb2RlZFJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IGRlc2VyaWFsaXplZFJlc3VsdFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIFBlZXJDb25maWcsXG4gIENsaWVudCxcbiAgTWFuZ29RdWVyeSxcbiAgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyB0ZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgVWludDhBcnJheSB0byBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljQ2xpZW50QWRhcHRlcik7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PiA9XG4gICAgRmFicmljQ2xpZW50QWRhcHRlci5zZXJpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQZWVyQ29uZmlnLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzLCBjb25maWcpLFxuICAgICAgRmFicmljRmxhdm91cixcbiAgICAgIGFsaWFzXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPlxuICApOiBTdGF0ZW1lbnQ8TSwgRmFicmljQ2xpZW50QWRhcHRlciwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQodGhpcywgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHF1ZXJ5OiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgTWFuZ29RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICk6IFBhZ2luYXRvcjxNLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFBhZ2luYXRvcih0aGlzLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10gfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgICBjb25zdCBtZXJnZWRGbGFncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCBmbGFncyk7XG4gICAgY29uc3QgZiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBtZXJnZWRGbGFncywgLi4uYXJncylcbiAgICApO1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IEFsbE9wZXJhdGlvbktleXMsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PGFueT4+XG4gICk6IFByb21pc2U8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuc2lsbHkoXG4gICAgICBgY3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbCA/IChBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsLm1hcCgobSkgPT4gTW9kZWwudGFibGVOYW1lKG0pKSA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCkpIDogXCJub1wifSB0YWJsZSAke292ZXJyaWRlcyAmJiBPYmplY3Qua2V5cyhvdmVycmlkZXMpID8gT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGggOiBcIm5vXCJ9IHdpdGggZmxhZyBvdmVycmlkZXNgXG4gICAgKTtcbiAgICBsZXQgY3R4ID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIGN0eCAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICBhcmdzLnB1c2goY3R4KTtcbiAgICAgIGN0eCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZXMgPSBjdHhcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY3R4LnRvT3ZlcnJpZGVzKCksIG92ZXJyaWRlcylcbiAgICAgIDogb3ZlcnJpZGVzO1xuICAgIGNvbnN0IGZsYWdzID0gYXdhaXQgdGhpcy5mbGFncyhcbiAgICAgIHR5cGVvZiBvcGVyYXRpb24gPT09IFwic3RyaW5nXCIgPyBvcGVyYXRpb24gOiBvcGVyYXRpb24ubmFtZSxcbiAgICAgIG1vZGVsLFxuICAgICAgb3ZlcnJpZGVzIGFzIFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgICAgLi4uWy4uLmFyZ3MsIGN0eF0uZmlsdGVyKEJvb2xlYW4pXG4gICAgKTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE9wID0gY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpO1xuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZmZWN0ZWRUYWJsZXNcIik7XG4gICAgICBpZiAoXG4gICAgICAgICFjdXJyZW50T3AgfHxcbiAgICAgICAgY3VycmVudE9wICE9PSBvcGVyYXRpb24gfHxcbiAgICAgICAgKG1vZGVsICYmIG1vZGVsICE9PSBjdXJyZW50TW9kZWwpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuXG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3R4LmFjY3VtdWxhdGUoZmxhZ3MpIGFzIGFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgLi4uZmxhZ3MsXG4gICAgfSkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNvZGVzIGEgVWludDhBcnJheSB0byBhIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBiaW5hcnkgZGF0YSByZWNlaXZlZCBmcm9tIEZhYnJpYyB0byBhIHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGEgLSBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nXG4gICAqL1xuICBkZWNvZGUoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvc2l0b3J5PFxuICAgIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICAgICAgYW55LFxuICAgICAgQWRhcHRlcjxQZWVyQ29uZmlnLCBDbGllbnQsIE1hbmdvUXVlcnksIENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICAgID4sXG4gID4oKTogQ29uc3RydWN0b3I8Uj4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFtDb25zdHJ1Y3RvcjxNPiwgUHJpbWFyeUtleVR5cGUsIFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmFueVtdLCBDb250ZXh0XSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIHJlY29yZHMgZm9yIGNyZWF0aW9uXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmVjZXNzYXJ5IENvdWNoREIgZmllbGRzIHRvIG11bHRpcGxlIHJlY29yZHMgYmVmb3JlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIElEcyBvZiB0aGUgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSB0YWJsZU5hbWUsIGlkcywgYW5kIHByZXBhcmVkIHJlY29yZHNcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgaWRzIGFuZCBtb2RlbHMgYXJyYXlzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlQWxsUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbY2xhenosIGlkcywgcmVjb3JkcywgLi4uY3R4QXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgLy9IRVJFIVxuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy5pbmZvKGBhZGRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCB0cmFuc2llbnRQYXlsb2FkID0gaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB7fTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgIFtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKSlcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgICAgY2xhenosXG4gICAgICAgIGN0eCxcbiAgICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgICAgcmVzWzBdW01vZGVsLnBrKGNsYXp6KSBhcyBzdHJpbmddIHx8IGlkc1swXVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnRbaV0gfHwge30pLCByZXNbaV0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byByZWFkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgcmVhZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PixcbiAgICAgIHRoaXMudXBkYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgW1xuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtb2RlbHMubWFwKChtKSA9PiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpKVxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcblxuICAgIGxldCByZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZHNbMF0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudFtpXSB8fCB7fSksIHJlc1tpXSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+fSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7U2VyaWFsaXplcjxhbnk+fSBzZXJpYWxpemVyIC0gU2VyaWFsaXplciBmb3IgdGhlIG1vZGVsIGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkc1swXVxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZEFsbChjbGF6eiwgaWRzLCAuLi5jdHhBcmdzKTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXMpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBTZWdyZWdhdGVkTW9kZWw8TT4gJiBQcmVwYXJlZE1vZGVsIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHsobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BsaXQubW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQobW9kZWwpO1xuICAgIGlmIChtaXJyb3JNZXRhKSB7XG4gICAgICBjb25zdCBtaXJyb3JNc3AgPSBtaXJyb3JNZXRhLm1zcElkO1xuICAgICAgaWYgKCFtaXJyb3JNc3ApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBtaXJyb3IgTVNQIGNvdWxkIGJlIGZvdW5kYCk7XG4gICAgICBsZXQgbXNwcyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgICAgbXNwcyA9IEFycmF5LmlzQXJyYXkobXNwcykgPyBtc3BzIDogW21zcHNdO1xuICAgICAgY29uc3QgbWVyZ2VkID0gWy4uLm5ldyBTZXQoWy4uLm1zcHMsIG1pcnJvck1zcF0pXTtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgZW5kb3JzaW5nT3JnczogbWVyZ2VkLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBtZXJnZWQsXG4gICAgICAgIGxlZ2FjeTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHNwbGl0Lm1vZGVsLFxuICAgICAgbW9kZWw6IHNwbGl0Lm1vZGVsLFxuICAgICAgaWQ6IG1vZGVsW01vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KV0gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OiBzcGxpdC50cmFuc2llbnQsXG4gICAgICBwcml2YXRlczogc3BsaXQucHJpdmF0ZXMsXG4gICAgICBzaGFyZWQ6IHNwbGl0LnNoYXJlZCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogTSB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZXZlcnQpO1xuICAgIGlmIChcbiAgICAgIHRyYW5zaWVudCAmJlxuICAgICAgdGhpcy5zaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICAgICAgY3R4LFxuICAgICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiB0eXBlb2YgdiAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIG9iaiAmJiAob2JqIGFzIGFueSlba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICAgIGBvdmVyd3JpdGluZyBleGlzdGluZyAke2tleX0uIGlmIHRoaXMgaXMgbm90IGEgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtYXkgcG9zZSBhIHByb2JsZW1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjdHgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNoaWxkUmVidWlsZCA9XG4gICAgICB0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjaGlsZFJlYnVpbGQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlc29sdmVkT3AgPSB0aGlzLnJlc29sdmVPcGVyYXRpb24oY3R4LCBvcGVyYXRpb24pO1xuICAgIGlmICghcmVzb2x2ZWRPcCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG9wID0gcmVzb2x2ZWRPcC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIG9wLmluY2x1ZGVzKFwicmVhZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJmaW5kXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInF1ZXJ5XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInN0YXRlbWVudFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJwYWdlXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZU9wZXJhdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChvcGVyYXRpb24pIHJldHVybiBvcGVyYXRpb247XG4gICAgaWYgKHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwib3BlcmF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGhhc1RyYW5zaWVudDogYm9vbGVhbixcbiAgICBpZD86IFByaW1hcnlLZXlUeXBlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghaGFzVHJhbnNpZW50KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWQgPSBNb2RlbC5jb21wb3NlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGdlbmVyYXRlZCA9IE1vZGVsLmdlbmVyYXRlZChjbGF6eiwgcGspO1xuICAgIGNvbnN0IGhhc0lkID0gaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbDtcbiAgICBpZiAoIWhhc0lkICYmIGNvbXBvc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWhhc0lkICYmIGdlbmVyYXRlZCkge1xuICAgICAgY3R4LmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2Fubm90IHJlZnJlc2ggcmVjb3JkIHdpdGggcHJpdmF0ZSBnZW5lcmF0ZWQgcHJpbWFyeSBrZXlgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGlyZWN0ID1cbiAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgfHxcbiAgICAgIChjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZGlyZWN0ICYmIGRpcmVjdC5sZW5ndGgpIHJldHVybiBkaXJlY3Q7XG4gICAgcmV0dXJuIChcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgfHxcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4sXG4gICAgICB0aGlzLmNyZWF0ZVxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgYWRkaW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHRyYW5zaWVudFBheWxvYWQgPSBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lKV0sXG4gICAgICB0cmFuc2llbnRQYXlsb2FkIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenoubmFtZVxuICAgICk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCwgdHJhbnNpZW50IHx8IHt9KSxcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGNsYXp6XG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZFxuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZXNlcmlhbGl6ZWQ7XG4gIH1cblxuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyBoZWFsdGhjaGVjazxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5oZWFsdGhjaGVjayk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJoZWFsdGhjaGVja1wiLFxuICAgICAgW10sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyByZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICB1cGRhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIC8vIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyB1cGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+LFxuICAgICAgdGhpcy51cGRhdGVcbiAgICApO1xuICAgIGxvZy5pbmZvKGBDTElFTlQgVVBEQVRFIGNsYXNzIDogJHt0eXBlb2YgY2xhenp9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgdXBkYXRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3QgdHJhbnNpZW50UGF5bG9hZCA9IGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDoge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgW3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwsIGNsYXp6Lm5hbWUgfHwgY2xhenopXSwgLy8gVE9ETyBzaG91bGQgYmUgcmVjZXZpbmcgY2xhc3MgYnV0IGlzIHJlY2VpdmluZyBzdHJpbmdcbiAgICAgIHRyYW5zaWVudFBheWxvYWQgYXMgYW55LFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6ei5uYW1lXG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXIgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBNb2RlbC5pc1RyYW5zaWVudChjbGF6eikgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgY29uc3Qgc2hvdWxkSHlkcmF0ZSA9IHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICBjbGF6eixcbiAgICAgIGN0eCxcbiAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICBpZFxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZChjbGF6eiwgaWQsIGN0eCk7XG4gICAgfVxuXG4gICAgbG9nLnZlcmJvc2UoYGRlbGV0aW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6Lm5hbWVcbiAgICApO1xuICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICA/IHJlc3VsdFxuICAgICAgOiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcGVyZm9ybSBhIHF1ZXJ5IHVzaW5nIE1hbmdvIFF1ZXJ5IHN5bnRheFxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcm9jZXNzIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXN1bHRcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiByYXcocmF3SW5wdXQsIHByb2Nlc3MpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBldmFsdWF0ZVRyYW5zYWN0aW9uKFwicXVlcnlcIiwgW2lucHV0XSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKFwicXVlcnlcIiwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04ucGFyc2UoZGVjb2RlKHJlc3VsdCkpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0IGJhc2VkIG9uIHR5cGVcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogcHJvY2Vzc2VkIHJlc3VsdFxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgcmF3PFYsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICBkb2NzT25seTogRCA9IHRydWUgYXMgRCxcbiAgICBjbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+PlxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gY2xhenoubmFtZTtcbiAgICBsb2cuaW5mbyhgUGVyZm9ybWluZyByYXcgc3RhdGVtZW50IG9uIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKGNsYXp6KX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJyYXdcIixcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHJhd0lucHV0KSwgZG9jc09ubHldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVJlY29yZCA9IChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pID0+IHtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKHJlY29yZCkpIHJldHVybiBNb2RlbC5idWlsZChyZWNvcmQpO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgICBjb25zdCBlbCA9IHJlc3VsdFswXTtcbiAgICAgIGlmIChNb2RlbC5pc01vZGVsKGVsKSlcbiAgICAgICAgLy8gaWYgdGhlIGZpcnN0IG9uZSBpcyBhIG1vZGVsLCBhbGwgYXJlIG1vZGVsc1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCgoZWwpID0+IE1vZGVsLmJ1aWxkKGVsKSkgYXMgVjtcbiAgICAgIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VSZWNvcmQocmVzdWx0IGFzIGFueSkgYXMgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBDb3VjaERCIHZpZXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBxdWVyeSBhIGRlc2lnbiBkb2N1bWVudCB2aWV3XG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHZpZXcgcmVzcG9uc2UgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGRvYyAtIERlc2lnbiBkb2N1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TmFtZSAtIFZpZXcgbmFtZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBWaWV3IHF1ZXJ5IG9wdGlvbnNcbiAgICogQHBhcmFtIHsuLi5Db250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj59IGFyZ3MgLSBPcHRpb25hbCBjb250ZXh0dWFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFZpZXdSZXNwb25zZTxSPj59IFRoZSB2aWV3IHJlc3BvbnNlXG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyB2aWV3PFI+KFxuICAgIGRkb2M6IHN0cmluZyxcbiAgICB2aWV3TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8Vmlld1Jlc3BvbnNlPFI+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy52aWV3KTtcbiAgICBsb2cuaW5mbyhgUXVlcnlpbmcgdmlldyAke2Rkb2N9LyR7dmlld05hbWV9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwidmlld1wiLFxuICAgICAgICBbZGRvYywgdmlld05hbWUsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpXSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFZpZXdSZXNwb25zZTxSPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgdmlldyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBjcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIHRoZSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY2FjaGVkIGNsaWVudCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBub25lIGV4aXN0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENsaWVudD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IENsaWVudCB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpXG4gICAgICB0aGlzLl9jbGllbnQgPSBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENsaWVudCh0aGlzLmNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IEdhdGV3YXkgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgY2xpZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgR2F0ZXdheShjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KTogUHJvbWlzZTxHYXRld2F5PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShjdHgsIHRoaXMuY29uZmlnLCB0aGlzLmNsaWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRyYWN0TmFtZShjbGFzc05hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWNsYXNzTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYCR7Y2xhc3NOYW1lfUNvbnRyYWN0YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IENvbnRyYWN0IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IEdhdGV3YXlcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb250cmFrdD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIENvbnRyYWN0KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8Q29udHJha3Q+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRDb250cmFjdChcbiAgICAgIGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBjb250cmFjdE5hbWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBTdWJtaXRzIG9yIGV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWJtaXQgLSBXaGV0aGVyIHRvIHN1Ym1pdCAodHJ1ZSkgb3IgZXZhbHVhdGUgKGZhbHNlKSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBnZXRDb250cmFjdCgpXG4gICAqICAgYWx0IHN1Ym1pdCB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZWxzZSBldmFsdWF0ZSB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbmRcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjbG9zZSgpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBzdWJtaXQgPSB0cnVlLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IHN0cmluZ1tdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50cmFuc2FjdGlvbik7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IGF3YWl0IHRoaXMuQ29udHJhY3QoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5nZXRDb250cmFjdE5hbWUoY2xhc3NOYW1lKVxuICAgICAgKTtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgJHtzdWJtaXQgPyBcIlN1Ym1pdFwiIDogXCJFdmFsdWF0ZVwifXRpbmcgdHJhbnNhY3Rpb24gJHt0aGlzLmdldENvbnRyYWN0TmFtZShjbGFzc05hbWUpIHx8IHRoaXMuY29uZmlnLmNvbnRyYWN0TmFtZX0uJHthcGl9YFxuICAgICAgKTtcbiAgICAgIGxvZy5kZWJ1ZyhgYXJnczogJHthcmdzPy5tYXAoKGEpID0+IGEudG9TdHJpbmcoKSkuam9pbihcIlxcblwiKSB8fCBcIm5vbmVcIn1gKTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHN1Ym1pdCA/IGNvbnRyYWN0LnN1Ym1pdCA6IGNvbnRyYWN0LmV2YWx1YXRlO1xuXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zID0gZW5kb3JzaW5nT3JnYW5pemF0aW9ucz8ubGVuZ3RoXG4gICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3Bvc2FsT3B0aW9uczogUHJvcG9zYWxPcHRpb25zID0ge1xuICAgICAgICBhcmd1bWVudHM6IGFyZ3MgfHwgW10sXG4gICAgICAgIHRyYW5zaWVudERhdGE6IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEpLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgdHlwZW9mIHRyYW5zaWVudERhdGFcbiAgICAgICAgKSxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogY3R4LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzXCIpXG4gICAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zIHx8IHVuZGVmaW5lZFxuICAgICAgICAgIDogdW5kZWZpbmVkLCAvLyBtc3BJZCBsaXN0XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgbWV0aG9kLmNhbGwoY29udHJhY3QsIGFwaSwgcHJvcG9zYWxPcHRpb25zKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjb25uZWN0aW9uYCk7XG4gICAgICBnYXRld2F5LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFjdHguZ2V0T3JVbmRlZmluZWQoXCJsZWdhY3lcIikgJiYgISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUxlZ2FjeUFyZ3MoYXJncz86IGFueVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAoYXJncyB8fCBbXSkubWFwKChhcmcpID0+XG4gICAgICB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiID8gYXJnIDogSlNPTi5zdHJpbmdpZnkoYXJnKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5VHJhbnNpZW50KFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICk6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNpZW50RGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSk7XG4gICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICBtYXBba2V5XSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVMZWdhY3lNc3BDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSB0aGlzLmNvbmZpZy5sZWdhY3lNc3BDb3VudCA/PyAxO1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihjb25maWd1cmVkKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpIHx8IHBhcnNlZCA8IDEpIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLmZsb29yKHBhcnNlZCk7XG4gIH1cblxuICBwcml2YXRlIHBpY2tMZWdhY3lDYW5kaWRhdGVzKFxuICAgIGNhbmRpZGF0ZXM6IE1zcERldGFpbHNbXSxcbiAgICBsaW1pdDogbnVtYmVyXG4gICk6IE1zcERldGFpbHNbXSB7XG4gICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYXZhaWxhYmxlID0gWy4uLmNhbmRpZGF0ZXNdO1xuICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWluKGxpbWl0LCBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICBjb25zdCBwaWNrZWQ6IE1zcERldGFpbHNbXSA9IFtdO1xuICAgIHdoaWxlIChwaWNrZWQubGVuZ3RoIDwgdGFyZ2V0ICYmIGF2YWlsYWJsZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgICAgY29uc3QgW3NlbGVjdGlvbl0gPSBhdmFpbGFibGUuc3BsaWNlKGlkeCwgMSk7XG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHBpY2tlZC5wdXNoKHNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBMZWdhY3lQZWVyVGFyZ2V0W10ge1xuICAgIGNvbnN0IHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W10gPSBbXG4gICAgICB7XG4gICAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgICAgIHRsc0NlcnQ6IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBsZXQgZW5kb3JzaW5nT3JncyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgIGVuZG9yc2luZ09yZ3MgPSBBcnJheS5pc0FycmF5KGVuZG9yc2luZ09yZ3MpXG4gICAgICA/IGVuZG9yc2luZ09yZ3NcbiAgICAgIDogW2VuZG9yc2luZ09yZ3NdO1xuICAgIGNvbnN0IGVuZG9yc2VycyA9XG4gICAgICBlbmRvcnNpbmdPcmdzLmZpbHRlcigob3JnKTogb3JnIGlzIHN0cmluZyA9PiBCb29sZWFuKG9yZykpIHx8IFtdO1xuICAgIGNvbnN0IGV4dHJhcyA9IGVuZG9yc2Vycy5maWx0ZXIoKG9yZykgPT4gb3JnICE9PSB0aGlzLmNvbmZpZy5tc3BJZCk7XG4gICAgaWYgKCFleHRyYXMubGVuZ3RoKSByZXR1cm4gcGVlcnM7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLmNvbmZpZy5tc3BNYXA7XG4gICAgY29uc3QgbGVnYWN5Q291bnQgPSB0aGlzLnJlc29sdmVMZWdhY3lNc3BDb3VudCgpO1xuICAgIGZvciAoY29uc3QgbXNwIG9mIGV4dHJhcykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG1hcD8uW21zcF07XG4gICAgICBpZiAoIWNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnBpY2tMZWdhY3lDYW5kaWRhdGVzKGNhbmRpZGF0ZXMsIGxlZ2FjeUNvdW50KTtcbiAgICAgIGlmICghc2VsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHZhbGlkIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNob2ljZSBvZiBzZWxlY3Rpb25zKSB7XG4gICAgICAgIGlmICghY2hvaWNlLmVuZHBvaW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBwZWVyIG1hcHBpbmcgZm9yIE1TUCAke21zcH06IG1pc3NpbmcgZW5kcG9pbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwZWVycy5wdXNoKHtcbiAgICAgICAgICBtc3BJZDogbXNwLFxuICAgICAgICAgIHBlZXJFbmRwb2ludDogY2hvaWNlLmVuZHBvaW50LFxuICAgICAgICAgIHBlZXJIb3N0QWxpYXM6IGNob2ljZS5hbGlhcyxcbiAgICAgICAgICB0bHNDZXJ0OiBjaG9pY2UudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGVlcnM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGZjbjogc3RyaW5nLFxuICAgIGFyZ3M6IHN0cmluZ1tdLFxuICAgIHRyYW5zaWVudE1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCxcbiAgICBwZWVyQ29uZmlnczogTGVnYWN5UGVlclRhcmdldFtdLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMpO1xuICAgIGNvbnN0IHBlZXJzID0gdGhpcy5ub3JtYWxpemVMZWdhY3lQZWVycyhwZWVyQ29uZmlncyk7XG4gICAgY29uc3QgaWRlbnRpdHlNYXRlcmlhbCA9IGF3YWl0IHRoaXMucmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBXYWxsZXRzLm5ld0luTWVtb3J5V2FsbGV0KCk7XG4gICAgY29uc3QgaWRlbnRpdHlMYWJlbCA9IGAke3RoaXMuY29uZmlnLm1zcElkfS1sZWdhY3lgO1xuICAgIGF3YWl0IHdhbGxldC5wdXQoaWRlbnRpdHlMYWJlbCwge1xuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICB0eXBlOiBcIlguNTA5XCIsXG4gICAgfSBhcyBJZGVudGl0eSk7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uUHJvZmlsZSA9IGF3YWl0IHRoaXMuYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVycyk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IG5ldyBMZWdhY3lHYXRld2F5KCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ2F0ZXdheS5jb25uZWN0KGNvbm5lY3Rpb25Qcm9maWxlLCB7XG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eUxhYmVsLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXNMb2NhbGhvc3Q6IHRoaXMuc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGxzSW5mbzoge1xuICAgICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICAgIGtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBhd2FpdCBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5jb25maWcuY2hhbm5lbCk7XG4gICAgICBjb25zdCBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoXG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZU5hbWUsXG4gICAgICAgIHRoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSlcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGNvbnRyYWN0LmNyZWF0ZVRyYW5zYWN0aW9uKGZjbik7XG5cbiAgICAgIGlmICh0cmFuc2llbnRNYXApIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpZW50KHRyYW5zaWVudE1hcCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZG9yc2VycyA9IHBlZXJzXG4gICAgICAgIC5tYXAoKHBlZXIpID0+IG5ldHdvcmsuZ2V0Q2hhbm5lbCgpLmdldEVuZG9yc2VyKHBlZXIubmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGVuZG9yc2VyKTogZW5kb3JzZXIgaXMgRW5kb3JzZXIgPT4gQm9vbGVhbihlbmRvcnNlcikpO1xuICAgICAgaWYgKGVuZG9yc2Vycy5sZW5ndGgpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0RW5kb3JzaW5nUGVlcnMoZW5kb3JzZXJzKTtcbiAgICAgIH1cblxuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBMZWdhY3kgc3VibWl0dGluZyAke3RoaXMuZ2V0Q29udHJhY3ROYW1lKGNsYXNzTmFtZSkgfHwgdGhpcy5jb25maWcuY29udHJhY3ROYW1lfS4ke2Zjbn0gdmlhIHBlZXJzICR7cGVlcnMubWFwKChwKSA9PiBwLnBlZXJFbmRwb2ludCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uLnN1Ym1pdCguLi5hcmdzKTtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20ocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ2F0ZXdheS5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMZWdhY3lQZWVycyhcbiAgICBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdXG4gICk6IExlZ2FjeVBlZXJXaXRoTmFtZVtdIHtcbiAgICBjb25zdCBkZWR1cGVkID0gbmV3IE1hcDxzdHJpbmcsIExlZ2FjeVBlZXJXaXRoTmFtZT4oKTtcbiAgICBjb25zdCBhZGRQZWVyID0gKHBlZXI6IExlZ2FjeVBlZXJUYXJnZXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BlZXIucGVlckVuZHBvaW50fXwke3BlZXIucGVlckhvc3RBbGlhcyB8fCBcIlwifWA7XG4gICAgICBpZiAoZGVkdXBlZC5oYXMoa2V5KSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmFtZSA9IGBwZWVyLSR7cGVlci5tc3BJZH0tJHtkZWR1cGVkLnNpemV9YDtcbiAgICAgIGRlZHVwZWQuc2V0KGtleSwge1xuICAgICAgICAuLi5wZWVyLFxuICAgICAgICBuYW1lLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHBlZXJzLmZvckVhY2goYWRkUGVlcik7XG4gICAgYWRkUGVlcih7XG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShkZWR1cGVkLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTogUHJvbWlzZTx7XG4gICAgY2VydGlmaWNhdGU6IHN0cmluZztcbiAgICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIHJldHVybiB7IGNlcnRpZmljYXRlLCBwcml2YXRlS2V5IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKSB7XG4gICAgY29uc3QgcGVlckVudHJpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBjaGFubmVsUGVlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBvcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICBjb25zdCB0bHNQZW0gPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgICAgcGVlci50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnRcbiAgICAgICk7XG4gICAgICBjb25zdCBob3N0bmFtZSA9XG4gICAgICAgIHBlZXIucGVlckhvc3RBbGlhcyB8fCB0aGlzLmV4dHJhY3RIb3N0KHBlZXIucGVlckVuZHBvaW50KTtcbiAgICAgIHBlZXJFbnRyaWVzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIHVybDogdGhpcy5lbnN1cmVHcnBjVXJsKHBlZXIucGVlckVuZHBvaW50KSxcbiAgICAgICAgdGxzQ0FDZXJ0czogeyBwZW06IHRsc1BlbSB9LFxuICAgICAgICBncnBjT3B0aW9uczoge1xuICAgICAgICAgIFwic3NsLXRhcmdldC1uYW1lLW92ZXJyaWRlXCI6IGhvc3RuYW1lLFxuICAgICAgICAgIGhvc3RuYW1lT3ZlcnJpZGU6IGhvc3RuYW1lLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNoYW5uZWxQZWVyc1twZWVyLm5hbWVdID0ge1xuICAgICAgICBlbmRvcnNpbmdQZWVyOiB0cnVlLFxuICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZSxcbiAgICAgICAgbGVkZ2VyUXVlcnk6IHRydWUsXG4gICAgICAgIGV2ZW50U291cmNlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0gPSBvcmdzW3BlZXIubXNwSWRdIHx8IHtcbiAgICAgICAgbXNwaWQ6IHBlZXIubXNwSWQsXG4gICAgICAgIHBlZXJzOiBbXSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdLnBlZXJzLnB1c2gocGVlci5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogXCJsZWdhY3ktbWFudWFsXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICBjbGllbnQ6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIH0sXG4gICAgICBvcmdhbml6YXRpb25zOiBvcmdzLFxuICAgICAgcGVlcnM6IHBlZXJFbnRyaWVzLFxuICAgICAgb3JkZXJlcnM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmNoYW5uZWxdOiB7XG4gICAgICAgICAgcGVlcnM6IGNoYW5uZWxQZWVycyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwZWVycy5ldmVyeSgocGVlcikgPT4gdGhpcy5pc0xvY2FsRW5kcG9pbnQocGVlci5wZWVyRW5kcG9pbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMb2NhbEVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5leHRyYWN0SG9zdChlbmRwb2ludCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gaG9zdCA9PT0gXCJsb2NhbGhvc3RcIiB8fCBob3N0ID09PSBcIjEyNy4wLjAuMVwiO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG9zdChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBlbmRwb2ludC5yZXBsYWNlKC9eZ3JwY3M/OlxcL1xcLy8sIFwiXCIpO1xuICAgIHJldHVybiBzYW5pdGl6ZWQuc3BsaXQoXCI6XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVHcnBjVXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICgvXmdycGNzPzpcXC9cXC8vaS50ZXN0KGVuZHBvaW50KSkgcmV0dXJuIGVuZHBvaW50O1xuICAgIHJldHVybiBgZ3JwY3M6Ly8ke2VuZHBvaW50fWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRQZW1JbnB1dChzb3VyY2U/OiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgY2VydGlmaWNhdGUgb3Iga2V5IG1hdGVyaWFsXCIpO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc291cmNlKSkgcmV0dXJuIHNvdXJjZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgY29uc3QgdHJpbW1lZCA9IHNvdXJjZS50cmltKCk7XG4gICAgaWYgKC8tLS0tLUJFR0lOIFtBLVogXSstLS0tLS8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHNvdXJjZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBpZiAoc3RhdHM/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gKGF3YWl0IHJlYWRGc0ZpbGUoc291cmNlKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvciB8IHN0cmluZyk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLnBhcnNlRXJyb3I8RT4oZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgY3R4OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBhcGk6IHN0cmluZyxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucz86IEFycmF5PHN0cmluZz4sXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGlmICh0aGlzLnNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4KSkge1xuICAgICAgY29uc3QgbGVnYWN5QXJncyA9IHRoaXMucHJlcGFyZUxlZ2FjeUFyZ3MoYXJncyk7XG4gICAgICBjb25zdCB0cmFuc2llbnRNYXAgPSB0aGlzLmJ1aWxkTGVnYWN5VHJhbnNpZW50KHRyYW5zaWVudERhdGEpO1xuICAgICAgY29uc3QgcGVlckNvbmZpZ3MgPSB0aGlzLmJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MoY3R4KTtcbiAgICAgIHJldHVybiB0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICAgICAgY3R4LFxuICAgICAgICBhcGksXG4gICAgICAgIGxlZ2FjeUFyZ3MsXG4gICAgICAgIHRyYW5zaWVudE1hcCxcbiAgICAgICAgcGVlckNvbmZpZ3MsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICB0cnVlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENsb3NlcyB0aGUgYWN0aXZlIGRpc3BhdGNoICh3aGljaCBpbiB0dXJuIGNsb3NlcyBhbnkgZ2F0ZXdheVxuICAgKiBldmVudCBzdWJzY3JpcHRpb24pIHZpYSB0aGUgYmFzZSBjbGFzcywgdGhlbiBjbG9zZXMgdGhlIGdSUEMgY2xpZW50LlxuICAgKiBXb3JrcyBjb3JyZWN0bHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBzeW50aGV0aWNFdmVudHNgIGlzIGVuYWJsZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzaHV0ZG93biguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmFzZSBjbGFzcyBoYW5kbGVzIGRpc3BhdGNoLmNsb3NlKCkgaW50ZXJuYWxseS5cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93biguLi5hcmdzKTtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjbGllbnRgKTtcbiAgICAgIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgY2hhaW5jb2RlIGNvbnRyYWN0IGZyb20gdGhlIHNwZWNpZmllZCBuZXR3b3JrXG4gICAqIEBwYXJhbSB7R2F0ZXdheX0gZ2F0ZXdheSAtIFRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtDb250cmFrdH0gVGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29udHJhY3QoXG4gICAgZ2F0ZXdheTogR2F0ZXdheSxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nXG4gICk6IENvbnRyYWt0IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDb250cmFjdCk7XG4gICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yayhnYXRld2F5LCBjb25maWcuY2hhbm5lbCk7XG4gICAgbGV0IGNvbnRyYWN0OiBDb250cmFrdDtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgUmV0cmlldmluZyBjaGFpbmNvZGUgJHtjb25maWcuY2hhaW5jb2RlTmFtZX0gY29udHJhY3QgJHtjb250cmFjdE5hbWUgfHwgY29uZmlnLmNvbnRyYWN0TmFtZX0gZnJvbSBuZXR3b3JrICR7Y29uZmlnLmNoYW5uZWx9YFxuICAgICAgKTtcbiAgICAgIGNvbnRyYWN0TmFtZSA9IGNvbnRyYWN0TmFtZSA/IGNvbnRyYWN0TmFtZSA6IGNvbmZpZy5jb250cmFjdE5hbWU7XG4gICAgICBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY29uZmlnLmNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIE5ldHdvcmsgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdG8gYSBzcGVjaWZpYyBjaGFubmVsIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEByZXR1cm4ge05ldHdvcmt9IFRoZSBOZXR3b3JrIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0TmV0d29yayhnYXRld2F5OiBHYXRld2F5LCBjaGFubmVsTmFtZTogc3RyaW5nKTogTmV0d29yayB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXROZXR3b3JrKTtcbiAgICBsZXQgbmV0d29yazogTmV0d29yaztcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNoYW5uZWwgJHtjaGFubmVsTmFtZX1gKTtcbiAgICAgIG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtDbGllbnR9IFtjbGllbnRdIC0gT3B0aW9uYWwgZ1JQQyBjbGllbnQsIHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRHYXRld2F5KFxuICAgIGN0eDogQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsaWVudD86IENsaWVudFxuICApIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNsaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRDbGllbnQoY29uZmlnKSksXG4gICAgICBjb25maWcsXG4gICAgICBjdHhcbiAgICApKSBhcyBHYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNsaWVudCB3aXRoIFRMUyBjcmVkZW50aWFscyBmb3Igc2VjdXJlIGNvbW11bmljYXRpb25cbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NsaWVudH0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBzdGF0aWMgZ2V0Q2xpZW50KGNvbmZpZzogUGVlckNvbmZpZyk6IENsaWVudCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2xpZW50KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgVExTIGNyZWRlbnRpYWxzIGZvciBtc3AgJHtjb25maWcubXNwSWR9YCk7XG4gICAgbGV0IHBhdGhPckNlcnQ6IHN0cmluZyB8IEJ1ZmZlciA9IGNvbmZpZy50bHNDZXJ0IGFzIHN0cmluZyB8IEJ1ZmZlcjtcblxuICAgIGlmICh0eXBlb2YgcGF0aE9yQ2VydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoT3JDZXJ0Lm1hdGNoKFxuICAgICAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20ocGF0aE9yQ2VydCwgXCJ1dGY4XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20oZnMucmVhZEZpbGVTeW5jKHBhdGhPckNlcnQsIFwidXRmOFwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCB0aGUgdGxzIGNlcnRpZmljYXRlIGZyb20gJHtwYXRoT3JDZXJ0fTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGxzQ3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbChwYXRoT3JDZXJ0KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgR2F0ZXdheSBDbGllbnQgZm9yIHVybCAke2NvbmZpZy5wZWVyRW5kcG9pbnR9YCk7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoY29uZmlnLnBlZXJFbmRwb2ludCwgdGxzQ3JlZGVudGlhbHMsIHtcbiAgICAgIFwiZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICAgIFwiZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSBjb25uZWN0aW9uIHdpdGggaWRlbnRpdHkgYW5kIHNpZ25lclxuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gVGhlIGdSUEMgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29ubmVjdGVkIEdhdGV3YXlcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IElkZW50aXR5XG4gICAqICAgcGFydGljaXBhbnQgU2lnbmVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0FkYXB0ZXI6IGdldENvbm5lY3Rpb24oY2xpZW50LCBjb25maWcpXG4gICAqICAgRmFicmljQWRhcHRlci0+PklkZW50aXR5OiBnZXRJZGVudGl0eShtc3BJZCwgY2VydERpcmVjdG9yeVBhdGgpXG4gICAqICAgSWRlbnRpdHktLT4+RmFicmljQWRhcHRlcjogaWRlbnRpdHlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+U2lnbmVyOiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aClcbiAgICogICBTaWduZXItLT4+RmFicmljQWRhcHRlcjogc2lnbmVyXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IENyZWF0ZSBDb25uZWN0T3B0aW9uc1xuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KG9wdGlvbnMpXG4gICAqICAgR2F0ZXdheS0tPj5GYWJyaWNBZGFwdGVyOiBnYXRld2F5XG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DYWxsZXI6IGdhdGV3YXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb25uZWN0aW9uKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjdHg6IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0Q29ubmVjdGlvbik7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYFJldHJpZXZpbmcgUGVlciBJZGVudGl0eSBmb3IgJHtjb25maWcubXNwSWR9IHVuZGVyICR7Y29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRofWBcbiAgICApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgZ2V0SWRlbnRpdHkoXG4gICAgICBjb25maWcubXNwSWQsXG4gICAgICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgcHJlcGFyaW5nIHRyYW5zYWN0aW9uIHNpZ25lciBmb3IgJHtDcnlwdG9VdGlscy5mYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZShpZGVudGl0eS5jcmVkZW50aWFscy50b1N0cmluZygpKX1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgRmFicmljIElEIGZyb20gY2VydGlmaWNhdGVgLCBlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmVyOiBTaWduZXI7XG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7fTtcbiAgICBpZiAoIWNvbmZpZy5oc20pIHtcbiAgICAgIHNpZ25lciA9IGF3YWl0IGdldFNpZ25lcihjb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zdCBoc20gPSBuZXcgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbShjb25maWcuaHNtLmxpYnJhcnkpO1xuICAgICAgLy8gY29uc3QgaWRlbnRpZmllciA9IGhzbS5nZXRTS0lGcm9tQ2VydGlmaWNhdGVQYXRoKFxuICAgICAgLy8gICBjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55XG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc3QgcGtjczExU2lnbmVyID0gaHNtLm5ld1NpZ25lcih7XG4gICAgICAvLyAgIGxhYmVsOiBjb25maWcuaHNtLnRva2VuTGFiZWwgYXMgc3RyaW5nLFxuICAgICAgLy8gICBwaW46IFN0cmluZyhjb25maWcuaHNtLnBpbikgYXMgc3RyaW5nLFxuICAgICAgLy8gICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgLy8gICAvLyB1c2VyVHlwZTogMSAvKkNLVV9VU0VSICovLFxuICAgICAgLy8gfSk7XG4gICAgICAvLyBzaWduZXIgPSBwa2NzMTFTaWduZXIuc2lnbmVyO1xuICAgICAgLy8gY2xvc2UgPSBwa2NzMTFTaWduZXIuY2xvc2U7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIkhTTSBOT1QgSU1QTEVNRU5URURcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNsaWVudCxcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICAgIHNpZ25lcjogc2lnbmVyLFxuICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0cyBmb3IgZGlmZmVyZW50IGdSUEMgY2FsbHNcbiAgICAgIGV2YWx1YXRlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZXZhbHVhdGVUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGVuZG9yc2VPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJlbmRvcnNlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgc3VibWl0T3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwic3VibWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBjb21taXRTdGF0dXNPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJjb21taXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDEgbWludXRlXG4gICAgICB9LFxuICAgIH0gYXMgQ29ubmVjdE9wdGlvbnM7XG5cbiAgICBsb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjb25maWcubXNwSWR9YCk7XG4gICAgY29uc3QgZ2F0ZXdheSA9IGNvbm5lY3Qob3B0aW9ucyk7XG5cbiAgICAvLyBUT0RPOiByZXBsYWNlP1xuICAgIGlmIChjb25maWcuaHNtKSB7XG4gICAgICBnYXRld2F5LmNsb3NlID0gbmV3IFByb3h5KGdhdGV3YXkuY2xvc2UsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0OiAoKSA9PiB2b2lkLCB0aGlzQXJnOiBhbnksIGFyZ0FycmF5OiBhbnlbXSk6IGFueSB7XG4gICAgICAgICAgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KTtcbiAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBGYWJyaWNDbGllbnREaXNwYXRjaCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLlxuICAgKiBAcmV0dXJucyB7RGlzcGF0Y2h9IEEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBGYWJyaWMgY2xpZW50LlxuICAgKiBAcmVtYXJrcyBUaGUgRGlzcGF0Y2ggaW5zdGFuY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgbG9naWMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrLCBzdWNoIGFzIHN1Ym1pdHRpbmcgdHJhbnNhY3Rpb25zIG9yIHF1ZXJ5aW5nIGRhdGEuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGZhYnJpY0Rpc3BhdGNoID0gZmFicmljQ2xpZW50QWRhcHRlci5EaXNwYXRjaCgpO1xuICAgKiBmYWJyaWNEaXNwYXRjaC5zdWJtaXRUcmFuc2FjdGlvbignY3JlYXRlUHJvZHVjdCcsIHsgbmFtZTogJ1Byb2R1Y3QgQScsIHByaWNlOiAxMDAgfSk7XG4gICAqL1xuICBvdmVycmlkZSBEaXNwYXRjaCgpOiBGYWJyaWNDbGllbnREaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBpbnRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGFueSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIEJhc2VFcnJvciB1c2luZyB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihcbiAgICBlcnI6IEVycm9yIHwgc3RyaW5nIHwgR2F0ZXdheUVycm9yXG4gICk6IEUge1xuICAgIC8vIGlmIChcbiAgICAvLyAgIE1JU1NJTkdfUFJJVkFURV9EQVRBX1JFR0VYLnRlc3QoXG4gICAgLy8gICAgIHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZVxuICAgIC8vICAgKVxuICAgIC8vIClcbiAgICAvLyAgIHJldHVybiBuZXcgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MoZXJyKSBhcyBFO1xuXG4gICAgbGV0IG1zZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgR2F0ZXdheUVycm9yICYmIGVyci5kZXRhaWxzLmxlbmd0aCAmJiBlcnIuY29kZSA9PT0gMTApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlcnIgaW5zdGFuY2VvZiBFbmRvcnNlRXJyb3IgJiZcbiAgICAgIGVyci5kZXRhaWxzLmxlbmd0aCAmJlxuICAgICAgZXJyLmNvZGUgPT09IDEwICYmXG4gICAgICBlcnIuZGV0YWlsc1swXS5tZXNzYWdlPy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpXG4gICAgKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIk1WQ0NfUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgTXZjY1JlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJERUFETElORV9FWENFRURFRFwiKSlcbiAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkVORE9SU0VNRU5UX1BPTElDWV9GQUlMVVJFXCIpKVxuICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudFBvbGljeUVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJQSEFOVE9NX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgIHN3aXRjaCAoKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRFcnJvcihlcnIpIGFzIEU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhWYWxpZGF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxufVxuXG5GYWJyaWNDbGllbnRBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIENvbnRleHR1YWxBcmdzLFxuICBEaXNwYXRjaCxcbiAgRXZlbnRJZHMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIENvbnRleHQsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFBlZXJDb25maWcgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVFdmVudCxcbiAgQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZSxcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgcGFyc2VFdmVudE5hbWUgfSBmcm9tIFwiLi4vc2hhcmVkL2V2ZW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBkaXNwYXRjaGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICogQHN1bW1hcnkgTGlzdGVucyBmb3IgYW5kIHByb2Nlc3NlcyBldmVudHMgZW1pdHRlZCBieSBGYWJyaWMgY2hhaW5jb2RlLCBkaXNwYXRjaGluZyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IEZhYnJpY0FkYXB0ZXIuZ2V0Q2xpZW50KHBlZXJDb25maWcpO1xuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KTtcbiAqXG4gKiAvLyBDb25maWd1cmUgdGhlIGRpc3BhdGNoIHdpdGggcGVlciBjb25maWd1cmF0aW9uXG4gKiBkaXNwYXRjaC5jb25maWd1cmUocGVlckNvbmZpZyk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgc3BlY2lmaWMgdGFibGUgYW5kIGV2ZW50XG4gKiBkaXNwYXRjaC5vYnNlcnZlKCd1c2VycycsICdjcmVhdGUnLCAoaWQpID0+IHtcbiAqICAgY29uc29sZS5sb2coYFVzZXIgY3JlYXRlZDogJHtpZH1gKTtcbiAqIH0pO1xuICpcbiAqIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgZXZlbnRzXG4gKiBhd2FpdCBkaXNwYXRjaC5zdGFydCgpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudClcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IGNvbmZpZ3VyZShwZWVyQ29uZmlnKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogb2JzZXJ2ZSh0YWJsZSwgZXZlbnQsIGNhbGxiYWNrKVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogc3RhcnQoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBpbml0aWFsaXplKClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5HYXRld2F5OiBnZXRHYXRld2F5KGNvbmZpZywgY2xpZW50KVxuICogICBHYXRld2F5LT4+TmV0d29yazogZ2V0TmV0d29yayhjaGFubmVsKVxuICogICBOZXR3b3JrLT4+TmV0d29yazogZ2V0Q2hhaW5jb2RlRXZlbnRzKGNoYWluY29kZU5hbWUpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gKiAgIGxvb3AgRm9yIGVhY2ggZXZlbnRcbiAqICAgICBDaGFpbmNvZGUtLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChwYXlsb2FkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkKVxuICogICAgIEZhYnJpY0Rpc3BhdGNoLS0+PkNsaWVudDogY2FsbGJhY2soaWQpXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50RGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxGYWJyaWNDbGllbnRBZGFwdGVyPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgbGlzdGVuaW5nIHN0YWNrIGZvciBjaGFpbmNvZGUgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbmluZ1N0YWNrPzogQ2xvc2VhYmxlQXN5bmNJdGVyYWJsZTxDaGFpbmNvZGVFdmVudD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgZXZlbnQgcGF5bG9hZHMgZnJvbSBieXRlcyB0byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGRpc3BhdGNoZXIgZm9yIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjbGllbnQ6IENsaWVudCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZXZlbnQgbGlzdGVuaW5nIGNvbm5lY3Rpb25cbiAgICogQHN1bW1hcnkgU3RvcHMgbGlzdGVuaW5nIGZvciBjaGFpbmNvZGUgZXZlbnRzIGFuZCByZWxlYXNlcyByZXNvdXJjZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjbG9zZShcbiAgICAuLi5jdHhBcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3M6IGxvZ2dlZEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGN0eEFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TSFVURE9XTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNsb3NlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuY2xvc2UoLi4ubG9nZ2VkQXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIHByb3hpZXMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlzdGVuaW5nU3RhY2suY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGV2ZW50IHBheWxvYWQgZnJvbSBiaW5hcnkgZm9ybWF0XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgVWludDhBcnJheSBjb250YWluaW5nIEpTT04gdG8gYW4gb2JqZWN0IHdpdGggYW4gaWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBqc29uQnl0ZXMgLSBUaGUgYmluYXJ5IHBheWxvYWQgZnJvbSB0aGUgY2hhaW5jb2RlIGV2ZW50XG4gICAqIEByZXR1cm4ge3sgaWQ6IHN0cmluZyB9fSBUaGUgcGFyc2VkIHBheWxvYWQgY29udGFpbmluZyB0aGUgcmVjb3JkIElEXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUGF5bG9hZChqc29uQnl0ZXM6IFVpbnQ4QXJyYXkpOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9IHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5kZWNvZGVyLmRlY29kZShqc29uQnl0ZXMpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb3ZlcnJpZGUgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogKCkgPT4gdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBGYWJyaWNDbGllbnRBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgRmFicmljQ2xpZW50QWRhcHRlciBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIlxuICAgICAgKTtcbiAgICBzdXBlci5vYnNlcnZlKG9ic2VydmVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge2FueX0gcGF5bG9hZCAtIFRoZSBldmVudCBwYXlsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8YW55PiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBBZGFwdGVyLmxvZ0N0eDxDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPj4oXG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyxcbiAgICAgIGV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3R5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKX06JHtldmVudH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2gobW9kZWwsIGV2ZW50LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSB0aGUgY2hhaW5jb2RlIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlbnQgaGFuZGxpbmcgc3RvcHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFN0YWNrXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRQYXJzZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAgICpcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRTdGFjazogZm9yIGF3YWl0IChjb25zdCBldnQgb2YgbGlzdGVuaW5nU3RhY2spXG4gICAqICAgRXZlbnRTdGFjay0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50UGFyc2VyOiBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKVxuICAgKiAgIEV2ZW50UGFyc2VyLS0+PkZhYnJpY0Rpc3BhdGNoOiB7IHRhYmxlLCBldmVudCwgb3duZXIgfVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IENoZWNrIGlmIGV2ZW50IGlzIGZvciB0aGlzIE1TUFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlUGF5bG9hZChldnQucGF5bG9hZClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+Pk9ic2VydmVyczogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgcGF5bG9hZC5pZClcbiAgICogICBPYnNlcnZlcnMtLT4+RmFicmljRGlzcGF0Y2g6IENhbGxiYWNrcyBleGVjdXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUV2ZW50cyhcbiAgICBjdHhBcmc/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubGlzdGVuaW5nU3RhY2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEV2ZW50IHN0YWNrIG5vdCBpbml0aWFsaXplZC4gRW5zdXJlIHRoYXQgXCJzdGFydExpc3RlbmluZ1wiIGlzIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGlzIG9wZXJhdGlvbi5gXG4gICAgICApO1xuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIgfHwgIXRoaXMuYWRhcHRlci5jb25maWcpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBmb3VuZC4gc2hvdWxkIGJlIGltcG9zc2libGVgKTtcblxuICAgIGNvbnN0IGN0eCA9XG4gICAgICBjdHhBcmcgfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICAodGhpcy5tb2RlbHMgJiYgdGhpcy5tb2RlbHNbMF0pIHx8IChNb2RlbCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yKVxuICAgICAgKSk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaGFuZGxlRXZlbnRzKTtcblxuICAgIGxvZy5pbmZvKFxuICAgICAgYExpc3RlbmluZyBmb3IgaW5jb21pbmcgZXZlbnRzIG9uIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIi4uLmBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZSwgZXZlbnQsIG93bmVyIH0gPSBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcEV2ZW50T25seSAmJlxuICAgICAgICAgIG93bmVyICYmXG4gICAgICAgICAgb3duZXIgIT09IHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcElkXG4gICAgICAgIClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSA9IHRoaXMucGFyc2VQYXlsb2FkKFxuICAgICAgICAgIGV2dC5wYXlsb2FkXG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSB0YWJsZVxuICAgICAgICAgICAgPyBNb2RlbC5nZXQodGFibGUpXG4gICAgICAgICAgICA6IE1vZGVsLmdldCh0aGlzLm1vZGVsc1swXS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBtb2RlbFJlZiA9IHRhcmdldE1vZGVsID8/ICh0YWJsZSB8fCB0aGlzLm1vZGVsc1swXT8ubmFtZSk7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBcmdzID0gcGF5bG9hZC5yZXN1bHQgPyBbcGF5bG9hZC5yZXN1bHQsIGN0eF0gOiBbY3R4XTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIG1vZGVsUmVmIGFzIENvbnN0cnVjdG9yIHwgc3RyaW5nLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkLmlkIGFzIHN0cmluZyxcbiAgICAgICAgICAgIC4uLihvYnNlcnZlckFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8YW55PilcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB1cGRhdGUgb2JzZXJ2YWJsZXMgZm9yIHRhYmxlICR7dGFibGV9IGV2ZW50ICR7ZXZlbnR9IGlkOiAke3BheWxvYWQuaWR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGV2ZW50IGZvciBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCI6ICR7ZX1gXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgZXZlbnQgZGlzcGF0Y2hpbmcgZm9yIHRoZSBvYnNlcnZlZCBhZGFwdGVyLiBXaGVuXG4gICAqIGBzeW50aGV0aWNFdmVudHNgIGlzIHRydWUgKHRoZSBkZWZhdWx0KSBubyBnYXRld2F5IGNvbm5lY3Rpb24gaXMgb3BlbmVkO1xuICAgKiBpbnN0ZWFkIGV2ZXJ5IENSVUQgb3BlcmF0aW9uIGlzIHdyYXBwZWQgd2l0aCBhIFByb3h5IHRoYXQgZmlyZXNcbiAgICogYHVwZGF0ZU9ic2VydmVyc2AgZm9yICoqYWxsKiogbW9kZWxzLiBXaGVuIGBzeW50aGV0aWNFdmVudHNgIGlzIGZhbHNlIHRoZVxuICAgKiBleGlzdGluZyBnYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZVxuICAgKiBsb2NhbCBQcm94eSBmYWxsYmFjayBpcyBsaW1pdGVkIHRvIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzIG9ubHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9yIGNvbmZpZyBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcblxuICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50cyA9IHRoaXMuYWRhcHRlci5jb25maWcuc3ludGhldGljRXZlbnRzICE9PSBmYWxzZTtcblxuICAgIGlmICghc3ludGhldGljRXZlbnRzKSB7XG4gICAgICAvLyBHYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gKG5vbi1zeW50aGV0aWMgcGF0aClcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgXCJkaXNwYXRjaFwiLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBNb2RlbCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmluaXRpYWxpemUpO1xuICAgICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShcbiAgICAgICAgY3R4LFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnIGFzIFBlZXJDb25maWcsXG4gICAgICAgIHRoaXMuY2xpZW50XG4gICAgICApO1xuICAgICAgY29uc3QgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWwpO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IGF3YWl0IG5ldHdvcmsuZ2V0Q2hhaW5jb2RlRXZlbnRzKFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLmhhbmRsZUV2ZW50cyhjdHgpO1xuICAgIH1cblxuICAgIC8vIFByb3h5IENSVUQgbWV0aG9kcy5cbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gdHJ1ZSAg4oaSIG5vdGlmeSBmb3IgQUxMIG1vZGVscyAocmVwbGFjZXMgZ2F0ZXdheSBldmVudHMgZW50aXJlbHkpXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IGZhbHNlIOKGkiBub3RpZnkgb25seSBmb3IgZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHNcbiAgICAvLyAgICh0aGUgZ2F0ZXdheSBzdWJzY3JpcHRpb24gaGFuZGxlcyBwdWJsaWMgbW9kZWxzKVxuICAgIChcbiAgICAgIFtcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIF0gYXMgKGtleW9mIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgodG9XcmFwKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE5vIGFkYXB0ZXIgcHJvdmlkZWQgZm9yIHRoZSBmYWxsYmFjayBvZiBmdWxseSBzZWdyZWdhdGVkIG1vZGVsc2BcbiAgICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyW3RvV3JhcF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHt0b1dyYXB9IG5vdCBmb3VuZCBpbiAke3RoaXMuYWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5hZGFwdGVyLCB0b1dyYXApO1xuICAgICAgbGV0IHByb3RvOiBhbnkgPSB0aGlzLmFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgdG9XcmFwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHt0b1dyYXB9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIHRoaXMuYWRhcHRlclt0b1dyYXBdID0gbmV3IFByb3h5KHRoaXMuYWRhcHRlclt0b1dyYXBdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAoXG4gICAgICAgICAgdGFyZ2V0OiBhbnksXG4gICAgICAgICAgdGhpc0FyZzogRmFicmljQ2xpZW50QWRhcHRlcixcbiAgICAgICAgICBhcmdBcnJheTogYW55W11cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgLy8gUnVuIHRoZSBvcmlnaW5hbCBtZXRob2QgdW5jaGFuZ2VkIHNvIHRyYW5zaWVudCBkYXRhIGlzIHByZXNlcnZlZFxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG5cbiAgICAgICAgICBjb25zdCBjbGF6ejogQ29uc3RydWN0b3I8YW55PiA9IGFyZ0FycmF5WzBdO1xuICAgICAgICAgIC8vIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIGZhbHNlLCBwdWJsaWMgbW9kZWxzIGVtaXQgYSBjaGFpbmNvZGUgZXZlbnRcbiAgICAgICAgICAvLyBvbiB0aGUgY29udHJhY3Qgc2lkZTsgc2tpcCB0aGUgbG9jYWwgZmFsbGJhY2sgdG8gYXZvaWRcbiAgICAgICAgICAvLyBkb3VibGUtbm90aWZpY2F0aW9uLiBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyB0cnVlIHdlIGhhbmRsZSBhbGwgbW9kZWxzLlxuICAgICAgICAgIGlmICghc3ludGhldGljRXZlbnRzICYmICFNb2RlbC5pc1RyYW5zaWVudChjbGF6eikpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgICAvLyBDb250ZXh0IGlzIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50IG9mIGFyZ0FycmF5XG4gICAgICAgICAgY29uc3QgeyBsb2csIGN0eEFyZ3MsIGN0eCB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShcbiAgICAgICAgICAgIGFyZ0FycmF5LnNsaWNlKGFyZ0FycmF5Lmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpZHMgPSBhcmdBcnJheVsxXTtcbiAgICAgICAgICBjb25zdCByZXN1bHRBcmdzOiBhbnlbXSA9IFtjbGF6eiwgYnVsa1RvU2luZ2xlKHRvV3JhcCksIGlkc107XG5cbiAgICAgICAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwib2JzZXJ2ZUZ1bGxSZXN1bHRcIikpIHtcbiAgICAgICAgICAgIHJlc3VsdEFyZ3MucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIC4uLihyZXN1bHRBcmdzIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHRoaXMudXBkYXRlT2JzZXJ2ZXJzPiksXG4gICAgICAgICAgICAuLi5jdHhBcmdzXG4gICAgICAgICAgKS5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke3RvV3JhcH0gb24gJHtjbGF6ei5uYW1lIHx8IGNsYXp6fSBmb3IgJHtpZHN9OiAke2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmlmIChGYWJyaWNDbGllbnRBZGFwdGVyKVxuICBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSA9IEZhYnJpY0NsaWVudERpc3BhdGNoO1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6WyJlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UiLCJmaWxlUGF0aCIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJkaXJuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTW9kZWxJbmRleGVzIiwibSIsImdlbmVyYXRlSW5kZXhlcyIsImdlbmVyYXRlTW9kZWxEZXNpZ25Eb2NzIiwiYWNjdW0iLCJ2aWV3cyIsImdlbmVyYXRlVmlld3MiLCJzdG9yYWdlIiwiZm9yRWFjaCIsImRvYyIsIl9pZCIsInJlYWRNb2RlbEZpbGUiLCJmaWxlIiwiZXhwb3J0cyIsImpvaW4iLCJwcm9jZXNzIiwiY3dkIiwicGFyZW50UGF0aCIsIm5hbWUiLCJ2YWx1ZXMiLCJPYmplY3QiLCJmaWx0ZXIiLCJlIiwiTW9kZWwiLCJhc3luYyIsInJlYWRNb2RlbEZvbGRlcnMiLCJmb2xkZXJzIiwicmVzdWx0IiwiZm9sZGVyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJyZWN1cnNpdmUiLCJmIiwiaXNGaWxlIiwiZW5kc1dpdGgiLCJwdXNoIiwid3JpdGVJbmRleGVzIiwiaW5kZXhlcyIsInAiLCJjb2xsZWN0aW9uIiwiaW5kZXgiLCJyZXNvbHZlIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJ3cml0ZURlc2lnbkRvY3MiLCJkZXNpZ25Eb2NzIiwibGVuZ3RoIiwiZG9jSWQiLCJyZXBsYWNlIiwicGF5bG9hZCIsIl9yZXYiLCJjb2xsZWN0aW9uRm9yIiwiY29sbGVjdGlvbk5hbWUiLCJwb2xpY3kiLCJyZXF1aXJlZFBlZXJDb3VudCIsIm1heFBlZXJDb3VudCIsImJsb2NrVG9MaXZlIiwibWVtYmVyT25seVJlYWQiLCJtZW1iZXJPbmx5V3JpdGUiLCJwcml2YXRlQ29sbGVjdGlvbkZvciIsIm1zcElkIiwiYyIsImVuZG9yc2VtZW50UG9saWN5Iiwic2lnbmF0dXJlUG9saWN5Iiwic2hhcmVkQ29sbGVjdGlvbkZvciIsIm1zcElkcyIsIm1hcCIsImV4dHJhY3RDb2xsZWN0aW9ucyIsIm92ZXJyaWRlcyIsIm1pcnJvciIsInByaXZhdGVDb2xzIiwic2hhcmVkQ29scyIsImNvbGxlY3Rpb25zRm9yIiwicmVzb2x2ZUNvbGxlY3Rpb24iLCJhcmciLCJJbnRlcm5hbEVycm9yIiwicHJpdmF0ZURlZmF1bHRzIiwiYXNzaWduIiwic2hhcmVkRGVmYXVsdHMiLCJtaXJyb3JNZXRhIiwibWlycm9yZWRBdCIsInByaXZhdGVzIiwiZmxhdCIsInJlc29sdmVkIiwicmVzb2x2ZXIiLCJzb21lIiwiaW5jbHVkZXMiLCJzaGFyZWQiLCJ3cml0ZUNvbGxlY3Rpb25zIiwiY29scyIsImZpbGVOYW1lIiwid3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyIsImRvY3MiLCJGYWJyaWNDbGllbnRQYWdpbmF0b3IiLCJQYWdpbmF0b3IiLCJjb25zdHJ1Y3RvciIsImFkYXB0ZXIiLCJxdWVyeSIsInNpemUiLCJjbGF6eiIsInN1cGVyIiwicHJlcGFyZSIsInJhd1N0YXRlbWVudCIsIlVuc3VwcG9ydGVkRXJyb3IiLCJwYWdlIiwiYXJncyIsImlzU2VyaWFsaXplZFBhZ2UiLCJvYmoiLCJBcnJheSIsImlzQXJyYXkiLCJkYXRhIiwiRmFicmljQ2xpZW50UmVwb3NpdG9yeSIsIlJlcG9zaXRvcnkiLCJmb3JjZSIsInRoaXMiLCJfb3ZlcnJpZGVzIiwiaWdub3JlVmFsaWRhdGlvbiIsImlnbm9yZUhhbmRsZXJzIiwiYWxsb3dSYXdTdGF0ZW1lbnRzIiwiZm9yY2VQcmVwYXJlU2ltcGxlUXVlcmllcyIsImZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzIiwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUiLCJyZWJ1aWxkV2l0aFRyYW5zaWVudCIsIm92ZXJyaWRlIiwiZmxhZ3MiLCJmb3IiLCJPYnNlcnZlckhhbmRsZXIiLCJwYWdpbmF0ZUJ5Iiwia2V5Iiwib3JkZXIiLCJyZWYiLCJvZmZzZXQiLCJsaW1pdCIsImxvZyIsImN0eEFyZ3MiLCJsb2dDdHgiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJQQUdFX0JZIiwidmVyYm9zZSIsInRhYmxlTmFtZSIsImNsYXNzIiwic3RhdGVtZW50IiwiYm9va21hcmsiLCJsaXN0QnkiLCJMSVNUX0JZIiwiZmluZEJ5IiwidmFsdWUiLCJGSU5EX0JZIiwiZmluZE9uZUJ5IiwiRklORF9PTkVfQlkiLCJmaW5kIiwiT3JkZXJEaXJlY3Rpb24iLCJBU0MiLCJGSU5EIiwiZGlyZWN0aW9uIiwiUEFHRSIsImN0eCIsIlBlcnNpc3RlbmNlS2V5cyIsIlNUQVRFTUVOVCIsImNhbGxBcmdzIiwic2xpY2UiLCJwYXJzZSIsImRlY29kZSIsImV2YWx1YXRlVHJhbnNhY3Rpb24iLCJoeWRyYXRlZCIsInIiLCJDb3VjaERCS2V5cyIsIlRBQkxFIiwiZCIsImFwcGx5QWZ0ZXJSZWFkIiwiZ2V0T3JVbmRlZmluZWQiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJBRlRFUiIsIlByb21pc2UiLCJhbGwiLCJlbnRyeSIsImNvdW50T2YiLCJDT1VOVF9PRiIsInN0bXRBcmdzIiwibWF4T2YiLCJNQVhfT0YiLCJtaW5PZiIsIk1JTl9PRiIsImF2Z09mIiwiQVZHX09GIiwic3VtT2YiLCJTVU1fT0YiLCJkaXN0aW5jdE9mIiwiRElTVElOQ1RfT0YiLCJncm91cE9mIiwiR1JPVVBfT0YiLCJoZWFsdGhjaGVjayIsImNyZWF0ZSIsIm1vZGVsIiwiZGVidWciLCJlbnN1cmVMZWdhY3lNaXJyb3JGbGFnIiwicHJlcGFyZWQiLCJyZWNvcmQiLCJpZCIsInRyYW5zaWVudCIsInJldmVydCIsInVwZGF0ZSIsImNyZWF0ZUFsbFByZWZpeCIsIm1vZGVscyIsIkNSRUFURSIsImdldCIsImlnbm9yZVZhbGlkYXRlIiwiT04iLCJpZ25vcmVkUHJvcHMiLCJlcnJvcnMiLCJoYXNFcnJvcnMiLCJlcnJvck1lc3NhZ2VzIiwicmVkdWNlRXJyb3JzVG9QcmludCIsIlZhbGlkYXRpb25FcnJvciIsImNyZWF0ZUFsbCIsImlkcyIsInBheWxvYWRzIiwidHJhbnNpZW50cyIsImNyZWF0ZWQiLCJpIiwicmVhZEFsbCIsImtleXMiLCJyZWNvcmRzIiwidXBkYXRlQWxsIiwidXBkYXRlZCIsInUiLCJhY2N1bXVsYXRlIiwibGVnYWN5IiwiRVJDMjBUb2tlbiIsIkJhc2VNb2RlbCIsIl9fZGVjb3JhdGUiLCJwayIsInR5cGUiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJjb2x1bW4iLCJyZXF1aXJlZCIsInRhYmxlIiwiRVJDMjBXYWxsZXQiLCJBbGxvd2FuY2UiLCJDbGllbnRTZXJpYWxpemVyIiwiSlNPTlNlcmlhbGl6ZXIiLCJwcmVTZXJpYWxpemUiLCJtb2RlbE5hbWUiLCJ0b1NlcmlhbGl6ZSIsIm1ldGFkYXRhIiwiTWV0YWRhdGEiLCJTZXJpYWxpemF0aW9uRXJyb3IiLCJNb2RlbEtleXMiLCJBTkNIT1IiLCJkZXNlcmlhbGl6ZSIsInN0ciIsImRlc2VyaWFsaXphdGlvbiIsImNsYXNzTmFtZSIsIkVycm9yIiwiYnVpbGQiLCJzZXJpYWxpemUiLCJGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkiLCJzZXJpYWxpemVyIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwidXBkYXRlT2JzZXJ2ZXJzIiwiZXZlbnQiLCJvYnNlcnZlckhhbmRsZXIiLCJjb3VudCIsInBhcnNlZElkIiwiU2VxdWVuY2UiLCJwYXJzZVZhbHVlIiwic2VxdWVuY2VGb3IiLCJ0b2tlbk5hbWUiLCJzeW1ib2wiLCJkZWNpbWFscyIsIk51bWJlciIsInRvdGFsU3VwcGx5IiwidG90YWwiLCJiYWxhbmNlT2YiLCJvd25lciIsImJhbGFuY2UiLCJ0cmFuc2ZlciIsInRvIiwidHJhbnNmZXJyZWQiLCJzdWJtaXRUcmFuc2FjdGlvbiIsInRvU3RyaW5nIiwidHJhbnNmZXJGcm9tIiwiZnJvbSIsImNvbnRleHRBcmdzIiwiQ29udGV4dCIsImFwcHJvdmUiLCJzcGVuZGVyIiwiYXBwcm92ZWQiLCJhbGxvd2FuY2UiLCJpbml0aWFsaXplIiwidG9rZW4iLCJpbml0aWxpYXplZCIsImNoZWNrSW5pdGlhbGl6ZWQiLCJtaW50IiwiYW1vdW50IiwiYnVybiIsImJ1cm5Gcm9tIiwiYWNjb3VudCIsImNsaWVudEFjY291bnRCYWxhbmNlIiwic2VyaWFsaXplZEFjY291bnRCYWxhbmNlIiwiY2xpZW50QWNjb3VudElEIiwiZXh0cmFjdElkcyIsImNvbXBvc2VkIiwicGtQcm9wcyIsImV4dHJhY3RJZCIsImNvbXBvc2VBdHRyaWJ1dGVWYWx1ZSIsIklkZW50aXR5Q3JlZGVudGlhbHMiLCJkZXNjcmlwdGlvbiIsIkZhYnJpY01vZGVsS2V5cyIsIklkZW50aXR5VHlwZSIsIkZhYnJpY0ZsYXZvdXIiLCJJZGVudGl0eSIsIlg1MDkiLCJvbmVUb09uZSIsIkNhc2NhZGUiLCJDQVNDQURFIiwiZGVsZXRlIiwiQ29yZVV0aWxzIiwibG9nZ2VyIiwiTWluaUxvZ2dlciIsImNvbnRlbnRPZkxvYWRGaWxlIiwiY29udGVudE9yUGF0aCIsImZpbGVSZWFkZXIiLCJVaW50OEFycmF5IiwibWF0Y2giLCJyZWFkRmlsZSIsInByb21pc2VzIiwibm9ybWFsaXplSW1wb3J0IiwiaW1wb3J0IiwiZ2V0Q0FVc2VyIiwidXNlck5hbWUiLCJwcml2YXRlS2V5IiwiY2VydGlmaWNhdGUiLCJvcHRpb25zIiwic3RyaW5nRm9ybWF0IiwidXNlciIsIlVzZXIiLCJjb25maWciLCJoc20iLCJzb2Z0d2FyZSIsImxpYiIsImxpYnJhcnkiLCJzbG90IiwibGFiZWwiLCJ0b2tlbkxhYmVsIiwicGluIiwiY3J5cHRvU3VpdGUiLCJnZXRDcnlwdG9TdWl0ZSIsInNldENyeXB0b1N1aXRlIiwiZW5yb2xsbWVudEtleSIsImdldEhTTUVucm9sbG1lbnRLZXkiLCJnZXRTb2Z0d2FyZUVucm9sbG1lbnRLZXkiLCJzZXRFbnJvbGxtZW50IiwibmV3Q3J5cHRvU3VpdGUiLCJjcmVhdGVLZXlGcm9tUmF3Iiwic2tpIiwia2V5SWRIZXgiLCJ0cmltIiwiQnVmZmVyIiwiZ2V0Q2VydGlmaWNhdGVTS0kiLCJnZXRLZXkiLCJpc1ByaXZhdGUiLCJ4NTA5IiwiWDUwOUNlcnRpZmljYXRlIiwiandrIiwicHVibGljS2V5IiwiZXhwb3J0IiwiZm9ybWF0IiwicHJlZml4IiwieCIsInkiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiY29uY2F0IiwiZGlnZXN0IiwiZ2V0SWRlbnRpdHkiLCJjZXJ0RGlyZWN0b3J5UGF0aCIsImlkZW50aXR5RmlsZVJlYWRlciIsImNlcnRQYXRoIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZSIsImNyZWRlbnRpYWxzIiwiZGlyUGF0aCIsInJlYWRkaXIiLCJnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCIsImdldEZpbGVDb250ZW50IiwiZ2V0U2lnbmVyIiwia2V5RGlyZWN0b3J5UGF0aCIsInNpZ25lckZpbGVSZWFkZXIiLCJrZXlQYXRoIiwicHJpdmF0ZUtleVBlbSIsImV4dHJhY3RQcml2YXRlS2V5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiayIsInNpZ25lcnMiLCJuZXdQcml2YXRlS2V5U2lnbmVyIiwicGVtIiwibGliTmFtZSIsInN1YnRsZSIsImdsb2JhbFRoaXMiLCJ3aW5kb3ciLCJDcnlwdG8iLCJ3ZWJjcnlwdG8iLCJzdHIyYWIiLCJidWYiLCJBcnJheUJ1ZmZlciIsImJ1ZlZpZXciLCJzdHJMZW4iLCJjaGFyQ29kZUF0IiwicmVwbGFjZUFsbCIsImRlY29kZWQiLCJiaW5hcnlEZXIiLCJpbXBvcnRLZXkiLCJuYW1lZEN1cnZlIiwiZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQiLCJjZXJ0IiwieDUwOUNlcnRpZmljYXRlIiwiWDUwOUNlcnQiLCJha2lFeHQiLCJleHRlbnNpb25zIiwiYWtpIiwidG9VcHBlckNhc2UiLCJzdGFydHNXaXRoIiwic2VyaWFsIiwic2VyaWFsTnVtYmVyIiwiY3J5cHRvUHJvdmlkZXIiLCJzZXQiLCJCQVNFX0FMUEhBQkVUIiwiQ1JZUFRPIiwiQmFzZUVuY29kZXIiLCJhbHBoYWJldCIsImJhc2VNYXAiLCJqIiwiY2hhckF0IiwieGMiLCJiYXNlIiwibGVhZGVyIiwiZmFjdG9yIiwiTWF0aCIsImlGYWN0b3IiLCJlbmNvZGUiLCJzb3VyY2UiLCJpc1ZpZXciLCJidWZmZXIiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInplcm9lcyIsInBiZWdpbiIsInBlbmQiLCJiNTgiLCJjYXJyeSIsIml0MSIsIml0MiIsInJlcGVhdCIsImRlY29kZVVuc2FmZSIsInBzeiIsImIyNTYiLCJpdDMiLCJpdDQiLCJ2Y2giLCJDcnlwdG9VdGlscyIsImI1OGVuY29kZXIiLCJCQVNFNTgiLCJmYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZSIsInN1YmplY3QiLCJpc3N1ZXIiLCJzdHJpbmdUb0FycmF5QnVmZmVyIiwiZXh0cmFjdEtleSIsInVzYWdlcyIsIlJlZ0V4cCIsImV4dHJhY3RQdWJsaWNLZXkiLCJzaWduIiwiYnVmZiIsImhhc2giLCJiIiwicGFkU3RhcnQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJlbmNyeXB0IiwiZ2V0U3VidGxlQ3J5cHRvIiwiaXNCcm93c2VyIiwiZGVjcnlwdCIsImdldE1hc3RlciIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJnZW5HZW5lc2lzIiwicmFuZG9tVVVJRCIsImltcG9ydGVkS2V5IiwiS0VZX0FMR09SWVRITSIsIml2IiwiZ2V0RGVyaXZhdGlvbktleSIsInNhbHQiLCJzYWx0QnVmZmVyIiwic2FsdEhhc2hlZCIsInBhcmFtcyIsIkhBU0giLCJpdGVyYXRpb25zIiwiSVRFUkFUSU9OUyIsImRlcml2YXRpb24iLCJkZXJpdmVCaXRzIiwiS0VZTEVOR1RIIiwiaXZsZW4iLCJrZXlsZW4iLCJkZXJpdmVkS2V5IiwiaW1wb3J0ZWRFbmNyeXB0aW9uS2V5IiwiQUxHT1JZVEhNIiwiZW5jcnlwdFBpbiIsInRleHQiLCJrZXlPYmplY3QiLCJ0ZXh0QnVmZmVyIiwiZW5jcnlwdGVkVGV4dCIsImRlY3J5cHRQaW4iLCJ0ZXh0RGVjb2RlciIsImRlY3J5cHRlZFRleHQiLCJPdmVyZmxvd0Vycm9yIiwibXNnIiwiQmFsYW5jZUVycm9yIiwiQWxsb3dhbmNlRXJyb3IiLCJSZWdpc3RyYXRpb25FcnJvciIsIkF1dGhvcml6YXRpb25FcnJvciIsIk1pc3NpbmdDb250ZXh0RXJyb3IiLCJVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyIsIkJhc2VFcnJvciIsIk5vdEluaXRpYWxpemVkRXJyb3IiLCJNaXNzaW5nUEtDU1MxMUxpYiIsIkVuZG9yc2VtZW50RXJyb3IiLCJtZXNzYWdlIiwiTXZjY1JlYWRDb25mbGljdEVycm9yIiwiUGhhbnRvbVJlYWRDb25mbGljdEVycm9yIiwiRW5kb3JzZW1lbnRQb2xpY3lFcnJvciIsIlRyYW5zYWN0aW9uTGltaXRzRXJyb3IiLCJjb2RlIiwiVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IiLCJUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciIsIkhGQ0FJZGVudGl0eVR5cGUiLCJIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIiwiRmFicmljRW5yb2xsbWVudFNlcnZpY2UiLCJMb2dnZWRDbGFzcyIsImNhQ29uZmlnIiwiY2FOYW1lIiwiY2FDZXJ0IiwiY2FLZXkiLCJ1cmwiLCJDQSIsImNhIiwidGxzIiwidHJ1c3RlZFJvb3RzIiwicm9vdCIsIkZhYnJpY0NBU2VydmljZXMiLCJDbGllbnQiLCJjbGllbnQiLCJDZXJ0aWZpY2F0ZSIsImNlcnRpZmljYXRlU2VydmljZSIsIm5ld0NlcnRpZmljYXRlU2VydmljZSIsIkFmZmlsaWF0aW9ucyIsImFmZmlsaWF0aW9uU2VydmljZSIsIm5ld0FmZmlsaWF0aW9uU2VydmljZSIsIklkZW50aXRpZXMiLCJpZGVudGl0eVNlcnZpY2UiLCJuZXdJZGVudGl0eVNlcnZpY2UiLCJnZXRDZXJ0aWZpY2F0ZXMiLCJyZXF1ZXN0IiwiZG9NYXAiLCJyZXNwb25zZSIsImNlcnRzIiwiUEVNIiwiZ2V0SWRlbnRpdGllcyIsImlkZW50aXRpZXNTZXJ2aWNlIiwiZ2V0QWxsIiwiaWRlbnRpdGllcyIsInBhcnNlRXJyb3IiLCJyZWdleHAiLCJleGVjIiwiQ29uZmxpY3RFcnJvciIsImdldEFmZmlsaWF0aW9ucyIsImEiLCJyZWFkIiwiZW5yb2xsbWVudElkIiwiZ2V0T25lIiwiTm90Rm91bmRFcnJvciIsInN1Y2Nlc3MiLCJyZWdpc3RlciIsImlzU3VwZXJVc2VyIiwiYWZmaWxpYXRpb24iLCJ1c2VyUm9sZSIsImF0dHJzIiwibWF4RW5yb2xsbWVudHMiLCJyZWdpc3RyYXRpb24iLCJwYXNzd29yZCIsInByb3BzIiwiZW5yb2xsbWVudElEIiwiZW5yb2xsbWVudFNlY3JldCIsImluZm8iLCJpZGVudGl0eUZyb21FbnJvbGxtZW50IiwiZW5yb2xsbWVudCIsInJvb3RDZXJ0aWZpY2F0ZSIsIkxvZ2dpbmciLCJjbGllbnRJZCIsIm5vdyIsIkRhdGUiLCJ0b0J5dGVzIiwiY3JlYXRlZE9uIiwidXBkYXRlZE9uIiwiZW5yb2xsIiwiaWRlbnRpdHkiLCJyZWdpc3RlckFuZEVucm9sbCIsInJldm9rZSIsInJlYXNvbiIsIlJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIiwiZXJycyIsInJvbGUiLCJzZXRBZmZpbGlhdGlvbiIsImFkZEF0dHIiLCJhdHRyIiwic2V0QXR0cnMiLCJzZXRFbnJvbGxtZW50SUQiLCJzZXRFbnJvbGxtZW50U2VjcmV0Iiwic2V0TWF4RW5yb2xsbWVudHMiLCJzZXRSb2xlIiwibWlubGVuZ3RoIiwibWluIiwiRVJDMjBFdmVudHMiLCJGYWJyaWNCYXNlTW9kZWwiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJ2ZXJzaW9uIiwidXNlcyIsIkZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWwiLCJjcmVhdGVkQnkiLCJ1cGRhdGVkQnkiLCJpc1NoYXJlZCIsInNlZ3JlZ2F0ZSIsImlzVHJhbnNpZW50IiwiZGVjb3JhdGVkUHJvcGVydGllcyIsImdldEF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRQcm9wcyIsIkRCS2V5cyIsIlRSQU5TSUVOVCIsInByaXZhdGVQcm9wZXJ0aWVzIiwiUFJJVkFURSIsInNoYXJlZFByb3BlcnRpZXMiLCJTSEFSRUQiLCJwdWJsaWMiLCJ0cmFuc2llbnRLZXlzIiwicHJpdmF0ZUtleXMiLCJzaGFyZWRLZXlzIiwiaXNQdWJsaWMiLCJiaW5kIiwibWlycm9yZWQiLCJGQUJSSUMiLCJNSVJST1IiLCJvd25lck9mIiwibWV0YSIsIk9XTkVEX0JZIiwic2hhcmVkS2V5IiwiY29uc3RyIiwicHJpdmF0ZU1ldGEiLCJzaGFyZWRNZXRhIiwiY29sbGVjdGlvbnMiLCJleHRyYWN0TXNwSWQiLCJnZXRNU1BJRCIsIk93bmVyIiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJkZXNjcmlwdG9yIiwib3JpZ2luYWxNZXRob2QiLCJhY291bnRJZCIsImNsaWVudElkZW50aXR5IiwiZ2V0SUQiLCJzZWxlY3QiLCJ0b2tlbnMiLCJleGVjdXRlIiwiYXBwbHkiLCJvd25lZEJ5T25DcmVhdGUiLCJjb250ZXh0Iiwic3R1YiIsImNyZWF0b3IiLCJnZXRDcmVhdG9yIiwibXNwaWQiLCJzZXRPd25lZEJ5S2V5VmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIm93bmVkQnkiLCJhdHRyaWJ1dGUiLCJnZW5lcmF0ZWQiLCJyZWFkb25seSIsIm9uQ3JlYXRlIiwicHJvcE1ldGFkYXRhIiwiRGVjb3JhdGlvbiIsImRlZmluZSIsImRlY29yYXRvciIsInRyYW5zYWN0aW9uSWRPbkNyZWF0ZSIsImdldFR4SUQiLCJ0cmFuc2FjdGlvbklkIiwib25VcGRhdGUiLCJUUkFOU0FDVElPTl9JRCIsImV2YWxNaXJyb3JNZXRhZGF0YSIsImNyZWF0ZU1pcnJvckhhbmRsZXIiLCJmYWJyaWNDdHgiLCJzb3VyY2VNb2RlbCIsInB1dCIsInJlcG8iLCJtaXJyb3JDb2xsZWN0aW9uIiwidXBkYXRlTWlycm9ySGFuZGxlciIsImFwcGx5VXBkYXRlVmFsaWRhdGlvbiIsIm1lcmdlRm9yVXBkYXRlIiwiZGVsZXRlTWlycm9ySGFuZGxlciIsInBrUHJvcCIsInNlZ3JlZ2F0ZWQiLCJtaXJyb3JXcml0ZUd1YXJkIiwibXNwIiwiY29uZGl0aW9uIiwicmVhZE1pcnJvckhhbmRsZXIiLCJtYXRjaGVzIiwicmVhZEZyb20iLCJtc3BJZE9yQ29uZGl0aW9uIiwiaXNDb25kaXRpb25Pbmx5IiwiQm9vbGVhbiIsImNvbmQiLCJvblJlYWQiLCJwcmlvcml0eSIsIm9uRGVsZXRlIiwiTW9kZWxDb2xsZWN0aW9uIiwib3JnTmFtZSIsInRvUGFzY2FsQ2FzZSIsIk5hbWVzcGFjZUNvbGxlY3Rpb24iLCJuYW1lc3BhY2UiLCJJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uIiwiU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFkiLCJhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MiLCJpc0Z1bGx5U2VncmVnYXRlZCIsImhhc1B1YmxpY1Byb3BlcnRpZXMiLCJtYXJrRnVsbHlTZWdyZWdhdGVkIiwiYXBwbHlNaXJyb3JGbGFncyIsImF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRNZXRhIiwiZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyIsImRhdGFBcnJheSIsImNvbGxlY3Rpb25SZXNvbHZlciIsImtleUFycmF5IiwicGtLZXkiLCJwa1NlcU5hbWUiLCJzZXF1ZW5jZU5hbWUiLCJpZFZhbHVlIiwiY2FuQnVpbGRQZXJJbnN0YW5jZSIsInNldFNlcXVlbmNlU2VncmVnYXRpb24iLCJwcm9wU2VxTmFtZSIsInNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUiLCJfayIsImtleVN0cmluZ3MiLCJ3cml0ZVRvIiwic2VncmVnYXRlZERhdGFPblJlYWQiLCJzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIiwib2xkTW9kZWwiLCJzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIiwiaW5uZXJTZWdyZWdhdGVkIiwic2VncmVnYXRlZERlYyIsIlNldCIsImFkZCIsImNvbnN0ck1ldGEiLCJjb25zdHJDb2xsZWN0aW9ucyIsInVwZGF0ZWRUcmFuc2llbnRNZXRhIiwiZGVjcyIsInByb3BlcnRpZXMiLCJncm91cE5hbWUiLCJleHRyYWN0R3JvdXBOYW1lIiwiZGF0YUdyb3VwTmFtZSIsImVhcmx5RXh0cmFjdGlvbk1ldGEiLCJlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQiLCJncm91cCIsInByb3AiLCJvbiIsIkRCT3BlcmF0aW9ucyIsIkFMTCIsInByaXZhdGVEYXRhIiwic2hhcmVkRGF0YSIsInNvcnRLZXlzT25seVJlY3Vyc2l2ZSIsInNvcnQiLCJyZWR1Y2UiLCJhY2MiLCJEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsImVycm9yIiwic2VsZiIsIm8iLCJjYWxsIiwicmVsYXRpb25zIiwiZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUiLCJwYXJzZUV2ZW50TmFtZSIsInBhcnRzIiwic3BsaXQiLCJzdWIiLCJzYWZlUGFyc2VJbnQiLCJzdHJpbmciLCJkaWdpdFJlZ2V4IiwidGVzdCIsInBhcnNlZGludCIsInBhcnNlSW50IiwiaXNOYU4iLCJTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsInB1dEFuY2hvciIsInByZVNlcmlhbGl6YXRpb24iLCJGYWJyaWNJZGVudGl0eVNlcnZpY2UiLCJDbGllbnRCYXNlZFNlcnZpY2UiLCJyb290Q2xpZW50IiwiX3VzZXIiLCJjZXJ0aWZpY2F0ZXMiLCJhZmZpbGlhdGlvbnMiLCJnZXRVc2VyIiwiY2ZnIiwiSU5JVElBTElaQVRJT04iLCJnZXROYW1lIiwidXBkYXRlSWRlbnRpdHkiLCJpZGVudGl0eVJlcXVlc3QiLCJjYVVzZXJJZGVudGl0eSIsInJlZW5yb2xsVXNlciIsImNyZWF0ZVVzZXIiLCJnZXRNc3BpZCIsImVucm9sbG1lbnRBdHRycyIsIm9wdGlvbmFsIiwicmVlbnJvbGwiLCJyZW5ld2VkSWRlbnRpdHkiLCJyZXZva2VPcHRpb25zIiwicmV2b2tlUmVxdWVzdCIsIkNBX1JPTEUiLCJEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MiLCJldmFsdWF0ZVRpbWVvdXQiLCJlbmRvcnNlVGltZW91dCIsInN1Ym1pdFRpbWVvdXQiLCJjb21taXRUaW1lb3V0IiwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzIiwiYWxsb3dHYXRld2F5T3ZlcnJpZGUiLCJlbmNyeXB0VHJhbnNpZW50Iiwic3ludGhldGljRXZlbnRzIiwiZXNjYXBlUmVnRXhwIiwibmV4dExleGljb2dyYXBoaWNTdHJpbmciLCJjaGFycyIsImNvZGVQb2ludEF0IiwiZnJvbUNvZGVQb2ludCIsInByZWZpeFJhbmdlIiwic3RhcnQiLCJlbmQiLCJGYWJyaWNDbGllbnRTdGF0ZW1lbnQiLCJTdGF0ZW1lbnQiLCJzcXVhc2giLCJzcXVhc2hlZCIsIm1ldGhvZCIsImV4ZWN1dGVQcmVwYXJlZCIsImFyZ3oiLCJmb3JNb2RlbCIsImZyb21TZWxlY3RvciIsImFsaWFzIiwiUVVFUlkiLCJpc1NpbXBsZVF1ZXJ5IiwiUXVlcnlDbGF1c2UiLCJ3aGVyZUNvbmRpdGlvbiIsInBhcnNlZCIsInByZXBhcmVDb25kaXRpb24iLCJzZWxlY3RTZWxlY3RvciIsIlNFTEVDVCIsIkFORCIsInRvTG93ZXJDYXNlIiwib3JkZXJCeVNlbGVjdG9ycyIsIk9SREVSX0JZIiwidG9DYW1lbENhc2UiLCJwcm9jZXNzUmVjb3JkIiwicGtBdHRyIiwiSUQiLCJrZXlBcmdzIiwiU0VQQVJBVE9SIiwicmF3IiwicmF3SW5wdXQiLCJhZ2dyZWdhdG9yIiwiYWdncmVnYXRlSW5mbyIsImFnZ3JlZ2F0ZSIsImV4ZWN1dGVBZ2dyZWdhdGUiLCJyZXN1bHRzIiwicHJvY2Vzc2VkIiwiYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQiLCJhZ2dyZWdhdGVRdWVyeSIsImJ1aWxkQWdncmVnYXRlUXVlcnkiLCJzZWxlY3RvcnMiLCJzZWxlY3RvciIsImZpZWxkcyIsInBhcnNlQ29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYW5kIiwiZXEiLCJzZWxlY3RvcktleXMiLCJDb3VjaERCR3JvdXBPcGVyYXRvciIsImluZGV4T2YiLCJ2YWwiLCJPUiIsInMiLCJlbnRyaWVzIiwid2FybiIsInNlbGVjdG9yS2V5IiwicmVjIiwiQ291Y2hEQk9wZXJhdG9yIiwiQklHR0VSIiwibGltaXRTZWxlY3RvciIsIkNvdWNoREJRdWVyeUxpbWl0Iiwib2Zmc2V0U2VsZWN0b3IiLCJza2lwIiwibWVyZ2UiLCJvcCIsIm9iajEiLCJvYmoyIiwiYXR0cjEiLCJvcGVyYXRvciIsImNvbXBhcmlzb24iLCJPcGVyYXRvciIsIlNUQVJUU19XSVRIIiwiUXVlcnlFcnJvciIsInJhbmdlIiwiQklHR0VSX0VRIiwiU01BTExFUiIsIkVORFNfV0lUSCIsIlJFR0VYUCIsIkJFVFdFRU4iLCJtYXgiLCJvcEJldHdlZW4iLCJ0cmFuc2xhdGVPcGVyYXRvcnMiLCJTTUFMTEVSX0VRIiwiR3JvdXBPcGVyYXRvciIsIk5PVCIsIm9wMSIsIm9wMiIsImF2Z1NlbGVjdG9yIiwic3VtSW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IiLCJjb3VudEluZm8iLCJjcmVhdGVBZ2dyZWdhdGVRdWVyeSIsImtpbmQiLCJzdW1EZXNjcmlwdG9yIiwiY291bnREZXNjcmlwdG9yIiwiY291bnREaXN0aW5jdFNlbGVjdG9yIiwiY291bnREaXN0aW5jdCIsImFnZ3JlZ2F0b3JVc2VkIiwiY291bnRTZWxlY3RvciIsIm1pblNlbGVjdG9yIiwibWF4U2VsZWN0b3IiLCJzdW1TZWxlY3RvciIsImRpc3RpbmN0U2VsZWN0b3IiLCJhZ2dyZWdhdG9yQ2hlY2tzIiwibWV0YXMiLCJmaW5kVmlld01ldGFkYXRhIiwidmlld05hbWUiLCJnZW5lcmF0ZVZpZXdOYW1lIiwiZGRvYyIsImdlbmVyYXRlRGVzaWduRG9jTmFtZSIsInJldHVybkRvY3MiLCJ2aWV3IiwiZ2V0RmFicmljQWRhcHRlciIsImlzVmlld0FnZ3JlZ2F0ZSIsImhhbmRsZUF2ZXJhZ2UiLCJmYWJyaWNBZGFwdGVyIiwidmlld0luZm8iLCJwcm9jZXNzVmlld1Jlc3BvbnNlIiwic3VtRGVzYyIsImNvdW50RGVzYyIsInN1bVJlc3BvbnNlIiwiY291bnRSZXNwb25zZSIsInN1bSIsInJvd3MiLCJyb3ciLCJGYWJyaWNDbGllbnRBZGFwdGVyIiwiQWRhcHRlciIsIm9wZXJhdGlvbiIsIm1lcmdlZEZsYWdzIiwic2lsbHkiLCJwb3AiLCJ0b092ZXJyaWRlcyIsIm5ld0N0eCIsInBhcmVudENvbnRleHQiLCJjaGlsZENvbnRleHRzIiwiY3VycmVudE9wIiwiY3VycmVudE1vZGVsIiwicmVwb3NpdG9yeSIsImNyZWF0ZVByZWZpeCIsInVwZGF0ZUFsbFByZWZpeCIsInNoaWZ0IiwiaGFzVHJhbnNpZW50IiwibmVlZHNGdWxsUGF5bG9hZCIsInNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbiIsInRyYW5zaWVudFBheWxvYWQiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJDUkVBVEVfQUxMIiwiZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInJlcyIsInNob3VsZFJlZnJlc2hBZnRlcldyaXRlIiwiUkVBRF9BTEwiLCJVUERBVEVfQUxMIiwiZGVsZXRlQWxsIiwic2hvdWxkSHlkcmF0ZSIsIkRFTEVURV9BTEwiLCJNRVRBREFUQSIsIm1pcnJvck1zcCIsIm1zcHMiLCJtZXJnZWQiLCJlbmRvcnNpbmdPcmdzIiwiZW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50IiwidiIsImNoaWxkUmVidWlsZCIsImdldEZyb21DaGlsZHJlbiIsInJlc29sdmVkT3AiLCJyZXNvbHZlT3BlcmF0aW9uIiwiaGFzSWQiLCJkaXJlY3QiLCJkZXNlcmlhbGl6ZWQiLCJ1cGRhdGVQcmVmaXgiLCJVUERBVEUiLCJERUxFVEUiLCJkb2NzT25seSIsInRyYW5zYWN0aW9uUmVzdWx0IiwicGFyc2VSZWNvcmQiLCJpc01vZGVsIiwiZWwiLCJnZXRDbGllbnQiLCJfY2xpZW50IiwiR2F0ZXdheSIsImdldEdhdGV3YXkiLCJnZXRDb250cmFjdE5hbWUiLCJDb250cmFjdCIsImNvbnRyYWN0TmFtZSIsImdldENvbnRyYWN0IiwidHJhbnNhY3Rpb24iLCJhcGkiLCJzdWJtaXQiLCJ0cmFuc2llbnREYXRhIiwiZ2F0ZXdheSIsImNvbnRyYWN0IiwiZXZhbHVhdGUiLCJwcm9wb3NhbE9wdGlvbnMiLCJhcmd1bWVudHMiLCJjbG9zZSIsInNob3VsZFVzZUxlZ2FjeUdhdGV3YXkiLCJwcmVwYXJlTGVnYWN5QXJncyIsImJ1aWxkTGVnYWN5VHJhbnNpZW50IiwicmVzb2x2ZUxlZ2FjeU1zcENvdW50IiwiY29uZmlndXJlZCIsImxlZ2FjeU1zcENvdW50IiwiaXNGaW5pdGUiLCJmbG9vciIsInBpY2tMZWdhY3lDYW5kaWRhdGVzIiwiY2FuZGlkYXRlcyIsImF2YWlsYWJsZSIsInBpY2tlZCIsImlkeCIsInJhbmRvbSIsInNlbGVjdGlvbiIsInNwbGljZSIsImJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MiLCJwZWVycyIsInBlZXJFbmRwb2ludCIsInBlZXJIb3N0QWxpYXMiLCJ0bHNDZXJ0IiwiZW5kb3JzZXJzIiwib3JnIiwiZXh0cmFzIiwibXNwTWFwIiwibGVnYWN5Q291bnQiLCJzZWxlY3Rpb25zIiwiY2hvaWNlIiwiZW5kcG9pbnQiLCJzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMiLCJmY24iLCJ0cmFuc2llbnRNYXAiLCJwZWVyQ29uZmlncyIsIm5vcm1hbGl6ZUxlZ2FjeVBlZXJzIiwiaWRlbnRpdHlNYXRlcmlhbCIsInJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsIiwid2FsbGV0IiwiV2FsbGV0cyIsIm5ld0luTWVtb3J5V2FsbGV0IiwiaWRlbnRpdHlMYWJlbCIsImNvbm5lY3Rpb25Qcm9maWxlIiwiYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZSIsIkxlZ2FjeUdhdGV3YXkiLCJjb25uZWN0IiwiZGlzY292ZXJ5IiwiZW5hYmxlZCIsImFzTG9jYWxob3N0Iiwic2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0IiwidGxzSW5mbyIsIm5ldHdvcmsiLCJnZXROZXR3b3JrIiwiY2hhbm5lbCIsImNoYWluY29kZU5hbWUiLCJjcmVhdGVUcmFuc2FjdGlvbiIsInNldFRyYW5zaWVudCIsInBlZXIiLCJnZXRDaGFubmVsIiwiZ2V0RW5kb3JzZXIiLCJlbmRvcnNlciIsInNldEVuZG9yc2luZ1BlZXJzIiwiZGlzY29ubmVjdCIsImRlZHVwZWQiLCJNYXAiLCJhZGRQZWVyIiwiaGFzIiwicmVhZFBlbUlucHV0IiwiY2VydENlcnRPckRpcmVjdG9yeVBhdGgiLCJrZXlDZXJ0T3JEaXJlY3RvcnlQYXRoIiwicGVlckVudHJpZXMiLCJjaGFubmVsUGVlcnMiLCJvcmdzIiwidGxzUGVtIiwiaG9zdG5hbWUiLCJleHRyYWN0SG9zdCIsImVuc3VyZUdycGNVcmwiLCJ0bHNDQUNlcnRzIiwiZ3JwY09wdGlvbnMiLCJob3N0bmFtZU92ZXJyaWRlIiwiZW5kb3JzaW5nUGVlciIsImNoYWluY29kZVF1ZXJ5IiwibGVkZ2VyUXVlcnkiLCJldmVudFNvdXJjZSIsIm9yZ2FuaXphdGlvbiIsIm9yZ2FuaXphdGlvbnMiLCJvcmRlcmVycyIsImNoYW5uZWxzIiwiZXZlcnkiLCJpc0xvY2FsRW5kcG9pbnQiLCJob3N0Iiwic2FuaXRpemVkIiwiaXNCdWZmZXIiLCJ0cmltbWVkIiwic3RhdHMiLCJzdGF0IiwiY2F0Y2giLCJpc0RpcmVjdG9yeSIsInJlYWRGc0ZpbGUiLCJlcnIiLCJsZWdhY3lBcmdzIiwic2h1dGRvd24iLCJjaGFubmVsTmFtZSIsImdldENvbm5lY3Rpb24iLCJwYXRoT3JDZXJ0IiwicmVhZEZpbGVTeW5jIiwidGxzQ3JlZGVudGlhbHMiLCJncnBjIiwiY3JlYXRlU3NsIiwic2l6ZUxpbWl0Iiwic2lnbmVyIiwiZXZhbHVhdGVPcHRpb25zIiwiZGVhZGxpbmUiLCJlbmRvcnNlT3B0aW9ucyIsInN1Ym1pdE9wdGlvbnMiLCJjb21taXRTdGF0dXNPcHRpb25zIiwiUHJveHkiLCJ0aGlzQXJnIiwiYXJnQXJyYXkiLCJSZWZsZWN0IiwiRGlzcGF0Y2giLCJHYXRld2F5RXJyb3IiLCJkZXRhaWxzIiwiRW5kb3JzZUVycm9yIiwiQmFkUmVxdWVzdEVycm9yIiwiUGFnaW5nRXJyb3IiLCJNaWdyYXRpb25FcnJvciIsIk9ic2VydmVyRXJyb3IiLCJGb3JiaWRkZW5FcnJvciIsIkNvbm5lY3Rpb25FcnJvciIsImZpbmFsIiwiRCIsIl9hIiwiZGVjb3JhdGlvbiIsInNldEN1cnJlbnQiLCJGYWJyaWNDbGllbnREaXNwYXRjaCIsImxvZ2dlZEFyZ3MiLCJTSFVURE9XTiIsImxpc3RlbmluZ1N0YWNrIiwicGFyc2VQYXlsb2FkIiwianNvbkJ5dGVzIiwianNvbiIsIm9ic2VydmUiLCJvYnNlcnZlciIsInVuT2JzZXJ2ZSIsInJlZnJlc2giLCJoYW5kbGVFdmVudHMiLCJjdHhBcmciLCJjb3JyZWxhdGlvbklkIiwiZXZ0IiwiZXZlbnROYW1lIiwibXNwRXZlbnRPbmx5IiwidGFyZ2V0TW9kZWwiLCJtb2RlbFJlZiIsIm9ic2VydmVyQXJncyIsImdldENoYWluY29kZUV2ZW50cyIsInRvV3JhcCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJidWxrVG9TaW5nbGUiLCJyZXN1bHRBcmdzIiwiVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSIsInJlZ2lzdGVyTGlicmFyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQVdBLFNBQVNBLHlCQUF5QkM7UUFFaEMsTUFBTUMsS0FBS0MsUUFBUTtRQUVuQixNQUFNQyxPQUFPRCxRQUFRO1FBQ3JCLE1BQU1FLFVBQWtCRCxLQUFLQyxRQUFRSjtRQUNyQyxJQUFJQyxHQUFHSSxXQUFXRCxVQUFVO1lBQzFCLE9BQU87QUFDVDtRQUNBTCx5QkFBeUJLO1FBQ3pCSCxHQUFHSyxVQUFVRjtBQUNmO0lBRU0sU0FBVUcscUJBQ2RDO1FBRUEsT0FBT0MsV0FBQUEsZ0JBQWdCLEVBQUNEO0FBQzFCO0lBRU0sU0FBVUUsd0JBQ2RGLEdBQ0FHO1FBRUEsTUFBTUMsUUFBUUMsV0FBQUEsY0FBYyxFQUFDTDtRQUM3QixNQUFNTSxVQUE0Q0gsU0FBUyxDQUFBO1FBQzNEQyxNQUFNRyxRQUFTQztZQUNiRixRQUFRRSxJQUFJQyxPQUFPRDs7UUFFckIsT0FBT0o7QUFDVDtJQUVNLFNBQVVNLGNBQWNDO1FBRTVCLE1BQU1oQixPQUFPRCxRQUFRO1FBRXJCLE1BQU1rQixZQUFVbEIsUUFBUUMsS0FBS2tCLEtBQUtDLFFBQVFDLE9BQU9K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