nextlove 2.16.1 → 2.17.1

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.
@@ -285,12 +285,12 @@ function parseNumber({
285
285
  case "max":
286
286
  baseSchema.maximum = item.value;
287
287
  if (!item.inclusive)
288
- baseSchema.exclusiveMaximum = item.value;
288
+ baseSchema.exclusiveMaximum = true;
289
289
  break;
290
290
  case "min":
291
291
  baseSchema.minimum = item.value;
292
292
  if (!item.inclusive)
293
- baseSchema.exclusiveMinimum = item.value;
293
+ baseSchema.exclusiveMinimum = true;
294
294
  break;
295
295
  case "int":
296
296
  baseSchema.type = "integer";
@@ -955,11 +955,13 @@ You can also define "securityObjects" this way, if you want to make the endpoint
955
955
  responseSchema,
956
956
  globalSchemas
957
957
  );
958
- route.responses[200].content = {
959
- "application/json": {
960
- schema: schemaWithReferences
961
- }
962
- };
958
+ if (route.responses != null) {
959
+ route.responses[200].content = {
960
+ "application/json": {
961
+ schema: schemaWithReferences
962
+ }
963
+ };
964
+ }
963
965
  }
964
966
  route.tags = [];
965
967
  for (const tag of tags) {
@@ -1571,4 +1573,4 @@ export {
1571
1573
  generateOpenAPI,
1572
1574
  generateRouteTypes
1573
1575
  };
1574
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2UudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi96b2Qtb3BlbmFwaS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvZnJvbnQtbWF0dGVyLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1vcGVuYXBpL2VtYmVkLXNjaGVtYS1yZWZlcmVuY2VzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZmVybi1zZGstdXRpbHMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtcm91dGUtdHlwZXMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3pvZC10by10cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGUtb3BlbmFwaVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1yb3V0ZS10eXBlc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hc1wiXG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7XG4gIE9wZW5BcGlCdWlsZGVyLFxuICBPcGVyYXRpb25PYmplY3QsXG4gIFBhcmFtZXRlck9iamVjdCxcbn0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCB7IFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVNjaGVtYSB9IGZyb20gXCIuLi9saWIvem9kLW9wZW5hcGlcIlxuaW1wb3J0IHsgZW1iZWRTY2hlbWFSZWZlcmVuY2VzIH0gZnJvbSBcIi4vZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXNcIlxuaW1wb3J0IHsgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhIH0gZnJvbSBcIi4vZmVybi1zZGstdXRpbHNcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4uL2xpYi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcbmltcG9ydCB7IHByZWZpeE9iamVjdEtleXNXaXRoWCB9IGZyb20gXCIuLi91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14XCJcbmltcG9ydCB7IGRhc2hpZnlPYmplY3RLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXNcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICAvLyBCdWlsZCBPcGVuQVBJIHNwZWNcbiAgY29uc3QgYnVpbGRlciA9IE9wZW5BcGlCdWlsZGVyLmNyZWF0ZSh7XG4gICAgb3BlbmFwaTogXCIzLjAuMFwiLFxuICAgIGluZm86IHtcbiAgICAgIHRpdGxlOiBnbG9iYWxTZXR1cFBhcmFtcy5hcGlOYW1lLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIH0sXG4gICAgc2VydmVyczogW1xuICAgICAge1xuICAgICAgICB1cmw6IGdsb2JhbFNldHVwUGFyYW1zLnByb2R1Y3Rpb25TZXJ2ZXJVcmwgfHwgXCJodHRwczovL2V4YW1wbGUuY29tXCIsXG4gICAgICB9LFxuICAgIF0sXG4gICAgdGFnczogdGFncy5tYXAoKHRhZykgPT4gKHsgbmFtZTogdGFnLm5hbWUsIGRlc2NyaXB0aW9uOiB0YWcuZGVzY3JpcHRpb24gfSkpLFxuICAgIHBhdGhzOiB7fSxcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICBzZWN1cml0eVNjaGVtZXMsXG4gICAgICBzY2hlbWFzOiBnbG9iYWxTY2hlbWFzLFxuICAgIH0sXG4gIH0pXG5cbiAgZm9yIChjb25zdCBbXG4gICAgZmlsZV9wYXRoLFxuICAgIHsgc2V0dXBQYXJhbXMsIHJvdXRlU3BlYywgcm91dGU6IHJvdXRlUGF0aCB9LFxuICBdIG9mIGZpbGVwYXRoVG9Sb3V0ZUZuKSB7XG4gICAgY29uc3QgaXNQb3N0T3JQdXRPclBhdGNoID0gW1wiUE9TVFwiLCBcIlBVVFwiLCBcIlBBVENIXCJdLnNvbWUoKG1ldGhvZCkgPT5cbiAgICAgIHJvdXRlU3BlYy5tZXRob2RzLmluY2x1ZGVzKG1ldGhvZClcbiAgICApXG4gICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBhcnQvZm9ybS1kYXRhXG5cbiAgICAvLyBoYW5kbGUgYm9keVxuICAgIGxldCBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYVxuICAgIGlmIChpc1Bvc3RPclB1dE9yUGF0Y2gpIHtcbiAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5ID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgaWYgKHJvdXRlU3BlYy5qc29uQm9keSAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5Lm1lcmdlKFxuICAgICAgICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keVxuICAgIH1cblxuICAgIC8vIGhhbmRsZSBxdWVyeVxuICAgIGxldCBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgaWYgKHJvdXRlU3BlYy5xdWVyeVBhcmFtcyAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtcy5tZXJnZShcbiAgICAgICAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBERUxFVEUgYW5kIEdFVCBjYW5ub3QgaGF2ZSBhIGJvZHlcbiAgICBsZXQgbWV0aG9kcyA9IHJvdXRlU3BlYy5tZXRob2RzXG5cbiAgICBpZiAocm91dGVTcGVjLm1ldGhvZHMuaW5jbHVkZXMoXCJERUxFVEVcIikgJiYgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobSkgPT4gbSAhPT0gXCJERUxFVEVcIilcbiAgICB9XG5cbiAgICBpZiAocm91dGVTcGVjLm1ldGhvZHMuaW5jbHVkZXMoXCJHRVRcIikgJiYgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobSkgPT4gbSAhPT0gXCJHRVRcIilcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSBpdCBoYXMgbm8gbWV0aG9kcy5gKVxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgZGVzY3JpcHRpb24gPSByb3V0ZVNwZWMuZGVzY3JpcHRpb25cbiAgICBsZXQgZGVzY3JpcHRpb25NZXRhZGF0YToge1xuICAgICAgcmVzcG9uc2Vfa2V5Pzogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9ID0ge31cblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKS50cmltKClcblxuICAgICAgaWYgKHRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSB7XG4gICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gICAgICAgIGRlc2NyaXB0aW9uTWV0YWRhdGEgPSBhdHRyaWJ1dGVzXG4gICAgICAgIGRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gdHJpbW1lZERlc2NyaXB0aW9uXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0dGVkRGVzY3JpcHRpb25NZXRhZGF0YSA9IHByZWZpeE9iamVjdEtleXNXaXRoWChcbiAgICAgIGRhc2hpZnlPYmplY3RLZXlzKGRlc2NyaXB0aW9uTWV0YWRhdGEpXG4gICAgKVxuXG4gICAgY29uc3Qgcm91dGU6IE9wZXJhdGlvbk9iamVjdCA9IHtcbiAgICAgIC4uLnJvdXRlU3BlYy5vcGVuQXBpTWV0YWRhdGEsXG4gICAgICAuLi5mb3JtYXR0ZWREZXNjcmlwdGlvbk1ldGFkYXRhLFxuICAgICAgc3VtbWFyeTogcm91dGVQYXRoLFxuICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiT0tcIixcbiAgICAgICAgfSxcbiAgICAgICAgNDAwOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiQmFkIFJlcXVlc3RcIixcbiAgICAgICAgfSxcbiAgICAgICAgNDAxOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiVW5hdXRob3JpemVkXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2VjdXJpdHk6IEFycmF5LmlzQXJyYXkocm91dGVTcGVjLmF1dGgpXG4gICAgICAgID8gcm91dGVTcGVjLmF1dGhcbiAgICAgICAgICAgIC5tYXAoKGF1dGhUeXBlKSA9PiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVthdXRoVHlwZV0pXG4gICAgICAgICAgICAuZmxhdCgpXG4gICAgICAgIDogc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbcm91dGVTcGVjLmF1dGhdLFxuICAgIH1cblxuICAgIGlmIChib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgcm91dGUucmVxdWVzdEJvZHkgPSB7XG4gICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgICAgc2NoZW1hOiBnZW5lcmF0ZVNjaGVtYShib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSBhcyBhbnkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgY29uc3Qgc2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEocXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hIGFzIGFueSlcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJPYmplY3RbXSA9IE9iamVjdC5rZXlzKFxuICAgICAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzIGFzIGFueVxuICAgICAgICApLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaW46IFwicXVlcnlcIixcbiAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLnByb3BlcnRpZXMhW25hbWVdLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHNjaGVtYS5yZXF1aXJlZD8uaW5jbHVkZXMobmFtZSksXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJvdXRlLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBqc29uUmVzcG9uc2UgfSA9IHJvdXRlU3BlY1xuICAgIGNvbnN0IHsgYWRkT2tTdGF0dXMgPSB0cnVlIH0gPSBzZXR1cFBhcmFtc1xuXG4gICAgaWYgKGpzb25SZXNwb25zZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhanNvblJlc3BvbnNlLl9kZWYgfHxcbiAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lIHx8XG4gICAgICAgIGpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lICE9PSBcIlpvZE9iamVjdFwiXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgIGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSB0aGUgcmVzcG9uc2UgaXMgbm90IGEgWm9kT2JqZWN0LmBcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2VTY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYShcbiAgICAgICAgYWRkT2tTdGF0dXMgJiYganNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICA/IGpzb25SZXNwb25zZS5leHRlbmQoeyBvazogei5ib29sZWFuKCkgfSlcbiAgICAgICAgICA6IGpzb25SZXNwb25zZVxuICAgICAgKVxuXG4gICAgICBjb25zdCBzY2hlbWFXaXRoUmVmZXJlbmNlcyA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhcbiAgICAgICAgcmVzcG9uc2VTY2hlbWEsXG4gICAgICAgIGdsb2JhbFNjaGVtYXNcbiAgICAgIClcblxuICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIG5vdCBoYXJkY29kZSAyMDAgaGVyZVxuICAgICAgcm91dGUucmVzcG9uc2VzWzIwMF0uY29udGVudCA9IHtcbiAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHtcbiAgICAgICAgICBzY2hlbWE6IHNjaGVtYVdpdGhSZWZlcmVuY2VzLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH1cblxuICAgIHJvdXRlLnRhZ3MgPSBbXVxuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIGlmICh0YWcuZG9lc1JvdXRlSGF2ZVRhZyAmJiB0YWcuZG9lc1JvdXRlSGF2ZVRhZyhyb3V0ZS5zdW1tYXJ5IHx8IFwiXCIpKSB7XG4gICAgICAgIHJvdXRlLnRhZ3MucHVzaCh0YWcubmFtZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2RzTWFwcGVkVG9GZXJuU2RrTWV0YWRhdGEgPSBhd2FpdCBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoe1xuICAgICAgbWV0aG9kcyxcbiAgICAgIHBhdGg6IHJvdXRlUGF0aCxcbiAgICAgIHNka1JldHVyblZhbHVlOlxuICAgICAgICBkZXNjcmlwdGlvbk1ldGFkYXRhPy5yZXNwb25zZV9rZXkgPz8gcm91dGVTcGVjLnNka1JldHVyblZhbHVlLFxuICAgIH0pXG5cbiAgICAvLyBTb21lIHJvdXRlcyBhY2NlcHQgbXVsdGlwbGUgbWV0aG9kc1xuICAgIGJ1aWxkZXIuYWRkUGF0aChyb3V0ZVBhdGgsIHtcbiAgICAgIC4uLm1ldGhvZHNcbiAgICAgICAgLm1hcCgobWV0aG9kKSA9PiAoe1xuICAgICAgICAgIFttZXRob2QudG9Mb3dlckNhc2UoKV06IHtcbiAgICAgICAgICAgIC4uLm1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YVttZXRob2RdLFxuICAgICAgICAgICAgLi4ucm91dGUsXG4gICAgICAgICAgICBvcGVyYXRpb25JZDogYCR7dHJhbnNmb3JtUGF0aFRvT3BlcmF0aW9uSWQocm91dGVQYXRoKX0ke3Bhc2NhbENhc2UoXG4gICAgICAgICAgICAgIG1ldGhvZFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKVxuICAgICAgICAucmVkdWNlUmlnaHQoKGFjYywgY3VyKSA9PiAoeyAuLi5hY2MsIC4uLmN1ciB9KSwge30pLFxuICAgIH0pXG4gIH1cblxuICBpZiAob3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvdXRwdXRGaWxlLCBidWlsZGVyLmdldFNwZWNBc0pzb24odW5kZWZpbmVkLCAyKSlcbiAgfVxuXG4gIHJldHVybiBidWlsZGVyLmdldFNwZWNBc0pzb24odW5kZWZpbmVkLCAyKVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgUm91dGVTcGVjLCBTZXR1cFBhcmFtcyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgeyBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSB9IGZyb20gXCIuL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlXCJcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUluZm8ge1xuICBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXNcbiAgcm91dGVTcGVjOiBSb3V0ZVNwZWNcbiAgcm91dGVGbjogRnVuY3Rpb25cbiAgcm91dGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSb3V0ZXNJblBhY2thZ2UgPSBhc3luYyAob3B0czoge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxufSk6IFByb21pc2U8TWFwPHN0cmluZywgUm91dGVJbmZvPj4gPT4ge1xuICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdFxuICBjb25zdCBnbG9iYnkgPSAoYXdhaXQgaW1wb3J0KFwiZ2xvYmJ5XCIpKS5nbG9iYnlcbiAgY29uc3Qge1xuICAgIHBhY2thZ2VEaXIsXG4gICAgcGF0aEdsb2IgPSBcIi9wYWdlcy9hcGkvKiovKi50c1wiLFxuICAgIG1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPSBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeCksXG4gIH0gPSBvcHRzXG4gIC8vIExvYWQgYWxsIHJvdXRlIHNwZWNzXG4gIGNvbnN0IGZ1bGxQYXRoR2xvYiA9IHBhdGgucG9zaXguam9pbihwYWNrYWdlRGlyLCBwYXRoR2xvYilcbiAgY29uc29sZS5sb2coYHNlYXJjaGluZyBcIiR7ZnVsbFBhdGhHbG9ifVwiLi4uYClcbiAgY29uc3QgZmlsZXBhdGhzID0gYXdhaXQgZ2xvYmJ5KGAke2Z1bGxQYXRoR2xvYn1gKVxuICBjb25zb2xlLmxvZyhgZm91bmQgJHtmaWxlcGF0aHMubGVuZ3RofSBmaWxlc2ApXG4gIGlmIChmaWxlcGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBmaWxlcyBmb3VuZCBhdCBcIiR7ZnVsbFBhdGhHbG9ifVwiYClcbiAgfVxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZUluZm8+KClcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlcGF0aHMubWFwKGFzeW5jIChwKSA9PiB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IHJvdXRlRm4gfSA9IGF3YWl0IHJlcXVpcmUocGF0aC5yZXNvbHZlKHApKVxuXG4gICAgICBpZiAocm91dGVGbikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcm91dGVGbi5fcm91dGVTcGVjPy5leGNsdWRlRnJvbU9wZW5BcGkgJiZcbiAgICAgICAgICAhb3B0cy5pbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuZ3JheShcbiAgICAgICAgICAgICAgYElnbm9yaW5nIFwiJHtwfSBiZWNhdXNlIGl0IHdhcyBleGNsdWRlZCBmcm9tIE9wZW5BUEkgZ2VuZXJhdGlvblwiYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdXRlRm4uX3NldHVwUGFyYW1zKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgSWdub3JpbmcgXCIke3B9XCIgYmVjYXVzZSBpdCB3YXNuJ3QgY3JlYXRlZCB3aXRoIHdpdGhSb3V0ZVNwZWNgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGZpbGVwYXRoVG9Sb3V0ZUZuLnNldChwLCB7XG4gICAgICAgICAgc2V0dXBQYXJhbXM6IHJvdXRlRm4uX3NldHVwUGFyYW1zLFxuICAgICAgICAgIHJvdXRlU3BlYzogcm91dGVGbi5fcm91dGVTcGVjLFxuICAgICAgICAgIHJvdXRlOiBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlKHApLFxuICAgICAgICAgIHJvdXRlRm4sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBDb3VsZG4ndCBmaW5kIHJvdXRlICR7cH1gKSlcbiAgICAgIH1cbiAgICB9KVxuICApXG5cbiAgcmV0dXJuIGZpbGVwYXRoVG9Sb3V0ZUZuXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPVxuICAoYXBpX3ByZWZpeDogc3RyaW5nID0gXCIvYXBpXCIpID0+XG4gIChmaWxlX3BhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvdXRlID0gZmlsZV9wYXRoXG4gICAgICAvLyByZXBsYWNlIC4vIGlmIGl0IHN0YXJ0cyB3aXRoIC4vXG4gICAgICAucmVwbGFjZSgvXlxcLlxcLy8sIFwiL1wiKVxuICAgICAgLy8gcmVwbGFjZSBzdGFydGluZyAvXG4gICAgICAucmVwbGFjZSgvXlxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9zcmMgaWYgaXQgc3RhcnRzIHdpdGggL3NyY1xuICAgICAgLnJlcGxhY2UoL15zcmNcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvcGFnZXMgaWYgaXQgc3RhcnRzIHdpdGggL3BhZ2VzXG4gICAgICAucmVwbGFjZSgvXnBhZ2VzXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL2FwaSBpZiBpdCBzdGFydHMgd2l0aCAvYXBpXG4gICAgICAucmVwbGFjZSgvXmFwaVxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC50cyBpZiBpdCBlbmRzIHdpdGggLnRzXG4gICAgICAucmVwbGFjZSgvXFwudHMkLywgXCJcIilcbiAgICAgIC8vIHJlbW92ZSBwdWJsaWMgcmVmZXJlbmNlXG4gICAgICAucmVwbGFjZShcInB1YmxpY1wiLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSBpbmRleCBpZiBpdCBlbmRzIHdpdGggaW5kZXhcbiAgICAgIC5yZXBsYWNlKC9cXC9cXGluZGV4KD8hLikvLCBcIlwiKVxuXG4gICAgcmV0dXJuIHBhdGguam9pbihhcGlfcHJlZml4LCByb3V0ZSlcbiAgfVxuIiwgIi8qKlxuICogWm9kIE9wZW5BUEkgR2VuZXJhdG9yLlxuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuYXRpbmUvem9kLXBsdWdpbnNcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMiBCcmlhbiBNY0JyaWRlXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNjaGVtYU9iamVjdCwgU2NoZW1hT2JqZWN0VHlwZSB9IGZyb20gXCJvcGVuYXBpMy10cy9vYXMzMVwiXG5pbXBvcnQgbWVyZ2UgZnJvbSBcInRzLWRlZXBtZXJnZVwiXG5pbXBvcnQgeyBBbnlab2RPYmplY3QsIHosIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXIsIHRlc3RGcm9udE1hdHRlciB9IGZyb20gXCIuL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuaW1wb3J0IHsgcHJlZml4T2JqZWN0S2V5c1dpdGhYIH0gZnJvbSBcIi4uL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXhcIlxuaW1wb3J0IHsgZGFzaGlmeU9iamVjdEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5c1wiXG5cbnR5cGUgQW5hdGluZVNjaGVtYU9iamVjdCA9IFNjaGVtYU9iamVjdCAmIHsgaGlkZURlZmluaXRpb25zPzogc3RyaW5nW10gfVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BcGlab2RBbnkgZXh0ZW5kcyBab2RUeXBlQW55IHtcbiAgbWV0YU9wZW5BcGk/OiBBbmF0aW5lU2NoZW1hT2JqZWN0IHwgQW5hdGluZVNjaGVtYU9iamVjdFtdXG59XG5cbmludGVyZmFjZSBPcGVuQXBpWm9kQW55T2JqZWN0IGV4dGVuZHMgQW55Wm9kT2JqZWN0IHtcbiAgbWV0YU9wZW5BcGk/OiBBbmF0aW5lU2NoZW1hT2JqZWN0IHwgQW5hdGluZVNjaGVtYU9iamVjdFtdXG59XG5cbmludGVyZmFjZSBQYXJzaW5nQXJnczxUPiB7XG4gIHpvZFJlZjogVFxuICBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbiAgdXNlT3V0cHV0PzogYm9vbGVhblxuICBoaWRlRGVmaW5pdGlvbnM/OiBzdHJpbmdbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kQXBpPFQgZXh0ZW5kcyBPcGVuQXBpWm9kQW55PihcbiAgc2NoZW1hOiBULFxuICBzY2hlbWFPYmplY3Q6IEFuYXRpbmVTY2hlbWFPYmplY3QgPSB7fVxuKTogVCB7XG4gIHNjaGVtYS5tZXRhT3BlbkFwaSA9IE9iamVjdC5hc3NpZ24oc2NoZW1hLm1ldGFPcGVuQXBpIHx8IHt9LCBzY2hlbWFPYmplY3QpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZnVuY3Rpb24gaXRlcmF0ZVpvZE9iamVjdCh7XG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxuICBoaWRlRGVmaW5pdGlvbnMsXG59OiBQYXJzaW5nQXJnczxPcGVuQXBpWm9kQW55T2JqZWN0Pikge1xuICBjb25zdCByZWR1Y2VkID0gT2JqZWN0LmtleXMoem9kUmVmLnNoYXBlKVxuICAgIC5maWx0ZXIoKGtleSkgPT4gaGlkZURlZmluaXRpb25zPy5pbmNsdWRlcyhrZXkpID09PSBmYWxzZSlcbiAgICAucmVkdWNlKFxuICAgICAgKGNhcnJ5LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmNhcnJ5LFxuICAgICAgICBba2V5XTogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnNoYXBlW2tleV0sIHVzZU91dHB1dCksXG4gICAgICB9KSxcbiAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIFNjaGVtYU9iamVjdD5cbiAgICApXG5cbiAgcmV0dXJuIHJlZHVjZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VEZXNjcmlwdGlvbih6b2RSZWY6IE9wZW5BcGlab2RBbnkpOiBTY2hlbWFPYmplY3Qge1xuICBpZiAoIXpvZFJlZi5kZXNjcmlwdGlvbikgcmV0dXJuIHt9XG4gIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlZGVudCh6b2RSZWYuZGVzY3JpcHRpb24pXG4gIGlmICghdGVzdEZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbikpXG4gICAgcmV0dXJuIHsgZGVzY3JpcHRpb246IHpvZFJlZi5kZXNjcmlwdGlvbiB9XG4gIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gIGNvbnN0IG91dHB1dDogU2NoZW1hT2JqZWN0ID0ge31cbiAgaWYgKGJvZHkudHJpbSgpKSBvdXRwdXQuZGVzY3JpcHRpb24gPSBib2R5LnRyaW0oKVxuICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIgJiYgYXR0cmlidXRlcyAhPT0gbnVsbCkge1xuICAgIGlmIChcImRlcHJlY2F0ZWRcIiBpbiBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCkge1xuICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgT2JqZWN0LmVudHJpZXMoXG4gICAgICBwcmVmaXhPYmplY3RLZXlzV2l0aFgoZGFzaGlmeU9iamVjdEtleXMoYXR0cmlidXRlcykpXG4gICAgKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIG91dHB1dFtrZXldID0gdmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dFxufVxuXG5mdW5jdGlvbiBwYXJzZVRyYW5zZm9ybWF0aW9uKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFRyYW5zZm9ybWVyPG5ldmVyPiB8IHouWm9kRWZmZWN0czxuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgaW5wdXQgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5zY2hlbWEsIHVzZU91dHB1dClcblxuICBsZXQgb3V0cHV0ID0gXCJ1bmRlZmluZWRcIlxuICBpZiAodXNlT3V0cHV0ICYmIHpvZFJlZi5fZGVmLmVmZmVjdCkge1xuICAgIGNvbnN0IGVmZmVjdCA9XG4gICAgICB6b2RSZWYuX2RlZi5lZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IHpvZFJlZi5fZGVmLmVmZmVjdCA6IG51bGxcbiAgICBpZiAoZWZmZWN0ICYmIFwidHJhbnNmb3JtXCIgaW4gZWZmZWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBvdXRwdXQgPSB0eXBlb2YgZWZmZWN0LnRyYW5zZm9ybShcbiAgICAgICAgICBbXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKGAke2lucHV0LnR5cGV9YClcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBcInN0cmluZ1wiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgIDogXCJib29sZWFuXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogXCJvYmplY3RcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBcIm51bGxcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IFwiYXJyYXlcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgeyBhZGRJc3N1ZTogKCkgPT4gdW5kZWZpbmVkLCBwYXRoOiBbXSB9IC8vIFRPRE86IERpc2NvdmVyIGlmIGNvbnRleHQgaXMgbmVjZXNzYXJ5IGhlcmVcbiAgICAgICAgKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiovXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICAuLi4oem9kUmVmLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogem9kUmVmLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi5pbnB1dCxcbiAgICAgIC4uLihbXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJib29sZWFuXCIsIFwibnVsbFwiXS5pbmNsdWRlcyhvdXRwdXQpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdHlwZTogb3V0cHV0IGFzIFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJib29sZWFuXCIgfCBcIm51bGxcIixcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0sXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RTdHJpbmc+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgYmFzZVNjaGVtYTogU2NoZW1hT2JqZWN0ID0ge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gIH1cbiAgY29uc3QgeyBjaGVja3MgPSBbXSB9ID0gem9kUmVmLl9kZWZcbiAgY2hlY2tzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBzd2l0Y2ggKGl0ZW0ua2luZCkge1xuICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJlbWFpbFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwidXVpZFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiY3VpZFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwiY3VpZFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1cmlcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJkYXRlLXRpbWVcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImxlbmd0aFwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbkxlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhMZW5ndGggPSBpdGVtLnZhbHVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWF4TGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbkxlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJyZWdleFwiOlxuICAgICAgICBiYXNlU2NoZW1hLnBhdHRlcm4gPSBpdGVtLnJlZ2V4LnNvdXJjZVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlKGJhc2VTY2hlbWEsIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1iZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZE51bWJlcj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBiYXNlU2NoZW1hOiBTY2hlbWFPYmplY3QgPSB7XG4gICAgdHlwZTogXCJudW1iZXJcIixcbiAgICBmb3JtYXQ6IFwiZmxvYXRcIixcbiAgfVxuICBjb25zdCB7IGNoZWNrcyA9IFtdIH0gPSB6b2RSZWYuX2RlZlxuICBjaGVja3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIHN3aXRjaCAoaXRlbS5raW5kKSB7XG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWF4aW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgLy8gVE9ETzogb3B0aW9uIHRvIG1ha2UgdGhpcyBhbHdheXMgZXhwbGljaXQ/IChmYWxzZSBpbnN0ZWFkIG9mIG5vbi1leGlzdGVudClcbiAgICAgICAgaWYgKCFpdGVtLmluY2x1c2l2ZSkgYmFzZVNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbmltdW0gPSBpdGVtLnZhbHVlXG4gICAgICAgIGlmICghaXRlbS5pbmNsdXNpdmUpIGJhc2VTY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJpbnRcIjpcbiAgICAgICAgYmFzZVNjaGVtYS50eXBlID0gXCJpbnRlZ2VyXCJcbiAgICAgICAgZGVsZXRlIGJhc2VTY2hlbWEuZm9ybWF0XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibXVsdGlwbGVPZlwiOlxuICAgICAgICBiYXNlU2NoZW1hLm11bHRpcGxlT2YgPSBpdGVtLnZhbHVlXG4gICAgfVxuICB9KVxuICByZXR1cm4gbWVyZ2UoYmFzZVNjaGVtYSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBnZXRFeGNsdWRlZERlZmluaXRpb25zRnJvbVNjaGVtYShcbiAgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4Y2x1ZGVkRGVmaW5pdGlvbnM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5oaWRlRGVmaW5pdGlvbnMpKSB7XG4gICAgICBleGNsdWRlZERlZmluaXRpb25zLnB1c2goLi4uc2NoZW1hLmhpZGVEZWZpbml0aW9ucylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhjbHVkZWREZWZpbml0aW9uc1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxuICBoaWRlRGVmaW5pdGlvbnMsXG59OiBQYXJzaW5nQXJnczxcbiAgei5ab2RPYmplY3Q8bmV2ZXIsIFwicGFzc3Rocm91Z2hcIiB8IFwic3RyaWN0XCIgfCBcInN0cmlwXCI+XG4+KTogU2NoZW1hT2JqZWN0IHtcbiAgbGV0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBTY2hlbWFPYmplY3RbXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiXVxuXG4gIC8vIGBjYXRjaGFsbGAgb2J2aWF0ZXMgYHN0cmljdGAsIGBzdHJpcGAsIGFuZCBgcGFzc3Rocm91Z2hgXG4gIGlmIChcbiAgICAhKFxuICAgICAgem9kUmVmLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8XG4gICAgICB6b2RSZWYuX2RlZi5jYXRjaGFsbD8uX2RlZi50eXBlTmFtZSA9PT0gXCJab2ROZXZlclwiXG4gICAgKVxuICApXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5jYXRjaGFsbCwgdXNlT3V0cHV0KVxuICBlbHNlIGlmICh6b2RSZWYuX2RlZi51bmtub3duS2V5cyA9PT0gXCJwYXNzdGhyb3VnaFwiKVxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZVxuICBlbHNlIGlmICh6b2RSZWYuX2RlZi51bmtub3duS2V5cyA9PT0gXCJzdHJpY3RcIikgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZVxuXG4gIC8vIFNvIHRoYXQgYHVuZGVmaW5lZGAgdmFsdWVzIGRvbid0IGVuZCB1cCBpbiB0aGUgc2NoZW1hIGFuZCBiZSB3ZWlyZFxuICBhZGRpdGlvbmFsUHJvcGVydGllcyA9XG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgIT0gbnVsbCA/IHsgYWRkaXRpb25hbFByb3BlcnRpZXMgfSA6IHt9XG5cbiAgY29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoXG4gICAgKHpvZFJlZiBhcyB6LkFueVpvZE9iamVjdCkuc2hhcGVcbiAgKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSAoem9kUmVmIGFzIHouQW55Wm9kT2JqZWN0KS5zaGFwZVtrZXldXG4gICAgcmV0dXJuIChcbiAgICAgICEoXG4gICAgICAgIGl0ZW0uaXNPcHRpb25hbCgpIHx8XG4gICAgICAgIGl0ZW0gaW5zdGFuY2VvZiB6LlpvZERlZmF1bHQgfHxcbiAgICAgICAgaXRlbS5fZGVmLnR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIlxuICAgICAgKSAmJiAhKGl0ZW0gaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8IGl0ZW0uX2RlZi50eXBlTmFtZSA9PT0gXCJab2REZWZhdWx0XCIpXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IHJlcXVpcmVkID1cbiAgICByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCA/IHsgcmVxdWlyZWQ6IHJlcXVpcmVkUHJvcGVydGllcyB9IDoge31cblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogXCJvYmplY3RcIiBhcyBTY2hlbWFPYmplY3RUeXBlLFxuICAgICAgcHJvcGVydGllczogaXRlcmF0ZVpvZE9iamVjdCh7XG4gICAgICAgIHpvZFJlZjogem9kUmVmIGFzIE9wZW5BcGlab2RBbnlPYmplY3QsXG4gICAgICAgIHNjaGVtYXMsXG4gICAgICAgIHVzZU91dHB1dCxcbiAgICAgICAgaGlkZURlZmluaXRpb25zOiBnZXRFeGNsdWRlZERlZmluaXRpb25zRnJvbVNjaGVtYShzY2hlbWFzKSxcbiAgICAgIH0pLFxuICAgICAgLi4ucmVxdWlyZWQsXG4gICAgICAuLi5hZGRpdGlvbmFsUHJvcGVydGllcyxcbiAgICAgIC4uLmhpZGVEZWZpbml0aW9ucyxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNvcmQoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kUmVjb3JkPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczpcbiAgICAgICAgem9kUmVmLl9kZWYudmFsdWVUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duXG4gICAgICAgICAgPyB7fVxuICAgICAgICAgIDogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYudmFsdWVUeXBlLCB1c2VPdXRwdXQpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJpZ0ludCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kQmlnSW50Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7IHR5cGU6IFwiaW50ZWdlclwiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJpbnQ2NFwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZEJvb2xlYW4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgdHlwZTogXCJib29sZWFuXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlKHsgem9kUmVmLCBzY2hlbWFzIH06IFBhcnNpbmdBcmdzPHouWm9kRGF0ZT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgeyB0eXBlOiBcInN0cmluZ1wiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJkYXRlLXRpbWVcIiB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VOdWxsKHsgem9kUmVmLCBzY2hlbWFzIH06IFBhcnNpbmdBcmdzPHouWm9kTnVsbD4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kT3B0aW9uYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi51bndyYXAoKSwgdXNlT3V0cHV0KSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVsbGFibGUoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kTnVsbGFibGU8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3Qgc2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnVud3JhcCgpLCB1c2VPdXRwdXQpXG4gIHJldHVybiBtZXJnZShcbiAgICB7IC4uLnNjaGVtYSwgdHlwZTogc2NoZW1hLnR5cGUsIG51bGxhYmxlOiB0cnVlIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURlZmF1bHQoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kRGVmYXVsdDxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgZGVmYXVsdDogem9kUmVmLl9kZWYuZGVmYXVsdFZhbHVlKCksXG4gICAgICAuLi5nZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5pbm5lclR5cGUsIHVzZU91dHB1dCksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQXJyYXkoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kQXJyYXk8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgY29uc3RyYWludHM6IFNjaGVtYU9iamVjdCA9IHt9XG4gIGlmICh6b2RSZWYuX2RlZi5leGFjdExlbmd0aCAhPSBudWxsKSB7XG4gICAgY29uc3RyYWludHMubWluSXRlbXMgPSB6b2RSZWYuX2RlZi5leGFjdExlbmd0aC52YWx1ZVxuICAgIGNvbnN0cmFpbnRzLm1heEl0ZW1zID0gem9kUmVmLl9kZWYuZXhhY3RMZW5ndGgudmFsdWVcbiAgfVxuXG4gIGlmICh6b2RSZWYuX2RlZi5taW5MZW5ndGggIT0gbnVsbClcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IHpvZFJlZi5fZGVmLm1pbkxlbmd0aC52YWx1ZVxuICBpZiAoem9kUmVmLl9kZWYubWF4TGVuZ3RoICE9IG51bGwpXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSB6b2RSZWYuX2RlZi5tYXhMZW5ndGgudmFsdWVcblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogXCJhcnJheVwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBpdGVtczogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLmVsZW1lbnQsIHVzZU91dHB1dCksXG4gICAgICAuLi5jb25zdHJhaW50cyxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VMaXRlcmFsKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RMaXRlcmFsPE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2Ygem9kUmVmLl9kZWYudmFsdWUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgIGVudW06IFt6b2RSZWYuX2RlZi52YWx1ZV0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRW51bSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbn06IFBhcnNpbmdBcmdzPHouWm9kRW51bTxuZXZlcj4gfCB6LlpvZE5hdGl2ZUVudW08bmV2ZXI+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2YgT2JqZWN0LnZhbHVlcyh6b2RSZWYuX2RlZi52YWx1ZXMpWzBdIGFzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiLFxuICAgICAgZW51bTogT2JqZWN0LnZhbHVlcyh6b2RSZWYuX2RlZi52YWx1ZXMpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUludGVyc2VjdGlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlQW55LCB6LlpvZFR5cGVBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBhbGxPZjogW1xuICAgICAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5sZWZ0LCB1c2VPdXRwdXQpLFxuICAgICAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5yaWdodCwgdXNlT3V0cHV0KSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5pb24oe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kVW5pb248W3ouWm9kVHlwZUFueSwgLi4uei5ab2RUeXBlQW55W11dPj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBjb250ZW50cyA9IHpvZFJlZi5fZGVmLm9wdGlvbnNcbiAgaWYgKFxuICAgIGNvbnRlbnRzLnJlZHVjZShcbiAgICAgIChwcmV2LCBjb250ZW50KSA9PiBwcmV2ICYmIGNvbnRlbnQuX2RlZi50eXBlTmFtZSA9PT0gXCJab2RMaXRlcmFsXCIsXG4gICAgICB0cnVlXG4gICAgKVxuICApIHtcbiAgICAvLyBzcGVjaWFsIGNhc2UgdG8gdHJhbnNmb3JtIHVuaW9ucyBvZiBsaXRlcmFscyBpbnRvIGVudW1zXG4gICAgY29uc3QgbGl0ZXJhbHMgPSBjb250ZW50cyBhcyB1bmtub3duIGFzIHouWm9kTGl0ZXJhbDxPcGVuQXBpWm9kQW55PltdXG4gICAgY29uc3QgdHlwZSA9IGxpdGVyYWxzLnJlZHVjZShcbiAgICAgIChwcmV2LCBjb250ZW50KSA9PlxuICAgICAgICAhcHJldiB8fCBwcmV2ID09PSB0eXBlb2YgY29udGVudC5fZGVmLnZhbHVlXG4gICAgICAgICAgPyB0eXBlb2YgY29udGVudC5fZGVmLnZhbHVlXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgbnVsbCBhcyBudWxsIHwgc3RyaW5nXG4gICAgKVxuXG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IHR5cGUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgICAgICBlbnVtOiBsaXRlcmFscy5tYXAoKGxpdGVyYWwpID0+IGxpdGVyYWwuX2RlZi52YWx1ZSksXG4gICAgICAgIH0sXG4gICAgICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAgICAgLi4uc2NoZW1hc1xuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlzTnVsbGFibGUgPSBjb250ZW50cy5zb21lKFxuICAgIChjb250ZW50KSA9PiBjb250ZW50Ll9kZWYudHlwZU5hbWUgPT09IFwiWm9kTnVsbFwiXG4gIClcbiAgY29uc3Qgbm9uTnVsbENvbnRlbnRzID0gY29udGVudHMuZmlsdGVyKFxuICAgIChjb250ZW50KSA9PiBjb250ZW50Ll9kZWYudHlwZU5hbWUgIT09IFwiWm9kTnVsbFwiXG4gIClcblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgb25lT2Y6IG5vbk51bGxDb250ZW50cy5tYXAoKHNjaGVtYSkgPT4gZ2VuZXJhdGVTY2hlbWEoc2NoZW1hLCB1c2VPdXRwdXQpKSxcbiAgICAgIC4uLihpc051bGxhYmxlID8geyBudWxsYWJsZTogdHJ1ZSB9IDoge30pLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8XG4gIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uPHN0cmluZywgei5ab2REaXNjcmltaW5hdGVkVW5pb25PcHRpb248c3RyaW5nPltdPlxuPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBkaXNjcmltaW5hdG9yOiB7XG4gICAgICAgIHByb3BlcnR5TmFtZTogKFxuICAgICAgICAgIHpvZFJlZiBhcyB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbjxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uT3B0aW9uPHN0cmluZz5bXVxuICAgICAgICAgID5cbiAgICAgICAgKS5fZGVmLmRpc2NyaW1pbmF0b3IsXG4gICAgICB9LFxuICAgICAgb25lT2Y6IEFycmF5LmZyb20oXG4gICAgICAgIChcbiAgICAgICAgICB6b2RSZWYgYXMgei5ab2REaXNjcmltaW5hdGVkVW5pb248XG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbk9wdGlvbjxzdHJpbmc+W11cbiAgICAgICAgICA+XG4gICAgICAgICkuX2RlZi5vcHRpb25zLnZhbHVlcygpXG4gICAgICApLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU5ldmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROZXZlcj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoeyByZWFkT25seTogdHJ1ZSB9LCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlQnJhbmRlZCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbn06IFBhcnNpbmdBcmdzPHouWm9kQnJhbmRlZDx6LlpvZEFueSwgc3RyaW5nPj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYudHlwZSksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGNhdGNoQWxsUGFyc2VyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8Wm9kVHlwZUFueT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UocGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZVBpcGVsaW5lKHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFBpcGVsaW5lPG5ldmVyLCBuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgaWYgKHVzZU91dHB1dCkge1xuICAgIHJldHVybiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5vdXQsIHVzZU91dHB1dClcbiAgfVxuICByZXR1cm4gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuaW4sIHVzZU91dHB1dClcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWFkb25seSh7XG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RSZWFkb25seTx6LlpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmlubmVyVHlwZSwgdXNlT3V0cHV0KSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmNvbnN0IHdvcmtlck1hcCA9IHtcbiAgWm9kT2JqZWN0OiBwYXJzZU9iamVjdCxcbiAgWm9kUmVjb3JkOiBwYXJzZVJlY29yZCxcbiAgWm9kU3RyaW5nOiBwYXJzZVN0cmluZyxcbiAgWm9kTnVtYmVyOiBwYXJzZU51bWJlcixcbiAgWm9kQmlnSW50OiBwYXJzZUJpZ0ludCxcbiAgWm9kQm9vbGVhbjogcGFyc2VCb29sZWFuLFxuICBab2REYXRlOiBwYXJzZURhdGUsXG4gIFpvZE51bGw6IHBhcnNlTnVsbCxcbiAgWm9kT3B0aW9uYWw6IHBhcnNlT3B0aW9uYWwsXG4gIFpvZE51bGxhYmxlOiBwYXJzZU51bGxhYmxlLFxuICBab2REZWZhdWx0OiBwYXJzZURlZmF1bHQsXG4gIFpvZEFycmF5OiBwYXJzZUFycmF5LFxuICBab2RMaXRlcmFsOiBwYXJzZUxpdGVyYWwsXG4gIFpvZEVudW06IHBhcnNlRW51bSxcbiAgWm9kTmF0aXZlRW51bTogcGFyc2VFbnVtLFxuICBab2RUcmFuc2Zvcm1lcjogcGFyc2VUcmFuc2Zvcm1hdGlvbixcbiAgWm9kRWZmZWN0czogcGFyc2VUcmFuc2Zvcm1hdGlvbixcbiAgWm9kSW50ZXJzZWN0aW9uOiBwYXJzZUludGVyc2VjdGlvbixcbiAgWm9kVW5pb246IHBhcnNlVW5pb24sXG4gIFpvZERpc2NyaW1pbmF0ZWRVbmlvbjogcGFyc2VEaXNjcmltaW5hdGVkVW5pb24sXG4gIFpvZE5ldmVyOiBwYXJzZU5ldmVyLFxuICBab2RCcmFuZGVkOiBwYXJzZUJyYW5kZWQsXG4gIC8vIFRPRE8gVHJhbnNmb3JtIHRoZSByZXN0IHRvIHNjaGVtYXNcbiAgWm9kVW5kZWZpbmVkOiBjYXRjaEFsbFBhcnNlcixcbiAgLy8gVE9ETzogYHByZWZpeEl0ZW1zYCBpcyBhbGxvd2VkIGluIE9wZW5BUEkgMy4xIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSB0dXBsZXNcbiAgWm9kVHVwbGU6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RNYXA6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RGdW5jdGlvbjogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZExhenk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RQcm9taXNlOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kQW55OiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVW5rbm93bjogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFZvaWQ6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RQaXBlbGluZTogcGFyc2VQaXBlbGluZSxcbiAgWm9kUmVhZG9ubHk6IHBhcnNlUmVhZG9ubHksXG59XG50eXBlIFdvcmtlcktleXMgPSBrZXlvZiB0eXBlb2Ygd29ya2VyTWFwXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjaGVtYShcbiAgem9kUmVmOiBPcGVuQXBpWm9kQW55LFxuICB1c2VPdXRwdXQ/OiBib29sZWFuXG4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCB7IG1ldGFPcGVuQXBpID0ge30gfSA9IHpvZFJlZlxuICBjb25zdCBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W10gPSBbXG4gICAgLi4uKEFycmF5LmlzQXJyYXkobWV0YU9wZW5BcGkpID8gbWV0YU9wZW5BcGkgOiBbbWV0YU9wZW5BcGldKSxcbiAgXVxuICB0cnkge1xuICAgIGNvbnN0IHR5cGVOYW1lID0gem9kUmVmLl9kZWYudHlwZU5hbWUgYXMgV29ya2VyS2V5c1xuICAgIGlmICh0eXBlTmFtZSBpbiB3b3JrZXJNYXApIHtcbiAgICAgIHJldHVybiB3b3JrZXJNYXBbdHlwZU5hbWVdKHtcbiAgICAgICAgem9kUmVmOiB6b2RSZWYgYXMgbmV2ZXIsXG4gICAgICAgIHNjaGVtYXMsXG4gICAgICAgIHVzZU91dHB1dCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhdGNoQWxsUGFyc2VyKHsgem9kUmVmLCBzY2hlbWFzIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgIHJldHVybiBjYXRjaEFsbFBhcnNlcih7IHpvZFJlZiwgc2NoZW1hcyB9KVxuICB9XG59XG4iLCAiLyoqXG4gKiBGcm9udC1NYXR0ZXJcbiAqXG4gKiBWZW5kb3JlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qeHNvbi9mcm9udC1tYXR0ZXJcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgSmFzb24gQ2FtcGJlbGwgKFwiQXV0aG9yXCIpXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgeyBsb2FkIH0gZnJvbSBcImpzLXlhbWxcIlxuY29uc3Qgb3B0aW9uYWxCeXRlT3JkZXJNYXJrID0gXCJcXFxcdWZlZmY/XCJcbmNvbnN0IHBsYXRmb3JtID0gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgPyBwcm9jZXNzLnBsYXRmb3JtIDogXCJcIlxuY29uc3QgcGF0dGVybiA9XG4gIFwiXihcIiArXG4gIG9wdGlvbmFsQnl0ZU9yZGVyTWFyayArXG4gIFwiKD0geWFtbCA9fC0tLSlcIiArXG4gIFwiJChbXFxcXHNcXFxcU10qPylcIiArXG4gIFwiXig/OlxcXFwyfFxcXFwuXFxcXC5cXFxcLilcXFxccypcIiArXG4gIFwiJFwiICtcbiAgKHBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcIlxcXFxyP1wiIDogXCJcIikgK1xuICBcIig/OlxcXFxuKT8pXCJcbi8vIE5PVEU6IElmIHRoaXMgcGF0dGVybiB1c2VzIHRoZSAnZycgZmxhZyB0aGUgYHJlZ2V4YCB2YXJpYWJsZSBkZWZpbml0aW9uIHdpbGxcbi8vIG5lZWQgdG8gYmUgbW92ZWQgZG93biBpbnRvIHRoZSBmdW5jdGlvbnMgdGhhdCB1c2UgaXQuXG5jb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJtXCIpXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZyb250TWF0dGVyKFxuICBzdHJpbmc6IHN0cmluZyxcbiAgb3B0aW9ucyA9IHt9XG4pOiB7IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBib2R5OiBzdHJpbmc7IGJvZHlCZWdpbjogbnVtYmVyIH0ge1xuICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIlxuICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7IGFsbG93VW5zYWZlOiBmYWxzZSB9XG4gIG9wdGlvbnMgPVxuICAgIG9wdGlvbnMgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgID8geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9XG4gICAgICA6IGRlZmF1bHRPcHRpb25zXG4gIHZhciBsaW5lcyA9IHN0cmluZy5zcGxpdCgvKFxccj9cXG4pLylcbiAgaWYgKGxpbmVzWzBdICYmIC89IHlhbWwgPXwtLS0vLnRlc3QobGluZXNbMF0pKSB7XG4gICAgcmV0dXJuIHBhcnNlKHN0cmluZylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBib2R5OiBzdHJpbmcsXG4gICAgICBib2R5QmVnaW46IDEsXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVMb2NhdGlvbihtYXRjaDogUmVnRXhwRXhlY0FycmF5LCBib2R5OiBzdHJpbmcpIHtcbiAgdmFyIGxpbmUgPSAxXG4gIHZhciBwb3MgPSBib2R5LmluZGV4T2YoXCJcXG5cIilcbiAgdmFyIG9mZnNldCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXG5cbiAgd2hpbGUgKHBvcyAhPT0gLTEpIHtcbiAgICBpZiAocG9zID49IG9mZnNldCkge1xuICAgICAgcmV0dXJuIGxpbmVcbiAgICB9XG4gICAgbGluZSsrXG4gICAgcG9zID0gYm9keS5pbmRleE9mKFwiXFxuXCIsIHBvcyArIDEpXG4gIH1cblxuICByZXR1cm4gbGluZVxufVxuXG5mdW5jdGlvbiBwYXJzZShzdHJpbmc6IHN0cmluZyk6IHtcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgYm9keTogc3RyaW5nXG4gIGJvZHlCZWdpbjogbnVtYmVyXG59IHtcbiAgdmFyIG1hdGNoID0gcmVnZXguZXhlYyhzdHJpbmcpXG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBib2R5OiBzdHJpbmcsXG4gICAgICBib2R5QmVnaW46IDEsXG4gICAgfVxuICB9XG5cbiAgdmFyIHlhbWwgPSBtYXRjaFttYXRjaC5sZW5ndGggLSAxXS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBcIlwiKVxuICB2YXIgYXR0cmlidXRlcyA9IChsb2FkKHlhbWwpIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB2YXIgYm9keSA9IHN0cmluZy5yZXBsYWNlKG1hdGNoWzBdLCBcIlwiKVxuICB2YXIgbGluZSA9IGNvbXB1dGVMb2NhdGlvbihtYXRjaCwgc3RyaW5nKVxuXG4gIHJldHVybiB7XG4gICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICBib2R5OiBib2R5LFxuICAgIGJvZHlCZWdpbjogbGluZSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVzdEZyb250TWF0dGVyKHN0cmluZzogc3RyaW5nKSB7XG4gIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiXG5cbiAgcmV0dXJuIHJlZ2V4LnRlc3Qoc3RyaW5nKVxufVxuIiwgInR5cGUgUHJlZml4ZWRPYmplY3Q8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgYHgtJHtzdHJpbmcgJiBLfWBdOiBUW0tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVmaXhPYmplY3RLZXlzV2l0aFg8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVFxuKTogUHJlZml4ZWRPYmplY3Q8VD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtgeC0ke2tleX1gLCB2YWx1ZV0pXG4gICkgYXMgUHJlZml4ZWRPYmplY3Q8VD5cbn1cbiIsICJ0eXBlIFNuYWtlVG9EYXNoPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBzdHJpbmcgPyBTbmFrZVRvRGFzaFN0cmluZzxLPiA6IEtdOiBUW0tdXG59XG5cbnR5cGUgU25ha2VUb0Rhc2hTdHJpbmc8UyBleHRlbmRzIHN0cmluZz4gPSBTIGV4dGVuZHMgYCR7aW5mZXIgVH1fJHtpbmZlciBVfWBcbiAgPyBgJHtUfS0ke1NuYWtlVG9EYXNoU3RyaW5nPFU+fWBcbiAgOiBTXG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoaWZ5T2JqZWN0S2V5czxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQpOiBTbmFrZVRvRGFzaDxUPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleS5yZXBsYWNlKC9fL2csIFwiLVwiKSwgdmFsdWVdKVxuICApIGFzIFNuYWtlVG9EYXNoPFQ+XG59XG4iLCAiaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmZ1bmN0aW9uIGZpbmRLZXlJbk9iaihvYmo6IGFueSwgdmFsdWU6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmVzdWx0S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBfLmZvck93bihvYmosICh2LCBrKSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodikgJiYgXy5pc01hdGNoKHYsIHZhbHVlKSkge1xuICAgICAgcmVzdWx0S2V5ID0ga1xuICAgICAgLy8gU3RvcCB0aGUgaXRlcmF0aW9uXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0pXG4gIHJldHVybiByZXN1bHRLZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhvYmoxOiBhbnksIG9iajI6IGFueSk6IGFueSB7XG4gIHJldHVybiBfLnRyYW5zZm9ybShvYmoxLCAocmVzdWx0LCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ0tleSA9IGZpbmRLZXlJbk9iaihvYmoyLCB2YWx1ZSlcbiAgICAgIGlmIChtYXRjaGluZ0tleSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHtcbiAgICAgICAgICAkcmVmOiBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHttYXRjaGluZ0tleX1gLFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyh2YWx1ZSwgb2JqMilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBSb3V0ZVNwZWMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrTWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpXG4gIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cbiAgaWYgKGxhc3RQYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIGxhc3RQYXJ0LmVuZHNXaXRoKFwiXVwiKSkge1xuICAgIC8vIENvbnZlcnQgW3BhcmFtXSB0byBieV9wYXJhbVxuICAgIGNvbnN0IHBhcmFtID0gbGFzdFBhcnQuc2xpY2UoMSwgLTEpXG4gICAgcmV0dXJuIGBieV8ke3BhcmFtfWBcbiAgfVxuXG4gIHJldHVybiBsYXN0UGFydFxufVxuXG4vLyBmZXJuIGRvY3M6IGh0dHBzOi8vYnVpbGR3aXRoZmVybi5jb20vZG9jcy9zcGVjL2V4dGVuc2lvbnNcbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICByZXR1cm4gcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSlcbn1cblxuZnVuY3Rpb24gZ2V0RmVyblNka01ldGFkYXRhKFxuICBwYXRoOiBzdHJpbmcsXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbik6XG4gIHwge1xuICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWVcbiAgICB9XG4gIHwge1xuICAgICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogc3RyaW5nW11cbiAgICAgIFwieC1mZXJuLXNkay1tZXRob2QtbmFtZVwiOiBzdHJpbmdcbiAgICB9IHtcbiAgaWYgKHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIikubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka0dyb3VwTmFtZShwYXRoKSxcbiAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aCksXG4gICAgLi4uKHNka1JldHVyblZhbHVlXG4gICAgICA/IHtcbiAgICAgICAgICBcIngtZmVybi1zZGstcmV0dXJuLXZhbHVlXCI6IHNka1JldHVyblZhbHVlLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKHtcbiAgbWV0aG9kcyxcbiAgcGF0aCxcbiAgc2RrUmV0dXJuVmFsdWUsXG59OiB7XG4gIG1ldGhvZHM6IFJvdXRlU3BlY1tcIm1ldGhvZHNcIl1cbiAgcGF0aDogc3RyaW5nXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbn0pIHtcbiAgY29uc3QgZmVyblNka01ldGFkYXRhID0gZ2V0RmVyblNka01ldGFkYXRhKHBhdGgsIHNka1JldHVyblZhbHVlKVxuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW21ldGhvZHNbMF1dOiBmZXJuU2RrTWV0YWRhdGEsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWFwcGVkTWV0aG9kcyA9IHt9XG5cbiAgbWV0aG9kcy5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0gZmVyblNka01ldGFkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcHBlZE1ldGhvZHNbbWV0aG9kXSA9IHtcbiAgICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWUsXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBtYXBwZWRNZXRob2RzXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgcGFyc2VSb3V0ZXNJblBhY2thZ2UgfSBmcm9tIFwiLi4vbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlXCJcbmltcG9ydCB7IHpvZFRvVHMsIHByaW50Tm9kZSB9IGZyb20gXCIuLi9saWIvem9kLXRvLXRzXCJcbmltcG9ydCBwcmV0dGllciBmcm9tIFwicHJldHRpZXJcIlxuaW1wb3J0IHsgeiwgWm9kRWZmZWN0cywgWm9kT3B0aW9uYWwgfSBmcm9tIFwiem9kXCJcblxuaW50ZXJmYWNlIEdlbmVyYXRlUm91dGVUeXBlc09wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgb25seSByb3V0ZXMgdGhhdCByZXR1cm4gdHJ1ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqL1xuICBmaWx0ZXJSb3V0ZXM/OiAocm91dGU6IHN0cmluZykgPT4gYm9vbGVhblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgcm91dGVzIHRoYXQgaGF2ZSBgZXhjbHVkZUZyb21PcGVuQXBpYCBzZXQgdG8gdHJ1ZSB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmNsdWRlIHRoZW0uXG4gICAqL1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3V0ZVR5cGVzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgZmlsZXBhdGhUb1JvdXRlID0gYXdhaXQgcGFyc2VSb3V0ZXNJblBhY2thZ2Uob3B0cylcblxuICBjb25zdCBzb3J0ZWRSb3V0ZXMgPSBBcnJheS5mcm9tKGZpbGVwYXRoVG9Sb3V0ZS5lbnRyaWVzKCkpLnNvcnQoKGEsIGIpID0+XG4gICAgYVsxXS5yb3V0ZS5sb2NhbGVDb21wYXJlKGJbMV0ucm91dGUpXG4gIClcbiAgY29uc3QgZmlsdGVyZWRSb3V0ZXMgPSBzb3J0ZWRSb3V0ZXMuZmlsdGVyKFxuICAgIChbXywgeyByb3V0ZSB9XSkgPT4gIW9wdHMuZmlsdGVyUm91dGVzIHx8IG9wdHMuZmlsdGVyUm91dGVzKHJvdXRlKVxuICApXG5cbiAgLy8gVE9ETyB3aGVuIGxlc3MgbGF6eSwgdXNlIHRzLW1vcnBoIGZvciBiZXR0ZXIgZ2VuZXJhdGlvblxuICBjb25zdCByb3V0ZURlZnM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBbXywgeyByb3V0ZSwgcm91dGVTcGVjLCBzZXR1cFBhcmFtcyB9XSBvZiBmaWx0ZXJlZFJvdXRlcykge1xuICAgIGNvbnN0IHF1ZXJ5S2V5cyA9IE9iamVjdC5rZXlzKHJvdXRlU3BlYy5xdWVyeVBhcmFtcz8uc2hhcGUgPz8ge30pXG4gICAgY29uc3QgcGF0aFBhcmFtZXRlcnMgPSBxdWVyeUtleXMuZmlsdGVyKChrZXkpID0+IHJvdXRlLmluY2x1ZGVzKGBbJHtrZXl9XWApKVxuXG4gICAgLy8gcXVlcnlQYXJhbXMgbWlnaHQgYmUgYSBab2RFZmZlY3RzIG9yIFpvZE9wdGlvbmFsIGluIHNvbWUgY2FzZXNcbiAgICBsZXQgcXVlcnlQYXJhbXMgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICB3aGlsZSAoXG4gICAgICBxdWVyeVBhcmFtcyAmJlxuICAgICAgKFwic291cmNlVHlwZVwiIGluIHF1ZXJ5UGFyYW1zIHx8IFwidW53cmFwXCIgaW4gcXVlcnlQYXJhbXMpXG4gICAgKSB7XG4gICAgICBpZiAoXCJzb3VyY2VUeXBlXCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgYXMgdW5rbm93biBhcyBab2RFZmZlY3RzPGFueT4pLnNvdXJjZVR5cGUoKVxuICAgICAgfSBlbHNlIGlmIChcInVud3JhcFwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIHVua25vd24gYXMgWm9kT3B0aW9uYWw8YW55PikudW53cmFwKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocXVlcnlQYXJhbXMgJiYgXCJvbWl0XCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXMub21pdChcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKHBhdGhQYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IFtwYXJhbSwgdHJ1ZV0pKVxuICAgICAgKVxuICAgIH1cblxuICAgIHJvdXRlRGVmcy5wdXNoKFxuICAgICAgYFxuXCIke3JvdXRlfVwiOiB7XG4gIHJvdXRlOiBcIiR7cm91dGV9XCIsXG4gIG1ldGhvZDogJHtyb3V0ZVNwZWMubWV0aG9kcy5tYXAoKG0pID0+IGBcIiR7bX1cImApLmpvaW4oXCIgfCBcIil9LFxuICBxdWVyeVBhcmFtczogJHtxdWVyeVBhcmFtcyA/IHByaW50Tm9kZSh6b2RUb1RzKHF1ZXJ5UGFyYW1zKS5ub2RlKSA6IFwie31cIn0sXG4gIGpzb25Cb2R5OiAke1xuICAgIHJvdXRlU3BlYy5qc29uQm9keSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5qc29uQm9keSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAgY29tbW9uUGFyYW1zOiAke1xuICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmNvbW1vblBhcmFtcykubm9kZSlcbiAgICAgIDogXCJ7fVwiXG4gIH0sXG4gIGZvcm1EYXRhOiAke1xuICAgIHJvdXRlU3BlYy5mb3JtRGF0YSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5mb3JtRGF0YSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAganNvblJlc3BvbnNlOiAke1xuICAgIHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgID8gcHJpbnROb2RlKFxuICAgICAgICAgIHpvZFRvVHMoXG4gICAgICAgICAgICBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1cyAmJlxuICAgICAgICAgICAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgICAgPyByb3V0ZVNwZWMuanNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgICA6IHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgICAgICApLm5vZGVcbiAgICAgICAgKVxuICAgICAgOiBcInt9XCJcbiAgfVxufWAudHJpbSgpXG4gICAgKVxuICB9XG4gIGNvbnN0IHJvdXRlRGVmU3RyID0gcm91dGVEZWZzLmpvaW4oXCIsXFxuXCIpXG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHByZXR0aWVyLmZvcm1hdChcbiAgICBgZXhwb3J0IHR5cGUgUm91dGVzID0ge1xuJHtyb3V0ZURlZlN0cn1cbn1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXNwb25zZTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25SZXNwb25zZVwiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RCb2R5PFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvbkJvZHlcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0UGFyYW1zPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wicXVlcnlQYXJhbXNcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cbmAudHJpbSgpLFxuICAgIHsgc2VtaTogZmFsc2UsIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIgfVxuICApXG5cbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvcHRzLm91dHB1dEZpbGUsIG91dHB1dClcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cbiIsICIvKipcbiAqIFpvZCBUbyBUU1xuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NhY2hpbnJhamEvem9kLXRvLXRzXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgU2FjaGluIFJhamFcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5pbXBvcnQgeyBab2RUeXBlLCBab2RUeXBlQW55IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQgeyBwYXJzZUZyb250TWF0dGVyLCB0ZXN0RnJvbnRNYXR0ZXIgfSBmcm9tIFwiLi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcblxuY29uc3QgeyBmYWN0b3J5OiBmLCBTeW50YXhLaW5kLCBTY3JpcHRLaW5kLCBTY3JpcHRUYXJnZXQsIEVtaXRIaW50IH0gPSB0c1xuXG5jb25zdCBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UgPSAoXG4gIGlkZW50aWZpZXI6IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuKSA9PiB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIoaWRlbnRpZmllcikpIHtcbiAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShpZGVudGlmaWVyKVxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJcbn1cblxuY29uc3QgY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcgPSAoaWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKSlcblxuY29uc3QgY3JlYXRlVW5rbm93bktleXdvcmROb2RlID0gKCkgPT5cbiAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Vbmtub3duS2V5d29yZClcblxuZXhwb3J0IGNvbnN0IHByaW50Tm9kZSA9IChcbiAgbm9kZTogdHMuTm9kZSxcbiAgcHJpbnRlck9wdGlvbnM/OiB0cy5QcmludGVyT3B0aW9uc1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgXCJwcmludC50c1wiLFxuICAgIFwiXCIsXG4gICAgU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICBmYWxzZSxcbiAgICBTY3JpcHRLaW5kLlRTXG4gIClcbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIocHJpbnRlck9wdGlvbnMpXG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZShFbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSlcbn1cblxuY29uc3QgaWRlbnRpZmllclJFID0gL15bJEEtWl9hLXpdW1xcdyRdKiQvXG5cbmNvbnN0IGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwgPSAoc3RyaW5nXzogc3RyaW5nKSA9PiB7XG4gIGlmIChpZGVudGlmaWVyUkUudGVzdChzdHJpbmdfKSkge1xuICAgIHJldHVybiBmLmNyZWF0ZUlkZW50aWZpZXIoc3RyaW5nXylcbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwoc3RyaW5nXylcbn1cblxuY29uc3QgYWRkSnNEb2NDb21tZW50ID0gKG5vZGU6IHRzLk5vZGUsIHRleHQ6IHN0cmluZykgPT4ge1xuICBjb25zdCB7IGRlc2NyaXB0aW9uLCBkZXByZWNhdGVkIH0gPSBwYXJzZURlc2NyaXB0aW9uKHRleHQpXG5cbiAgbGV0IGNvbW1lbnQgPSBgKiAke2Rlc2NyaXB0aW9ufWBcbiAgaWYgKGRlcHJlY2F0ZWQpIHtcbiAgICBjb21tZW50ICs9IGBcXG4gKiBAZGVwcmVjYXRlZCAke1xuICAgICAgdHlwZW9mIGRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIgPyBkZXByZWNhdGVkIDogXCJcIlxuICAgIH1gXG4gIH0gZWxzZSB7XG4gICAgY29tbWVudCArPSBgIGBcbiAgfVxuXG4gIHRzLmFkZFN5bnRoZXRpY0xlYWRpbmdDb21tZW50KFxuICAgIG5vZGUsXG4gICAgU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhLFxuICAgIGNvbW1lbnQsXG4gICAgdHJ1ZVxuICApXG59XG5cbnR5cGUgUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgZGVwcmVjYXRlZD86IGJvb2xlYW4gfCBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5mdW5jdGlvbiBwYXJzZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQYXJzZWREZXNjcmlwdGlvbiB7XG4gIGlmICghZGVzY3JpcHRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgIH1cbiAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSByZXR1cm4geyBkZXNjcmlwdGlvbiB9XG4gIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gIGNvbnN0IG91dHB1dDogUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gICAgZGVzY3JpcHRpb246IGJvZHkudHJpbSgpLFxuICB9XG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIiAmJiBhdHRyaWJ1dGVzICE9PSBudWxsKSB7XG4gICAgaWYgKFwiZGVwcmVjYXRlZFwiIGluIGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5kZXByZWNhdGVkKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPVxuICAgICAgICAgIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZC5sZW5ndGggPiAwID8gYXR0cmlidXRlcy5kZXByZWNhdGVkIDogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJkZXNjcmlwdGlvblwiIHx8IGtleSA9PT0gXCJkZXByZWNhdGVkXCIpIGNvbnRpbnVlXG4gICAgICBvdXRwdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXRcbn1cblxudHlwZSBMaXRlcmFsVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cblxudHlwZSBab2RUb1RzT3B0aW9ucyA9IHtcbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBgbmF0aXZlRW51bXNgIGluc3RlYWQgKi9cbiAgcmVzb2x2ZU5hdGl2ZUVudW1zPzogYm9vbGVhblxuICBuYXRpdmVFbnVtcz86IFwiaWRlbnRpZmllclwiIHwgXCJyZXNvbHZlXCIgfCBcInVuaW9uXCJcbn1cblxuY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAocmF3PzogWm9kVG9Uc09wdGlvbnMpID0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7XG4gICAgbmF0aXZlRW51bXM6IHJhdz8ucmVzb2x2ZU5hdGl2ZUVudW1zID8gXCJyZXNvbHZlXCIgOiBcImlkZW50aWZpZXJcIixcbiAgfVxuXG4gIHJldHVybiB7IC4uLnJlc29sdmVkLCAuLi5yYXcgfVxufVxuXG50eXBlIFJlc29sdmVkWm9kVG9Uc09wdGlvbnMgPSBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlT3B0aW9ucz5cblxudHlwZSBab2RUb1RzU3RvcmUgPSB7XG4gIG5hdGl2ZUVudW1zOiB0cy5FbnVtRGVjbGFyYXRpb25bXVxufVxuXG50eXBlIFpvZFRvVHNSZXR1cm4gPSB7XG4gIG5vZGU6IHRzLlR5cGVOb2RlXG4gIHN0b3JlOiBab2RUb1RzU3RvcmVcbn1cblxudHlwZSBHZXRUeXBlRnVuY3Rpb24gPSAoXG4gIHR5cGVzY3JpcHQ6IHR5cGVvZiB0cyxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuXG50eXBlIEdldFR5cGUgPSB7IF9kZWY6IHsgZ2V0VHlwZT86IEdldFR5cGVGdW5jdGlvbiB9IH1cblxuY29uc3QgY2FsbEdldFR5cGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgbGV0IHR5cGU6IFJldHVyblR5cGU8R2V0VHlwZUZ1bmN0aW9uPiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGdldFR5cGVTY2hlbWEgPSB6b2QgYXMgR2V0VHlwZVxuICAvLyB0aGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhY2Nlc3NpbmcgJ3R5cGUnXG4gIGlmIChnZXRUeXBlU2NoZW1hLl9kZWYuZ2V0VHlwZSlcbiAgICB0eXBlID0gZ2V0VHlwZVNjaGVtYS5fZGVmLmdldFR5cGUodHMsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIHJldHVybiB0eXBlXG59XG5cbmV4cG9ydCBjb25zdCB6b2RUb1RzID0gKFxuICB6b2Q6IFpvZFR5cGVBbnksXG4gIGlkZW50aWZpZXI/OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBab2RUb1RzT3B0aW9uc1xuKTogWm9kVG9Uc1JldHVybiA9PiB7XG4gIGlmICghKHpvZCBpbnN0YW5jZW9mIFpvZFR5cGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpLFxuICAgICAgc3RvcmU6IHsgbmF0aXZlRW51bXM6IFtdIH0sXG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc29sdmVkSWRlbnRpZmllciA9IGlkZW50aWZpZXIgPz8gXCJJZGVudGlmaWVyXCJcblxuICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhvcHRpb25zKVxuXG4gIGNvbnN0IHN0b3JlOiBab2RUb1RzU3RvcmUgPSB7IG5hdGl2ZUVudW1zOiBbXSB9XG5cbiAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKHpvZCwgcmVzb2x2ZWRJZGVudGlmaWVyLCBzdG9yZSwgcmVzb2x2ZWRPcHRpb25zKVxuXG4gIHJldHVybiB7IG5vZGUsIHN0b3JlIH1cbn1cblxuY29uc3Qgem9kVG9Uc05vZGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBzdG9yZTogWm9kVG9Uc1N0b3JlLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgY29uc3QgdHlwZU5hbWUgPSB6b2QuX2RlZi50eXBlTmFtZVxuXG4gIGNvbnN0IGdldFR5cGVUeXBlID0gY2FsbEdldFR5cGUoem9kLCBpZGVudGlmaWVyLCBvcHRpb25zKVxuICAvLyBzcGVjaWFsIGNhc2UgbmF0aXZlIGVudW0sIHdoaWNoIG5lZWRzIGFuIGlkZW50aWZpZXIgbm9kZVxuICBpZiAoZ2V0VHlwZVR5cGUgJiYgdHlwZU5hbWUgIT09IFwiWm9kTmF0aXZlRW51bVwiKSB7XG4gICAgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZShnZXRUeXBlVHlwZSlcbiAgfVxuXG4gIGNvbnN0IG90aGVyQXJndW1lbnRzID0gW2lkZW50aWZpZXIsIHN0b3JlLCBvcHRpb25zXSBhcyBjb25zdFxuXG4gIHN3aXRjaCAodHlwZU5hbWUpIHtcbiAgICBjYXNlIFwiWm9kU3RyaW5nXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlN0cmluZ0tleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROdW1iZXJcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuTnVtYmVyS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZEJpZ0ludFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5CaWdJbnRLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQm9vbGVhblwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZERhdGVcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiRGF0ZVwiKSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZFVuZGVmaW5lZFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTnVsbFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpXG4gICAgfVxuICAgIGNhc2UgXCJab2RWb2lkXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlZvaWRLZXl3b3JkKSxcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKSxcbiAgICAgIF0pXG4gICAgfVxuICAgIGNhc2UgXCJab2RBbnlcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQW55S2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZFVua25vd25cIjoge1xuICAgICAgcmV0dXJuIGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROZXZlclwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5OZXZlcktleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RMYXp5XCI6IHtcbiAgICAgIC8vIGl0IGlzIGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGxhenkgdmFsdWUgaXMgcmVmZXJyaW5nIHRvXG4gICAgICAvLyBzbyB3ZSBmb3JjZSB0aGUgdXNlciB0byBkZWNsYXJlIGl0XG4gICAgICBpZiAoIWdldFR5cGVUeXBlKSByZXR1cm4gY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcoaWRlbnRpZmllcilcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgXCJab2RMaXRlcmFsXCI6IHtcbiAgICAgIC8vIHoubGl0ZXJhbCgnaGknKSAtPiAnaGknXG4gICAgICBsZXQgbGl0ZXJhbDogdHMuTGl0ZXJhbEV4cHJlc3Npb24gfCB0cy5Cb29sZWFuTGl0ZXJhbFxuXG4gICAgICBjb25zdCBsaXRlcmFsVmFsdWUgPSB6b2QuX2RlZi52YWx1ZSBhcyBMaXRlcmFsVHlwZVxuICAgICAgc3dpdGNoICh0eXBlb2YgbGl0ZXJhbFZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjoge1xuICAgICAgICAgIGxpdGVyYWwgPSBmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKGxpdGVyYWxWYWx1ZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6IHtcbiAgICAgICAgICBsaXRlcmFsID0gbGl0ZXJhbFZhbHVlID09PSB0cnVlID8gZi5jcmVhdGVUcnVlKCkgOiBmLmNyZWF0ZUZhbHNlKClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBsaXRlcmFsID0gZi5jcmVhdGVTdHJpbmdMaXRlcmFsKGxpdGVyYWxWYWx1ZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShsaXRlcmFsKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kT2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZW50cmllcyh6b2QuX2RlZi5zaGFwZSgpKVxuXG4gICAgICBjb25zdCBtZW1iZXJzOiB0cy5UeXBlRWxlbWVudFtdID0gcHJvcGVydGllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBuZXh0Wm9kTm9kZSA9IHZhbHVlIGFzIFpvZFR5cGVBbnlcbiAgICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKG5leHRab2ROb2RlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgICBjb25zdCB7IHR5cGVOYW1lOiBuZXh0Wm9kTm9kZVR5cGVOYW1lIH0gPSBuZXh0Wm9kTm9kZS5fZGVmXG4gICAgICAgIGNvbnN0IGlzT3B0aW9uYWwgPVxuICAgICAgICAgIG5leHRab2ROb2RlVHlwZU5hbWUgPT09IFwiWm9kT3B0aW9uYWxcIiB8fCBuZXh0Wm9kTm9kZS5pc09wdGlvbmFsKClcblxuICAgICAgICBjb25zdCBwcm9wZXJ0eVNpZ25hdHVyZSA9IGYuY3JlYXRlUHJvcGVydHlTaWduYXR1cmUoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwoa2V5KSxcbiAgICAgICAgICBpc09wdGlvbmFsID8gZi5jcmVhdGVUb2tlbihTeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHR5cGVcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChuZXh0Wm9kTm9kZS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIGFkZEpzRG9jQ29tbWVudChwcm9wZXJ0eVNpZ25hdHVyZSwgbmV4dFpvZE5vZGUuZGVzY3JpcHRpb24pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvcGVydHlTaWduYXR1cmVcbiAgICAgIH0pXG4gICAgICByZXR1cm4gZi5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUobWVtYmVycylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kQXJyYXlcIjoge1xuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlQXJyYXlUeXBlTm9kZSh0eXBlKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRW51bVwiOiB7XG4gICAgICAvLyB6LmVudW1bJ2EnLCAnYicsICdjJ10gLT4gJ2EnIHwgJ2InIHwgJ2NcbiAgICAgIGNvbnN0IHR5cGVzID0gem9kLl9kZWYudmFsdWVzLm1hcCgodmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFVuaW9uXCI6IHtcbiAgICAgIC8vIHoudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSAtPiBzdHJpbmcgfCBudW1iZXJcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFpvZFR5cGVBbnlbXSA9IHpvZC5fZGVmLm9wdGlvbnNcbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiOiB7XG4gICAgICAvLyB6LmRpc2NyaW1pbmF0ZWRVbmlvbigna2luZCcsIFt6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYScpLCBhOiB6LnN0cmluZygpIH0pLCB6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYicpLCBiOiB6Lm51bWJlcigpIH0pXSkgLT4geyBraW5kOiAnYScsIGE6IHN0cmluZyB9IHwgeyBraW5kOiAnYicsIGI6IG51bWJlciB9XG4gICAgICBjb25zdCBvcHRpb25zOiBab2RUeXBlQW55W10gPSBbLi4uem9kLl9kZWYub3B0aW9ucy52YWx1ZXMoKV1cbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEVmZmVjdHNcIjoge1xuICAgICAgLy8gaWdub3JlIGFueSBlZmZlY3RzLCB0aGV5IHdvbid0IGZhY3RvciBpbnRvIHRoZSB0eXBlc1xuICAgICAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5zY2hlbWEsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROYXRpdmVFbnVtXCI6IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlVHlwZVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJ1bmlvblwiKSB7XG4gICAgICAgIC8vIGFsbG93IG92ZXJyaWRpbmcgd2l0aCB0aGlzIG9wdGlvblxuICAgICAgICBpZiAodHlwZSkgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuXG4gICAgICAgIGNvbnN0IHR5cGVzID0gT2JqZWN0LnZhbHVlcyh6b2QuX2RlZi52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdW1lcmljTGl0ZXJhbCh2YWx1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUgYXMgc3RyaW5nKSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICAgIH1cblxuICAgICAgLy8gei5uYXRpdmVFbnVtKEZydWl0cykgLT4gRnJ1aXRzXG4gICAgICAvLyBjYW4gcmVzb2x2ZSBGcnVpdHMgaW50byBzdG9yZSBhbmQgdXNlciBjYW4gaGFuZGxlIGVudW1zXG4gICAgICBpZiAoIXR5cGUpIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJyZXNvbHZlXCIpIHtcbiAgICAgICAgY29uc3QgZW51bU1lbWJlcnMgPSBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICB6b2QuX2RlZi52YWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuICAgICAgICApLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGl0ZXJhbCA9XG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgPyBmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKHZhbHVlKVxuICAgICAgICAgICAgICA6IGYuY3JlYXRlU3RyaW5nTGl0ZXJhbCh2YWx1ZSlcblxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUVudW1NZW1iZXIoZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbChrZXkpLCBsaXRlcmFsKVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIodHlwZSkpIHtcbiAgICAgICAgICBzdG9yZS5uYXRpdmVFbnVtcy5wdXNoKFxuICAgICAgICAgICAgZi5jcmVhdGVFbnVtRGVjbGFyYXRpb24odW5kZWZpbmVkLCB0eXBlLCBlbnVtTWVtYmVycylcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2dldFR5cGUgb24gbmF0aXZlRW51bSBtdXN0IHJldHVybiBhbiBpZGVudGlmaWVyIHdoZW4gbmF0aXZlRW51bXMgaXMgXCJyZXNvbHZlXCInXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UodHlwZSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kT3B0aW9uYWxcIjoge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVG9Uc05vZGUoXG4gICAgICAgIHpvZC5fZGVmLmlubmVyVHlwZSxcbiAgICAgICAgLi4ub3RoZXJBcmd1bWVudHNcbiAgICAgICkgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCksXG4gICAgICBdKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROdWxsYWJsZVwiOiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpLFxuICAgICAgXSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kVHVwbGVcIjoge1xuICAgICAgLy8gei50dXBsZShbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pIC0+IFtzdHJpbmcsIG51bWJlcl1cbiAgICAgIGNvbnN0IHR5cGVzID0gem9kLl9kZWYuaXRlbXMubWFwKChvcHRpb246IFpvZFR5cGVBbnkpID0+XG4gICAgICAgIHpvZFRvVHNOb2RlKG9wdGlvbiwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICApXG4gICAgICByZXR1cm4gZi5jcmVhdGVUdXBsZVR5cGVOb2RlKHR5cGVzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RSZWNvcmRcIjoge1xuICAgICAgLy8gei5yZWNvcmQoei5udW1iZXIoKSkgLT4geyBbeDogc3RyaW5nXTogbnVtYmVyIH1cbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVMaXRlcmFsTm9kZShbXG4gICAgICAgIGYuY3JlYXRlSW5kZXhTaWduYXR1cmUoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGYuY3JlYXRlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBmLmNyZWF0ZUlkZW50aWZpZXIoXCJ4XCIpLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSxcbiAgICAgICAgICB2YWx1ZVR5cGVcbiAgICAgICAgKSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE1hcFwiOiB7XG4gICAgICAvLyB6Lm1hcCh6LnN0cmluZygpKSAtPiBNYXA8c3RyaW5nPlxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIGNvbnN0IGtleVR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5rZXlUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiTWFwXCIpLCBbXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFNldFwiOiB7XG4gICAgICAvLyB6LnNldCh6LnN0cmluZygpKSAtPiBTZXQ8c3RyaW5nPlxuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlNldFwiKSwgW3R5cGVdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kSW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIC8vIHoubnVtYmVyKCkuYW5kKHouc3RyaW5nKCkpIC0+IG51bWJlciAmIHN0cmluZ1xuICAgICAgY29uc3QgbGVmdCA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLmxlZnQsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3QgcmlnaHQgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5yaWdodCwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVJbnRlcnNlY3Rpb25UeXBlTm9kZShbbGVmdCwgcmlnaHRdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kUHJvbWlzZVwiOiB7XG4gICAgICAvLyB6LnByb21pc2Uoei5zdHJpbmcoKSkgLT4gUHJvbWlzZTxzdHJpbmc+XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlByb21pc2VcIiksIFtcbiAgICAgICAgdHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEZ1bmN0aW9uXCI6IHtcbiAgICAgIC8vIHouZnVuY3Rpb24oKS5hcmdzKHouc3RyaW5nKCkpLnJldHVybnMoei5udW1iZXIoKSkgLT4gKGFyZ3NfMDogc3RyaW5nKSA9PiBudW1iZXJcbiAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZXMgPSB6b2QuX2RlZi5hcmdzLl9kZWYuaXRlbXMubWFwKFxuICAgICAgICAoYXJndW1lbnQ6IFpvZFR5cGVBbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBhcmd1bWVudFR5cGUgPSB6b2RUb1RzTm9kZShhcmd1bWVudCwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2luZGV4fWApLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJndW1lbnRUeXBlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICApIGFzIHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uW11cblxuICAgICAgYXJndW1lbnRUeXBlcy5wdXNoKFxuICAgICAgICBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuRG90RG90RG90VG9rZW4pLFxuICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2FyZ3VtZW50VHlwZXMubGVuZ3RofWApLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZUFycmF5VHlwZU5vZGUoY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCkpXG4gICAgICAgIClcbiAgICAgIClcblxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnJldHVybnMsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVGdW5jdGlvblR5cGVOb2RlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGFyZ3VtZW50VHlwZXMsXG4gICAgICAgIHJldHVyblR5cGVcbiAgICAgIClcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRGVmYXVsdFwiOiB7XG4gICAgICAvLyB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVmYXVsdCgnaGknKSAtPiBzdHJpbmdcbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZE5vZGVzOiB0cy5Ob2RlW10gPSBbXVxuXG4gICAgICB0eXBlLmZvckVhY2hDaGlsZCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAoIVtTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmRdLmluY2x1ZGVzKG5vZGUua2luZCkpIHtcbiAgICAgICAgICBmaWx0ZXJlZE5vZGVzLnB1c2gobm9kZSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkZWQgdG8gc2V0IGNoaWxkcmVuXG4gICAgICB0eXBlLnR5cGVzID0gZmlsdGVyZWROb2Rlc1xuXG4gICAgICByZXR1cm4gdHlwZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkFueUtleXdvcmQpXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBQcm9qZWN0LCBTeW50YXhLaW5kIH0gZnJvbSBcInRzLW1vcnBoXCJcbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSBcImVzYnVpbGRcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9saWIvZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGVcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBhbGxvd2VkSW1wb3J0UGF0dGVybnM/OiBzdHJpbmdbXVxuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG4gIGVzYnVpbGRPcHRpb25zPzogZXNidWlsZC5CdWlsZE9wdGlvbnNcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RSb3V0ZVNwZWNzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgeyBwYWNrYWdlRGlyLCBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIgfSA9IG9wdHNcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuXG4gIGNvbnN0IHByb2plY3QgPSBuZXcgUHJvamVjdCh7IGNvbXBpbGVyT3B0aW9uczogeyBkZWNsYXJhdGlvbjogdHJ1ZSB9IH0pXG5cbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKGZ1bGxQYXRoR2xvYikpIHtcbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gc291cmNlRmlsZS5nZXRFeHBvcnRBc3NpZ25tZW50KFxuICAgICAgKGQpID0+ICFkLmlzRXhwb3J0RXF1YWxzKClcbiAgICApXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCA9IGRlZmF1bHRFeHBvcnRcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIWN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgd2l0aFJvdXRlU3BlY0NhbGwgPSBjdXJyaWVkV2l0aFJvdXRlU3BlY0NhbGxcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIXdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IFtyb3V0ZVNwZWNdID0gd2l0aFJvdXRlU3BlY0NhbGwuZ2V0QXJndW1lbnRzKClcbiAgICBpZiAoIXJvdXRlU3BlYykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBzb3VyY2VGaWxlLmFkZFN0YXRlbWVudHMoXG4gICAgICBgZXhwb3J0IGNvbnN0IGV4dHJhY3RlZFJvdXRlU3BlYyA9ICR7cm91dGVTcGVjLmdldFRleHQoKX1gXG4gICAgKVxuXG4gICAgZGVmYXVsdEV4cG9ydC5yZW1vdmUoKVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB1bnVzZWQgaW1wb3J0cyBzbyBmaWxlIGNhbiBiZSB0cmVlIHNoYWtlblxuICAgIC8vIChBc3N1bWVzIGFsbCBpbXBvcnRzIGFyZSBmcmVlIG9mIHNpZGUtZWZmZWN0cylcbiAgICBsZXQgbGFzdFdpZHRoOiBudW1iZXJcbiAgICBkbyB7XG4gICAgICBsYXN0V2lkdGggPSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpXG4gICAgICAvLyBNYXkgbmVlZCB0byBjYWxsIHRoaXMgbXVsdGlwbGUgdGltZXNcbiAgICAgIHNvdXJjZUZpbGUuZml4VW51c2VkSWRlbnRpZmllcnMoKVxuICAgIH0gd2hpbGUgKGxhc3RXaWR0aCAhPT0gc291cmNlRmlsZS5nZXRGdWxsV2lkdGgoKSlcblxuICAgIGNvbnN0IGFic29sdXRlUGFja2FnZURpciA9IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKVxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICBhYnNvbHV0ZVBhY2thZ2VEaXIsXG4gICAgICBzb3VyY2VGaWxlLmdldEZpbGVQYXRoKClcbiAgICApXG4gICAgcGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpXG4gIH1cblxuICBjb25zdCBwYXRoVG9JZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgIC8vIGFkZCBwcmVmaXggdG8gYXZvaWQgc3RhcnRpbmcgd2l0aCBhIG51bWJlclxuICAgIHBhdGhUb0lkW3BhdGhdID1cbiAgICAgIFwiaGFzaFwiICsgY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKHBhdGgpLmRpZ2VzdChcImhleFwiKVxuICB9XG5cbiAgY29uc3QgZW50cnlQb2ludENvbnRlbnQgPSBgXG4gICR7cGF0aHNcbiAgICAubWFwKChwKSA9PiBgaW1wb3J0IHtleHRyYWN0ZWRSb3V0ZVNwZWMgYXMgJHtwYXRoVG9JZFtwXX19IGZyb20gXCIuLyR7cH1cImApXG4gICAgLmpvaW4oXCJcXG5cIil9XG5cbiAgZXhwb3J0IGNvbnN0IHJvdXRlcyA9IHtcbiAgICAke3BhdGhzXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IGh0dHBSb3V0ZSA9IChcbiAgICAgICAgICBvcHRzLm1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPz9cbiAgICAgICAgICBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeClcbiAgICAgICAgKShwKVxuXG4gICAgICAgIHJldHVybiBgXCIke2h0dHBSb3V0ZX1cIjogJHtwYXRoVG9JZFtwXX1gXG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIsXFxuXCIpfVxuICB9XG4gIGBcblxuICAvLyBDb3B5IGFsbG93ZWQgaW1wb3J0IGdsb2JzIGludG8gcHJvamVjdFxuICBpZiAob3B0cy5hbGxvd2VkSW1wb3J0UGF0dGVybnMpIHtcbiAgICBwcm9qZWN0LmFkZFNvdXJjZUZpbGVzQXRQYXRocyhvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucylcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIHR5cGVzICguZC50cylcbiAgY29uc3QgZW50cnlQb2ludCA9IHByb2plY3QuY3JlYXRlU291cmNlRmlsZShcbiAgICBcImV4dHJhY3RlZC1yb3V0ZS1zcGVjcy50c1wiLFxuICAgIGVudHJ5UG9pbnRDb250ZW50XG4gIClcbiAgY29uc3QgZW1pdFJlc3VsdCA9IGVudHJ5UG9pbnQuZ2V0RW1pdE91dHB1dCh7IGVtaXRPbmx5RHRzRmlsZXM6IHRydWUgfSlcbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwYXRoLmRpcm5hbWUob3B0cy5vdXRwdXRGaWxlKSxcbiAgICAgIHBhdGguYmFzZW5hbWUob3B0cy5vdXRwdXRGaWxlKS5yZXBsYWNlKFwiLm1qc1wiLCBcIlwiKS5yZXBsYWNlKFwiLmpzXCIsIFwiXCIpICtcbiAgICAgICAgXCIuZC50c1wiXG4gICAgKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgIGRlY2xhcmF0aW9uRmlsZVBhdGgsXG4gICAgICBlbWl0UmVzdWx0LmdldE91dHB1dEZpbGVzKClbMF0uZ2V0VGV4dCgpXG4gICAgKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdmFsdWVzICguanMpXG4gIGNvbnN0IHBrZ1JhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihwYWNrYWdlRGlyLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICBcInV0Zi04XCJcbiAgKVxuICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHBrZ1JhdylcblxuICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAuLi5vcHRzLmVzYnVpbGRPcHRpb25zLFxuICAgIHN0ZGluOiB7XG4gICAgICBjb250ZW50czogZW50cnlQb2ludENvbnRlbnQsXG4gICAgICByZXNvbHZlRGlyOiBwYXRoLnJlc29sdmUocGFja2FnZURpciksXG4gICAgfSxcbiAgICBvdXRmaWxlOiBvcHRzLm91dHB1dEZpbGUsXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgICBmb3JtYXQ6IFwiZXNtXCIsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgZXh0ZXJuYWw6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHBrZy5kZXBlbmRlbmNpZXMpLFxuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRldkRlcGVuZGVuY2llcyksXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8uZXh0ZXJuYWwgPz8gW10pLFxuICAgIF0sXG4gICAgcGx1Z2luczogW1xuICAgICAgLy8gV2l0aCB0aGlzIHBsdWdpbiwgZXNidWlsZCB3aWxsIG5ldmVyIHRvdWNoIHRoZSBhY3R1YWwgZmlsZXN5c3RlbSBhbmQgdGh1cyBjYW5ub3QgaW50ZXJhY3Qgd2l0aCBpbXBvcnRzIHRoYXQgZG9uJ3QgbWF0Y2ggYWxsb3dlZEltcG9ydFBhdHRlcm5zW10uXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwicmVzb2x2ZS12aXJ0dWFsLWZzXCIsXG4gICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLiovIH0sIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IHByb2plY3QuZ2V0U291cmNlRmlsZShhcmdzLnBhdGgpPy5nZXRGdWxsVGV4dCgpXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudHM6IFwiZXhwb3J0IGRlZmF1bHQge31cIixcbiAgICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgbG9hZGVyOiBcInRzXCIsXG4gICAgICAgICAgICAgIHJlc29sdmVEaXI6IHBhdGguZGlybmFtZShhcmdzLnBhdGgpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4uKG9wdHMuZXNidWlsZE9wdGlvbnM/LnBsdWdpbnMgPz8gW10pLFxuICAgIF0sXG4gIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBQUE7OztBQ0FBO0FBQUEsT0FBTyxRQUFRO0FBQ2Y7QUFBQSxFQUNFO0FBQUEsT0FHSztBQUVQLFNBQVMsS0FBQUEsVUFBUzs7O0FDUGxCO0FBQUEsT0FBT0MsV0FBVTs7O0FDQWpCO0FBQUEsT0FBTyxVQUFVO0FBRVYsSUFBTSxnQ0FDWCxDQUFDLGFBQXFCLFdBQ3RCLENBQUMsY0FBc0I7QUFDckIsUUFBTSxRQUFRLFVBRVgsUUFBUSxTQUFTLEdBQUcsRUFFcEIsUUFBUSxPQUFPLEVBQUUsRUFFakIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxZQUFZLEVBQUUsRUFFdEIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxTQUFTLEVBQUUsRUFFbkIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxpQkFBaUIsRUFBRTtBQUU5QixTQUFPLEtBQUssS0FBSyxZQUFZLEtBQUs7QUFDcEM7OztBRGJLLElBQU0sdUJBQXVCLE9BQU8sU0FNSjtBQUNyQyxRQUFNLFNBQVMsTUFBTSwrQ0FBTyw2QkFBVTtBQUN0QyxRQUFNLFVBQVUsTUFBTSwrQ0FBTyw2QkFBVztBQUN4QyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gseUJBQXlCLDhCQUE4QixLQUFLLFNBQVM7QUFBQSxFQUN2RSxJQUFJO0FBRUosUUFBTSxlQUFlQyxNQUFLLE1BQU0sS0FBSyxZQUFZLFFBQVE7QUFDekQsVUFBUSxJQUFJLGNBQWMsa0JBQWtCO0FBQzVDLFFBQU0sWUFBWSxNQUFNLE9BQU8sR0FBRyxjQUFjO0FBQ2hELFVBQVEsSUFBSSxTQUFTLFVBQVUsY0FBYztBQUM3QyxNQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLFVBQU0sSUFBSSxNQUFNLHNCQUFzQixlQUFlO0FBQUEsRUFD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QkFDTCxVQUFVO0FBQUEsZ0JBQ1YsUUFBUTtBQUFBLGNBQ1Y7QUFBQSxZQUNGO0FBRUEsbUJBQU87QUFBQSxjQUNMO0FBQUEsY0FDQSxRQUFRO0FBQUEsY0FDUixZQUFZRixNQUFLLFFBQVEsS0FBSyxJQUFJO0FBQUEsWUFDcEM7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSSxnQkFBSyxtQkFBTCxtQkFBcUIsWUFBckIsWUFBZ0MsQ0FBQztBQUFBLElBQ3ZDO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbInoiLCAicGF0aCIsICJwYXRoIiwgInBhdGgiLCAiZGVkZW50IiwgInBhdGgiLCAiZGVkZW50IiwgIl9hIiwgInoiLCAiZnMiLCAiZGVkZW50IiwgInBhcnNlRGVzY3JpcHRpb24iLCAib3B0aW9ucyIsICJ6IiwgIl8iLCAiZnMiLCAicGF0aCIsICJTeW50YXhLaW5kIiwgInBhdGgiLCAiU3ludGF4S2luZCIsICJfYSIsICJidWlsZCJdCn0K
1576
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2UudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi96b2Qtb3BlbmFwaS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvZnJvbnQtbWF0dGVyLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1vcGVuYXBpL2VtYmVkLXNjaGVtYS1yZWZlcmVuY2VzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZmVybi1zZGstdXRpbHMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtcm91dGUtdHlwZXMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3pvZC10by10cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGUtb3BlbmFwaVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1yb3V0ZS10eXBlc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hc1wiXG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7XG4gIE9wZW5BcGlCdWlsZGVyLFxuICBPcGVyYXRpb25PYmplY3QsXG4gIFBhcmFtZXRlck9iamVjdCxcbn0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCB7IFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVNjaGVtYSB9IGZyb20gXCIuLi9saWIvem9kLW9wZW5hcGlcIlxuaW1wb3J0IHsgZW1iZWRTY2hlbWFSZWZlcmVuY2VzIH0gZnJvbSBcIi4vZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXNcIlxuaW1wb3J0IHsgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhIH0gZnJvbSBcIi4vZmVybi1zZGstdXRpbHNcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4uL2xpYi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcbmltcG9ydCB7IHByZWZpeE9iamVjdEtleXNXaXRoWCB9IGZyb20gXCIuLi91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14XCJcbmltcG9ydCB7IGRhc2hpZnlPYmplY3RLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXNcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICAvLyBCdWlsZCBPcGVuQVBJIHNwZWNcbiAgY29uc3QgYnVpbGRlciA9IE9wZW5BcGlCdWlsZGVyLmNyZWF0ZSh7XG4gICAgb3BlbmFwaTogXCIzLjAuMFwiLFxuICAgIGluZm86IHtcbiAgICAgIHRpdGxlOiBnbG9iYWxTZXR1cFBhcmFtcy5hcGlOYW1lLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIH0sXG4gICAgc2VydmVyczogW1xuICAgICAge1xuICAgICAgICB1cmw6IGdsb2JhbFNldHVwUGFyYW1zLnByb2R1Y3Rpb25TZXJ2ZXJVcmwgfHwgXCJodHRwczovL2V4YW1wbGUuY29tXCIsXG4gICAgICB9LFxuICAgIF0sXG4gICAgdGFnczogdGFncy5tYXAoKHRhZykgPT4gKHsgbmFtZTogdGFnLm5hbWUsIGRlc2NyaXB0aW9uOiB0YWcuZGVzY3JpcHRpb24gfSkpLFxuICAgIHBhdGhzOiB7fSxcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICBzZWN1cml0eVNjaGVtZXMsXG4gICAgICBzY2hlbWFzOiBnbG9iYWxTY2hlbWFzLFxuICAgIH0sXG4gIH0pXG5cbiAgZm9yIChjb25zdCBbXG4gICAgZmlsZV9wYXRoLFxuICAgIHsgc2V0dXBQYXJhbXMsIHJvdXRlU3BlYywgcm91dGU6IHJvdXRlUGF0aCB9LFxuICBdIG9mIGZpbGVwYXRoVG9Sb3V0ZUZuKSB7XG4gICAgY29uc3QgaXNQb3N0T3JQdXRPclBhdGNoID0gW1wiUE9TVFwiLCBcIlBVVFwiLCBcIlBBVENIXCJdLnNvbWUoKG1ldGhvZCkgPT5cbiAgICAgIHJvdXRlU3BlYy5tZXRob2RzLmluY2x1ZGVzKG1ldGhvZClcbiAgICApXG4gICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBhcnQvZm9ybS1kYXRhXG5cbiAgICAvLyBoYW5kbGUgYm9keVxuICAgIGxldCBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYVxuICAgIGlmIChpc1Bvc3RPclB1dE9yUGF0Y2gpIHtcbiAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5ID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgaWYgKHJvdXRlU3BlYy5qc29uQm9keSAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5Lm1lcmdlKFxuICAgICAgICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keVxuICAgIH1cblxuICAgIC8vIGhhbmRsZSBxdWVyeVxuICAgIGxldCBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgaWYgKHJvdXRlU3BlYy5xdWVyeVBhcmFtcyAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtcy5tZXJnZShcbiAgICAgICAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBERUxFVEUgYW5kIEdFVCBjYW5ub3QgaGF2ZSBhIGJvZHlcbiAgICBsZXQgbWV0aG9kcyA9IHJvdXRlU3BlYy5tZXRob2RzXG5cbiAgICBpZiAocm91dGVTcGVjLm1ldGhvZHMuaW5jbHVkZXMoXCJERUxFVEVcIikgJiYgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobSkgPT4gbSAhPT0gXCJERUxFVEVcIilcbiAgICB9XG5cbiAgICBpZiAocm91dGVTcGVjLm1ldGhvZHMuaW5jbHVkZXMoXCJHRVRcIikgJiYgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobSkgPT4gbSAhPT0gXCJHRVRcIilcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSBpdCBoYXMgbm8gbWV0aG9kcy5gKVxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgZGVzY3JpcHRpb24gPSByb3V0ZVNwZWMuZGVzY3JpcHRpb25cbiAgICBsZXQgZGVzY3JpcHRpb25NZXRhZGF0YToge1xuICAgICAgcmVzcG9uc2Vfa2V5Pzogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9ID0ge31cblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKS50cmltKClcblxuICAgICAgaWYgKHRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSB7XG4gICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gICAgICAgIGRlc2NyaXB0aW9uTWV0YWRhdGEgPSBhdHRyaWJ1dGVzXG4gICAgICAgIGRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gdHJpbW1lZERlc2NyaXB0aW9uXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0dGVkRGVzY3JpcHRpb25NZXRhZGF0YSA9IHByZWZpeE9iamVjdEtleXNXaXRoWChcbiAgICAgIGRhc2hpZnlPYmplY3RLZXlzKGRlc2NyaXB0aW9uTWV0YWRhdGEpXG4gICAgKVxuXG4gICAgY29uc3Qgcm91dGU6IE9wZXJhdGlvbk9iamVjdCA9IHtcbiAgICAgIC4uLnJvdXRlU3BlYy5vcGVuQXBpTWV0YWRhdGEsXG4gICAgICAuLi5mb3JtYXR0ZWREZXNjcmlwdGlvbk1ldGFkYXRhLFxuICAgICAgc3VtbWFyeTogcm91dGVQYXRoLFxuICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiT0tcIixcbiAgICAgICAgfSxcbiAgICAgICAgNDAwOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiQmFkIFJlcXVlc3RcIixcbiAgICAgICAgfSxcbiAgICAgICAgNDAxOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiVW5hdXRob3JpemVkXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2VjdXJpdHk6IEFycmF5LmlzQXJyYXkocm91dGVTcGVjLmF1dGgpXG4gICAgICAgID8gcm91dGVTcGVjLmF1dGhcbiAgICAgICAgICAgIC5tYXAoKGF1dGhUeXBlKSA9PiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVthdXRoVHlwZV0pXG4gICAgICAgICAgICAuZmxhdCgpXG4gICAgICAgIDogc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbcm91dGVTcGVjLmF1dGhdLFxuICAgIH1cblxuICAgIGlmIChib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgcm91dGUucmVxdWVzdEJvZHkgPSB7XG4gICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgICAgc2NoZW1hOiBnZW5lcmF0ZVNjaGVtYShib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSBhcyBhbnkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgY29uc3Qgc2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEocXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hIGFzIGFueSlcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJPYmplY3RbXSA9IE9iamVjdC5rZXlzKFxuICAgICAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzIGFzIGFueVxuICAgICAgICApLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaW46IFwicXVlcnlcIixcbiAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLnByb3BlcnRpZXMhW25hbWVdLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHNjaGVtYS5yZXF1aXJlZD8uaW5jbHVkZXMobmFtZSksXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJvdXRlLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBqc29uUmVzcG9uc2UgfSA9IHJvdXRlU3BlY1xuICAgIGNvbnN0IHsgYWRkT2tTdGF0dXMgPSB0cnVlIH0gPSBzZXR1cFBhcmFtc1xuXG4gICAgaWYgKGpzb25SZXNwb25zZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhanNvblJlc3BvbnNlLl9kZWYgfHxcbiAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lIHx8XG4gICAgICAgIGpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lICE9PSBcIlpvZE9iamVjdFwiXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgIGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSB0aGUgcmVzcG9uc2UgaXMgbm90IGEgWm9kT2JqZWN0LmBcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2VTY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYShcbiAgICAgICAgYWRkT2tTdGF0dXMgJiYganNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICA/IGpzb25SZXNwb25zZS5leHRlbmQoeyBvazogei5ib29sZWFuKCkgfSlcbiAgICAgICAgICA6IGpzb25SZXNwb25zZVxuICAgICAgKVxuXG4gICAgICBjb25zdCBzY2hlbWFXaXRoUmVmZXJlbmNlcyA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhcbiAgICAgICAgcmVzcG9uc2VTY2hlbWEsXG4gICAgICAgIGdsb2JhbFNjaGVtYXNcbiAgICAgIClcblxuICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIG5vdCBoYXJkY29kZSAyMDAgaGVyZVxuICAgICAgaWYgKHJvdXRlLnJlc3BvbnNlcyAhPSBudWxsKSB7XG4gICAgICAgIHJvdXRlLnJlc3BvbnNlc1syMDBdLmNvbnRlbnQgPSB7XG4gICAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHtcbiAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hV2l0aFJlZmVyZW5jZXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJvdXRlLnRhZ3MgPSBbXVxuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIGlmICh0YWcuZG9lc1JvdXRlSGF2ZVRhZyAmJiB0YWcuZG9lc1JvdXRlSGF2ZVRhZyhyb3V0ZS5zdW1tYXJ5IHx8IFwiXCIpKSB7XG4gICAgICAgIHJvdXRlLnRhZ3MucHVzaCh0YWcubmFtZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2RzTWFwcGVkVG9GZXJuU2RrTWV0YWRhdGEgPSBhd2FpdCBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoe1xuICAgICAgbWV0aG9kcyxcbiAgICAgIHBhdGg6IHJvdXRlUGF0aCxcbiAgICAgIHNka1JldHVyblZhbHVlOlxuICAgICAgICBkZXNjcmlwdGlvbk1ldGFkYXRhPy5yZXNwb25zZV9rZXkgPz8gcm91dGVTcGVjLnNka1JldHVyblZhbHVlLFxuICAgIH0pXG5cbiAgICAvLyBTb21lIHJvdXRlcyBhY2NlcHQgbXVsdGlwbGUgbWV0aG9kc1xuICAgIGJ1aWxkZXIuYWRkUGF0aChyb3V0ZVBhdGgsIHtcbiAgICAgIC4uLm1ldGhvZHNcbiAgICAgICAgLm1hcCgobWV0aG9kKSA9PiAoe1xuICAgICAgICAgIFttZXRob2QudG9Mb3dlckNhc2UoKV06IHtcbiAgICAgICAgICAgIC4uLm1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YVttZXRob2RdLFxuICAgICAgICAgICAgLi4ucm91dGUsXG4gICAgICAgICAgICBvcGVyYXRpb25JZDogYCR7dHJhbnNmb3JtUGF0aFRvT3BlcmF0aW9uSWQocm91dGVQYXRoKX0ke3Bhc2NhbENhc2UoXG4gICAgICAgICAgICAgIG1ldGhvZFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKVxuICAgICAgICAucmVkdWNlUmlnaHQoKGFjYywgY3VyKSA9PiAoeyAuLi5hY2MsIC4uLmN1ciB9KSwge30pLFxuICAgIH0pXG4gIH1cblxuICBpZiAob3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvdXRwdXRGaWxlLCBidWlsZGVyLmdldFNwZWNBc0pzb24odW5kZWZpbmVkLCAyKSlcbiAgfVxuXG4gIHJldHVybiBidWlsZGVyLmdldFNwZWNBc0pzb24odW5kZWZpbmVkLCAyKVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgUm91dGVTcGVjLCBTZXR1cFBhcmFtcyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgeyBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSB9IGZyb20gXCIuL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlXCJcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUluZm8ge1xuICBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXNcbiAgcm91dGVTcGVjOiBSb3V0ZVNwZWNcbiAgcm91dGVGbjogRnVuY3Rpb25cbiAgcm91dGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSb3V0ZXNJblBhY2thZ2UgPSBhc3luYyAob3B0czoge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxufSk6IFByb21pc2U8TWFwPHN0cmluZywgUm91dGVJbmZvPj4gPT4ge1xuICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdFxuICBjb25zdCBnbG9iYnkgPSAoYXdhaXQgaW1wb3J0KFwiZ2xvYmJ5XCIpKS5nbG9iYnlcbiAgY29uc3Qge1xuICAgIHBhY2thZ2VEaXIsXG4gICAgcGF0aEdsb2IgPSBcIi9wYWdlcy9hcGkvKiovKi50c1wiLFxuICAgIG1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPSBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeCksXG4gIH0gPSBvcHRzXG4gIC8vIExvYWQgYWxsIHJvdXRlIHNwZWNzXG4gIGNvbnN0IGZ1bGxQYXRoR2xvYiA9IHBhdGgucG9zaXguam9pbihwYWNrYWdlRGlyLCBwYXRoR2xvYilcbiAgY29uc29sZS5sb2coYHNlYXJjaGluZyBcIiR7ZnVsbFBhdGhHbG9ifVwiLi4uYClcbiAgY29uc3QgZmlsZXBhdGhzID0gYXdhaXQgZ2xvYmJ5KGAke2Z1bGxQYXRoR2xvYn1gKVxuICBjb25zb2xlLmxvZyhgZm91bmQgJHtmaWxlcGF0aHMubGVuZ3RofSBmaWxlc2ApXG4gIGlmIChmaWxlcGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBmaWxlcyBmb3VuZCBhdCBcIiR7ZnVsbFBhdGhHbG9ifVwiYClcbiAgfVxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZUluZm8+KClcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlcGF0aHMubWFwKGFzeW5jIChwKSA9PiB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IHJvdXRlRm4gfSA9IGF3YWl0IHJlcXVpcmUocGF0aC5yZXNvbHZlKHApKVxuXG4gICAgICBpZiAocm91dGVGbikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcm91dGVGbi5fcm91dGVTcGVjPy5leGNsdWRlRnJvbU9wZW5BcGkgJiZcbiAgICAgICAgICAhb3B0cy5pbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuZ3JheShcbiAgICAgICAgICAgICAgYElnbm9yaW5nIFwiJHtwfSBiZWNhdXNlIGl0IHdhcyBleGNsdWRlZCBmcm9tIE9wZW5BUEkgZ2VuZXJhdGlvblwiYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdXRlRm4uX3NldHVwUGFyYW1zKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgSWdub3JpbmcgXCIke3B9XCIgYmVjYXVzZSBpdCB3YXNuJ3QgY3JlYXRlZCB3aXRoIHdpdGhSb3V0ZVNwZWNgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGZpbGVwYXRoVG9Sb3V0ZUZuLnNldChwLCB7XG4gICAgICAgICAgc2V0dXBQYXJhbXM6IHJvdXRlRm4uX3NldHVwUGFyYW1zLFxuICAgICAgICAgIHJvdXRlU3BlYzogcm91dGVGbi5fcm91dGVTcGVjLFxuICAgICAgICAgIHJvdXRlOiBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlKHApLFxuICAgICAgICAgIHJvdXRlRm4sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBDb3VsZG4ndCBmaW5kIHJvdXRlICR7cH1gKSlcbiAgICAgIH1cbiAgICB9KVxuICApXG5cbiAgcmV0dXJuIGZpbGVwYXRoVG9Sb3V0ZUZuXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPVxuICAoYXBpX3ByZWZpeDogc3RyaW5nID0gXCIvYXBpXCIpID0+XG4gIChmaWxlX3BhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvdXRlID0gZmlsZV9wYXRoXG4gICAgICAvLyByZXBsYWNlIC4vIGlmIGl0IHN0YXJ0cyB3aXRoIC4vXG4gICAgICAucmVwbGFjZSgvXlxcLlxcLy8sIFwiL1wiKVxuICAgICAgLy8gcmVwbGFjZSBzdGFydGluZyAvXG4gICAgICAucmVwbGFjZSgvXlxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9zcmMgaWYgaXQgc3RhcnRzIHdpdGggL3NyY1xuICAgICAgLnJlcGxhY2UoL15zcmNcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvcGFnZXMgaWYgaXQgc3RhcnRzIHdpdGggL3BhZ2VzXG4gICAgICAucmVwbGFjZSgvXnBhZ2VzXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL2FwaSBpZiBpdCBzdGFydHMgd2l0aCAvYXBpXG4gICAgICAucmVwbGFjZSgvXmFwaVxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC50cyBpZiBpdCBlbmRzIHdpdGggLnRzXG4gICAgICAucmVwbGFjZSgvXFwudHMkLywgXCJcIilcbiAgICAgIC8vIHJlbW92ZSBwdWJsaWMgcmVmZXJlbmNlXG4gICAgICAucmVwbGFjZShcInB1YmxpY1wiLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSBpbmRleCBpZiBpdCBlbmRzIHdpdGggaW5kZXhcbiAgICAgIC5yZXBsYWNlKC9cXC9cXGluZGV4KD8hLikvLCBcIlwiKVxuXG4gICAgcmV0dXJuIHBhdGguam9pbihhcGlfcHJlZml4LCByb3V0ZSlcbiAgfVxuIiwgIi8qKlxuICogWm9kIE9wZW5BUEkgR2VuZXJhdG9yLlxuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuYXRpbmUvem9kLXBsdWdpbnNcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMiBCcmlhbiBNY0JyaWRlXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNjaGVtYU9iamVjdCwgU2NoZW1hT2JqZWN0VHlwZSB9IGZyb20gXCJvcGVuYXBpMy10cy9vYXMzMVwiXG5pbXBvcnQgbWVyZ2UgZnJvbSBcInRzLWRlZXBtZXJnZVwiXG5pbXBvcnQgeyBBbnlab2RPYmplY3QsIHosIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXIsIHRlc3RGcm9udE1hdHRlciB9IGZyb20gXCIuL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuaW1wb3J0IHsgcHJlZml4T2JqZWN0S2V5c1dpdGhYIH0gZnJvbSBcIi4uL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXhcIlxuaW1wb3J0IHsgZGFzaGlmeU9iamVjdEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5c1wiXG5cbnR5cGUgQW5hdGluZVNjaGVtYU9iamVjdCA9IFNjaGVtYU9iamVjdCAmIHsgaGlkZURlZmluaXRpb25zPzogc3RyaW5nW10gfVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BcGlab2RBbnkgZXh0ZW5kcyBab2RUeXBlQW55IHtcbiAgbWV0YU9wZW5BcGk/OiBBbmF0aW5lU2NoZW1hT2JqZWN0IHwgQW5hdGluZVNjaGVtYU9iamVjdFtdXG59XG5cbmludGVyZmFjZSBPcGVuQXBpWm9kQW55T2JqZWN0IGV4dGVuZHMgQW55Wm9kT2JqZWN0IHtcbiAgbWV0YU9wZW5BcGk/OiBBbmF0aW5lU2NoZW1hT2JqZWN0IHwgQW5hdGluZVNjaGVtYU9iamVjdFtdXG59XG5cbmludGVyZmFjZSBQYXJzaW5nQXJnczxUPiB7XG4gIHpvZFJlZjogVFxuICBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbiAgdXNlT3V0cHV0PzogYm9vbGVhblxuICBoaWRlRGVmaW5pdGlvbnM/OiBzdHJpbmdbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kQXBpPFQgZXh0ZW5kcyBPcGVuQXBpWm9kQW55PihcbiAgc2NoZW1hOiBULFxuICBzY2hlbWFPYmplY3Q6IEFuYXRpbmVTY2hlbWFPYmplY3QgPSB7fVxuKTogVCB7XG4gIHNjaGVtYS5tZXRhT3BlbkFwaSA9IE9iamVjdC5hc3NpZ24oc2NoZW1hLm1ldGFPcGVuQXBpIHx8IHt9LCBzY2hlbWFPYmplY3QpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZnVuY3Rpb24gaXRlcmF0ZVpvZE9iamVjdCh7XG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxuICBoaWRlRGVmaW5pdGlvbnMsXG59OiBQYXJzaW5nQXJnczxPcGVuQXBpWm9kQW55T2JqZWN0Pikge1xuICBjb25zdCByZWR1Y2VkID0gT2JqZWN0LmtleXMoem9kUmVmLnNoYXBlKVxuICAgIC5maWx0ZXIoKGtleSkgPT4gaGlkZURlZmluaXRpb25zPy5pbmNsdWRlcyhrZXkpID09PSBmYWxzZSlcbiAgICAucmVkdWNlKFxuICAgICAgKGNhcnJ5LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmNhcnJ5LFxuICAgICAgICBba2V5XTogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnNoYXBlW2tleV0sIHVzZU91dHB1dCksXG4gICAgICB9KSxcbiAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIFNjaGVtYU9iamVjdD5cbiAgICApXG5cbiAgcmV0dXJuIHJlZHVjZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VEZXNjcmlwdGlvbih6b2RSZWY6IE9wZW5BcGlab2RBbnkpOiBTY2hlbWFPYmplY3Qge1xuICBpZiAoIXpvZFJlZi5kZXNjcmlwdGlvbikgcmV0dXJuIHt9XG4gIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlZGVudCh6b2RSZWYuZGVzY3JpcHRpb24pXG4gIGlmICghdGVzdEZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbikpXG4gICAgcmV0dXJuIHsgZGVzY3JpcHRpb246IHpvZFJlZi5kZXNjcmlwdGlvbiB9XG4gIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gIGNvbnN0IG91dHB1dDogU2NoZW1hT2JqZWN0ID0ge31cbiAgaWYgKGJvZHkudHJpbSgpKSBvdXRwdXQuZGVzY3JpcHRpb24gPSBib2R5LnRyaW0oKVxuICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIgJiYgYXR0cmlidXRlcyAhPT0gbnVsbCkge1xuICAgIGlmIChcImRlcHJlY2F0ZWRcIiBpbiBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCkge1xuICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgT2JqZWN0LmVudHJpZXMoXG4gICAgICBwcmVmaXhPYmplY3RLZXlzV2l0aFgoZGFzaGlmeU9iamVjdEtleXMoYXR0cmlidXRlcykpXG4gICAgKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIG91dHB1dFtrZXldID0gdmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dFxufVxuXG5mdW5jdGlvbiBwYXJzZVRyYW5zZm9ybWF0aW9uKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFRyYW5zZm9ybWVyPG5ldmVyPiB8IHouWm9kRWZmZWN0czxuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgaW5wdXQgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5zY2hlbWEsIHVzZU91dHB1dClcblxuICBsZXQgb3V0cHV0ID0gXCJ1bmRlZmluZWRcIlxuICBpZiAodXNlT3V0cHV0ICYmIHpvZFJlZi5fZGVmLmVmZmVjdCkge1xuICAgIGNvbnN0IGVmZmVjdCA9XG4gICAgICB6b2RSZWYuX2RlZi5lZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IHpvZFJlZi5fZGVmLmVmZmVjdCA6IG51bGxcbiAgICBpZiAoZWZmZWN0ICYmIFwidHJhbnNmb3JtXCIgaW4gZWZmZWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBvdXRwdXQgPSB0eXBlb2YgZWZmZWN0LnRyYW5zZm9ybShcbiAgICAgICAgICBbXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKGAke2lucHV0LnR5cGV9YClcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBcInN0cmluZ1wiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgIDogXCJib29sZWFuXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogXCJvYmplY3RcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBcIm51bGxcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IFwiYXJyYXlcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgeyBhZGRJc3N1ZTogKCkgPT4gdW5kZWZpbmVkLCBwYXRoOiBbXSB9IC8vIFRPRE86IERpc2NvdmVyIGlmIGNvbnRleHQgaXMgbmVjZXNzYXJ5IGhlcmVcbiAgICAgICAgKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiovXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICAuLi4oem9kUmVmLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogem9kUmVmLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi5pbnB1dCxcbiAgICAgIC4uLihbXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJib29sZWFuXCIsIFwibnVsbFwiXS5pbmNsdWRlcyhvdXRwdXQpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdHlwZTogb3V0cHV0IGFzIFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJib29sZWFuXCIgfCBcIm51bGxcIixcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0sXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RTdHJpbmc+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgYmFzZVNjaGVtYTogU2NoZW1hT2JqZWN0ID0ge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gIH1cbiAgY29uc3QgeyBjaGVja3MgPSBbXSB9ID0gem9kUmVmLl9kZWZcbiAgY2hlY2tzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBzd2l0Y2ggKGl0ZW0ua2luZCkge1xuICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJlbWFpbFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwidXVpZFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiY3VpZFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwiY3VpZFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1cmlcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJkYXRlLXRpbWVcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImxlbmd0aFwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbkxlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhMZW5ndGggPSBpdGVtLnZhbHVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWF4TGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbkxlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJyZWdleFwiOlxuICAgICAgICBiYXNlU2NoZW1hLnBhdHRlcm4gPSBpdGVtLnJlZ2V4LnNvdXJjZVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlKGJhc2VTY2hlbWEsIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1iZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZE51bWJlcj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBiYXNlU2NoZW1hOiBTY2hlbWFPYmplY3QgPSB7XG4gICAgdHlwZTogXCJudW1iZXJcIixcbiAgICBmb3JtYXQ6IFwiZmxvYXRcIixcbiAgfVxuICBjb25zdCB7IGNoZWNrcyA9IFtdIH0gPSB6b2RSZWYuX2RlZlxuICBjaGVja3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIHN3aXRjaCAoaXRlbS5raW5kKSB7XG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWF4aW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBVUFNUUkVBTTogVGhlIG9wZW5hcGkzLXRzIHR5cGVzIGFyZSB3cm9uZzogZXhjbHVzaXZlTWF4aW11bSBpcyBhIGJvb2xlYW4gaW4gdGhpcyB2ZXJzaW9uLlxuICAgICAgICAvLyBodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL3YzXzAvZGF0YS1tb2RlbHMvZGF0YS10eXBlcy9cbiAgICAgICAgaWYgKCFpdGVtLmluY2x1c2l2ZSkgYmFzZVNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbmltdW0gPSBpdGVtLnZhbHVlXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVVBTVFJFQU06IFRoZSBvcGVuYXBpMy10cyB0eXBlcyBhcmUgd3Jvbmc6IGV4Y2x1c2l2ZU1pbmltdW0gaXMgYSBib29sZWFuIGluIHRoaXMgdmVyc2lvbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi92M18wL2RhdGEtbW9kZWxzL2RhdGEtdHlwZXMvXG4gICAgICAgIGlmICghaXRlbS5pbmNsdXNpdmUpIGJhc2VTY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJpbnRcIjpcbiAgICAgICAgYmFzZVNjaGVtYS50eXBlID0gXCJpbnRlZ2VyXCJcbiAgICAgICAgZGVsZXRlIGJhc2VTY2hlbWEuZm9ybWF0XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibXVsdGlwbGVPZlwiOlxuICAgICAgICBiYXNlU2NoZW1hLm11bHRpcGxlT2YgPSBpdGVtLnZhbHVlXG4gICAgfVxuICB9KVxuICByZXR1cm4gbWVyZ2UoYmFzZVNjaGVtYSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBnZXRFeGNsdWRlZERlZmluaXRpb25zRnJvbVNjaGVtYShcbiAgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4Y2x1ZGVkRGVmaW5pdGlvbnM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5oaWRlRGVmaW5pdGlvbnMpKSB7XG4gICAgICBleGNsdWRlZERlZmluaXRpb25zLnB1c2goLi4uc2NoZW1hLmhpZGVEZWZpbml0aW9ucylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhjbHVkZWREZWZpbml0aW9uc1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxuICBoaWRlRGVmaW5pdGlvbnMsXG59OiBQYXJzaW5nQXJnczxcbiAgei5ab2RPYmplY3Q8bmV2ZXIsIFwicGFzc3Rocm91Z2hcIiB8IFwic3RyaWN0XCIgfCBcInN0cmlwXCI+XG4+KTogU2NoZW1hT2JqZWN0IHtcbiAgbGV0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBTY2hlbWFPYmplY3RbXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiXVxuXG4gIC8vIGBjYXRjaGFsbGAgb2J2aWF0ZXMgYHN0cmljdGAsIGBzdHJpcGAsIGFuZCBgcGFzc3Rocm91Z2hgXG4gIGlmIChcbiAgICAhKFxuICAgICAgem9kUmVmLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8XG4gICAgICB6b2RSZWYuX2RlZi5jYXRjaGFsbD8uX2RlZi50eXBlTmFtZSA9PT0gXCJab2ROZXZlclwiXG4gICAgKVxuICApXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5jYXRjaGFsbCwgdXNlT3V0cHV0KVxuICBlbHNlIGlmICh6b2RSZWYuX2RlZi51bmtub3duS2V5cyA9PT0gXCJwYXNzdGhyb3VnaFwiKVxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZVxuICBlbHNlIGlmICh6b2RSZWYuX2RlZi51bmtub3duS2V5cyA9PT0gXCJzdHJpY3RcIikgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZVxuXG4gIC8vIFNvIHRoYXQgYHVuZGVmaW5lZGAgdmFsdWVzIGRvbid0IGVuZCB1cCBpbiB0aGUgc2NoZW1hIGFuZCBiZSB3ZWlyZFxuICBhZGRpdGlvbmFsUHJvcGVydGllcyA9XG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgIT0gbnVsbCA/IHsgYWRkaXRpb25hbFByb3BlcnRpZXMgfSA6IHt9XG5cbiAgY29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoXG4gICAgKHpvZFJlZiBhcyB6LkFueVpvZE9iamVjdCkuc2hhcGVcbiAgKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSAoem9kUmVmIGFzIHouQW55Wm9kT2JqZWN0KS5zaGFwZVtrZXldXG4gICAgcmV0dXJuIChcbiAgICAgICEoXG4gICAgICAgIGl0ZW0uaXNPcHRpb25hbCgpIHx8XG4gICAgICAgIGl0ZW0gaW5zdGFuY2VvZiB6LlpvZERlZmF1bHQgfHxcbiAgICAgICAgaXRlbS5fZGVmLnR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIlxuICAgICAgKSAmJiAhKGl0ZW0gaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8IGl0ZW0uX2RlZi50eXBlTmFtZSA9PT0gXCJab2REZWZhdWx0XCIpXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IHJlcXVpcmVkID1cbiAgICByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCA/IHsgcmVxdWlyZWQ6IHJlcXVpcmVkUHJvcGVydGllcyB9IDoge31cblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogXCJvYmplY3RcIiBhcyBTY2hlbWFPYmplY3RUeXBlLFxuICAgICAgcHJvcGVydGllczogaXRlcmF0ZVpvZE9iamVjdCh7XG4gICAgICAgIHpvZFJlZjogem9kUmVmIGFzIE9wZW5BcGlab2RBbnlPYmplY3QsXG4gICAgICAgIHNjaGVtYXMsXG4gICAgICAgIHVzZU91dHB1dCxcbiAgICAgICAgaGlkZURlZmluaXRpb25zOiBnZXRFeGNsdWRlZERlZmluaXRpb25zRnJvbVNjaGVtYShzY2hlbWFzKSxcbiAgICAgIH0pLFxuICAgICAgLi4ucmVxdWlyZWQsXG4gICAgICAuLi5hZGRpdGlvbmFsUHJvcGVydGllcyxcbiAgICAgIC4uLmhpZGVEZWZpbml0aW9ucyxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNvcmQoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kUmVjb3JkPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczpcbiAgICAgICAgem9kUmVmLl9kZWYudmFsdWVUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duXG4gICAgICAgICAgPyB7fVxuICAgICAgICAgIDogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYudmFsdWVUeXBlLCB1c2VPdXRwdXQpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJpZ0ludCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kQmlnSW50Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7IHR5cGU6IFwiaW50ZWdlclwiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJpbnQ2NFwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZEJvb2xlYW4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgdHlwZTogXCJib29sZWFuXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlKHsgem9kUmVmLCBzY2hlbWFzIH06IFBhcnNpbmdBcmdzPHouWm9kRGF0ZT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgeyB0eXBlOiBcInN0cmluZ1wiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJkYXRlLXRpbWVcIiB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VOdWxsKHsgem9kUmVmLCBzY2hlbWFzIH06IFBhcnNpbmdBcmdzPHouWm9kTnVsbD4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kT3B0aW9uYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi51bndyYXAoKSwgdXNlT3V0cHV0KSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVsbGFibGUoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kTnVsbGFibGU8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3Qgc2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnVud3JhcCgpLCB1c2VPdXRwdXQpXG4gIHJldHVybiBtZXJnZShcbiAgICB7IC4uLnNjaGVtYSwgdHlwZTogc2NoZW1hLnR5cGUsIG51bGxhYmxlOiB0cnVlIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURlZmF1bHQoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kRGVmYXVsdDxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgZGVmYXVsdDogem9kUmVmLl9kZWYuZGVmYXVsdFZhbHVlKCksXG4gICAgICAuLi5nZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5pbm5lclR5cGUsIHVzZU91dHB1dCksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQXJyYXkoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kQXJyYXk8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgY29uc3RyYWludHM6IFNjaGVtYU9iamVjdCA9IHt9XG4gIGlmICh6b2RSZWYuX2RlZi5leGFjdExlbmd0aCAhPSBudWxsKSB7XG4gICAgY29uc3RyYWludHMubWluSXRlbXMgPSB6b2RSZWYuX2RlZi5leGFjdExlbmd0aC52YWx1ZVxuICAgIGNvbnN0cmFpbnRzLm1heEl0ZW1zID0gem9kUmVmLl9kZWYuZXhhY3RMZW5ndGgudmFsdWVcbiAgfVxuXG4gIGlmICh6b2RSZWYuX2RlZi5taW5MZW5ndGggIT0gbnVsbClcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IHpvZFJlZi5fZGVmLm1pbkxlbmd0aC52YWx1ZVxuICBpZiAoem9kUmVmLl9kZWYubWF4TGVuZ3RoICE9IG51bGwpXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSB6b2RSZWYuX2RlZi5tYXhMZW5ndGgudmFsdWVcblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogXCJhcnJheVwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBpdGVtczogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLmVsZW1lbnQsIHVzZU91dHB1dCksXG4gICAgICAuLi5jb25zdHJhaW50cyxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VMaXRlcmFsKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RMaXRlcmFsPE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2Ygem9kUmVmLl9kZWYudmFsdWUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgIGVudW06IFt6b2RSZWYuX2RlZi52YWx1ZV0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRW51bSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbn06IFBhcnNpbmdBcmdzPHouWm9kRW51bTxuZXZlcj4gfCB6LlpvZE5hdGl2ZUVudW08bmV2ZXI+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2YgT2JqZWN0LnZhbHVlcyh6b2RSZWYuX2RlZi52YWx1ZXMpWzBdIGFzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiLFxuICAgICAgZW51bTogT2JqZWN0LnZhbHVlcyh6b2RSZWYuX2RlZi52YWx1ZXMpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUludGVyc2VjdGlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlQW55LCB6LlpvZFR5cGVBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBhbGxPZjogW1xuICAgICAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5sZWZ0LCB1c2VPdXRwdXQpLFxuICAgICAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5yaWdodCwgdXNlT3V0cHV0KSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5pb24oe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kVW5pb248W3ouWm9kVHlwZUFueSwgLi4uei5ab2RUeXBlQW55W11dPj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBjb250ZW50cyA9IHpvZFJlZi5fZGVmLm9wdGlvbnNcbiAgaWYgKFxuICAgIGNvbnRlbnRzLnJlZHVjZShcbiAgICAgIChwcmV2LCBjb250ZW50KSA9PiBwcmV2ICYmIGNvbnRlbnQuX2RlZi50eXBlTmFtZSA9PT0gXCJab2RMaXRlcmFsXCIsXG4gICAgICB0cnVlXG4gICAgKVxuICApIHtcbiAgICAvLyBzcGVjaWFsIGNhc2UgdG8gdHJhbnNmb3JtIHVuaW9ucyBvZiBsaXRlcmFscyBpbnRvIGVudW1zXG4gICAgY29uc3QgbGl0ZXJhbHMgPSBjb250ZW50cyBhcyB1bmtub3duIGFzIHouWm9kTGl0ZXJhbDxPcGVuQXBpWm9kQW55PltdXG4gICAgY29uc3QgdHlwZSA9IGxpdGVyYWxzLnJlZHVjZShcbiAgICAgIChwcmV2LCBjb250ZW50KSA9PlxuICAgICAgICAhcHJldiB8fCBwcmV2ID09PSB0eXBlb2YgY29udGVudC5fZGVmLnZhbHVlXG4gICAgICAgICAgPyB0eXBlb2YgY29udGVudC5fZGVmLnZhbHVlXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgbnVsbCBhcyBudWxsIHwgc3RyaW5nXG4gICAgKVxuXG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IHR5cGUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgICAgICBlbnVtOiBsaXRlcmFscy5tYXAoKGxpdGVyYWwpID0+IGxpdGVyYWwuX2RlZi52YWx1ZSksXG4gICAgICAgIH0sXG4gICAgICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAgICAgLi4uc2NoZW1hc1xuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlzTnVsbGFibGUgPSBjb250ZW50cy5zb21lKFxuICAgIChjb250ZW50KSA9PiBjb250ZW50Ll9kZWYudHlwZU5hbWUgPT09IFwiWm9kTnVsbFwiXG4gIClcbiAgY29uc3Qgbm9uTnVsbENvbnRlbnRzID0gY29udGVudHMuZmlsdGVyKFxuICAgIChjb250ZW50KSA9PiBjb250ZW50Ll9kZWYudHlwZU5hbWUgIT09IFwiWm9kTnVsbFwiXG4gIClcblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgb25lT2Y6IG5vbk51bGxDb250ZW50cy5tYXAoKHNjaGVtYSkgPT4gZ2VuZXJhdGVTY2hlbWEoc2NoZW1hLCB1c2VPdXRwdXQpKSxcbiAgICAgIC4uLihpc051bGxhYmxlID8geyBudWxsYWJsZTogdHJ1ZSB9IDoge30pLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8XG4gIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uPHN0cmluZywgei5ab2REaXNjcmltaW5hdGVkVW5pb25PcHRpb248c3RyaW5nPltdPlxuPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBkaXNjcmltaW5hdG9yOiB7XG4gICAgICAgIHByb3BlcnR5TmFtZTogKFxuICAgICAgICAgIHpvZFJlZiBhcyB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbjxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uT3B0aW9uPHN0cmluZz5bXVxuICAgICAgICAgID5cbiAgICAgICAgKS5fZGVmLmRpc2NyaW1pbmF0b3IsXG4gICAgICB9LFxuICAgICAgb25lT2Y6IEFycmF5LmZyb20oXG4gICAgICAgIChcbiAgICAgICAgICB6b2RSZWYgYXMgei5ab2REaXNjcmltaW5hdGVkVW5pb248XG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbk9wdGlvbjxzdHJpbmc+W11cbiAgICAgICAgICA+XG4gICAgICAgICkuX2RlZi5vcHRpb25zLnZhbHVlcygpXG4gICAgICApLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU5ldmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROZXZlcj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoeyByZWFkT25seTogdHJ1ZSB9LCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlQnJhbmRlZCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbn06IFBhcnNpbmdBcmdzPHouWm9kQnJhbmRlZDx6LlpvZEFueSwgc3RyaW5nPj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYudHlwZSksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGNhdGNoQWxsUGFyc2VyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8Wm9kVHlwZUFueT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UocGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZVBpcGVsaW5lKHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFBpcGVsaW5lPG5ldmVyLCBuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgaWYgKHVzZU91dHB1dCkge1xuICAgIHJldHVybiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5vdXQsIHVzZU91dHB1dClcbiAgfVxuICByZXR1cm4gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuaW4sIHVzZU91dHB1dClcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWFkb25seSh7XG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RSZWFkb25seTx6LlpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmlubmVyVHlwZSwgdXNlT3V0cHV0KSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmNvbnN0IHdvcmtlck1hcCA9IHtcbiAgWm9kT2JqZWN0OiBwYXJzZU9iamVjdCxcbiAgWm9kUmVjb3JkOiBwYXJzZVJlY29yZCxcbiAgWm9kU3RyaW5nOiBwYXJzZVN0cmluZyxcbiAgWm9kTnVtYmVyOiBwYXJzZU51bWJlcixcbiAgWm9kQmlnSW50OiBwYXJzZUJpZ0ludCxcbiAgWm9kQm9vbGVhbjogcGFyc2VCb29sZWFuLFxuICBab2REYXRlOiBwYXJzZURhdGUsXG4gIFpvZE51bGw6IHBhcnNlTnVsbCxcbiAgWm9kT3B0aW9uYWw6IHBhcnNlT3B0aW9uYWwsXG4gIFpvZE51bGxhYmxlOiBwYXJzZU51bGxhYmxlLFxuICBab2REZWZhdWx0OiBwYXJzZURlZmF1bHQsXG4gIFpvZEFycmF5OiBwYXJzZUFycmF5LFxuICBab2RMaXRlcmFsOiBwYXJzZUxpdGVyYWwsXG4gIFpvZEVudW06IHBhcnNlRW51bSxcbiAgWm9kTmF0aXZlRW51bTogcGFyc2VFbnVtLFxuICBab2RUcmFuc2Zvcm1lcjogcGFyc2VUcmFuc2Zvcm1hdGlvbixcbiAgWm9kRWZmZWN0czogcGFyc2VUcmFuc2Zvcm1hdGlvbixcbiAgWm9kSW50ZXJzZWN0aW9uOiBwYXJzZUludGVyc2VjdGlvbixcbiAgWm9kVW5pb246IHBhcnNlVW5pb24sXG4gIFpvZERpc2NyaW1pbmF0ZWRVbmlvbjogcGFyc2VEaXNjcmltaW5hdGVkVW5pb24sXG4gIFpvZE5ldmVyOiBwYXJzZU5ldmVyLFxuICBab2RCcmFuZGVkOiBwYXJzZUJyYW5kZWQsXG4gIC8vIFRPRE8gVHJhbnNmb3JtIHRoZSByZXN0IHRvIHNjaGVtYXNcbiAgWm9kVW5kZWZpbmVkOiBjYXRjaEFsbFBhcnNlcixcbiAgLy8gVE9ETzogYHByZWZpeEl0ZW1zYCBpcyBhbGxvd2VkIGluIE9wZW5BUEkgMy4xIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSB0dXBsZXNcbiAgWm9kVHVwbGU6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RNYXA6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RGdW5jdGlvbjogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZExhenk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RQcm9taXNlOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kQW55OiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVW5rbm93bjogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFZvaWQ6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RQaXBlbGluZTogcGFyc2VQaXBlbGluZSxcbiAgWm9kUmVhZG9ubHk6IHBhcnNlUmVhZG9ubHksXG59XG50eXBlIFdvcmtlcktleXMgPSBrZXlvZiB0eXBlb2Ygd29ya2VyTWFwXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjaGVtYShcbiAgem9kUmVmOiBPcGVuQXBpWm9kQW55LFxuICB1c2VPdXRwdXQ/OiBib29sZWFuXG4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCB7IG1ldGFPcGVuQXBpID0ge30gfSA9IHpvZFJlZlxuICBjb25zdCBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W10gPSBbXG4gICAgLi4uKEFycmF5LmlzQXJyYXkobWV0YU9wZW5BcGkpID8gbWV0YU9wZW5BcGkgOiBbbWV0YU9wZW5BcGldKSxcbiAgXVxuICB0cnkge1xuICAgIGNvbnN0IHR5cGVOYW1lID0gem9kUmVmLl9kZWYudHlwZU5hbWUgYXMgV29ya2VyS2V5c1xuICAgIGlmICh0eXBlTmFtZSBpbiB3b3JrZXJNYXApIHtcbiAgICAgIHJldHVybiB3b3JrZXJNYXBbdHlwZU5hbWVdKHtcbiAgICAgICAgem9kUmVmOiB6b2RSZWYgYXMgbmV2ZXIsXG4gICAgICAgIHNjaGVtYXMsXG4gICAgICAgIHVzZU91dHB1dCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhdGNoQWxsUGFyc2VyKHsgem9kUmVmLCBzY2hlbWFzIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgIHJldHVybiBjYXRjaEFsbFBhcnNlcih7IHpvZFJlZiwgc2NoZW1hcyB9KVxuICB9XG59XG4iLCAiLyoqXG4gKiBGcm9udC1NYXR0ZXJcbiAqXG4gKiBWZW5kb3JlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qeHNvbi9mcm9udC1tYXR0ZXJcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgSmFzb24gQ2FtcGJlbGwgKFwiQXV0aG9yXCIpXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgeyBsb2FkIH0gZnJvbSBcImpzLXlhbWxcIlxuY29uc3Qgb3B0aW9uYWxCeXRlT3JkZXJNYXJrID0gXCJcXFxcdWZlZmY/XCJcbmNvbnN0IHBsYXRmb3JtID0gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgPyBwcm9jZXNzLnBsYXRmb3JtIDogXCJcIlxuY29uc3QgcGF0dGVybiA9XG4gIFwiXihcIiArXG4gIG9wdGlvbmFsQnl0ZU9yZGVyTWFyayArXG4gIFwiKD0geWFtbCA9fC0tLSlcIiArXG4gIFwiJChbXFxcXHNcXFxcU10qPylcIiArXG4gIFwiXig/OlxcXFwyfFxcXFwuXFxcXC5cXFxcLilcXFxccypcIiArXG4gIFwiJFwiICtcbiAgKHBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcIlxcXFxyP1wiIDogXCJcIikgK1xuICBcIig/OlxcXFxuKT8pXCJcbi8vIE5PVEU6IElmIHRoaXMgcGF0dGVybiB1c2VzIHRoZSAnZycgZmxhZyB0aGUgYHJlZ2V4YCB2YXJpYWJsZSBkZWZpbml0aW9uIHdpbGxcbi8vIG5lZWQgdG8gYmUgbW92ZWQgZG93biBpbnRvIHRoZSBmdW5jdGlvbnMgdGhhdCB1c2UgaXQuXG5jb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJtXCIpXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZyb250TWF0dGVyKFxuICBzdHJpbmc6IHN0cmluZyxcbiAgb3B0aW9ucyA9IHt9XG4pOiB7IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBib2R5OiBzdHJpbmc7IGJvZHlCZWdpbjogbnVtYmVyIH0ge1xuICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIlxuICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7IGFsbG93VW5zYWZlOiBmYWxzZSB9XG4gIG9wdGlvbnMgPVxuICAgIG9wdGlvbnMgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgID8geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9XG4gICAgICA6IGRlZmF1bHRPcHRpb25zXG4gIHZhciBsaW5lcyA9IHN0cmluZy5zcGxpdCgvKFxccj9cXG4pLylcbiAgaWYgKGxpbmVzWzBdICYmIC89IHlhbWwgPXwtLS0vLnRlc3QobGluZXNbMF0pKSB7XG4gICAgcmV0dXJuIHBhcnNlKHN0cmluZylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBib2R5OiBzdHJpbmcsXG4gICAgICBib2R5QmVnaW46IDEsXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVMb2NhdGlvbihtYXRjaDogUmVnRXhwRXhlY0FycmF5LCBib2R5OiBzdHJpbmcpIHtcbiAgdmFyIGxpbmUgPSAxXG4gIHZhciBwb3MgPSBib2R5LmluZGV4T2YoXCJcXG5cIilcbiAgdmFyIG9mZnNldCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXG5cbiAgd2hpbGUgKHBvcyAhPT0gLTEpIHtcbiAgICBpZiAocG9zID49IG9mZnNldCkge1xuICAgICAgcmV0dXJuIGxpbmVcbiAgICB9XG4gICAgbGluZSsrXG4gICAgcG9zID0gYm9keS5pbmRleE9mKFwiXFxuXCIsIHBvcyArIDEpXG4gIH1cblxuICByZXR1cm4gbGluZVxufVxuXG5mdW5jdGlvbiBwYXJzZShzdHJpbmc6IHN0cmluZyk6IHtcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgYm9keTogc3RyaW5nXG4gIGJvZHlCZWdpbjogbnVtYmVyXG59IHtcbiAgdmFyIG1hdGNoID0gcmVnZXguZXhlYyhzdHJpbmcpXG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBib2R5OiBzdHJpbmcsXG4gICAgICBib2R5QmVnaW46IDEsXG4gICAgfVxuICB9XG5cbiAgdmFyIHlhbWwgPSBtYXRjaFttYXRjaC5sZW5ndGggLSAxXS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBcIlwiKVxuICB2YXIgYXR0cmlidXRlcyA9IChsb2FkKHlhbWwpIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB2YXIgYm9keSA9IHN0cmluZy5yZXBsYWNlKG1hdGNoWzBdLCBcIlwiKVxuICB2YXIgbGluZSA9IGNvbXB1dGVMb2NhdGlvbihtYXRjaCwgc3RyaW5nKVxuXG4gIHJldHVybiB7XG4gICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICBib2R5OiBib2R5LFxuICAgIGJvZHlCZWdpbjogbGluZSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVzdEZyb250TWF0dGVyKHN0cmluZzogc3RyaW5nKSB7XG4gIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiXG5cbiAgcmV0dXJuIHJlZ2V4LnRlc3Qoc3RyaW5nKVxufVxuIiwgInR5cGUgUHJlZml4ZWRPYmplY3Q8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgYHgtJHtzdHJpbmcgJiBLfWBdOiBUW0tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVmaXhPYmplY3RLZXlzV2l0aFg8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVFxuKTogUHJlZml4ZWRPYmplY3Q8VD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtgeC0ke2tleX1gLCB2YWx1ZV0pXG4gICkgYXMgUHJlZml4ZWRPYmplY3Q8VD5cbn1cbiIsICJ0eXBlIFNuYWtlVG9EYXNoPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBzdHJpbmcgPyBTbmFrZVRvRGFzaFN0cmluZzxLPiA6IEtdOiBUW0tdXG59XG5cbnR5cGUgU25ha2VUb0Rhc2hTdHJpbmc8UyBleHRlbmRzIHN0cmluZz4gPSBTIGV4dGVuZHMgYCR7aW5mZXIgVH1fJHtpbmZlciBVfWBcbiAgPyBgJHtUfS0ke1NuYWtlVG9EYXNoU3RyaW5nPFU+fWBcbiAgOiBTXG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoaWZ5T2JqZWN0S2V5czxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQpOiBTbmFrZVRvRGFzaDxUPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleS5yZXBsYWNlKC9fL2csIFwiLVwiKSwgdmFsdWVdKVxuICApIGFzIFNuYWtlVG9EYXNoPFQ+XG59XG4iLCAiaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmZ1bmN0aW9uIGZpbmRLZXlJbk9iaihvYmo6IGFueSwgdmFsdWU6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmVzdWx0S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBfLmZvck93bihvYmosICh2LCBrKSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodikgJiYgXy5pc01hdGNoKHYsIHZhbHVlKSkge1xuICAgICAgcmVzdWx0S2V5ID0ga1xuICAgICAgLy8gU3RvcCB0aGUgaXRlcmF0aW9uXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0pXG4gIHJldHVybiByZXN1bHRLZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhvYmoxOiBhbnksIG9iajI6IGFueSk6IGFueSB7XG4gIHJldHVybiBfLnRyYW5zZm9ybShvYmoxLCAocmVzdWx0LCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ0tleSA9IGZpbmRLZXlJbk9iaihvYmoyLCB2YWx1ZSlcbiAgICAgIGlmIChtYXRjaGluZ0tleSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHtcbiAgICAgICAgICAkcmVmOiBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHttYXRjaGluZ0tleX1gLFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyh2YWx1ZSwgb2JqMilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBSb3V0ZVNwZWMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrTWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpXG4gIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cbiAgaWYgKGxhc3RQYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIGxhc3RQYXJ0LmVuZHNXaXRoKFwiXVwiKSkge1xuICAgIC8vIENvbnZlcnQgW3BhcmFtXSB0byBieV9wYXJhbVxuICAgIGNvbnN0IHBhcmFtID0gbGFzdFBhcnQuc2xpY2UoMSwgLTEpXG4gICAgcmV0dXJuIGBieV8ke3BhcmFtfWBcbiAgfVxuXG4gIHJldHVybiBsYXN0UGFydFxufVxuXG4vLyBmZXJuIGRvY3M6IGh0dHBzOi8vYnVpbGR3aXRoZmVybi5jb20vZG9jcy9zcGVjL2V4dGVuc2lvbnNcbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICByZXR1cm4gcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSlcbn1cblxuZnVuY3Rpb24gZ2V0RmVyblNka01ldGFkYXRhKFxuICBwYXRoOiBzdHJpbmcsXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbik6XG4gIHwge1xuICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWVcbiAgICB9XG4gIHwge1xuICAgICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogc3RyaW5nW11cbiAgICAgIFwieC1mZXJuLXNkay1tZXRob2QtbmFtZVwiOiBzdHJpbmdcbiAgICB9IHtcbiAgaWYgKHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIikubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka0dyb3VwTmFtZShwYXRoKSxcbiAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aCksXG4gICAgLi4uKHNka1JldHVyblZhbHVlXG4gICAgICA/IHtcbiAgICAgICAgICBcIngtZmVybi1zZGstcmV0dXJuLXZhbHVlXCI6IHNka1JldHVyblZhbHVlLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKHtcbiAgbWV0aG9kcyxcbiAgcGF0aCxcbiAgc2RrUmV0dXJuVmFsdWUsXG59OiB7XG4gIG1ldGhvZHM6IFJvdXRlU3BlY1tcIm1ldGhvZHNcIl1cbiAgcGF0aDogc3RyaW5nXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbn0pIHtcbiAgY29uc3QgZmVyblNka01ldGFkYXRhID0gZ2V0RmVyblNka01ldGFkYXRhKHBhdGgsIHNka1JldHVyblZhbHVlKVxuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW21ldGhvZHNbMF1dOiBmZXJuU2RrTWV0YWRhdGEsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWFwcGVkTWV0aG9kcyA9IHt9XG5cbiAgbWV0aG9kcy5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0gZmVyblNka01ldGFkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcHBlZE1ldGhvZHNbbWV0aG9kXSA9IHtcbiAgICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWUsXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBtYXBwZWRNZXRob2RzXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgcGFyc2VSb3V0ZXNJblBhY2thZ2UgfSBmcm9tIFwiLi4vbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlXCJcbmltcG9ydCB7IHpvZFRvVHMsIHByaW50Tm9kZSB9IGZyb20gXCIuLi9saWIvem9kLXRvLXRzXCJcbmltcG9ydCBwcmV0dGllciBmcm9tIFwicHJldHRpZXJcIlxuaW1wb3J0IHsgeiwgWm9kRWZmZWN0cywgWm9kT3B0aW9uYWwgfSBmcm9tIFwiem9kXCJcblxuaW50ZXJmYWNlIEdlbmVyYXRlUm91dGVUeXBlc09wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgb25seSByb3V0ZXMgdGhhdCByZXR1cm4gdHJ1ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqL1xuICBmaWx0ZXJSb3V0ZXM/OiAocm91dGU6IHN0cmluZykgPT4gYm9vbGVhblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgcm91dGVzIHRoYXQgaGF2ZSBgZXhjbHVkZUZyb21PcGVuQXBpYCBzZXQgdG8gdHJ1ZSB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmNsdWRlIHRoZW0uXG4gICAqL1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3V0ZVR5cGVzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgZmlsZXBhdGhUb1JvdXRlID0gYXdhaXQgcGFyc2VSb3V0ZXNJblBhY2thZ2Uob3B0cylcblxuICBjb25zdCBzb3J0ZWRSb3V0ZXMgPSBBcnJheS5mcm9tKGZpbGVwYXRoVG9Sb3V0ZS5lbnRyaWVzKCkpLnNvcnQoKGEsIGIpID0+XG4gICAgYVsxXS5yb3V0ZS5sb2NhbGVDb21wYXJlKGJbMV0ucm91dGUpXG4gIClcbiAgY29uc3QgZmlsdGVyZWRSb3V0ZXMgPSBzb3J0ZWRSb3V0ZXMuZmlsdGVyKFxuICAgIChbXywgeyByb3V0ZSB9XSkgPT4gIW9wdHMuZmlsdGVyUm91dGVzIHx8IG9wdHMuZmlsdGVyUm91dGVzKHJvdXRlKVxuICApXG5cbiAgLy8gVE9ETyB3aGVuIGxlc3MgbGF6eSwgdXNlIHRzLW1vcnBoIGZvciBiZXR0ZXIgZ2VuZXJhdGlvblxuICBjb25zdCByb3V0ZURlZnM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBbXywgeyByb3V0ZSwgcm91dGVTcGVjLCBzZXR1cFBhcmFtcyB9XSBvZiBmaWx0ZXJlZFJvdXRlcykge1xuICAgIGNvbnN0IHF1ZXJ5S2V5cyA9IE9iamVjdC5rZXlzKHJvdXRlU3BlYy5xdWVyeVBhcmFtcz8uc2hhcGUgPz8ge30pXG4gICAgY29uc3QgcGF0aFBhcmFtZXRlcnMgPSBxdWVyeUtleXMuZmlsdGVyKChrZXkpID0+IHJvdXRlLmluY2x1ZGVzKGBbJHtrZXl9XWApKVxuXG4gICAgLy8gcXVlcnlQYXJhbXMgbWlnaHQgYmUgYSBab2RFZmZlY3RzIG9yIFpvZE9wdGlvbmFsIGluIHNvbWUgY2FzZXNcbiAgICBsZXQgcXVlcnlQYXJhbXMgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICB3aGlsZSAoXG4gICAgICBxdWVyeVBhcmFtcyAmJlxuICAgICAgKFwic291cmNlVHlwZVwiIGluIHF1ZXJ5UGFyYW1zIHx8IFwidW53cmFwXCIgaW4gcXVlcnlQYXJhbXMpXG4gICAgKSB7XG4gICAgICBpZiAoXCJzb3VyY2VUeXBlXCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgYXMgdW5rbm93biBhcyBab2RFZmZlY3RzPGFueT4pLnNvdXJjZVR5cGUoKVxuICAgICAgfSBlbHNlIGlmIChcInVud3JhcFwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIHVua25vd24gYXMgWm9kT3B0aW9uYWw8YW55PikudW53cmFwKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocXVlcnlQYXJhbXMgJiYgXCJvbWl0XCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXMub21pdChcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKHBhdGhQYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IFtwYXJhbSwgdHJ1ZV0pKVxuICAgICAgKVxuICAgIH1cblxuICAgIHJvdXRlRGVmcy5wdXNoKFxuICAgICAgYFxuXCIke3JvdXRlfVwiOiB7XG4gIHJvdXRlOiBcIiR7cm91dGV9XCIsXG4gIG1ldGhvZDogJHtyb3V0ZVNwZWMubWV0aG9kcy5tYXAoKG0pID0+IGBcIiR7bX1cImApLmpvaW4oXCIgfCBcIil9LFxuICBxdWVyeVBhcmFtczogJHtxdWVyeVBhcmFtcyA/IHByaW50Tm9kZSh6b2RUb1RzKHF1ZXJ5UGFyYW1zKS5ub2RlKSA6IFwie31cIn0sXG4gIGpzb25Cb2R5OiAke1xuICAgIHJvdXRlU3BlYy5qc29uQm9keSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5qc29uQm9keSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAgY29tbW9uUGFyYW1zOiAke1xuICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmNvbW1vblBhcmFtcykubm9kZSlcbiAgICAgIDogXCJ7fVwiXG4gIH0sXG4gIGZvcm1EYXRhOiAke1xuICAgIHJvdXRlU3BlYy5mb3JtRGF0YSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5mb3JtRGF0YSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAganNvblJlc3BvbnNlOiAke1xuICAgIHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgID8gcHJpbnROb2RlKFxuICAgICAgICAgIHpvZFRvVHMoXG4gICAgICAgICAgICBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1cyAmJlxuICAgICAgICAgICAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgICAgPyByb3V0ZVNwZWMuanNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgICA6IHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgICAgICApLm5vZGVcbiAgICAgICAgKVxuICAgICAgOiBcInt9XCJcbiAgfVxufWAudHJpbSgpXG4gICAgKVxuICB9XG4gIGNvbnN0IHJvdXRlRGVmU3RyID0gcm91dGVEZWZzLmpvaW4oXCIsXFxuXCIpXG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHByZXR0aWVyLmZvcm1hdChcbiAgICBgZXhwb3J0IHR5cGUgUm91dGVzID0ge1xuJHtyb3V0ZURlZlN0cn1cbn1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXNwb25zZTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25SZXNwb25zZVwiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RCb2R5PFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvbkJvZHlcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0UGFyYW1zPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wicXVlcnlQYXJhbXNcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cbmAudHJpbSgpLFxuICAgIHsgc2VtaTogZmFsc2UsIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIgfVxuICApXG5cbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvcHRzLm91dHB1dEZpbGUsIG91dHB1dClcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cbiIsICIvKipcbiAqIFpvZCBUbyBUU1xuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NhY2hpbnJhamEvem9kLXRvLXRzXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgU2FjaGluIFJhamFcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5pbXBvcnQgeyBab2RUeXBlLCBab2RUeXBlQW55IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQgeyBwYXJzZUZyb250TWF0dGVyLCB0ZXN0RnJvbnRNYXR0ZXIgfSBmcm9tIFwiLi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcblxuY29uc3QgeyBmYWN0b3J5OiBmLCBTeW50YXhLaW5kLCBTY3JpcHRLaW5kLCBTY3JpcHRUYXJnZXQsIEVtaXRIaW50IH0gPSB0c1xuXG5jb25zdCBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UgPSAoXG4gIGlkZW50aWZpZXI6IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuKSA9PiB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIoaWRlbnRpZmllcikpIHtcbiAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShpZGVudGlmaWVyKVxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJcbn1cblxuY29uc3QgY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcgPSAoaWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKSlcblxuY29uc3QgY3JlYXRlVW5rbm93bktleXdvcmROb2RlID0gKCkgPT5cbiAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Vbmtub3duS2V5d29yZClcblxuZXhwb3J0IGNvbnN0IHByaW50Tm9kZSA9IChcbiAgbm9kZTogdHMuTm9kZSxcbiAgcHJpbnRlck9wdGlvbnM/OiB0cy5QcmludGVyT3B0aW9uc1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgXCJwcmludC50c1wiLFxuICAgIFwiXCIsXG4gICAgU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICBmYWxzZSxcbiAgICBTY3JpcHRLaW5kLlRTXG4gIClcbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIocHJpbnRlck9wdGlvbnMpXG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZShFbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSlcbn1cblxuY29uc3QgaWRlbnRpZmllclJFID0gL15bJEEtWl9hLXpdW1xcdyRdKiQvXG5cbmNvbnN0IGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwgPSAoc3RyaW5nXzogc3RyaW5nKSA9PiB7XG4gIGlmIChpZGVudGlmaWVyUkUudGVzdChzdHJpbmdfKSkge1xuICAgIHJldHVybiBmLmNyZWF0ZUlkZW50aWZpZXIoc3RyaW5nXylcbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwoc3RyaW5nXylcbn1cblxuY29uc3QgYWRkSnNEb2NDb21tZW50ID0gKG5vZGU6IHRzLk5vZGUsIHRleHQ6IHN0cmluZykgPT4ge1xuICBjb25zdCB7IGRlc2NyaXB0aW9uLCBkZXByZWNhdGVkIH0gPSBwYXJzZURlc2NyaXB0aW9uKHRleHQpXG5cbiAgbGV0IGNvbW1lbnQgPSBgKiAke2Rlc2NyaXB0aW9ufWBcbiAgaWYgKGRlcHJlY2F0ZWQpIHtcbiAgICBjb21tZW50ICs9IGBcXG4gKiBAZGVwcmVjYXRlZCAke1xuICAgICAgdHlwZW9mIGRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIgPyBkZXByZWNhdGVkIDogXCJcIlxuICAgIH1gXG4gIH0gZWxzZSB7XG4gICAgY29tbWVudCArPSBgIGBcbiAgfVxuXG4gIHRzLmFkZFN5bnRoZXRpY0xlYWRpbmdDb21tZW50KFxuICAgIG5vZGUsXG4gICAgU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhLFxuICAgIGNvbW1lbnQsXG4gICAgdHJ1ZVxuICApXG59XG5cbnR5cGUgUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgZGVwcmVjYXRlZD86IGJvb2xlYW4gfCBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5mdW5jdGlvbiBwYXJzZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQYXJzZWREZXNjcmlwdGlvbiB7XG4gIGlmICghZGVzY3JpcHRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgIH1cbiAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSByZXR1cm4geyBkZXNjcmlwdGlvbiB9XG4gIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gIGNvbnN0IG91dHB1dDogUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gICAgZGVzY3JpcHRpb246IGJvZHkudHJpbSgpLFxuICB9XG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIiAmJiBhdHRyaWJ1dGVzICE9PSBudWxsKSB7XG4gICAgaWYgKFwiZGVwcmVjYXRlZFwiIGluIGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5kZXByZWNhdGVkKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPVxuICAgICAgICAgIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZC5sZW5ndGggPiAwID8gYXR0cmlidXRlcy5kZXByZWNhdGVkIDogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJkZXNjcmlwdGlvblwiIHx8IGtleSA9PT0gXCJkZXByZWNhdGVkXCIpIGNvbnRpbnVlXG4gICAgICBvdXRwdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXRcbn1cblxudHlwZSBMaXRlcmFsVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cblxudHlwZSBab2RUb1RzT3B0aW9ucyA9IHtcbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBgbmF0aXZlRW51bXNgIGluc3RlYWQgKi9cbiAgcmVzb2x2ZU5hdGl2ZUVudW1zPzogYm9vbGVhblxuICBuYXRpdmVFbnVtcz86IFwiaWRlbnRpZmllclwiIHwgXCJyZXNvbHZlXCIgfCBcInVuaW9uXCJcbn1cblxuY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAocmF3PzogWm9kVG9Uc09wdGlvbnMpID0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7XG4gICAgbmF0aXZlRW51bXM6IHJhdz8ucmVzb2x2ZU5hdGl2ZUVudW1zID8gXCJyZXNvbHZlXCIgOiBcImlkZW50aWZpZXJcIixcbiAgfVxuXG4gIHJldHVybiB7IC4uLnJlc29sdmVkLCAuLi5yYXcgfVxufVxuXG50eXBlIFJlc29sdmVkWm9kVG9Uc09wdGlvbnMgPSBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlT3B0aW9ucz5cblxudHlwZSBab2RUb1RzU3RvcmUgPSB7XG4gIG5hdGl2ZUVudW1zOiB0cy5FbnVtRGVjbGFyYXRpb25bXVxufVxuXG50eXBlIFpvZFRvVHNSZXR1cm4gPSB7XG4gIG5vZGU6IHRzLlR5cGVOb2RlXG4gIHN0b3JlOiBab2RUb1RzU3RvcmVcbn1cblxudHlwZSBHZXRUeXBlRnVuY3Rpb24gPSAoXG4gIHR5cGVzY3JpcHQ6IHR5cGVvZiB0cyxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuXG50eXBlIEdldFR5cGUgPSB7IF9kZWY6IHsgZ2V0VHlwZT86IEdldFR5cGVGdW5jdGlvbiB9IH1cblxuY29uc3QgY2FsbEdldFR5cGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgbGV0IHR5cGU6IFJldHVyblR5cGU8R2V0VHlwZUZ1bmN0aW9uPiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGdldFR5cGVTY2hlbWEgPSB6b2QgYXMgR2V0VHlwZVxuICAvLyB0aGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhY2Nlc3NpbmcgJ3R5cGUnXG4gIGlmIChnZXRUeXBlU2NoZW1hLl9kZWYuZ2V0VHlwZSlcbiAgICB0eXBlID0gZ2V0VHlwZVNjaGVtYS5fZGVmLmdldFR5cGUodHMsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIHJldHVybiB0eXBlXG59XG5cbmV4cG9ydCBjb25zdCB6b2RUb1RzID0gKFxuICB6b2Q6IFpvZFR5cGVBbnksXG4gIGlkZW50aWZpZXI/OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBab2RUb1RzT3B0aW9uc1xuKTogWm9kVG9Uc1JldHVybiA9PiB7XG4gIGlmICghKHpvZCBpbnN0YW5jZW9mIFpvZFR5cGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpLFxuICAgICAgc3RvcmU6IHsgbmF0aXZlRW51bXM6IFtdIH0sXG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc29sdmVkSWRlbnRpZmllciA9IGlkZW50aWZpZXIgPz8gXCJJZGVudGlmaWVyXCJcblxuICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhvcHRpb25zKVxuXG4gIGNvbnN0IHN0b3JlOiBab2RUb1RzU3RvcmUgPSB7IG5hdGl2ZUVudW1zOiBbXSB9XG5cbiAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKHpvZCwgcmVzb2x2ZWRJZGVudGlmaWVyLCBzdG9yZSwgcmVzb2x2ZWRPcHRpb25zKVxuXG4gIHJldHVybiB7IG5vZGUsIHN0b3JlIH1cbn1cblxuY29uc3Qgem9kVG9Uc05vZGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBzdG9yZTogWm9kVG9Uc1N0b3JlLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgY29uc3QgdHlwZU5hbWUgPSB6b2QuX2RlZi50eXBlTmFtZVxuXG4gIGNvbnN0IGdldFR5cGVUeXBlID0gY2FsbEdldFR5cGUoem9kLCBpZGVudGlmaWVyLCBvcHRpb25zKVxuICAvLyBzcGVjaWFsIGNhc2UgbmF0aXZlIGVudW0sIHdoaWNoIG5lZWRzIGFuIGlkZW50aWZpZXIgbm9kZVxuICBpZiAoZ2V0VHlwZVR5cGUgJiYgdHlwZU5hbWUgIT09IFwiWm9kTmF0aXZlRW51bVwiKSB7XG4gICAgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZShnZXRUeXBlVHlwZSlcbiAgfVxuXG4gIGNvbnN0IG90aGVyQXJndW1lbnRzID0gW2lkZW50aWZpZXIsIHN0b3JlLCBvcHRpb25zXSBhcyBjb25zdFxuXG4gIHN3aXRjaCAodHlwZU5hbWUpIHtcbiAgICBjYXNlIFwiWm9kU3RyaW5nXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlN0cmluZ0tleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROdW1iZXJcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuTnVtYmVyS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZEJpZ0ludFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5CaWdJbnRLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQm9vbGVhblwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZERhdGVcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiRGF0ZVwiKSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZFVuZGVmaW5lZFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTnVsbFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpXG4gICAgfVxuICAgIGNhc2UgXCJab2RWb2lkXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlZvaWRLZXl3b3JkKSxcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKSxcbiAgICAgIF0pXG4gICAgfVxuICAgIGNhc2UgXCJab2RBbnlcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQW55S2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZFVua25vd25cIjoge1xuICAgICAgcmV0dXJuIGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROZXZlclwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5OZXZlcktleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RMYXp5XCI6IHtcbiAgICAgIC8vIGl0IGlzIGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGxhenkgdmFsdWUgaXMgcmVmZXJyaW5nIHRvXG4gICAgICAvLyBzbyB3ZSBmb3JjZSB0aGUgdXNlciB0byBkZWNsYXJlIGl0XG4gICAgICBpZiAoIWdldFR5cGVUeXBlKSByZXR1cm4gY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcoaWRlbnRpZmllcilcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgXCJab2RMaXRlcmFsXCI6IHtcbiAgICAgIC8vIHoubGl0ZXJhbCgnaGknKSAtPiAnaGknXG4gICAgICBsZXQgbGl0ZXJhbDogdHMuTGl0ZXJhbEV4cHJlc3Npb24gfCB0cy5Cb29sZWFuTGl0ZXJhbFxuXG4gICAgICBjb25zdCBsaXRlcmFsVmFsdWUgPSB6b2QuX2RlZi52YWx1ZSBhcyBMaXRlcmFsVHlwZVxuICAgICAgc3dpdGNoICh0eXBlb2YgbGl0ZXJhbFZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjoge1xuICAgICAgICAgIGxpdGVyYWwgPSBmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKGxpdGVyYWxWYWx1ZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6IHtcbiAgICAgICAgICBsaXRlcmFsID0gbGl0ZXJhbFZhbHVlID09PSB0cnVlID8gZi5jcmVhdGVUcnVlKCkgOiBmLmNyZWF0ZUZhbHNlKClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBsaXRlcmFsID0gZi5jcmVhdGVTdHJpbmdMaXRlcmFsKGxpdGVyYWxWYWx1ZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShsaXRlcmFsKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kT2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZW50cmllcyh6b2QuX2RlZi5zaGFwZSgpKVxuXG4gICAgICBjb25zdCBtZW1iZXJzOiB0cy5UeXBlRWxlbWVudFtdID0gcHJvcGVydGllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBuZXh0Wm9kTm9kZSA9IHZhbHVlIGFzIFpvZFR5cGVBbnlcbiAgICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKG5leHRab2ROb2RlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgICBjb25zdCB7IHR5cGVOYW1lOiBuZXh0Wm9kTm9kZVR5cGVOYW1lIH0gPSBuZXh0Wm9kTm9kZS5fZGVmXG4gICAgICAgIGNvbnN0IGlzT3B0aW9uYWwgPVxuICAgICAgICAgIG5leHRab2ROb2RlVHlwZU5hbWUgPT09IFwiWm9kT3B0aW9uYWxcIiB8fCBuZXh0Wm9kTm9kZS5pc09wdGlvbmFsKClcblxuICAgICAgICBjb25zdCBwcm9wZXJ0eVNpZ25hdHVyZSA9IGYuY3JlYXRlUHJvcGVydHlTaWduYXR1cmUoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwoa2V5KSxcbiAgICAgICAgICBpc09wdGlvbmFsID8gZi5jcmVhdGVUb2tlbihTeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHR5cGVcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChuZXh0Wm9kTm9kZS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIGFkZEpzRG9jQ29tbWVudChwcm9wZXJ0eVNpZ25hdHVyZSwgbmV4dFpvZE5vZGUuZGVzY3JpcHRpb24pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvcGVydHlTaWduYXR1cmVcbiAgICAgIH0pXG4gICAgICByZXR1cm4gZi5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUobWVtYmVycylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kQXJyYXlcIjoge1xuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlQXJyYXlUeXBlTm9kZSh0eXBlKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRW51bVwiOiB7XG4gICAgICAvLyB6LmVudW1bJ2EnLCAnYicsICdjJ10gLT4gJ2EnIHwgJ2InIHwgJ2NcbiAgICAgIGNvbnN0IHR5cGVzID0gem9kLl9kZWYudmFsdWVzLm1hcCgodmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFVuaW9uXCI6IHtcbiAgICAgIC8vIHoudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSAtPiBzdHJpbmcgfCBudW1iZXJcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFpvZFR5cGVBbnlbXSA9IHpvZC5fZGVmLm9wdGlvbnNcbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiOiB7XG4gICAgICAvLyB6LmRpc2NyaW1pbmF0ZWRVbmlvbigna2luZCcsIFt6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYScpLCBhOiB6LnN0cmluZygpIH0pLCB6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYicpLCBiOiB6Lm51bWJlcigpIH0pXSkgLT4geyBraW5kOiAnYScsIGE6IHN0cmluZyB9IHwgeyBraW5kOiAnYicsIGI6IG51bWJlciB9XG4gICAgICBjb25zdCBvcHRpb25zOiBab2RUeXBlQW55W10gPSBbLi4uem9kLl9kZWYub3B0aW9ucy52YWx1ZXMoKV1cbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEVmZmVjdHNcIjoge1xuICAgICAgLy8gaWdub3JlIGFueSBlZmZlY3RzLCB0aGV5IHdvbid0IGZhY3RvciBpbnRvIHRoZSB0eXBlc1xuICAgICAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5zY2hlbWEsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROYXRpdmVFbnVtXCI6IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlVHlwZVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJ1bmlvblwiKSB7XG4gICAgICAgIC8vIGFsbG93IG92ZXJyaWRpbmcgd2l0aCB0aGlzIG9wdGlvblxuICAgICAgICBpZiAodHlwZSkgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuXG4gICAgICAgIGNvbnN0IHR5cGVzID0gT2JqZWN0LnZhbHVlcyh6b2QuX2RlZi52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdW1lcmljTGl0ZXJhbCh2YWx1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUgYXMgc3RyaW5nKSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICAgIH1cblxuICAgICAgLy8gei5uYXRpdmVFbnVtKEZydWl0cykgLT4gRnJ1aXRzXG4gICAgICAvLyBjYW4gcmVzb2x2ZSBGcnVpdHMgaW50byBzdG9yZSBhbmQgdXNlciBjYW4gaGFuZGxlIGVudW1zXG4gICAgICBpZiAoIXR5cGUpIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJyZXNvbHZlXCIpIHtcbiAgICAgICAgY29uc3QgZW51bU1lbWJlcnMgPSBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICB6b2QuX2RlZi52YWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuICAgICAgICApLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGl0ZXJhbCA9XG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgPyBmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKHZhbHVlKVxuICAgICAgICAgICAgICA6IGYuY3JlYXRlU3RyaW5nTGl0ZXJhbCh2YWx1ZSlcblxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUVudW1NZW1iZXIoZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbChrZXkpLCBsaXRlcmFsKVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIodHlwZSkpIHtcbiAgICAgICAgICBzdG9yZS5uYXRpdmVFbnVtcy5wdXNoKFxuICAgICAgICAgICAgZi5jcmVhdGVFbnVtRGVjbGFyYXRpb24odW5kZWZpbmVkLCB0eXBlLCBlbnVtTWVtYmVycylcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2dldFR5cGUgb24gbmF0aXZlRW51bSBtdXN0IHJldHVybiBhbiBpZGVudGlmaWVyIHdoZW4gbmF0aXZlRW51bXMgaXMgXCJyZXNvbHZlXCInXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UodHlwZSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kT3B0aW9uYWxcIjoge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVG9Uc05vZGUoXG4gICAgICAgIHpvZC5fZGVmLmlubmVyVHlwZSxcbiAgICAgICAgLi4ub3RoZXJBcmd1bWVudHNcbiAgICAgICkgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCksXG4gICAgICBdKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROdWxsYWJsZVwiOiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpLFxuICAgICAgXSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kVHVwbGVcIjoge1xuICAgICAgLy8gei50dXBsZShbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pIC0+IFtzdHJpbmcsIG51bWJlcl1cbiAgICAgIGNvbnN0IHR5cGVzID0gem9kLl9kZWYuaXRlbXMubWFwKChvcHRpb246IFpvZFR5cGVBbnkpID0+XG4gICAgICAgIHpvZFRvVHNOb2RlKG9wdGlvbiwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICApXG4gICAgICByZXR1cm4gZi5jcmVhdGVUdXBsZVR5cGVOb2RlKHR5cGVzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RSZWNvcmRcIjoge1xuICAgICAgLy8gei5yZWNvcmQoei5udW1iZXIoKSkgLT4geyBbeDogc3RyaW5nXTogbnVtYmVyIH1cbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVMaXRlcmFsTm9kZShbXG4gICAgICAgIGYuY3JlYXRlSW5kZXhTaWduYXR1cmUoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGYuY3JlYXRlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBmLmNyZWF0ZUlkZW50aWZpZXIoXCJ4XCIpLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSxcbiAgICAgICAgICB2YWx1ZVR5cGVcbiAgICAgICAgKSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE1hcFwiOiB7XG4gICAgICAvLyB6Lm1hcCh6LnN0cmluZygpKSAtPiBNYXA8c3RyaW5nPlxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIGNvbnN0IGtleVR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5rZXlUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiTWFwXCIpLCBbXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFNldFwiOiB7XG4gICAgICAvLyB6LnNldCh6LnN0cmluZygpKSAtPiBTZXQ8c3RyaW5nPlxuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlNldFwiKSwgW3R5cGVdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kSW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIC8vIHoubnVtYmVyKCkuYW5kKHouc3RyaW5nKCkpIC0+IG51bWJlciAmIHN0cmluZ1xuICAgICAgY29uc3QgbGVmdCA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLmxlZnQsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3QgcmlnaHQgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5yaWdodCwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVJbnRlcnNlY3Rpb25UeXBlTm9kZShbbGVmdCwgcmlnaHRdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kUHJvbWlzZVwiOiB7XG4gICAgICAvLyB6LnByb21pc2Uoei5zdHJpbmcoKSkgLT4gUHJvbWlzZTxzdHJpbmc+XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlByb21pc2VcIiksIFtcbiAgICAgICAgdHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEZ1bmN0aW9uXCI6IHtcbiAgICAgIC8vIHouZnVuY3Rpb24oKS5hcmdzKHouc3RyaW5nKCkpLnJldHVybnMoei5udW1iZXIoKSkgLT4gKGFyZ3NfMDogc3RyaW5nKSA9PiBudW1iZXJcbiAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZXMgPSB6b2QuX2RlZi5hcmdzLl9kZWYuaXRlbXMubWFwKFxuICAgICAgICAoYXJndW1lbnQ6IFpvZFR5cGVBbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBhcmd1bWVudFR5cGUgPSB6b2RUb1RzTm9kZShhcmd1bWVudCwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2luZGV4fWApLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJndW1lbnRUeXBlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICApIGFzIHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uW11cblxuICAgICAgYXJndW1lbnRUeXBlcy5wdXNoKFxuICAgICAgICBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuRG90RG90RG90VG9rZW4pLFxuICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2FyZ3VtZW50VHlwZXMubGVuZ3RofWApLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZUFycmF5VHlwZU5vZGUoY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCkpXG4gICAgICAgIClcbiAgICAgIClcblxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnJldHVybnMsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVGdW5jdGlvblR5cGVOb2RlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGFyZ3VtZW50VHlwZXMsXG4gICAgICAgIHJldHVyblR5cGVcbiAgICAgIClcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRGVmYXVsdFwiOiB7XG4gICAgICAvLyB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVmYXVsdCgnaGknKSAtPiBzdHJpbmdcbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZE5vZGVzOiB0cy5Ob2RlW10gPSBbXVxuXG4gICAgICB0eXBlLmZvckVhY2hDaGlsZCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAoIVtTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmRdLmluY2x1ZGVzKG5vZGUua2luZCkpIHtcbiAgICAgICAgICBmaWx0ZXJlZE5vZGVzLnB1c2gobm9kZSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkZWQgdG8gc2V0IGNoaWxkcmVuXG4gICAgICB0eXBlLnR5cGVzID0gZmlsdGVyZWROb2Rlc1xuXG4gICAgICByZXR1cm4gdHlwZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkFueUtleXdvcmQpXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBQcm9qZWN0LCBTeW50YXhLaW5kIH0gZnJvbSBcInRzLW1vcnBoXCJcbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSBcImVzYnVpbGRcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9saWIvZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGVcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBhbGxvd2VkSW1wb3J0UGF0dGVybnM/OiBzdHJpbmdbXVxuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG4gIGVzYnVpbGRPcHRpb25zPzogZXNidWlsZC5CdWlsZE9wdGlvbnNcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RSb3V0ZVNwZWNzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgeyBwYWNrYWdlRGlyLCBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIgfSA9IG9wdHNcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuXG4gIGNvbnN0IHByb2plY3QgPSBuZXcgUHJvamVjdCh7IGNvbXBpbGVyT3B0aW9uczogeyBkZWNsYXJhdGlvbjogdHJ1ZSB9IH0pXG5cbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKGZ1bGxQYXRoR2xvYikpIHtcbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gc291cmNlRmlsZS5nZXRFeHBvcnRBc3NpZ25tZW50KFxuICAgICAgKGQpID0+ICFkLmlzRXhwb3J0RXF1YWxzKClcbiAgICApXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCA9IGRlZmF1bHRFeHBvcnRcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIWN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgd2l0aFJvdXRlU3BlY0NhbGwgPSBjdXJyaWVkV2l0aFJvdXRlU3BlY0NhbGxcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIXdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IFtyb3V0ZVNwZWNdID0gd2l0aFJvdXRlU3BlY0NhbGwuZ2V0QXJndW1lbnRzKClcbiAgICBpZiAoIXJvdXRlU3BlYykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBzb3VyY2VGaWxlLmFkZFN0YXRlbWVudHMoXG4gICAgICBgZXhwb3J0IGNvbnN0IGV4dHJhY3RlZFJvdXRlU3BlYyA9ICR7cm91dGVTcGVjLmdldFRleHQoKX1gXG4gICAgKVxuXG4gICAgZGVmYXVsdEV4cG9ydC5yZW1vdmUoKVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB1bnVzZWQgaW1wb3J0cyBzbyBmaWxlIGNhbiBiZSB0cmVlIHNoYWtlblxuICAgIC8vIChBc3N1bWVzIGFsbCBpbXBvcnRzIGFyZSBmcmVlIG9mIHNpZGUtZWZmZWN0cylcbiAgICBsZXQgbGFzdFdpZHRoOiBudW1iZXJcbiAgICBkbyB7XG4gICAgICBsYXN0V2lkdGggPSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpXG4gICAgICAvLyBNYXkgbmVlZCB0byBjYWxsIHRoaXMgbXVsdGlwbGUgdGltZXNcbiAgICAgIHNvdXJjZUZpbGUuZml4VW51c2VkSWRlbnRpZmllcnMoKVxuICAgIH0gd2hpbGUgKGxhc3RXaWR0aCAhPT0gc291cmNlRmlsZS5nZXRGdWxsV2lkdGgoKSlcblxuICAgIGNvbnN0IGFic29sdXRlUGFja2FnZURpciA9IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKVxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICBhYnNvbHV0ZVBhY2thZ2VEaXIsXG4gICAgICBzb3VyY2VGaWxlLmdldEZpbGVQYXRoKClcbiAgICApXG4gICAgcGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpXG4gIH1cblxuICBjb25zdCBwYXRoVG9JZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgIC8vIGFkZCBwcmVmaXggdG8gYXZvaWQgc3RhcnRpbmcgd2l0aCBhIG51bWJlclxuICAgIHBhdGhUb0lkW3BhdGhdID1cbiAgICAgIFwiaGFzaFwiICsgY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKHBhdGgpLmRpZ2VzdChcImhleFwiKVxuICB9XG5cbiAgY29uc3QgZW50cnlQb2ludENvbnRlbnQgPSBgXG4gICR7cGF0aHNcbiAgICAubWFwKChwKSA9PiBgaW1wb3J0IHtleHRyYWN0ZWRSb3V0ZVNwZWMgYXMgJHtwYXRoVG9JZFtwXX19IGZyb20gXCIuLyR7cH1cImApXG4gICAgLmpvaW4oXCJcXG5cIil9XG5cbiAgZXhwb3J0IGNvbnN0IHJvdXRlcyA9IHtcbiAgICAke3BhdGhzXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IGh0dHBSb3V0ZSA9IChcbiAgICAgICAgICBvcHRzLm1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPz9cbiAgICAgICAgICBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeClcbiAgICAgICAgKShwKVxuXG4gICAgICAgIHJldHVybiBgXCIke2h0dHBSb3V0ZX1cIjogJHtwYXRoVG9JZFtwXX1gXG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIsXFxuXCIpfVxuICB9XG4gIGBcblxuICAvLyBDb3B5IGFsbG93ZWQgaW1wb3J0IGdsb2JzIGludG8gcHJvamVjdFxuICBpZiAob3B0cy5hbGxvd2VkSW1wb3J0UGF0dGVybnMpIHtcbiAgICBwcm9qZWN0LmFkZFNvdXJjZUZpbGVzQXRQYXRocyhvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucylcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIHR5cGVzICguZC50cylcbiAgY29uc3QgZW50cnlQb2ludCA9IHByb2plY3QuY3JlYXRlU291cmNlRmlsZShcbiAgICBcImV4dHJhY3RlZC1yb3V0ZS1zcGVjcy50c1wiLFxuICAgIGVudHJ5UG9pbnRDb250ZW50XG4gIClcbiAgY29uc3QgZW1pdFJlc3VsdCA9IGVudHJ5UG9pbnQuZ2V0RW1pdE91dHB1dCh7IGVtaXRPbmx5RHRzRmlsZXM6IHRydWUgfSlcbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwYXRoLmRpcm5hbWUob3B0cy5vdXRwdXRGaWxlKSxcbiAgICAgIHBhdGguYmFzZW5hbWUob3B0cy5vdXRwdXRGaWxlKS5yZXBsYWNlKFwiLm1qc1wiLCBcIlwiKS5yZXBsYWNlKFwiLmpzXCIsIFwiXCIpICtcbiAgICAgICAgXCIuZC50c1wiXG4gICAgKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgIGRlY2xhcmF0aW9uRmlsZVBhdGgsXG4gICAgICBlbWl0UmVzdWx0LmdldE91dHB1dEZpbGVzKClbMF0uZ2V0VGV4dCgpXG4gICAgKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdmFsdWVzICguanMpXG4gIGNvbnN0IHBrZ1JhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihwYWNrYWdlRGlyLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICBcInV0Zi04XCJcbiAgKVxuICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHBrZ1JhdylcblxuICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAuLi5vcHRzLmVzYnVpbGRPcHRpb25zLFxuICAgIHN0ZGluOiB7XG4gICAgICBjb250ZW50czogZW50cnlQb2ludENvbnRlbnQsXG4gICAgICByZXNvbHZlRGlyOiBwYXRoLnJlc29sdmUocGFja2FnZURpciksXG4gICAgfSxcbiAgICBvdXRmaWxlOiBvcHRzLm91dHB1dEZpbGUsXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgICBmb3JtYXQ6IFwiZXNtXCIsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgZXh0ZXJuYWw6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHBrZy5kZXBlbmRlbmNpZXMpLFxuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRldkRlcGVuZGVuY2llcyksXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8uZXh0ZXJuYWwgPz8gW10pLFxuICAgIF0sXG4gICAgcGx1Z2luczogW1xuICAgICAgLy8gV2l0aCB0aGlzIHBsdWdpbiwgZXNidWlsZCB3aWxsIG5ldmVyIHRvdWNoIHRoZSBhY3R1YWwgZmlsZXN5c3RlbSBhbmQgdGh1cyBjYW5ub3QgaW50ZXJhY3Qgd2l0aCBpbXBvcnRzIHRoYXQgZG9uJ3QgbWF0Y2ggYWxsb3dlZEltcG9ydFBhdHRlcm5zW10uXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwicmVzb2x2ZS12aXJ0dWFsLWZzXCIsXG4gICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLiovIH0sIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IHByb2plY3QuZ2V0U291cmNlRmlsZShhcmdzLnBhdGgpPy5nZXRGdWxsVGV4dCgpXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudHM6IFwiZXhwb3J0IGRlZmF1bHQge31cIixcbiAgICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgbG9hZGVyOiBcInRzXCIsXG4gICAgICAgICAgICAgIHJlc29sdmVEaXI6IHBhdGguZGlybmFtZShhcmdzLnBhdGgpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4uKG9wdHMuZXNidWlsZE9wdGlvbnM/LnBsdWdpbnMgPz8gW10pLFxuICAgIF0sXG4gIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBQUE7OztBQ0FBO0FBQUEsT0FBTyxRQUFRO0FBQ2Y7QUFBQSxFQUNFO0FBQUEsT0FHSztBQUVQLFNBQVMsS0FBQUEsVUFBUzs7O0FDUGxCO0FBQUEsT0FBT0MsV0FBVTs7O0FDQWpCO0FBQUEsT0FBTyxVQUFVO0FBRVYsSUFBTSxnQ0FDWCxDQUFDLGFBQXFCLFdBQ3RCLENBQUMsY0FBc0I7QUFDckIsUUFBTSxRQUFRLFVBRVgsUUFBUSxTQUFTLEdBQUcsRUFFcEIsUUFBUSxPQUFPLEVBQUUsRUFFakIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxZQUFZLEVBQUUsRUFFdEIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxTQUFTLEVBQUUsRUFFbkIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxpQkFBaUIsRUFBRTtBQUU5QixTQUFPLEtBQUssS0FBSyxZQUFZLEtBQUs7QUFDcEM7OztBRGJLLElBQU0sdUJBQXVCLE9BQU8sU0FNSjtB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QUFhO0FBQUEsSUFDYixVQUFVO0FBQUEsTUFDUixHQUFHLE9BQU8sS0FBSyxJQUFJLFlBQVk7QUFBQSxNQUMvQixHQUFHLE9BQU8sS0FBSyxJQUFJLGVBQWU7QUFBQSxNQUNsQyxJQUFJLGdCQUFLLG1CQUFMLG1CQUFxQixhQUFyQixZQUFpQyxDQUFDO0FBQUEsSUFDeEM7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUVQO0FBQUEsUUFDRSxNQUFNO0FBQUEsUUFDTixNQUFNRyxRQUFPO0FBQ1gsVUFBQUEsT0FBTSxPQUFPLEVBQUUsUUFBUSxLQUFLLEdBQUcsQ0FBQyxTQUFTO0FBL0puRCxnQkFBQUQ7QUFnS1ksa0JBQU0sWUFBV0EsTUFBQSxRQUFRLGNBQWMsS0FBSyxJQUFJLE1BQS9CLGdCQUFBQSxJQUFrQztBQUNuRCxnQkFBSSxDQUFDLFVBQVU7QUFDYixxQkFBTztBQUFBLGdCQUNMLFVBQVU7QUFBQSxnQkFDVixRQUFRO0FBQUEsY0FDVjtBQUFBLFlBQ0Y7QUFFQSxtQkFBTztBQUFBLGNBQ0w7QUFBQSxjQUNBLFFBQVE7QUFBQSxjQUNSLFlBQVlGLE1BQUssUUFBUSxLQUFLLElBQUk7QUFBQSxZQUNwQztBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQUEsTUFDQSxJQUFJLGdCQUFLLG1CQUFMLG1CQUFxQixZQUFyQixZQUFnQyxDQUFDO0FBQUEsSUFDdkM7QUFBQSxFQUNGLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsieiIsICJwYXRoIiwgInBhdGgiLCAicGF0aCIsICJkZWRlbnQiLCAicGF0aCIsICJkZWRlbnQiLCAiX2EiLCAieiIsICJmcyIsICJkZWRlbnQiLCAicGFyc2VEZXNjcmlwdGlvbiIsICJvcHRpb25zIiwgInoiLCAiXyIsICJmcyIsICJwYXRoIiwgIlN5bnRheEtpbmQiLCAicGF0aCIsICJTeW50YXhLaW5kIiwgIl9hIiwgImJ1aWxkIl0KfQo=