schema-shield 1.0.3 → 1.0.5
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.
- package/README.md +150 -0
- package/dist/index.js +5 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +5 -1
- package/dist/utils/main-utils.d.ts +1 -0
- package/dist/utils/main-utils.d.ts.map +1 -1
- package/lib/utils/main-utils.ts +12 -1
- package/package.json +2 -1
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwiaW5zdGFuY2VQb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiX2dldFRyZWUiLCJ0cmVlIiwiZ2V0VHJlZSIsImdldFBhdGgiLCJGQUlMX0ZBU1RfREVGSU5FX0VSUk9SIiwiZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkiLCJrZXkiLCJmYWlsRmFzdCIsIktleXdvcmRFcnJvciIsImdldE5hbWVkRnVuY3Rpb24iLCJvcHRpb25zIiwiaXNDb21waWxlZFNjaGVtYSIsInN1YlNjaGVtYSIsIkFycmF5IiwiaXNBcnJheSIsIm5hbWUiLCJmbiIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJVVUlEX1JFR0VYIiwiRFVSQVRJT05fUkVHRVgiLCJVUklfUkVHRVgiLCJFTUFJTF9SRUdFWCIsIkhPU1ROQU1FX1JFR0VYIiwiREFURV9SRUdFWCIsIlRJTUVfUkVHRVgiLCJVUklfUkVGRVJFTkNFX1JFR0VYIiwiSVJJX1JFR0VYIiwiSVJJX1JFRkVSRU5DRV9SRUdFWCIsIklETl9FTUFJTF9SRUdFWCIsIklETl9IT1NUTkFNRV9SRUdFWCIsIkRBWVNfSU5fTU9OVEgiLCJwYXJzZVR3b0RpZ2l0cyIsImluZGV4IiwiZmlyc3QiLCJjaGFyQ29kZUF0Iiwic2Vjb25kIiwiaXNWYWxpZElwdjRSYW5nZSIsInN0YXJ0IiwiZW5kIiwic2VnbWVudENvdW50Iiwic2VnbWVudFN0YXJ0IiwiaSIsInNlZ21lbnRMZW5ndGgiLCJqIiwiZGlnaXQiLCJGb3JtYXRzIiwibGVuZ3RoIiwidENvZGUiLCJ5ZWFyIiwiYSIsImIiLCJjIiwiZCIsInBhcnNlRm91ckRpZ2l0cyIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsImN1cnNvciIsIm9mZnNldFNpZ24iLCJvZmZzZXRIb3VyIiwib2Zmc2V0TWludXRlIiwiZnJhY1N0YXJ0IiwiY29kZSIsInR6Q29kZSIsIm1heERheXMiLCJ1dGNUb3RhbE1pbnV0ZXMiLCJvZmZzZXRUb3RhbE1pbnV0ZXMiLCJ1cmkiLCJ0ZXN0IiwiZW1haWwiLCJpcHY0IiwiaXNWYWxpZElwdjQiLCJpcHY2IiwiaGFzQ29sb24iLCJoYXNEb3VibGVDb2xvbiIsImhleHRldENvdW50IiwiaXNWYWxpZElwdjYiLCJob3N0bmFtZSIsImRhdGUiLCJtYXRjaCIsImV4ZWMiLCJ5ZWFyU3RyIiwibW9udGhTdHIiLCJkYXlTdHIiLCJOdW1iZXIiLCJyZWdleCIsIlJlZ0V4cCIsImUiLCJuZXh0IiwiaXNWYWxpZEpzb25Qb2ludGVyIiwiaXNWYWxpZFJlbGF0aXZlSnNvblBvaW50ZXIiLCJ0aW1lIiwiaW5jbHVkZXMiLCJjbG9zZUluZGV4IiwiaW5kZXhPZiIsImlzVmFsaWRVcmlUZW1wbGF0ZSIsImR1cmF0aW9uIiwidXVpZCIsImlyaSIsIlR5cGVzIiwib2JqZWN0IiwiYXJyYXkiLCJzdHJpbmciLCJudW1iZXIiLCJpbnRlZ2VyIiwiYm9vbGVhbiIsIm51bGwiLCJ0aW1lc3RhbXAiLCJpbnQ4IiwidWludDgiLCJpbnQxNiIsInVpbnQxNiIsImludDMyIiwidWludDMyIiwiZmxvYXQzMiIsImZsb2F0NjQiLCJoYXNDaGFuZ2VkIiwicHJldiIsImN1cnJlbnQiLCJpcyIsImlzVW5pcXVlUHJpbWl0aXZlIiwiZ2V0QXJyYXlCdWNrZXRLZXkiLCJsYXN0IiwiZmlyc3RUeXBlIiwibGFzdFR5cGUiLCJmaXJzdEFycmF5TWFya2VyIiwiZmlyc3RTaWduYXR1cmUiLCJnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZSIsImxhc3RBcnJheU1hcmtlciIsImxhc3RTaWduYXR1cmUiLCJnZXRPYmplY3RTaGFwZUtleSIsImtleXMiLCJzb3J0Iiwiam9pbiIsInNpZ25hdHVyZSIsImlzTmFOIiwiQXJyYXlLZXl3b3JkcyIsIml0ZW1zIiwiZGVmaW5lRXJyb3IiLCJzY2hlbWFJdGVtcyIsImRhdGFMZW5ndGgiLCJzY2hlbWFJdGVtc0xlbmd0aCIsIml0ZW1zTGVuZ3RoIiwic2NoZW1hSXRlbSIsInZhbGlkYXRlIiwiJHZhbGlkYXRlIiwiZXJyb3IiLCJlbGVtZW50cyIsImVsZW1lbnRzU2NoZW1hIiwibWluSXRlbXMiLCJtYXhJdGVtcyIsImFkZGl0aW9uYWxJdGVtcyIsInR1cGxlTGVuZ3RoIiwiX3R1cGxlSXRlbXNMZW5ndGgiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ1bmlxdWVJdGVtcyIsImxlbiIsImxlZnQiLCJyaWdodCIsInByaW1pdGl2ZVNlZW4iLCJTZXQiLCJwcmltaXRpdmVBcnJheVNpZ25hdHVyZXMiLCJhcnJheUJ1Y2tldHMiLCJvYmplY3RCdWNrZXRzIiwiaGFzIiwiYWRkIiwiTWFwIiwiYnVja2V0S2V5IiwiY2FuZGlkYXRlcyIsImdldCIsInNldCIsInB1c2giLCJjb250YWlucyIsImNvbnRhaW5zVmFsaWRhdGUiLCJkZWVwQ2xvbmVVbmZyZWV6ZSIsIm9iaiIsImNsb25lQ2xhc3NJbnN0YW5jZXMiLCJzZWVuIiwiV2Vha01hcCIsInNvdXJjZSIsInN0cnVjdHVyZWRDbG9uZSIsIkJ1ZmZlciIsInByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJwcm90b3R5cGUiLCJpc1BsYWluT2JqZWN0IiwiRGF0ZSIsIkFycmF5QnVmZmVyIiwiaXNWaWV3IiwiY2xvbmVkIiwiY2xvbmUiLCJsIiwiZ2V0VGltZSIsImZsYWdzIiwiZW50cmllcyIsInZhbHVlcyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJidWZmZXIiLCJmcm9tIiwiUHJvbWlzZSIsIldlYWtTZXQiLCJjcmVhdGUiLCJSZWZsZWN0Iiwib3duS2V5cyIsImRlc2NyaXB0b3JzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlc2NyaXB0b3IiLCJOdW1iZXJLZXl3b3JkcyIsIm1pbmltdW0iLCJpbnN0YW5jZSIsIm1pbiIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwibWF4IiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImlzRmluaXRlIiwiZXBzaWxvbiIsIk1hdGgiLCJhYnMiLCJhcmVDbG9zZUVub3VnaCIsInJvdW5kIiwiUkVHRVhfTUVUQV9DSEFSUyIsImhhc1JlZ2V4TWV0YSIsIlBBVFRFUk5fQ0FDSEUiLCJjb21waWxlUGF0dGVybk1hdGNoZXIiLCJwYXR0ZXJuIiwiY2FjaGVkIiwiY29tcGlsZWQiLCJfdmFsdWUiLCJwYXR0ZXJuTGVuZ3RoIiwiaW5uZXIiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCIsImdldFBhdHRlcm5Qcm9wZXJ0eUVudHJpZXMiLCJfcGF0dGVyblByb3BlcnR5RW50cmllcyIsInBhdHRlcm5Qcm9wZXJ0aWVzIiwicGF0dGVybktleXMiLCJjb21waWxlZE1hdGNoZXIiLCJzY2hlbWFQcm9wIiwiZ2V0UGF0dGVybktleU1hdGNoSW5kZXhlcyIsImNhY2hlIiwiX3BhdHRlcm5LZXlNYXRjaEluZGV4Q2FjaGUiLCJpbmRleGVzIiwic2l6ZSIsImdldEJyYW5jaEVudHJpZXMiLCJjYWNoZUtleSIsImtpbmQiLCJrZXl3b3JkcyIsInJlcXVpcmVkIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicHJvcGVydGllcyIsInByb3BLZXlzIiwiX3Byb3BLZXlzIiwicmVxdWlyZWRTZXQiLCJfcmVxdWlyZWRTZXQiLCJkZWZhdWx0IiwidmFsdWVTY2hlbWEiLCJtYXhQcm9wZXJ0aWVzIiwiY291bnQiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJhcFZhbGlkYXRlIiwiX2FwVmFsaWRhdGUiLCJwYXR0ZXJuRW50cmllcyIsIm1hdGNoaW5nSW5kZXhlcyIsInByb3BlcnR5TmFtZXMiLCJwbiIsImRlcGVuZGVuY2llcyIsImRlcGVuZGVuY3kiLCJ0aGVuIiwiZWxzZSIsImRlZmluaXRpb25zIiwiJGlkIiwiJHNjaGVtYSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCIkY29tbWVudCIsImV4YW1wbGVzIiwiY29udGVudE1lZGlhVHlwZSIsImNvbnRlbnRFbmNvZGluZyIsImRpc2NyaW1pbmF0b3IiLCJudWxsYWJsZSIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsInBhdHRlcm5NYXRjaCIsIl9wYXR0ZXJuTWF0Y2giLCJwYXR0ZXJuTWF0Y2hDYWNoZSIsIl9wYXR0ZXJuTWF0Y2hDYWNoZSIsImlzTWF0Y2giLCJmb3JtYXQiLCJmb3JtYXRWYWxpZGF0ZSIsIl9mb3JtYXRWYWxpZGF0ZSIsImZvcm1hdFJlc3VsdENhY2hlRW5hYmxlZCIsIl9mb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQiLCJmb3JtYXRSZXN1bHRDYWNoZSIsIl9mb3JtYXRSZXN1bHRDYWNoZSIsImdldEZvcm1hdCIsImlzRGVmYXVsdEZvcm1hdFZhbGlkYXRvciIsImlzVmFsaWQiLCJlbnVtIiwiZW51bUNhY2hlIiwiX2VudW1DYWNoZSIsInByaW1pdGl2ZVNldCIsIm9iamVjdFZhbHVlcyIsImxpc3QiLCJlbnVtSXRlbSIsImFsbE9mIiwiYnJhbmNoZXMiLCJvbmx5QnJhbmNoIiwiYnJhbmNoIiwiYW55T2YiLCJvbmVPZiIsInZhbGlkQ291bnQiLCJjb25zdCIsImlmIiwibm90IiwiJHJlZiIsIl9yZXNvbHZlZFJlZiIsInJlZlBhdGgiLCJ0YXJnZXRTY2hlbWEiLCJnZXRTY2hlbWFSZWYiLCJnZXRTY2hlbWFCeUlkIiwidHlwZXMiLCJmb3JtYXRzIiwiaW1tdXRhYmxlIiwicm9vdFNjaGVtYSIsImlkUmVnaXN0cnkiLCJ0eXBlIiwidmFsaWRhdG9yIiwiYWRkVHlwZSIsImFkZEtleXdvcmQiLCJhZGRGb3JtYXQiLCJvdmVyd3JpdGUiLCJnZXRUeXBlIiwiZ2V0S2V5d29yZCIsInBhdGgiLCJyb290IiwicGFydHMiLCJzcGxpdCIsInBhcnQiLCJkZWNvZGVVUklDb21wb25lbnQiLCJyZXBsYWNlIiwiZGVmcyIsInJlc29sdmVQYXRoIiwiaWQiLCJjb21waWxlIiwiY2xlYXIiLCJjb21waWxlZFNjaGVtYSIsImNvbXBpbGVTY2hlbWEiLCJfaGFzUmVmIiwibGlua1JlZmVyZW5jZXMiLCJpc1NjaGVtYUxpa2UiLCJjbG9uZWREYXRhIiwicmVzIiwidmFsaWQiLCJpc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSIsInNoYWxsb3dBcnJheUVxdWFscyIsImZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzIiwib3V0IiwibmVzdGVkIiwiZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZiIsIm5vcm1hbGl6ZVNjaGVtYUZvckNvbXBpbGUiLCJub3JtYWxpemVkIiwic2NoZW1hS2V5cyIsImhhc09ubHlLZXkiLCJzZXROb3JtYWxpemVkIiwiZmxhdHRlbmVkQWxsT2YiLCJmaWx0ZXIiLCJmbGF0dGVuZWRBbnlPZiIsImZsYXR0ZW5lZE9uZU9mIiwibWFya1NjaGVtYUhhc1JlZiIsInNob3VsZFNraXBLZXl3b3JkIiwiaGFzUmVxdWlyZWREZWZhdWx0cyIsImlzRGVmYXVsdFR5cGVWYWxpZGF0b3IiLCJzY2hlbWFIYXNSZWYiLCJyZWZWYWxpZGF0b3IiLCJ2YWxpZGF0b3JzIiwiYWN0aXZlTmFtZXMiLCJkZWZpbmVUeXBlRXJyb3IiLCJtYXAiLCJ0IiwidHJpbSIsInR5cGVGdW5jdGlvbnMiLCJ0eXBlTmFtZXMiLCJkZWZhdWx0VHlwZU5hbWVzIiwiY29tYmluZWRUeXBlVmFsaWRhdG9yIiwiYWxsVHlwZXNEZWZhdWx0IiwidHlwZU1ldGhvZE5hbWUiLCJzaW5nbGVUeXBlTmFtZSIsImlzSW50ZWdlciIsInNpbmdsZVR5cGVGbiIsImFsbG93c09iamVjdCIsImFsbG93c0FycmF5IiwiYWxsb3dzU3RyaW5nIiwiYWxsb3dzTnVtYmVyIiwiYWxsb3dzSW50ZWdlciIsImFsbG93c0Jvb2xlYW4iLCJhbGxvd3NOdWxsIiwiZGF0YVR5cGUiLCJvdGhlcktleXMiLCJrZXlPcmRlciIsImtleXdvcmRGbiIsImZuTmFtZSIsImxpdGVyYWxLZXl3b3JkcyIsImNvbXBpbGVkU3ViU2NoZW1hIiwic3ViS2V5IiwidiIsImNvbXBvc2l0ZU5hbWUiLCJtYXN0ZXJWYWxpZGF0b3IiLCJzdGFjayIsIm5vZGUiLCJwb3AiLCJ0YXJnZXQiLCJfZGF0YSJdLCJzb3VyY2VzIjpbIi4uL2xpYi91dGlscy9tYWluLXV0aWxzLnRzIiwiLi4vbGliL2Zvcm1hdHMudHMiLCIuLi9saWIvdHlwZXMudHMiLCIuLi9saWIvdXRpbHMvaGFzLWNoYW5nZWQudHMiLCIuLi9saWIva2V5d29yZHMvYXJyYXkta2V5d29yZHMudHMiLCIuLi9saWIvdXRpbHMvZGVlcC1mcmVlemUudHMiLCIuLi9saWIva2V5d29yZHMvbnVtYmVyLWtleXdvcmRzLnRzIiwiLi4vbGliL3V0aWxzL3BhdHRlcm4tbWF0Y2hlci50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb3RoZXIta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvc3RyaW5nLWtleXdvcmRzLnRzIiwiLi4vbGliL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmludGVyZmFjZSBFcnJvclRyZWUge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nO1xuICBpbnN0YW5jZVBhdGg6IHN0cmluZztcbiAgZGF0YT86IGFueTtcbiAgY2F1c2U/OiBFcnJvclRyZWU7XG59XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAga2V5d29yZDogc3RyaW5nO1xuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgaW5zdGFuY2VQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBkYXRhPzogYW55O1xuICBzY2hlbWE/OiBDb21waWxlZFNjaGVtYTtcblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIsIGluc3RhbmNlUG9pbnRlciA9IFwiI1wiKTogVmFsaWRhdGlvbkVycm9yIHtcbiAgICBsZXQgc2NoZW1hUGF0aCA9IGAke3BvaW50ZXJ9LyR7dGhpcy5rZXl3b3JkfWA7XG4gICAgbGV0IGluc3RhbmNlUGF0aCA9IGAke2luc3RhbmNlUG9pbnRlcn1gO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuaXRlbSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLml0ZW0gaW4gdGhpcy5zY2hlbWEpIHtcbiAgICAgICAgc2NoZW1hUGF0aCArPSBgLyR7dGhpcy5pdGVtfWA7XG4gICAgICB9XG4gICAgICBpbnN0YW5jZVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VQYXRoID0gaW5zdGFuY2VQYXRoO1xuICAgIHRoaXMuc2NoZW1hUGF0aCA9IHNjaGVtYVBhdGg7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBjYXVzZSBvciB0aGUgY2F1c2UgaXMgbm90IGEgVmFsaWRhdGlvbkVycm9yLCByZXR1cm4gdGhpc1xuICAgIGlmICghdGhpcy5jYXVzZSB8fCAhKHRoaXMuY2F1c2UgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYXVzZS5fZ2V0Q2F1c2Uoc2NoZW1hUGF0aCwgaW5zdGFuY2VQYXRoKTtcbiAgfVxuXG4gIGdldENhdXNlKCk6IFZhbGlkYXRpb25FcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhdXNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgY29uc3QgdHJlZTogRXJyb3JUcmVlID0ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgaXRlbTogdGhpcy5pdGVtLFxuICAgICAgc2NoZW1hUGF0aDogdGhpcy5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiB0aGlzLmluc3RhbmNlUGF0aCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jYXVzZSkge1xuICAgICAgdHJlZS5jYXVzZSA9IHRoaXMuY2F1c2UuX2dldFRyZWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIGdldFRyZWUoKTogRXJyb3JUcmVlIHtcbiAgICB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRyZWUoKTtcbiAgfVxuXG4gIGdldFBhdGgoKSB7XG4gICAgY29uc3QgY2F1c2UgPSB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtYVBhdGg6IGNhdXNlLnNjaGVtYVBhdGgsXG4gICAgICBpbnN0YW5jZVBhdGg6IGNhdXNlLmluc3RhbmNlUGF0aFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvck9wdGlvbnMge1xuICBpdGVtPzogYW55OyAvLyBGaW5hbCBpdGVtIGluIHRoZSBzY2hlbWFQYXRoXG4gIGNhdXNlPzogVmFsaWRhdGlvbkVycm9yIHwgdHJ1ZTsgLy8gQ2F1c2Ugb2YgdGhlIGVycm9yXG4gIGRhdGE/OiBhbnk7IC8vIERhdGEgdGhhdCBjYXVzZWQgdGhlIGVycm9yXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JGdW5jdGlvbiB7XG4gIChcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IERlZmluZUVycm9yT3B0aW9uc1xuICApOiBWYWxpZGF0aW9uRXJyb3IgfCB2b2lkIHwgdHJ1ZTtcbn1cbmNvbnN0IEZBSUxfRkFTVF9ERUZJTkVfRVJST1I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAoKSA9PiB0cnVlO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXG4gIGtleTogc3RyaW5nLFxuICBzY2hlbWE6IENvbXBpbGVkU2NoZW1hLFxuICBmYWlsRmFzdDogYm9vbGVhblxuKSB7XG4gIGlmIChmYWlsRmFzdCkge1xuICAgIHJldHVybiBGQUlMX0ZBU1RfREVGSU5FX0VSUk9SO1xuICB9XG5cbiAgY29uc3QgS2V5d29yZEVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCAke2tleX1gKTtcbiAgS2V5d29yZEVycm9yLmtleXdvcmQgPSBrZXk7XG4gIEtleXdvcmRFcnJvci5zY2hlbWEgPSBzY2hlbWE7XG5cbiAgY29uc3QgZGVmaW5lRXJyb3I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAobWVzc2FnZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgS2V5d29yZEVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIEtleXdvcmRFcnJvci5pdGVtID0gb3B0aW9ucy5pdGVtO1xuICAgIEtleXdvcmRFcnJvci5jYXVzZSA9XG4gICAgICBvcHRpb25zLmNhdXNlICYmIG9wdGlvbnMuY2F1c2UgIT09IHRydWUgPyBvcHRpb25zLmNhdXNlIDogdW5kZWZpbmVkO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVURjE2TGVuZ3RoKHN0cikge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZW5ndGgrKztcbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21waWxlZFNjaGVtYShzdWJTY2hlbWE6IGFueSk6IHN1YlNjaGVtYSBpcyBDb21waWxlZFNjaGVtYSB7XG4gIHJldHVybiAoXG4gICAgISFzdWJTY2hlbWEgJiZcbiAgICB0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgIUFycmF5LmlzQXJyYXkoc3ViU2NoZW1hKSAmJlxuICAgIFwiJHZhbGlkYXRlXCIgaW4gc3ViU2NoZW1hXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZEZ1bmN0aW9uPFQ+KG5hbWU6IHN0cmluZywgZm46IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgXCJuYW1lXCIsIHsgdmFsdWU6IG5hbWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGF0aChyb290OiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gIGlmICghcGF0aCB8fCBwYXRoID09PSBcIiNcIikge1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLy8gSlNPTiBQb2ludGVyXG4gIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIjL1wiKSkge1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMSk7XG4gICAgbGV0IGN1cnJlbnQgPSByb290O1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCBkZWNvZGVkVXJpUGFydCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0KTtcbiAgICAgIGNvbnN0IGtleSA9IGRlY29kZWRVcmlQYXJ0LnJlcGxhY2UoL34xL2csIFwiL1wiKS5yZXBsYWNlKC9+MC9nLCBcIn5cIik7XG5cbiAgICAgIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSBcIm9iamVjdFwiICYmIGtleSBpbiBjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLy8gU2ltcGxlIGxvb2t1cCBieSBkZWZpbml0aW9uIG5hbWUgKG5vbi1zdGFuZGFyZCwgYnV0IHVzZWZ1bClcbiAgaWYgKCFwYXRoLmluY2x1ZGVzKFwiI1wiKSkge1xuICAgIGlmIChyb290LmRlZmluaXRpb25zICYmIHJvb3QuZGVmaW5pdGlvbnNbcGF0aF0pIHtcbiAgICAgIHJldHVybiByb290LmRlZmluaXRpb25zW3BhdGhdO1xuICAgIH1cbiAgICBpZiAocm9vdC5kZWZzICYmIHJvb3QuZGVmc1twYXRoXSkge1xuICAgICAgcmV0dXJuIHJvb3QuZGVmc1twYXRoXTtcbiAgICB9XG5cbiAgICBpZiAocm9vdC4kaWQgJiYgdHlwZW9mIHJvb3QuJGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAocm9vdC4kaWQgPT09IHBhdGggfHwgcm9vdC4kaWQuZW5kc1dpdGgoXCIvXCIgKyBwYXRoKSkge1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVDbG9zZUVub3VnaChhOiBudW1iZXIsIGI6IG51bWJlciwgZXBzaWxvbiA9IDFlLTE1KTogYm9vbGVhbiB7XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gZXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG4iLCJpbXBvcnQgeyBGb3JtYXRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5cbi8vIFJlZ2V4IGhlbHBlcnNcbmNvbnN0IFVVSURfUkVHRVggPVxuICAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaTtcbi8vIElTTyA4NjAxIER1cmF0aW9uIChQM1k2TTREVDEySDMwTTVTKVxuY29uc3QgRFVSQVRJT05fUkVHRVggPVxuICAvXlAoPyEkKSgoXFxkK1kpPyhcXGQrTSk/KFxcZCtXKT8oXFxkK0QpPykoVCg/PVxcZCkoXFxkK0gpPyhcXGQrTSk/KFxcZCtTKT8pPyQvO1xuY29uc3QgVVJJX1JFR0VYID0gL15bYS16QS1aXVthLXpBLVowLTkrXFwtLl0qOlteXFxzXSokLztcbmNvbnN0IEVNQUlMX1JFR0VYID1cbiAgL14oPyFcXC4pKD8hLipcXC4kKVthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIwfSg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIxfSl7MCwyfUBbYS16MC05XSg/OlthLXowLTktXXswLDYxfVthLXowLTldKT8oPzpcXC5bYS16MC05XSg/OlthLXowLTktXXswLDYwfVthLXowLTldKT8pezAsM30kL2k7XG5jb25zdCBIT1NUTkFNRV9SRUdFWCA9XG4gIC9eW2EtejAtOV1bYS16MC05LV17MCw2Mn0oPzpcXC5bYS16MC05XVthLXowLTktXXswLDYyfSkqW2EtejAtOV0kL2k7XG5jb25zdCBEQVRFX1JFR0VYID0gL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvO1xuY29uc3QgVElNRV9SRUdFWCA9XG4gIC9eKFswMV1cXGR8MlswLTNdKTooWzAtNV1cXGQpOihbMC01XVxcZCkoXFwuXFxkKyk/KFp8KFsrLV0pKFswMV1cXGR8MlswLTNdKTooWzAtNV1cXGQpKSQvO1xuY29uc3QgVVJJX1JFRkVSRU5DRV9SRUdFWCA9XG4gIC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIygoPyFbXiNdKlxcXFwpW14jXSopKT8vaTtcbmNvbnN0IElSSV9SRUdFWCA9IC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC87XG5jb25zdCBJUklfUkVGRVJFTkNFX1JFR0VYID1cbiAgL14oKFteOi8/I10rKTopPyhcXC9cXC8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKCg/IVteI10qXFxcXClbXiNdKikpPy9pO1xuY29uc3QgSUROX0VNQUlMX1JFR0VYID0gL15bXkBcXHNdK0BbXkBcXHNdK1xcLlteQFxcc10rJC87XG5jb25zdCBJRE5fSE9TVE5BTUVfUkVHRVggPSAvXlteXFxzIUAjJCVeJiooKV8rXFw9XFxbXFxde307JzpcIlxcXFx8LDw+XFwvP10rJC87XG5cbmNvbnN0IERBWVNfSU5fTU9OVEggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5cbmZ1bmN0aW9uIGlzRGlnaXRDaGFyQ29kZShjb2RlOiBudW1iZXIpIHtcbiAgcmV0dXJuIGNvZGUgPj0gNDggJiYgY29kZSA8PSA1Nztcbn1cblxuZnVuY3Rpb24gcGFyc2VUd29EaWdpdHMoZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IGZpcnN0ID0gZGF0YS5jaGFyQ29kZUF0KGluZGV4KSAtIDQ4O1xuICBjb25zdCBzZWNvbmQgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtIDQ4O1xuXG4gIGlmIChmaXJzdCA8IDAgfHwgZmlyc3QgPiA5IHx8IHNlY29uZCA8IDAgfHwgc2Vjb25kID4gOSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiBmaXJzdCAqIDEwICsgc2Vjb25kO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZvdXJEaWdpdHMoZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IGEgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXgpIC0gNDg7XG4gIGNvbnN0IGIgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtIDQ4O1xuICBjb25zdCBjID0gZGF0YS5jaGFyQ29kZUF0KGluZGV4ICsgMikgLSA0ODtcbiAgY29uc3QgZCA9IGRhdGEuY2hhckNvZGVBdChpbmRleCArIDMpIC0gNDg7XG5cbiAgaWYgKFxuICAgIGEgPCAwIHx8XG4gICAgYSA+IDkgfHxcbiAgICBiIDwgMCB8fFxuICAgIGIgPiA5IHx8XG4gICAgYyA8IDAgfHxcbiAgICBjID4gOSB8fFxuICAgIGQgPCAwIHx8XG4gICAgZCA+IDlcbiAgKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcmV0dXJuIGEgKiAxMDAwICsgYiAqIDEwMCArIGMgKiAxMCArIGQ7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRJcHY0UmFuZ2UoZGF0YTogc3RyaW5nLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICBsZXQgc2VnbWVudENvdW50ID0gMDtcbiAgbGV0IHNlZ21lbnRTdGFydCA9IHN0YXJ0O1xuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgIGlmIChpICE9PSBlbmQgJiYgZGF0YS5jaGFyQ29kZUF0KGkpICE9PSA0Nikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudExlbmd0aCA9IGkgLSBzZWdtZW50U3RhcnQ7XG4gICAgaWYgKHNlZ21lbnRMZW5ndGggPCAxIHx8IHNlZ21lbnRMZW5ndGggPiAzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNlZ21lbnRMZW5ndGggPiAxICYmIGRhdGEuY2hhckNvZGVBdChzZWdtZW50U3RhcnQpID09PSA0OCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgZm9yIChsZXQgaiA9IHNlZ21lbnRTdGFydDsgaiA8IGk7IGorKykge1xuICAgICAgY29uc3QgZGlnaXQgPSBkYXRhLmNoYXJDb2RlQXQoaikgLSA0ODtcbiAgICAgIGlmIChkaWdpdCA8IDAgfHwgZGlnaXQgPiA5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgZGlnaXQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID4gMjU1KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VnbWVudENvdW50Kys7XG4gICAgc2VnbWVudFN0YXJ0ID0gaSArIDE7XG4gIH1cblxuICByZXR1cm4gc2VnbWVudENvdW50ID09PSA0O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSXB2NChkYXRhOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzVmFsaWRJcHY0UmFuZ2UoZGF0YSwgMCwgZGF0YS5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpc0hleENoYXJDb2RlKGNvZGU6IG51bWJlcikge1xuICByZXR1cm4gKFxuICAgIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHx8XG4gICAgKGNvZGUgPj0gNjUgJiYgY29kZSA8PSA3MCkgfHxcbiAgICAoY29kZSA+PSA5NyAmJiBjb2RlIDw9IDEwMilcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZElwdjYoZGF0YTogc3RyaW5nKSB7XG4gIGNvbnN0IGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0NvbG9uID0gZmFsc2U7XG4gIGxldCBoYXNEb3VibGVDb2xvbiA9IGZhbHNlO1xuICBsZXQgaGV4dGV0Q291bnQgPSAwO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpID09PSA1OCkge1xuICAgICAgaGFzQ29sb24gPSB0cnVlO1xuXG4gICAgICBpZiAoaSArIDEgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGkgKyAxKSA9PT0gNTgpIHtcbiAgICAgICAgaWYgKGhhc0RvdWJsZUNvbG9uKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFzRG91YmxlQ29sb24gPSB0cnVlO1xuICAgICAgICBpICs9IDI7XG5cbiAgICAgICAgaWYgKGkgPT09IGxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50U3RhcnQgPSBpO1xuICAgIGxldCBzZWdtZW50TGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGlzSGV4Q2hhckNvZGUoZGF0YS5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgc2VnbWVudExlbmd0aCsrO1xuICAgICAgaWYgKHNlZ21lbnRMZW5ndGggPiA0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50TGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGkgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGkpID09PSA0Nikge1xuICAgICAgaWYgKCFoYXNDb2xvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNWYWxpZElwdjRSYW5nZShkYXRhLCBzZWdtZW50U3RhcnQsIGxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzRG91YmxlQ29sb24pIHtcbiAgICAgICAgcmV0dXJuIGhleHRldENvdW50IDwgNjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhleHRldENvdW50ID09PSA2O1xuICAgIH1cblxuICAgIGhleHRldENvdW50Kys7XG4gICAgaWYgKGhleHRldENvdW50ID4gOCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoaSkgIT09IDU4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzQ29sb24gPSB0cnVlO1xuICAgIGkrKztcblxuICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpID09PSA1OCkge1xuICAgICAgaWYgKGhhc0RvdWJsZUNvbG9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaGFzRG91YmxlQ29sb24gPSB0cnVlO1xuICAgICAgaSsrO1xuXG4gICAgICBpZiAoaSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaGFzQ29sb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaGFzRG91YmxlQ29sb24pIHtcbiAgICByZXR1cm4gaGV4dGV0Q291bnQgPCA4O1xuICB9XG5cbiAgcmV0dXJuIGhleHRldENvdW50ID09PSA4O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSnNvblBvaW50ZXIoZGF0YTogc3RyaW5nKSB7XG4gIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZGF0YS5jaGFyQ29kZUF0KDApICE9PSA0Nykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoaSkgIT09IDEyNikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IGRhdGEuY2hhckNvZGVBdChpICsgMSk7XG4gICAgaWYgKG5leHQgIT09IDQ4ICYmIG5leHQgIT09IDQ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRSZWxhdGl2ZUpzb25Qb2ludGVyKGRhdGE6IHN0cmluZykge1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkge1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpKys7XG4gIH1cblxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpID09PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChpKSA9PT0gMzUpIHtcbiAgICByZXR1cm4gaSArIDEgPT09IGRhdGEubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChpKSAhPT0gNDcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGkgPSBpICsgMTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpICE9PSAxMjYpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBkYXRhLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgIGlmIChuZXh0ICE9PSA0OCAmJiBuZXh0ICE9PSA0OSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkVXJpVGVtcGxhdGUoZGF0YTogc3RyaW5nKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoY29kZSA9PT0gMTI1KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgIT09IDEyMykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2xvc2VJbmRleCA9IGRhdGEuaW5kZXhPZihcIn1cIiwgaSArIDEpO1xuICAgIGlmIChjbG9zZUluZGV4ID09PSAtMSB8fCBjbG9zZUluZGV4ID09PSBpICsgMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGkgPSBjbG9zZUluZGV4O1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtYXRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgW1wiZGF0ZS10aW1lXCJdKGRhdGEpIHtcbiAgICBjb25zdCBsZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgMTkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBkYXRhLmNoYXJDb2RlQXQoNCkgIT09IDQ1IHx8XG4gICAgICBkYXRhLmNoYXJDb2RlQXQoNykgIT09IDQ1IHx8XG4gICAgICBkYXRhLmNoYXJDb2RlQXQoMTMpICE9PSA1OCB8fFxuICAgICAgZGF0YS5jaGFyQ29kZUF0KDE2KSAhPT0gNThcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0Q29kZSA9IGRhdGEuY2hhckNvZGVBdCgxMCk7XG4gICAgaWYgKHRDb2RlICE9PSA4NCAmJiB0Q29kZSAhPT0gMTE2KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgeWVhciA9IHBhcnNlRm91ckRpZ2l0cyhkYXRhLCAwKTtcbiAgICBjb25zdCBtb250aCA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDUpO1xuICAgIGNvbnN0IGRheSA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDgpO1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZVR3b0RpZ2l0cyhkYXRhLCAxMSk7XG4gICAgY29uc3QgbWludXRlID0gcGFyc2VUd29EaWdpdHMoZGF0YSwgMTQpO1xuICAgIGNvbnN0IHNlY29uZCA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDE3KTtcblxuICAgIGlmIChcbiAgICAgIHllYXIgPCAwIHx8XG4gICAgICBtb250aCA8IDAgfHxcbiAgICAgIGRheSA8IDAgfHxcbiAgICAgIGhvdXIgPCAwIHx8XG4gICAgICBtaW51dGUgPCAwIHx8XG4gICAgICBzZWNvbmQgPCAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGhvdXIgPiAyMyB8fCBtaW51dGUgPiA1OSB8fCBzZWNvbmQgPiA2MCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBjdXJzb3IgPSAxOTtcbiAgICBsZXQgb2Zmc2V0U2lnbjogXCIrXCIgfCBcIi1cIiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBvZmZzZXRIb3VyID0gMDtcbiAgICBsZXQgb2Zmc2V0TWludXRlID0gMDtcblxuICAgIGlmIChjdXJzb3IgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGN1cnNvcikgPT09IDQ2KSB7XG4gICAgICBjdXJzb3IrKztcbiAgICAgIGNvbnN0IGZyYWNTdGFydCA9IGN1cnNvcjtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBsZW5ndGggJiYgaXNEaWdpdENoYXJDb2RlKGRhdGEuY2hhckNvZGVBdChjdXJzb3IpKSkge1xuICAgICAgICBjdXJzb3IrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnNvciA9PT0gZnJhY1N0YXJ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3Vyc29yIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCB0ekNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoY3Vyc29yKTtcblxuICAgICAgaWYgKHR6Q29kZSA9PT0gOTAgfHwgdHpDb2RlID09PSAxMjIpIHtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9IGVsc2UgaWYgKHR6Q29kZSA9PT0gNDMgfHwgdHpDb2RlID09PSA0NSkge1xuICAgICAgICBvZmZzZXRTaWduID0gdHpDb2RlID09PSA0MyA/IFwiK1wiIDogXCItXCI7XG5cbiAgICAgICAgaWYgKGN1cnNvciArIDYgPiBsZW5ndGggfHwgZGF0YS5jaGFyQ29kZUF0KGN1cnNvciArIDMpICE9PSA1OCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9mZnNldEhvdXIgPSBwYXJzZVR3b0RpZ2l0cyhkYXRhLCBjdXJzb3IgKyAxKTtcbiAgICAgICAgb2Zmc2V0TWludXRlID0gcGFyc2VUd29EaWdpdHMoZGF0YSwgY3Vyc29yICsgNCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9mZnNldEhvdXIgPCAwIHx8XG4gICAgICAgICAgb2Zmc2V0TWludXRlIDwgMCB8fFxuICAgICAgICAgIG9mZnNldEhvdXIgPiAyMyB8fFxuICAgICAgICAgIG9mZnNldE1pbnV0ZSA+IDU5XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnNvciArPSA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJzb3IgIT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE1lcyAx4oCTMTJcbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRMOtYSA+PSAxXG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIGlmICghbWF4RGF5cyB8fCBkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNlY29uZCA9PT0gNjApIHtcbiAgICAgIGxldCB1dGNUb3RhbE1pbnV0ZXMgPSBob3VyICogNjAgKyBtaW51dGU7XG5cbiAgICAgIGlmIChvZmZzZXRTaWduKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IG9mZnNldEhvdXIgKiA2MCArIG9mZnNldE1pbnV0ZTtcbiAgICAgICAgdXRjVG90YWxNaW51dGVzICs9XG4gICAgICAgICAgb2Zmc2V0U2lnbiA9PT0gXCIrXCIgPyAtb2Zmc2V0VG90YWxNaW51dGVzIDogb2Zmc2V0VG90YWxNaW51dGVzO1xuICAgICAgICB1dGNUb3RhbE1pbnV0ZXMgJT0gMjQgKiA2MDtcbiAgICAgICAgaWYgKHV0Y1RvdGFsTWludXRlcyA8IDApIHtcbiAgICAgICAgICB1dGNUb3RhbE1pbnV0ZXMgKz0gMjQgKiA2MDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodXRjVG90YWxNaW51dGVzICE9PSAyMyAqIDYwICsgNTkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICB1cmkoZGF0YSkge1xuICAgIHJldHVybiBVUklfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZW1haWwoZGF0YSkge1xuICAgIHJldHVybiBFTUFJTF9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuICBpcHY0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNWYWxpZElwdjQoZGF0YSk7XG4gIH0sXG5cbiAgaXB2NihkYXRhKSB7XG4gICAgcmV0dXJuIGlzVmFsaWRJcHY2KGRhdGEpO1xuICB9LFxuXG4gIGhvc3RuYW1lKGRhdGEpIHtcbiAgICByZXR1cm4gSE9TVE5BTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBEQVRFX1JFR0VYLmV4ZWMoZGF0YSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHJdID0gbWF0Y2g7XG4gICAgY29uc3QgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBjb25zdCBtb250aCA9IE51bWJlcihtb250aFN0cik7XG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGRheVN0cik7XG5cbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIHJldHVybiAhIW1heERheXMgJiYgZGF5IDw9IG1heERheXM7XG4gIH0sXG4gIHJlZ2V4KGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChkYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFwianNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIHJldHVybiBpc1ZhbGlkSnNvblBvaW50ZXIoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIHJldHVybiBpc1ZhbGlkUmVsYXRpdmVKc29uUG9pbnRlcihkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIFRJTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgXCJ1cmktcmVmZXJlbmNlXCIoZGF0YSkge1xuICAgIGlmIChkYXRhLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBVUklfUkVGRVJFTkNFX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgXCJ1cmktdGVtcGxhdGVcIihkYXRhKSB7XG4gICAgcmV0dXJuIGlzVmFsaWRVcmlUZW1wbGF0ZShkYXRhKTtcbiAgfSxcblxuICBkdXJhdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIERVUkFUSU9OX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgdXVpZChkYXRhKSB7XG4gICAgcmV0dXJuIFVVSURfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICAvLyBJUkkgaXMgbGlrZSBVUkkgYnV0IGFsbG93cyBVbmljb2RlLiBXZSByZXVzZSBhIHBlcm1pc3NpdmUgbG9naWMuXG4gIGlyaShkYXRhKSB7XG4gICAgcmV0dXJuIElSSV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuXG4gIFwiaXJpLXJlZmVyZW5jZVwiKGRhdGEpIHtcbiAgICBpZiAoZGF0YS5pbmNsdWRlcyhcIlxcXFxcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIElSSV9SRUZFUkVOQ0VfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICAvLyBCZXN0LWVmZm9ydCBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24gZm9yIElETiAobm8gcHVueWNvZGUvdGFibGVzKVxuICBcImlkbi1lbWFpbFwiKGRhdGEpIHtcbiAgICByZXR1cm4gSUROX0VNQUlMX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgXCJpZG4taG9zdG5hbWVcIihkYXRhKSB7XG4gICAgLy8gQWxsb3dzIHVuaWNvZGUsIGZvcmJpZHMgc3BhY2VzIGFuZCB0eXBpY2FsIGludmFsaWQgVVJMIGNoYXJzXG4gICAgcmV0dXJuIElETl9IT1NUTkFNRV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgVHlwZUZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIG9iamVjdChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVpbnQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1aW50MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVpbnQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxufTtcbiIsIi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgZGVwZW5kZW5jaWVzIGhhdmUgY2hhbmdlZCByZWN1cnNpdmVseVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvY29nbml0aXZlLWNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBoYXNDaGFuZ2VkKHByZXY6IGFueSwgY3VycmVudDogYW55KSB7XG4gIGlmIChPYmplY3QuaXMocHJldiwgY3VycmVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwcmV2KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYubGVuZ3RoICE9PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2ldLCBjdXJyZW50W2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZXYgPT09IFwib2JqZWN0XCIgJiYgcHJldiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIiB8fCBjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjdXJyZW50KSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJldikge1xuICAgICAgaWYgKGtleSBpbiBjdXJyZW50KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2tleV0sIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBoYXNDaGFuZ2VkIH0gZnJvbSBcIi4uL3V0aWxzL2hhcy1jaGFuZ2VkXCI7XG5cbmZ1bmN0aW9uIGlzVW5pcXVlUHJpbWl0aXZlKHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0QXJyYXlCdWNrZXRLZXkodmFsdWU6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiMFwiO1xuICB9XG5cbiAgY29uc3QgZmlyc3QgPSB2YWx1ZVswXTtcbiAgY29uc3QgbGFzdCA9IHZhbHVlW2xlbmd0aCAtIDFdO1xuICBjb25zdCBmaXJzdFR5cGUgPSBmaXJzdCA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGZpcnN0O1xuICBjb25zdCBsYXN0VHlwZSA9IGxhc3QgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBsYXN0O1xuXG4gIGxldCBmaXJzdEFycmF5TWFya2VyID0gXCJcIjtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmlyc3QpKSB7XG4gICAgY29uc3QgZmlyc3RTaWduYXR1cmUgPSBnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZShmaXJzdCk7XG4gICAgZmlyc3RBcnJheU1hcmtlciA9IGZpcnN0U2lnbmF0dXJlID09PSBudWxsID8gYGE6JHtmaXJzdC5sZW5ndGh9YCA6IGZpcnN0U2lnbmF0dXJlO1xuICB9XG5cbiAgbGV0IGxhc3RBcnJheU1hcmtlciA9IFwiXCI7XG4gIGlmIChBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgY29uc3QgbGFzdFNpZ25hdHVyZSA9IGdldFByaW1pdGl2ZUFycmF5U2lnbmF0dXJlKGxhc3QpO1xuICAgIGxhc3RBcnJheU1hcmtlciA9IGxhc3RTaWduYXR1cmUgPT09IG51bGwgPyBgYToke2xhc3QubGVuZ3RofWAgOiBsYXN0U2lnbmF0dXJlO1xuICB9XG5cbiAgcmV0dXJuIGAke2xlbmd0aH06JHtmaXJzdFR5cGV9OiR7Zmlyc3RBcnJheU1hcmtlcn06JHtsYXN0VHlwZX06JHtsYXN0QXJyYXlNYXJrZXJ9YDtcbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0U2hhcGVLZXkodmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKTtcbiAgcmV0dXJuIGAke2tleXMubGVuZ3RofToke2tleXMuam9pbihcIlxcdTAwMDFcIil9YDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpbWl0aXZlQXJyYXlTaWduYXR1cmUodmFsdWU6IGFueVtdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiYTowXCI7XG4gIH1cblxuICBpZiAoIWlzVW5pcXVlUHJpbWl0aXZlKHZhbHVlWzBdKSB8fCAhaXNVbmlxdWVQcmltaXRpdmUodmFsdWVbbGVuZ3RoIC0gMV0pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgc2lnbmF0dXJlID0gYGE6JHtsZW5ndGh9OmA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZVtpXTtcblxuICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICBzaWduYXR1cmUgKz0gXCJsO1wiO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzaWduYXR1cmUgKz0gYHMke2l0ZW0ubGVuZ3RofToke2l0ZW19O2A7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oaXRlbSkpIHtcbiAgICAgICAgc2lnbmF0dXJlICs9IFwibjpOYU47XCI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmlzKGl0ZW0sIC0wKSkge1xuICAgICAgICBzaWduYXR1cmUgKz0gXCJuOi0wO1wiO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc2lnbmF0dXJlICs9IGBuOiR7aXRlbX07YDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHNpZ25hdHVyZSArPSBpdGVtID8gXCJiOjE7XCIgOiBcImI6MDtcIjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHNpZ25hdHVyZTtcbn1cblxuZXhwb3J0IGNvbnN0IEFycmF5S2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIC8vIGxpYi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkcy50c1xuICBpdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hSXRlbXMgPSBzY2hlbWEuaXRlbXM7XG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWFJdGVtcyA9PT0gZmFsc2UgJiYgZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFJdGVtcykpIHtcbiAgICAgIGNvbnN0IHNjaGVtYUl0ZW1zTGVuZ3RoID0gc2NoZW1hSXRlbXMubGVuZ3RoO1xuICAgICAgY29uc3QgaXRlbXNMZW5ndGggPVxuICAgICAgICBzY2hlbWFJdGVtc0xlbmd0aCA8IGRhdGFMZW5ndGggPyBzY2hlbWFJdGVtc0xlbmd0aCA6IGRhdGFMZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzY2hlbWFJdGVtID0gc2NoZW1hSXRlbXNbaV07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChzY2hlbWFJdGVtID09PSBmYWxzZSAmJiBkYXRhW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IHNjaGVtYUl0ZW0gJiYgc2NoZW1hSXRlbS4kdmFsaWRhdGU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGUgPSBzY2hlbWFJdGVtcyAmJiBzY2hlbWFJdGVtcy4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBlbGVtZW50cyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHNTY2hlbWEgPSBzY2hlbWEuZWxlbWVudHM7XG4gICAgY29uc3QgdmFsaWRhdGUgPSBlbGVtZW50c1NjaGVtYSAmJiBlbGVtZW50c1NjaGVtYS4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWluSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluSXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gc2hvcnRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heEl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXMgdG9vIGxvbmdcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxJdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdHVwbGVMZW5ndGggPSAoc2NoZW1hIGFzIGFueSkuX3R1cGxlSXRlbXNMZW5ndGggYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0dXBsZUxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0dXBsZUxlbmd0aCA9IHNjaGVtYS5pdGVtcy5sZW5ndGg7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl90dXBsZUl0ZW1zTGVuZ3RoXCIsIHtcbiAgICAgICAgdmFsdWU6IHR1cGxlTGVuZ3RoLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPD0gdHVwbGVMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEuYWRkaXRpb25hbEl0ZW1zICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcylcbiAgICApIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0dXBsZUxlbmd0aDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHVuaXF1ZUl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIXNjaGVtYS51bmlxdWVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsZW4gPD0gOCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YVtpXTtcblxuICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBsZW47IGorKykge1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YVtqXTtcblxuICAgICAgICAgIGlmIChsZWZ0ID09PSByaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiByaWdodCB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgbGVmdCA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHJpZ2h0ID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgICBOdW1iZXIuaXNOYU4obGVmdCkgJiZcbiAgICAgICAgICAgIE51bWJlci5pc05hTihyaWdodClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogcmlnaHQgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbGVmdCAmJlxuICAgICAgICAgICAgcmlnaHQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBsZWZ0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgcmlnaHQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICFoYXNDaGFuZ2VkKGxlZnQsIHJpZ2h0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiByaWdodCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW1pdGl2ZVNlZW4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICBsZXQgcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYXJyYXlCdWNrZXRzOiBNYXA8c3RyaW5nLCBhbnlbXT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IG9iamVjdEJ1Y2tldHM6IE1hcDxzdHJpbmcsIGFueVtdPiB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW2ldO1xuXG4gICAgICBpZiAoaXNVbmlxdWVQcmltaXRpdmUoaXRlbSkpIHtcbiAgICAgICAgaWYgKHByaW1pdGl2ZVNlZW4uaGFzKGl0ZW0pKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiBpdGVtIH0pO1xuICAgICAgICB9XG4gICAgICAgIHByaW1pdGl2ZVNlZW4uYWRkKGl0ZW0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZShpdGVtKTtcbiAgICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICghcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzKSB7XG4gICAgICAgICAgICBwcmltaXRpdmVBcnJheVNpZ25hdHVyZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzLmhhcyhzaWduYXR1cmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzLmFkZChzaWduYXR1cmUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhcnJheUJ1Y2tldHMpIHtcbiAgICAgICAgICBhcnJheUJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWNrZXRLZXkgPSBnZXRBcnJheUJ1Y2tldEtleShpdGVtKTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBhcnJheUJ1Y2tldHMuZ2V0KGJ1Y2tldEtleSk7XG5cbiAgICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgY2FuZGlkYXRlcyA9IFtdO1xuICAgICAgICAgIGFycmF5QnVja2V0cy5zZXQoYnVja2V0S2V5LCBjYW5kaWRhdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICghaGFzQ2hhbmdlZChjYW5kaWRhdGVzW2pdLCBpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiBpdGVtIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaChpdGVtKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghb2JqZWN0QnVja2V0cykge1xuICAgICAgICBvYmplY3RCdWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidWNrZXRLZXkgPSBnZXRPYmplY3RTaGFwZUtleShpdGVtKTtcbiAgICAgIGxldCBjYW5kaWRhdGVzID0gb2JqZWN0QnVja2V0cy5nZXQoYnVja2V0S2V5KTtcblxuICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMgPSBbXTtcbiAgICAgICAgb2JqZWN0QnVja2V0cy5zZXQoYnVja2V0S2V5LCBjYW5kaWRhdGVzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYW5kaWRhdGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChjYW5kaWRhdGVzW2pdLCBpdGVtKSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogaXRlbSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYW5kaWRhdGVzLnB1c2goaXRlbSk7XG4gICAgfVxuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbnNWYWxpZGF0ZSA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGNvbnRhaW5zVmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJleHBvcnQgZnVuY3Rpb24gZGVlcEZyZWV6ZShcbiAgb2JqOiBhbnksXG4gIGZyZWV6ZUNsYXNzSW5zdGFuY2VzOiBib29sZWFuID0gZmFsc2UsXG4gIHNlZW4gPSBuZXcgV2Vha1NldCgpXG4pOiBhbnkge1xuICBpZiAoXG4gICAgb2JqID09PSBudWxsIHx8XG4gICAgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fFxuICAgIHNlZW4uaGFzKG9iaikgfHxcbiAgICBPYmplY3QuaXNGcm96ZW4ob2JqKVxuICApIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgc2Vlbi5hZGQob2JqKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBkZWVwRnJlZXplKG9ialtpXSwgZnJlZXplQ2xhc3NJbnN0YW5jZXMsIHNlZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9wcyA9IFJlZmxlY3Qub3duS2V5cyhvYmopO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcHJvcHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBkZWVwRnJlZXplKG9ialtwcm9wc1tpXV0sIGZyZWV6ZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgKG5vdCBhIHBsYWluIG9iamVjdCBvciBhcnJheSkgd2UgbmVlZCB0byBmcmVlemUgdGhlIHByb3RvdHlwZVxuICAgIGlmIChmcmVlemVDbGFzc0luc3RhbmNlcykge1xuICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgICAgIGlmIChwcm90byAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBkZWVwRnJlZXplKHByb3RvLCBmcmVlemVDbGFzc0luc3RhbmNlcywgc2Vlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmZyZWV6ZShvYmopO1xuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgeyBpc1BsYWluT2JqZWN0IH07XG5cbmZ1bmN0aW9uIGNhblVzZVN0cnVjdHVyZWRDbG9uZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc3RydWN0dXJlZENsb25lICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcbiAgICBpc1BsYWluT2JqZWN0KHZhbHVlKSB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIFNldCB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmVVbmZyZWV6ZTxUPihcbiAgb2JqOiBULFxuICBjbG9uZUNsYXNzSW5zdGFuY2VzID0gZmFsc2UsXG4gIHNlZW4gPSBuZXcgV2Vha01hcCgpXG4pOiBUIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgfHwgb2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gb2JqIGFzIGFueTtcblxuICBpZiAoc2Vlbi5oYXMoc291cmNlKSkge1xuICAgIHJldHVybiBzZWVuLmdldChzb3VyY2UpO1xuICB9XG5cbiAgaWYgKGNhblVzZVN0cnVjdHVyZWRDbG9uZShzb3VyY2UpKSB7XG4gICAgY29uc3QgY2xvbmVkID0gc3RydWN0dXJlZENsb25lKHNvdXJjZSk7XG4gICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZWQpO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cblxuICBsZXQgY2xvbmU6IGFueTtcblxuICBzd2l0Y2ggKHRydWUpIHtcbiAgICBjYXNlIEFycmF5LmlzQXJyYXkoc291cmNlKToge1xuICAgICAgY2xvbmUgPSBbXTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNsb25lW2ldID0gZGVlcENsb25lVW5mcmVlemUoc291cmNlW2ldLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY2FzZSBzb3VyY2UgaW5zdGFuY2VvZiBEYXRlOiB7XG4gICAgICBjbG9uZSA9IG5ldyBEYXRlKHNvdXJjZS5nZXRUaW1lKCkpO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgUmVnRXhwOiB7XG4gICAgICBjbG9uZSA9IG5ldyBSZWdFeHAoc291cmNlLnNvdXJjZSwgc291cmNlLmZsYWdzKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIE1hcDoge1xuICAgICAgY2xvbmUgPSBuZXcgTWFwKCk7XG4gICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgY2xvbmUuc2V0KFxuICAgICAgICAgIGRlZXBDbG9uZVVuZnJlZXplKGtleSwgY2xvbmVDbGFzc0luc3RhbmNlcywgc2VlbiksXG4gICAgICAgICAgZGVlcENsb25lVW5mcmVlemUodmFsdWUsIGNsb25lQ2xhc3NJbnN0YW5jZXMsIHNlZW4pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgU2V0OiB7XG4gICAgICBjbG9uZSA9IG5ldyBTZXQoKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UudmFsdWVzKCkpIHtcbiAgICAgICAgY2xvbmUuYWRkKGRlZXBDbG9uZVVuZnJlZXplKHZhbHVlLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI6IHtcbiAgICAgIGNsb25lID0gc291cmNlLnNsaWNlKDApO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIFR5cGVkQXJyYXlzIGFuZCBEYXRhVmlld1xuICAgIGNhc2UgQXJyYXlCdWZmZXIuaXNWaWV3KHNvdXJjZSk6IHtcbiAgICAgIGNsb25lID0gbmV3IHNvdXJjZS5jb25zdHJ1Y3Rvcihzb3VyY2UuYnVmZmVyLnNsaWNlKDApKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICAvLyBOb2RlLmpzIEJ1ZmZlclxuICAgIGNhc2UgdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzb3VyY2UgaW5zdGFuY2VvZiBCdWZmZXI6IHtcbiAgICAgIGNsb25lID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIEVycm9yOiB7XG4gICAgICBjbG9uZSA9IG5ldyBzb3VyY2UuY29uc3RydWN0b3Ioc291cmNlLm1lc3NhZ2UpO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm9uIGNsb25hYmxlIG9iamVjdHNcbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIFByb21pc2UgfHxcbiAgICAgIHNvdXJjZSBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICAgIHNvdXJjZSBpbnN0YW5jZW9mIFdlYWtTZXQ6IHtcbiAgICAgIGNsb25lID0gc291cmNlO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIEluc3RhbmNlIG9mIGEgY2xhc3NcbiAgICBjYXNlIHNvdXJjZS5jb25zdHJ1Y3RvciAmJiBzb3VyY2UuY29uc3RydWN0b3IgIT09IE9iamVjdDoge1xuICAgICAgaWYgKCFjbG9uZUNsYXNzSW5zdGFuY2VzKSB7XG4gICAgICAgIGNsb25lID0gc291cmNlO1xuICAgICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgfVxuICAgICAgY2xvbmUgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGxhaW4gb2JqZWN0c1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNsb25lID0ge307XG4gICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcblxuICAgICAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhzb3VyY2UpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBjbG9uZVtrZXkgYXMgc3RyaW5nXSA9IGRlZXBDbG9uZVVuZnJlZXplKFxuICAgICAgICAgIHNvdXJjZVtrZXkgYXMgc3RyaW5nXSxcbiAgICAgICAgICBjbG9uZUNsYXNzSW5zdGFuY2VzLFxuICAgICAgICAgIHNlZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhkZXNjcmlwdG9ycykpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNba2V5IGFzIHN0cmluZ107XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLnZhbHVlID0gZGVlcENsb25lVW5mcmVlemUoXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWUsXG4gICAgICAgIGNsb25lQ2xhc3NJbnN0YW5jZXMsXG4gICAgICAgIHNlZW5cbiAgICAgICk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9uZSwga2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxuXG4gIHJldHVybiBjbG9uZTtcbn1cbiIsImltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgYXJlQ2xvc2VFbm91Z2ggfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE51bWJlcktleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1pbiA9IHNjaGVtYS5taW5pbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1pbiA9IHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICsgMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWluICs9IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhIDwgbWluKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1heCA9IHNjaGVtYS5tYXhpbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1heCA9IHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtIC0gMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWF4IC09IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhID4gbWF4KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtdWx0aXBsZU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVvdGllbnQgPSBkYXRhIC8gc2NoZW1hLm11bHRpcGxlT2Y7XG5cbiAgICBpZiAoIWlzRmluaXRlKHF1b3RpZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghYXJlQ2xvc2VFbm91Z2gocXVvdGllbnQsIE1hdGgucm91bmQocXVvdGllbnQpKSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIG11bHRpcGxlT2ZcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtaW5pbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPD0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBleGNsdXNpdmVNaW5pbXVtXCIpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtYXhpbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPj0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcbiAgICAgICAgXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1heGltdW1cIixcbiAgICAgICAgeyBkYXRhIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG59O1xuIiwiY29uc3QgUkVHRVhfTUVUQV9DSEFSUyA9IC9bXFxcXC5eJCorPygpW1xcXXt9fF0vO1xuXG5mdW5jdGlvbiBoYXNSZWdleE1ldGEodmFsdWU6IHN0cmluZykge1xuICByZXR1cm4gUkVHRVhfTUVUQV9DSEFSUy50ZXN0KHZhbHVlKTtcbn1cblxuY29uc3QgUEFUVEVSTl9DQUNIRSA9IG5ldyBNYXA8c3RyaW5nLCBDb21waWxlZFBhdHRlcm5NYXRjaGVyPigpO1xuXG5leHBvcnQgdHlwZSBDb21waWxlZFBhdHRlcm5NYXRjaGVyID0gUmVnRXhwIHwgKCh2YWx1ZTogc3RyaW5nKSA9PiBib29sZWFuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVQYXR0ZXJuTWF0Y2hlcihwYXR0ZXJuOiBzdHJpbmcpOiBDb21waWxlZFBhdHRlcm5NYXRjaGVyIHtcbiAgY29uc3QgY2FjaGVkID0gUEFUVEVSTl9DQUNIRS5nZXQocGF0dGVybik7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgbGV0IGNvbXBpbGVkOiBDb21waWxlZFBhdHRlcm5NYXRjaGVyO1xuXG4gIGlmIChwYXR0ZXJuLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbXBpbGVkID0gKF92YWx1ZTogc3RyaW5nKSA9PiB0cnVlO1xuICB9IGVsc2UgaWYgKCFoYXNSZWdleE1ldGEocGF0dGVybikpIHtcbiAgICBjb21waWxlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5pbmNsdWRlcyhwYXR0ZXJuKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7XG5cbiAgICBpZiAocGF0dGVybkxlbmd0aCA+PSAyICYmIHBhdHRlcm5bMF0gPT09IFwiXlwiICYmIHBhdHRlcm5bcGF0dGVybkxlbmd0aCAtIDFdID09PSBcIiRcIikge1xuICAgICAgY29uc3QgaW5uZXIgPSBwYXR0ZXJuLnNsaWNlKDEsIC0xKTtcbiAgICAgIGlmICghaGFzUmVnZXhNZXRhKGlubmVyKSkge1xuICAgICAgICBpZiAoaW5uZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29tcGlsZWQgPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUubGVuZ3RoID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlID09PSBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGlsZWQgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIFwidVwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhdHRlcm5bMF0gPT09IFwiXlwiKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHBhdHRlcm4uc2xpY2UoMSk7XG4gICAgICBpZiAoIWhhc1JlZ2V4TWV0YShpbm5lcikpIHtcbiAgICAgICAgaWYgKGlubmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbXBpbGVkID0gKF92YWx1ZTogc3RyaW5nKSA9PiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlLnN0YXJ0c1dpdGgoaW5uZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21waWxlZCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGF0dGVybltwYXR0ZXJuTGVuZ3RoIC0gMV0gPT09IFwiJFwiKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHBhdHRlcm4uc2xpY2UoMCwgLTEpO1xuICAgICAgaWYgKCFoYXNSZWdleE1ldGEoaW5uZXIpKSB7XG4gICAgICAgIGlmIChpbm5lci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb21waWxlZCA9IChfdmFsdWU6IHN0cmluZykgPT4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21waWxlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5lbmRzV2l0aChpbm5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVkID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBpbGVkID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgfVxuICB9XG5cbiAgUEFUVEVSTl9DQUNIRS5zZXQocGF0dGVybiwgY29tcGlsZWQpO1xuICByZXR1cm4gY29tcGlsZWQ7XG59XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmVVbmZyZWV6ZSB9IGZyb20gXCIuLi91dGlscy9kZWVwLWZyZWV6ZVwiO1xuaW1wb3J0IHsgY29tcGlsZVBhdHRlcm5NYXRjaGVyIH0gZnJvbSBcIi4uL3V0aWxzL3BhdHRlcm4tbWF0Y2hlclwiO1xuXG5jb25zdCBQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCA9IDUxMjtcblxudHlwZSBQYXR0ZXJuUHJvcGVydHlFbnRyeSA9IHtcbiAgc2NoZW1hUHJvcDogYW55O1xuICBtYXRjaDogKGtleTogc3RyaW5nKSA9PiBib29sZWFuO1xufTtcblxuZnVuY3Rpb24gZ2V0UGF0dGVyblByb3BlcnR5RW50cmllcyhzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgbGV0IGVudHJpZXMgPSAoc2NoZW1hIGFzIGFueSkuX3BhdHRlcm5Qcm9wZXJ0eUVudHJpZXMgYXNcbiAgICB8IFBhdHRlcm5Qcm9wZXJ0eUVudHJ5W11cbiAgICB8IHVuZGVmaW5lZDtcblxuICBpZiAoZW50cmllcykge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgaWYgKFxuICAgICFzY2hlbWEucGF0dGVyblByb3BlcnRpZXMgfHxcbiAgICB0eXBlb2Ygc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzICE9PSBcIm9iamVjdFwiIHx8XG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwYXR0ZXJuS2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7XG4gIGVudHJpZXMgPSBuZXcgQXJyYXkocGF0dGVybktleXMubGVuZ3RoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5LZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcGF0dGVybktleXNbaV07XG4gICAgY29uc3QgY29tcGlsZWRNYXRjaGVyID0gY29tcGlsZVBhdHRlcm5NYXRjaGVyKGtleSk7XG4gICAgY29uc3QgbWF0Y2ggPVxuICAgICAgY29tcGlsZWRNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgID8gKHZhbHVlOiBzdHJpbmcpID0+IGNvbXBpbGVkTWF0Y2hlci50ZXN0KHZhbHVlKVxuICAgICAgICA6IGNvbXBpbGVkTWF0Y2hlcjtcblxuICAgIGVudHJpZXNbaV0gPSB7XG4gICAgICBzY2hlbWFQcm9wOiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNba2V5XSxcbiAgICAgIG1hdGNoXG4gICAgfTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzY2hlbWEsIFwiX3BhdHRlcm5Qcm9wZXJ0eUVudHJpZXNcIiwge1xuICAgIHZhbHVlOiBlbnRyaWVzLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzKFxuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGtleTogc3RyaW5nLFxuICBlbnRyaWVzOiBQYXR0ZXJuUHJvcGVydHlFbnRyeVtdXG4pIHtcbiAgbGV0IGNhY2hlID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuS2V5TWF0Y2hJbmRleENhY2hlIGFzXG4gICAgfCBNYXA8c3RyaW5nLCBudW1iZXJbXT5cbiAgICB8IHVuZGVmaW5lZDtcblxuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuS2V5TWF0Y2hJbmRleENhY2hlXCIsIHtcbiAgICAgIHZhbHVlOiBjYWNoZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgaW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZW50cmllc1tpXS5tYXRjaChrZXkpKSB7XG4gICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhY2hlLnNpemUgPCBQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCkge1xuICAgIGNhY2hlLnNldChrZXksIGluZGV4ZXMpO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5yZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gc2NoZW1hLnJlcXVpcmVkW2ldO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwcm9wS2V5cyA9IChzY2hlbWEgYXMgYW55KS5fcHJvcEtleXMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFwcm9wS2V5cykge1xuICAgICAgcHJvcEtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcyB8fCB7fSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wcm9wS2V5c1wiLCB7XG4gICAgICAgIHZhbHVlOiBwcm9wS2V5cyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVpcmVkU2V0ID0gKHNjaGVtYSBhcyBhbnkpLl9yZXF1aXJlZFNldCBhc1xuICAgICAgfCBTZXQ8c3RyaW5nPlxuICAgICAgfCBudWxsXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWlyZWRTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWlyZWRTZXQgPSBBcnJheS5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZClcbiAgICAgICAgPyBuZXcgU2V0PHN0cmluZz4oc2NoZW1hLnJlcXVpcmVkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9yZXF1aXJlZFNldFwiLCB7XG4gICAgICAgIHZhbHVlOiByZXF1aXJlZFNldCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcEtleXNbaV07XG4gICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XTtcblxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxdWlyZWRTZXQgJiZcbiAgICAgICAgICByZXF1aXJlZFNldC5oYXMoa2V5KSAmJlxuICAgICAgICAgIHNjaGVtYVByb3AgJiZcbiAgICAgICAgICB0eXBlb2Ygc2NoZW1hUHJvcCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYVByb3ApICYmXG4gICAgICAgICAgXCJkZWZhdWx0XCIgaW4gc2NoZW1hUHJvcFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IChzY2hlbWFQcm9wIGFzIGFueSkuJHZhbGlkYXRlKHNjaGVtYVByb3AuZGVmYXVsdCk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZWZhdWx0IHByb3BlcnR5IGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgZGF0YTogc2NoZW1hUHJvcC5kZWZhdWx0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YVtrZXldID0gZGVlcENsb25lVW5mcmVlemUoc2NoZW1hUHJvcC5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWFQcm9wID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoc2NoZW1hUHJvcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYVByb3AgJiYgXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWFQcm9wKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgdmFsdWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU2NoZW1hID0gc2NoZW1hLnZhbHVlcztcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHZhbHVlU2NoZW1hICYmIHZhbHVlU2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY291bnQrKztcbiAgICAgIGlmIChjb3VudCA+IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBtYW55IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtaW5Qcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvdW50Kys7XG4gICAgICBpZiAoY291bnQgPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBmZXcgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFwVmFsaWRhdGUgPSAoc2NoZW1hIGFzIGFueSkuX2FwVmFsaWRhdGUgYXNcbiAgICAgIHwgKChkYXRhOiBhbnkpID0+IGFueSlcbiAgICAgIHwgbnVsbFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFwVmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXBWYWxpZGF0ZSA9IGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKVxuICAgICAgICA/IHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcy4kdmFsaWRhdGVcbiAgICAgICAgOiBudWxsO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfYXBWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBhcFZhbGlkYXRlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuRW50cmllcyA9IGdldFBhdHRlcm5Qcm9wZXJ0eUVudHJpZXMoc2NoZW1hKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjaGVtYS5wcm9wZXJ0aWVzLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXR0ZXJuRW50cmllcyAmJiBwYXR0ZXJuRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGdldFBhdHRlcm5LZXlNYXRjaEluZGV4ZXMoc2NoZW1hLCBrZXksIHBhdHRlcm5FbnRyaWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwVmFsaWRhdGUpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhcFZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgcGF0dGVyblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybkVudHJpZXMgPSBnZXRQYXR0ZXJuUHJvcGVydHlFbnRyaWVzKHNjaGVtYSk7XG4gICAgaWYgKCFwYXR0ZXJuRW50cmllcyB8fCBwYXR0ZXJuRW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaGluZ0luZGV4ZXMgPSBnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzKHNjaGVtYSwga2V5LCBwYXR0ZXJuRW50cmllcyk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0luZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlICYmXG4gICAgICAgICAgIShzY2hlbWEucHJvcGVydGllcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2NoZW1hLnByb3BlcnRpZXMsIGtleSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRjaGluZ0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hUHJvcCA9IHBhdHRlcm5FbnRyaWVzW21hdGNoaW5nSW5kZXhlc1tqXV0uc2NoZW1hUHJvcDtcblxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYVByb3AgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYVByb3AgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYVByb3AuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuICBwcm9wZXJ0eU5hbWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBuID0gc2NoZW1hLnByb3BlcnR5TmFtZXM7XG5cbiAgICBpZiAodHlwZW9mIHBuID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHBuID09PSBmYWxzZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IHBuICYmIHBuLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZShrZXkpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IG5hbWUgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRlcGVuZGVuY2llcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAoa2V5IGluIGRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXBlbmRlbmN5ID0gc2NoZW1hLmRlcGVuZGVuY2llc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCEoZGVwZW5kZW5jeVtpXSBpbiBkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgZGF0YTogZGVwZW5kZW5jeVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSBpbiBkYXRhKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHsgZGF0YTogZGVwZW5kZW5jeSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gZGVwZW5kZW5jeS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgLy8gUmVxdWlyZWQgYnkgb3RoZXIga2V5d29yZHMgYnV0IG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24gaXRzZWxmXG4gIHRoZW46IGZhbHNlLFxuICBlbHNlOiBmYWxzZSxcbiAgZGVmYXVsdDogZmFsc2UsXG5cbiAgLy8gTm90IGltcGxlbWVudGVkIHlldFxuICBkZWZpbml0aW9uczogZmFsc2UsXG4gICRpZDogZmFsc2UsXG4gICRzY2hlbWE6IGZhbHNlLFxuXG4gIC8vIE1ldGFkYXRhIGtleXdvcmRzIChub3QgdXNlZCBhcyBhIGZ1bmN0aW9uKVxuICB0aXRsZTogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgJGNvbW1lbnQ6IGZhbHNlLFxuICBleGFtcGxlczogZmFsc2UsXG4gIGNvbnRlbnRNZWRpYVR5cGU6IGZhbHNlLFxuICBjb250ZW50RW5jb2Rpbmc6IGZhbHNlLFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgT3BlbiBBUEkga2V5d29yZHNcbiAgZGlzY3JpbWluYXRvcjogZmFsc2UsXG4gIG51bGxhYmxlOiBmYWxzZVxufTtcbiIsImltcG9ydCB7IGlzQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi4vdXRpbHMvbWFpbi11dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGhhc0NoYW5nZWQgfSBmcm9tIFwiLi4vdXRpbHMvaGFzLWNoYW5nZWRcIjtcblxudHlwZSBCcmFuY2hFbnRyeSA9XG4gIHwgeyBraW5kOiBcInZhbGlkYXRlXCI7IHZhbGlkYXRlOiAoZGF0YTogYW55KSA9PiBhbnkgfVxuICB8IHsga2luZDogXCJhbHdheXNWYWxpZFwiIH1cbiAgfCB7IGtpbmQ6IFwiYWx3YXlzSW52YWxpZFwiIH1cbiAgfCB7IGtpbmQ6IFwibGl0ZXJhbFwiOyB2YWx1ZTogYW55IH07XG5cbmZ1bmN0aW9uIHRvQnJhbmNoRW50cnkoaXRlbTogYW55KTogQnJhbmNoRW50cnkge1xuICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIGl0ZW0gJiYgdHlwZW9mIGl0ZW0uJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwidmFsaWRhdGVcIiwgdmFsaWRhdGU6IGl0ZW0uJHZhbGlkYXRlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsga2luZDogXCJhbHdheXNWYWxpZFwiIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHsga2luZDogaXRlbSA/IFwiYWx3YXlzVmFsaWRcIiA6IFwiYWx3YXlzSW52YWxpZFwiIH07XG4gIH1cblxuICByZXR1cm4geyBraW5kOiBcImxpdGVyYWxcIiwgdmFsdWU6IGl0ZW0gfTtcbn1cblxuZnVuY3Rpb24gZ2V0QnJhbmNoRW50cmllcyhzY2hlbWE6IGFueSwga2V5OiBcImFsbE9mXCIgfCBcImFueU9mXCIgfCBcIm9uZU9mXCIpIHtcbiAgY29uc3QgY2FjaGVLZXkgPSBgXyR7a2V5fUJyYW5jaEVudHJpZXNgO1xuICBsZXQgZW50cmllcyA9IHNjaGVtYVtjYWNoZUtleV0gYXMgQnJhbmNoRW50cnlbXSB8IHVuZGVmaW5lZDtcblxuICBpZiAoZW50cmllcykge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gc2NoZW1hW2tleV0gfHwgW107XG4gIGVudHJpZXMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIGVudHJpZXMucHVzaCh0b0JyYW5jaEVudHJ5KHNvdXJjZVtpXSkpO1xuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgY2FjaGVLZXksIHtcbiAgICB2YWx1ZTogZW50cmllcyxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcblxuICByZXR1cm4gZW50cmllcztcbn1cblxuZXhwb3J0IGNvbnN0IE90aGVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIGVudW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGxldCBlbnVtQ2FjaGUgPSAoc2NoZW1hIGFzIGFueSkuX2VudW1DYWNoZSBhc1xuICAgICAgfCB7IHByaW1pdGl2ZVNldDogU2V0PGFueT47IG9iamVjdFZhbHVlczogYW55W10gfVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWVudW1DYWNoZSkge1xuICAgICAgY29uc3QgcHJpbWl0aXZlU2V0ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgICBjb25zdCBvYmplY3RWYWx1ZXM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBsaXN0ID0gc2NoZW1hLmVudW07XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbnVtSXRlbSA9IGxpc3RbaV07XG4gICAgICAgIGlmIChlbnVtSXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgZW51bUl0ZW0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBvYmplY3RWYWx1ZXMucHVzaChlbnVtSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbWl0aXZlU2V0LmFkZChlbnVtSXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW51bUNhY2hlID0geyBwcmltaXRpdmVTZXQsIG9iamVjdFZhbHVlcyB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfZW51bUNhY2hlXCIsIHtcbiAgICAgICAgdmFsdWU6IGVudW1DYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgISh0eXBlb2YgZGF0YSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNOYU4oZGF0YSkpICYmXG4gICAgICBlbnVtQ2FjaGUucHJpbWl0aXZlU2V0LmhhcyhkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvLyBDb25zZXJ2YXRpdmUgZXhhY3Qtc2VtYW50aWNzIHBhdGguXG4gICAgICAvLyBGdXR1cmUgb3B0LWluIG9wdGltaXphdGlvbjogc3RydWN0dXJhbCBoYXNoaW5nIGJ1Y2tldHMgZm9yIGxhcmdlIGVudW1zLlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnVtQ2FjaGUub2JqZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChlbnVtQ2FjaGUub2JqZWN0VmFsdWVzW2ldLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnZXRCcmFuY2hFbnRyaWVzKHNjaGVtYSwgXCJhbGxPZlwiKTtcblxuICAgIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9ubHlCcmFuY2ggPSBicmFuY2hlc1swXTtcblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJ2YWxpZGF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gb25seUJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJhbHdheXNWYWxpZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJhbHdheXNJbnZhbGlkXCIpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IG9ubHlCcmFuY2gudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwidmFsaWRhdGVcIikge1xuICAgICAgICBjb25zdCBlcnJvciA9IGJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSAhPT0gYnJhbmNoLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGFueU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IGdldEJyYW5jaEVudHJpZXMoc2NoZW1hLCBcImFueU9mXCIpO1xuXG4gICAgaWYgKGJyYW5jaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qgb25seUJyYW5jaCA9IGJyYW5jaGVzWzBdO1xuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcInZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBvbmx5QnJhbmNoLnZhbGlkYXRlKGRhdGEpO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmx5QnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmx5QnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzSW52YWxpZFwiKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhID09PSBvbmx5QnJhbmNoLnZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSBicmFuY2hlc1tpXTtcblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcInZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBicmFuY2gudmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChicmFuY2gua2luZCA9PT0gXCJhbHdheXNWYWxpZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgPT09IGJyYW5jaC52YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnZXRCcmFuY2hFbnRyaWVzKHNjaGVtYSwgXCJvbmVPZlwiKTtcblxuICAgIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9ubHlCcmFuY2ggPSBicmFuY2hlc1swXTtcblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJ2YWxpZGF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gb25seUJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcImFsd2F5c1ZhbGlkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSA9PT0gb25seUJyYW5jaC52YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBicmFuY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYnJhbmNoID0gYnJhbmNoZXNbaV07XG4gICAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwidmFsaWRhdGVcIikge1xuICAgICAgICBpc1ZhbGlkID0gIWJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzSW52YWxpZFwiKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzVmFsaWQgPSBkYXRhID09PSBicmFuY2gudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZENvdW50ID09PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBjb25zdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKGRhdGEgPT09IHNjaGVtYS5jb25zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChkYXRhICYmXG4gICAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIHNjaGVtYS5jb25zdCAmJlxuICAgICAgICB0eXBlb2Ygc2NoZW1hLmNvbnN0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgIWhhc0NoYW5nZWQoZGF0YSwgc2NoZW1hLmNvbnN0KSkgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hLmNvbnN0KSAmJlxuICAgICAgICAhaGFzQ2hhbmdlZChkYXRhLCBzY2hlbWEuY29uc3QpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGlmKHNjaGVtYSwgZGF0YSkge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEubm90ICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hLm5vdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLm5vdClcbiAgICApIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoc2NoZW1hLm5vdCBhcyBhbnkpLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gICRyZWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoc2NoZW1hLl9yZXNvbHZlZFJlZikge1xuICAgICAgaWYgKHNjaGVtYS4kdmFsaWRhdGUgIT09IHNjaGVtYS5fcmVzb2x2ZWRSZWYpIHtcbiAgICAgICAgc2NoZW1hLiR2YWxpZGF0ZSA9IHNjaGVtYS5fcmVzb2x2ZWRSZWY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWEuX3Jlc29sdmVkUmVmKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZlBhdGggPSBzY2hlbWEuJHJlZjtcbiAgICBsZXQgdGFyZ2V0U2NoZW1hID0gaW5zdGFuY2UuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHRhcmdldFNjaGVtYSA9IGluc3RhbmNlLmdldFNjaGVtYUJ5SWQocmVmUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihgTWlzc2luZyByZWZlcmVuY2U6ICR7cmVmUGF0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlbWEuX3Jlc29sdmVkUmVmID0gdGFyZ2V0U2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBzY2hlbWEuJHZhbGlkYXRlID0gc2NoZW1hLl9yZXNvbHZlZFJlZjtcbiAgICByZXR1cm4gc2NoZW1hLl9yZXNvbHZlZFJlZihkYXRhKTtcbiAgfVxufTtcbiIsImltcG9ydCB7IEFycmF5S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IE51bWJlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvbnVtYmVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPYmplY3RLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL29iamVjdC1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT3RoZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL290aGVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBTdHJpbmdLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkc1wiO1xuXG5leHBvcnQgY29uc3Qga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgLi4uT2JqZWN0S2V5d29yZHMsXG4gIC4uLkFycmF5S2V5d29yZHMsXG4gIC4uLlN0cmluZ0tleXdvcmRzLFxuICAuLi5OdW1iZXJLZXl3b3JkcyxcbiAgLi4uT3RoZXJLZXl3b3Jkc1xufTtcbiIsImltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uLCBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGNvbXBpbGVQYXR0ZXJuTWF0Y2hlciB9IGZyb20gXCIuLi91dGlscy9wYXR0ZXJuLW1hdGNoZXJcIjtcblxuY29uc3QgUEFUVEVSTl9NQVRDSF9DQUNIRV9MSU1JVCA9IDUxMjtcbmNvbnN0IEZPUk1BVF9SRVNVTFRfQ0FDSEVfTElNSVQgPSA1MTI7XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgbWluTGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heExlbmd0aChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8IGRhdGEubGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIHBhdHRlcm4oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwYXR0ZXJuTWF0Y2ggPSAoc2NoZW1hIGFzIGFueSkuX3BhdHRlcm5NYXRjaCBhc1xuICAgICAgfCAoKHZhbHVlOiBzdHJpbmcpID0+IGJvb2xlYW4pXG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGxldCBwYXR0ZXJuTWF0Y2hDYWNoZSA9IChzY2hlbWEgYXMgYW55KS5fcGF0dGVybk1hdGNoQ2FjaGUgYXNcbiAgICAgIHwgTWFwPHN0cmluZywgYm9vbGVhbj5cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFwYXR0ZXJuTWF0Y2gpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkID0gY29tcGlsZVBhdHRlcm5NYXRjaGVyKHNjaGVtYS5wYXR0ZXJuKTtcbiAgICAgICAgcGF0dGVybk1hdGNoID1cbiAgICAgICAgICBjb21waWxlZCBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgICAgICAgPyAodmFsdWU6IHN0cmluZykgPT4gY29tcGlsZWQudGVzdCh2YWx1ZSlcbiAgICAgICAgICAgIDogY29tcGlsZWQ7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfcGF0dGVybk1hdGNoXCIsIHtcbiAgICAgICAgICB2YWx1ZTogcGF0dGVybk1hdGNoLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGF0dGVybk1hdGNoQ2FjaGUpIHtcbiAgICAgIHBhdHRlcm5NYXRjaENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuTWF0Y2hDYWNoZVwiLCB7XG4gICAgICAgIHZhbHVlOiBwYXR0ZXJuTWF0Y2hDYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuTWF0Y2hDYWNoZS5oYXMoZGF0YSkpIHtcbiAgICAgIGlmIChwYXR0ZXJuTWF0Y2hDYWNoZS5nZXQoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNNYXRjaCA9IHBhdHRlcm5NYXRjaChkYXRhKTtcbiAgICBpZiAocGF0dGVybk1hdGNoQ2FjaGUuc2l6ZSA8IFBBVFRFUk5fTUFUQ0hfQ0FDSEVfTElNSVQpIHtcbiAgICAgIHBhdHRlcm5NYXRjaENhY2hlLnNldChkYXRhLCBpc01hdGNoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBwYXR0ZXJuXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICAvLyBUYWtlIGludG8gYWNjb3VudCB0aGF0IGlmIHdlIHJlY2VpdmUgYSBmb3JtYXQgdGhhdCBpcyBub3QgZGVmaW5lZCwgd2VcbiAgLy8gd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IsIHdlIGp1c3QgaWdub3JlIGl0LlxuICBmb3JtYXQoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZm9ybWF0VmFsaWRhdGUgPSAoc2NoZW1hIGFzIGFueSkuX2Zvcm1hdFZhbGlkYXRlIGFzXG4gICAgICB8IEZvcm1hdEZ1bmN0aW9uXG4gICAgICB8IGZhbHNlXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQgYXNcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZvcm1hdFJlc3VsdENhY2hlID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRSZXN1bHRDYWNoZSBhc1xuICAgICAgfCBNYXA8c3RyaW5nLCBib29sZWFuPlxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZm9ybWF0VmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWxpZGF0ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkID0gaW5zdGFuY2UuaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yKFxuICAgICAgICBzY2hlbWEuZm9ybWF0LFxuICAgICAgICBmb3JtYXRWYWxpZGF0ZVxuICAgICAgKTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkXCIsIHtcbiAgICAgICAgdmFsdWU6IGZvcm1hdFJlc3VsdENhY2hlRW5hYmxlZCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQpIHtcbiAgICAgIGlmIChmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGlmICghZm9ybWF0UmVzdWx0Q2FjaGUpIHtcbiAgICAgIGZvcm1hdFJlc3VsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRSZXN1bHRDYWNoZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRSZXN1bHRDYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtYXRSZXN1bHRDYWNoZS5oYXMoZGF0YSkpIHtcbiAgICAgIGlmIChmb3JtYXRSZXN1bHRDYWNoZS5nZXQoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1ZhbGlkID0gZm9ybWF0VmFsaWRhdGUoZGF0YSk7XG4gICAgaWYgKGZvcm1hdFJlc3VsdENhY2hlLnNpemUgPCBGT1JNQVRfUkVTVUxUX0NBQ0hFX0xJTUlUKSB7XG4gICAgICBmb3JtYXRSZXN1bHRDYWNoZS5zZXQoZGF0YSwgaXNWYWxpZCk7XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgfVxufTtcbiIsIi8qKioqKioqKioqKioqKioqKiogUGF0aDogbGliL2luZGV4LnRzICoqKioqKioqKioqKioqKioqKi9cbmltcG9ydCB7XG4gIERlZmluZUVycm9yRnVuY3Rpb24sXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIHJlc29sdmVQYXRoXG59IGZyb20gXCIuL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgRm9ybWF0cyB9IGZyb20gXCIuL2Zvcm1hdHNcIjtcbmltcG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHNcIjtcbmltcG9ydCB7IGRlZXBDbG9uZVVuZnJlZXplIH0gZnJvbSBcIi4vdXRpbHMvZGVlcC1mcmVlemVcIjtcblxuZXhwb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4vdXRpbHMvbWFpbi11dGlsc1wiO1xuZXhwb3J0IHsgZGVlcENsb25lVW5mcmVlemUgYXMgZGVlcENsb25lIH0gZnJvbSBcIi4vdXRpbHMvZGVlcC1mcmVlemVcIjtcblxuZXhwb3J0IHR5cGUgUmVzdWx0ID0gdm9pZCB8IFZhbGlkYXRpb25FcnJvciB8IHRydWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHtcbiAgICBkYXRhOiBhbnk7XG4gICAgZXJyb3I6IFZhbGlkYXRpb25FcnJvciB8IG51bGwgfCB0cnVlO1xuICAgIHZhbGlkOiBib29sZWFuO1xuICB9O1xuICBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWE7XG59XG5cbmludGVyZmFjZSBWYWxpZGF0b3JJdGVtIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWxpZGF0ZTogVmFsaWRhdGVGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYVNoaWVsZCB7XG4gIHByaXZhdGUgdHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGltbXV0YWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIHJvb3RTY2hlbWE6IENvbXBpbGVkU2NoZW1hIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaWRSZWdpc3RyeTogTWFwPHN0cmluZywgQ29tcGlsZWRTY2hlbWE+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZhaWxGYXN0OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW1tdXRhYmxlID0gZmFsc2UsXG4gICAgZmFpbEZhc3QgPSB0cnVlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIGZhaWxGYXN0PzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5mYWlsRmFzdCA9IGZhaWxGYXN0O1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhUeXBlcykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRUeXBlKHR5cGUsIHZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhrZXl3b3JkcykpIHtcbiAgICAgIHRoaXMuYWRkS2V5d29yZChrZXl3b3JkLCB2YWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmb3JtYXQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoRm9ybWF0cykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtYXQoZm9ybWF0LCB2YWxpZGF0b3IgYXMgRm9ybWF0RnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFR5cGUobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IFR5cGVGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy50eXBlc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBUeXBlIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMudHlwZXNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRUeXBlKHR5cGU6IHN0cmluZyk6IFR5cGVGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy50eXBlc1t0eXBlXTtcbiAgfVxuXG4gIGFkZEZvcm1hdChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogRm9ybWF0RnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0c1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBGb3JtYXQgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtYXRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0Rm9ybWF0KGZvcm1hdDogc3RyaW5nKTogRm9ybWF0RnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yKGZvcm1hdDogc3RyaW5nLCB2YWxpZGF0b3I6IEZvcm1hdEZ1bmN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChGb3JtYXRzIGFzIFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+KVtmb3JtYXRdID09PSB2YWxpZGF0b3I7XG4gIH1cblxuICBhZGRLZXl3b3JkKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBLZXl3b3JkRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMua2V5d29yZHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgS2V5d29yZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLmtleXdvcmRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0S2V5d29yZChrZXl3b3JkOiBzdHJpbmcpOiBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMua2V5d29yZHNba2V5d29yZF07XG4gIH1cblxuICBnZXRTY2hlbWFSZWYocGF0aDogc3RyaW5nKTogQ29tcGlsZWRTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290U2NoZW1hKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlUGF0aCh0aGlzLnJvb3RTY2hlbWEsIHBhdGgpO1xuICB9XG5cbiAgZ2V0U2NoZW1hQnlJZChpZDogc3RyaW5nKTogQ29tcGlsZWRTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmlkUmVnaXN0cnkuZ2V0KGlkKTtcbiAgfVxuXG4gIGNvbXBpbGUoc2NoZW1hOiBhbnkpOiBWYWxpZGF0b3Ige1xuICAgIHRoaXMuaWRSZWdpc3RyeS5jbGVhcigpO1xuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYSk7XG4gICAgdGhpcy5yb290U2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG4gICAgaWYgKChjb21waWxlZFNjaGVtYSBhcyBhbnkpLl9oYXNSZWYgPT09IHRydWUpIHtcbiAgICAgIHRoaXMubGlua1JlZmVyZW5jZXMoY29tcGlsZWRTY2hlbWEpO1xuICAgIH1cblxuICAgIGlmICghY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwib25lT2ZcIixcbiAgICAgICAgICBjb21waWxlZFNjaGVtYSxcbiAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICk7XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBcIlZhbGlkYXRlX0ZhbHNlXCIsXG4gICAgICAgICAgKGRhdGEpID0+IGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChzY2hlbWEgPT09IHRydWUpIHtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBcIlZhbGlkYXRlX0FueVwiLFxuICAgICAgICAgICgpID0+IHt9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNTY2hlbWFMaWtlKHNjaGVtYSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJJbnZhbGlkIHNjaGVtYVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9BbnlcIixcbiAgICAgICAgICAoKSA9PiB7fVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJvb3RTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgICAgY29uc3QgY2xvbmVkRGF0YSA9IHRoaXMuaW1tdXRhYmxlID8gZGVlcENsb25lVW5mcmVlemUoZGF0YSkgOiBkYXRhO1xuICAgICAgY29uc3QgcmVzID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlIShjbG9uZWREYXRhKTtcblxuICAgICAgaWYgKHJlcykge1xuICAgICAgICByZXR1cm4geyBkYXRhOiBjbG9uZWREYXRhLCBlcnJvcjogcmVzLCB2YWxpZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGF0YTogY2xvbmVkRGF0YSwgZXJyb3I6IG51bGwsIHZhbGlkOiB0cnVlIH07XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmNvbXBpbGVkU2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG4gICAgcmV0dXJuIHZhbGlkYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlID09PSB0cnVlIHx8XG4gICAgICAodGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNoYWxsb3dBcnJheUVxdWFscyhhOiBhbnlbXSwgYjogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuQXNzb2NpYXRpdmVCcmFuY2hlcyhcbiAgICBrZXk6IFwiYWxsT2ZcIiB8IFwiYW55T2ZcIixcbiAgICBicmFuY2hlczogYW55W11cbiAgKTogYW55W10ge1xuICAgIGNvbnN0IG91dDogYW55W10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBicmFuY2hlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGl0ZW1ba2V5XSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLmZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzKGtleSwgaXRlbVtrZXldKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXN0ZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBvdXQucHVzaChuZXN0ZWRbal0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZihicmFuY2hlczogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IGN1cnJlbnQgPSBicmFuY2hlcztcblxuICAgIHdoaWxlIChjdXJyZW50Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgaXRlbSA9IGN1cnJlbnRbMF07XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChpdGVtKSAmJlxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShpdGVtLm9uZU9mKVxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnQgPSBpdGVtLm9uZU9mO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTY2hlbWFGb3JDb21waWxlKHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGxldCBub3JtYWxpemVkID0gc2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYUtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEpO1xuICAgIGNvbnN0IGhhc09ubHlLZXkgPSAoa2V5OiBzdHJpbmcpID0+XG4gICAgICBzY2hlbWFLZXlzLmxlbmd0aCA9PT0gMSAmJiBzY2hlbWFLZXlzWzBdID09PSBrZXk7XG5cbiAgICBjb25zdCBzZXROb3JtYWxpemVkID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAobm9ybWFsaXplZCA9PT0gc2NoZW1hKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQgPSB7IC4uLnNjaGVtYSB9O1xuICAgICAgfVxuICAgICAgbm9ybWFsaXplZFtrZXldID0gdmFsdWU7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5hbGxPZikpIHtcbiAgICAgIGNvbnN0IGZsYXR0ZW5lZEFsbE9mID0gdGhpcy5mbGF0dGVuQXNzb2NpYXRpdmVCcmFuY2hlcyhcbiAgICAgICAgXCJhbGxPZlwiLFxuICAgICAgICBzY2hlbWEuYWxsT2ZcbiAgICAgICkuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAhKFxuICAgICAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMFxuICAgICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaGFzT25seUtleShcImFsbE9mXCIpICYmXG4gICAgICAgIGZsYXR0ZW5lZEFsbE9mLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICB0aGlzLmlzUGxhaW5PYmplY3QoZmxhdHRlbmVkQWxsT2ZbMF0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5lZEFsbE9mWzBdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2hhbGxvd0FycmF5RXF1YWxzKGZsYXR0ZW5lZEFsbE9mLCBzY2hlbWEuYWxsT2YpKSB7XG4gICAgICAgIHNldE5vcm1hbGl6ZWQoXCJhbGxPZlwiLCBmbGF0dGVuZWRBbGxPZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkQW55T2YgPSB0aGlzLmZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzKFxuICAgICAgICBcImFueU9mXCIsXG4gICAgICAgIHNjaGVtYS5hbnlPZlxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBoYXNPbmx5S2V5KFwiYW55T2ZcIikgJiZcbiAgICAgICAgZmxhdHRlbmVkQW55T2YubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChmbGF0dGVuZWRBbnlPZlswXSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmxhdHRlbmVkQW55T2ZbMF07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zaGFsbG93QXJyYXlFcXVhbHMoZmxhdHRlbmVkQW55T2YsIHNjaGVtYS5hbnlPZikpIHtcbiAgICAgICAgc2V0Tm9ybWFsaXplZChcImFueU9mXCIsIGZsYXR0ZW5lZEFueU9mKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEub25lT2YpKSB7XG4gICAgICBjb25zdCBmbGF0dGVuZWRPbmVPZiA9IHRoaXMuZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZihzY2hlbWEub25lT2YpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGhhc09ubHlLZXkoXCJvbmVPZlwiKSAmJlxuICAgICAgICBmbGF0dGVuZWRPbmVPZi5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGZsYXR0ZW5lZE9uZU9mWzBdKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuZWRPbmVPZlswXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnNoYWxsb3dBcnJheUVxdWFscyhmbGF0dGVuZWRPbmVPZiwgc2NoZW1hLm9uZU9mKSkge1xuICAgICAgICBzZXROb3JtYWxpemVkKFwib25lT2ZcIiwgZmxhdHRlbmVkT25lT2YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrU2NoZW1hSGFzUmVmKHNjaGVtYTogQ29tcGlsZWRTY2hlbWEpIHtcbiAgICBpZiAoKHNjaGVtYSBhcyBhbnkpLl9oYXNSZWYgPT09IHRydWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9oYXNSZWZcIiwge1xuICAgICAgdmFsdWU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkU2tpcEtleXdvcmQoc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlID0gc2NoZW1hW2tleV07XG5cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSBcInJlcXVpcmVkXCI6XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XG4gICAgICBjYXNlIFwidW5pcXVlSXRlbXNcIjpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTtcbiAgICAgIGNhc2UgXCJwcm9wZXJ0aWVzXCI6XG4gICAgICBjYXNlIFwicGF0dGVyblByb3BlcnRpZXNcIjpcbiAgICAgIGNhc2UgXCJkZXBlbmRlbmNpZXNcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInByb3BlcnR5TmFtZXNcIjpcbiAgICAgIGNhc2UgXCJpdGVtc1wiOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWU7XG4gICAgICBjYXNlIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjpcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlID09PSBmYWxzZSAmJlxuICAgICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKS5sZW5ndGggPiAwXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiYWRkaXRpb25hbEl0ZW1zXCI6XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCAhQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpO1xuICAgICAgY2FzZSBcImFsbE9mXCI6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFueU9mXCI6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1JlcXVpcmVkRGVmYXVsdHMoc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzO1xuICAgIGlmICghdGhpcy5pc1BsYWluT2JqZWN0KHByb3BlcnRpZXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViU2NoZW1hID0gcHJvcGVydGllc1trZXlzW2ldXTtcbiAgICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qoc3ViU2NoZW1hKSAmJiBcImRlZmF1bHRcIiBpbiBzdWJTY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RlZmF1bHRUeXBlVmFsaWRhdG9yKHR5cGU6IHN0cmluZywgdmFsaWRhdG9yOiBUeXBlRnVuY3Rpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFR5cGVzIGFzIFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPilbdHlwZV0gPT09IHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSB0cnVlKSB7XG4gICAgICAgIHNjaGVtYSA9IHsgYW55T2Y6IFt7fV0gfTsgLy8gQWx3YXlzIHZhbGlkXG4gICAgICB9IGVsc2UgaWYgKHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2NoZW1hID0geyBvbmVPZjogW10gfTsgLy8gQWx3YXlzIGludmFsaWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVtYSA9IHsgb25lT2Y6IFtzY2hlbWFdIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZW1hID0gdGhpcy5ub3JtYWxpemVTY2hlbWFGb3JDb21waWxlKHNjaGVtYSk7XG5cbiAgICBjb25zdCBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWEgPSBkZWVwQ2xvbmVVbmZyZWV6ZShcbiAgICAgIHNjaGVtYVxuICAgICkgYXMgQ29tcGlsZWRTY2hlbWE7XG5cbiAgICBsZXQgc2NoZW1hSGFzUmVmID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHNjaGVtYS4kaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuaWRSZWdpc3RyeS5zZXQoc2NoZW1hLiRpZCwgY29tcGlsZWRTY2hlbWEpO1xuICAgIH1cblxuICAgIGlmIChcIiRyZWZcIiBpbiBzY2hlbWEpIHtcbiAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICBjb25zdCByZWZWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoXCIkcmVmXCIpO1xuICAgICAgaWYgKHJlZlZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwiJHJlZlwiLFxuICAgICAgICAgIHNjaGVtYVtcIiRyZWZcIl0sXG4gICAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIixcbiAgICAgICAgICAoZGF0YSkgPT5cbiAgICAgICAgICAgIChyZWZWYWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgY29tcGlsZWRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGRlZmluZUVycm9yLFxuICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFya1NjaGVtYUhhc1JlZihjb21waWxlZFNjaGVtYSk7XG4gICAgICByZXR1cm4gY29tcGlsZWRTY2hlbWE7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9ySXRlbVtdID0gW107XG4gICAgY29uc3QgYWN0aXZlTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoXCJ0eXBlXCIgaW4gc2NoZW1hKSB7XG4gICAgICBjb25zdCBkZWZpbmVUeXBlRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGVzID0gQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSlcbiAgICAgICAgPyBzY2hlbWEudHlwZVxuICAgICAgICA6IHNjaGVtYS50eXBlLnNwbGl0KFwiLFwiKS5tYXAoKHQ6IHN0cmluZykgPT4gdC50cmltKCkpO1xuXG4gICAgICBjb25zdCB0eXBlRnVuY3Rpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuICAgICAgY29uc3QgdHlwZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZGVmYXVsdFR5cGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBhbGxUeXBlc0RlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZUZ1bmN0aW9ucy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgICAgdHlwZU5hbWVzLnB1c2godmFsaWRhdG9yLm5hbWUpO1xuICAgICAgICAgIGlmICh0aGlzLmlzRGVmYXVsdFR5cGVWYWxpZGF0b3IodHlwZSwgdmFsaWRhdG9yKSkge1xuICAgICAgICAgICAgZGVmYXVsdFR5cGVOYW1lcy5wdXNoKHR5cGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGxUeXBlc0RlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwidHlwZVwiLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICkoXCJJbnZhbGlkIHR5cGUgZm9yIHNjaGVtYVwiLCB7IGRhdGE6IHNjaGVtYS50eXBlIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgY29tYmluZWRUeXBlVmFsaWRhdG9yOiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICAgICAgbGV0IHR5cGVNZXRob2ROYW1lID0gXCJcIjtcblxuICAgICAgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID09PSAxICYmIGFsbFR5cGVzRGVmYXVsdCkge1xuICAgICAgICBjb25zdCBzaW5nbGVUeXBlTmFtZSA9IGRlZmF1bHRUeXBlTmFtZXNbMF07XG4gICAgICAgIHR5cGVNZXRob2ROYW1lID0gc2luZ2xlVHlwZU5hbWU7XG5cbiAgICAgICAgc3dpdGNoIChzaW5nbGVUeXBlTmFtZSkge1xuICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcihkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghc2luZ2xlVHlwZUZuKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID4gMSAmJiBhbGxUeXBlc0RlZmF1bHQpIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSBkZWZhdWx0VHlwZU5hbWVzLmpvaW4oXCJfT1JfXCIpO1xuXG4gICAgICAgIGNvbnN0IGFsbG93c09iamVjdCA9IGRlZmF1bHRUeXBlTmFtZXMuaW5jbHVkZXMoXCJvYmplY3RcIik7XG4gICAgICAgIGNvbnN0IGFsbG93c0FycmF5ID0gZGVmYXVsdFR5cGVOYW1lcy5pbmNsdWRlcyhcImFycmF5XCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NTdHJpbmcgPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwic3RyaW5nXCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NOdW1iZXIgPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwibnVtYmVyXCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NJbnRlZ2VyID0gZGVmYXVsdFR5cGVOYW1lcy5pbmNsdWRlcyhcImludGVnZXJcIik7XG4gICAgICAgIGNvbnN0IGFsbG93c0Jvb2xlYW4gPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwiYm9vbGVhblwiKTtcbiAgICAgICAgY29uc3QgYWxsb3dzTnVsbCA9IGRlZmF1bHRUeXBlTmFtZXMuaW5jbHVkZXMoXCJudWxsXCIpO1xuXG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB0eXBlb2YgZGF0YTtcblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgaWYgKGFsbG93c051bWJlciB8fCAoYWxsb3dzSW50ZWdlciAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRhdGEpKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKGFsbG93c1N0cmluZykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIGlmIChhbGxvd3NCb29sZWFuKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBpZiAoYWxsb3dzTnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICBpZiAoYWxsb3dzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFsbG93c09iamVjdCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlRnVuY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0eXBlTWV0aG9kTmFtZSA9IHR5cGVOYW1lc1swXTtcbiAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoIXNpbmdsZVR5cGVGbihkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSB0eXBlTmFtZXMuam9pbihcIl9PUl9cIik7XG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZUZ1bmN0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBuYW1lOiB0eXBlTWV0aG9kTmFtZSxcbiAgICAgICAgdmFsaWRhdGU6IGdldE5hbWVkRnVuY3Rpb24odHlwZU1ldGhvZE5hbWUsIGNvbWJpbmVkVHlwZVZhbGlkYXRvcilcbiAgICAgIH0pO1xuICAgICAgYWN0aXZlTmFtZXMucHVzaCh0eXBlTWV0aG9kTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlLCAkaWQsICRyZWYsICR2YWxpZGF0ZSwgcmVxdWlyZWQsIC4uLm90aGVyS2V5cyB9ID0gc2NoZW1hOyAvLyBFeGNsdWRlIGhhbmRsZWQga2V5c1xuXG4gICAgLy8gSW4gaGVyZSB3ZSBjcmVhdGUgYW4gYXJyYXkgb2Yga2V5cyBwdXR0aW5nIHRoZSByZXF1aXJlIGtleXdvcmQgbGFzdFxuICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQgYWZ0ZXIgZGVmYXVsdHMgYXJlIGFwcGxpZWRcbiAgICBjb25zdCBrZXlPcmRlciA9IHJlcXVpcmVkXG4gICAgICA/IHRoaXMuaGFzUmVxdWlyZWREZWZhdWx0cyhzY2hlbWEpXG4gICAgICAgID8gWy4uLk9iamVjdC5rZXlzKG90aGVyS2V5cyksIFwicmVxdWlyZWRcIl1cbiAgICAgICAgOiBbXCJyZXF1aXJlZFwiLCAuLi5PYmplY3Qua2V5cyhvdGhlcktleXMpXVxuICAgICAgOiBPYmplY3Qua2V5cyhvdGhlcktleXMpO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGtleXdvcmRGbiA9IHRoaXMuZ2V0S2V5d29yZChrZXkpO1xuXG4gICAgICBpZiAoIWtleXdvcmRGbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvdWxkU2tpcEtleXdvcmQoc2NoZW1hLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICBrZXksXG4gICAgICAgIHNjaGVtYVtrZXldLFxuICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICApO1xuICAgICAgY29uc3QgZm5OYW1lID0ga2V5d29yZEZuLm5hbWUgfHwga2V5O1xuXG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBuYW1lOiBmbk5hbWUsXG4gICAgICAgIHZhbGlkYXRlOiBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KGZuTmFtZSwgKGRhdGEpID0+XG4gICAgICAgICAgKGtleXdvcmRGbiBhcyBLZXl3b3JkRnVuY3Rpb24pKGNvbXBpbGVkU2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgdGhpcylcbiAgICAgICAgKVxuICAgICAgfSk7XG5cbiAgICAgIGFjdGl2ZU5hbWVzLnB1c2goZm5OYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXRlcmFsS2V5d29yZHMgPSBbXCJlbnVtXCIsIFwiY29uc3RcIiwgXCJkZWZhdWx0XCIsIFwiZXhhbXBsZXNcIl07XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGlmIChsaXRlcmFsS2V5d29yZHMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzY2hlbWFba2V5XSAmJlxuICAgICAgICB0eXBlb2Ygc2NoZW1hW2tleV0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJwcm9wZXJ0aWVzXCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1YktleSBvZiBPYmplY3Qua2V5cyhzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkU3ViU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKFxuICAgICAgICAgICAgICBzY2hlbWFba2V5XVtzdWJLZXldXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoKGNvbXBpbGVkU3ViU2NoZW1hIGFzIGFueSkuX2hhc1JlZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBzY2hlbWFIYXNSZWYgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSBjb21waWxlZFN1YlNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcGlsZWRTdWJTY2hlbWEgPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBpZiAoKGNvbXBpbGVkU3ViU2NoZW1hIGFzIGFueSkuX2hhc1JlZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldID0gY29tcGlsZWRTdWJTY2hlbWE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWFba2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWFba2V5XVtpXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkU3ViU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYVtrZXldW2ldKTtcbiAgICAgICAgICAgIGlmICgoY29tcGlsZWRTdWJTY2hlbWEgYXMgYW55KS5faGFzUmVmID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV1baV0gPSBjb21waWxlZFN1YlNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYUhhc1JlZikge1xuICAgICAgdGhpcy5tYXJrU2NoZW1hSGFzUmVmKGNvbXBpbGVkU2NoZW1hKTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjb21waWxlZFNjaGVtYTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHYgPSB2YWxpZGF0b3JzWzBdO1xuICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbih2Lm5hbWUsIHYudmFsaWRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb21wb3NpdGVOYW1lID0gXCJWYWxpZGF0ZV9cIiArIGFjdGl2ZU5hbWVzLmpvaW4oXCJfQU5EX1wiKTtcblxuICAgICAgY29uc3QgbWFzdGVyVmFsaWRhdG9yOiBWYWxpZGF0ZUZ1bmN0aW9uID0gKGRhdGEpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHZhbGlkYXRvcnNbaV07XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB2LnZhbGlkYXRlKGRhdGEpO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9O1xuXG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKFxuICAgICAgICBjb21wb3NpdGVOYW1lLFxuICAgICAgICBtYXN0ZXJWYWxpZGF0b3JcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBpbGVkU2NoZW1hIGFzIENvbXBpbGVkU2NoZW1hO1xuICB9XG5cbiAgaXNTY2hlbWFMaWtlKHN1YlNjaGVtYTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgc3ViU2NoZW1hICYmXG4gICAgICB0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShzdWJTY2hlbWEpXG4gICAgKSB7XG4gICAgICBpZiAoXCJ0eXBlXCIgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBzdWJLZXkgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIGlmIChzdWJLZXkgaW4gdGhpcy5rZXl3b3Jkcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgbGlua1JlZmVyZW5jZXMocm9vdDogQ29tcGlsZWRTY2hlbWEpIHtcbiAgICBjb25zdCBzdGFjazogYW55W10gPSBbcm9vdF07XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBub2RlLiRyZWYgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUuJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgbm9kZS4kdmFsaWRhdGUubmFtZSA9PT0gXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlZlBhdGggPSBub2RlLiRyZWYgYXMgc3RyaW5nO1xuXG4gICAgICAgIGxldCB0YXJnZXQ6IGFueSA9IHRoaXMuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHRhcmdldCA9IHRoaXMuZ2V0U2NoZW1hQnlJZChyZWZQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmICh0YXJnZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG5vZGUuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbihcIlZhbGlkYXRlX1JlZl9UcnVlXCIsICgpID0+IHt9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVmaW5lRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgICAgICAgXCIkcmVmXCIsXG4gICAgICAgICAgICAgIG5vZGUgYXMgYW55LFxuICAgICAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBub2RlLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb24oXG4gICAgICAgICAgICAgIFwiVmFsaWRhdGVfUmVmX0ZhbHNlXCIsXG4gICAgICAgICAgICAgIChfZGF0YTogYW55KSA9PiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBub2RlLiR2YWxpZGF0ZSA9IHRhcmdldC4kdmFsaWRhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbm9kZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaCh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BWU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLFdBQXFCLEdBQ3JCQyxhQUF1QixHQUN2QkMsS0FDQUMsT0FFUUMsVUFBVUMsRUFBVSxJQUFLQyxFQUFrQixLQUNqRCxJQUFJTixFQUFhLEdBQUdLLEtBQVdFLEtBQUtULFVBQ2hDRyxFQUFlLEdBQUdLLElBWXRCLFlBWHlCLElBQWRDLEtBQUtWLE9BQ1csaUJBQWRVLEtBQUtWLE1BQXFCVSxLQUFLVixRQUFRVSxLQUFLSixTQUNyREgsR0FBYyxJQUFJTyxLQUFLVixRQUV6QkksR0FBZ0IsSUFBSU0sS0FBS1YsUUFHM0JVLEtBQUtOLGFBQWVBLEVBQ3BCTSxLQUFL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
|
|
1
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwidGhpcyIsIl9nZXRDYXVzZSIsInBvaW50ZXIiLCJpbnN0YW5jZVBvaW50ZXIiLCJnZXRDYXVzZSIsIl9nZXRUcmVlIiwidHJlZSIsImdldFRyZWUiLCJnZXRQYXRoIiwiRkFJTF9GQVNUX0RFRklORV9FUlJPUiIsImdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5Iiwia2V5IiwiZmFpbEZhc3QiLCJLZXl3b3JkRXJyb3IiLCJnZXROYW1lZEZ1bmN0aW9uIiwib3B0aW9ucyIsImlzQ29tcGlsZWRTY2hlbWEiLCJzdWJTY2hlbWEiLCJBcnJheSIsImlzQXJyYXkiLCJuYW1lIiwiZm4iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiVVVJRF9SRUdFWCIsIkRVUkFUSU9OX1JFR0VYIiwiVVJJX1JFR0VYIiwiRU1BSUxfUkVHRVgiLCJIT1NUTkFNRV9SRUdFWCIsIkRBVEVfUkVHRVgiLCJUSU1FX1JFR0VYIiwiVVJJX1JFRkVSRU5DRV9SRUdFWCIsIklSSV9SRUdFWCIsIklSSV9SRUZFUkVOQ0VfUkVHRVgiLCJJRE5fRU1BSUxfUkVHRVgiLCJJRE5fSE9TVE5BTUVfUkVHRVgiLCJEQVlTX0lOX01PTlRIIiwicGFyc2VUd29EaWdpdHMiLCJpbmRleCIsImZpcnN0IiwiY2hhckNvZGVBdCIsInNlY29uZCIsImlzVmFsaWRJcHY0UmFuZ2UiLCJzdGFydCIsImVuZCIsInNlZ21lbnRDb3VudCIsInNlZ21lbnRTdGFydCIsImkiLCJzZWdtZW50TGVuZ3RoIiwiaiIsImRpZ2l0IiwiRm9ybWF0cyIsImxlbmd0aCIsInRDb2RlIiwieWVhciIsImEiLCJiIiwiYyIsImQiLCJwYXJzZUZvdXJEaWdpdHMiLCJtb250aCIsImRheSIsImhvdXIiLCJtaW51dGUiLCJjdXJzb3IiLCJvZmZzZXRTaWduIiwib2Zmc2V0SG91ciIsIm9mZnNldE1pbnV0ZSIsImZyYWNTdGFydCIsImNvZGUiLCJ0ekNvZGUiLCJtYXhEYXlzIiwidXRjVG90YWxNaW51dGVzIiwib2Zmc2V0VG90YWxNaW51dGVzIiwidXJpIiwidGVzdCIsImVtYWlsIiwiaXB2NCIsImlzVmFsaWRJcHY0IiwiaXB2NiIsImhhc0NvbG9uIiwiaGFzRG91YmxlQ29sb24iLCJoZXh0ZXRDb3VudCIsImlzVmFsaWRJcHY2IiwiaG9zdG5hbWUiLCJkYXRlIiwibWF0Y2giLCJleGVjIiwieWVhclN0ciIsIm1vbnRoU3RyIiwiZGF5U3RyIiwiTnVtYmVyIiwicmVnZXgiLCJSZWdFeHAiLCJlIiwibmV4dCIsImlzVmFsaWRKc29uUG9pbnRlciIsImlzVmFsaWRSZWxhdGl2ZUpzb25Qb2ludGVyIiwidGltZSIsImluY2x1ZGVzIiwiY2xvc2VJbmRleCIsImluZGV4T2YiLCJpc1ZhbGlkVXJpVGVtcGxhdGUiLCJkdXJhdGlvbiIsInV1aWQiLCJpcmkiLCJUeXBlcyIsIm9iamVjdCIsImFycmF5Iiwic3RyaW5nIiwibnVtYmVyIiwiaW50ZWdlciIsImJvb2xlYW4iLCJudWxsIiwidGltZXN0YW1wIiwiaW50OCIsInVpbnQ4IiwiaW50MTYiLCJ1aW50MTYiLCJpbnQzMiIsInVpbnQzMiIsImZsb2F0MzIiLCJmbG9hdDY0IiwiaGFzQ2hhbmdlZCIsInByZXYiLCJjdXJyZW50IiwiaXMiLCJpc1VuaXF1ZVByaW1pdGl2ZSIsImdldEFycmF5QnVja2V0S2V5IiwibGFzdCIsImZpcnN0VHlwZSIsImxhc3RUeXBlIiwiZmlyc3RBcnJheU1hcmtlciIsImZpcnN0U2lnbmF0dXJlIiwiZ2V0UHJpbWl0aXZlQXJyYXlTaWduYXR1cmUiLCJsYXN0QXJyYXlNYXJrZXIiLCJsYXN0U2lnbmF0dXJlIiwiZ2V0T2JqZWN0U2hhcGVLZXkiLCJrZXlzIiwic29ydCIsImpvaW4iLCJzaWduYXR1cmUiLCJpc05hTiIsIkFycmF5S2V5d29yZHMiLCJpdGVtcyIsImRlZmluZUVycm9yIiwic2NoZW1hSXRlbXMiLCJkYXRhTGVuZ3RoIiwic2NoZW1hSXRlbXNMZW5ndGgiLCJpdGVtc0xlbmd0aCIsInNjaGVtYUl0ZW0iLCJ2YWxpZGF0ZSIsIiR2YWxpZGF0ZSIsImVycm9yIiwiZWxlbWVudHMiLCJlbGVtZW50c1NjaGVtYSIsIm1pbkl0ZW1zIiwibWF4SXRlbXMiLCJhZGRpdGlvbmFsSXRlbXMiLCJ0dXBsZUxlbmd0aCIsIl90dXBsZUl0ZW1zTGVuZ3RoIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwidW5pcXVlSXRlbXMiLCJsZW4iLCJsZWZ0IiwicmlnaHQiLCJwcmltaXRpdmVTZWVuIiwiU2V0IiwicHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzIiwiYXJyYXlCdWNrZXRzIiwib2JqZWN0QnVja2V0cyIsImhhcyIsImFkZCIsIk1hcCIsImJ1Y2tldEtleSIsImNhbmRpZGF0ZXMiLCJnZXQiLCJzZXQiLCJwdXNoIiwiY29udGFpbnMiLCJjb250YWluc1ZhbGlkYXRlIiwiZGVlcENsb25lVW5mcmVlemUiLCJvYmoiLCJjbG9uZUNsYXNzSW5zdGFuY2VzIiwic2VlbiIsIldlYWtNYXAiLCJzb3VyY2UiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJCdWZmZXIiLCJwcm90byIsImdldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwiaXNQbGFpbk9iamVjdCIsIkRhdGUiLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsImNsb25lZCIsImNsb25lIiwibCIsImdldFRpbWUiLCJmbGFncyIsImVudHJpZXMiLCJ2YWx1ZXMiLCJzbGljZSIsImJ1ZmZlciIsImZyb20iLCJQcm9taXNlIiwiV2Vha1NldCIsImNyZWF0ZSIsIlJlZmxlY3QiLCJvd25LZXlzIiwiZGVzY3JpcHRvcnMiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVzY3JpcHRvciIsIk51bWJlcktleXdvcmRzIiwibWluaW11bSIsImluc3RhbmNlIiwibWluIiwiZXhjbHVzaXZlTWluaW11bSIsIm1heGltdW0iLCJtYXgiLCJleGNsdXNpdmVNYXhpbXVtIiwibXVsdGlwbGVPZiIsInF1b3RpZW50IiwiaXNGaW5pdGUiLCJlcHNpbG9uIiwiTWF0aCIsImFicyIsImFyZUNsb3NlRW5vdWdoIiwicm91bmQiLCJSRUdFWF9NRVRBX0NIQVJTIiwiaGFzUmVnZXhNZXRhIiwiUEFUVEVSTl9DQUNIRSIsImNvbXBpbGVQYXR0ZXJuTWF0Y2hlciIsInBhdHRlcm4iLCJjYWNoZWQiLCJjb21waWxlZCIsIl92YWx1ZSIsInBhdHRlcm5MZW5ndGgiLCJpbm5lciIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsIlBBVFRFUk5fS0VZX0NBQ0hFX0xJTUlUIiwiZ2V0UGF0dGVyblByb3BlcnR5RW50cmllcyIsIl9wYXR0ZXJuUHJvcGVydHlFbnRyaWVzIiwicGF0dGVyblByb3BlcnRpZXMiLCJwYXR0ZXJuS2V5cyIsImNvbXBpbGVkTWF0Y2hlciIsInNjaGVtYVByb3AiLCJnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzIiwiY2FjaGUiLCJfcGF0dGVybktleU1hdGNoSW5kZXhDYWNoZSIsImluZGV4ZXMiLCJzaXplIiwiZ2V0QnJhbmNoRW50cmllcyIsImNhY2hlS2V5Iiwia2luZCIsImtleXdvcmRzIiwicmVxdWlyZWQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJwcm9wZXJ0aWVzIiwicHJvcEtleXMiLCJfcHJvcEtleXMiLCJyZXF1aXJlZFNldCIsIl9yZXF1aXJlZFNldCIsImRlZmF1bHQiLCJ2YWx1ZVNjaGVtYSIsIm1heFByb3BlcnRpZXMiLCJjb3VudCIsIm1pblByb3BlcnRpZXMiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImFwVmFsaWRhdGUiLCJfYXBWYWxpZGF0ZSIsInBhdHRlcm5FbnRyaWVzIiwibWF0Y2hpbmdJbmRleGVzIiwicHJvcGVydHlOYW1lcyIsInBuIiwiZGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeSIsInRoZW4iLCJlbHNlIiwiZGVmaW5pdGlvbnMiLCIkaWQiLCIkc2NoZW1hIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIiRjb21tZW50IiwiZXhhbXBsZXMiLCJjb250ZW50TWVkaWFUeXBlIiwiY29udGVudEVuY29kaW5nIiwiZGlzY3JpbWluYXRvciIsIm51bGxhYmxlIiwibWluTGVuZ3RoIiwibWF4TGVuZ3RoIiwicGF0dGVybk1hdGNoIiwiX3BhdHRlcm5NYXRjaCIsInBhdHRlcm5NYXRjaENhY2hlIiwiX3BhdHRlcm5NYXRjaENhY2hlIiwiaXNNYXRjaCIsImZvcm1hdCIsImZvcm1hdFZhbGlkYXRlIiwiX2Zvcm1hdFZhbGlkYXRlIiwiZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkIiwiX2Zvcm1hdFJlc3VsdENhY2hlRW5hYmxlZCIsImZvcm1hdFJlc3VsdENhY2hlIiwiX2Zvcm1hdFJlc3VsdENhY2hlIiwiZ2V0Rm9ybWF0IiwiaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yIiwiaXNWYWxpZCIsImVudW0iLCJlbnVtQ2FjaGUiLCJfZW51bUNhY2hlIiwicHJpbWl0aXZlU2V0Iiwib2JqZWN0VmFsdWVzIiwibGlzdCIsImVudW1JdGVtIiwiYWxsT2YiLCJicmFuY2hlcyIsIm9ubHlCcmFuY2giLCJicmFuY2giLCJhbnlPZiIsIm9uZU9mIiwidmFsaWRDb3VudCIsImNvbnN0IiwiaWYiLCJub3QiLCIkcmVmIiwiX3Jlc29sdmVkUmVmIiwicmVmUGF0aCIsInRhcmdldFNjaGVtYSIsImdldFNjaGVtYVJlZiIsImdldFNjaGVtYUJ5SWQiLCJ0eXBlcyIsImZvcm1hdHMiLCJpbW11dGFibGUiLCJyb290U2NoZW1hIiwiaWRSZWdpc3RyeSIsInR5cGUiLCJ2YWxpZGF0b3IiLCJhZGRUeXBlIiwiYWRkS2V5d29yZCIsImFkZEZvcm1hdCIsIm92ZXJ3cml0ZSIsImdldFR5cGUiLCJnZXRLZXl3b3JkIiwicGF0aCIsInJvb3QiLCJwYXJ0cyIsInNwbGl0IiwicGFydCIsImRlY29kZVVSSUNvbXBvbmVudCIsInJlcGxhY2UiLCJkZWZzIiwicmVzb2x2ZVBhdGgiLCJpZCIsImNvbXBpbGUiLCJjbGVhciIsImNvbXBpbGVkU2NoZW1hIiwiY29tcGlsZVNjaGVtYSIsIl9oYXNSZWYiLCJsaW5rUmVmZXJlbmNlcyIsImlzU2NoZW1hTGlrZSIsImNsb25lZERhdGEiLCJyZXMiLCJ2YWxpZCIsImlzVHJpdmlhbEFsd2F5c1ZhbGlkU3Vic2NoZW1hIiwic2hhbGxvd0FycmF5RXF1YWxzIiwiZmxhdHRlbkFzc29jaWF0aXZlQnJhbmNoZXMiLCJvdXQiLCJuZXN0ZWQiLCJmbGF0dGVuU2luZ2xlV3JhcHBlck9uZU9mIiwibm9ybWFsaXplU2NoZW1hRm9yQ29tcGlsZSIsIm5vcm1hbGl6ZWQiLCJzY2hlbWFLZXlzIiwiaGFzT25seUtleSIsInNldE5vcm1hbGl6ZWQiLCJmbGF0dGVuZWRBbGxPZiIsImZpbHRlciIsImZsYXR0ZW5lZEFueU9mIiwiZmxhdHRlbmVkT25lT2YiLCJtYXJrU2NoZW1hSGFzUmVmIiwic2hvdWxkU2tpcEtleXdvcmQiLCJoYXNSZXF1aXJlZERlZmF1bHRzIiwiaXNEZWZhdWx0VHlwZVZhbGlkYXRvciIsInNjaGVtYUhhc1JlZiIsInJlZlZhbGlkYXRvciIsInZhbGlkYXRvcnMiLCJhY3RpdmVOYW1lcyIsImRlZmluZVR5cGVFcnJvciIsIm1hcCIsInQiLCJ0cmltIiwidHlwZUZ1bmN0aW9ucyIsInR5cGVOYW1lcyIsImRlZmF1bHRUeXBlTmFtZXMiLCJjb21iaW5lZFR5cGVWYWxpZGF0b3IiLCJhbGxUeXBlc0RlZmF1bHQiLCJ0eXBlTWV0aG9kTmFtZSIsInNpbmdsZVR5cGVOYW1lIiwiaXNJbnRlZ2VyIiwic2luZ2xlVHlwZUZuIiwiYWxsb3dzT2JqZWN0IiwiYWxsb3dzQXJyYXkiLCJhbGxvd3NTdHJpbmciLCJhbGxvd3NOdW1iZXIiLCJhbGxvd3NJbnRlZ2VyIiwiYWxsb3dzQm9vbGVhbiIsImFsbG93c051bGwiLCJkYXRhVHlwZSIsIm90aGVyS2V5cyIsImtleU9yZGVyIiwia2V5d29yZEZuIiwiZm5OYW1lIiwibGl0ZXJhbEtleXdvcmRzIiwiY29tcGlsZWRTdWJTY2hlbWEiLCJzdWJLZXkiLCJ2IiwiY29tcG9zaXRlTmFtZSIsIm1hc3RlclZhbGlkYXRvciIsInN0YWNrIiwibm9kZSIsInBvcCIsInRhcmdldCIsIl9kYXRhIl0sInNvdXJjZXMiOlsiLi4vbGliL3V0aWxzL21haW4tdXRpbHMudHMiLCIuLi9saWIvZm9ybWF0cy50cyIsIi4uL2xpYi90eXBlcy50cyIsIi4uL2xpYi91dGlscy9oYXMtY2hhbmdlZC50cyIsIi4uL2xpYi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkcy50cyIsIi4uL2xpYi91dGlscy9kZWVwLWZyZWV6ZS50cyIsIi4uL2xpYi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHMudHMiLCIuLi9saWIvdXRpbHMvcGF0dGVybi1tYXRjaGVyLnRzIiwiLi4vbGliL2tleXdvcmRzL29iamVjdC1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9zdHJpbmcta2V5d29yZHMudHMiLCIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuaW50ZXJmYWNlIEVycm9yVHJlZSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAga2V5d29yZDogc3RyaW5nO1xuICBpdGVtPzogc3RyaW5nIHwgbnVtYmVyO1xuICBzY2hlbWFQYXRoOiBzdHJpbmc7XG4gIGluc3RhbmNlUGF0aDogc3RyaW5nO1xuICBkYXRhPzogYW55O1xuICBjYXVzZT86IEVycm9yVHJlZTtcbn1cblxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBpdGVtPzogc3RyaW5nIHwgbnVtYmVyO1xuICBrZXl3b3JkOiBzdHJpbmc7XG4gIGNhdXNlPzogVmFsaWRhdGlvbkVycm9yO1xuICBzY2hlbWFQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBpbnN0YW5jZVBhdGg6IHN0cmluZyA9IFwiXCI7XG4gIGRhdGE/OiBhbnk7XG4gIHNjaGVtYT86IENvbXBpbGVkU2NoZW1hO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIsIGluc3RhbmNlUG9pbnRlciA9IFwiI1wiKTogVmFsaWRhdGlvbkVycm9yIHtcbiAgICBsZXQgc2NoZW1hUGF0aCA9IGAke3BvaW50ZXJ9LyR7dGhpcy5rZXl3b3JkfWA7XG4gICAgbGV0IGluc3RhbmNlUGF0aCA9IGAke2luc3RhbmNlUG9pbnRlcn1gO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB0aGlzLml0ZW0gPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgdGhpcy5zY2hlbWEgJiZcbiAgICAgICAgdHlwZW9mIHRoaXMuc2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHRoaXMuaXRlbSBpbiB0aGlzLnNjaGVtYVxuICAgICAgKSB7XG4gICAgICAgIHNjaGVtYVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgICAgfVxuICAgICAgaW5zdGFuY2VQYXRoICs9IGAvJHt0aGlzLml0ZW19YDtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RhbmNlUGF0aCA9IGluc3RhbmNlUGF0aDtcbiAgICB0aGlzLnNjaGVtYVBhdGggPSBzY2hlbWFQYXRoO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gY2F1c2Ugb3IgdGhlIGNhdXNlIGlzIG5vdCBhIFZhbGlkYXRpb25FcnJvciwgcmV0dXJuIHRoaXNcbiAgICBpZiAoIXRoaXMuY2F1c2UgfHwgISh0aGlzLmNhdXNlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2F1c2UuX2dldENhdXNlKHNjaGVtYVBhdGgsIGluc3RhbmNlUGF0aCk7XG4gIH1cblxuICBnZXRDYXVzZSgpOiBWYWxpZGF0aW9uRXJyb3Ige1xuICAgIHJldHVybiB0aGlzLl9nZXRDYXVzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VHJlZSgpOiBFcnJvclRyZWUge1xuICAgIGNvbnN0IHRyZWU6IEVycm9yVHJlZSA9IHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIGtleXdvcmQ6IHRoaXMua2V5d29yZCxcbiAgICAgIGl0ZW06IHRoaXMuaXRlbSxcbiAgICAgIHNjaGVtYVBhdGg6IHRoaXMuc2NoZW1hUGF0aCxcbiAgICAgIGluc3RhbmNlUGF0aDogdGhpcy5pbnN0YW5jZVBhdGgsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY2F1c2UpIHtcbiAgICAgIHRyZWUuY2F1c2UgPSB0aGlzLmNhdXNlLl9nZXRUcmVlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyZWU7XG4gIH1cblxuICBnZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgdGhpcy5nZXRDYXVzZSgpO1xuICAgIHJldHVybiB0aGlzLl9nZXRUcmVlKCk7XG4gIH1cblxuICBnZXRQYXRoKCkge1xuICAgIGNvbnN0IGNhdXNlID0gdGhpcy5nZXRDYXVzZSgpO1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWFQYXRoOiBjYXVzZS5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiBjYXVzZS5pbnN0YW5jZVBhdGhcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JPcHRpb25zIHtcbiAgaXRlbT86IGFueTsgLy8gRmluYWwgaXRlbSBpbiB0aGUgc2NoZW1hUGF0aFxuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvciB8IHRydWU7IC8vIENhdXNlIG9mIHRoZSBlcnJvclxuICBkYXRhPzogYW55OyAvLyBEYXRhIHRoYXQgY2F1c2VkIHRoZSBlcnJvclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmluZUVycm9yRnVuY3Rpb24ge1xuICAoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBEZWZpbmVFcnJvck9wdGlvbnNcbiAgKTogVmFsaWRhdGlvbkVycm9yIHwgdm9pZCB8IHRydWU7XG59XG5cbmNvbnN0IEZBSUxfRkFTVF9ERUZJTkVfRVJST1I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAoKSA9PiB0cnVlO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXG4gIGtleTogc3RyaW5nLFxuICBzY2hlbWE6IENvbXBpbGVkU2NoZW1hLFxuICBmYWlsRmFzdDogYm9vbGVhblxuKSB7XG4gIGlmIChmYWlsRmFzdCkge1xuICAgIHJldHVybiBGQUlMX0ZBU1RfREVGSU5FX0VSUk9SO1xuICB9XG5cbiAgY29uc3QgS2V5d29yZEVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCAke2tleX1gKTtcbiAgS2V5d29yZEVycm9yLmtleXdvcmQgPSBrZXk7XG4gIEtleXdvcmRFcnJvci5zY2hlbWEgPSBzY2hlbWE7XG5cbiAgY29uc3QgZGVmaW5lRXJyb3I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAobWVzc2FnZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgS2V5d29yZEVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIEtleXdvcmRFcnJvci5pdGVtID0gb3B0aW9ucy5pdGVtO1xuICAgIEtleXdvcmRFcnJvci5jYXVzZSA9XG4gICAgICBvcHRpb25zLmNhdXNlICYmIG9wdGlvbnMuY2F1c2UgIT09IHRydWUgPyBvcHRpb25zLmNhdXNlIDogdW5kZWZpbmVkO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVURjE2TGVuZ3RoKHN0cikge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZW5ndGgrKztcbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21waWxlZFNjaGVtYShzdWJTY2hlbWE6IGFueSk6IHN1YlNjaGVtYSBpcyBDb21waWxlZFNjaGVtYSB7XG4gIHJldHVybiAoXG4gICAgISFzdWJTY2hlbWEgJiZcbiAgICB0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgIUFycmF5LmlzQXJyYXkoc3ViU2NoZW1hKSAmJlxuICAgIFwiJHZhbGlkYXRlXCIgaW4gc3ViU2NoZW1hXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZEZ1bmN0aW9uPFQ+KG5hbWU6IHN0cmluZywgZm46IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgXCJuYW1lXCIsIHsgdmFsdWU6IG5hbWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGF0aChyb290OiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gIGlmICghcGF0aCB8fCBwYXRoID09PSBcIiNcIikge1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLy8gSlNPTiBQb2ludGVyXG4gIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIjL1wiKSkge1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMSk7XG4gICAgbGV0IGN1cnJlbnQgPSByb290O1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCBkZWNvZGVkVXJpUGFydCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0KTtcbiAgICAgIGNvbnN0IGtleSA9IGRlY29kZWRVcmlQYXJ0LnJlcGxhY2UoL34xL2csIFwiL1wiKS5yZXBsYWNlKC9+MC9nLCBcIn5cIik7XG5cbiAgICAgIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSBcIm9iamVjdFwiICYmIGtleSBpbiBjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLy8gU2ltcGxlIGxvb2t1cCBieSBkZWZpbml0aW9uIG5hbWUgKG5vbi1zdGFuZGFyZCwgYnV0IHVzZWZ1bClcbiAgaWYgKCFwYXRoLmluY2x1ZGVzKFwiI1wiKSkge1xuICAgIGlmIChyb290LmRlZmluaXRpb25zICYmIHJvb3QuZGVmaW5pdGlvbnNbcGF0aF0pIHtcbiAgICAgIHJldHVybiByb290LmRlZmluaXRpb25zW3BhdGhdO1xuICAgIH1cbiAgICBpZiAocm9vdC5kZWZzICYmIHJvb3QuZGVmc1twYXRoXSkge1xuICAgICAgcmV0dXJuIHJvb3QuZGVmc1twYXRoXTtcbiAgICB9XG5cbiAgICBpZiAocm9vdC4kaWQgJiYgdHlwZW9mIHJvb3QuJGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAocm9vdC4kaWQgPT09IHBhdGggfHwgcm9vdC4kaWQuZW5kc1dpdGgoXCIvXCIgKyBwYXRoKSkge1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVDbG9zZUVub3VnaChhOiBudW1iZXIsIGI6IG51bWJlciwgZXBzaWxvbiA9IDFlLTE1KTogYm9vbGVhbiB7XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gZXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG4iLCJpbXBvcnQgeyBGb3JtYXRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5cbi8vIFJlZ2V4IGhlbHBlcnNcbmNvbnN0IFVVSURfUkVHRVggPVxuICAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaTtcbi8vIElTTyA4NjAxIER1cmF0aW9uIChQM1k2TTREVDEySDMwTTVTKVxuY29uc3QgRFVSQVRJT05fUkVHRVggPVxuICAvXlAoPyEkKSgoXFxkK1kpPyhcXGQrTSk/KFxcZCtXKT8oXFxkK0QpPykoVCg/PVxcZCkoXFxkK0gpPyhcXGQrTSk/KFxcZCtTKT8pPyQvO1xuY29uc3QgVVJJX1JFR0VYID0gL15bYS16QS1aXVthLXpBLVowLTkrXFwtLl0qOlteXFxzXSokLztcbmNvbnN0IEVNQUlMX1JFR0VYID1cbiAgL14oPyFcXC4pKD8hLipcXC4kKVthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIwfSg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIxfSl7MCwyfUBbYS16MC05XSg/OlthLXowLTktXXswLDYxfVthLXowLTldKT8oPzpcXC5bYS16MC05XSg/OlthLXowLTktXXswLDYwfVthLXowLTldKT8pezAsM30kL2k7XG5jb25zdCBIT1NUTkFNRV9SRUdFWCA9XG4gIC9eW2EtejAtOV1bYS16MC05LV17MCw2Mn0oPzpcXC5bYS16MC05XVthLXowLTktXXswLDYyfSkqW2EtejAtOV0kL2k7XG5jb25zdCBEQVRFX1JFR0VYID0gL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvO1xuY29uc3QgVElNRV9SRUdFWCA9XG4gIC9eKFswMV1cXGR8MlswLTNdKTooWzAtNV1cXGQpOihbMC01XVxcZCkoXFwuXFxkKyk/KFp8KFsrLV0pKFswMV1cXGR8MlswLTNdKTooWzAtNV1cXGQpKSQvO1xuY29uc3QgVVJJX1JFRkVSRU5DRV9SRUdFWCA9XG4gIC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIygoPyFbXiNdKlxcXFwpW14jXSopKT8vaTtcbmNvbnN0IElSSV9SRUdFWCA9IC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC87XG5jb25zdCBJUklfUkVGRVJFTkNFX1JFR0VYID1cbiAgL14oKFteOi8/I10rKTopPyhcXC9cXC8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKCg/IVteI10qXFxcXClbXiNdKikpPy9pO1xuY29uc3QgSUROX0VNQUlMX1JFR0VYID0gL15bXkBcXHNdK0BbXkBcXHNdK1xcLlteQFxcc10rJC87XG5jb25zdCBJRE5fSE9TVE5BTUVfUkVHRVggPSAvXlteXFxzIUAjJCVeJiooKV8rXFw9XFxbXFxde307JzpcIlxcXFx8LDw+XFwvP10rJC87XG5cbmNvbnN0IERBWVNfSU5fTU9OVEggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5cbmZ1bmN0aW9uIGlzRGlnaXRDaGFyQ29kZShjb2RlOiBudW1iZXIpIHtcbiAgcmV0dXJuIGNvZGUgPj0gNDggJiYgY29kZSA8PSA1Nztcbn1cblxuZnVuY3Rpb24gcGFyc2VUd29EaWdpdHMoZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IGZpcnN0ID0gZGF0YS5jaGFyQ29kZUF0KGluZGV4KSAtIDQ4O1xuICBjb25zdCBzZWNvbmQgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtIDQ4O1xuXG4gIGlmIChmaXJzdCA8IDAgfHwgZmlyc3QgPiA5IHx8IHNlY29uZCA8IDAgfHwgc2Vjb25kID4gOSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiBmaXJzdCAqIDEwICsgc2Vjb25kO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZvdXJEaWdpdHMoZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IGEgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXgpIC0gNDg7XG4gIGNvbnN0IGIgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtIDQ4O1xuICBjb25zdCBjID0gZGF0YS5jaGFyQ29kZUF0KGluZGV4ICsgMikgLSA0ODtcbiAgY29uc3QgZCA9IGRhdGEuY2hhckNvZGVBdChpbmRleCArIDMpIC0gNDg7XG5cbiAgaWYgKFxuICAgIGEgPCAwIHx8XG4gICAgYSA+IDkgfHxcbiAgICBiIDwgMCB8fFxuICAgIGIgPiA5IHx8XG4gICAgYyA8IDAgfHxcbiAgICBjID4gOSB8fFxuICAgIGQgPCAwIHx8XG4gICAgZCA+IDlcbiAgKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcmV0dXJuIGEgKiAxMDAwICsgYiAqIDEwMCArIGMgKiAxMCArIGQ7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRJcHY0UmFuZ2UoZGF0YTogc3RyaW5nLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICBsZXQgc2VnbWVudENvdW50ID0gMDtcbiAgbGV0IHNlZ21lbnRTdGFydCA9IHN0YXJ0O1xuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgIGlmIChpICE9PSBlbmQgJiYgZGF0YS5jaGFyQ29kZUF0KGkpICE9PSA0Nikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudExlbmd0aCA9IGkgLSBzZWdtZW50U3RhcnQ7XG4gICAgaWYgKHNlZ21lbnRMZW5ndGggPCAxIHx8IHNlZ21lbnRMZW5ndGggPiAzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNlZ21lbnRMZW5ndGggPiAxICYmIGRhdGEuY2hhckNvZGVBdChzZWdtZW50U3RhcnQpID09PSA0OCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgZm9yIChsZXQgaiA9IHNlZ21lbnRTdGFydDsgaiA8IGk7IGorKykge1xuICAgICAgY29uc3QgZGlnaXQgPSBkYXRhLmNoYXJDb2RlQXQoaikgLSA0ODtcbiAgICAgIGlmIChkaWdpdCA8IDAgfHwgZGlnaXQgPiA5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgZGlnaXQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID4gMjU1KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VnbWVudENvdW50Kys7XG4gICAgc2VnbWVudFN0YXJ0ID0gaSArIDE7XG4gIH1cblxuICByZXR1cm4gc2VnbWVudENvdW50ID09PSA0O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSXB2NChkYXRhOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzVmFsaWRJcHY0UmFuZ2UoZGF0YSwgMCwgZGF0YS5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpc0hleENoYXJDb2RlKGNvZGU6IG51bWJlcikge1xuICByZXR1cm4gKFxuICAgIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHx8XG4gICAgKGNvZGUgPj0gNjUgJiYgY29kZSA8PSA3MCkgfHxcbiAgICAoY29kZSA+PSA5NyAmJiBjb2RlIDw9IDEwMilcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZElwdjYoZGF0YTogc3RyaW5nKSB7XG4gIGNvbnN0IGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0NvbG9uID0gZmFsc2U7XG4gIGxldCBoYXNEb3VibGVDb2xvbiA9IGZhbHNlO1xuICBsZXQgaGV4dGV0Q291bnQgPSAwO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpID09PSA1OCkge1xuICAgICAgaGFzQ29sb24gPSB0cnVlO1xuXG4gICAgICBpZiAoaSArIDEgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGkgKyAxKSA9PT0gNTgpIHtcbiAgICAgICAgaWYgKGhhc0RvdWJsZUNvbG9uKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFzRG91YmxlQ29sb24gPSB0cnVlO1xuICAgICAgICBpICs9IDI7XG5cbiAgICAgICAgaWYgKGkgPT09IGxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50U3RhcnQgPSBpO1xuICAgIGxldCBzZWdtZW50TGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGlzSGV4Q2hhckNvZGUoZGF0YS5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgc2VnbWVudExlbmd0aCsrO1xuICAgICAgaWYgKHNlZ21lbnRMZW5ndGggPiA0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50TGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGkgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGkpID09PSA0Nikge1xuICAgICAgaWYgKCFoYXNDb2xvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNWYWxpZElwdjRSYW5nZShkYXRhLCBzZWdtZW50U3RhcnQsIGxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzRG91YmxlQ29sb24pIHtcbiAgICAgICAgcmV0dXJuIGhleHRldENvdW50IDwgNjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhleHRldENvdW50ID09PSA2O1xuICAgIH1cblxuICAgIGhleHRldENvdW50Kys7XG4gICAgaWYgKGhleHRldENvdW50ID4gOCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoaSkgIT09IDU4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzQ29sb24gPSB0cnVlO1xuICAgIGkrKztcblxuICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpID09PSA1OCkge1xuICAgICAgaWYgKGhhc0RvdWJsZUNvbG9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaGFzRG91YmxlQ29sb24gPSB0cnVlO1xuICAgICAgaSsrO1xuXG4gICAgICBpZiAoaSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaGFzQ29sb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaGFzRG91YmxlQ29sb24pIHtcbiAgICByZXR1cm4gaGV4dGV0Q291bnQgPCA4O1xuICB9XG5cbiAgcmV0dXJuIGhleHRldENvdW50ID09PSA4O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSnNvblBvaW50ZXIoZGF0YTogc3RyaW5nKSB7XG4gIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZGF0YS5jaGFyQ29kZUF0KDApICE9PSA0Nykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoaSkgIT09IDEyNikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IGRhdGEuY2hhckNvZGVBdChpICsgMSk7XG4gICAgaWYgKG5leHQgIT09IDQ4ICYmIG5leHQgIT09IDQ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRSZWxhdGl2ZUpzb25Qb2ludGVyKGRhdGE6IHN0cmluZykge1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkge1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpKys7XG4gIH1cblxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpID09PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChpKSA9PT0gMzUpIHtcbiAgICByZXR1cm4gaSArIDEgPT09IGRhdGEubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChpKSAhPT0gNDcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGkgPSBpICsgMTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpICE9PSAxMjYpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBkYXRhLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgIGlmIChuZXh0ICE9PSA0OCAmJiBuZXh0ICE9PSA0OSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkVXJpVGVtcGxhdGUoZGF0YTogc3RyaW5nKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoY29kZSA9PT0gMTI1KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgIT09IDEyMykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2xvc2VJbmRleCA9IGRhdGEuaW5kZXhPZihcIn1cIiwgaSArIDEpO1xuICAgIGlmIChjbG9zZUluZGV4ID09PSAtMSB8fCBjbG9zZUluZGV4ID09PSBpICsgMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGkgPSBjbG9zZUluZGV4O1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtYXRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgW1wiZGF0ZS10aW1lXCJdKGRhdGEpIHtcbiAgICBjb25zdCBsZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgMTkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBkYXRhLmNoYXJDb2RlQXQoNCkgIT09IDQ1IHx8XG4gICAgICBkYXRhLmNoYXJDb2RlQXQoNykgIT09IDQ1IHx8XG4gICAgICBkYXRhLmNoYXJDb2RlQXQoMTMpICE9PSA1OCB8fFxuICAgICAgZGF0YS5jaGFyQ29kZUF0KDE2KSAhPT0gNThcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0Q29kZSA9IGRhdGEuY2hhckNvZGVBdCgxMCk7XG4gICAgaWYgKHRDb2RlICE9PSA4NCAmJiB0Q29kZSAhPT0gMTE2KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgeWVhciA9IHBhcnNlRm91ckRpZ2l0cyhkYXRhLCAwKTtcbiAgICBjb25zdCBtb250aCA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDUpO1xuICAgIGNvbnN0IGRheSA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDgpO1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZVR3b0RpZ2l0cyhkYXRhLCAxMSk7XG4gICAgY29uc3QgbWludXRlID0gcGFyc2VUd29EaWdpdHMoZGF0YSwgMTQpO1xuICAgIGNvbnN0IHNlY29uZCA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDE3KTtcblxuICAgIGlmIChcbiAgICAgIHllYXIgPCAwIHx8XG4gICAgICBtb250aCA8IDAgfHxcbiAgICAgIGRheSA8IDAgfHxcbiAgICAgIGhvdXIgPCAwIHx8XG4gICAgICBtaW51dGUgPCAwIHx8XG4gICAgICBzZWNvbmQgPCAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGhvdXIgPiAyMyB8fCBtaW51dGUgPiA1OSB8fCBzZWNvbmQgPiA2MCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBjdXJzb3IgPSAxOTtcbiAgICBsZXQgb2Zmc2V0U2lnbjogXCIrXCIgfCBcIi1cIiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBvZmZzZXRIb3VyID0gMDtcbiAgICBsZXQgb2Zmc2V0TWludXRlID0gMDtcblxuICAgIGlmIChjdXJzb3IgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGN1cnNvcikgPT09IDQ2KSB7XG4gICAgICBjdXJzb3IrKztcbiAgICAgIGNvbnN0IGZyYWNTdGFydCA9IGN1cnNvcjtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBsZW5ndGggJiYgaXNEaWdpdENoYXJDb2RlKGRhdGEuY2hhckNvZGVBdChjdXJzb3IpKSkge1xuICAgICAgICBjdXJzb3IrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnNvciA9PT0gZnJhY1N0YXJ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3Vyc29yIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCB0ekNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoY3Vyc29yKTtcblxuICAgICAgaWYgKHR6Q29kZSA9PT0gOTAgfHwgdHpDb2RlID09PSAxMjIpIHtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9IGVsc2UgaWYgKHR6Q29kZSA9PT0gNDMgfHwgdHpDb2RlID09PSA0NSkge1xuICAgICAgICBvZmZzZXRTaWduID0gdHpDb2RlID09PSA0MyA/IFwiK1wiIDogXCItXCI7XG5cbiAgICAgICAgaWYgKGN1cnNvciArIDYgPiBsZW5ndGggfHwgZGF0YS5jaGFyQ29kZUF0KGN1cnNvciArIDMpICE9PSA1OCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9mZnNldEhvdXIgPSBwYXJzZVR3b0RpZ2l0cyhkYXRhLCBjdXJzb3IgKyAxKTtcbiAgICAgICAgb2Zmc2V0TWludXRlID0gcGFyc2VUd29EaWdpdHMoZGF0YSwgY3Vyc29yICsgNCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9mZnNldEhvdXIgPCAwIHx8XG4gICAgICAgICAgb2Zmc2V0TWludXRlIDwgMCB8fFxuICAgICAgICAgIG9mZnNldEhvdXIgPiAyMyB8fFxuICAgICAgICAgIG9mZnNldE1pbnV0ZSA+IDU5XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnNvciArPSA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJzb3IgIT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE1lcyAx4oCTMTJcbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRMOtYSA+PSAxXG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIGlmICghbWF4RGF5cyB8fCBkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNlY29uZCA9PT0gNjApIHtcbiAgICAgIGxldCB1dGNUb3RhbE1pbnV0ZXMgPSBob3VyICogNjAgKyBtaW51dGU7XG5cbiAgICAgIGlmIChvZmZzZXRTaWduKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IG9mZnNldEhvdXIgKiA2MCArIG9mZnNldE1pbnV0ZTtcbiAgICAgICAgdXRjVG90YWxNaW51dGVzICs9XG4gICAgICAgICAgb2Zmc2V0U2lnbiA9PT0gXCIrXCIgPyAtb2Zmc2V0VG90YWxNaW51dGVzIDogb2Zmc2V0VG90YWxNaW51dGVzO1xuICAgICAgICB1dGNUb3RhbE1pbnV0ZXMgJT0gMjQgKiA2MDtcbiAgICAgICAgaWYgKHV0Y1RvdGFsTWludXRlcyA8IDApIHtcbiAgICAgICAgICB1dGNUb3RhbE1pbnV0ZXMgKz0gMjQgKiA2MDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodXRjVG90YWxNaW51dGVzICE9PSAyMyAqIDYwICsgNTkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICB1cmkoZGF0YSkge1xuICAgIHJldHVybiBVUklfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZW1haWwoZGF0YSkge1xuICAgIHJldHVybiBFTUFJTF9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuICBpcHY0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNWYWxpZElwdjQoZGF0YSk7XG4gIH0sXG5cbiAgaXB2NihkYXRhKSB7XG4gICAgcmV0dXJuIGlzVmFsaWRJcHY2KGRhdGEpO1xuICB9LFxuXG4gIGhvc3RuYW1lKGRhdGEpIHtcbiAgICByZXR1cm4gSE9TVE5BTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBEQVRFX1JFR0VYLmV4ZWMoZGF0YSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHJdID0gbWF0Y2g7XG4gICAgY29uc3QgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBjb25zdCBtb250aCA9IE51bWJlcihtb250aFN0cik7XG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGRheVN0cik7XG5cbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIHJldHVybiAhIW1heERheXMgJiYgZGF5IDw9IG1heERheXM7XG4gIH0sXG4gIHJlZ2V4KGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChkYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFwianNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIHJldHVybiBpc1ZhbGlkSnNvblBvaW50ZXIoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIHJldHVybiBpc1ZhbGlkUmVsYXRpdmVKc29uUG9pbnRlcihkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIFRJTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgXCJ1cmktcmVmZXJlbmNlXCIoZGF0YSkge1xuICAgIGlmIChkYXRhLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBVUklfUkVGRVJFTkNFX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgXCJ1cmktdGVtcGxhdGVcIihkYXRhKSB7XG4gICAgcmV0dXJuIGlzVmFsaWRVcmlUZW1wbGF0ZShkYXRhKTtcbiAgfSxcblxuICBkdXJhdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIERVUkFUSU9OX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgdXVpZChkYXRhKSB7XG4gICAgcmV0dXJuIFVVSURfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICAvLyBJUkkgaXMgbGlrZSBVUkkgYnV0IGFsbG93cyBVbmljb2RlLiBXZSByZXVzZSBhIHBlcm1pc3NpdmUgbG9naWMuXG4gIGlyaShkYXRhKSB7XG4gICAgcmV0dXJuIElSSV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuXG4gIFwiaXJpLXJlZmVyZW5jZVwiKGRhdGEpIHtcbiAgICBpZiAoZGF0YS5pbmNsdWRlcyhcIlxcXFxcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIElSSV9SRUZFUkVOQ0VfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICAvLyBCZXN0LWVmZm9ydCBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24gZm9yIElETiAobm8gcHVueWNvZGUvdGFibGVzKVxuICBcImlkbi1lbWFpbFwiKGRhdGEpIHtcbiAgICByZXR1cm4gSUROX0VNQUlMX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgXCJpZG4taG9zdG5hbWVcIihkYXRhKSB7XG4gICAgLy8gQWxsb3dzIHVuaWNvZGUsIGZvcmJpZHMgc3BhY2VzIGFuZCB0eXBpY2FsIGludmFsaWQgVVJMIGNoYXJzXG4gICAgcmV0dXJuIElETl9IT1NUTkFNRV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgVHlwZUZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIG9iamVjdChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVpbnQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1aW50MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVpbnQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxufTtcbiIsIi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgZGVwZW5kZW5jaWVzIGhhdmUgY2hhbmdlZCByZWN1cnNpdmVseVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvY29nbml0aXZlLWNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBoYXNDaGFuZ2VkKHByZXY6IGFueSwgY3VycmVudDogYW55KSB7XG4gIGlmIChPYmplY3QuaXMocHJldiwgY3VycmVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwcmV2KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYubGVuZ3RoICE9PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2ldLCBjdXJyZW50W2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZXYgPT09IFwib2JqZWN0XCIgJiYgcHJldiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIiB8fCBjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjdXJyZW50KSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJldikge1xuICAgICAgaWYgKGtleSBpbiBjdXJyZW50KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2tleV0sIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBoYXNDaGFuZ2VkIH0gZnJvbSBcIi4uL3V0aWxzL2hhcy1jaGFuZ2VkXCI7XG5cbmZ1bmN0aW9uIGlzVW5pcXVlUHJpbWl0aXZlKHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0QXJyYXlCdWNrZXRLZXkodmFsdWU6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiMFwiO1xuICB9XG5cbiAgY29uc3QgZmlyc3QgPSB2YWx1ZVswXTtcbiAgY29uc3QgbGFzdCA9IHZhbHVlW2xlbmd0aCAtIDFdO1xuICBjb25zdCBmaXJzdFR5cGUgPSBmaXJzdCA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGZpcnN0O1xuICBjb25zdCBsYXN0VHlwZSA9IGxhc3QgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBsYXN0O1xuXG4gIGxldCBmaXJzdEFycmF5TWFya2VyID0gXCJcIjtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmlyc3QpKSB7XG4gICAgY29uc3QgZmlyc3RTaWduYXR1cmUgPSBnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZShmaXJzdCk7XG4gICAgZmlyc3RBcnJheU1hcmtlciA9IGZpcnN0U2lnbmF0dXJlID09PSBudWxsID8gYGE6JHtmaXJzdC5sZW5ndGh9YCA6IGZpcnN0U2lnbmF0dXJlO1xuICB9XG5cbiAgbGV0IGxhc3RBcnJheU1hcmtlciA9IFwiXCI7XG4gIGlmIChBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgY29uc3QgbGFzdFNpZ25hdHVyZSA9IGdldFByaW1pdGl2ZUFycmF5U2lnbmF0dXJlKGxhc3QpO1xuICAgIGxhc3RBcnJheU1hcmtlciA9IGxhc3RTaWduYXR1cmUgPT09IG51bGwgPyBgYToke2xhc3QubGVuZ3RofWAgOiBsYXN0U2lnbmF0dXJlO1xuICB9XG5cbiAgcmV0dXJuIGAke2xlbmd0aH06JHtmaXJzdFR5cGV9OiR7Zmlyc3RBcnJheU1hcmtlcn06JHtsYXN0VHlwZX06JHtsYXN0QXJyYXlNYXJrZXJ9YDtcbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0U2hhcGVLZXkodmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKTtcbiAgcmV0dXJuIGAke2tleXMubGVuZ3RofToke2tleXMuam9pbihcIlxcdTAwMDFcIil9YDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpbWl0aXZlQXJyYXlTaWduYXR1cmUodmFsdWU6IGFueVtdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiYTowXCI7XG4gIH1cblxuICBpZiAoIWlzVW5pcXVlUHJpbWl0aXZlKHZhbHVlWzBdKSB8fCAhaXNVbmlxdWVQcmltaXRpdmUodmFsdWVbbGVuZ3RoIC0gMV0pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgc2lnbmF0dXJlID0gYGE6JHtsZW5ndGh9OmA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZVtpXTtcblxuICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICBzaWduYXR1cmUgKz0gXCJsO1wiO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzaWduYXR1cmUgKz0gYHMke2l0ZW0ubGVuZ3RofToke2l0ZW19O2A7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oaXRlbSkpIHtcbiAgICAgICAgc2lnbmF0dXJlICs9IFwibjpOYU47XCI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmlzKGl0ZW0sIC0wKSkge1xuICAgICAgICBzaWduYXR1cmUgKz0gXCJuOi0wO1wiO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc2lnbmF0dXJlICs9IGBuOiR7aXRlbX07YDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHNpZ25hdHVyZSArPSBpdGVtID8gXCJiOjE7XCIgOiBcImI6MDtcIjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHNpZ25hdHVyZTtcbn1cblxuZXhwb3J0IGNvbnN0IEFycmF5S2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIC8vIGxpYi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkcy50c1xuICBpdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hSXRlbXMgPSBzY2hlbWEuaXRlbXM7XG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWFJdGVtcyA9PT0gZmFsc2UgJiYgZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFJdGVtcykpIHtcbiAgICAgIGNvbnN0IHNjaGVtYUl0ZW1zTGVuZ3RoID0gc2NoZW1hSXRlbXMubGVuZ3RoO1xuICAgICAgY29uc3QgaXRlbXNMZW5ndGggPVxuICAgICAgICBzY2hlbWFJdGVtc0xlbmd0aCA8IGRhdGFMZW5ndGggPyBzY2hlbWFJdGVtc0xlbmd0aCA6IGRhdGFMZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzY2hlbWFJdGVtID0gc2NoZW1hSXRlbXNbaV07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChzY2hlbWFJdGVtID09PSBmYWxzZSAmJiBkYXRhW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IHNjaGVtYUl0ZW0gJiYgc2NoZW1hSXRlbS4kdmFsaWRhdGU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGUgPSBzY2hlbWFJdGVtcyAmJiBzY2hlbWFJdGVtcy4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBlbGVtZW50cyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHNTY2hlbWEgPSBzY2hlbWEuZWxlbWVudHM7XG4gICAgY29uc3QgdmFsaWRhdGUgPSBlbGVtZW50c1NjaGVtYSAmJiBlbGVtZW50c1NjaGVtYS4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWluSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluSXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gc2hvcnRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heEl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXMgdG9vIGxvbmdcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxJdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdHVwbGVMZW5ndGggPSAoc2NoZW1hIGFzIGFueSkuX3R1cGxlSXRlbXNMZW5ndGggYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0dXBsZUxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0dXBsZUxlbmd0aCA9IHNjaGVtYS5pdGVtcy5sZW5ndGg7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl90dXBsZUl0ZW1zTGVuZ3RoXCIsIHtcbiAgICAgICAgdmFsdWU6IHR1cGxlTGVuZ3RoLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPD0gdHVwbGVMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEuYWRkaXRpb25hbEl0ZW1zICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcylcbiAgICApIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0dXBsZUxlbmd0aDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHVuaXF1ZUl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIXNjaGVtYS51bmlxdWVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsZW4gPD0gOCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YVtpXTtcblxuICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBsZW47IGorKykge1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YVtqXTtcblxuICAgICAgICAgIGlmIChsZWZ0ID09PSByaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiByaWdodCB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgbGVmdCA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHJpZ2h0ID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgICBOdW1iZXIuaXNOYU4obGVmdCkgJiZcbiAgICAgICAgICAgIE51bWJlci5pc05hTihyaWdodClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogcmlnaHQgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbGVmdCAmJlxuICAgICAgICAgICAgcmlnaHQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBsZWZ0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgcmlnaHQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICFoYXNDaGFuZ2VkKGxlZnQsIHJpZ2h0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiByaWdodCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW1pdGl2ZVNlZW4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICBsZXQgcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYXJyYXlCdWNrZXRzOiBNYXA8c3RyaW5nLCBhbnlbXT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IG9iamVjdEJ1Y2tldHM6IE1hcDxzdHJpbmcsIGFueVtdPiB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW2ldO1xuXG4gICAgICBpZiAoaXNVbmlxdWVQcmltaXRpdmUoaXRlbSkpIHtcbiAgICAgICAgaWYgKHByaW1pdGl2ZVNlZW4uaGFzKGl0ZW0pKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiBpdGVtIH0pO1xuICAgICAgICB9XG4gICAgICAgIHByaW1pdGl2ZVNlZW4uYWRkKGl0ZW0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZShpdGVtKTtcbiAgICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICghcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzKSB7XG4gICAgICAgICAgICBwcmltaXRpdmVBcnJheVNpZ25hdHVyZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzLmhhcyhzaWduYXR1cmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzLmFkZChzaWduYXR1cmUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhcnJheUJ1Y2tldHMpIHtcbiAgICAgICAgICBhcnJheUJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWNrZXRLZXkgPSBnZXRBcnJheUJ1Y2tldEtleShpdGVtKTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBhcnJheUJ1Y2tldHMuZ2V0KGJ1Y2tldEtleSk7XG5cbiAgICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgY2FuZGlkYXRlcyA9IFtdO1xuICAgICAgICAgIGFycmF5QnVja2V0cy5zZXQoYnVja2V0S2V5LCBjYW5kaWRhdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICghaGFzQ2hhbmdlZChjYW5kaWRhdGVzW2pdLCBpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiBpdGVtIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaChpdGVtKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghb2JqZWN0QnVja2V0cykge1xuICAgICAgICBvYmplY3RCdWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidWNrZXRLZXkgPSBnZXRPYmplY3RTaGFwZUtleShpdGVtKTtcbiAgICAgIGxldCBjYW5kaWRhdGVzID0gb2JqZWN0QnVja2V0cy5nZXQoYnVja2V0S2V5KTtcblxuICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMgPSBbXTtcbiAgICAgICAgb2JqZWN0QnVja2V0cy5zZXQoYnVja2V0S2V5LCBjYW5kaWRhdGVzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYW5kaWRhdGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChjYW5kaWRhdGVzW2pdLCBpdGVtKSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogaXRlbSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYW5kaWRhdGVzLnB1c2goaXRlbSk7XG4gICAgfVxuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbnNWYWxpZGF0ZSA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGNvbnRhaW5zVmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJleHBvcnQgZnVuY3Rpb24gZGVlcEZyZWV6ZShcbiAgb2JqOiBhbnksXG4gIGZyZWV6ZUNsYXNzSW5zdGFuY2VzOiBib29sZWFuID0gZmFsc2UsXG4gIHNlZW4gPSBuZXcgV2Vha1NldCgpXG4pOiBhbnkge1xuICBpZiAoXG4gICAgb2JqID09PSBudWxsIHx8XG4gICAgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fFxuICAgIHNlZW4uaGFzKG9iaikgfHxcbiAgICBPYmplY3QuaXNGcm96ZW4ob2JqKVxuICApIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgc2Vlbi5hZGQob2JqKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBkZWVwRnJlZXplKG9ialtpXSwgZnJlZXplQ2xhc3NJbnN0YW5jZXMsIHNlZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9wcyA9IFJlZmxlY3Qub3duS2V5cyhvYmopO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcHJvcHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBkZWVwRnJlZXplKG9ialtwcm9wc1tpXV0sIGZyZWV6ZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgKG5vdCBhIHBsYWluIG9iamVjdCBvciBhcnJheSkgd2UgbmVlZCB0byBmcmVlemUgdGhlIHByb3RvdHlwZVxuICAgIGlmIChmcmVlemVDbGFzc0luc3RhbmNlcykge1xuICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgICAgIGlmIChwcm90byAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBkZWVwRnJlZXplKHByb3RvLCBmcmVlemVDbGFzc0luc3RhbmNlcywgc2Vlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmZyZWV6ZShvYmopO1xuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgeyBpc1BsYWluT2JqZWN0IH07XG5cbmZ1bmN0aW9uIGNhblVzZVN0cnVjdHVyZWRDbG9uZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc3RydWN0dXJlZENsb25lICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcbiAgICBpc1BsYWluT2JqZWN0KHZhbHVlKSB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIFNldCB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmVVbmZyZWV6ZTxUPihcbiAgb2JqOiBULFxuICBjbG9uZUNsYXNzSW5zdGFuY2VzID0gZmFsc2UsXG4gIHNlZW4gPSBuZXcgV2Vha01hcCgpXG4pOiBUIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgfHwgb2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gb2JqIGFzIGFueTtcblxuICBpZiAoc2Vlbi5oYXMoc291cmNlKSkge1xuICAgIHJldHVybiBzZWVuLmdldChzb3VyY2UpO1xuICB9XG5cbiAgaWYgKGNhblVzZVN0cnVjdHVyZWRDbG9uZShzb3VyY2UpKSB7XG4gICAgY29uc3QgY2xvbmVkID0gc3RydWN0dXJlZENsb25lKHNvdXJjZSk7XG4gICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZWQpO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cblxuICBsZXQgY2xvbmU6IGFueTtcblxuICBzd2l0Y2ggKHRydWUpIHtcbiAgICBjYXNlIEFycmF5LmlzQXJyYXkoc291cmNlKToge1xuICAgICAgY2xvbmUgPSBbXTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNsb25lW2ldID0gZGVlcENsb25lVW5mcmVlemUoc291cmNlW2ldLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY2FzZSBzb3VyY2UgaW5zdGFuY2VvZiBEYXRlOiB7XG4gICAgICBjbG9uZSA9IG5ldyBEYXRlKHNvdXJjZS5nZXRUaW1lKCkpO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgUmVnRXhwOiB7XG4gICAgICBjbG9uZSA9IG5ldyBSZWdFeHAoc291cmNlLnNvdXJjZSwgc291cmNlLmZsYWdzKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIE1hcDoge1xuICAgICAgY2xvbmUgPSBuZXcgTWFwKCk7XG4gICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgY2xvbmUuc2V0KFxuICAgICAgICAgIGRlZXBDbG9uZVVuZnJlZXplKGtleSwgY2xvbmVDbGFzc0luc3RhbmNlcywgc2VlbiksXG4gICAgICAgICAgZGVlcENsb25lVW5mcmVlemUodmFsdWUsIGNsb25lQ2xhc3NJbnN0YW5jZXMsIHNlZW4pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgU2V0OiB7XG4gICAgICBjbG9uZSA9IG5ldyBTZXQoKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UudmFsdWVzKCkpIHtcbiAgICAgICAgY2xvbmUuYWRkKGRlZXBDbG9uZVVuZnJlZXplKHZhbHVlLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI6IHtcbiAgICAgIGNsb25lID0gc291cmNlLnNsaWNlKDApO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIFR5cGVkQXJyYXlzIGFuZCBEYXRhVmlld1xuICAgIGNhc2UgQXJyYXlCdWZmZXIuaXNWaWV3KHNvdXJjZSk6IHtcbiAgICAgIGNsb25lID0gbmV3IHNvdXJjZS5jb25zdHJ1Y3Rvcihzb3VyY2UuYnVmZmVyLnNsaWNlKDApKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICAvLyBOb2RlLmpzIEJ1ZmZlclxuICAgIGNhc2UgdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzb3VyY2UgaW5zdGFuY2VvZiBCdWZmZXI6IHtcbiAgICAgIGNsb25lID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIEVycm9yOiB7XG4gICAgICBjbG9uZSA9IG5ldyBzb3VyY2UuY29uc3RydWN0b3Ioc291cmNlLm1lc3NhZ2UpO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm9uIGNsb25hYmxlIG9iamVjdHNcbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIFByb21pc2UgfHxcbiAgICAgIHNvdXJjZSBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICAgIHNvdXJjZSBpbnN0YW5jZW9mIFdlYWtTZXQ6IHtcbiAgICAgIGNsb25lID0gc291cmNlO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIEluc3RhbmNlIG9mIGEgY2xhc3NcbiAgICBjYXNlIHNvdXJjZS5jb25zdHJ1Y3RvciAmJiBzb3VyY2UuY29uc3RydWN0b3IgIT09IE9iamVjdDoge1xuICAgICAgaWYgKCFjbG9uZUNsYXNzSW5zdGFuY2VzKSB7XG4gICAgICAgIGNsb25lID0gc291cmNlO1xuICAgICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgfVxuICAgICAgY2xvbmUgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGxhaW4gb2JqZWN0c1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNsb25lID0ge307XG4gICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcblxuICAgICAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhzb3VyY2UpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBjbG9uZVtrZXkgYXMgc3RyaW5nXSA9IGRlZXBDbG9uZVVuZnJlZXplKFxuICAgICAgICAgIHNvdXJjZVtrZXkgYXMgc3RyaW5nXSxcbiAgICAgICAgICBjbG9uZUNsYXNzSW5zdGFuY2VzLFxuICAgICAgICAgIHNlZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhkZXNjcmlwdG9ycykpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNba2V5IGFzIHN0cmluZ107XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLnZhbHVlID0gZGVlcENsb25lVW5mcmVlemUoXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWUsXG4gICAgICAgIGNsb25lQ2xhc3NJbnN0YW5jZXMsXG4gICAgICAgIHNlZW5cbiAgICAgICk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9uZSwga2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxuXG4gIHJldHVybiBjbG9uZTtcbn1cbiIsImltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgYXJlQ2xvc2VFbm91Z2ggfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE51bWJlcktleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1pbiA9IHNjaGVtYS5taW5pbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1pbiA9IHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICsgMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWluICs9IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhIDwgbWluKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1heCA9IHNjaGVtYS5tYXhpbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1heCA9IHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtIC0gMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWF4IC09IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhID4gbWF4KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtdWx0aXBsZU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVvdGllbnQgPSBkYXRhIC8gc2NoZW1hLm11bHRpcGxlT2Y7XG5cbiAgICBpZiAoIWlzRmluaXRlKHF1b3RpZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghYXJlQ2xvc2VFbm91Z2gocXVvdGllbnQsIE1hdGgucm91bmQocXVvdGllbnQpKSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIG11bHRpcGxlT2ZcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtaW5pbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPD0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBleGNsdXNpdmVNaW5pbXVtXCIpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtYXhpbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPj0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcbiAgICAgICAgXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1heGltdW1cIixcbiAgICAgICAgeyBkYXRhIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG59O1xuIiwiY29uc3QgUkVHRVhfTUVUQV9DSEFSUyA9IC9bXFxcXC5eJCorPygpW1xcXXt9fF0vO1xuXG5mdW5jdGlvbiBoYXNSZWdleE1ldGEodmFsdWU6IHN0cmluZykge1xuICByZXR1cm4gUkVHRVhfTUVUQV9DSEFSUy50ZXN0KHZhbHVlKTtcbn1cblxuY29uc3QgUEFUVEVSTl9DQUNIRSA9IG5ldyBNYXA8c3RyaW5nLCBDb21waWxlZFBhdHRlcm5NYXRjaGVyPigpO1xuXG5leHBvcnQgdHlwZSBDb21waWxlZFBhdHRlcm5NYXRjaGVyID0gUmVnRXhwIHwgKCh2YWx1ZTogc3RyaW5nKSA9PiBib29sZWFuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVQYXR0ZXJuTWF0Y2hlcihwYXR0ZXJuOiBzdHJpbmcpOiBDb21waWxlZFBhdHRlcm5NYXRjaGVyIHtcbiAgY29uc3QgY2FjaGVkID0gUEFUVEVSTl9DQUNIRS5nZXQocGF0dGVybik7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgbGV0IGNvbXBpbGVkOiBDb21waWxlZFBhdHRlcm5NYXRjaGVyO1xuXG4gIGlmIChwYXR0ZXJuLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbXBpbGVkID0gKF92YWx1ZTogc3RyaW5nKSA9PiB0cnVlO1xuICB9IGVsc2UgaWYgKCFoYXNSZWdleE1ldGEocGF0dGVybikpIHtcbiAgICBjb21waWxlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5pbmNsdWRlcyhwYXR0ZXJuKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7XG5cbiAgICBpZiAocGF0dGVybkxlbmd0aCA+PSAyICYmIHBhdHRlcm5bMF0gPT09IFwiXlwiICYmIHBhdHRlcm5bcGF0dGVybkxlbmd0aCAtIDFdID09PSBcIiRcIikge1xuICAgICAgY29uc3QgaW5uZXIgPSBwYXR0ZXJuLnNsaWNlKDEsIC0xKTtcbiAgICAgIGlmICghaGFzUmVnZXhNZXRhKGlubmVyKSkge1xuICAgICAgICBpZiAoaW5uZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29tcGlsZWQgPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUubGVuZ3RoID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlID09PSBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGlsZWQgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIFwidVwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhdHRlcm5bMF0gPT09IFwiXlwiKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHBhdHRlcm4uc2xpY2UoMSk7XG4gICAgICBpZiAoIWhhc1JlZ2V4TWV0YShpbm5lcikpIHtcbiAgICAgICAgaWYgKGlubmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbXBpbGVkID0gKF92YWx1ZTogc3RyaW5nKSA9PiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlLnN0YXJ0c1dpdGgoaW5uZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21waWxlZCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGF0dGVybltwYXR0ZXJuTGVuZ3RoIC0gMV0gPT09IFwiJFwiKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHBhdHRlcm4uc2xpY2UoMCwgLTEpO1xuICAgICAgaWYgKCFoYXNSZWdleE1ldGEoaW5uZXIpKSB7XG4gICAgICAgIGlmIChpbm5lci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb21waWxlZCA9IChfdmFsdWU6IHN0cmluZykgPT4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21waWxlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5lbmRzV2l0aChpbm5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVkID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBpbGVkID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgfVxuICB9XG5cbiAgUEFUVEVSTl9DQUNIRS5zZXQocGF0dGVybiwgY29tcGlsZWQpO1xuICByZXR1cm4gY29tcGlsZWQ7XG59XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmVVbmZyZWV6ZSB9IGZyb20gXCIuLi91dGlscy9kZWVwLWZyZWV6ZVwiO1xuaW1wb3J0IHsgY29tcGlsZVBhdHRlcm5NYXRjaGVyIH0gZnJvbSBcIi4uL3V0aWxzL3BhdHRlcm4tbWF0Y2hlclwiO1xuXG5jb25zdCBQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCA9IDUxMjtcblxudHlwZSBQYXR0ZXJuUHJvcGVydHlFbnRyeSA9IHtcbiAgc2NoZW1hUHJvcDogYW55O1xuICBtYXRjaDogKGtleTogc3RyaW5nKSA9PiBib29sZWFuO1xufTtcblxuZnVuY3Rpb24gZ2V0UGF0dGVyblByb3BlcnR5RW50cmllcyhzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgbGV0IGVudHJpZXMgPSAoc2NoZW1hIGFzIGFueSkuX3BhdHRlcm5Qcm9wZXJ0eUVudHJpZXMgYXNcbiAgICB8IFBhdHRlcm5Qcm9wZXJ0eUVudHJ5W11cbiAgICB8IHVuZGVmaW5lZDtcblxuICBpZiAoZW50cmllcykge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgaWYgKFxuICAgICFzY2hlbWEucGF0dGVyblByb3BlcnRpZXMgfHxcbiAgICB0eXBlb2Ygc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzICE9PSBcIm9iamVjdFwiIHx8XG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwYXR0ZXJuS2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7XG4gIGVudHJpZXMgPSBuZXcgQXJyYXkocGF0dGVybktleXMubGVuZ3RoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5LZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcGF0dGVybktleXNbaV07XG4gICAgY29uc3QgY29tcGlsZWRNYXRjaGVyID0gY29tcGlsZVBhdHRlcm5NYXRjaGVyKGtleSk7XG4gICAgY29uc3QgbWF0Y2ggPVxuICAgICAgY29tcGlsZWRNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgID8gKHZhbHVlOiBzdHJpbmcpID0+IGNvbXBpbGVkTWF0Y2hlci50ZXN0KHZhbHVlKVxuICAgICAgICA6IGNvbXBpbGVkTWF0Y2hlcjtcblxuICAgIGVudHJpZXNbaV0gPSB7XG4gICAgICBzY2hlbWFQcm9wOiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNba2V5XSxcbiAgICAgIG1hdGNoXG4gICAgfTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzY2hlbWEsIFwiX3BhdHRlcm5Qcm9wZXJ0eUVudHJpZXNcIiwge1xuICAgIHZhbHVlOiBlbnRyaWVzLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzKFxuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGtleTogc3RyaW5nLFxuICBlbnRyaWVzOiBQYXR0ZXJuUHJvcGVydHlFbnRyeVtdXG4pIHtcbiAgbGV0IGNhY2hlID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuS2V5TWF0Y2hJbmRleENhY2hlIGFzXG4gICAgfCBNYXA8c3RyaW5nLCBudW1iZXJbXT5cbiAgICB8IHVuZGVmaW5lZDtcblxuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuS2V5TWF0Y2hJbmRleENhY2hlXCIsIHtcbiAgICAgIHZhbHVlOiBjYWNoZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgaW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZW50cmllc1tpXS5tYXRjaChrZXkpKSB7XG4gICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhY2hlLnNpemUgPCBQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCkge1xuICAgIGNhY2hlLnNldChrZXksIGluZGV4ZXMpO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5yZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gc2NoZW1hLnJlcXVpcmVkW2ldO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwcm9wS2V5cyA9IChzY2hlbWEgYXMgYW55KS5fcHJvcEtleXMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFwcm9wS2V5cykge1xuICAgICAgcHJvcEtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcyB8fCB7fSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wcm9wS2V5c1wiLCB7XG4gICAgICAgIHZhbHVlOiBwcm9wS2V5cyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVpcmVkU2V0ID0gKHNjaGVtYSBhcyBhbnkpLl9yZXF1aXJlZFNldCBhc1xuICAgICAgfCBTZXQ8c3RyaW5nPlxuICAgICAgfCBudWxsXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWlyZWRTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWlyZWRTZXQgPSBBcnJheS5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZClcbiAgICAgICAgPyBuZXcgU2V0PHN0cmluZz4oc2NoZW1hLnJlcXVpcmVkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9yZXF1aXJlZFNldFwiLCB7XG4gICAgICAgIHZhbHVlOiByZXF1aXJlZFNldCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcEtleXNbaV07XG4gICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XTtcblxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxdWlyZWRTZXQgJiZcbiAgICAgICAgICByZXF1aXJlZFNldC5oYXMoa2V5KSAmJlxuICAgICAgICAgIHNjaGVtYVByb3AgJiZcbiAgICAgICAgICB0eXBlb2Ygc2NoZW1hUHJvcCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYVByb3ApICYmXG4gICAgICAgICAgXCJkZWZhdWx0XCIgaW4gc2NoZW1hUHJvcFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IChzY2hlbWFQcm9wIGFzIGFueSkuJHZhbGlkYXRlKHNjaGVtYVByb3AuZGVmYXVsdCk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZWZhdWx0IHByb3BlcnR5IGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgZGF0YTogc2NoZW1hUHJvcC5kZWZhdWx0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YVtrZXldID0gZGVlcENsb25lVW5mcmVlemUoc2NoZW1hUHJvcC5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWFQcm9wID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoc2NoZW1hUHJvcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYVByb3AgJiYgXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWFQcm9wKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgdmFsdWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU2NoZW1hID0gc2NoZW1hLnZhbHVlcztcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHZhbHVlU2NoZW1hICYmIHZhbHVlU2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY291bnQrKztcbiAgICAgIGlmIChjb3VudCA+IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBtYW55IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtaW5Qcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvdW50Kys7XG4gICAgICBpZiAoY291bnQgPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBmZXcgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFwVmFsaWRhdGUgPSAoc2NoZW1hIGFzIGFueSkuX2FwVmFsaWRhdGUgYXNcbiAgICAgIHwgKChkYXRhOiBhbnkpID0+IGFueSlcbiAgICAgIHwgbnVsbFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFwVmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXBWYWxpZGF0ZSA9IGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKVxuICAgICAgICA/IHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcy4kdmFsaWRhdGVcbiAgICAgICAgOiBudWxsO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfYXBWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBhcFZhbGlkYXRlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuRW50cmllcyA9IGdldFBhdHRlcm5Qcm9wZXJ0eUVudHJpZXMoc2NoZW1hKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjaGVtYS5wcm9wZXJ0aWVzLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXR0ZXJuRW50cmllcyAmJiBwYXR0ZXJuRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGdldFBhdHRlcm5LZXlNYXRjaEluZGV4ZXMoc2NoZW1hLCBrZXksIHBhdHRlcm5FbnRyaWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwVmFsaWRhdGUpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhcFZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgcGF0dGVyblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybkVudHJpZXMgPSBnZXRQYXR0ZXJuUHJvcGVydHlFbnRyaWVzKHNjaGVtYSk7XG4gICAgaWYgKCFwYXR0ZXJuRW50cmllcyB8fCBwYXR0ZXJuRW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaGluZ0luZGV4ZXMgPSBnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzKHNjaGVtYSwga2V5LCBwYXR0ZXJuRW50cmllcyk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0luZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlICYmXG4gICAgICAgICAgIShzY2hlbWEucHJvcGVydGllcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2NoZW1hLnByb3BlcnRpZXMsIGtleSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRjaGluZ0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hUHJvcCA9IHBhdHRlcm5FbnRyaWVzW21hdGNoaW5nSW5kZXhlc1tqXV0uc2NoZW1hUHJvcDtcblxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYVByb3AgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYVByb3AgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYVByb3AuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuICBwcm9wZXJ0eU5hbWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBuID0gc2NoZW1hLnByb3BlcnR5TmFtZXM7XG5cbiAgICBpZiAodHlwZW9mIHBuID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHBuID09PSBmYWxzZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IHBuICYmIHBuLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZShrZXkpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IG5hbWUgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRlcGVuZGVuY2llcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAoa2V5IGluIGRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXBlbmRlbmN5ID0gc2NoZW1hLmRlcGVuZGVuY2llc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCEoZGVwZW5kZW5jeVtpXSBpbiBkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgZGF0YTogZGVwZW5kZW5jeVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSBpbiBkYXRhKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHsgZGF0YTogZGVwZW5kZW5jeSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gZGVwZW5kZW5jeS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgLy8gUmVxdWlyZWQgYnkgb3RoZXIga2V5d29yZHMgYnV0IG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24gaXRzZWxmXG4gIHRoZW46IGZhbHNlLFxuICBlbHNlOiBmYWxzZSxcbiAgZGVmYXVsdDogZmFsc2UsXG5cbiAgLy8gTm90IGltcGxlbWVudGVkIHlldFxuICBkZWZpbml0aW9uczogZmFsc2UsXG4gICRpZDogZmFsc2UsXG4gICRzY2hlbWE6IGZhbHNlLFxuXG4gIC8vIE1ldGFkYXRhIGtleXdvcmRzIChub3QgdXNlZCBhcyBhIGZ1bmN0aW9uKVxuICB0aXRsZTogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgJGNvbW1lbnQ6IGZhbHNlLFxuICBleGFtcGxlczogZmFsc2UsXG4gIGNvbnRlbnRNZWRpYVR5cGU6IGZhbHNlLFxuICBjb250ZW50RW5jb2Rpbmc6IGZhbHNlLFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgT3BlbiBBUEkga2V5d29yZHNcbiAgZGlzY3JpbWluYXRvcjogZmFsc2UsXG4gIG51bGxhYmxlOiBmYWxzZVxufTtcbiIsImltcG9ydCB7IGlzQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi4vdXRpbHMvbWFpbi11dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGhhc0NoYW5nZWQgfSBmcm9tIFwiLi4vdXRpbHMvaGFzLWNoYW5nZWRcIjtcblxudHlwZSBCcmFuY2hFbnRyeSA9XG4gIHwgeyBraW5kOiBcInZhbGlkYXRlXCI7IHZhbGlkYXRlOiAoZGF0YTogYW55KSA9PiBhbnkgfVxuICB8IHsga2luZDogXCJhbHdheXNWYWxpZFwiIH1cbiAgfCB7IGtpbmQ6IFwiYWx3YXlzSW52YWxpZFwiIH1cbiAgfCB7IGtpbmQ6IFwibGl0ZXJhbFwiOyB2YWx1ZTogYW55IH07XG5cbmZ1bmN0aW9uIHRvQnJhbmNoRW50cnkoaXRlbTogYW55KTogQnJhbmNoRW50cnkge1xuICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIGl0ZW0gJiYgdHlwZW9mIGl0ZW0uJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwidmFsaWRhdGVcIiwgdmFsaWRhdGU6IGl0ZW0uJHZhbGlkYXRlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsga2luZDogXCJhbHdheXNWYWxpZFwiIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHsga2luZDogaXRlbSA/IFwiYWx3YXlzVmFsaWRcIiA6IFwiYWx3YXlzSW52YWxpZFwiIH07XG4gIH1cblxuICByZXR1cm4geyBraW5kOiBcImxpdGVyYWxcIiwgdmFsdWU6IGl0ZW0gfTtcbn1cblxuZnVuY3Rpb24gZ2V0QnJhbmNoRW50cmllcyhzY2hlbWE6IGFueSwga2V5OiBcImFsbE9mXCIgfCBcImFueU9mXCIgfCBcIm9uZU9mXCIpIHtcbiAgY29uc3QgY2FjaGVLZXkgPSBgXyR7a2V5fUJyYW5jaEVudHJpZXNgO1xuICBsZXQgZW50cmllcyA9IHNjaGVtYVtjYWNoZUtleV0gYXMgQnJhbmNoRW50cnlbXSB8IHVuZGVmaW5lZDtcblxuICBpZiAoZW50cmllcykge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gc2NoZW1hW2tleV0gfHwgW107XG4gIGVudHJpZXMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIGVudHJpZXMucHVzaCh0b0JyYW5jaEVudHJ5KHNvdXJjZVtpXSkpO1xuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgY2FjaGVLZXksIHtcbiAgICB2YWx1ZTogZW50cmllcyxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcblxuICByZXR1cm4gZW50cmllcztcbn1cblxuZXhwb3J0IGNvbnN0IE90aGVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIGVudW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGxldCBlbnVtQ2FjaGUgPSAoc2NoZW1hIGFzIGFueSkuX2VudW1DYWNoZSBhc1xuICAgICAgfCB7IHByaW1pdGl2ZVNldDogU2V0PGFueT47IG9iamVjdFZhbHVlczogYW55W10gfVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWVudW1DYWNoZSkge1xuICAgICAgY29uc3QgcHJpbWl0aXZlU2V0ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgICBjb25zdCBvYmplY3RWYWx1ZXM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBsaXN0ID0gc2NoZW1hLmVudW07XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbnVtSXRlbSA9IGxpc3RbaV07XG4gICAgICAgIGlmIChlbnVtSXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgZW51bUl0ZW0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBvYmplY3RWYWx1ZXMucHVzaChlbnVtSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbWl0aXZlU2V0LmFkZChlbnVtSXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW51bUNhY2hlID0geyBwcmltaXRpdmVTZXQsIG9iamVjdFZhbHVlcyB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfZW51bUNhY2hlXCIsIHtcbiAgICAgICAgdmFsdWU6IGVudW1DYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgISh0eXBlb2YgZGF0YSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNOYU4oZGF0YSkpICYmXG4gICAgICBlbnVtQ2FjaGUucHJpbWl0aXZlU2V0LmhhcyhkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvLyBDb25zZXJ2YXRpdmUgZXhhY3Qtc2VtYW50aWNzIHBhdGguXG4gICAgICAvLyBGdXR1cmUgb3B0LWluIG9wdGltaXphdGlvbjogc3RydWN0dXJhbCBoYXNoaW5nIGJ1Y2tldHMgZm9yIGxhcmdlIGVudW1zLlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnVtQ2FjaGUub2JqZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChlbnVtQ2FjaGUub2JqZWN0VmFsdWVzW2ldLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnZXRCcmFuY2hFbnRyaWVzKHNjaGVtYSwgXCJhbGxPZlwiKTtcblxuICAgIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9ubHlCcmFuY2ggPSBicmFuY2hlc1swXTtcblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJ2YWxpZGF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gb25seUJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJhbHdheXNWYWxpZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJhbHdheXNJbnZhbGlkXCIpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IG9ubHlCcmFuY2gudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwidmFsaWRhdGVcIikge1xuICAgICAgICBjb25zdCBlcnJvciA9IGJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSAhPT0gYnJhbmNoLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGFueU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IGdldEJyYW5jaEVudHJpZXMoc2NoZW1hLCBcImFueU9mXCIpO1xuXG4gICAgaWYgKGJyYW5jaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qgb25seUJyYW5jaCA9IGJyYW5jaGVzWzBdO1xuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcInZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBvbmx5QnJhbmNoLnZhbGlkYXRlKGRhdGEpO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmx5QnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmx5QnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzSW52YWxpZFwiKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhID09PSBvbmx5QnJhbmNoLnZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSBicmFuY2hlc1tpXTtcblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcInZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBicmFuY2gudmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChicmFuY2gua2luZCA9PT0gXCJhbHdheXNWYWxpZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgPT09IGJyYW5jaC52YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnZXRCcmFuY2hFbnRyaWVzKHNjaGVtYSwgXCJvbmVPZlwiKTtcblxuICAgIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9ubHlCcmFuY2ggPSBicmFuY2hlc1swXTtcblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJ2YWxpZGF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gb25seUJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcImFsd2F5c1ZhbGlkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSA9PT0gb25seUJyYW5jaC52YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBicmFuY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYnJhbmNoID0gYnJhbmNoZXNbaV07XG4gICAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwidmFsaWRhdGVcIikge1xuICAgICAgICBpc1ZhbGlkID0gIWJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzSW52YWxpZFwiKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzVmFsaWQgPSBkYXRhID09PSBicmFuY2gudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZENvdW50ID09PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBjb25zdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKGRhdGEgPT09IHNjaGVtYS5jb25zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChkYXRhICYmXG4gICAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIHNjaGVtYS5jb25zdCAmJlxuICAgICAgICB0eXBlb2Ygc2NoZW1hLmNvbnN0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgIWhhc0NoYW5nZWQoZGF0YSwgc2NoZW1hLmNvbnN0KSkgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hLmNvbnN0KSAmJlxuICAgICAgICAhaGFzQ2hhbmdlZChkYXRhLCBzY2hlbWEuY29uc3QpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGlmKHNjaGVtYSwgZGF0YSkge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEubm90ICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hLm5vdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLm5vdClcbiAgICApIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoc2NoZW1hLm5vdCBhcyBhbnkpLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gICRyZWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoc2NoZW1hLl9yZXNvbHZlZFJlZikge1xuICAgICAgaWYgKHNjaGVtYS4kdmFsaWRhdGUgIT09IHNjaGVtYS5fcmVzb2x2ZWRSZWYpIHtcbiAgICAgICAgc2NoZW1hLiR2YWxpZGF0ZSA9IHNjaGVtYS5fcmVzb2x2ZWRSZWY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWEuX3Jlc29sdmVkUmVmKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZlBhdGggPSBzY2hlbWEuJHJlZjtcbiAgICBsZXQgdGFyZ2V0U2NoZW1hID0gaW5zdGFuY2UuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHRhcmdldFNjaGVtYSA9IGluc3RhbmNlLmdldFNjaGVtYUJ5SWQocmVmUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihgTWlzc2luZyByZWZlcmVuY2U6ICR7cmVmUGF0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlbWEuX3Jlc29sdmVkUmVmID0gdGFyZ2V0U2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBzY2hlbWEuJHZhbGlkYXRlID0gc2NoZW1hLl9yZXNvbHZlZFJlZjtcbiAgICByZXR1cm4gc2NoZW1hLl9yZXNvbHZlZFJlZihkYXRhKTtcbiAgfVxufTtcbiIsImltcG9ydCB7IEFycmF5S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IE51bWJlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvbnVtYmVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPYmplY3RLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL29iamVjdC1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT3RoZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL290aGVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBTdHJpbmdLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkc1wiO1xuXG5leHBvcnQgY29uc3Qga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgLi4uT2JqZWN0S2V5d29yZHMsXG4gIC4uLkFycmF5S2V5d29yZHMsXG4gIC4uLlN0cmluZ0tleXdvcmRzLFxuICAuLi5OdW1iZXJLZXl3b3JkcyxcbiAgLi4uT3RoZXJLZXl3b3Jkc1xufTtcbiIsImltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uLCBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGNvbXBpbGVQYXR0ZXJuTWF0Y2hlciB9IGZyb20gXCIuLi91dGlscy9wYXR0ZXJuLW1hdGNoZXJcIjtcblxuY29uc3QgUEFUVEVSTl9NQVRDSF9DQUNIRV9MSU1JVCA9IDUxMjtcbmNvbnN0IEZPUk1BVF9SRVNVTFRfQ0FDSEVfTElNSVQgPSA1MTI7XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgbWluTGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heExlbmd0aChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8IGRhdGEubGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIHBhdHRlcm4oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwYXR0ZXJuTWF0Y2ggPSAoc2NoZW1hIGFzIGFueSkuX3BhdHRlcm5NYXRjaCBhc1xuICAgICAgfCAoKHZhbHVlOiBzdHJpbmcpID0+IGJvb2xlYW4pXG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGxldCBwYXR0ZXJuTWF0Y2hDYWNoZSA9IChzY2hlbWEgYXMgYW55KS5fcGF0dGVybk1hdGNoQ2FjaGUgYXNcbiAgICAgIHwgTWFwPHN0cmluZywgYm9vbGVhbj5cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFwYXR0ZXJuTWF0Y2gpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkID0gY29tcGlsZVBhdHRlcm5NYXRjaGVyKHNjaGVtYS5wYXR0ZXJuKTtcbiAgICAgICAgcGF0dGVybk1hdGNoID1cbiAgICAgICAgICBjb21waWxlZCBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgICAgICAgPyAodmFsdWU6IHN0cmluZykgPT4gY29tcGlsZWQudGVzdCh2YWx1ZSlcbiAgICAgICAgICAgIDogY29tcGlsZWQ7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfcGF0dGVybk1hdGNoXCIsIHtcbiAgICAgICAgICB2YWx1ZTogcGF0dGVybk1hdGNoLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGF0dGVybk1hdGNoQ2FjaGUpIHtcbiAgICAgIHBhdHRlcm5NYXRjaENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuTWF0Y2hDYWNoZVwiLCB7XG4gICAgICAgIHZhbHVlOiBwYXR0ZXJuTWF0Y2hDYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuTWF0Y2hDYWNoZS5oYXMoZGF0YSkpIHtcbiAgICAgIGlmIChwYXR0ZXJuTWF0Y2hDYWNoZS5nZXQoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNNYXRjaCA9IHBhdHRlcm5NYXRjaChkYXRhKTtcbiAgICBpZiAocGF0dGVybk1hdGNoQ2FjaGUuc2l6ZSA8IFBBVFRFUk5fTUFUQ0hfQ0FDSEVfTElNSVQpIHtcbiAgICAgIHBhdHRlcm5NYXRjaENhY2hlLnNldChkYXRhLCBpc01hdGNoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBwYXR0ZXJuXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICAvLyBUYWtlIGludG8gYWNjb3VudCB0aGF0IGlmIHdlIHJlY2VpdmUgYSBmb3JtYXQgdGhhdCBpcyBub3QgZGVmaW5lZCwgd2VcbiAgLy8gd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IsIHdlIGp1c3QgaWdub3JlIGl0LlxuICBmb3JtYXQoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZm9ybWF0VmFsaWRhdGUgPSAoc2NoZW1hIGFzIGFueSkuX2Zvcm1hdFZhbGlkYXRlIGFzXG4gICAgICB8IEZvcm1hdEZ1bmN0aW9uXG4gICAgICB8IGZhbHNlXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQgYXNcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZvcm1hdFJlc3VsdENhY2hlID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRSZXN1bHRDYWNoZSBhc1xuICAgICAgfCBNYXA8c3RyaW5nLCBib29sZWFuPlxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZm9ybWF0VmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWxpZGF0ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkID0gaW5zdGFuY2UuaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yKFxuICAgICAgICBzY2hlbWEuZm9ybWF0LFxuICAgICAgICBmb3JtYXRWYWxpZGF0ZVxuICAgICAgKTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkXCIsIHtcbiAgICAgICAgdmFsdWU6IGZvcm1hdFJlc3VsdENhY2hlRW5hYmxlZCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQpIHtcbiAgICAgIGlmIChmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGlmICghZm9ybWF0UmVzdWx0Q2FjaGUpIHtcbiAgICAgIGZvcm1hdFJlc3VsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRSZXN1bHRDYWNoZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRSZXN1bHRDYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtYXRSZXN1bHRDYWNoZS5oYXMoZGF0YSkpIHtcbiAgICAgIGlmIChmb3JtYXRSZXN1bHRDYWNoZS5nZXQoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1ZhbGlkID0gZm9ybWF0VmFsaWRhdGUoZGF0YSk7XG4gICAgaWYgKGZvcm1hdFJlc3VsdENhY2hlLnNpemUgPCBGT1JNQVRfUkVTVUxUX0NBQ0hFX0xJTUlUKSB7XG4gICAgICBmb3JtYXRSZXN1bHRDYWNoZS5zZXQoZGF0YSwgaXNWYWxpZCk7XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgfVxufTtcbiIsIi8qKioqKioqKioqKioqKioqKiogUGF0aDogbGliL2luZGV4LnRzICoqKioqKioqKioqKioqKioqKi9cbmltcG9ydCB7XG4gIERlZmluZUVycm9yRnVuY3Rpb24sXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIHJlc29sdmVQYXRoXG59IGZyb20gXCIuL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgRm9ybWF0cyB9IGZyb20gXCIuL2Zvcm1hdHNcIjtcbmltcG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHNcIjtcbmltcG9ydCB7IGRlZXBDbG9uZVVuZnJlZXplIH0gZnJvbSBcIi4vdXRpbHMvZGVlcC1mcmVlemVcIjtcblxuZXhwb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4vdXRpbHMvbWFpbi11dGlsc1wiO1xuZXhwb3J0IHsgZGVlcENsb25lVW5mcmVlemUgYXMgZGVlcENsb25lIH0gZnJvbSBcIi4vdXRpbHMvZGVlcC1mcmVlemVcIjtcblxuZXhwb3J0IHR5cGUgUmVzdWx0ID0gdm9pZCB8IFZhbGlkYXRpb25FcnJvciB8IHRydWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHtcbiAgICBkYXRhOiBhbnk7XG4gICAgZXJyb3I6IFZhbGlkYXRpb25FcnJvciB8IG51bGwgfCB0cnVlO1xuICAgIHZhbGlkOiBib29sZWFuO1xuICB9O1xuICBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWE7XG59XG5cbmludGVyZmFjZSBWYWxpZGF0b3JJdGVtIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWxpZGF0ZTogVmFsaWRhdGVGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYVNoaWVsZCB7XG4gIHByaXZhdGUgdHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGltbXV0YWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIHJvb3RTY2hlbWE6IENvbXBpbGVkU2NoZW1hIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaWRSZWdpc3RyeTogTWFwPHN0cmluZywgQ29tcGlsZWRTY2hlbWE+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZhaWxGYXN0OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW1tdXRhYmxlID0gZmFsc2UsXG4gICAgZmFpbEZhc3QgPSB0cnVlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIGZhaWxGYXN0PzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5mYWlsRmFzdCA9IGZhaWxGYXN0O1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhUeXBlcykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRUeXBlKHR5cGUsIHZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhrZXl3b3JkcykpIHtcbiAgICAgIHRoaXMuYWRkS2V5d29yZChrZXl3b3JkLCB2YWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmb3JtYXQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoRm9ybWF0cykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtYXQoZm9ybWF0LCB2YWxpZGF0b3IgYXMgRm9ybWF0RnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFR5cGUobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IFR5cGVGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy50eXBlc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBUeXBlIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMudHlwZXNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRUeXBlKHR5cGU6IHN0cmluZyk6IFR5cGVGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy50eXBlc1t0eXBlXTtcbiAgfVxuXG4gIGFkZEZvcm1hdChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogRm9ybWF0RnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0c1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBGb3JtYXQgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtYXRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0Rm9ybWF0KGZvcm1hdDogc3RyaW5nKTogRm9ybWF0RnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yKGZvcm1hdDogc3RyaW5nLCB2YWxpZGF0b3I6IEZvcm1hdEZ1bmN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChGb3JtYXRzIGFzIFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+KVtmb3JtYXRdID09PSB2YWxpZGF0b3I7XG4gIH1cblxuICBhZGRLZXl3b3JkKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBLZXl3b3JkRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMua2V5d29yZHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgS2V5d29yZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLmtleXdvcmRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0S2V5d29yZChrZXl3b3JkOiBzdHJpbmcpOiBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMua2V5d29yZHNba2V5d29yZF07XG4gIH1cblxuICBnZXRTY2hlbWFSZWYocGF0aDogc3RyaW5nKTogQ29tcGlsZWRTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290U2NoZW1hKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlUGF0aCh0aGlzLnJvb3RTY2hlbWEsIHBhdGgpO1xuICB9XG5cbiAgZ2V0U2NoZW1hQnlJZChpZDogc3RyaW5nKTogQ29tcGlsZWRTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmlkUmVnaXN0cnkuZ2V0KGlkKTtcbiAgfVxuXG4gIGNvbXBpbGUoc2NoZW1hOiBhbnkpOiBWYWxpZGF0b3Ige1xuICAgIHRoaXMuaWRSZWdpc3RyeS5jbGVhcigpO1xuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYSk7XG4gICAgdGhpcy5yb290U2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG4gICAgaWYgKChjb21waWxlZFNjaGVtYSBhcyBhbnkpLl9oYXNSZWYgPT09IHRydWUpIHtcbiAgICAgIHRoaXMubGlua1JlZmVyZW5jZXMoY29tcGlsZWRTY2hlbWEpO1xuICAgIH1cblxuICAgIGlmICghY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwib25lT2ZcIixcbiAgICAgICAgICBjb21waWxlZFNjaGVtYSxcbiAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICk7XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBcIlZhbGlkYXRlX0ZhbHNlXCIsXG4gICAgICAgICAgKGRhdGEpID0+IGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChzY2hlbWEgPT09IHRydWUpIHtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBcIlZhbGlkYXRlX0FueVwiLFxuICAgICAgICAgICgpID0+IHt9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNTY2hlbWFMaWtlKHNjaGVtYSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJJbnZhbGlkIHNjaGVtYVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9BbnlcIixcbiAgICAgICAgICAoKSA9PiB7fVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJvb3RTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgICAgY29uc3QgY2xvbmVkRGF0YSA9IHRoaXMuaW1tdXRhYmxlID8gZGVlcENsb25lVW5mcmVlemUoZGF0YSkgOiBkYXRhO1xuICAgICAgY29uc3QgcmVzID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlIShjbG9uZWREYXRhKTtcblxuICAgICAgaWYgKHJlcykge1xuICAgICAgICByZXR1cm4geyBkYXRhOiBjbG9uZWREYXRhLCBlcnJvcjogcmVzLCB2YWxpZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGF0YTogY2xvbmVkRGF0YSwgZXJyb3I6IG51bGwsIHZhbGlkOiB0cnVlIH07XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmNvbXBpbGVkU2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG4gICAgcmV0dXJuIHZhbGlkYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlID09PSB0cnVlIHx8XG4gICAgICAodGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNoYWxsb3dBcnJheUVxdWFscyhhOiBhbnlbXSwgYjogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuQXNzb2NpYXRpdmVCcmFuY2hlcyhcbiAgICBrZXk6IFwiYWxsT2ZcIiB8IFwiYW55T2ZcIixcbiAgICBicmFuY2hlczogYW55W11cbiAgKTogYW55W10ge1xuICAgIGNvbnN0IG91dDogYW55W10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBicmFuY2hlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGl0ZW1ba2V5XSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLmZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzKGtleSwgaXRlbVtrZXldKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXN0ZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBvdXQucHVzaChuZXN0ZWRbal0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZihicmFuY2hlczogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IGN1cnJlbnQgPSBicmFuY2hlcztcblxuICAgIHdoaWxlIChjdXJyZW50Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgaXRlbSA9IGN1cnJlbnRbMF07XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChpdGVtKSAmJlxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShpdGVtLm9uZU9mKVxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnQgPSBpdGVtLm9uZU9mO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTY2hlbWFGb3JDb21waWxlKHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGxldCBub3JtYWxpemVkID0gc2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYUtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEpO1xuICAgIGNvbnN0IGhhc09ubHlLZXkgPSAoa2V5OiBzdHJpbmcpID0+XG4gICAgICBzY2hlbWFLZXlzLmxlbmd0aCA9PT0gMSAmJiBzY2hlbWFLZXlzWzBdID09PSBrZXk7XG5cbiAgICBjb25zdCBzZXROb3JtYWxpemVkID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAobm9ybWFsaXplZCA9PT0gc2NoZW1hKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQgPSB7IC4uLnNjaGVtYSB9O1xuICAgICAgfVxuICAgICAgbm9ybWFsaXplZFtrZXldID0gdmFsdWU7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5hbGxPZikpIHtcbiAgICAgIGNvbnN0IGZsYXR0ZW5lZEFsbE9mID0gdGhpcy5mbGF0dGVuQXNzb2NpYXRpdmVCcmFuY2hlcyhcbiAgICAgICAgXCJhbGxPZlwiLFxuICAgICAgICBzY2hlbWEuYWxsT2ZcbiAgICAgICkuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAhKFxuICAgICAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMFxuICAgICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaGFzT25seUtleShcImFsbE9mXCIpICYmXG4gICAgICAgIGZsYXR0ZW5lZEFsbE9mLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICB0aGlzLmlzUGxhaW5PYmplY3QoZmxhdHRlbmVkQWxsT2ZbMF0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5lZEFsbE9mWzBdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2hhbGxvd0FycmF5RXF1YWxzKGZsYXR0ZW5lZEFsbE9mLCBzY2hlbWEuYWxsT2YpKSB7XG4gICAgICAgIHNldE5vcm1hbGl6ZWQoXCJhbGxPZlwiLCBmbGF0dGVuZWRBbGxPZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkQW55T2YgPSB0aGlzLmZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzKFxuICAgICAgICBcImFueU9mXCIsXG4gICAgICAgIHNjaGVtYS5hbnlPZlxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBoYXNPbmx5S2V5KFwiYW55T2ZcIikgJiZcbiAgICAgICAgZmxhdHRlbmVkQW55T2YubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChmbGF0dGVuZWRBbnlPZlswXSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmxhdHRlbmVkQW55T2ZbMF07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zaGFsbG93QXJyYXlFcXVhbHMoZmxhdHRlbmVkQW55T2YsIHNjaGVtYS5hbnlPZikpIHtcbiAgICAgICAgc2V0Tm9ybWFsaXplZChcImFueU9mXCIsIGZsYXR0ZW5lZEFueU9mKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEub25lT2YpKSB7XG4gICAgICBjb25zdCBmbGF0dGVuZWRPbmVPZiA9IHRoaXMuZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZihzY2hlbWEub25lT2YpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGhhc09ubHlLZXkoXCJvbmVPZlwiKSAmJlxuICAgICAgICBmbGF0dGVuZWRPbmVPZi5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGZsYXR0ZW5lZE9uZU9mWzBdKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuZWRPbmVPZlswXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnNoYWxsb3dBcnJheUVxdWFscyhmbGF0dGVuZWRPbmVPZiwgc2NoZW1hLm9uZU9mKSkge1xuICAgICAgICBzZXROb3JtYWxpemVkKFwib25lT2ZcIiwgZmxhdHRlbmVkT25lT2YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrU2NoZW1hSGFzUmVmKHNjaGVtYTogQ29tcGlsZWRTY2hlbWEpIHtcbiAgICBpZiAoKHNjaGVtYSBhcyBhbnkpLl9oYXNSZWYgPT09IHRydWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9oYXNSZWZcIiwge1xuICAgICAgdmFsdWU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkU2tpcEtleXdvcmQoc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlID0gc2NoZW1hW2tleV07XG5cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSBcInJlcXVpcmVkXCI6XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XG4gICAgICBjYXNlIFwidW5pcXVlSXRlbXNcIjpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTtcbiAgICAgIGNhc2UgXCJwcm9wZXJ0aWVzXCI6XG4gICAgICBjYXNlIFwicGF0dGVyblByb3BlcnRpZXNcIjpcbiAgICAgIGNhc2UgXCJkZXBlbmRlbmNpZXNcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInByb3BlcnR5TmFtZXNcIjpcbiAgICAgIGNhc2UgXCJpdGVtc1wiOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWU7XG4gICAgICBjYXNlIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjpcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlID09PSBmYWxzZSAmJlxuICAgICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKS5sZW5ndGggPiAwXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiYWRkaXRpb25hbEl0ZW1zXCI6XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCAhQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpO1xuICAgICAgY2FzZSBcImFsbE9mXCI6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFueU9mXCI6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1JlcXVpcmVkRGVmYXVsdHMoc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzO1xuICAgIGlmICghdGhpcy5pc1BsYWluT2JqZWN0KHByb3BlcnRpZXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViU2NoZW1hID0gcHJvcGVydGllc1trZXlzW2ldXTtcbiAgICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qoc3ViU2NoZW1hKSAmJiBcImRlZmF1bHRcIiBpbiBzdWJTY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RlZmF1bHRUeXBlVmFsaWRhdG9yKHR5cGU6IHN0cmluZywgdmFsaWRhdG9yOiBUeXBlRnVuY3Rpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFR5cGVzIGFzIFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPilbdHlwZV0gPT09IHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSB0cnVlKSB7XG4gICAgICAgIHNjaGVtYSA9IHsgYW55T2Y6IFt7fV0gfTsgLy8gQWx3YXlzIHZhbGlkXG4gICAgICB9IGVsc2UgaWYgKHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2NoZW1hID0geyBvbmVPZjogW10gfTsgLy8gQWx3YXlzIGludmFsaWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVtYSA9IHsgb25lT2Y6IFtzY2hlbWFdIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZW1hID0gdGhpcy5ub3JtYWxpemVTY2hlbWFGb3JDb21waWxlKHNjaGVtYSk7XG5cbiAgICBjb25zdCBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWEgPSBkZWVwQ2xvbmVVbmZyZWV6ZShcbiAgICAgIHNjaGVtYVxuICAgICkgYXMgQ29tcGlsZWRTY2hlbWE7XG5cbiAgICBsZXQgc2NoZW1hSGFzUmVmID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHNjaGVtYS4kaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuaWRSZWdpc3RyeS5zZXQoc2NoZW1hLiRpZCwgY29tcGlsZWRTY2hlbWEpO1xuICAgIH1cblxuICAgIGlmIChcIiRyZWZcIiBpbiBzY2hlbWEpIHtcbiAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICBjb25zdCByZWZWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoXCIkcmVmXCIpO1xuICAgICAgaWYgKHJlZlZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwiJHJlZlwiLFxuICAgICAgICAgIHNjaGVtYVtcIiRyZWZcIl0sXG4gICAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIixcbiAgICAgICAgICAoZGF0YSkgPT5cbiAgICAgICAgICAgIChyZWZWYWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgY29tcGlsZWRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGRlZmluZUVycm9yLFxuICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFya1NjaGVtYUhhc1JlZihjb21waWxlZFNjaGVtYSk7XG4gICAgICByZXR1cm4gY29tcGlsZWRTY2hlbWE7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9ySXRlbVtdID0gW107XG4gICAgY29uc3QgYWN0aXZlTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoXCJ0eXBlXCIgaW4gc2NoZW1hKSB7XG4gICAgICBjb25zdCBkZWZpbmVUeXBlRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGVzID0gQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSlcbiAgICAgICAgPyBzY2hlbWEudHlwZVxuICAgICAgICA6IHNjaGVtYS50eXBlLnNwbGl0KFwiLFwiKS5tYXAoKHQ6IHN0cmluZykgPT4gdC50cmltKCkpO1xuXG4gICAgICBjb25zdCB0eXBlRnVuY3Rpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuICAgICAgY29uc3QgdHlwZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZGVmYXVsdFR5cGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBhbGxUeXBlc0RlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZUZ1bmN0aW9ucy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgICAgdHlwZU5hbWVzLnB1c2godmFsaWRhdG9yLm5hbWUpO1xuICAgICAgICAgIGlmICh0aGlzLmlzRGVmYXVsdFR5cGVWYWxpZGF0b3IodHlwZSwgdmFsaWRhdG9yKSkge1xuICAgICAgICAgICAgZGVmYXVsdFR5cGVOYW1lcy5wdXNoKHR5cGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGxUeXBlc0RlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwidHlwZVwiLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICkoXCJJbnZhbGlkIHR5cGUgZm9yIHNjaGVtYVwiLCB7IGRhdGE6IHNjaGVtYS50eXBlIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgY29tYmluZWRUeXBlVmFsaWRhdG9yOiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICAgICAgbGV0IHR5cGVNZXRob2ROYW1lID0gXCJcIjtcblxuICAgICAgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID09PSAxICYmIGFsbFR5cGVzRGVmYXVsdCkge1xuICAgICAgICBjb25zdCBzaW5nbGVUeXBlTmFtZSA9IGRlZmF1bHRUeXBlTmFtZXNbMF07XG4gICAgICAgIHR5cGVNZXRob2ROYW1lID0gc2luZ2xlVHlwZU5hbWU7XG5cbiAgICAgICAgc3dpdGNoIChzaW5nbGVUeXBlTmFtZSkge1xuICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcihkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghc2luZ2xlVHlwZUZuKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID4gMSAmJiBhbGxUeXBlc0RlZmF1bHQpIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSBkZWZhdWx0VHlwZU5hbWVzLmpvaW4oXCJfT1JfXCIpO1xuXG4gICAgICAgIGNvbnN0IGFsbG93c09iamVjdCA9IGRlZmF1bHRUeXBlTmFtZXMuaW5jbHVkZXMoXCJvYmplY3RcIik7XG4gICAgICAgIGNvbnN0IGFsbG93c0FycmF5ID0gZGVmYXVsdFR5cGVOYW1lcy5pbmNsdWRlcyhcImFycmF5XCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NTdHJpbmcgPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwic3RyaW5nXCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NOdW1iZXIgPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwibnVtYmVyXCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NJbnRlZ2VyID0gZGVmYXVsdFR5cGVOYW1lcy5pbmNsdWRlcyhcImludGVnZXJcIik7XG4gICAgICAgIGNvbnN0IGFsbG93c0Jvb2xlYW4gPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwiYm9vbGVhblwiKTtcbiAgICAgICAgY29uc3QgYWxsb3dzTnVsbCA9IGRlZmF1bHRUeXBlTmFtZXMuaW5jbHVkZXMoXCJudWxsXCIpO1xuXG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB0eXBlb2YgZGF0YTtcblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgaWYgKGFsbG93c051bWJlciB8fCAoYWxsb3dzSW50ZWdlciAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRhdGEpKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKGFsbG93c1N0cmluZykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIGlmIChhbGxvd3NCb29sZWFuKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBpZiAoYWxsb3dzTnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICBpZiAoYWxsb3dzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFsbG93c09iamVjdCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlRnVuY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0eXBlTWV0aG9kTmFtZSA9IHR5cGVOYW1lc1swXTtcbiAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoIXNpbmdsZVR5cGVGbihkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSB0eXBlTmFtZXMuam9pbihcIl9PUl9cIik7XG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZUZ1bmN0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBuYW1lOiB0eXBlTWV0aG9kTmFtZSxcbiAgICAgICAgdmFsaWRhdGU6IGdldE5hbWVkRnVuY3Rpb24odHlwZU1ldGhvZE5hbWUsIGNvbWJpbmVkVHlwZVZhbGlkYXRvcilcbiAgICAgIH0pO1xuICAgICAgYWN0aXZlTmFtZXMucHVzaCh0eXBlTWV0aG9kTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlLCAkaWQsICRyZWYsICR2YWxpZGF0ZSwgcmVxdWlyZWQsIC4uLm90aGVyS2V5cyB9ID0gc2NoZW1hOyAvLyBFeGNsdWRlIGhhbmRsZWQga2V5c1xuXG4gICAgLy8gSW4gaGVyZSB3ZSBjcmVhdGUgYW4gYXJyYXkgb2Yga2V5cyBwdXR0aW5nIHRoZSByZXF1aXJlIGtleXdvcmQgbGFzdFxuICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQgYWZ0ZXIgZGVmYXVsdHMgYXJlIGFwcGxpZWRcbiAgICBjb25zdCBrZXlPcmRlciA9IHJlcXVpcmVkXG4gICAgICA/IHRoaXMuaGFzUmVxdWlyZWREZWZhdWx0cyhzY2hlbWEpXG4gICAgICAgID8gWy4uLk9iamVjdC5rZXlzKG90aGVyS2V5cyksIFwicmVxdWlyZWRcIl1cbiAgICAgICAgOiBbXCJyZXF1aXJlZFwiLCAuLi5PYmplY3Qua2V5cyhvdGhlcktleXMpXVxuICAgICAgOiBPYmplY3Qua2V5cyhvdGhlcktleXMpO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGtleXdvcmRGbiA9IHRoaXMuZ2V0S2V5d29yZChrZXkpO1xuXG4gICAgICBpZiAoIWtleXdvcmRGbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvdWxkU2tpcEtleXdvcmQoc2NoZW1hLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICBrZXksXG4gICAgICAgIHNjaGVtYVtrZXldLFxuICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICApO1xuICAgICAgY29uc3QgZm5OYW1lID0ga2V5d29yZEZuLm5hbWUgfHwga2V5O1xuXG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBuYW1lOiBmbk5hbWUsXG4gICAgICAgIHZhbGlkYXRlOiBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KGZuTmFtZSwgKGRhdGEpID0+XG4gICAgICAgICAgKGtleXdvcmRGbiBhcyBLZXl3b3JkRnVuY3Rpb24pKGNvbXBpbGVkU2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgdGhpcylcbiAgICAgICAgKVxuICAgICAgfSk7XG5cbiAgICAgIGFjdGl2ZU5hbWVzLnB1c2goZm5OYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXRlcmFsS2V5d29yZHMgPSBbXCJlbnVtXCIsIFwiY29uc3RcIiwgXCJkZWZhdWx0XCIsIFwiZXhhbXBsZXNcIl07XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGlmIChsaXRlcmFsS2V5d29yZHMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzY2hlbWFba2V5XSAmJlxuICAgICAgICB0eXBlb2Ygc2NoZW1hW2tleV0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJwcm9wZXJ0aWVzXCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1YktleSBvZiBPYmplY3Qua2V5cyhzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkU3ViU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKFxuICAgICAgICAgICAgICBzY2hlbWFba2V5XVtzdWJLZXldXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoKGNvbXBpbGVkU3ViU2NoZW1hIGFzIGFueSkuX2hhc1JlZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBzY2hlbWFIYXNSZWYgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSBjb21waWxlZFN1YlNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcGlsZWRTdWJTY2hlbWEgPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBpZiAoKGNvbXBpbGVkU3ViU2NoZW1hIGFzIGFueSkuX2hhc1JlZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldID0gY29tcGlsZWRTdWJTY2hlbWE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWFba2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWFba2V5XVtpXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkU3ViU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYVtrZXldW2ldKTtcbiAgICAgICAgICAgIGlmICgoY29tcGlsZWRTdWJTY2hlbWEgYXMgYW55KS5faGFzUmVmID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV1baV0gPSBjb21waWxlZFN1YlNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYUhhc1JlZikge1xuICAgICAgdGhpcy5tYXJrU2NoZW1hSGFzUmVmKGNvbXBpbGVkU2NoZW1hKTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjb21waWxlZFNjaGVtYTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHYgPSB2YWxpZGF0b3JzWzBdO1xuICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbih2Lm5hbWUsIHYudmFsaWRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb21wb3NpdGVOYW1lID0gXCJWYWxpZGF0ZV9cIiArIGFjdGl2ZU5hbWVzLmpvaW4oXCJfQU5EX1wiKTtcblxuICAgICAgY29uc3QgbWFzdGVyVmFsaWRhdG9yOiBWYWxpZGF0ZUZ1bmN0aW9uID0gKGRhdGEpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHZhbGlkYXRvcnNbaV07XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB2LnZhbGlkYXRlKGRhdGEpO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9O1xuXG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKFxuICAgICAgICBjb21wb3NpdGVOYW1lLFxuICAgICAgICBtYXN0ZXJWYWxpZGF0b3JcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBpbGVkU2NoZW1hIGFzIENvbXBpbGVkU2NoZW1hO1xuICB9XG5cbiAgaXNTY2hlbWFMaWtlKHN1YlNjaGVtYTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgc3ViU2NoZW1hICYmXG4gICAgICB0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShzdWJTY2hlbWEpXG4gICAgKSB7XG4gICAgICBpZiAoXCJ0eXBlXCIgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBzdWJLZXkgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIGlmIChzdWJLZXkgaW4gdGhpcy5rZXl3b3Jkcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgbGlua1JlZmVyZW5jZXMocm9vdDogQ29tcGlsZWRTY2hlbWEpIHtcbiAgICBjb25zdCBzdGFjazogYW55W10gPSBbcm9vdF07XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBub2RlLiRyZWYgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUuJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgbm9kZS4kdmFsaWRhdGUubmFtZSA9PT0gXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlZlBhdGggPSBub2RlLiRyZWYgYXMgc3RyaW5nO1xuXG4gICAgICAgIGxldCB0YXJnZXQ6IGFueSA9IHRoaXMuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHRhcmdldCA9IHRoaXMuZ2V0U2NoZW1hQnlJZChyZWZQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmICh0YXJnZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG5vZGUuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbihcIlZhbGlkYXRlX1JlZl9UcnVlXCIsICgpID0+IHt9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVmaW5lRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgICAgICAgXCIkcmVmXCIsXG4gICAgICAgICAgICAgIG5vZGUgYXMgYW55LFxuICAgICAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBub2RlLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb24oXG4gICAgICAgICAgICAgIFwiVmFsaWRhdGVfUmVmX0ZhbHNlXCIsXG4gICAgICAgICAgICAgIChfZGF0YTogYW55KSA9PiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBub2RlLiR2YWxpZGF0ZSA9IHRhcmdldC4kdmFsaWRhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbm9kZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaCh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BWU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLFdBQXFCLEdBQ3JCQyxhQUF1QixHQUN2QkMsS0FDQUMsT0FFQUMsWUFBWVIsR0FDVlMsTUFBTVQsR0FDTlUs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
|